October 2008 - Artículos

Nota: Exite una nueva versión de Key Padawan publicada aquí.

enHace algún tiempo leí en el blog de Roy Osherove's Blog sobre su ShortWatcher, ahora rebautizado "Key Jedi" y me gustó mucho, lo vi especialmente util para mostrar al público de una presentación los atajos que uno iba presioanado.

Hace un par de dias pensé en crear unos videos tutoriales sobre como incrementar la productividad utilizando un mix de VS y Vim así que se hizo evidente que necesitaría una especie de keylogger visual en donde se fuesen mostrando las teclas que presionaba cuando hacia tareas complejas com Vim. Por eso, y siguiendo con la tradición nerd de nombrar cosas con palabras propias de la guerra de las galaxias, y otra tradicción de todo hispano parlante de tirarse un poco a menos que los de habla inglesa, he llamado "Key Padawan" a mi keylogger visual :) (si no sos nerd y no entendes nada, estas en el sitio equivocado).

Las features son estas:

  • Siempre está visible,
  • Se transparenta para no estorbar (tanto),
  • Todas las teclas son visualizadas, hasta los espacios, tabs, escape, en fin, todas 
  • Tiene un menú contextual para borrar el area de visualizado,
  • Presenta el logo de preguntaalexperto.net que hace las veces de link al sitio a la vez que sirve de excusa para pasar el chivo,

Cosas a mejorar:

  • Funciona en mi teclado solamente (si alguien lo quiere me lo pide o se compra uno igual).
  • El último punto es una broma con algo de cierto: funciona en teclados en español porque el mapeo entre las virtual keys y los caracteres impresos lo hice a pata. (o a mano para aquellos que no esntiendan)

 Falta:

  • En el menú debería haber una opción copiar al portapapeles y otra para switchear cuando queremos que loguee y cunado no.
  • Tengo que hacerlo más configurable.
  • Falta un abaut...

Lucas Ontivero

Subtítulo: Como implementar MetaweblogApi en tu sitio web.

Introducción

En mi sitio www.preguntaalexperto.net quisimos brindar a todos los integrantes de la comunidad la posibilidad escribir artículos y publicarlos allí. Por esto, comenzamos tomando como referencia el modelo de CodeProject: subir un html y sus adjuntos. Pero resultaba incómodo hasta para nosotros mismos publicar algo, por eso, y acostumbrados a bloguear usando Windows Live Writer, nos propusimos habilitar las publicaciones mediante esta herramienta. 

Como se hace esto de manera sencilla: http://www.preguntaalexperto.net/articles/lontivero-Windows-Live-Writer-y-Tu-sitio-de-contenidos.aspx

Lucas Ontivero

Voy a explicar aquí como hice el generador de RSS para el sitio www.preguntaalexperto.net.

El requerimiento era simple: permitir que lectores se subscribieran mediante RSS para conocer acerca de los nuevos artículos disponibles en el sitio. Es decir, queriamos lograr subscribirnos mediante un cliente como RssBandit.

Así que lo primero fue buscar es schema del xml que genera para a partir de allí generar las clases pero increiblemente o lo encontré por ninguna parte. A decir verdad sí lo encontré pero no era lo que esperaba ya que eran o demasiado complejos o demasiado simples así que:

Busqué algo parecido a lo que necesitabamos y lo encontré en el rss de CodeProject. (http://www.codeproject.com/webservices/articlerss.aspx?cat=1).

La estructura es muy simple: 

<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="2.0">
  <channel>
    <title>The Code Project Latest Articles</title>
    <link>http://www.codeproject.com</link>
    <description>Latest Articles from The Code Project</description>
    <language>en-us</language>
    <image>
      <title>The Code Project</title>
      <url>http://www.codeproject.com/images/codeproject100x30.gif</url>
      <link>http://www.codeproject.com</link>
      <width>100</width>
      <height>30</height>
      <description>The Code Project</description>
    </image>
    <copyright>Copyright © CodeProject, 1999-2008</copyright>
    <webMaster>webmaster@codeproject.com</webMaster>
    <lastBuildDate>Wed, 15 Oct 2008 15:10:00 GMT</lastBuildDate>
    <ttl>1</ttl>
    <generator>C# Hand-coded goodness</generator>

    <item>
      <title>Excel export from DatagridView</title>
      <description>A way to export data to native excel (xls) from a Datagridview with any data source</description>
      <link>http://www.codeproject.com/KB/grid/exceldatagridview.aspx</link>
      <author>kevinuni</author>
      <category>C#</category>
      <category>.NET</category>
      <category>Win32</category>
      <category>Intermediate</category>
      <pubDate>Wed, 15 Oct 2008 17:03:00 GMT</pubDate>
      <subject>Grid &amp; Data Controls</subject>
    </item>
  </channel>
</rss>

Esta es exactamente la información que yo quiero proveer!!

Ahora existen muchas posibilidades para crear este xml:

  1. Concatenando strings. La más sencilla, rápida y económica de todas. Hasta un mono puede mantener el código hecho de esta manera. Realmente, no sé por qué no lo hice así :) El tema es que es tan poco elegante que pocos que...
  2. Usando un XmlTextWriter: Más elegante e igualmente efectiva.
  3. XDocument y XElement: También es muy buena.
  4. Serializando objetos: La más costosa y rígida alternativa. Esta es la que escogí :(

 

Luego de tener el xml es necesario validarlo con http://feedvalidator.org/ el cual examina un rss y arroja todos los problemas que tiene según el estandar. Desde el tamaño de la imagen (el logotipo), el formato de las fechas, los textos y muchas cosas más.

En cuanto a las fechas es bueno saber que deben formatearse según lo indica la RFC822. Les dejo un método extensor por si les llega a hacer falta para algo. Tampoco es muy elegante pero funciona a la perfección.

public static class DateExtensions
{
	public static string ToRfc822(this DateTime dt)
	{
		string rfc822dt = dt.ToString(@"ddd, dd MMM yyyy HH:mm:ss zzzz (\U\T\C)",
		System.Globalization.DateTimeFormatInfo.InvariantInfo);
		rfc822dt = rfc822dt.Remove(rfc822dt.LastIndexOf(':'), 1);
		return rfc822dt;
	}
}

Luego de esto, hay que indicarle al browser que tenemos un rss para que muestre el iconito de modo que el usuario lo sepa. Esto se hace simplemente poniendo: 

<link href="http://www.preguntaalexperto.net/rss.aspx" title="Ultimos artículos"
	type="application/rss+xml" rel="alternate">
<link href="http://www.preguntaalexperto.net/rss.aspx?q=10masvistos" title="Los 10 artículos más vistos"
	type="application/rss+xml" rel="alternate">
<link href="http://www.preguntaalexperto.net/rss.aspx?q=10masvotados" title="Los 10 artículos mejor votados"
	type="application/rss+xml" rel="alternate">

Por último, solo me resta decir que como cada cliente RSS interpreta este xml como se le dá la gana, es bueno cumplir con todo lo que nos señala feedvalidator. Es to vale tanto si uno quiere que otros puedan usar su cliente favorito, suscribirse mediante feedburner, o lo que sea. Algo que feedvalidator no nos dice es que en el elemente <guid> (que lo exige) debe agregarsele un atributo isPemaLink="false". En síntesis, debe quedar así:

<guid isPermaLink="false">acá un guid</guid>

El guid no titne que necesariamente tener un G U I D sino que debe tener un identificador único como la url a ese post.

 

Lucas Ontivero