<rss version="2.0"><channel><title>Sgoliver .Net - Blog y Proyectos</title><link>http://www.sgoliver.net</link><description>Sgoliver .Net - Blog y Proyectos</description><lastBuildDate>09/05/2008 22:25:38</lastBuildDate><docs>http://blogs.law.harvard.edu/tech/rss</docs><generator>Sgoliver .NET RSS Generator</generator><webMaster>sgoliver.net@gmail.com</webMaster><item><title><![CDATA[Libro Proyecto FKScript (PDF)]]></title><link>http://www.sgoliver.net/noticia.aspx?idn=88</link><description><![CDATA[<p>Hace ya alg&uacute;n tiempo pormet&iacute; que publicar&iacute;a la documentaci&oacute;n del <a href="../fkscript.aspx">proyecto FKScript</a> en formato PDF para que pudiera ser descargada facilmente. El trabajo y otras ocupaciones no me han permitido hasta hace muy poco encontrar algo de tiempo para reunir y maquetar toda la informaci&oacute;n en un s&oacute;lo documento. Sin embargo, desde hoy mismo dispon&eacute;is de un primer borrador en PDF de unas 70 p&aacute;ginas para que pod&aacute;is revisarlo.</p><p>He creado una peque&ntilde;a <a href="../infofkscript.aspx">p&aacute;gina con informaci&oacute;n sobre el documento</a>, la tabla de contenidos y el cap&iacute;tulo de introducci&oacute;n para que todo el mundo sepa qu&eacute; puede esperar de este libro, tutorial o como queramos llamarlo. </p><p>Espero que este documento sea la referencia que pretend&iacute;a que fuera para todos aquellos que quer&aacute;is introduciros un poco en el desarrollo de compiladores y m&aacute;quinas virtuales, y para aquellos que quer&aacute;is aprender c&oacute;mo y en qu&eacute; medida os pueden ayudar herramientas como ANTLR durante el proceso de desarrollo.</p><p>Ni que decir tiene que si ten&eacute;is propuestas, modificaciones, ampliaciones o hab&eacute;is encontrado alg&uacute;n error en el texto o los ejemplos no dud&eacute;is en contactar conmigo a trav&eacute;s de la direcci&oacute;n de correo electr&oacute;nico que aparece en la <a href="../acercade.aspx" title="Acerca de...">informaci&oacute;n de contacto</a>. </p>]]></description><pubDate>lunes, 21 de abril de 2008</pubDate><comments>http://www.sgoliver.net/noticia.aspx?idn=88</comments></item><item><title><![CDATA[Google Code University]]></title><link>http://www.sgoliver.net/noticia.aspx?idn=87</link><description><![CDATA[<p>A trav&eacute;s de Digg, me entero de la existencia de una interesante secci&oacute;n del sitio de Google Code que no conoc&iacute;a. </p><p>Para qui&eacute;n no lo sepa <a href="http://code.google.com/" target="_blank">Google Code</a> aglutina todos los recursos relacionados con el desarrollo de software que pone Google a nuestra disposici&oacute;n. Entre estos recursos podemos encontrar documentaci&oacute;n y ejemplos de todas las <a href="http://code.google.com/more/" target="_blank">API de los servicios web de Google</a>, informaci&oacute;n sobre los programas de desarrollo creados como iniciativa de esta compa&ntilde;&iacute;a, como por ejemplo el Summer of Code, o el acceso al fant&aacute;stico <a href="http://code.google.com/hosting/" target="_blank">servicio de hosting para proyectos open source</a> de Google.</p><p>A todo esto a&ntilde;ado a partir de hoy la secci&oacute;n <a href="http://code.google.com/edu/" target="_blank">Google Code University</a> (o Google Code for Educators), que no es m&aacute;s que un repositorio de informaci&oacute;n sobre distintas tecnolog&iacute;as y disciplinas de desarrollo como AJAX, sistemas distribuidos, seguridad web o lenguajes de prop&oacute;sito general como Java, C++ o Phyton. En este sitio podemos encontrar tutoriales, presentaciones, ejemplos, e incluso videos de presentaciones en directo. </p><p>En definitiva, un recurso interesante al que al menos merece la pena echar un vistazo. </p>]]></description><pubDate>miércoles, 19 de marzo de 2008</pubDate><comments>http://www.sgoliver.net/noticia.aspx?idn=87</comments></item><item><title><![CDATA[Omea es Open Source]]></title><link>http://www.sgoliver.net/noticia.aspx?idn=86</link><description><![CDATA[<p><a href="http://www.jetbrains.com/" target="_blank">JetBrains</a>, la empresa que desarrolla el entorno de desarrollo para java <em><a href="http://www.jetbrains.com/idea/index.html" target="_blank">IntelliJ IDEA</a></em> o el fant&aacute;stico plugin de refactorizaci&oacute;n para Visual Studio <em><a href="http://www.jetbrains.com/resharper/index.html" target="_blank">ReSharper</a></em>, acaba de anunciar p&uacute;blicamente que otro de sus productos, <a href="http://www.jetbrains.com/omea/" target="_blank">Omea</a>, pasa a ser open source (publicado bajo licencia GNU GPL v2).</p><p>Omea es un gestor de informaci&oacute;n que pretende aglutinar en una &uacute;nica aplicaci&oacute;n el m&aacute;ximo de fuentes de informaci&oacute;n posibles, incluyendo email, contactos, documentos, grupos de noticias, feeds RSS, favoritos web (bookmarks), tareas o mensajer&iacute;a instantanea.</p><p>La noticia que nos interesa est&aacute; en que Omea es un producto desarrollado &iacute;ntegramente en .NET, por lo que su c&oacute;digo puede ser una buena fuente de informaci&oacute;n para todos los desarrolladores de esta plataforma.</p><p>Para m&aacute;s informaci&oacute;n pod&eacute;is acceder <a href="http://www.jetbrains.net/confluence/display/OMEA/this+link" target="_blank">a la web</a> que han habilitado con toda la informaci&oacute;n para acceder a los fuentes y las caracter&iacute;sticas del proyecto.</p>]]></description><pubDate>viernes, 14 de marzo de 2008</pubDate><comments>http://www.sgoliver.net/noticia.aspx?idn=86</comments></item><item><title><![CDATA[Nuevo libro de Bruce Eckel]]></title><link>http://www.sgoliver.net/noticia.aspx?idn=85</link><description><![CDATA[<p>Bruce Eckel, junto a Jamie King, ha publicado en su web una versi&oacute;n preliminar del nuevo libro que est&aacute;n preparando sobre las nuevas caracter&iacute;sticas de C# 3.0, centr&aacute;ndose especialmente en LINQ bajo este lenguaje. El t&iacute;tulo del libro es <em><strong>C# Query Expressions and Supporting Features in C# 3.0</strong></em>, y puede ser descargado en formato PDF de forma gratuita accediendo a <a href="http://www.mindviewinc.com/Books/CSharp/Index.php" target="_blank">su web</a>.</p><p>En cuanto al contenido del borrador, en la primera parte se tratan las nuevas caracter&iacute;sticas de C# 3.0, como los m&eacute;todos de extensi&oacute;n (extension methods), variables con asignaci&oacute;n impl&iacute;cita de tipos (implicitly-typed local variables), propiedades autom&aacute;ticas (automatic properties), inicializadores de objetos y colecciones (object and collection initializers), tipos an&oacute;nimos (anonymous types) o expresiones lambda (lambda expressions). En la segunda parte se ocupan de LINQ, desde sus caracter&iacute;sticas b&aacute;sicas hasta construcciones avanzadas. Todo ello, en la misma l&iacute;nea de otros libros anteriores, con ejercicios intercalados entre los temas y resueltos al final del libro.</p><p>Para qui&eacute;n no conozca a Bruce Eckel, tan s&oacute;lo decir que es tambi&eacute;n el autor de los libros <a href="http://www.mindview.net/Books/TIJ/" target="_blank">Thinking in Java</a> y <a href="http://mindview.net/Books/TICPP/ThinkingInCPP2e.html" target="_blank">Thinking in C++</a> (descargables tambi&eacute;n de forma gratuita desde sus webs), para m&iacute; verdaderas obras maestras de estos temas, por lo que recomiendo echar tambi&eacute;n un vistazo a este nuevo libro.  </p>]]></description><pubDate>viernes, 14 de marzo de 2008</pubDate><comments>http://www.sgoliver.net/noticia.aspx?idn=85</comments></item><item><title><![CDATA[SQLite y .NET (Parte 2)]]></title><link>http://www.sgoliver.net/noticia.aspx?idn=84</link><description><![CDATA[<p>En este segundo art&iacute;culo vamos a ver lo sencillo que resulta utilizar una base de datos SQLite en una aplicaci&oacute;n escrita en C# (ser&iacute;a an&aacute;logo para cualquier lenguaje .NET). </p><p>Lo primero que haremos ser&aacute; crear el proyecto en Visual Studio o cualquier otro IDE de desarrollo .NET y a&ntilde;adir a las referencias del proyecto el proveedor ADO.NET 2.0 para SQLite (en el <a href="noticia.aspx?idn=83">art&iacute;culo anterior</a> comentamos d&oacute;nde pod&iacute;amos conseguir este proveedor). La librer&iacute;a DLL a a&ntilde;adir como referencia, y que habr&aacute; que distribuir con nuestra aplicaci&oacute;n, ser&aacute; la denominada <font face="courier new,courier">System.Data.SQLite.DLL</font> que encontraremos dentro del fichero ZIP que descargamos. Una vez referenciado el proveedor para ADO.NET de SQLite ya podemos comenzar a escribir el c&oacute;digo de nuestra aplicaci&oacute;n. Para ello, deberemos a&ntilde;adir la directiva <font face="courier new,courier">using</font> correspondiente a la librer&iacute;a que acabamos de a&ntilde;adir:</p>
[code=C#]
using System.Data.SQLite;
[/code]
<p>A partir de este momento el c&oacute;digo necesario para acceder y gestionar nuestra base de datos SQLite ser&aacute; completamente an&aacute;logo al ya tradicional que utilizamos para el acceso a cualquier otro tipo de bases de datos, salvo que los nombres de las clases comenzar&aacute;n con el prefijo &quot;SQLite&quot;. As&iacute;, por ejemplo, tendremos a nuestra disposici&oacute;n las siguientes clases:</p>
<pre>
SQLiteConnection
SQLiteTransaction
SQLiteCommand
SQLiteParameter
SQLiteDataReader
...
</pre>
<p><strong>Conexi&oacute;n con la base de datos</strong></p><p>La conexi&oacute;n con la base de datos se realizar&aacute; mediante la clase <font face="courier new,courier">SQLiteConnection</font>. Para el caso de SQLite, el &uacute;nico par&aacute;metro obligatorio de la cadena de conexi&oacute;n ser&aacute; el nombre del fichero de datos:</p>
[code=C#]
SQLiteConnection con = 
    new SQLiteConnection("Data Source=index.bd");
[/code]
<p>Otros par&aacute;metros que pueden especificarse dentro de la cadena de conexi&oacute;n son la contrase&ntilde;a en caso de existir, el timeout por defecto para las operaciones sobre la base de datos, etc. Para ver todos los par&aacute;metros que podemos especificar en la conexi&oacute;n con la base de datos SQLite puede consultarse la ayuda proporcionada con el proveedor ADO.NET en el fichero <em>SQLite.NET.chm</em></p><p><strong>Consulta de datos</strong></p><p>Para realizar una consulta parametrizada sobre la base de datos haremos uso de las clases <font face="courier new,courier">SQLiteCommand</font>, <font face="courier new,courier">SQLiteParameter </font>y <font face="courier new,courier">SQLiteDataReader</font>. Veamos c&oacute;mo quedar&iacute;a un m&eacute;todo sencillo de consulta sobre una tabla especificando un par&aacute;metro de b&uacute;squeda:</p>
[code=C#]
public SQLiteDataReader selectClave(int clave)
{
    SQLiteConnection con = 
        new SQLiteConnection("Data Source=basedatos.bd");

    SQLiteParameter param = new SQLiteParameter();
    param.Value = clave;

    string cmdStr = 
        "SELECT campo2 FROM tabla1 WHERE campo1 = ?;";

    SQLiteCommand cmd = 
        new SQLiteCommand(cmdStr, con);

    cmd.Parameters.Add(param);

    SQLiteDataReader  reader = cmd.ExecuteReader();

    return reader;
}
[/code]
<p><strong>Inserci&oacute;n de datos</strong></p><p>La ejecuci&oacute;n de una operaci&oacute;n INSERT simple ser&aacute; an&aacute;loga a la consulta descrita en el apartado anterior, salvo que el m&eacute;todo de ejecuci&oacute;n ser&aacute; ahora <font face="courier new,courier">ExecuteNonQuery()</font> ya que no se devolver&aacute; ning&uacute;n valor:</p>
[code=C#]
public void insertClave(string campo1, int campo2)
{
    SQLiteConnection con = 
        new SQLiteConnection("Data Source=basedatos.bd");

    SQLiteParameter param1 = new SQLiteParameter();
    Param1.Value = campo1;

    SQLiteParameter param2 = new SQLiteParameter();
    Param2.Value = campo2;

    string cmdStr = 
        "INSERT INTO tabla1 (campo1, campo2) VALUES (?,?);";

    SQLiteCommand cmd = 
        new SQLiteCommand(cmdStr, con);

    cmd.Parameters.Add(param1);
    cmd.Parameters.Add(param2);

    SQLiteDataReader reader = cmd.ExecuteNonQuery();

    return reader;
}
[/code]
<p>Si en nuestra tabla existe un campo autonum&eacute;rico y queremos recuperar su valor despu&eacute;s de ejecutar la operaci&oacute;n de INSERT, tendremos que modificar la instrucci&oacute;n ejecutada para a&ntilde;adir al final una llamada a la funci&oacute;n <font face="courier new,courier">last_insert_rowid()</font> de SQLite y cambiar el m&eacute;todo de ejecuci&oacute;n por <font face="courier new,courier">ExecuteScalar()</font> para recuperar el valor devuelto:</p>
[code=C#]
string cmdStr = 
    "INSERT INTO tabla1 (campo1, campo2) VALUES (?,?);" + 
    "SELECT last_insert_rowid();";

...

int res = Convert.ToInt32(cmd.ExecuteScalar());
[/code]
<p><strong>Transacciones en SQLite</strong></p><p>Tal y como aconsejan en la ayuda del propio proveedor de ADO.NET para SQLite, en caso de ejecutar varias operaciones sobre una base de datos es recomendable hacerlas dentro de una misma transacci&oacute;n, algo que aumentar&aacute; much&iacute;simo el rendimiento de la base de datos y por tanto reducir&aacute; considerablemente el tiempo necesario para ejecutar las operaciones. Para comenzar una transacci&oacute;n bastar&aacute; con llamar al m&eacute;todo <font face="courier new,courier">BeginTransaction()</font> del objeto <font face="courier new,courier">SQLiteConnection</font> una vez creada la conexi&oacute;n, y para finalizar la transacci&oacute;n haciendo <em>COMMIT </em>o <em>ROLLBACK </em>de todas las operaciones llamaremos a los m&eacute;todos <font face="courier new,courier">Commit()</font> o <font face="courier new,courier">Rollback()</font> respectivamente:</p>
[code=C#]
SQLiteConnection con = 
    new SQLiteConnection("Data Source=basedatos.bd");

SQLiteTransaction tran = con.BeginTransaction();

...

tran.Commit();
[/code]
<p>Espero que este peque&ntilde;o tutorial de SQLite sobre .NET les sea de ayuda.</p>]]></description><pubDate>domingo, 02 de marzo de 2008</pubDate><comments>http://www.sgoliver.net/noticia.aspx?idn=84</comments></item><item><title><![CDATA[SQLite y .NET (Parte 1)]]></title><link>http://www.sgoliver.net/noticia.aspx?idn=83</link><description><![CDATA[<p>En este primer art&iacute;culo comentar&eacute; de forma general las caracter&iacute;sticas de SQLite y c&oacute;mo comenzar a crear bases de datos bajo esta plataforma.  </p><p><strong>&iquest;Qu&eacute; es SQLite?</strong></p><p>SQLite es, como indican en un art&iacute;culo de su propia web oficial, una base de datos de c&oacute;digo libre con las siguientes caracter&iacute;sticas distintivas:</p><ul><li>No necesita configuraci&oacute;n, ni tras la instalaci&oacute;n inicial ni para el posterior mantenimiento.</li><li>No utiliza servidor. Se puede utilizar embebida dentro de otra aplicaci&oacute;n o gestionar los ficheros de datos a trav&eacute;s de una peque&ntilde;a aplicaci&oacute;n de consola descargable desde su web.</li><li>Utiliza un s&oacute;lo fichero para almacenar los datos. Una base de datos de SQLite se compone de un &uacute;nico fichero que puede almacenarse en cualquier ruta de la m&aacute;quina.</li><li>Los ficheros de datos son multiplataforma. Una base de datos creada en una m&aacute;quina y sistema operativo concreto puede copiarse y utilizarse bajo cualquier otra plataforma.</li><li>Es muy compacta. La librer&iacute;a que se integra con otras aplicaciones ocupa unos 200 KBytes.</li><li>Utiliza tipado din&aacute;mico (Manifest Typing). SQLite permite almacenar cualquier valor de cualquier tipo en cualquier registro de una tabla de la base de datos, independientemente del tipo declarado al crear la tabla.</li><li>Utiliza registros de longitud variable. Cada dato almacenado en la base de datos ocupar&aacute; su tama&ntilde;o real y no el reservado seg&uacute;n su tipo.</li></ul><p>A estas caracter&iacute;sticas me gustar&iacute;a a&ntilde;adir un par m&aacute;s que me parecen interesantes:</p><ul><li>Proporciona un muy buen rendimiento, muy por encima de bases de datos como Access.</li><li>Se integra muy f&aacute;cilmente con aplicaciones .NET ya que existe su proveedor ADO.NET 2.0, tambi&eacute;n de c&oacute;digo libre.</li></ul><p><strong>&iquest;Qu&eacute; necesitamos descargar?</strong></p><p>Para gestionar y utilizar bases de datos SQLite tan s&oacute;lo deberemos descargar la aplicaci&oacute;n de gesti&oacute;n en modo consola que nos servir&aacute; para crear el fichero de base de datos y crear todas las entidades necesarias (tablas, &iacute;ndices...), y el proveedor ADO.NET para su utilizaci&oacute;n desde nuestra aplicaci&oacute;n .NET.</p><ol><li>P&aacute;gina de <a href="http://www.sqlite.org/download.html" target="_blank">descarga de SQLite</a>.</li><li>P&aacute;gina de <a href="http://sourceforge.net/project/showfiles.php?group_id=132486" target="_blank">descarga de SQLite for ADO.NET 2.0</a>.</li></ol><strong>&iquest;C&oacute;mo crear una base de datos en SQLite?</strong><p>La base de datos se crear&aacute; mediante la aplicaci&oacute;n de consola &quot;sqlite3.exe&quot; pas&aacute;ndole como par&aacute;metro el nombre deseado para nuestra base de datos:</p>
<pre>
c:\&gt; sqlite3 basedatos.db
SQLite version 3.5.6
Enter ".help" for instructions
sqlite&gt;
</pre>
<p>Una vez iniciada la aplicaci&oacute;n se podr&aacute;n ejecutar todas las sentencias SQL necesarias para crear las tablas que queramos que formen parte de nuestra base de datos.</p> 
[code=SQL]
CREATE TABLE tabla1(
    campo1 	INTEGER PRIMARY KEY,
    campo2	TEXT,
    campo3	NUMERIC,
    campo4	INTEGER,
    campo5	REAL
);
[/code] <p>Los tipos de datos declarados al crear una tabla ser&aacute;n meramente informativos y no impedir&aacute;n que posteriormente se inserte cualquier valor de cualquier tipo en estos campos, siempre con las siguientes matizaciones:</p><ul><li>Si en un campo TEXT se inserta un valor num&eacute;rico este valor se convertir&aacute; a texto antes de ser almacenado.</li><li>Si en un campo NUMERIC se inserta un valor de tipo texto &eacute;ste se intentar&aacute; convertir a un valor num&eacute;rico entero o real antes de su almacenamiento y si no es posible la conversi&oacute;n se almacenar&aacute; directamente como texto.</li><li>Los campos de tipo INTEGER se comportan de igual forma que NUMERIC salvo que si se inserta un valor real sin decimales o un valor textual que pueda convertirse a &eacute;ste &uacute;ltimo se almacenar&aacute; como entero.</li><li>Los campos de tipo REAL se comportan de igual forma que NUMERIC salvo que se almacenar&aacute; el dato siempre como valor de tipo real.</li><li>Los campos INTEGER PRIMARY KEY servir&aacute;n para crear un campo autonum&eacute;rico o autoincremental (el campo se autoincrementa al realizar inserciones en la tabla con este campo nulo).</li></ul><p>En el siguiente art&iacute;culo veremos c&oacute;mo utilizar la base de datos creada desde una aplicaci&oacute;n desarrollada en .NET</p><p>&nbsp;</p>]]></description><pubDate>jueves, 28 de febrero de 2008</pubDate><comments>http://www.sgoliver.net/noticia.aspx?idn=83</comments></item><item><title><![CDATA[Cuando Access no da la talla]]></title><link>http://www.sgoliver.net/noticia.aspx?idn=82</link><description><![CDATA[<p>Cuando se tiene entre manos un proyecto peque&ntilde;o que necesita utilizar una base de datos para almacenar la informaci&oacute;n necesaria muchos de nosotros recurrimos a nuestra querida base de datos Microsoft Access. Esta soluci&oacute;n es perfectamente v&aacute;lida en situaciones en que las necesidades de rendimiento son de nivel medio-bajo, sobre todo teniendo en cuenta el soporte de f&aacute;brica incluido con .NET y las &quot;facilidades&quot; que ofrece su interfaz gr&aacute;fica para realizar el dise&ntilde;o del repositorio de datos.</p><p>Sin embargo, cuando necesitamos un mayor rendimiento de nuestra base de datos, ya sea en velocidad, concurrencia o cualquier otro factor que se nos ocurra, MS Access empieza a no ser tan buena soluci&oacute;n a nuestro problema.</p><p>&Eacute;ste era el caso en uno de los &uacute;ltimos proyectos en los que he estado involucrado. Nuestra aplicaci&oacute;n necesitaba realizar en un tiempo aceptable varios cientos de miles [quiz&aacute; por encima del mill&oacute;n] de inserciones en nuestra base de datos, de forma que el tiempo de ejecuci&oacute;n no se demorara por encima de unos ciertos l&iacute;mites establecidos. Tras unas pruebas iniciales Access demostr&oacute; no estar a la altura de las circunstacias sobrepasando muy por encima los tiempos que hab&iacute;amos estimado.</p><p>Hab&iacute;a que buscar soluciones, o dicho de otra forma, ten&iacute;amos que encontrar otra base de datos que nos ofreciera un mayor rendimiento en el contexto de nuestra aplicaci&oacute;n. Las alternativas planteadas inicialmente eras las cl&aacute;sicas <a href="http://www.mysql.com/" target="_blank" title="MySQL">MySQL</a> y <a href="http://www.postgresql.org/" target="_blank" title="PostgreSQL">PostgreSQL</a>. A pesar de ser buenas soluciones y cumplir nuestros requisitos, por cuestiones de distribuci&oacute;n necesit&aacute;bamos que la instalaci&oacute;n de nuestra aplicaci&oacute;n fuera lo m&aacute;s peque&ntilde;a, r&aacute;pida y directa posible, y cualquiera de estas dos soluciones implicaba la instalaci&oacute;n y configuraci&oacute;n de un servidor de base de datos, adem&aacute;s de la propia aplicaci&oacute;n en s&iacute;.</p><p>Las otras dos alternativas fueron <a href="http://www.sqlite.org/" target="_blank" title="SQLite">SQLite</a> y <a href="http://www.firebirdsql.org/" target="_blank">Firebird</a>. Tras un peque&ntilde;o an&aacute;lisis de ambas soluciones, el resultado qued&oacute; en empate t&eacute;cnico, siempre en relaci&oacute;n a nuestras necesidades espec&iacute;ficas. Ambas bases de datos ofrecen al menos un modo de funcionamiento en el que no se depende de ning&uacute;n servidor por lo que tan s&oacute;lo hay que distribuir el ficheros de datos (Firebird tambi&eacute;n puede utilizarse en modo cliente-servidor de forma an&aacute;loga a MySQL), se pueden integrar f&aacute;cilmente con aplicaciones desarrolladas en C# (realmente en cualquier lenguaje .NET) ya que existen para ambos proveedores de <a href="http://ado.net/" target="_blank">ADO.NET</a>, las librer&iacute;as necesarias para su uso dentro de nuestra aplicaci&oacute;n son bastante livianas, y cumplen sin problemas nuestros requisitos de rendimiento (en nuestras pruebas particulares con SQLite el tiempo de ejecuci&oacute;n se reduc&iacute;a en m&aacute;s del 75% en relaci&oacute;n a MS Access).</p><p>En los dos pr&oacute;ximos art&iacute;culos publicar&eacute; como podemos utilizar estas bases de datos desde nuestras aplicaciones desarrolladas en .NET</p>]]></description><pubDate>martes, 26 de febrero de 2008</pubDate><comments>http://www.sgoliver.net/noticia.aspx?idn=82</comments></item><item><title><![CDATA[Desarrollar la Máquina Virtual de FKScript]]></title><link>http://www.sgoliver.net/noticia.aspx?idn=81</link><description><![CDATA[<p>Por fin he publicado la &uacute;ltima parte del <a href="http://www.sgoliver.net/fkscript.aspx">proyecto FKScript</a>: el <a href="http://www.sgoliver.net/fksvm.aspx">desarrollo de la m&aacute;quina virtual</a>. </p><p>En breve intentar&eacute; hacer un repaso general de todo el contenido publicado para tratar de homogeneizar un poco el texto y publicar&eacute; el prometido documento descargable en PDF.</p><p>Saludos. </p>]]></description><pubDate>domingo, 23 de septiembre de 2007</pubDate><comments>http://www.sgoliver.net/noticia.aspx?idn=81</comments></item><item><title><![CDATA[Implementación del ensamblador para FKScript]]></title><link>http://www.sgoliver.net/noticia.aspx?idn=80</link><description><![CDATA[<p>Publicada una nueva secci&oacute;n en el <a href="http://www.sgoliver.net/fkscript.aspx">proyecto FKScript</a>. Una vez tratada con detalle en anteriores entregas toda la implementaci&oacute;n del compilador mediante ANTLR v3 y C#, esta vez le toca el turno al <a href="http://www.sgoliver.net/fksasm.aspx">m&oacute;dulo ensamblador</a>. </p><p>Ya tan s&oacute;lo queda por publicar el apartado dedicado a la m&aacute;quina virtual, que espero poder sacar a la luz en unos d&iacute;as.</p><p>Una vez publicado todo el material tengo tambi&eacute;n previsto reunirlo todo en un s&oacute;lo documento descargable para todos los que quer&aacute;is disponer de &eacute;l de forma offline.</p><p>Saludos.&nbsp;</p>]]></description><pubDate>domingo, 16 de septiembre de 2007</pubDate><comments>http://www.sgoliver.net/noticia.aspx?idn=80</comments></item><item><title><![CDATA[Actualización proyecto FKScript]]></title><link>http://www.sgoliver.net/noticia.aspx?idn=79</link><description><![CDATA[<p>Acabo de a&ntilde;adir a la secci&oacute;n del <a href="http://www.sgoliver.net/fkscript.aspx">proyecto FKScript</a>  dos nuevos apartados sobre <a href="http://www.sgoliver.net/fkssem.aspx">An&aacute;lisis Sem&aacute;ntico</a>  y <a href="http://www.sgoliver.net/fksgen.aspx">Generaci&oacute;n de C&oacute;digo</a>. Adem&aacute;s, he actualizado el resto de apartados para reflejar algunos cambios de &uacute;ltima hora como por ejemplo la posibilidad de realizar llamadas a funciones de una API externa o peque&ntilde;as modificaciones a la sintaxis del lenguaje de script.</p><p>Espero que os sea de utilidad.</p>]]></description><pubDate>martes, 11 de septiembre de 2007</pubDate><comments>http://www.sgoliver.net/noticia.aspx?idn=79</comments></item><item><title><![CDATA[NRtfTree 0.3.0 beta 1]]></title><link>http://www.sgoliver.net/noticia.aspx?idn=78</link><description><![CDATA[<p>Acabo de publicar la nueva <strong>versi&oacute;n 0.3.0b1</strong> de la librer&iacute;a <strong>NRtfTree</strong>. Destacar que por el momento tan s&oacute;lo se trata de una versi&oacute;n preliminar (beta) donde se han corregido algunos errores de versiones anteriores y se ha a&ntilde;adido alguna funcionalidad adicional que podr&aacute; sufrir cambios en betas posteriores. Los cambios m&aacute;s significativos son los siguientes:</p><ul><li>Cambio de licencia. A partir de esta versi&oacute;n la librer&iacute;a se distribuye bajo licencia <strong>LGPL</strong>.</li><li>Nueva clase <font face="courier new,courier">RtfDocument</font>, <font face="courier new,courier">RtfColorTable</font>, <font face="courier new,courier">RtfFontTable </font>y <font face="courier new,courier">RtfTextFormat</font>. Pretenden facilitar la creaci&oacute;n de documentos RTF desde cero, a&ntilde;adiendo f&aacute;cilmente fragmentos de texto e im&aacute;genes. En esta versi&oacute;n preliminar se ofrece s&oacute;lo un soporte b&aacute;sico para realizar estas funciones.<br /></li><li>Clase <font face="courier new,courier">RtfTree</font>:</li><ul><li>Nueva propiedad <font face="courier new,courier">MergeSpecialCharacters</font>. Activando esta propiedad, si se encuentra un caracter especial (\&#39;) &eacute;ste se convertir&aacute; a un nodo de tipo texto y se intentar&aacute; combinar con los nodos tipo texto adyacentes, de forma que se obtenga un &uacute;nico nodo.</li><li>Nueva propiedad <font face="courier new,courier">Text</font>. Devuelve el texto plano del documento.<br /></li><li>Nuevo m&eacute;todo <font face="courier new,courier">GetEncoding()</font>. Devuelve la codificaci&oacute;n utilizada en el documento.</li></ul><li>Clase <font face="courier new,courier">RtfTreeNode</font>:</li><ul><li>Nueva propiedad <font face="courier new,courier">Tree</font>. Devuelve una referencia al &aacute;rbol propietario del nodo.</li><li>Nuevo m&eacute;todo <font face="courier new,courier">ToString()</font>. Devuelve una representaci&oacute;n textual del nodo.</li><li>Nuevo m&eacute;todo <font face="courier new,courier">InsertChild()</font>. Inserta un nuevo nodo en cualquier posici&oacute;n de la lista de nodos hijos.</li><li>Se sustituyen los m&eacute;todos <font face="courier new,courier">SelectXXXByType()</font> por sobrecargas de <font face="courier new,courier">SelectXXX()</font>.</li><li>Nuevos m&eacute;todos <font face="courier new,courier">SelectSibling()</font> (+3 sobrecargas). Seleccionan nodos <em>hermanos</em>.</li></ul><li>Clase <font face="courier new,courier">RtfNodeCollection</font>:</li><ul><li>Nuevo m&eacute;todo <font face="courier new,courier">Insert()</font>. Inserta un nuevo nodo en cualquier posici&oacute;n de la colecci&oacute;n.</li><li>Nuevo m&eacute;todo <font face="courier new,courier">RemoveRange()</font>. Elimina un conjunto de nodos contiguos de la colecci&oacute;n.<br /></li></ul><li>Clase <font face="courier new,courier">InfoGroup</font>:</li><ul><li>Nuevo m&eacute;todo <font face="courier new,courier">ToString()</font>. Decuelve una representaci&oacute;n textual del nodo.</li></ul><li>Bugs corregidos:</li><ul><li>Los nodos de tipo <font face="courier new,courier">Group </font>y <font face="courier new,courier">Root </font>no se inicializaban con nin&uacute;n texto.</li><li>En ocasiones la propiedad <font face="courier new,courier">RtfTreeNode.Rtf</font> no devolv&iacute;a la &uacute;ltima llave &#39;}&#39;.</li><li>No se trataban correctamente los caracteres especiales &#39;\&#39;, &#39;{&#39; y &#39;}&#39; como parte del texto.</li><li>Cuando se a&ntilde;ade un nuevo nodo con <font face="courier new,courier">AppendChild()</font> o <font face="courier new,courier">InsertChild()</font> no se actualizaban las propiedades <font face="courier new,courier">Root </font>y <font face="courier new,courier">Tree </font>de forma recursiva.</li></ul></ul><p>Como siempre la nueva versi&oacute;n puede ser descargada desde la p&aacute;gina <a href="http://www.sgoliver.net/nrtftree.aspx">principal del proyecto</a>.</p><p>Espero comentarios sobre la nueva versi&oacute;n.&nbsp;</p>]]></description><pubDate>domingo, 02 de septiembre de 2007</pubDate><comments>http://www.sgoliver.net/noticia.aspx?idn=78</comments></item><item><title><![CDATA[Análisis Léxico y Sintáctico de FKScript]]></title><link>http://www.sgoliver.net/noticia.aspx?idn=77</link><description><![CDATA[<p>Acabo de publicar una primera versi&oacute;n del art&iacute;culo sobre el desarrollo en ANTLR v3 de los analizadores l&eacute;xico y sint&aacute;ctico para nuestro lenguaje FKScript. Pod&eacute;is acceder a &eacute;l desde la seci&oacute;n del <a href="http://www.sgoliver.net/fkscript.aspx" title="Proyecto FKScript">proyecto FKScript</a> .</p><p>Tratar&eacute; de completar este art&iacute;culo con m&aacute;s informaci&oacute;n sobre ANTLR cuando escriba el resto de art&iacute;culos del tutorial. </p>]]></description><pubDate>lunes, 02 de julio de 2007</pubDate><comments>http://www.sgoliver.net/noticia.aspx?idn=77</comments></item><item><title><![CDATA[Nueva sección FKScript]]></title><link>http://www.sgoliver.net/noticia.aspx?idn=76</link><description><![CDATA[<p>Para poder seguir m&aacute;s f&aacute;cilmente y de una forma algo m&aacute;s organizada el desarrollo del compilador, ensamblador y m&aacute;quina virtual de nuestro lenguaje de script FKScript he creado una secci&oacute;n en la web destinada &uacute;nicamente a albergar todas los art&iacute;culos dedicados al tema. Pod&eacute;is acceder a ella a trav&eacute;s de la <a href="proyectos.aspx" title="Proyectos">secci&oacute;n de proyectos</a>  o directamente a su <a href="fkscript.aspx" title="FKScript">p&aacute;gina principal</a>.</p><p>Por ahora est&aacute;n escritos los apartados de introducci&oacute;n, proceso general de desarrollo, especificaciones del lenguaje y an&aacute;lisis l&eacute;xico y sint&aacute;ctico. &Eacute;ste &uacute;ltimo se encuentra a&uacute;n en proceso, pero considero interesante ir publicando los avances a medida que voy escribiendo.</p><p>Espero que les sea de utilidad. </p>]]></description><pubDate>domingo, 24 de junio de 2007</pubDate><comments>http://www.sgoliver.net/noticia.aspx?idn=76</comments></item><item><title><![CDATA[Introducción ANTLR 3]]></title><link>http://www.sgoliver.net/noticia.aspx?idn=75</link><description><![CDATA[    <p>Tomando la definición de su propia web, ANTLR es una herramienta que proporciona
    un marco de trabajo para la construcción de reconocedores, intérpretes, compiladores
    y traductores de lenguajes a partir de gramáticas enriquecidas con acciones. En
    resumen proporciona todo lo necesario para el desarrollo de este tipo de sistemas,
    entre los más importantes:</p>
    
    <ul>
        <li>
    Construcción de analizadores léxicos.</li>
        <li>
    Construcción de analizadores sintácticos.</li>
        <li>
    Mecanismos de construcción y recorrido de árboles de sintaxis abstracta (AST).</li>
        <li>Mecanismos de tratamiento de plantillas.</li>
        <li>
    Mecanismos de detección y recuperación de errores.</li>
    </ul>
    
    <p>
        Como ventajas adicionales que diferencian a ANTLR de otras herramientas similares
        podemos citar la posibilidad de generar el código de salida en diferentes lenguajes
        como Java, C, C++, C# o Python, y el hecho de disponer de un entorno de desarrollo
        propio llamado ANTLRWorks que nos permitirá construir de una forma bastante amigable
        las gramáticas de entrada a la herramienta, proporcionando representaciones gráficas
        de las expresiones y árboles generados, e incluyendo un intérprete y depurador propio.</p>
    <p>
        Como recursos para empezar a conocer esta herramienta recomiendo los siguientes:</p>
    <p>
        <a href="http://www.antlr.org">Web principal de ANTLR</a><br />
        <a href="http://www.antlr.org/works/index.html">Web principal de ANTLRWorks</a><br />
        <a href="http://www.antlr.org/wiki/display/ANTLR3/ANTLR+3+Wiki+Home">
        Wiki de documentación</a>
        (Docs, Tutoriales, Ejemplos...)<br />
        Libro: <em><a href="http://www.pragmaticprogrammer.com/titles/tpantlr/index.html">The Definitive ANTLR Reference - Building Domain-Specific Languages</a></em></p>
    <p>
        A medida de avancemos en la construcción de nuestro sistema de scripts trataré de
        ir comentando muchas de las posibilidades que ofrece ANTLR para el desarrollo de
        cada módulo, publicando ejemplos y por supuesto los fuentes completos del sistema.</p>]]></description><pubDate>miércoles, 30 de mayo de 2007</pubDate><comments>http://www.sgoliver.net/noticia.aspx?idn=75</comments></item><item><title><![CDATA[Compiladores y Máquinas Virtuales]]></title><link>http://www.sgoliver.net/noticia.aspx?idn=74</link><description><![CDATA[<p>Despu&eacute;s de mucho tiempo <em>jugando</em> con las versiones beta de <a href="http://www.antlr.org" target="_blank"><strong>ANTLR v3</strong></a>, con la publicaci&oacute;n de su versi&oacute;n definitiva hace tan s&oacute;lo unos d&iacute;as me decid&iacute; a terminar un proyecto personal que ten&iacute;a entre manos desde hace unos meses. En &eacute;ste me surgi&oacute; la necesidad de incorporar alg&uacute;n m&eacute;todo que permitiera la ejecuci&oacute;n de peque&ntilde;os scripts para automatizar determinadas tareas. Esta situaci&oacute;n resultaba inmejorable para experimentar un poco con herramientas de generaci&oacute;n de compiladores y m&aacute;quinas virtuales, por tanto olvidando una vez m&aacute;s la regla de <em>no reinventar la rueda</em> me propuse construir desde cero todo lo necesario para conseguir la ejecuci&oacute;n de scripts en mi proyecto.</p>
