<?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; tutorial</title>
	<atom:link href="http://casidiablo.net/tag/tutorial/feed/" rel="self" type="application/rss+xml" />
	<link>http://casidiablo.net</link>
	<description>Blog de Java, Programación y Linux</description>
	<lastBuildDate>Mon, 08 Mar 2010 03:41:21 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>JBoss Seam Framework + Laboratorio de iniciación</title>
		<link>http://casidiablo.net/jboss-seam-framework-introduccion/</link>
		<comments>http://casidiablo.net/jboss-seam-framework-introduccion/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 07:14:03 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[ejercicios en java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[bpm]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[ejb3]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[j2ee]]></category>
		<category><![CDATA[jboss]]></category>
		<category><![CDATA[jsf]]></category>
		<category><![CDATA[manual]]></category>
		<category><![CDATA[seam]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3422</guid>
		<description><![CDATA[

Seam es un proyecto desarrollado por JBoss, cuyo lider es Gavin King. Es un completo framework para la creación de aplicaciones web 2.0 que unifica varias tecnologías como AJAX, Enterprise Java Beans (EJB3), Java Server Faces (JSF), Java Portlets and Business Process Management (BPM), Hibernate, y mucho más.
De la Wikipedia:
Seam introduce el concepto de contextos. [...]]]></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%3A%2F%2Fcasidiablo.net%2Fjboss-seam-framework-introduccion%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22JBoss%20Seam%20Framework%20%2B%20Laboratorio%20de%20iniciaci%C3%B3n%09%22%20%7D);"></div>
<p style="text-align: justify;"><a href="http://www.seamframework.org/">Seam</a> es un proyecto desarrollado por JBoss, cuyo lider es Gavin King. Es un completo framework para la creación de aplicaciones web 2.0 que unifica varias tecnologías como AJAX, Enterprise Java Beans (EJB3), Java Server Faces (JSF), Java Portlets and Business Process Management (BPM), Hibernate, y mucho más.</p>
<p style="text-align: justify;">De la Wikipedia:</p>
<p style="text-align: justify; padding-left: 30px;"><em>Seam introduce el concepto de contextos. Cada componente de Seam existe dentro de un contexto. El contexto conversacional por ejemplo captura todas las acciones del usuario hasta que éste sale del sistema o cierra el navegador &#8211; inclusive puede llevar un control de múltiples pestañas y mantiene un comportamiento consistente cuando se usa el botón de regresar de el navegador.</em></p>
<p style="text-align: justify; padding-left: 30px;"><em>Tú puedes automáticamente generar una aplicación web de altas, bajas, cambio y modificaciones a partir de una base de datos existente utilizando una herramienta de linea de comandos llamada seam-gen incluida con el framework.</em></p>
<p style="text-align: justify; padding-left: 30px;"><em>El desarrollo WYSIWYG es facilitado a través del uso de las JBoss Tools, que es un conjunto de plug-ins diseñados para el entorno integrado de desarrollo Eclipse. Seam puede ser integrado con las bibliotecas de componentes JSF JBoss RichFaces o con ICEsoft ICEFaces. Ambas bibliotecas poseen soporte para AJAX.</em></p>
<p style="text-align: justify;">Actualmente soporta varios contenedores de aplicaciones como JBoss 4 o 5, IBM Websphere, BEA WebLogic, Oracle OC4J y por supuesto Apache Tomcat.</p>
<p style="text-align: justify;">Puedes encontrar ejemplos de proyectos creados con seam y listos para ejecutar dentro del directorio examples de la aplicación.</p>
<p style="text-align: justify;"><strong>Referencias y documentación:</strong></p>
<ul>
<li><a href="http://www.seamframework.org/Home">Página oficial de Seam Framework</a></li>
<li><a href="http://www.jboss.com/products/seam/">Página del producto JBoss Seam</a></li>
<li><a href="http://docs.jboss.com/seam/latest/reference/en-US/html/index.html">Documentación Online mantenida por la comunidad</a></li>
<li><a href="http://docs.jboss.com/seam/">Documentación de JBoss Seam</a></li>
<li><a href="http://www.infoq.com/articles/jboss-seam">Introduction to JBoss Seam [artículo en InfoQ]</a></li>
</ul>
<p style="text-align: justify;">
<h3>Laboratorio de JBoss Seam Framework</h3>
</p>
<p style="text-align: justify;">Con el siguiente laboratorio se pretende dar un punto de partida a la creación de aplicaciones usando Seam. El laboratorio está enfocado al desarrollo sobre Eclipse, que es el IDE que recomiendo para trabajar con Seam.</p>
<p style="text-align: justify;">Este laboratorio está enfocado al uso de Seam para JBoss, aunque con pocas o sin modificaciones puede funcionar en Apache Tomcat. Recordemos además que Seam también soporta los contenedores IBM Websphere, BEA WebLogic y Oracle OC4J.</p>
<p style="text-align: justify;">Nota: todas las pruebas se realizaron sobre Linux (<a href="http://casidiablo.net/category/gentoo/">Gentoo</a> amd64) y <a href="http://opensolaris.org">OpenSolaris</a> 9.6. Sin embargo, hacerlo en Windows con los mismos pasos no debería presentar problemas; solo se debe tener cuidado con las rutas donde se guarden los archivos usados.</p>
<p style="text-align: justify;">
<h3>Prerequisitos</h3>
</p>
<ul>
<li><span style="background-color: #ffffff;"><a href="http://eclipse.org">Eclipse 3.4 o 3.5</a></span></li>
<li><span style="background-color: #ffffff;"><a href="http://seamframework.org/Download">La última versión de JBoss Seam</a> (la más reciente al momento de escribir este documento es la 2.2.0).</span></li>
<li><span style="background-color: #ffffff;"><a href="http://labs.jboss.com/jbossas/downloads/">La última versión de Jboss Server</a> (la más reciente al momento de escribir este documento es la 5.1.0).</span></li>
<li><span style="background-color: #ffffff;">Un gestor de bases de datos. En mi caso he usado MySQL, aunque hay soporte para muchos otros gestores. No olvides además descargar el conector JDBC, en mi caso el mysql-connector-java-bin.jar.</span></li>
</ul>
<p><span id="more-3422"></span></p>
<p style="text-align: justify;">
<h3>Instalación</h3>
</p>
<p style="text-align: justify;">Para instalar Seam y JBoss basta con descomprimir los paquetes que descarguemos de Internet. Yo recomiendo hacerlo en la carpeta /opt en sistemas UNIX/Linux, o directamente en C:/ en sistemas Windows.</p>
<p style="text-align: justify;">
<h3>Creación de un proyecto base para Eclipse</h3>
</p>
<p style="text-align: justify;">SeamFramework nos proporciona una herramienta de línea de comandos para la generación de proyectos base. Vamos al directorio donde lo instalamos y ejecutamos:</p>
<div class="consola">./seam setup</div>
<p style="text-align: justify;">Ahora debemos responder a cada una de las preguntas que nos hace; muchas de ellas las debemos dejar por defecto, así que nos concentraremos solo en aquellas en donde tengamos que cambiar. Resumiendo:</p>
<ul>
<li>El directorio donde se creará el proyecto:
<div class="consola">[input] Enter the directory where you want the project to be created (should not contain spaces) [/home/funtoo/projects] [/home/funtoo/projects]<br />
/home/funtoo/Poli/Componentes/seam-framework/workspace</div>
</li>
<li>El directorio donde se encuentra el JBoss AS:
<div class="consola">[input] Enter your JBoss AS home directory [C:/Program Files/jboss-5.1.0.GA] [C:/Program Files/jboss-5.1.0.GA]<br />
/opt/jboss-5.1.0.GA/</div>
</li>
<li>El nombre del proyecto:
<div class="consola">[input] Enter the project name [myproject] [myproject]<br />
holaseam</div>
</li>
<li>Vamos a desarrollar nuestra aplicación como EAR:
<div class="consola">[input] Is this project deployed as an EAR (with EJB components) or a WAR (with no EJB support)? [war] (ear, [war])<br />
ear</div>
</li>
<li>Definimos el nombre del paquete en base de la aplicación:
<div class="consola">[input] Enter the base package name for your Java classes [com.mydomain.holaseam] [com.mydomain.holaseam]<br />
org.ejemplo.seam</div>
</li>
<li>Los que hacen referencia a los Session Beans o Test Cases los podemos dejar como nos lo pongan. El gestor de base de datos; en este caso usé mysql aunque debería ser practicamente transparente:
<div class="consola">[input] What kind of database are you using? [hsql] ([hsql], mysql, derby, oracle, postgres, mssql, db2, sybase, enterprisedb, h2)<br />
mysql</div>
</li>
<li>Ingresamos la ruta en donde se encuentra el driver JDBC:
<div class="consola">[input] Enter the filesystem path to the JDBC driver jar [] []<br />
/opt/conectores/mysql-connector-java-5.0.8-bin.jar</div>
</li>
<li>Ahora debemos definir la URL de conexión a la base de datos. En este caso, he creado una base de datos llamada ejemplo, y por lo tanto la URL quedaría así:
<div class="consola">[input] Enter the JDBC URL for your database [jdbc:mysql:///test] [jdbc:mysql:///test]<br />
jdbc:mysql://localhost:3306/ejemplo</div>
</li>
<li>Con esta opción se ejecutará un script llamado import.sql cada vez que hagamos un deploy del proyecto. Dicho archivo deberá tener los scripts necesarios para crear tablas y registros. Puesto que en este laboratorio poco vamos a usar MySQL, puedes poner lo que quieras; pero es importante tener en cuenta esta opción a la hora de desarrollar un proyecto.
<div class="consola">[input] Do you want to recreate the database tables and execute import.sql each time you deploy? [n] (y, [n])<br />
y</div>
</li>
</ul>
<p style="text-align: justify;">Ya que hemos configurado lo que será el proyecto, es hora de crearlo. Ejecutamos el comando:</p>
<div class="consola">./seam create-project</div>
<p style="text-align: justify;">Esto creará un proyecto base que puedes abrir con Eclipse, y eso es justo lo que haremos a continuación.</p>
<p style="text-align: justify;">Abrimos eclipse y nos aseguramos que el workspace sea el mismo directorio en el que creamos el proyecto desde Seam. Vamos a la creación de un nuevo proyecto Java:</p>
<p style="text-align: center;"><img title="seam-screenshot" alt="seam-screenshot" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_005.png" width="540" height="402" /></p>
<p style="text-align: justify;">Le damos el mismo nombre que a nuestra aplicación Seam (en este caso holaseam):</p>
<p style="text-align: center;"><img title="seam-screenshot" alt="seam-screenshot" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_006.png" width="524" height="736" /></p>
<p>Y puesto que ya existe un proyecto creado en el workspace muchas de las opciones ya aparecen asignadas. Hacemos clic en Next y vemos que ya hay una estructura de directorios creada con la base del proyecto Seam.</p>
<p style="text-align: center;"><img title="seam-screenshot" alt="seam-screenshot" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_007.png" width="639" height="714" /></p>
<p style="text-align: justify;">Hacemos clic en Finish, y ya podemos comenzar a editar y modificar el proyecto.</p>
<p style="text-align: center;"><img title="seam-screenshot" alt="seam-screenshot" title="screenshot_008" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_008.png" width="573" height="364" /></p>
<p style="text-align: justify;">
<h3>Despliegue del proyecto</h3>
</p>
<p style="text-align: justify;">Primero debemos iniciar el servicio de JBoss. Para ello ejecutamos el archivo run.sh (run.bat en Windows) del directorio bin de Jboss. Este dejará el servicio web corriendo por defecto en el puerto 8080.</p>
<p style="text-align: justify;">Para hacer el despliegue sobre JBoss, usamos un archivo Ant que se generó junto con el proyecto. Dicho archivo nos permite ejecutar tests, hacer (re)despliegues, generar el JavaDoc, entre otras. Así que habrímos el archivo build.xml y nos aseguramos que la vista Outline esté abierta:</p>
<p style="text-align: center; "><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_009.png"><img title="seam-screenshot" alt="seam-screenshot"  src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_009.png" width="600" /></a></p>
<p>Dentro de la vista Outline podemos ver los componentes del archivo build.xml y podemos ejecutarlos con Ant. En este caso, buscamos el componente deploy, hacemos clic derecho, Run As, y Ant Build.</p>
<p style="text-align: center; "><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_010.png"><img title="seam-screenshot" alt="seam-screenshot"  src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_010.png" width="600" /></a></p>
<p style="text-align: justify;">Algunas veces se generan errores al hacer el despliegue:</p>
<p style="text-align: center;"><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_011.png"><img title="seam-screenshot" alt="seam-screenshot"  title="screenshot_011" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_011.png" width="478" height="232" /></a></p>
<p style="text-align: justify;">Si es tu caso, deberás eliminar los archivos y directorios que tengan el nombre del proyecto del directorio deploy en JBoss. En mi caso los elimino con este comando:</p>
<div class="consola">rm -rf /opt/jboss-5.1.0.GA/server/default/deploy/holaseam*</div>
<p style="text-align: justify;">Si todo sale bien, cuando hagamos de nuevo deploy veremos algo como esto:</p>
<p style="text-align: center;"><img title="seam-screenshot" alt="seam-screenshot" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_012.png" width="600" /></p>
<p style="text-align: justify;">Es hora de probar la aplicación. Abrimos el navegador en la dirección: http://localhost:8080/holaseam/</p>
<p style="text-align: center;"><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_013.png"><img title="seam-screenshot" alt="seam-screenshot" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_013.png" width="712" height="618" /></a></p>
<p style="text-align: center;"><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_014.png"><img title="seam-screenshot" alt="seam-screenshot" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_014.png" width="712" height="618" /></a></p>
<p style="text-align: center;"><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_015.png"><img title="seam-screenshot" alt="seam-screenshot"  src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/screenshot_015.png" width="712" height="618" /></a></p>
<p style="text-align: justify;">
<h3>Descargar versión en PDF</h3>
</p>
<p><a href="http://casidiablo.net/descargar/Laboratorio+JBoss+Seam" class="tooltip download" title="Descargar versión en PDF de este artículo">Descargar</a></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/ajax/" rel="tag nofollow">AJAX</a>, <a href="http://casidiablo.net/tag/bpm/" rel="tag nofollow">bpm</a>, <a href="http://casidiablo.net/tag/eclipse/" rel="tag nofollow">eclipse</a>, <a href="http://casidiablo.net/tag/ejb3/" rel="tag nofollow">ejb3</a>, <a href="http://casidiablo.net/tag/how-to/" rel="tag nofollow">how-to</a>, <a href="http://casidiablo.net/tag/j2ee/" rel="tag nofollow">j2ee</a>, <a href="http://casidiablo.net/tag/java/" rel="tag nofollow">java</a>, <a href="http://casidiablo.net/tag/jboss/" rel="tag nofollow">jboss</a>, <a href="http://casidiablo.net/tag/jsf/" rel="tag nofollow">jsf</a>, <a href="http://casidiablo.net/tag/manual/" rel="tag nofollow">manual</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag nofollow">programación</a>, <a href="http://casidiablo.net/tag/seam/" rel="tag nofollow">seam</a>, <a href="http://casidiablo.net/tag/tutorial/" rel="tag nofollow">tutorial</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/jboss-seam-framework-introduccion/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Manual instalación Gentoo paso a paso</title>
		<link>http://casidiablo.net/tutorial-instalacion-gentoo/</link>
		<comments>http://casidiablo.net/tutorial-instalacion-gentoo/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 21:42:37 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[gentoo]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[manual]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3416</guid>
		<description><![CDATA[


En este pequeño manual explicare la manera de instalar Gentoo de una forma sencilla, simple, ilustrada y rápida, este proceso incluye instalación de Gentoo para x86 y AMD (32bits y 64bits), a su vez, puede también tomarse este manual como una opción alternativa a los manuales Oficiales de Gentoo&#8230;
Descargar [licencia cc]
Página del autor


	Etiquetas: gentoo, linux, [...]]]></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%3A%2F%2Fcasidiablo.net%2Ftutorial-instalacion-gentoo%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Manual%20instalaci%C3%B3n%20Gentoo%20paso%20a%20paso%22%20%7D);"></div>
