<?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>Energía y Red</title>
	<atom:link href="http://www.gruposp2p.org/wordpress/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.gruposp2p.org/wordpress</link>
	<description></description>
	<lastBuildDate>Thu, 17 Jun 2010 15:31:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Cliente REST Android</title>
		<link>http://www.gruposp2p.org/wordpress/?p=380</link>
		<comments>http://www.gruposp2p.org/wordpress/?p=380#comments</comments>
		<pubDate>Thu, 17 Jun 2010 14:02:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Desarrollos]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Rest]]></category>

		<guid isPermaLink="false">http://www.gruposp2p.org/wordpress/?p=380</guid>
		<description><![CDATA[Si quieres jugar haciendo operaciones REST con JSON en Android, y no tienes nada hecho, esto te puede servir de ayuda. package packageName_00.PackageName_01; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.client.methods.HttpDelete; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.HttpConnectionParams; import org.json.JSONObject; import android.util.Log; public class RestClient { public interface RequestCallback { public void [...]]]></description>
			<content:encoded><![CDATA[<p>Si quieres jugar haciendo operaciones REST con JSON en Android, y no tienes nada hecho, esto te puede servir de ayuda.</p>
<pre class="brush: java;">
package packageName_00.PackageName_01;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpConnectionParams;
import org.json.JSONObject;
import android.util.Log;

public class RestClient {

    public interface RequestCallback {
    	public void onError(Throwable exception);
    	public void onResponseReceived(HttpResponse response);
    }

    public static void doGet(final String url, final RequestCallback callback) {
    	Log.i(&quot;doGet&quot;, &quot; - url: &quot; + url);
    	final HttpClient httpClient = new DefaultHttpClient();
    	HttpConnectionParams.setConnectionTimeout(httpClient.getParams(), 10000);
    	Thread thread = new Thread(){
    		public void run() {
    	        HttpGet httpget = new HttpGet(url);
    	        HttpResponse response;
    	        try {
    	            response = httpClient.execute(httpget);
    	            callback.onResponseReceived(response);
    	        } catch (Exception ex) {
    	        	callback.onError(ex);
    	        }
    		}
    	};
    	thread.start();
    }

    public static void doPost (final String url,final JSONObject json, final RequestCallback callback) {
    	Log.i(&quot;doPost a url: &quot; + url, &quot;- JSON: &quot; + json.toString());
    	final HttpClient httpClient = new DefaultHttpClient();
    	HttpConnectionParams.setConnectionTimeout(httpClient.getParams(), 10000);
    	Thread thread = new Thread(){
    		public void run() {
    			HttpPost httpPost = new HttpPost(url);
    	    	httpPost.addHeader(&quot;Accept&quot;, &quot;application/json&quot;);
    	    	httpPost.addHeader(&quot;Content-Type&quot;, &quot;application/json&quot;);
    	    	try {
    	    	    StringEntity entity = new StringEntity(json.toString(), &quot;UTF-8&quot;);
    	    	    entity.setContentType(&quot;application/json&quot;);
    	    	    httpPost.setEntity(entity);
    	    	    // execute is a blocking call, it's best to call this code in a thread separate from the ui's
    	    	    HttpResponse response = httpClient.execute(httpPost);
    	    	    callback.onResponseReceived(response);
    	    	}
    	    	catch (Exception ex) {
    	    		callback.onError(ex);
    	    	}
    		}
    	};
    	thread.start();
    }

    public static void doPut (final String url,final JSONObject json,final RequestCallback callback) {
    	Log.i(&quot;doPut a url: &quot; + url, &quot;- JSON: &quot; + json.toString());
    	final HttpClient httpClient = new DefaultHttpClient();
    	HttpConnectionParams.setConnectionTimeout(httpClient.getParams(), 10000);
    	Thread thread = new Thread(){
    		public void run() {
    			HttpPut httpPut = new HttpPut(url);
    			httpPut.addHeader(&quot;Accept&quot;, &quot;application/json&quot;);
    			httpPut.addHeader(&quot;Content-Type&quot;, &quot;application/json&quot;);
    	    	try {
    	    	    StringEntity entity = new StringEntity(json.toString(), &quot;UTF-8&quot;);
    	    	    entity.setContentType(&quot;application/json&quot;);
    	    	    httpPut.setEntity(entity);
    	    	    HttpResponse response = httpClient.execute(httpPut);
    	    	    callback.onResponseReceived(response);
    	    	}
    	    	catch (Exception ex) {
    	    		callback.onError(ex);
    	    	}
    		}
    	};
    	thread.start();
    }

    public static void doDelete (final String url, final RequestCallback callback) {
    	Log.i(&quot;doDelete&quot; , &quot; - url: &quot; + url);
    	final HttpClient httpClient = new DefaultHttpClient();
    	HttpConnectionParams.setConnectionTimeout(httpClient.getParams(), 10000);
    	Thread thread = new Thread(){
    		public void run() {
    			HttpDelete httpDelete = new HttpDelete(url);
    			httpDelete.addHeader(&quot;Accept&quot;, &quot;application/json&quot;);
    	    	try {
    	    	    HttpResponse response = httpClient.execute(httpDelete);
    	    	    callback.onResponseReceived(response);
    	    	}
    	    	catch (Exception ex) {
    	    		callback.onError(ex);
    	    	}
    		}
    	};
    	thread.start();
    }
}
</pre>
<p>Para hacer consultas desde el emulador a un servidor en la propia máquina, esto es, una consulta &#8216;localhost&#8217;, debes usar la IP 10.0.2.2</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gruposp2p.org/wordpress/?feed=rss2&amp;p=380</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>GWT con REST</title>
		<link>http://www.gruposp2p.org/wordpress/?p=363</link>
		<comments>http://www.gruposp2p.org/wordpress/?p=363#comments</comments>
		<pubDate>Tue, 15 Jun 2010 19:02:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[Rest]]></category>

		<guid isPermaLink="false">http://www.gruposp2p.org/wordpress/?p=363</guid>
		<description><![CDATA[Con este ejemplo, se muestra una forma de usar la nueva clase CellTable, que viene en GWT 2.1 para crear una interfaz de usuario sobre los servicios REST que se explicaron en este post. Para ver como queda la cosa sin tener que instalar nada, se puede acceder a los servicios REST a través de [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://controltiempos.googlecode.com/files/GrailsRestExample.zip">Con este ejemplo</a>, se muestra una forma de usar la nueva clase <a href="http://google-web-toolkit.googlecode.com/svn/javadoc/2.1/com/google/gwt/user/cellview/client/CellTable.html">CellTable,</a> que viene en <a href="http://code.google.com/intl/es-ES/webtoolkit/download.html">GWT</a> 2.1 para crear una interfaz de usuario sobre los servicios REST que se explicaron en <a href="http://www.gruposp2p.org/wordpress/?p=332">este post</a>.<br />
Para ver como queda la cosa sin tener que instalar nada, se puede acceder a los servicios REST a través <a href="http://www.gruposp2p.org/GrailsRestExample/users">de aquí</a>, y a la interfaz de usuario a través <a href="http://www.gruposp2p.org/GrailsRestExample/gwt/index">de aquí</a>.</p>
<p>Si se utiliza Firefox existe un Addon, <a href="https://addons.mozilla.org/en-US/firefox/addon/10869/">JSONView</a>, que hace más  amigable el trato con información en formato JSON.</p>
<p>Para ver el ejemplo en local habría que ejecutar desde el directorio raíz del archivo descomprimido:<br />
<code>grails run-app</code><br />
Y acceder a través de:<br />
<code>http://localhost:8080/GrailsRestExample/gwt/index</code></p>
<p>Si se desea generar el archivo <strong>war</strong> para proceder a su instalación en un contenedor J2EE, habría que ejecutar desde el directorio raíz del archivo descomprimido el comando:<br />
<code>grails war</code><br />
Y proceder a su instalación como cualquier aplicación web Java. Las aplicaciones <a href="http://grails.org/">Grails</a> son aplicaciones web Java.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gruposp2p.org/wordpress/?feed=rss2&amp;p=363</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>REST con Grails</title>
		<link>http://www.gruposp2p.org/wordpress/?p=332</link>
		<comments>http://www.gruposp2p.org/wordpress/?p=332#comments</comments>
		<pubDate>Sat, 12 Jun 2010 19:27:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Rest]]></category>

		<guid isPermaLink="false">http://www.gruposp2p.org/wordpress/?p=332</guid>
		<description><![CDATA[Para ejecutar el ejemplo hay que tener instalado Grails 1.3.1, descargarse el ejemplo , descomprimir el archivo y ejecutar en el directorio raíz del mismo: grails run-app No lo he complicado mucho para que el que quiera arrancar con Grails y REST se lie lo menos posible. La aplicación consta de tres recursos, Usuario, Voto [...]]]></description>
			<content:encoded><![CDATA[<p>Para ejecutar el ejemplo hay que tener instalado <a href="http://www.grails.org/Download">Grails 1.3.1</a>, descargarse <a href="http://www.gruposp2p.org/wordpress/wp-content/uploads/2010/06/GrailsRestExample.zip">el ejemplo</a> , descomprimir el archivo y ejecutar en el directorio raíz del mismo:<br />
<code>grails run-app</code></p>
<p>No lo he complicado mucho para que el que quiera arrancar con Grails y REST se lie lo menos posible.<br />
La aplicación consta de tres recursos, <strong>Usuario</strong>, <strong>Voto</strong> y <strong>Asunto</strong>. Se puede probar usando el programa <a href="http://code.google.com/p/rest-client/">rest-client</a> o el <a href="https://addons.mozilla.org/en-US/firefox/addon/2691/">Addon de Firefox &#8216;Poster&#8217;</a>.</p>
<h4>Recurso &#8216;Usuario&#8217;</h4>
<ul>
<li>Si se quieren consultar los <strong>usuarios</strong> se debe hacer una petición</li>
</ul>
<p><code>GET http://localhost:8080/GrailsRestExample/users?max=20&amp;offset=2</code></p>
<p>Donde <strong>max</strong> es el número máximo de resultados devueltos (por defecto 20) y <strong> offset</strong> es el índice a partir del que se desea obtener el primer  resultado (por defecto 0)</p>
<ul>
<li> Para obtener la información de un <strong>usuario</strong> concreto:</li>
</ul>
<p><code>GET http://localhost:8080/GrailsRestExample/users/${idUsuario}</code></p>
<ul>
<li>Para borrar un <strong>usuario</strong> se debe hacer una petición:</li>
</ul>
<p><code>DELETE http://localhost:8080/GrailsRestExample/users/${idUsuario}</code></p>
<ul>
<li>Para actualizar un <strong>usuario</strong> existente habría que hacer una petición:</li>
</ul>
<p><code>PUT http://localhost:8080/GrailsRestExample/users/${idUsuario}</code><br />
Enviando una representación JSON del <strong>usuario</strong> que se desee crear con las siguientes características:<br />
<code>{"username":"username", "email":"email@gruposp2p.org", "dateOfBird":"01-02-2003","enabled":"true"}</code></p>
<ul>
<li>Para crear un nuevo <strong>usuario</strong> habría que hacer una petición</li>
</ul>
<p><code>POST http://localhost:8080/GrailsRestExample/users</code><br />
Enviando una representación JSON del <strong>usuario</strong> que se desee crear con las siguientes características:<br />
<code>{"username":"username", "email":"email@gruposp2p.org", "dateOfBird":"01-02-2003","enabled":"true"}</code></p>
<h4>Recurso &#8216;Asunto&#8217;</h4>
<ul>
<li>Si se quieren consultar los <strong>Asuntos</strong> dados de alta en el sistema se debe hacer una petición</li>
</ul>
<p><code>GET http://localhost:8080/GrailsRestExample/subjects?max=20&amp;offset=2</code><br />
Donde max es el número máximo de resultados devueltos(por defecto 20) y offset es el índice a partir del que se desea obtener el primer resultado (por defecto 0)</p>
<ul>
<li>Para obtener la información de un <strong>asunto</strong> concreto:</li>
</ul>
<p><code>GET http://localhost:8080/GrailsRestExample/subjects/${idSubject}</code></p>
<ul>
<li>Para actualizar un <strong>asunto</strong> existente habría que hacer una petición:</li>
</ul>
<p><code>PUT http://localhost:8080/GrailsRestExample/subjects/${idSubject}</code><br />
Enviando una representación JSON del <strong>asunto</strong> que se desee crear que tenga siguientes características:<br />
<code>{"content":"Contenido del asunto 40","name":"Nombre del asunto40"}</code></p>
<ul>
<li>Para borrar un <strong>asunto</strong>:</li>
</ul>
<p><code>DELETE http://localhost:8080/GrailsRestExample/subjects/${idSubject}</code></p>
<p><strong>Recursos &#8216;Asuntos&#8217; asociados a un determinado recurso &#8216;Usuario&#8217;</strong></p>
<ul>
<li> Para obtener todos los <strong>asuntos</strong> generados por un <strong>usuario</strong> concreto</li>
</ul>
<p><code>GET http://localhost:8080/GrailsRestExample/users/${idUsuario}/subjects/</code></p>
<ul>
<li>Para generar un nuevo <strong>asunto</strong> asociado al <strong>usuario</strong> ${idUsuario} habría que hacer una petición</li>
</ul>
<p><code>POST http://localhost:8080/GrailsRestExample/users/${idUsuario}/subjects/</code><br />
Enviando una representación JSON del <strong>asunto</strong> que se desee crear con las siguientes características:<br />
<code>{"content":"Contenido del asunto 40","name":"Nombre del asunto40"}</code></p>
<h4>Recurso &#8216;Voto&#8217;</h4>
<ul>
<li>Si se quieren consultar todos los <strong>Votos</strong> dados de alta en el sistema se debería hacer una petición</li>
</ul>
<p><code>GET http://localhost:8080/GrailsRestExample/votes?max=20&amp;offset=2</code><br />
Donde max es el número máximo de resultados devueltos (por defecto 20) y offset es el índice a partir del que se desea obtener el primer resultado (por defecto 0)</p>
<ul>
<li> Si se quiere consultar un <strong>voto</strong> concreto</li>
</ul>
<p><code>GET http://localhost:8080/GrailsRestExample/votes/${idVote}</code></p>
<ul>
<li>Si se quiere modificar un <strong>voto</strong> habrá que hacer una petición</li>
</ul>
<p><code>PUT  http://localhost:8080/GrailsRestExample/votes/${idVote}</code><br />
Enviando una representación JSON del <strong>asunto</strong> que se desee crear que tenga siguientes características:<br />
<code>{"value":"valor del voto www"}</code></p>
<ul>
<li>Para eliminar un <strong>voto</strong>:</li>
</ul>
<p><code>DELETE http://localhost:8080/GrailsRestExample/votes/${idVote}</code></p>
<p><strong>Votos asociados a un determinado usuario</strong></p>
<ul>
<li> Para obtener todos los <strong>votos</strong> generados por el <strong>usuario</strong> ${idUsuario}</li>
</ul>
<p><code>GET http://localhost:8080/GrailsRestExample/users/${idUsuario}/votes/</code></p>
<ul>
<li>Para generar un nuevo <strong>voto</strong> sobre el <strong>asunto</strong> ${idSubject} asociado al <strong>usuario</strong> ${idUsuario} habría que hacer una petición</li>
</ul>
<p><code>POST http://localhost:8080/GrailsRestExample/users/${idUsuario}/subjects/${idSubject}</code><br />
Con una representación JSON del <strong>voto</strong> que tuviera las siguientes características:<br />
<code>{"value":"valor del voto www"}</code></p>
<p>Votos asociados a un determinado <strong>asunto</strong><br />
<code>GET http://localhost:8080/GrailsRestExample/subjects/{idSubject}/votes</code></p>
<p>Votos asociados a un determinado <strong>asunto</strong> y a un determinado <strong>usuario</strong><br />
<code>GET http://localhost:8080/GrailsRestExample/users/${idUsuario}/subjects/{idSubject}/votes</code></p>
<p>En el siguiente artículo explicaré cómo usar las nueva clase TableCell que viene con<a href="http://code.google.com/webtoolkit/doc/latest/ReleaseNotes.html"> GWT 2.1</a> utilizando los datos disponibles en estos servicios REST, la aplicación de acceso para <a href="http://www.android.com/">Android</a> la dejaré para el final de esta serie.</p>
<p>Es importante quedarse con los siguientes puntos:</p>
<ul>
<li>Existen formas de <strong>securizar</strong> los <strong>recursos</strong>.</li>
</ul>
<ul>
<li> El desarrollo está hecho en <a href="http://www.grails.org">Grails</a>, pero utilizando principios <a href="http://www.gruposp2p.org/wiki/index.php/REST">REST</a> pueden crearse servicios, independientes de lenguaje de programación y plataforma, accesibles a través de Internet.</li>
</ul>
<ul>
<li> Gracias a esta técnica se separa completamente la interfaz de usuario del servicio.</li>
</ul>
<ul>
<li> Si se desea que dos partes intercambien información a través de Internet la mejor forma de conseguirlo es empezando definiendo las interfaces REST de los recursos que se desean compartir.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.gruposp2p.org/wordpress/?feed=rss2&amp;p=332</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Twitteando en caliente</title>
		<link>http://www.gruposp2p.org/wordpress/?p=326</link>
		<comments>http://www.gruposp2p.org/wordpress/?p=326#comments</comments>
		<pubDate>Thu, 10 Jun 2010 18:13:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.gruposp2p.org/wordpress/?p=326</guid>
		<description><![CDATA[He escrito un Tweet que parece que no ha sentado bien a alguna gente. Lo explicaré un poco para que se entienda. Comiendo he visto una noticia en la que se decía que había que tener mucho cuidado con la información que se daba porque con el simple número de NIF ya podían enmarronarte haciendo [...]]]></description>
			<content:encoded><![CDATA[<p>He escrito un Tweet que parece que no ha sentado bien a alguna gente. Lo explicaré un poco para que se entienda.<br />
Comiendo he visto una noticia en la que se decía que había que tener mucho cuidado con la información que se daba porque con el simple número de NIF ya podían enmarronarte haciendo compras y cosas así. Como si no fuera fácil conseguir números de NIF. Evidentemente no daban nombres de nada ni concretaban, un <a href="http://es.wikipedia.org/wiki/Fear,_uncertainty_and_doubt">FUD</a> en toda regla.</p>
<p>El Tweet lo he soltado en caliente indignado y decía &#8216;Sobre temas de robo de identidad, vale que no lo sepa una persona normal, pero que un profesional no sepa lo que es OCSP señala el nivel&#8217;, algo que fuera de contexto se puede malinterpretar.</p>
<p>La cosa más explicada debería quedar mas o menos así, si se hacen trámites con firma electrónica las aplicaciones que hagan uso de esas firmas pueden comprobar en tiempo real si los certificados asociados son válidos. En caso de pérdida o robo la información se actualiza una vez se ha denunciado la pérdida. Alguien dedicado a la gestión de identidades electrónicas debe saber eso.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gruposp2p.org/wordpress/?feed=rss2&amp;p=326</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Instalación del DNI electrónico en Ubuntu Lucid</title>
		<link>http://www.gruposp2p.org/wordpress/?p=314</link>
		<comments>http://www.gruposp2p.org/wordpress/?p=314#comments</comments>
		<pubDate>Thu, 27 May 2010 09:43:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.gruposp2p.org/wordpress/?p=314</guid>
		<description><![CDATA[NOTA &#8211; 3 de Junio &#8211; Parece que ya han arreglado las librerías de los repositorios &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; Seguramente existirá otra forma mejor de conseguirlo pero lo que explico a continuación me ha funcionado. Todavía no existe software para la versión 10.04 de Ubuntu, Ubuntu Lucid, así es que empecé descargando la versión opensc-dnie_1.4.7 que sólo [...]]]></description>
			<content:encoded><![CDATA[<p><strong>NOTA &#8211; 3 de Junio &#8211; Parece que ya han arreglado las librerías de los repositorios</strong></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>Seguramente existirá otra forma mejor de conseguirlo pero lo que explico a continuación me ha funcionado.</p>
<p>Todavía no existe software para la versión 10.04 de Ubuntu, <strong>Ubuntu Lucid</strong>, así es que empecé descargando la versión <strong>opensc-dnie_1.4.7</strong> que sólo existe para la <strong>Karmic Koala</strong>. La cosa no funcionó, tuve que probar con la <a href="http://www.dnielectronico.es/descargas/PKCS11_para_Sistemas_Unix/opensc_1.4.6_arq_ub_ja32.html">versión 1.4.6</a> que existe para la <strong>Jaunty Jackalope</strong> y con eso si que he conseguido usar el DNI desde Firefox, pero seguiendo estos pasos:</p>
<p>Instalar, por este orden, los paquetes que traen la distribución <strong>1.4.6</strong> descargarbles desde el <a href="http://www.dnielectronico.es/descargas/PKCS11_para_Sistemas_Unix/opensc_1.4.6_menu32.html">portal oficial del DNI electrónico</a>: <strong>libopensc2_0.11.7-7_i386.deb</strong>, <strong>opensc_0.11.7-7_i386.deb</strong> y <strong>opensc-dnie_1.4.6-2_i386.deb</strong>.<br />
Si se empieza instalando <strong>opensc-dnie</strong>, se instalarán las librerías que hay en el repositorio en vez de las que vienen con la distribución y eso me ha dado fallos.</p>
<p>La primera vez que lo he usado en Firefox he tenido que cargar manualmente el módulo criptográfico, para ello hay que ir a Editar &gt; Preferencias &gt; Dispositivos de seguridad &gt; Cargar y seleccionar el archivo <strong>/usr/lib/opensc-pkcs11.so</strong></p>
<p>Debido a <a href="https://bugs.launchpad.net/ubuntu/+source/pcsc-lite/+bug/506908">este bug</a>, el demonio <strong>pcscd</strong> no arranca automáticamente en Lucid, así es que, por lo pronto, cada vez que se quiera utilizar el DNI electrónico habrá que abrir una consola y ejecutar:<br />
<strong>sudo /etc/init.d/pcscd start</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gruposp2p.org/wordpress/?feed=rss2&amp;p=314</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cuidado con lo que instalas</title>
		<link>http://www.gruposp2p.org/wordpress/?p=309</link>
		<comments>http://www.gruposp2p.org/wordpress/?p=309#comments</comments>
		<pubDate>Fri, 14 May 2010 09:08:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.gruposp2p.org/wordpress/?p=309</guid>
		<description><![CDATA[Los programas informáticos no son como los libros ni como las películas, no son productos &#8216;pasivos&#8217;, son activos, y están instalados en los dispositivos que te acompañan, gestionan las empresas y están en nuestros dormitorios con cámaras incorporadas. Si no se tiene cuidado con lo que se instala, se pueden acabar ejecutando programas que hagan [...]]]></description>
			<content:encoded><![CDATA[<p>Los programas informáticos no son como los libros ni como las películas, no son productos &#8216;pasivos&#8217;, son activos, y están instalados en los dispositivos que te acompañan, gestionan las empresas y están en nuestros dormitorios con cámaras incorporadas. Si no se tiene cuidado con lo que se instala, se pueden acabar ejecutando programas que hagan cosas que realmente no quieres que hagan, esa es sólo otra razón más por la que algunos defendemos el software libre.<br />
Que una persona, voluntariamente, elija instalar programas que no sabe lo que llevan dentro es algo a lo que nadie puede objetar nada, lo malo, es que aunque no quieras, se den las circunstancias para que te veas en la obligación de tener instalado en tus dispositivos &#8216;cajas negras&#8217;, eso, en un escenario en el que cada vez tenemos mas dispositivos a nuestro alrededor, y si no se está poniendo el &#8216;cazo&#8217;, es una aberración que no se le debería de ocurrir ni al que asó la manteca.<br />
Desde el punto de vista de &#8216;producto&#8217; un programa informático se parece mucho mas a un yogur que a un libro, es algo sobre lo que se deberían hacer inspecciones de seguridad.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gruposp2p.org/wordpress/?feed=rss2&amp;p=309</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Principal diferencia entre pago normal y micropago</title>
		<link>http://www.gruposp2p.org/wordpress/?p=302</link>
		<comments>http://www.gruposp2p.org/wordpress/?p=302#comments</comments>
		<pubDate>Fri, 07 May 2010 09:42:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Desarrollos]]></category>
		<category><![CDATA[micropagos]]></category>

		<guid isPermaLink="false">http://www.gruposp2p.org/wordpress/?p=302</guid>
		<description><![CDATA[La principal diferencia entre los pagos normales y los micropagos se encuentra en las comisiones que se cobran al realizar los mismos. Para entenderlo basta mirar estos datos: pagar 1.00 euro -> comisión micropago=0.10, comisión normal=0.33 pagar 5.00 euros -> comisión micropago=0.30, comisión normal=0.45 pagar 10.00 euros -> comisión micropago=0.55, comisión normal=0.59 pagar 12.00 euros [...]]]></description>
			<content:encoded><![CDATA[<p>La principal diferencia entre los pagos normales y los micropagos se encuentra en las comisiones que se cobran al realizar los mismos. Para entenderlo basta mirar estos datos:</p>
<p>pagar 1.00 euro -> comisión micropago=0.10, comisión normal=0.33<br />
pagar 5.00 euros -> comisión micropago=0.30, comisión normal=0.45<br />
pagar 10.00 euros -> comisión micropago=0.55, comisión normal=0.59<br />
<strong>pagar 12.00 euros -> comisión micropago=0.65, comisión normal=0.65 (punto de encuentro)</strong><br />
pagar 14.00 euros -> comisión micropago=0.75, comisión normal=0.71<br />
pagar 16.00 euros -> comisión micropago=0.85, comisión normal=0.76</p>
<p>La información se refiere a una entidad extrangera, ahora mismo no se de ninguna entidad española que trabaje con micropagos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gruposp2p.org/wordpress/?feed=rss2&amp;p=302</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configuración de Grails para usar el DNI electrónico como mecanismo de autentificación</title>
		<link>http://www.gruposp2p.org/wordpress/?p=285</link>
		<comments>http://www.gruposp2p.org/wordpress/?p=285#comments</comments>
		<pubDate>Sat, 01 May 2010 09:26:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Desarrollos]]></category>
		<category><![CDATA[Política]]></category>
		<category><![CDATA[DNIe]]></category>
		<category><![CDATA[Grails]]></category>

		<guid isPermaLink="false">http://www.gruposp2p.org/wordpress/?p=285</guid>
		<description><![CDATA[Entorno -&#62; Grails 1.2.2 Para esta aplicación es necesario tener un servidor configurado para que solicite certificados al acceder a un recurso seguro, en esta página se explican los detalles grails create-app AutentificacionDNIe cd AutentificacionDNIe grails install-plugin spring-security-core grails s2-quickstart org.gruposp2p.openid.provider UserDNI RoleDNI Se crea el controlador cuyo acceso se quiera securizar con DNI electrónico: [...]]]></description>
			<content:encoded><![CDATA[<p>Entorno -&gt; Grails 1.2.2</p>
<p>Para esta aplicación es necesario tener un servidor configurado para que solicite certificados al acceder a un recurso seguro, <a href="http://code.google.com/p/dniesign/wiki/AutentificacionDNIeTomcat">en esta página se explican los detalles</a></p>
<pre class="brush: java;">
grails create-app AutentificacionDNIe
cd AutentificacionDNIe
grails install-plugin spring-security-core
grails s2-quickstart org.gruposp2p.openid.provider UserDNI RoleDNI
</pre>
<p>Se crea el controlador cuyo acceso se quiera securizar con DNI electrónico:</p>
<pre class="brush: java;">
grails create-controller secure
</pre>
<p>Para solicitar el acceso del DNIe se configura la aplicación para que el acceso al controlador se haga exclusivamente a través del protocolo HTTPS. Para ello se edita &#8216;Config.groovy&#8217; y se añade:</p>
<pre class="brush: java;">
grails.plugins.springsecurity.useX509=true
grails.plugins.springsecurity.x509.subjectDnRegex = 'SERIALNUMBER=(.*?),'
grails.plugins.springsecurity.portMapper.httpsPort=8443
grails.plugins.springsecurity.secureChannel.definition = ['/secure/**':'REQUIRES_SECURE_CHANNEL',
	                                                          '/**': 'ANY_CHANNEL']
</pre>
<p>Para comprobar que todo funciona se edita BootStrap.groovy y se añade un usuario de pruebas</p>
<pre class="brush: java;">
	def init = { servletContext -&gt;
	   def adminRole = new RoleDNI(authority: 'ROLE_ADMIN').save(flush: true)
	   String password = springSecurityService.encodePassword('password')
	   def testUser = new UserDNI(username: 'NumeroNIFDelDNIConQueSePrueba', enabled: true, password: password)
	   testUser.save(flush: true)
	   UserDNIRoleDNI.create testUser, adminRole, true
	}
</pre>
<p>Crear secure/index.gsp con</p>
<pre class="brush: java;">
&lt;sec:ifLoggedIn&gt;
	Buenas &lt;sec:loggedInUserInfo field=&quot;username&quot;/&gt;
&lt;/sec:ifLoggedIn&gt;
&lt;sec:ifNotLoggedIn&gt;
	Acceso no autorizado
&lt;/sec:ifNotLoggedIn&gt;
</pre>
<p>Para probar la aplicación ejecutar</p>
<pre class="brush: java;">
grails run-app
</pre>
<p>&#8230; y acceder a la aplicación</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gruposp2p.org/wordpress/?feed=rss2&amp;p=285</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Por qué son importantes los micropagos</title>
		<link>http://www.gruposp2p.org/wordpress/?p=278</link>
		<comments>http://www.gruposp2p.org/wordpress/?p=278#comments</comments>
		<pubDate>Tue, 27 Apr 2010 08:22:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Política]]></category>

		<guid isPermaLink="false">http://www.gruposp2p.org/wordpress/?p=278</guid>
		<description><![CDATA[Hay muchos escenario de este mundo donde se pasa verdaderas necesidades por falta de medios para resolver sus problemas y hay otros sitios en los que se tienen ganas de ayudar pero no se encuentran los canales por los que poder enfocar esa ayuda. Mediante Internet se presenta una oportunidad como no ha existido hasta [...]]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste">Hay muchos escenario de este mundo donde se pasa verdaderas necesidades por falta de medios para resolver sus problemas y hay otros sitios en los que se tienen ganas de ayudar pero no se encuentran los canales por los que poder enfocar esa ayuda.</div>
<div id="_mcePaste">Mediante Internet se presenta una oportunidad como no ha existido hasta la fecha para poder encauzar esas voluntades.</div>
<div id="_mcePaste">Los principales problemas son:</div>
<div id="_mcePaste">
<ul>
<li>La ausencia de una cultura de micropagos y depósitos que faciliten flujos monetarios transparentes.</li>
<li>La monitorización en tiempo real del destino de los medios. Que se sepa donde ha ido y donde esta yendo hasta el último céntimo para que no haya lugar a la mas ligera suspicacia. Con Internet es posible.</li>
</ul>
</div>
<div id="_mcePaste">Eso sólo se puede conseguir con líderes hábiles y con programas informáticos, no son opciones excluyentes aunque mientras que los líderes &#8216;te quitan&#8217; el poder para su uso, los programas te dan el poder a ti &#8230; en vista de los resultados obtenidos hasta la fecha he decidido apostar una temporada &#8216;full-time&#8217; por los programas.</div>
<div>No digo que sea la piedra filosofal ni la solución a todos los problemas del planeta, pero se emplean esfuerzos en otro tipo de cosas que <strong>para mi</strong> son mucho menos importantes y entiendo que incluso puede que sean necesarias, no seré el que las juzgue. El desarrollo de este tipo de programas en principio es algo que no debería molestar a nadie.</div>
]]></content:encoded>
			<wfw:commentRss>http://www.gruposp2p.org/wordpress/?feed=rss2&amp;p=278</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configuración de un cliente OpenID con Spring Security y Grails</title>
		<link>http://www.gruposp2p.org/wordpress/?p=225</link>
		<comments>http://www.gruposp2p.org/wordpress/?p=225#comments</comments>
		<pubDate>Mon, 26 Apr 2010 14:43:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[micropagos]]></category>
		<category><![CDATA[OpenID]]></category>

		<guid isPermaLink="false">http://www.gruposp2p.org/wordpress/?p=225</guid>
		<description><![CDATA[Para este artículo se ha utilizado la versión 1.3.0.RC2 de Grails, OpenId4Java y la versión 3.0.2 de Spring Security. Como entorno de desarrollo estoy usando SpringSource Tool Suite. Aunque Grails dispone de una serie de plugins para las configuraciones de seguridad de las aplicaciones, quiero mantener durante un tiempo los vínculos con el mundo J2EE [...]]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste">Para este artículo se ha utilizado la versión <a href="http://grails.org/Download">1.3.0.RC2 de Grails</a>, <a href="http://openid4java.googlecode.com/files/openid4java-0.9.5.593.tar.gz">OpenId4Java</a> y la versión <a href="http://static.springsource.org/spring-security/site/downloads.html">3.0.2 de Spring Security</a>. Como entorno de desarrollo estoy usando <a href="http://www.springsource.com/products/sts">SpringSource Tool Suite</a>.</div>
<div id="_mcePaste">Aunque Grails dispone de una serie de <a href="http://www.grails.org/plugin/home">plugins</a> para las configuraciones de seguridad de las aplicaciones, quiero mantener durante un tiempo los vínculos con el mundo J2EE tradicional por si por lo que sea hay que &#8216;reenfocar&#8217; de forma rápida algún proyecto. Por eso por lo pronto prefiero usar <a href="http://static.springsource.org/spring-security/site/index.html">Spring Security</a> a la manera tradicional Java. La integración de <a href="http://grails.org/">Grails</a> con Java es tan buena que permite hacer este tipo de cosas sin problemas. Esta técnica la aprendí en <a href="http://waste-sorting.blogspot.com/2010/04/securing-grails-with-spring-security.html">este artículo</a>:</div>
<div>
<div>
<ul>
<h4>Para crear la aplicación ejecutar desde la consola de comandos:</h4>
</ul>
</div>
<div>
<pre class="brush: plain;">&gt; grails create-app ClienteOpenID</pre>
</div>
<div>Se puede ejecutar la aplicación para ver que todo va bien:</div>
<div>
<pre class="brush: plain;">&gt; cd ClienteOpenID</pre>
</div>
<div>
<pre class="brush: plain;">&gt; grails run-app</pre>
</div>
<div>
<ul>
<h4>Instalar la plantilla web.xml</h4>
</ul>
</div>
<div>
<pre class="brush: plain;">&gt; grails install-templates</pre>
</div>
<div>Este comando crea el archivo <em><strong>src/templates/war/web.xml</strong></em> que se debe editar para añadir después del último filtro:</div>
<pre class="brush: xml;">
&lt;filter&gt;
    &lt;filter-name&gt;springSecurityFilterChain&lt;/filter-name&gt;
    &lt;filter-class&gt;org.springframework.web.filter.DelegatingFilterProxy&lt;/filter-class&gt;
&lt;/filter&gt;
</pre>
<p>Y</p>
<pre class="brush: xml;">
&lt;filter-mapping&gt;
    &lt;filter-name&gt;springSecurityFilterChain&lt;/filter-name&gt;
    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;
</pre>
<h4>Instalar las librerías</h4>
<p>Una vez descargadas las librerías arriba indicadas al comienzo del artículo copiar en el directorio <strong>lib</strong> del proyecto Grails:</p>
<ul>
<li><strong>spring-security-config-3.0.2.RELEASE.jar</strong>, <strong>spring-security-core-3.0.2.RELEASE.jar</strong> y <strong>spring-security-web-3.0.2.RELEASE.jar</strong> de <strong><em>Spring Security</em></strong>.</li>
<li>las librerías o<strong>penid4java-full-0.9.5.jar</strong>, <strong>commons-httpclient-3.0.1.jar</strong>, <strong>xercesImpl-2.9.1.jar</strong>, y <strong>nekohtml-1.9.7.jar</strong> que se pueden encontrar en la distribución del archivo <strong><em>openid4java</em></strong>.</li>
</ul>
<h4>Configuración del filtro de seguridad</h4>
<div>Existen dos formas de configurar el filtro. Bien declarando los beans en <strong>grails-app/conf/spring/resources.groovy</strong> o declarándolos en <strong>grails-app/conf/spring/resources.xml</strong>, si se hace editando <strong>resources.xml</strong>:</div>
<pre class="brush: xml;">
&lt;beans xmlns:sec=&quot;http://www.springframework.org/schema/security&quot;
  xmlns=&quot;http://www.springframework.org/schema/beans&quot;
  xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
  xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
  xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
              http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd
              http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd&quot;&gt;

	&lt;sec:http&gt;
        &lt;sec:intercept-url pattern=&quot;/secure/**&quot; access=&quot;ROLE_BUYER&quot;/&gt;
        &lt;sec:intercept-url pattern=&quot;/login*&quot; filters=&quot;none&quot;/&gt;
        &lt;sec:logout/&gt;
        &lt;sec:openid-login login-page=&quot;/login&quot; authentication-failure-url=&quot;/login?login_error=true&quot;&gt;
            &lt;sec:attribute-exchange&gt;
                &lt;sec:openid-attribute name=&quot;email&quot; type=&quot;http://schema.openid.net/contact/email&quot; required=&quot;true&quot; count=&quot;2&quot;/&gt;
                &lt;sec:openid-attribute name=&quot;transaction&quot; type=&quot;&quot; /&gt;
            &lt;/sec:attribute-exchange&gt;
        &lt;/sec:openid-login&gt;
    &lt;/sec:http&gt;

    &lt;sec:authentication-manager&gt;
	&lt;sec:authentication-provider user-service-ref=&quot;springSecurityUserDetailsService&quot;/&gt;
    &lt;/sec:authentication-manager&gt;

&lt;/beans&gt;
</pre>
<div>Con <strong>Spring Security</strong> se puede especificar en el archivo de configuración el tipo de información que se va a intercambiar con el proveedor del servicio <strong>OpenID.</strong> Si el proveedor ofrece esos servicios responderá con la información oportuna. En este caso intercambiaremos el correo del usuario que se quiera identificar, y un campo <strong>transaction</strong> en el que irá la información del <strong>micropago</strong> .</div>
<div>En el archivo se puede ver que para autentificar se utiliza el bean <strong>springSecurityUserDetailsService</strong>, este bean es un servicio que implementa la interfaz <strong>UserDetailsService</strong> que devuelve al autentificador una instancia de <strong>UserDetails</strong>. La instancia de <strong>UserDetails</strong> es una clase de dominio, la clase <strong>User</strong>, que implementa dicha interfaz.</div>
<div>Para generar mediante <strong><a href="http://www.grails.org/Scaffolding">Scaffolding</a></strong> una aplicación para la gestión de una determinada clase de dominio, en este caso <strong>User</strong>:</div>
<div>
<pre class="brush: plain;">&gt;grails generate-all User</pre>
</div>
<div>Y decir a todo que si.</div>
<div>Para probar la aplicación se vuelve a ejecutar:</div>
<div>
<pre class="brush: plain;">&gt;grails run-app</pre>
</div>
<div>Y se introduce en la base de datos un usuario que tenga como propiedad <strong>Username</strong> el valor del identificador <strong>OpenID</strong> que quieras probar en la aplicación y como authority <strong>ROLE_USER</strong>. Para ello acceder mediante el navegador a <strong>http://localhost:8080/ClienteOpenID/ <span style="font-weight: normal;">pulsar sobre </span>UserController, <span style="font-weight: normal;">e introducir un usuario.</span></strong></div>
<div><strong><span style="font-weight: normal;">El proyecto completo con todas las librerías se puede descargar <a href="http://www.gruposp2p.org/wordpress/wp-content/uploads/2010/04/ClienteOpenID.tar">desde aquí.</a></span></strong></div>
<div><strong><span style="font-weight: normal;">Para importarlo desde <a href="http://www.springsource.com/products/sts">SpringSource Tool Suite</a>:</span></strong></div>
<div>
<pre class="brush: plain;">File &gt; Import &gt; Existing projects into Workspace</pre>
</div>
<div>Del código se deduce que vengo del mundo Java <img src='http://www.gruposp2p.org/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Hay varias cosas que con Groovy quedarían mucho mas elegantes, pero no hace falta saber utilizar <a href="http://grails.org/">Grails</a> al 100% para poder ir sacándole poco a poco todas las ventajas que ofrece, de momento me siento más seguro sin dejar del todo el mundillo J2EE.</div>
<div>En próximos artículos explicaré como implementar el servidor <strong>OpenID</strong> que, en este caso, servirá para hacer transacciones utilizando como mecanismo de identificación el <strong>DNI electrónico.</strong></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.gruposp2p.org/wordpress/?feed=rss2&amp;p=225</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
