<?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>IPCorp Blog</title>
	<atom:link href="http://www.ipcorp.com.ar/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ipcorp.com.ar/blog</link>
	<description>#pg_dump ideas &#62; blog.log</description>
	<lastBuildDate>Thu, 29 Jul 2010 23:34:44 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>JasperReports con Jruby y Rails</title>
		<link>http://www.ipcorp.com.ar/blog/2010/07/29/jasperreports-con-jruby-y-rails/</link>
		<comments>http://www.ipcorp.com.ar/blog/2010/07/29/jasperreports-con-jruby-y-rails/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 23:34:44 +0000</pubDate>
		<dc:creator>Carlos Barbiero</dc:creator>
				<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Lenguajes de Programación]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[datasource]]></category>
		<category><![CDATA[i-report]]></category>
		<category><![CDATA[ireport]]></category>
		<category><![CDATA[jasperreports]]></category>
		<category><![CDATA[jruby]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://www.ipcorp.com.ar/blog/?p=716</guid>
		<description><![CDATA[Uno de los grandes problemas en el desarrollo con Ruby on Rails son los reportes multipágina. Debido a que el HTML (inclusive HTML 5) no soporta multipágina, si utilizamos Jruby tenemos la posibilidad de usar cualquier librería Java en nuestro desarrollo.
Afortunadamente en Java tenemos JasperReports (http://jasperforge.org/), una excelente solución al problema antes mencionado.
Para poder incluir [...]]]></description>
			<content:encoded><![CDATA[<p>Uno de los grandes problemas en el desarrollo con Ruby on Rails son los reportes multipágina. Debido a que el HTML (inclusive HTML 5) no soporta multipágina, si utilizamos Jruby tenemos la posibilidad de usar cualquier librería Java en nuestro desarrollo.<br />
Afortunadamente en Java tenemos JasperReports (http://jasperforge.org/), una excelente solución al problema antes mencionado.</p>
<p>Para poder incluir un reporte realizado con JasperReports en nuestra aplicación Jruby necesitamos:</p>
<p>1) Descargar I-Report, la herramienta de administracion de reportes de JasperReports. <a href="http://jasperforge.org/projects/ireport">http://jasperforge.org/projects/ireport</a> y descomprimirlo.</p>
<p>2) Dentro del directorio del i-report, ir a modules/ext/ y copiar todos los archivos .jar (si, todos <img src='http://www.ipcorp.com.ar/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ) al directorio lib de la instalación de JRuby. De esta manera, ya incluimos las librerías necesarias y tenemos preparado nuestro JRuby para utilizar JasperReports.</p>
<p>3) Nos resta crear un reporte para prueba, si nunca hiciste un reporte con i-report: <a href="http://jasperforge.org//website/ireportwebsite/IR%20Website/ir_design_a_report.html?header=project&amp;target=ireport">http://jasperforge.org//website/ireportwebsite/IR%20Website/ir_design_a_report.html?header=project&amp;target=ireport</a></p>
<p>4) Finalmente el código para correr nuestro reporte es el siguiente:</p>
<pre name="code" class="ruby">require 'java'
import 'oracle.jdbc.OracleDriver' #Aqui necesitas Utilizar el Driver de la Base de datos que estas usando, en mi caso es oracle
import 'net.sf.jasperreports.engine.JasperCompileManager'
import 'org.apache.commons.dbcp.BasicDataSource'
import'java.util.HashMap'
import'net.sf.jasperreports.engine.JasperFillManager'
import'net.sf.jasperreports.engine.JasperExportManager'                                                                             

#Creo el datasource
basicdatasource = BasicDataSource.new
basicdatasource.driver_class_name = 'oracle.jdbc.OracleDriver'
basicdatasource.username = 'usuario'
basicdatasource.password = 'password'
basicdatasource.url = 'jdbc:oracle:thin:@localhost:1521:XE'
basicdatasource.connection
conexion = basicdatasource.connection

#Compilamos el reporte
jasperReport = JasperCompileManager.compile_report('/url_de_tu_archivo_jrxml/reporte.jrxml')
#Para pasar los parámetros, definimos un objeto HashMap
m = HashMap.new
m.put('parametro_1','valor_parametro_1')
m.put('parametro_2','valor_parametro_2')
m.put('parametro_n','valor_parametro_n')

#Genero el reporte
jasperPrint = JasperFillManager.fill_report(jasperReport, m,conexion)                           

#Exporto el PDF
JasperExportManager.export_report_to_pdf_file(jasperprint, 'path_al_archivo_PDF.pdf')</pre>
<p>Si deseamos generar reportes en Rails, podemos por ejemplo ubicar los reportes en el directorio public/reportes y utilizar  send_file para enviarlos, por ejemplo:</p>
<pre name="code" class="ruby">
JasperExportManager.export_report_to_pdf_file(jasperprint, RAILS_ROOT+"/public/reportes/reporte.pdf")
send_file RAILS_ROOT+"/public/reportes/reporte.pdf"
</pre>
<p>Espero les sea de utilidad, cualquier cosa comenten y trataré de despejar dudas <img src='http://www.ipcorp.com.ar/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2010/07/29/jasperreports-con-jruby-y-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lo nuevo de PostgreSQL 9.0 ilustrado</title>
		<link>http://www.ipcorp.com.ar/blog/2010/07/07/lo-nuevo-en-postgresql-9-0-ilustrado/</link>
		<comments>http://www.ipcorp.com.ar/blog/2010/07/07/lo-nuevo-en-postgresql-9-0-ilustrado/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 13:30:16 +0000</pubDate>
		<dc:creator>alfredo</dc:creator>
				<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://www.ipcorp.com.ar/blog/?p=710</guid>
		<description><![CDATA[Esta nueva release de PostgreSQL tiene tantas mejoras que la comunidad de desarrolladores decidió saltear lo que sería la siguiente versión -PostgreSQL 8.5- pasando directamente a la 9.0, ya que se introdujeron más de 200 mejoras en dicha versión.
Para ir preparándonos y estar al tanto de todas estas mejoras, habilitaron en la wiki de PostgreSQL [...]]]></description>
			<content:encoded><![CDATA[<p>Esta nueva release de <a title="PostgreSQL" href="http://www.postgresql.org" target="_blank">PostgreSQL</a> tiene tantas mejoras que la comunidad de desarrolladores decidió saltear lo que sería la siguiente versión -PostgreSQL 8.5- pasando directamente a la 9.0, ya que se introdujeron más de 200 mejoras en dicha versión.</p>
<p>Para ir preparándonos y estar al tanto de todas estas mejoras, habilitaron en la wiki de PostgreSQL una sección especial donde se explican estos cambios con sus correspondientes ejemplos.</p>
<p>Entre los cambios más importantes tenemos la incorporación de características como:</p>
<ul>
<li><strong>Hot Standby:</strong> Esta característica nos permite crear una base de datos &#8216;Standby&#8217;. Esto es una segunda instancia de la base de datos: normalmente en un servidor separado a partir del log binario de la primera base de datos, permientiendo que el servidor standby esté disponible para consultas de sólo lectura.</li>
<li><strong>Streaming Replication:</strong> Es un complemento de Hot Standby. Si bien existen varias soluciones de replicación de terceros disponibles para PostgreSQL, ésta nueva versión trae una simple e integrada versión que probablemente será usada como default en la mayoría de las soluciones de High Availability de PostgreSQL.</li>
</ul>
<p>Más info de las características nuevas y ejemplos en <a title="What's new in PostgreSQL 9" href="http://wiki.postgresql.org/wiki/Illustrated_9_0" target="_blank">What&#8217;s new in PostgreSQL 9.0</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2010/07/07/lo-nuevo-en-postgresql-9-0-ilustrado/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Detectando una dirección IP en conflicto a través de Linux.</title>
		<link>http://www.ipcorp.com.ar/blog/2010/05/11/detectando-una-ip-en-conflicto-con-linux/</link>
		<comments>http://www.ipcorp.com.ar/blog/2010/05/11/detectando-una-ip-en-conflicto-con-linux/#comments</comments>
		<pubDate>Tue, 11 May 2010 14:05:40 +0000</pubDate>
		<dc:creator>marcelo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.ipcorp.com.ar/blog/?p=703</guid>
		<description><![CDATA[En redes grandes y sin control es muy común encontrarse con IP duplicadas, si bien es un problema sencillo de resolver &#8220;Cuando lo encontramos&#8221;; suele causar dolores de cabeza hasta los mas experimentados administradores  que muchas veces recurren a soluciones tales como:

Cortar segmentos de la red.
Comprar software costosos.
Incorporar Hardware tipo cazafantasmas con luces psicodélicas.
Enviar memos [...]]]></description>
			<content:encoded><![CDATA[<p>En redes grandes y sin control es muy común encontrarse con IP duplicadas, si bien es un problema sencillo de resolver <em>&#8220;Cuando lo encontramos&#8221;</em>; suele causar dolores de cabeza hasta los mas experimentados administradores  que muchas veces recurren a soluciones tales como:</p>
<ul>
<li>Cortar segmentos de la red.</li>
<li>Comprar software costosos.</li>
<li>Incorporar Hardware tipo cazafantasmas con luces psicodélicas.</li>
<li>Enviar memos y reprimir a los empleados que no son de sistemas, que no tienen la mas mínima idea de lo que es una dirección de IP.</li>
</ul>
<p>Si en nuestra red tenemos una pc con linux esto es muy sencillo de resolver, el paquete se llama: <a href="http://en.wikipedia.org/wiki/Arping" target="_blank"><strong>arping</strong></a>.</p>
<p>Pasos para utilizarlo:</p>
<p>1) Instalación</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> arping</pre></div></div>

<p>2) Uso</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> arping <span style="color: #660033;">-I</span> eth0  192.168.0.1
&nbsp;
ARPING 192.168.0.1
<span style="color: #000000;">60</span> bytes from 00:<span style="color: #000000;">26</span>:<span style="color: #000000;">55</span>:<span style="color: #000000;">36</span>:ec:a1 <span style="color: #7a0874; font-weight: bold;">&#40;</span>192.168.0.1<span style="color: #7a0874; font-weight: bold;">&#41;</span>: <span style="color: #007800;">index</span>=<span style="color: #000000;">0</span> <span style="color: #007800;"><span style="color: #000000; font-weight: bold;">time</span></span>=<span style="color: #000000;">74.863</span> usec
<span style="color: #000000;">60</span> bytes from 00:1a:<span style="color: #000000;">92</span>:4e:4c:9e <span style="color: #7a0874; font-weight: bold;">&#40;</span>192.168.0.1<span style="color: #7a0874; font-weight: bold;">&#41;</span>: <span style="color: #007800;">index</span>=<span style="color: #000000;">1</span> <span style="color: #007800;"><span style="color: #000000; font-weight: bold;">time</span></span>=<span style="color: #000000;">160.933</span> usec</pre></div></div>

<p>Como se puede observar  el problema aquí es una IP duplicada asociada a dispositivos de red diferentes (placa de red, switch, router).</p>
<p>Su utilidad principal es hacer ping a direcciones mac, por ejemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> arping <span style="color: #660033;">-I</span> eth0  00:<span style="color: #000000;">26</span>:<span style="color: #000000;">55</span>:2e:<span style="color: #000000;">95</span>:EE
&nbsp;
ARPING 00:<span style="color: #000000;">26</span>:<span style="color: #000000;">55</span>:2e:<span style="color: #000000;">95</span>:EE
<span style="color: #000000;">98</span> bytes from 192.168.0.1 <span style="color: #7a0874; font-weight: bold;">&#40;</span>00:<span style="color: #000000;">26</span>:<span style="color: #000000;">55</span>:2e:<span style="color: #000000;">95</span>:EE<span style="color: #7a0874; font-weight: bold;">&#41;</span>: <span style="color: #007800;">icmp_seq</span>=<span style="color: #000000;">2738</span> <span style="color: #007800;"><span style="color: #000000; font-weight: bold;">time</span></span>=<span style="color: #000000;">771.392</span> msec
<span style="color: #000000;">98</span> bytes from 192.168.0.1 <span style="color: #7a0874; font-weight: bold;">&#40;</span>00:<span style="color: #000000;">26</span>:<span style="color: #000000;">55</span>:2e:<span style="color: #000000;">95</span>:EE<span style="color: #7a0874; font-weight: bold;">&#41;</span>: <span style="color: #007800;">icmp_seq</span>=<span style="color: #000000;">2740</span> <span style="color: #007800;"><span style="color: #000000; font-weight: bold;">time</span></span>=<span style="color: #000000;">770.830</span> msec</pre></div></div>

<p>Esto ultimo resulta interesante de utilizarlo en redes WIFI. Entonces, de manera muy sencilla y sin costos adicionales resolvimos un problema  con Linux, espero les sea útil esta información.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2010/05/11/detectando-una-ip-en-conflicto-con-linux/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>EGit: plugin de git para Eclipse</title>
		<link>http://www.ipcorp.com.ar/blog/2010/03/26/egit-plugin-de-git-para-eclipse/</link>
		<comments>http://www.ipcorp.com.ar/blog/2010/03/26/egit-plugin-de-git-para-eclipse/#comments</comments>
		<pubDate>Fri, 26 Mar 2010 20:13:09 +0000</pubDate>
		<dc:creator>roxana</dc:creator>
				<category><![CDATA[Herramientas]]></category>

		<guid isPermaLink="false">http://www.ipcorp.com.ar/blog/?p=686</guid>
		<description><![CDATA[ 
Para aquellos desarrolladores que utilizan el IDE Eclipse y el sistema de control de versiones git les va a interesar esta info:  org.eclipse hizo pública la primera versión del plug-in EGit que proporciona soporte integrado para el SCM distribuído git, utilizando JGit.
JGit es una biblioteca que implementa Git en Java. EGit, a diferencia [...]]]></description>
			<content:encoded><![CDATA[<p><span><span><span style="background-color: #ffffff;"><span><span><span style="background-color: #ffffff;"> </span></span></span></span></span></span></p>
<p><span id="e43j"><span><span style="background-color: #ffffff;"><span id="dxj-"><span><span style="background-color: #ffffff;">Para aquellos desarrolladores que utilizan el IDE Eclipse y el sistema de control de versiones git les va a interesar esta info: <span id="yw78"><span><span style="background-color: #ffffff;"><span id="u0rz"><span><span style="background-color: #ffffff;"> <em>org.eclipse</em></span></span></span></span></span></span> hizo pública <span id="x9ys"><span><span style="background-color: #ffffff;"><span id="aj7v"><span><span style="background-color: #ffffff;">la primera versión </span></span></span></span></span></span>del plug-in EGit que proporciona soporte integrado para el SCM distribuído git, utilizando JGit.</span></span></span></span></span></span><span id="e43j"><span><span style="background-color: #ffffff;"><span id="dxj-"><span><span style="background-color: #ffffff;"><br />
<span id="w113"><span><span style="background-color: #ffffff;">JGit es una biblioteca que implementa Git en Java. </span></span></span><span id="aegj"><span><span style="background-color: #ffffff;"><span id="mh:4"><span><span style="background-color: #ffffff;"><span id="hhg0"><span><span style="background-color: #ffffff;">EGit, a diferencia de Eclipse Subversion, no tiene dependencias externas o de los requisitos del código nativo.</span></span></span><br />
</span></span></span><br />
En la página del proyecto hay un <a id="hcvo" title="manual" href="http://wiki.eclipse.org/EGit/User_Guide">manual</a> muy completo.</span></span></span></span></span></span></span></span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2010/03/26/egit-plugin-de-git-para-eclipse/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Gbarcode. Codigos de barra con Ruby</title>
		<link>http://www.ipcorp.com.ar/blog/2010/03/16/gbarcode-codigos-de-barra-con-ruby/</link>
		<comments>http://www.ipcorp.com.ar/blog/2010/03/16/gbarcode-codigos-de-barra-con-ruby/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 22:38:40 +0000</pubDate>
		<dc:creator>Carlos Barbiero</dc:creator>
				<category><![CDATA[Lenguajes de Programación]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[barcode]]></category>
		<category><![CDATA[codigos de barras]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://www.ipcorp.com.ar/blog/?p=676</guid>
		<description><![CDATA[Gbarcode es una librería de generación de códigos de barra para Ruby. Es una extensión de C que envuelve el proyecto  GNU Barcode. Se distribuye en formato GEM
Link: http://gbarcode.rubyforge.org/
Ejemplo de uso:
require 'rubygems'
require 'gbarcode'

# Incluir el módulo

include Gbarcode

# Existen tres pasos para generar un codigo de barras
# 1) preparar el espacio para el string
# 2) codificar [...]]]></description>
			<content:encoded><![CDATA[<p>Gbarcode es una librería de generación de códigos de barra para Ruby. Es una extensión de C que envuelve el proyecto  GNU Barcode. Se distribuye en formato GEM</p>
<p>Link: <a href="http://gbarcode.rubyforge.org/">http://gbarcode.rubyforge.org/</a></p>
<p>Ejemplo de uso:</p>
<pre name="code" class="ruby">require 'rubygems'
require 'gbarcode'

# Incluir el módulo

include Gbarcode

# Existen tres pasos para generar un codigo de barras
# 1) preparar el espacio para el string
# 2) codificar el string como un codigo de barras
# 3) imprimir el codigo de barras

# preparar el codigo de barras para el string "TEST1234"

bc = barcode_create("TEST1234")

# codificar el codigo de barras usando code 39,
# desde que code 39 no usa dígito de verificacion (checksum),
# lo podemos pasar en un flag

barcode_encode(bc, BARCODE_NO_CHECKSUM | BARCODE_39)

#imprimir el codigo de barras usando postcript

barcode_print(bc, File.new("testout.ps", "w"), BARCODE_OUT_PS)

# ó

barcode_print(bc, File.new("testout.eps", "w"), BARCODE_OUT_EPS)
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2010/03/16/gbarcode-codigos-de-barra-con-ruby/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Whenever: una manera sencilla de administrar tareas en Cron con Ruby</title>
		<link>http://www.ipcorp.com.ar/blog/2010/03/15/whenever-una-manera-sencilla-de-administrar-tareas-en-cron-con-ruby/</link>
		<comments>http://www.ipcorp.com.ar/blog/2010/03/15/whenever-una-manera-sencilla-de-administrar-tareas-en-cron-con-ruby/#comments</comments>
		<pubDate>Mon, 15 Mar 2010 12:27:03 +0000</pubDate>
		<dc:creator>alfredo</dc:creator>
				<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[cron]]></category>
		<category><![CDATA[crontab]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[whenever]]></category>

		<guid isPermaLink="false">http://www.ipcorp.com.ar/blog/?p=652</guid>
		<description><![CDATA[Si bien hace bastante tiempo que soy usuario de GNU/Linux, no suelo crear tareas en cron con frecuencia por lo que necesito investigar su poderosa sintáxis cada vez que debo crear trabajos que deben ejecutarse a intervalos regulares.
Hace poco por casualidad me topé con Whenever, una gema de Ruby que nos permite crear tareas en [...]]]></description>
			<content:encoded><![CDATA[<p>Si bien hace bastante tiempo que soy usuario de <em>GNU/Linux</em>, no suelo crear tareas en <a title="cron" href="http://es.wikipedia.org/wiki/Cron_(Unix)" target="_blank">cron</a> con frecuencia por lo que necesito investigar su poderosa sintáxis cada vez que debo crear trabajos que deben ejecutarse a intervalos regulares.</p>
<p>Hace poco por casualidad me topé con <a title="whenever" href="http://github.com/javan/whenever" target="_blank">Whenever</a>, una <a title="Ruby Gems" href="http://es.wikipedia.org/wiki/RubyGems" target="_blank">gema</a> de <a title="Ruby" href="http://es.wikipedia.org/wiki/Ruby" target="_blank">Ruby</a> que nos permite crear tareas en <strong>cron </strong>de manera muy sencilla. A través de un <a title="Domain Specific Language" href="http://en.wikipedia.org/wiki/Domain-specific_language" target="_blank">DSL</a> nos abstrae de la complejidad de la sintáxis de cron.<em> Whenever</em> está muy integrado al framework de desarrollo web <a title="Ruby on Rails" href="http://es.wikipedia.org/wiki/Ruby_on_Rails" target="_blank">Ruby on Rails</a>, aunque puede utilizarse en un programa independiente que genera salidas de tareas para cron y hasta actualiza el archivo <em>crontab</em>.  En este post vamos a ver la manera de crear tareas con <em>Whenever</em> desde el punto de vista de un <em>Administrador de Sistemas</em>.</p>
<p><span id="more-652"></span></p>
<p>Como es habitual el primer paso es la instalación de la librería, ésto lo hacemos con el administrador de paquetes de Ruby:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> gem <span style="color: #c20cb9; font-weight: bold;">install</span> whenever</pre></div></div>

<p>Creamos un archivo <em><strong>scheduler.rb</strong></em> en donde vamos a detallar las tareas que queremos ejecutar y con qué frecuencia. La primer acción que deberíamos especificar es el <em><strong>path</strong></em> de trabajo a través de la directiva <em><strong>set</strong></em></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">set <span style="color:#ff3333; font-weight:bold;">:path</span>, <span style="color:#996600;">'/home/alfredo/Proyectos'</span></pre></div></div>

<p>Ahora definimos dentro de un bloque <em>every</em> la frecuencia con la que deseamos correr las tareas. Técnicamente, la frecuencia está determinada en segundos, pero es más fácil definirlas con <em>.minutes</em>, <em>.hours</em>, <em>.days</em> y <em>.months</em>.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># se ejecuta cada 15 minutos</span>
every 15.<span style="color:#9900CC;">minutes</span> <span style="color:#9966CC; font-weight:bold;">do</span>
   command <span style="color:#996600;">'comando_que_deseo_ejecutar'</span>
   command <span style="color:#996600;">'/usr/bin/aplicacion'</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Cuando la frecuencia es mayor a 1 hora, podemos agregar el parámetro <em>:at</em> y determinar en qué momento de ese período de tiempo ejecutamos la tarea dentro del bloque:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># se ejecuta cada 2 horas en el minuto 25 de cada hora</span>
every 2.<span style="color:#9900CC;">hours</span>, <span style="color:#ff3333; font-weight:bold;">:at</span> <span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#006666;">25</span> <span style="color:#9966CC; font-weight:bold;">do</span>
   command <span style="color:#996600;">'/ruta/comando'</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>También podemos especificar al parámetro <em>:at</em> con literales. Ésto es especialmente útil cuando tenemos frecuencias mayores a 1 día, por ejemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># ejecuta cada 2 dias a las 4:30 a.m.</span>
every 2.<span style="color:#9900CC;">days</span>, <span style="color:#ff3333; font-weight:bold;">:at</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;4:30am&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
   command <span style="color:#996600;">'/ruta/backup_base_datos'</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Si es necesario podemos decidir incluso el día de la semana en la que queremos que se ejecute:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># ejecuta todos los viernes a las 00:30 a.m.</span>
every <span style="color:#ff3333; font-weight:bold;">:friday</span>, <span style="color:#ff3333; font-weight:bold;">:at</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;00:30am&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
   command <span style="color:#996600;">'/ruta/backup_home'</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Es posible especificar cualquier día de la semana y además <em>:weekend</em> para correr un programa los sábados y domingos, y <em>:weekday</em> para cuando necesitamos hacerlo de lunes a viernes.</p>
<p>Para escribir el archivo crontab ejecutamos el siguiente comando:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">whenever <span style="color: #660033;">-f</span> scheduler.rb <span style="color: #660033;">--update-crontab</span></pre></div></div>

<p>Si todo salió bien deberíamos ver la siguiente salida <em>[write] crontab file updated</em> en la consola. Ahora resta revisar la salida con <em>crontab -e</em>.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000;">25</span> <span style="color: #000000;">0</span>,<span style="color: #000000;">2</span>,<span style="color: #000000;">4</span>,<span style="color: #000000;">6</span>,<span style="color: #000000;">8</span>,<span style="color: #000000;">10</span>,<span style="color: #000000;">12</span>,<span style="color: #000000;">14</span>,<span style="color: #000000;">16</span>,<span style="color: #000000;">18</span>,<span style="color: #000000;">20</span>,<span style="color: #000000;">22</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">/</span>ruta<span style="color: #000000; font-weight: bold;">/</span>comando
&nbsp;
<span style="color: #000000;">30</span> <span style="color: #000000;">4</span> <span style="color: #000000;">1</span>,<span style="color: #000000;">3</span>,<span style="color: #000000;">5</span>,<span style="color: #000000;">7</span>,<span style="color: #000000;">9</span>,<span style="color: #000000;">11</span>,<span style="color: #000000;">13</span>,<span style="color: #000000;">15</span>,<span style="color: #000000;">17</span>,<span style="color: #000000;">19</span>,<span style="color: #000000;">21</span>,<span style="color: #000000;">23</span>,<span style="color: #000000;">25</span>,<span style="color: #000000;">27</span>,<span style="color: #000000;">29</span>,<span style="color: #000000;">31</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">/</span>ruta<span style="color: #000000; font-weight: bold;">/</span>backup_base_datos
&nbsp;
<span style="color: #000000;">30</span> <span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000;">5</span> <span style="color: #000000; font-weight: bold;">/</span>ruta<span style="color: #000000; font-weight: bold;">/</span>backup_home
&nbsp;
<span style="color: #000000;">0</span>,<span style="color: #000000;">15</span>,<span style="color: #000000;">30</span>,<span style="color: #000000;">45</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> comando_que_deseo_ejecutar
&nbsp;
<span style="color: #000000;">0</span>,<span style="color: #000000;">15</span>,<span style="color: #000000;">30</span>,<span style="color: #000000;">45</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>aplicacion</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2010/03/15/whenever-una-manera-sencilla-de-administrar-tareas-en-cron-con-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spring. Decisiones de Control de Acceso</title>
		<link>http://www.ipcorp.com.ar/blog/2010/03/11/spring-decisiones-de-control-de-acceso/</link>
		<comments>http://www.ipcorp.com.ar/blog/2010/03/11/spring-decisiones-de-control-de-acceso/#comments</comments>
		<pubDate>Thu, 11 Mar 2010 14:00:15 +0000</pubDate>
		<dc:creator>gerardo</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Lenguajes de Programación]]></category>
		<category><![CDATA[Acceso]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://www.ipcorp.com.ar/blog/?p=619</guid>
		<description><![CDATA[En el proceso de autenticación, una aplicación permitirá a usuarios autenticados una serie de servicios permitidos. Cuando este usuario intenta acceder a un recurso en la aplicacion, tiene que tomar la decisión sobre qué recursos son accesibles con los permisos que tiene asignados o con otras características.
La decisión si a determinado usuario se le permite [...]]]></description>
			<content:encoded><![CDATA[<p>En el proceso de autenticación, una aplicación permitirá a usuarios autenticados una serie de servicios permitidos. Cuando este usuario intenta acceder a un recurso en la aplicacion, tiene que tomar la decisión sobre qué recursos son accesibles con los permisos que tiene asignados o con otras características.</p>
<p>La decisión si a determinado usuario se le permite acceder a un recurso dentro de la aplicación se llama <em>&#8220;decisión de control de acceso&#8221;</em>. Se basa en el estado de la autenticación del usuario, y de la naturaleza de los recursos y los atributos de acceso. En Spring security, las decisiones de control de acceso son llevados a cabo por los managers de decisión de acceso, los cuales deben implementar la interfaz <em>AccessDecisionManager</em>. Cada uno es libre de crear su propio manager de decisión de acceso implementando esta interfaz, de todas maneras Spring Security viene con tres managers que implementan esta interfaz basado en el método de votos.</p>
<p><span id="more-619"></span></p>
<table border="0">
<tbody>
<tr>
<th><strong>Método de Manager de Decisión de Acceso</strong></th>
<th><strong>Cuando conceder acceso</strong></th>
</tr>
<tr>
<td>AffirmativeBased</td>
<td>Al menos un votante vota para conceder acceso</td>
</tr>
<tr>
<td>ConsensusBased</td>
<td>Un concenso de vontantes para conceder acceso</td>
</tr>
<tr>
<td>UnanimousBased</td>
<td>Todos los votantes votan o se abstienen para conceder acceso, ninguno vota por denegar el accesos</td>
</tr>
</tbody>
</table>
<p>Todos estos managers de decision requieren un grupo de vontantes que se configuran para la votación sobre las decisiones de control de acceso. Cada votante debe implementar la interfaz AccessDecisionVoter. Un votante puede votar para garantizar el acceso, puede abstenerse de votar o puede denegar un recurso. Los resultados se representan por las constantes<em> ACCESS_GRANTED, ACCESS_DENIED, y ACCESS_ABSTAIN</em> que son definidos en la interfaz<em> AccessDecisionVoter</em>.<br />
Por defecto si no se especifica ningún manager de decision de acceso entonces Spring va a configurar automaticamente un manager con el método AffirmativeBased con los dos siguientes votantes:</p>
<ul>
<li> <strong>RoleVoter</strong>: vota por una decision de control de accesos basando en el rol del usuario. Solamente procesará los atributos de acceso que                                 contengan el prefijo ROLE_, pero este prefijo se puede configurar. Vota por garantizar el acceso si el usuario tiene el mismo rol que el requerido para accedejor al recurso. vota por denegar el acceso si el usuario carece del rol requerido. Si el recurso no tiene un atributo de acceso que comienza con el prefijo ROLE_, el vontante se abstendra de emitir su voto.</li>
<li><strong> AuthenticatedVoter</strong>: vota por una decision de control de acceso basado en niveles de autenticación de usuario. solamente procesará si el atributo de acceso es <em>IS_AUTHENTICATED_FULLY, IS_AUTHENTICATED_REMEMBERED, and IS_AUTHENTICATED_ANONYMOUSLY</em>. Votará afirmativamente si el nivel de autenticacion es superior que el atributo requerido. De arriba para abajo los niveles de autenticacion son: “fully authenticated,” “authentication remembered,” y “anonymously authenticated.”</li>
</ul>
<p>Por defecto, Spring security configurará un manager de decisión de acceso si no se especifica alguno. Este managaer de decision de acceso por defecto es equivalente al definido en la siguiente configuración:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bean</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;_accessManager&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;decisionVoters&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;list<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bean</span> <span style="color: #000066;">class</span>=org.springframework.security.vote.RoleVoter<span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bean</span> <span style="color: #000066;">class</span>=org.springframework.security.vote.AuthenticatedVoter<span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/list<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/property<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/bean<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Este manager de decision de acceso y su s votantes deberian satisfacer los requerimientos tipicos de autenticacion. No obstante, si no satisface alguno específico, se puede crear uno propio. En la mayoria de los casos, se necesitará crear un votante customizado. Por ejemplo, se puede crear un votante que tome decision en base a la direccion IP del usuario:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.apress.springrecipes.board.security</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.springframework.security.Authentication</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.springframework.security.ConfigAttribute</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.springframework.security.ConfigAttributeDefinition</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.springframework.security.ui.WebAuthenticationDetails</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> IpAddressVoter <span style="color: #000000; font-weight: bold;">implements</span> AccessDecisionVoter <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> IP_PREFIX <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;IP_&quot;</span><span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> IP_LOCAL_HOST <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;IP_LOCAL_HOST&quot;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> supports<span style="color: #009900;">&#40;</span>ConfigAttribute attribute<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">return</span> attribute.<span style="color: #006633;">getAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span>
     <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> attribute.<span style="color: #006633;">getAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">startsWith</span><span style="color: #009900;">&#40;</span>IP_PREFIX<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> supports<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">Class</span> clazz<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> vote<span style="color: #009900;">&#40;</span>Authentication authentication, <span style="color: #003399;">Object</span> object,
   ConfigAttributeDefinition config<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>authentication.<span style="color: #006633;">getDetails</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">instanceof</span> WebAuthenticationDetails<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">return</span> ACCESS_DENIED<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
WebAuthenticationDetails details <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>WebAuthenticationDetails<span style="color: #009900;">&#41;</span> authentication.<span style="color: #006633;">getDetails</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003399;">String</span> address <span style="color: #339933;">=</span> details.<span style="color: #006633;">getRemoteAddress</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">int</span> result <span style="color: #339933;">=</span> ACCESS_ABSTAIN<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Object</span> element <span style="color: #339933;">:</span> config.<span style="color: #006633;">getConfigAttributes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  ConfigAttribute attribute <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>ConfigAttribute<span style="color: #009900;">&#41;</span> element<span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">supports</span><span style="color: #009900;">&#40;</span>attribute<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    result <span style="color: #339933;">=</span> ACCESS_DENIED<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>IP_LOCAL_HOST.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span>attribute.<span style="color: #006633;">getAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>address.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;127.0.0.1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> ACCESS_GRANTED<span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">return</span> result<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Notar que este vontante procesará los atrbutos de acceso que comienzan con el prefijo IP_. Por el momento, solamente soporta el atributo IP_LOCAL_HOST. Su el usuario es un cliente web cuya direcciones IP es iguial a 127.0.0.1, votará por un acceso permitido. De otra forma, votará por denmegar el acceso. Si el recurso no tiene un atributo que comienza con IP_, entonces se abstine de votar.<br />
A continuación habra que definir un manager de decision de acceso personalizado  que incluya este votante:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;beans:bean</span> <span style="color: #000066;">id</span>=”accessDecisionManager” <span style="color: #000066;">class</span>=”org.springframework.security.vote.AffirmativeBased”<span style="color: #000000; font-weight: bold;">&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;beans:property</span> <span style="color: #000066;">name</span>=”decisionVoters”<span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;beans:list<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;beans:bean</span> <span style="color: #000066;">class</span>=”org.springframework.security.vote.RoleVoter” <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;beans:bean</span> <span style="color: #000066;">class</span>=”org.springframework.security.vote.AuthenticatedVoter” <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;beans:bean</span> <span style="color: #000066;">class</span>=”com.apress.springrecipes.board.security.IpAddressVoter” <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/beans:list<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/beans:property<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/beans:bean<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p><span style="font-family: Verdana; line-height: normal;">Ahora supongamos que nos gustaría permitir usuarios de maquinas que corren un container WEB. Habra que hacer referencia a este manager de decision de acceso desde el elemento de configuracion  &lt;http&gt; para agregar el atributo de acceso IP_LOCAL_HOST a la url  /messageDelete-htm*:</span></p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;http</span> <span style="color: #000066;">access-decision-manager-ref</span>=”accessDecisionManager”<span style="color: #000000; font-weight: bold;">&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;intercept-url</span> <span style="color: #000066;">pattern</span>=”/messageList.htm*” <span style="color: #000066;">access</span>=”ROLE_USER,ROLE_GUEST” <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;intercept-url</span> <span style="color: #000066;">pattern</span>=”/messagePost.htm*” <span style="color: #000066;">access</span>=”ROLE_USER” <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;intercept-url</span> <span style="color: #000066;">pattern</span>=”/messageDelete.htm*” <span style="color: #000066;">access</span>=”ROLE_ADMIN,IP_LOCAL_HOST” <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
…
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/http<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p><span style="font-weight: normal;">Entonces si se quiere acceder a la aplicacion board message desde localhost, no se necesitará loguearse como administrador para ejecutar la acción.</span></p>
<p><span style="font-family: Verdana; line-height: normal;"><em>Traducido de Apress Spring Recipes A Problem-Solution Approach (2008) - Gary Mak </em></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2010/03/11/spring-decisiones-de-control-de-acceso/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Salvando sistemas con SystemRescue y VirtualBox</title>
		<link>http://www.ipcorp.com.ar/blog/2010/02/01/salvando-sistemas-con-systemrescue-y-virtualbox/</link>
		<comments>http://www.ipcorp.com.ar/blog/2010/02/01/salvando-sistemas-con-systemrescue-y-virtualbox/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 05:50:21 +0000</pubDate>
		<dc:creator>marcelo</dc:creator>
				<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Sistemas Operativos]]></category>
		<category><![CDATA[system rescue]]></category>
		<category><![CDATA[virtualbox]]></category>

		<guid isPermaLink="false">http://www.ipcorp.com.ar/blog/?p=614</guid>
		<description><![CDATA[
Los héroes de esta historia son  dos:

SystemRescue
VirtualBox

El primero es una LiveDistro es decir una distribución de Linux que se ejecuta en el arranque sin instalarse en un disco duro. Un comentario al margen respecto de esto es que en nuestro país Argentina se encuentra una de las primeras LiveDistro del Planeta y lleva el [...]]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<p style="margin-bottom: 0cm;">Los héroes de esta historia son  dos:</p>
<ul>
<li><a href=" http://www.sysresccd.org" target="_blank">SystemRescue</a></li>
<li><a href=" http://www.virtualbox.org" target="_blank">VirtualBox</a></li>
</ul>
<p style="margin-bottom: 0cm;">El primero es una LiveDistro es decir una distribución de Linux que se ejecuta en el arranque sin instalarse en un disco duro. Un comentario al margen respecto de esto es que en nuestro país Argentina se encuentra una de las primeras LiveDistro del Planeta y lleva el nombre de UTUTO, además de ser la primer Distribución reconocida totalmente libre por el proyecto GNU.</p>
<p style="margin-bottom: 0cm;"><span id="more-614"></span></p>
<p style="margin-bottom: 0cm;">Volviendo a SystemRescue en particular la uso por el Kit de herramientas necesarias para cuando ocurre lo peor, una de estas herramientas que me agrada mucho utilizar es Partimage http://www.partimage.org, por medio de esta podemos crear imágenes comprimidas en Bzip2 o Gzip de particiones (ext2/3, ntfs, fat32,etc) y luego restaurarlas.Entonces si tengo una imagen de mi sistema esto me permitira clonarlo en otra maquina sin mayores problemas y si es una maquina virtual con VirtualBox mucho mejor.</p>
<p style="margin-bottom: 0cm;">Aqui nos detendremos a darle su mencion a VirtualBox que si bien hoy por hoy es parte del imperio Oracle, no deja de ser una herramienta útil, simple y actualizada. Entre las importantes cualidades que tiene para mi son: Multiplataforma y exportación Appliance.</p>
<p style="margin-bottom: 0cm;">Por lo tanto la idea es salvar sistemas de la siguiente manera:</p>
<ol>
<li>Booteo la maquina que quiero salvar con SystemRescue</li>
<li>Una vez SystemRescue termino de levantar y me dio una Consola, ejecuto Partimage</li>
<li>Con Partimage voy a crear imágenes del Sistema que estará en algunos de los discos presentes (Generalmente suele ser /dev/hda o /dev/sda).</li>
<li>La imagen resultante la copiare en otro medio, por ejemplo un disco extraíble de buena capacidad.</li>
<li>Instalo en otra maquina VirtualBox y creo una maquina Virtual.</li>
<li>En esa maquina virtual hago que arranque SystemRescue.</li>
<li>En la maquina virtual que contendrá un disco virtual restauro en el por medio de partimage la imagen del sistema creada en el punto 3.</li>
<li>Se necesitara también restaurar el masterboot récord de la imagen a la maquina virtual.</li>
<li>Reiniciamos nuestra maquina virtual y tendremos nuestro sistema clonado y listo para sincronizarlo o ponerlo en producción directamente.</li>
</ol>
<p style="margin-bottom: 0cm;">Espero les sea útil este Post y dejen sus comentarios de las experiencias que tengan.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2010/02/01/salvando-sistemas-con-systemrescue-y-virtualbox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eligiendo que restaurar en Postgresql</title>
		<link>http://www.ipcorp.com.ar/blog/2010/01/22/eligiendo-que-restaurar-en-postgresql/</link>
		<comments>http://www.ipcorp.com.ar/blog/2010/01/22/eligiendo-que-restaurar-en-postgresql/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 13:56:55 +0000</pubDate>
		<dc:creator>marcelo</dc:creator>
				<category><![CDATA[Bases de Datos]]></category>

		<guid isPermaLink="false">http://www.ipcorp.com.ar/blog/?p=589</guid>
		<description><![CDATA[
Cuando se trabajan con grandes volúmenes de datos restaurar suele ser un trabajo que demanda muchas horas,para resolver esto Postgresql creo una manera sencilla de editar los dumps que lo veremos en este Post.

Como en todo proceso de backup lo primero que existe es el  dump de la base, por ejemplo:

#pg_dump  -U postgres [...]]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<p style="margin-bottom: 0cm;">Cuando se trabajan con grandes volúmenes de datos restaurar suele ser un trabajo que demanda muchas horas,para resolver esto Postgresql creo una manera sencilla de editar los dumps que lo veremos en este Post.</p>
<p><span id="more-589"></span></p>
<p>Como en todo proceso de backup lo primero que existe es el  dump de la base, por ejemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#pg_dump  -U postgres -Fc  -f archivo_dump.txt base</span></pre></div></div>

<p style="margin-bottom: 0cm;">Donde  el  archivo_dump.txt es el resultante del proceso.</p>
<p style="margin-bottom: 0cm;">Ahora bien si ese archivo (archivo_dump.txt) contiene tablas de unos miles de registros  no hay problema,pero la cosa se complica cuando trabajamos con tablas de millones de registros y a su vez índices asociados a estas;es un hecho que demandara un tiempo importante de restauración. En mi caso en particular con tablas de miles de millones de registros el tiempo aproximado de restauración es de 18 a 24 horas.</p>
<p>Ahora bien como resuelvo que restaurar y que no del archivo: archivo_dump.txt, veamos el siguiente ejemplo. Primero creo un archivo legible para la raza humana de la siguiente manera:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#pg_restore -l archivo_dump.txt  &gt; archivo.lista</span></pre></div></div>

<p>El resultado del archivo.lista sera algo como lo siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="basha" style="font-family:monospace;">; Archive created at Fri Jan 22 22:28:36 2010
; dbname: ipcorp
; TOC Entries: 74
; Compression: 0
; Dump Version: 1.4-0
; Format: CUSTOM
;
;
; Selected TOC Entries:
;
2; 145344 TABLE species postgres
3; 145344 ACL species
4; 145359 TABLE nt_header postgres
5; 145359 ACL nt_header
6; 145402 TABLE species_records postgres
7; 145402 ACL species_records
8; 145416 TABLE ss_old postgres</pre></div></div>

<p style="margin-bottom: 0cm;">Las primeras lineas son una serie de referencias acerca del nombre de la base de datos, fecha del dump, mas abajo encontramos números de linea asociados a tablas, funciones e índices; esto ultimo puede ser comentado mediante &#8220;;&#8221; o también se puede eliminarlos directamente.</p>
<p>Entonces una vez que tenemos nuestro archivo de lista modificado con los elementos que realmente nos interesa, restauramos de la siguiente manera:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># pg_restore -Fc -d base -L archivo.lista &lt; file_dump.txt</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2010/01/22/eligiendo-que-restaurar-en-postgresql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>REST con Rails</title>
		<link>http://www.ipcorp.com.ar/blog/2009/12/29/rest-con-rails/</link>
		<comments>http://www.ipcorp.com.ar/blog/2009/12/29/rest-con-rails/#comments</comments>
		<pubDate>Tue, 29 Dec 2009 14:26:41 +0000</pubDate>
		<dc:creator>Carlos Barbiero</dc:creator>
				<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[Lenguajes de Programación]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Restful]]></category>
		<category><![CDATA[Restful urls]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://www.ipcorp.com.ar/blog/?p=578</guid>
		<description><![CDATA[El uso de REST con Ruby on Rails es extremadamente relajante, una vez que comienzas a utilizar REST y te acostumbras a trabajar de esa forma, no quieres volver a la forma tradicional. Esta es una guía de conceptos básicos de REST y su aplicación en Rails.
REST son las siglas de Representational State Transfer (Transferencia [...]]]></description>
			<content:encoded><![CDATA[<p>El uso de REST con Ruby on Rails es extremadamente relajante, una vez que comienzas a utilizar REST y te acostumbras a trabajar de esa forma, no quieres volver a la forma tradicional. Esta es una guía de conceptos básicos de REST y su aplicación en Rails.</p>
<p><strong>REST</strong> son las siglas de <strong>Representational State Transfer</strong> (Transferencia de Estado Representacional), es una técnica de arquitectura software para sistemas hipermedia distribuidos como la World Wide Web. El término se originó en el año 2000, en una tesis doctoral sobre la web escrita por Roy Fielding, uno de los principales autores de la especificación del protocolo HTTP y ha pasado a ser ampliamente utilizado por la comunidad de desarrollo.</p>
<p><span id="more-578"></span></p>
<p>Es un hecho olvidado por muchos desarrolladores Web de  hoy que el protocolo HTTP puede hacer algo más que GET y POST. No debería resultar tan sorprendente si consideramos que los navegadores solo soportan estas dos peticiones. El protocolo HTTP define también los métodos PUT y DELETE que deberían utilizase para crear o borrar un recurso en la Web. (más sobre REST: <a title="REST" href="http://es.wikipedia.org/wiki/Representational_State_Transfer" target="_blank">http://es.wikipedia.org/wiki/Representational_State_Transfer</a>)</p>
<p><strong>Por que usar REST?</strong></p>
<ul>
<li> <strong>URLs limpias:</strong> en REST, las urls representan <strong>recursos </strong> y no acciones, por lo tanto siempre tienen el mismo formato.</li>
<li><strong>Formatos de respuesta variados:</strong> los controladores REST estan escritos de manera tal que las acciones pueden devolver sus resultados fácilmente en diferentes formatos de respuesta. Una misma acción puede entregar resultados en HTML, XML, RSS o cualquier formato que solicite el cliente, de manera rápida y sencilla.</li>
<li><strong>Menos código:</strong> el desarrollar acciones únicas capaces de soportar múltiples clientes evita repeticiones en el sentido DRY (Don&#8217;t repeat Yourself)</li>
<li><strong>Controladores orientados a CRUD</strong> (Create Read Update Delete): los controladores y los recursos se funden en una única cosa. Cada controlador tiene como responsabilidad manipular un único tipo de recurso.</li>
<li><strong>Diseño limpio de la aplicación:</strong> REST produce un diseño y escritura de código clara y fácil de mantener.</li>
</ul>
<p>Si nunca has utilizado  REST con Rails, te recomiendo que te descargues el pdf RestFul Rails desde <a href="http://www.b-simple.de/documents" target="_blank">http://www.b-simple.de/documents</a> (disponible en español, inglés y alemán!) y comiences por alli. Este pequeño libro tiene la desventaja que la versión utilizada de Rails es la 1, por lo que te encontrarás con varias disidencias a la hora de probar los ejemplos, sobre todo al final del libro. Pero afortunadamente esto no es un gran problema, dejo aquí algunas urls que te servirán a modo de consulta y mayor aprendizaje:</p>
<ul>
<li>Recursos anidados con REST y RAILS: <a href="http://www.jaimeiniesta.com/2007/12/22/tutorial-recursos-anidados-con-rest-y-rails-2/comment-page-1/" target="_blank">http://www.jaimeiniesta.com/2007/12/22/tutorial-recursos-anidados-con-rest-y-rails-2/comment-page-1/</a></li>
<li>Rapid restful Apps (en inglés): <a href=" http://articles.sitepoint.com/article/rapid-restful-rails-apps" target="_blank">http://articles.sitepoint.com/article/rapid-restful-rails-apps</a></li>
<li>Easy restful Screencast: <a href="http://akitaonrails.com/2008/1/25/easy-restful-rails-screencast" target="_blank">http://akitaonrails.com/2008/1/25/easy-restful-rails-screencast</a></li>
<li>Whats new on REST Rails (en inglés) <a href="http://ryandaigle.com/articles/2006/08/01/whats-new-in-edge-rails-simply-restful-support-and-how-to-use-it" target="_blank">http://ryandaigle.com/articles/2006/08/01/whats-new-in-edge-rails-simply-restful-support-and-how-to-use-it</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.ipcorp.com.ar/blog/2009/12/29/rest-con-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