<p>Dado que existe a&uacute;n poca documentaci&oacute;n sobre ANTLR 3, y mucho menos en espa&ntilde;ol, voy a publicar aqu&iacute; a modo de ejemplo todos los pasos necesarios para construir el sistema propuesto. Espero que este material pueda resultar &uacute;til para aquellos que se propongan desarrollar un sistema similar. El nuestro estar&aacute; escrito completamente en C# y estar&aacute; formado por los siguientes m&oacute;dulos:</p>
<ul>
  <li>Un <strong>compilador</strong> que transformar&aacute; el c&oacute;digo script a un lenguaje intermedio.</li>
  <li>Un <strong>ensamblador</strong> que generar&aacute; el fichero binario ejecutable a partir del c&oacute;digo intermedio.</li>
  <li>Una <strong>m&aacute;quina virtual</strong> capaz de ejecutar el fichero generado por el ensamblador. </li>
</ul>
<p>ANTLR ser&aacute; usado para construir el compilador, que estar&aacute; formado a su vez por los analizadores l&eacute;xico y sint&aacute;ctico, un analizador sem&aacute;ntico para la generaci&oacute;n y comprobaci&oacute;n de tipos, y un generador de c&oacute;digo a partir del &aacute;rbol de sint&aacute;xis abstracta (AST) construido durante las fases anteriores. Por su parte, tanto el ensamblador como la m&aacute;quina virtual se escribir&aacute;n sin utilizar ninguna herramienta de apoyo, dado que son relativamente sencillos de implementar.</p>
<p>Pretendo escribir todo esto en varias entregas y el <em>planning</em> en principio ser&aacute; el siguiente:</p>
<ol>
  <li>Introducci&oacute;n a ANTLR 3.</li>
  <li>Especificaci&oacute;n del lenguaje FKScript.</li>
  <li>Construcci&oacute;n de los analizadores l&eacute;xico y sint&aacute;ctico.</li>
  <li>Contrucci&oacute;n del analizador sem&aacute;ntico.</li>
  <li>Especificaci&oacute;n del lenguaje FKIL. </li>
  <li>Construcci&oacute;n del generador de c&oacute;digo.</li>
  <li>Implementaci&oacute;n del ensamblador.</li>
  <li>Implementaci&oacute;n de la m&aacute;quina virtual.</li>