<p style="text-align: center;"><img class="size-full wp-image-3419 aligncenter" title="vaquita-gentoo" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/11/vaquita-gentoo.jpg" alt="vaquita-gentoo" width="600" height="363" /></p>
<p style="text-align: justify;"><em>En este pequeño manual explicare la manera de instalar Gentoo de una forma sencilla, simple, ilustrada y rápida, este proceso incluye instalación de Gentoo para x86 y AMD (32bits y 64bits), a su vez, puede también tomarse este manual como una opción alternativa a los manuales Oficiales de Gentoo&#8230;</em></p>
<p><a class="download tooltip" title="En formato PDF" href="http://casidiablo.net/descargar/Instalacion+Gentoo">Descargar</a> [<a href="http://creativecommons.org/licenses/by-nc-sa/2.5/mx/">licencia cc</a>]</p>
<p><a href="http://tinyurl.com/yj8wp8n">Página del autor</a></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/gentoo/" rel="tag nofollow">gentoo</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/manual/" rel="tag nofollow">manual</a>, <a href="http://casidiablo.net/tag/tip/" rel="tag nofollow">tip</a>, <a href="http://casidiablo.net/tag/tutorial/" rel="tag nofollow">tutorial</a>, <a href="http://casidiablo.net/tag/wordpress/" rel="tag nofollow">wordpress</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/tutorial-instalacion-gentoo/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Uso básico de Git</title>
		<link>http://casidiablo.net/uso-basico-de-git/</link>
		<comments>http://casidiablo.net/uso-basico-de-git/#comments</comments>
		<pubDate>Wed, 30 Sep 2009 05:29:40 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[how-to]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3355</guid>
		<description><![CDATA[

Esta guía es la continuación de la anterior entrada, en donde explicaba cómo montar un servidor Git. Ahora veremos las operaciones básicas sobre el repositorio (hacer un checkout, añadir o borrar objetos, commit, etc.). Del lado del cliente también debemos tener instalado git:
En Debian:
# aptitude install git-core
En Gentoo:
# emerge dev-util/git

Clonar el repositorio
Llamamos &#8220;clonar&#8221; a descargar [...]]]></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%3A%2F%2Fcasidiablo.net%2Fuso-basico-de-git%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Uso%20b%C3%A1sico%20de%20Git%22%20%7D);"></div>
<p style="text-align: justify;"><img style="float: right" title="git" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/09/git.png" alt="git" width="200" height="200" />Esta guía es la continuación de la anterior entrada, en donde explicaba cómo <a href="http://casidiablo.net/montar-servidor-git/">montar un servidor Git</a>. Ahora veremos las operaciones básicas sobre el repositorio (hacer un checkout, añadir o borrar objetos, commit, etc.). Del lado del cliente también debemos tener instalado git:</p>
<p>En <a href="http://casidiablo.net/category/debian/">Debian</a>:</p>
<div class="consola"># aptitude install git-core</div>
<p>En <a href="http://casidiablo.net/category/gentoo/">Gentoo</a>:</p>
<div class="consola"># emerge dev-util/git</div>
<p><span id="more-3355"></span></p>
<h3>Clonar el repositorio</h3>
<p style="text-align: justify;">Llamamos &#8220;clonar&#8221; a descargar los archivos fuentes de un repositorio git a un nuevo directorio. En este caso usaremos el método que usa SSH y el usuario que creamos en la <a href="http://casidiablo.net/montar-servidor-git/">entrada anterior</a>.</p>
<div class="consola">$ git clone usuariogit@192.168.0.5:/var/cache/git/proyecto.git proyecto<br />
$ cd proyecto</div>
<p style="text-align: justify;">Los archivos los añadimos normalmente, es decir, editándolos dentro del directorio del proyecto o copiándolos de otro lado. Por ejemplo:</p>
<div class="consola">$ touch README<br />
echo &#8216;Un readme&#8217; &gt; README<br />
cat &gt; hola.py &lt;&lt; EOF<br />
print &#8220;asi se edita un archivo&#8221;<br />
print &#8220;cuando tienes algo de&#8221;<br />
print &#8220;cojones jejejeje&#8221;<br />
EOF</div>
<h3>Añadir archivos al repositorio</h3>
<p style="text-align: justify;">Antes de comenzar a añadir cosas o realizar cambios debemos actualizar el repositorio con respecto al del servidor:</p>
<div class="consola">git pull</div>
<p style="text-align: justify;">Ahora añadiremos los archivos que hemos creado al repositorio:</p>
<div class="consola">git add README<br />
git add hola</div>
<p>o mejor aún:</p>
<div class="consola">git add *</div>
<h3>Subir cambios al servidor local</h3>
<p>Para subir los cambios hechos al servidor local (lease el comentario de <a href="http://casidiablo.net/uso-basico-de-git/#comment-7401">CaStarCo</a>):</p>
<div class="consola">git commit -a -m &#8220;Un mensaje en donde explicas los cambios que hiciste&#8221;</div>
<p>Para subir los cambios al repositorio debemos ejecutar este comando:</p>
<div class="consola">git push</div>
<h3>Ver cambios entre versiones</h3>
<p style="text-align: justify;">Para ver los cambios entre la versión que tenías antes de hacer un <code>git pull</code> y la actual, puedes ejecutar el comando:</p>
<div class="consola">git show</div>
<p style="text-align: justify;">O puedes ver todos los cambios que ha sufrido el proyecto usando:</p>
<div class="consola">git log -p</div>
<p>Puedes también consultar la <a href="http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html">guía oficial de Git</a> para cosas más avanzadas.</p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/git/" rel="tag nofollow">git</a>, <a href="http://casidiablo.net/tag/how-to/" rel="tag nofollow">how-to</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/tutorial/" rel="tag nofollow">tutorial</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/uso-basico-de-git/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Instalar/configurar un servidor Git + interfaz web</title>
		<link>http://casidiablo.net/montar-servidor-git/</link>
		<comments>http://casidiablo.net/montar-servidor-git/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 07:21:05 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[software libre]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[gentoo]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[instalación]]></category>
		<category><![CDATA[repositorio]]></category>
		<category><![CDATA[versiones]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3346</guid>
		<description><![CDATA[

¡Hola a todos! Ya que me encuentro haciendo un proyecto para la Universidad, he decidido esta vez probar Git y dejar a un lado mi querido Subversion. Git es básicamente un sistema de control de versiones, creado por Linus Torvalds, y es usado en proyectos grandes como el Kernel de Linux. Así que he preparado [...]]]></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%3A%2F%2Fcasidiablo.net%2Fmontar-servidor-git%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Instalar%2Fconfigurar%20un%20servidor%20Git%20%2B%20interfaz%20web%22%20%7D);"></div>
<p style="text-align: justify;"><img style="float: right" title="git" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/09/git.png" alt="git" width="200" height="200" />¡Hola a todos! Ya que me encuentro haciendo un proyecto para la Universidad, he decidido esta vez probar <a href="http://es.wikipedia.org/wiki/Git">Git</a> y dejar a un lado mi querido Subversion. Git es básicamente un sistema de control de versiones, creado por Linus Torvalds, y es usado en proyectos grandes como el <a href="http://casidiablo.net/trabajando-con-el-kernel-linux-i/">Kernel de Linux</a>. Así que he preparado una pequeña guía de instalación y configuración de Git, además de la interfaz web del mismo, lo cual nos permite ver los cambios del proyecto de una manera más amena.</p>
<p style="text-align: justify;">Para este mini proyecto he instalado el servidor en una máquina virtual corriendo Debian 5. El motivo de dejar mi Gentoo por un rato es porque ya es de madrugada y necesitaba que la instalación fuera más rápida; además no me gusta instalar cosas que más adelante no necesitaré: para eso está la virtualización. ¡Basta de rodeos, vamos al grano!</p>
<h3>Instalando los paquetes necesarios</h3>
<p>Instalaremos Apache2, la base de git y los módulos web de git (y el server de ssh para que los clientes se conecten):</p>
<div class="consola"># aptitude install apache2 git-core gitweb openssh-server</div>
<p style="text-align: justify;">Ahora creamos los directorios <code>/var/cache/git</code> (el repositorio git) y <code>/var/www/git</code> para el <code>gitweb.cgi</code>:</p>
<div class="consola"># mkdir /var/www/git<br />
# [ -d "/var/cache/git" ] || sudo mkdir /var/cache/git</div>
<p style="text-align: justify;">En nuestro ejemplo, el directorio raiz del apache es <code>/var/www</code>; ahora debemos crear un archivo de configuración de Apache para el git:</p>
<div class="consola"># nano /etc/apache2/conf.d/git</div>
<p>Ponemos lo siguiente adentro:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: bash;">&lt;Directory /var/www/git&gt;
   Allow from all
   AllowOverride all
   Order allow,deny
   Options ExecCGI
   &lt;Files gitweb.cgi&gt;
   SetHandler cgi-script
   &lt;/Files&gt;
&lt;/Directory&gt;
DirectoryIndex gitweb.cgi
SetEnv  GITWEB_CONFIG  /etc/gitweb.conf
</pre>
<p><!--INFOLINKS_ON--></p>
<p>Ahora movemos los archivos <code>gitweb.cgi</code>, <code>.png</code> y <code>.css</code> de git a <code>/var/www/git</code>:<span id="more-3346"></span></p>
<div class="consola"># mv -v /usr/share/gitweb/* /var/www/git<br />
# mv -v /usr/lib/cgi-bin/gitweb.cgi /var/www/git</div>
<p>Debemos ahora hacer un par de cambios en el archivo <code>/etc/gitweb.conf</code> debido a los archivos que movimos:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: bash;">$projectroot = '/var/cache/git/';
$git_temp = &quot;/tmp&quot;;
#$home_link = $my_uri || &quot;/&quot;;
$home_text = &quot;indextext.html&quot;;
$projects_list = $projectroot;
$stylesheet = &quot;/git/gitweb.css&quot;;
$logo = &quot;/git/git-logo.png&quot;;
$favicon = &quot;/git/git-favicon.png&quot;;</pre>
<p><!--INFOLINKS_ON--></p>
<p>Recargamos la configuración del apache:</p>
<div class="consola"># /etc/init.d/apache2 reload</div>
<h3>Iniciando un proyecto en Git</h3>
<p>Creamos la carpeta del proyecto&#8230;</p>
<div class="consola"># cd /var/cache/git/<br />
# mkdir proyecto.git<br />
# cd proyecto.git</div>
<p style="text-align: justify;">Iniciamos un repositorio para nuestro nuevo proyecto y lo configuramos de acuerdo a nuestras necesidades:</p>
<div class="consola"># git init<br />
# echo &#8220;Una breve descripcion del proyecto&#8221; &gt; .git/description<br />
# git config &#8211;global user.name &#8220;Tu nombre&#8221;<br />
# git config &#8211;global user.email &#8220;tu@correo.com&#8221;<br />
# git commit -a</div>
<p style="text-align: justify;">Para marcar un repositorio como exportado se usa el archivo <code>git-daemon-export-ok</code>:</p>
<div class="consola"># cd /var/cache/git/proyecto.git<br />
# touch .git/git-daemon-export-ok</div>
<p style="text-align: justify;">Para iniciar el servicio de Git que ejecuta un servidor para hacer público nuestro repositorio, ejecutamos el siguiente comando (no debe haber un slash después de la ruta del repositorio):</p>
<div class="consola"># git daemon &#8211;base-path=/var/cache/git &#8211;detach &#8211;syslog &#8211;export-all</div>
<p>Ahora el repositorio se encuentra corriendo en el puerto 9418 de nuestro computador. Por último, le daremos permisos de escritura a un usuario que no sea root, de tal manera que con dicho usuario se puedan hacer cambios remotos en el repositorio:</p>
<div class="consola"># adduser usuariogit<br />
# passwd usuariogit<br />
# chown -Rv usuariogit:usuariogit /var/cache/git/proyecto.git</div>
<h3>Acceder al repositorio</h3>
<p>Para descargar el repositorio de la manera convencional, basta con ejecutar el comando:</p>
<div class="consola">git clone git://servidor/proyecto.git proyecto</div>
<p style="text-align: justify;">O lo puedes acceder vía web; en mi caso el servidor está en la dirección 192.168.0.5, entonces basta con visitar http://192.168.0.5/git/:</p>
<p style="text-align: center;"><img class="size-full wp-image-3348 aligncenter" title="gitweb" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/09/gitweb.png" alt="gitweb" width="658" height="330" /></p>
<h3>Fuentes y enlaces interesantes</h3>
<ul>
<li><a href="http://git-scm.com/">Página oficial del proyecto</a></li>
<li><a href="http://www.howtoforge.com/how-to-install-a-public-git-repository-on-a-debian-server">Artículo guía de esta entrada</a></li>
<li><a href="http://pixhero.wordpress.com/2009/05/23/mini-guia-git-sistema-de-control-de-versiones/">Miniguia de Git</a></li>
</ul>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/control/" rel="tag nofollow">control</a>, <a href="http://casidiablo.net/tag/debian/" rel="tag nofollow">Debian</a>, <a href="http://casidiablo.net/tag/gentoo/" rel="tag nofollow">gentoo</a>, <a href="http://casidiablo.net/tag/git/" rel="tag nofollow">git</a>, <a href="http://casidiablo.net/tag/how-to/" rel="tag nofollow">how-to</a>, <a href="http://casidiablo.net/tag/instalacion/" rel="tag nofollow">instalación</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/repositorio/" rel="tag nofollow">repositorio</a>, <a href="http://casidiablo.net/tag/tutorial/" rel="tag nofollow">tutorial</a>, <a href="http://casidiablo.net/tag/versiones/" rel="tag nofollow">versiones</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/montar-servidor-git/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>A fondo: Tu primer módulo cargable para el Linux kernel</title>
		<link>http://casidiablo.net/tu-primer-modulo-cargable-kernel-explicacion/</link>
		<comments>http://casidiablo.net/tu-primer-modulo-cargable-kernel-explicacion/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 20:37:38 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3132</guid>
		<description><![CDATA[

Esta entrada pretende profundizar los temas aprendidos en el anterior artículo (Tu primer módulo cargable para el Linux kernel), con el fin de clarificar dudas, atar algunos cabos que dejamos sueltos y prepararnos para los siguientes artículos.
¿Puedo usar directamente el árbol del código fuente del kernel?
Sí, por supuesto. Como ya sabes, no es posible compilar [...]]]></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%3A%2F%2Fcasidiablo.net%2Ftu-primer-modulo-cargable-kernel-explicacion%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22A%20fondo%3A%20Tu%20primer%20m%C3%B3dulo%20cargable%20para%20el%20Linux%20kernel%22%20%7D);"></div>
<p style="text-align: justify;"><img style="float:right;" title="codigo c linux" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/06/codigo-c.png" alt="codigo c" width="150" height="158" />Esta entrada pretende profundizar los temas aprendidos en el anterior artículo (<a href="http://casidiablo.net/desarrollar-compilar-modulo-linux/">Tu primer módulo cargable para el Linux kernel</a>), con el fin de clarificar dudas, atar algunos cabos que dejamos sueltos y prepararnos para los siguientes artículos.</p>
<h3>¿Puedo usar directamente el árbol del código fuente del kernel?</h3>
<p style="text-align: justify;">Sí, por supuesto. Como ya sabes, <strong>no es posible compilar un módulo cargable sin al menos parte del código fuente del kernel</strong> &#8211; esto es, la parte que contiene la infraestructura de construcción general y los archivos de cabecera esenciales. Solo por recordar, un <a href="http://es.wikipedia.org/wiki/Header_file">archivo header</a> (con extensión .h), contiene, normalmente, una declaración directa de clases, subrutinas, variables, u otros identificadores; sin la definición de estas, no es posible compilar código que las use.</p>
<p style="text-align: justify;">En cualquier caso, es siempre útil tener una copia completa del código del kernel, y la manera más fácil de obtenerla es usando <code>git</code>:</p>
<div class="consola">$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git git-kernel</div>
<p style="text-align: justify;">Además que puedes actualizarlo fácilmente:</p>
<div class="consola">$ git pull</div>
<p style="text-align: justify;">Nótese que, al contrario de instalar el paquete oficial de desarrollo del kernel como hicimos en el anterior artículo, <strong>usando <code>git</code> no es necesario tener privilegios administrativos para poner todo el código en algún lugar de tu directorio <em>home</em></strong>. Además, si por alguna razón no puedes usarlo, puedes descargarte un archivo tar y funcionará igual; claro, usar <code>git</code> es mucho más cool <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_cool.gif' alt='8-)' class='wp-smiley' /> <span id="more-3132"></span></p>
<div class="nota">Nota: Seguiremos compilando nuestros módulos contra los archivos que nos proporciona el paquete de desarrollo del kernel; el que descargaste con el git es sólo para propósitos educativos, al menos por el momento. <a href="http://dockernel.casidiablo.net/">Documentación kernel Linux</a>.</div>
<h3>Urgando en el código fuente: examinando los archivos de cabecera (Header Files)</h3>
<p style="text-align: justify;">Recordemos que en el ejemplo del artículo anterior, nuestro código contiene referencias a archivos de cabecera del kernel:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: cpp;">#include &lt;linux/module.h&gt;      // para todos los módulos
#include &lt;linux/init.h&gt;        // para entrada y salida de macros
#include &lt;linux/kernel.h&gt;      // para los macros de prioridad de printk
#include &lt;asm/current.h&gt;       // procesar información, solo por diversión
#include &lt;linux/sched.h&gt;       // para usa la estructura task_struct</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Tales referencias son siempre relativas al nivel superior del directorio <code>include/</code> en el código fuente del kernel, así que un include de, <strong>por ejemplo, <code>&lt;linux/module.h&gt;</code>, se refiere al archivo de cabecera <code>include/linux/module.h</code></strong>, y así sucecivamente.</p>
<p style="text-align: justify;">Sin embargo, si miras un poco más de cerca, notarás que no hay un directorio <code>include/asm/</code>, lo cual es bastante fácil solucionar. Incluso si no planeas construir algo contra el código fuente que descargaste, deberías prepararlo de tal manera que refleje de una manera más precisa lo que piensas hacer con él:</p>
<div class="consola">$ make defconfig<br />
$ make modules_prepare</div>
<p style="text-align: justify;">Los comandos anteriores hacen bastantes cosas, aunque lo único que nos interesa en este momento es que crea algunos enlaces simbólicos en el directorio <code>include/</code>, que reflejan la arquitectura de nuestro sistema.</p>
<p style="text-align: justify;">Antes de ejecutar los comandos:</p>
<div class="consola">$ ls -ld include/asm*<br />
drwxrwxr-x. &#8230; include/asm-arm<br />
drwxrwxr-x. &#8230; include/asm-generic<br />
drwxrwxr-x. &#8230; include/asm-x86</div>
<p style="text-align: justify;">Después de ejecutarlos:</p>
<div class="consola">$ ls -ld include/asm*<br />
lrwxrwxrwx. &#8230; include/asm -&gt; asm-x86   &lt;&#8211; aja!<br />
drwxrwxr-x. &#8230; include/asm-arm<br />
drwxrwxr-x. &#8230; include/asm-generic<br />
drwxrwxr-x. &#8230; include/asm-x86</div>
<p style="text-align: justify;">Una vez que esto es hecho, los includes de preprocesador tendrán sentido, y podemos usar los nombres genéricos para referirnos al archivo de cabecera apropiado de ahora en adelante. Por supuesto, esto que hicimos no es necesario hacerlo con los paquetes oficiales de desarrollo del kernel, puesto que ya vienen preparados.</p>
<h3>¿Es posible generar mensajes de salida con un módulo?</h3>
<p style="text-align: justify;">No, no lo es. Bueno, no realmente. Como un autor de módulos novato, es necesario que entiendas que tu módulo será ejecutado en el <em>kernel space</em>, no en el <em>user space</em>, así que debes dejar de pensar en impresiones de mensajes en la consola. Olvídate de ello. <strong>La manera canónica de generar mensajes de depuración desde tu módulo es con llamadas <code>printk</code></strong>:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: cpp;">printk(KERN_INFO &quot;Hola, el modulo esta siendo cargado.\n&quot;);
printk(KERN_INFO &quot;El user space del proceso es '%s'\n&quot;, current-&gt;comm);
printk(KERN_INFO &quot;El PID es  %i\n&quot;, current-&gt;pid);  </pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Corriendo el riesgo de sobre-simplificar el asunto, la salida que genera <code>printk</code> acabará en el archivo <code>/var/log/messages</code> así que, si estás insertando y removiendo tu módulo, es útil tener una terminal aparte mostrando en tiempo real todo lo que sea escrito en dicho archivo (para lo cual necesitas privilegios administrativos):</p>
<div class="consola"># tail -f /var/log/messages</div>
<p style="text-align: justify;">Para los más ambiciosos, es útil fijarse en la definición de los niveles de log en el archivo de cabecera <code>&lt;linux/kernel.h&gt;</code>:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: cpp;">#define KERN_EMERG    &quot;&lt;0&gt;&quot;  /* system is unusable                 */
#define KERN_ALERT    &quot;&lt;1&gt;&quot;  /* action must be taken immediately   */
#define KERN_CRIT     &quot;&lt;2&gt;&quot;  /* critical conditions                */
#define KERN_ERR      &quot;&lt;3&gt;&quot;  /* error conditions                   */
#define KERN_WARNING  &quot;&lt;4&gt;&quot;  /* warning conditions                 */
#define KERN_NOTICE   &quot;&lt;5&gt;&quot;  /* normal but significant condition   */
#define KERN_INFO     &quot;&lt;6&gt;&quot;  /* informational                      */
#define KERN_DEBUG    &quot;&lt;7&gt;&quot;  /* debug-level messages               */</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Si algunos de ellos lucen vagamente familiares, no es de sorprenderse &#8211; son los niveles de depuración (debugging) soportados por <a href="http://es.wikipedia.org/wiki/Syslog#C.C3.B3digos_de_severidad">syslog</a>, así que eres libre de personalizar el syslog si quieres redireccionar la salida de tu módulo a donde quieras basado en los niveles de log, lo cual está más allá del objetivo de este artículo.</p>
<div class="nota">Nota: el más observador entre ustedes habrá notado que el nivel de log usado por <code>printk</code> es simplemente una cadena de texto como &#8220;&lt;0&gt;&#8221; y así sucesivamente, lo cual explica el porqué no usar comas al momento de usarlo &#8211; todo lo que el preprocesador está haciendo es concatenando dos cadenas de caracteres, así que hubiera sido totalmente equivalente escribir cualquiera de estos:</div>
<p><!--INFOLINKS_OFF-->
<pre class="brush: cpp;">printk(KERN_INFO &quot;Hola, el modulo esta siendo cargado.\n&quot;);
printk(&quot;&lt;6&gt;&quot; &quot;Hola, el modulo esta siendo cargado.\n&quot;);
printk(&quot;&lt;6&gt;Hola, el modulo esta siendo cargado.\n&quot;);</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Aun así, es mejor hacerlo como se muestra en la primera línea. Incluso programando cosas del kernel, la estética importa.</p>
<h3>Cargando tu módulo lleno de información</h3>
<p style="text-align: justify;">Como te diste cuenta la última vez, puedes cargar tu módulo con información bastante útil como:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: cpp;">MODULE_AUTHOR(&quot;Robert P. J. Day&quot;);
MODULE_AUTHOR(&quot;Cristian Castiblanco [solo lo puse en castellano]&quot;);
MODULE_LICENSE(&quot;Dual BSD/GPL&quot;);
MODULE_DESCRIPTION(&quot;Aqui puedes poner una descripcion de tu modulo&quot;);</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">que puede examinarse con el comando <code>modinfo</code>:</p>
<div class="consola">$ sudo modinfo hola.ko<br />
filename:       hola.ko<br />
description:    Aqui puedes poner una descripcion de tu modulo<br />
license:        Dual BSD/GPL<br />
author:         Cristian Castiblanco [solo lo puse en castellano <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  ]<br />
author:         Robert P. J. Day<br />
depends:<br />
vermagic:       2.6.29-gentoo-r5 SMP mod_unload CORE2</div>
<p style="text-align: justify;">Algunas cosas útiles acerca de esta característica:</p>
<ul>
<li style="text-align: justify;">El conjunto completo de estos macros está definido en el archivo de cabecera <code>&lt;linux/module.h&gt;</code>, en donde verás macros relacionados con firmware, tablas de dispositivos y más.</li>
<li style="text-align: justify;">Además de esos macros en específico, está el menos conocido macro genérico MODULE_INFO, el cual puedes usar dentro del módulo en el lugar que quieras. Curiosamente, muy pocos programadores toman ventaja de este.</li>
<li style="text-align: justify;">La única macro que realmente debes poner es la licencia. Si no especificas alguna de las variaciones de la licencia GPL, entonces el módulo &#8220;contaminará&#8221; el kernel, un tema que trataremos en otro artículo. El conjunto completo de licencias válidas está definido en el mismo archivo de cabecera.</li>
</ul>
<h3>Compilando contra el código fuente del kernel</h3>
<p style="text-align: justify;">Finalmente, podrías querer construir tu módulo, no contra el código instalado por el paquete de desarrollo, sino contra el código que descargaste tú mismo. Si ese es tu plan, es bastante simple.</p>
<p style="text-align: justify;">Primero, como decíamos arriba, necesitas preparar tu código fuente para construir el módulo:</p>
<div class="consola">$ make defconfig<br />
$ make modules_prepare</div>
<p style="text-align: justify;">Todo lo que falta es configurar el Makefile de tal manera que compile el módulo contra nuestro código fuente. Recordemos parte del archivo Makefile del artículo anterior:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: python;">ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Lo que hace la segunda línea es <strong>asignar la ubicación del código fuente del kernel a ser usado</strong>. Para cambiar esta variable, podemos asignarle el valor deseado con este comando:</p>
<div class="consola">$ export KERNELDIR=/home/gentoo/kernel/git-kernel</div>
<p style="text-align: justify;">y aquí es donde comienzas a notar algunas diferencias. Asumiendo que la versión del código que descargué es 2.6.31-rc1, esto es lo que sucede en mi sistema:</p>
<div class="consola">$ make<br />
make -C /usr/src/git-kernel M=/tmp/modulo   modules<br />
make[1]: se ingresa al directorio `/usr/src/git-kernel&#8217;</p>
<p>WARNING: Symbol version dump /usr/src/git-kernel/Module.symvers<br />
is missing; modules will have no dependencies and modversions.</p>
<p>Building with KERNELRELEASE = 2.6.31-rc1<br />
CC [M]  /tmp/modulo/hola.o<br />
Building modules, stage 2.<br />
Building with KERNELRELEASE = 2.6.31-rc1<br />
MODPOST 1 modules<br />
CC      /tmp/modulo/hola.mod.o<br />
LD [M]  /tmp/modulo/hola.ko<br />
make[1]: se sale del directorio `/usr/src/git-kernel&#8217;</p></div>
<p style="text-align: justify;">Puesto que estoy compilando contra un código fuente que no concuerda con el que estoy corriendo actualmente, pierdo la <a href="http://linux.about.com/cs/linux101/g/symboltable.htm">tabla de símbolos</a> actual, pero la compilación funciona.</p>
<p style="text-align: justify;">El comando <code>modinfo</code> también muestra el árbol contra el cual el módulo fue compilado:</p>
<div class="consola">$ sudo modinfo hola.ko<br />
filename:       hola.ko<br />
description:    Aqui puedes poner una descripcion de tu modulo<br />
license:        Dual BSD/GPL<br />
author:         Cristian Castiblanco [solo lo puse en castellano <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  ]<br />
author:         Robert P. J. Day<br />
depends:<br />
vermagic:       2.6.31-rc1 SMP mod_unload 686</div>
<p style="text-align: justify;">Ahora algunas preguntas capciosas &#8211; ¿es posible cargarlo? ¿no dará problemas por la versión? Eso depende de si el kernel que se está ejecutando fue configurado para permitir diferencias de versiones, y hay una manera rápida de comprobarlo. En mi Gentoo por ejemplo:</p>
<div class="consola"># insmod hi.ko<br />
insmod: error inserting &#8216;hi.ko&#8217;: -1 Invalid module format</div>
<p style="text-align: justify;">Mala suerte. Tal parece que el kernel no fue compilado con las opciones necesarias. Si miramos en el archivo <code>/var/log/messages</code>:</p>
<div class="consola">&#8230;<br />
[ 4908.680123] hola: version magic &#8216;2.6.31-rc1 SMP mod_unload 686 \<br />
&#8216; should be &#8216;2.6.29-gentoo-r5 SMP mod_unload CORE2 &#8216;&#8230;</div>
<p style="text-align: justify;">Por lo pronto entonces, de ahora en adelante, jugaremos un poco dentro de la seguridad que nos ofrece compilar contra el kernel que concuerda con la versión que corremos. No hay motivo para hacerlo más difícil de lo que debe ser. En el próximo artículo veremos algo acerca de las rutinas entry y exit.</p>
<div class="nota">Este artículo está basado en: <a href="http://www.linux.com/learn/careers-training/25078-the-kernel-newbie-corner-your-first-loadable-kernel-module-part-deux">The Kernel Newbie Corner: Your First Loadable Kernel Module, Part Deux</a> escrito por Rob Day. Todos los créditos son de él, yo simplemente estoy acercando dicho contenido a las personas de habla hispana.</div>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/how-to/" rel="tag nofollow">how-to</a>, <a href="http://casidiablo.net/tag/ide/" rel="tag nofollow">ide</a>, <a href="http://casidiablo.net/tag/kernel/" rel="tag nofollow">kernel</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag nofollow">programación</a>, <a href="http://casidiablo.net/tag/tutorial/" rel="tag nofollow">tutorial</a>, <a href="http://casidiablo.net/tag/wordpress/" rel="tag nofollow">wordpress</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/tu-primer-modulo-cargable-kernel-explicacion/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>[how-to] Tu primer módulo cargable para el Linux kernel</title>
		<link>http://casidiablo.net/desarrollar-compilar-modulo-linux/</link>
		<comments>http://casidiablo.net/desarrollar-compilar-modulo-linux/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 20:31:15 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[módulos]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3113</guid>
		<description><![CDATA[

Este how-to está basado en el artículo The Kernel Newbie Corner: Your First Loadable Kernel Module escrito por Rob Day en Linux.com. En él se enseñan las bases de la programación de módulos para el kernel de Linux. Este primer artículo pretende ilustrar de manera clara los conceptos básicos y espero que, a medida que [...]]]></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%3A%2F%2Fcasidiablo.net%2Fdesarrollar-compilar-modulo-linux%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22%5Bhow-to%5D%20Tu%20primer%20m%C3%B3dulo%20cargable%20para%20el%20Linux%20kernel%22%20%7D);"></div>
<p style="text-align: justify;"><img style="float:right;" title="codigo c linux" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/06/codigo-c.png" alt="codigo c" width="150" height="158" />Este how-to está basado en el artículo <a href="http://www.linux.com/news/software/linux-kernel/23685-the-kernel-newbie-corner-your-first-loadable-kernel-module">The Kernel Newbie Corner: Your First Loadable Kernel Module</a> escrito por <a href="http://www.linux.com/community/profile?userid=7433">Rob Day</a> en Linux.com. En él se enseñan las bases de la <strong>programación de módulos para el kernel de Linux</strong>. Este primer artículo pretende ilustrar de manera clara los conceptos básicos y espero que, a medida que Rob vaya escribiendo más artículos, pueda ir traduciéndolos para ofrecer este excelente contenido en español. Además, funciona para cualquier distro, aunque en este caso lo hice todo sobre Gentoo. Sin más, ¡vamos al grano!</p>
<h3>¿Es necesario tener privilegios de root?</h3>
<p style="text-align: justify;">Mientras desarrollamos el módulo, no. Pero al momento de cargar el módulo necesitaremos privilegios administrativos. Por supuesto, es recomendable que el desarrollo lo hagamos con un usuario normal, y solo al final usemos un <strong>usuario root para cargar o remover los módulos</strong>.</p>
<h3>Prerrequisitos</h3>
<p style="text-align: justify;">Antes de comenzar es necesario saber/tener algunas cosas:</p>
<ul style="text-align: justify;">
<li>La versión del kernel con la que vamos a trabajar (usualmente la que estamos corriendo). Esto lo hacemos con el comando <code>uname -r</code>:
<div class="consola">$ uname -r<br />
2.6.29-gentoo-r5</div>
</li>
<li>El uso de herramientas de desarrollo, como <code>gcc</code>, <code>binutils</code>, etc.</li>
<li>Tener instalados las utilidades para trabajar con módulos (<code>insmod</code>, <code>rmmod</code>, etc.), el cual se encuentra en el paquete <code>module-init-tools</code>.</li>
<li style="text-align: justify;">El código del kernel de Linux, de tal manera que puedas compilar tu módulo contra este.</li>
</ul>
<h3>¿Para qué el código del kernel?</h3>
<p style="text-align: justify;">Esto es realmente importante, así que echaremos un vistazo un poco más profundo. <strong>Cuando compilamos un módulo para Linux es necesario tener el código fuente de algunas partes del kernel</strong>, puesto que muchas instrucciones de preprocesador usadas no se encuentran en los <em>headers</em> estándar de desarrollo. En vez de ello, se encuentran en los headers de kernel.</p>
<p style="text-align: justify;">Podrías simplemente descargar el código del kernel directamente de la página oficial, aunque <strong>lo más sencillo es instalar el paquete que corresponda a la versión del kernel que estemos ejecutando</strong>. Por lo general, este tipo de paquetes instala el código en <code>/usr/src</code> o <code>/usr/src/kernels</code>. Por ejemplo, en Fedora el paquete que debes instalar se llama <code>kernel-dev</code>, mientras que en Gentoo es <code>gentoo-sources</code>.</p>
<p style="text-align: justify;">Una vez tengas el código instalado, es necesario saber exactamente en donde se encuentra, de tal manera que podamos referenciarlo al momento de compilar el módulo. Podrías revisar eso manualmente o, mejor aún, buscar el enlace simbólico hacia el kernel, que por lo general se encuentra en <code>/lib/modules</code>:</p>
<div class="consola" style="text-align: justify;">$ ls -l /lib/modules/`uname -r`<br />
total 104<br />
lrwxrwxrwx 1 root root    31 jun 11 10:24 build -&gt; /usr/src/linux-2.6.29-gentoo-r5<br />
&#8230;</div>
<p style="text-align: justify;">El enlace simbólico que buscamos es <code>build</code>, y como puedes ver en el ejemplo, apunta a la raíz del código del kernel. Esto significa que, cada vez que quieras hacer referencia al kernel en el momento de compilar el módulo, basta con usar dicho enlace.</p>
<h3 style="text-align: justify;">&#8220;Hola, kernel!&#8221;</h3>
<p style="text-align: justify;">Bien, es hora de crear nuestro primer módulo. Sin más rodeos, el código sería el siguiente:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: cpp;">/* El nombre del archivo es 'hola.c'. */
#include &lt;linux/module.h&gt;      // para todos los modulos
#include &lt;linux/init.h&gt;        // para las macros entry/exit
#include &lt;linux/kernel.h&gt;      // para usar la macro printk
#include &lt;asm/current.h&gt;       // informacion del proceso (solo por diversion)
#include &lt;linux/sched.h&gt;       // para usar la estructura &quot;task_struct&quot;
static int hola(void)
{
     printk(KERN_INFO &quot;Hola, el modulo esta siendo cargado.\n&quot;);
     printk(KERN_INFO &quot;El user space del proceso es '%s'\n&quot;, current-&gt;comm);
     printk(KERN_INFO &quot;El PID es  %i\n&quot;, current-&gt;pid);
     return 0;       // para indicar que todo ha salido bien
}
static void adios(void)
{
     printk(KERN_INFO &quot;Chao, el modulo esta siendo removido.\n&quot;);
}
module_init(hola);     // lo que se debe llamar al cargar un modulo
module_exit(adios);    // lo que se debe llamar al remover un modulo

