<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
>

<channel>
	<title>Planeta Código</title>
	<link>http://www.planetacodigo.com</link>
	<description>Planeta Código</description>
	<pubDate>Thu, 17 May 2012 05:06:06 +0000</pubDate>
	<language>es</language>

		<item>
		<title>Koalite: Mono.Cecil en 5 minutos</title>
		<link>http://feedproxy.google.com/~r/KoalitesBlog/~3/EP6QGJxLzFk/</link>
		<pubDate>Thu, 17 May 2012 05:06:06 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
		
	<category>C#</category>
	<category>development</category>
	<category>cecil</category>
		<guid>http://feedproxy.google.com/~r/KoalitesBlog/~3/EP6QGJxLzFk/</guid>
		<description><![CDATA[Hace unos días Eduard mostraba en su blog cómo cargar información de reflection sin cargar el assembly. La técnica que explica en el post usando AppDomains es muy interesante, pero en los comentarios saqué el tema de Mono.Cecil y me pareció una buena excusa para probarlo. ¿Qué es Mono.Cecil? Mono.Cecil es un proyecto englobado dentro...  <a href="http://blog.koalite.com/2012/05/mono-cecil-en-5-minutos/" class="more-link" title="Read Mono.Cecil en 5 minutos">Leer más &#187;</a>
No hay posts relacionados.]]></description>
			<content:encoded><![CDATA[<p>Hace unos días Eduard mostraba en su blog cómo <a href="http://geeks.ms/blogs/etomas/archive/2012/05/10/cargar-informaci-243-n-de-reflection-sin-cargar-el-assembly.aspx" >cargar información de <em>reflection</em> sin cargar el <em>assembly</em></a>. La técnica que explica en el post usando <a href="http://msdn.microsoft.com/es-es/library/system.appdomain(v=vs.80).aspx" ><code>AppDomains</code></a> es muy interesante, pero en los comentarios saqué el tema de <a href="http://www.mono-project.com/Cecil" >Mono.Cecil</a> y me pareció una buena excusa para probarlo.</p>
<h3>¿Qué es Mono.Cecil?</h3>
<p>Mono.Cecil es un proyecto englobado dentro de <a href="http://mono-project.com/Main_Page" >Mono</a>, una implementación alternativa y multiplataforma de .NET. Mono.Cecil <strong>permite leer <em>assemblies</em> de .NET e inspeccionar los tipos que contienen, los métodos de cada tipo, e incluso modificar los <em>assemblies</em></strong> y volver a guardarlos en disco.</p>
<p>Aunque forme parte de Mono, <strong>Cecil es un <em>assembly</em> que puede ser utilizado desde casi cualquier versión de .NET</strong> Framework. Actualmente está alojado en <a href="https://github.com/jbevain/cecil">github</a>, de donde podéis bajar los fuentes y compilarlos vosotros mismos, pero si os resulta más cómodo también existe un <a href="https://nuget.org/packages/Mono.Cecil" >paquete para NuGet</a>. Para utilizarlo, sólo necesitamos referenciar el <em>assembly</em> <code>Mono.Cecil.dll</code>.</p>
<p>A diferencia de <em>reflection</em>, <strong>Cecil no carga el <em>assembly</em> dentro del <code>AppDomain</code></strong>, sino que únicamente lee la información del <em>assembly</em> y nos permite trabajar con ella. De hecho, esto permite usar sin problemas Cecil para leer <em>assemblies</em> de versiones del framework distintas de la que estamos usando. Por ejemplo, podemos crear una aplicación con .NET 2.0 que use Cecil y analice <em>assemblies</em> compilados con .NET 4.0.</p>
<p><strong>¿Para que sirve?</strong> Pues se me ocurren varios usos, aunque lo mejor es verlo con algunos ejemplos.</p>
<h3>Inspeccionar un <em>assembly</em> sin cargarlo</h3>
<p>Lo primero que he probado es hacer lo mismo que hacía Eduard con los <code>AppDomain</code>, pero con Cecil: averiguar los tipos que hay un <em>assembly</em> sin tener que cargarlo. Para ello, sólo hay que usar el siguiente código:</p>
<pre class="brush:csharp">
var assembly = AssemblyDefinition.ReadAssembly("the.assembly.dll");
var types = assembly.MainModule.Types.Select(x => x.FullName);
</pre>
<p>El punto de entrada es siempre <code>AssemblyDefinition.ReadAssembly()</code>, que permite leer la información de un <em>assembly</em> desde disco y devuelve un objeto de tipo <code>AssemblyDefinition</code>. Todo el API de Cecil está organizada en una estructura de clases análoga a los <code>AssemblyInfo/MethodInfo/PropertyInfo...</code> que se usa con <em>reflection</em>, pero en este caso se llaman <code>AssemblyDefinition/MethodDefinition/PropertyDefinition/...</code>.</p>
<p>Un <code>AssemblyDefinition</code> contiene una colección de <code>ModuleDefinition</code> que nos permite tratar con <em>assemblies</em> que contengan <a href="http://blogs.msdn.com/b/junfeng/archive/2004/07/15/183813.aspx" >más de un módulo</a>. La verdad es que esto no es muy frecuente, lo más parecido a ello que me he encontrado nunca es el caso de <a href="http://blog.koalite.com/2011/07/sqlite-primeras-impresiones/" ><em>assemblies</em> en <em>mixed mode</em>, como el de SQLite</a>, así que generalmente nos bastará con acceder a la propiedad <code>MainModule</code> que nos permite acceder al módulo principal del <em>assembly</em> y a lo que contiene. A partir de ahí, podemos obtener los <code>TypeDefinition</code> y de ellos&#8230; bueno, ya te puedes imaginar como sigue la cosa viendo el código de arriba.</p>
<h3>Inspeccionar el cuerpo de los métodos</h3>
<p>Otro caso en el que puede ser útil Cecil es si queremos inspeccionar qué es lo que hace un método. A través de la propiedad <code>Body.Instructions</code> de un <code>MethodDefinition</code> podemos acceder a las instrucciones IL que forman la implementación del método. Esto de toquetear el IL puede parecer un poco raro al principio, pero cuando te pones, <a href="http://blog.koalite.com/2012/02/curiosidades-con-structs-en-c/" title="Curiosidades con Structs en C#" >es hasta divertido</a>.</p>
<p>Como ejemplo, podríamos ver qué métodos en un <em>assembly</em> están usando un método determinado, por ejemplo <code>Console.WriteLine</code>:</p>
<pre class="brush:csharp">
var assembly = AssemblyDefinition.ReadAssembly("assembly.dll");
var methods = assembly.MainModule
    .Types.SelectMany(type => type.Methods)
    .Where(method => method.Body.Instructions
                        .Any(x => (x.OpCode == OpCodes.Call ||
                                   x.OpCode == OpCodes.Calli ||
                                   x.OpCode == OpCodes.Callvirt) &#038;&#038;
                                  x.Operand.ToString().Contains("System.Console.WriteLine")));
</pre>
<p>Para entender el ejemplo hay que tener en cuenta que las invocaciones de métodos en IL se realizan con una instrucción que tiene como <a href="http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes(v=vs.100).aspx" >código de operación</a> <code>Call</code>, <code>Calli</code> o <code>Callvirt</code>, usando como parámetro el nombre del método a invocar. En este caso la instrucción que se usa realmente es <code>Call</code> por tratarse de un método estático, pero he preferido poner todas para tenerlas como referencia por si queréis probar con otros métodos.</p>
<p>Esto, aparte de ser curioso, puede tener su utilidad para <strong>automatizar chequeos basados en análisis estáticos de código</strong>. Algo parecido a lo que hace <a href="http://www.ndepend.com/" >NDepend</a>, pero más de andar por casa. Por ejemplo, podrías tener un test unitario que validase que todas las excepciones que se lanzan desde el <em>Domain</em> son del tipo <code>DomainException</code> o cosas similares.</p>
<h3>Modificar <em>assemblies</em></h3>
<p>Por último, otra de las cosas que nos permite hacer Cecil es modificar un <em>assembly</em> y volver a guardarlo en disco. ¿Por qué querría alguien hacer eso? Lo más habitual es para <strong>aplicar técnicas <abbr title="Aspect-Oriented Programming, Programación orientada a aspectos">AOP</abbr> con IL-Weaving</strong>. </p>
<p>Ya he puesto algún ejemplo en este blog de como <a href="http://blog.koalite.com/2011/12/aop-con-castle-windsor-iinterceptor/" title="AOP con Castle Windsor: IInterceptor" >aplicar AOP usando un contenedor IoC</a> y <abbr title="Lightweight Code Generation, Generación Ligera de Código">LCG</abbr>, pero esas técnicas implican generar clases en tiempo de ejecución, por lo que suponen una penalización al rendimiento. Usando Cecil podemos <strong>modificar el <em>assembly</em> generado después de la compilación</strong>, consiguiendo no penalizar el rendimiento al ejecutar la aplicación.</p>
<p>Para que no se complique la cosa, en el ejemplo vamos a hacer algo más simple, vamos a sustituir todas las invocaciones a <code>Console.WriteLine</code> con invocaciones a <code>Trace.WriteLine</code>:</p>
<pre class="brush:csharp">
// TODO: Obtener los métodos que usan System.Console.WriteLine
// como hemos visto en el ejemplo anterior
var methods = ...; 

foreach (var method in methods)
{
	// Importamos el método Trace.WriteLine en el módulo principal
	// del assembly para obtener un MethodDefinition
	var traceWriteLine = assembly.MainModule
		.Import(typeof (Trace).GetMethod("WriteLine", new[] {typeof (string)}));

	// Obtenemos las instrucciones que usan WriteLine
	var writeLines = processor.Body.Instructions
					.Where(x => x.OpCode == OpCodes.Call &#038;&#038;
						    x.Operand.ToString().Contains("System.Console.WriteLine"))
					.ToArray();

	foreach (var instruction in writeLines)
	{
		// Aprovecho que los parámetros son los mismos. El parámetro
		// quedará apilado con una instrucción Ldstr antes de Call Console.WriteLine
		// así que no lo toco

		// Creamos la instrucción Call Trace.WriteLine
		var trace = method.Body.GetILProcessor().Create(OpCodes.Call, traceWriteLine);

		// La insertamos justo antes del Console.WriteLine...
		processor.InsertBefore(instruction, trace);
		// ... y eliminamos el Console.WriteLine
		processor.Remove(instruction);
	}
}

// Escribimos a disco el assembly modificado
assembly.Write("assembly.patched.dll");
</pre>
<p>Es un poco lioso, pero creo que leyendo los comentarios del código se puede llegar a entender. La parte más complicada realmente es la de generar las instrucciones IL correctas para hacer lo que queramos hacer en cada caso. En este ejemplo, como sólo queríamos reemplazar el método que se estaba invocando y, además, tenían los mismos parámetros, es relativamente sencillo.</p>
<h3>Conclusiones</h3>
<p>Mono.Cecil es una librería que no creo que vayas a usar cada día, pero que <strong>&#8220;en lo suyo&#8221; me parece que hace una labor excelente</strong>. Es muy fácil de manejar, el API está bien estructurada y, al menos para hacer las tres tonterías que he hecho en este post, funciona como esperas (que es más de lo que se puede decir de muchas librerías por ahí). </p>
<p>En definitiva, <strong>una herramienta más a tener en cuenta para cuando haga falta</strong>.</p>
<div class="trackable_sharing"><div class="trackable_sharing_text"><strong>Compartir:</strong></div><a href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fblog.koalite.com%2F2012%2F05%2Fmono-cecil-en-5-minutos%2F"  title="Facebook"  onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Facebook','http://blog.koalite.com/2012/05/mono-cecil-en-5-minutos/']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://blog.koalite.com/wp-content/uploads/trackableshare//facebook.png" alt="Facebook" width="32" height="32"></a> <a href="http://twitter.com/share?url=http%3A%2F%2Fblog.koalite.com%2F2012%2F05%2Fmono-cecil-en-5-minutos%2F&text=Mono.Cecil+en+5+minutos"  title="Twitter"  onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Twitter','http://blog.koalite.com/2012/05/mono-cecil-en-5-minutos/']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://blog.koalite.com/wp-content/uploads/trackableshare//twitter.png" alt="Twitter" width="32" height="32"></a> <a href="mailto:?subject=Check%20out%20http%3A%2F%2Fblog.koalite.com%2F2012%2F05%2Fmono-cecil-en-5-minutos%2F"  title="Email" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Email','http://blog.koalite.com/2012/05/mono-cecil-en-5-minutos/']); "><img align="absmiddle" src="http://blog.koalite.com/wp-content/uploads/trackableshare//email.png" alt="Email" width="32" height="32"></a> <a href="http://www.linkedin.com/shareArticle?mini=true&url=http%3A%2F%2Fblog.koalite.com%2F2012%2F05%2Fmono-cecil-en-5-minutos%2F&title=http%3A%2F%2Fblog.koalite.com%2F2012%2F05%2Fmono-cecil-en-5-minutos%2F&ro=false&summary=&source="  title="Linkedin"  onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Linkedin','http://blog.koalite.com/2012/05/mono-cecil-en-5-minutos/']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://blog.koalite.com/wp-content/uploads/trackableshare//linkedin.png" alt="Linkedin" width="32" height="32"></a> <a href="https://plusone.google.com/_/+1/confirm?hl=en&url=http%3A%2F%2Fblog.koalite.com%2F2012%2F05%2Fmono-cecil-en-5-minutos%2F&title=Mono.Cecil+en+5+minutos"  title="Plusone"  onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Plusone','http://blog.koalite.com/2012/05/mono-cecil-en-5-minutos/']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=550,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://blog.koalite.com/wp-content/uploads/trackableshare//plusone.png" alt="Plusone" width="38" height="24"></a> </div><p>No hay posts relacionados.</p><img src="http://feeds.feedburner.com/~r/KoalitesBlog/~4/EP6QGJxLzFk" height="1" width="1"/>]]></content:encoded>
		</item>
		<item>
		<title>Najaraba.com: Software libre, metodologías ágiles y más.: Agilismo sin software</title>
		<link>http://najaraba.blogspot.com/2012/05/agilismo-sin-software.html</link>
		<pubDate>Wed, 16 May 2012 21:26:00 +0000</pubDate>
		<dc:creator>Joserra</dc:creator>
		
	<category>Empresas</category>
	<category>trabajo</category>
	<category>Planeta Codigo</category>
	<category>ágil</category>
	<category>lean</category>
	<category>kanban</category>
	<category>coaching</category>
		<guid>http://najaraba.blogspot.com/2012/05/agilismo-sin-software.html</guid>
		<description><![CDATA[Al establecerme como profesional independiente, queriendo ganarme las habichuelas como Agile Coach danzando al viento para esparcir los principios ágiles, no había pensado, que uno de mis primeros trabajos sería en una empresa NO relacionada con el desarrollo de sw.
Por casualidades de los contactos (¡gracias!) estoy colaborando con una empresa de fabricación de componentes mecánicos para ]]></description>
			<content:encoded><![CDATA[Al establecerme como profesional independiente, queriendo ganarme las habichuelas como Agile Coach danzando al viento para esparcir los principios ágiles, no había pensado, que uno de mis primeros trabajos sería en una empresa NO relacionada con el desarrollo de sw.
Por casualidades de los contactos (¡gracias!) estoy colaborando con una empresa de fabricación de componentes mecánicos para ]]></content:encoded>
		</item>
		<item>
		<title>Variable not found: [Auges] Webcast sobre SignalR: ¡uau!</title>
		<link>http://feedproxy.google.com/~r/vnf/~3/pUYTPASIuPI/auges-webcast-sobre-signalr-uau.html</link>
		<pubDate>Wed, 16 May 2012 11:53:00 +0000</pubDate>
		<dc:creator>José M. Aguilar</dc:creator>
		
	<category>Eventos</category>
	<category>Charlas</category>
	<category>auges</category>
	<category>signalr</category>
		<guid>http://feedproxy.google.com/~r/vnf/~3/pUYTPASIuPI/auges-webcast-sobre-signalr-uau.html</guid>
		<description><![CDATA[Simplemente informaros de que el próximo jueves 24 de mayo a las 19:00h (hora peninsular española), participaré en una charla con AUGES sobre SignalR, esa pequeña maravilla de la que ya os he hablado por aquí en varias ocasiones, una ayuda impresc...]]></description>
			<content:encoded><![CDATA[<img align="right" alt="AUGES: ASP.NET User Group España" border="0" src="http://lh4.ggpht.com/-r9SV68Em5Jc/TnopO3YqltI/AAAAAAAABno/Oiiof6sGueA/image%25255B2%25255D.png?imgmax=800"  title="AUGES: ASP.NET User Group España" width="200"></img>Simplemente informaros de que el próximo jueves 24 de mayo a las 19:00h (hora peninsular española), participaré en una charla con <a href="http://auges.org/">AUGES</a> sobre SignalR, esa pequeña maravilla de la que ya <a href="http://www.variablenotfound.com/search/label/signalr">os he hablado por aquí en varias ocasiones</a>, una ayuda imprescindible a la hora de crear sistemas interactivos, multiusuario y en tiempo real para la web.<br></br>
<br></br>
El “cartel” oficial del evento es el siguiente:<br></br>
<br></br>
<div >
<h4 style="margin-top: 0px;">


SIGNALR: APLICACIONES MULTIUSUARIO, ASÍNCRONAS, Y EN TIEMPO REAL. ¡UAU!</h4>
¿Te has preguntado alguna vez cómo es posible que en una aplicación web como Google Docs <strong>varios usuarios puedan interactuar</strong> de forma simultánea? ¿Te interesa <strong>la tecnología que usan los grandes</strong> como Facebook o Twitter para informarte en tiempo real de que algo ha ocurrido? ¿Piensas que <strong>crear un chat</strong> basado puramente en ASP.NET no es tarea sencilla? ¿Te gustaría que el servidor pudiera <strong>enviar información a los clientes</strong> en cualquier momento, sin esperar a que éstos soliciten una página o recurso?<br></br>
<br></br>
<img alt="image" border="0" height="54" src="http://lh4.ggpht.com/-3wcP7VaADnw/T607SXZZDAI/AAAAAAAACCQ/8gTEMgwQ3aQ/image%25255B7%25255D.png?imgmax=800"  title="image" width="54"></img>Si has respondido que sí a alguna de estas preguntas, <strong>SignalR te entusiasmará</strong>. Es un marco de trabajo open source que permite saltarse las barreras impuestas por HTTP y su clásico modelo de petición/respuesta para conseguir aplicaciones más interactivas, dinámicas y colaborativas, en las que el servidor toma la iniciativa.<br></br>
<br></br>
No te pierdas este evento y aprende a poner un factor “¡uau!” en tus desarrollos.</div>
<br></br>
Os recuerdo que se trata de <strong>un Webcast</strong>, o sea, que podéis asistir a este evento desde vuestro sillón favorito, acompañados de una buena cerveza y un saco de palomitas. Y por supuesto, es <strong>totalmente gratuito</strong>.<br></br>
<br></br>
Lo único que debéis hacer para poder asistir es registraros:<br></br>
<ul>
<li>Día: jueves 24 de mayo, 19:00h (hora peninsular española)</li>
<li>URL del registro: <a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032512978&amp;Culture=es-ES" title="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032512978&amp;Culture=es-ES">https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032512978&amp;Culture=es-ES</a> </li>
</ul>
No me faltéis, que paso lista ;-)<div class="blogger-post-footer"><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/27752126-5937086874500553024?l=www.variablenotfound.com" alt=""></img></div>
<p><a href="http://feedads.g.doubleclick.net/~a/Z2EmKB85Krv482L7EgLpeqhKtoc/0/da"><img src="http://feedads.g.doubleclick.net/~a/Z2EmKB85Krv482L7EgLpeqhKtoc/0/di" border="0" ismap="true"></img></a><br></br>
<a href="http://feedads.g.doubleclick.net/~a/Z2EmKB85Krv482L7EgLpeqhKtoc/1/da"><img src="http://feedads.g.doubleclick.net/~a/Z2EmKB85Krv482L7EgLpeqhKtoc/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/vnf?a=pUYTPASIuPI:B_-9KpTd6ps:ecdYMiMMAMM"><img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=pUYTPASIuPI:B_-9KpTd6ps:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=pUYTPASIuPI:B_-9KpTd6ps:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=pUYTPASIuPI:B_-9KpTd6ps:4cEx4HpKnUU"><img src="http://feeds.feedburner.com/~ff/vnf?i=pUYTPASIuPI:B_-9KpTd6ps:4cEx4HpKnUU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=pUYTPASIuPI:B_-9KpTd6ps:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/vnf?i=pUYTPASIuPI:B_-9KpTd6ps:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=pUYTPASIuPI:B_-9KpTd6ps:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/vnf?i=pUYTPASIuPI:B_-9KpTd6ps:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=pUYTPASIuPI:B_-9KpTd6ps:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/vnf/~4/pUYTPASIuPI" height="1" width="1"></img>]]></content:encoded>
		</item>
		<item>
		<title>Preparando SCJP: Mi experiencia con el examen OCPJP 6</title>
		<link>http://preparandoscjp.wordpress.com/2012/05/15/mi-experiencia-con-el-examen-ocpjp-6/</link>
		<pubDate>Tue, 15 May 2012 11:30:58 +0000</pubDate>
		<dc:creator>Virginia Lopez</dc:creator>
		
	<category>Uncategorized</category>
	<category>Examen</category>
		<guid>http://preparandoscjp.wordpress.com/2012/05/15/mi-experiencia-con-el-examen-ocpjp-6/</guid>
		<description><![CDATA[Este jueves pasado día 10 de Mayo reservé cita en un centro próximo para realizar el examen y aunque no iba tan preparada como a mí me hubiera gustado, finalmente aprobé!!! Con un porcentaje que no es muy impresionante, un 76% pero al menos aprobado está! Os cuento un poco: ¿Qué nos piden en el [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=preparandoscjp.wordpress.com&#038;blog=21932204&#038;post=1230&#038;subd=preparandoscjp&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Este jueves pasado día 10 de Mayo reservé cita en un centro próximo para realizar el examen y aunque no iba tan preparada como a mí me hubiera gustado, finalmente aprobé!!! Con un porcentaje que no es muy impresionante, un 76% pero al menos aprobado está!</p>
<p>Os cuento un poco:</p>
<p><strong><span >¿Qué nos piden en el centro antes de hacer el examen? </span></strong></p>
<ul>
<li>Dos identificaciones con foto. Yo dí el dni y el carnet de conducir.</li>
<li>Rellenar un formulario con nuestros datos.</li>
<li>Leer y firmar que aceptas las reglas de Oracle para los exámenes de certificación.</li>
<li>Nos hacen una foto para el informe que se imprimirá posteriormente con el resultado de la prueba.</li>
<li>Recoger y guardar en taquilla cualquier dispositivo electrónico, móvil, reloj, etcétera</li>
</ul>
<p><strong><span >¿Cómo es el programa del examen? </span></strong></p>
<p>El programa nos muestra el enunciado con el número de respuestas a elegir, la pregunta y las opciones en la parte izquierda. En la parte superior derecha se nos muestra el tiempo restante y hay una casilla de verificación para marcar la pregunta para revisar más tarde. En la esquina inferior derecha tenemos botones para movernos por las preguntas, Anterior y Siguiente.</p>
<p>Las preguntas me sorprendieron porque yo haciendo otros tests y ejercicios de examen era muy lenta y pensaba que no me iba a dar tiempo a contestar todas, pero son menos enrevesadas y más cortitas.</p>
<p>Cuando pasas la última pregunta puedes elegir Revisar o Finalizar Examen.<br />
Al darle a Revisar aparece un listado con las preguntas que marcaste para ir directamente a alguna en concreto o puedes elegir Revisar Marcadas o Revisar Todas.</p>
<p>Yo revisé todas desde el principio porque me sobraron 20 minutos y quise dar otra pasada.</p>
<p>Cuando acabas de revisar vuelven a aparecer las opciones Revisar y Finalizar Examen.<br />
Al darle a Finalizar Examen en unos segundos ya aparece tu porcentaje de aciertos y si aprobaste.<br />
Al dar a Terminar se manda a imprimir el resultado.</p>
<p><strong><span ><br />
¿De qué temas hubo más preguntas? </span></strong></p>
<p>Colecciones, Hilos, llamadas correctas a clases internas o estáticas.<br />
Sobre polimorfismo: castings válidos o decir que métodos eran correctos en una subclase, teniendo en cuenta que algunos eran correctos por ser sobrecargas y otros por ser sobrescritos.</p>
<p>También quería confirmaros que no hubo ninguna pregunta sobre serialización ni preguntas drag &amp; drop.</p>
<p><strong><span ><br />
¿Si apruebas te dan la certificación directamente? </span></strong></p>
<p>La certificación llega por correo más adelante, te dan la hoja de resultados con tu porcentaje de aciertos y si aprobaste o no. La dirección a la que llegara es la que indicaste en tu perfil de Pearson Vue.</p>
<p>Existe una página de Oracle, <a href="http://certview.oracle.com" >Oracle Cert View</a> en la que podemos ver el historial de certificaciones (Certification History), exámenes (Exam History), acreditar nuestras certificaciones a un tercero (Publish Credentials to 3rd Parties) y ver si han realizado ya el envío de nuestra certificación (Success Kit Status).</p>
<p>Será necesario para entrar en esta página tener una cuenta en Oracle (o creárnosla) y dar algunos datos del perfil de Pearson Vue que hicimos para reservar el examen.</p>
<p >Os dejo algunas capturas:</p>
<p ><a href="http://preparandoscjp.files.wordpress.com/2012/05/certview11.png" ><img class="aligncenter size-full wp-image-1243" title="CertView - Certification History" src="http://preparandoscjp.files.wordpress.com/2012/05/certview11.png?w=645&h=276" alt="" width="645" height="276" /></a></p>
<p ><a href="http://preparandoscjp.files.wordpress.com/2012/05/certview1.png" ><img class="aligncenter size-full wp-image-1242" title="CertView - Exam History" src="http://preparandoscjp.files.wordpress.com/2012/05/certview1.png?w=645&h=190" alt="" width="645" height="190" /><br />
</a></p>
<p ><a href="http://preparandoscjp.files.wordpress.com/2012/05/certview31.png" ><img class="aligncenter size-full wp-image-1241" title="Cert View - Success Kit Status" src="http://preparandoscjp.files.wordpress.com/2012/05/certview31.png?w=645&h=145" alt="" width="645" height="145" /></a></p>
<p><a href="http://preparandoscjp.files.wordpress.com/2012/05/certview.png"><br />
</a></p>
<br />Filed under: <a href='http://preparandoscjp.wordpress.com/category/recursos/examen/'>Examen</a>, <a href='http://preparandoscjp.wordpress.com/category/uncategorized/'>Uncategorized</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/preparandoscjp.wordpress.com/1230/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/preparandoscjp.wordpress.com/1230/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/preparandoscjp.wordpress.com/1230/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/preparandoscjp.wordpress.com/1230/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/preparandoscjp.wordpress.com/1230/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/preparandoscjp.wordpress.com/1230/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/preparandoscjp.wordpress.com/1230/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/preparandoscjp.wordpress.com/1230/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/preparandoscjp.wordpress.com/1230/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/preparandoscjp.wordpress.com/1230/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/preparandoscjp.wordpress.com/1230/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/preparandoscjp.wordpress.com/1230/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/preparandoscjp.wordpress.com/1230/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/preparandoscjp.wordpress.com/1230/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=preparandoscjp.wordpress.com&#038;blog=21932204&#038;post=1230&#038;subd=preparandoscjp&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
		</item>
		<item>
		<title>Variable not found: Enlaces interesantes 82</title>
		<link>http://feedproxy.google.com/~r/vnf/~3/GC83Y6j9wJg/enlaces-interesantes-82.html</link>
		<pubDate>Mon, 14 May 2012 07:15:00 +0000</pubDate>
		<dc:creator>José M. Aguilar</dc:creator>
		
	<category>enlaces</category>
		<guid>http://feedproxy.google.com/~r/vnf/~3/GC83Y6j9wJg/enlaces-interesantes-82.html</guid>
		<description><![CDATA[Estos son los enlaces publicados en Variable not found en Facebook y Twitter del 7 al 13 de mayo de 2012. Espero que os resulten interesantes :-)

.Net

What JavaScript taught me about C# – Understanding ‘Access to modified closure’       
Sean B...]]></description>
			<content:encoded><![CDATA[<a href="http://lh3.ggpht.com/-QAFlO4T-9Gg/T7Clv0pTabI/AAAAAAAACCc/yZHukT9Im38/s1600-h/image7_thumb_thumb_thumb_thumb_thumb.png"><img align="right" alt="image7_thumb_thumb_thumb_thumb_thumb[2]" border="0" height="129" src="http://lh3.ggpht.com/-r8hftloxDLI/T7ClxD2evEI/AAAAAAAACCk/VrS_3GREbGA/image7_thumb_thumb_thumb_thumb_thumb%25255B1%25255D.png?imgmax=800"  title="image7_thumb_thumb_thumb_thumb_thumb[2]" width="172"></img></a>Estos son los enlaces publicados en <a href="http://www.facebook.com/variablenotfound">Variable not found en Facebook</a> y <a href="http://twitter.com/jmaguilar">Twitter</a> del 7 al 13 de mayo de 2012. Espero que os resulten interesantes :-)<br></br>
<h4>
.Net</h4>
<ul>
<li><a href="http://sblakemore.com/blog/post/What-JavaScript-taught-me-about-C--Understanding-Access-to-modified-closure.aspx"><strong>What JavaScript taught me about C# – Understanding ‘Access to modified closure’</strong></a>       <br></br>
Sean Blakemore </li>
<li><strong><a href="http://geeks.ms/blogs/etomas/archive/2012/05/10/cargar-informaci-243-n-de-reflection-sin-cargar-el-assembly.aspx">Cargar información de reflection sin cargar el assembly</a></strong>       <br></br>
Eduard Tomás </li>
<li><strong><a href="http://blog.koalite.com/2012/05/hebras-lambdas-y-bugs/">Hebras, lambdas… y bugs</a></strong>       <br></br>
Juan María Hernández </li>
<li><strong><a href="http://www.codeproject.com/Articles/380769/Creating-an-FTP-Server-in-Csharp">Creating an FTP Server in C#</a></strong>       <br></br>
Rick Bassham <a name="more"></a></li>
</ul>
<h4>
Asp.net</h4>
<ul>
<li><a href="http://www.strathweb.com/2012/05/output-caching-in-asp-net-web-api/" title="Permalink to Output caching in ASP.NET Web API"><strong>Output caching in ASP.NET Web API</strong></a>       <br></br>
Filip W. </li>
<li><strong><a href="http://professionalaspnet.com/archive/2012/05/11/How-to-Include-Views-in-ASP.NET-MVC-_2600_-WebMatrix-Razor.aspx">How to Include Views in ASP.NET MVC &amp; WebMatrix Razor</a> </strong>      <br></br>
Chris Love </li>
<li><strong><a href="http://blogs.msdn.com/b/jmstall/archive/2012/05/11/webapi-parameter-binding-under-the-hood.aspx">WebAPI Parameter binding under the hood</a></strong>       <br></br>
Mike Stall </li>
<li><a href="http://tpeczek.blogspot.com.es/2012/05/another-early-look-at-jquery-ui-grid-in.html" title="Another early look at jQuery UI Grid in ASP.NET MVC – Data Types, Dataview, Pager, Sorting and F"><strong>Another early look at jQuery UI Grid in ASP.NET MVC – Data Types, Dataview, Pager, Sorting and Filtering</strong></a>       <br></br>
Tomasz Pęczek </li>
<li><strong><a href="http://www.dotnetcurry.com/ShowArticle.aspx?ID=807">Download Files in ASP.NET MVC 3 using Controller Action</a></strong>       <br></br>
Mahesh Sabnis </li>
<li><a href="http://www.west-wind.com/weblog/posts/2012/May/08/Passing-multiple-POST-parameters-to-Web-API-Controller-Methods"><strong>Passing multiple POST parameters to Web API Controller Methods</strong></a>       <br></br>
Rick Strahl </li>
<li><strong><a href="http://www.knockmeout.net/2012/05/knockout-2-dot-1-is-out.html">Knockout 2.1 Is Out</a></strong>       <br></br>
Ryan Niemeyer </li>
<li><strong><a href="http://geeks.ms/blogs/phurtado/archive/2012/05/08/el-scroll-infinito.aspx">El scroll infinito</a></strong>       <br></br>
Pedro Hurtado </li>
<li><a href="http://michaelcrump.net/a-xaml-guy-digs-into-asp-net-mvc4-part-2-of"><strong>A XAML Guy digs into ASP.NET MVC4 (Part 2 of ?)</strong></a>       <br></br>
Michael Crump </li>
<li><strong><a href="http://blogs.msdn.com/b/kiranchalla/archive/2012/05/06/in-memory-client-amp-host-and-integration-testing-of-your-web-api-service.aspx">In memory client, host and integration testing of your Web API service</a></strong>       <br></br>
Kiran Challa </li>
<li><strong><a href="http://blogs.telerik.com/blogs/posts/12-05-08/there-s-a-tool-for-that-13-essential-tools-for-the-ninja-web-developer.aspx">There’s a Tool for That: 13 Essential Tools for the Ninja Web Developer</a></strong>       <br></br>
Joshua Holt </li>
<li><strong><a href="http://visualstudiomagazine.com/articles/2012/05/04/implementing-websockets-in-wcf-4_5.aspx">Implementing WebSockets in WCF 4.5</a></strong>       <br></br>
Peter Vogel </li>
<li><strong><a href="http://sebys.com.ar/2012/05/05/asp-net-web-api-paso-a-paso/">ASP.NET Web API paso a paso</a></strong>       <br></br>
Sebastián Henzenn </li>
<li><strong><a href="http://weblogs.asp.net/jgalloway/archive/2012/05/04/asp-net-mvc-authentication-customizing-authentication-and-authorization-the-right-way.aspx">ASP.NET MVC Authentication - Customizing Authentication and Authorization The Right Way</a></strong>       <br></br>
Jon Galloway </li>
<li><strong><a href="http://blogs.msdn.com/b/rjacobs/archive/2012/05/06/extending-asp-net-mvc-account-registration-with-workflow-wf4.aspx">Extending ASP.NET MVC Account Registration with Workflow (WF4)</a></strong>       <br></br>
Ron Jacobs </li>
<li><strong><a href="http://weblogs.asp.net/davidfowler/archive/2012/05/04/api-improvements-made-in-signalr-0-5.aspx">API Improvements made in SignalR 0.5</a></strong>       <br></br>
David Fowler</li>
</ul>
<h4>
Azure / Cloud</h4>
<ul>
<li><strong><a href="http://www.everything-microsoft.com/2012/05/08/microsoft-renames-azure-services/">Microsoft Renames Azure Services</a></strong>       <br></br>
Martin Brinkmann</li>
</ul>
<h4>
Conceptos</h4>
<ul>
<li><a href="http://blogs.msdn.com/b/ericlippert/archive/2012/05/07/guid-guide-part-three.aspx"><strong>GUID guide, part three</strong></a>       <br></br>
Eric Lippert </li>
</ul>
<h4>
Data access</h4>
<ul>
<li><a href="http://martinfowler.com/bliki/OrmHate.html"><strong>OrmHate</strong></a>       <br></br>
Martin Fowler </li>
<li><a href="http://blogs.msdn.com/b/adonet/archive/2012/05/08/ef5-sample-provider-published.aspx"><strong>EF5 Sample Provider Published</strong></a>       <br></br>
Pawel Kadluczka </li>
</ul>
<h4>
Html/Css/Javascript</h4>
<ul>
<li><a href="http://www.stubbornella.org/content/2012/05/02/cross-browser-debugging-css/" title="Permanent Link- Cross-Browser Debugging CSS"><strong>Cross-Browser Debugging CSS</strong></a>       <br></br>
Nicole Sullivan </li>
<li><strong><a href="http://net.tutsplus.com/tutorials/javascript-ajax/prototypes-in-javascript-what-you-need-to-know/">Prototypes in JavaScript</a></strong>       <br></br>
Leigh Kaszick </li>
<li><strong><a href="http://www.nczonline.net/blog/2012/05/08/working-with-files-in-javascript-part-1">Working with files in JavaScript, Part 1</a></strong>       <br></br>
Nicholas C. Zakas </li>
<li><strong><a href="http://html5doctor.com/html5-audio-the-state-of-play/">HTML5 Audio — The State of Play</a></strong>       <br></br>
Mark Boas </li>
<li><a href="http://www.strathweb.com/2012/05/native-html5-push-notifications-with-asp-net-web-api-and-knockout-js/" title="Permalink to Native HTML5 push notifications with ASP.NET Web API and Knockout.js"><strong>Native HTML5 push notifications with ASP.NET Web API and Knockout.js</strong></a>       <br></br>
Filip W. </li>
<li><strong><a href="http://net.tutsplus.com/tutorials/javascript-ajax/14-reason-why-nobody-used-your-jquery-plugin/">14 Reasons Why Nobody Used Your jQuery Plugin</a></strong>       <br></br>
Jonathan Cutrell</li>
<ul></ul>
</ul>
<h4>
Visual Studio/Complementos/Herramientas</h4>
<ul>
<li><strong><a href="http://blogs.jetbrains.com/dotnet/2012/05/dotpeek-10-is-released/">dotPeek 1.0 is Released</a></strong>       <br></br>
Jura Gorohovsky (vía @hhariri) </li>
<li><strong><a href="http://www.genbetadev.com/gestores-de-contenido/etiquetando-haciendo-crecer-nuestro-arbol-del-repositorio-de-codigo">Etiquetando,haciendo crecer nuestro árbol del repositorio de código</a></strong> y <strong><a href="http://www.genbetadev.com/gestores-de-contenido/branching-haciendo-crecer-nuestro-arbol-del-repositorio-de-codigo">Branching, haciendo crecer nuestro árbol del repositorio de código</a></strong>       <br></br>
Juan Quijano </li>
<li><strong><a href="http://blogs.msdn.com/b/visualstudio/archive/2012/05/08/visual-studio-11-user-interface-updates-coming-in-rc.aspx">Visual Studio 11 User Interface Updates Coming in RC</a></strong>       <br></br>
Monty Hammontree&nbsp;&nbsp; </li>
</ul>
<h4>
Otros</h4>
<ul>
<li><a href="http://www.hanselman.com/blog/TheFloppyDiskMeansSaveAnd14OtherOldPeopleIconsThatDontMakeSenseAnymore.aspx"><strong>The Floppy Disk means Save, and 14 other old people Icons that don't make sense anymore</strong></a>       <br></br>
Scott Hanselman </li>
</ul>
Y no olvidéis que podéis seguir esta información en vivo y en directo desde <a href="http://www.facebook.com/variablenotfound">Variable not found en Facebook</a>, o a través de <a href="http://twitter.com/jmaguilar">Twitter</a>.     <br></br>
<br></br>
Publicado en <a href="http://www.variablenotfound.com/">Variable not found</a><div class="blogger-post-footer"><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/27752126-3882771534374934261?l=www.variablenotfound.com" alt=""></img></div>
<p><a href="http://feedads.g.doubleclick.net/~a/Ls1Q1M7V2BPRKSA5C9lBCxAR57o/0/da"><img src="http://feedads.g.doubleclick.net/~a/Ls1Q1M7V2BPRKSA5C9lBCxAR57o/0/di" border="0" ismap="true"></img></a><br></br>
<a href="http://feedads.g.doubleclick.net/~a/Ls1Q1M7V2BPRKSA5C9lBCxAR57o/1/da"><img src="http://feedads.g.doubleclick.net/~a/Ls1Q1M7V2BPRKSA5C9lBCxAR57o/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/vnf?a=GC83Y6j9wJg:i3ChVOptABw:ecdYMiMMAMM"><img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=GC83Y6j9wJg:i3ChVOptABw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=GC83Y6j9wJg:i3ChVOptABw:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=GC83Y6j9wJg:i3ChVOptABw:4cEx4HpKnUU"><img src="http://feeds.feedburner.com/~ff/vnf?i=GC83Y6j9wJg:i3ChVOptABw:4cEx4HpKnUU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=GC83Y6j9wJg:i3ChVOptABw:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/vnf?i=GC83Y6j9wJg:i3ChVOptABw:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=GC83Y6j9wJg:i3ChVOptABw:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/vnf?i=GC83Y6j9wJg:i3ChVOptABw:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=GC83Y6j9wJg:i3ChVOptABw:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/vnf/~4/GC83Y6j9wJg" height="1" width="1"></img>]]></content:encoded>
		</item>
		<item>
		<title>Koalite: El primer tester es el programador</title>
		<link>http://feedproxy.google.com/~r/KoalitesBlog/~3/pVC6LlMQsyU/</link>
		<pubDate>Mon, 14 May 2012 05:06:54 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
		
	<category>testing</category>
	<category>opinion</category>
	<category>TDD</category>
	<category>software development</category>
		<guid>http://feedproxy.google.com/~r/KoalitesBlog/~3/pVC6LlMQsyU/</guid>
		<description><![CDATA[En mi noble (y seguramente ilusa) intención de construir software de calidad, últimamente he estado pensando bastante sobre el tema de las pruebas. No me refiero en este caso a los tests automáticos, ya sean unitarios, de aceptación, de aprobación, etc. Estoy pensando en las pruebas manuales. Sí, manuales a mano, de las de arrancar...  <a href="http://blog.koalite.com/2012/05/el-primer-tester-es-el-programador/" class="more-link" title="Read El primer tester es el programador">Leer más &#187;</a>
No hay posts relacionados.]]></description>
			<content:encoded><![CDATA[<p>En mi noble (y seguramente ilusa) intención de construir software de calidad, últimamente he estado pensando bastante sobre el tema de las pruebas. No me refiero en este caso a los tests automáticos, ya sean <a href="http://blog.koalite.com/2012/02/la-unidad-de-un-test-unitario-no-es-una-clas/" title="La unidad de un test unitario no es una clase" >unitarios</a>, de aceptación, de <a href="http://blog.koalite.com/2012/03/approval-tests-tests-de-aprobacion-en-c/" title="Approval Tests: Tests de Aprobación en C#" >aprobación</a>, etc. Estoy pensando en las <strong>pruebas manuales</strong>. Sí, manuales <em>a mano</em>, de las de arrancar la aplicación y empezar a comprobar si funciona como debe.</p>
<p>Al final, y especialmente en aplicaciones que tienen algún tipo de interfaz de usuario, <strong>es inevitable y fundamental realizar pruebas manuales</strong>. Hay cosas que son  <del>imposibles</del> muy difíciles de detectar con pruebas automáticas, como etiquetas mal alineadas, textos mal redactados, interacciones &#8220;extrañas&#8221;&#8230; prácticamente todo lo que afecta a la experiencia de usuario. </p>
<p>Además, hay que tener en cuenta que <strong>las pruebas automáticas sólo cubren aquello en lo que hemos pensado a priori</strong>, durante la creación de las pruebas (o el diseño del sistema, si estás usando TDD), pero en cualquier caso es posible (y hasta frecuente) que en ese momento estemos pasando cosas por alto.</p>
<p>Mi opinión es que <strong>los primeros que deben realizar estas pruebas manuales son los propios desarrolladores</strong>.</p>
<h3>Pero, ¿para eso están los testers, no?</h3>
<p>Pues sí y no. La realidad es que la mayoría de las veces, y más en España donde el número de pequeñas empresas es muy elevado, eso de contar con un equipo independiente de testers es pura fantasía.</p>
<p>Por otra parte, <strong>los testers no tienen el mismo conocimiento sobre el código de la aplicación que quien lo está creado o modificando</strong>, por lo que tienen mucho más difícil evaluar algunos riesgos estructurales como los que mencionaba al hablar de <a href="http://blog.koalite.com/2012/04/planificar-en-funcion-del-riesgo/" title="Planificar en función del riesgo" >planificación y riesgos</a>.</p>
<p>También hay que tener en cuenta que, cuando implementamos algo, sabemos mejor que nadie los puntos flojos de la implementación, los casos que podemos considerar límites y las partes que <em>remotamente</em> se podrían ver afectadas por los cambios. </p>
<p>Muchas veces <strong>el tester se centra en las cosas nuevas que se han implementado</strong>, en lo que aparece en el <em>changelog</em> de la versión, y es lógico y correcto, pero eso puede provocar que <strong>pasen desapercibidos bugs de regresión</strong> que hemos introducido en otras partes del sistema que, teóricamente no se han modificado, pero cuya implementación se ha podido ver afectada por las nuevas funcionalidades.</p>
<p>Sí, ya sé que con un montón de test automatizados se supone que evitamos estos riesgos, pero seamos realistas y admitamos que muchas trong>a veces no es viable escribir tests automáticalgunas ciertas cosas</strong> (sigo pensando en el interfaz de usuario). Además los tests tampoco son infalibles (no dejan de ser código escrito por nosotros) y <strong>seguramente sea más complicado escribir buenos tests que escribir buen código</strong>. </p>
<p><a href="http://es.wikipedia.org/wiki/Donald_Knuth" >Donald Knuth</a> decía:</p>
<blockquote><p>Cuidado con los errores en el código anterior; sólo he demostrado que es correcto, no lo he probado.</p></blockquote>
<p>Él hablaba de <a href="http://en.wikipedia.org/wiki/Formal_verification" >verificación formal</a>, pero parafraseándole:</p>
<blockquote><p>Cuidado con los errores en el código anterior; sólo he comprobado que pasa los tests, no lo he probado.</p></blockquote>
<p>Suele ser más productivo probar las cosas justo cuando las hemos acabado de implementar, sin dejar pasar mucho tiempo, para tener todavía frescos los cambios que hemos hecho, han pasado los tests, pero no estamos muy seguros de que vayan a funcionar realmente.</p>
<h3>Entonces, ¿pasamos de los testers y lo hacemos todo nosotros?</h3>
<p>Ni por asomo. <strong>Si tienes la suerte de contar con gente dedicada a probar la aplicación, aprovéchalo</strong>. </p>
<p>La gente que está acostumbrada a probar aplicaciones, <strong>sabe mejor que tú cómo romper una aplicación</strong> y qué cosas suelen fallar o se te suelen pasar por alto (casos típicos: teclas rápidas en los diálogos, orden de tabulación, &#8230;).</p>
<p>Además, hay un factor muy importante: se trata de una persona distinta de la que ha implementado la funcionalidad que está probando. Eso hace que <strong>parta sin prejuicios y explore caminos que a ti seguramente se te hayan pasado por alto</strong>: combinaciones de teclas raras, errores en la entrada de datos, distintas formas de interactuación con el sistema, etc.</p>
<p>La estrategia que encuentro más efectiva es <strong>combinar pruebas manuales exhaustivas durante el desarrollo realizadas por el propio equipo de desarrollo, con una fase posterior de pruebas por parte de los testers</strong>. De esta forma se consiguen detectar más errores antes de que la aplicación llegue a los usuarios y se obtiene un software de mejor calidad. </p>
<p>Habrá quien piense que tener al equipo de desarrollo probando aplicaciones es un mal uso de recursos porque, en general, las horas de programador son más caras que las horas de probador, pero no hay que olvidar que también los fallos detectados en producción son más caros de corregir que los detectados en desarrollo, así que seguramente <strong>emplear parte del tiempo de desarrollo en asegurarse de que las cosas funcionan, no sea tan mala idea</strong>.</p>
<div class="trackable_sharing"><div class="trackable_sharing_text"><strong>Compartir:</strong></div><a href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fblog.koalite.com%2F2012%2F05%2Fel-primer-tester-es-el-programador%2F"  title="Facebook"  onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Facebook','http://blog.koalite.com/2012/05/el-primer-tester-es-el-programador/']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://blog.koalite.com/wp-content/uploads/trackableshare//facebook.png" alt="Facebook" width="32" height="32"></a> <a href="http://twitter.com/share?url=http%3A%2F%2Fblog.koalite.com%2F2012%2F05%2Fel-primer-tester-es-el-programador%2F&text=El+primer+tester+es+el+programador"  title="Twitter"  onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Twitter','http://blog.koalite.com/2012/05/el-primer-tester-es-el-programador/']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://blog.koalite.com/wp-content/uploads/trackableshare//twitter.png" alt="Twitter" width="32" height="32"></a> <a href="mailto:?subject=Check%20out%20http%3A%2F%2Fblog.koalite.com%2F2012%2F05%2Fel-primer-tester-es-el-programador%2F"  title="Email" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Email','http://blog.koalite.com/2012/05/el-primer-tester-es-el-programador/']); "><img align="absmiddle" src="http://blog.koalite.com/wp-content/uploads/trackableshare//email.png" alt="Email" width="32" height="32"></a> <a href="http://www.linkedin.com/shareArticle?mini=true&url=http%3A%2F%2Fblog.koalite.com%2F2012%2F05%2Fel-primer-tester-es-el-programador%2F&title=http%3A%2F%2Fblog.koalite.com%2F2012%2F05%2Fel-primer-tester-es-el-programador%2F&ro=false&summary=&source="  title="Linkedin"  onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Linkedin','http://blog.koalite.com/2012/05/el-primer-tester-es-el-programador/']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://blog.koalite.com/wp-content/uploads/trackableshare//linkedin.png" alt="Linkedin" width="32" height="32"></a> <a href="https://plusone.google.com/_/+1/confirm?hl=en&url=http%3A%2F%2Fblog.koalite.com%2F2012%2F05%2Fel-primer-tester-es-el-programador%2F&title=El+primer+tester+es+el+programador"  title="Plusone"  onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Plusone','http://blog.koalite.com/2012/05/el-primer-tester-es-el-programador/']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=550,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://blog.koalite.com/wp-content/uploads/trackableshare//plusone.png" alt="Plusone" width="38" height="24"></a> </div><p>No hay posts relacionados.</p><img src="http://feeds.feedburner.com/~r/KoalitesBlog/~4/pVC6LlMQsyU" height="1" width="1"/>]]></content:encoded>
		</item>
		<item>
		<title>Buayacorp: SlideAd: Mi primer módulo (oficial) en Drupal</title>
		<link>http://www.buayacorp.com/archivos/slidead-mi-primer-modulo-oficial-en-drupal/</link>
		<pubDate>Fri, 11 May 2012 13:42:49 +0000</pubDate>
		<dc:creator>braulio</dc:creator>
		
	<category>Artí­culos</category>
		<guid>http://www.buayacorp.com/archivos/slidead-mi-primer-modulo-oficial-en-drupal/</guid>
		<description><![CDATA[Mientras no estamos por aca, estamos colaborando con Drupal, aprendiendo un poco de Git y apoyando en todo lado. En este tiempo, a modo de aprender, he escrito un pequeño módulo para Drupal. Para que lo acepten tuve que pasar un control de expertos con muchas observaciones, sin embargo en ese tiempo he aprendido mucho. [...]]]></description>
			<content:encoded><![CDATA[<p>Mientras no estamos por aca, estamos colaborando con <a href="http://drupal.org/">Drupal</a>, aprendiendo un poco de Git y <a href="http://drupal.org/project/issues/projectapplications">apoyando en todo lado</a>. En este tiempo, a modo de aprender, he escrito un pequeño módulo para Drupal. <a href="http://drupal.org/node/1442482">Para que  lo acepten tuve que pasar un control de expertos con muchas observaciones</a>, sin embargo en ese tiempo he aprendido mucho. </p>
<p class="align-center"><a href="http://www.buayacorp.com/wp-content/uploads/2012/05/4hblsn.png"><img src="http://www.buayacorp.com/wp-content/uploads/2012/05/4hblsn.png" alt="SlideAd" title="SlideAd" width="500" class="alignnone size-full wp-image-1070" /></a></p>
<p><a href="http://drupal.org/project/slidead">SlideAd</a> es un módulo simple que permite mostrar una cajita con tu contenido personalizado en una esquina de tu sitio. Esta cajita se muestra después que el usuario ha hecho scroll. El módulo se integra con Blocks para mostrar elegir la visibilidad y los roles a los cuales se debe mostrar la cajita.</p>
<p>Puedes configurar el diseño, el ancho o lo que sea usando CSS.</p>
<h2>¿Qué puedo hacer con este módulo?</h2>
<ul>
  <li>Puedes mostrar botones de Social Media</li>
  <li>Puedes llamar a la acción sobre productos u ofertas</li>
  <li>Puedes mostrar publicidad</li>
  <li>Lo que te de la gana <img src='http://www.buayacorp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
<h2>Enlaces</h2>
<ul>
  <li><a href="http://drupal.org/project/slidead">SlideAd</a>.</li>
</ul>]]></content:encoded>
		</item>
		<item>
		<title>Buayacorp: Why?</title>
		<link>http://www.buayacorp.com/archivos/why/</link>
		<pubDate>Fri, 11 May 2012 13:26:07 +0000</pubDate>
		<dc:creator>braulio</dc:creator>
		
	<category>personal</category>
	<category>Miniposts</category>
		<guid>http://www.buayacorp.com/archivos/why/</guid>
		<description><![CDATA[¿Por qué es tan difícil mantener tu propio blog? -.-]]></description>
			<content:encoded><![CDATA[¿Por qué es tan difícil mantener tu propio blog? -.-]]></content:encoded>
		</item>
		<item>
		<title>Koalite: Hebras, lambdas… y bugs</title>
		<link>http://feedproxy.google.com/~r/KoalitesBlog/~3/Q1JwJaszxtw/</link>
		<pubDate>Thu, 10 May 2012 05:06:19 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
		
	<category>C#</category>
	<category>lambda</category>
	<category>development</category>
	<category>mutithreathing</category>
		<guid>http://feedproxy.google.com/~r/KoalitesBlog/~3/Q1JwJaszxtw/</guid>
		<description><![CDATA[Cuando uno empieza a mezclar ciertas cosas tiene que andarse con bastante ojo para no liarla. La programación concurrente es una de esas cosas que, en cuanto requiere compartir información entre procesos/hebras (de la forma que sea), se convierte en algo que hay que tratar con cariño para evitar introducir condiciones de carrera (race conditions)....  <a href="http://blog.koalite.com/2012/05/hebras-lambdas-y-bugs/" class="more-link" title="Read Hebras, lambdas&#8230; y bugs">Leer más &#187;</a>
No hay posts relacionados.]]></description>
			<content:encoded><![CDATA[<p>Cuando uno empieza a mezclar ciertas cosas tiene que andarse con bastante ojo para no liarla. La programación concurrente es una de esas cosas que, en cuanto requiere compartir información entre procesos/hebras (de la forma que sea), se convierte en algo que hay que tratar con cariño para evitar introducir condiciones de carrera (<em><a href="http://en.wikipedia.org/wiki/Race_condition" >race conditions</a></em>).</p>
<h3>Las hebras</h3>
<p>Una <strong>condición de carrera</strong> (tuve un profesor que la llamaba carrera crítica, que me parece un nombre mucho más bonito), se produce cuando dos hebras ejecutan una secuencia de instrucciones en un orden que no teníamos previsto, lo que genera fallos bastante difíciles de reproducir. El caso más habitual son <strong>dos hebras accediendo a una misma variable y “pisándose” el valor que acaban de escribir</strong>.</p>
<p>Todo esto viene a cuento porque hace poco tuve que depurar un fragmento de código con una pinta parecida a ésta:</p>
<pre class="brush:csharp">
public class Wrapper
{
	private int current;
	private int total;
	private Control control;

	// Más atributos, propiedades, métodos...

	public void Start(int param1, int param2)
	{
		SomeFunctionInBackgroundThread(
			param1, param2,
			(newCurrent, newTotal) =>
			{
				this.current = newCurrent;
				this.total = newTotal;

				// Unas cuantas cosas más...

				if (this.total > 0)
					control.BeginInvoke((Action)(() =>control.Text = (current/total).ToString("p")));
			});
	}
}
</pre>
<p>En el método <code>Start</code> se invocaba una función en una dll nativa a la que se le pasaba una función callback que era invocada cada cierto tiempo para informar del progreso. La función callback lo único que hace es actualizar los valores almacenados con el estado del progreso y actualizar el texto de un control, para lo que necesita usar <code>BeginInvoke</code> y redirigir la llamada a la <a href="http://blog.koalite.com/2011/09/mensajes-del-mas-alla-windows-messages/" title="Mensajes del más allá: Windows Messages" >hebra de interfaz de usuario</a>.</p>
<p>Cuando acaba el proceso, la dll nativa invocaba la función callback pasando como parámetro <code>newTotal == 0</code> para indicar que ha finalizado. Para evitar la división por 0, antes de lanzar el <code>BeginInvoke</code> comprobamos que <code>total > 0</code> y ya está, ¿no? Pues no, <strong>eso no funciona</strong>.</p>
<h3>Los cierres lambda</h3>
<p>Al usar una expresión lambda C# estamos creando un <a href="http://en.wikipedia.org/wiki/Closure_%28computer_science%29" >cierre lambda</a> sobre las variables que referenciamos en la expresión. En un cierre lambda, <strong>aquellas variables que no son locales <em>a la función</em> (en este caso, a la expresión lambda) son enlazadas a variables del contexto exterior</strong>, en este caso, al método que contiene la expresión lambda.</p>
<p>Para invocar <code>BeginInvoke</code> estamos pasando una expresión lambda:</p>
<pre class="brush:csharp">
control.BeginInvoke((Action)(() =>control.Text = (current/total).ToString("p")));
</pre>
<p>A primera vista, podría parecer que el cierre lambda se realiza sobre las variables <code>control</code>, <code>current</code> y <code>total</code>, pero ojo que no se trata de variables locales. Realmente <strong>el cierre se realiza sobre la referencia implícita a <code>this</code></strong>, ya que en realidad <code>total</code> es <code>this.total</code>.</p>
<p>¿Y esto que quiere decir? Esto quiere decir que, si mezclamos la forma en que se realiza el cierre lambda con las condiciones de carrera que contábamos antes, tenemos un problema. Puede ser que para cuando se ejecute la expresión pasada a <code>BeginInvoke</code> (que se ejecuta de forma asíncrona) se haya vuelto a invocar la función callback y el valor de <code>total</code> haya pasado a ser 0.</p>
<p>La solución es muy sencilla: se puede meter el <code>if</code> dentro de la expresión lambda o usar las variables locales de la función <code>callback</code>, que como son locales no se van a ver modificadas por las siguientes invocaciones de la función <code>callback</code>, pero me costó un rato verlo.</p>
<h3>Moraleja</h3>
<p><strong>La programación concurrente no es trivial</strong>. Si puedes evitar compartir estado, mejor. Si puedes evitar estado mutable, mejor. </p>
<p><strong>Los cierres lambda son poderosos, pero ten cuidado de estar seguro de lo que cierras</strong>. Los bugs derivados de mezclar cierres lambda con programación concurrente son muy divertidos de depurar.</p>
<div class="trackable_sharing"><div class="trackable_sharing_text"><strong>Compartir:</strong></div><a href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fblog.koalite.com%2F2012%2F05%2Fhebras-lambdas-y-bugs%2F"  title="Facebook"  onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Facebook','http://blog.koalite.com/2012/05/hebras-lambdas-y-bugs/']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://blog.koalite.com/wp-content/uploads/trackableshare//facebook.png" alt="Facebook" width="32" height="32"></a> <a href="http://twitter.com/share?url=http%3A%2F%2Fblog.koalite.com%2F2012%2F05%2Fhebras-lambdas-y-bugs%2F&text=Hebras%2C+lambdas%26%238230%3B+y+bugs"  title="Twitter"  onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Twitter','http://blog.koalite.com/2012/05/hebras-lambdas-y-bugs/']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://blog.koalite.com/wp-content/uploads/trackableshare//twitter.png" alt="Twitter" width="32" height="32"></a> <a href="mailto:?subject=Check%20out%20http%3A%2F%2Fblog.koalite.com%2F2012%2F05%2Fhebras-lambdas-y-bugs%2F"  title="Email" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Email','http://blog.koalite.com/2012/05/hebras-lambdas-y-bugs/']); "><img align="absmiddle" src="http://blog.koalite.com/wp-content/uploads/trackableshare//email.png" alt="Email" width="32" height="32"></a> <a href="http://www.linkedin.com/shareArticle?mini=true&url=http%3A%2F%2Fblog.koalite.com%2F2012%2F05%2Fhebras-lambdas-y-bugs%2F&title=http%3A%2F%2Fblog.koalite.com%2F2012%2F05%2Fhebras-lambdas-y-bugs%2F&ro=false&summary=&source="  title="Linkedin"  onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Linkedin','http://blog.koalite.com/2012/05/hebras-lambdas-y-bugs/']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://blog.koalite.com/wp-content/uploads/trackableshare//linkedin.png" alt="Linkedin" width="32" height="32"></a> <a href="https://plusone.google.com/_/+1/confirm?hl=en&url=http%3A%2F%2Fblog.koalite.com%2F2012%2F05%2Fhebras-lambdas-y-bugs%2F&title=Hebras%2C+lambdas%26%238230%3B+y+bugs"  title="Plusone"  onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Plusone','http://blog.koalite.com/2012/05/hebras-lambdas-y-bugs/']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=550,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://blog.koalite.com/wp-content/uploads/trackableshare//plusone.png" alt="Plusone" width="38" height="24"></a> </div><p>No hay posts relacionados.</p><img src="http://feeds.feedburner.com/~r/KoalitesBlog/~4/Q1JwJaszxtw" height="1" width="1"/>]]></content:encoded>
		</item>
		<item>
		<title>Blog de Federico Varela: Crónica Media Maratón de Punta del Este</title>
		<link>http://federicovarela.blogspot.com/2012/05/cronica-media-maraton-de-punta-del-este.html</link>
		<pubDate>Thu, 10 May 2012 03:37:00 +0000</pubDate>
		<dc:creator>Federico Varela</dc:creator>
		
	<category>Uncategorized</category>
		<guid>http://federicovarela.blogspot.com/2012/05/cronica-media-maraton-de-punta-del-este.html</guid>
		<description><![CDATA[Fin de semana espectacular en Punta del Este, con mucha expectativa corrí mi primera media maratón el domingo pasado, llegando a la decena de carreras desde que comencé en el 2011.

Para preparar estos 21K me armé un plancito de un mes, muy conservador con solo dos salidas semanales: entre 8-10K a mitad de semana y un fondo de entre 13-15K los domingos. Puede parecer poco, y seguramente lo sea ]]></description>
			<content:encoded><![CDATA[Fin de semana espectacular en Punta del Este, con mucha expectativa corrí mi primera media maratón el domingo pasado, llegando a la decena de carreras desde que comencé en el 2011.

Para preparar estos 21K me armé un plancito de un mes, muy conservador con solo dos salidas semanales: entre 8-10K a mitad de semana y un fondo de entre 13-15K los domingos. Puede parecer poco, y seguramente lo sea ]]></content:encoded>
		</item>
		<item>
		<title>Variable not found: 6 años 6. Y de la variable, ni rastro…</title>
		<link>http://feedproxy.google.com/~r/vnf/~3/n28XUF5Rb4E/6-anos-6-y-de-la-variable-ni-rastro.html</link>
		<pubDate>Wed, 09 May 2012 10:33:00 +0000</pubDate>
		<dc:creator>José M. Aguilar</dc:creator>
		
	<category>blogging</category>
	<category>aniversario</category>
	<category>autobombo</category>
	<category>variablenotfound.com</category>
		<guid>http://feedproxy.google.com/~r/vnf/~3/n28XUF5Rb4E/6-anos-6-y-de-la-variable-ni-rastro.html</guid>
		<description><![CDATA[“De hoy no pasa”. Era 8 de mayo de 2006; aunque no puedo recordarlo, seguro que estuve toda la jornada trabajando con mi flamante Visual Studio 2005 en algún proyecto basado en un primitivo ASP.NET.

Lo que sí sé es que al llegar a casa inicié ...]]></description>
			<content:encoded><![CDATA[<img align="right" alt="6 años 6" border="0" height="121" src="http://lh4.ggpht.com/-AYITg711sOU/T6pFQ6ueVXI/AAAAAAAACBs/_GlwjkmGixk/image6.png?imgmax=800"  title="6 años 6" width="144"></img>“De hoy no pasa”. Era 8 de mayo de 2006; aunque no puedo recordarlo, seguro que estuve toda la jornada trabajando con mi flamante Visual Studio 2005 en algún proyecto basado en un primitivo ASP.NET.<br></br>
<br></br>
Lo que sí sé es que al llegar a casa inicié Windows XP, abrí Internet Explorer 6 y navegué hacia <a href="http://www.blogger.com/">blogger.com</a> con la intención de crear un blog. No tenía grandes aspiraciones, pero estaba seguro de que la travesía <a href="http://www.variablenotfound.com/2006/05/paren-el-tren-que-me-subo.html">iba a ser larga</a>.<br></br>
<br></br>
<a name="more"></a><br></br><br></br>
Desde entonces, a veces con más acierto y otras con menos, he intentado ir dejando plasmado por aquí todo aquello que me ha parecido que podía interesar a alguien, o incluso serme útil en el futuro: novedades, trucos, tecnologías, herramientas, artículos… Y seis años después, tras más de quinientos post, más de mil comentarios, más de medio millón de consultas, no puedo hacer otra cosa que <strong>agradeceros el apoyo</strong> que siempre habéis dado los protagonistas más importantes en este proyecto: vosotros. <br></br>
<br></br>
Y ahora, como viene siendo costumbre, vamos a hacer un breve análisis retrospectivo de estos años, en los que hemos pasado por distintas etapas.<br></br>
<ul>
<li><strong><img align="right" alt="Estadísticas de acceso" border="0" height="79" src="http://lh3.ggpht.com/_O9D62hXq-ng/Sf22tJ65yOI/AAAAAAAABCk/kcnHZYI1yIg/image%5B18%5D.png?imgmax=800"  title="Estadísticas de acceso" width="342"></img>Año 1: la travesía del desierto (mayo 2006 - mayo 2007)</strong>, en el que sólo yo visitaba el blog. Triste pero cierto. Los que habéis empezado una bitácora en solitario reconoceréis este patrón de visitas, donde los picos que superan las cinco páginas vistas al día se deben, con toda seguridad, a pruebas propias.       <br></br>      <br></br>Dicen que muchos blogs mueren en este primer año de vida precisamente por el escaso retorno que tiene la inversión de tiempo que requiere su puesta en marcha, pero según he comprobado, <strong>sólo es cuestión de paciencia</strong>: si le pones empeño, entusiasmo y cariño, es posible cambiar las cosas.<br></br>&nbsp; &nbsp;     </li>
<li><strong>Año 2: el despegue (mayo 2007 - mayo 2008)</strong>, me lo tomé algo más en serio y comencé a difundir los posts por RSS (hasta entonces no lo hacía!), a utilizar el dominio variablenotfound.com, di al sitio un diseño más atractivo y alejado de las plantillas estándar de Blogger, lo incluí en directorios y agregadores, y comencé a hacer crossposting en geeks.ms. Todas estas acciones se tradujeron en un incremento del 2.500% del número de visitas, y acabamos el año con 380 suscriptores al feed. Impresionante.<br></br>&nbsp; &nbsp;     </li>
<li><strong>Año 3: la consolidación (mayo 2008 – mayo 2009)</strong>, en el que no realicé cambios de calado, pero ya empezó a notarse la antigüedad del blog y su aumento de posición en buscadores. Ese año crecimos en número de visitas un 75% y más del 100% en suscriptores a los feeds.<br></br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </li>
<li><strong>Año 4: la variable social (mayo 2009 – mayo 2010)</strong>, donde comencé a utilizar Facebook y Twitter como canales adicionales de difusión. Mientras, continuaba creciendo el número de amigos del blog, rozando ya los 100.000 usuarios únicos absolutos al año (sumando las visitas de variablenotfound.com y su eco en geeks.ms).<br></br>&nbsp;       </li>
<li><strong>Año 5: la variable física (mayo 2010 – mayo 2011)</strong>. En este periodo lo más destacable fue, sin duda, el haber “salido de la cueva” y comenzar a participar en eventos de la comunidad como el <a href="http://www.variablenotfound.com/2010/10/de-vuelta-del-ttt2010-enlaces.html">TTT/Open Day</a>, en la gira <a href="http://www.variablenotfound.com/2011/04/make-web-not-war-materiales-y-videos.html">Make Web Not War</a> de Microsoft, o a relacionarme con grupos locales y, sobre todo, a conocer en persona a gente estupenda a los que seguía desde mucho tiempo atrás. Y ya en el terreno más virtual, más de 10.000 visitas/mes al blog y de mil suscriptores a los RSS seguían haciendo crecer este proyecto.      </li>
</ul>
<h3>


Año 6 (mayo 2011-mayo 2012): Variable premiada</h3>
<img align="right" alt="Microsoft MVP" border="0" height="121" src="http://lh4.ggpht.com/-7kzKjlg18Ts/T6pFR7qm-LI/AAAAAAAACB0/BYI1z4oKwno/image%25255B2%25255D.png?imgmax=800"  title="Microsoft MVP" width="77"></img>Siempre he pensado que no hay mejor premio que el hecho de poder escribir sobre lo que me gusta, y que estéis siempre ahí… pero eso no quita que puedan alegrarte otro tipo de reconocimientos, y es uno de los principales hitos de este año que ahora cerramos :-)<br></br>
<br></br>
El nombramiento como <a href="http://www.variablenotfound.com/2011/07/microsoft-mvp-2011.html">Microsoft MVP</a> el pasado mes de julio fue un inesperado alegrón de esos que dejan marca, y que sirven como aliciente para seguir trabajando duro. Como diría su majestad, es para mí un orgullo y una satisfacción el poder entrar a formar parte de esta familia, y un privilegio poder compartir buenos ratos con gente a los que considero auténticos números uno en todos los sentidos. Y bueno, por no hablar de la oportunidad de asistir al MVP Summit y conocer la sede de Microsoft, que ha sido la <a href="http://www.variablenotfound.com/2012/03/experiencia-summit.html">experiencia del año</a>.<br></br>
<br></br>
Respecto al blog, <strong>seguimos creciendo de forma considerable</strong>. Según Google Analytics este año hemos registrado un incremento del 40% respecto al año pasado. En estos momentos, se consultan más de 200.000 páginas al año en variablenotfound.com; si sumamos las consultas a los mismos artículos realizadas desde geeks.ms llegaríamos a los 300.000.<br></br>
<br></br>
También siguen en ascenso las otras fórmulas para relacionarse con la <em>comunidad de la variable</em>. El número de amigos que prefieren acceder a los contenidos a través de RSS, han crecido más del 20%, superando ya los 1.350 suscriptores. En <a href="http://twitter.com/jmaguilar">Twitter</a> rondamos los 500 followers, lo que supone un incremento mayor del 100%, y la página de Variable not found en Facebook supera los 350 amigos (+80% respecto al año pasado).<br></br>
<br></br>
En general, Variable not found sigue siendo un blog<em> </em>humilde y de poca monta en términos generales, pero, teniendo en cuenta su gran verticalidad temática, estas cifras son bastante buenas según entendidos en la materia. Y para un servidor, sencillamente espectaculares: jamás pensé que estas pequeñas aportaciones pudieran llegar a mover alrededor tal cantidad de personas :-)<br></br>
<br></br>
<img align="right" alt="image" border="0" height="154" src="http://lh5.ggpht.com/-6hYShslrFv4/T6pFT6BDQNI/AAAAAAAACB8/LmQ44UYLrLw/image%25255B6%25255D.png?imgmax=800"  title="image" width="221"></img>Por citar algunas curiosidades, la “marca” de navegador más utilizada, independientemente de sus versiones, para acceder al blog ha sido Chrome, seguida muy de cerca por Firefox, y bastante más rezagado, Interner Explorer. Este trío sigue concentrando el 95% de las visitas. También entran este año en escena otros dispositivos, entre los que destaca de forma especial el iPad de Apple, abarcando&nbsp;el 90% de la navegación móvil.<br></br>
<br></br>
El 90% de los lectores usan Windows, algo bastante lógico, pero aún el 31% de ellos continúan con la versión XP. Afortunadamente, Windows 7 ya es el más utilizado (¡hasta ahora no era así!), con un 60% del total.<br></br>
<br></br>
Google sigue siendo la principal fuente de tráfico, aunque este año han aparecido con fuerza <a href="http://meneame.net/">meneame.net</a>, <a href="http://www.desarrolloweb.com/">desarrolloweb.com</a>, y <a href="http://www.genbetadev.com/">genbetadev.com</a>, en gran parte artífices del aumento de visitas registrado, y los lectores proceden principalmente de España, México, Argentina, Colombia y Perú. Tenemos amigos en todo el mundo :-)<br></br>
<br></br>
“¿Y qué sacas tú de esto?“, me preguntan algunos. Y la respuesta sigue siendo la misma que hace seis años: el aprendizaje continuo, el disfrute de escribir sobre temas que me apasionan, la satisfacción de saber que hay artículos que ayudan a alguien, los comentarios, mails y feedback que recibo y la gente que he podido conocer gracias a ello. Ya, intangible, pero seguro más enriquecedor y valioso que otras cosas palpables a las que a menudo prestamos tanta atención.<br></br>
<br></br>
Un millón de gracias a todos los que lo hacéis posible, y espero veros por aquí un año más, <em>ayudándome a buscar la variable</em>.<div class="blogger-post-footer"><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/27752126-4401529557145222034?l=www.variablenotfound.com" alt=""></img></div>
<p><a href="http://feedads.g.doubleclick.net/~a/ic14X7tYiL0orT6nzfgRGv5vhRw/0/da"><img src="http://feedads.g.doubleclick.net/~a/ic14X7tYiL0orT6nzfgRGv5vhRw/0/di" border="0" ismap="true"></img></a><br></br>
<a href="http://feedads.g.doubleclick.net/~a/ic14X7tYiL0orT6nzfgRGv5vhRw/1/da"><img src="http://feedads.g.doubleclick.net/~a/ic14X7tYiL0orT6nzfgRGv5vhRw/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/vnf?a=n28XUF5Rb4E:hY6sh90MhT8:ecdYMiMMAMM"><img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=n28XUF5Rb4E:hY6sh90MhT8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=n28XUF5Rb4E:hY6sh90MhT8:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=n28XUF5Rb4E:hY6sh90MhT8:4cEx4HpKnUU"><img src="http://feeds.feedburner.com/~ff/vnf?i=n28XUF5Rb4E:hY6sh90MhT8:4cEx4HpKnUU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=n28XUF5Rb4E:hY6sh90MhT8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/vnf?i=n28XUF5Rb4E:hY6sh90MhT8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=n28XUF5Rb4E:hY6sh90MhT8:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/vnf?i=n28XUF5Rb4E:hY6sh90MhT8:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=n28XUF5Rb4E:hY6sh90MhT8:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/vnf/~4/n28XUF5Rb4E" height="1" width="1"></img>]]></content:encoded>
		</item>
		<item>
		<title>Variable not found: Login único para subdominios en ASP.NET</title>
		<link>http://feedproxy.google.com/~r/vnf/~3/C76u8F-ToO0/login-unico-para-subdominios-en-aspnet.html</link>
		<pubDate>Tue, 08 May 2012 07:15:00 +0000</pubDate>
		<dc:creator>José M. Aguilar</dc:creator>
		
	<category>Desarrollo</category>
	<category>Trucos</category>
	<category>ASP.NET</category>
		<guid>http://feedproxy.google.com/~r/vnf/~3/C76u8F-ToO0/login-unico-para-subdominios-en-aspnet.html</guid>
		<description><![CDATA[Imaginad que tenemos un sistema web de cierto volumen y decidimos estructurarlo en aplicaciones independientes, cada una publicada en un subdominio propio:

www.acme.org, que sería el sitio principal. 
crm.acme.org, con el sistema CRM de la empresa. 
...]]></description>
			<content:encoded><![CDATA[<img align="right" alt="ASP.NET" border="0" height="96" src="http://lh5.ggpht.com/-oPpqJbb1nMI/T5KON7KrPpI/AAAAAAAAB_M/Nin1jylHGOU/image%25255B4%25255D.png?imgmax=800"  title="ASP.NET" width="200"></img>Imaginad que tenemos un sistema web de cierto volumen y decidimos estructurarlo en aplicaciones independientes, cada una publicada en un subdominio propio:<br></br>
<ul>
<li><em>www.acme.org</em>, que sería el sitio principal. </li>
<li><em>crm.acme.org</em>, con el sistema CRM de la empresa. </li>
<li><em>erp.acme.org</em>, con un sistema de gestión empresarial. </li>
<li><em>administration.acme.org</em> con las herramientas de administración del sistema. </li>
<li>etc. </li>
</ul>
Desde un punto de vista operativo, es probable que nos interese suministrar un mecanismo de autenticación de usuarios compartido entre todas estas aplicaciones, de forma que el usuario, una vez identificado, pueda pasar de una a otra sin necesidad de introducir de nuevo sus credenciales.<br></br>
<br></br>
No es una tarea complicada en ASP.NET, aunque hay que hacer algunos ajustillos para que todo funcione correctamente. Veámoslos.<br></br>
<a name="more"></a><br></br>
<h3>



Primero: ampliar el alcance de la cookie</h3>
Como sabemos, el procedimiento estándar de autenticación consiste en comprobar que las credenciales suministradas por un usuario son correctas (con <em>membership</em> o cualquier otro mecanismo), y en caso afirmativo, generar una cookie con información encriptada sobre el mismo. Esta cookie, llamada por defecto “.ASPXAUTH”, viaja en las sucesivas peticiones hacia el servidor, de forma que éste puede comprobar que el usuario ha sido autenticado satisfactoriamente con anterioridad.<br></br>
<br></br>
El problema es que <strong>por defecto esta cookie es específica para cada host</strong>, por lo que sólo estará disponible para el dominio desde el que ha sido generada, con todos sus subdirectorios. Así, cuando se supera el procedimiento de autenticación y se crea la cookie (por ejemplo llamando a <code>FormsAuthentication.SetAuthCookie()</code>), lo que se enviará al servidor en los encabezados de la respuesta es lo siguiente:<br></br>
<br></br>
<code>Set-Cookie: .ASPXAUTH=F1E37685DF9CBED74094D02958BA239B4AEAA0BDEF2FF379A2E2C5A    <br></br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4B7F9AC271B7F14BCFFE3E18799434EE8886CF4A0227E6BE92BC91E     <br></br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 34601D0FCC18D3F1786D5060329DB578DF2BB5148F6AB2972D72C3D     <br></br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B17A437CE977660E552B92A6E5F981F3E6CE6037065244E1F0AB0BD     <br></br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A570D61DEB02; <span >path=/</span>; HttpOnly</code><br></br>
<br></br>
Pues bien, para conseguir nuestros objetivos, lo primero que nos interesa es <strong>asegurar que esta cookie estará disponible en los subdominios</strong> del dominio desde la cual se ha generado. <br></br>
<br></br>
Afortunadamente podemos configurar bastantes aspectos del sistema de autenticación basado en formularios simplemente tocando un poco el web.config, y en este caso simplemente debemos indicar el dominio (de segundo nivel) para el cual queremos que la cookie sea válida, incluyendo sus subdominios. en el parámetro <code>domain</code>:<br></br>
<pre ><span ><span ><span >&nbsp; &lt;</span></span><span ><span >authentication</span><span >&nbsp;</span><span >mode</span><span >=</span>"<span >Forms</span>"</span></span><span ><span ><span >&gt;
&nbsp;&nbsp;&nbsp; &lt;</span><span >forms</span><span >&nbsp;</span><span >loginUrl</span><span >=</span>"<span >~/Account/LogOn</span>"<span >&nbsp;</span><span >timeout</span><span >=</span>"<span >2880</span>"<span >&nbsp;</span><span ><span >domain</span><span >=</span>"<span >acme.org</span>"</span></span></span><span ><span ><span > /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp; &lt;/</span><span >authentication</span></span><span >&gt;</span></span></pre>
El valor de este parámetro será el nombre del dominio raíz del que colgarán todos los subdominios a los que haremos la cookie visible. Una vez introducido este valor en el web.config, la cookie de autorización será la siguiente:<br></br>
<br></br>
<code>Set-Cookie: .ASPXAUTH=4A67B460978D78217D52248318EB68717E857D7C08012057D0B6731<br></br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 896E0E4EB9023AD2C02024CFB7D190617CCCD97FBA1E6ED484CE3FF<br></br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3581E7C8BE31FA204508F5ABB0DF994ADD698369132A5AF932AFF40<br></br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A267422C9ABCA86E620B9041ABB2E97C516880960F3D8193B209616<br></br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5978108AB500; <span >domain=acme.org</span>; path=/; HttpOnly</code><br></br>
<br></br>
<strong>Este cambio tendremos que hacerlo únicamente en la aplicación que genere la cookie</strong>, es decir, aquella que incluya la implementación del procedimiento de autenticación del usuario. En nuestro caso, por ejemplo, podría ser la aplicación “raíz”, <em>www.acme.org</em>.<br></br>
<h3>



Segundo: encriptar la cookie usando una clave común</h3>
Esa secuencia de letras y números que veis en la cookie no es más que el resultado de encriptar la información que necesita ASP.NET para mantener información sobre el usuario autenticado. Esta encriptación se realiza utilizando un algoritmo y unas claves específicas para cada sitio web, que por defecto son generadas de forma automática.<br></br>
<br></br>
Así, <strong>si queremos que distintos sitios web puedan desencriptar la cookie</strong> y acceder a su contenido, lo cual es fundamental para mantener el usuario conectado, <strong>debemos hacer que todos ellos compartan el algoritmo y clave de encriptación</strong>. Esto se hace desde el web.config estableciendo estos aspectos en la entrada <code>&lt;<a href="http://msdn.microsoft.com/es-es/library/w8h3skw9(v=vs.100).aspx">machineKey</a>&gt;</code>:<br></br>
<br></br>
<code>... <br></br>
&lt;system.web&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br></br>
&nbsp;&nbsp;&nbsp; &lt;machineKey&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span ><strong>&lt;!-- ¡Ojo no copiar y pegar! --&gt;</strong></span><br></br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validationKey="6171035B16CD1EE0E401BA3E7348DE49FA9FB9C043B3CDE3BA4FF<br></br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EDDC84B167C68B83916FAD8AEE4CFEE001AD5CEA8A4B3E28D51F9<br></br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D5EA55CD5F276E67B71FC6"<br></br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; decryptionKey="3F12339F897F687F4456FEC2446167C621BDE5F664178CBEF9AF0<br></br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 40DB82EC806"<br></br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validation="SHA1"<br></br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; decryption="AES"<br></br>
&nbsp;&nbsp;&nbsp; /&gt;<br></br>
&nbsp;&nbsp;&nbsp; ... <br></br>
&lt;/system.web&gt;&nbsp;</code><br></br>
<br></br>
Puedes <a href="http://aspnetresources.com/tools/machineKey">generar este elemento usando el generador de MachineKey online</a>, copiar el código y pegarlo en la sección <code>&lt;system.web&gt;</code> del web.config de todos los sitios web, raíz y subdominios, de la aplicación.<br></br>
<br></br>
A partir de este momento <strong>ya podemos probar el sistema completo en funcionamiento</strong>. Si el mecanismo de autenticación se encuentra en <em>www.acme.org</em>, la autorización viajará al navegar por todos sus subdominios (<em>crm.acme.org</em>, <em>erp.acme.org</em>…), éstos serán capaces de desencriptar las credenciales y, por tanto, el usuario permanecerá logado en el sistema.<br></br>
<h3>



Tercero: ajustar Redirecciones</h3>
Dado que hemos considerado que todas las aplicaciones son privadas, con toda seguridad estarán protegidas contra accesos de usuarios no autenticados.Por ejemplo, en ASP.NET MVC probablemente tengamos todas las acciones protegidas con un filtro <code>[Authorize]</code>, o en WebForms tendremos secciones <code>&lt;authorization&gt;</code> en el web.config para denegar el acceso a todas sus funcionalidades.<br></br>
<br></br>
En cualquier caso, <strong>nos interesa que los usuarios no autenticados sean redirigidos a la aplicación desde la cual pueda autenticarse</strong>, por lo que podemos debemos indicar la URL de la página de login en el parámetro <code>loginUrl</code> como sigue:<br></br>
<pre ><span ><span ><span >&nbsp;&nbsp;&nbsp; &lt;</span></span><span ><span >authentication</span><span >&nbsp;</span><span >mode</span><span >=</span>"<span >Forms</span>"</span></span><span ><span ><span >&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span >forms</span><span >&nbsp;</span><span ><span >loginUrl</span><span >=</span>"<span >http://www.acme.org/account/logon</span>"</span><span >&nbsp;</span><span >timeout</span><span >=</span>"<span >2880</span>"</span><span ><span >&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/</span><span >forms</span></span></span><span ><span ><span >&gt;
&nbsp;&nbsp;&nbsp; &lt;/</span><span >authentication</span></span><span >&gt;</span></span></pre>
<strong>Este cambio sería necesario hacerlo en todas las aplicaciones a las que no vamos a permitir el acceso anónimo</strong> (<em>crm.acme.org</em>, <em>erp.acme.org</em>, …), con lo que aseguramos que cualquier intento de entrada de usuarios no autenticados será redirigida al sitio principal, desde el cual podrá identificarse.<br></br>
<h3>



Cuarto: retocar la URL de retorno y procesarla tras la autenticación</h3>
Casi hemos acabado, pero aún hay un detalle cuya solución no es tan inmediata como los puntos anteriores.<br></br>
<img align="right" alt="El parámetro ReturnUrl" border="0" height="94" src="http://lh5.ggpht.com/-jkcLKCtwYgQ/T5KOOjUUXgI/AAAAAAAAB_U/UXm4slvvn3k/image5.png?imgmax=800"  title="El parámetro ReturnUrl" width="381"></img><br></br>
Cuando se produce la redirección hacia la página de login, automáticamente se añade a la petición un parámetro llamado <code>ReturnUrl</code> donde se almacena la URL a la que estaba intentado acceder el usuario. Esto permite devolverlo a ella una vez se haya autenticado en el sistema. <br></br>
<br></br>
El problema es que este parámetro no incluye el host, por lo que en una aplicación distribuida en distintos dominios esta información se perderá. Es decir, si un usuario intenta acceder directamente a <em>erp.acme.org/customers/index</em>, será redirigido a la URL <em>http://www.acme.org/account/logon?ReturnUrl=customers/index</em><em>&nbsp;</em>para ser autenticado, y cuando esto ocurra, el sistema no tiene información suficiente como para devolverlo a la página a la que deseaba ir en un principio (en <em>erp.acme.org</em>).<br></br>
<br></br>
Lamentablemente no podemos “influir” en la forma en que ASP.NET genera el contenido para este parámetro al redirigir al usuario, por lo que o bien hacemos nosotros la redirección de forma manual al detectad que el usuario no se ha autenticado, o bien nos introducimos en algún punto avanzado del ciclo de ejecución de la petición para modificar el valor original del parámetro.<br></br>
<br></br>
Un primer acercamiento de la implementación de esta última opción podría ser la siguiente, implementando el evento <code>Application_EndRequest</code> (en el global.asax.cs, válido tanto en MVC como en Webforms):<br></br>
<pre ><span ><span ><span >protected</span></span><span >&nbsp;<span >void</span> Application_EndRequest(<span >object</span> sender, <span >EventArgs</span> e)
{
&nbsp;&nbsp;&nbsp; <span >if</span> (Response.StatusCode == (<span >int</span>)<span >HttpStatusCode</span>.Found &amp;&amp; !Request.IsAuthenticated)
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span >string</span> redirectUrl = <span >this</span>.Response.RedirectLocation;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span >if</span> (redirectUrl.Contains(<span >"ReturnUrl="</span>))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span >var</span> host = <span >HttpUtility</span>.UrlEncode(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span >"http://"</span> +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span >this</span>.Request.Url.Host +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (Request.Url.IsDefaultPort ? <span >""</span> : <span >":"</span> + Request.Url.Port));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.RedirectLocation = redirectUrl.Replace(<span >"ReturnUrl="</span>, <span >"ReturnUrl="</span> + host);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; }
}</span></span></pre>
Como podéis observar, simplemente intentamos detectar cuándo la respuesta enviada al cliente es una redirección, y si el usuario no está autenticado y existe un parámetro <code>ReturnUrl</code>, lo modificamos para que presente también el host (y puerto). De esta forma, ya llegará a la página de login la dirección completa a la que hay que enviar el usuario cuando supere la autenticación.<br></br>
<br></br>
<img alt="Ya llega la URL completa!" border="0" height="121" src="http://lh4.ggpht.com/-kC_mZOFdZkI/T5KOPzHW_6I/AAAAAAAAB_c/ve6l0BQAEQo/image14.png?imgmax=800"  title="Ya llega la URL completa!" width="626"></img><br></br>
<br></br>
Y por último, ya lo único que quedaría sería implementar la redirección a la URL suministrada en el parámetro <code>ReturnUrl</code> una vez confirmada la identidad del usuario, es decir, tras establecer la cookie. <br></br>
<br></br>
Eso sí, tened un poco de cuidado antes de redirigir y comprobad que la dirección a la que vais a enviarlo forma parte de vuestro sitio (por ejemplo, comprobando que el host de destino pertenece a <em>acme.org</em>) para <strong>evitar la vulnerabilidad </strong><a href="https://www.owasp.org/index.php/Open_redirect"><strong>Open Redirect</strong></a>.<br></br>
<br></br>
Publicado en <a href="http://www.variablenotfound.com/">Variable not found</a>.<div class="blogger-post-footer"><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/27752126-1990654797728227801?l=www.variablenotfound.com" alt=""></img></div>
<p><a href="http://feedads.g.doubleclick.net/~a/9Gv0dkeKHrOZm4g88KFAn5PiNzA/0/da"><img src="http://feedads.g.doubleclick.net/~a/9Gv0dkeKHrOZm4g88KFAn5PiNzA/0/di" border="0" ismap="true"></img></a><br></br>
<a href="http://feedads.g.doubleclick.net/~a/9Gv0dkeKHrOZm4g88KFAn5PiNzA/1/da"><img src="http://feedads.g.doubleclick.net/~a/9Gv0dkeKHrOZm4g88KFAn5PiNzA/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/vnf?a=C76u8F-ToO0:S3mwQiVm4tU:ecdYMiMMAMM"><img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=C76u8F-ToO0:S3mwQiVm4tU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=C76u8F-ToO0:S3mwQiVm4tU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=C76u8F-ToO0:S3mwQiVm4tU:4cEx4HpKnUU"><img src="http://feeds.feedburner.com/~ff/vnf?i=C76u8F-ToO0:S3mwQiVm4tU:4cEx4HpKnUU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=C76u8F-ToO0:S3mwQiVm4tU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/vnf?i=C76u8F-ToO0:S3mwQiVm4tU:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=C76u8F-ToO0:S3mwQiVm4tU:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/vnf?i=C76u8F-ToO0:S3mwQiVm4tU:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=C76u8F-ToO0:S3mwQiVm4tU:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/vnf/~4/C76u8F-ToO0" height="1" width="1"></img>]]></content:encoded>
		</item>
		<item>
		<title>Picando Código: Agenda de eventos Mayo – Montevideo</title>
		<link>http://feedproxy.google.com/~r/picandocodigo/~3/fYhevTKckmM/</link>
		<pubDate>Mon, 07 May 2012 11:00:23 +0000</pubDate>
		<dc:creator>fernando</dc:creator>
		
	<category>Eventos</category>
	<category>montevideo</category>
		<guid>http://feedproxy.google.com/~r/picandocodigo/~3/fYhevTKckmM/</guid>
		<description><![CDATA[El mes de mayo viene lleno de eventos interesantes en [...]]]></description>
			<content:encoded><![CDATA[<div
id="attachment_6670" class="wp-caption alignright" style="width: 138px"><a
href="http://picandocodigo.net/wp-content/uploads/2012/05/korganizer.png"><img
class="size-full wp-image-6670" title="Agenda" src="http://picandocodigo.net/wp-content/uploads/2012/05/korganizer.png" alt="Agenda" width="128" height="128" /></a><p
class="wp-caption-text">Agenda</p></div><p>El mes de mayo viene lleno de eventos interesantes en Montevideo, así que la agenda está bastante completita:</p><h3>Meetups</h3><p>En primer lugar tenemos esta semana el <a
href="http://picandocodigo.net/2012/invitacion-ruby-meetup-montevideo-2012/">meetup de Ruby</a>, el martes 8. Enseguida, el jueves 10 de mayo el <a
href="www.meetup.com/The-Montevideo-MySQL-Meetup-Group/events/51232452/">reunión mensual del grupo MySQL</a>. Ambos meetups se vienen con todo, con una buena concurrencia y excelentes presentaciones hasta ahora, además de buenas oportunidades para conocer gente del medio y tomar cerveza.</p><h3>Conferencia Internacional de Software Libre y Código Abierto</h3><p>Antel organiza una <a
href="http://www.avanza2012.com.uy/cisl/">conferencia internacional de Software Libre</a> con expositores interesantes. De destacar la presencia del famoso Jon &#8220;maddog&#8221; Hall.</p><h3>EduJAM!</h3><p>El viernes 11 y sábado 12 en el Complejo de las Telecomunicaciones <a
href="http://picandocodigo.net/2012/edujam-2012-montevideo-uruguay/">se realiza el eduJAM</a>. Sigan el enlace por más información, pero básicamente: El principal objetivo del encuentro es fortalecer la comunidad de desarrolladores de software educativo libre, especialmente en América del Sur pero también con el objetivo de incrementar los esfuerzos de colaboración con el resto del mundo.</p><h3>Montevideo Comics</h3><p>El fin de semana del 19 y 20 de mayo se realiza la edición del décimo aniversario de <a
href="http://www.montevideocomics.com.uy/">Montevideo Comics</a> en el Complejo Cultural Plaza. En breve publico la agenda completa. Al igual que otros años, la oportunidad perfecta para ver qué está pasando en materia de cómics a nivel nacional y regional, entre otras frikadas.</p><p>Espero no haberme olvidado de nada&#8230; Mes movido Mayo <img
src='http://picandocodigo.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p> <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/picandocodigo?a=fYhevTKckmM:1su-hloGVa8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/picandocodigo?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/picandocodigo?a=fYhevTKckmM:1su-hloGVa8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/picandocodigo?i=fYhevTKckmM:1su-hloGVa8:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/picandocodigo?a=fYhevTKckmM:1su-hloGVa8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/picandocodigo?i=fYhevTKckmM:1su-hloGVa8:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/picandocodigo/~4/fYhevTKckmM" height="1" width="1"/>]]></content:encoded>
		</item>
		<item>
		<title>Variable not found: Enlaces interesantes 81</title>
		<link>http://feedproxy.google.com/~r/vnf/~3/1ejcICTDvZI/enlaces-interesantes-81.html</link>
		<pubDate>Mon, 07 May 2012 07:32:00 +0000</pubDate>
		<dc:creator>José M. Aguilar</dc:creator>
		
	<category>enlaces</category>
		<guid>http://feedproxy.google.com/~r/vnf/~3/1ejcICTDvZI/enlaces-interesantes-81.html</guid>
		<description><![CDATA[Estos son los enlaces publicados en Variable not found en Facebook y Twitter del 30 de abril al 6 de mayo de 2012. Espero que os resulten interesantes :-)


.Net

C#/.NET Little Wonders: The Enumerable.Repeat() Static Method       James Michael Hare 
M...]]></description>
			<content:encoded><![CDATA[<a href="http://lh3.ggpht.com/-PUgIXLCKpAk/T6UUVcvgHxI/AAAAAAAACBQ/kcxMakCUCEk/s1600-h/image7_thumb_thumb_thumb_thumb_thumb%25255B1%25255D.png"><img align="right" alt="image7_thumb_thumb_thumb_thumb_thumb" border="0" height="129" src="http://lh6.ggpht.com/-wSgNo0uryZM/T6UUWe0nFBI/AAAAAAAACBY/oYAIhmzgNtk/image7_thumb_thumb_thumb_thumb_thumb%25255B2%25255D.png?imgmax=800"  title="image7_thumb_thumb_thumb_thumb_thumb" width="172"></img></a>Estos son los enlaces publicados en <a href="http://www.facebook.com/variablenotfound">Variable not found en Facebook</a> y <a href="http://twitter.com/jmaguilar">Twitter</a> del 30 de abril al 6 de mayo de 2012. Espero que os resulten interesantes :-)<br></br>
<h4>

.Net</h4>
<ul>
<li><a href="http://blackrabbitcoder.net/archive/2012/05/03/c.net-little-wonders-the-enumerable.repeat-static-method.aspx"><strong>C#/.NET Little Wonders: The Enumerable.Repeat() Static Method</strong></a>       <br></br>James Michael Hare </li>
<li><strong><a href="http://msmvps.com/blogs/jon_skeet/archive/2012/05/02/more-fun-with-datetime.aspx">More fun with DateTime</a></strong>       <br></br>Jon Skeet </li>
<li><strong><a href="http://blog.pluralsight.com/2012/05/01/idisposable-for-dummies-1-why-what/">IDisposable for Dummies #1 – Why? What?</a></strong>       <br></br>Paul Ballard </li>
<li><strong><a href="http://geeks.ms/blogs/etomas/archive/2012/05/02/c-b-225-sico-m-233-todos-con-par-225-metros-variables.aspx">[C# Básico] Métodos con parámetros variables</a></strong>       <br></br>Eduard Tomás </li>
<li><a href="http://blackrabbitcoder.net/archive/2012/04/26/c.net-little-wonders-the-enumerable.range-static-method.aspx"><strong>C#/.NET Little Wonders: The Enumerable.Range() Static Method</strong></a>       <br></br>James Michael Hare<a name="more"></a> </li>
</ul>
<h4>

Asp.net</h4>
<ul>
<li><strong><a href="http://blog.gauffin.org/2012/05/griffin-mvccontrib-the-plugin-system/">Griffin.MvcContrib – The plugin system</a></strong>       <br></br>Jonas Gauffin </li>
<li><strong><a href="http://smarrerof.blogspot.com.es/2012/05/aspnet-mvc4-validando-que-un-campo-sea.html">ASP.NET MVC4 Validando que un campo sea true o checked</a></strong>       <br></br>Sergio Marrero </li>
<li><strong><a href="http://weblogs.asp.net/davidfowler/archive/2012/05/02/signalr-0-5.aspx">SignalR 0.5</a></strong>       <br></br>David Fowler </li>
<li><a href="http://www.geoffhudik.com/tech/2012/4/21/aspnet-mvc-4-nunit-template.html" title="ASP.NET MVC 4 NUnit template"><strong>ASP.NET MVC 4 NUnit template</strong></a>       <br></br>Geoff Hudik </li>
<li><strong><a href="http://www.codeproject.com/Articles/207797/Learn-MVC-Model-view-controller-Step-by-Step-in-7">Learn MVC (Model view controller) Step by Step in 7 days – Day 1</a></strong>       <br></br>Shivprasad Koirala </li>
<li><a href="http://michaelcrump.net/a-xaml-guy-digs-into-asp-net-mvc4-part-1-of" title="A XAML Guy digs into ASP.NET MVC4 (Part 1 of -)"><strong>A XAML Guy digs into ASP.NET MVC4 (Part 1 of –)</strong></a>       <br></br>Michael Crump </li>
<li><strong><a href="http://www.west-wind.com/weblog/posts/2012/Apr/28/GZipDeflate-Compression-in-ASPNET-MVC">GZip/Deflate compression in ASP.NET MVC</a></strong>       <br></br>Rick Strahl </li>
<li><strong><a href="http://blogs.msdn.com/b/henrikn/archive/2012/04/27/asp-net-web-api-updates-april-27.aspx">ASP.NET Web API Updates – April 27</a></strong>       <br></br>Henrik F Nielsen </li>
<li><strong><a href="http://weblogs.asp.net/imranbaloch/archive/2012/04/28/using-razor-v2-in-asp-net-mvc-3.aspx">Using Razor V2 in ASP.NET MVC 3</a></strong>       <br></br>Imran Baloch </li>
<li><a href="http://blogs.msdn.com/b/henrikn/archive/2012/04/29/using-nightly-nuget-packages-with-asp-net-web-stack.aspx"><strong>Using Nightly ASP.NET Web Stack NuGet Packages</strong></a>       <br></br>Henrik F Nielsen </li>
<li><a href="http://aspnetwebstack.codeplex.com/discussions/353867"><strong>Nightly signed NuGet packages are available for ASP.NET MVC, WebAPI y WebPages</strong></a>       <br></br>Brad Wilson       <ul>            </ul>
</li>
</ul>
<h4>

Azure / Cloud</h4>
<ul>
<li><strong><a href="https://www.windowsazure.com/en-us/develop/net/how-to-guides/twilio-voice-and-sms-service/">How to Use Twilio for Voice and SMS Capabilities from Windows Azure</a></strong>       <br></br>Windows Azure </li>
</ul>
<h4>

Conceptos</h4>
<ul>
<li><strong><a href="http://blogs.msdn.com/b/ericlippert/archive/2012/04/30/guid-guide-part-two.aspx">GUID guide, part two</a></strong>       <br></br>Eric Lippert </li>
</ul>
<h4>

Data access</h4>
<ul>
<li><strong><a href="http://geeks.ms/blogs/phurtado/archive/2012/05/04/con-esto-cerramos-los-proxis-din-225-micos-de-ef.aspx">Con esto cerramos los proxis dinámicos de EF</a></strong>       <br></br>Pedro Hurtado </li>
<li><a href="http://codeclimber.net.nz/archive/2012/04/30/Entity-Framework-4-3-1-Migrations-and-non-English-locale.aspx"><strong>Entity Framework 4.3.1 Migrations and non English locale</strong></a>       <br></br>Simone Chiaretta </li>
</ul>
<h4>

Html/Css/Javascript</h4>
<ul>
<li><a href="http://addyosmani.com/blog/javascript-style-guides-and-beautifiers/"><strong>JavaScript Style Guides And Beautifiers</strong></a>       <br></br>Addy Osmani </li>
<li><strong><a href="http://www.impressivewebs.com/css-the-good-parts/">CSS: The Good Parts</a></strong>       <br></br>Louis Lazaris </li>
<li><strong><a href="http://www.jquery4u.com/articles/jquery-plugin-module-pattern/">A Basic jQuery Plugin using the Module Pattern</a></strong>       <br></br>Sam Deering </li>
<li><strong><a href="http://net.tutsplus.com/tutorials/javascript-ajax/closures-front-to-back/">Closures: Front to Back</a></strong>       <br></br>Brian Scaturro </li>
<li><strong><a href="http://starter.pixelgraphics.us/">Starter: jumpstart your jQuery plugins</a>         </strong>Doug Neiner </li>
<li><strong><a href="http://blogs.technet.com/b/port25/archive/2012/04/26/more-news-from-ms-open-tech-announcing-the-open-source-metro-style-theme-for-jquery-mobile.aspx">More news from MS Open Tech: announcing the open source Metro style theme for jQuery Mobile</a></strong>       <br></br>Abu Obeida       <ul>            </ul>
</li>
</ul>
<h4>

Visual Studio/Complementos/Herramientas</h4>
<ul>
<li><a href="http://msdn.microsoft.com/en-us/magazine/hh975345.aspx"><strong>Develop HTML5 Windows Phone Apps with Apache Cordova</strong></a>       <br></br>Colin Eberhardt </li>
<li><strong><a href="http://geeks.ms/blogs/lruiz/archive/2012/05/03/tip-usar-nuget-sin-tener-que-subir-los-paquetes-a-nuestro-repositorio-de-c-243-digo-fuente.aspx">[Tip] Usar NuGet sin tener que subir los paquetes a nuestro repositorio de código fuente</a></strong>       <br></br>Luis Ruiz Pavón </li>
</ul>
<h4>

Otros</h4>
<ul>
<li><strong><a href="http://dotnetslackers.com/articles/mobile/Create-Android-AngryBirds-Game-Using-WiEngine-SDK-Part-1.aspx">Create Android AngryBirds Game Using WiEngine SDK -Part 1</a></strong>       <br></br>Xianzhong Zhu </li>
<li><a href="http://jmalarcon.es/post/Comportarse-como-un-grillo.aspx" title="Comportarse como un grillo"><strong>Comportarse como un grillo</strong></a>       <br></br>José Manuel Alarcón</li>
</ul>
Y no olvidéis que podéis seguir esta información en vivo y en directo desde <a href="http://www.facebook.com/variablenotfound">Variable not found en Facebook</a>, o a través de <a href="http://twitter.com/jmaguilar">Twitter</a>.     <br></br>
<br></br>
Publicado en <a href="http://www.variablenotfound.com/">Variable not found</a><div class="blogger-post-footer"><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/27752126-4769028195108958507?l=www.variablenotfound.com" alt=""></img></div>
<p><a href="http://feedads.g.doubleclick.net/~a/Y4aM1FDrbKsAdHL74dZ8CHqsiRE/0/da"><img src="http://feedads.g.doubleclick.net/~a/Y4aM1FDrbKsAdHL74dZ8CHqsiRE/0/di" border="0" ismap="true"></img></a><br></br>
<a href="http://feedads.g.doubleclick.net/~a/Y4aM1FDrbKsAdHL74dZ8CHqsiRE/1/da"><img src="http://feedads.g.doubleclick.net/~a/Y4aM1FDrbKsAdHL74dZ8CHqsiRE/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/vnf?a=1ejcICTDvZI:9PDQ50Ro_ho:ecdYMiMMAMM"><img src="http://feeds.feedburner.com/~ff/vnf?d=ecdYMiMMAMM" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=1ejcICTDvZI:9PDQ50Ro_ho:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/vnf?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=1ejcICTDvZI:9PDQ50Ro_ho:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/vnf?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=1ejcICTDvZI:9PDQ50Ro_ho:4cEx4HpKnUU"><img src="http://feeds.feedburner.com/~ff/vnf?i=1ejcICTDvZI:9PDQ50Ro_ho:4cEx4HpKnUU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=1ejcICTDvZI:9PDQ50Ro_ho:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/vnf?i=1ejcICTDvZI:9PDQ50Ro_ho:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=1ejcICTDvZI:9PDQ50Ro_ho:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/vnf?i=1ejcICTDvZI:9PDQ50Ro_ho:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/vnf?a=1ejcICTDvZI:9PDQ50Ro_ho:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/vnf?d=I9og5sOYxJI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/vnf/~4/1ejcICTDvZI" height="1" width="1"></img>]]></content:encoded>
		</item>
		<item>
		<title>Koalite: Koalite se hace responsive</title>
		<link>http://feedproxy.google.com/~r/KoalitesBlog/~3/bzFn6VGGcuI/</link>
		<pubDate>Mon, 07 May 2012 06:07:55 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
		
	<category>Wordpress</category>
	<category>theme</category>
	<category>other</category>
	<category>ux</category>
	<category>bootstrap</category>
		<guid>http://feedproxy.google.com/~r/KoalitesBlog/~3/bzFn6VGGcuI/</guid>
		<description><![CDATA[Después de hablar sobre diseño web sensible, ha llegado el momento de ser consecuente y predicar como el ejemplo. El resultado es el nuevo aspecto del blog que (probablemente) estás viendo ahora mismo. Mi diseñadora está muy ocupada, por lo que estéticamente no es todo lo bonito que me gustaría, pero por lo menos ahora...  <a href="http://blog.koalite.com/2012/05/koalite-se-hacce-responsive/" class="more-link" title="Read Koalite se hace <em>responsive</em>">Leer más &#187;</a>
No hay posts relacionados.]]></description>
			<content:encoded><![CDATA[<p>Después de hablar sobre <a href="http://blog.koalite.com/2012/01/diseno-web-sensible-y-grids-css/" title="Diseño Web Sensible y Grids CSS" >diseño web sensible</a>, ha llegado el momento de ser consecuente y predicar como el ejemplo. El resultado es el nuevo aspecto del blog que (probablemente) estás viendo ahora mismo. Mi diseñadora está muy ocupada, por lo que estéticamente no es todo lo bonito que me gustaría, pero por lo menos ahora el 10% de visitantes que acceden desde un dispositivo móvil podrán leerlo más cómodamente. Si eres de los que me siguen a través de un lector rss o <a href="http://planetacodigo.com" >planetacodigo.com</a>, anímate a echar un vistazo al <a href="http://blog.koalite.com" >nuevo aspecto de Koalite</a>.</p>
<p>Como no soy ningún experto en PHP, ni en WordPress, ni en diseño web en general,<strong> he hecho lo único sensato que podía hacer: aprovecharme del trabajo de los que sí saben</strong>. El tema está basado en un 90% en <a href="http://320press.com/wpbs/" >WordPress Bootstrap</a>, que a su vez usa <a href="http://twitter.github.com/bootstrap/" >Bootstrap</a> y <a href="http://themble.com/bones/" >Bones</a>. Sin duda, una muestra más de lo que se puede conseguir con el código abierto <img src='http://blog.koalite.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Nunca había trasteado tanto con WordPress (y eso que casi ni he arañado la superficie), pero ha sido una experiencia entretenida y me ha servido para ver algunas cosas:</p>
<ul>
<li><strong>PHP es feo</strong>. Lo siento, seguro que hay gente a la que le encanta, pero estéticamente me resulta poco agradable, eso de poner el <code>$</code> en las variables no me gusta nada (me pasa lo mismo con Powershell) y la mezcla de PHP + HTML me resulta complicada de leer (echo de menos la limpieza de <a href="http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx" >razor</a> o <a href="http://jade-lang.com/" >jade</a>).</li>
<li><strong>Las APIs de WordPress están bastante conseguidas</strong>. Tienen un montón de puntos de extensión y están bastante bien pensadas para construir cosas a partir de ellas.</li>
<li>Me queda la sensación de que la mayoría de las páginas lanzan como el triple de consultas a la base de datos de las que son necesarias e intuyo unos <a href="http://nhprof.com/Learn/Alerts/SelectNPlusOne" ><em>select n+1</em></a> por ahí que no me gustan nada, pero como no sé mucho de WordPress a lo mejor me equivoco y, en cualquier caso, para un sitio como este me sobra.</li>
<li><a href="http://wordpress.org/extend/themes/fiver" >Fiver</a>, el tema que usaba hasta ahora, es un prodigio de minimalismo y elegancia, al menos en cuanto código. Es difícil conseguir más con tan poco.</li>
<li>Siempre, siempre, pase lo que pase, por pequeño que sea el proyecto que estés haciendo, <strong>usa algún sistema de control de código fuente</strong>. Pese a las tres tonterías que he tocado, más de una vez me ha salvado tener el proyecto en github para poder dar marcha atrás o comprobar que cambio había roto algo.</li>
<li>Cuando no sabes lo que estás haciendo, todo parece fácil hasta que se vuelve difícil. Hacía mucho que no tenía la sensación de estar <em>ñapeando</em> tanto y me siento un poco &#8220;sucio&#8221; por ello.</li>
</ul>
<p>Todavía hay bastantes cosas que no me acaban de convencer y que es posible que cambie (si es que no me acabo acostumbrando a verlas así, que también puede pasar). Sobre todo la cabecera del blog y los pies de los posts son partes que me gustan más bien poco.</p>
<p>Seguro que hay cosas que no funcionan bien y tampoco he hecho unas pruebas demasiado exhaustivas, así que si ves algo raro, sería un bonito detalle que me avisaras en los comentarios o con un email a juan(punto)hernandez(punto)arroyo(arroba)gmail(punto)com.</p>
<p>El tema está subido en github como <a href="https://github.com/jmhdez/koalite-bootstrap" >koalite-bootstrap</a>, aunque me temo que no es usable directamente para otro blog porque hay muchas cosas preparadas específicamente para éste, con sus plugins, sus imágenes y sus cosas. De todas formas, teniendo en cuenta lo mucho que me he aprovechado del trabajo de otros, lo mínimo que podía hacer era colgarlo en algún sitio por si le sirve a alguien, aunque sólo sea para echarse unas risas con las barbaridades que he podido hacer.</p>
<div class="trackable_sharing"><div class="trackable_sharing_text"><b><strong>Compartir:</strong></b></div><a href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fblog.koalite.com%2F2012%2F05%2Fkoalite-se-hacce-responsive%2F"  title="Facebook"  onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Facebook','http://blog.koalite.com/2012/05/koalite-se-hacce-responsive/']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://blog.koalite.com/wp-content/plugins/trackable-social-share-icons/buttons/1//facebook.png" alt="Facebook" width="24" height="24"></a> <a href="http://twitter.com/share?url=http%3A%2F%2Fblog.koalite.com%2F2012%2F05%2Fkoalite-se-hacce-responsive%2F&text=Koalite+se+hace+responsive"  title="Twitter"  onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Twitter','http://blog.koalite.com/2012/05/koalite-se-hacce-responsive/']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://blog.koalite.com/wp-content/plugins/trackable-social-share-icons/buttons/1//twitter.png" alt="Twitter" width="24" height="24"></a> <a href="mailto:?subject=Check%20out%20http%3A%2F%2Fblog.koalite.com%2F2012%2F05%2Fkoalite-se-hacce-responsive%2F"  title="Email" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Email','http://blog.koalite.com/2012/05/koalite-se-hacce-responsive/']); "><img align="absmiddle" src="http://blog.koalite.com/wp-content/plugins/trackable-social-share-icons/buttons/1//email.png" alt="Email" width="24" height="24"></a> <a href="http://www.linkedin.com/shareArticle?mini=true&url=http%3A%2F%2Fblog.koalite.com%2F2012%2F05%2Fkoalite-se-hacce-responsive%2F&title=http%3A%2F%2Fblog.koalite.com%2F2012%2F05%2Fkoalite-se-hacce-responsive%2F&ro=false&summary=&source="  title="Linkedin"  onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Linkedin','http://blog.koalite.com/2012/05/koalite-se-hacce-responsive/']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://blog.koalite.com/wp-content/plugins/trackable-social-share-icons/buttons/1//linkedin.png" alt="Linkedin" width="24" height="24"></a> </div><p>No hay posts relacionados.</p><img src="http://feeds.feedburner.com/~r/KoalitesBlog/~4/bzFn6VGGcuI" height="1" width="1"/>]]></content:encoded>
		</item>
		<item>
		<title>Arragonán: #Developars: Miriam Muros</title>
		<link>http://feedproxy.google.com/~r/danilat/~3/CMdHo3da7cs/</link>
		<pubDate>Sun, 06 May 2012 23:39:04 +0000</pubDate>
		<dc:creator>Dani</dc:creator>
		
	<category>Programación</category>
	<category>entrevistas</category>
		<guid>http://feedproxy.google.com/~r/danilat/~3/CMdHo3da7cs/</guid>
		<description><![CDATA[-Preséntate en unas líneas: ¿Quién eres? ¿De dónde eres? ¿Dónde trabajas?… Soy Miriam Muros (@miriammuros) y soy de Madrid. Siempre he vivido en Madrid aunque estoy deseando vivir en otros lugares. Ahora mismo dedico mi tiempo a diferentes proyectos propios. Soy freelance, desarrollando algunos proyectos propios que espero que vean pronto la luz, intento levantar [...]]]></description>
			<content:encoded><![CDATA[<p><strong>-Preséntate en unas líneas: ¿Quién eres? ¿De dónde eres? ¿Dónde trabajas?…</strong></p>
<p>Soy Miriam Muros (<a href="https://twitter.com/#!/miriammuros">@miriammuros</a>) y soy de Madrid. Siempre he vivido en Madrid aunque estoy deseando vivir en otros lugares. Ahora mismo dedico mi tiempo a diferentes proyectos propios. Soy freelance, desarrollando algunos proyectos propios que espero que vean pronto la luz, intento levantar un centro de coworking y en ocasiones hago de advisor para otros proyectos. Pero en mi curriculum están empresas como <a href="http://www.tuenti.com/">Tuenti</a> y <a href="http://www.prisa.com/">Grupo Prisa</a>.</p>
<p><strong>- ¿Desde cuando y cómo te picó el gusanillo de la informática?</strong></p>
<p>Recuerdo tener un ordenador en casa desde siempre, y estar trasteando con el. Jugar a Prince of persia y siempre perder por lo que en los ratos que me aburría lo dedicaba a otras cosas. Pero a programar y a saber que realmente este era mi campo, a los 12 años, cuando realicé mi primera web! Y desde entonces ya sabía a que me iba a dedicar en el futuro.</p>
<p><strong>- ¿Cual o cuáles son tus lenguajes de programación favoritos? ¿Razones?</strong></p>
<p>Aunque mucha gente me critique por decir esto: php. Todo el mundo se mete con el porque no es un lenguaje estructurado, y blabla, pero se olvidan de que todas las grandes empresas de internet que han triunfado prácticamente todas tenían base en php y de echo, es de lo que más se pide trabajo… por algo será! y.. aparte de php, javascript <img src='http://www.danilat.com/weblog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Soy una programadora web en toda regla!</p>
<p><strong>- ¿Y tus herramientas habituales? (frameworks, librerías, IDE/editor, sistema de control de versiones…)</strong></p>
<p>Netbeans, git, jquery, firebug, vi creo que no podría vivir sin estos cinco&#8230;</p>
<p><strong>- Recomienda alguna lectura técnica que no nos deberíamos perder.</strong></p>
<p>He de decir que no soy una gran lectora sobre todo de lecturas técnicas, me parece que no tiene mucho sentido leer un libro técnico de principio a fin, ya que realmente son manuales, y los manuales sirven para instruirte en los puntos que tu necesitas <img src='http://www.danilat.com/weblog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  pero… ya que me lo preguntáis… The pragmatic programmer</p>
<p><strong>- Añade lo que quieras.</strong></p>
<p>Invito a todas las chicas developars, a que entren en <a href="http://www.betabeers.com">BetaBeers</a>, es una reunión de programadores para hablar de programación y de proyectos que se realiza cada mes y están por casi toda España! Es muy interesante, he incluso ahora han empezado a hacer concursos de programación, y&#8230; me gustaría no ser siempre la única chica! <img src='http://www.danilat.com/weblog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
		</item>
		<item>
		<title>Arragonán: #Developars: Lucía Manescau</title>
		<link>http://feedproxy.google.com/~r/danilat/~3/lKsXYCsTlBQ/</link>
		<pubDate>Sun, 06 May 2012 23:38:50 +0000</pubDate>
		<dc:creator>Dani</dc:creator>
		
	<category>Programación</category>
	<category>entrevistas</category>
		<guid>http://feedproxy.google.com/~r/danilat/~3/lKsXYCsTlBQ/</guid>
		<description><![CDATA[- Preséntate en unas líneas: ¿Quién eres? ¿De dónde eres? ¿Dónde trabajas?&#8230; Soy Lucía Manescau García, tinerfeña de 31 años (aunque nací en Las Palmas de Gran Canaria, pero vivo en Tenerife desde los 3 añitos) e Ingeniera Superior Informática por la Universidad de La Laguna. Actualmente trabajo en GMR Canarias, una empresa pública de [...]]]></description>
			<content:encoded><![CDATA[<p><strong>- Preséntate en unas líneas: ¿Quién eres? ¿De dónde eres? ¿Dónde trabajas?&#8230;</strong></p>
<p>Soy Lucía Manescau García, tinerfeña de 31 años (aunque nací en Las Palmas de Gran Canaria, pero vivo en Tenerife desde los 3 añitos) e Ingeniera Superior Informática por la Universidad de La Laguna. Actualmente trabajo en <a href="http://www.gmrcanarias.com/">GMR Canarias</a>, una empresa pública de la Consejería de Agricultura, Ganadería, Pesca y Aguas, como analista desarrolladora en Java y jefa de proyectos.</p>
<p><strong>- ¿Desde cuando y cómo te picó el gusanillo de la informática?</strong></p>
<p>La verdad es que siempre me llamó la informática. Tengo incluso una curiosa foto a los 5 añitos frente a un ordenador, un MSX, que lo demuestra <img src='http://www.danilat.com/weblog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , y recuerdo también, pocos años después, incluso hacer mis pinitos con el DOS. Pero la decisión final de estudiar informática llegó algo tarde. Curiosamente, hasta COU (sí, soy del viejo sistema, e incluso lo digo con orgullo jeje), estaba decidida a estudiar Bellas Artes, una carrera bastante diferente, lo admito. Pero cuando en COU nos llevaron a visitar las facultades, quedé prendada por informática, y en ese último año cambié de opinión y me matriculé en informática. Aunque los primeros años fueron algo decepcionantes (me faltaba verle la parte práctica), cuando empecé a hacer la Ingeniería Superior empecé a ilusionarme más y ,una vez trabajando, me di realmente cuenta de que la decisión había sido la correcta, hasta convertirme en una apasionada de mi trabajo.</p>
<p><strong>- ¿Cual o cuáles son tus lenguajes de programación favoritos? ¿Razones?</strong></p>
<p>Sin duda alguna, Java. Realmente me encanta trabajar con ese lenguaje. Me resulta muy práctica las posibilidades que da para la estructuración de los programas, para su modularización, me resulta muy sencillo en ese lenguaje entender la abstracción (lo cual en si puede parecer una frase algo rara, pero, no se por qué, en Java lo veo más claro que en otros lenguajes),&#8230; en definitiva, me siento cómoda y más imaginativa trabajando en Java. Además, otra gran ventaja que pienso que tiene, son la cantidad de frameworks y librerías que hay en ese lenguaje, la cantidad de colaboración que permite entre desarrolladores, lo cual, en los tiempos que corren, creo que es indispensable, pues ha quedado más que claro que el sistema completamente cerrado de &#8220;yo programo mis cosas y que nadie sepa como las he hecho ni pueda trabajar sobre ellas&#8221; ya no sirve (si hasta Apple, que siempre abogó por sistemas cerrados, tuvo que dejar abierta la posibilidad de que programas de desarrolladores externos se pudieran ejecutar en sus sistemas como el IPad, sería ilógico que otras empresas o desarrolladores siguieran pensando que los sistemas cerrados tienen futuro).</p>
<p><strong>- ¿Y tus herramientas habituales? (frameworks, librerías, IDE/editor, sistema de control de versiones&#8230;)</strong></p>
<p>Como IDE soy completamente fan de Eclipse, y especificando más, de MyEclipse (que vale que tiene la desventaja de ser de pago, pero siendo sincera entre uno y otro no hay color). En cuanto a frameworks me gusta mucho Spring, porque cubre una gran cantidad de necesidades del desarrollo y lo facilita muchísimo (el uso de anotaciones con Spring, desde que empecé a utilizarlo, me pareció una verdadera gozada <img src='http://www.danilat.com/weblog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ), además de permitir una muy cómoda integración con otras herramientas como JUnit a la hora de hacer los tests unitarios (aunque en este aspecto he de confesar que hace poco, gracias a una charla de <em>Yeray Darias</em>, conocí los Specs de Scala, y me han dado muchas ganas de ahondar más en ellos, pues me ha parecido que tienen muy buena pinta ). No me gustaría terminar este apartado sin nombrar por una parte Maven, que me parece una herramienta realmente genial y completa tanto para el tratamiento de librerías, como para empaquetar, deployar o publicar librerías propias; por otra parte Git como control de versiones pues, aunque el paso de SVN a Git cuesta un poco por tener que &#8220;cambiar el chip&#8221;, la gran utilidad de poder controlar tus propios versionados, tus propias ramas, me encanta; y por último las herramientas de Atlassian (Jira, GreenHopper, Fisheye, Crucible), que pienso que facilitan muchísimo la organización de proyectos.</p>
<p><strong>- Recomienda alguna lectura técnica que no nos deberíamos perder.</strong></p>
<p>Si tuviera que recomendar alguna lectura, me decantaría por &#8220;Java Puzzlers&#8221;, quizá no tanto porque enseñe en sí, ni desde luego por ser novedoso, sino porque te hace pensar un poquito más allá de aquellas cosas con las que te enfrentas diariamente como desarrollador, y te hace plantearte si a veces no nos adentramos lo suficiente en qué está haciendo realmente nuestro código. De todas formas, lo que realmente recomendaría como lectura es Google, y con esto me refiero a búsquedas continuas, a estar pendiente de qué es lo nuevo que sale, de qué nuevas posibilidades tenemos,&#8230; Desde mi punto de vista, más importante que &#8220;una lectura obligatoria&#8221;, es no dejar de leer nunca.</p>
<p><strong>- Añade lo que quieras.</strong></p>
<p>En este apartado, en primer lugar, me gustaría darte las gracias Daniel por esta iniciativa de &#8220;developars&#8221;, porque creo que las mujeres desarrolladoras en parte somos como las meigas, &#8220;haberlas haylas&#8221;, aunque muchas veces estemos algo más escondidas, seguramente porque siendo sincera seguimos siendo minoría. Pero la pasión por la informática no tiene sexo, o la sientes o no la sientes <img src='http://www.danilat.com/weblog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Yo personalmente me siento afortunada por sentirlo, por disfrutar por mi trabajo, por que me nazca gritar un &#8220;ole, ole&#8221; mientras aplaudo cuando resuelvo un problema complejo, tengo una &#8220;idea feliz&#8221;, pruebo un nuevo framework que me sorprende gratamente o veo un gran trabajo de un compañero. Sobre todo porque hace poco tuve una temporada algo de &#8220;bajón&#8221; de la que resurgí con ganas renovadas y con más pasión que nunca. De aquí ha salido mi twitter <a href="https://twitter.com/#!/luciamanescau">@luciamanescau</a> (con el que aún me estoy peleando un poco <img src='http://www.danilat.com/weblog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ) y mi blog <a href="http://luciamanescau.blogspot.com.es/">Renacer de una informática</a>, que aunque aún esté en pañales, pues lleva poquito tiempo, espero que poco a poco vaya creciendo y madurando.</p>
]]></content:encoded>
		</item>
		<item>
		<title>Cuaderno de software: Getting Real in da cloud</title>
		<link>http://www.programania.net/diseno-de-software/getting-real-in-da-cloud/</link>
		<pubDate>Sun, 06 May 2012 08:47:51 +0000</pubDate>
		<dc:creator>David González</dc:creator>
		
	<category>DESARROLLO DE SOFTWARE</category>
	<category>DESARROLLO DE SOFTWARE</category>
	<category>DESARROLLO DE SOFTWARE</category>
	<category>DESARROLLO DE SOFTWARE</category>
	<category>DESARROLLO DE SOFTWARE</category>
	<category>DESARROLLO DE SOFTWARE</category>
	<category>DESARROLLO DE SOFTWARE</category>
	<category>DESARROLLO DE SOFTWARE</category>
	<category>integración continua</category>
	<category>DESARROLLO DE SOFTWARE</category>
	<category>DESARROLLO DE SOFTWARE</category>
	<category>DESARROLLO DE SOFTWARE</category>
	<category>DESARROLLO DE SOFTWARE</category>
	<category>DESARROLLO DE SOFTWARE</category>
	<category>DESARROLLO DE SOFTWARE</category>
	<category>DESARROLLO DE SOFTWARE</category>
		<guid>http://www.programania.net/diseno-de-software/getting-real-in-da-cloud/</guid>
		<description><![CDATA[Utilizamos hosting cloud en distintos sabores para producción, servidores virtualizados en desarrollo para poder ajustarlos a necesidades cambiantes y alguna máquina puntual dedicada para cosas muy concretas que nos lo exigen (conexión de algún hardware específico, por ejemplo), por eso creo que responder a la pregunta &#8220;¿puedes recomendarme un hosting para un proyecto Java?&#8221;, como [...]]]></description>
			<content:encoded><![CDATA[<div>Utilizamos hosting cloud en distintos sabores para producción, servidores virtualizados en desarrollo para poder ajustarlos a necesidades cambiantes y alguna máquina puntual dedicada para cosas muy concretas que nos lo exigen (conexión de algún hardware específico, por ejemplo), por eso creo que responder a la pregunta &#8220;¿puedes recomendarme un hosting para un proyecto Java?&#8221;, como me preguntaba el otro día <a href="http://twitter.com/hilgroth">Gonzalo</a> de <a href="http://www.ideable.net">Ideable</a> es muy complicado.</div>
<div>Para mi lo mas importante es como vais a afrontar la escalabilidad de vuestro servicio ya que es ahí donde podeis pillaros los dedos por una decisión incorrecta en un punto temprano del proyecto. Es muy importante hacer un análisis del nivel de escalabilidad que vertical puede necesitar vuestra aplicación o si puede ser escalable horizontalmente ad finitum (lo cual a mi parecer es muy deseable ya que la escalabilidad horizontal suele tener coste  con tendencia lineal y la vertical suele tener coste con tendencia exponencial).</div>
<div></div>
<div>¿Como realizar el análisis de como escalará el servicio que vas a alojar en ese hosting?, pongamos que es una web, puedes plantearte como afectaría a tu aplicación tener un número muy alto de visitantes al dia pero que no sean en un número simultáneo o al contrario, enfrentarte a picos puntuales de muchas visitas (como por ejemplo una web de subastas cuando se va acabando el tiempo).</div>
<div></div>
<div>Planteo mi experiencia <strong>personal</strong>:</div>
<div></div>
<div>-<a href="http://aws.amazon.com/es/ec2/">Amazon EC2</a>, es un buen servicio, dentro de las ofertas cloud posiblemente el mas económico, el principal problema es que tienes que hacerte cargo de todos los detalles, desde la creación de la máquina hasta la puesta en producción de tu producto. El soporte básico incluido en el servicio se limita a los foros, pero si quieres un soporte mas personalizado Amazon ofrece su <a href="http://aws.amazon.com/es/premiumsupport/signup/">Premium Support</a> de pago que arranca en los 49$/mes. Hay muchos y muy buenos ejemplos de empresas que funcionan utilizando Amazon EC2 y les va  muy bien, por ejemplo <a href="http://karmacracy.com/">Karmacracy</a>, en este post  <a href="http://blog.theinit.com/2011/09/14/nube-amazon-web-services-aws-y-cloud-computing/">Jordi Marti hablando de EC2 en Karmacracy</a>.</div>
<div></div>
<div>-<a href="http://www.ibercom.es/srv/srv_index.php">Ibercom</a>, ofrece un servicio cloud desde el punto de que te amplian y disminuyen potencias de máquina con facilidad pero no tiene la flexibilidad de Amazon EC2 en cuanto a la creación y borrado de máquinas. En general el soporte es bueno, ofrecen sistemas de backup de las máquinas, et cetera. Ultimamente hemos tenido un par de pérdidas de servicio por un problema relativamente trivial, pero esperamos que mejoren en ese aspecto. De cualquier modo, incluso <a href="http://www.microsiervos.com/archivo/noticias/nube-amazon-europa-caida.html">Amazon EC2 se cayó durante dias el año pasado.</a> Tienen modelos mas económicos pero como siempre a cambio de pérdida de calidad en el servicio. También ofrecen máquinas dedicadas a precios bastante buenos.</div>
<div></div>
<div>-Hosting dedicado, esto lo cuento a título personal como programania, tenemos un server en <a href="http://www.ovh.es/">OVH</a>, una máquina física para nosotros, pagamos 64€/mes y es un maquinón, pero hasta donde entiendo, la máquina es nuestra y backups, restauraciones y demás van a nuestra cuenta.</div>
<div></div>
<div>Como se ve, no existe la opción hosting definitiva (ni mucho menos), pero ahora cuento la historia de como han evolucionado nuestras máquinas en Ibercom para tener una visión de lo que podría suponer el tema de la escalabilidad. Cuando empezamos (no hace ni un año aún) nuestra infraestructura era (solo reflejo la RAM para no extenderme mas):</div>
<div></div>
<div>maquina 1 2GB/RAM</div>
<div>maquina 2 2GB/RAM</div>
<div>maquina 3 2GB/RAM</div>
<div>maquina 4 8GB/RAM</div>
<div></div>
<div>Ahora mismo estas mismas máquinas se distribuyen así:</div>
<div></div>
<div>
<div>maquina 1 3GB/RAM</div>
<div>maquina 2 3GB/RAM</div>
<div>maquina 3 2GB/RAM</div>
<div>maquina 4 6GB/RAM</div>
</div>
<div></div>
<div>La factura que pagamos es exactamente la misma porque consumimos la misma potencia de cálculo pero distribuida de otra manera, la duda que cabe es ¿que habría ocurrido de haber contratado máquinas dedicadas? y no lo digo solo por las máquinas a las que hemos aumentado la RAM sinó por la máquina a la que hemos podido permitirnos bajársela al ver que no la utilizabamos en un 100%.</div>
<p>Por lo tanto mi recomendación si creeis que vais a permanecer en el mercado y que puede que crezcais es que hagais un análisis de cuanto os costaría,  no el arrancar ahora el producto, sinó adaptaros a un éxito enorme o a no tenerlo.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/vx71QR7QN3kqzSgrj0OHQKtBxHk/0/da"><img src="http://feedads.g.doubleclick.net/~a/vx71QR7QN3kqzSgrj0OHQKtBxHk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/vx71QR7QN3kqzSgrj0OHQKtBxHk/1/da"><img src="http://feedads.g.doubleclick.net/~a/vx71QR7QN3kqzSgrj0OHQKtBxHk/1/di" border="0" ismap="true"></img></a></p>]]></content:encoded>
		</item>
		<item>
		<title>Picando Código: Invitación: Segundo Ruby Meetup Montevideo 2012</title>
		<link>http://feedproxy.google.com/~r/picandocodigo/~3/O9UgfHaUZBg/</link>
		<pubDate>Sat, 05 May 2012 17:57:29 +0000</pubDate>
		<dc:creator>fernando</dc:creator>
		
	<category>Ruby</category>
	<category>Blog</category>
	<category>Eventos</category>
	<category>Ruby Meetup</category>
		<guid>http://feedproxy.google.com/~r/picandocodigo/~3/O9UgfHaUZBg/</guid>
		<description><![CDATA[Se acerca el segundo martes de Mayo, día de Ruby [...]]]></description>
			<content:encoded><![CDATA[<div
id="attachment_6538" class="wp-caption alignright" style="width: 310px"><a
href="http://picandocodigo.net/wp-content/uploads/2012/04/ruby-meetup.jpg"><img
class="size-full wp-image-6538" title="Ruby Meetup" src="http://picandocodigo.net/wp-content/uploads/2012/04/ruby-meetup.jpg" alt="Ruby Meetup" width="300" height="225" /></a><p
class="wp-caption-text">Ruby Meetup</p></div><p>Se acerca el segundo martes de Mayo, día de <strong>Ruby Meetup</strong> en Montevideo. Vale la pena recordar que <strong>NO ES NECESARIO SABER RUBY</strong> para acercarse:</p><blockquote><p>La excusa es que entre todos nos pongamos un poco al día sobre distintas técnicas, herramientas, metodologías y lo que se nos ocurra. Aprender. Enseñar. Pero primordialmente: conocernos entre todos.</p></blockquote><p>Para este martes ya somos 18 anotados. Si están interesados en ir, <a
href="http://www.meetup.com/rubymvd/events/59310672/">anótense en la página del meetup</a>, así los contamos para la pizza y cerveza <img
src='http://picandocodigo.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><p>La vez pasada <a
title="Primer Ruby Meetup Montevideo 2012" href="http://picandocodigo.net/2012/primer-ruby-meetup-montevideo-2012/">estuvo muy buena</a>, hubo bastante gente. Esta vez parece que Marcos Albe (conocido también por ser co-organizador de los <a
href="http://www.meetup.com/The-Montevideo-MySQL-Meetup-Group/">MySQL Meetups</a>) va a dar una charla sobre optimización para ORMs en Ruby On Rails <img
src='http://picandocodigo.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /></p><p><strong>Fecha:</strong><br
/> Martes 8 de Mayo – 19:30 horas</p><p><strong>Lugar:</strong><br
/> CoworkingMVD (via <a
href="http://www.cuboxlabs.com">Cubox</a>)<br
/> Bulevar España 2529, esquina Libertad (<a
href="http://maps.google.com/maps?q=Bulevar+Espa%C3%B1a+2529+Esq.+Libertad.%2C+Montevideo">mapa</a>)</p> <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/picandocodigo?a=O9UgfHaUZBg:2qkjnleQZ8E:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/picandocodigo?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/picandocodigo?a=O9UgfHaUZBg:2qkjnleQZ8E:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/picandocodigo?i=O9UgfHaUZBg:2qkjnleQZ8E:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/picandocodigo?a=O9UgfHaUZBg:2qkjnleQZ8E:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/picandocodigo?i=O9UgfHaUZBg:2qkjnleQZ8E:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/picandocodigo/~4/O9UgfHaUZBg" height="1" width="1"/>]]></content:encoded>
		</item>
		<item>
		<title>Fetishcode: Oracle Forms Triggers y su equivalente en ADF</title>
		<link>http://fetishcode.wordpress.com/2012/05/05/oracle-forms-triggers-y-su-equivalente-en-adf/</link>
		<pubDate>Sat, 05 May 2012 09:38:37 +0000</pubDate>
		<dc:creator>fetishcode</dc:creator>
		
	<category>ADF</category>
	<category>Forms</category>
	<category>11g</category>
		<guid>http://fetishcode.wordpress.com/2012/05/05/oracle-forms-triggers-y-su-equivalente-en-adf/</guid>
		<description><![CDATA[Aqui les dejo el enlace al Apendice D de la guia de Fusion. Es una recopilacion de los metedos mas usados en Oracle Forms y su equivalente en ADF. Algo que sera muy util a todos aquellos desarrolladores que han dado el satlo a ADF. Filed under: ADF Tagged: 11g, Forms<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=fetishcode.wordpress.com&#038;blog=742058&#038;post=1356&#038;subd=fetishcode&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[A]]></content:encoded>
		</item>
		<item>
		<title>Picando Código: Reseña del Mozilla Developer Network Hack Day Montevideo 2012</title>
		<link>http://feedproxy.google.com/~r/picandocodigo/~3/sKWvp-fQxa4/</link>
		<pubDate>Fri, 04 May 2012 12:00:11 +0000</pubDate>
		<dc:creator>fernando</dc:creator>
		
	<category>Eventos</category>
	<category>Mozilla</category>
	<category>montevideo</category>
	<category>Programación Web</category>
	<category>MDN Hack Day</category>
		<guid>http://feedproxy.google.com/~r/picandocodigo/~3/sKWvp-fQxa4/</guid>
		<description><![CDATA[El martes 24 se realizó el MDN Hack Day Montevideo [...]]]></description>
			<content:encoded><![CDATA[<div
id="attachment_6586" class="wp-caption alignleft" style="width: 222px"><a
href="http://picandocodigo.net/wp-content/uploads/2012/04/afiche-mozilla.jpg"><img
class="size-medium wp-image-6586" title="Mozilla Developer Network Hack Day Montevideo 2012" src="http://picandocodigo.net/wp-content/uploads/2012/04/afiche-mozilla-212x300.jpg" alt="Mozilla Developer Network Hack Day Montevideo 2012" width="212" height="300" /></a><p
class="wp-caption-text">Mozilla Developer Network Hack Day Montevideo 2012</p></div><p>El martes 24 se realizó el <strong>MDN Hack Day Montevideo 2012</strong> en Café la diaria. El evento fue auspiciado por <a
href="http://www.mozilla.org">Mozilla</a>, <a
href="http://www.cuboxlabs.com">Cubox</a>, <a
title="la diaria" href="http://ladiaria.com.uy/">la diaria</a> y <a
title="BlueVia" href="https://bluevia.com/">BlueVia</a>.</p><p>Antes que nada, quiero aclarar que me reconozco fanboy de Mozilla, Firefox, y todo lo que hacen por la web. Podrán imaginar mi entusiasmo ante la visita de los Mozillianos y la realización de este evento. Pido disculpas si el post desborda en subjetividad <img
src='http://picandocodigo.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><p>Llegué con Diego (&#8220;el jefe&#8221;) a café la diaria bastante temprano. Cubox participó de la organización, así que estuvimos a eso de las 17:00 para llevar algunas cosas y ver en qué ayudar.</p><p>Ahí estaba <a
href="http://twitter.com/freshelectrons">Havi Hoffman</a>, a quien habíamos tenido el gusto de conocer más temprano en nuestro Coworking. Havi trabaja en <a
href="http://mozillalabs.com/">Mozilla Labs</a> y <a
href="https://webfwd.org/">WebFWD</a>, y mantiente la cuenta <a
href="http://twitter.com/mozlabs">@mozlabs</a>.</p><p>También estaba Shezmeen Prasad, Developer Events Manager de Mozilla. Ambas armando el registro y preparando todo para recibir a los asistentes. Pasados pocos minutos ya empezó a caer gente, a quienes se les recibía con stickers de Mozilla MDN y Firefox Aurora.</p><p><a
href="http://twitter.com/thunder">Dan Mills</a> fue el primer orador y dió su charla en español. El título de su charla fue <em>How to make passwords on your site a thing of the past</em>. En ella presentó una nueva iniciativa de Mozilla para la identidad de los usuarios en la web: <a
href="http://www.mozilla.org/en-US/persona/">Mozilla Persona</a>.</p><p>Este sistema se conocía anteriormente como <a
href="https://browserid.org/">BrowserID</a>, que pasó a ser ahora el nombre del protocolo de cara a los desarrolladores.</p><div
id="attachment_6639" class="wp-caption aligncenter" style="width: 310px"><a
href="http://picandocodigo.net/wp-content/uploads/2012/05/mozilla-persona.png"><img
class="size-medium wp-image-6639" title="Mozilla Persona" src="http://picandocodigo.net/wp-content/uploads/2012/05/mozilla-persona-300x184.png" alt="Mozilla Persona" width="300" height="184" /></a><p
class="wp-caption-text">Mozilla Persona</p></div><p>Es un sistema muy interesante que pretende resolver varios problemas. Desde el punto de vista de los desarrolladores, evitarles reimplementar un sistema de autenticación en sus aplicaciones. Desde el punto de vista del usuario, evitarles tener que recordar nuevos nombres de usuario, así como no depender de servicios de terceros (Twitter, Facebook Connect, Google Accounts, etc.) para iniciar sesiones en distintos sitios. Lo único que se necesita es una dirección de correo electrónico válida.</p><p>El sistema vendría implementado nativo en Firefox, y la idea es que los navegadores que quieran lo implementen. Por el momento, si no se encuentra la característica en el navegador, usa un modal por JavaScript compatible con cualquier navegador para iniciar la sesión.</p><p>Desde el punto de vista de la privacidad, no tendremos que andar pasando más nuestra información desde un servicio a otro, sin saber con qué fin se usa.</p><p>Voy a seguir con atención Mozilla Persona. Resulta muy interesante, y espero se vaya implementando en cuantas plataformas y sitios sea posible. En estos momentos pueden probar esta nueva funcionalidad en los comentarios de este blog. Instalé el plugin <a
href="http://wordpress.org/extend/plugins/browserid/">Mozilla BrowserID</a> para que se puedan dejar comentarios con Persona <img
src='http://picandocodigo.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><p>Pueden leer más al respecto en los siguientes enlaces:</p><ul><li><a
href="http://identity.mozilla.com/">Blog de identidad en Mozilla</a></li><li><a
href="https://github.com/mozilla/id-specs">La especificación de BrowserID en GitHub</a></li><li><a
href="https://wiki.mozilla.org/Persona">Persona en la Wiki de Mozilla</a></li></ul><p>La siguiente charla la dió <a
href="http://twitter.com/mixedpuppy">Shane Caraveo</a> sobre <strong>Mozilla Marketplace</strong>, un mercado de aplicaciones web. La idea es crear un ecosistema abierto para desarrolladores y consumidores, incluyendo un mercado operado por Mozilla. Está basado en estándares web como HTML5, CSS y JavaScript junto a APIs diseñados por Mozilla.</p><div
id="attachment_6644" class="wp-caption aligncenter" style="width: 225px"><a
href="http://picandocodigo.net/wp-content/uploads/2012/05/mozilla-marketplace.png"><img
class="size-full wp-image-6644" title="Mozilla Marketplace" src="http://picandocodigo.net/wp-content/uploads/2012/05/mozilla-marketplace.png" alt="Mozilla Marketplace" width="215" height="52" /></a><p
class="wp-caption-text">Mozilla Marketplace</p></div><p>Se busca evitar el desarrollo nativo para las plataformas propietarias (privativas) como son Android, iOS o Windows.  Aplicaciones HTML5 aseguran la libertad de los desarrolladores y usuarios así como la compatibilidad a lo largo de las distintas plataformas. Mozilla comparte la idea de que la web es algo universal, abierta y estándar, competitiva y mayor que cualquier proveedor.</p><p>En la presentación, Shane hizo una demostración donde ejecutaba aplicaciones web de un borrador funcional del mercado. Incluso mostró como una aplicación se instalaba desde el mercado web, y se ejecutaba como una aplicación más del sistema.</p><p>También espero que prospere esta gran iniciativa. Si bien ya existen varios mercados del estilo, cada uno es cerrado en su plataforma. Es importante ser conciente de los objetivos de cada uno, creado por empresas con fines comerciales y no por una fundación sin fines de lucro como Mozilla. Ojalá de acá a un tiempo las Apps de tecnologías estándar de Mozilla ocupen una parte importante del mercado, permitiendo el crecimiento de opciones más sanas para los desarrolladores y consumidores.</p><ul><li>En <a
href="https://wiki.mozilla.org/MozCampLATAM2012/ProposedTalks/apps">este enlace</a> de la Wiki de Mozilla pueden encontrar más información.</li><li>La presentación que dió Shane <a
href="http://dl.dropbox.com/u/9799133/mozcamp-apps-v2-es.pdf">en español</a> y <a
href="http://dl.dropbox.com/u/9799133/mozcamp-apps-v2-en.pdf">en inglés</a>.</li><li><a
href="https://www.mozilla.org/en-US/apps/">Sitio web de Mozilla Marketplace</a></li><li><a
href="https://developer.mozilla.org/en-US/apps">MDN: Mozilla Apps para desarrolladores</a></li></ul><p>La siguiente presentación estuvo a cargo de <a
href="http://twitter.com/davilagrau">Andres Leonardo Martinez Ortiz</a>. Representante de BlueVia, comentó sobre el programa para desarrolladores de BlueVia: platforma e iniciativas. BlueVia provee una serie de APIs implementadas para interactuar por ejemplo con el envío de SMS aunque no está orientado exclusivamente al mercado de móviles.</p><div
id="attachment_6648" class="wp-caption alignright" style="width: 235px"><a
href="http://picandocodigo.net/wp-content/uploads/2012/05/support-all.jpg"><img
class="size-medium wp-image-6648" title="SUPPORT ALL THE RESOLUTIONS!!1!" src="http://picandocodigo.net/wp-content/uploads/2012/05/support-all-225x300.jpg" alt="SUPPORT ALL THE RESOLUTIONS!!1!" width="225" height="300" /></a><p
class="wp-caption-text">SUPPORT ALL THE RESOLUTIONS!!1!</p></div><p>La cuarta charla de la noche estuvo a cargo de <a
href="http://mcdlr.com">Nicolás Barrera</a>, colega cuboxer conocido en Internet como <a
href="http://twitter.com/DrummerHead">DrummerHead</a>. Drummer es diseñador de aplicaciones y desarrollador front-end en Cubox, y nos habló sobre <em>Diseño Web Responsivo</em>.</p><p>El DWR (como lo voy a llamar en lo que queda de este post) se adapta a la pantalla del usuario, sin importar el tamaño o dispositivo, permitiendo una navegación y accesibilidad coherente a lo largo de las distintas formas de acceder a él (espero haberme expresado bien, no he dormido mucho&#8230;).</p><p>En la presentación explicó y demostró cómo implementar un diseño así de cero. Comentó el tag meta viewport para decirle a los navegadores móviles cómo comportarse, explica layout fluído, porcentajes a ems, y Media Queries.</p><ul><li><a
href="http://mcdlr.com/rwd/">Presentación de DWR</a></li><li><a
href="http://mcdlr.com/responsive-web-design-presentation/">Video de la presentación en Wroclaw, Polonia en Marzo de 2012.</a></li><li>Foto de DrummerHead <a
href="http://www.flickr.com/photos/freshelectrons/7140212777/">por Havi Hoffman</a>.</li></ul><p>Después de esto, fuimos invitados con unas pizzas, y hubo un breve intervalo para aprovechar a conversar, alimentarse y tomar algo en la barra del café la diaria.</p><p>A la vuelta de la comida, se dió lugar a las <strong>Lightning Talks</strong>. Las Lightning talks son charlas de unos poco minutos. Hubo un pizarrón durante todo el evento para anotar charlas que los asistentes quisieran dar.</p><div
id="attachment_6658" class="wp-caption aligncenter" style="width: 310px"><a
href="http://picandocodigo.net/wp-content/uploads/2012/05/mozilla-derby.jpg"><img
class="size-full wp-image-6658" title="Mozilla Dev Derby" src="http://picandocodigo.net/wp-content/uploads/2012/05/mozilla-derby.jpg" alt="Mozilla Dev Derby" width="300" height="198" /></a><p
class="wp-caption-text">Mozilla Dev Derby</p></div><p><a
href="https://twitter.com/tuxie_">Álvaro Mouriño</a> fue el primero en presentar, y nos habló del <a
href="https://developer.mozilla.org/en-US/demos/devderby">Mozilla Dev Derby</a>. Se trata de un concurso de Mozilla para crear demos de lo que se puede hacer con tecnologías web abiertas. Cada mes se decide un nuevo tema (actualmente hay uno de Websockets) y se eligen 3 ganadores. Los premios son un teléfono Android, un bolso para laptop y una camiseta de MDN. Álvaro ya ha participado de esta iniciativa, y <a
href="http://hacks.mozilla.org/2011/11/congrats-to-our-october-dev-derby-winners/">ganó el segundo premio</a> en el mes de Octubre de 2011.</p><p>Después pasó a hablar Evan Henshaw-Plath (&#8220;el otro jefe&#8221;), que habló sobre Software Libre. De como todo lo usamos y es muy fácil desarrollarlo y colaborar en el desarrollo de software libre. También comentó como en Cubox desarrollamos mucho software libre <img
src='http://picandocodigo.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /></p><p>El siguiente orador fui yo&#8230;</p><p>Mi charla se titula <em>La web como herramienta social</em>. Hacía mucho tiempo que no hablaba en público así que estaba un poco nervioso, pero creo que fue bastante bien. El objetivo de la charla fue intentar generar conciencia en los programadores hacia la web como herramienta de cambio social. Los 3 frentes que considero importante en esto son el Software Libre, la Web Abierta y los Datos Abiertos.</p><p>Así expliqué qué significa cada uno de estos 3 conceptos y las ventajas que trae desarrollar teniéndolos como objetivo y pilares. Me explayé más en la parte de Datos Abiertos, que es con la que vengo más involucrado desde <a
title="Qué nos dejó Desarrollando América Latina 2011" href="http://picandocodigo.net/2011/que-nos-dejo-desarrollando-america-latina-2011/">Desarrollando América Latina</a>, en parte buscando más adeptos para desarrollar en base a datos abiertos.</p><p>Para armar la presentación usé <a
href="https://github.com/schacon/showoff">ShowOff</a>, que no conocía hasta el día antes de tener que dar la charla <img
src='http://picandocodigo.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> Es algo así como un motor de presentaciones armado en una aplicación web sobre Sinatra. Está muy bueno y práctico.</p><ul><li><a
href="http://mdn-2012.heroku.com">Ver la presentación</a></li><li><a
href="https://github.com/picandocodigo/charla-mdn-2012-mvd/">Código fuente de la presentación</a></li></ul><div
id="attachment_6650" class="wp-caption alignright" style="width: 260px"><a
href="http://picandocodigo.net/wp-content/uploads/2012/05/b2g.jpg"><img
class="size-full wp-image-6650" title="Boot to Gecko" src="http://picandocodigo.net/wp-content/uploads/2012/05/b2g.jpg" alt="Boot to Gecko" width="250" height="355" /></a><p
class="wp-caption-text">Boot to Gecko</p></div><p>Para cerrar el evento, pasó a presentar <a
href="https://twitter.com/#!/robertnyman">Robert Nyman</a> con <em>JavaScript APIs &#8211; The Web is the Platform</em>. La charla arrancó bastante divertida, Robert se presentó como Sueco y comentó algunas particularidades de la gente de Suecia.</p><p>Mostró bastante código y comentó sobre nuevas tecnologías web en las que se está trabajando en Mozilla: <a
href="https://wiki.mozilla.org/Gecko:FullScreenAPI">Fullscreen API</a> (pantalla completa desde JavaScript), acceso a cámaras, <a
href="https://wiki.mozilla.org/Platform/Features/WebRTC">WebRTC</a> (capacidad de comunicación en tiempo real a través de APIs JavaScript), <a
href="https://developer.mozilla.org/en/API/Pointer_Lock_API">Pointer Lock API</a>, <a
href="https://developer.mozilla.org/en/IndexedDB">IndexedDB</a>, <a
href="http://www.w3.org/TR/battery-status/">Battery API</a>.</p><p>Otro proyecto bien interesante en el que se viene trabajando es <a
href="http://www.mozilla.org/en-US/b2g/">Boot To Gecko</a> (B2G). Es un sistema operativo completo e independiente para la web abierta.</p><p>Está formado por <em>Gaia</em> &#8211; la interfaz de usuario escrita completamente en HTML, CSS y JavaScript. Su interacción con el sistema operativo se realiza a través de Open Web APIs implementados por <em>Gecko</em>. Gecko es el runtime de aplicación, implementando los estándares abiertos para HTML, CSS y JS. El sistema operativo a mas bajo nivel se denomina <em>Gonk</em>, un kernel linux con una capa de abstracción HAL y varias bibliotecas open source.</p><p>Gonk es como una mini-distribución de linux, y es un port más al que apunta Gecko, así como hay un Gecko para OS X, y uno para Android. Al tener control sobre Gonk, B2G expone interfaces a Gecko que no son accesibles en otros sistemas. Por ejemplo el acceso a la pila de telefonía y pantalla.</p><p>También entre otras cosas hizo mención a <a
href="http://affiliates.mozilla.org/link/banner/15322"><strong>Firefox Aurora</strong></a>.</p><div
id="attachment_6655" class="wp-caption alignleft" style="width: 142px"><a
href="http://affiliates.mozilla.org/link/banner/15322"><img
class="size-full wp-image-6655 " title="Firefox Aurora" src="http://picandocodigo.net/wp-content/uploads/2012/05/firefox-aurora.png" alt="Firefox Aurora" width="132" height="143" /></a><p
class="wp-caption-text">Firefox Aurora</p></div><p>Aurora es la versión pre-beta de Firefox. En estos momentos corresponde a lo que eventualmente será Firefox 14. Desde el evento instalé Aurora en mi computadora con ArchLinux y la verdad que funciona muy bien. Noté una mejora en la reproducción de videos HTML 5, además de no haber sufrido ninguna explosión del navegador hasta ahora y en general lo siento mas rápido en todo.</p><p>También comentar que los plugins siguen funcionando de lo mas bien. Solo tuve que instalar una versión alfa de Firebug (1.10a7) porque la 1.9 no funcionaba bien.</p><p>El objetivo de este build de Firefox es tener un primer vistazo a las nuevas herramientas de desarrollo, características de seguridad y nuevas tecnologías HTML5 y web en general.</p><ul><li><a
href="http://www.slideshare.net/robnyman/javascript-apis-the-web-is-the-platform-mdn-hack-day-montevideo">Presentación de Robert en Slideshare</a></li></ul><p>Y así terminó un excelente evento de la mano de Mozilla y demás organizadores. Para mi fue un honor ser parte del evento tanto dando una charla junto a gente tan genial (que está haciendo cosas tan increíbles por el progreso de la web), como ayudando con la organización y difusión.</p><p>Quedamos todos muy contentos y agradecidos de haber tenido a los Mozillianos por estos lados, y los esperamos para una próxima visita <img
src='http://picandocodigo.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><ul><li><a
href="http://www.flickr.com/photos/freshelectrons/sets/72157629959712419/with/7140352351/">Algunas fotos de la gira por Havi</a></li></ul> <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/picandocodigo?a=sKWvp-fQxa4:eqVHzLLlj7k:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/picandocodigo?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/picandocodigo?a=sKWvp-fQxa4:eqVHzLLlj7k:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/picandocodigo?i=sKWvp-fQxa4:eqVHzLLlj7k:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/picandocodigo?a=sKWvp-fQxa4:eqVHzLLlj7k:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/picandocodigo?i=sKWvp-fQxa4:eqVHzLLlj7k:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/picandocodigo/~4/sKWvp-fQxa4" height="1" width="1"/>]]></content:encoded>
		</item>
		<item>
		<title>Koalite's blog: Dependencias binarias y dependencias de código fuente</title>
		<link>http://feedproxy.google.com/~r/KoalitesBlog/~3/f6xbRtqWIuw/</link>
		<pubDate>Thu, 03 May 2012 05:06:31 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
		
	<category>C#</category>
	<category>development</category>
	<category>dependencies</category>
		<guid>http://feedproxy.google.com/~r/KoalitesBlog/~3/f6xbRtqWIuw/</guid>
		<description><![CDATA[<script type="text/javascript">
				  (function() {
				    var po = document.createElement("script"); po.type = "text/javascript"; po.async = true;
				    po.src = "https://apis.google.com/js/plusone.js";
				    var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(po, s);
				  })();
				</script>En C#, como en cualquier lenguaje compilado, cuando llega el momento de usar una librería tenemos siempre dos opciones: Utilizar una dependencia binaria, es decir, referenciar el assembly que contiene las clases que queremos utilizar. Copiar y pegar el código de las clases que queremos utilizar en nuestro proyecto y compilarlas junto con el proyecto. [...]
<strong>Posts relacionados:</strong><ol>
<li><a href='http://blog.koalite.com/2011/08/modificar-la-configuracion-de-nhibernate-por-codigo/' rel='bookmark' title='Modificar la configuración de NHibernate por código'>Modificar la configuración de NHibernate por código</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>En C#, como en cualquier lenguaje compilado, cuando llega el momento de usar una librería tenemos siempre dos opciones:</p>
<ol>
<li>Utilizar una dependencia binaria, es decir, <strong>referenciar el <em>assembly</em></strong> que contiene las clases que queremos utilizar. </li>
<li><strong>Copiar y pegar el código</strong> de las clases que queremos utilizar en nuestro proyecto y compilarlas junto con el proyecto.</li>
</ol>
<p>Hasta hace no mucho tiempo, <strong>la primera opción parecía la forma más ortodoxa</strong> y andar copiando código de un sitio a otro podía llegar a verse como un “atajo”, algo que podías hacer pero que, en el fondo, sabías que estaba mal y que deberías convertir en una librería “de verdad” porque cuando hubiera que cambiar algo tendrías que ir proyecto a proyecto corrigiéndolo.</p>
<p><strong>Las dependencias binarias son una opción más cómoda cuando se trata de librerías grandes</strong>, porque andar copiando y pegando 400 clases es bastante incómodo, sobre todo si lo que estamos copiando está minimamente organizado y las 400 clases están repartidos en otros tantos archivos que, a su vez, se distribuyen en varias carpetas. Algunos han pensado en esto e incluso hay una herramienta, <a href="http://www.paulstovell.com/tape" >tape</a>, que permite fusionar esos 400 ficheros es un único .cs listo para añadir al proyecto, aunque el propio autor dice que no la ha probado extensivamente.</p>
<p>La segunda opción, copiar y pegar el código, es algo que, en el fondo, casi todos hemos estado haciendo continuamente. Hay algunos <strong>fragmentos de código que usamos en casi todos los proyectos</strong> pero que no llegan a tener la categoría de librerías. A veces acaban en una librería <code>utils.dll</code> o similar, pero en general suelen copiarse (y modificarse ligeramente) de un proyecto a otro. A priori, <strong>esta segunda opción puede parecer peor idea ya que estamos duplicando código</strong> en un montón de sitios, y todos sabemos que duplicar código es malo, <abbr title="Don't Repeat Yourself, No te repitas">DRY</abbr> y todas esas cosas.</p>
<p>Sin embargo, con la llegada de mejores gestores de paquetes como <a href="http://nuget.codeplex.com/" >NuGet</a>, que simplifica el proceso de copia de los ficheros implicados en el proyecto de destino, y la “moda” de los micro-frameworks (<a href="https://github.com/robconery/massive" >Massive</a>, <a href="https://github.com/grumpydev/TinyIoC" >TinyIoC</a>, etc.), que hace que los frameworks sean más  pequeños y manejables, la segunda opción empieza a ganar adeptos.</p>
<p><strong>Duplicar el código tiene sus ventajas</strong>:</p>
<ul>
<li><strong>Reduce el número de assemblies a desplegar</strong>. Aparte de mejorar algo el rendimiento, simplifica el despliegue de la aplicación y simplificar cosas es siempre bueno. Es cierto que se pueden usar herramientas como <a href="http://www.microsoft.com/en-us/download/details.aspx?id=17630" >ilmerge</a> para integrar las librerías en el proyecto, pero siempre es una complicación adicional.</li>
<li><strong>Facilita la depuración</strong>. Al incluir el código fuente en el proyecto es más sencillo depurar. Claro que puedes incluir símbolos de depuración con una librería binario, pero es mucho más sencillo depurar directamente código fuente y eso siempre funciona; con los símbolos a veces Visual Studio se pone un poco más pesado para dejarte depurar si no tienes el código fuente por ahí.</li>
<li>
<p><strong>Evita dependencias ocultas entre aplicaciones</strong>.</p>
<p>Si tenemos una librería que usamos en dos aplicaciones distintas y queremos cambiarla para añadir cosas necesarias en una de las aplicaciones, tenemos que tener cuidado para que estos cambios no afecten a la otra aplicación. Es de suponer que en un futuro la otra aplicación se actualizará a la nueva versión de la librería y no sería agradable que se rompiera. </p>
<p>Al tener el código compartido entre dos aplicaciones diferentes, estamos obligados a valorar con mucho más cuidado cada cambio que hacemos en la librería. Por supuesto tenemos la opción de hacer un fork del código inicial y tener distintas ramas de la librería por cada aplicación pero en ese caso, ¿qué ventaja tendría crear una librería común?
</p>
</li>
</ul>
<p>Viendo esto parece que sea mucho mejor, copiar y pegar el código que usar una librería compilada, pero no hay que olvidar que usar <strong>una librería compilada tiene también sus ventajas</strong>:</p>
<ul>
<li><strong>Evitamos duplicar código</strong>, por lo que cuando se produce un problema o queremos introducir una mejora, sólo tenemos que tocar en un sitio.</li>
<li>Tenemos <strong>más herramientas para controlar la visibilidad de las clases</strong> (<code>internal</code>) y eso puede ayudar tener un API más clara.</li>
<li><strong>Es más sencillo desplegar nuevas versiones</strong> porque sólo hace falta copiar una dll en lugar de varios archivos de código fuente.</li>
<li>Se <strong>reduce el tiempo de compilación</strong>.</li>
</ul>
<h3>Cuándo usar cada tipo</h3>
<p>A la hora de decidir la forma en que usamos una dependencia <strong>la primera variable a tener en cuenta es cómo se distribuye</strong>. Por ejemplo, si quieres usar NHibernate, es un bastante incómodo copiar su miles de clases en tu proyecto, así que no seas terco y usa la dll que ya te dan compilada. Si vas a usar Massive, no compiles una dll sólo para él y añádelo directamente al proyecto que contenga el código de acceso a datos.</p>
<p>En cuanto a las librerías que se mantienen internamente dentro de una organización (empresa/equipo/etc.), depende mucho del tipo de dependencia:</p>
<p>Para <strong>librerías grandes</strong>, de propósito general, en las que estés dispuesto a invertir tiempo manteniéndolas estables, compatibles hacia atrás y con una calidad elevada, merece la pena crear dependencias binarias por su facilidad a la hora de añadirlas a otros proyectos y la ventaja de poder corregir bugs para todos los proyectos que usan la librería.</p>
<p>Cuando sea algo que <em>parece</em> que es general, pero de momento <strong>sólo vas a usar en una aplicación</strong>, no crees una librería, es una pérdida de tiempo. Cuando encuentres un problema en esa aplicación, en lugar de poder corregirlo allí tienes que irte a la librería, corregirlo, generar una nueva versión y actualizarla en el proyecto de la aplicación.  Mantén el código en la aplicación y ya veremos que pasa en el futuro. <abbr title="You ain't gonna need it, No lo vas a necesitar">YAGNI</abbr>.</p>
<p>Si la librería es pequeña o está <strong>compuesta por muchas pequeñas clases de utilidad</strong>, cópiala y pégala de un sitio a otro. Es bastante probable que un mismo proyecto no necesite todos esos <em>extension methods</em> tan chulos que has creado, sino sólo una parte de ellos, y es también bastante probable que incluso parte de ellos tengan que ser ligeramente modificados para usarlos en ese proyecto. No merece la pena el esfuerzo de intentar cubrir el caso general cuando copiar/pegar/adaptar es muchas veces la opción más rentable.</p>
<h3>Conclusiones</h3>
<p>Puede parecer que hay más argumentos a favor de copiar y pegar que de crear librerías reutilizables y seguramente sea así porque realmente <strong>no hay tantas oportunidades como a nosotros nos gustaría de reutilizar el código de un proyecto a otro</strong> sin realizar ningún cambio. Más de una vez me ha pasado pensar que parte de un proyecto era “digna” de convertirse en librería para luego, con el tiempo, ver que sólo se usa en el proyecto original, complicando la corrección de fallos y la implementación de nuevas mejoras.</p>
<p>Por otra parte, <strong>hay componentes que tiene sentido convertir en librerías</strong>, bien porque son muy estables en el tiempo, muy genéricos, o tan útiles que merece la pena luchar por mantener su flexilbidad y compatibilidad. En ese caso, cuando estés seguro de que merece la pena, la opción de la librería es buena, pero <strong>no intentes crear el super framework universal, eso no suele funcionar</strong>.</p>
<div class="trackable_sharing"><div class="trackable_sharing_text"><b><br/><br/><br/>Compartir enlace:
</b></div><a href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fblog.koalite.com%2F2012%2F05%2Fdependencias-binarias-y-dependencias-de-codigo-fuente%2F"  title="Facebook"  onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Facebook','http://blog.koalite.com/2012/05/dependencias-binarias-y-dependencias-de-codigo-fuente/']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://blog.koalite.com/wp-content/plugins/trackable-social-share-icons/buttons/f2//facebook.png" alt="Facebook" width="36" height="36"></a> <a href="http://twitter.com/share?url=http%3A%2F%2Fblog.koalite.com%2F2012%2F05%2Fdependencias-binarias-y-dependencias-de-codigo-fuente%2F&text=Dependencias+binarias+y+dependencias+de+c%C3%B3digo+fuente"  title="Twitter"  onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Twitter','http://blog.koalite.com/2012/05/dependencias-binarias-y-dependencias-de-codigo-fuente/']); _trackableshare_window = window.open(this.href,'share','menubar=0,resizable=1,width=500,height=350'); _trackableshare_window.focus(); return false;"><img align="absmiddle" src="http://blog.koalite.com/wp-content/plugins/trackable-social-share-icons/buttons/f2//twitter.png" alt="Twitter" width="36" height="36"></a> <a href="mailto:?subject=Check%20out%20http%3A%2F%2Fblog.koalite.com%2F2012%2F05%2Fdependencias-binarias-y-dependencias-de-codigo-fuente%2F"  title="Email" onclick="that=this;_gaq.push(['_trackEvent','SocialSharing','Email','http://blog.koalite.com/2012/05/dependencias-binarias-y-dependencias-de-codigo-fuente/']); "><img align="absmiddle" src="http://blog.koalite.com/wp-content/plugins/trackable-social-share-icons/buttons/f2//email.png" alt="Email" width="36" height="36"></a> <br /><g:plusone annotation="none"></g:plusone></div><p><strong>Posts relacionados:</strong></p><ol>
<li><a href='http://blog.koalite.com/2011/08/modificar-la-configuracion-de-nhibernate-por-codigo/' rel='bookmark' title='Modificar la configuración de NHibernate por código'>Modificar la configuración de NHibernate por código</a></li>
</ol><img src="http://feeds.feedburner.com/~r/KoalitesBlog/~4/f6xbRtqWIuw" height="1" width="1"/>]]></content:encoded>
		</item>
		<item>
		<title>Picando Código: Actualizado UserAgent-Spy después de 2 años…</title>
		<link>http://feedproxy.google.com/~r/picandocodigo/~3/iiI1Q6JUyLw/</link>
		<pubDate>Wed, 02 May 2012 12:00:55 +0000</pubDate>
		<dc:creator>fernando</dc:creator>
		
	<category>Wordpress</category>
	<category>plugins wordpress</category>
	<category>useragent-spy</category>
		<guid>http://feedproxy.google.com/~r/picandocodigo/~3/iiI1Q6JUyLw/</guid>
		<description><![CDATA[Además de List Category Posts, también desarrollé el plugin para [...]]]></description>
			<content:encoded><![CDATA[<div
id="attachment_1298" class="wp-caption alignright" style="width: 224px"><a
href="http://picandocodigo.net/wp-content/uploads/2008/08/gnu-wordpress.png"><img
class="size-full wp-image-1298" title="WordPress" src="http://picandocodigo.net/wp-content/uploads/2008/08/gnu-wordpress.png" alt="" width="214" height="64" /></a><p
class="wp-caption-text">WordPress</p></div><p>Además de <a
href="http://picod.net/lcp"><strong>List Category Posts</strong></a>, también desarrollé el plugin para WordPress <a
href="http://wordpress.org/extend/plugins/useragent-spy/"><strong>UserAgent-Spy</strong></a>. Es el plugin que uso para mostrar los navegadores, sistemas operativos y dispositivos de los usuarios en los comentarios.</p><p>Hacía tiempo que quería retomar su desarrollo, pero siempre lo iba dejando de lado por otras cosas. Finalmente me decidí y volví a él. Tengo que admitir que me costó bastante.</p><p>En primer lugar, al igual que List Category Posts, este plugin empezó de un script super básico a crecer poco a poco. El modelo de crecimiento fue al estilo &#8220;monstruo de Frankestein&#8221;, donde iba metiéndole código por un lado y por otro para alcanzar distintas funcionalidades. El resultado final fue obviamente el esperado: <strong>¡UN MONSTRUO!</strong></p><div
id="attachment_6629" class="wp-caption alignright" style="width: 281px"><a
href="http://picandocodigo.net/wp-content/uploads/2012/05/wordpress-monster.png"><img
class="size-full wp-image-6629" title="Frankenstein WordPress" src="http://picandocodigo.net/wp-content/uploads/2012/05/wordpress-monster.png" alt="Frankenstein WordPress" width="271" height="250" /></a><p
class="wp-caption-text">Frankenstein WordPress</p></div><p>Mirar el código de hace un buen tiempo me hizo pensar que o bien he aprendido mucho en este tiempo, o era un programador horrible en ese momento. En verdad no son mutuamente excluyentes, así que puedo aceptar que ambas afirmaciones son ciertas. Si bien ahora sigo pensando que hay miles de mejoras para hacerle al código, aprolijé bastante por todos lados.</p><p>También intenté documentar un poco más. No entendía mi propio código, y tenía ganas de agarrar la máquina del tiempo, buscarme en el momento en que  escribí esas cosas, y pegarme una patada voladora atrás de la oreja.</p><p>En fin, después de un buen rato de pelea, salió a la luz <a
href="http://wordpress.org/extend/plugins/useragent-spy/changelog/"><strong>UserAgent-Spy 1.2</strong></a>. Para el usuario final hay pocos cambios:</p><ul><li>Ahora detecta dispositivos Apple, Blackberry y HTC. Al haber retomado, espero poder agregar más dispositivos e información en breve.</li><li>Detecta PCLinuxOS. Solo porque quería agregar al menos un sistema operativo más. PCLinuxOS está mencionado en los comentarios de la <a
href="http://picandocodigo.net/programacion/wordpress/useragent-spy-wordpress-plugin-espanol/#comment-16789">página del plugin</a>, así que lo agregué.</li></ul><p>Los cambios más importantes están a nivel de código, ahora se entiende un poco más. Por otro lado, voy a hacer lo mismo que hice con List Category Posts: continuar el desarrollo <a
href="https://github.com/picandocodigo/useragent-spy">en GitHub</a>.</p><p>Como plataforma para desarrollo colaborativo de software open source, GitHub es la solución ideal. Ya he recibido Pull Requests de otros usuarios en LCP, y el sistema de tickets para bugs, pedidos de nuevas características, etc. es muy bueno. Así que de ahora en más voy a llevar el desarrollo desde ahí, exportando versiones nuevas al repositorio SVN de WordPress.</p><p><strong>Comentario aparte:</strong> <em>que viejo se siente Subversion</em>.</p><p>Se sintió bastante raro ver que la última modificación al código había sido en enero del 2010. No parece haber pasado tanto tiempo. El plugin ya tiene 4 años de desarrollado, y desde entonces siempre estuvo instalado acá en Picando Código y otros de mis blogs. Por eso no me hubiera imaginado que pasaría tanto tiempo sin actualizarlo, y más importante, que volvería a meterle mano. Pero ahora que &#8220;volví a la programacíon&#8221; mi idea es no dejarlo tan abandonado nuevamente.</p><p>Si quieren ayudarme con el desarrollo del plugin, pueden usarlo, probar navegadores, sistemas operativos y dispositivos distintos que no sean detectados, e informarme. Cualquier aporte de código también es bienvenido, y esto resulta mucho mas fácil teniéndolo en GitHub. Espero tener nuevas versiones más seguido, y no que la próxima actualizarlo sea en 2014 <img
src='http://picandocodigo.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p> <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/picandocodigo?a=iiI1Q6JUyLw:OgdlbaMCquk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/picandocodigo?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/picandocodigo?a=iiI1Q6JUyLw:OgdlbaMCquk:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/picandocodigo?i=iiI1Q6JUyLw:OgdlbaMCquk:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/picandocodigo?a=iiI1Q6JUyLw:OgdlbaMCquk:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/picandocodigo?i=iiI1Q6JUyLw:OgdlbaMCquk:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/picandocodigo/~4/iiI1Q6JUyLw" height="1" width="1"/>]]></content:encoded>
		</item>
		<item>
		<title>Arragonán: #Developars: Fátima Casaú</title>
		<link>http://feedproxy.google.com/~r/danilat/~3/QyjEecIUVpY/</link>
		<pubDate>Wed, 02 May 2012 01:22:24 +0000</pubDate>
		<dc:creator>Dani</dc:creator>
		
	<category>Programación</category>
	<category>entrevistas</category>
		<guid>http://feedproxy.google.com/~r/danilat/~3/QyjEecIUVpY/</guid>
		<description><![CDATA[- Preséntate en unas líneas: ¿Quién eres? ¿De dónde eres? ¿Dónde trabajas?&#8230; Soy Fátima Casaú Pérez, extremeña, de un pueblo de Badajoz llamado Talarrubias (lo tenía que decir). Me vine a Madrid a estudiar Ingeniero Técnico en Informática y antes de terminar empecé a trabajar en Salenda, dónde continúo. En Salenda he aprendido todo lo [...]]]></description>
			<content:encoded><![CDATA[<p><strong>- Preséntate en unas líneas: ¿Quién eres? ¿De dónde eres? ¿Dónde trabajas?&#8230;</strong></p>
<p>Soy Fátima Casaú Pérez, extremeña, de un pueblo de Badajoz llamado Talarrubias (lo tenía que decir). Me vine a Madrid a estudiar Ingeniero Técnico en Informática y antes de terminar empecé a trabajar en <a href="http://www.salenda.es/">Salenda</a>, dónde continúo. En Salenda he aprendido todo lo que sé sobre desarrollo de aplicaciones web sobre la plataforma Java y sobre todo, en Groovy &#038; Grails, además de seguir de cerca el mundo del &#8220;agilismo&#8221;. Pues a eso me dedico, al desarrollo de aplicaciones web, gestiono algunos proyectos en Salenda y algo de formación.</p>
<p><strong>- ¿Desde cuando y cómo te picó el gusanillo de la informática?</strong></p>
<p>Pues&#8230; no sabría decir, desde siempre me ha llamado mucho la atención, quizá más atraída por los sistemas aunque, en la universidad, y sobre todo al empezar a trabajar me diese cuenta de que lo que realmente me gustaba era el desarrollo.</p>
<p><strong>- ¿Cual o cuáles son tus lenguajes de programación favoritos? ¿Razones?</strong></p>
<p>Pues, en un principio Java y ahora, claramente Groovy, ya que te da toda la robustez de Java pero con una sintaxis mucho más sencilla e intuitiva lo que le da una gran potencia al lenguaje.<br />
Por otro lado, JavaScript me gusta bastante por todas las posibilidades que da del lado del cliente, más cuando nos ayudamos de algunas librerías como jQuery.</p>
<p><strong>- ¿Y tus herramientas habituales? (frameworks, librerías, IDE/editor, sistema de control de versiones&#8230;)</strong></p>
<p>Cuando llego al trabajo, lo primero que hago es abrir el Chrome con el correo (Gmail), Hootsuite y Google Reader, para intentar no perderme nada, HipChat para comunicarme con todos mis compañeros, JIRA y GreenHopper para la gestión de los proyectos, y Confluence para guardar y compartir cualquier información relevante que lea o que haya que tener en cuenta para cualquier proyecto.<br />
A la hora de desarrollar utilizo el IDE Springsource Tool Suite ya que, a día de hoy, se podría decir que es el mejor, gratuito, para el desarrollo con Groovy &#038; Grails. Los frameworks y librerías, ya los he dicho, Groovy &#038; Grails con todo lo que hay por debajo, Hibernate, Spring, Java&#8230;. también con JavaScript, con librerías como jQuery, YUI,&#8230;. HTML, CSS. Como sistema de control de versiones, utilizo SVN y como servidor de CI, Bamboo. Ah! y FireBug, no podría vivir sin él.</p>
<p><strong>- Recomienda alguna lectura técnica que no nos deberíamos perder.</strong></p>
<p>Groovy in Action <img src='http://www.danilat.com/weblog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  Realmente yo leo más en blogs y twitter que en los libros.</p>
<p><strong>- Añade lo que quieras.</strong></p>
<p>Últimamente estoy muy interesada en el desarrollo de aplicaciones móviles, en HTML5 y CSS3.<br />
Suelo estar presente en todos los eventos sobre TIC que puedo. También intento asistir a algunas reuniones de grupos locales como Madrid GUG (Madrid Groovy User Group), AUG Spain (Atlassian User Group of Spain) y MadridJS. En internet, me gustaría estar más presente de lo que estoy ahora mismo, pero me podéis encontrar en twitter <a href="https://twitter.com/#!/fatimacasau">@fatimacasau</a>.</p>
<p>Por último, decir que estoy orgullosa de ser una de las pocas chicas con un perfil técnico en el mundo de la informática, aunque ojalá y fuéramos más. </p>
]]></content:encoded>
		</item>
		<item>
		<title>Arragonán: #Developars: Rosa María Orellana</title>
		<link>http://feedproxy.google.com/~r/danilat/~3/4IFeEIFm7N0/</link>
		<pubDate>Wed, 02 May 2012 01:20:04 +0000</pubDate>
		<dc:creator>Dani</dc:creator>
		
	<category>Programación</category>
	<category>entrevistas</category>
		<guid>http://feedproxy.google.com/~r/danilat/~3/4IFeEIFm7N0/</guid>
		<description><![CDATA[- Preséntate en unas líneas: ¿Quién eres? ¿De dónde eres? ¿Dónde trabajas? Hola soy Rosa María, más conocida en el mundo virtual como @assoritam, acabo de cumplir 32 años soy de Perú, co-fundadora de PyhtonPeru, linuxera, amante del software libre y organizadora de eventos relacionados a las TIC. Actualmente trabajo en El Comercio empresa más [...]]]></description>
			<content:encoded><![CDATA[<p><strong>- Preséntate en unas líneas: ¿Quién eres? ¿De dónde eres? ¿Dónde trabajas?</strong></p>
<p>Hola soy Rosa María, más conocida en el mundo virtual  como <a href="https://twitter.com/#!/assoritam">@assoritam</a>, acabo de cumplir 32 años soy de Perú, co-fundadora de <a href="http://python.pe/">PyhtonPeru</a>, linuxera, amante del software libre y organizadora de eventos relacionados a las TIC. Actualmente trabajo en <a href="http://feedproxy.google.com/~r/danilat/~3/4IFeEIFm7N0/www.elcomericio.pe">El Comercio</a> empresa más importante de medios de mi País, dentro del equipo de Plataforma Digital encargado de desarrollar todas las aplicaciones y portales de la Compañía, actualmente encargada de velar por la arquitectura de los componentes de las plataformas y crear nuevas soluciones. Estoy en mi último semestre de la carrera Computer Science en la Pontificia Universidad Católica del Perú, mi tema de tesis esta orientada a Usabilidad/UX de aplicaciones web y en mis tiempo libres aun desarrollo.</p>
<p><strong>¿Desde cuando y cómo te picó el gusanillo de la informática?</strong></p>
<p>Desde muy niña siempre me llamó la atención como funcionaban las cosas electrónicas era, de armar y desarmar cosas. Luego comencé con los juegos en mi pc 486, luego quise averiguar como se hacían estos juegos y no entendía nada de niña, hasta que terminé la escuela y decidí estudiar informática. Aprendía más matematicas y físicas que otra cosa hasta que dejé la universidad, por n razones me puse a trabjar en lo que es ventas de aplicaciones web por el 2004/2005. Desde entonces me interesó hacer mejores cosas con la web, entré como practicante a esta empresa luego tuve un par de salidas, una por irme a trabajar a mi Universidad y otra por que quise implantar mi propia empresa. Luego decidí regresar a la Universidad conociendo mucho de lo que es web. Ahora que llevo los curso y ya estoy a punto de culminar, pienso que la enseñanza es muy baja, que fuera de ella aprendí más con mi laptop, el software libre, y el mundo de la web, que cada día avanza siento que todavía va evolucionar más y quiero conocer mejores cosas. Ahora vengo investigando todo lo que es web semántica.</p>
<p><strong>- ¿Cual o cuáles son tus lenguajes de programación favoritos? ¿Razones?</strong></p>
<p>Python, me ayudó a resolver problemas sumamente rápidos y con unas cuantas lineas de código, pienso que se puede enseñar con este lenguaje, sin necesidad de traumar a los alumnos de universidad con c++ , c o java.<br />
Ruby, ahora estoy metiéndome mucho a este lenguaje, es bastante implícito de las cosas solo que cuando hay que meterle mano a las gemas de un framework es la hitoria, pero es divertido.<br />
Php, por que aún sigue siendo el lenguaje que la mayoría conoce en mi País, y bien o mal nos resulta para hacer grandes portales web en la empresa donde trabajo.</p>
<p><strong>- ¿Y tus herramientas habituales? (frameworks, librerías, IDE/editor, sistema de control de versiones…)<br />
</strong></p>
<p>Django de Python,<br />
PHP Unit<br />
IDE vim / NetBeans para Ruby y Java<br />
SVN GIT<br />
RSPEC me parece fabuloso para Testing.<br />
Firebug siempre me salva y me ayuda a entenderme con los CSS, javascript y jquerys.</p>
<p><strong>- ¿Recomienda alguna lectura técnica que no nos deberíamos perder?</strong></p>
<p><a href="http://people.csail.mit.edu/pgbovine/python/">Online Python Tutor</a> para aprender python, también <a href="http://python.org.ar/pyar/">Python Argentina</a> me parece un buen tutorial para aprender python y <a href="http://ruby.railstutorial.org/">Rails Tutorial</a> para Ruby.</p>
<p><strong>- Añade lo que quieras.</strong></p>
<p>Quiero enseñar a más niñas a querer este mundo, me gustaría vivir sólo enseñando todo lo que aprendido y seguiré aprendiendo pero sólo a chicas, por una especial razón, se que aún es difícil mostrar que podemos aportar también en este mundo del desarrollo de software.<br />
Te dejo mi blog con el último post que escribí en febrero: <a href="http://blog.pucp.edu.pe/item/152537/jugar-con-software-no-es-para-ninas">¡ Jugar con Software No es para Niñas ! </a></p>
]]></content:encoded>
		</item>
	</channel>
</rss>

