<?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/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>pedels, desde la amígdala &#187; Programación</title>
	<atom:link href="http://pedels.net/category/programacion/feed/" rel="self" type="application/rss+xml" />
	<link>http://pedels.net</link>
	<description>Desde lo más primitivo de mi cerebro</description>
	<lastBuildDate>Sat, 12 Jul 2008 20:01:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>¿Hay algo más bonito que un niño coder?</title>
		<link>http://pedels.net/2008/04/25/programacion/%c2%bfhay-algo-mas-bonito-que-un-nino-coder/</link>
		<comments>http://pedels.net/2008/04/25/programacion/%c2%bfhay-algo-mas-bonito-que-un-nino-coder/#comments</comments>
		<pubDate>Fri, 25 Apr 2008 18:13:12 +0000</pubDate>
		<dc:creator>pedels</dc:creator>
				<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://pedels.net/?p=108</guid>
		<description><![CDATA[<p>Eso deben pensar los que están detrás de Java for Kids, aclara que está dirigido tanto a niños como a programadores noveles pero no deja de ser una iniciativa interesante.</p>
<p>Utilizan como entorno de desarrollo JUDO (Java IDE for Children and Beginning Programmers) que, por cierto, tiene una traducción al español. Por lo que veo, se trata <span style="color:#777"> . . . &#8594; Read More: <a href="http://pedels.net/2008/04/25/programacion/%c2%bfhay-algo-mas-bonito-que-un-nino-coder/">¿Hay algo más bonito que un niño coder?</a></span>]]></description>
			<content:encoded><![CDATA[<p>Eso deben pensar los que están detrás de <a href="http://www.video-animation.com/java_000.shtml">Java for Kids</a>, aclara que está dirigido tanto a niños como a programadores noveles pero no deja de ser una iniciativa interesante.</p>
<p>Utilizan como entorno de desarrollo <a href="http://judo.sourceforge.net/">JUDO (Java IDE for Children and Beginning Programmers)</a> que, por cierto, tiene una <a href="http://judo.sourceforge.net/downloads.php">traducción al español</a>. Por lo que veo, se trata de un editor muy sencillo, destinado a programas no demasiado complejos.</p>
<p>Enseñar a los niños a programar siempre me ha parecido buena idea. El objetivo no es convertirlos en desarrolladores del core de Linux sino una formación tecnica útil. Compárese con tocar un instrumento musical: &#8220;se un poco de Java y toco un poco la guitarra&#8221; Hay una parte de afición, una parte de formación y una disciplina e ideas que pueden ser útiles en otros aspectos de la vida (esto último quizá más en la programación que en la música).</p>
<p>Me imagino la escena: &#8220;¡Nene! Cierrra ya el debugger y vente a merendar. Y tienes todavía que hacer los deberes de manualidades.&#8221;</p>
<p>El desarrollar algoritmos para conseguir que tu ordenador haga lo que tu quieras es estimulante, aprendes a pensar, a descomponer un problema, a hilar tu pensamiento con un objetivo. Sí, es divertido (y frustrante en muchas ocasiones. No hay premio sin esfuerzo).</p>
<p>El recibir una formación técnica básica creo que es algo en lo que se debería invertir algo de esfuerzo. En un futuro cercano, cualquier persona deberá lidiar a diario con multitud de aparatos electronicos, pantallas, teclados e interfaces varios.<br />
Para todos los <a href="http://es.wikipedia.org/wiki/Techie">techies</a> sintonizar una tele o moverse entre los menus de configuración del DVD parece casi intuitivo, esto es porque los interfaces nos son familiares y estamos en &#8220;sintonía mental&#8221; (permitanme el término) con el creador de ese menu. Pensamos de una forma similar. Por desgracia para muchas personas (en general a partir de la mediana edad) el futuro cercano va a ser algo incomodo si no fueron capaces de pasar del VHS al DVD, no quiero augurarles los cambios que aun les esperan.</p>
<p>Los niños y jovenes de hoy interactuaran con más facilidad con toda la fauna de ordenadores, gadgets y aparatitos que nos rodean pero, no por ello y quizá aún más, hay que formarlos para que se muevan con facilidad en este mundo de rápida evolución y cacharros por todas partes.</p>
<p>Por eso, enseña Java a tus niños. Y si Java te parece mucho, prueba con <a href="http://es.wikipedia.org/wiki/Logo_(Lenguaje_de_programaci%C3%B3n)">Logo</a>, te dan muchos <a href="http://neoparaiso.com/logo/razones-logo.html">motivos</a> que son aplicables a la idea de que los niños deben programar.</p>
<p>Y si ya vienes de vuelta de todo puedes probar con <a href="http://en.wikipedia.org/wiki/LOLCODE">Lolcode</a>. Una muestra:<br />
<code><br />
HAI<br />
CAN HAS STDIO?<br />
VISIBLE "HAI WORLD!"<br />
KTHXBYE<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://pedels.net/2008/04/25/programacion/%c2%bfhay-algo-mas-bonito-que-un-nino-coder/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JSqlParser: un parser (analizador sintáctico) para SQL en Java (continuación)</title>
		<link>http://pedels.net/2008/01/16/informatica/jsqlparser-un-parser-analizador-sintactico-para-sql-en-java-continuacion/</link>
		<comments>http://pedels.net/2008/01/16/informatica/jsqlparser-un-parser-analizador-sintactico-para-sql-en-java-continuacion/#comments</comments>
		<pubDate>Wed, 16 Jan 2008 19:06:46 +0000</pubDate>
		<dc:creator>pedels</dc:creator>
				<category><![CDATA[Informática]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://pedels.net/2008/01/16/informatica/jsqlparser-un-parser-analizador-sintactico-para-sql-en-java-continuacion/</guid>
		<description><![CDATA[<p>En el último artículo analizamos las posibilidades que se nos presentaban al buscar un parser de SQL para Java e hicimos un recorrido de posibles soluciones de mayor a menor dificultad de adopción. Para una introducción y puesta en situación para este artículo, podría ser recomendable su lectura.</p>
<p>Ahora concretamos en la solución encontrada como más adecuada: <span style="color:#777"> . . . &#8594; Read More: <a href="http://pedels.net/2008/01/16/informatica/jsqlparser-un-parser-analizador-sintactico-para-sql-en-java-continuacion/">JSqlParser: un parser (analizador sintáctico) para SQL en Java (continuación)</a></span>]]></description>
			<content:encoded><![CDATA[<p>En el <a href="http://pedels.net/2007/12/27/informatica/jsqlparser-un-parser-analizador-sintactico-para-sql-en-java/">último artículo</a> analizamos las posibilidades que se nos presentaban al buscar un parser de SQL para Java e hicimos un recorrido de posibles soluciones de mayor a menor dificultad de adopción. Para una introducción y puesta en situación para este artículo, podría ser recomendable su lectura.</p>
<p>Ahora concretamos en la solución encontrada como más adecuada: <a href="http://jsqlparser.sourceforge.net/"><strong>JSqlParser</strong></a>.<br />
Este parser es un proyecto de <a href="http://es.wikipedia.org/wiki/Software_libre" rel="nofollow">Software Libre</a> alojado en <a href="http://sourceforge.net/" rel="nofollow">SourceForge</a> bajo <a href="http://www.gnu.org/licenses/lgpl.html" rel="nofollow">licencia LGPL</a>.</p>
<p>Al <a href="http://sourceforge.net/projects/jsqlparser/" rel="nofollow">descargarlo de SourceForge</a>, nos encontraremos con un archivo .jar. Este archivo contiene la libreria .jar que necesitamos y, además, tanto la documentación como el código fuente. Una forma sencilla de extraer el contenido es renombrar el archivo, cambiando su extensión por .zip. Entonces, lo extraemos con cualquier utilidad para descompresión de este tipo de ficheros.</p>
<p>Encontramos una estructura de carpetas donde nos interesan:</p>
<ul>(si estas en Windows, tus barras serán así: \)</p>
<li>Librería: &#8220;jsqlparser/lib/jsqlparser.jar&#8221;</li>
<li>Documentación: &#8220;jsqlparser/docs&#8221; también en <a href="http://jsqlparser.sourceforge.net/docs/" rel="nofollow">los Javadocs de la página web</a>.</li>
<li>Código fuente: &#8220;jsqlparser/src/net/sf/jsqlparser&#8221;</li>
<li>Archivos SQL de prueba: &#8220;jsqlparser/testfiles&#8221;</li>
</ul>
<p>Es interesante saber también que existe un <a href="http://sourceforge.net/forum/forum.php?forum_id=360150" rel="nofollow">foro en SourceForge</a> donde es posible encontrar (u ofrecer) ayuda. En la página web podemos encontrar un <a href="http://jsqlparser.sourceforge.net/example.php" rel="nofollow">ejemplo</a> que nos será de extrema utilidad para empezar a trabajar con JSqlParser.</p>
<p>Dependiendo del entorno de desarrollo que use deberá agregar la libreria jsqlparser.jar para que esté disponible. A partir de ahí ya podemos usar la librería en nuestro código pero antes necesitamos saber unas cuantas cosas. Explicaremos a continuación una serie de conceptos que pueden facilitarnos la comprensión e la forma de trabajar de esta librería.<br />
<span id="more-96"></span></p>
<hr/>
<strong>El patrón del visitador</strong><br />
Este parser hace uso extensivo del <a href="http://es.wikipedia.org/wiki/Visitor_%28patr%C3%B3n_de_dise%C3%B1o%29" rel="nofollow">Patrón del Visitador</a> (o también, <a href="http://en.wikipedia.org/wiki/Visitor_pattern" rel="nofollow">Visitor Pattern [en inglés pero mucho mejor que la versión española y con ejemplos]</a>).<br />
Intentemos explicar en forma sencilla que es lo que ocurre en este patrón de diseño software. Tenemos dos elementos:</p>
<ul>
<li>Objeto visitador (Visitor): implementa diversas versiones del <a href="http://es.wikipedia.org/wiki/M%C3%A9todos_%28programaci%C3%B3n_orientada_a_objetos%29" rel="nofollow">método </a>visit(objeto_a_visitar) haciendo un uso extensivo del <a href="http://es.wikipedia.org/wiki/Polimorfismo_%28programaci%C3%B3n_orientada_a_objetos%29" rel="nofollow">polimorfismo</a>. Visitor es en realidad un interfaz que debe ser implementado por un objeto pero ahora veremos eso.</li>
<li>Objetos visitables: tienen un método accept(objeto_visitador).</li>
</ul>
<p>El funcionamiento es el siguiente. Si tenemos un objeto denominado Objeto1 que tiene un método <code>accept()</code>. Cuando invocamos <code>Objeto1.accept(Objeto_visitador)</code>, estamos llamando al método <code>accept()</code> y pasándole un objeto que es el Objeto_visitador. Dentro del método <code>accept()</code> lo que ocurre es que se usa el Objeto_visitador, y se invoca su método <code>visit()</code>. De este modo hacemos: <code>Objeto_visitador.visit(Objeto1)</code>.<br />
En Objeto_visitador tenemos muchas versiones de <code>visit()</code>, una para cada tipo de objeto que podemos tratar, de este modo, con un unico Objeto_visitador podemos actuar sobre múltiples objetos distintos.<br />
Todos los objetos implementan el método <code>accept()</code>, que provoca que el objeto acabe siendo pasado como parámetro al objeto_visitador, que usará el método <code>visit()</code> adecuado para cada tipo de objeto que reciba.</p>
<p>En <strong>resumen</strong>, cuando invocamos accept(Objeto_visitador) en un objeto, lo que estamos provocando es que Objeto_visitador reciba el objeto como parámetro en un método que se encargará de tratarlo.</p>
<p>El <a href="http://en.wikipedia.org/wiki/Visitor_pattern" rel="nofollow">artículo de la wikipedia</a> puede ser bastante más clarificador que estos párrafos.</p>
<p>Creo que la forma en que queda más claro es con un ejemplo y el <a href="http://en.wikipedia.org/wiki/Visitor_pattern#Example" rel="nofollow">ejemplo en Java de la Wikipedia</a> es bastante bueno. Aunque yo hubiera usado personas en lugar de piezas de coche por que queda mucho más clara la analogía de la visita:</p>
<p>Imaginemos que el visitador es un médico y el visitable un paciente (hombre, mujer o niño) y el médico puede tratar a los tres.<br />
El paciente enferma y usa su metodo accept(médico) porque necesita un médico, igualmente puede tener accept(fontanero) si lo que necesita es un fontanero. Cuando acepta al médico, lo llama y le pide que le visite, esto es, dentro de accept usa el método visit del médico pasandose a si mismo como argumento.<br />
El médico recibe la petición de visita y dependiendo de que fuera quién ha llamado hará una visita para hombre, mujer o niño porque, aunque la llamada es la misma, se ejecuta un método distinto para cada uno.<br />
El médico tratá al paciente con lo que tenga que hacerle y fin del proceso.</p>
<p>Es posible rizar esto un poco más: el médico puede curarse a si mismo, visitador y visitado pueden ser el mismo; puede haber, al igual que distintos pacientes, distintos médicos que apliquen tratamientos distintos, clases distintas que implementan el mismo interfaz (la forma de llamar al médico es siempre la misma).</p>
<p>Este patrón combinado con un uso jerárquico de llamadas nos da una capacidad y una flexibilidad sorprendente para tratar una estructura más o menos compleja como puede ser una consulta SQL.</p>
<p>En JSqlParser, existen múltiples interfaces <em>Visitor</em>. Que debemos implementar adecuadamente en una clase para tratar ese tipo de objetos. Usar los interfaces nos asegurará que implementamos todos los métodos necesarios para tratar esa parte de la estructura de la consulta.</p>
<hr/>
<strong><br />
Estructura de las sentencias SQL en JSqlParser</strong><br />
He extraido de la documentación la estructura de una consulta <em>Select</em> y la he expresado como un mapa mental de <a href="http://freemind.sourceforge.net/wiki/index.php/Main_Page" rel="nofollow">FreeMind</a> (programa recomendado, tremendamente útil). Ponemos aquí la versión exportada html, aunque si alguién está interesado en el archivo original de FreeMind (recomendado) sólo tiene que pedirlo en los comentarios.<br />
Pincha en las fotos para una versión ampliada:<br />
<a href="http://www.flickr.com/photos/91083811@N00/2177265623/" title="Select Statement por Pedels, en Flickr" rel="nofollow"><img src="http://farm3.static.flickr.com/2378/2177265623_674b0caceb.jpg" width="500" height="352" alt="Select Statement" /></a><br />
<a href="http://www.flickr.com/photos/91083811@N00/2178055340/" title="Expression in Statement por Pedels, en Flickr" rel="nofollow"><img src="http://farm3.static.flickr.com/2179/2178055340_25855dc2d1.jpg" width="424" height="500" alt="Expression in Statement" /></a></p>
<p>No me voy a extender mucho aquí. La estructura corresponde a una descomposición desde arriba hacia abajo de la estructura de la consulta Select, el resto son similares. Para la descomposición se han ido tomando los campos de cada objeto sucesivamente, los que tienen una flecha roja indican que están descompuestos en otra parte del esquema (son enlaces en el archivo original). Para ver los métodos de cada objeto acudid a la documentación original.</p>
<p>Solo comentar que es cada cosa en las imagenes:</p>
<ul>
<li>Texto gris claro con imagen bombilla o campana: <strong>Documentación</strong>. Anotaciones útiles.</li>
<li>Texto marrón con imagen clip: <strong>Interfaz</strong>. Cuando aparece un interfaz se descompone en todos los objetos que implementan ese interfaz.</li>
<li>Texto rojo con imagen carpeta azul: <strong>Objeto</strong>. Se descompone en sus campos que pueden s er tipos de datos primitivos, objetos e interfaces.</li>
<li>Texto azul: <strong>listas de objetos o interfaces</strong>. Muy usadas en toda la libreía.</li>
<li>Texto rojo oscuro: <strong>Tipo de dato primitivo</strong>. Como un entero o una cadena.</li>
</ul>
<p>Una de las imagenes contiene la estructura general y la otra la expansión del interfaz Expression que por su tamaño e importancia (y legibilidad) merece su propia imagen.</p>
<hr/>
<p><strong>Cómo usar todo esto junto sin volverse loco</strong></p>
<p>Partimos del supuesto que tenemos una consulta SQL en una cadena y queremos extraer sus partes. El procedimiento que podemos seguir pasa por crear una clase visitador que reciba la consulta, la analice con el parser que trae JSqlParser y entonces empieza el proceso maravilloso:<br />
Tomamos la consulta completa, la cual tiene metodos para extraer sus partes. Bien, las extraemos y en cada parte usamos el método <code>accept(visitor)</code> esto hará que nuestro visitador vuelva a recibir las partes, que irán a su método <code>visit()</code> gracias al poliformismo de estos.<br />
Una vez recibida cada parte podemos descomponerla en sus partes usando sus propios métodos y llamar en cada una <code>accept(visitor)</code> de nuevo.<br />
Este proceso puede continuar hasta los elementos más elementales de la consulta: cadenas de texto que representan nombres de columnas y tablas, enteros, etc&#8230;.</p>
<p>¿Y qué tiene esto de divertido? Lo divertido es que podemos incluir lo que necesitemos hacer en el proceso y modificar  o extraer los datos que necesitemos de la consulta sin esfuerzo.</p>
<p>En el <a href="http://jsqlparser.sourceforge.net/example.php" target="_blank" rel="nofollow">ejemplo</a> de la web realiza un visitador que va recorriendo la consulta de arriba hacia abajo y cuando encuentra un nombre de tabla lo guarda en un ArrayList donde, al terminar el proceso, estarán todas las tablas que aparecen en la consulta. ¿Y cómo sabe cuando ha llegado a un nombre de tabla¿ Es tan sencillo como que en <code>visit(Table tableName)</code> sólo entrarán tablas, extreamos su nombre y lo guardamos.</p>
<p>Mi recomendación es que intentéis entender la estructura de la consulta, tomeis el ejemplo de la web, terminéis de implementar los interfaces que faltan, en caso de que los veais necesarios, del mismo modo que están los del ejemplo y uséis esa clase como padre para las que os serán de verdadera utilidad. De este modo ocultamos la clase &#8220;fea&#8221; y obtendremos una clase &#8220;bonita&#8221; donde sólo está la tarea que nos interesa.</p>
<p>Yo necesitaba extraer todos los nombres de columnas y tablas. Lo que hice fue terminar de implementar la clase del ejemplo que recorría la consulta de arriba hasta abajo. Esta es la clase padre.</p>
<p>Hecho esto, cree una clase que extendía la anteriormente creada. en esta nueva clase incluí sólo dos métodos que sobreescribían a los de la clase padre: <code>visit(Column columnName)</code> y <code>visit(Table tableName)</code> que recogían los nombres de las tablas y columnas que recibían y los iban guardando en unas listas destianadas para eso.</p>
<p>Y este es el final. Enhorabuena si has llegado hasta aquí leyendo y enhorabuena de nuevo si has entendido algo. El funcionamiento es confuso en un inicio si no estás familiarizado con este tipo de estructuras (para mi lo fue) pero, tras leer un poco y algo de esfuerzo, se pueden conseguir unos resultados muy buenos tanto en la descomposición como en la composición de consultas.</p>
<p>¡Suerte!</p>
]]></content:encoded>
			<wfw:commentRss>http://pedels.net/2008/01/16/informatica/jsqlparser-un-parser-analizador-sintactico-para-sql-en-java-continuacion/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>JSqlParser: un parser (analizador sintáctico) para SQL en Java</title>
		<link>http://pedels.net/2007/12/27/informatica/jsqlparser-un-parser-analizador-sintactico-para-sql-en-java/</link>
		<comments>http://pedels.net/2007/12/27/informatica/jsqlparser-un-parser-analizador-sintactico-para-sql-en-java/#comments</comments>
		<pubDate>Thu, 27 Dec 2007 11:32:10 +0000</pubDate>
		<dc:creator>pedels</dc:creator>
				<category><![CDATA[Informática]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://pedels.net/2007/12/27/informatica/jsqlparser-un-parser-analizador-sintactico-para-sql-en-java/</guid>
		<description><![CDATA[<p>Por necesidades de mi PFC he tenido que buscarme <span style="color:#777"> . . . &#8594; Read More: <a href="http://pedels.net/2007/12/27/informatica/jsqlparser-un-parser-analizador-sintactico-para-sql-en-java/">JSqlParser: un parser (analizador sintáctico) para SQL en Java</a></span>]]></description>
			<content:encoded><![CDATA[<p>Por necesidades de mi <acronym title="Proyecto Final de Carrera">PFC</acronym> he tenido que buscarme un <a href="http://es.wikipedia.org/wiki/Analizador_sint%C3%A1ctico" rel=nofollow">parser </a> de <acronym title="Structured Query Language">SQL</acronym> para Java y quiero ahorrarle al resto del mundo tan tediosa tarea.</p>
<p>Podría parecer que un parser SQL para Java es una cosa poco exótica (bueno, depende de dónde te muevas, probablemente para la mayor parte de la gente lo sea :P) pero no hay una solución que podríamos considerar ampliamente aceptada. En lugar de eso podemos encontrar múltiples soluciones parciales más o menos incomodas.</p>
<p>Podemos resumir que todo fue un poco infernal hasta que me decidí a probar <strong><a href="http://jsqlparser.sourceforge.net/">JSqlParser</a></strong>, un <strong>parser de Sql para Java basado en una gramática para JavaCC</strong> creada por un tal <a href="http://www2.informatik.hu-berlin.de/~draheim/java/jjtree.html">Guido Draheim</a>. Yo hasta hace poco tampoco entendía nada de esto :)</p>
<p>En un <a href="http://pedels.net/2008/01/16/informatica/jsqlparser-un-parser-analizador-sintactico-para-sql-en-java-continuacion/">artículo posterior</a> profundizaremos en JSqlParser. En este articulo se comentan las posibilidades que existen y la dificultan que conllevan, así como algunos conceptos sobre parsers, gramáticas y trabajo innecesario: ¿quieres saber más? pues sigue leyendo:    <span id="more-95"></span></p>
<p>En realidad tenemos múltiples opciones, que vamos a ir recorriendo de mayor a menor dificultad:</p>
<p><strong>Puedes programar tu propio parser desde cero</strong>. Si no estás metido en lingüistica Computacional y sabes de que estás hablando, mejor que descartemos esta opción.</p>
<p>Una propuesta que se puede encontrar facilmente es: &#8220;Puedes <strong>hacerte tu propio parser utilizando una generador</strong> como <acronym title="Java Compiler-Compiler"><a href="https://javacc.dev.java.net/" rel="nofollow">JavaCC</a></acronym> , <acronym title="ANother Tool for Language Recognition"><a href="http://www.antlr2.org" rel="nofollow">ANTLR</a></acronym> o <acronym title="LALR Parser Generator"><a href="http://sourceforge.net/projects/lpg/" rel="nofollow">LPG</a></acronym>&#8220;. Bueno, la expresión equivalente podría ser algo como: &#8220;Si quieres ir al trabajo comodamente puedes construirte tu propia bicicleta con cualquier caja de herramientas&#8221;.</p>
<p>Los generadores de parser son complejos y si el parser no es algún aspecto central de tu tarea, no creo que valga la pena aprender. Estas herramientas funcionan del siguiente modo: una persona escribe un conjunto de reglas (normalmente llamadas gramática) y el generador, usando estas reglas, da como salida código en un lenguaje de programación concreto que permite <em>parsear</em>(permitidme la licencia, &#8220;analizar sintácticamente&#8221; es mucho más largo) el lenguaje de programación deseado. El lenguage de salida puede ser definido mediante la gramatica (como en ANTLR) o estar definido de antemano (como en JavaCC). Si os gustan los compiladores y teneis mucho tiempo libre, ¡adelante!. En otro caso, seguid leyendo.</p>
<p>Una opción más moderada es <strong>buscar una gramática que alguién haya creado ya y utilizar el generador</strong> de parsers para crear nuestra ansiada herramienta. Esta opción me pareció muy interesante al principio, pero encontramos dos problemas:</p>
<ol>
<li>
Encontrar la gramatica: no estan fácil encontrar una gramática completa para SQL estándar. Encontramos múltiples para subconjuntos o implementaciones concretas pero la gran gramática que buscamos es esquiva y se oculta bien.
</li>
<li>
El parser generado no es precisamente <em>user friendly</em>. De repente tendrás entre tus manos un maremagnum de clases y métodos y ninguna idea de como meterle mano (ni documentación, dicho sea de paso).
</li>
</ol>
<p>Como ejemplo mi experiencia, encontré una referencia (que no localizo ahora) acerca del parser de SQL que <a href="http://db.apache.org/derby/" rel="nofollow">Derby</a> usa internamente. Bien, destripé a Derby, extraje la gramática para JavaCC que contiene y generé el parser: el infierno es más sencillo de controlar. Huelga decir que, después de eso, destripar un plugin de <a href="http://squirrel-sql.sourceforge.net/" rel="nofollow">SQuirreL </a>no era una posibilidad.</p>
<p>Como tercera opción tenemos <strong>usar un parser completito, existente y, a ser posible, con una licencia generosa</strong>. Encontramos unos cuantos en la busqueda:</p>
<ul>
<li>
<a href="http://www.experlog.com/gibello/zql/" rel="nofollow"·><strong>ZQL</strong></a>: basado en un parser generado con JavaCC. Descartado por su falta de garantías y porque la batería &#8220;exhaustiva&#8221; de pruebas que muestra deja mucho que desear.
</li>
<li><a href="http://www.cs.toronto.edu/~jglu/sql4j/" rel="nofollow"><strong>SQL4J</strong></a>: demasiado bonito para ser cierto, es sencillo y parece funcionar muy bien para la mayor parte de los casos. Perdió su oportunidad cuando se atascó en un caso sencillo y habitual como el de encontrar una función como <code>SUM(tabla.columna1) </code> en la consulta. Esto sumado a la total falta de documentación provocaron su caída de la lista.
</li>
<li><a href="http://www.eclipse.org/datatools/project_sqldevtools/" rel="nofollow"><strong>sql development tools project</strong></a> dentro de <a href="http://www.eclipse.org/" rel="nofollow">Eclipse</a>: basado en LPG, muy interesante si usas Eclipse pero no pude  llegar a probarlo porque es incompatible con la versión que usamos en la empresa. Me quede con las ganas.
</li>
</ul>
<p>El último elemento de esta lista es el que titula este artículo: <a href="http://jsqlparser.sourceforge.net/"><strong>JSqlParser</strong></a>. Basado en un parser generado con JavaCC. Este parser asusta en un primer momento por su complejidad aparente (sobre todo si no has estudiado informatica o sabes bastante de <acronym title="Programación Orientada a Objetos">POO</acronym> como es mi caso) pero vale la pena el esfuerzo. Su curva de aprendizaje es un poco abrupta, lo que quiere decir que un pequeño esfuerzo inicial se ve compensado con un dominio más que suficiente de la herramienta en poco tiempo.<br />
La documentación no es maravillosa pero sí aceptable y hay una cierta comunidad alrededor que puede dar respuestas.</p>
<p>Es útil tanto para analizar como para generar consultas SQL de una complejidad asombrosa, sin duda una gran opción y mi recomendación.</p>
<p>En el <strong>proximo artículo</strong> abordaremos un poco la <strong>estructura y la forma de trabajar de JSqlParser</strong>. Lo cual ahorrará a muchos el trabajo inicial de entender y empezar a trabajar con JSqlParser.</p>
]]></content:encoded>
			<wfw:commentRss>http://pedels.net/2007/12/27/informatica/jsqlparser-un-parser-analizador-sintactico-para-sql-en-java/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Cursos PHP y MySQL</title>
		<link>http://pedels.net/2007/08/07/informatica/cursos-php-y-mysql/</link>
		<comments>http://pedels.net/2007/08/07/informatica/cursos-php-y-mysql/#comments</comments>
		<pubDate>Tue, 07 Aug 2007 22:38:59 +0000</pubDate>
		<dc:creator>pedels</dc:creator>
				<category><![CDATA[Creación web]]></category>
		<category><![CDATA[Informática]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://pedels.net/2007/08/07/creacion-web/cursos-php-y-mysql/</guid>
		<description><![CDATA[<p>Últimamente con esto de que me sobra el tiempo me estoy dedicado a cultivarme (de forma geek que no agraria) y a cubrir algunas cositas que me quedaba por aprender o dominar. En este camino he encontrado un sitio donde aparecen unos cursos que puede que resulten interesantes a más de uno.</p>
<p>Estos cursos parten prácticamente de <span style="color:#777"> . . . &#8594; Read More: <a href="http://pedels.net/2007/08/07/informatica/cursos-php-y-mysql/">Cursos PHP y MySQL</a></span>]]></description>
			<content:encoded><![CDATA[<p>Últimamente con esto de que me sobra el tiempo me estoy dedicado a cultivarme (de forma geek que no agraria) y a cubrir algunas cositas que me quedaba por aprender o dominar. En este camino he encontrado un sitio donde aparecen unos cursos que puede que resulten interesantes a más de uno.</p>
<p>Estos cursos parten prácticamente de cero en la mayor parte de los casos, en ocasiones sólo son necesarias nociones en algunos campos, claro está que un dominio medio en cosas como HTML o saber algo de bases de datos puede allanar bastante el camino.</p>
<p>Están organizados en forma de lección sencilla, ejemplo y ejercicio de cada parte con lo que te obligas a practicar lo aprendido. Una gran ventaja es que el código se escribe y se interpreta directamente en la web, así que las excusas de que hay que instalar <a href="http://es.wikipedia.org/wiki/Servidor_HTTP_Apache">Apache</a> o que es una pesadez tener que subir cada archivo por <acronym title="File Transfer Protocol">ftp</acronym> al servidor para probarlo se acabaron.</p>
<p>Las lecciones van aumentando la complejidad progresivamente y de forma bastante gradual, de forma que el curso completo forma un solo bloque, esto se echa en falta en otros cursos construidos mediante colaboración de muchas personas en los que las lecciones van dando saltos de dificultad y estilo, lo que puede llevarte a confusión. ¡Ah! Están completamente en español.</p>
<p>Cada curso está alojado bajo un dominio distinto del tipo www.&#8221;materiadeinteres&#8221;ya.com.ar, por ejemplo, para php el curso se encuentra en <a href="http://www.phpya.com.ar">www.phpya.com.ar</a> y para mysql es <a href="http://www.mysqlya.com.ar">www.mysqlya.com.ar</a>.</p>
<p>Los cursos cubren otras materias como:</p>
<ul>
<li><a href="http://www.htmlya.com.ar">HTML</a></li>
<li><a href="http://www.cssya.com.ar">CSS</a></li>
<li><a href="http://www.javascriptya.com.ar">Javascript</a></li>
<li><a href="http://www.dhtmlya.com.ar">DHTML</a></li>
<li><a href="http://www.ajaxya.com.ar">AJAX</a></li>
<li><a href="http://www.sqlserverya.com.ar">SQLserver</a></li>
<li><a href="http://www.aspya.com.ar">ASP</a></li>
</ul>
<p>Ya no teneis excusas para aprender. ¡Qué os sean útiles!</p>
]]></content:encoded>
			<wfw:commentRss>http://pedels.net/2007/08/07/informatica/cursos-php-y-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