</ol>
<p>Espero poder publicar los  primeros art&iacute;culos la semana proxima. </p>]]></description><pubDate>domingo, 27 de mayo de 2007</pubDate><comments>http://www.sgoliver.net/noticia.aspx?idn=74</comments></item><item><title><![CDATA[Traducción de NRtfTree a C++ --> CRtfTree]]></title><link>http://www.sgoliver.net/noticia.aspx?idn=73</link><description><![CDATA[<p>Ya tenemos versión en C++ para la librería <a href="nrtftree.aspx">NRtfTree</a>. Mil gracias a su autor, Nicolás Alonso, por el trabajo y por enviármela para su publicación.</p>
<p>Aún falta por implementar completamente alguna funcionalidad de la librería original, como por ejemplo los nodos especiales para el tratamiento de imágenes, pero aún así puede resultar ya muy útil para el trabajo con texto.</p>
<p>He preparado una página para publicar comentarios y descargas sobre esta librería, que podéis visitar <a href="crtftree.aspx">pulsando aquí [CRtfTree]</a>.</p>]]></description><pubDate>viernes, 19 de enero de 2007</pubDate><comments>http://www.sgoliver.net/noticia.aspx?idn=73</comments></item><item><title><![CDATA[Nueva sección JRtfTree]]></title><link>http://www.sgoliver.net/noticia.aspx?idn=72</link><description><![CDATA[<p>He añadido por fin a la web una sección específica para el proyecto <strong>JRtfTree</strong>.</p>
<p>Como ya sabéis, <strong>JRtfTree</strong> es una traducción al lenguaje Java de la librería NRtfTree.</p>
<p>He cambiado la versión a 0.1.1 tan sólo para reflejar el cambio de licencia, ahora se distribuye bajo licencia GPL, por lo que su estado continúa siendo el mismo que cuando la publiqué por primera vez, es decir, que a día de hoy está implementada toda la funcionalidad incluida con la versión 0.2 de NRtfTree, excluyendo las clases de nodos especiales para el tratamiento de imágenes y objetos.</p>
<p>Espero, a partir de ahora, poder dedicar un poco más de atención a este proyecto para tratar de alinearlo con la versión actual de NRtfTree.</p>
<p>Como siempre, podéis acceder a la sección dedicada a JRtfTree a través de la <a href="proyectos.aspx">página de proyectos</a>.</p>]]></description><pubDate>domingo, 07 de enero de 2007</pubDate><comments>http://www.sgoliver.net/noticia.aspx?idn=72</comments></item><item><title><![CDATA[Bofetada de realidad]]></title><link>http://www.sgoliver.net/noticia.aspx?idn=71</link><description><![CDATA[Paseando por <a href="http://geeks.ms/">geeks.ms</a> me encuentro con un post de <a href="http://geeks.ms/blogs/lruiz/">Luis Ruiz</a> que me ha hecho esbozar una sonrisa y que como digo en el título de la noticia representa una enorme bofetada de realidad para todos los que nos dedicamos al desarrollo de software. Triste como la vida misma.