MODULE_AUTHOR(&quot;Robert P. J. Day&quot;);
MODULE_AUTHOR(&quot;Cristian Castiblanco [solo lo puse en castellano]&quot;);
MODULE_LICENSE(&quot;Dual BSD/GPL&quot;);
MODULE_DESCRIPTION(&quot;Aqui puedes poner una descripcion de tu modulo&quot;);</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Algunas observaciones acerca del código de arriba:</p>
<ul style="text-align: justify;">
<li>Técnicamente, <strong>no es necesario imprimir cosas cada vez que se carga o remueve un módulo</strong> (con <code>printk</code>). Pero puesto que es nuestro primer módulo, y aún no hace nada especial, es más divertido si lo dejamos así.</li>
<li><strong>Es necesario hacer que la función de inicio retorne 0</strong>, si queremos indicar que la carga fue satisfactoria.</li>
<li>No, no es necesario poner una coma después de indicar el nivel de logs (<code>KERN_INFO</code>). Es un error común hacerlo.</li>
</ul>
<p style="text-align: justify;">Eso es todo&#8230; ¡vamos a compilarlo!</p>
<h3 style="text-align: justify;">El archivo Makefile</h3>
<p style="text-align: justify;">Este es el archivo Makefile que necesitaremos:</p>
<p style="text-align: justify;"><!--INFOLINKS_OFF-->
<pre class="brush: python;">ifeq ($(KERNELRELEASE),)  

KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)  

.PHONY: build clean

build:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules  

clean:
	rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c
else  

$(info Building with KERNELRELEASE = ${KERNELRELEASE})
obj-m :=    hola.o

endif</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Como has de saber, <strong>los archivos Makefile indican las reglas necesarias para compilar código</strong>. En este caso, explicándolo a groso modo, lo que hace el Makefile es detectar que aún nos encontramos en el directorio de desarrollo de nuestro módulo, y por lo tanto se dirige al directorio del kernel, compila el módulo desde ahí y se devuelve. Para probarlo basta con ejecutar el comando <code>make</code>:</p>
<div class="consola" style="text-align: justify;">$ make<br />
make -C /lib/modules/2.6.29-gentoo-r5/build  M=/tmp/hola   modules<br />
make[1]: se ingresa al directorio `/usr/src/linux-2.6.29-gentoo-r5&#8242;<br />
Building with KERNELRELEASE = 2.6.29-gentoo-r5<br />
CC [M]  /tmp/hola/hola.o<br />
Building modules, stage 2.<br />
Building with KERNELRELEASE = 2.6.29-gentoo-r5<br />
MODPOST 1 modules<br />
CC      /tmp/hola/hola.mod.o<br />
LD [M]  /tmp/hola/hola.ko<br />
make[1]: se sale del directorio `/usr/src/linux-2.6.29-gentoo-r5&#8242;</div>
<h3 style="text-align: justify;">Examinar el módulo</h3>
<p style="text-align: justify;">Una vez compiles el módulo <strong>obtendrás un archivo con extensión <code>.ko</code></strong>. Si quieres echarle un ojo a dicho archivo, puedes usar el comando <code>modinfo</code> así:</p>
<div class="consola" style="text-align: justify;">$ sudo modinfo hola.ko<br />
filename:       hola.ko<br />
description:    Aqui puedes poner una descripcion de tu modulo<br />
license:        Dual BSD/GPL<br />
author:         Cristian Castiblanco [solo lo puse en castellano <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  ]<br />
author:         Robert P. J. Day<br />
depends:<br />
vermagic:       2.6.29-gentoo-r5 SMP mod_unload CORE2</div>
<p style="text-align: justify;">En Gentoo es necesario ejecutarlo con privilegios; en otras distros puedes ejecutarlo normalmente.</p>
<h3 style="text-align: justify;">Cargar o remover el módulo</h3>
<p style="text-align: justify;">Llego la hora de cargar nuestro módulo. Para ello, como comenté anteriormente, es necesario poseer privilegios administrativos. Al grano:</p>
<div class="consola" style="text-align: justify;"># insmod hola.ko<br />
# lsmod<br />
Module                  Size  Used by<br />
hola                    1148  0   &lt;&#8211; GENIAL! Es nuestro módulo!<br />
vboxnetflt             69976  0<br />
vboxdrv                94368  1 vboxnetflt<br />
nvidia               9531788  40<br />
&#8230;<br />
$ sudo rmmod hola</div>
<p style="text-align: justify;">¿Y donde está lo que imprimimos con <code>printk</code>? Bien, no es común imprimir en consola cosas mientras un módulo es cargado o removido; en este caso, <strong>la salida va a dar al archivo de logs principal de Linux</strong> (<code>/var/log/messages</code>); puedes ver la salida con el comando <code>dmesg</code> o directamente en dicho archivo:</p>
<div class="consola" style="text-align: justify;"># dmesg | tail<br />
[20651.176989] Hola, el modulo esta siendo cargado.<br />
[20651.176993] El user space del proceso es &#8216;insmod&#8217;<br />
[20651.176997] El PID es  13786<br />
[20678.497134] Chao, el modulo esta siendo removido.<br />
# tail /var/log/messages</div>
<h3 style="text-align: justify;">Conclusión</h3>
<p style="text-align: justify;">Estas son apenas las bases que deberíamos tener para comenzar con la construcción de un módulo para el kernel de Linux. Es de valiosa ayuda jugar un poco con este ejemplo, de tal manera que podamos estar seguros que todo irá bien cuando hagamos algo un poco más complejo.</p>
<p><a class="tooltip descargacodigo" title="Descargar el código::Contiene: hola.c y Makefile" href="http://casidiablo.net/descargar/Codigo+Kernel+Modulo+Hola">Descargar código fuente del ejemplo</a></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/how-to/" rel="tag nofollow">how-to</a>, <a href="http://casidiablo.net/tag/kernel/" rel="tag nofollow">kernel</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/modulos/" rel="tag nofollow">módulos</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag nofollow">programación</a>, <a href="http://casidiablo.net/tag/tip/" rel="tag nofollow">tip</a>, <a href="http://casidiablo.net/tag/tutorial/" rel="tag nofollow">tutorial</a>, <a href="http://casidiablo.net/tag/wordpress/" rel="tag nofollow">wordpress</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/desarrollar-compilar-modulo-linux/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Mini guía PC-BSD &#8211; Configurando la red</title>
		<link>http://casidiablo.net/configuracion-network-pcbsd/</link>
		<comments>http://casidiablo.net/configuracion-network-pcbsd/#comments</comments>
		<pubDate>Mon, 30 Mar 2009 16:42:59 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[bsd]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[configuración]]></category>
		<category><![CDATA[pc-bsd]]></category>
		<category><![CDATA[red]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2989</guid>
		<description><![CDATA[

Continuando con la experiencia en PC-BSD, veremos cómo configurar la red. Los pasos son similares a como se haría en Linux, aun así, puesto que algún par de cosas cambian, he preferido dejarlo documentado.
Lo primero que deberíamos hacer es identificar el nombre que el sistema le ha dado a nuestras tarjetas, en mi caso la [...]]]></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%3A%2F%2Fcasidiablo.net%2Fconfiguracion-network-pcbsd%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Mini%20gu%C3%ADa%20PC-BSD%20-%20Configurando%20la%20red%22%20%7D);"></div>
<p style="text-align: justify;">Continuando con la experiencia en PC-BSD, veremos cómo configurar la red. Los pasos son similares a como se haría en Linux, aun así, puesto que algún par de cosas cambian, he preferido dejarlo documentado.</p>
<p style="text-align: justify;">Lo primero que deberíamos hacer es identificar el nombre que el sistema le ha dado a nuestras tarjetas, en mi caso la tarjeta es <code>le0</code> (que es el equivalente al típico <code>eth0</code> en Linux). Para hacerlo basta con ejecutar desde una consola el comando <code>ifconfig</code>.</p>
<h3>Configuración manual de la red</h3>
<p style="text-align: justify;">Para configurar manualmente nuestra red podemos ejecutar los siguientes comandos:</p>
<div class="consola"># ifconfig le0 inet 192.168.16.88 netmask 255.255.255.0 up<br />
# route add default 192.168.16.2<br />
# netstat -r</div>
<p><strong>Explicación</strong></p>
<ul style="text-align: justify;">
<li>En el primero comando usamos <code>ifconfig</code> para configurar la interfaz de red <code>le0</code>, con la dirección IP 192.168.16.8 y la máscara de red 255.255.255.0. La opción up activa la interfaz de red.</li>
<li>Posteriormente usamos el comando <code>route</code> para añadir el gateway por defecto de la red.</li>
<li>El comando <code>netstat -r</code> nos permite verificar que el gateway fue añadido correctamente. Interesante tener en cuenta que, a diferencia de Linux, para mirar las tablas de enrutamiento no se usa <code>route -n</code> sino <code>netstat -r</code></li>
</ul>
<h3>Configurar la interfaz de red con DHCP</h3>
<p style="text-align: justify;">Esta es la opción más sencilla y la que recomiendo. Si tienes un servidor DHCP en la red, lo mejor será configurar nuestra interfaz de red para que solicite una IP automáticamente. Para ello basta con abrir el archivo <code>/etc/rc.conf</code> y modificar nuestra interfaz de red de tal manera que quede así:</p>
<div class="consola">ifconfig_le0=&#8221;DHCP&#8221;</div>
<div class="nota" style="text-align: justify;"><strong>Nota</strong>: ten en cuenta que en mi caso la interfaz de red se llama <code>le0</code>, pero en tu caso puede ser distinto. Así que debes asegurarte que la línea que modifiques corresponda a tu tarjeta de red.</div>
<p style="text-align: justify;">Además, si estás usando otro cliente DHCP diferente del que trae por defecto el sistema, o quieres ejecutarlo con alguna opción en especial, debes modificar estas variables:</p>
<div class="consola">dhclient_program=&#8221;/sbin/dhclient&#8221;<br />
dhclient_flags=&#8221;"</div>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/bsd/" rel="tag nofollow">bsd</a>, <a href="http://casidiablo.net/tag/configuracion/" rel="tag nofollow">configuración</a>, <a href="http://casidiablo.net/tag/pc-bsd/" rel="tag nofollow">pc-bsd</a>, <a href="http://casidiablo.net/tag/red/" rel="tag nofollow">red</a>, <a href="http://casidiablo.net/tag/tutorial/" rel="tag nofollow">tutorial</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/configuracion-network-pcbsd/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Mini guía PC-BSD &#8211; Instalando PC-BSD</title>
		<link>http://casidiablo.net/instalacion-pcbsb/</link>
		<comments>http://casidiablo.net/instalacion-pcbsb/#comments</comments>
		<pubDate>Sat, 28 Mar 2009 19:29:16 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[bsd]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[instalación]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[pc-bsd]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2944</guid>
		<description><![CDATA[

Hace rato quería probar algún sistema BSD, y al final me he decidido por PC-BSD por su amabilidad con el usuario novel. A veces, al hablar de BSD, lo primero que se piensa es en un servidor o algo así, pero gracias a proyectos como PC-BSD podemos tener un BSD como sistema de escritorio, y [...]]]></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%3A%2F%2Fcasidiablo.net%2Finstalacion-pcbsb%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Mini%20gu%C3%ADa%20PC-BSD%20-%20Instalando%20PC-BSD%22%20%7D);"></div>
<p style="text-align: justify;"><img style="float:left;" title="pcbsd-large-noreflection" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd-large-noreflection.png" alt="pcbsd-large-noreflection" width="300" height="62" />Hace rato quería probar algún sistema BSD, y al final me he decidido por PC-BSD por su amabilidad con el usuario novel. A veces, al hablar de BSD, lo primero que se piensa es en un servidor o algo así, pero gracias a proyectos como PC-BSD podemos tener un BSD como sistema de escritorio, y con ello, disfrutar la estabilidad y seguridad que nos ofrece (sí, mucho más estable y seguro que Linux).</p>
<h3>¿Qué es PC-BSD?</h3>
<p style="text-align: justify;"><a href="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pc-bsd-kde.jpg" class="smoothbox tooltip" title="PC-BSD Fibonacci con KDE 4"><img title="pc-bsd-kde" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pc-bsd-kde-300x239.jpg" alt="pc-bsd-kde" width="300" height="239" style="float:right;" /></a>PC-BSD es un sistema operativo basado en FreeBSD. Puesto que bajo PC-BSD se encuentra un sistema FreeBSD, cuentas con todas las ventajas de velocidad y seguridad que éste proporciona. Es importante tener en cuenta que PC-BSD NO es una distribución de Linux. Ambos están basados en UNIX, pero PC-BSD está basado en FreeBSD y no en Linux.</p>
<p style="text-align: justify;">Existen algunas diferencias entre PC-BSD y FreeBSD. PC-BSD está pensado ser usado como sistema de escritorio, mientras que FreeBSD fue concebido sobre todo para usarse como servidor. Además PC-BSD ofrece un instalador gráfico y el escritorio KDE, tiene un gran número de aplicaciones de escritorio pre-instaladas y, aunque soporta el sistema de ports de FreeBSD, proporciona un <a href="http://pbidir.com/">método de instalación sencillo de paquetes precompilados</a>.</p>
<p style="text-align: justify;">Además, el kernel de PC-BSD ha sido recompilado con algunas modificaciones de tal manera que tenga un mejor comportamiento como sistema de escritorio. E incluso incluye los drivers para las tarjetas aceleradoras de video NVIDIA.</p>
<p style="text-align: justify;"><span id="more-2944"></span></p>
<h3>Instalación</h3>
<p style="text-align: justify;">Lo primero es ir a la <a href="http://www.pcbsd.org/content/view/21/11/">página de descargas</a> y bajar la ISO que deseemos. Las ISOs más importantes son:</p>
<h3>PC-BSD 32Bit (i386)</h3>
<ul>
<li><a href="http://www.pcbsd.org/content/view/21/11/#CD1">PC-BSD CD #1 32bit (i386) &#8211; System install CD1</a></li>
<li><a href="http://www.pcbsd.org/content/view/21/11/#CD2">PC-BSD CD #2 32bit (i386) &#8211; System Install CD2<br />
</a></li>
<li><a href="http://www.pcbsd.org/content/view/21/11/#CD3">PC-BSD CD #3 32bit (i386) &#8211; Multi-language support + Optional Components</a></li>
<li><a href="http://www.pcbsd.org/content/view/21/11/#DVD">PC-BSD DVD 32bit (i386) &#8211; Complete install + Optional Components</a></li>
</ul>
<h3>PC-BSD 64Bit (amd64)</h3>
<ul>
<li><a href="http://www.pcbsd.org/content/view/21/11/#CD1-64">PC-BSD CD #1 64bit (amd64) &#8211; System install CD1</a></li>
<li><a href="http://www.pcbsd.org/content/view/21/11/#CD2-64">PC-BSD CD #2 64bit (amd64) &#8211; System Install CD2<br />
</a></li>
<li><a href="http://www.pcbsd.org/content/view/21/11/#CD3-64">PC-BSD CD #3 64bit (amd64) &#8211; Multi-language support + Optional Components</a></li>
<li><a href="http://www.pcbsd.org/content/view/21/11/#DVD-64">PC-BSD DVD 64bit (amd64) &#8211; Complete install + Optional Components</a></li>
</ul>
<p style="text-align: justify;">Una vez hayamos descargado la imagen y la hayamos quemado en un CD, es hora de insertarlo en el PC y bootear desde él. Esto cargará el instalador de  PC-BSD, siendo la primera opción la selección de nuestro idioma, la distribución del teclado y la zona horaria:</p>
<p style="text-align: center;"><a class="tooltip smoothbox" title="Seleccionando el idioma" href="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd1.png"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd1.png" alt="pcbsd1" width="600" /></a></p>
<p style="text-align: justify;">Aceptamos los términos de la licencia:</p>
<p style="text-align: center;"><a class="tooltip smoothbox" title="Aceptando la licencia" href="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd2.png"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd2.png" alt="pcbsd" width="600" /></a></p>
<p style="text-align: justify;">En el siguiente paso decidimos si vamos a realizar una instalación nueva, el tipo de sistema a instalar (Desktop o Server), así como la fuente de los paquetes a instalar. Yo escogí Desktop por supuesto:</p>
<p style="text-align: center;"><a class="tooltip smoothbox" title="Seleccionando tipo de instalación" href="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd3.png"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd3.png" alt="pcbsd" width="600" /></a></p>
<p style="text-align: justify;">Luego ponemos el password que le daremos al usuario root, y creamos un usuario con privilegios que será nuestro usuario. Es recomendable que, si eres usuario de Linux, selecciones bash como la shell por defecto del usuario:</p>
<p style="text-align: center;"><a class="tooltip smoothbox" title="Configurando usuarios" href="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd4.png"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd4.png" alt="pcbsd" width="600" /></a></p>
<p style="text-align: justify;">Seleccionamos el disco sobre el cual haremos la instalación. En este caso, para propósitos de documentación lo instalé en una máquina virtual, por lo que uso todo el disco. En tu caso podrías usar el asistente de partición:</p>
<p style="text-align: center;"><a class="tooltip smoothbox" title="Particionamiento" href="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd5.png"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd5.png" alt="pcbsd" width="600" /></a></p>
<p style="text-align: justify;">Es hora de escoger el software adicional que queremos instalar, teniendo en cuenta que el sistema de escritorio es KDE:</p>
<p style="text-align: center;"><a class="tooltip smoothbox" title="Seleccionando el software adicional a instalar" href="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd6.png"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd6.png" alt="pcbsd" width="600" /></a></p>
<p style="text-align: justify;">En este punto ya hemos configurado todo lo necesario para dar inicio a la instalación; clic en <em>Next</em>:</p>
<p style="text-align: center;"><a class="tooltip smoothbox" title="Seleccionando el idioma" href="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd7.png"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd7.png" alt="pcbsd" width="600" /></a></p>
<p style="text-align: justify;">El progreso de la instalación&#8230;</p>
<p style="text-align: center;"><a class="tooltip smoothbox" title="El progreso de la instalación..." href="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd10.png"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd10.png" alt="pcbsd" width="600" /></a></p>
<p style="text-align: justify;">¡Y eso es todo! Damos clic en Reboot, removemos el CD de instalación y ya tenemos un BSD instalado.</p>
<p style="text-align: center;"><a class="tooltip smoothbox" title="Fin" href="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd12.png"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd12.png" alt="pcbsd" width="600" /></a></p>
<p style="text-align: justify;">Una vez hemos iniciado nuestro PC-BSD configuramos la resolución de la pantalla&#8230;</p>
<p style="text-align: center;"><a class="tooltip smoothbox" title="Configurando resolución" href="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd13.png"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd13.png" alt="pcbsd" width="600" /></a></p>
<p style="text-align: justify;">Iniciamos sesión desde el KDM:</p>
<p style="text-align: center;"><a class="tooltip smoothbox" title="Inicio de sesión" href="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd14.png"><img src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd14.png" alt="pcbsd" width="600" /></a><br />
<a class="tooltip smoothbox" title="Inicio de sesión" href="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd1.png"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/03/pcbsd1.png" alt="pcbsd1" width="600" /></a></p>
<h3>Enlaces interesantes&#8230;</h3>
<ul>
<li>Página oficial del proyecto PC-BSD: <a href="http://pcbsd.org/">http://pcbsd.org/</a></li>
<li>Foros de ayuda: <a href="http://forums.pcbsd.org/">http://forums.pcbsd.org/</a></li>
<li><a href="http://www.pcbsd.org/content/view/21/11/">Descarga PC-BSD</a></li>
</ul>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/bsd/" rel="tag nofollow">bsd</a>, <a href="http://casidiablo.net/tag/instalacion/" rel="tag nofollow">instalación</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/pc-bsd/" rel="tag nofollow">pc-bsd</a>, <a href="http://casidiablo.net/tag/tip/" rel="tag nofollow">tip</a>, <a href="http://casidiablo.net/tag/tutorial/" rel="tag nofollow">tutorial</a>, <a href="http://casidiablo.net/tag/wordpress/" rel="tag nofollow">wordpress</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/instalacion-pcbsb/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Instalación y configuración de Slim, administrador de inicio de sesión</title>
		<link>http://casidiablo.net/instalar-configurar-slim/</link>
		<comments>http://casidiablo.net/instalar-configurar-slim/#comments</comments>
		<pubDate>Mon, 02 Mar 2009 23:52:33 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[Arch Linux]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[gentoo]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[opensuse]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[arch]]></category>
		<category><![CDATA[slim]]></category>
		<category><![CDATA[tip]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2914</guid>
		<description><![CDATA[

Slim es un gestor de inicio de sesión para X11 bastante liviano y sencillo; es el reemplazo perfecto para el GDM o el KDM si usas máquinas no tan nuevas, o si simplemente quieres agilizar el proceso de inicio de tu PC. Yo lo uso sobre todo en máquinas con XFCE, lo cual hace todo [...]]]></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%3A%2F%2Fcasidiablo.net%2Finstalar-configurar-slim%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Instalaci%C3%B3n%20y%20configuraci%C3%B3n%20de%20Slim%2C%20administrador%20de%20inicio%20de%20sesi%C3%B3n%22%20%7D);"></div>
<p style="text-align: justify;"><a href="http://slim.berlios.de/">Slim</a> es un gestor de inicio de sesión para X11 bastante liviano y sencillo; es el reemplazo perfecto para el GDM o el KDM si usas máquinas no tan nuevas, o si simplemente quieres agilizar el proceso de inicio de tu PC. Yo lo uso sobre todo en máquinas con XFCE, lo cual hace todo bastante ligero y rápido.</p>
<h3>Instalación</h3>
<p style="text-align: justify;">Para instalarlo debes ejecutar el siguiente comando:</p>
<p>En <a href="http://casidiablo.net/category/linux/ubuntu/">Ubuntu</a>/<a href="http://casidiablo.net/category/debian/">Debian</a>:</p>
<div class="consola">$ sudo aptitude install slim</div>
<p>En <a href="http://casidiablo.net/category/gentoo/">Gentoo</a>:</p>
<div class="consola"># emerge slim</div>
<p>En <a href="http://casidiablo.net/category/arch-linux/">Arch</a>:</p>
<div class="consola"># pacman -S slim</div>
<p>En <a href="../../category/fedora">Fedora</a>:</p>
<div class="consola">$ sudo yum install slim</div>
<p style="text-align: justify;">Una vez instalado, procedemos a la configuración.<span id="more-2914"></span></p>
<h3>Configuración en Gentoo</h3>
<p style="text-align: justify;">Lo pongo solo en Gentoo porque fue la primer distribución en la que hice esto, y además otras distros lo configuran automáticamente una vez instalado. Lo primer es hacer que el XDM inicie en el runlevel por defecto:</p>
<div class="consola"># rc-update add xdm default</div>
<p style="text-align: justify;">Luego, debemos configurarlo para que ejecute slim. Para ello debes modificar la variable <code>DISPLAYMANAGER</code> en el archivo <code>/etc/conf.d/xdm</code>:</p>
<p><code>...<br />
DISPLAYMANAGER="slim"<br />
...</code></p>
<p style="text-align: justify;">Ahora, debemos configurar las sesiones con las que se puede iniciar sesión con <em>Slim</em>. Esto se hace editando el archivo <code>/etc/slim.conf</code> y configurando la variable <em>session</em> de acuerdo a nuestras necesidades (Gnome, XFCE, KDE, etc.). En mi caso está así:</p>
<p><code># Available sessions (first one is the default).<br />
# The current chosen session name is replaced in the login_cmd<br />
# above, so your login command can handle different sessions.<br />
# see the xinitrc.sample file shipped with slim sources<br />
sessions            xfce4,Gnome</code></p>
<p style="text-align: justify;">Cuando estés enfrente de la pantalla de inicio de sesión, basta con presionar F1 para rotar entre las sesiones que tengas configuradas. Si no lo haces, Slim iniciará la sesión por defecto (en el caso de la configuración de arriba, iniciará XFCE).</p>
<p style="text-align: justify;">Algo recomendable es cambiar la manera en que Slim inicia sesión, y crear un script personalizado para cada usuario (si hay más de uno). Los pasos en mi caso fueron: crear un archivo llamado .xinitrc en mi directorio personal con el siguiente contenido:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: python;">#!/bin/bash
DEFAULTSESSION=startxfce4
case &quot;$1&quot; in
	&quot;Gnome&quot;)
		exec gnome-session
		;;
	&quot;xfce4&quot;)
		exec startxfce4
		;;
	*)
		exec $DEFAULTSESSION
		;;
