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

<channel>
	<title>Gulsin 2.0rg - El hermano feo de tux</title>
	<link>http://gulsin.org</link>
	<description>Espacio de tecnologia, software libre y sus derivados. Una horda de monos entrenados escriben de vez en cuando por aqui algunas noticias, opiniones e incluso alguna que otra cosa fuera del tema. Maqueros, favor de abstenerse que no somos lo suficientemente guapos.</description>
	<pubDate>Fri, 18 May 2012 21:31:05 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.2.3</generator>
	<language>en</language>
			<item>
		<title>Flex y Bison Trabajando Juntos!</title>
		<link>http://gulsin.org/2012/05/15/flex-y-bison-trabajando-juntos/</link>
		<comments>http://gulsin.org/2012/05/15/flex-y-bison-trabajando-juntos/#comments</comments>
		<pubDate>Tue, 15 May 2012 22:09:17 +0000</pubDate>
		<dc:creator>Edwin Plauchu</dc:creator>
		
		<category><![CDATA[Programacion]]></category>

		<guid isPermaLink="false">http://gulsin.org/2012/05/15/flex-y-bison-trabajando-juntos/</guid>
		<description><![CDATA[Bien ahora nos dedicaremos a escribir una calculadora usando mostaza y mayonesa (oseace flex and bison). Como primer objetivo escribiremos un scanner, y despues un parser y los haremos trabajar juntos como una familia feliz lo haria&#8230;  &#8230;.
Para mantener las cosas simples, empezaremos reconociendo solo integers, para nuestros operadores aritmeticos basicos, ademas tambien incluiremos [...]]]></description>
			<content:encoded><![CDATA[<p>Bien ahora nos dedicaremos a escribir una calculadora usando mostaza y mayonesa (oseace flex and bison). Como primer objetivo escribiremos un scanner, y despues un parser y los haremos trabajar juntos como una familia feliz lo haria&#8230; <img src='http://gulsin.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> &#8230;.</p>
<p>Para mantener las cosas simples, empezaremos reconociendo solo integers, para nuestros operadores aritmeticos basicos, ademas tambien incluiremos un operador unario absoluto.</p>
<p><a href='http://gulsin.org/wp-content/uploads/2012/05/calculadora_flex1.png' title='calculadora_flex1.png'><img src='http://gulsin.org/wp-content/uploads/2012/05/calculadora_flex1.png' alt='calculadora_flex1.png' /></a></p>
<p>* Los primeros 5 patrones son operadores literales, escritos entre comillas, y las acciones por ahora solo imprimiran un mensaje que indican que hicieron match. Las comillas le dicen a flex que use las cademas como estan, mas que interpretarlas como expresiones regulares.</p>
<p>* El sexto patron busca un integer. La accion imprimira el patron que ha detectado usando el apuntador <strong>char *yytext</strong> que el scanner establece despues de cada match.</p>
<p>* El septimo patron marca un caracter de nueva linea, representado por el usual \n .</p>
<p>* El octavo patron ignora los espacios en blanco. Este hace match sobre cualquier unico espacio en blanco o  tab (\t), y la accion vacia sencillamente no hace nada.</p>
<p>* El patron final es el cachalo todo, este cachara todo lo que los otros patrones no cacharon. Su codigo de accion imprira un mensaje informativo.</p>
<p>Estos 9 patrones ahora proveen reglas para hacer match con cualquier cosa que el usuario pudiece alimentar a nuestro scanner (de moemnto).</p>
<p><strong><br />
Y aqui compilamos el analizador lexico generado con flex..</strong></p>
<p><a href='http://gulsin.org/wp-content/uploads/2012/05/screen-shot-2012-05-15-at-51013-pm.png' title='screen-shot-2012-05-15-at-51013-pm.png'><img src='http://gulsin.org/wp-content/uploads/2012/05/screen-shot-2012-05-15-at-51013-pm.png' alt='screen-shot-2012-05-15-at-51013-pm.png' /></a></p>
<p><em>El Scanner como  Corutina</em><br />
La mayoria de los programas con scanners flex, usan el scanner para retornar un flujo de tokens que son tomados por un  parser. Cada que el programa requiere un token, este llama a yylex(), el cual lee un pequeña entrada y retorna el token. Cuando este requiere otro token, este llama a yylex() de nuevo. Entonces se puede decir que el scanner actua como una corutina, esto significa que cada vez que este retorne algo , este recuerda donde estaba, y la siguiente llamada se traera lo que sigue.</p>
<p>Ahora modificaremos nuestro  scanner , entonces este retornara tokens que un parser puede usar para implementar una calculadora.</p>
<p><em><br />
Tokens y Valores</em><br />
Cuando un scanner flex retorna un flujo de tokens, cada token de hecho tendra 2 partes, <strong>el token y el valor del token</strong>. El token es un pequeño entero. Los numeros de token son arbitrarios, excepto que el token zero siempre simboliza fin de archivo. Cuando bison crea un parser, bison asigna los numeros de token automaticamente, iniciando en 258 (esto para evitar coliciones con los token de caracteres literales, cosa que discutiremos despues) y crea un .h con definiciones de numeros de tokens. Pero por ahora, nosotros definiremos algunos a mano:</p>
<p><a href='http://gulsin.org/wp-content/uploads/2012/05/screen-shot-2012-05-15-at-80253-pm.png' title='screen-shot-2012-05-15-at-80253-pm.png'><img src='http://gulsin.org/wp-content/uploads/2012/05/screen-shot-2012-05-15-at-80253-pm.png' alt='screen-shot-2012-05-15-at-80253-pm.png' /></a></p>
<p><strong>Calculador Scanner fb1-4.l (Primera Version)</strong></p>
<p><a href='http://gulsin.org/wp-content/uploads/2012/05/tokens_arbitrarios.png' title='tokens_arbitrarios.png'><img src='http://gulsin.org/wp-content/uploads/2012/05/tokens_arbitrarios.png' alt='tokens_arbitrarios.png' /></a></p>
<p>En esta version de calculadora hemos definido los numeros de token en un enum de C. Agregamos una variable yylval, es la variable que almacenara el valor del token, un integer, lo cual es lo adecuado para la primera version de nuestro calculador.<br />
Como podran observar la lista de patrones es la misma como en el ejemplo anterio, pero el codigo de acciones es diferente. Para cada uno de los tokens, el scanner retorna el codigo apropiado para el token; para numeros, este convierte el string de digitos a integer y almacena este en yylval despues del retorno. El patron espacio en blanco no retornara nada, entonces el scaner solo seguira buscando lo que sigue.</p>
<p>Solo por probar, aqui tenemos un pequeño programa que llama a  yylex(), que imprimira los valores de token, y, y para los tokens NUMBER , tambien se imprimira yylval.</p>
<p><a href='http://gulsin.org/wp-content/uploads/2012/05/screen-shot-2012-05-15-at-81051-pm.png' title='screen-shot-2012-05-15-at-81051-pm.png'><img src='http://gulsin.org/wp-content/uploads/2012/05/screen-shot-2012-05-15-at-81051-pm.png' alt='screen-shot-2012-05-15-at-81051-pm.png' /></a></p>
<p>Ahora que tenemos trabajando nuestro scanner, voltearemos nuestro atencion al parseo.</p>
<p><em>Gramaticas y Parseo</em><br />
El trabajo del parser is deducir la relacion entre los tokens de entrada. Una manera comun de desplegar tales relaciones es un arbol de parseo. Por ejemplo, bajo la usuales reglas de la aritmetica, la expresion aritmetica 1 * 2 + 3 * 4 + 5 la cual podria tener el siguiente arbol de parseo </p>
<p><a href='http://gulsin.org/wp-content/uploads/2012/05/screen-shot-2012-05-15-at-83930-pm.png' title='screen-shot-2012-05-15-at-83930-pm.png'><img src='http://gulsin.org/wp-content/uploads/2012/05/screen-shot-2012-05-15-at-83930-pm.png' alt='screen-shot-2012-05-15-at-83930-pm.png' /></a></p>
<p>La Multiplicacion tiene una mas alta precedencia que la adicion, entonces las dos primeras expresiones son 1 * 2 y 3 * 4. Entonces estas dos expressiones son agregadas juntas, y esta suma es entonces agregada a 5. Cave mencionar que cualquier parser bison parser genera un arbol de parseo a como este parsea su entrada.</p>
<p><em><br />
Gramaticas BNF</em><br />
En orden a escribir un parser, requerimos una manera para describir las <strong>reglas que usara un parser para convertir una secuencia de tokens dentro de un arbol de parseo</strong>. </p>
<p>La mas comun clase de lenguaje que un parser de computadora toma es uno que sea CFG (Context Free gramar). La forma estandart para escribir CFG es la forma Backus-Naur (BNF - backus Naur forma), creada alrededor de 1960 para describir Algol 60 y fue bautizado por 2 miembros del comite Algol.</p>
<p>Afortunadamente  BNF es sencillo. Aqui tenemos un ejemplo para la expresion aritmetica  1 * 2 + 3 * 4 + 5:</p>
<p><a href='http://gulsin.org/wp-content/uploads/2012/05/screen-shot-2012-05-15-at-90230-pm.png' title='screen-shot-2012-05-15-at-90230-pm.png'><img src='http://gulsin.org/wp-content/uploads/2012/05/screen-shot-2012-05-15-at-90230-pm.png' alt='screen-shot-2012-05-15-at-90230-pm.png' /></a></p>
<p>Cada linea es una regla que indica como crear una rama del arbol de parseo. En BNF, <strong>::=</strong> puede ser leido &#8220;es un&#8221; o &#8220;se convierte en&#8221; y <strong>|</strong> es &#8220;un OR logico&#8221; o si lo quieres ver asi, una manera de crear una rama del mismo tipo. <strong>El lado izquierdo de una regla es nombrado simbolo o terminal.</strong></p>
<p>Por convencion, todos los tokens son considerados simbolos, pero ojo con esto , <strong>tambien existen simbolos que no son tokens</strong>. Usualmente el muy util BNF es invariablemente y sin lugar a dudas recursivo, con reglas que hacen referencias a ellas mismas directa o indirectamente. </p>
<p><em><br />
El lenguaje de reglas para la entrada de Bison</em><br />
Las reglas de Bison son basicamente BNF, con la puntuaxcion simplificada un poquito para hacerlas a estas faciles de typear (verbo ochentero para teclar algo en el keyboard de tu computador) .</p>
<p>Aqui lo que seria el codigo Bison, inclullendo el  BNF, para la primera version de nuestra calculadora.</p>
<p><a href='http://gulsin.org/wp-content/uploads/2012/05/screen-shot-2012-05-15-at-91924-pm.png' title='screen-shot-2012-05-15-at-91924-pm.png'><img src='http://gulsin.org/wp-content/uploads/2012/05/screen-shot-2012-05-15-at-91924-pm.png' alt='screen-shot-2012-05-15-at-91924-pm.png' /></a></p>
<p>Observece que los programas Bison tienen (creanme que esto no es por coincidencia) las mismas 3 partes estructuradas como los programas flex</p>
<p>Compilando los programas de Flex y Bison Juntos! (que barbaridad)<br />
Antes de que compilemos el scanner y el parser dentro de un programa funcional. Tendremos que hacer unos pequeños cambios en el scanner, para que este pueda ser llamado desde el parser. Mas que definir token explicitos en la primera parte, incluiremos un archivo .h que bison va a crear por nosotros , el cual inclulle ambas definiciones (la de los tokens y yyval). </p>
<p><a href='http://gulsin.org/wp-content/uploads/2012/05/tokens_arbitrarios21.png' title='tokens_arbitrarios21.png'><img src='http://gulsin.org/wp-content/uploads/2012/05/tokens_arbitrarios21.png' alt='tokens_arbitrarios21.png' /></a></p>
<p>Ahora compilamos&#8230; siguiendo el siguiente orden</p>
<pre>
$ bison -d ARCHIVO_SINTACTICO.y
$ flex ARCHIVO_LEXICO.l
$ gcc lex.yy.c fb1-5.tab.c -lfl -o calculadora
</pre>
<p><a href='http://gulsin.org/wp-content/uploads/2012/05/screen-shot-2012-05-15-at-92402-pm.png' title='screen-shot-2012-05-15-at-92402-pm.png'><img src='http://gulsin.org/wp-content/uploads/2012/05/screen-shot-2012-05-15-at-92402-pm.png' alt='screen-shot-2012-05-15-at-92402-pm.png' /></a></p>
<p><em>Gramaticas Ambiguas</em><br />
Una de las grandes fortalezas de bison, y simultaneamente uno de sus mas impresionantes aspectos es, que este no puede parsear gramatica ambigua. Esto nos garantiza que cualquier parser que creemos con bison tendra solo una forma de parsear cualquier entrada que este parsee. La gramatica previa es ambigua, ya que  1 - 2 + 3 podria ser parseadado como (1-2) + 3 o como 1 - (2+3), lo cual son dos expresiones diferentes con valores diferentes. Tal vez en algunos casos este sutil nivel de ambiguedad podria ignorarce (como por ejemplo, 1+2+3), pero en la mayoria de los casos la ambiguedad es considerada un error que debera ser arreglado. </p>
<p><em>Agrando mas reglas para terminar con las Gramaticas Ambiguas</em><br />
<a href='http://gulsin.org/wp-content/uploads/2012/05/screen-shot-2012-05-18-at-103258-am.png' title='screen-shot-2012-05-18-at-103258-am.png'><img src='http://gulsin.org/wp-content/uploads/2012/05/screen-shot-2012-05-18-at-103258-am.png' alt='screen-shot-2012-05-18-at-103258-am.png' /></a><br />
<a href='http://gulsin.org/wp-content/uploads/2012/05/screen-shot-2012-05-18-at-104045-am.png' title='screen-shot-2012-05-18-at-104045-am.png'><img src='http://gulsin.org/wp-content/uploads/2012/05/screen-shot-2012-05-18-at-104045-am.png' alt='screen-shot-2012-05-18-at-104045-am.png' /></a></p>
<p>listo &#8230; ahora nuestra calculadora basica permite agrupar operaciones con parentesis.</p>
]]></content:encoded>
			<wfw:commentRss>http://gulsin.org/2012/05/15/flex-y-bison-trabajando-juntos/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Expresiones regulares en el Analisis Lexico de Flex</title>
		<link>http://gulsin.org/2012/05/15/expreciones-regulares-en-el-analisis-lexico/</link>
		<comments>http://gulsin.org/2012/05/15/expreciones-regulares-en-el-analisis-lexico/#comments</comments>
		<pubDate>Tue, 15 May 2012 20:32:05 +0000</pubDate>
		<dc:creator>Edwin Plauchu</dc:creator>
		
		<category><![CDATA[Programacion]]></category>

		<guid isPermaLink="false">http://gulsin.org/2012/05/15/expreciones-regulares-en-el-analisis-lexico/</guid>
		<description><![CDATA[Un analizador lexico (scanner) trabaja regularmente buscando los patrones de caracteres que le han sido alimentados en su entrada. La forma en que se describen estos patrones no son otra cosa mas que expresiones regulares.

Basicamente que hace Flex ?
Flex lee programas flex (pues asi es&#8230;), los programas flex consisten basicamente de una lista de expresiones [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Un analizador lexico (scanner) trabaja regularmente buscando los patrones de caracteres que le han sido alimentados en su entrada</strong>. La forma en que se describen estos patrones no son otra cosa mas que expresiones regulares.<br />
<em><br />
Basicamente que hace Flex ?</em><br />
Flex lee programas flex (pues asi es&#8230;), los programas flex consisten basicamente de una lista de expresiones regulares con instrucciones relacionadas a acciones, cuando la entrada de nuestro analizador lexico hace match con alguna de estas expresiones regulares, entonces se procedera a ejecutar la accion asociada a esa expresion regular con la que se hizo match.</p>
<p><strong><br />
Un ejemplo sencillo del uso de Flex, un mini programa flex</strong></p>
<p>Nuestro programita se llamara <em> fb1-1.l</em>, y el objetivo de este es contar la cantidad de lineas, caracteres y palabras que reciba la entrada de nuestro scanner.</p>
<p><a href='http://gulsin.org/wp-content/uploads/2012/05/screen-shot-2012-05-15-at-34252-pm.png' title='screen-shot-2012-05-15-at-34252-pm.png'><img src='http://gulsin.org/wp-content/uploads/2012/05/screen-shot-2012-05-15-at-34252-pm.png' alt='screen-shot-2012-05-15-at-34252-pm.png' /></a></p>
<p>Un programa flex consiste de 3 secciones , separadas por las lineas %% .</p>
<p>* <em>La primera seccion contiene declaraciones y opciones de parametrizacion</em>.<br />
* <em>La segunda contiene una lista de patrones y sus acciones</em>.<br />
* <em>La tercera codigo en c que es copiado al scanner generado</em>.</p>
<p>Ejecucion de nuestro ejemplo:</p>
<p><a href='http://gulsin.org/wp-content/uploads/2012/05/screen-shot-2012-05-15-at-35503-pm.png' title='screen-shot-2012-05-15-at-35503-pm.png'><img src='http://gulsin.org/wp-content/uploads/2012/05/screen-shot-2012-05-15-at-35503-pm.png' alt='screen-shot-2012-05-15-at-35503-pm.png' /></a></p>
<p><em>Explicacion detallada de nuestro ejemplo</em>:<br />
* Se manda a llamar al interprete flex y este transformara el fichero  fb1-1.l a un archivo de c. Ahora que tenemos nuestro analizador lexico en c, procedemos a compilarlo con el gcc , no olvides hacer referencia a la libreria flex (esto es posible agregando -lfl como libreria a la hora de llamar a gcc)<br />
* Te preguntaras y que cojones hace <strong>yylex()</strong> ? pues  esta funcion es la rutina scanner (observa su nombre .. ya que lleva la abreviacion lex de la palabra analizador lexico), en ausencia de cualquier otra parametrizacion, el scanner leera de la entrada estandart  (stdinput)</p>
<p><em>Nota sobre CTRL + D</em>: ^D es un caracter de fin de archivo en Unix/Linux. Sobre windows es  ^Z</p>
]]></content:encoded>
			<wfw:commentRss>http://gulsin.org/2012/05/15/expreciones-regulares-en-el-analisis-lexico/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Que son Flex y Bison ?</title>
		<link>http://gulsin.org/2012/05/15/que-son-flex-y-bison/</link>
		<comments>http://gulsin.org/2012/05/15/que-son-flex-y-bison/#comments</comments>
		<pubDate>Tue, 15 May 2012 20:19:01 +0000</pubDate>
		<dc:creator>Edwin Plauchu</dc:creator>
		
		<category><![CDATA[Programacion]]></category>

		<guid isPermaLink="false">http://gulsin.org/2012/05/15/que-son-flex-y-bison/</guid>
		<description><![CDATA[Flex y Bison: son herramientas para los escritores de compiladores e interpretes, ademas de ser  herramientas muy utiles para muchas otras aplicaciones que no son precisamente compiladores.
Teniendo la siguiente expresion alfa = beta + gama podriamos decir que:

Escaneo o analisis lexico: Es el Proceso encargado de dividir el texto leido sobre un archivo o [...]]]></description>
			<content:encoded><![CDATA[<p><em>Flex y Bison</em>: son herramientas para los escritores de compiladores e interpretes, ademas de ser  herramientas muy utiles para muchas otras aplicaciones que no son precisamente compiladores.</p>
<p>Teniendo la siguiente expresion <strong>alfa = beta + gama</strong> podriamos decir que:</p>
<p><em><br />
Escaneo o analisis lexico</em>: Es el Proceso encargado de dividir el texto leido sobre un archivo o buffer de memoria, y traducirlo a pequeños pedacitos llamados tokens. Se podria decir que el scanner (aquel proceso que realiza el analisis lexico) divide el texto alimentado en tokens como alpha , beta , gama, signo de mas, signo igual .. etc.</p>
<p><em>Parseo o analisis sintactico</em>: Se podria decir que el parser (aquel proceso que hace el analisis sintactico) determinara que &#8220;beta + gama&#8221; es una expresion y que la expresion es asignada a alfa.</p>
<p>conclusiones:<br />
<strong>* Flex es un Analizador Lexico<br />
* Bison es un Analizador Sintactico</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://gulsin.org/2012/05/15/que-son-flex-y-bison/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Demo Pentaho</title>
		<link>http://gulsin.org/2012/05/09/demo-pentaho/</link>
		<comments>http://gulsin.org/2012/05/09/demo-pentaho/#comments</comments>
		<pubDate>Wed, 09 May 2012 19:07:17 +0000</pubDate>
		<dc:creator>Edwin Plauchu</dc:creator>
		
		<category><![CDATA[Bi (Inteligencia de negocios)]]></category>

		<guid isPermaLink="false">http://gulsin.org/2012/05/09/demo-pentaho/</guid>
		<description><![CDATA[Para verlo en pantalla completa, basta con solo dar doble click en el video

]]></description>
			<content:encoded><![CDATA[<p>Para verlo en pantalla completa, basta con solo dar doble click en el video</p>
<p><iframe width="560" height="315" src="http://www.youtube.com/embed/I56tZxSnXic" frameborder="0" allowfullscreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://gulsin.org/2012/05/09/demo-pentaho/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Bash Shell script para borrar los ficheros .svn de un proyecto (forma recursiva)</title>
		<link>http://gulsin.org/2012/05/09/bash-shell-script-para-borrar-los-ficheros-svn-de-un-proyecto-forma-recursiva/</link>
		<comments>http://gulsin.org/2012/05/09/bash-shell-script-para-borrar-los-ficheros-svn-de-un-proyecto-forma-recursiva/#comments</comments>
		<pubDate>Wed, 09 May 2012 18:52:07 +0000</pubDate>
		<dc:creator>Edwin Plauchu</dc:creator>
		
		<category><![CDATA[Programacion]]></category>

		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://gulsin.org/2012/05/09/bash-shell-script-para-borrar-los-ficheros-svn-de-un-proyecto-forma-recursiva/</guid>
		<description><![CDATA[En ocaciones esto puede llegar a ser necesario&#8230;
no me preguntes cuando&#8230; si estas lellendo esto es por que necesitas borrar este tipo de fichero oculto

#!/bin/sh
echo "recursively removing .svn folders from"
pwd
rm -rf `find . -type d -name .svn

]]></description>
			<content:encoded><![CDATA[<p>En ocaciones esto puede llegar a ser necesario&#8230;<br />
no me preguntes cuando&#8230; si estas lellendo esto es por que necesitas borrar este tipo de fichero oculto</p>
<pre>
#!/bin/sh
echo "recursively removing .svn folders from"
pwd
rm -rf `find . -type d -name .svn
</pre>
]]></content:encoded>
			<wfw:commentRss>http://gulsin.org/2012/05/09/bash-shell-script-para-borrar-los-ficheros-svn-de-un-proyecto-forma-recursiva/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ejemplo de Velocity 1.6.4 con Java</title>
		<link>http://gulsin.org/2012/04/25/ejemplo-de-velocity-164-con-java/</link>
		<comments>http://gulsin.org/2012/04/25/ejemplo-de-velocity-164-con-java/#comments</comments>
		<pubDate>Wed, 25 Apr 2012 23:50:55 +0000</pubDate>
		<dc:creator>Edwin Plauchu</dc:creator>
		
		<category><![CDATA[Programacion]]></category>

		<guid isPermaLink="false">http://gulsin.org/2012/04/25/ejemplo-de-velocity-164-con-java/</guid>
		<description><![CDATA[Ejemplo de Velocity 1.6.4 con Java


/*
 * To change this template, choose Tools &#124; Templates
 * and open the template in the editor.
 */
package com.xpress.sinimportancia;

import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import java.io.StringWriter;
import java.util.LinkedHashMap;
import java.util.Iterator;
import java.util.Properties;

/**
 *
 * @author pianodaemon
 */
public class QuicklyVelocityTemplate {

    private static VelocityContext convert2context( LinkedHashMap params){
       [...]]]></description>
			<content:encoded><![CDATA[<p>Ejemplo de Velocity 1.6.4 con Java</p>
<pre>

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.xpress.sinimportancia;

import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import java.io.StringWriter;
import java.util.LinkedHashMap;
import java.util.Iterator;
import java.util.Properties;

/**
 *
 * @author pianodaemon
 */
public class QuicklyVelocityTemplate {

    private static VelocityContext convert2context( LinkedHashMap<String,Object> params){
        VelocityContext context = new VelocityContext();
        Iterator it = params.keySet().iterator();
        while (it.hasNext()) {
            String key = ( String ) it.next();
            String value = ( String ) params.get( key );
            context.put(key , value);
        }
        return context;
    }

    public static String pegarDatosConPlantilla(String filevm , LinkedHashMap<String,Object> params){
        String valor_retorno = null;
        Template template = null;
        StringWriter writer = new StringWriter();
        VelocityEngine engine = new VelocityEngine();

        String ruta_platillas = System.getenv(&#8221;HOME&#8221;) + &#8220;/&#8221; + &#8220;vmtemplates/&#8221;;

        System.out.println(ruta_platillas);

        Properties p = new Properties();
        p.setProperty(&#8221;resource.loader&#8221;, &#8220;file&#8221;);
        p.setProperty(&#8221;runtime.log.logsystem.class&#8221;, &#8220;org.apache.velocity.runtime.log.SimpleLog4JLogSystem&#8221;);
        p.setProperty(&#8221;runtime.log.logsystem.log4j.category&#8221;,&#8221;org.apache.velocity.runtime.log.SimpleLog4JLogSystem&#8221;);
        p.setProperty(&#8221;file.resource.loader.cache&#8221;,&#8221;false&#8221;);
        p.setProperty(&#8221;file.resource.loader.modificationCheckInterval&#8221;,&#8221;2&#8243;);
        p.setProperty(&#8221;file.resource.loader.class&#8221;,&#8221;org.apache.velocity.runtime.resource.loader.FileResourceLoader&#8221;);
        p.setProperty(&#8221;file.resource.loader.path&#8221;, ruta_platillas);

        try {
            engine.init(p);
            template = engine.getTemplate(filevm);
            template.merge( convert2context(params) , writer );
            valor_retorno = writer.toString();
        } catch( Exception e ) {
            System.out.println(&#8221;Exception caught: &#8221; + e.toString());
        }        

        return valor_retorno;
    }
}
</pre>
<pre>
package com.xpress.ejemplodevelocity;

import com.xpress.sinimportancia.QuicklyVelocityTemplate;
import java.util.LinkedHashMap;

/**
 * Hello world!
 *
 */
public class App {

    public static void main( String[] args ){

        String mi_plantilla = "ejemplo.vm";
        String nombre = "Edwin Plauchu";

        LinkedHashMap<String,Object> params =  new LinkedHashMap<String,Object>();

        params.put(&#8221;programador&#8221;,nombre);

        System.out.println( QuicklyVelocityTemplate.pegarDatosConPlantilla(mi_plantilla, params) );

    }
}
</pre>
<p>Aqui mi archivo ejemplo.vm</p>
<pre>
--------------------
Esto es una salida
Pantalla formateada
por: $programador
--------------------
</pre>
<p>Mi salida Generada</p>
<pre>
--------------------
Esto es una salida
Pantalla formateada
por: Edwin Plauchu
--------------------
</pre>
<p>Por ultimo esto son los jar requeridos<br />
<em>velocity-1.6.3-dep.jar<br />
commons-collections-3.2.1.jar<br />
commons-lang-2.5.jar<br />
commons-io-1.4.jar</em></p>
]]></content:encoded>
			<wfw:commentRss>http://gulsin.org/2012/04/25/ejemplo-de-velocity-164-con-java/feed/</wfw:commentRss>
		</item>
		<item>
		<title>La funcion strtok() de string.h</title>
		<link>http://gulsin.org/2012/04/18/la-funcion-strtok-de-stringh/</link>
		<comments>http://gulsin.org/2012/04/18/la-funcion-strtok-de-stringh/#comments</comments>
		<pubDate>Wed, 18 Apr 2012 17:07:50 +0000</pubDate>
		<dc:creator>Edwin Plauchu</dc:creator>
		
		<category><![CDATA[Mac]]></category>

		<category><![CDATA[Programacion]]></category>

		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://gulsin.org/2012/04/18/la-funcion-strtok-de-stringh/</guid>
		<description><![CDATA[La funcion strtok() puede usarse para analizar (parse) la cadena  s  en tokens. La primera llamada a strtok() deberia tener s como primer argumento. Llamadas subsiguientes deberían tener el primer argumento puesto a  NULL.  Cada  llamada  devuelve un puntero al siguiente token, o NULL cuando no se pueden encontrar [...]]]></description>
			<content:encoded><![CDATA[<p>La funcion strtok() puede usarse para analizar (parse) la cadena  <strong>s</strong>  en tokens. La primera llamada a strtok() deberia tener <strong>s</strong> como primer argumento. Llamadas subsiguientes deberían tener el primer argumento puesto a  <strong>NULL</strong>.  Cada  llamada  devuelve un puntero al siguiente token, o NULL cuando no se pueden encontrar mas tokens.</p>
<p><a href='http://gulsin.org/wp-content/uploads/2012/04/screen-shot-2012-04-18-at-120725-pm.png' title='screen-shot-2012-04-18-at-120725-pm.png'><img src='http://gulsin.org/wp-content/uploads/2012/04/screen-shot-2012-04-18-at-120725-pm.png' alt='screen-shot-2012-04-18-at-120725-pm.png' /></a></p>
<p>Un ejemplo bastante sencillo</p>
<pre>

#include string.h
#include stdio.h

char string[] = "una cadena de  tokens";
char *token;

int main(void){

        token = strtok(string , " "); /*Separamos por espacios*/
        while (token != NULL){
                printf("El token es:  %s&#92;n", token);
                token = strtok(NULL," ");
        }

        return 0;
}
</pre>
<p>Esta sera la salida obtenida despues de compilarlo y ejecutarlo<br />
Edwins-MacBook-Pro:~ pianodaemon$ gcc ejemplo.c<br />
Edwins-MacBook-Pro:~ pianodaemon$ ./a.out </p>
<pre>
El token es:  una
El token es:  cadena
El token es:  de
El token es:  tokens
</pre>
]]></content:encoded>
			<wfw:commentRss>http://gulsin.org/2012/04/18/la-funcion-strtok-de-stringh/feed/</wfw:commentRss>
		</item>
		<item>
		<title>La llamada al sistema read( ) de Linux</title>
		<link>http://gulsin.org/2012/04/18/la-llamada-al-sistema-read-de-linux/</link>
		<comments>http://gulsin.org/2012/04/18/la-llamada-al-sistema-read-de-linux/#comments</comments>
		<pubDate>Wed, 18 Apr 2012 14:58:32 +0000</pubDate>
		<dc:creator>Edwin Plauchu</dc:creator>
		
		<category><![CDATA[Programacion]]></category>

		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://gulsin.org/2012/04/18/la-llamada-al-sistema-read-de-linux/</guid>
		<description><![CDATA[La llamada al sistema read() es el mas comun y basico mecanismo usado para la lectura de bytes al estilo crudo, read() esta definida dentro de los estandares POSIX.1

Cada que se lea una longitud de bytes determinada por la variable len, los bytes leidos caeran en buf, estos bytes leidos proveendran de la actual posicion [...]]]></description>
			<content:encoded><![CDATA[<p>La llamada al sistema <em>read()</em> es el mas comun y basico mecanismo usado para la <strong>lectura de bytes al estilo crudo</strong>, read() esta definida dentro de los estandares POSIX.1</p>
<p><a href='http://gulsin.org/wp-content/uploads/2012/04/screen-shot-2012-04-18-at-95807-am.png' title='screen-shot-2012-04-18-at-95807-am.png'><img src='http://gulsin.org/wp-content/uploads/2012/04/screen-shot-2012-04-18-at-95807-am.png' alt='screen-shot-2012-04-18-at-95807-am.png' /></a></p>
<p>Cada que se lea una longitud de bytes determinada por la variable <strong>len</strong>, los bytes leidos caeran en <strong>buf</strong>, estos bytes leidos proveendran de la actual posicion de desplazamiento (comunmente conocida como offset) del archivo referenciado por el descriptor de archivo <strong>fd</strong>. </p>
<p>Cuando se invoca a la funcion read() con exito, el numero de bytes escritos dentro de <strong>buf </strong>, sera el valor retorno que nos regrese la funcion. En caso de suceder un error, la llamada al sistema read nos retornara  -1, y la variable  <em>errno </em> sera establecida al tipo de error que se sucito.</p>
<p><strong>* Un ejemplo impractico de su uso (pero ilustrativo)</strong></p>
<p>Este ejemplo lee de el file descriptor fd y pasa lo leido a word. El numero de bytes leidos es igual a la medida de el tipo unsigned long type, el cual suele ser cuatro bytes sobre sistemas Linux de 32-bit, y ocho bytes sobre sistemas de 64 bits.</p>
<p><a href='http://gulsin.org/wp-content/uploads/2012/04/screen-shot-2012-04-18-at-101211-am.png' title='screen-shot-2012-04-18-at-101211-am.png'><img src='http://gulsin.org/wp-content/uploads/2012/04/screen-shot-2012-04-18-at-101211-am.png' alt='screen-shot-2012-04-18-at-101211-am.png' /></a></p>
<p><strong>* Mas consideraciones a tomar en base a los Valores de Retorno que nos puede arrojar read()</strong></p>
<p>Es muy legal que read( ) nos llegue a retornar un valor menor que len. Esto puede suceder por distintas razones:<br />
a) Menos bytes que los indicados por len pudieron haber estado disponibles<br />
b) La llamada pudo haber sido interrumpida por una señal<br />
c) La tuberia fue rota (si fd fuece una tuberia)<br />
d) Algunas cosas mas.</p>
<p>La posibilidad de un valor de retorno 0 es otra consideracion cuando usamos read( ). La llamada al sistema read( ) retorna 0 para indicar fin de archivo o EOF (end-of-file), en este caso no existen mas bytes que leer del archivo a que hace referencia el fd. </p>
<p><em>EOF</em>: no es considerado un error, este simplemente indica que la posicion del archivo avanzo mas alla de el ultimo offset valido en el archivo.</p>
<p><strong><br />
* Direfencia entre EOF y la lectura de bytes que aun no estan disponibles</strong></p>
<p>Que pasaria si un llamada a read fuece hecha por la cantidad de bytes que indica len, pero estos bytes no estubiecen disponibles para lectura, read se bloquearia (dormiria) hasta que los bytes estubiecen disponibles (asumiendo que el descriptor de archivo no fue abierto en modo non-blocking). Aclaremos de que esto es totalmente diferente de un tipo de un retorno EOF. Esto es, ya que existe una diferencia entre &#8220;no hay data disponible&#8221; y  &#8220;fin del data&#8221;. <em>En el caso de EOF, el final de archivo fue alcanzado. En el caso del bloqueo, read se quedo esperando por mas data, esto suele ser una cosa frecuente en la lectura de datos desde  socketes o archivos que representan dispositivos.</em></p>
<p><strong><br />
* Algunas situaciones se pueden solucionar</strong></p>
<p>Si una llamada a la read( ) es interrunpida por un señal antes que cualquier byte sea leido.</p>
]]></content:encoded>
			<wfw:commentRss>http://gulsin.org/2012/04/18/la-llamada-al-sistema-read-de-linux/feed/</wfw:commentRss>
		</item>
		<item>
		<title>La llamada al sistema create( ) de Linux</title>
		<link>http://gulsin.org/2012/04/13/la-llamada-al-sistema-create-de-linux/</link>
		<comments>http://gulsin.org/2012/04/13/la-llamada-al-sistema-create-de-linux/#comments</comments>
		<pubDate>Fri, 13 Apr 2012 16:21:46 +0000</pubDate>
		<dc:creator>Edwin Plauchu</dc:creator>
		
		<category><![CDATA[Programacion]]></category>

		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://gulsin.org/2012/04/13/la-llamada-al-sistema-create-de-linux/</guid>
		<description><![CDATA[
Una tipica llamada a create:

Es similar a lo que hariamos con open de esta manera:

]]></description>
			<content:encoded><![CDATA[<p><a href='http://gulsin.org/wp-content/uploads/2012/04/screen-shot-2012-04-13-at-112103-am.png' title='screen-shot-2012-04-13-at-112103-am.png'><img src='http://gulsin.org/wp-content/uploads/2012/04/screen-shot-2012-04-13-at-112103-am.png' alt='screen-shot-2012-04-13-at-112103-am.png' /></a></p>
<p>Una tipica llamada a create:</p>
<p><a href='http://gulsin.org/wp-content/uploads/2012/04/screen-shot-2012-04-13-at-63214-pm.png' title='screen-shot-2012-04-13-at-63214-pm.png'><img src='http://gulsin.org/wp-content/uploads/2012/04/screen-shot-2012-04-13-at-63214-pm.png' alt='screen-shot-2012-04-13-at-63214-pm.png' /></a></p>
<p>Es similar a lo que hariamos con open de esta manera:</p>
<p><a href='http://gulsin.org/wp-content/uploads/2012/04/screen-shot-2012-04-13-at-63520-pm.png' title='screen-shot-2012-04-13-at-63520-pm.png'><img src='http://gulsin.org/wp-content/uploads/2012/04/screen-shot-2012-04-13-at-63520-pm.png' alt='screen-shot-2012-04-13-at-63520-pm.png' /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://gulsin.org/2012/04/13/la-llamada-al-sistema-create-de-linux/feed/</wfw:commentRss>
		</item>
		<item>
		<title>La llamada al sistema open( ) de Linux</title>
		<link>http://gulsin.org/2012/04/11/la-llamada-al-sistema-open/</link>
		<comments>http://gulsin.org/2012/04/11/la-llamada-al-sistema-open/#comments</comments>
		<pubDate>Thu, 12 Apr 2012 00:18:05 +0000</pubDate>
		<dc:creator>Edwin Plauchu</dc:creator>
		
		<category><![CDATA[Programacion]]></category>

		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://gulsin.org/2012/04/11/la-llamada-al-sistema-open/</guid>
		<description><![CDATA[Cuando un  archivo file es abierto, entonces un file descriptor sera obtenido como el retorno de la llamada al sistema open( ):

La llamada al sistema open( ) mapea el archivo dado por el pathname hacia el file descriptor. La posicion sera establecida a zero, y entonces el archivo es accesado acorde a la flags [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando un  archivo file es abierto, entonces un file descriptor sera obtenido como el retorno de la llamada al sistema open( ):</p>
<p><a href='http://gulsin.org/wp-content/uploads/2012/04/screen-shot-2012-04-11-at-71731-pm.png' title='screen-shot-2012-04-11-at-71731-pm.png'><img src='http://gulsin.org/wp-content/uploads/2012/04/screen-shot-2012-04-11-at-71731-pm.png' alt='screen-shot-2012-04-11-at-71731-pm.png' /></a></p>
<p>La llamada al sistema open( ) mapea el archivo dado por el pathname hacia el file descriptor. La posicion sera establecida a zero, y entonces el archivo es accesado acorde a la flags (banderas) previamente suministradas.</p>
<p><em>Flags para open( )</em><br />
El argumento bandera debera ser uno de O_RDONLY, O_WRONLY, o O_RDWR. Respectivamente, estos argumentos solicitan que el archivo sea abierto solo para lectura, solo para escritura, o para ambos lectura y escritura.</p>
<p>Por ejemplo el siguiente codigo abre /home/j4nusx/plauchu.txt para lectura: </p>
<pre>
     int fd;
     fd = open ("/home/j4nusx/plauchu.txt", O_RDONLY);
     if (fd == -1)
          /* error */
</pre>
<p>Los flags puede tambien ser la combinacion, con el operador de bits OR (|), de una o mas de las siguientes flags:</p>
<p><strong>O_CREAT</strong><br />
<strong>O_EXCL</strong><br />
<strong>O_NOCTTY</strong><br />
<strong>O_APPEND</strong><br />
<strong>O_TRUNC</strong></p>
<p>Y alguna otras cuyo proposito puede ser consultado en la pagina de manual  <a href="http://www.linuxcertif.com/man/2/open/es/">open(2)</a></p>
<p>Por ejemplo, el siguiente codigo abre para escritura el archivo /home/teach/groovy. Si el archivo ya existiera, este sera truncado a la longitud de cero. Pero si el archivo no existiece ya que el flag O_CREAT no fue especificado, si el archivo no existe la llamada al sistema fallara (nos arrojara un -1):</p>
<pre>
int fd;
     fd = open ("/home/teach/groovy", O_WRONLY | O_TRUNC);
     if (fd == -1)
         /* error */
</pre>
<p><em><br />
Propietarios de los nuevos archivos creados</em></p>
<p>Determinar que usuario es propietario de un archivo recien creado es algo directo: el uid de del propietario del archivo es el uid del proceso que lo creo.</p>
<p>Determinar  el grupo propietario es algo mas complicado. El comportamiento por default es establecer el grupo del archivo a el efective gid del proceso que ha creado el archivo. Este suele ser el comportamiento del System V (este fue el modelo adoptado por linux), y el modus operndi standard de Linux.</p>
<p>Para hacerlo dificil , ademas, BSD definio su propio comportamiento: El grupo propietario del archivo es establecido al gid del directorio padre. Este comportamiento es disponible en linux con la opcion mount. </p>
<p><em>Permisos de los nuevos archivos creados</em><br />
Ambas de las forma de llamar la llamada al sistema open( ) son validas. El modo argumento es ignorado hasta que el archivo es creado; Es este requerido si O_CREAT es dado. Si olvidaste proveer el argumento modo cuando se usa O_CREAT, los resultados suelen ser indefinidos, y a menudo un poco feos, por lo que te recomiendo no olvidarlo!</p>
<p>Cuando un archivo es creado, el argumento modo provee los permiso al nuevo archivo creado. El modo no es checado sobre el archivo abierto, lo que nos permite realizar operaciones contradictorias, como lo es abrir el archivo para escritura, pero asignando a su vez permisos de solo lectura a este.</p>
<p>El argumento modo es el familiar estilo octal de Unix (esto para definir el conjunto de bits) como lo es 0644. </p>
<p>Para compensar la no portabilidad de las posiciones de los bit en el argumento modo, POSIX introdujo el siguiente conjunto de constantes:</p>
<p>S_IRWXU<br />
Owner has read, write, and execute permission.</p>
<p>S_IRUSR<br />
Owner has read permission.</p>
<p>S_IWUSR<br />
Owner has write permission.</p>
<p>S_IXUSR<br />
Owner has execute permission.</p>
<p>S_IRWXG<br />
Group has read, write, and execute permission.</p>
<p>S_IRGRP<br />
Group has read permission.</p>
<p>S_IWGRP<br />
Group has write permission.</p>
<p>S_IXGRP<br />
Group has execute permission.</p>
<p>S_IRWXO<br />
Everyone else has read, write, and execute permission.</p>
<p>S_IROTH<br />
Everyone else has read permission.</p>
<p>S_IWOTH<br />
Everyone else has write permission.</p>
<p>S_IXOTH<br />
Everyone else has execute permission.</p>
<p>La creacion de nuevos archivos y sus permisos sera afectada por umask (<br />
umask (abreviatura de user mask, mascara de usuario) es una orden y una funcion en entornos POSIX que establece los permisos por defecto para los nuevos archivos y directorios creados por el proceso actual ).</p>
]]></content:encoded>
			<wfw:commentRss>http://gulsin.org/2012/04/11/la-llamada-al-sistema-open/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