Se llama "Cuento de navidad: El Analista" y os recomiendo que lo leáis <a href="http://geeks.ms/blogs/lruiz/archive/2007/01/03/cuento-de-navidad-el-analista.aspx">aquí</a>.

Siempre ha habido clases... :)]]></description><pubDate>jueves, 04 de enero de 2007</pubDate><comments>http://www.sgoliver.net/noticia.aspx?idn=71</comments></item><item><title><![CDATA[.NET Book Zero]]></title><link>http://www.sgoliver.net/noticia.aspx?idn=69</link><description><![CDATA[<p>En el blog de <a href="http://geeks.ms/blogs/rcorral/">Rodrigo Corral</a> en <a href="http://geeks.ms/">Geeks.ms</a> me entero de la disponibilidad de un libro gratuito publicado por Charles Petzold, autor de grandes libros sobre desarrollo sobre Windows con tecnologías Microsoft.</p>
<p>El libro en cuestión se titula <i>.NET Book Zero -  What the C or C++ Programmer Needs to Know about C# and the .NET Framework</i> y trata, como él mismo indica en el primer capítulo, sobre todos aquellos temas generales que debe conocer cualquier persona para comenzar a programar en .NET con C#, tomando como referencia conocimientos previos en C/C++.</p>
<p>Por tanto, si el inglés no os supone un problema, creo que es un buen documento de referencia para dar los primeros pasos en esta plataforma.</p>
<p>La página desde la que podéis descargar el libro en formato PDF es la siguiente: <a href="http://www.charlespetzold.com/dotnet/">http://www.charlespetzold.com/dotnet/</a></p>]]></description><pubDate>jueves, 28 de diciembre de 2006</pubDate><comments>http://www.sgoliver.net/noticia.aspx?idn=69</comments></item><item><title><![CDATA[Más noticias atrasadas]]></title><link>http://www.sgoliver.net/noticia.aspx?idn=68</link><description><![CDATA[<p>¿Qué me he perdido estos días mientras terminaba la reforma de la web? Intentemos hacer un resumen.</p> 
<p>Empecemos por Java. Casi sin dar tiempo a digerir los rumores hechos realidad de la liberación de Java como <i>open source</i> bajo licencia GPL (o casi, porque en realidad se trata de una modificación de ésta para evitar su caracter vírico, en <A HREF="http://www.javahispano.org/news.item.action?id=290091576" target="_blank">esta noticia</A> lo explican muy bien), llegó el lanzamiento de Java SE 6, que trae consigo características interesantes como el soporte para <i>scripting</i> (<A HREF="http://java.sun.com/javase/6/features.jsp" target="_blank">lista oficial de novedades</A>). Por otro lado, aunque muy relacionado con el mundo java, se ha liberado la versión 1.7.0 de <a href="http://ant.apache.org/" target="_blank">Ant</a>, herramienta indispensable para muchos de nosotros.</p>
<p>Por su parte, .NET no se queda atrás en novedades. Mientras siguen anunciándose a bombo y platillo las bondades del <a href="http://www.netfx3.com/" target="_blank">.NET Framework 3.0</a> (si alguien llega tarde a esto puede consultar la web oficial o, por ejemplo, el blog de <a href="http://davidhayden.com/blog/dave/category/58.aspx" target="_blank">David Hayden</a>, donde se pueden encontrar muchos artículos interesantes sobre esta tecnología), empezaron a aparecer nuevas versiones de muchas de sus herramientas y tecnologías derivadas. Entre ellas encontramos <a href="http://ajax.asp.net/" target="_blank">ASP.NET AJAX 1.0 RC</a>, una extensión de ASP.NET para aprovechar las ventajas que proporciona Ajax, la primera CTP de <a href="http://msdn2.microsoft.com/en-us/asp.net/bb187358.aspx" target="_blank">WPF/E</a>, una tecnología que pretender competir con Flash y que presenta de una forma bastante completa el genial <a href="http://weblogs.asp.net/scottgu/default.aspx" target="_blank">Scott Guthrie</a> en su blog (también se agradece la traducción que hace Miguel Angel Ramos de la <a href="http://geeks.ms/blogs/maramos/archive/2006/12/05/anunciando-la-liberaci-n-de-la-primera-ctp-de-wpf-e.aspx" target="_blank">noticia principal</a>). ¿Conseguirá Microsoft dinamitar una tecnología tan asentada como Flash? El tiempo lo dirá. En este tiempo también han aparecido por ejemplo la CTP de diciembre de <a href="http://www.codeplex.com/entlib" target="_blank">Enterprise Library 3.0</a> o la nueva CTP de <a href="http://www.sandcastledocs.com/Wiki%20Pages/Home.aspx" target="_blank">SandCastle</a>, una nueva herramienta para generar documentación a partir del código fuente comentado, al estilo del ya abandonado <a href="http://ndoc.sourceforge.net/" target="_blank">NDoc</a>.</p>
<p>En cuanto a herramientas de desarrollo también tenemos noticias. Por el lado de Java continúa la lucha (y que siga así ya que ira en beneficio de los desarrolladores) entre las dos plataformas libres mayoritarias, <a href="http://www.eclipse.org" target="_blank">Eclipse</a> y <a href="http://www.netbeans.org" target="_blank">NetBeans</a>. Ambos se dirigen hacia una nueva versión final y las novedades no dejan de aparecer a un lado y a otro. Eclipse avanza hacia su versión 3.3, de la que ya ha aparecido la <a href="http://download.eclipse.org/eclipse/downloads/drops/S-3.3M4-200612141445/index.php" target="_blank">Milestone 4</a>. Por su parte, NetBeans continúa a buen ritmo el desarrollo de su versión 6, de la que ya se puede descargar la <a href="http://wiki.netbeans.org/wiki/view/Milestone5Report" target="_blank">Milestone 5</a>. En Microsoft también están de enhorabuena con el reciente lanzamiento del Visual Studio 2005 SP1 (descargas para las versiones <a href="http://www.microsoft.com/downloads/details.aspx?displaylang=es&FamilyID=7B0B0339-613A-46E6-AB4D-080D4D4A8C4E" target="_blank">Express</a> y para la <a href="http://www.microsoft.com/downloads/details.aspx?displaylang=es&FamilyID=BB4A75AB-E2D4-4C96-B39D-37BAF6B5B1DC" target="_blank">Standard/Professional</a>), que incorpora algunas novedades y corrige muchos errores de la primera versión.</p>
<p>En definitiva, que tanto Java como .NET ha venido cargados de novedades este último mes y espero poder ir dedicando más tiempo algunas de ellas, y a alguna más que me he dejado deliberadamente en el tintero, porque son realmente interesantes.</p>]]></description><pubDate>jueves, 28 de diciembre de 2006</pubDate><comments>http://www.sgoliver.net/noticia.aspx?idn=68</comments></item><item><title><![CDATA[Noticias atrasadas sobre NRtfTree]]></title><link>http://www.sgoliver.net/noticia.aspx?idn=67</link><description><![CDATA[<p>Hace unos días publiqué tanto en esta web como en el <a href="http://nrtftree.sourceforge.net/" target="_blank">proyecto en SourceForge</a> la versión 0.2.1 de mi librería NRtfTree.</p>
<p>El único cambio relevante ha sido la correción de un bug un tanto feo en el método SaveRtf(), que hacía que no se guardaran correctamente algunos documentos que contuvieran caracteres especiales.</p>
<p>El resto de cambios no tienen relación alguna con la funcionalidad y consisten únicamente en adecuar la documentación a la nueva dirección web.</p>
<p>Adicionalmente, he reestructurado las descargas, para dividirlas en tres ficheros: fuentes (librería+demo), binarios (dll+demo) y documentación (formato CHM).</p>]]></description><pubDate>martes, 26 de diciembre de 2006</pubDate><comments>http://www.sgoliver.net/noticia.aspx?idn=67</comments></item><item><title><![CDATA[Novedades para 2007]]></title><link>http://www.sgoliver.net/noticia.aspx?idn=66</link><description><![CDATA[<p>Como dicen que "año nuevo, vida nueva", he intentado aplicarme el cuento y me he propuesto realizar algunos cambios en la web.</p>
<p>El primero y más importante, aunque el menos visible, ha sido la reestructuración interna de la página. Ya era hora de dejar de usar tablas para la maquetación de la web. En estos tiempos que corren es algo que queda bastante feo y que va contra todos los estandares de diseño y accesibilidad. Niños, no lo hagáis en casa. Aún tengo pendiente hacer que la web pase completamente algunos validadores, pero bueno, el primer pasito ya está dado. De paso, le he dado un "lavado de cara" general y he cambiado un poco el estilo anterior, aunque la estructura principal la sigo manteniendo.</p>
<p>Una novedad algo más visible es el cambio de dominio. Por fin dejo Brinkster y me paso a un dominio y alojamiento propios. Por tanto, ya tenemos una dirección más fácil de recordar y la web ganará algo en velocidad y estabilidad. No estoy diciendo que Brinkster sea un mal hosting, de hecho, lo recomiendo a todo el que quiera hacer sus pinitos en .NET, sobre todo teniendo en cuenta que ofrece un plan de alojamiento gratuito con soporte para ASP.NET, añadiendo una publicidad casi imperceptible y sin ningún límite de tiempo. Eso sí, no se puede tener todo gratis, por ejemplo no tiene soporte para ASP.NET 2.0 ni se pueden usar el global.asax o el web.config</p>
<p>Más cambios. He eliminado la sección de artículos, la tenía muy olvidada, he reestructurado la sección de enlaces, que espero llenar de links en breve, y he decidido utilizar un control especial para colorear automáticamente el código que inserte en la noticias del blog (intentaré dedicar a este control una noticia del blog dentro de poco porque me parece muy interesante). Con todo esto espero dar un aspecto un poco más homogeneo a la web, que la tenía muy descuidada en este sentido.</p>
<p>Por último, y como buenas intenciones para este año, a ver si esta vez sí lo consigo, espero actualizar muchísimo más a menudo el blog, al menos con las noticias que se vayan conociendo sobre .NET y Java, que últimamente son bastantes.</p>]]></description><pubDate>martes, 26 de diciembre de 2006</pubDate><comments>http://www.sgoliver.net/noticia.aspx?idn=66</comments></item><item><title><![CDATA[Tratamiento de documentos Excel en Java (2)]]></title><link>http://www.sgoliver.net/noticia.aspx?idn=65</link><description><![CDATA[<p>Como dicen que más vale tarde que nunca, aquí va el segundo artículo de la serie dedicada al tratamiento de documentos  Excel desde el lenguaje Java.</p>                                                          <p>En este articulo repasaré la segunda de las opciones a la hora de enfrentarse a una tarea de este tipo, que como ya dijimos, consiste en utilizar alguna de las APIs específicas desarrolladas con este objetivo. Las dos APIs más conocidas son las de Jakarta POI y JExcelApi. Tras evaluar ambas sólo puedo llegar a la conclusión de que son muy parecidas, aunque existen algunas diferencias que resumiré más abajo.</p>                                                          <p><strong>Jakarta POI</strong><br><br>                                                                                                                      POI es una api java que nos permitirá leer, escribir y modificar documentos excel con suma facilidad, aunque como bien indican en su web oficial, la funcionalidad de escritura es la más madura. Con esta API podremos manipular fácilmente muchas de las entidades existentes en un documento excel: libros, hojas, filas, celdas, fórmulas, etc. Sin embargo, a la hora de considerar esta herramienta también deberemos tener en cuenta algunas limitaciones, como el no soportar la creación de gráficas, celdas con varios formatos, macros o tablas dinámicas, aunque sí podremos modificar o leer documentos que contengan estos elementos sin riesgo a perderlos.</p>                                                          <p>Veamos un ejemplo de lo sencillo que resulta crear y escribir en un documento excel:</p>[code=Java]//Se crea el libro Excel 
HSSFWorkbook wb = new HSSFWorkbook(); 
 