esac</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Luego modifiqué la variable login_cmd poniéndola de esta manera:</p>
<p><code>login_cmd           exec /bin/sh - ~/.xinitrc %session</code></p>
<h3>Instalación de Themes</h3>
<p style="text-align: justify;">Si quieres cambiar la apariencia, puedes descargar alguno de los <a href="http://slim.berlios.de/themes01.php">Themes disponibles para Slim</a> y descomprimirlo en la carpeta <code>/usr/share/slim/themes</code>:</p>
<div class="consola"># tar zvxf theme.tar.gz<br />
# cp -rv theme /usr/share/slim/themes</div>
<p style="text-align: justify;">Y luego modificas la variable <code>current_theme</code> del archivo <code>/etc/slim.conf</code>, por ejemplo:</p>
<p><code>current_theme       xfce-g-box</code></p>
<p style="text-align: justify;">Puedes también poner varios temas separados por coma lo cual hará que los cargue de manera aleatoria. Podrías también leer la documentación acerca de <a href="http://slim.berlios.de/themes_howto.php">cómo crear un nuevo theme</a>, es bastante fácil.</p>
<h3>Troubleshooting</h3>
<p style="text-align: justify;">Si al presionar F1 en el momento en el que te estás logueando no aparecen los nombres de las sesiones, y en vez de ello aparece una línea extraña como de bash, elimina o comenta estas líneas en el archivo <code>/etc/slim.conf</code>:</p>
<p><code># Needed so your login will show up in wtmp and utmp, etc<br />
#sessionstart_cmd        /usr/bin/sessreg -a -l :0.0 %user<br />
#sessionstop_cmd         /usr/bin/sessreg -d -l :0.0 %user</code></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/arch/" rel="tag nofollow">arch</a>, <a href="http://casidiablo.net/tag/gentoo/" rel="tag nofollow">gentoo</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/slim/" rel="tag nofollow">slim</a>, <a href="http://casidiablo.net/tag/tip/" rel="tag nofollow">tip</a>, <a href="http://casidiablo.net/tag/tutorial/" rel="tag nofollow">tutorial</a>, <a href="http://casidiablo.net/tag/ubuntu/" rel="tag nofollow">ubuntu</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/instalar-configurar-slim/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Video tutorial Java #3 &#8211; Uso de variables primitivas y clases envolturas</title>
		<link>http://casidiablo.net/videotutorial-java-variables-primitivas/</link>
		<comments>http://casidiablo.net/videotutorial-java-variables-primitivas/#comments</comments>
		<pubDate>Tue, 03 Feb 2009 12:31:49 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[video tutoriales]]></category>
		<category><![CDATA[primitivas]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[variables]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2833</guid>
		<description><![CDATA[

De nuevo algo de inconvenientes con el audio; espero mejorar cada vez más.
Video en Vimeo

Descargar video
Video en Blip.tv

Video en Youtube

Información complementaria: Tamaños de las variables de tipo primitivo

char: 16 bits; &#8216;\u0000&#8242; hasta &#8216;\uFFFF&#8217; (Conjunto de caractéres Unicode de ISO) o 0 hasta 65535 (ASCII)
byte: 8 bits; -128 hasta +127 (-27 hasta 27-1)
short: 16 bits, -32768 [...]]]></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%3A%2F%2Fcasidiablo.net%2Fvideotutorial-java-variables-primitivas%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Video%20tutorial%20Java%20%233%20-%20Uso%20de%20variables%20primitivas%20y%20clases%20envolturas%22%20%7D);"></div>
<p>De nuevo algo de inconvenientes con el audio; espero mejorar cada vez más.</p>
<h3>Video en Vimeo</h3>
<p><object width="640" height="401" data="http://vimeo.com/moogaloop.swf?clip_id=3053401&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1" type="application/x-shockwave-flash"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=3053401&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1" /></object><br />
<a class="tooltip download" title="Requiere registro en Vimeo" href="http://casidiablo.net/descargar/Video+Java+3">Descargar video</a></p>
<h3>Video en Blip.tv</h3>
<p><object width="640" height="430" data="http://blip.tv/play/AeqIPQA" type="application/x-shockwave-flash"><param name="src" value="http://blip.tv/play/AeqIPQA" /><param name="allowfullscreen" value="true" /></object></p>
<h3>Video en Youtube</h3>
<p><object width="425" height="344" data="http://www.youtube.com/v/g-n-FhVoeuo&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/g-n-FhVoeuo&amp;hl=en&amp;fs=1" /><param name="allowfullscreen" value="true" /></object></p>
<h3>Información complementaria: Tamaños de las variables de tipo primitivo</h3>
<ul>
<li><strong>char</strong>: 16 bits; &#8216;\u0000&#8242; hasta &#8216;\uFFFF&#8217; (Conjunto de caractéres Unicode de ISO) o 0 hasta 65535 (ASCII)</li>
<li><strong>byte</strong>: 8 bits; -128 hasta +127 (-27 hasta 27-1)</li>
<li><strong>short</strong>: 16 bits, -32768 hasta  32767 (-215 hasta 215-1)</li>
<li><strong>int</strong>: 32 bits; -2147483648 hasta +2147483647 (-231 hasta 231-1)</li>
<li><strong>long</strong>: 64 bits; -9223372036854775808 hasta +9223372036854775807 (-263 hasta 263-1)</li>
<li><strong>float</strong>: 32 bits; <em>rango negativo</em> -3.4028234663852886E+38 hasta -1.40129846432481707e-45, <em>rango positivo </em>1.40129846432481707e-45 hasta 3.4028234663852886E+38</li>
<li><strong>Double</strong>: 64 bits; <em>rango negativo</em> -1.7976931348623157E+308 hasta – 4.94065645841246544e-324, <em>rango positivo </em>4.94065645841246544e-324 hasta 1.7976931348623157E+308</li>
</ul>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/java/" rel="tag nofollow">java</a>, <a href="http://casidiablo.net/tag/primitivas/" rel="tag nofollow">primitivas</a>, <a href="http://casidiablo.net/tag/tutorial/" rel="tag nofollow">tutorial</a>, <a href="http://casidiablo.net/tag/variables/" rel="tag nofollow">variables</a>, <a href="http://casidiablo.net/tag/video/" rel="tag nofollow">video</a>, <a href="http://casidiablo.net/tag/video-tutoriales/" rel="tag nofollow">video tutoriales</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/videotutorial-java-variables-primitivas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
