<?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>Linux, Java y programación &#187; qué es</title>
	<atom:link href="http://casidiablo.net/category/que-es/feed/" rel="self" type="application/rss+xml" />
	<link>http://casidiablo.net</link>
	<description>Blog de Java, Programación y Linux</description>
	<lastBuildDate>Fri, 11 Nov 2011 05:41:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>La licencia GPL</title>
		<link>http://casidiablo.net/la-licencia-gpl/</link>
		<comments>http://casidiablo.net/la-licencia-gpl/#comments</comments>
		<pubDate>Tue, 20 Nov 2007 16:47:00 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[qué es]]></category>
		<category><![CDATA[dvd]]></category>
		<category><![CDATA[hack]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/index.php/2007/11/20/la-licencia-gpl/</guid>
		<description><![CDATA[El presente artículo sólo intenta aportar un enfoque práctico a un tema del cual se dispone de mucha información en la red: Licencias libres, y más concretamente la GPL (General Public License). Todo lo que quieras saber está en el site de la Free Software Fundation (FSF), incluyendo un montón de casuística que, por razones [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fla-licencia-gpl%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22La%20licencia%20GPL%22%20%7D);"></div>
<p>El presente artículo sólo intenta aportar un enfoque práctico a un tema del cual se dispone de mucha información en la red: Licencias libres, y más concretamente la GPL (General Public License). Todo lo que quieras saber está en el site de la Free Software Fundation (FSF), incluyendo un montón de casuística que, por razones de espacio y para no aburrir al personal, no voy a incluir en el presente documento.<br />
He de indicar, antes de nada, que no me considero un experto en estas cuestiones. No he estudiado derecho, tampoco soy programador y menos aún he colaborado en proyectos GPL (aunque en esto último debo decir que ha sido por falta de tiempo, no por ganas, dado que existen multitud de posibilidades de cara a participar: traduciendo documentación, probando betas, reportando bugs, ofreciendo servidores para colgar-distribuir aplicaciones, diseñando logos, iconos,&#8230;) Me muevo en el mundo de la gestión de recursos (redes, equipos informáticos y personas) e intento, siempre desde el respeto a otros SO y a la habilidad de aquellos que van a manejar los equipos, introducir algo del mundo GNU en el que llevo ya desde el año 96 (en todo este tiempo el tema del “free” software y las licencias y estándares ha sido algo que me ha preocupado y sobre el que he procurado mantenerme informado)</p>
<p>Con este marco como presentación, paso a abordar el tema. Creo que a la hora de hablar sobre licencias de software hay un <strong>concepto sobre el que siempre debemos “pivotar”: los derechos. Tanto derechos del usuario como del programador</strong>. Desde este punto de vista, debemos siempre tener presente <strong>dos realidades</strong>:</p>
<ul style="margin-top: 0pt; margin-bottom: 0pt">
<li>La licencia GNU GPL se enfoca más hacia los derechos del usuario, frente a otras privativas como la licencia EULA, que busca “proteger” a la empresa desarrolladora del software. Esto al menos en la teoría: yo nunca he entendido cómo pueden perjudicar los derechos del usuario a la empresa. Si el primero está contento, se beneficiará retroactivamente la segunda&#8230; Pero aquí entran en juego concepciones sobre el alcance del término licencia y patente (tan distintos en los EEUU y Europa, por ejemplo, aunque últimante intente imponerse el sentido americano en el viejo contienente. Ciertamente es más goloso, monetariamente hablando, a corto plazo).</li>
<li>Por otro lado, las licencias privativas (por cierto, todavía no he mencionado que EULA es la licencia de Microsoft) tienen por objetivo limitar al usuario a tomar acciones, elecciones u opciones sobre el software (el impedir el acceso al código fuente, por ejemplo, no nos permite adaptar las aplicaciones a nuestras necesidades y a nuestro equipo, eliminando opciones que no vayamos a utilizar o recompilándolo para optimizarlo según el procesador que tengamos, por ejemplo) mientras que la GNU GPL pretende salvaguardar los derechos de los desarrolladores originales, asegurando de esta forma la continuidad y la accesibilidad del código fuente para el software.</li>
</ul>
<p>Hasta aquí no he descubierto nada nuevo. Estas dos ideas aparecen de forma reiterativa en todos los foros y news que consultemos sobre el tema. Una lectura rápida y superficial de ambas licencias reafirman lo dicho:</p>
<p><strong>La licencia GPL<br />
</strong></p>
<ul style="margin-top: 0pt; margin-bottom: 0pt">
<li>Permite la copia, modificación y redistribución del software.</li>
<li>Al no suponer costo alguno, tampoco nos ofrece garantías. Si la última versión mejorada del programa no corre en tu PC, no puedes exigir daños y perjuicios al creador del soft. De ahí la importancia de la Comunidad que gira en torno de cada proyecto, que ofrece soluciones, parches y ayuda a todo aquel que lo necesite.</li>
<li>Algo que muchas veces se desconoce o confunde con el “freeware”: Posibilita que el software sea vendido y se puedan cobrar por los servicios sobre las aplicaciones creadas&#8230; Al fin y al cabo hay que vivir de algo, y no sólo de amor al “arte”.</li>
</ul>
<p>Debemos incluir el código fuente además del proyecto compilado.</p>
<ul style="margin-top: 0pt; margin-bottom: 0pt">
<li>Si modificamos el software y lo comercializamos, no debe tener costo por la licencia.</li>
<li>Los cambios en la licencia deben mantener ciertos términos generales, recogidos en la documentación de la propia licencia.</li>
</ul>
<p><span id="more-688"></span></p>
<p><strong>Mientras, las licencias privativas<br />
</strong></p>
<ul style="margin-top: 0pt; margin-bottom: 0pt">
<li>Prohíben la copia y requieren de un registro obligatorio.</li>
<li>Solo pueden ser transferidas un número limitado de veces a otros usuarios.</li>
<li>La garantía que ofrecen es por los primeros 90 días (en general), además de no garantizar actualizaciones y parches a lo largo de lal vida “útil” de mi equipo.</li>
</ul>
<p>Hay que indicar que la licencia GPL apareció en los años 80 como resultado de los esfuerzos de la FSF de cara a salvaguardar los derechos del usuario informático en un entorno cada vez más dominado por las patentes. La primera versión respondía a una visión un tanto “ingenua” de la realidad y pronto tuvo que someterse a una revisión. Como resultado apareció la segunda versión de la GPL, que es la actualmente vigente y que data de Junio de 1991. En todo este tiempo han surgido múltiples avances y situaciones no recogidas que han llevado a un nuevo proceso de revisión de la licencia, que se espera cristalicen en la <strong>GPL v.3</strong>. Ahora mismo está en proceso de discusión pública (se inició el 16 de enero de 2006 con la presentación del primer borrador) y con mucha controversia por parte de pesos pesados el mundo GNU. <strong>Pretende</strong>:</p>
<ul style="margin-top: 0pt; margin-bottom: 0pt">
<li>Resolver formas en que a pesar de todo alguien podía quitar libertades a los usuarios, incluyendo cláusulas que defiendan a la comunidad de software libre del uso indebido de patentes de software</li>
<li>Prohibir el uso de software cubierto por la licencia en sistemas diseñados para quitar libertades (DRM).</li>
<li>Resolver ambigüedades y aumentar su compatiblidad con otras licencias.</li>
</ul>
<p>El hecho es que <strong>la versión que actualmente rige es la GPL v.2</strong>, que es bajo la cual están licenciados el kernel del sistema GNULinux y un montón de paquetes y utilidades fundamentales, especialmente aquellos creados por miembros de la FSF, aunque otras utilidades “imprescindibles”, como pueden ser XFree86, OpenSSH, Mozilla, OpenOffice, etc., se distribuyen bajo licencias libres no-GPL.</p>
<p>Dicho esto hay que <strong>aclarar dos puntos claves referidos a las distros linux</strong> cuya respuesta no siempre se encuentra en los debates que sobre este tema se tienen en la red:</p>
<p><strong>CLAVE 1:</strong></p>
<ul style="margin-top: 0pt; margin-bottom: 0pt">
<li>La GPL, al igual que otras licencias, no consideran como “distribucion” a la mera agregación de aplicaciones. Esto es: si yo tomo el programa GPL wifignu v.0.1, remasterizo la distro knoppix STD 0.1 y distribuyo la distro HackWifi 0.1, debo decir que el trabajo se basa en knoppix STD 0.1, mantener integras todas las notas de copyright de knoppix STD 0.1 en HackWifi 0.1, señalar las diferencias entre una y otra y ofrecer el código fuente.</li>
</ul>
<p><strong>CLAVE 2:</strong></p>
<ul style="margin-top: 0pt; margin-bottom: 0pt">
<li>Todas las distribuciones importantes (RedHat, SuSE, Mandriva, etc. Debian es un caso aparte) tienen dos versiones: La oficial y la “sólo” GLP.</li>
<li>La ”sólo&#8221; GLP es la versión &#8220;libre&#8221; de la casa distribuidora. Se colocan en el FTP publico respectivo para que puedan ser copiadas en los Cds, DVDs o pendrives.</li>
<li>La llamémosla versión oficial añade una serie de extas a la distribucion para hacerla mas atractiva: manuales, mayor número de paquetes, presentación en cajas con logos&#8230; Incluyen igualmente drivers y aplicaciones privativas, para lo cual ha debido realizar previamente acuerdos con fabricantes de Software para incluir &#8220;licencias especiales o limitadas&#8221; de esos productos adaptados a su distribución. La mayoria estas &#8220;licencias limitadas&#8221;, permiten que el comprador del producto Oficial pueda utilizar el software para fines no comerciales. Una de las consecuencias que tiene la inclusión de estas licencias es que si uno copia el DVD “oficial” de la distro donde están incluidos estos programas, incurre en un acto que puede llegar a ser ilegal, en función de los límites impuestos por la licencia. Por lo tanto, si queremos disfrutar (=descargar, tostar) Linux, debemos mirar primero que sea la distribucion GLP del fabricante, no la oficial. Si queremos un Linux más completo, con soporte y actualizaciones, debemos comprar la version oficial&#8230; Personalmente creo que es conveniente realizar este desembolso de vez en cuando, dado que no es un gran gasto comparado con otros S.O. y estamos animando a los fabricantes a que cada dia mejoren el soporte de Linux para sus productos. La ley de la oferta-demanda.</li>
</ul>
<p>Hasta ahora he hablado de la GPL como si fuese una cosa única y no es así. <strong>Existen múltiples variaciones de esta licencia, en función del comentido que desempeñen</strong>. Si nos referimos a la <strong>creación de proyectos-aplicaciones software</strong> (que es donde me quiero centrar dada la enorme confusión que existe al respecto), el proyecto GNU tiene <strong>dos licencias principales: La GNU GPL habitual y la GNU GPL para Bibliotecas [GNU Library GPL]</strong>.<br />
Un comentario sobre esta última: Usar la GNU Library GPL permite el uso de la biblioteca en programas privativos. Mientras que el uso de la GPL usual para una biblioteca la hace disponible únicamente para programas libres. Las consecuencias sobre escoger una u otra son claras.</p>
<p>Las propia GNU GPL recoge múltiple <strong>casuística</strong> que se nos pueden presentar al programar aplicaciones libres. <strong>¿Podemos incluir código libre en aplicaciones privativas? El código generado por aplicaciones libres ¿es también libre? ¿Debo licenciar públicamente cualquier aplicación libre que modifique, incluyendo las fuentes? ¿Puedo licenciar plug ins libres para aplicaciones privativas..?</strong> En estos casos la respuesta es no, aunque en todos ellos se matiza. La ética personal y la utilización de las aplicaciones suelen ser los raseros de enjuiciamiento. <strong>Recomiendo encarecidamente leer con detenimiento las faqs que al respecto están el la web de la FSF</strong>.</p>
<p>Existen también otras licencias &#8220;hermanas&#8221; de la GPL:</p>
<ul style="margin-top: 0pt; margin-bottom: 0pt">
<li>La licencia de documentación libre GNU (GFDL) -todos los artículos de la wikipedia están licenciados como GFDL-</li>
<li>La Open Audio License, para trabajos musicales,</li>
<li>La MGPL o la LGPL (Lesser General Public License y Library General Public License), que permiten el enlace dinámico de aplicaciones libres a aplicaciones no libres.</li>
</ul>
<p>Por último, una serie de aclaraciones sobre los <strong>pasos concretos para licenciar como GPL una aplicación</strong> que he creado.</p>
<p><strong>Primero</strong> y muy importante: <strong>Legalmente hablando, sólo la versión original (en inglés) de la GPL</strong> es la que especifica realmente las condiciones de distribución de los programas GNU&#8230; Vamos, que lo correcto sería incluir el texto original de la licencia GPL en mi aplicación. <strong>Aunque de cara a facilitar la labor a la gente que no sabe inglés, la FSF permite utilizar traducciones a otros idiomas si se indica que se siguen sus normas para traducciones no oficiales.</strong></p>
<p><strong>Segundo: El texto de la licencia habría que adjuntarlo en principio al comienzo de cada archivo fuente</strong>. Como esto resultaría pesado en exceso, <strong>se recomiendo que sólo se incluya un aviso que contenga por lo menos la línea del “copyright” y un indicador sobre el lugar en el que podemos localizar el texto completo</strong>. Generalmente se coloca en un archivo con el nombre COPYRIGHT y/o en el README, en el cual también se incluyen instrucciones sobre la compilación, el modo de reportar bugs y una dirección de contacto con la persona que coordina-lidera el proyecto.</p>
<p>El texto a incluir sería de la forma que sigue:</p>
<hr /><em>Copyright (C) <name><br />
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.<br />
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.<br />
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA</name></em></p>
<hr /><strong>Tercero y final</strong>: ¿Porqué todo esto? Al fin y al cabo, el modo más simple de hacer un programa libre es ponerlo en el dominio público, o sea, sin copyright. Esto permitirá que la gente comparta el programa y sus mejoras, si así lo desean. Pero tambien permitiría a quien no quiera cooperar convertir el programa en software privativo. Pueden hacer cambios y distribuir el resultado como un producto privativo. Las personas que reciban el programa en su forma modificada no poseen la libertad que el autor original les dio debido a que el intermediario se la ha retirado. De esta forma garantizamos la libertad y los derechos de todos.</p>
<p align="right">Por <a href="http://foro.elhacker.net/index.php?action=profile;u=1355">Mordor</a>.</p>
<p align="right"><img src="http://img220.imageshack.us/img220/729/12verdunkj3.png" /></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/la-licencia-gpl/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>RMI, ¿que és? + Un ejemplo sencillo con RMI</title>
		<link>http://casidiablo.net/rmi-%c2%bfque-es-un-ejemplo-sencillo-con-rmi/</link>
		<comments>http://casidiablo.net/rmi-%c2%bfque-es-un-ejemplo-sencillo-con-rmi/#comments</comments>
		<pubDate>Sun, 14 Jan 2007 17:37:00 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[ejercicios en java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[qué es]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[hack]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/?p=318</guid>
		<description><![CDATA[Después de unas no tan merecidas vacaciones de fin de año, retomaré la costumbre de andar posteando cosillas en el blog. Iniciemos el año con un pequeño calentamiento en Java, tratando un tema muy sencillo pero muy útil: RMI o Invocación de Métodos Remotos (por sus siglas en inglés Remote Method Invocation). Una definición simple [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Frmi-%2525c2%2525bfque-es-un-ejemplo-sencillo-con-rmi%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22RMI%2C%20%C2%BFque%20%C3%A9s%3F%20%2B%20Un%20ejemplo%20sencillo%20con%20RMI%22%20%7D);"></div>
<p>Después de unas no tan merecidas vacaciones de fin de año, retomaré la costumbre de andar posteando cosillas en el blog. Iniciemos el año con un pequeño calentamiento en <a href="http://www.casidiablo.net/wordpress/index.php/java/"><strong>Java</strong></a>, tratando un tema muy sencillo pero muy útil: RMI o Invocación de Métodos Remotos (por sus siglas en inglés Remote Method Invocation).</p>
<p>Una definición simple podría ver al RMI como una forma de utilizar funciones de un programa, desde otro programa residente en otro equipo. Es decir, permitir a un programa (A) utilizar las funciones de otro programa (B), solo que el programa B está en otro equipo. Es ejecutar algo por allí, pero que parezca que esté por acá.<br />
Pero, ¿que ventajas trae esto? umm, a simple vista las ventajas son obvias: se puede distribuir un programa en varios equipos; así podemos dividir la carga de procesos en varios hosts, y haciendo el programa más rápido. Esto es útil si el equipo “cliente” no tiene una suficiente capacidad de procesamiento, por ejemplo.</p>
<p>Ahora, una definición wiki más técnica podría ser está (utilicemos las ventajas del GFDL):</p>
<p>RMI es un mecanismo ofrecido en Java para invocar un método remotamente. Al ser RMI parte estándar del entorno de ejecución Java usarlo provee un mecanismo simple en una aplicación distribuida que solamente necesita comunicar servidores codificados para Java. Si se requiere comunicarse con otras tecnologías debe usarse <a href="http://es.wikipedia.org/wiki/CORBA">CORBA</a> o <a href="http://es.wikipedia.org/wiki/SOAP">SOAP</a> en lugar de RMI.</p>
<p>Al estar específicamente diseñado para Java RMI provee pasaje por referencia de objetos (cosa que no hace SOAP), &#8220;recolección de basura&#8221; distribuida y pasaje de tipos arbitrarios (funcionalidad no provista por CORBA).</p>
<p>Por medio de RMI, un programa Java puede exportar un objeto. A partir de esa operación este objeto está disponible en la red, esperando conexiones en un puerto TCP. Un cliente puede entonces conectarse e invocar métodos. La invocación consiste en el &#8220;marshaling&#8221; de los parámetros (utilizando la funcionalidad de &#8220;serialización&#8221; que provee Java), luego se sigue con la invocación del método (cosa que sucede en el servidor). Mientras esto sucede el llamador se queda esperando por una respuesta. Una vez que termina la ejecución el valor de retorno (si lo hay) es serializado y enviado al cliente. El código cliente recibe este valor como si la invocación hubiera sido local.</p>
<p class="cita">Este fragmento de texto fue extraido del artículo <a href="http://es.wikipedia.org/RMI">RMI de la Wikipedia</a>; por lo tanto está bajo los terminos de la Licencia de Documentación Libre de GNU (véase su uso).</p>
<p>Ahora bien, vamos a ver un ejemplo explicado de RMI. Lo primero es implementar el servidor. Para ello se debe crear una “interfaz” que enumere las funciones provistas por el objeto a ser exportado por la red. Esta “interfaz” (en este ejemplo la interfaz se llama InterfazReceptorMensajes.java) es compartida entre cliente y servidor. Del lado servidor es necesario que una de las clases (que hace de servidor como tal) implemente dicha interfaz. Del lado cliente el llamador accede a la misma interfaz, pero debajo hay un &#8220;stub&#8221; que da comienzo a la llamada vía la red. Para crear este “stub” es necesario utilizar el “compilador” rmi llamado <strong>rmic</strong>.</p>
<p class="cita">El lado cliente y el lado servidor deberán tener ambos acceso a la definición de las clases utilizadas para el intercambio de parámetros y de valores de retorno. Para esto Java tiene la capacidad de dinámicamente obtener las clases que se necesiten desde un servidor.</p>
<p>El programa a explicar consta de dos GUI&#8217;s, una para el cliente y una para el servidor. El cliente tiene una caja de texto donde se escriben los mensajes a enviar; dichos mensajes se envian utilizando un método remoto. Mientras, el servidor posee un area de texto donde se muestran los mensajes que recibe de los posibles clientes. Esta es la salida del los programas Servidor/Cliente:</p>
<p><img id="BLOGGER_PHOTO_ID_5019943086369957938" style="margin: 0px auto 10px; display: block; text-align: center" src="http://bp1.blogger.com/_1f_-HOfG6iQ/Rapro-fCaDI/AAAAAAAAAAw/ELzBfBJ5aFQ/s400/ejemploRMI.png" border="0" alt="" /></p>
<p>Expliquemos entonces, paso a paso, el código fuente de la aplicación. Comencemos con la interfaz InterfazReceptorMensajes.java. Fíjate que no se declara una clase como tal (public class), sino una interfaz; y que dicha interfaz hereda de la clase Remote del paquete java.rmi. Además se declara el método recibirMensaje, más no se define. Y es necesario indicar que dicho método puede lanzar una excepción RemoteException.</p>
<pre class="brush: java; title: ; notranslate">import java.rmi.*;
public interface InterfazReceptorMensajes extends Remote
{
//Este es el metodo que implementará el servidor
void recibirMensaje(String texto) throws RemoteException;
}</pre>
<p>Antes de ver el mecanismo de funcionamiento del servidor, veamos como funciona la clase GUIServidor, que simplemente nos sirve como salida para los procesos que realice el servidor. Lo único a resaltar en esta clase es el método anadirEntradas que nos permite añadir texto en el area de texto.</p>
<pre class="brush: java; title: ; notranslate">import javax.swing.*;
public class GUIServidor extends JFrame {

private JTextArea areaTexto;

public GUIServidor() {
super(&quot;Servidor RMI&quot;);
areaTexto = new JTextArea();
areaTexto.setEditable(false);
getContentPane().add(new JScrollPane(areaTexto));

setSize(600, 400);
setVisible(true);
}

public void anadirEntradas(String texto) {
areaTexto.append(texto + &quot;\n&quot;);
}
}</pre>
<p>Ahora veamos la clase <strong>RmiServidor.java</strong> que, como su nombre lo indica, maneja la parte del servidor. Es necesario importar ciertos paquetes y clases. Por ejemplo la clase InetAddress del paquete java.net, que sirve para capturar la dirección IP de la máquina local. Todo el paquete java.rmi, java.rmi.registry y java.rmi.server.</p>
<pre class="brush: java; title: ; notranslate">import java.net.InetAddress;
import java.rmi.*;
import java.rmi.registry.*;
import java.rmi.server.*;import javax.swing.JFrame;</pre>
<p>En la declaración de la clase es necesario heredar de la clase UnicastRemoteObject del paquete java.rmi.server, e implementar la interfaz InterfazReceptorMensajes.</p>
<pre class="brush: java; title: ; notranslate">public class RmiServidor extends UnicastRemoteObject implements InterfazReceptorMensajes {</pre>
<p>Ahora declaramos los objetos que vayamos a utilizar. Declaramos el objeto ventana de la clase GUIServidor, para la parte visual. Una variable entera para almacenar el valor del puerto de escucha. Un string que almacenará la dirección IP del equipo servidor. Y un objeto Registry, del paquete java.rmi.registry.</p>
<pre class="brush: java; title: ; notranslate">private static GUIServidor ventana;
private int estePuerto;

private String estaIP;
private Registry registro;</pre>
<p>El constructor de la clase debe especificar el tipo de excepciones que puede lanzar, en este caso RemoteException. Después obtenemos la dirección IP del servidor utilizando el método estático getLocalHost() de la clase InetAddress; y la almacenamos en el objeto estaIP. Se define el puerto de escucha en 3232. Y se despliega información en la GUI del servidor, acerca de la dirección IP y el puerto de escucha:</p>
<pre class="brush: java; title: ; notranslate">public RmiServidor() throws RemoteException {
try {
// obtener la direccion de este host.
estaIP = (InetAddress.getLocalHost()).toString();
} catch (Exception e) {

throw new RemoteException(&quot;No se puede obtener la direccion IP.&quot;);
}
estePuerto = 3232; // asignar el puerto que se registra
ventana.anadirEntradas(&quot;Conexion establecida por...\nEsta direccion=&quot;
+ estaIP + &quot;, y puerto=&quot; + estePuerto);</pre>
<p>Luego se inicializa el objeto registro, utilizando la instrucción LocateRegistry.createRegistry(estePuerto); que indica al registro el puerto por el cual va a recibir conexiones, de la siguiente forma:</p>
<pre class="brush: java; title: ; notranslate">try {
// crear el registro y ligar el nombre y objeto.
registro = LocateRegistry.createRegistry(estePuerto);
registro.rebind(&quot;rmiServidor&quot;, this);
} catch (RemoteException e) {
throw e;
} }</pre>
<p>El método recibir mensajes aquí definido, es el mismo que se declaró en la interfaz InterfazReceptorMensajes.java. Este método recibirá un string y lo enviará al método anadirEntradas de la GUI, para desplegar dicho mensaje en pantalla.</p>
<pre class="brush: java; title: ; notranslate">public void recibirMensaje(String texto) throws RemoteException {
ventana.anadirEntradas(texto);
}</pre>
<p>En el método main se crea una instancia de la clase RmiServidor, lo que lanza el programa servidor, y lo pone en escucha:</p>
<pre class="brush: java; title: ; notranslate">public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
ventana = new GUIServidor();
ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
new RmiServidor();
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
} }</pre>
<p>Para compilar adecuadamente la parte del servidor y crear el “stub”, es decir: la interfaz gráfica (<strong>GUIServidor.java</strong>), la interfaz receptora de mensajes (<strong>InterfazReceptorMensajes.java</strong>) y el servidor (<strong>RmiServidor.java</strong>), debes utilizar los siguientes comandos:</p>
<p class="consola">javac *.java<br />
rmic RmiServidor</p>
<p class="cita"><strong>Nota:</strong> El uso del comando <strong>rmic</strong> es necesario para crear el stub, aunque esto solo es en algunas versiones de Java. He probado con la version 1.5 y no he tenido que utilizarlo para que el programa funcione correctamente. Pero es recomendable usarlo en cualquiera de los casos, para evitar posibles errores.<br />
Es de notar también que al utilizar el comando <strong>rmic</strong>, este crea un archivo de clase aparte del convencional (que se gunera con el comando <strong>javac</strong>), este archivo (para este ejemplo) toma el nombre de: <strong>RmiServidor_Stub.class</strong>, y es el que Java utiliza para manipular el stub del servidor.</p>
<p align="left">Ahora veamos la parte cliente. Como ya hemos dicho antes la interfaz <strong>InterfazReceptorMensajes.java</strong> se comparte entre cliente y servidor; por lo cual solo nos queda explicar la clase <strong>RmiCliente.java</strong>. En dicha clase es necesario importar los paquetes <strong>java.rmi</strong> y <strong>java.rmi.registry</strong>, además de los necesarios para la GUI:</p>
<pre class="brush: java; title: ; notranslate">import java.rmi.*;
import java.rmi.registry.*;
import javax.swing.*;
import java.awt.*;import java.awt.event.*;</pre>
<p>La clase RmiCliente, aparte de los necesarios para la interfaz gráfica, declara: un objeto de la interfaz InterfazReceptorMensajes, un objeto de la clase Registry y dos objetos String en donde colocaremos la dirección IP del servidor a conectarnos y el puerto de escuha. En este caso, en la dirección IP del servidor coloco la loop IP (127.0.0.1), ya que las pruebas las realizo en el mismo equipo, es decir, servidor y cliente corriendo en la misma máquina:</p>
<pre class="brush: java; title: ; notranslate">public class RmiCliente extends JFrame implements ActionListener {
private JTextField cajaEnviar;
private JButton botonEnviar;
private JLabel estado;
private static InterfazReceptorMensajes rmiServidor;
private static Registry registro;
private static String direccionServidor = &quot;127.0.0.1&quot;; private static String puertoServidor = &quot;3232&quot;;</pre>
<p>El constructor inicializa y configura los objetos de la GUI:</p>
<pre class="brush: java; title: ; notranslate">public RmiCliente() {
super(&quot;Cliente RMI&quot;);
getContentPane().setLayout(new BorderLayout());
cajaEnviar = new JTextField();
cajaEnviar.addActionListener(this);
botonEnviar = new JButton(&quot;Enviar&quot;);
botonEnviar.addActionListener(this);
estado = new JLabel(&quot;Estado...&quot;);

getContentPane().add(cajaEnviar);
getContentPane().add(botonEnviar, BorderLayout.EAST);
getContentPane().add(estado, BorderLayout.SOUTH);

setSize(300, 100);
setVisible(true);
}</pre>
<p>El método actionPerformed captura cualquier evento, ya sea de la caja de texto o del boton, y envía el mensaje como parámetro al método enviarMensaje.</p>
<pre class="brush: java; title: ; notranslate">public void actionPerformed(ActionEvent e) {
if (!cajaEnviar.getText().equals(&quot;&quot;)) {
enviarMensaje(cajaEnviar.getText());
cajaEnviar.setText(&quot;&quot;);
} }</pre>
<p>El método conectarseAlServidor inicializa el objeto registro (de la clase Registry), utilizando para ello la instrucción LocateRegistry.getRegistry(), que recibe como argumentos la dirección IP del servidor y el puerto de escucha. Luego inicializa el objeto rmiServidor (de la clase InterfazReceptorMensajes) utilizando el método lookup de de la clase Registry. Fíjate que al utilizar el método lookup se le pasa como argumento el string “rmiServidor”, pero ¿porqué “rmiServidor”?; la respuesta es sencilla: cuando implementamos el servidor y lo ponemos a la escucha, utilizamos el comando registro.rebind(&#8220;rmiServidor&#8221;, this); esto es como colocarle nombre al registro de escucha, y por ello al crear el registro cliente es necesario indicar dicho nombre.</p>
<pre class="brush: java; title: ; notranslate">private static void conectarseAlServidor() {
try {
// obtener el registro
registro = LocateRegistry.getRegistry(direccionServidor,
(new Integer(puertoServidor)).intValue());
// creando el objeto remoto
rmiServidor = (InterfazReceptorMensajes) (registro
.lookup(&quot;rmiServidor&quot;));
} catch (RemoteException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
}
}</pre>
<p>El método enviarMensaje es el que realmente utiliza RMI. Dicho método utiliza la función recibirMensaje del objeto rmiServidor, es decir: utiliza el método remoto del servidor a través de la interfaz.</p>
<pre class="brush: java; title: ; notranslate">private void enviarMensaje(String mensaje) {
estado.setText(&quot;Enviando &quot; + mensaje + &quot; a &quot; + direccionServidor + &quot;:&quot;
+ puertoServidor);
try {
// llamando el metodo remoto
rmiServidor.recibirMensaje(mensaje);
estado.setText(&quot;El mensaje se ha enviado!!!&quot;);
} catch (RemoteException re) {
re.printStackTrace();
}
}</pre>
<p>El método main utiliza la función conectarseAlServidor para crear la conexión, y luego crea el objeto de la GUI:</p>
<pre class="brush: java; title: ; notranslate">static public void main(String args[]) {
JFrame.setDefaultLookAndFeelDecorated(true);
conectarseAlServidor();
RmiCliente ventana = new RmiCliente();
ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}</pre>
<p>El proceso de compilación del cliente es normal, no tienes que utilizar otros comandos. Por cuestiones de comodidad he realizado las pruebas en un solo equipo, pero lo ideal es hacerlo en equipos distintos, y mas aún: que tengan SO diferentes. Por ejemplo correr el servidor en un equipo con Linux, y utilizar sus métodos remotos desde uno con Windows; ahí se centra el verdadero potencial del Java y RMI: la multiplataforma.</p>
<p>Bien eso es todo. Imagino que ya descargaste el <a href="http://casidiablo.net/descargar/Rmi+GUI+Simple">código fuente de los ejemplos</a>. Dudas, comentarios, sugerencias e insultos: <a href="mailto:castidiablo@gmail.com">castidiablo[at]gmail.com</a>.</p>
<p><a href="http://casidiablo.net/descargar/Documento+PDF+-+RMI">Descargar versión en PDF <img src="http://img117.imageshack.us/img117/6694/pdf20icon20smallua0.png" alt="" /></a><br />
<a href="http://casidiablo.net/descargar/Rmi+GUI+Simple">Descargar código fuente de los ejemplos <img src="http://img64.imageshack.us/img64/3001/ico1ij4.gif" alt="" /></a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/rmi-%c2%bfque-es-un-ejemplo-sencillo-con-rmi/feed/</wfw:commentRss>
		<slash:comments>59</slash:comments>
		</item>
		<item>
		<title>¿Qué es un Servidor Web?</title>
		<link>http://casidiablo.net/%c2%bfque-es-un-servidor-web/</link>
		<comments>http://casidiablo.net/%c2%bfque-es-un-servidor-web/#comments</comments>
		<pubDate>Sun, 14 Jan 2007 17:15:00 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[qué es]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/?p=317</guid>
		<description><![CDATA[Este es un tema que aparentemente no tiene nada que ver con la programación de computadores, pero es fundamental conocer ciertos conceptos para poder desarrollar aplicaciones sobre ciertas tecnologías. Y aún más sabiendo que la programación forma importante parte del Internet. Un servidor Web es un software de aplicación que nos brinda un servicio; pero [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252F%2525c2%2525bfque-es-un-servidor-web%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22%C2%BFQu%C3%A9%20es%20un%20Servidor%20Web%3F%22%20%7D);"></div>
<p>Este es un tema que aparentemente no tiene nada que ver con la programación de computadores, pero es fundamental conocer ciertos conceptos para poder desarrollar aplicaciones sobre ciertas tecnologías. Y aún más sabiendo que la programación forma importante parte del Internet.</p>
<p>
<p>Un servidor Web es un software de aplicación que nos brinda un servicio; pero ¿qué tipo de servicio? bien, al decir “Web” nos referimos obviamente a internet o a una red, por ello un “Servidor Web” debe implementar el <a href="http://www.google.com/search?q=protocolo+http&#038;start=0&amp;amp;amp;amp;amp;amp;ie=utf-8&#038;oe=utf-8&amp;client=firefox&#038;rls=org.mozilla:en-US:unofficial">protocolo HTTP </a>(protocolo de transferencia de hipertexto). Este protocolo está diseñado para transferir páginas web, es decir, documentos en <a href="http://es.wikipedia.org/wiki/HTML">HTML</a> (HyperText Markup Language): textos complejos con enlaces, figuras, formularios, botones y objetos incrustados como animaciones o reproductores de sonidos.</p>
<p>
<p class="cita">Aclaremos algo<br />El termino servidor es algo ambiguo, ya que un servidor es el software que presta un servicio, pero también se llama servidor a la máquina donde está instalado dicho software. En este artículo vamos a hablar del software, mas no del hardware.</p>
<p><strong>¿Cómo funciona?</strong>
<p>El servidor está siempre a la espera de peticiones Web. Dichas peticiones son hechas por un cliente http (un navegador web), que después de realizar la petición espera la respuesta del servidor. Por ejemplo, cuando digitas en tu navegador la dirección <a href="http://www.google.com/">http://www.google.com/</a> este envía una petición HTTP al servidor de Google, dicho servidor responde al cliente enviando el código HTML de dicha página. El cliente recibe el código fuente, lo interpreta y lo muestra en pantalla. El servidor se limita a recibir las peticiones y responderlas adecuadamente, mientras el cliente se encarga del proceso de interpretación.</p>
<p>
<p>En cuanto a programación se refiere, existen dos tipos de aplicaciones web: del lado del cliente y del lado del servidor. Las aplicaciones del lado del cliente se ejecutan en el navegador web, entre ellas cabe destacar JavaScript, Visual Basic Script y los applets de Java. En cuanto a las aplicaciones del lado del servidor existen lenguajes de programación, que se ejecutan en el equipo servidor, generalmente formando documentos HTML dinámicos (basandose en operaciones y/o acceso a bases de datos, por ejemplo). Entre los lenguajes más destacables del lado del servidor están: PHP, JSP, ASP, Perl, CGI, entre otros.</p>
<p>
<p>En la mayoría de los casos se opta por utilizar tecnologías del lado del servidor, por varios motivos, por ejemplo: al ejecutarse en el servidor las respuestas son, por lo general, estándares XHTML por lo que cualquier navegador puede interpretarlas, cosa que no pasa con las tecnologías cliente (que en algunos casos necesitan <a href="http://es.wikipedia.org/wiki/Plugin">plugins</a>). Otra ventaja es ĺa seguridad: al ejecutarse el código fuente en el servidor, el programación es transparente al cliente, permitiendo ocultar así los detalles de implementación.</p>
<p><strong>¿Qué servidores existen?</strong>
<p>Algunos servidores conocidos son:</p>
<ul>
<li><a href="http://www.google.com/search?q=servidor+apache&amp;start=0&amp;ie=utf-8&#038;oe=utf-8&amp;client=firefox&amp;rls=org.mozilla:en-US:unofficial">Apache</a></li>
<p>
<li><a href="http://es.wikipedia.org/wiki/IIS">Internet Information Server (IIS)</a></li>
<p>
<li><a href="http://casidiablo.blogspot.com/2006/12/el-servidor-apache-tomcat.html">Tomcat</a>, un servidor basado en Apache para estándares de Java (JSP y Servlets)</a></li>
<p>
<li><a href="http://es.wikipedia.org/wiki/Lighttpd">lighttpd</a></li>
<p>
<li><a href="http://es.wikipedia.org/wiki/Thttpd">thttpd</a></li>
</ul>
<p>Version pdf: <img src="http://img117.imageshack.us/img117/6694/pdf20icon20smallua0.png" /> <a href="http://casidiablohost.googlepages.com/QueesunservidorWeb.pdf">Descargar</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/%c2%bfque-es-un-servidor-web/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>¿Qué es JSP?</title>
		<link>http://casidiablo.net/%c2%bfque-es-jsp/</link>
		<comments>http://casidiablo.net/%c2%bfque-es-jsp/#comments</comments>
		<pubDate>Sun, 14 Jan 2007 16:47:00 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[qué es]]></category>
		<category><![CDATA[hack]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/?p=319</guid>
		<description><![CDATA[JSP (Java Server Pages) es una tecnología web, del lado del servidor, que se usa generalmente para generar documentos XHTML y XML dinámicos. JSP es un producto de la compañía Sun Microsystems, y su funcionamiento se basa en script&#8217;s, con una sintaxis similar al la de Java. JSP es una tecnología similar a PHP, ASP [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252F%2525c2%2525bfque-es-jsp%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22%C2%BFQu%C3%A9%20es%20JSP%3F%22%20%7D);"></div>
<p>JSP (Java Server Pages) es una tecnología web, del lado del servidor, que se usa generalmente para generar documentos XHTML y XML dinámicos. JSP es un producto de la compañía <a href="http://es.wikipedia.org/wiki/Sun_Microsystems">Sun Microsystems</a>, y su funcionamiento se basa en script&#8217;s, con una sintaxis similar al la de Java.</p>
<p>JSP es una tecnología similar a PHP, ASP y demás. Y permite incrustar código JSP dentro del HTML, para crear información dinámicamente (basándose en operaciones o acceso a bases de datos, por ejemplo). El código JSP se incrusta en el HTML dentro de las marcas , a esto se le llama scriptled.</p>
<p>Una de las principales ventajas del JSP, es que permite al programador integrar los scripts con clases de Java (en estos casos llamados servlets), lo que permite tener por separado los módulos que se encargan de hacer los procesos de datos (por lo general los archivos .class), de los que se encargan de presentar visualmente dichos datos (los documentos JSP).</p>
<p>Para correr un programa en JSP es necesario tener instalado un servidor que soporte dicha tecnología. La mejor opción sin duda es utilizar el <a href="http://casidiablo.blogspot.com/2006/12/instalacin-del-apache-tomcat-en-linux.html">Apache Tomcat</a>, aunque es posible configurar servidores como el IIS para que ejecuten servlets. Tomcat posee un contenedor Web que cumple con las especificaciones de JSP y de Servlet.</p>
<p>Vamos a ver como sería el “hola mundo” en JSP. Lo único que tenemos que hacer es crear un documento con la extensión *.jsp y con el siguiente contenido:</p>
<p class="codigomain">&lt;html&gt;</p>
<p>&lt;head&gt;&lt;title&gt;Ejemplo JSP&lt;/title&gt;&lt;/head&gt;</p>
<p>&lt;body&gt;</p>
<p>&lt;%</p>
<p>out.println(&#8220;Hola mundo!!!&lt;br/&gt;&#8221;);</p>
<p>out.println(&#8220;&lt;b&gt;elhacker r00Lz&lt;/b&gt;&#8221;);</p>
<p>%&gt;</p>
<p>&lt;/body&gt;</p>
<p>&lt;/html&gt;</p>
<p>La salida de este programa sería la siguiente:</p>
<p><img src="http://bp3.blogger.com/_1f_-HOfG6iQ/RaphwefCaBI/AAAAAAAAAAU/5HKcRug2ECI/s400/Pantallazo-Ejemplo+JSP+-+Firefox.png" id="BLOGGER_PHOTO_ID_5019932220102699026" style="margin: 0px auto 10px; display: block; text-align: center" border="0" /><br />
Fíjate que la salida del programa se genera con la funcion out.println(“texto”), y que es necesario usar etiquetas HTML para dar formato al documento correctamente. Por ejemplo, para que haya un salto de línea entre una frase y la otra es necesario imprimir la marca. Ahora miremos el código fuente generado, es decir, el que recibe el cliente:</p>
<p><img src="http://bp2.blogger.com/_1f_-HOfG6iQ/Raph-OfCaCI/AAAAAAAAAAc/-JKVRcrXa78/s400/Pantallazo.png" id="BLOGGER_PHOTO_ID_5019932456325900322" style="margin: 0px auto 10px; display: block; text-align: center" border="0" /></p>
<p>Como ves, el documento generado no contiene nada de código JSP, ya que éste se ejecuto en el servidor y envió al cliente un archivo HTML simple. Este no es un tutorial de referencia para JSP, si es lo que necesitas <a href="http://www.google.com/search?q=tutorial+jsp&amp;start=0&amp;amp;ie=utf-8&amp;oe=utf-8&amp;client=firefox&amp;rls=org.mozilla:en-US:unofficial">hay bastantes en internet</a>. Si deseas más información acerca de JSP puedes visitar su <a href="http://java.sun.com/products/jsp/">página oficial</a>.<br />
Si deseas comenzar a programar en JSP tienes primero que tener el servidor Apache Tomcat. Sino lo has hecho, puedes leer <a href="http://casidiablo.blogspot.com/2006/12/instalacin-del-apache-tomcat-en-linux.html">este artículo</a> donde explico como instalarlo y configurarlo, tanto en Windows como en Linux.</p>
<p><a href="http://casidiablohost.googlepages.com/QuesJSP.pdf">Descargar versión en PDF <img src="http://img117.imageshack.us/img117/6694/pdf20icon20smallua0.png" /></a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/%c2%bfque-es-jsp/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Acerca de Java</title>
		<link>http://casidiablo.net/acerca-de-java/</link>
		<comments>http://casidiablo.net/acerca-de-java/#comments</comments>
		<pubDate>Fri, 12 Jan 2007 21:35:00 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[qué es]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[ejercicios]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/?p=417</guid>
		<description><![CDATA[Java es un lenguaje de programación orientado a objetos muy utilizado en el escritorio, y aún más en el servidor. Información en el Blog: Entorno típico de programación en Java Compiladores e IDE&#8217;s Listado de ejercicios y ejemplos Enlaces, tutoriales y recursos en la web]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Facerca-de-java%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Acerca%20de%20Java%22%20%7D);"></div>
<p>Java es un lenguaje de programación orientado a objetos muy utilizado en el escritorio, y aún más en el servidor. Información en el Blog:</p>
<ul>
<li><a href="http://www.casidiablo.net/wordpress/index.php/2006/09/03/fundamentos-de-un-entorno-tipico-en-java/" title="Ver entrada">Entorno típico de programación en Java</a></li>
<li><a href="http://www.casidiablo.net/wordpress/index.php/2006/09/14/compiladores-e-ide%e2%80%99s/" title="Ver entrada">Compiladores e IDE&#8217;s</a></li>
<li><a href="http://www.casidiablo.net/wordpress/index.php/2006/09/03/listado-de-ejercicios-en-java/" title="Ver entrada">Listado de ejercicios y ejemplos</a></li>
<li><a href="http://www.casidiablo.net/wordpress/index.php/2006/09/03/tutoriales-y-recursos-en-la-web/" title="Ver entrada">Enlaces, tutoriales y recursos en la web</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/acerca-de-java/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Brainfuck</title>
		<link>http://casidiablo.net/brainfuck/</link>
		<comments>http://casidiablo.net/brainfuck/#comments</comments>
		<pubDate>Mon, 25 Dec 2006 22:37:00 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[programación]]></category>
		<category><![CDATA[qué es]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/?p=312</guid>
		<description><![CDATA[Brainkfuck es como su nombre lo dice un jodecerebros. Se trata de un lenguaje de programación esotérico, creado por un psicópata maniático llamado Urban Müller en 1993. Este mounstruo de lenguaje fue echo con el fin de que fuera simple y que tuviera pocas instrucciones (fue basado en la Máquina de Turing). Primero, y antes [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fbrainfuck%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Brainfuck%22%20%7D);"></div>
<p>Brainkfuck es como su nombre lo dice un jodecerebros. Se trata de un lenguaje de programación esotérico, creado por un psicópata maniático llamado Urban Müller en 1993. Este mounstruo de lenguaje fue echo con el fin de que fuera simple y que tuviera pocas instrucciones (fue basado en la Máquina de Turing).</p>
<p>Primero, y antes de nada, quisiera que veas un programa en Brainfuck que creé hace un tiempo, para que veas los fácil que es desarrollar aplicaciones en este lenguaje XD. El programa imprime la cadena “elhacker.net”:</p>
<p>++++++++++[&gt;++++++++++&lt;-]&gt;+.+++++++.<br />
&#8212;-.&#8212;&#8212;-.++.&gt;++[&lt;++++&gt;-]&lt;.&#8212;&#8212;.&gt;+++[&lt;<br />
++ ++&gt;-]&lt;+.&gt;++++[&gt;+++++++++++&lt;-]&gt;++.[-]<br />
&lt;&lt;&#8211; &#8211;.&gt;++[&lt;----&gt;-]&lt;-.&gt;+++[&lt;+++++&gt;-]&lt;.</p>
<p>¿entendible nó? umm, que lenguaje más bonito&#8230; Y te quejabas del C++ y Java ¿no? La verdad es más fácil de lo que parece&#8230; la lógica del programa se basa en un arreglo de bytes, mínimo de 30000 espacios, todos inicializados a cero; un puntero que “apunta” a la primera direccion del array; y dos corrientes de bytes entrada y salida. Las instrucciones Son tan solo 8 instrucciones, y cada una consta de un carácter. No se puede poner otros caracteres más que esos&#8230; Estos son algunos enlaces de interés acerca del Brainfuck:</p>
<ul>
<li><a href="http://www.4mhz.de/">Intérprete de Brainfuck con un depurador integrado (EDI) para Windows</a></li>
<li><a href="http://www.muppetlabs.com/~breadbox/bf/">Brian Raiter, Muppetlabs. Brainfuck: Un lenguaje de programación Turing completo de ocho instrucciones.</a> Este sitio incluye un <a href="http://es.wikipedia.org/wiki/Quine">quine</a> de Brainfuck.</li>
<li><a href="http://esoteric.sange.fi/Brainfuck/">Panu Kalliokoski. El Archivo de Brainfuck</a> tiene muchos programas de Brainfuck, quines, y implementaciones.</li>
<li><a href="http://home.arcor.de/partusch/html_en/bfd.html">Brainfucked</a> compilador de Brainfuck para Windows/DOS.</li>
<li><a href="http://home.planet.nl/~faase009/Ha_bf_Turing.html">Frans Faase. BF es Turing completo</a></li>
<li><a href="http://www.hevanet.com/cristofd/brainfuck/">Daniel Cristofani. Alguna información de Brainfuck</a></li>
<li><a href="http://www.brainfuck.ca/">Brainfuck.ca Intérpretes y convertidores de Brainfuck autorizado con la GPL</a></li>
<li><a href="http://www.hardtware.de/index.cgi?site=products&amp;action=brainfuck">Un intérprete y compilador de Brainfuck para Windows</a></li>
<li><a href="http://elswanko.vm.bytemark.co.uk/~fraggle/stuffage/bf.net/">Brainfuck.net</a></li>
<li><a href="http://www.nada.kth.se/~matslina/awib/">Also Written In Brainfuck (awib)</a> es un compilador de Brainfuck escrito en Brainfuck para <a href="http://es.wikipedia.org/wiki/Linux">Linux</a> de <a href="http://es.wikipedia.org/wiki/I386">i386</a>.</li>
<li><a href="http://robos.org/bfcomp/index.html">Robert Östling. Computadora de Brainfuck.</a></li>
<li><a href="http://www.clifford.at/bfcpu/">Clifford Wolf. El UCP de Brainfuck y otros proyectos relacionados con Brainfuck</a></li>
<li><a href="http://alx2002.free.fr/">Un tutorial de Brainfuck en inglés y francés.</a></li>
<li><a href="http://kidsquid.com/programs/bf/bf.html">Jeffry Johnston. Programas de BF, incluyendo un compilador de Basic y un ensamblador</a></li>
</ul>
<p>Los enlaces fueron citados de la lista de enlaces externos de un artículo en la Wikipedia. Por lo tanto el contenido está disponible bajo los términos de la <a href="http://es.wikipedia.org/wiki/Wikipedia:Texto%20de%20la%20Licencia%20de%20documentación%20libre%20de%20GNU">Licencia de documentación libre de GNU</a>.</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/brainfuck/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>El servidor Apache Tomcat</title>
		<link>http://casidiablo.net/el-servidor-apache-tomcat/</link>
		<comments>http://casidiablo.net/el-servidor-apache-tomcat/#comments</comments>
		<pubDate>Sat, 16 Dec 2006 23:52:00 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[qué es]]></category>

		<guid isPermaLink="false">http://www.casidiablo.net/wordpress/?p=308</guid>
		<description><![CDATA[Tomcat es el ervidor Web más utilizado a la hora de trabajar con Java en entrornos web; Tomcat es una implementación completamente funcional de los estándares de JSP y Servlets. Tomcat también puede especificarse como el manejador de las peticiones de JSP y servlets recibidas por servidores Web populares, como el servidor Apache HTTP de [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fel-servidor-apache-tomcat%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22El%20servidor%20Apache%20Tomcat%22%20%7D);"></div>
<p>Tomcat es el ervidor Web más utilizado a la hora de trabajar con Java en entrornos web; Tomcat es una implementación completamente funcional de los estándares de JSP y Servlets. Tomcat también puede especificarse como el manejador de las peticiones de JSP y servlets recibidas por servidores Web populares, como el servidor Apache HTTP de la Fundación de software de Apache o el servidor Microsoft Internet Information Server (IIS). Tomcat está integrado en la implementación de referencia Java 2 Enterprise Edition (J2EE) de Sun Microsystems.</p>
<p>Puedes descargar la última versión del Tomcat de:</p>
<p><a href="http://jakarta.apache.org/site/binindex.cgi">http://jakarta.apache.org/site/binindex.cgi</a><br />en donde hay una variedad de archivos comprimidos. Allí puedes encontrar los instaladores para diversos sistemas operativos. Para Windows existe un instalador típico (un *exe), y para Linux puedes descargar los tar y tar comprimidos.</p>
<p>Puedes ver también: <a href="http://casidiablo.blogspot.com/2006/12/instalacin-del-apache-tomcat-en-linux.html">Instalación del Apache Tomcat en Linux y Windows</a></p>
<p>Más información en:</p>
<ul>
<li><a href="http://es.wikipedia.org/wiki/Tomcat">Wikipedia</a></li>
<li><a href="http://www.programacion.net/java/tutorial/tomcatintro/">Java en Castellano</a></li>
<li><a href="http://bulma.net/body.phtml?nIdNoticia=1888">Bulma</a></li>
<li><a href="http://tomcat.apache.org/">Página oficial</a></li>
<li><a href="http://jakarta.apache.org/">Página Jakarta</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/el-servidor-apache-tomcat/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