//Se crea una nueva hoja dentro del libro 
HSSFSheet sheet = wb.createSheet("HojaEjemplo"); 

//Se crea una fila dentro de la hoja 
HSSFRow row = sheet.createRow((short)0); 

//Creamos celdas de varios tipos 
row.createCell((short)0).setCellValue(1); 
row.createCell((short)1).setCellValue(1.2); 
row.createCell((short)2).setCellValue("ejemplo"); 
row.createCell((short)3).setCellValue(true);[/code]
<p>Por cuestiones de espacio, sólo muestro en el artículo este pequeño fragmento de código. Sin embargo, podéis consultar un pequeño <a href="ejemploPOI.aspx" target="_blank">programa de demostración</a> completo que he escrito para mostrar lo fácil que resulta leer y escribir documentos excel con esta API.</p>                                                          <p>En cuanto a la documentación disponible, he decir que a parte de la inevitable documentación javadoc, la API viene acompañada de una guía rápida con muchos ejemplos sencillos que cubren gran parte de la funcionalidad de la misma. Esta guía, aunque no demasiado extensa, es más que suficiente para aprender a utilizar rápido muchas de las características disponibles.</p>                                                         <p>Como puntos &amp;quot;negativos&amp;quot; puedo mencionar que toda la documentación se encuentra en inglés (como no podía ser de otra forma) y que el proyecto parece haber estado &amp;quot;muerto&amp;quot; bastante tiempo, aunque parece que el desarrollo se ha retomado hace poco, ya que existe una versión DEV de junio de 2006. La última versión estable de la librería es la 2.5.1, de agosto de 2004.</p>                                                          <p><strong>Referencias:</strong></p>                                                          <ol>                                                            <li><a href="http://jakarta.apache.org/poi/" target="_blank">Web Oficial Jakarta POI [Inglés]</a></li>                                                            <li><a href="http://jakarta.apache.org/poi/trans/es/index.html" target="_blank">Web Oficial Jakarta POI [Español]</a></li>                                                            <li>  <a href="http://www.javaworld.com/javaworld/jw-03-2004/jw-0322-poi.html" target="_blank">Artículo sobre POI en JavaWorld.com [Inglés]</a></li>                                                            <li><a href="http://www.onjava.com/pub/a/onjava/2003/04/16/poi_excel.html" target="_blank">Artículo sobre POI en OnJava.com [Inglés]</a>                                                            </li>                                                          </ol>                                                          <hr />                                                          <p><strong>JExcelApi</strong><br>                                                            <br>                                                          Al igual que POI, JExcelApi es una API destinada a facilitar la lectura, escritura y modificación de documentos excel desde aplicaciones java. Los objetos y métodos disponibles son muy similares a los que hemos visto para POI, siendo súmamente sencillo manipular libros, hojas y celdas de un documento excel. En el fragmento siguiente se muestra como realizar las mismas acciones del ejemplo anterior (crear un libro y escribir varias celdas con distintos tipos de datos), pero esta vez usando JExcelApi:</p>
[code=Java]//Se crea el libro Excel                          
WritableWorkbook workbook =                           
        Workbook.createWorkbook(new File("ejemplo.xls"));                
                         
