<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-33961569</id><updated>2011-11-27T20:57:37.539-03:00</updated><category term='Personal'/><category term='C#'/><category term='Vista'/><category term='CLI'/><category term='msdn'/><category term='java'/><category term='windows'/><category term='Seguridad'/><category term='.net'/><category term='performance'/><category term='español'/><category term='Symbian'/><category term='lenguajes'/><category term='CAS'/><title type='text'>Relativamente Simple</title><subtitle type='html'>Porque todo en esta vida es relativamente simple</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>41</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-33961569.post-866059659682050498</id><published>2009-07-08T17:46:00.004-04:00</published><updated>2009-07-08T21:41:29.173-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Tipos anónimos, Expresiones Linq y APIs fluidas</title><content type='html'>&lt;p&gt;Hace ya una semana a través de twitter me llegó me llego un post (&lt;a href="http://weblogs.asp.net/leftslipper/archive/2007/09/24/using-c-3-0-anonymous-types-as-dictionaries.aspx" rel="nofollow"&gt;Using C# 3.0 Anonymous Types as Dictionaries&lt;/a&gt;) que presentaba una propuesta para usar tipos anónimos como diccionarios. &lt;i&gt;Para seguir les recomiendo ver el post pues asumo que se conoce el contexto del problema&lt;/i&gt; &lt;/p&gt;  &lt;p&gt;El post genero muchas reacciones y comentarios, que pueden verse en el mismo post, personalmente me gustó mucho como se ve el código y me hizo recuerdo a las notaciones JSON, o bien a como se harían estas cosas en lenguajes dinámicos, pero como dije en twitter &lt;em&gt;pero siempre está la duda ¿rendimiento?&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Luego en la semana me puse a pensar de nuevo en esto y se me ocurrió que este caso en particular .net 3.5 tenía otra caracteristica que podía ser de ayuda &lt;a href="http://msdn.microsoft.com/es-mx/library/system.linq.expressions.aspx"&gt;Expresiones Linq&lt;/a&gt; (para referencia &lt;a href="http://msdn.microsoft.com/es-mx/library/bb397951.aspx"&gt;Árboles de expresiones&lt;/a&gt;). Las expresiones no solo nos permiten navegar en declaraciones para distintos fines sino que además nos permiten crear y compilar funciones Lambda. Esto me parecía interesante porque dado un tipo cualquiera esposible crear una función Lambda que la procesara y generará la cadena de atributos completa. &lt;/p&gt;  &lt;p&gt;Sin embargo, por ahora lambda expressiones siempre terminan en una sola expresión y no es posible construir todo un método de esta manera. Y es aqui donde las APIs fluidas (también conocidas como interfaces fluidas, Fluent API, Fluent Interfaces) entran en juego, Las APIs Fluidas brindan, a través de patrones como encadenamiento de métodos, la posibilidad de escribir código de manera consecuente y asegurando que el contexto en la ejecución se mantenga. Por ejemplo todos los métodos Append de la clase &lt;a href="http://msdn.microsoft.com/es-mx/system.text.stringbuilder.aspx"&gt;StringBuilder&lt;/a&gt;, retornan el objeto StringBuilder lo que permite escribir código de este tipo:&lt;/p&gt;  &lt;pre class="brush:c-sharp"&gt;StringBuilder sb= new StringBuilder;&lt;br /&gt;sb.Append("Hola").Append(" ").Append("mundo");&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Dado que en este caso el principal objetivo es generar una cadena con un StringBuilder, la interfaz Fluida es de mucha utilidad pues se puede generar una sola expresión que agregue todos los atributos al elemento. Esto podía tener un impacto positivo en el rendimiento (mi preocupación del momento). &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Así que decidí hacer un ejercicio. Tomé el código de &lt;a href="http://weblogs.asp.net/leftslipper/"&gt;Eilon&lt;/a&gt; e hice dos nuevas implementaciones de  GetHtmlLink.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;GetHtmlLinkDictionary&lt;/strong&gt;: Que recibe un diccionario y que utiliza inicializadores para el paso de parámeros&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;GetHtmlLinkLambda&lt;/strong&gt;: Esta es la que implementa la idea que tenía en la cabeza. Esta función recibe una clase cualquier y para cada propiedad pública de la clase genera un atributo en el vínculo html que genera.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Para ello primero es necesario obtener la información de las propiedades de la clase, luego generar la expresión que agrega los atributos y finalmente compilarla. Como la idea de esta prueba es que la expresión compilada sea utilizada en distintas llamadas cree un diccionario simple para que actue como repositorio de las funciones precompiladas. Con esto en mente el flujo básico de la función es el siguiente:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_ObyD5vpoXxE/SlUTnie3mJI/AAAAAAAAAG0/aU6p6uM0qvE/s1600-h/image%5B21%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_ObyD5vpoXxE/SlUTo4-ZL5I/AAAAAAAAAG4/ynVKIuH5BxQ/image_thumb%5B13%5D.png?imgmax=800" width="446" height="53" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Y la implementación base es la siguiente. &lt;/p&gt;&lt;br /&gt;&lt;pre class="brush:c-sharp"&gt;static IDictionary&amp;lt;Type, Action&amp;lt;StringBuilder, object&amp;gt;&amp;gt; functionCache = new Dictionary&amp;lt;Type, Action&amp;lt;StringBuilder, object&amp;gt;&amp;gt;();&lt;br /&gt;public static string GetHtmlLinkLamba(string text, object properties)&lt;br /&gt;{&lt;br /&gt;StringBuilder sb = new StringBuilder();&lt;br /&gt;sb.Append("&amp;lt;a");&lt;br /&gt;if (!functionCache.ContainsKey(properties.GetType()))&lt;br /&gt;{&lt;br /&gt; functionCache.Add(properties.GetType(), BuildFunction(properties))&lt;br /&gt;}&lt;br /&gt;functionCache[properties.GetType()](sb, properties);&lt;br /&gt;sb.Append("&amp;gt;");&lt;br /&gt;sb.Append(text);&lt;br /&gt;sb.Append("&amp;lt;/a&amp;gt;");&lt;br /&gt;return sb.ToString();&lt;br /&gt;} &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Como notarán el delegado que se genera recibe dos parámetros la clase &lt;strong&gt;StringBuilder&lt;/strong&gt; y el objeto que se utilizará. Un aspecto que no pude optimizar es el paso del objeto de manera no tipada esto debido a que para poder invocar las funciones precompiladas es necesario conocer la firma del delegado con anticipación y eso incluye el tipo del parámetro (este es un tema pendiente a resolver).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Obviamente la parte jugosa está en la función &lt;b&gt;BuildFunction&lt;/b&gt;. Lo primero, en mi caso, fue ordenar las ideas de la construcción de la expresión. Mi primer enfoque fue construir una expresión que hiciera lo mismo que la función que carga la información del diccionario y dado que el número de propiedades es variable necesito que mi expresión vaya agrengadose. Es decir que si hay solo la propiedad &lt;strong&gt;class&lt;/strong&gt; la expresión generada sea la siguiente:&lt;/p&gt;&lt;br /&gt;&lt;pre class="brush:c-sharp"&gt;sb.Append(" ").Append(“class”).Append("=\"").Append(obj.class).Append("\"")&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Y si hay una propiedad adicional &lt;strong&gt;target &lt;/strong&gt;la expresión pase a ser:&lt;/p&gt;&lt;br /&gt;&lt;pre class="brush:c-sharp"&gt;sb.Append(" ").Append(“class”).Append("=\"").Append(obj.class).Append("\" ").Append(“target”).Append("=\"").Append(obj.target).Append("\"")&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Esta alternativa la llegué a implementar, pero luego me di cuenta, lento que fuí, que al conocer toda la infomración de la clase de antemano podía generar una expresión mucho más óptima.&lt;/p&gt;&lt;br /&gt;&lt;pre class="brush:c-sharp"&gt;sb.Append(" class =\"").Append(obj.class).Append("\"  target=\"").Append(obj.target).Append("\"")&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Esta "realización" simplifico mucho mi código y ese es el que presento. Lo primero que tuve que crear fueron expresiones que representen lo parámetros que la función recibiría, para ello cree expresiones del tipo &lt;a href="http://msdn.microsoft.com/es-mx/library/system.linq.expressions.parameterexpression.aspx"&gt;ParameterExpression&lt;/a&gt;:&lt;/p&gt;&lt;br /&gt;&lt;pre class="brush:c-sharp"&gt;var paramSb = ParameterExpression.Parameter(typeof(StringBuilder), "sb");&lt;br /&gt;           var paramObj = ParameterExpression.Parameter(typeof(object), "obj");&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Luego tuve que crear el primer elemento de mi expresión que es simplemente la referencia al objeto StringBuilder. &lt;/p&gt;&lt;br /&gt;&lt;pre class="brush:c-sharp"&gt;Expression body = paramSb;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Claramente si quería acceder a las propiedades del objeto era necesario que hiciera un cast al tipo particular del objeto, para esto cree una expresión &lt;a href="http://msdn.microsoft.com/es-mx/library/system.linq.expressions.unaryexpression.aspx"&gt;UnaryExpression&lt;/a&gt;  utilizando el método &lt;a href="http://msdn.microsoft.com/es-mx/library/bb292051.aspx"&gt;Convert&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;pre class="brush:c-sharp"&gt;var convert = Expression.Convert(paramObj, anonymousType);&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Con estos elementos dispuestos podía empezar a iterar a través de las propiedades de la clase. Para ello tuve que recurrir a Reflection (gulp!) y en este punto me di cuenta que para poder crear la expresión de invocación también necesitaba la información de los métodos a los que deseaba invocar. Así que estas lineas son Reflection y nada más.&lt;/p&gt;&lt;br /&gt;&lt;pre class="brush:c-sharp"&gt;MethodInfo appendString = typeof(StringBuilder).GetMethod("Append", new Type[] { typeof(string) });&lt;br /&gt;           MethodInfo appendObject = typeof(StringBuilder).GetMethod("Append", new Type[] { typeof(object) });&lt;br /&gt;           PropertyInfo[] props = anonymousType.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty);&lt;br /&gt;           &lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Con todo listo armé el bloque que recorre todas las propiedades y va generando la expresión&lt;/p&gt;&lt;br /&gt;&lt;pre class="brush:c-sharp"&gt;bool first = true;           &lt;br /&gt;           foreach (PropertyInfo prop in props)&lt;br /&gt;           {&lt;br /&gt;               body =&lt;br /&gt;                   Expression.Call(&lt;br /&gt;                       Expression.Call(&lt;br /&gt;                           body,&lt;br /&gt;                           appendString,       &lt;br /&gt;                           Expression.Constant((first ? " ":"\" ") + prop.Name + "=\"")),&lt;br /&gt;                       appendObject,&lt;br /&gt;                       Expression.Property(convert, prop));&lt;br /&gt;               first=false;&lt;br /&gt;           }&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Paso a explicar el bloque, lo primero que hage es crear una llamada al método Append de la última expresión (que siempre es un StringBuilder gracias a la interfaz fluida) y paso como parámetro el nombre de la propiedad seguida del igual y apertura de comillas (Hay una diferenciación para la primera ejecución que solo genera el nombre). Esta acción corresponde a la expresión anidada.&lt;/p&gt;&lt;br /&gt;&lt;pre class="brush:c-sharp"&gt;Expression.Call(&lt;br /&gt;                           body,&lt;br /&gt;                           appendString,       &lt;br /&gt;                           Expression.Constant((first ? " ":"\" ") + prop.Name + "=\""))&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Luego agrego una llamada al método Append de la clase StringBuilder, pero esta vez a la implementación que recibe un objeto como parámetro, pasando como parámetro el objeto ya tipado por la conversión&lt;br /&gt;(potencialmente podría optimizarse esta generación para diferenciar las propiedades que son cadena o no) &lt;/p&gt;&lt;br /&gt;&lt;pre class="brush:c-sharp"&gt;Expression.Call(&lt;br /&gt;                       /*...*/,&lt;br /&gt;                       appendObject,&lt;br /&gt;                       Expression.Property(convert, prop))&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;La expresión resultante es asignada para que se la base de la próxima itearción. Una vez que se hayan procesado todas las propiedades solo queda agregar el cierre de comillas (si es que se proceso al menos un atributo)&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:c-sharp"&gt; if (!first)&lt;br /&gt;           {&lt;br /&gt;               body = Expression.Call(&lt;br /&gt;                           body,&lt;br /&gt;                           appendString,&lt;br /&gt;                           Expression.Constant("\""));&lt;br /&gt;           }&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Y el toque final la compilación, en este caso estoy especificando el formato del delegado a generar para que pueda incluirlo en el diccionario de funciones&lt;/p&gt;&lt;br /&gt;&lt;pre class="brush:c-sharp"&gt;return Expression.Lambda&amp;lt;Action&amp;lt;StringBuilder, object&amp;gt;&amp;gt;(body, paramSb, paramObj).Compile()&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Listo, ya tenemos una función que procesa el objeto de manera tipada. luego de organizar y para evitar creaciones innecesarias la estructura final de la función es la siguiente:&lt;/p&gt;&lt;br /&gt;&lt;pre class="brush:c-sharp"&gt;        static MethodInfo appendString = typeof(StringBuilder).GetMethod("Append", new Type[] { typeof(string) });&lt;br /&gt;       static MethodInfo appendObject = typeof(StringBuilder).GetMethod("Append", new Type[] { typeof(object) });&lt;br /&gt;&lt;br /&gt;       private static Action&amp;lt;StringBuilder, object&amp;gt; BuildFunction(object properties)&lt;br /&gt;       {&lt;br /&gt;           Type anonymousType = properties.GetType();&lt;br /&gt;           var paramSb = ParameterExpression.Parameter(typeof(StringBuilder), "sb");&lt;br /&gt;           var paramObj = ParameterExpression.Parameter(typeof(object), "obj");&lt;br /&gt;           var convert = Expression.Convert(paramObj, anonymousType);&lt;br /&gt;           Expression body = paramSb;&lt;br /&gt;           PropertyInfo[] props = anonymousType.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty);&lt;br /&gt;           bool first = true;           &lt;br /&gt;           foreach (PropertyInfo prop in props)&lt;br /&gt;           {&lt;br /&gt;               body =&lt;br /&gt;                   Expression.Call(&lt;br /&gt;                       Expression.Call(&lt;br /&gt;                           body,&lt;br /&gt;                           appendString,       &lt;br /&gt;                           Expression.Constant((first ? " ":"\" ") + prop.Name + "=\"")),&lt;br /&gt;                       appendObject,&lt;br /&gt;                       Expression.Property(convert, prop));&lt;br /&gt;               first=false;&lt;br /&gt;           }&lt;br /&gt;           if (!first)&lt;br /&gt;           {&lt;br /&gt;               body = Expression.Call(&lt;br /&gt;                           body,&lt;br /&gt;                           appendString,&lt;br /&gt;                           Expression.Constant("\""));&lt;br /&gt;           }&lt;br /&gt;           return Expression.Lambda&amp;lt;Action&amp;lt;StringBuilder, object&amp;gt;&amp;gt;(body, paramSb, paramObj).Compile();&lt;br /&gt;       }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Hecha la implementación llegó el momento de medirla. Lo que hice fue medir el tiempo de la primera ejecución y el promedio de subsecuentes ejecuciones para cada implementación. La razón para medir de esta forma es que el ejemplo esta orientado a una página Web donde cada ejecución no iniciaría de nuevo la función y solo el primer acceso sería penalizado por la compilación (similar a lo que hace ASP.Net para sitios que no están precompilados).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Las llamadas ejecutadas son las siguientes&lt;/p&gt;&lt;br /&gt;&lt;pre class="brush:c-sharp"&gt;HtmlHelpers.GetHtmlLink("Ejemplo", new { @class = "style" , target ="top" });&lt;br /&gt;HtmlHelpers.GetHtmlLinkDictionary("Ejemplo", new Dictionary&lt;string object=""&gt; {{"class", "style"}, {"target", "top"}});&lt;br /&gt;HtmlHelpers.GetHtmlLinkLamba("Ejemplo", new { @class = "style" , target ="top" }));&lt;/string&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;He aqui los resultados.&lt;/p&gt;&lt;br /&gt;&lt;table border="1" cellspacing="0" cellpadding="2"&gt;&lt;tbody&gt;    &lt;tr&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;th&gt;Función&lt;/th&gt;      &lt;th&gt;Primera Ejecución&lt;/th&gt;      &lt;th&gt;Promedio Ejecuciones Posteriores&lt;/th&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td valign="top"&gt;GetHtmlLink&lt;/td&gt;      &lt;td valign="top"&gt;15195&lt;/td&gt;      &lt;td valign="top"&gt;2&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td valign="top"&gt;GetHtmlLinkDictionary&lt;/td&gt;      &lt;td valign="top"&gt;7561&lt;/td&gt;      &lt;td valign="top"&gt;36&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td valign="top"&gt;GetHtmlLinkLambda&lt;/td&gt;      &lt;td valign="top"&gt;12032&lt;/td&gt;      &lt;td valign="top"&gt;2&lt;/td&gt;    &lt;/tr&gt;  &lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;p&gt;Como era de esperarse la implementación inicial es la que menor rendimiento tiene en todos los casos así que no la revisaré. Lo que quiero rescatar es que si bien la primera ejecución del método que recibe el diccionario es más rápida (estos son ticks lo que significa que es medio segundo más rápida) posteriores ejecuciones son mucho más rápidas pues la expresión compilada no necesita hacer ningún tipo de recorrido o búsqueda.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Con esos resultado, y para un sitio web o servicio donde el proceso se mantiene en memoria para atender múltiples requerimientos, me quedaría con la opción de precompilar y generar un código más agradable a la vista&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-866059659682050498?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/866059659682050498/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=866059659682050498' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/866059659682050498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/866059659682050498'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2009/07/tipos-anonimos-expresiones-linq-y-apis.html' title='Tipos anónimos, Expresiones Linq y APIs fluidas'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_ObyD5vpoXxE/SlUTo4-ZL5I/AAAAAAAAAG4/ynVKIuH5BxQ/s72-c/image_thumb%5B13%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-9120088061492184725</id><published>2009-05-10T12:52:00.001-04:00</published><updated>2009-05-10T12:52:18.983-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Primer día en Windows 7</title><content type='html'>&lt;p&gt;Bueno, finalmente instale Windows 7, lo único que puedo decir es que es altamente recomendable. A continuación hago un resumen de mi experiencia (todo esto lo hice en mi portatil Lenovo ThinkPad X61 2GB RAM)&lt;/p&gt;  &lt;h2&gt;Preparación&lt;/h2&gt;  &lt;p&gt;Antes de iniciar obviamente obtuve un backup pero a falta de uno hice tres: solo archivos, imagen de disco, windows easy transfer. El último lo hice para ver si me aceleraba el proceso de resintalación.&lt;/p&gt;  &lt;h2&gt;Instalación base&lt;/h2&gt;  &lt;p&gt;Basado en esperiencias anteriores habia destinado un par de horas para realizar la instalación básica, mi sorpresa fue enorme cuando 18 minutos después de prender la máquina para instalar Windows 7 estaba listo para instalar otras aplicaciones. &lt;/p&gt;  &lt;p&gt;Lo primero que hice fue agregar todos los componentes que no se instalan por defecto (IIS, MSMQ, etc) y nuevamente me sorprendi pues la activación tomo 2 minutos. &lt;/p&gt;  &lt;h2&gt;Instalación Aplicativos&lt;/h2&gt;  &lt;p&gt;Lo siguiente a instalar es Office 2007 que igualmente esperaba tomará unos cuantos minutos por lo que inicie la instalación y me fui a hacer otras cosas, 8 minutos después volvi a buscar algo y vi que la instalación estaba completa.&lt;/p&gt;  &lt;p&gt;Emocionado por el éxito decidí reinstalar todo pero tenía cosas para hacer (la vida normal que se interpone) así que durante la tarde finalmente pude sentarme a continuar con la instalación.&lt;/p&gt;  &lt;p&gt;En general el proceso de instalación consistía en revisar la última versión de la aplicación, descarga (si es necesario), instalación. Para darles una idea de lo que esto significa listo las aplicaciones instaladas&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Office&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Office 2007 SP 2&lt;/li&gt;      &lt;li&gt;Project 2007&lt;/li&gt;      &lt;li&gt;Visio 2007&lt;/li&gt;      &lt;li&gt;SharePoint Designar 2007&lt;/li&gt;      &lt;li&gt;Forefront Client Security&lt;/li&gt;      &lt;li&gt;Office Live Meeting&lt;/li&gt;      &lt;li&gt;Office Communicator 2007 R2&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Utilitarios&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;&lt;a href="http://www.7-zip.org/"&gt;7-zip&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.rarlab.com"&gt;WinRAR&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://getpaint.net"&gt;Paint.Net&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://filezilla-project.org/"&gt;FileZilla&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://cdburnerxp.se/"&gt;CDBurnerXP&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://selfimage.excelcia.org/"&gt;Selfimage&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://executor.dk"&gt;Executor&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.freedownloadmanager.org/"&gt;Free Download Manager&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.google.com/chrome"&gt;Chrome&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.mozilla.com/en-US/firefox/"&gt;Firefox&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.google.com/talk"&gt;Google Talk&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.imgburn.com"&gt;ImgBurn&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.jingproject.com/"&gt;Jing&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://palantir.codeplex.com/"&gt;Palantir&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.pismotechnic.com/pfm/ap/"&gt;Pismo File Mount&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.twhirl.org"&gt;Twhirl&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://download.live.com"&gt;Windows Live&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.mesh.com"&gt;Live Mesh&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://support.microsoft.com/kb/290301"&gt;Windows Installer Cleanup&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.skype.com"&gt;Skype&lt;/a&gt;&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Desarrollo&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Visual Studio Team Suite 2008 SP1&lt;/li&gt;      &lt;li&gt;SQL Server 2008 SP1&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.microsoft.com/ccrdss/"&gt;CCR &amp;amp; DSS&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=0178e2ef-9da8-445e-9348-c93f24cc9f9d"&gt;CAT.Net&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=28bd5941-c458-46f1-b24d-f60151d875a3&amp;amp;displaylang=en"&gt;DebugDiag&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.microsoft.com/whdc/devtools/debugging/default.mspx"&gt;Windows Debugging Tools&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/"&gt;F#&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.fiddler2.com/"&gt;Fiddler&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.gallio.org"&gt;Gallio&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.my-debugbar.com/wiki/IETester/HomePage"&gt;IETester&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07&amp;amp;displaylang=en"&gt;LogParser&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=130F7986-BF49-4FE5-9CA8-910AE6EA442C&amp;amp;displaylang=en"&gt;Chart Controls for .Net&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/devlabs/cc950526.aspx"&gt;Chess&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx"&gt;Code Contracts&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/devlabs/cc950525.aspx#2"&gt;Pex&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=9AEAA970-F281-4FB0-ABA1-D59D7ED09772&amp;amp;displaylang=en"&gt;FxCop&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/sourceanalysis"&gt;StyleCop&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/teamsystem/bb980963.aspx"&gt;Team Foundation Power Tools&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;Visual Studio Power Toys&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;&lt;a href="http://www.codeplex.com/ResourceRefactoring"&gt;Resource refactoring&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;&lt;a href="http://vscmdshell.codeplex.com/"&gt;VSCmdShell&lt;/a&gt;&lt;/li&gt;     &lt;/ul&gt;      &lt;li&gt;&lt;a href="http://wix.sourceforge.net"&gt;Wix 3&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://support.microsoft.com/kb/255905/"&gt;Orca&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://pal.codeplex.com/"&gt;PAL&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://sandcastle.codeplex.com/"&gt;Sandcastle&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://shfb.codeplex.com/"&gt;Sandcastle Help File Builder&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/devlabs/dd795202.aspx"&gt;Axum&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;Esto tomo unas 6 horas lo que me hace pensar que la instalación es mucho más rápida pues recuerdo que en otras&amp;#160; ocasiones me tomaba mucho más llegar a tener todo instalado.&lt;/p&gt;  &lt;h2&gt;transferencia de preferencias&lt;/h2&gt;  &lt;p&gt;Lo primero que intente fue utilizar la imagen de Windows Easy Transfer que habia generado. Windows 7 la proceso en un tiempo que encuentro es un poco excesivo (50 minutos para 17 GB de datos) pero al ser un proceso de una única vez deje que se completará.&lt;/p&gt;  &lt;p&gt;Al finalizar la recuperación pude observar, con alegria, que todas mis datos, personalizaciones y configuraciones se recuperaron sin ningún problema con lo que luego de 8 horas tenía todo mi entorno listo en Windows 7.&lt;/p&gt;  &lt;h2&gt;Adicionales&lt;/h2&gt;  &lt;p&gt;Una vez que termine la instalación note que había un par de cosas que extrañaba:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Utilitarios ThinkPad. Principalmente Access Connections, Presentation Director y Power Manager. &lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Access Connections es un utilitario de Lenovo que permite definir configuraciones de redes (IP, Proxy, impresora, seguridad, etc.) y asociarlo con puertos, MACs para facilitar el cambio de configuración. En el último año ha sido de mucha utilidad. En fin pude instalarlo y funciona, el icono de acceso rápido no se inicia, pero eso no es muy preocupante pues no lo uso habitualmente.&lt;/li&gt;      &lt;li&gt;Power Manager: Las capacidades de optimización que brinda power manager me han ayudad mucho. Lo bunoe instalado y funcionando :)&lt;/li&gt;      &lt;li&gt;Presentation Director: La combinación Windows+P en Windows 7 lo elimina de mi lista :)&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;&lt;strong&gt;&lt;a href="http://www.microsoft.com/windows/virtual-pc/"&gt;&lt;em&gt;Windows &lt;/em&gt;Virtual PC&lt;/a&gt;&lt;/strong&gt;: windows 7 utilizará la nueva versión de Virtual PC por lo que fue necesario que &lt;a href="http://www.microsoft.com/windows/virtual-pc/download.aspx"&gt;descargue el beta&lt;/a&gt; y lo instale. Posteriormente pude abrir mis máquinas virtuales, tengo que decir que aun no estoy muy familiarizado con la nueva interfax y creo que me tomara un tiempo&lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Toque finales&lt;/h2&gt;  &lt;p&gt;Obviamente descargar todos mis correos con Outlook, y descargar actualizaciones necesarias. La verdad eso lo deje corriendo durante la noche por lo que no se cuanto tomó pero hoy ya tengo todo&amp;#160; listo.&lt;/p&gt;  &lt;h2&gt;Primeras apreciaciones&lt;/h2&gt;  &lt;p&gt;Mis primeras apreciaciones son muy positivas. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;El sistema tiene una respuesta mucho más adecuada en general&lt;/li&gt;    &lt;li&gt;El proceso de reinicio es ligeramente más rápido pero el acceso al escritorio es mucho mas inmediato&lt;/li&gt;    &lt;li&gt;El consumo de memoria es notoriamente menor, con Vista tenía deshabilitado Aero, transparencias, todos los gadgets y varios servicios de presentación y al momento de inicio de Windows (sin aplicaciones) no tenía más de 960 MB libres. En este momento estoy ejecutando outlook, IE, live writer, con todas las ventajas de UI y tengo 1015MB libres.&lt;/li&gt;    &lt;li&gt;El trabajo del equipo de Windows en el stack de IU es sin duda muy notorio la interacción en general con Windows es mucho mejor&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;En resumen ha sido una experiencia muy gratificante. Desde hoy empiezo a recomendar la migración a todos :)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-9120088061492184725?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/9120088061492184725/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=9120088061492184725' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/9120088061492184725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/9120088061492184725'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2009/05/primer-dia-en-windows-7.html' title='Primer día en Windows 7'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-1571319812524509553</id><published>2009-05-03T20:59:00.004-04:00</published><updated>2009-05-03T21:29:34.799-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='español'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><title type='text'>Alternativas de Bloqueo en .Net</title><content type='html'>&lt;p&gt;Recientemente pude continuar mi interrumpida lectura de &lt;a title="Concurrent Programming on Windows" href="http://www.bluebytesoftware.com/books/winconc/winconc_book_resources.html"&gt;Concurrent Programming on Windows&lt;/a&gt; y durante la misma se discuten los distintos tipos de Sincronización que se pueden usar con .Net. Como en casi toda lectura que he visto se menciona el costo adicional que puede incorporar el uso de las clases &lt;a title="ReaderWriterLock" href="http://msdn.microsoft.com/es-cl/library/system.threading.readerwriterlock.aspx"&gt;ReaderWriterLock&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/es-cl/library/system.threading.readerwriterlockslim.aspx"&gt;ReaderWriterLockSlim&lt;/a&gt; frente al uso de &lt;a title="Monitor.Enter" href="http://msdn.microsoft.com/es-la/library/de0542zz.aspx"&gt;Monitor.Enter&lt;/a&gt;, &lt;a title="Monitor.TryEnter" href="http://msdn.microsoft.com/es-cl/library/system.threading.monitor.tryenter.aspx"&gt;Monitor.TryEnter&lt;/a&gt; (&lt;a title="instrucción lock" href="http://msdn.microsoft.com/es-cl/library/c5kehkcz(VS.80).aspx"&gt;lock&lt;/a&gt; o &lt;a href="http://msdn.microsoft.com/es-cl/library/3a86s51t(en-us,VS.71).aspx"&gt;syncLock&lt;/a&gt;), en el libro se hace un análisis del porque el impacto adicional en el rendimiento, pero como siempre me quedaban dudas respecto a cual es el verdadero margen de diferencia. &lt;/p&gt;&lt;p&gt;Existen varias comparaciones del impacto en rendimiento siendo casi siempre el comentario la gran diferencia que hay a favor de Monitor/lock frente a ReaderWriterLock , por ejemplo &lt;a title="http://is.gd/wrDH" href="http://is.gd/wrDH"&gt;http://is.gd/wrDH&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/ricom/archive/2006/05/05/590955.aspx"&gt;http://blogs.msdn.com/ricom/archive/2006/05/05/590955.aspx&lt;/a&gt; (comentarios, no el post en si mismo) sin embargo siempre he encontrado dichos números un poco vagos (espero no caer en el mismo error)&lt;/p&gt;&lt;p&gt;Usualmente toda tarea de sincronizacion siempre la hago con &lt;a title="instrucción lock" href="http://msdn.microsoft.com/es-cl/library/c5kehkcz(VS.80).aspx"&gt;lock&lt;/a&gt; por ser la más fácil de implementar y porque nunca he tenido problemas de contención, sin embargo aprovechando que hoy en la tarde tenía tiempo decidí hacer una prueba muy simple para comparar las alternativas en distintos escenarios. &lt;/p&gt;&lt;h2&gt;Componentes&lt;/h2&gt;&lt;p&gt;Mi prueba es muy simple tengo 3 clases que exponen dos métodos uno de lectura (Shared Lock) y uno de escritura (Exclusive Lock). Ambos métodos sincronizan el acceso a través de cada uno de los mecanismos a considerar en la prueba, la clase &lt;strong&gt;TraditionalLock&amp;lt;T&amp;gt; &lt;/strong&gt;utiliza el tradicional lock sobre una clase creada en el constructor de la clase, la clase &lt;strong&gt;ReaderWriteLock&amp;lt;T&amp;gt;&lt;/strong&gt; utiliza una instancia de la clase del mismo nombre y finalmente &lt;strong&gt;ReaderWriteLockSlim&amp;lt;T&amp;gt;&lt;/strong&gt; utiliza la clase del framework 3.5.&lt;/p&gt;&lt;div class="csharpcode-wrapper"&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   2:&lt;/span&gt;     &lt;span class="kwrd"&gt;class&lt;/span&gt; TraditionalLock&amp;lt;T&amp;gt; : ILockTest&amp;lt;T&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:&lt;/span&gt;     {&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   4:&lt;/span&gt;         &lt;span class="kwrd"&gt;private&lt;/span&gt; T data;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:&lt;/span&gt;         &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; sync = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;();&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   6:&lt;/span&gt;     &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:&lt;/span&gt;         &lt;span class="kwrd"&gt;public&lt;/span&gt; T  Read()&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   8:&lt;/span&gt;         {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:&lt;/span&gt;             &lt;span class="kwrd"&gt;lock&lt;/span&gt; (sync)&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  10:&lt;/span&gt;             {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:&lt;/span&gt;                 &lt;span class="rem"&gt;// Thread.Sleep(50);&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  12:&lt;/span&gt;                 &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.data;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:&lt;/span&gt;             }&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  14:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:&lt;/span&gt;  &lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  16:&lt;/span&gt;         &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt;  Write(T &lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:&lt;/span&gt;         {&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  18:&lt;/span&gt;             &lt;span class="kwrd"&gt;lock&lt;/span&gt; (sync)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:&lt;/span&gt;             {&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  20:&lt;/span&gt;                 &lt;span class="rem"&gt;// Thread.Sleep(50);&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:&lt;/span&gt;                 &lt;span class="kwrd"&gt;this&lt;/span&gt;.data = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  22:&lt;/span&gt;             }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  24:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:&lt;/span&gt;  &lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  26:&lt;/span&gt;     &lt;span class="kwrd"&gt;class&lt;/span&gt; ReaderWriteLock&amp;lt;T&amp;gt; : ILockTest&amp;lt;T&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:&lt;/span&gt;     {&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  28:&lt;/span&gt;         &lt;span class="kwrd"&gt;private&lt;/span&gt; T data;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:&lt;/span&gt;         &lt;span class="kwrd"&gt;private&lt;/span&gt; ReaderWriterLock sync = &lt;span class="kwrd"&gt;new&lt;/span&gt; ReaderWriterLock();&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  30:&lt;/span&gt;  &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:&lt;/span&gt;         &lt;span class="kwrd"&gt;public&lt;/span&gt; T Read()&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  32:&lt;/span&gt;         {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:&lt;/span&gt;             sync.AcquireReaderLock(System.Threading.Timeout.Infinite);&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  34:&lt;/span&gt;             &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:&lt;/span&gt;             {&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  36:&lt;/span&gt;                 &lt;span class="rem"&gt;// Thread.Sleep(50);&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:&lt;/span&gt;                 &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.data;&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  38:&lt;/span&gt;             }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:&lt;/span&gt;             &lt;span class="kwrd"&gt;finally&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  40:&lt;/span&gt;             {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:&lt;/span&gt;                 sync.ReleaseReaderLock();&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  42:&lt;/span&gt;             }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  43:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  44:&lt;/span&gt;  &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  45:&lt;/span&gt;         &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Write(T &lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  46:&lt;/span&gt;         {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  47:&lt;/span&gt;             sync.AcquireWriterLock(System.Threading.Timeout.Infinite);&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  48:&lt;/span&gt;             &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  49:&lt;/span&gt;             {&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  50:&lt;/span&gt;                 &lt;span class="rem"&gt;// Thread.Sleep(50);&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  51:&lt;/span&gt;                 &lt;span class="kwrd"&gt;this&lt;/span&gt;.data = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  52:&lt;/span&gt;             }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  53:&lt;/span&gt;             &lt;span class="kwrd"&gt;finally&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  54:&lt;/span&gt;             {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  55:&lt;/span&gt;                 sync.ReleaseWriterLock();&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  56:&lt;/span&gt;             }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  57:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  58:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  59:&lt;/span&gt;  &lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  60:&lt;/span&gt;     &lt;span class="kwrd"&gt;class&lt;/span&gt; ReaderWriteLockSlim&amp;lt;T&amp;gt; : ILockTest&amp;lt;T&amp;gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  61:&lt;/span&gt;     {&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  62:&lt;/span&gt;         &lt;span class="kwrd"&gt;private&lt;/span&gt; T data;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  63:&lt;/span&gt;         &lt;span class="kwrd"&gt;private&lt;/span&gt; ReaderWriterLockSlim sync = &lt;span class="kwrd"&gt;new&lt;/span&gt; ReaderWriterLockSlim();&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  64:&lt;/span&gt;  &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  65:&lt;/span&gt;         &lt;span class="kwrd"&gt;public&lt;/span&gt; T Read()&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  66:&lt;/span&gt;         {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  67:&lt;/span&gt;             sync.EnterReadLock();&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  68:&lt;/span&gt;             &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  69:&lt;/span&gt;             {&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  70:&lt;/span&gt;                 &lt;span class="rem"&gt;// Thread.Sleep(50);&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  71:&lt;/span&gt;                 &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.data;&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  72:&lt;/span&gt;             }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  73:&lt;/span&gt;             &lt;span class="kwrd"&gt;finally&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  74:&lt;/span&gt;             {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  75:&lt;/span&gt;                 sync.ExitReadLock();&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  76:&lt;/span&gt;             }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  77:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  78:&lt;/span&gt;  &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  79:&lt;/span&gt;         &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Write(T &lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  80:&lt;/span&gt;         {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  81:&lt;/span&gt;             sync.EnterWriteLock();&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  82:&lt;/span&gt;             &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  83:&lt;/span&gt;             {&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  84:&lt;/span&gt;                 &lt;span class="rem"&gt;// Thread.Sleep(50);&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  85:&lt;/span&gt;                 &lt;span class="kwrd"&gt;this&lt;/span&gt;.data = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  86:&lt;/span&gt;             }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  87:&lt;/span&gt;             &lt;span class="kwrd"&gt;finally&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  88:&lt;/span&gt;             {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  89:&lt;/span&gt;                 sync.ExitWriteLock();&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  90:&lt;/span&gt;             }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  91:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  92:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  93:&lt;/span&gt;  &lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  94:&lt;/span&gt;     &lt;span class="kwrd"&gt;class&lt;/span&gt; VolatileLock : ILockTest&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  95:&lt;/span&gt;     {&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  96:&lt;/span&gt;         &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;volatile&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; data;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  97:&lt;/span&gt;  &lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  98:&lt;/span&gt;         &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Read()&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  99:&lt;/span&gt;         {&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt; 100:&lt;/span&gt;             &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.data;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 101:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt; 102:&lt;/span&gt;  &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 103:&lt;/span&gt;         &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Write(&lt;span class="kwrd"&gt;int&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt; 104:&lt;/span&gt;         {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 105:&lt;/span&gt;             &lt;span class="kwrd"&gt;this&lt;/span&gt;.data = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt; 106:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 107:&lt;/span&gt;     }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Todas estas clases son utilizadas por un controlador que utiliza el &lt;a href="http://msdn.microsoft.com/es-cl/library/system.threading.threadpool.aspx"&gt;ThreadPool&lt;/a&gt; de .Net para solicitar la ejecucion de los métodos de escritura y lectura en una proporción de &lt;em&gt;n:1 &lt;/em&gt;que varia desde 1:1 hasta 29:1 para estas pruebas. El tiempo total de la ejecución de todos los métodos es medido utilizando la clase &lt;a href="http://www.blogger.com/msdn.microsoft.com/es-cl/library/System.Diagnostics.Stopwatch"&gt;StopWatch&lt;/a&gt; &lt;/p&gt;&lt;div class="csharpcode-wrapper"&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;long&lt;/span&gt; MeasureLockTest&amp;lt;T&amp;gt;(ILockTest&amp;lt;T&amp;gt; instance,T &lt;span class="kwrd"&gt;value&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt; totalExecutions, &lt;span class="kwrd"&gt;int&lt;/span&gt; ratio)&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:&lt;/span&gt;     Stopwatch sw = &lt;span class="kwrd"&gt;new&lt;/span&gt; Stopwatch();&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   4:&lt;/span&gt;     &lt;span class="kwrd"&gt;int&lt;/span&gt; writerCounter = 0;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:&lt;/span&gt;     &lt;span class="kwrd"&gt;int&lt;/span&gt; readerCounter = 0;&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   6:&lt;/span&gt;  &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:&lt;/span&gt;     ratio++;&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   8:&lt;/span&gt;     sw.Start();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:&lt;/span&gt;     &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; counter = 0; counter &amp;lt; totalExecutions; counter++)&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  10:&lt;/span&gt;     {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:&lt;/span&gt;         &lt;span class="kwrd"&gt;if&lt;/span&gt; (counter % ratio == 0)&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  12:&lt;/span&gt;         {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:&lt;/span&gt;             ThreadPool.QueueUserWorkItem((state) =&amp;gt; instance.Write(&lt;span class="kwrd"&gt;value&lt;/span&gt;));&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  14:&lt;/span&gt;             writerCounter++;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  16:&lt;/span&gt;         &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:&lt;/span&gt;         {&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  18:&lt;/span&gt;             ThreadPool.QueueUserWorkItem((state) =&amp;gt; instance.Read());&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:&lt;/span&gt;             readerCounter++;&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  20:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  22:&lt;/span&gt;     ThreadPool.QueueUserWorkItem((state) =&amp;gt; sw.Stop());&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:&lt;/span&gt;     &lt;span class="kwrd"&gt;while&lt;/span&gt; (sw.IsRunning) ;&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  24:&lt;/span&gt;  &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:&lt;/span&gt;     &lt;span class="kwrd"&gt;return&lt;/span&gt; sw.ElapsedMilliseconds;&lt;/pre&gt;&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  26:&lt;/span&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Escenarios&lt;/h2&gt;&lt;p&gt;Claramente la prueba es muy simple pues mide actividad sobre operaciones muy simples. Sin embargo, si miran el código de todas las clases en ellas esta comentado código que hace Sleep, esta inserción es la poco imaginatica implementacion de cierto tipo de costo en uso de recursos en una operación (la elección de Sleep es intencional pues dada la carga de requerimientos en el thread obliga a evaluar la ejecución de otro thread lo que también puede jugar un factor en escenarios de concurrencia). Con esta simple linea me permitió crear cuatro escenarios de ejemplo:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Operaciones sin costo: &lt;/strong&gt;Tipicamente son aquellas operaciones donde el bloqueo tiene por unico sentido la sincronización y brindar propiedades thread-safe. En este caso, uno de los más comunes, la operación es muy corta y con muy poco impacto. Por ello para obtener un grado de medida adecuado esta operación tuvo que realizarse 100000 veces. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Operaciones con costo en acceso exclusivo:&lt;/strong&gt; En este escenario la operación que requiere el bloqueo exclusivo (tipicamente la escritura) tiene un costo alto en tiempo (50 milisegundos), mientras que la operación con bloqueo compartido es bastante simple y rápida. Un escenario típico de este tipo de bloqueo son los caches implementados en consultas a servicios o fuentes de datos remotas donde la búsqueda inicial tiene un costo alto pero subsecuentes accesos son de bajo costo. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Operaciones con costo en acceso compartido: &lt;/strong&gt;En este escenario es la operación de acceso compartido la que tiene un costo alto mientras que la operación con costo exclusivo es de corta duración. Este tipo de escenario es un poco más dificil de darse y la verdad solo lo hice como un ejercicio. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Operaciones con costo: &lt;/strong&gt;Finalmente en este escenario ambas operaciones tiene un costo alto que es igual para ambas operaciones. Ejemplos de este tipo de escenarios se refieren principalmente al acceso sincronizado a recursos externos. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; En ninguno de los casos analice el uso de recursos de sistema que puede ser un factor en el cual Monitor/lock salen faavorecidos por no usar objetos de sincronización de Kernel&lt;/p&gt;&lt;h2&gt;Resultados&lt;/h2&gt;&lt;p&gt;A continuación se presenta los resultados de las pruebas en un grafico que muestra el tiempo promedio de las operaciones ejecutadas durante la prueba&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Operaciones sin costo:&lt;/strong&gt; 10000 iteraciones sin costo, &lt;/p&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_ObyD5vpoXxE/Sf494OTuXKI/AAAAAAAAAFk/Z7jhiLae4lU/s1600-h/image%5B100%5D.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: block; FLOAT: none; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: auto; BORDER-LEFT-WIDTH: 0px; MARGIN-RIGHT: auto" title="Gráfico de linea de tiempo promedio" border="0" alt="Gráfico de linea de tiempo promedio" src="http://lh6.ggpht.com/_ObyD5vpoXxE/Sf494mwBkUI/AAAAAAAAAFo/nmyLj2PChi0/image_thumb%5B88%5D.png?imgmax=800" width="524" height="172" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Como verán en este caso ReaderWriterLock es claramente un perdedor pero no en la proporción abismal que siempre leí. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Operaciones con costo en acceso exclusivo:&lt;/strong&gt; 100 iteraciones con costo de 50 milisegundos&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_ObyD5vpoXxE/Sf495Qf0rPI/AAAAAAAAAFs/MEFd5RWAgms/s1600-h/image%5B101%5D.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Gráfico de linea de tiempo promedio" border="0" alt="Gráfico de linea de tiempo promedio" src="http://lh6.ggpht.com/_ObyD5vpoXxE/Sf496L-vGqI/AAAAAAAAAFw/ivQQOVx9iQc/image_thumb%5B89%5D.png?imgmax=800" width="524" height="174" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;En este caso la diferencia entre todos los mecanismos es muy baja y en distintas ejecuciones demostró ser prácticamente nulo&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Operaciones con costo en acceso compartidos:&lt;/strong&gt; 100 iteraciones con costo de 50 milisegundos&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_ObyD5vpoXxE/Sf496yc_nCI/AAAAAAAAAF0/1ffEgb041TE/s1600-h/image%5B102%5D.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Gráfico de linea de tiempo promedio" border="0" alt="Gráfico de linea de tiempo promedio" src="http://lh5.ggpht.com/_ObyD5vpoXxE/Sf497SmhKYI/AAAAAAAAAF4/dDQpEXfSH9M/image_thumb%5B90%5D.png?imgmax=800" width="524" height="160" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;En este escenario es muy claro que la ventaja la tienen los criterios de bloqueo compartido con una ventaja inicial a favor de la nueva clase del framework 3.5, Como dije anteriormente no se me ocurre un escenario común.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Operaciones con cos&lt;/strong&gt;&lt;strong&gt;to:&lt;/strong&gt; 100 iteraciones con costo de 50 milisegundos&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_ObyD5vpoXxE/Sf4977SM_wI/AAAAAAAAAF8/rWsMdtDEnv4/s1600-h/image%5B103%5D.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Gráfico de linea de tiempo promedio" border="0" alt="Gráfico de linea de tiempo promedio" src="http://lh6.ggpht.com/_ObyD5vpoXxE/Sf499MN3zXI/AAAAAAAAAGA/LRYmAL-IqDM/image_thumb%5B91%5D.png?imgmax=800" width="524" height="179" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Al igual que en el caso anterior Monitor/lock son claros perdedores conforme mayor proporción de lecturas vs. escrituras existen. Es más en este caso la ventaja es muy notoria aún con una baja proporción de distribución (2:1).&lt;/p&gt;&lt;h2&gt;Volatile&lt;/h2&gt;&lt;p&gt;Al terminar la prueba se me ocurrió que para el primero de los escenarios (propiedades thread-safe) tambíen pueden utilizarse &lt;a title="Volatiles" href="http://msdn.microsoft.com/es-cl/library/x13ttww7(VS.80).aspx"&gt;variables volatiles&lt;/a&gt; así que hice una prueba y aqui estan los resultados de 100000 ejecuciones (dado que volatile no es una sección protegida solo el primer escenario es aplicable)&lt;/p&gt;&lt;p align="center"&gt;&lt;a href="http://lh6.ggpht.com/_ObyD5vpoXxE/Sf499lb15EI/AAAAAAAAAGE/BU-DhV_Sn_4/s1600-h/image%5B104%5D.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_ObyD5vpoXxE/Sf49-jw6dOI/AAAAAAAAAGI/ngZIfyZmPhE/image_thumb%5B92%5D.png?imgmax=800" width="524" height="193" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Como muestra el gráfico sacrificar el uso del cache de thread tiene un impacto en rendimiento bastante importante por lo que a pesar de su facilidad de uso y menor uso de recursos esta opción no es válida si lo que se busca es el mejor rendimiento.&lt;/p&gt;&lt;h2&gt;Conclusiones &lt;/h2&gt;&lt;p&gt;Considerando solo los tiempos y sin incluir el uso de recursos (que como mencioné anteriormente brinda una ventaja a Monitor/lock) las siguientes conclusiones vienen a mi cabeza:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Para sincronización en acceso a propiedades y cache claramente no hay ganancia en rendimiento apreciable en ninguno de los casos por lo que considerando el uso de recursos y facilidad de uso y lectura &lt;strong&gt;Monitor/lock/SyncLock &lt;/strong&gt;parece ser la mejor opcion. &lt;/li&gt;&lt;li&gt;En aquellos casos donde la sincronización se realiza sobre una sección que puede tener un costo medio o alto en tiempo es recomendable el uso de ReadWriterLockSym en Framework 3.5 o superior, o ReadWriterLock en versiones anteriores. En particular el acceso sincronizado a recursos de red puede ser un muy escenario de uso &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-1571319812524509553?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/1571319812524509553/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=1571319812524509553' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/1571319812524509553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/1571319812524509553'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2009/05/alternativas-de-bloqueo-en-net.html' title='Alternativas de Bloqueo en .Net'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_ObyD5vpoXxE/Sf494mwBkUI/AAAAAAAAAFo/nmyLj2PChi0/s72-c/image_thumb%5B88%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-3734716480026878254</id><published>2008-08-30T09:24:00.003-04:00</published><updated>2008-11-02T12:36:19.370-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lenguajes'/><category scheme='http://www.blogger.com/atom/ns#' term='español'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><title type='text'>Microsoft F# Developer Center</title><content type='html'>&lt;p&gt;Está disponible en MSDN un área dedicada a F# junto con el primer CTP de la integración en Visual Studio. Definitivamente algo para entretenerse &lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/fsharp/default.aspx"&gt;Microsoft F# Developer Center&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-3734716480026878254?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/3734716480026878254/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=3734716480026878254' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/3734716480026878254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/3734716480026878254'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2008/08/microsoft-f-developer-center.html' title='Microsoft F# Developer Center'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-7118517127057108225</id><published>2008-06-22T12:15:00.001-04:00</published><updated>2008-06-22T12:15:42.791-04:00</updated><title type='text'>Mi humilde opinión en F#</title><content type='html'>&lt;p&gt;El d&amp;#237;a de hoy despu&amp;#233;s de un gran esfuerzo y de una parcial cambio en el modelo de programaci&amp;#243;n termin&amp;#233; de leer &lt;a href="http://www.apress.com/book/view/1590598504"&gt;Expert F#&lt;/a&gt;. Que puedo decir, este es uno de esos libros que me cambi&amp;#243; la percepci&amp;#243;n de muchos aspectos del desarrollo de software. &lt;/p&gt;  &lt;p&gt;Algunas opiniones en distintos aspectos&lt;/p&gt;  &lt;h2&gt;Escritura&lt;/h2&gt;  &lt;p&gt;La escritura es muy clara y a pesar de que hay temas muy complejos que son abordados de manera muy simple para este humilde mortal los ejemplos de c&amp;#243;digo est&amp;#225;n muy bien elegidos para explicar el mensaje. &lt;/p&gt;  &lt;p&gt;Es interesante que si bien no se trata de entrar en detalle en todos los aspectos clarifica muchas cosas de lenguajes funcionales, .Net framework, modelos de programaci&amp;#243;n, parsers, etc.&lt;/p&gt;  &lt;p&gt;Claramente este libro ser&amp;#225; mi libro de cabecera por un buen tiempo, a&amp;#250;n si no estoy programando en F#&lt;/p&gt;  &lt;h2&gt;Programaci&amp;#243;n&lt;/h2&gt;  &lt;p&gt;La cantidad de cosas que aprend&amp;#237;, recorde y correg&amp;#237; de mis idas es muy grande para enumerarla. Los conceptos, explocaciones y recomendaciones incluidas en el libro son generales y pueden ser aplicadas en cualquier entorno y lenguje de programaci&amp;#243;n. &lt;/p&gt;  &lt;p&gt;Otro punto alto y loable.&lt;/p&gt;  &lt;h2&gt;El lenguaje&lt;/h2&gt;  &lt;p&gt;Debo decir que si bien hay muchos lenguajes que me gustan y con los cuales tuve qu&amp;#237;mica desde el principio (C#, Python, Lisp, Turbo Pascal) F# no fue uno de ellos. Sin embargo una vez terminada la lectura del libro debo decir que quede muy impresionado por el mismo y con muchas ganas de programar un m&amp;#243;dulo real (no quiero ejemplos ni ejercicios). Tengo en mente un muy buen ejemplo pero por ahora lo mantengo en el misterio :)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;PS&lt;/strong&gt;: Esta lectura me ha hecho aprender y apreciar cosas de otras lenguajes y debo decir que estoy muy interesado en aprender m&amp;#225;s de los conceptos de &lt;a href="http://www.erlang.org/" target="_blank"&gt;Erlang&lt;/a&gt;. El lenguaje no me parece atractivo pero su dise&amp;#241;o y conceptos es ciertamente MUY interesante&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-7118517127057108225?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/7118517127057108225/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=7118517127057108225' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/7118517127057108225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/7118517127057108225'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2008/06/mi-humilde-opinin-en-f.html' title='Mi humilde opinión en F#'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-4224682628687180851</id><published>2008-05-25T09:15:00.001-04:00</published><updated>2008-06-22T11:59:15.226-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><title type='text'>Prácticas Funcionales en desarrollos empresariales</title><content type='html'>&lt;p&gt;Hace unos meses que estoy trabajando, muy lentamente, en el uso de &lt;a href="http://research.microsoft.com/fsharp/fsharp.aspx"&gt;F#&lt;/a&gt; para ello estoy constantemente releyendo el excelente libro &lt;a href="http://www.apress.com/book/view/1590598504"&gt;Expert F#&lt;/a&gt;. Durante este periodo empez&amp;#233; el desarrollo de un proveedor de ADO.Net y decid&amp;#237; aplicar algunos de los linemientos y conceptos de programaci&amp;#243;n funcional. Para ser m&amp;#225;s exacto decid&amp;#237; tratar de crear objetos inmutables y funciones sin efectos colaterales y esta experiencia me deja algunos aprendizajes:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Estamos muy mal acostumbrados. Es decir que la evoluci&amp;#243;n de los lenguajes nos han llevado a pensar en un modelo donde las variables pueden ser alteradas en cualquier momento sin entender las implicaciones de estos cambios. Una vez que uno empieza a pensar en concurrencia, multi.core, etc. este tipo de programaci&amp;#243;n es muy nocivo. &lt;/li&gt;    &lt;li&gt;Es muy pr&amp;#225;ctico diferenciar los datos mutables e inmutables. Dado que el proveedor ser&amp;#225; usado en un entorno donde la mutabilidad es &amp;quot;recomendada&amp;quot; es necesario soportar algunos de estos aspectos pero resulta interesante que al separar aquellos aspectos mutables de los inmutables se puede ahorrar mucho esfuerzo. &lt;/li&gt;    &lt;li&gt;Las funciones sin efecto colateral generan c&amp;#243;digo que facilmente puede ser paralelizado y ejecutado de manera asincr&amp;#243;nica. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;En fin creo que el ejercicio fue muy bueno y estoy contento con los resultados obtenidos y justo cuando estaba en el proceso de detallar todos estos aspectos &lt;a href="http://codebetter.com/blogs/matthew.podwysocki/archive/2008/05/22/what-is-the-future-of-c-anyways.aspx"&gt;este post&lt;/a&gt; me evita el trabajo :)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-4224682628687180851?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/4224682628687180851/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=4224682628687180851' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/4224682628687180851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/4224682628687180851'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2008/05/prcticas-funcionales-en-desarrollos.html' title='Prácticas Funcionales en desarrollos empresariales'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-2631933691003170266</id><published>2008-04-27T19:58:00.001-04:00</published><updated>2008-04-27T19:58:57.766-04:00</updated><title type='text'>Programación Paralela, Concurrencia y otros</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Estoy tratando de entender la tendencia en este campo y la cantidad de esfuerzos y variedad de librerias me esta volviendo loco. &lt;br/&gt;En cuanto tenga una idea de algo volveré a comentar en el tema&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-2631933691003170266?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/2631933691003170266/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=2631933691003170266' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/2631933691003170266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/2631933691003170266'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2008/04/programacin-paralela-concurrencia-y.html' title='Programación Paralela, Concurrencia y otros'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-4060593157312003331</id><published>2008-04-27T16:40:00.001-04:00</published><updated>2008-04-27T16:40:44.958-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CAS'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='Seguridad'/><title type='text'>Seguridad en Frameworks - Parte I</title><content type='html'>&lt;p&gt;Durante los &amp;#250;ltimos meses he estado trabajando mucho en la generaci&amp;#243;n de un framework de uso no controlado. Es decir un framework que ser&amp;#225; utilizado por un conjunto variado de desarrolladores con los cuales no habr&amp;#225; una interacci&amp;#243;n. Esto no es una novedad para quienes desarrollan frameworks opens-source o redistribuibles, sin embargo a diferencia de ellos este framework es de uso corporativo y con un foco muy alto en la seguridad y &lt;strong&gt;restricci&amp;#243;n&lt;/strong&gt; en lo que los usuarios del mismo pueden realizar. Para ser m&amp;#225;s claros la idea no es solo proveer piezas reutilizables de c&amp;#243;digo y l&amp;#243;gica sino asegurar que dichas piezas sean utilizadas obligatoriamente y limitar el c&amp;#243;digo desarrollado en lo que puede realizar directamente.&lt;/p&gt;  &lt;p&gt;Duante el desarrollo de dicho framework utilizamos muchos, sino todos, de los &lt;a href="#Referencias"&gt;recursos disponibles&lt;/a&gt; en lo que se refiere a dise&amp;#241;o de frameworks y librerias base pero lleg&amp;#243; un punto donde la informaci&amp;#243;n disponible no era suficiente para poder lograr nuestro objetivo. Esto ten&amp;#237;a que ver con el uso de &lt;a href="http://msdn2.microsoft.com/en-us/library/930b76w0.aspx"&gt;CAS (Code Access Security)&lt;/a&gt;. Ha sido establecido por m&amp;#225;s de uno que la documentaci&amp;#243;n relacionado con el tema es bastante cr&amp;#237;ptica por lo que luego de una breve investigaci&amp;#243;n logramos establecer un mecanismo para lograr nuestro objetivo. As&amp;#237; que creo que vale la pena resumir el resultado del an&amp;#225;lisis.&lt;/p&gt;  &lt;h3&gt;&amp;#191;Que es CAS?&lt;/h3&gt;  &lt;p&gt;CAS es un mecanismo que permite controlar la ejecuci&amp;#243;n de porciones de c&amp;#243;digo limitando de esta forma el acceso a operaciones y recursos protegidos. En el caso de un framework empresarial el uso de CAS es muy importante pues permite que los administradores puedan limitar el acceso de las aplicaciones a los recursos declarados. Algunos de los elementos que son controlados a traves de CAS son:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Acceso a red&lt;/li&gt;    &lt;li&gt;Acceso a bases de datos&lt;/li&gt;    &lt;li&gt;Acceso al sistema de archivos&lt;/li&gt;    &lt;li&gt;Acceso al Registro de Windows&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;CAS ha sido muy poco utilizado en general debido a que la mayoria de las aplicaciones se ejecutan en FullTrust.&lt;/p&gt;  &lt;h3&gt;El Framework como Proxy&lt;/h3&gt;  &lt;p&gt;&lt;img style="border-right: 0px; border-top: 0px; margin: 0px 10px 10px 0px; border-left: 0px; border-bottom: 0px" border="0" alt="Framework como Proxy" align="left" src="http://lh3.ggpht.com/cristofer.gonzales/SBTky27bZcI/AAAAAAAAAC8/K-XtG6KqbH0/image%5B90%5D.png" width="196" height="260" /&gt;&lt;/p&gt;  &lt;p&gt;Si bien el escenario ideal permite que una aplicaci&amp;#243;n pueda estar limitado a acceder a los recursos exclusivos a trav&amp;#233;s de CAS esto implica que toda aplicaci&amp;#243;n deberia tener un inventario de los recursos utilizados (el escenario ideal incluso para un modelo de amenazas) pero esto no es posible cuando se habla de cientos de aplicaciones modificadas varias veces por a&amp;#241;o. Por esto es que en el escenario en el que estuvimos trabajando se plante&amp;#243; utilizar el framework de desarrollo como proxy es decir, todo acceso a un recurso sensible es realizado por el framework y las aplicaci&amp;#243;n &lt;strong&gt;solo&lt;/strong&gt; tienen permiso de invocar al framework.&lt;/p&gt;  &lt;p&gt;En este caso se da un cambio en las premisas de administraci&amp;#243;n donde en lugar de buscar la mayor restricci&amp;#243;n en el acceso a recursos se favorece el control y auditoria de acceso. Con el escenario propuesto si bien las aplicaciones podr&amp;#225;n acceder a todos los recursos el framework genera toda la informaci&amp;#243;n de auditoria necesaria y puede brindar mecanismos de restricci&amp;#243;n de acceso que sea configurable de manera m&amp;#225;s simple que la consola y herramientas de CAS.&lt;/p&gt;  &lt;p&gt;En pr&amp;#243;ximos posts har&amp;#233; un an&amp;#225;lisis b&amp;#225;sico del uso de CAS en una configuraci&amp;#243;n de permisos delegados.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Recursos para el dise&amp;#241;o de frameworks&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms229042.aspx"&gt;Design Guidelines for Developing Class Libraries&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/mirceat/archive/2008/03/13/linq-framework-design-guidelines.aspx"&gt;LINQ Framework Design Guidelines&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756"&gt;Framework Design Guidelines&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn2.microsoft.com/en-us/netframework/aa497263.aspx"&gt;Designing .NET Class Libraries: Security&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-4060593157312003331?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/4060593157312003331/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=4060593157312003331' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/4060593157312003331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/4060593157312003331'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2008/04/seguridad-en-frameworks-parte-i.html' title='Seguridad en Frameworks - Parte I'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/cristofer.gonzales/SBTky27bZcI/AAAAAAAAAC8/K-XtG6KqbH0/s72-c/image%5B90%5D.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-3820816518009704372</id><published>2008-01-22T09:35:00.001-03:00</published><updated>2008-01-22T09:35:35.019-03:00</updated><title type='text'>Guardar archivos en base de datos</title><content type='html'>&lt;p&gt;Ayer me pasaron este enlace con relaci&amp;#243;n al impacto de guardara documentos en base de datos. El an&amp;#225;lisis se focaliza en el rendimiento y considera aspectos como la fragmentaci&amp;#243;n y tipo de acceso. Es m&amp;#225;s basta con decir que el autor es Jim Gray para saber la calidad del paper.&lt;/p&gt;  &lt;p&gt;MUY RECOMENDABLE&lt;/p&gt;  &lt;p&gt;&lt;a title="http://research.microsoft.com/research/pubs/view.aspx?msr_tr_id=MSR-TR-2006-45" href="http://research.microsoft.com/research/pubs/view.aspx?msr_tr_id=MSR-TR-2006-45"&gt;http://research.microsoft.com/research/pubs/view.aspx?msr_tr_id=MSR-TR-2006-45&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-3820816518009704372?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/3820816518009704372/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=3820816518009704372' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/3820816518009704372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/3820816518009704372'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2008/01/guardar-archivos-en-base-de-datos.html' title='Guardar archivos en base de datos'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-3090986847806965690</id><published>2008-01-03T12:19:00.001-03:00</published><updated>2008-01-03T12:20:16.542-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vista'/><category scheme='http://www.blogger.com/atom/ns#' term='CLI'/><title type='text'>Robocopy es oficial</title><content type='html'>&lt;p&gt;Hace mucho tiempo que uso robocopy como la herramienta de linea de comando por defecto en mi d&amp;#237;a a d&amp;#237;a por eso al instalar una nueva m&amp;#225;quina es una de las herramientas que siempre copio la &amp;#250;ltima versi&amp;#243;n.&lt;/p&gt;  &lt;p&gt;Por todo esto no habia notado que en Vista ya es oficial. Hasta Xp y 2003 la herramienta de l&amp;#237;nea de comando para hacer copia de una rama de un directorio habia sido xcopy, que era bueno pero ten&amp;#237;a muchos deficiencias comparado con Robocopy sin embargo si en vista ejecutan xcopy esto es lo que ver&amp;#225;n:&lt;/p&gt;  &lt;table border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;         &lt;pre&gt;&lt;b&gt;&lt;span style="color: rgb(0,0,160)"&gt;C:\Users\cristofg&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;i&gt;&lt;span style="color: rgb(164,0,0)"&gt;xcopy /?&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;Copies files and directory trees.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; background-color: yellow"&gt;NOTE: Xcopy is now deprecated, please use Robocopy.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;XCOPY source [destination] [/A | /M] [/D[:date]] [/P] [/S [/E]] [/V] [/W]&lt;br /&gt;                           [/C] [/I] [/Q] [/F] [/L] [/G] [/H] [/R] [/T] [/U]&lt;br /&gt;                           [/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z] [/B]&lt;br /&gt;                           [/EXCLUDE:file1[+file2][+file3]...]&lt;/pre&gt;&lt;br /&gt;      &lt;/td&gt;&lt;br /&gt;    &lt;/tr&gt;&lt;br /&gt;  &lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;As&amp;#237; que Robocopy ya no es parte de resource kit ni nada pareido y es parte de la instalaci&amp;#243;n por defecto de Vista. Esta es una gran noticia para nosotros fan&amp;#225;ticos de Robocopy y tambi&amp;#233;n para los que aprender&amp;#225;n a usarlo&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-3090986847806965690?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/3090986847806965690/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=3090986847806965690' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/3090986847806965690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/3090986847806965690'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2008/01/robocopy-es-oficial.html' title='Robocopy es oficial'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-2499712477200314784</id><published>2007-12-28T10:55:00.001-03:00</published><updated>2007-12-28T10:55:57.361-03:00</updated><title type='text'>Buen Desarrollador != Buen Consultor != Buen Bombero (resolutor de problemas)</title><content type='html'>&lt;p&gt;En los &amp;#250;ltimos meses he estado involucrado en varios proyectos de revisi&amp;#243;n de c&amp;#243;digo y aplicaciones. Este tipo de proeyctos me resultan muy entretenidos por el an&amp;#225;lisis que se debe realizar la necesidad de aplicar ingenier&amp;#237;a reversa no solo al c&amp;#243;digo sino al razonamiento asociado al mismo, pero ese no es el punto de este post.&lt;/p&gt;  &lt;p&gt;Como parte de los proyectos pude trabajar con muchas personas distintas en un mismo tipo de entorno y esto me hizo recuerdo de las grandes diferencias entre tes t&amp;#233;rminos que muchas veces son mezclados por razones err&amp;#243;neas, el desarrollador, el consultor y el resolutor de problemas.&lt;/p&gt;  &lt;p&gt;En uno de los proyectos que hicimos trabajamos con un muy buen &lt;u&gt;desarrollador &lt;/u&gt;un persona queera muy buena dise;ando y escribiendo aplicaciones, un amplio manejo de patrones, TDD, herramientas de ciclo de vida, en fin una persona que ser&amp;#237;a invaluable en cualquier equipo de desarrollo de aplicaciones o productos. Sin embargo, esta persona no ten&amp;#237;a los skills para ser un buen consultor o revisor. Como consultor le faltaba la capacidad de presentar y exponer sus resultados de administrar los tiempos de avance y manejar la presi&amp;#243;n y riesgos de una situaci&amp;#243;n complicada.&lt;/p&gt;  &lt;p&gt;Ahora en otro proyecto ten&amp;#237;amos un buen &lt;u&gt;consultor&lt;/u&gt;. Alguien que pod&amp;#237;a integrarse en un equipo rapidamente pod&amp;#237;a transmitir sus hallazgos, medir el impacto de cambios y desarrollos m&amp;#225;s all&amp;#225; del c&amp;#243;digo. Analizar riesgos y oportunidades de manero coordinada, en fin un buen consultor y adem&amp;#225;s era un buen desarrollador pero a&amp;#250;n as&amp;#237; no era un buen resolutor &amp;#191;porque? porque no supo desenvolverse en un escenario que no era el suyo controlado. Es decir al ver c&amp;#243;digo de otras personas tuvo problemas en entenderlo, asimilarlo y simplemente se perdi&amp;#243; en el entorno donde alguien m&amp;#225;s con otros criterios desarrollo la soluci&amp;#243;n y termin&amp;#243; frustrandose.&lt;/p&gt;  &lt;p&gt;Tambi&amp;#233;n en estos proyectos tuvimos la suerte de contar con buenos &lt;u&gt;revisores&lt;/u&gt; gente que no solo supo entender rapidamente lo que el c&amp;#243;digo hac&amp;#237;a sino ademas el razonamiento detr&amp;#225;s de la escritura de ese c&amp;#243;digo y las potenciales &amp;#225;reas de falla. Estas personas adem&amp;#225;s supieron construirse un entorno de pruebas, confirmar sus hip&amp;#243;tesis de &amp;#225;reas de mejora, pudieron emitir recomendaciones e implementarlas. En fin este perfil se siente mucho m&amp;#225;s c&amp;#243;modo en entornos desconocidos y donde la documentaci&amp;#243;n e informaci&amp;#243;n es escasa y no clara&lt;/p&gt;  &lt;p&gt;Es importante que cada uno sepa cual de estos perfiles le sienta mejor para poder explotarlo al m&amp;#225;ximo&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-2499712477200314784?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/2499712477200314784/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=2499712477200314784' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/2499712477200314784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/2499712477200314784'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2007/12/buen-desarrollador-buen-consultor-buen.html' title='Buen Desarrollador != Buen Consultor != Buen Bombero (resolutor de problemas)'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-2929404892459209756</id><published>2007-11-27T08:38:00.001-03:00</published><updated>2007-11-27T08:38:59.748-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>Programación Ágil</title><content type='html'>&lt;p&gt;Una de las razones m&amp;#225;s importantes por las cuales Dilbert se mantiene en el coraz&amp;#243;n de los profesionales de TI es que muchas veces pone en palabras lo que muchos pensamos. &amp;#218;ltimamente hay una explosi&amp;#243;n de uso de metodolog&amp;#237;a &amp;#225;gil y hay tambi&amp;#233;n una explosi&amp;#243;n de gente que bajo el t&amp;#237;tulo de metodolog&amp;#237;a &amp;#225;gil se quita de encima todas las cosas que no quieren hacer.&lt;/p&gt;  &lt;p&gt;En fin creo que este comic del d&amp;#237;a de ayer que lo refleja mejor.&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.comics.com/comics/dilbert/archive/images/dilbert2666700071126.gif" /&gt;&lt;/p&gt;  &lt;p&gt;Pueden ver m&amp;#225;s historias de Dilbert en &lt;a href="http://www.dilbert.com"&gt;http://www.dilbert.com&lt;/a&gt; y suscribirse para recibir en su correo la historieta del d&amp;#237;a &lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:605EEA63-B54B-4e6d-A290-F5E9E8229FC1:aa798785-43e2-4e3f-af77-e8d4ffa54ebd" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;/div&gt;  &lt;div class="wlWriterSmartContent" id="scid:605EEA63-B54B-4e6d-A290-F5E9E8229FC1:d88ca336-3178-4849-aa10-7b0cd9059dbd" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;/div&gt;  &lt;div class="wlWriterSmartContent" id="scid:605EEA63-B54B-4e6d-A290-F5E9E8229FC1:d706c01c-37a4-47b7-a407-96468b645fef" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-2929404892459209756?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/2929404892459209756/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=2929404892459209756' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/2929404892459209756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/2929404892459209756'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2007/11/programacin-gil.html' title='Programación Ágil'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-8377579992924941748</id><published>2007-10-29T15:51:00.001-03:00</published><updated>2007-10-29T15:51:53.763-03:00</updated><title type='text'>Otro empleado más de Microsoft trabajando en Open Source</title><content type='html'>&lt;p&gt;Hace ya un tiempo escrib&amp;#xED; una cuantas l&amp;#xED;neas con relaci&amp;#xF3;n a &lt;a href="http://subsonicproject.com/" target="_blank"&gt;SubSonic&lt;/a&gt; y &lt;a href="http://www.codeplex.com/Wiki/View.aspx?ProjectName=actionpack" target="_blank"&gt;ActionPack&lt;/a&gt; lo interesante que me parecia. En los &amp;#xFA;ltimos meses &lt;a href="http://blog.wekeroad.com/" target="_blank"&gt;Rob Conery&lt;/a&gt;, la mente detr&amp;#xE1;s de SubSonic, ha estado escribiendo mucho sobre el futuro de SubSonic dado que &lt;a href="http://msdn2.microsoft.com/en-us/netframework/aa904594.aspx" target="_blank"&gt;LINQ&lt;/a&gt; cumple con muchas de las necesidades que SubSonic pretend&amp;#xED;a cubrir y en ese an&amp;#xE1;lisis Rob empez&amp;#xF3; a ampliar su visi&amp;#xF3;n para incluir todo el modelo MVC que tanto admira de &lt;a href="http://www.rubyonrails.com/" target="_blank"&gt;Ruby on Rails&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Es as&amp;#xED; que el viernes public&amp;#xF3; &lt;a href="http://blog.wekeroad.com/2007/10/26/microsoft-subsonic-and-me/" target="_blank"&gt;un mensaje&lt;/a&gt; que no es sorpresivo para la gran mayor&amp;#xED;a. Rob se une al equipo de ASP.Net para trabajar en proyectos Open Source y de comunidad relacionados con el nuevo framework MVC de ASP.Net. Al mismo tiempo Rob seguir&amp;#xE1; manteniendo y encargandose de la evoluci&amp;#xF3;n del SubSonic, que seguir&amp;#xE1; siendo un proyecto Open Source, as&amp;#xED; que asegurandose de llevarlo al mejor nivel.&lt;/p&gt;  &lt;p&gt;SIn duda creo que fue una muy buena decisi&amp;#xF3;n del equipo de &lt;a href="http://weblogs.asp.net/scottgu/" target="_blank"&gt;ScottGu&lt;/a&gt; y sin duda ya nos enteraremos de muchas cosas interesantes que vendr&amp;#xE1;n de la mano del equipo &lt;em&gt;&lt;strike&gt;Rails&lt;/strike&gt;&lt;/em&gt; MVC que se est&amp;#xE1; formando dentro del equipo de ASP.Net.&lt;/p&gt;  &lt;p&gt;&amp;#xA1;Felicitaciones a Rob y al equipo de ASP.Net!&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-8377579992924941748?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/8377579992924941748/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=8377579992924941748' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/8377579992924941748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/8377579992924941748'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2007/10/otro-empleado-ms-de-microsoft.html' title='Otro empleado más de Microsoft trabajando en Open Source'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-2280423075304594524</id><published>2007-10-27T21:28:00.001-03:00</published><updated>2007-10-27T21:31:36.615-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Virtualización y MinWin</title><content type='html'>&lt;p&gt;&lt;a href="http://www.microsoft.com/presspass/exec/de/Traut/default.mspx"&gt;Eric Traut&lt;/a&gt; es el &lt;a href="http://www.microsoft.com/presspass/exec/de/default.mspx"&gt;Distinguished Engineer&lt;/a&gt; a cargo del desarrollo del core de virtualizaci&amp;#xF3;n en Microsoft. Hace un tiempo (no conozco la fecha exacta) di&amp;#xF3; una charla en una universidad. La charla esta focalizada en hipervisores y la arquitectura del hipervisor de Windows Server 2008. Es una charla muy buena que permite entender en t&amp;#xE9;rminos generales los aspectos y razones de la virtualizaci&amp;#xF3;n y en particular de hipervisores vale la pena.&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:605EEA63-B54B-4e6d-A290-F5E9E8229FC1:8ad8cb2b-2188-4c8a-8aef-d6b4c2c277be" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;/div&gt;  &lt;div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:e4806a46-e486-47a6-a98f-eea6ed30eaad" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;div id="b0d46361-2937-4c68-8c98-7e1c2847c4b5" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://video.msn.com/video.aspx?vid=4eda33e8-3612-48ca-bf4a-b5e2d339855a&amp;amp;from=writer" target="_new"&gt;&lt;img src="http://lh6.google.com/cristofer.gonzales/RyPXm4yX5II/AAAAAAAAACU/Yy80J5EBLwo/video83c74fc2e84b.jpg" galleryimg="no" onload="var downlevelDiv = document.getElementById('b0d46361-2937-4c68-8c98-7e1c2847c4b5'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;embed src=\&amp;quot;http://images.video.msn.com/flash/soapbox1_1.swf\&amp;quot; quality=\&amp;quot;high\&amp;quot; width=\&amp;quot;432\&amp;quot; height=\&amp;quot;364\&amp;quot; wmode=\&amp;quot;transparent\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; pluginspage=\&amp;quot;http://macromedia.com/go/getflashplayer\&amp;quot; flashvars=\&amp;quot;c=v&amp;amp;v=4eda33e8-3612-48ca-bf4a-b5e2d339855a&amp;amp;from=writer\&amp;quot; &amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;label style="font-size:.8em;"&gt;Eric Traut - Virtualizaci&amp;oacute;n&lt;/label&gt;&lt;/div&gt;  &lt;p&gt;Ah, un bonus esta sobre el final de la charla en la que Eric Traut menciona la existencia de MinWin una versi&amp;#xF3;n minimalista del core de Windows que ser&amp;#xED;a el coraz&amp;#xF3;n de Windows 7, el sucesor de Vista. Obviamente este kernel no tiene interfaz gr&amp;#xE1;fica y esta limitado a lo escencial peso 25 MB y solo contiene 100 archivos, gran avance frente a Windows Core &amp;#xBF;verdad? Si solo les interesa ver MinWin en acci&amp;#xF3;n el video resumido esta a continuaci&amp;#xF3;n&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:6f5fafb5-32e3-41b1-acd4-09079907f9e3" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;div id="49cf7d8a-cd27-4647-941b-e45faf709bb2" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=NNsS_0wSfoU&amp;amp;color1=0x006699&amp;amp;color2=0x54abd6&amp;amp;border=1" target="_new"&gt;&lt;img src="http://lh5.google.com/cristofer.gonzales/RyPXnoyX5JI/AAAAAAAAACc/CG4BonQuz-w/videoadddef13d117.jpg" galleryimg="no" onload="var downlevelDiv = document.getElementById('49cf7d8a-cd27-4647-941b-e45faf709bb2'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;350\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/NNsS_0wSfoU&amp;amp;color1=0x006699&amp;amp;color2=0x54abd6&amp;amp;border=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;param name=\&amp;quot;wmode\&amp;quot; value=\&amp;quot;transparent\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/NNsS_0wSfoU&amp;amp;color1=0x006699&amp;amp;color2=0x54abd6&amp;amp;border=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; wmode=\&amp;quot;transparent\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;350\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;label style="font-size:.8em;"&gt;Demostraci&amp;oacute;n de MinWin&lt;/label&gt;&lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Via: &lt;a href="http://blogs.zdnet.com/microsoft/?p=842" target="_blank"&gt;Mary Jo Foley y su blog&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;PD: me pareci&amp;#xF3; interesante combinar youtube y soapbox :)&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-2280423075304594524?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/2280423075304594524/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=2280423075304594524' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/2280423075304594524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/2280423075304594524'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2007/10/virtualizacin-y-minwin.html' title='Virtualización y MinWin'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-9049913314448813780</id><published>2007-10-27T10:56:00.001-03:00</published><updated>2007-10-27T10:56:23.990-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><title type='text'>F# y Visual Studio</title><content type='html'>&lt;p&gt;&lt;a href="http://research.microsoft.com/fsharp/fsharp.aspx" target="_blank"&gt;F#&lt;/a&gt; es un lenguaje funcional tipado que esta basado en &lt;a href="http://caml.inria.fr/"&gt;OCaml&lt;/a&gt; y ha sido adecuado para ser eficiente en plataforma .Net. F# fue creado hace 2 a&amp;#xF1;os por un equipo de investigadores de Microsoft en Cambridge y ha tenido mucha receptividad en el mundo de los lenguajes funcionales. A decir verdad, &lt;a href="http://blogs.msdn.com/dsyme/archive/2006/04/01/566301.aspx" target="_blank"&gt;F# es utilizado&lt;/a&gt; en el mundo &amp;quot;real&amp;quot; por el equipo de &lt;a href="http://www.xbox.com" target="_blank"&gt;XBox Live&lt;/a&gt; con buenos resultados.&lt;/p&gt;  &lt;p&gt;F# ha ganado mucha visibilidad con algunos desarrolladores del equipo de Visual Studio y finalmente hace una semana &lt;a href="http://blogs.msdn.com/somasegar/"&gt;S. Somasegar&lt;/a&gt;, el VP de la divisi&amp;#xF3;n de productos para desarrolladores, anunci&amp;#xF3; la creaci&amp;#xF3;n de un equipo mixto entre desarrolladores de visual studio y el equipo de investigaci&amp;#xF3;n para &lt;a href="http://blogs.msdn.com/somasegar/archive/2007/10/17/f-a-functional-programming-language.aspx"&gt;llevar adelante la integraci&amp;#xF3;n y evoluci&amp;#xF3;n de F# &lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Esta noticia es muy interesante pues complementa la visi&amp;#xF3;n de .Net como una plataforma para todos los desarrolladores y los lenguajes de su preferencia: lenguajes fuertemente tipados orientados a objetos (C#, VB.Net, Delphi, boo), lenguajes din&amp;#xE1;micos (IronPython, IronRuby, JavaScript, VB, Iron*) y ahora lenguajes funcionales (F#).&lt;/p&gt;  &lt;p&gt;Esto me plantea una gran disyuntiva respecto a cual ser&amp;#xED;a mi lenguaje de hobby. Hasta ahora nunca dude que fuera C# pero dado que este lenguaje ya es mi herramienta de trabajo creo que deber&amp;#xED;a buscar otra alternativa para mantener la cabeza abierta, mi primera opci&amp;#xF3;n era sin dudarlo IronPython pero ahora se me plantea&amp;#xA0; la duda de F#. .&lt;/p&gt;  &lt;p&gt;&amp;#xBF;Por qu&amp;#xE9;? los lenguajes din&amp;#xE1;micos estan de moda pero no me son ajenos sin embargo no tengo ninguna experiencia con lenguajes funcionales y este es un reto interesante. En fin lo maravilloso de todo esto es que puedes elegir.&lt;/p&gt;  &lt;p&gt;Para mas informaci&amp;#xF3;n en F# pueden recurrir a los siguientes recursos:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="has announced the formation of a team to take F# forward." target="_blank"&gt;Sitio de investigaci&amp;#xF3;n de F#&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/dsyme" target="_blank"&gt;Blog de Don Syme&lt;/a&gt; - L&amp;#xED;der del proyecto&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/jomo_fisher/default.aspx" target="_blank"&gt;Blog de Jomo Fisher&lt;/a&gt; - Desarrollador del equipo de Visual Studio que ser&amp;#xE1; encargado de integrar F# en VS y un &lt;a href="http://blogs.msdn.com/jomo_fisher/archive/tags/F_2300_/default.aspx" target="_blank"&gt;seguidor de F#&lt;/a&gt; hace un tiempo atr&amp;#xE1;s-&lt;/li&gt;    &lt;li&gt;&lt;a href="http://research.microsoft.com/fsharp/manual/default.aspx" target="_blank"&gt;Manual de F#&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://research.microsoft.com/fsharp/books.aspx" target="_blank"&gt;Libros de F#&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-9049913314448813780?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/9049913314448813780/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=9049913314448813780' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/9049913314448813780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/9049913314448813780'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2007/10/f-y-visual-studio.html' title='F# y Visual Studio'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-2361150477096088032</id><published>2007-10-16T16:33:00.001-03:00</published><updated>2007-10-16T16:45:45.646-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><title type='text'>Licencias Microsoft son Open Source</title><content type='html'>&lt;div id="scid:605EEA63-B54B-4e6d-A290-F5E9E8229FC1:e4e8c062-c710-4001-837c-4d32c3db30e2" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Source: &lt;a href="http://opensource.org/node/207"&gt;http://opensource.org/node/207&lt;/a&gt;    &lt;br /&gt;    &lt;br /&gt;&lt;a href="http://lh6.google.com/cristofer.gonzales/RxUU4miOghI/AAAAAAAAABk/gEfEptRpXYw/10.16.2007.4.38.52%20PM.736%5B4%5D.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="382" alt="10.16.2007.4.38.52 PM.736" src="http://lh3.google.com/cristofer.gonzales/RxUU52iOgiI/AAAAAAAAABs/5UK4luSH8Hk/10.16.2007.4.38.52%20PM.736_thumb%5B1%5D.jpg" width="508" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;La &lt;a href="http://opensource.org" target="_blank"&gt;OSI (Open Source Initiative)&lt;/a&gt; ha dado por aprobadas las dos licencias que Microsoft present&amp;#xF3; hace unos meses. Las mismas en una primera instancia fueron observadas por los t&amp;#xE9;rminos y poca claridad de las mismas luego de una revisi&amp;#xF3;n y adaptaci&amp;#xF3;n de las mismas por parte de Microsoft el viernes pasado fueron oficialmente aprobadas.&lt;/p&gt;  &lt;p&gt;Para conocer el texto de las dos licencias pueden ingresar al sitio de OSI:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://opensource.org/licenses/ms-pl.html" target="_blank"&gt;Microsoft Public License: http://opensource.org/licenses/ms-pl.html&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://opensource.org/licenses/ms-rl.html" target="_blank"&gt;Microsoft Reciprocal License: http://opensource.org/licenses/ms-rl.html&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Es muy interesante este anuncio porque con esta aprobaci&amp;#xF3;n productos como &lt;a href="http://www.codeplex.com/IronPython" target="_blank"&gt;IronPython&lt;/a&gt; y &lt;a href="http://rubyforge.org/projects/ironruby" target="_blank"&gt;IronRuby&lt;/a&gt; son certificados por la comunidad Open Source como Codigo Libre. &amp;#xA1;Cooool!&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-2361150477096088032?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/2361150477096088032/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=2361150477096088032' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/2361150477096088032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/2361150477096088032'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2007/10/licencias-microsoft-son-open-source.html' title='Licencias Microsoft son Open Source'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-267459802686217155</id><published>2007-10-16T10:54:00.001-03:00</published><updated>2007-10-16T10:54:48.921-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='msdn'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='Symbian'/><title type='text'>Notas de un fin de semana largo</title><content type='html'>&lt;p&gt;Este fin de semana largo tuve tiempo de revisar varios blogs y webear en general as&amp;#xED; que hago un resumen de cosas interesantes que pasaron entre el viernes y hoy:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Oracle - BEA:&lt;/strong&gt; La compra de &lt;a href="www.bea.com" target="_blank"&gt;BEA&lt;/a&gt; es un movimiento que se ve&amp;#xED;a venir tarde a temprano y &lt;a href="www.oracle.com" target="_blank"&gt;Oracle&lt;/a&gt; es tan solo el actor circunstancial. Lo interesante de este movimiento es que si se completa (que dudo que no sea as&amp;#xED;) Oracle tendr&amp;#xED;a aproximadamente un 40% del mercado de App Servers frente al 24% de JBoss, hasta ahora el lider. En este an&amp;#xE1;lisis no voy a entrar en detalle porque es relativamente complejo pero si alguien esta interesado recomiendo leer los posts &lt;a href="http://www.google.com/reader/shared/03103044931827018713" target="_blank"&gt;que estoy leyendo&lt;/a&gt; o simplemente entrar al blog de &lt;a href="http://marcf.blgospot.com" target="_blank"&gt;Marc Fleury&lt;/a&gt; y leer sus posts de an&amp;#xE1;lisis que son muy buenos. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Beta de Net60:&lt;/strong&gt; &lt;a href="http://www.redfivelabs.com/content/products.aspx" target="_blank"&gt;Net60&lt;/a&gt; es una implementaci&amp;#xF3;n de &lt;a href="http://msdn2.microsoft.com/en-ca/netframework/aa497273.aspx" target="_blank"&gt;.Net CF&lt;/a&gt; para el sistema operativo de &lt;a href="http://www.symbian.com" target="_blank"&gt;Symbian&lt;/a&gt;. Esta es una gran noticia para los desarrolladores de aplicaciones m&amp;#xF3;biles con .Net porque al ser Symbian el gran due&amp;#xF1;o del mercado de sistemas operativos de celulares esta oferta incrementa mucho el alcance de las soluciones desarrolladas. Por ahora no me queda claro el modelo de comercializaci&amp;#xF3;n de &lt;a href="http://www.redfivelabs.com/" target="_blank"&gt;RedFiveLabs&lt;/a&gt; y su implementaci&amp;#xF3;n es compatible solo con la versi&amp;#xF3;n 1.0 de CF pero es definitivamente algo para tener en el radar. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Microsoft's Big Mac Sales:&lt;/strong&gt; El jueves en el almuerzo comentabamos con mi jefe todo el mercado para la venta de Windwos a usuarios de MacBook y como mucha gente estaba comprando Mac para instalar Windows. Despu&amp;#xE9;s me enter&amp;#xE9; que &lt;a href="http://www.microsoft-watch.com/" target="_blank"&gt;Microsoft Watch&lt;/a&gt; public&amp;#xF3; un &lt;a href="http://www.microsoft-watch.com/content/business_applications/microsofts_big_mac_sales.html" target="_blank"&gt;art&amp;#xED;culo&lt;/a&gt; al respecto. Algunos n&amp;#xFA;mero que quiero destacar: 20% de las ventas de retail de office son de la versi&amp;#xF3;n Mac, se estima que el 10% de las ventas de Vista en Retail son para usuarios de Mac. Si bien hay que aclarar que el mercado de Retail no es el ingreso principal de Microsoft no deja de ser un n&amp;#xFA;mero muy importante y confirma que cada vez m&amp;#xE1;s usuarios de Microsoft ser&amp;#xE1;n tambi&amp;#xE9;n usuarios de Mac. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;MSDN Magazine:&lt;/strong&gt; La edici&amp;#xF3;n de &lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/11/default.aspx" target="_blank"&gt;noviembre&lt;/a&gt; del &lt;a href="http://msdn.microsoft.com/msdnmag/" target="_blank"&gt;MSDN Magazine&lt;/a&gt; ya esta l&amp;#xED;nea y puede ser accedida en &lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/11/default.aspx" target="_blank"&gt;http://msdn.microsoft.com/msdnmag/issues/07/11/default.aspx&lt;/a&gt;. EL l foco de los art&amp;#xED;culos de este mes es seguridad y recomiendo mucho el art&amp;#xED;culo de &lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/11/SecDefects/default.aspx" target="_blank"&gt;code reviews&lt;/a&gt; claro que para m&amp;#xED; un mejor nombre ser&amp;#xED;a security code reviews, en fin no tenemos porque estar todos de acuerdo en todo :). &lt;/li&gt; &lt;/ol&gt;  &lt;p align="center"&gt;&lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/11/default.aspx"&gt;&lt;img height="325" alt="November 2007 MSDN Magazine cover" src="http://msdn.microsoft.com/msdnmag/images/covers/November07Coverlg.gif" width="249" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-267459802686217155?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/267459802686217155/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=267459802686217155' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/267459802686217155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/267459802686217155'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2007/10/notas-de-un-fin-de-semana-largo.html' title='Notas de un fin de semana largo'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-356438193013401088</id><published>2007-10-08T15:34:00.001-04:00</published><updated>2007-10-08T15:40:41.345-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>Proyecto personal</title><content type='html'>&lt;p&gt;Hace unas semanas que trato de definir que emprender&amp;#xE9; como proyecto personal para poder dedicarme a escrbir c&amp;#xF3;digo. Obviamente este proyecto deber&amp;#xED;a estar en un &amp;#xE1;rea de inter&amp;#xE9;s mio, es decir: Performance o Servicios. Hablando m&amp;#xE1;s en t&amp;#xE9;rminos de tecnolog&amp;#xED;a: WCF, BizTalk o Revisi&amp;#xF3;n de c&amp;#xF3;digo .Net orientada a performance.&lt;/p&gt;  &lt;p&gt;Con esas bases se me han venido un par de ideas a la cabeza y por ahora tengo un par de alternativas que parecen acentuarse cada vez m&amp;#xE1;s:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;WCF.FI:&lt;/strong&gt; &lt;a href="http://asn1.elibel.tm.fr/xml/finf.htm" target="_blank"&gt;FastInfoset&lt;/a&gt; (&lt;a href="http://en.wikipedia.org/wiki/Fast_Infoset" target="_blank"&gt;en wikipedia&lt;/a&gt;)es una especificaci&amp;#xF3;n que viene del mundo Java para la serializaci&amp;#xF3;n binaria de un Infoset XML. Esta serializaci&amp;#xF3;n esta basada en &lt;a href="http://asn1.elibel.tm.fr/standards/#asn1" target="_blank"&gt;ASN.1&lt;/a&gt; y por ahora ya tiene unas cuantas implementaciones. En WCF tenemos un mecanismo de serializaci&amp;#xF3;n binario propio de .Net y solo existe una implementaci&amp;#xF3;n, hasta donde s&amp;#xE9;, de &lt;a href="http://www.noemax.com/products/fastinfoset/index.html" target="_blank"&gt;FI para .Net&lt;/a&gt;. Esta implementaci&amp;#xF3;n es desarrollo de &lt;a href="http://www.noemax.com" target="_blank"&gt;noemax&lt;/a&gt; y sin duda parece la alternativa para aquellos que quieran implementar una soluci&amp;#xF3;n basada en WCF y FI, pero ser&amp;#xED;a bueno implementar lo necesario para proveer este servicio en un entorno de Test.       &lt;ul&gt;       &lt;li&gt;&lt;u&gt;Pros:&lt;/u&gt; Permite que trabaje bastante con WCF, XML y servicios y puede ser de utilidad en muchos escenarios. &lt;/li&gt;        &lt;li&gt;&lt;u&gt;Cons:&lt;/u&gt; Uno de los requerimientos base es soportar el manejo de ASN.1 que en el framework es inexistente as&amp;#xED; que hay que construir mucha plataforma antes de llegar a lo interesante. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;DNN.Performance:&lt;/strong&gt; &lt;a href="http://www.dotnetnuke.com" target="_blank" rel="nofollow"&gt;DotNetNuke&lt;/a&gt; es ampliamente utilizado y recomendado en todos los &amp;#xE1;mbitos. Sin embargo, todas y cada una de mis experiencias con la plataforma me ha dejado claro que el equipo de desarrollo jamas como objetivo el performance de la aplicaci&amp;#xF3;n. Todas las p&amp;#xE1;ginas y componentes que he revisado pueden mejorar sustancialmente con un poco de an&amp;#xE1;lisis y esfuerzo as&amp;#xED; que es una posibilidad contribuir a este equipo.       &lt;ul&gt;       &lt;li&gt;&lt;u&gt;Pros:&lt;/u&gt; Es un proyecto que involucra muchos aspectos del framework y que seguramente puede tener impacto en muchas instalaciones y sitios web. &lt;/li&gt;        &lt;li&gt;&lt;u&gt;Cons:&lt;/u&gt; Dado el ciclo de desarrollo de DNN puede requerir mucho tiempo antes de brindar resultados terminando en un branch antiguo siendo el optimizado &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Catalogo UDDI:&lt;/strong&gt; En este caso el objetivo ser&amp;#xED;a construir un catalogo de servicios (no solo un directorio) basado en UDDI 3.0.       &lt;ul&gt;       &lt;li&gt;&lt;u&gt;Pros:&lt;/u&gt; Me permitir&amp;#xED;a aprender UDDI y puede ser de mucha utilidad. &lt;/li&gt;        &lt;li&gt;&lt;u&gt;Cons:&lt;/u&gt; El futuro de UDDI lo veo incierto en el mercado en general as&amp;#xED; que no se cuanto pueda escalara la soluci&amp;#xF3;n. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Parallel FX:&lt;/strong&gt; No se qu&amp;#xE9;... pero me encantar&amp;#xED;a hacer algo con Parallel FX claro que aca como primer punto esta conseguir un drop del mismo y eso no pasar&amp;#xE1; en un buen tiempo. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;En fin como ver&amp;#xE1;n la decisi&amp;#xF3;n no es simple por ahora quien lleva las de perder es DNN pero uno nunca sabe que pasar&amp;#xE1;. Cualquier sea el caso los avances y aprendizaje ser&amp;#xE1;n reflejados en este espacio.&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-356438193013401088?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/356438193013401088/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=356438193013401088' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/356438193013401088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/356438193013401088'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2007/10/proyecto-personal.html' title='Proyecto personal'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-6417081234181556176</id><published>2007-10-08T15:32:00.001-04:00</published><updated>2007-10-08T15:32:37.692-04:00</updated><title type='text'>La noticia corre rapido</title><content type='html'>&lt;p&gt;EL d&amp;#xED;a de hoy por distintos gerentes de programa y producto (&lt;a href="http://weblogs.asp.net/scottgu/" target="_blank"&gt;ScottGu&lt;/a&gt; por ejemplo) se di&amp;#xF3; a conocer que Microsoft har&amp;#xE1; disponible el c&amp;#xF3;digo de las clases base de .Net. El c&amp;#xF3;digo incluir&amp;#xE1; comentarios y estar&amp;#xE1; integrado nativamente para el debug en VS 2008.&lt;/p&gt;  &lt;p&gt;Este es un gran hito para el equipo de producto y para todos los programadores .Net. Eso s&amp;#xED;, es muy importante aclarar los t&amp;#xE9;rminos de la licencia que hacen esto posible, el c&amp;#xF3;digo estar&amp;#xE1; disponible bajo los t&amp;#xE9;rminos de &lt;a href="http://www.microsoft.com/resources/sharedsource/licensingbasics/referencelicense.mspx" target="_blank"&gt;Microsoft Reference License&lt;/a&gt;. Es decir .Net NO es open source esto significa que todos aquellos que est&amp;#xE9;n involucrados activamente en el desarrollo de productos open source DEBEN abstenerse de mirar estas librerias &lt;a href="http://tirania.org/blog/archive/2007/Oct-03.html" target="_blank"&gt;Miguel de Icaza&lt;/a&gt; es el primero en hacerlo saber a los colaboradores de Mono. A el ya se suman muchos responsables de proyectos Open Source para asegurarse de evitar problemas.&lt;/p&gt;  &lt;p&gt;En fin, para todos aquellos que no son colaboradores son buenas noticias. Habr&amp;#xE1; mucho tiempo divertido y de aprendizaje revisando el c&amp;#xF3;digo fuente de todos los componentes de las librerias base del Framework.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;PS: &lt;/strong&gt;Este post lleva d&amp;#xED;as como draft y seguramente la noticia ya es vieja ... :(&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-6417081234181556176?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/6417081234181556176/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=6417081234181556176' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/6417081234181556176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/6417081234181556176'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2007/10/la-noticia-corre-rapido.html' title='La noticia corre rapido'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-4173267301676397066</id><published>2007-08-08T10:02:00.001-04:00</published><updated>2007-08-08T10:02:37.801-04:00</updated><title type='text'>Iron* para Firefox</title><content type='html'>&lt;p&gt;Reisando mi largamenet retrasada lista de blogs hoy me entere que Mozilla tiene un proyecto denominado &lt;a title="Tamarin - IronMonkey" href="http://wiki.mozilla.org/Tamarin:IronMonkey"&gt;IronMonkey&lt;/a&gt;&amp;nbsp;que tiene por objetivo que se puedan ejecutar scripts escritos en IronRuby y en IronPython en firefox. &lt;/p&gt; &lt;p&gt;Esta notiicia es enorme porque significa que efectivamente se estaría brindando la posibilidad a los programadores Web de utilizar otros lenguajes además de ECMAScript en los dos navegadores más utilizados ... esperen si consdieramos que Silverlight estará disponible para Safari en Mac estamos por encima del 99% de los navegadores.&lt;/p&gt; &lt;p&gt;El objetivo del proyecto es crear un traductor de CIL a ABC que es el código intermedio de &lt;a title="Proyecto Tamarin" href="http://www.mozilla.org/projects/tamarin/"&gt;Tamarin&lt;/a&gt;, la maquina virtual para JavaScript desarrollada por Adobe e integrada en los productos Mozilla. &lt;/p&gt; &lt;p&gt;Si Mozilla logrará efectivamente construir un traductor, con rendimiento en Web aceptable, de CIL a ABC en realidad cualquier lenguaje basado en DLR podría ser ejecutado en Firefox. Esto abre la puerta a VBX, IronPHP y cualquier otros que se vea por ahí. Eso es muuuuy emocionante.&lt;/p&gt; &lt;p&gt;Por otro lado Miguel de Icaza pulico en su &lt;a title="Blog Miguel de Icaza" href="http://tirania.org/blog/index.html"&gt;Blog&lt;/a&gt;&amp;nbsp;una pequeña prueba del rendimiento de Tamarin comparado con &lt;a href="http://www.mono-project.com/"&gt;Mono&lt;/a&gt;&amp;nbsp;y resulta que aún en lenguajes nativos Mono es más rápido. Su planteamiento es "Mono podría integrarse en Firefox y ser VM de scripting". &lt;/p&gt; &lt;p&gt;La idea de Miguel es&amp;nbsp;díficil que sea aceptada en el corto plazo&amp;nbsp;por tiempos, planificación y otros aspectos, pero la idea de tener navegadores que soporten CIL assemblies nativamente, además del soporte para SilverLight, en todas las plataformas es una linda utopia.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-4173267301676397066?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/4173267301676397066/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=4173267301676397066' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/4173267301676397066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/4173267301676397066'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2007/08/iron-para-firefox.html' title='Iron* para Firefox'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-117166006345357728</id><published>2007-02-16T18:07:00.000-03:00</published><updated>2007-02-16T18:07:46.363-03:00</updated><title type='text'>SubSonic - ActionPack</title><content type='html'>&lt;p&gt;Una de las ventajas de los lenguajes dinámicos es que los ORMs o pseudo-ORMs que se utilizan pueden generarse totalmente con la información de la base de datos. El más conocido ejemplo de esto hoy en día es &lt;a title="ActiveRecord" href="http://rubyforge.org/projects/activerecord/"&gt;ActiveRecord&lt;/a&gt; que es una implementación del &lt;a title="Patr&amp;oacute;n Active Record" href="http://en.wikipedia.org/wiki/Active_Record"&gt;patrón ActiveRecord&lt;/a&gt; en Ruby, y es el más famoso por ser utilizado por &lt;a title="Ruby on Rails" href="http://www.rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt;(ROR). Como los que leen mi blog saben soy un seguidor de Python más que Ruby por lo que mi implementación favortia de este tipo de ORMS es &lt;a title="Sitio proyecto SQLObject" href="http://www.sqlobject.org/"&gt;SQLObject&lt;/a&gt;, y si quieren un framework MVC prefiero &lt;a title="Sitio Web TurboGears" href="http://www.turbogears.com/"&gt;TurboGears&lt;/a&gt;, pero bueno no voy a desviarme del tema.&lt;/p&gt; &lt;p&gt;Los que me conocen saben también que no soy amigo de los ORM entonces porque lo que se preguntarán porque lo menciono en el mundo dinámico. Bueno porque en el mundo dinámico el costo de creación del objeto en sí hace que el costo del ORM sea despreciable. Además que todo el manejo de SQLObject me parece muy coherente y segundo porque todo el concepto de mapeo puede hacer que todo el proceso sea muy complicado. Pero si se pudiera tener algo efecitvo y ligero no estaría de más.&lt;/p&gt; &lt;p&gt;En el mundo CLR he visto varios intentos de hacer cosas similares (&lt;a title="Proyecto Active Records" href="http://www.castleproject.org/activerecord/index.html"&gt;ActiveRecord&lt;/a&gt; de &lt;a title="P&amp;aacute;gina Castle Project" href="http://www.castleproject.org/"&gt;CastleProject&lt;/a&gt; por ejemplo) casi siempre asociado&amp;nbsp;a proyectos de creación de frameworks MVC al estilo de ROR (&lt;a href="http://www.castleproject.org/monorail/"&gt;MonoRail&lt;/a&gt;). Sin embargo en estos proyectos he encontrado el problema común de la creación de los objetos, dado que el CLR es fuertemente tipado las clases deben ser conocidas por el compilador y no pueden ser modificadas posteriormente lo que limita mucho la creación automática. &lt;/p&gt; &lt;p&gt;Muchos proyectos han optado por la generación de código fuente para evitarse el problema de la generación del CIL. Esta opción es muy utilizada (&lt;a href="http://www.codesmithtools.com/"&gt;CodeSmith&lt;/a&gt;&amp;nbsp;es el ejemplo del que más he oido hablar) y creo que da buenos resultados, sin embargo estas soluciones requieren que cuando cambias o agregas elementos a tu base de datos debas regenerar la solución y recompilarla, dado que muchas veces agregas elementos sin modificar lo anterior no es lo más lógico reconstruir todo al menos no desde el origen.&lt;/p&gt; &lt;p&gt;CastleProject trato de usar su conocimiento de generación de CIL para facilitarlo así que basandose en NHibernate obtuvieron algo interesante, pero aún así se debe declarar la clase base y su comportamiento con lo cual no ganaron mucho.&lt;/p&gt; &lt;p&gt;Revisando algunas cosas me encontré con &lt;a href="http://www.commercestarterkit.org/"&gt;Commerce Starter Kit&lt;/a&gt;&amp;nbsp;una aplicación para la creación de sitios de comercio electrónico, el proyecto en si es interesante, pero lo que más me llamó la atención fue su enfoque MVC basado en &lt;a title="Sitio en CodePlex de Action Pack" href="http://www.codeplex.com/actionpack"&gt;SubSonic y ActionPack&lt;/a&gt;&amp;nbsp;¿porque me llamo la atención? porque no es necesario generar el código intermedio convirtiendose en una verdadera DAL sin código.&lt;/p&gt; &lt;p&gt;Al principio me pareció demasiado vudú por el hecho ya mencionado de ser el CLR tipado así que me dedique a ver la solución, conforme revise SubSonic (la parte de acceso a datos de ActionPack) entendí su solución y me encantó.&lt;/p&gt; &lt;p&gt;Lo que hace SubSonic es crear un proveedor de Build para ASP.Net lo que le permite que generen el código en demanda y sin necesidad de crear los archivos intermedios, una solución sencilla y altamente efectiva.&lt;/p&gt; &lt;p&gt;Este simple cambio de ubicación hace que la solución sea mucho más fácil de utilizar que otros modelos que haya visto y genera un escenario muy limpio ¿Por qué? porque las clases se generán dinámicamente y sin necesidad de crear archivos adicional y sin importar el lenguaje en el que programes.Obviamente un&amp;nbsp;nivel de abstracción no es lo suficientemente bueno si no puedes modificarlo por lo que, si así lo quieres, puedes generar los archivos intermedios y/o modificar las plantillas DOM para la generación de los&amp;nbsp;mismos.&lt;/p&gt; &lt;p&gt;Si uno lo piensa la tecnología utilizada es la misma que en los otros casos pero el enfoque y modo de combinación es lo que hace que SubSonic sea una solución muy simple y práctica para el uso en frameworks Web y estoy pensando seriamente en su validez en otros escenarios.&lt;/p&gt; &lt;p&gt;A veces la innovación no esta en la tecnología sino en la forma de uso de la misma. Ya les contare de mis pruebas con SubSonic y en un siguiente post hablaré de la parte de scaffolding de Action Pack.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Nota: &lt;/strong&gt;Obviamente piensen que para usarlo tienen que tener su modelo de datos completo después de todo Active Record parte de la base de datos.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-117166006345357728?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/117166006345357728/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=117166006345357728' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/117166006345357728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/117166006345357728'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2007/02/subsonic-actionpack.html' title='SubSonic - ActionPack'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-117118273037949524</id><published>2007-02-11T05:32:00.000-03:00</published><updated>2007-02-11T05:32:10.386-03:00</updated><title type='text'>LOB Adapter SDK for WCF</title><content type='html'>&lt;p&gt;La semana pasada estuve en un conjunto de conferencias de distintos temas y fuera de un tema de HPC que estoy analizando lo que más me llamo la atención, y que creo que es un salto muy interesante en el concepto de integración de aplicaciones, es el &lt;em&gt;LOB Adapter SDK for WCF&lt;/em&gt;&amp;nbsp;(Kit de desarrollo de adaptadores para aplicaciones de negocio para WCF)&lt;/p&gt; &lt;p&gt;Este SDK, que esta en Beta junto con BizTalk R2, es una extensión a WCF para construir conectores con aplicaciones de negocio. En primera instancia debo decir que me pareció muy raro que hubiera algo de este estilo pues con lo extensible que es WCF el construir un nuevo transporte y/o&amp;nbsp;encoder es bastante simple con lo que se podría crear bindings para cualquier aplicación.&lt;/p&gt; &lt;p&gt;Sin embargo hay un par de aspectos que son importantes para los conectores que son necesarios implementar y que los sabios pudieron explicar a este moral.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Metadata:&lt;/strong&gt; Es necesario buscar un mecanismo para el intercambio y acceso a la metadata de la aplicación de negocios a la que se quiere acceder. Esto no es un tema simple porque a diferencia de un servicio o servicios específicos en cuyo caso se puede intercambiar toda la información relacionada con esquemas, contratos y políticas de comunicación (WS-MetadataExchange es el protocolo diseñado para este intercambio) una aplicación puede exponer una gran variedad de funciones y endpoints de distinta indoles y/o categoría de manera no organizada en servicios. Estas funciones, adempás, pueden o no estar disponibles y variar de acuerdo a la instalación o configuración del sistema.&lt;br&gt;El mejor ejemplo de este tipo de comportamiento lo dan SAP, JDE, PeopleSOft, Siebel cuyos sistemas pueden tener dependiendo de la instalación y configuración conjuntos muy distintos de funciones expuestas para el acceso por parte de los usuarios. .&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Creación del proxy:&lt;/strong&gt; Un problema derivado del anterior esta en la creación del cliente dado que la metadata no es necesariamente expuesta en términos manejables por MEX (WS-MetadataExchange) svcutil no es una herramienta que se pueda utilizar para la creación del cliente.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Anteriormente los distintos adaptadores de LOB se generaban los desarrolladores del mismo eran los encargados de crear herramientas para realizar las dos tareas anteriores por ejemplo: el SAP.Net conector de SAP tenia herramientas para la creación los proxies a ser utilizados en .Net mientras que el SAP Adapter para BizTalk tenía otra herramienta para la creación de los esquemas a ser utilizados en los endpoints y el intento de SAP data source para SSIS tenía su propio desarrollo para solucionar estos problemas.&lt;/p&gt; &lt;p&gt;Obviamente con el crecimiento de necesidades de integración en las distintas aplicaciones esto es una necesidad cada vez más común. Por ejemplo solo en productos de microsoft los siguientes productos necesitan conectores a sistemas de este tipo: BizTalk, SharePoint, SSIS, SSRS (Reporting), MILM (Identity Lifecycle Manager), potencialmente MOM y seguro algún otro que se me pasa de lado.&lt;/p&gt; &lt;p&gt;Por todo esto es que el equipo de integración de Microsoft empezó a trabajar en un framework para la creación de adaptador para aplicaciones de negocio que cumpla con los requerimientos base de todas las aplicaciones permitiendo que la conexión punto a punto pueda ser resulta una sola vez y reutilizada por todos.&lt;/p&gt; &lt;p&gt;El framework obviamente se basa en la plataforma de servicios y comunicación de Microsoft WCF y provee una arquitectura que ya explicaré en algún otro post. El framework provee un conjunto de elementos reutilizables que asegura que el desarrollador de un conector tenga que limitarse a lo estrictamente necesario, que es:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Emision, consulta y busqueda de Metadata:&lt;/strong&gt; La diferencia en este punto es que el desarrollador expondrá unas cuantas interfaces comunes y que manejan las descripciones de manera abstracta. El framework brindará todo el mapeo de esos esquemas con WSDL, XSD, MEX, etc. asegurando que una aplicación que necesite de adaptadores no deba conocer a los mismos directamente y pueda hacer uso de las mismas.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Creación de conexiones: &lt;/strong&gt;Es bastante claro que el adaptador es el que conoce como conectarse con el servidor por lo que la creación de las conexiones es netamente su responsabilidad.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Envio y recepción de mensajes:&lt;/strong&gt; El día que nos podamos librar de esto estaremos listo para dar el siguiente y buscar otro trabajo :)&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;En otro post entraré en más detalle de la plataforma pero debo decir que lo que vi hasta ahora es muy bueno y vale la pena seguirle el paso&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-117118273037949524?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/117118273037949524/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=117118273037949524' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/117118273037949524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/117118273037949524'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2007/02/lob-adapter-sdk-for-wcf.html' title='LOB Adapter SDK for WCF'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-117117782955808024</id><published>2007-02-11T04:10:00.000-03:00</published><updated>2007-02-11T04:10:32.923-03:00</updated><title type='text'>Marc Fleury deja RedHat</title><content type='html'>&lt;p&gt;Los que me conocen y con los que hemos hablado de Java Application Servers saben que a pesar de que no soy un fanático de Java para mi la mejor solución de ese lado es &lt;a title="Sitio Oficial JBoss" href="http://www.jboss.com"&gt;JBoss&lt;/a&gt;. Esta opinión se&amp;nbsp;basa en&amp;nbsp;muchas cosas: su enfoque respecto al stack de JEE, su visión de donde van los application servers en general y su visión de un Open Source Profesional - &lt;em&gt;aún hoy considero que&amp;nbsp;el paper de Marc Fleury en el tema, fundador de JBoss, es muy interesante como modelo de negocios y algo a considerar.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Hace un tiempo RedHat compro JBoss y fue todo un hito en el mundo Open Source, Marc estaba muy emocionado por tener todo el respaldo que le daba Red Hat para seguir trabajando en su modelo de Open Source profesional y fortalecer el áea de Investigación y desarrollo.&lt;/p&gt; &lt;p&gt;Bueno, con todo eso dicho voy al tema del post. Habitualmente sigo el curso de &lt;a href="http://www.jboss.com/products/index"&gt;JEMS&lt;/a&gt;&amp;nbsp;(Java Enterprise Middleare Suite) y hace ya unos dos meses que se corrían muchos rumores de la "infelicidad" de Marc Fleury en Red Hat, principalmente porque sus expectativas de lo que podría hacer y quería hacer no se estaban realizando. Creo que el pobre Mac no contaba&amp;nbsp;con que al final del día Red Hat es una corporación y no precisamente alineada con su modelo Open Source Profesional.&lt;/p&gt; &lt;p&gt;Todo esto se fortalece cuando hace un mes casi Marc toma "vacaciones indefinidas" respaldado por el nacimiento de su último hijo, este aviso disparó muchos más rumores y casi aseveraciones de la inminente salida de Fleury la historia siguió por semanas pero fue recien el día de hoy se oficializó que Marc no vuelve a Red Hat. Los comentarios que leí dicen que&amp;nbsp;por un tiempo se dedicará a la enseñanza y a pasar tiempo con su familia, esa es una&amp;nbsp;gran noticia para Marc pero algo para pensar para los que defienden el modelo de Red Hat como un modelo de Open Source comercial.&lt;/p&gt; &lt;p&gt;Es bien sabido que Red Hat es la oveja negra de todos aquellos que se consideran seguidores del modelo Open Source sin embargo creo que esto es la prueba definitiva de la divergencia entre el proveedor más importante de&amp;nbsp;Linux para empresas y la corriente Open Source.&lt;/p&gt; &lt;p&gt;Sinceramente espero que no sea lo último que escuchemos de Marc insisto que hasta la fecha su visión en relación a Open Source es la única que me ha parecido sostenible y coherente. Eso sí no puedo negar que espero que la próxima vez que se sepa de él sea en el mundo de CLI y no de JVM ;)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-117117782955808024?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/117117782955808024/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=117117782955808024' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/117117782955808024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/117117782955808024'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2007/02/marc-fleury-deja-redhat.html' title='Marc Fleury deja RedHat'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-116909418733886392</id><published>2007-01-18T01:23:00.000-03:00</published><updated>2007-01-18T01:23:13.063-03:00</updated><title type='text'>Windows Movie Maker y MOV</title><content type='html'>&lt;p&gt;Este post será muy corto y concreto hace una semana o más decidí utilizar por primera vez Windwos Movie Maker a fin de editar y adecuar unas cuantas filmaciones que se realizaron con una pequeña camara digital. Debo decir que WMM es en realidad muy fácil de usar y pude ubicarme muy rápido, lamentablemente cuando quise importar los archivos encontré que WMM no podía importar archivos MOV :S&lt;/p&gt; &lt;p&gt;Entonces empecé a entender, WMM importa archivos basados en Codecs de Windows o&amp;nbsp;DirectShow y obviamente Apple y QuickTime no proveen los mismos. Ademas que no tenía instalado QuickTime Player (no soy muy fanático del mismo)&lt;/p&gt; &lt;p&gt;Estuve buscando un Codec para el formato de QuickTime y cuando estaba&amp;nbsp;a punto de darme por vencido encontre &lt;a title="QuickTime Codec" href="http://www.codecguide.com/about_qt.htm"&gt;QuickTime Alternative,&lt;/a&gt;&amp;nbsp; que es un codec para Windows y un filtro para DirectShow que permite visualizar MOV. Lo instale y ahora puedo ver los videos en WIndows Media PLayer y estoy editando los videos en Windows Movie Maker. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-116909418733886392?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/116909418733886392/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=116909418733886392' title='8 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/116909418733886392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/116909418733886392'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2007/01/windows-movie-maker-y-mov.html' title='Windows Movie Maker y MOV'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-116861278663571906</id><published>2007-01-12T11:39:00.000-03:00</published><updated>2007-01-12T11:40:19.796-03:00</updated><title type='text'>Larga vida Community Server</title><content type='html'>&lt;p&gt;Bueno este post tiene por objetivo explicar mi larga ausencia y ver si puedo retomar la escritura.&lt;/p&gt; &lt;p&gt;Como ya comenté tuve problemas con mi portátil lo que me limitó mucho y no me permitió trabajar en varias ideas que tenía en la cabeza. Para resumir una larga historia luego de casi tres meses de esperar que el soporte técnico de HP pudiera reparar la portátil y/o que llegaran las partes HP decidió entregarme una nueva portátil, la nueva es una&amp;nbsp;&lt;a title="Compaq nx6320 en hp.com" href="http://h10010.www1.hp.com/wwpc/vn/en/sm/WF05a/1090709-1124051-1124051-1124051-12434656-12467216.html" target="_blank" rel="nofollow"&gt;Compaq nx6320&lt;/a&gt;, es un buen equipo y por ahora el único reclamo que me hizo golpearme la cabeza contra la pared es que su LCD solo soporta hasta 1024x768 pero bueno a todo uno se acostumbra.&lt;/p&gt; &lt;p&gt;Para que se den una idea de cuanto tomo todo el proceso la entrega no se concretó sino hasta el 20 de diciembre por lo que después de las fiestas estuve instalando y configurando el equipo (Vista, Office 2007, Net fx3, SQL 2005 SP2, etc, etc) y estuvo listo para reiniciar actividades para fin de año.&lt;/p&gt; &lt;p&gt;Bueno ahora ya saben que tengo tan sólo un par de semanas con total capacidad de operación. y en dichas semanas estuve trabajando en un pequeño proyecto que es lo que da nombre a este post.&lt;/p&gt; &lt;p&gt;Para ponerlos en contexto a fines del año pasado me involucré en la creación de un pequeño sitio de comunidad (nada de tecnología) y por ser el que &lt;strong&gt;trabaja con computadoras&lt;/strong&gt; me toco encargarme de ver el hosting, plataforma y todo aquello. &lt;/p&gt; &lt;p&gt;Dado que la comunidad no será manejada y en realidad tiende a ser bastante pública tenía que ser una plataforma fácil de usar y administrar por no techies. Tipicamente para este tipo de escenarios en proyectos que realizo utilizo WIndows SharePoint Services. Pero como en este caso el hosting no siempre lo provee y no necesitabamos toda la plataforma decidí evaluar dos alternativa &lt;a title="Sitio Oficial de DotNetNuke" href="http://www.dotnetnuke.com/" target="_blank" rel="nofollow"&gt;DotNetNuke&lt;/a&gt; y &lt;a title="Sitio Oficial de Community Server" href="http://communityserver.org/" target="_blank" rel="nofollow"&gt;Community Server&lt;/a&gt;, ¿por qué esas dos? 1)por que son las que conocía 1) habia jugado con ellas alguna vez 3) Son muy utilizadas y probadas.&lt;/p&gt; &lt;p&gt;Dado que el criterio de selección final iba a ser la usabilidad creí que la mejor forma de probar era bajar el último build de ambos, instalarlo, configurarlo, crear un tema y dejar un pequeño sitio de prueba funcionando.&lt;/p&gt; &lt;h5&gt;&lt;a title="Sitio Oficial de DNN" href="http://www.dotnetnuke.com/" rel="nofollow"&gt;DotNetNuke&lt;/a&gt;&lt;/h5&gt; &lt;p&gt;DotNetNuke (DNN)&amp;nbsp;es uno de los proyectos Open Source ASP.Net más grandes del planeta y esta enfocado en la fácil creación y mantenimiento de sitio, portales y aplicaciones Web. Los que me conocen saben que DNN no es mi plataforma favorita y esta lejos de serlo pero las razones son netamente técnicas y de rendimiento - &lt;em&gt;Si bien DNN sigue prácticas altamente probadas de diseño y hace un uso muy efectivo de varios patrones, en mi opinión esta sobrediseñado y todo este sobrediseño hace que el rendimiento caiga conforme mayor su uso solo como ejemplo los invito a revisar como esta implementado el manejo de RSS &lt;/em&gt;-&amp;nbsp;pero como&amp;nbsp;en este caso no necesitamos escalar mucho y tenía ante todo la necesidad de ser fácil decidí considerarlo.&lt;/p&gt; &lt;p&gt;A continuación van los resultados de cada paso&lt;/p&gt; &lt;h6&gt;Instalación&lt;/h6&gt; &lt;p&gt;La instalación de DNN fue bastante simple, copiando los archivos en la carpeta Web y luego siguiendo los pasos del asistente DNN fue capaz de tener el sitio funcionando en un par de minutos, definitivamente fue un punto a favor.&lt;/p&gt; &lt;h6&gt;Configuración&lt;/h6&gt; &lt;p&gt;El proceso de configuración consiste en la limpieza de los datos de ejemplo, creación de unos cuantos foros, un par de blogs y un conjunto de galerias. Aquí es donde DNN empezó a caer en rating, limpiar los datos creados por defecto fue fácil, pero cuando empezé a buscar la creación de nuevos elementos pude ver que no toda la funcionalidad que necesita estaba incluida y necesitaba descargar varios módulos. Entonces entre al sitio de DNN e ingrese en un su buscador una simple frase &lt;strong&gt;Create a Forum, &lt;/strong&gt;si no hubiera cerrado el navegador probablemente aún estaría esperando la respuesta (no el rendimiento que uno espera), bueno intentemos de nuevo :S Error inesperado. Ok DNN no me ayudará. Pero encontré un buen sitio &lt;a href="http://www.dnncreative.com"&gt;DNN Creative&lt;/a&gt;&amp;nbsp;que con sus tutoriales me permitió hacer un par de cosas. Ahora vamos con los blogs pero esto no soporta enclosures y así la lista seguía y bajaba otro módulo y otro módulo... basta, esto me sirve para entender el concepto.&lt;/p&gt; &lt;h6&gt;Creando un tema&lt;/h6&gt; &lt;p&gt;Asumiendo que mi sitio estaba listo (solo asumiendo) me puse a trabajar en crear un tema. Los temas de DNN se basán en archivos HTML y ASCX que definen las zonas de trabajo para que luego DNN ponga el contenido. Me baje la guía de creación de temas del sitio y empezé a trabajar en ello parar resumir estuve un par de horas cambiando cosas y jamas pude hacer que DNN luciera como quería. Es cierto que es muy flexible y con unos días más de trabajo lo hubiera logrado pero esto era solo una prueba y no tenía días de trabajo.&lt;/p&gt; &lt;h6&gt;Conclusión&lt;/h6&gt; &lt;p&gt;Al final mi sitio no tenía todo lo que quería y tenía un tema a medias :S. &lt;/p&gt; &lt;p&gt;Antes de seguir tengo que reconocer que DNN tiene como gran ventaja el gran número de módulos disponibles si quieren crear un sitio o aplicación que vaya más allá de una comunidad la funcionalidad es accesible, completamente integrada y definitivamente es una buena alternativa que requiere una inversión importante de tiempo.&lt;/p&gt; &lt;h5&gt;&lt;a title="Sitio Oficial Community Server" href="http://communityserver.org/" target="_blank" rel="nofollow"&gt;Community Server&lt;/a&gt;&lt;/h5&gt; &lt;p&gt;Community Server (CS) es un producto de &lt;a href="http://telligent.com/"&gt;Telligent&lt;/a&gt; una empresa de desarrollo .Net que construyo la plataforma para su uso y luego la comercializó siendo la versión Personal gratuita para uso no comercial y en un solo dominio. Además que no está activa toda la funcionalidad de CS, ah y requiere que el logo de Powered By este en todas las páginas.&lt;/p&gt; &lt;p&gt;Antes de seguir hay que aclarar que dado que este es un producto específico para comunidades lo que le da cierta ventaja sobre DNN, también&amp;nbsp;debo decir que tecnológicamente me parece una plataforma mucho más interesante que DNN.&lt;/p&gt; &lt;h6&gt;Instalación&lt;/h6&gt; &lt;p&gt;La instalación de&amp;nbsp;CS fue también muy simple, copiando los archivos en la carpeta Web y luego siguiendo los pasos del asistente la comunidad estaba lista en un abrir y cerra de ojos.&lt;/p&gt; &lt;h6&gt;Configuración&lt;/h6&gt; &lt;p&gt;Dado que al momento de instalar CS pregunta si se incluirán datos de ejemplo no fue necesario realizar una limpieza y pude empezar directamente con la creación de los blogs, foros y galerías. La verdad que la tarea fue muy simple (el panel de control es muy claro) y en menos de media hora tenía creado todo mi contenido de ejemplo. Tuve algunos problemas habilitando la publicación de usuarios anónimos pero una búsqueda en el sitio de CS permitió que un CS MVP me diera la respuesta. Punto a favor.&lt;/p&gt; &lt;h6&gt;Creando un tema&lt;/h6&gt; &lt;p&gt;La creación de temas fue un poco más compleja porque al principio me costó entender el modelo de skinning de CS pero de nuevo un par de búsquedas en el sitio me dieron la pauta y resulto mucho más simple de lo que pensaba. CS basa sus plantillas en Contenidos y regiones (muy similar a los conceptos de master pages de ASP.Net 2.0) así que una vez comprendido pude crear un tema de blog en un par de horas. &lt;/p&gt; &lt;p&gt;El tema de sitio tomaría más pero el concepto era el mismo&lt;/p&gt; &lt;h6&gt;Conclusión&lt;/h6&gt; &lt;p&gt;Al final mi sitio lucía como una comunidad, tenía el funcionamiento de una comunidad y tenía blogs y galerias con temas propios.&lt;/p&gt; &lt;p&gt;Claramente las ventajas de CS para el manejo de comunidades superan por mucho a las de DNN pero tienen la contra de las limitaciones por licenciamiento y que no es tan fácil integrar nuevas aplicaciones (bueno si es fácil pero los add-ons no están disponibles en la versión Personal). &lt;/p&gt; &lt;p&gt;Como el título ya denotaba al final me quede con CS Personal y no me arrepiento luego de dos semanas de trabajo (donde el mayor trabajo fue el diseño del tema y del contenidodel sitio) hoy la comunidad esta en línea y pronta a hacerse pública.&lt;/p&gt; &lt;p&gt;Como siempre no faltará quien diga que soy un ignorante en DNN o que si quiero otro dominio CS Personal no me sirve o ...[insertar razones por las que DNN es el mejor software del plante], es probable que todo sea cierto pero CS Personal resolvió mis necesidades actuales de manera más simple, rápida y adecuada, al final ¿no es eso lo que importa?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-116861278663571906?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/116861278663571906/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=116861278663571906' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/116861278663571906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/116861278663571906'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2007/01/larga-vida-community-server.html' title='Larga vida Community Server'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-116618092810068394</id><published>2006-12-15T07:58:00.000-03:00</published><updated>2006-12-15T08:08:48.113-03:00</updated><title type='text'>Finalmente...</title><content type='html'>Finalmente tengo un máquina en la que puedo hacer muchas de las cosas que tenía planificadas, lamentablemente aún no es la mía pero sirve. Que significa esto que con suerte en poco tiempo estaré publicando un par de posts largamente olvidados, mientras tanto quería comentar un par de cosas:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;SIF &lt;/strong&gt;Hace poco más de una semana un amigo me comentó que habían publicado &lt;a href="http://codeplex.com/SIF"&gt;SIF &lt;/a&gt;en &lt;a href="http://www.codeplex.com"&gt;codeplex&lt;/a&gt;. SIF es la abreviatura de Service Invocation Framework que es un framework pensado para facilitar la vida de aquellos que trabajan con aplicaciones que consumen servicios. Si, y ase que WCF está listo y muchas cosas pero SIF les permite que sin instalar .Net 3.0 tengas funcionalidades tales como: Proxy dinámico de servicios (este por si solo vale oro), consumo de servicios independiente de transporte (WCF, ASMX, Remoting, etc.) diagnóstico, tracing y la posibilidad de tener un pipeline de proceso en el cliente. Altamente recomendado, ah si el link es &lt;a href="http://codeplex.com/SIF"&gt;http://codeplex.com/SIF&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Robotics Studio&lt;/strong&gt;. Si señor la semana pasada finalmente se liberó Microsoft Robotics Studio que es libre para su descarga en uso no comercial. Sinceramente creo que esta herramienta es uno de esos productos que cambiará la vida de muchos. &lt;a href="http://msdn.microsoft.com/robotics"&gt;http://msdn.microsoft.com/robotics&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Como ven eran literalmente un par de cosas. Espero que el próximo post incluya código.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-116618092810068394?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/116618092810068394/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=116618092810068394' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/116618092810068394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/116618092810068394'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2006/12/finalmente.html' title='Finalmente...'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-116491333132609079</id><published>2006-11-30T16:02:00.000-03:00</published><updated>2006-11-30T16:02:11.433-03:00</updated><title type='text'>¿Quieres hacer pan? utiliza AJAX</title><content type='html'>&lt;p&gt;Esta parece ser la premisa en todo lugar donde hablan de desarrollo Web. Al igual que ha pasado muchas otras veces con otras tantas propuestas y tecnologías AJAX se ha vuelto la palabra de moda y su uso un símbolo de status. SIn embargo no siempre AJAX es la mejor opción en muchas ocasiones en realidad estas generando tráfico y carga adicional todo por usar lo que esta de moda.&lt;/p&gt; &lt;p&gt;Como toda tecnología y herramienta en general AJAX tiene un lugar y uso adecuado por ello cito algunos escenarios donde AJAX no creo que se conveniente:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;AJAX NO debe ser usado en sitios donde se redibuja toda la página. Piensen que si fuera un link seria solo una llamada en cambio con ajax tendrán la llamada, cambio de estilos y despliegue y el usuario no habrá ganado nada.&lt;/li&gt; &lt;li&gt;AJAX NO debe usarse para traer imagenes, un uso común es cambiar las imagenes pero si traen la imagen con AJAX y luego le piden al navegador desplegarla están agregando pasos innecesarios.&lt;/li&gt; &lt;li&gt;AJAX NO debe usarse para no tener que cambiar nunca de página. En este caso tus archivos JS se volveran enormes y todo el tiempo que podrías ahorrar entre llamadas lo utilizaras en descargar tus archivos. Los enlaces no son tus enemigos.&lt;/li&gt; &lt;li&gt;AJAX NO debe complicar la navegación. Tipicamente cuando alguien encuentra algo interesante lo que hace es mandar el link a otros por lo tanto un link javascript:Ejecutar('2sdfasdfasdf') no servira de nada. Este enfatiza el anterior &lt;strong&gt;los enlaces no son tus enemigos&lt;/strong&gt;&lt;/li&gt; &lt;li&gt;AJAX NO debe asumir que todos los navegadores soportan Javascript habemos muchos que tenemos deshabilitadas varias opciones o incluso todo javascript así que siempre piensa en un método alterno.&lt;/li&gt; &lt;li&gt;AJAX NO debe ser usados para correr procesos Batch. Por muy tentador que parezca esto no es una buena idea. ¿Porque? porque simplemente pierdes totalmente el control del proceso al enviarlo al servidor. Es posible mantener un control pero para eso necesitarías crear al menos 4 servicios ajax Inicio, Estado, Cancelacion, Resultado. Mientras que una página de servidor puede refrescarse y mantener al tanto al usuario con un mayor control de proceso en el servidor.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;En fin todo esto solo es para decir un viejo y conocido dicho &lt;strong&gt;la mejor solución es la más simple&lt;/strong&gt; y recuerda AJAX no siempre lo es.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;PS&lt;/strong&gt; quiero hacer un reconocimiento al equipo de MS Visual Interdev e Internet Explorer que hace 7 años plantearon el uso de &lt;em&gt;RemoteScripting &lt;/em&gt;y &lt;em&gt;DHTML&lt;/em&gt;, ideas que evolucionaron en XmlHttpRequest y que hoy son base de AJAX, si tan solo todos los hubieran escuchado entonces...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-116491333132609079?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/116491333132609079/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=116491333132609079' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/116491333132609079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/116491333132609079'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2006/11/quieres-hacer-pan-utiliza-ajax.html' title='¿Quieres hacer pan? utiliza AJAX'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-116351377744848147</id><published>2006-11-14T11:16:00.000-03:00</published><updated>2006-11-14T11:16:17.770-03:00</updated><title type='text'>Semanas ocupadas...</title><content type='html'>&lt;p&gt;Para los equipos de producto, los mismos nos han dado muchas novedades y esperé a que estuvieran todas acumuladas para comentarlas.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;.Net Fx3 RTM.&lt;/strong&gt; Así es el lunes pasado se hizo oficial&amp;nbsp;la comunicación y hoy WPF,WCF,WF y CardSpace estan disponibles para todos. Junto con el runtime también esta disponible el SDK de Windows Vista. Más info en &lt;a href="http://www.netfx3.com"&gt;http://www.netfx3.com&lt;/a&gt; &lt;li&gt;&lt;strong&gt;PowerShell RTM,&lt;/strong&gt; En el blog del equipo de producto hoy anunciaron que finalmente el nuevo shell de Windows esta listo. Para los administradores de redes y servidores y para los amantes de la linea de comando es obligatorio descargarlo. Más info &lt;a title="http://support.microsoft.com/kb/926139" href="http://support.microsoft.com/kb/926139"&gt;http://support.microsoft.com/kb/926139&lt;/a&gt;&amp;nbsp;(por si acaso los enlaces de descarga son nuevos así que puede que tarden un poco en estar disponibles) &lt;li&gt;&lt;strong&gt;Office 2007 RTM.&lt;/strong&gt; También el lunes pasado el equipo de producto entrego el build que fue llevado a las fabricas. Lamentablemente este producto no se puede descargar, pero si esperan hasta el primero de diciembre ya se podrá descargar un trial. Por ahora habrá que conformarse con probarlo en línea. Más info &lt;a href="http://office.microsoft.com"&gt;http://office.microsoft.com&lt;/a&gt; &lt;li&gt;&lt;strong&gt;Vista RTM.&lt;/strong&gt; El WIndows con el nombre más raro también llegó al final de su etapa de pruebas y fue entregado a linea de ensamblaje.&amp;nbsp;Al igual que con Office habrá que esperar&amp;nbsp;antes de tener un instalador de Vista y la fecha estimada&amp;nbsp;de disponibilidad&amp;nbsp;"en tiendas" es fines de Enero del&amp;nbsp;2007, pero para las empresas con acuerdos con MS deberían tenerlo en Diciembre. Más info &lt;a title="http://www.microsoft.com/windowsvista/" href="http://www.microsoft.com/windowsvista/"&gt;http://www.microsoft.com/windowsvista/&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Bueno todo esto se traduce en... MUUUUUUUUUUUCHO por aprender y estudiar. Si bien he seguido a WCF y algo de WF tengo mucho que aprender en WPF; CardSpace. Vista API, Office Server, etc., etc. etc.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-116351377744848147?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/116351377744848147/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=116351377744848147' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/116351377744848147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/116351377744848147'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2006/11/semanas-ocupadas.html' title='Semanas ocupadas...'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-116334690683386045</id><published>2006-11-12T12:55:00.000-03:00</published><updated>2006-11-12T12:55:06.843-03:00</updated><title type='text'>Pendientes</title><content type='html'>&lt;p&gt;Al publicar el post incompleto de hoy (incompleto por que se suponía debía incluir un ejemplo) me dí cuenta que hace más de un més que estoy con la máquina de reemplazo. Definitivamente es un perjuicio pues en este mes han salido muchas ideas sobre las cuales escribir y que no he podido hacerlo por no tener donde probarlas. A continuación algunas de las ideas:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Completar el ejemplo del post de Http Handlers. Mi idea es construir un handler de WebDAV muy basico (no PROP solo listado, GET y PUT)&lt;/li&gt; &lt;li&gt;Análisis de estático de código en base de datos. Sip hay mil y un razones para hacerlo y estoy pensando en como automatizarlo (parece simple pero lo veremos)&lt;/li&gt; &lt;li&gt;Diseño físico de bases de datos en SQL 2005. El artículo que referencié hace unas dos semanas es muy bueno pero quiero incluir un par de comentarios que son importantes y que no se mencionan a detalle&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Bueno, esas son las idea por ahora, además de las revisiones de los nuevos drops del &lt;a href="http://www.gotdotnet.com/codegallery/codegallery.aspx?id=6fde9247-53a8-4879-853d-500cd2d97a83"&gt;service factory&lt;/a&gt; y del &lt;a href="http://www.codeplex.com/Wiki/View.aspx?ProjectName=websf"&gt;Web Client Factory&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;Hay mucho que hacer espero que mi portátil vuelva pronto.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-116334690683386045?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/116334690683386045/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=116334690683386045' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/116334690683386045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/116334690683386045'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2006/11/pendientes.html' title='Pendientes'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-116334534276956445</id><published>2006-11-12T12:29:00.000-03:00</published><updated>2006-11-12T12:34:51.136-03:00</updated><title type='text'>Http Handlers</title><content type='html'>&lt;p&gt;Ha pasado mucho tiempo desde que escribí un post. Esto se debe principalmente a que como comente anteriormente mi portátil estuvo en reparaciones y la máquina de reemplazo no tenía los recursos para poder hacer las pruebas que debían acompañar al post. Sin embargo, este post estuvo en trabajo por mucho tiempo.&lt;/p&gt; &lt;h2&gt;&lt;span style="color: rgb(71, 75, 78);"&gt;¿Qué es un HTTP handler?&lt;/span&gt;&lt;/h2&gt; &lt;p&gt;Veamos para entenderlo creo que es  mejor mostrar un diagrama del flujo que sigue un requerimiento que llega a un servidor IIS ejecutando ASP.Net&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6145/667/1600/DiagramaBlog.0.png"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/6145/667/320/DiagramaBlog.0.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;Antes de seguir debo aclarar que este diagrama es reducido al proceso en ASP.Net y no considera el proceso propio de IIS.&lt;/p&gt; &lt;p&gt;Ahora si, en materia, como se ve en el diagrama ASP.Net procesa todos los requerimientos a través de un Http Handler que es configurado por path y requerimiento Http (GET; POST; PUT; etc). &lt;/p&gt; &lt;p&gt;El Http Handler recibe el requerimiento en bruto y es el encargo de procesarlo para enviar una respuesta. Por ejemplo .Net utiliza el "forbidden Http Handler" para proteger archivos de configuración, código fuente, base de datos, etc., este Http Handler lo único que hace es responder que el acceso a los recursos solicitados esta denegado.&lt;/p&gt; &lt;p&gt;Las páginas web, los eventos y todo el manejo que tantos usuarios queremos es provisto por por el PageHandlerFactory, así como el manejo de los serviciso Web es provisto por el WebServiceHandlerFactory.&lt;/p&gt; &lt;h2&gt;&lt;span style="color: rgb(71, 75, 78);"&gt;¿Porque necesito saber de los handlers?&lt;/span&gt;&lt;/h2&gt; &lt;p&gt;Esta es una tipica pregunta, bueno las respuesta son variadas pero yo enumero algunos ejemplos:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Seguridad&lt;/strong&gt;. Es de conocimiento de todos que un sitio web que maneja información crítica debe ser protegido adecuadamente y una de las principales prácticas en temas de seguridad es la reducción de la superficie de ataque. Es decir deshabilitar todos aquellos componentes que no utilicemos. Por ejemplo en un sitio de servicios Web es recomendable deshabiltiar el PageHandlerFactory y de ser posible incluir la extensión aspx en la sección de forbiden. También deberían incluirse en forbidden extensiones como ser cgi, asp, etc.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Reutilización.&lt;/strong&gt; Un handler es una herramienta muy poderosa para lograr grandes niveles de reutilización. Por ejemplo se podría crear un handler que lea un xml y con eso genere un feed en un formato especifico (RSS, ATOM u algún otro). Esto hace que todas mis aplicaciones solo tengan que generar un XML interno y cualquier cambio en la salida lo define en el Handler.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Performance&lt;/strong&gt;. Hoy casi todas las aplicaciones necesitan almacenar algún tipo de archivo en la base de datos y para recuperarlo se crea una página que en base a los parámetros limpia el response y manda el resultado. SI bien esto no es malo (y muchos proyectos públicos muy grandes lo usan) es muy ineficiente y resta gran escalabilidad a la solución. ¿Por qué? pues porque para atender el requerimiento se creo una instancia del PageHandlerFactory una instancia de una página, se hizo manejo de eventos y muchas otras cosas innecesarias, en este escenario un handler evita toda esta maquinaría y es más directo en el envío de la respuesta resultando en ganancia de performance y escalabilidad. Para que quede claro esta recomendación no solo es valida para la carga y descarga de imágenes, sino para: Feeds, documentos, páginas Html estáticas ensambladas, Filtro de contenido, etc.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Creo que estas son muy buenas razones para que los desarrolladores presten atención a los Http Handlers y piensen mejor cuando podrían utilizarlas.&lt;/p&gt; &lt;p&gt;En un próximo post haré un ejemplo más concreto en el cual trataré de mostrar la ganancia en seguridad y performance. Eso si tendrán que esperar a que retorne mi portátil.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-116334534276956445?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/116334534276956445/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=116334534276956445' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/116334534276956445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/116334534276956445'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2006/11/http-handlers.html' title='Http Handlers'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-116221839032704078</id><published>2006-10-30T11:26:00.000-03:00</published><updated>2006-10-30T11:26:30.326-03:00</updated><title type='text'>Diseño físico de base de datos</title><content type='html'>&lt;p&gt;Este tema es una de los&amp;nbsp;que personalmente ha estado en mi cabeza los últimos años pues es una de las áreas más descuidadas&amp;nbsp;a la hora de implementar soluciones medianas y grandes, por eso es que cuando encontre este artículo me parecio que vale la pane difundirlo.&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.microsoft.com/technet/prodtechnol/sql/2005/physdbstor.mspx" href="http://www.microsoft.com/technet/prodtechnol/sql/2005/physdbstor.mspx"&gt;http://www.microsoft.com/technet/prodtechnol/sql/2005/physdbstor.mspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;PS: Estoy con problemas que me impiden hacer pruebas y documentar lo que tengo en la cabeza para poder publicar más a menudo, espero que en unos 10 días esto estará solucionado.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-116221839032704078?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/116221839032704078/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=116221839032704078' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/116221839032704078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/116221839032704078'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2006/10/diseo-fsico-de-base-de-datos.html' title='Diseño físico de base de datos'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-116068834322534133</id><published>2006-10-12T17:09:00.000-04:00</published><updated>2006-10-12T17:25:43.243-04:00</updated><title type='text'>Lo que debo tener instalado si o si</title><content type='html'>El día lunes sin previo aviso mi laptop paso a mejor vida, si ya se que no es nada raro . El tema es que esta vez lo que paso a mejor vida fue el hardware en general. No la instalación, no el disco duro, sino todos lo demás.&lt;br /&gt;Bueno mientras  mi laptop  es revisada por la gente de servicio técnico me fue entregada una de respaldo con lo básico (Windows y Office) y sin los permisos para instalar nada más.&lt;br /&gt;Después de usarla menos un día lo que me queda claro son las cosas que se han vuelto imperativas en mi modo de uso de la PC&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Resolución de 1400.&lt;/span&gt; El tamaño de esta pantalla me esta matando...&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ghisler.com/"&gt;&lt;span style="font-weight: bold;"&gt;Total Commander.&lt;/span&gt;&lt;/a&gt; Mucho más que un simple manejador de archivos, manejo de servicios, procesos, event log, compresión, etc.&lt;/li&gt;&lt;li&gt;&lt;a style="font-weight: bold;" href="http://www.microsoft.com/windowsserver2003/technologies/management/powershell/default.mspx"&gt;PowerShell&lt;/a&gt;. El futuro del shell en la para Windows se volvió casi imprescindible en muy poco tiempo (como extraño esa orientación a objetos y dinamismo).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.sharpreader.com/"&gt;&lt;span style="font-weight: bold;"&gt;SharpReader.&lt;/span&gt;&lt;/a&gt; Este fue el primer agregador que usé y que luego deje de usar por un tiempo pero que al final siempre vuelve por su interfaz simple y clara y además por su bajo consumo de recursos.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Tarjeta Wireless&lt;/span&gt; Si, ya se que esta no tiene que ver con software pero cuando no eres administrador no puedes conectar ningún hardware adicional.&lt;/li&gt;&lt;/ul&gt;Muchas otras cosas seguro vendrían a mi cabeza si supiera que esta es mi máquina definitiva. Pero estas se que son las que extrañaré aún si esta máquina la tengo solo una semana.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-116068834322534133?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/116068834322534133/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=116068834322534133' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/116068834322534133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/116068834322534133'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2006/10/lo-que-debo-tener-instalado-si-o-si.html' title='Lo que debo tener instalado si o si'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-115990440610193980</id><published>2006-10-03T15:40:00.000-04:00</published><updated>2006-10-03T15:40:06.160-04:00</updated><title type='text'>Fx-&gt; CF -&gt; MF</title><content type='html'>&lt;p&gt;Estoy muy retrasado con esta noticia pero la semana pasada no estuve muy conectado para verlo con anticipación. El día 26 de septiembre en el &lt;a href="http://www.embedded.com/esc/boston/"&gt;Embedded Conference de Boston&lt;/a&gt; se liberó el beta de &lt;strong&gt;.Net Micro Framework.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;.Net MF es la implementación del framework para aquellos dispositivos que están restringidos en memoria y recursos de hardware y surge del viejo proyecto de research &lt;a href="http://research.microsoft.com/spo"&gt;Smart Personal Objects&lt;/a&gt;&amp;nbsp;que mostró hace unos años un reloj que corría .Net en 64KBs y luego derivo en la comercialización del &lt;a href="http://www.amazon.com/Fossil-Smart-Watch-Direct-AU4000/dp/B0001540G4"&gt;smart watch&lt;/a&gt; y su integración con msn a través de &lt;a href="http://direct.msn.com/"&gt;Direct MSN&lt;/a&gt;&amp;nbsp;utilizando bandas de FM para la comunicación.&lt;/p&gt; &lt;p&gt;Pero no quiero desviarme de la historia la idea es que el equipo siguió trabajando y logró obtener una versión "genérica" que esta siendo probada por varias empresas que construyen dispositivos inteligentes. Lo interesante de esta versión del framework es que a diferencia de las anteriores que se ejecutan sobre un sistema operativo .Net MF trata de ejecutar directamente en procesador (bueno una HAL ligera para facilitar el cambio de componentes), es decir que todo el código que se genera es manejado. Si, leyeron bien código 100% manejado no Interop, no marshalling no nada. Esto quiere decir que incluso los drivers de hardware que si son escritos en C o similar por rendimiento son expuestos en interfaces de código manejado, esto es simplemente impresionante.&lt;/p&gt; &lt;p&gt;El grupo además ha hecho leverage de todo el trabajo de VS2005 y el .Net CF por lo que se dispone de emuladores para probar el código, se puede hacer debug de mismo en el emulador o en el dispositivo como tal. Estas cosas que para los desarrolladores de aplicaciones Windows y Web son algo comunes para los desarrolladores de dispositivos inteligentes son en algunos casos impactantes y en casi todos innovadoras. &lt;/p&gt; &lt;p&gt;Obviamente que el .Net MF no está disponible al público por el nivel acoplamiento que hay entre el dispositivo y el framework como tal (aunque el código que corra en hardware similar debería ser el mismo) pero se puede obtener algo de información básica en &lt;a href="http://www.aboutnetmf.com"&gt;http://www.aboutnetmf.com&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Ahora solo me pregunto si la gente de &lt;a href="http://msdn.microsoft.com/robotics"&gt;Robotics&lt;/a&gt;&amp;nbsp;esta al tanto para que podamos contar con el manejo de servicios, estado,&amp;nbsp;CCR e incluso el lenguaje de modelado en estos dispositivos. En fin, el futuro de los dispositivos inteligentes y robots se ve brillante en el mundo .Net&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-115990440610193980?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/115990440610193980/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=115990440610193980' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/115990440610193980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/115990440610193980'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2006/10/fx-mf.html' title='Fx-&amp;gt; CF -&amp;gt; MF'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-115923430019031845</id><published>2006-09-25T21:31:00.000-04:00</published><updated>2006-09-25T21:31:40.263-04:00</updated><title type='text'>Compresión y Servicios (Parte 2)</title><content type='html'>&lt;p&gt;En el anterior post traté de explicar la necesidad de un mecanismo de compresión que pueda ser con los servicios. COn esto en mente veamos algunos de los mecanismos que se han estado utilizando.&lt;/p&gt; &lt;h3&gt;&lt;font color="#474b4e"&gt;Compresión en transporte&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;Este camino es el que tipicamente se ha encarado y principalmente por que Http 1.1 incluye en su especificación la posibilidad de utilizar la cabecera&amp;nbsp;&lt;strong&gt;&lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11" rel="nofollow"&gt;Content-Encoding&lt;/a&gt;&lt;/strong&gt; para comprimir el contenido. Esta especificación es de mucha utilidad pues las razones que llevaron a la implementación de esta parte de la especificación son las mismas que discutí en el anterior artículo (no olvidemos que XML y HTML son substes de SGML). Es así que cuando el transporte era Http era la opción ideal para compresión. &lt;/p&gt; &lt;p&gt;Hablando especificamente de Windows IIS es capaz de comprimir el contenido generado por cualquier página o servicio que se ejecute en su contexto. Los pasos para habilitarlo están &lt;a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;Q322603"&gt;aquí&lt;/a&gt;.&amp;nbsp;Y en lo que se refiere al cliente .net en la versión 1.0 y 1.1 soporte para &lt;strong&gt;Content-Encoding: gzip&lt;/strong&gt; por lo cual era necesario algo de &lt;a href="http://www.dotnetjunkies.com/Tutorial/90D3B3E0-6544-4594-B3BA-E41D8F381324.dcik"&gt;magia&lt;/a&gt; para que funcionara. Pero en la versión 2.0 solo es necesario hacer uso de la opción &lt;a href="http://msdn2.microsoft.com/en-us/library/system.web.services.protocols.httpwebclientprotocol.enabledecompression.aspx"&gt;EnableDecompression&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Pero en lugar de seguir con Http Compression exclusivamente, entendamos el concepto si utilizaba Colas, SMTP, FTP o el transporte que fuera la tarea de compresión era responsabilidad del mismo y no así de la capa de manejo de SOAP y otros.&lt;/p&gt; &lt;p&gt;Lamentablemente &lt;a href="http://wcf.netfx3.com"&gt;WCF&lt;/a&gt;&amp;nbsp;no provee soporte nativo para Http Compression y sus otros transportes tampoco lo implementan por defecto.&lt;/p&gt; &lt;h3&gt;&lt;font color="#474b4e"&gt;Serialización optimizada&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;Esta idea surge&amp;nbsp;como contrapartida de la necesidad de compresión y&amp;nbsp;su objetivo no es comprimir un mensaje&amp;nbsp;sino generar un mejor mensaje, este enfoque&amp;nbsp;en teoria evita&amp;nbsp;todos las sobrecargas descritas en el anterior post. Casi todas las iniciativas se han denominado &lt;strong&gt;Serialización binaria&lt;/strong&gt; o alguna otra variante. La desventaja de este tipo de escenarios es que ninguna se ha impuesto como un estándar y su nivel de compatibilidad es muy limitado. &lt;/p&gt; &lt;p&gt;Actualmente hay un par de ideas alrededor que han extendido este concepto. Estos conceptos se basan en que la serialización no debería modificarse y debería seguir serializandose el mensaje a XML Infoset, en cambio estos deberían codificarse (encode) en binario y no en documentos XML, WCF utiliza este concepto en su&amp;nbsp;encoding binario que es, en palabras de &lt;a href="http://friends.newtelligence.net/clemensv/"&gt;Clemens Vasters&lt;/a&gt; en su &lt;a href="http://staff.newtelligence.net/clemensv/PermaLink,guid,51327201-07c7-4a30-b79c-53842cda1e77.aspx"&gt;blog&lt;/a&gt;, el nieto moderno y bajamente acoplado de &lt;a href="http://www.opengroup.org/onlinepubs/9629399/chap14.htm"&gt;NDR&lt;/a&gt;. Otro proyecto que esta tomando cuerpo es &lt;a href="http://asn1.elibel.tm.fr/xml/finf.htm"&gt;Fast Infoset&lt;/a&gt;&amp;nbsp;, este proyecto impulsado por &lt;a href="http://www.sun.com"&gt;Sun&lt;/a&gt;&amp;nbsp;y que basa&amp;nbsp;su mecanismo de codificación&amp;nbsp;en &lt;a href="http://asn1.elibel.tm.fr/en/index.htm"&gt;ASN.1&lt;/a&gt;&amp;nbsp; pretende ser la alternativa en escenarios Java. De nuevo estos mecanismos no aseguran interoperabilidad (aunque ya hay muchos trabajando en tener FI para WCF) y a pesar de que el tamaño del mensaje es mucho mejor no es comparable con un mensaje compreso. &lt;/p&gt; &lt;h3&gt;&lt;font color="#474b4e"&gt;Doble codificación&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;Este mecanismo lo han utilizado algunos en distintos transportes y consiste en que el generador del mensaje luego de serializarlo y codificarlo en XML lo vuelva a codificar esta vez utilizando un mecanismo de compresión, si queremos plantearlo así es llegar el concepto del content-encoding a la capa de codificación. &lt;/p&gt; &lt;p&gt;Esto no había sido utilizado mucho anteriormente pero me imagino que esta situación cambiará mucho al incluir los nuveos frameworks de servicios la facilidad de reemplazar o extender los codiicadores (encoders).&lt;/p&gt; &lt;p&gt;En el SDK de WCF podrán encontrar un ejemplo de un encoder que comprime utilizando GZip. Lo bueno de este encoder es que puede utilizarse en cualquier transporte. Lo malo es que no hay interoperabilidad&lt;/p&gt; &lt;h3&gt;&lt;font color="#474b4e"&gt;WS-Compression&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;Tengo que reconocer que no se exactamente donde surge esta especificación pero se que la primera mención de la misma se de en el proyecto PlumbOrange de &lt;a href="http://blogs.thinktecture.com/cweyer/"&gt;Christian Weyer&lt;/a&gt; y cia y que fue implementado por gente de &lt;a href="http://www.lagash.com/"&gt;Lagash&lt;/a&gt;&amp;nbsp;(&lt;a href="http://weblogs.shockbyte.com.ar/rodolfof/"&gt;Rodolfo&lt;/a&gt; y &lt;a href="http://weblogs.asp.net/cibrax/default.aspx"&gt;Pablo&lt;/a&gt;) para las distintas versiones de Web Services Enhancements y siendo la &lt;a href="http://weblogs.asp.net/cibrax/archive/2006/09/13/WS_2D00_Compression-for-WCF-RC1-_2800_September_2900_.aspx"&gt;última disponible&lt;/a&gt; la creada para WCF RC1 por Pablo. &lt;/p&gt; &lt;p&gt;Bueno, esta es una especificación que siguiendo el ejemplo de &lt;a href="http://www.w3.org/TR/xmlenc-core/"&gt;XML Encryption&lt;/a&gt;&amp;nbsp;reemplaza el contenido de un infoset XML con un elemento que contiene el binario (en base64) que cooresponde a la versión compresa. Y luego modifica el infoset para incluir información de referencia para descomprimir el elemento. &lt;/p&gt; &lt;p&gt;Este mecanismo tiene la ventaja de que puede ser más interoperable que la doble codificación y la codificación binaria, pero tiene la deventaja que al ser el resultado aún un documento XML no se obtiene el mejor resultado de compresión.&lt;/p&gt; &lt;h3&gt;&lt;font color="#474b4e"&gt;Conclusión&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;De las alternativas mencionadas casi todas ya están disponibles en WCF y/o WSE por lo cual es recomendable que se evalúe cuando puede ser beneficioso implementar estos mecanismos. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-115923430019031845?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/115923430019031845/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=115923430019031845' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/115923430019031845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/115923430019031845'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2006/09/compresin-y-servicios-parte-2.html' title='Compresi&amp;oacute;n y Servicios (Parte 2)'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-115863073788990459</id><published>2006-09-18T21:52:00.000-04:00</published><updated>2006-09-18T21:54:51.650-04:00</updated><title type='text'>los lenguajes pasan, la lógica se mantiene</title><content type='html'>&lt;p&gt;Robo un tiempo a la escritura de la segunda parte de serviciosy compresión para comentar en los lenguajes de programación. Esto surge porque el día de hoy recibi uchos mensajes relacionados con lenguajes, primero el anuncio de que las presentaciones de &lt;a href="http://www.langnetsymposium.com/"&gt;Lang.NET&lt;/a&gt; estan &lt;a href="http://www.langnetsymposium.com/speakers.asp"&gt;disponibles&lt;/a&gt;. Luego me envían el link de &lt;a href="http://www.eweek.com/article2/0,1895,2016415,00.asp"&gt;un artículo&lt;/a&gt;&amp;nbsp;en el que se recomiendan los lenguajes de programación que uno debe aprender para estar a la par del mercado (el orden sigue sin convencerme pero los lenguajes me parece que son los encaminados) y finalmente leo varios comentarios respecto a &lt;a href="http://www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython"&gt;IronPython&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;En fin si analizo cada tema por separado cada uno me trae muchas ideas y en este momento solo comentare algunas:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;u&gt;Lang.NET&lt;/u&gt;: Cuando uno lee el temario de este simposio queda claro que hay mucho trabajo alrededor de los &lt;a href="http://en.wikipedia.org/wiki/Dynamic_programming_language"&gt;lenguajes dinámicos&lt;/a&gt;, Aún recuerdo que en mis primeras interacciones con JavaScript lo que más me atrajo del lenguaje fueron las características que lo hacen dinámico y con el tiempo descubrí muchas ventajas y llegué a establecer cariño con algunos lenguajes dinámicos. La principal ventaja de este tipo de lenguajes radica en la extensibilidad y capacidad de adaptación que brindan estos lenguajes a sus soluciones. Por ejemplo permiten que interfaces gráficas sean fáciles de crear y embeber en soluciones empaquetadas, otro ejemplo es la generación de objetos totalmente consistentes sobre la marcha (para ejemplo basta un botón &lt;a href="http://www.turbogears.com"&gt;TurboGears&lt;/a&gt;&amp;nbsp;o &lt;a href="http://www.rubyonrails.com"&gt;Ruby on Rails&lt;/a&gt;. &lt;br&gt;Sin embargo también hay que recordar que los lenguajes adolecen de una gran contra que es el impacto en rendimiento tipicamente los lenguajes dinámicos son interpretados y debido a que son &lt;strong&gt;dinámicos&lt;/strong&gt; se hace un manejo muy complejo de las declaraciones y tipos. &lt;br&gt;Bueno creo que hablaré más de esto en el punto 3, pero sigo con el simposio. Más allá de los lenguajes dinámicos es interesante ver como el CLI se vuelve objeto de todos tipo de lenguajes funcionales, dinámicos, etc. y ver que los distintos esfuerzos alrededor están demostrando que es una plataforma viable para realizar implementaciones optimizadas. &lt;br&gt;Creo que es importante que los equipos de desarrollo involucrados con el CLI (en Microsoft&amp;nbsp;y&amp;nbsp;en Mono) empiecen a considerar algunas mejoras que surjan como recomendación de estas iniciativas y aseguren que la implementación de estas esten disponibles para todos los lenguajes&amp;nbsp;generando&amp;nbsp;una plataforma común y evitando que se dupliquen esfuerzos. Y si se puede finalmente incluirlo en el CLI. Hay que entender que muchos requerimientos de otros lenguajes pueden afectarse entre sí y allí es donde nosotros los mortales confiaremos en la sapiencia de los gurús.  &lt;li&gt;&lt;u&gt;Los lengaujes a aprender:&lt;/u&gt; Hace unos 8 años cualquiera que salía de la universidad había escuchado al menos una vez de Delphi y lo importante que era aprenderlo, es más yo era uno de sus defensores (lo que no quita que también usara Visual Basic). Y hoy no existe ninguna variante o descendiente que haya logrado ingresar en el top ten de e-Week. Personalmente creo que un programador debe poder adecuarse a cualquier sintaxis, pero también creo que no cualquier sintaxis se adecúa a cualquier problema. Por ello es muy importante que un buen programador conozca al menos 3 lenguajes de desarrollo, y en el caso de un arquitecto ... bueno un arquitecto tiene tiempo para leer mucho, ¿verdad?.&lt;br&gt;Así que empecemos a hacer una revisión de como estoy yo con respecto a la lista:&lt;br&gt; &lt;table style="border-top: #000000 1px solid; width: 100%; border-bottom: #000000 1px solid" cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt; &lt;tr style="background-color: #dddddd"&gt; &lt;th&gt;Lenguaje&lt;/th&gt; &lt;th&gt;Lectura&lt;/th&gt; &lt;th&gt;Escritura&lt;/th&gt;&lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&lt;a href="http://www.php.net/"&gt;PHP&lt;/a&gt;&lt;/th&gt; &lt;td&gt;Media&lt;/td&gt; &lt;td&gt;Básica, ha pasado mucho tiempo&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/618ayhy6.aspx"&gt;C#&lt;/a&gt;&lt;/th&gt; &lt;td&gt;OK&lt;/td&gt; &lt;td&gt;OK&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&lt;a href="http://en.wikipedia.org/wiki/Ajax_%28programming%29"&gt;AJAX&lt;/a&gt;&lt;/th&gt; &lt;td&gt;OK&lt;/td&gt; &lt;td&gt;OK&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&lt;a href="http://msdn.microsoft.com/library/spa/default.asp?url=/library/SPA/jscript7/html/jslrfjscriptlanguagereference.asp"&gt;JavaScript/ECMAScript&lt;/a&gt;&lt;/th&gt; &lt;td&gt;OK&lt;/td&gt; &lt;td&gt;OK&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&lt;a href="http://www.perl.com"&gt;Perl&lt;/a&gt;&lt;/th&gt; &lt;td&gt;Básica casi :S&lt;/td&gt; &lt;td&gt;:S&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;th&gt;C&lt;/th&gt; &lt;td&gt;OK&lt;/td&gt; &lt;td&gt;Basica - Media&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&lt;a href="http://www.ruby-lang.org"&gt;Ruby&lt;/a&gt;&lt;/th&gt; &lt;td&gt;Básica&lt;/td&gt; &lt;td&gt;Básica, muy básica&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&lt;a href="http://www.java.com"&gt;Java&lt;/a&gt;&lt;/th&gt; &lt;td&gt;Media&lt;/td&gt; &lt;td&gt;:S&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt;&lt;/th&gt; &lt;td&gt;OK&lt;/td&gt; &lt;td&gt;Media - OK&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;th&gt;&lt;a href="http://msdn.microsoft.com/vbasic/"&gt;VB.Net&lt;/a&gt;&lt;/th&gt; &lt;td&gt;OK&lt;/td&gt; &lt;td&gt;Media -OK&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Primero tengo que aclarar mi escala: &lt;em&gt;OK&lt;/em&gt; significa que siento que puedo leer/escribir una aplicación completa sin mayores sobresaltos, &lt;em&gt;Media&lt;/em&gt; significa que podría leer/escribir una aplicación con algunas consultas a fuentes de documentación del lenguaje,&amp;nbsp;&lt;em&gt;Básica&lt;/em&gt; es mi entendido de que puedo darme una idea pero requiero de actualizar mis conocimientos&amp;nbsp;o de tener&amp;nbsp;la referencia del lenguaje a mi lado y finalmente &lt;em&gt;:S&lt;/em&gt; significa que tendría que pedir ayuda a alguien que si sepa.&lt;br&gt;No esta mal, solo tengo dos en los que no podría escribir código y en ambos casos es un tema de afinidad con el lenguaje, en este punto&amp;nbsp;tengo que aclarar que&amp;nbsp;nunca me han gustado ni Perl, ni Java ni su sintaxis. Es cierto que he escrito código en Java pero no fue una sensación agradable. &lt;br&gt;Si ya se que me dirán si escribo ECMAScript y C# no debería tener problema con Java, pero esa no es la verdad. &lt;br&gt;En fin, creo que es importante revisar al menos 5 de estos lenguajes y tenerlos en un nivel medio o superior para lectura y al menos 3 en medio o superior para escritura. Para cerrar quiero decir que en la lista falta una variante de lenguaje que para mi esta dando y dará mucho que hablar y que toca&amp;nbsp;varios puntos importantes de la lista: &lt;strong&gt;IronPython&lt;/strong&gt; y con esto paso al punto 3.  &lt;li&gt;&lt;u&gt;IronPython&lt;/u&gt; Como habrán visto de mi lista anterior Python es un lenguaje con el que me siente comodo, esto viene de hace unos años cuando necesitando una aplicación que permitiera que una aplicación cualquiera se coenctara a un sitio que autenticaba con NTLM y encontré &lt;a href="http://ntlmaps.sourceforge.net/"&gt;NTLMAPS&lt;/a&gt;&amp;nbsp;viendo la aplicación encontré muchas cosas de Python que nunca habia visto así que me involucre y estuve mucho tiempo jugando con Python y llegó a posicionarse como uno de mis lenguajes favoritos.&lt;br&gt;Luego por razones de falta de tiempo deje de verlo y hace dos años o poco más vi en listas que había algo llamado IronPython que era un compilador de Python para .Net al ver el sitio de proyecto quede encantado porque Jim no solo estaba portando Python, sino creando un derivado que le permitiera utilizar las ventajas de Python y las ventajas de .Net.&lt;br&gt;Durante mucho tiempo seguí el proyecto, me alegré cuando me enteré que Jim ingresaa a Microsoft y mucho más cuando supe que IronPython contaría con el apoyo de Microsoft. Bueno con esos antecedentes les contaré que hace un par de semanas &lt;a href="http://hugunin.net/"&gt;Jim Hugunin&lt;/a&gt; anunció en su &lt;a href="http://blogs.msdn.com/hugunin"&gt;blog&lt;/a&gt; la liberación de la versión 1.0 de IronPython y no tarde en descargarlo. La verdad me parece un gran trabajo y el hecho de que pueda pasar&amp;nbsp; un 90% de las pruebas de la libreria estándar de Python es áun más sorprendente (el 10% que falta utiliza extensiones compiladas en C so..).&lt;br&gt;Bueno desde la liberación estuve haciendo un par de cosas y la verdad me encanta IronPython. Me queda pendiente probar el add-in para visual studio pero Python es un lenguaje para trabajar en archivos y consola :)&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Para finalizar este post que se extendió un poco solo quiero recalcar que si bien como desarrolladores podemos comulgar con un lenguaje u otro y que gracias a los servicios podemos comunicarnos facilmente con soluciones en otros lenguajes, no debemos olvidar que en un mundo de desarrolladores libres siempre habrán otros lenguajes y que cada uno tendrá un lugar para ser y crecer (yo creo que ya veremos algún lenguaje tipo pascal darnos una sorpresa).&lt;br&gt;Los lenguajes van y vienen pero mientras tu lógica, deseos de aprender y capacidad de análisis se desarrollen puedes estar seguro que siempre habrá uno que te satisfaga.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-115863073788990459?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/115863073788990459/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=115863073788990459' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/115863073788990459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/115863073788990459'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2006/09/los-lenguajes-pasan-la-lgica-se.html' title='los lenguajes pasan, la l&amp;oacute;gica se mantiene'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-115859364412109786</id><published>2006-09-18T11:34:00.000-04:00</published><updated>2006-09-18T11:34:04.250-04:00</updated><title type='text'>Presentaciones Lang.NET</title><content type='html'>&lt;p&gt;Para los que no saben &lt;a href="http://www.langnetsymposium.com/"&gt;Lang.Net&lt;/a&gt;&amp;nbsp;es un simposio que se llevo a cabo en Redmond a&amp;nbsp;fines de Julio. Las sesiones están orientadas exclusivamente a tem[as como ser compiladores, CLI, virtual machines, lenguajes. En fin sesiones de bajo nivel pero definitivamente muy interesantes. Recientemente se publicaron en video las presentaciones así que para quienes esten interesados este es el link&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.langnetsymposium.com/speakers.asp"&gt;http://www.langnetsymposium.com/speakers.asp&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-115859364412109786?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/115859364412109786/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=115859364412109786' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/115859364412109786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/115859364412109786'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2006/09/presentaciones-langnet.html' title='Presentaciones Lang.NET'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-115841990039378481</id><published>2006-09-16T11:18:00.000-04:00</published><updated>2006-09-16T11:18:20.433-04:00</updated><title type='text'>Compresión y servicios (Parte 1)</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;p&gt;Una de las principales dudas que tuvimos todos cuando SOAP y todos sus parientes hicieron aparición en escena fue el impacto en el rendimiento de estos protocolos tan pesados, XML era basicamente un formato de serialización muy chatty y no se comparaba con serializaciones binarias altamente optimizadas que utilizaban los protocolos de objetos distrbuidos (DCOM, CORBA). &lt;/p&gt; &lt;p&gt;Con el tiempo y entendiendo los conceptos que hoy conforman SOA se entendió que esto no impactaría tanto como se esperaba por el cambio en la programación de interfaces y contratos. &lt;/p&gt; &lt;p&gt;Sin embargo esto no quita que aún así XML sea una serialización muy cara, si hablamos de una red corporativa con LAN de 100 Mbps es manejable pero cuando se empiezan a construir soluciones que se se ejecutarán en enlaces bajos (dial-up, satelital, etc) y es en este punto donde mucha discusión se ha dado en el uso de compresión para la comunicación con servicios.&lt;/p&gt; &lt;p&gt;Si consideramos que las respuestas &lt;em&gt;grandes&lt;/em&gt; de servicios serializados en XML son documentos con un conjunto de registros similares cualquier algoritmo de compresión puede hacer un muy buen trabajo para disminuir el tamaño de un archivo. Tomemos por ejemplo un servicio de búsqueda que devuelve un documento con los resultados de búsqueda. La estructura del mensaje sería la siguiente.&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&amp;lt;resultados registros="100" inicio="0" total="1054"&amp;gt;&lt;br&gt;&amp;lt;resultado&amp;gt;&lt;br&gt;&amp;lt;Titulo&amp;gt;Sitio 1&amp;lt;/Titulo&amp;gt;&lt;br&gt;&amp;lt;Descripcion&amp;gt;Breve descripción del sitio&amp;lt;/Descripcion&amp;gt;&lt;br&gt;&amp;lt;Url&amp;gt;&lt;a href="http://sitio/"&gt;http://sitio/&lt;/a&gt;&amp;lt;/Url&amp;gt;&lt;br&gt;&amp;lt;/resultado&amp;gt;&lt;br&gt;...&lt;br&gt;&amp;lt;resultado&amp;gt;&lt;br&gt;&amp;lt;Titulo&amp;gt;Sitio 100&amp;lt;/Titulo&amp;gt;&lt;br&gt;&amp;lt;Descripcion&amp;gt;Breve descripción del sitio&amp;lt;/Descripcion&amp;gt;&lt;br&gt;&amp;lt;Url&amp;gt;&lt;a href="http://sitio34131"&gt;http://sitio34131&lt;/a&gt;&amp;lt;/Url&amp;gt;&lt;br&gt;&amp;lt;/resultado&amp;gt;&lt;br&gt;&amp;lt;/resultados&amp;gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;En este caso al existir tanto texto similar el grado de compresión puede ser muy alto, por ejemplo un archivo XML de 1.5 MB utilizando &lt;a href="http://www.gzip.org/"&gt;gzip&lt;/a&gt; como algoritmo de compresión (&lt;a href="http://www.ietf.org/rfc/rfc1952.txt"&gt;RFC 1952&lt;/a&gt;)&amp;nbsp;se convierte en 120 KB es decir un 8% del archivo original. Es cierto que el archivo que utilice como ejemplo tiene otros textos repetidos pero sirve como referencia.  &lt;p&gt;Obviamente nunca deberíamos retornar 1.5 MB como resultado de un servicio pero tomando la estructura de ejemplo al retornar 100 registros tenemos un archivo de 13750 bytes. la transmisión de este resultado a través de una linea de 56Kbps( aproximadamente 7KBps) sería de 1.91 segundos (tiempo ideal sin ruido y confiabilidad de 100%). Si se que suena a que no es nada pero siguamos analizando. Si este mismo archivo lo comprimimos con gzip nivel 3 se convierten en 327 bytes con un tiempo ideal&amp;nbsp;de 0.04 segundos. SI se considera que este tiempo&amp;nbsp;es uso de ancho de banda&amp;nbsp;y red esto podría significar atender a unos cuantos cientos de usuarios más con el mismo ancho de&amp;nbsp;banda.  &lt;p&gt;Como siempre no todo puede ser miel y en este caso el costo es un tiempo adicional para la compresión, el uso de procesador y memoria&amp;nbsp;del servidor. entonces el tiempo adicional de proceso debe sumarse para ver cual sería el tiempo real de proceso.  &lt;p&gt;En nuestro caso el tiempo de compresión es de no más de 10 milisegundos (utilizando la clase &lt;a href="http://msdn2.microsoft.com/system.io.compression.gzipstream"&gt;GZipStream&lt;/a&gt;&amp;nbsp;del .Net Framework 2.0), si sumamos este tiempo al tiempo de transmisión tenemos un total&amp;nbsp;0.05 segundos lo cual es aún un muy buen resultado.  &lt;p&gt;Otro aspecto a considerar es el uso de procesador, tipicamente todos los algoritmos de compresión tienen niveles que permiten definir la carga en procesador y memoria de la tarea de compresión. En el ejemplo se ha utilizado gzip nivel 3 (el que provee el framework) que no tiene impacto mayor al de un proceso de servicio por lo cual es una extensión solo en tiempo  &lt;p&gt;El último aspecto es el uso de memoria, dado que la mayoría de las especificaciones WS-* requieren el &lt;a href="http://msdn.microsoft.com/library/en-us/dnxml/html/UnderstXML.asp?frame=true#understxml_topic4"&gt;Infoset&lt;/a&gt; de respuesta completo para su proceso actualmente casi todas las soluciones de publicación y consumo de servicios manejan los mensajes en buffer por lo que el consumo de memoria adicional es el relacionado al tamaño de la versión compresa de los datos. De nuevo en nuestro ejemplo es un 2%. Este dato no es despreciable en servidores de muy alto uso porque puede llegar a convertirse en punto de contención.  &lt;p&gt;Con todo lo anteriormente dicho cual sería el criterio para decidir si utilizar compresión en la publicación de servicios:  &lt;p&gt;1. Si se conoce que los clientes disponen de bajo ancho de banda&amp;nbsp;y el nivel de concurrencia no estima que la memoria de servidor sea saturada es recomendado utilizar compresión, el nivel de compresión será determinado por la capacidad de procesador del servidor.  &lt;p&gt;2. Si en cambio tenemos mucha concurrencia y anchos de banda aceptables es mejor no utilizar mecanismos de compresión de datos.  &lt;p&gt;Con este pseudo-análisis (si ya se que tiene muchos vacios y que no puede llamarse un análisis serio) veamos cuales son las alternativas que se han manejado para la compresión de datos en servicios.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-115841990039378481?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/115841990039378481/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=115841990039378481' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/115841990039378481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/115841990039378481'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2006/09/compresin-y-servicios-parte-1.html' title='Compresi&amp;oacute;n y servicios (Parte 1)'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-115810348885781381</id><published>2006-09-12T19:24:00.000-04:00</published><updated>2006-09-12T19:24:48.896-04:00</updated><title type='text'>Nueva distribución de contenido</title><content type='html'>&lt;p&gt;Como mencioné en un post anterior ya tengo dos blogs es por eso que he tomado la decisión de utilizar cada uno de ellos para un fin distinto, el &lt;a href="http://crigot.spaces.live.com"&gt;Space de Live&lt;/a&gt;&amp;nbsp;seguirá siendo el lugar donde ponga mis pensamientos, divagues, cuando sea que ellos desean llegar, y comentarios de indole familiar y de amistad. &lt;/p&gt; &lt;p&gt;El&amp;nbsp;&lt;a href="http://relativamentesimple.blogspot.com"&gt;relativamente simple&lt;/a&gt;&amp;nbsp;de &lt;a href="http://www.blogger.com"&gt;blogger&lt;/a&gt;&amp;nbsp;en cambio lo utilizaré para publicar datos y comunicación de orden laboral y técnico. De esta manera cada quien podrá visitar o suscribirse al contenido que desee. &lt;/p&gt; &lt;p&gt;Solo por si alguien se lo preguntaba el sitio técnico estará en castellano y estará abierto a que puedan enviarme preguntas para que en aquellos casos que pueda ayudar así lo haga.&lt;/p&gt; &lt;p&gt;Obviamente esto no significa que estaré escribiendo más a menudo pero es solo una decisión tomada hoy.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-115810348885781381?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/115810348885781381/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=115810348885781381' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/115810348885781381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/115810348885781381'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2006/09/nueva-distribucin-de-contenido.html' title='Nueva distribuci&amp;oacute;n de contenido'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-115768468527303666</id><published>2006-09-07T23:04:00.000-04:00</published><updated>2006-09-07T23:04:45.306-04:00</updated><title type='text'>No todo en los iPod es color de rosa</title><content type='html'>&lt;p&gt;Dejenme empezar diciendo que hasta el día de hoy habia tenido la mejor de las experiencias con mi iPod. Tengo un &lt;a href="http://www.apple.com/ipodnano/" rel="nofollow"&gt;iPod Nano&lt;/a&gt; de 4GB en el que tengo casi toda la música que poseo (obviamente mi colección de CDs es algo limitada)&lt;/p&gt; &lt;p&gt;En fin, el día de hoy cuando me disponía a ir a una reunión prendí mi IPod y me vi con&amp;nbsp;la maravillosa pantalla de diagnóstico. "Bueno", me dije, "sin duda hice reset sin querer" (es raro desbloquear, bloquear y presionar acción y menu por 6 segundos sin querer y luego presionar acción y prev otros seis, pero...) es así que por los próximos 40 minutos corri una variedad de pruebas en las que afortunadamente mi iPod aprobó.&lt;/p&gt; &lt;p&gt;El último punto &lt;strong&gt;Reset&lt;/strong&gt;. Bueno llegando a casa lo sincronizo de nuevo. Y así paso el resto del día. Sin embargo llegue a casa&amp;nbsp;y cuando conecto el iPod solo obtengo el nefasto&lt;/p&gt; &lt;p&gt;&lt;img height="50" src="http://www.info.apple.com/images/kbase/93936/93936_1.gif" width="78"&gt;&lt;/p&gt; &lt;p&gt;Para los que no conocen la simbología de los IPod esto significa que necesitas reinicializar tu IPod. Bueno habramos iTunes&lt;/p&gt; &lt;p&gt;:S ¿qué no esta conectado mi iPod?&lt;br&gt;Si tu lo dices... probemos con el iPod Updater&lt;br&gt;"Can't mount iPod" (perdón pero no estaba de humor para sacar copia de las ventanas)&lt;/p&gt; &lt;p&gt;Bueno, veamos que nos dice el sitio de Apple... reintente con ITunes, Updater,&amp;nbsp; yadda, yadda, yadda. Ah, pruebe moviendose a &lt;a href="http://www.info.apple.com/kbnum/n93651" rel="nofollow"&gt;disk mode&lt;/a&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.info.apple.com/images/kbase/93651/93651_2.jpg"&gt;&lt;/p&gt; &lt;p&gt;Probemos... nop sigo viendo el condenado folder y aunque esta vez el iPod Updater se bloquea&lt;/p&gt; &lt;p&gt;Revisemos otros pasos, y encontre este artículo &lt;a href="http://docs.info.apple.com/article.html?artnum=93716"&gt;iPod shows up in Windows but not in iTumes&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Es decir que tengo que eliminar todo y reinstalar, bueno vamos por ello y para estar seguros descargo de nuevo iTunes y el iPod Updater. Finalizado, llego el momento cumbre conecto de nuevo mi iPod y ... nada "can't mount ipod"&lt;/p&gt; &lt;p&gt;Me estoy preocupando, ¿y si corro de nuevo el diagnóstico? aqui voy bloquear, desbloquear, presionar acción y menu por 6 segundos, presionar acción y prev otros seis si ya estoy en el menu corramos el diagnostico de scan (prueba del disco)..... Como diría mi amiga Paula ¡rayos!&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.info.apple.com/images/kbase/93936/93936_4.gif"&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;Este icono significa que el sistema de iPod no pudo recuperar datos del disco duro, la documentación dice que si no puedo llevarlo a disk mode esto es historia. Cruzo los dedos y hago todos los pasos &lt;strong&gt;Check&lt;/strong&gt; estoy en disk mode fiu....&lt;/p&gt; &lt;p&gt;Esperen iPod Updater lo detecto y pudo montarlo, &lt;strong&gt;Restore&lt;/strong&gt; si... esta restaurado. En este momento estoy sincronizando de nuevo toda mi música pero esta vivo. Todo producto de software es susceptible a este azares.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-115768468527303666?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/115768468527303666/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=115768468527303666' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/115768468527303666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/115768468527303666'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2006/09/no-todo-en-los-ipod-es-color-de-rosa.html' title='No todo en los iPod es color de rosa'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-115756525013191572</id><published>2006-09-06T13:54:00.000-04:00</published><updated>2006-09-06T13:54:10.136-04:00</updated><title type='text'>Contigo Avanzar en Santa Cruz</title><content type='html'>&lt;p&gt;Bueno esa era la idea pero debido al problema del paro civico es probable que hayan cambios en las fechas. El día viernes estaba planificada la realización de la jornada de trabajo, sin embargo con el paro convocado esta en duda y no se exactamente cuando se realizaría.&lt;/p&gt; &lt;p&gt;El concierto sería el sábado 9 de septiembre a partir de las 19:00 en la casa de la cultura. Esta vez son cuatro los participantes:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.grillovillegas.com"&gt;Grillo Villegas&lt;/a&gt;  &lt;li&gt;Entre dos aguas  &lt;li&gt;&lt;a href="http://www.revelaciones.tk"&gt;Ronaldo Vaca-Pereira&lt;/a&gt;  &lt;li&gt;&lt;a href="http://www.duonegroyblanco.com"&gt;Negro y Blanco&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Como siempre la entrada será libre así que estan todos invitados&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-115756525013191572?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/115756525013191572/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=115756525013191572' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/115756525013191572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/115756525013191572'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2006/09/contigo-avanzar-en-santa-cruz.html' title='Contigo Avanzar en Santa Cruz'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33961569.post-115756393053024037</id><published>2006-09-06T13:32:00.000-04:00</published><updated>2006-09-06T13:32:10.536-04:00</updated><title type='text'>Inicio en Blogger</title><content type='html'>&lt;p&gt;Por un proyecto que en un futuro próximo espero se de a conocer (proyecto.. bueno una idea) es necesario que habilite una cuenta en blogger por ello hoy debuta &lt;a href="http://relativamentesimple.blogspot.com"&gt;http://relativamentesimple.blogspot.com&lt;/a&gt; &amp;nbsp;. Esto no significa que dejare de user mi space en &lt;a href="http://spaces.live.com/"&gt;Live&lt;/a&gt;,&amp;nbsp;esta cuenta es complementaria y esta versión del blog será una replica de la que se encuentre en spaces.&lt;/p&gt; &lt;p&gt;Si ya se que no he escrito mucho pero espero que esto cambie en el curso de la próxima semana.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33961569-115756393053024037?l=relativamentesimple.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://relativamentesimple.blogspot.com/feeds/115756393053024037/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33961569&amp;postID=115756393053024037' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/115756393053024037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33961569/posts/default/115756393053024037'/><link rel='alternate' type='text/html' href='http://relativamentesimple.blogspot.com/2006/09/inicio-en-blogger.html' title='Inicio en Blogger'/><author><name>CriGoT</name><uri>http://www.blogger.com/profile/12980785635231985020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://photos1.blogger.com/blogger/6145/667/1600/mkis.jpg'/></author><thr:total>0</thr:total></entry></feed>