//Se crea una nueva hoja dentro del libro                          
WritableSheet sheet =                           
        workbook.createSheet("HojaEjemplo", 0);                          
                          
//Creamos celdas de varios tipos                          
sheet.addCell(new jxl.write.Number(0, 0, 1));                           
sheet.addCell(new jxl.write.Number(1, 0, 1.2));                          
sheet.addCell(new jxl.write.Label(2, 0, "ejemplo"));                     
sheet.addCell(new jxl.write.Boolean(3,0,true));[/code]<p>Igualmente, se proporciona un <a href="ejemploJExcel.aspx" target="_blank">ejemplo completo</a> (análogo al mostrado para POI) de cómo leer y escribir un documento excel con JExcelApi.</p>                                                         <p>JExcelApi también viene acompañado de una documentación muy completa en formato javadoc y de un pequeño tutorial con varios ejemplos de cómo realizar las acciones típicas sobre un documento. Esta API tiene también actualmente algunas limitaciones, como por ejemplo no permitirse la creación de gráficas o macros. Por suerte, como ocurría con POI, sí podremos al menos leer o modificar documentos que ya contengan estos elementos sin perderlos durante el proceso.</p>                                                          <p>Este proyecto sí se encuentra actualmente activo y en desarrollo, siendo la última versión estable de la librería, la 2.6.2, de octubre de 2006.</p>                                                          <p>Por último, como curiosidad, mencionar que existe un proyecto para portar a la plataforma .NET esta API java. Dicho proyecto recibe el nombre de <strong>NExcel</strong> y actualmente existe una versión alpha de febrero de 2005.  </p>                                                          <p><strong>Referencias:</strong></p>                                                          <ol>                                                            <li><a href="http://sourceforge.net/projects/jexcelapi" target="_blank">Web Oficial del proyecto en SourceForge [Inglés]</a></li>                                                            <li><a href="http://www.jexcelapi.org" target="_blank">Web original de la API [Inglés]</a> </li>                                                            <li><a href="http://sourceforge.net/projects/nexcel" target="_blank">Web de NExcel (versión en .NETde la API) [Inglés]</a>]]></description><pubDate>domingo, 05 de noviembre de 2006</pubDate><comments>http://www.sgoliver.net/noticia.aspx?idn=65</comments></item><item><title><![CDATA[Proyecto SourceForge]]></title><link>http://www.sgoliver.net/noticia.aspx?idn=64</link><description><![CDATA[<p>He decidido crear un proyecto en SourceForge para organizar y centralizar el desarrollo mi librería NRtfTree. Ya están montados y funcionando todos los recursos básicos: el tracker de descargas con los fuentes y los ejecutables (pronto la documentación de la API), los foros de soporte y dudas y el servidor de control de versiones Subversion. Para quien le interese dejo aquí los enlaces al proyecto de SourceForge y a la web personal de la librería:</p><p>Proyecto: <a href="http://sourceforge.net/projects/nrtftree/" target="_blank">http://sourceforge.net/projects/nrtftree/</a><br>Web: <a href="http://nrtftree.sourceforge.net/" target="_blank">http://nrtftree.sourceforge.net/</a></p><p>Un saludo a todos.</p>]]></description><pubDate>lunes, 25 de septiembre de 2006</pubDate><comments>http://www.sgoliver.net/noticia.aspx?idn=64</comments></item><item><title><![CDATA[Tratamiento de documentos Excel en Java (1)]]></title><link>http://www.sgoliver.net/noticia.aspx?idn=63</link><description><![CDATA[<p>En los últimos días, trabajando en un proyecto personal, he tenido que enfrentarme a la tarea de generar documentos de Microsoft Excel desde una aplicación escrita en Java. Viniendo del mundo .NET, y las facilidades que da esta plataforma para realizar este tipo de tareas, no estim&eacute; demasiado complejo hacer esto mismo en Java. Sin embargo, cuando lleg&oacute; el momento de buscar informaci&oacute;n sobre el tema me llev&eacute; la desagradable sorpresa de que no existen muchas posibilidades, aunque s&iacute; suficientes, para solucionar el problema. </p>
  <p>Despu&eacute;s de estudiar las principales alternativas  podemos limitar las opciones a tres estrategias b&aacute;sicas: </p>
    <ol>
      <li>	Gestionar el documento Excel como una base de datos a trav&eacute;s de ODBC. </li>
      <li>Utilizar una API espec&iacute;fica para crear y modificar un documento Excel desde cero. </li>
      <li>Utilizar una API espec&iacute;fica para generar un documento Excel a partir de una plantilla previamente preparada. </li>
    </ol>
    <p>La primera de las opciones es sumamente simple y directa utilizando los recursos que ofrece el propio SDK de JAVA y las fuentes de datos ODBC de Windows. Para las otras dos alternativas existen cuatro APIs de Java que describir&eacute; en los pr&oacute;ximos art&iacute;culos. De cualquier forma, estos art&iacute;culos no pretenden ser una gu&iacute;a exhaustiva para el uso de estas herramientas, sino s&oacute;lo un punto de inicio desde donde poder empezar a recavar informaci&oacute;n sobre la alternativa que m&aacute;s se adapte a nuestras necesidades. </p>
    <p><strong>Uso de ODBC para la gesti&oacute;n de documentos Excel </strong></p>
    <p>Esta primera opci&oacute;n representa una alternativa poco conocida para la gesti&oacute;n de documentos Excel, pero que puede ser muy &uacute;til para el tratamiento de estos documentos desde cualquier tipo de aplicaci&oacute;n, y m&aacute;s concretamente en nuestro caso desde aplicaciones Java. Este m&eacute;todo consiste en acceder al documento Excel a trav&eacute;s del controlador ODBC proporcionado por Windows para este tipo de ficheros, utilizando el documento de la misma forma que si se tratase de una base de datos tradicional y usando el lenguaje SQL para la manipulaci&oacute;n de los datos. </p>
    <p>Aunque existen numerosas limitaciones, como por ejemplo el no poder utilizar la sentencias DELETE o depender de un formato espec&iacute;fico del documento, a&uacute;n puede ser muy &uacute;til en la creaci&oacute;n desde cero de documentos o en el an&aacute;lisis de los mismos mediante SQL. </p>
  <p>Como ejemplo, voy a mostrar c&oacute;mo se crear&iacute;a una nueva hoja dentro de un documento Excel ya existente y c&oacute;mo se a&ntilde;adir&iacute;an nuevos datos a la misma. Para ello, en primer lugar ser&aacute; necesario crear un nuevo origen de datos ODBC que apunte al documento Excel a modificar.  </p>
    <p><a href="images/excel-odbc1.jpg"><img src="images/excel-odbc1.jpg" alt="excel-odbc1" width="167" height="137" hspace="5" border="1" align="left" /></a>Esto se puede hacer a trav&eacute;s de la opci&oacute;n &ldquo;Origenes de datos (ODBC)&rdquo; situada normalmente en el panel de control de Windows, dentro del grupo de &quot;Herramientas Administrativas&quot;. </p>
    <p>Dentro de la pesta&ntilde;a &quot;DSN de Sistema&quot; pulsamos &quot;Agregar...&quot; para a&ntilde;adir un nuevo origen de datos, seleccionamos el controlador &quot;Microsoft Excel Driver (*.xls)&quot; y pulsamos finalizar. Esto nos llevar&aacute; al cuadro de di&aacute;logo &quot;Configuraci&oacute;n de ODBC Microsoft Excel&quot; donde &uacute;nicamente tendremos que seleccionar el fichero Excel que queramos utilizar como base de datos y dar un nombre al origen de datos, que despu&eacute;s usaremos para abrir la conexi&oacute;n desde la aplicaci&oacute;n java. </p>
    <p>Una vez creado el origen de datos, la conexi&oacute;n con &eacute;ste desde nuestra aplicaci&oacute;n Java y la manipulaci&oacute;n mediante comandos SQL se realiza de la forma tradicional, utilizando la API de acceso a datos proporcianada por Java (JDBC) y haciendo uso del puente JDBC-ODBC como driver de acceso.</p>
    <p>A continuaci&oacute;n se muestra el c&oacute;digo completo de un peque&ntilde;o ejemplo donde creamos una nueva base de datos, a&ntilde;adimos un par de registros y mostramos c&oacute;mo se realiza una consulta sencilla a la base de datos creada. </p>
[code=Java]import java.sql.*;

public class Principal

  public static void main(String[] args)

    try
    {
      //Registro del driver
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

      //Apertura de la conexión
      Connection con =
              DriverManager.getConnection("jdbc:odbc:PRUEBAEXCEL");

      //Creación de la sentencia SQL
      Statement stmt = con.createStatement();

      //Creación de la hoja
      stmt.execute("CREATE TABLE articulos " +
              "(id NUMBER, nombre TEXT, precio NUMBER)");

      //Inserción de dos nuevas filas
      stmt.execute("INSERT INTO articulos (id,nombre,precio) " +
                   "VALUES (1,&apos;Articulo1&apos;,12.52)");

      stmt.execute("INSERT INTO articulos (id,nombre,precio) " +
                   "VALUES (2,&apos;Articulo2&apos;,15.63)");

      //Consulta al documento
      ResultSet rs =
        stmt.executeQuery("SELECT nombre FROM articulos " +
                          "WHERE id = 2");

      while(rs.next())
      {
        System.out.println("Nombre artículo: " +
                                   rs.getString(1));
      }

      //Cierre de recursos
      stmt.close();
      con.close();
    }
    catch(ClassNotFoundException e)
    {
      e.printStackTrace();
    }
    catch(SQLException e)
    {
      e.printStackTrace();
    }
  }
}[/code]
  <p>Si ejecutamos este ejemplo podremos ver c&oacute;mo en el libro Excel configurado como origen de datos se ha creado una nueva hoja llamada &quot;articulos&quot; con tres columnas, cuya cabecera se corresponde con los nombres de los campos que componen la base de datos creada y las restantes filas contienen los datos de los dos registros insertados. Adem&aacute;s, como salida del programa se obtendr&aacute; el siguiente mensaje: &quot;Nombre art&iacute;culo: Art&iacute;culo2&quot;.</p>
  <p align="center"><img src="images/excel-odbc2.JPG" alt="java-odbc2" width="230" height="78" border="1" /> </p>
  <p>Con esto puede comprobarse como al utilizar un documento Excel como base de datos a trav&eacute;s del controlador ODBC, las bases de datos se corresponden con libros Excel, las tablas con hojas dentro del libro y los campos de una tabla con las distintas columnas de la hoja, donde la primera fila contiene los nombres de cada campo y las filas siguientes los datos de cada registro. </p>
  <p>Como se extrae de este ejemplo, la utilizaci&oacute;n de ODBC para el acceso a documentos Excel es muy sencillo. Sin embargo, como ya se ha comentado al principio, existen una serie de limitaciones que hacen que no pueda considerarse totalmente v&aacute;lida esta opci&oacute;n para cubrir todas nuestras necesidades. Como muestra, podemos enumerar las siguientes limitaciones:</p>
  <ul>
    <li>Debido a que dependemos de or&iacute;genes de datos ODBC, esta opci&oacute;n s&oacute;lo es v&aacute;lida para sistemas operativos Windows.</li>
    <li>No se pueden utilizar todas las sentencias SQL para la manipulaci&oacute;n de los documentos. As&iacute; por ejemplo, no es posible eliminar filas de una hoja con la sentencia DELETE o modificar la estructura de la hoja una vez creada con sentencias ALTER TABLE.</li>
    <li>A trav&eacute;s de ODBC s&oacute;lo es posible actuar sobre los datos del documento, pero no podremos establecer niguna opci&oacute;n de formato. </li>
  </ul>
  <p>Y hasta aqu&iacute; el primer articulo de la serie que voy a dedicar al tratamiento de documentos Excel desde aplicaciones Java. En el pr&oacute;ximo post veremos las dos APIs m&aacute;s populares que nos permiten crear y modificar documentos Excel completos, actuando sobre los datos y sobre el formato de los mismos. </p>
  <p><strong>Referencias:</strong></p>
  <ol>
    <li><a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcjetmicrosoft_desktop_database_drivers.asp" target="_blank">Microsoft ODBC Desktop Database Drivers [Ingl&eacute;s]</a> </li>
    <li><a href="http://support.microsoft.com/kb/178717/en-us" target="_blank">Excel ODBC Driver and Text ODBC Driver Notes [Ingl&eacute;s]</a> <a href="http://support.microsoft.com/kb/q178717/">[Espa&ntilde;ol]</a> </li>
    <li>Art&iacute;culos en JavaWorld: <a href="http://www.javaworld.com/javaworld/javaqa/2001-06/04-qa-0629-excel.html" target="_blank">[1] Its Excel-lent</a> - <a href="http://www.javaworld.com/javaworld/javaqa/2001-08/02-qa-0824-excel2.html" target="_blank">[2] The Java-Excel solution revisited</a> </li>
  </ol>]]></description><pubDate>domingo, 09 de abril de 2006</pubDate><comments>http://www.sgoliver.net/noticia.aspx?idn=63</comments></item></channel></rss>