<?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>Blog de Jorge Machín &#187; Fedora</title>
	<atom:link href="http://www.machin.com.mx/archives/category/linux/fedora/feed" rel="self" type="application/rss+xml" />
	<link>http://www.machin.com.mx</link>
	<description>Sólo para recordar</description>
	<lastBuildDate>Mon, 06 Sep 2010 07:34:18 +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>Conexión remota a un escritorio Linux desde una máquina XP</title>
		<link>http://www.machin.com.mx/archives/4379</link>
		<comments>http://www.machin.com.mx/archives/4379#comments</comments>
		<pubDate>Thu, 18 Mar 2010 12:56:30 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[3D]]></category>
		<category><![CDATA[Adobe Flash]]></category>
		<category><![CDATA[Arqueología Machinesca]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/archives/4379</guid>
		<description><![CDATA[<p>Revisando memory-sticks abandonados encontré un video de noviembre de 2006 donde grababa una prueba de como me conectaba desde mi máquina <strong>XP</strong> a mi servidor <strong>Linux</strong> con <strong>KDE</strong> y <strong>Fedora Core 6</strong>. Se puede ver como corría al mismo tiempo un video, un chat 3D escrito en <strong>Flash</strong> y un programa de demostración 3D de <strong>Irrlicht</strong> (<strong>OpenGL</strong>). Desafortunadamente es una de mis primeras pruebas y no transmitía el audio. Al poco rato de hacer este video configuré lo que me hacía falta.</p>
<p align="center">
<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/ZVp2qGofQXk&#038;hl=es_MX&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/ZVp2qGofQXk&#038;hl=es_MX&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object>
</p>
<p>Realmente el desempeño es muy bueno considerando que es una conexión remota. En parte es porque las ordenes <strong>OpenGL</strong> se corren localmente como se puede ver en el acercamiento a la terminal en la parte final del video.</p>

]]></description>
			<content:encoded><![CDATA[<p>Revisando memory-sticks abandonados encontré un video de noviembre de 2006 donde grababa una prueba de como me conectaba desde mi máquina <strong>XP</strong> a mi servidor <strong>Linux</strong> con <strong>KDE</strong> y <strong>Fedora Core 6</strong>. Se puede ver como corría al mismo tiempo un video, un chat 3D escrito en <strong>Flash</strong> y un programa de demostración 3D de <strong>Irrlicht</strong> (<strong>OpenGL</strong>). Desafortunadamente es una de mis primeras pruebas y no transmitía el audio. Al poco rato de hacer este video configuré lo que me hacía falta.</p>
<p align="center">
<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/ZVp2qGofQXk&#038;hl=es_MX&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/ZVp2qGofQXk&#038;hl=es_MX&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object>
</p>
<p>Realmente el desempeño es muy bueno considerando que es una conexión remota. En parte es porque las ordenes <strong>OpenGL</strong> se corren localmente como se puede ver en el acercamiento a la terminal en la parte final del video.</p>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/4379/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>POP before SMTP con Sendmail y Qpopper</title>
		<link>http://www.machin.com.mx/archives/873</link>
		<comments>http://www.machin.com.mx/archives/873#comments</comments>
		<pubDate>Mon, 27 Oct 2008 03:51:20 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[Fedora]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[poprelay]]></category>
		<category><![CDATA[qpopper]]></category>
		<category><![CDATA[sendmail]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/?p=873</guid>
		<description><![CDATA[<p>Ls solución de POP before SMTP  que utilizaba en mis años mozos en <strong>Interalia</strong> estaba basada en<strong>poprelay</strong>,  <strong>qpopper</strong> como servidor pop y <strong>sendmail</strong> como mi servidor SMTP. </p>
<p>Aunque es cierto que la utilizaba hace mucho tiempo (2001?) y actualmente hay muchas otras opciones, se puede comprobar que sigue siendo una opción válida y efectiva.</p>
<h4>Instalación de qpopper</h4>
<p>Los fuentes se compilan de la siguiente forma:</p>
<div class="syntax_hilite">
<div id="text-1">
<div class="text">./configure --enable-specialauth<br />
make<br />
cp popper/popper /usr/local/bin</div>
</div>
</div>
<p></p>
<p>Finalmente declaramos el servicio en xinetd, creando el archivo /etc/xinetd.d/qpopper :</p>
<div class="syntax_hilite">
<div id="text-2">
<div class="text">service pop3<br />
<span style="">&#123;</span> <br />
socket_type = stream<br />
protocol = tcp<br />
wait = no<br />
user = root<br />
server = /usr/local/bin/popper<br />
server_args = qpopper –s<br />
port = <span style="">110</span><br />
<span style="">&#125;</span></div>
</div>
</div>
<p></p>
<p>Y reiniciamos xinetd:</p>
<div class="syntax_hilite">
<div id="text-3">
<div class="text">/etc/rc.d/init.d/xinetd restart</div>
</div>
</div>
<p></p>
<h4>Poprelay</h4>
<p>El código fuente de <strong>Poprelay</strong> se pueden encontrar en <a href="http://poprelay.sourceforge.net/" onclick="pageTracker._trackPageview('/outgoing/poprelay.sourceforge.net/?referer=');">Sourceforge</a>. </p>
<p>Una vez instalado, para hacerlo funcionar con <strong>sendmail</strong>, se debe integrar el siguiente código al archivo de configuración <strong>/etc/sendmail.mc</strong>:</p>
<div class="syntax_hilite">
<div id="text-4">
<div class="text"># We probably want the access_db feature enabled.</p>
<p>FEATURE<span style="">&#40;</span>access_db<span style="">&#41;</span>dnl</p>
<p># List of IP addresses we allow relaying from.</p>
<p>Klocalip hash -a&lt;MATCH&gt; /etc/mail/localip<br />
Kpopip hash&nbsp; -a&lt;MATCH&gt; /etc/mail/popip</p>
<p>LOCAL_RULESETS</p>
<p>SLocal_check_rcpt</p>
<p># Put the address into cannonical form <span style="">&#40;</span>even if it doesn't resolve to an MX<span style="">&#41;</span>.</p>
<p>R$*&nbsp;&nbsp;&nbsp;$: $&gt;Parse0 $&gt;<span style="">3</span> $<span style="">1</span><br />
R$* &lt;$*&gt; $*&nbsp;&nbsp;$: $<span style="">1</span> &lt;$<span style="">2</span> .&gt; $<span style="">3</span>&nbsp; &nbsp; &nbsp; Pretend it's canonical.<br />
R$* &lt;$* . .&gt; $*&nbsp;&nbsp;$<span style="">1</span> &lt;$<span style="">2</span> .&gt; $<span style="">3</span>&nbsp;&nbsp;&nbsp;Remove extra dots.</p>
<p># Allow relaying if the connected host is a local IP address.</p>
<p>R$*&nbsp;&nbsp;&nbsp;$: &lt;$&amp;<span style="">&#123;</span>client_addr<span style="">&#125;</span>&gt;&nbsp;&nbsp;Get client IP address.<br />
R&lt;&gt;&nbsp;&nbsp;&nbsp;$#OK&nbsp;&nbsp;&nbsp;&nbsp;Local is ok.<br />
R&lt;$* . $-&gt; $*&nbsp; &nbsp;&nbsp; &nbsp;$<span style="">&#40;</span>localip $<span style="">1</span>.$<span style="">2</span> $: &lt;$<span style="">1</span>&gt; . $<span style="">2</span> $<span style="">&#41;</span>&nbsp; &nbsp; Check last three octets.<br />
R$* &lt;MATCH&gt;&nbsp;&nbsp;$#OK<br />
R&lt;$-&gt; $*&nbsp; &nbsp; &nbsp; &nbsp; $: $<span style="">&#40;</span>localip $<span style="">1</span> $: &lt;&gt; $<span style="">1</span> $<span style="">2</span> $<span style="">&#41;</span>&nbsp; &nbsp; Check first octet.<br />
R$* &lt;MATCH&gt;&nbsp;&nbsp;$#OK</p>
<p># Allow relaying if the connected host has recently POP3 authenticated.</p>
<p>R$*&nbsp;&nbsp;&nbsp;$: &lt;$&amp;<span style="">&#123;</span>client_addr<span style="">&#125;</span>&gt;&nbsp;&nbsp;Get client IP address.<br />
R&lt;$*&gt; &nbsp; &nbsp; &nbsp; $<span style="">&#40;</span>popip $<span style="">1</span> $<span style="">&#41;</span>&nbsp;&nbsp;&nbsp;Check full address.<br />
R$* &lt;MATCH&gt;&nbsp;&nbsp;$#OK</p>
<p># IP address didn't match.</p></div>
</div>
</div>
<p></p>
<p>Recreamos el archivo /etc/sendmail.cf con:</p>
<div class="syntax_hilite">
<div id="text-5">
<div class="text">m4 /etc/sendmail.mc&gt; /etc/sendmail.cf</div>
</div>
</div>
<p></p>
<p>Crear el archivo <strong>/etc/mail/localip</strong> el cual contiene una lista de todas las direcciones IP y redes que se les va a permitir hacer relay sin autentificacion. </p>
<div class="syntax_hilite">
<div id="text-6">
<div class="text">touch /etc/mail/localip</div>
</div>
</div>
<p></p>
<p>Crear el archivo /etc/mail/popip:</p>
<div class="syntax_hilite">
<div id="text-7">
<div class="text">makemap hash /etc/mail/popip &lt;/dev/null</div>
</div>
</div>
<p></p>
<p>Modificar la función <strong>scanaddr</strong> del archivo <strong>/sbin/poprelayd</strong> según la versión del servidor de correo POP:</p>
<p><strong>qpoper 2.5X</strong></p>
<div class="syntax_hilite">
<div id="text-8">
<div class="text">sub scanaddr <span style="">&#40;</span>$<span style="">&#41;</span> <span style="">&#123;</span><br />
&nbsp; &nbsp;local $s, $i, @adressen;<br />
&nbsp; &nbsp;$s = $_<span style="">&#91;</span><span style="">0</span><span style="">&#93;</span>;<br />
&nbsp; &nbsp;$i = index <span style="">&#40;</span>$s,'popper'<span style="">&#41;</span>;<br />
&nbsp; &nbsp;undef @adressen;<br />
&nbsp; &nbsp;if <span style="">&#40;</span>$i&gt;=<span style="">0</span><span style="">&#41;</span><span style="">&#123;</span><br />
&nbsp; &nbsp;<span style="">&#40;</span>$s =~&nbsp; /.*?popper.*?POP login.*?<span style="">&#40;</span>d<span style="">&#123;</span><span style="">1</span>,<span style="">3</span><span style="">&#125;</span>.d<span style="">&#123;</span><span style="">1</span>,<span style="">3</span><span style="">&#125;</span>.d<span style="">&#123;</span><span style="">1</span>,<span style="">3</span><span style="">&#125;</span>.d<span style="">&#123;</span><span style="">1</span>,<span style="">3</span><span style="">&#125;</span><span style="">&#41;</span>/<span style="">&#41;</span> &amp;&amp; <span style="">&#40;</span>push <span style="">&#40;</span>@adressen,$<span style="">1</span><span style="">&#41;</span><span style="">&#41;</span>;&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp;<span style="">&#125;</span><br />
&nbsp; &nbsp;return @adressen;<br />
<span style="">&#125;</span></div>
</div>
</div>
<p></p>
<p><strong>qpoper 3.X o posterior:</strong></p>
<div class="syntax_hilite">
<div id="text-9">
<div class="text">sub scanaddr <span style="">&#40;</span>$<span style="">&#41;</span> <span style="">&#123;</span><br />
&nbsp; &nbsp;local $s, $i, @adressen;<br />
&nbsp; &nbsp;$s = $_<span style="">&#91;</span><span style="">0</span><span style="">&#93;</span>;<br />
&nbsp; &nbsp;$i = index <span style="">&#40;</span>$s,'popper'<span style="">&#41;</span>;<br />
&nbsp; &nbsp;undef @adressen;<br />
&nbsp; &nbsp;if <span style="">&#40;</span>$i&gt;=<span style="">0</span><span style="">&#41;</span><span style="">&#123;</span><br />
&nbsp; &nbsp;<span style="">&#40;</span>$s =~&nbsp; /.*?popper.*?<span style="">&#40;</span>d<span style="">&#123;</span><span style="">1</span>,<span style="">3</span><span style="">&#125;</span>.d<span style="">&#123;</span><span style="">1</span>,<span style="">3</span><span style="">&#125;</span>.d<span style="">&#123;</span><span style="">1</span>,<span style="">3</span><span style="">&#125;</span>.d<span style="">&#123;</span><span style="">1</span>,<span style="">3</span><span style="">&#125;</span><span style="">&#41;</span>/<span style="">&#41;</span> &amp;&amp; <span style="">&#40;</span>push <span style="">&#40;</span>@adressen,$<span style="">1</span><span style="">&#41;</span><span style="">&#41;</span>;&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp;<span style="">&#125;</span><br />
&nbsp; &nbsp;return @adressen;<br />
<span style="">&#125;</span></div>
</div>
</div>
<p></p>
<p>En la versión 4 de qpopper se debe agregar esta función:</p>
<div class="syntax_hilite">
<div id="text-10">
<div class="text">sub log_parse_qpopper_new <span style="">&#40;</span>$<span style="">&#41;</span> <span style="">&#123;</span><br />
&nbsp; &nbsp;local $s,$i,@adressen;<br />
&nbsp; &nbsp;$s = $_<span style="">&#91;</span><span style="">0</span><span style="">&#93;</span>;<br />
&nbsp; &nbsp;$i = index<span style="">&#40;</span>$s,'popper'<span style="">&#41;</span>;<br />
&nbsp; &nbsp;undef @adressen;<br />
&nbsp; &nbsp;if <span style="">&#40;</span>$i&gt;=<span style="">0</span><span style="">&#41;</span><span style="">&#123;</span><br />
&nbsp; &nbsp;<span style="">&#40;</span>$s =~ /.*?popper.*?<span style="">&#40;</span>d<span style="">&#123;</span><span style="">1</span>,<span style="">3</span><span style="">&#125;</span>.d<span style="">&#123;</span><span style="">1</span>,<span style="">3</span><span style="">&#125;</span>.d<span style="">&#123;</span><span style="">1</span>,<span style="">3</span><span style="">&#125;</span>.d<span style="">&#123;</span><span style="">1</span>,<span style="">3</span><span style="">&#125;</span><span style="">&#41;</span>/<span style="">&#41;</span> &amp;&amp; <span style="">&#40;</span>push <span style="">&#40;</span>@adressen,$<span style="">1</span><span style="">&#41;</span><span style="">&#41;</span>;<br />
&nbsp; &nbsp;<span style="">&#125;</span><br />
&nbsp; &nbsp;return @adressen;<br />
<span style="">&#125;</span></div>
</div>
</div>
<p></p>
<p>Levantar el demonio y colocarlo en /etc/rc.d/rc.local:</p>
<div class="syntax_hilite">
<div id="text-11">
<div class="text">poprelay -d</div>
</div>
</div>
<p></p>
<p>o bien hacer un archivo de inicialización:</p>
<div class="syntax_hilite">
<div id="text-12">
<div class="text">#!/bin/bash<br />
#<br />
# Init file for poprelay server daemon<br />
#<br />
# chkconfig: <span style="">2345</span> <span style="">55</span> <span style="">25</span><br />
# description: pop/imap client relay deamon<br />
#<br />
# processname: poprelayd<br />
# pidfile: /var/run/poprelayd.pid</p>
<p># source function library<br />
. /etc/rc.d/init.d/functions</p>
<p># pull in sysconfig settings</p>
<p>RETVAL=<span style="">0</span><br />
POPRD=&quot;/sbin/poprelayd&quot;;<br />
prog=&quot;poprelayd&quot;</p>
<p>start<span style="">&#40;</span><span style="">&#41;</span><br />
<span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; echo -n $&quot;Starting $prog:&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; initlog -c &quot;$POPRD -d&quot; &amp;&amp; success || failure<br />
&nbsp; &nbsp; &nbsp; &nbsp; RETVAL=$?<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#91;</span> &quot;$RETVAL&quot; = <span style="">0</span> <span style="">&#93;</span> &amp;&amp; touch /var/lock/subsys/poprelayd<br />
&nbsp; &nbsp; &nbsp; &nbsp; echo<br />
<span style="">&#125;</span></p>
<p>stop<span style="">&#40;</span><span style="">&#41;</span><br />
<span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; echo -n $&quot;Stopping $prog:&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; killproc $POPRD -TERM<br />
&nbsp; &nbsp; &nbsp; &nbsp; RETVAL=$?<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#91;</span> &quot;$RETVAL&quot; = <span style="">0</span> <span style="">&#93;</span> &amp;&amp; rm -f /var/lock/subsys/poprelayd<br />
&nbsp; &nbsp; &nbsp; &nbsp; echo<br />
<span style="">&#125;</span></p>
<p>reload<span style="">&#40;</span><span style="">&#41;</span><br />
<span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; echo -n $&quot;Reloading $prog:&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; killproc $POPRD -HUP<br />
&nbsp; &nbsp; &nbsp; &nbsp; RETVAL=$?<br />
&nbsp; &nbsp; &nbsp; &nbsp; echo<br />
<span style="">&#125;</span></p>
<p>check<span style="">&#40;</span><span style="">&#41;</span><br />
<span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; PROCS=`ps -ef | grep &quot;poprelayd -d&quot; | grep -v grep | wc -l`<br />
&nbsp; &nbsp; &nbsp; &nbsp; if <span style="">&#91;</span> $PROCS -ne <span style="">1</span> <span style="">&#93;</span>; then<br />
&nbsp; &nbsp; &nbsp; &nbsp; echo &quot;Restarting dead poprelayd: $PROCS running&quot;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; stop;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; start;<br />
&nbsp; &nbsp; &nbsp; &nbsp; fi<br />
<span style="">&#125;</span></p>
<p>
case &quot;$<span style="">1</span>&quot; in<br />
&nbsp; &nbsp; &nbsp; &nbsp; start<span style="">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; start<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; stop<span style="">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; stop<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; restart<span style="">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; stop<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; start<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; reload<span style="">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; reload<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; check<span style="">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; check<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; *<span style="">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo $&quot;Usage: $<span style="">0</span> <span style="">&#123;</span>start|stop|restart|reload|condrestart|status<span style="">&#125;</span>&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RETVAL=<span style="">1</span><br />
esac<br />
exit $RETVAL</div>
</div>
</div>
<p></p>

]]></description>
			<content:encoded><![CDATA[<p>Ls solución de POP before SMTP  que utilizaba en mis años mozos en <strong>Interalia</strong> estaba basada en<strong>poprelay</strong>,  <strong>qpopper</strong> como servidor pop y <strong>sendmail</strong> como mi servidor SMTP. </p>
<p>Aunque es cierto que la utilizaba hace mucho tiempo (2001?) y actualmente hay muchas otras opciones, se puede comprobar que sigue siendo una opción válida y efectiva.</p>
<h4>Instalación de qpopper</h4>
<p>Los fuentes se compilan de la siguiente forma:</p>
<div class="syntax_hilite">
<div id="text-13">
<div class="text">./configure --enable-specialauth<br />
make<br />
cp popper/popper /usr/local/bin</div>
</div>
</div>
<p></p>
<p>Finalmente declaramos el servicio en xinetd, creando el archivo /etc/xinetd.d/qpopper :</p>
<div class="syntax_hilite">
<div id="text-14">
<div class="text">service pop3<br />
<span style="">&#123;</span> <br />
socket_type = stream<br />
protocol = tcp<br />
wait = no<br />
user = root<br />
server = /usr/local/bin/popper<br />
server_args = qpopper –s<br />
port = <span style="">110</span><br />
<span style="">&#125;</span></div>
</div>
</div>
<p></p>
<p>Y reiniciamos xinetd:</p>
<div class="syntax_hilite">
<div id="text-15">
<div class="text">/etc/rc.d/init.d/xinetd restart</div>
</div>
</div>
<p></p>
<h4>Poprelay</h4>
<p>El código fuente de <strong>Poprelay</strong> se pueden encontrar en <a href="http://poprelay.sourceforge.net/" onclick="pageTracker._trackPageview('/outgoing/poprelay.sourceforge.net/?referer=');">Sourceforge</a>. </p>
<p>Una vez instalado, para hacerlo funcionar con <strong>sendmail</strong>, se debe integrar el siguiente código al archivo de configuración <strong>/etc/sendmail.mc</strong>:</p>
<div class="syntax_hilite">
<div id="text-16">
<div class="text"># We probably want the access_db feature enabled.</p>
<p>FEATURE<span style="">&#40;</span>access_db<span style="">&#41;</span>dnl</p>
<p># List of IP addresses we allow relaying from.</p>
<p>Klocalip hash -a&lt;MATCH&gt; /etc/mail/localip<br />
Kpopip hash&nbsp; -a&lt;MATCH&gt; /etc/mail/popip</p>
<p>LOCAL_RULESETS</p>
<p>SLocal_check_rcpt</p>
<p># Put the address into cannonical form <span style="">&#40;</span>even if it doesn't resolve to an MX<span style="">&#41;</span>.</p>
<p>R$*&nbsp;&nbsp;&nbsp;$: $&gt;Parse0 $&gt;<span style="">3</span> $<span style="">1</span><br />
R$* &lt;$*&gt; $*&nbsp;&nbsp;$: $<span style="">1</span> &lt;$<span style="">2</span> .&gt; $<span style="">3</span>&nbsp; &nbsp; &nbsp; Pretend it's canonical.<br />
R$* &lt;$* . .&gt; $*&nbsp;&nbsp;$<span style="">1</span> &lt;$<span style="">2</span> .&gt; $<span style="">3</span>&nbsp;&nbsp;&nbsp;Remove extra dots.</p>
<p># Allow relaying if the connected host is a local IP address.</p>
<p>R$*&nbsp;&nbsp;&nbsp;$: &lt;$&amp;<span style="">&#123;</span>client_addr<span style="">&#125;</span>&gt;&nbsp;&nbsp;Get client IP address.<br />
R&lt;&gt;&nbsp;&nbsp;&nbsp;$#OK&nbsp;&nbsp;&nbsp;&nbsp;Local is ok.<br />
R&lt;$* . $-&gt; $*&nbsp; &nbsp;&nbsp; &nbsp;$<span style="">&#40;</span>localip $<span style="">1</span>.$<span style="">2</span> $: &lt;$<span style="">1</span>&gt; . $<span style="">2</span> $<span style="">&#41;</span>&nbsp; &nbsp; Check last three octets.<br />
R$* &lt;MATCH&gt;&nbsp;&nbsp;$#OK<br />
R&lt;$-&gt; $*&nbsp; &nbsp; &nbsp; &nbsp; $: $<span style="">&#40;</span>localip $<span style="">1</span> $: &lt;&gt; $<span style="">1</span> $<span style="">2</span> $<span style="">&#41;</span>&nbsp; &nbsp; Check first octet.<br />
R$* &lt;MATCH&gt;&nbsp;&nbsp;$#OK</p>
<p># Allow relaying if the connected host has recently POP3 authenticated.</p>
<p>R$*&nbsp;&nbsp;&nbsp;$: &lt;$&amp;<span style="">&#123;</span>client_addr<span style="">&#125;</span>&gt;&nbsp;&nbsp;Get client IP address.<br />
R&lt;$*&gt; &nbsp; &nbsp; &nbsp; $<span style="">&#40;</span>popip $<span style="">1</span> $<span style="">&#41;</span>&nbsp;&nbsp;&nbsp;Check full address.<br />
R$* &lt;MATCH&gt;&nbsp;&nbsp;$#OK</p>
<p># IP address didn't match.</p></div>
</div>
</div>
<p></p>
<p>Recreamos el archivo /etc/sendmail.cf con:</p>
<div class="syntax_hilite">
<div id="text-17">
<div class="text">m4 /etc/sendmail.mc&gt; /etc/sendmail.cf</div>
</div>
</div>
<p></p>
<p>Crear el archivo <strong>/etc/mail/localip</strong> el cual contiene una lista de todas las direcciones IP y redes que se les va a permitir hacer relay sin autentificacion. </p>
<div class="syntax_hilite">
<div id="text-18">
<div class="text">touch /etc/mail/localip</div>
</div>
</div>
<p></p>
<p>Crear el archivo /etc/mail/popip:</p>
<div class="syntax_hilite">
<div id="text-19">
<div class="text">makemap hash /etc/mail/popip &lt;/dev/null</div>
</div>
</div>
<p></p>
<p>Modificar la función <strong>scanaddr</strong> del archivo <strong>/sbin/poprelayd</strong> según la versión del servidor de correo POP:</p>
<p><strong>qpoper 2.5X</strong></p>
<div class="syntax_hilite">
<div id="text-20">
<div class="text">sub scanaddr <span style="">&#40;</span>$<span style="">&#41;</span> <span style="">&#123;</span><br />
&nbsp; &nbsp;local $s, $i, @adressen;<br />
&nbsp; &nbsp;$s = $_<span style="">&#91;</span><span style="">0</span><span style="">&#93;</span>;<br />
&nbsp; &nbsp;$i = index <span style="">&#40;</span>$s,'popper'<span style="">&#41;</span>;<br />
&nbsp; &nbsp;undef @adressen;<br />
&nbsp; &nbsp;if <span style="">&#40;</span>$i&gt;=<span style="">0</span><span style="">&#41;</span><span style="">&#123;</span><br />
&nbsp; &nbsp;<span style="">&#40;</span>$s =~&nbsp; /.*?popper.*?POP login.*?<span style="">&#40;</span>d<span style="">&#123;</span><span style="">1</span>,<span style="">3</span><span style="">&#125;</span>.d<span style="">&#123;</span><span style="">1</span>,<span style="">3</span><span style="">&#125;</span>.d<span style="">&#123;</span><span style="">1</span>,<span style="">3</span><span style="">&#125;</span>.d<span style="">&#123;</span><span style="">1</span>,<span style="">3</span><span style="">&#125;</span><span style="">&#41;</span>/<span style="">&#41;</span> &amp;&amp; <span style="">&#40;</span>push <span style="">&#40;</span>@adressen,$<span style="">1</span><span style="">&#41;</span><span style="">&#41;</span>;&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp;<span style="">&#125;</span><br />
&nbsp; &nbsp;return @adressen;<br />
<span style="">&#125;</span></div>
</div>
</div>
<p></p>
<p><strong>qpoper 3.X o posterior:</strong></p>
<div class="syntax_hilite">
<div id="text-21">
<div class="text">sub scanaddr <span style="">&#40;</span>$<span style="">&#41;</span> <span style="">&#123;</span><br />
&nbsp; &nbsp;local $s, $i, @adressen;<br />
&nbsp; &nbsp;$s = $_<span style="">&#91;</span><span style="">0</span><span style="">&#93;</span>;<br />
&nbsp; &nbsp;$i = index <span style="">&#40;</span>$s,'popper'<span style="">&#41;</span>;<br />
&nbsp; &nbsp;undef @adressen;<br />
&nbsp; &nbsp;if <span style="">&#40;</span>$i&gt;=<span style="">0</span><span style="">&#41;</span><span style="">&#123;</span><br />
&nbsp; &nbsp;<span style="">&#40;</span>$s =~&nbsp; /.*?popper.*?<span style="">&#40;</span>d<span style="">&#123;</span><span style="">1</span>,<span style="">3</span><span style="">&#125;</span>.d<span style="">&#123;</span><span style="">1</span>,<span style="">3</span><span style="">&#125;</span>.d<span style="">&#123;</span><span style="">1</span>,<span style="">3</span><span style="">&#125;</span>.d<span style="">&#123;</span><span style="">1</span>,<span style="">3</span><span style="">&#125;</span><span style="">&#41;</span>/<span style="">&#41;</span> &amp;&amp; <span style="">&#40;</span>push <span style="">&#40;</span>@adressen,$<span style="">1</span><span style="">&#41;</span><span style="">&#41;</span>;&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp;<span style="">&#125;</span><br />
&nbsp; &nbsp;return @adressen;<br />
<span style="">&#125;</span></div>
</div>
</div>
<p></p>
<p>En la versión 4 de qpopper se debe agregar esta función:</p>
<div class="syntax_hilite">
<div id="text-22">
<div class="text">sub log_parse_qpopper_new <span style="">&#40;</span>$<span style="">&#41;</span> <span style="">&#123;</span><br />
&nbsp; &nbsp;local $s,$i,@adressen;<br />
&nbsp; &nbsp;$s = $_<span style="">&#91;</span><span style="">0</span><span style="">&#93;</span>;<br />
&nbsp; &nbsp;$i = index<span style="">&#40;</span>$s,'popper'<span style="">&#41;</span>;<br />
&nbsp; &nbsp;undef @adressen;<br />
&nbsp; &nbsp;if <span style="">&#40;</span>$i&gt;=<span style="">0</span><span style="">&#41;</span><span style="">&#123;</span><br />
&nbsp; &nbsp;<span style="">&#40;</span>$s =~ /.*?popper.*?<span style="">&#40;</span>d<span style="">&#123;</span><span style="">1</span>,<span style="">3</span><span style="">&#125;</span>.d<span style="">&#123;</span><span style="">1</span>,<span style="">3</span><span style="">&#125;</span>.d<span style="">&#123;</span><span style="">1</span>,<span style="">3</span><span style="">&#125;</span>.d<span style="">&#123;</span><span style="">1</span>,<span style="">3</span><span style="">&#125;</span><span style="">&#41;</span>/<span style="">&#41;</span> &amp;&amp; <span style="">&#40;</span>push <span style="">&#40;</span>@adressen,$<span style="">1</span><span style="">&#41;</span><span style="">&#41;</span>;<br />
&nbsp; &nbsp;<span style="">&#125;</span><br />
&nbsp; &nbsp;return @adressen;<br />
<span style="">&#125;</span></div>
</div>
</div>
<p></p>
<p>Levantar el demonio y colocarlo en /etc/rc.d/rc.local:</p>
<div class="syntax_hilite">
<div id="text-23">
<div class="text">poprelay -d</div>
</div>
</div>
<p></p>
<p>o bien hacer un archivo de inicialización:</p>
<div class="syntax_hilite">
<div id="text-24">
<div class="text">#!/bin/bash<br />
#<br />
# Init file for poprelay server daemon<br />
#<br />
# chkconfig: <span style="">2345</span> <span style="">55</span> <span style="">25</span><br />
# description: pop/imap client relay deamon<br />
#<br />
# processname: poprelayd<br />
# pidfile: /var/run/poprelayd.pid</p>
<p># source function library<br />
. /etc/rc.d/init.d/functions</p>
<p># pull in sysconfig settings</p>
<p>RETVAL=<span style="">0</span><br />
POPRD=&quot;/sbin/poprelayd&quot;;<br />
prog=&quot;poprelayd&quot;</p>
<p>start<span style="">&#40;</span><span style="">&#41;</span><br />
<span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; echo -n $&quot;Starting $prog:&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; initlog -c &quot;$POPRD -d&quot; &amp;&amp; success || failure<br />
&nbsp; &nbsp; &nbsp; &nbsp; RETVAL=$?<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#91;</span> &quot;$RETVAL&quot; = <span style="">0</span> <span style="">&#93;</span> &amp;&amp; touch /var/lock/subsys/poprelayd<br />
&nbsp; &nbsp; &nbsp; &nbsp; echo<br />
<span style="">&#125;</span></p>
<p>stop<span style="">&#40;</span><span style="">&#41;</span><br />
<span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; echo -n $&quot;Stopping $prog:&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; killproc $POPRD -TERM<br />
&nbsp; &nbsp; &nbsp; &nbsp; RETVAL=$?<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="">&#91;</span> &quot;$RETVAL&quot; = <span style="">0</span> <span style="">&#93;</span> &amp;&amp; rm -f /var/lock/subsys/poprelayd<br />
&nbsp; &nbsp; &nbsp; &nbsp; echo<br />
<span style="">&#125;</span></p>
<p>reload<span style="">&#40;</span><span style="">&#41;</span><br />
<span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; echo -n $&quot;Reloading $prog:&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; killproc $POPRD -HUP<br />
&nbsp; &nbsp; &nbsp; &nbsp; RETVAL=$?<br />
&nbsp; &nbsp; &nbsp; &nbsp; echo<br />
<span style="">&#125;</span></p>
<p>check<span style="">&#40;</span><span style="">&#41;</span><br />
<span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; PROCS=`ps -ef | grep &quot;poprelayd -d&quot; | grep -v grep | wc -l`<br />
&nbsp; &nbsp; &nbsp; &nbsp; if <span style="">&#91;</span> $PROCS -ne <span style="">1</span> <span style="">&#93;</span>; then<br />
&nbsp; &nbsp; &nbsp; &nbsp; echo &quot;Restarting dead poprelayd: $PROCS running&quot;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; stop;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; start;<br />
&nbsp; &nbsp; &nbsp; &nbsp; fi<br />
<span style="">&#125;</span></p>
<p>
case &quot;$<span style="">1</span>&quot; in<br />
&nbsp; &nbsp; &nbsp; &nbsp; start<span style="">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; start<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; stop<span style="">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; stop<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; restart<span style="">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; stop<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; start<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; reload<span style="">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; reload<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; check<span style="">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; check<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; *<span style="">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo $&quot;Usage: $<span style="">0</span> <span style="">&#123;</span>start|stop|restart|reload|condrestart|status<span style="">&#125;</span>&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RETVAL=<span style="">1</span><br />
esac<br />
exit $RETVAL</div>
</div>
</div>
<p></p>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/873/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Medición del Ancho de Banda en Linux</title>
		<link>http://www.machin.com.mx/archives/388</link>
		<comments>http://www.machin.com.mx/archives/388#comments</comments>
		<pubDate>Sun, 10 Aug 2008 06:00:51 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[Fedora]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[vnstat]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/?p=388</guid>
		<description><![CDATA[<p>Un programa muy útil para saber cuanto ancho de banda esta gastando nuestra computadora es <strong>vnstat</strong>, el cual se puede instalar en <strong>Fedora</strong> usando <strong>yum</strong>:</p>
<div class="syntax_hilite">
<div id="text-25">
<div class="text">yum install vnstat</div>
</div>
</div>
<p></p>
<p>Si lo desea compilar de los fuentes, los puede obtener de: <a href="http://humdi.net/vnstat" onclick="pageTracker._trackPageview('/outgoing/humdi.net/vnstat?referer=');">http://humdi.net/vnstat/</a>.</p>
<p>Una vez instalado creamos la base de datos para la interfaz que queramos medir, por lo general eth0:</p>
<div class="syntax_hilite">
<div id="text-26">
<div class="text">vnstat -u -i eth0</div>
</div>
</div>
<p></p>
<p>Si se instaló compilandolo a mano, se crea además un cron que se ejecuta cada cinco minutos para llenar la base de datos:</p>
<div class="syntax_hilite">
<div id="text-27">
<div class="text"><span style="">0</span>-<span style="">55</span>/<span style="">5</span> * * * * /usr/bin/vnstat -u</div>
</div>
</div>
<p></p>
<p>O bien, se quita el comentario (#) en <strong>/etc/cron.d/vnstat</strong> para habilitarlo si se instaló con <strong>yum</strong>.</p>
<p>Después de un tiempo, podemos consultar nuestro gasto del dia con:</p>
<div class="syntax_hilite">
<div id="text-28">
<div class="text">vnstat -d</div>
</div>
</div>
<p></p>
<p>O el mensual</p>
<div class="syntax_hilite">
<div id="text-29">
<div class="text">vnstat -m</div>
</div>
</div>
<p></p>

]]></description>
			<content:encoded><![CDATA[<p>Un programa muy útil para saber cuanto ancho de banda esta gastando nuestra computadora es <strong>vnstat</strong>, el cual se puede instalar en <strong>Fedora</strong> usando <strong>yum</strong>:</p>
<div class="syntax_hilite">
<div id="text-30">
<div class="text">yum install vnstat</div>
</div>
</div>
<p></p>
<p>Si lo desea compilar de los fuentes, los puede obtener de: <a href="http://humdi.net/vnstat" onclick="pageTracker._trackPageview('/outgoing/humdi.net/vnstat?referer=');">http://humdi.net/vnstat/</a>.</p>
<p>Una vez instalado creamos la base de datos para la interfaz que queramos medir, por lo general eth0:</p>
<div class="syntax_hilite">
<div id="text-31">
<div class="text">vnstat -u -i eth0</div>
</div>
</div>
<p></p>
<p>Si se instaló compilandolo a mano, se crea además un cron que se ejecuta cada cinco minutos para llenar la base de datos:</p>
<div class="syntax_hilite">
<div id="text-32">
<div class="text"><span style="">0</span>-<span style="">55</span>/<span style="">5</span> * * * * /usr/bin/vnstat -u</div>
</div>
</div>
<p></p>
<p>O bien, se quita el comentario (#) en <strong>/etc/cron.d/vnstat</strong> para habilitarlo si se instaló con <strong>yum</strong>.</p>
<p>Después de un tiempo, podemos consultar nuestro gasto del dia con:</p>
<div class="syntax_hilite">
<div id="text-33">
<div class="text">vnstat -d</div>
</div>
</div>
<p></p>
<p>O el mensual</p>
<div class="syntax_hilite">
<div id="text-34">
<div class="text">vnstat -m</div>
</div>
</div>
<p></p>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/388/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reviviendo MS-DOS 6.22 con QEMU</title>
		<link>http://www.machin.com.mx/archives/265</link>
		<comments>http://www.machin.com.mx/archives/265#comments</comments>
		<pubDate>Mon, 30 Jun 2008 04:08:10 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[Emuladores]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Videojuegos]]></category>
		<category><![CDATA[MS-DOS]]></category>
		<category><![CDATA[QEMU]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/?p=265</guid>
		<description><![CDATA[<p>Al hacer el post de <a href="/archives/253">mis videojuegos favoritos</a>, me di cuenta que algunos de ellos ya no los puedo jugar ni usando wine o dosemu. Afortunadamente queda la alternativa de usar un emulador de "PC" e instalar en ellos DOS, Windows 3.11 o Windows95 para disfrutarlos otra vez.  Efectivamente, al emular la PC se obtiene una computadora lenta, pero las computadoras de esa época eran igual de lentas y actualmente no se nota la diferencia cuando se juega en una máquina virtual.</p>
<p>Utilicé el conocido emulador QEMU porque funciona en Windows, Linux y Mac y las imágenes creadas son completamente intercambiables. </p>
<h4>Instalando QEMU</h4>
<p><strong>En Fedora:</strong></p>
<p>La instalación es con yum:</p>
<div class="syntax_hilite">
<div id="text-35">
<div class="text">yum install kqemu</div>
</div>
</div>
<p></p>
<p>Si quiere utilizar aceleración por hardware, QEMU tiene un módulo que ejecuta directamente el código de máquina si se esta en una maquina compatible con los microprocesadores de Intel. Este se levanta como cualquier otro módulo:</p>
<div class="syntax_hilite">
<div id="text-36">
<div class="text">modprobe kqemu</div>
</div>
</div>
<p></p>
<p><strong>En Windows:</strong></p>
<p>Solamente se necesita bajar y descomprimir el archivo zip con los binarios de la siguiente página: <a href="http://www.h7.dion.ne.jp/~qemu-win/" onclick="pageTracker._trackPageview('/outgoing/www.h7.dion.ne.jp/_qemu-win/?referer=');">http://www.h7.dion.ne.jp/~qemu-win/</a>. No hay archivo de instalación.</p>
<p>En este post se va asumir que todo se hace desde la línea de comando. Si usted prefiere, puede intentar usar el programa <a href="http://www.davereyn.co.uk" onclick="pageTracker._trackPageview('/outgoing/www.davereyn.co.uk?referer=');">Qemu manager</a>. </p>
<p>Si desea utilizar la aceleración por hardware, es necesario que baje e instale el archivo Kqemu-version-install.exe.</p>
<h4>Instalado MS-DOS 6.22</h4>
<p>El primer paso es crear una imagen del disco duro donde vamos a instalar todo, para ello ejecutamos el comando:</p>
<div class="syntax_hilite">
<div id="text-37">
<div class="text">qemu-img create dos622.img 1000M</div>
</div>
</div>
<p></p>
<p>El nombre de la imagen donde instalaremos es dos622.img y su tamaño es de 1 GB. Es usted libre de cambiar el tamaño a sus necesidades.</p>
<p>El siguiente paso es instalar el MS-DOS. Afortunadamente cuento con unas imágenes de los diskettes de una computadora que tuve. Si usted tiene los diskettes los puede utilizar dando la ruta o creando primero una imagen usando dd o windd. El comando para hacer la imagen de los diskettes sería de la forma:</p>
<div class="syntax_hilite">
<div id="text-38">
<div class="text">dd bs=2x80x18b if=/dev/fd0 of=/tmp/disk1.image</div>
</div>
</div>
<p></p>
<p>Ahora que si no cuenta con un sistema operativo MS-DOS original, podría intentar con FreeDOS o con <a href="http://www.drdosprojects.de" onclick="pageTracker._trackPageview('/outgoing/www.drdosprojects.de?referer=');">DR-DOS</a>, que igual y son mejores porque su desarrollo continúa hasta la fecha. Yo utilicé MS-DOS porque los tengo a la mano y usar los originales fue parte de este reto personal.</p>
<p>Con las imagenes o los diskettes a la mano, ejecutamos el comando:</p>
<div class="syntax_hilite">
<div id="text-39">
<div class="text">qemu -boot a -fda disk1.img -hda dos622.img</div>
</div>
</div>
<p></p>
<p>En Windows es necesario agregar el parámetro L al directorio donde esta la instalación. Si estamos sobre el directorio de instalación el comando se transforma en:</p>
<div class="syntax_hilite">
<div id="text-40">
<div class="text">qemu -L . -boot a -fda disk1.img -hda dos622.img</div>
</div>
</div>
<p></p>
<p>Desde aquí se puede seguir la instalación normal del MS-DOS.</p>
<p align="center">
<img src="http://www.machin.com.mx/wp-content/uploads/2008/06/msdos.jpg" /><br />
<strong>¿Evocando pesadillas del pasado?</strong>
</p>
<p>Los cambios de diskette que pide el instalador se pueden hacer accediendo a la consola, la cual se abre con las teclas <ctrl><alt>2 y usando el comando:</p>
<div class="syntax_hilite">
<div id="text-41">
<div class="text">change floppy0 disk2.img</div>
</div>
</div>
<p></p>
<p>Si QEMU no conoce el dispositivo floppy0, puede ser porque su sistema lo nombre de otra forma. Para obtener los nombres de los dispositivos, puede ejecutar el siguiente comando y así cambiarlo por el correcto:</p>
<div class="syntax_hilite">
<div id="text-42">
<div class="text">info block</div>
</div>
</div>
<p></p>
<p>Para regresar a la pantalla de instalación se presiona las teclas <ctrl><alt>1.</p>
<p>Una vez instalado el sistema operativo, se arranca sin la opción -boot y con todo la emulación del hardware que desee:</p>
<div class="syntax_hilite">
<div id="text-43">
<div class="text">qemu -L .&nbsp; -hda dos622.img -cdrom E:</div>
</div>
</div>
<p></p>
<p>Ahora si lo desea puede configurar a su gusto los archivos CONFIG.SYS y AUTOEXEC.BAT. Los mios tienen esta forma:</p>
<p><strong>CONFIG.SYS:</strong></p>
<div class="syntax_hilite">
<div id="text-44">
<div class="text">DEVICE=C:\DOS\SETVER.EXE<br />
DEVICE=C:\WINDOWS\HIMEM.SYS /TESTMEM:OFF<br />
DEVICE=C:\DOS\EMM386.EXE NOEMS<br />
DOS=HIGH<br />
LASTDRIVE=Z<br />
COUNTRY=<span style="">003</span>,,C:\DOS\COUNTRY.SYS<br />
SHELL=COMMAND.COM /P /e:<span style="">1024</span><br />
DEVICE=C:\DOS\DISPLAY.SYS CON=<span style="">&#40;</span>EGA,,<span style="">1</span><span style="">&#41;</span><br />
FILES=<span style="">50</span></div>
</div>
</div>
<p></p>
<p><strong>AUTOEXEC.BAT:</strong></p>
<div class="syntax_hilite">
<div id="text-45">
<div class="text">@ECHO OFF<br />
PROMPT $p$g<br />
PATH C:\DOS<br />
MODE CON CODEPAGE PREPARE=<span style="">&#40;</span><span style="">&#40;</span><span style="">850</span><span style="">&#41;</span> C:\DOS\EGA.CPI<span style="">&#41;</span><br />
MODE CON CODEPAGE SELECT=<span style="">850</span><br />
KEYB LA,,C:\DOS\KEYBOARD.SYS<br />
C:\DOS\SMARTDRV.EXE /X<br />
C:\DOS\SHARE.EXE /L:<span style="">500</span><br />
C:\DOS\DOSKEY.COM</div>
</div>
</div>
<p></p>
<p>Si necesita transferir archivos a la partición, en Linux, puede montar la imagen con el siguiente comando:</p>
<div class="syntax_hilite">
<div id="text-46">
<div class="text">mount -o loop,offset=<span style="">32256</span> dos622 punto_de__montaje</div>
</div>
</div>
<p></p>
<p>En windows, se pueden crear imágenes iso para leerlas desde QEMU, usar una disketera virtual como <a href="http://chitchat.at.infoseek.co.jp/vmware/vfd.html" onclick="pageTracker._trackPageview('/outgoing/chitchat.at.infoseek.co.jp/vmware/vfd.html?referer=');">VFD</a> o bien ver un directorio de nuestra máquina con el parámetro:</p>
<div class="syntax_hilite">
<div id="text-47">
<div class="text">-hdb fat:/mi_directorio</div>
</div>
</div>
<p></p>
<h4>Soporte para CD</h4>
<p>Por lo general, los controladores de las unidades de disco compacto se incluían con ellas. Afortunadamente en el sitio 4DOS.infi se puede <a href="http://www.4dos.info/dhardw.htm#7" onclick="pageTracker._trackPageview('/outgoing/www.4dos.info/dhardw.htm_7?referer=');">bajar unos controladores de Acer</a> compatibles con atapi que funcionan correctamente con qemu.</p>
<p>Después de bajar el archivo APICD214.ZIP y transifir  VIDE-CDD.SYS a nuestra imagen, se agrega la siguiente línea al archivo CONFIG.SYS:</p>
<div class="syntax_hilite">
<div id="text-48">
<div class="text">DEVICE=C:\VIDE-CDD.SYS /D:MSCD001</div>
</div>
</div>
<p></p>
<p>y esta al AUTOEXEC.BAT:</p>
<div class="syntax_hilite">
<div id="text-49">
<div class="text">C:\DOS\MSCDEX.EXE /S /D:MSCD001</div>
</div>
</div>
<p></p>
<p>Después de reiniciar, ya tenemos acceso a la unidiad de discos.</p>
<h4>Soporte para ratón</h4>
<p>Podemos usar el controlador <a href="http://cutemouse.sourceforge.net/" onclick="pageTracker._trackPageview('/outgoing/cutemouse.sourceforge.net/?referer=');">CuteMouse</A> que es un ejecutable que podemos agregar al AUTOEXEC.BAT.</p>
<h4>Aceleración por hardware</h4>
<p>Si ya tiene instalado o cargado los módulos de kqemu, solo necesita agregar la opción -kernel-kqemu</p>

]]></description>
			<content:encoded><![CDATA[<p>Al hacer el post de <a href="/archives/253">mis videojuegos favoritos</a>, me di cuenta que algunos de ellos ya no los puedo jugar ni usando wine o dosemu. Afortunadamente queda la alternativa de usar un emulador de "PC" e instalar en ellos DOS, Windows 3.11 o Windows95 para disfrutarlos otra vez.  Efectivamente, al emular la PC se obtiene una computadora lenta, pero las computadoras de esa época eran igual de lentas y actualmente no se nota la diferencia cuando se juega en una máquina virtual.</p>
<p>Utilicé el conocido emulador QEMU porque funciona en Windows, Linux y Mac y las imágenes creadas son completamente intercambiables. </p>
<h4>Instalando QEMU</h4>
<p><strong>En Fedora:</strong></p>
<p>La instalación es con yum:</p>
<div class="syntax_hilite">
<div id="text-50">
<div class="text">yum install kqemu</div>
</div>
</div>
<p></p>
<p>Si quiere utilizar aceleración por hardware, QEMU tiene un módulo que ejecuta directamente el código de máquina si se esta en una maquina compatible con los microprocesadores de Intel. Este se levanta como cualquier otro módulo:</p>
<div class="syntax_hilite">
<div id="text-51">
<div class="text">modprobe kqemu</div>
</div>
</div>
<p></p>
<p><strong>En Windows:</strong></p>
<p>Solamente se necesita bajar y descomprimir el archivo zip con los binarios de la siguiente página: <a href="http://www.h7.dion.ne.jp/~qemu-win/" onclick="pageTracker._trackPageview('/outgoing/www.h7.dion.ne.jp/_qemu-win/?referer=');">http://www.h7.dion.ne.jp/~qemu-win/</a>. No hay archivo de instalación.</p>
<p>En este post se va asumir que todo se hace desde la línea de comando. Si usted prefiere, puede intentar usar el programa <a href="http://www.davereyn.co.uk" onclick="pageTracker._trackPageview('/outgoing/www.davereyn.co.uk?referer=');">Qemu manager</a>. </p>
<p>Si desea utilizar la aceleración por hardware, es necesario que baje e instale el archivo Kqemu-version-install.exe.</p>
<h4>Instalado MS-DOS 6.22</h4>
<p>El primer paso es crear una imagen del disco duro donde vamos a instalar todo, para ello ejecutamos el comando:</p>
<div class="syntax_hilite">
<div id="text-52">
<div class="text">qemu-img create dos622.img 1000M</div>
</div>
</div>
<p></p>
<p>El nombre de la imagen donde instalaremos es dos622.img y su tamaño es de 1 GB. Es usted libre de cambiar el tamaño a sus necesidades.</p>
<p>El siguiente paso es instalar el MS-DOS. Afortunadamente cuento con unas imágenes de los diskettes de una computadora que tuve. Si usted tiene los diskettes los puede utilizar dando la ruta o creando primero una imagen usando dd o windd. El comando para hacer la imagen de los diskettes sería de la forma:</p>
<div class="syntax_hilite">
<div id="text-53">
<div class="text">dd bs=2x80x18b if=/dev/fd0 of=/tmp/disk1.image</div>
</div>
</div>
<p></p>
<p>Ahora que si no cuenta con un sistema operativo MS-DOS original, podría intentar con FreeDOS o con <a href="http://www.drdosprojects.de" onclick="pageTracker._trackPageview('/outgoing/www.drdosprojects.de?referer=');">DR-DOS</a>, que igual y son mejores porque su desarrollo continúa hasta la fecha. Yo utilicé MS-DOS porque los tengo a la mano y usar los originales fue parte de este reto personal.</p>
<p>Con las imagenes o los diskettes a la mano, ejecutamos el comando:</p>
<div class="syntax_hilite">
<div id="text-54">
<div class="text">qemu -boot a -fda disk1.img -hda dos622.img</div>
</div>
</div>
<p></p>
<p>En Windows es necesario agregar el parámetro L al directorio donde esta la instalación. Si estamos sobre el directorio de instalación el comando se transforma en:</p>
<div class="syntax_hilite">
<div id="text-55">
<div class="text">qemu -L . -boot a -fda disk1.img -hda dos622.img</div>
</div>
</div>
<p></p>
<p>Desde aquí se puede seguir la instalación normal del MS-DOS.</p>
<p align="center">
<img src="http://www.machin.com.mx/wp-content/uploads/2008/06/msdos.jpg" /><br />
<strong>¿Evocando pesadillas del pasado?</strong>
</p>
<p>Los cambios de diskette que pide el instalador se pueden hacer accediendo a la consola, la cual se abre con las teclas <ctrl><alt>2 y usando el comando:</p>
<div class="syntax_hilite">
<div id="text-56">
<div class="text">change floppy0 disk2.img</div>
</div>
</div>
<p></p>
<p>Si QEMU no conoce el dispositivo floppy0, puede ser porque su sistema lo nombre de otra forma. Para obtener los nombres de los dispositivos, puede ejecutar el siguiente comando y así cambiarlo por el correcto:</p>
<div class="syntax_hilite">
<div id="text-57">
<div class="text">info block</div>
</div>
</div>
<p></p>
<p>Para regresar a la pantalla de instalación se presiona las teclas <ctrl><alt>1.</p>
<p>Una vez instalado el sistema operativo, se arranca sin la opción -boot y con todo la emulación del hardware que desee:</p>
<div class="syntax_hilite">
<div id="text-58">
<div class="text">qemu -L .&nbsp; -hda dos622.img -cdrom E:</div>
</div>
</div>
<p></p>
<p>Ahora si lo desea puede configurar a su gusto los archivos CONFIG.SYS y AUTOEXEC.BAT. Los mios tienen esta forma:</p>
<p><strong>CONFIG.SYS:</strong></p>
<div class="syntax_hilite">
<div id="text-59">
<div class="text">DEVICE=C:\DOS\SETVER.EXE<br />
DEVICE=C:\WINDOWS\HIMEM.SYS /TESTMEM:OFF<br />
DEVICE=C:\DOS\EMM386.EXE NOEMS<br />
DOS=HIGH<br />
LASTDRIVE=Z<br />
COUNTRY=<span style="">003</span>,,C:\DOS\COUNTRY.SYS<br />
SHELL=COMMAND.COM /P /e:<span style="">1024</span><br />
DEVICE=C:\DOS\DISPLAY.SYS CON=<span style="">&#40;</span>EGA,,<span style="">1</span><span style="">&#41;</span><br />
FILES=<span style="">50</span></div>
</div>
</div>
<p></p>
<p><strong>AUTOEXEC.BAT:</strong></p>
<div class="syntax_hilite">
<div id="text-60">
<div class="text">@ECHO OFF<br />
PROMPT $p$g<br />
PATH C:\DOS<br />
MODE CON CODEPAGE PREPARE=<span style="">&#40;</span><span style="">&#40;</span><span style="">850</span><span style="">&#41;</span> C:\DOS\EGA.CPI<span style="">&#41;</span><br />
MODE CON CODEPAGE SELECT=<span style="">850</span><br />
KEYB LA,,C:\DOS\KEYBOARD.SYS<br />
C:\DOS\SMARTDRV.EXE /X<br />
C:\DOS\SHARE.EXE /L:<span style="">500</span><br />
C:\DOS\DOSKEY.COM</div>
</div>
</div>
<p></p>
<p>Si necesita transferir archivos a la partición, en Linux, puede montar la imagen con el siguiente comando:</p>
<div class="syntax_hilite">
<div id="text-61">
<div class="text">mount -o loop,offset=<span style="">32256</span> dos622 punto_de__montaje</div>
</div>
</div>
<p></p>
<p>En windows, se pueden crear imágenes iso para leerlas desde QEMU, usar una disketera virtual como <a href="http://chitchat.at.infoseek.co.jp/vmware/vfd.html" onclick="pageTracker._trackPageview('/outgoing/chitchat.at.infoseek.co.jp/vmware/vfd.html?referer=');">VFD</a> o bien ver un directorio de nuestra máquina con el parámetro:</p>
<div class="syntax_hilite">
<div id="text-62">
<div class="text">-hdb fat:/mi_directorio</div>
</div>
</div>
<p></p>
<h4>Soporte para CD</h4>
<p>Por lo general, los controladores de las unidades de disco compacto se incluían con ellas. Afortunadamente en el sitio 4DOS.infi se puede <a href="http://www.4dos.info/dhardw.htm#7" onclick="pageTracker._trackPageview('/outgoing/www.4dos.info/dhardw.htm_7?referer=');">bajar unos controladores de Acer</a> compatibles con atapi que funcionan correctamente con qemu.</p>
<p>Después de bajar el archivo APICD214.ZIP y transifir  VIDE-CDD.SYS a nuestra imagen, se agrega la siguiente línea al archivo CONFIG.SYS:</p>
<div class="syntax_hilite">
<div id="text-63">
<div class="text">DEVICE=C:\VIDE-CDD.SYS /D:MSCD001</div>
</div>
</div>
<p></p>
<p>y esta al AUTOEXEC.BAT:</p>
<div class="syntax_hilite">
<div id="text-64">
<div class="text">C:\DOS\MSCDEX.EXE /S /D:MSCD001</div>
</div>
</div>
<p></p>
<p>Después de reiniciar, ya tenemos acceso a la unidiad de discos.</p>
<h4>Soporte para ratón</h4>
<p>Podemos usar el controlador <a href="http://cutemouse.sourceforge.net/" onclick="pageTracker._trackPageview('/outgoing/cutemouse.sourceforge.net/?referer=');">CuteMouse</A> que es un ejecutable que podemos agregar al AUTOEXEC.BAT.</p>
<h4>Aceleración por hardware</h4>
<p>Si ya tiene instalado o cargado los módulos de kqemu, solo necesita agregar la opción -kernel-kqemu</p>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/265/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programación Flash/ActionScript 3 en Linux</title>
		<link>http://www.machin.com.mx/archives/217</link>
		<comments>http://www.machin.com.mx/archives/217#comments</comments>
		<pubDate>Tue, 11 Mar 2008 04:45:39 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[Adobe Flash]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/archives/217</guid>
		<description><![CDATA[<p>En el pasado, programar aplicaciones en Flash significaba un problema para los usuarios de Linux por el poco soporte que daba Macromedia/Adobe. Afortunadamente, las cosas han cambiado un poco debido a que ahora esta disponible un compilador de AS3 en nuestra plataforma favorita. En este post trato brevemente como hacer películas "swf" en Linux desde la línea de comandos:</p>
<h4>Instalación</h4>
<p>1. Bajar el Adobe Flex 3 SDK  de Adobe (flex_sdk_3.zip) de la siguiente URL: <a href="http://www.adobe.com/products/flex/flexdownloads/index.html" onclick="pageTracker._trackPageview('/outgoing/www.adobe.com/products/flex/flexdownloads/index.html?referer=');">http://www.adobe.com/products/flex/flexdownloads/index.html<br />
</A></p>
<p>2. <b>Como usuario root</b>, desempaquetar el archivo flex_sdk_3.zip y poner algunos permisos para que todos los usuarios lo puedan utilizar:</p>
<div class="syntax_hilite">
<div id="text-65">
<div class="text">mkdir /usr/local/bin/flex3<br />
cp flex_sdk_3.zip /usr/local/bin/flex3<br />
cd /usr/local/bin/flex3<br />
unzip flex_sdk_3.zip<br />
chmod a+r * -Rf<br />
chmod a+x bin<br />
chmod a+x bin/*<br />
chmod a+x lib<br />
chmod a+x frameworks<br />
chmod a+x frameworks/libs<br />
chmod a+x frameworks/libs/player<br />
chmod a+x frameworks/locale</div>
</div>
</div>
<p></p>
<p>O bien, si se quiere evitar problemas, <b>como usuario local</b> en su home:</p>
<div class="syntax_hilite">
<div id="text-66">
<div class="text">mkdir flex3<br />
cp flex3_sdk_3.zip flex3<br />
cd flex3<br />
unzip flex3_sdk_3.zip</div>
</div>
</div>
<p></p>
<h4>Escribiendo un programa de prueba</h4>
<p>Para ilustrar la compilación, hacemos un pequeño programa de dos archivos que lo único que hace es desplegar un texto y un circulo en la pantalla. El primer archivo llamado <b>SphericCow.as</b> se encargada de dibujar un círculo negro (sobrecargando la clase "Shape"):</p>
<div class="syntax_hilite">
<div id="actionscript-67">
<div class="actionscript">package <span style="color: #66cc66;">&#123;</span></p>
<p>&nbsp; &nbsp; <span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Shape</span>;</p>
<p>&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">//</span></p>
<p>&nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> SphericCow <span style="color: #0066CC;">extends</span> Shape <span style="color: #66cc66;">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> SphericCow<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; graphics.<span style="color: #0066CC;">beginFill</span><span style="color: #66cc66;">&#40;</span> 0x000000, <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; graphics.<span style="color: #006600;">drawCircle</span><span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">80</span> , <span style="color: #cc66cc;">70</span> , <span style="color: #cc66cc;">30</span> <span style="color: #66cc66;">&#41;</span>; </p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">&#125;</span></p>
<p>&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp;<br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
<p>El segundo archivo, llamado <b>MyFirstProgram.as</b>, es la aplicación en sí, que utiliza nuestra clase anterior y pone también un pequeño texto:</p>
<div class="syntax_hilite">
<div id="actionscript-68">
<div class="actionscript">package <span style="color: #66cc66;">&#123;</span></p>
<p>&nbsp; &nbsp; <span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Sprite</span>;<br />
&nbsp; &nbsp; <span style="color: #0066CC;">import</span> flash.<span style="color: #0066CC;">text</span>.<span style="color: #0066CC;">TextField</span>;</p>
<p>&nbsp; &nbsp;<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">//&nbsp; Main class</span></p>
<p>&nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MyFirstProgram <span style="color: #0066CC;">extends</span> Sprite <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> MyFirstProgram<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">var</span> title:<span style="color: #0066CC;">TextField</span> = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">TextField</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; title.<span style="color: #0066CC;">text</span> = <span style="color: #ff0000;">"My first Program!"</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addChild<span style="color: #66cc66;">&#40;</span>title<span style="color: #66cc66;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">var</span> sphericCow:SphericCow = <span style="color: #000000; font-weight: bold;">new</span> SphericCow<span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addChild<span style="color: #66cc66;">&#40;</span> sphericCow <span style="color: #66cc66;">&#41;</span>;</p>
<p>
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span></p>
<p>&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span></p>
<p><span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
<h4>Compilando nuestro programa</h4>
<p>Se compila con:</p>
<div class="syntax_hilite">
<div id="text-69">
<div class="text">/usr/local/bin/flex3/bin/mxmlc MyFirstProgram.as</div>
</div>
</div>
<p></p>
<p>o si lo instalamos en nuestro home:</p>
<div class="syntax_hilite">
<div id="text-70">
<div class="text">$HOME/flex3/bin/mxmlc MyFirstProgram.as</div>
</div>
</div>
<p></p>
<p>El cual creará un archivo <b>MyFirstProgram.swf</b>, el cual podemos arrastrar a nuestro navegador firefox para verlo en acción. Por supuesto, podemos agregar la ruta al archivo .bashrc para evitar el tener que escribir las rutas completas al compilar.</p>

]]></description>
			<content:encoded><![CDATA[<p>En el pasado, programar aplicaciones en Flash significaba un problema para los usuarios de Linux por el poco soporte que daba Macromedia/Adobe. Afortunadamente, las cosas han cambiado un poco debido a que ahora esta disponible un compilador de AS3 en nuestra plataforma favorita. En este post trato brevemente como hacer películas "swf" en Linux desde la línea de comandos:</p>
<h4>Instalación</h4>
<p>1. Bajar el Adobe Flex 3 SDK  de Adobe (flex_sdk_3.zip) de la siguiente URL: <a href="http://www.adobe.com/products/flex/flexdownloads/index.html" onclick="pageTracker._trackPageview('/outgoing/www.adobe.com/products/flex/flexdownloads/index.html?referer=');">http://www.adobe.com/products/flex/flexdownloads/index.html<br />
</A></p>
<p>2. <b>Como usuario root</b>, desempaquetar el archivo flex_sdk_3.zip y poner algunos permisos para que todos los usuarios lo puedan utilizar:</p>
<div class="syntax_hilite">
<div id="text-71">
<div class="text">mkdir /usr/local/bin/flex3<br />
cp flex_sdk_3.zip /usr/local/bin/flex3<br />
cd /usr/local/bin/flex3<br />
unzip flex_sdk_3.zip<br />
chmod a+r * -Rf<br />
chmod a+x bin<br />
chmod a+x bin/*<br />
chmod a+x lib<br />
chmod a+x frameworks<br />
chmod a+x frameworks/libs<br />
chmod a+x frameworks/libs/player<br />
chmod a+x frameworks/locale</div>
</div>
</div>
<p></p>
<p>O bien, si se quiere evitar problemas, <b>como usuario local</b> en su home:</p>
<div class="syntax_hilite">
<div id="text-72">
<div class="text">mkdir flex3<br />
cp flex3_sdk_3.zip flex3<br />
cd flex3<br />
unzip flex3_sdk_3.zip</div>
</div>
</div>
<p></p>
<h4>Escribiendo un programa de prueba</h4>
<p>Para ilustrar la compilación, hacemos un pequeño programa de dos archivos que lo único que hace es desplegar un texto y un circulo en la pantalla. El primer archivo llamado <b>SphericCow.as</b> se encargada de dibujar un círculo negro (sobrecargando la clase "Shape"):</p>
<div class="syntax_hilite">
<div id="actionscript-73">
<div class="actionscript">package <span style="color: #66cc66;">&#123;</span></p>
<p>&nbsp; &nbsp; <span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Shape</span>;</p>
<p>&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">//</span></p>
<p>&nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> SphericCow <span style="color: #0066CC;">extends</span> Shape <span style="color: #66cc66;">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> SphericCow<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; graphics.<span style="color: #0066CC;">beginFill</span><span style="color: #66cc66;">&#40;</span> 0x000000, <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; graphics.<span style="color: #006600;">drawCircle</span><span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">80</span> , <span style="color: #cc66cc;">70</span> , <span style="color: #cc66cc;">30</span> <span style="color: #66cc66;">&#41;</span>; </p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">&#125;</span></p>
<p>&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp;<br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
<p>El segundo archivo, llamado <b>MyFirstProgram.as</b>, es la aplicación en sí, que utiliza nuestra clase anterior y pone también un pequeño texto:</p>
<div class="syntax_hilite">
<div id="actionscript-74">
<div class="actionscript">package <span style="color: #66cc66;">&#123;</span></p>
<p>&nbsp; &nbsp; <span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Sprite</span>;<br />
&nbsp; &nbsp; <span style="color: #0066CC;">import</span> flash.<span style="color: #0066CC;">text</span>.<span style="color: #0066CC;">TextField</span>;</p>
<p>&nbsp; &nbsp;<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">//&nbsp; Main class</span></p>
<p>&nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MyFirstProgram <span style="color: #0066CC;">extends</span> Sprite <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> MyFirstProgram<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">var</span> title:<span style="color: #0066CC;">TextField</span> = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">TextField</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; title.<span style="color: #0066CC;">text</span> = <span style="color: #ff0000;">"My first Program!"</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addChild<span style="color: #66cc66;">&#40;</span>title<span style="color: #66cc66;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">var</span> sphericCow:SphericCow = <span style="color: #000000; font-weight: bold;">new</span> SphericCow<span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addChild<span style="color: #66cc66;">&#40;</span> sphericCow <span style="color: #66cc66;">&#41;</span>;</p>
<p>
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span></p>
<p>&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span></p>
<p><span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p></p>
<h4>Compilando nuestro programa</h4>
<p>Se compila con:</p>
<div class="syntax_hilite">
<div id="text-75">
<div class="text">/usr/local/bin/flex3/bin/mxmlc MyFirstProgram.as</div>
</div>
</div>
<p></p>
<p>o si lo instalamos en nuestro home:</p>
<div class="syntax_hilite">
<div id="text-76">
<div class="text">$HOME/flex3/bin/mxmlc MyFirstProgram.as</div>
</div>
</div>
<p></p>
<p>El cual creará un archivo <b>MyFirstProgram.swf</b>, el cual podemos arrastrar a nuestro navegador firefox para verlo en acción. Por supuesto, podemos agregar la ruta al archivo .bashrc para evitar el tener que escribir las rutas completas al compilar.</p>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/217/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Multimedia en Linux</title>
		<link>http://www.machin.com.mx/archives/85</link>
		<comments>http://www.machin.com.mx/archives/85#comments</comments>
		<pubDate>Tue, 20 Nov 2007 06:47:50 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[Fedora]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/archives/85</guid>
		<description><![CDATA[<p>En este post iré poniendo las instrucciones para instalar las aplicaciones básicas para disfrutar sin problemas de películas y videos en una caja <strong>Fedora</strong>.</p>
<h4>Repositorio livna</h4>
<p><a href="rpm.livna.org">Livna</a> es un excelente repositorio para encontrar rpms de las aplicaciones multimedia que por licencias no se encuentran en los repositorios oficiales. En 2008 se unió a otros repositorios para formar uno nuevo: <a href="rpmfusion.org">RPM Fusion</a>. Sin embargo, el repositorio livna volvió a dar servicio debido a que los responsables de RPM Fusion no quisieron distribuir un paquete por cuestiones legales. De ahí en fuera, los dos repositorios forman parte del mismo trabajo, sólo que livna distribuye únicamente ese paquete.</p>
<div class="syntax_hilite">
<div id="text-77">
<div class="text">rpm -ivh http://rpm.livna.org/livna-release.rpm</div>
</div>
</div>
<p></p>
<h4>Repositorio RPM Fusion</h4>
<p>El repositorio <strong>RPM Fusion</strong> está divido en dos (libres y no libres), por lo que es necesario instalarlo como si fueran dos repositorios: </p>
<div class="syntax_hilite">
<div id="text-78">
<div class="text">rpm -ivh http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm<br />
rpm -ivh http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm</div>
</div>
</div>
<p></p>
<h4>Xine</h4>
<p>Xine es un excelente player para ver videos y archivos de música en varios formatos.</p>
<div class="syntax_hilite">
<div id="text-79">
<div class="text">yum install xine<br />
yum install xine-*<br />
yum install libdvdcss* <span style="">&#40;</span>Si se desea tener suporte para DVD.<span style="">&#41;</span></div>
</div>
</div>
<p></p>
<h4>Real Player</h4>
<p>El Real Player nos permite ver videos en su formato y ver canales de televisión en línea. Requiere como pre-requisito haber instalado las librerías de compatibilidad de c++:</p>
<div class="syntax_hilite">
<div id="text-80">
<div class="text">yum install compat-libstdc++-<span style="">33</span></div>
</div>
</div>
<p></p>
<p>Este se puedo obtener de:</p>
<p><a href"http://www.real.com/linux/">http://www.real.com/linux/</a></p>
<h4>Flash Player</h4>
<div class="syntax_hilite">
<div id="text-81">
<div class="text">rpm -Uvh http://linuxdownload.adobe.com/adobe-release/adobe-release-i386-<span style="">1</span>.<span style="">0</span>-<span style="">1</span>.noarch.rpm</div>
</div>
</div>
<p></p>
<div class="syntax_hilite">
<div id="text-82">
<div class="text">yum install flash-plugin</div>
</div>
</div>
<p></p>
<h4>Protectores de pantalla OpenGL</h4>
<p>Casi siempre me falta instalar los protectores de pantalla OpenGL que son muy llamativos y dejan a las visitas impresionados.</p>
<div class="syntax_hilite">
<div id="text-83">
<div class="text">yum install xscreensaver*</div>
</div>
</div>
<p></p>

]]></description>
			<content:encoded><![CDATA[<p>En este post iré poniendo las instrucciones para instalar las aplicaciones básicas para disfrutar sin problemas de películas y videos en una caja <strong>Fedora</strong>.</p>
<h4>Repositorio livna</h4>
<p><a href="rpm.livna.org">Livna</a> es un excelente repositorio para encontrar rpms de las aplicaciones multimedia que por licencias no se encuentran en los repositorios oficiales. En 2008 se unió a otros repositorios para formar uno nuevo: <a href="rpmfusion.org">RPM Fusion</a>. Sin embargo, el repositorio livna volvió a dar servicio debido a que los responsables de RPM Fusion no quisieron distribuir un paquete por cuestiones legales. De ahí en fuera, los dos repositorios forman parte del mismo trabajo, sólo que livna distribuye únicamente ese paquete.</p>
<div class="syntax_hilite">
<div id="text-84">
<div class="text">rpm -ivh http://rpm.livna.org/livna-release.rpm</div>
</div>
</div>
<p></p>
<h4>Repositorio RPM Fusion</h4>
<p>El repositorio <strong>RPM Fusion</strong> está divido en dos (libres y no libres), por lo que es necesario instalarlo como si fueran dos repositorios: </p>
<div class="syntax_hilite">
<div id="text-85">
<div class="text">rpm -ivh http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm<br />
rpm -ivh http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm</div>
</div>
</div>
<p></p>
<h4>Xine</h4>
<p>Xine es un excelente player para ver videos y archivos de música en varios formatos.</p>
<div class="syntax_hilite">
<div id="text-86">
<div class="text">yum install xine<br />
yum install xine-*<br />
yum install libdvdcss* <span style="">&#40;</span>Si se desea tener suporte para DVD.<span style="">&#41;</span></div>
</div>
</div>
<p></p>
<h4>Real Player</h4>
<p>El Real Player nos permite ver videos en su formato y ver canales de televisión en línea. Requiere como pre-requisito haber instalado las librerías de compatibilidad de c++:</p>
<div class="syntax_hilite">
<div id="text-87">
<div class="text">yum install compat-libstdc++-<span style="">33</span></div>
</div>
</div>
<p></p>
<p>Este se puedo obtener de:</p>
<p><a href"http://www.real.com/linux/">http://www.real.com/linux/</a></p>
<h4>Flash Player</h4>
<div class="syntax_hilite">
<div id="text-88">
<div class="text">rpm -Uvh http://linuxdownload.adobe.com/adobe-release/adobe-release-i386-<span style="">1</span>.<span style="">0</span>-<span style="">1</span>.noarch.rpm</div>
</div>
</div>
<p></p>
<div class="syntax_hilite">
<div id="text-89">
<div class="text">yum install flash-plugin</div>
</div>
</div>
<p></p>
<h4>Protectores de pantalla OpenGL</h4>
<p>Casi siempre me falta instalar los protectores de pantalla OpenGL que son muy llamativos y dejan a las visitas impresionados.</p>
<div class="syntax_hilite">
<div id="text-90">
<div class="text">yum install xscreensaver*</div>
</div>
</div>
<p></p>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/85/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jaulas</title>
		<link>http://www.machin.com.mx/archives/132</link>
		<comments>http://www.machin.com.mx/archives/132#comments</comments>
		<pubDate>Mon, 20 Aug 2007 08:15:29 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[Fedora]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/?p=132</guid>
		<description><![CDATA[<p>Las jaulas es un interesante procedimiento para encerrar a un usuario dentro de un directorio, el cual ve como una "máquina virtual" para él sólo. En este post pongo el procedimiento paso a paso que use hace algunos años para hacer una jaula. Lo pongo así por fines didacticos porque sin duda, hacer un script es el mejor procedimiento para trabajo de día tras día.</p>
<h4>Procedimiento paso a paso</h4>
<p>Se hace el directorio donde se va contener la jaula:</p>
<div class="syntax_hilite">
<div id="text-91">
<div class="text">mkdir /jails/user_name -p</div>
</div>
</div>
<p></p>
<p>Se crea el usuario a estar enjaulado y se le asigna una contraseña:</p>
<div class="syntax_hilite">
<div id="text-92">
<div class="text">useradd -d /home -s /bin/bash -g user_group user_name<br />
passwd user_name</div>
</div>
</div>
<p></p>
<p>user_group por lo general es el grupo users.</p>
<p>Agregar la siguiente línea a /etc/pam.d/sshd para permitir que el usuario se pueda logear por ssh:</p>
<div class="syntax_hilite">
<div id="text-93">
<div class="text">session&nbsp; &nbsp; required&nbsp; &nbsp; &nbsp;pam_chroot.so</div>
</div>
</div>
<p></p>
<p>Sólo por verificar el archivo /etc/ssh/sshd_config debe tener:</p>
<div class="syntax_hilite">
<div id="text-94">
<div class="text">UsePAM yes<br />
UsePrivilegeSeparation no</div>
</div>
</div>
<p></p>
<p>En el directorio /etc/security/chroot.conf se declara al usuario y la ruta a su jaula de la siguiente forma:</p>
<div class="syntax_hilite">
<div id="text-95">
<div class="text">user_name&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;/jails/user_name</div>
</div>
</div>
<p></p>
<p>Se crea el directorio temporal:</p>
<div class="syntax_hilite">
<div id="text-96">
<div class="text">mkdir /jails/user_name/tmp<br />
chmod <span style="">777</span> /jails/user_name/tmp<br />
chmod +t /jails/user_name/tmp</div>
</div>
</div>
<p></p>
<p>Se crea el directorio de devices:</p>
<div class="syntax_hilite">
<div id="text-97">
<div class="text">mkdir /jails/user_name/dev<br />
mknod -m <span style="">0666</span> /jails/user_name/dev/tty c <span style="">5</span> <span style="">0</span><br />
mknod -m <span style="">0644</span> /jails/user_name/dev/urandom c <span style="">1</span> <span style="">9</span><br />
mknod -m <span style="">0666</span> /jails/user_name/dev/null c <span style="">1</span> <span style="">3</span><br />
mknod -m <span style="">0666</span> /jails/user_name/dev/zero c <span style="">1</span> <span style="">12</span></div>
</div>
</div>
<p></p>
<p>Se crea el directorio home:</p>
<div class="syntax_hilite">
<div id="text-98">
<div class="text">mkdir /jails/user_name/home<br />
chown user_name:user_group /jails/user_name/home<br />
chmod <span style="">711</span> /jails/user_name/home</div>
</div>
</div>
<p></p>
<p>Se crea el directorio bin y se le copian varios comandos externos útiles:</p>
<div class="syntax_hilite">
<div id="text-99">
<div class="text">mkdir /jails/user_name/bin<br />
cd /bin; cp bash cat chmod cp ln ls hostname mkdir mv \<br />
rm rmdir tar touch&nbsp; /jails/user_name/bin</div>
</div>
</div>
<p></p>
<p>Se crea el directorio etc:</p>
<div class="syntax_hilite">
<div id="text-100">
<div class="text">mkdir /jails/user_name/etc<br />
cd /etc; cp DIR_COLORS hosts profile /jails/user_name/etc</div>
</div>
</div>
<p></p>
<p>Se crean los archivos de contraseñas</p>
<div class="syntax_hilite">
<div id="text-101">
<div class="text">cat /etc/passwd|grep ^root&gt; /jails/user_name/etc/passwd<br />
cat /etc/passwd|grep ^user_name&gt;&gt; /jails/user_name/etc/passwd<br />
cat /etc/group|grep ^root&gt;&nbsp; /jails/user_name/etc/group<br />
cat /etc/group|grep ^user_name&gt;&gt; /jails/user_name/etc/group</div>
</div>
</div>
<p></p>
<div class="syntax_hilite">
<div id="text-102">
<div class="text">mkdir /jails/user_name/lib<br />
cd /lib; cp ld-linux.so.<span style="">2</span> libc.so.<span style="">6</span>&nbsp; <br />
&nbsp; &nbsp;libcrypt.so.<span style="">1</span> libdl.so.<span style="">2</span> libm.so.<span style="">6</span> <br />
&nbsp; &nbsp;libncurses.so.<span style="">5</span> libnsl.so.<span style="">1</span> libnss_compat.so.<span style="">2</span> <br />
&nbsp; &nbsp;libnss_dns.so.<span style="">2</span> libnss_files.so.<span style="">2</span> libpam.so.<span style="">0</span> <br />
&nbsp; &nbsp;libpam_misc.so.<span style="">0</span> libpthread.so.<span style="">0</span> <br />
&nbsp; &nbsp;libresolv.so.<span style="">2</span> librt.so.<span style="">1</span> libselinux.so.<span style="">1</span> libsepol.so.<span style="">1</span> libutil.so.<span style="">1</span> libwrap.so.<span style="">0</span> <br />
&nbsp; &nbsp;libz.so.<span style="">1</span> /jails/user_name/lib</div>
</div>
</div>
<p></p>
<p>Se puede probar que todo funciona con:</p>
<div class="syntax_hilite">
<div id="text-103">
<div class="text">ssh user_name@localhost</div>
</div>
</div>
<p></p>

]]></description>
			<content:encoded><![CDATA[<p>Las jaulas es un interesante procedimiento para encerrar a un usuario dentro de un directorio, el cual ve como una "máquina virtual" para él sólo. En este post pongo el procedimiento paso a paso que use hace algunos años para hacer una jaula. Lo pongo así por fines didacticos porque sin duda, hacer un script es el mejor procedimiento para trabajo de día tras día.</p>
<h4>Procedimiento paso a paso</h4>
<p>Se hace el directorio donde se va contener la jaula:</p>
<div class="syntax_hilite">
<div id="text-104">
<div class="text">mkdir /jails/user_name -p</div>
</div>
</div>
<p></p>
<p>Se crea el usuario a estar enjaulado y se le asigna una contraseña:</p>
<div class="syntax_hilite">
<div id="text-105">
<div class="text">useradd -d /home -s /bin/bash -g user_group user_name<br />
passwd user_name</div>
</div>
</div>
<p></p>
<p>user_group por lo general es el grupo users.</p>
<p>Agregar la siguiente línea a /etc/pam.d/sshd para permitir que el usuario se pueda logear por ssh:</p>
<div class="syntax_hilite">
<div id="text-106">
<div class="text">session&nbsp; &nbsp; required&nbsp; &nbsp; &nbsp;pam_chroot.so</div>
</div>
</div>
<p></p>
<p>Sólo por verificar el archivo /etc/ssh/sshd_config debe tener:</p>
<div class="syntax_hilite">
<div id="text-107">
<div class="text">UsePAM yes<br />
UsePrivilegeSeparation no</div>
</div>
</div>
<p></p>
<p>En el directorio /etc/security/chroot.conf se declara al usuario y la ruta a su jaula de la siguiente forma:</p>
<div class="syntax_hilite">
<div id="text-108">
<div class="text">user_name&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;/jails/user_name</div>
</div>
</div>
<p></p>
<p>Se crea el directorio temporal:</p>
<div class="syntax_hilite">
<div id="text-109">
<div class="text">mkdir /jails/user_name/tmp<br />
chmod <span style="">777</span> /jails/user_name/tmp<br />
chmod +t /jails/user_name/tmp</div>
</div>
</div>
<p></p>
<p>Se crea el directorio de devices:</p>
<div class="syntax_hilite">
<div id="text-110">
<div class="text">mkdir /jails/user_name/dev<br />
mknod -m <span style="">0666</span> /jails/user_name/dev/tty c <span style="">5</span> <span style="">0</span><br />
mknod -m <span style="">0644</span> /jails/user_name/dev/urandom c <span style="">1</span> <span style="">9</span><br />
mknod -m <span style="">0666</span> /jails/user_name/dev/null c <span style="">1</span> <span style="">3</span><br />
mknod -m <span style="">0666</span> /jails/user_name/dev/zero c <span style="">1</span> <span style="">12</span></div>
</div>
</div>
<p></p>
<p>Se crea el directorio home:</p>
<div class="syntax_hilite">
<div id="text-111">
<div class="text">mkdir /jails/user_name/home<br />
chown user_name:user_group /jails/user_name/home<br />
chmod <span style="">711</span> /jails/user_name/home</div>
</div>
</div>
<p></p>
<p>Se crea el directorio bin y se le copian varios comandos externos útiles:</p>
<div class="syntax_hilite">
<div id="text-112">
<div class="text">mkdir /jails/user_name/bin<br />
cd /bin; cp bash cat chmod cp ln ls hostname mkdir mv \<br />
rm rmdir tar touch&nbsp; /jails/user_name/bin</div>
</div>
</div>
<p></p>
<p>Se crea el directorio etc:</p>
<div class="syntax_hilite">
<div id="text-113">
<div class="text">mkdir /jails/user_name/etc<br />
cd /etc; cp DIR_COLORS hosts profile /jails/user_name/etc</div>
</div>
</div>
<p></p>
<p>Se crean los archivos de contraseñas</p>
<div class="syntax_hilite">
<div id="text-114">
<div class="text">cat /etc/passwd|grep ^root&gt; /jails/user_name/etc/passwd<br />
cat /etc/passwd|grep ^user_name&gt;&gt; /jails/user_name/etc/passwd<br />
cat /etc/group|grep ^root&gt;&nbsp; /jails/user_name/etc/group<br />
cat /etc/group|grep ^user_name&gt;&gt; /jails/user_name/etc/group</div>
</div>
</div>
<p></p>
<div class="syntax_hilite">
<div id="text-115">
<div class="text">mkdir /jails/user_name/lib<br />
cd /lib; cp ld-linux.so.<span style="">2</span> libc.so.<span style="">6</span>&nbsp; <br />
&nbsp; &nbsp;libcrypt.so.<span style="">1</span> libdl.so.<span style="">2</span> libm.so.<span style="">6</span> <br />
&nbsp; &nbsp;libncurses.so.<span style="">5</span> libnsl.so.<span style="">1</span> libnss_compat.so.<span style="">2</span> <br />
&nbsp; &nbsp;libnss_dns.so.<span style="">2</span> libnss_files.so.<span style="">2</span> libpam.so.<span style="">0</span> <br />
&nbsp; &nbsp;libpam_misc.so.<span style="">0</span> libpthread.so.<span style="">0</span> <br />
&nbsp; &nbsp;libresolv.so.<span style="">2</span> librt.so.<span style="">1</span> libselinux.so.<span style="">1</span> libsepol.so.<span style="">1</span> libutil.so.<span style="">1</span> libwrap.so.<span style="">0</span> <br />
&nbsp; &nbsp;libz.so.<span style="">1</span> /jails/user_name/lib</div>
</div>
</div>
<p></p>
<p>Se puede probar que todo funciona con:</p>
<div class="syntax_hilite">
<div id="text-116">
<div class="text">ssh user_name@localhost</div>
</div>
</div>
<p></p>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/132/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bluetooth en Linux</title>
		<link>http://www.machin.com.mx/archives/126</link>
		<comments>http://www.machin.com.mx/archives/126#comments</comments>
		<pubDate>Sat, 28 Jul 2007 07:56:09 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[Fedora]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Videojuegos]]></category>
		<category><![CDATA[Bluetooth]]></category>
		<category><![CDATA[videojuegos]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/?p=126</guid>
		<description><![CDATA[<p>Actualmente, muchos dispositivos personales como palms y celulares incluyen entre sus funcionalidades el poder interconectarse por medio de la tecnología inalámbrica Bluetooth.  Afortunadamente, hay muy pocas cosas de que preocuparse, porque al menosd desde Fedora 7 tiene soporte completo de bluetooth por medio de la pila de protocolos para Linux <a href="http://www.bluez.org" onclick="pageTracker._trackPageview('/outgoing/www.bluez.org?referer=');">Bluez</a>.</p>
<p>Como utilizo un servidor Dell para trabajar con Linux, este no incluía alguna interfaz Bluetooth de fábrica; por lo que la solución más sencilla y económica para agregarle esta capacidad fue comprar un adaptador USB Bluetooth. </p>
<p>Una vez enchufado (sin necesidad de reiniciar la máquina), se puede revisar su presencia con el siguiente comando:</p>
<div class="syntax_hilite">
<div id="text-117">
<div class="text"><span style="">&#91;</span>root@linux renato<span style="">&#93;</span># /sbin/lsusb</p>
<p>Bus <span style="">002</span> Device <span style="">001</span>: ID <span style="">0000</span>:<span style="">0000</span>&nbsp; <br />
Bus <span style="">005</span> Device <span style="">001</span>: ID <span style="">0000</span>:<span style="">0000</span>&nbsp; <br />
Bus <span style="">004</span> Device <span style="">001</span>: ID <span style="">0000</span>:<span style="">0000</span>&nbsp; <br />
Bus <span style="">003</span> Device <span style="">002</span>: ID <span style="">1131</span>:<span style="">1001</span> Integrated System Solution Corp. KY-BT100 Bluetooth Adapter<br />
Bus <span style="">003</span> Device <span style="">001</span>: ID <span style="">0000</span>:<span style="">0000</span>&nbsp; <br />
Bus <span style="">001</span> Device <span style="">004</span>: ID 045e:<span style="">0084</span> Microsoft Corp. <br />
Bus <span style="">001</span> Device <span style="">005</span>: ID 413c:<span style="">2003</span> Dell Computer Corp. <br />
Bus <span style="">001</span> Device <span style="">001</span>: ID <span style="">0000</span>:<span style="">0000</span></div>
</div>
</div>
<p></p>
<h4>Utilerías de línea de comando:</h4>
<p>El paquete bluez-utils contiene todas las herramientas que necesitamos para obtener o configurar nuestros dispositivos bluetooth. Algunas de ellas son:</p>
<p>- hciconfig<br />
- hcitool<br />
- hciattach<br />
- hcid<br />
- l2ping</p>
<p><strong>hciconfig</strong></p>
<p>Este comando se utiliza para configurar y obtener información de los adaptadores Bluetooth que tenemos conectados (obviamente, por lo general es uno). Para obtener la información de nuestro adaptador hacemos lo siguiente:</p>
<div class="syntax_hilite">
<div id="text-118">
<div class="text">/usr/sbin/hciconfig -a</p>
<p>hci0:&nbsp; &nbsp;Type: USB<br />
&nbsp; &nbsp; &nbsp; &nbsp; BD Address: <span style="">11</span>:<span style="">11</span>:<span style="">11</span>:<span style="">11</span>:<span style="">11</span>:<span style="">11</span> ACL MTU: <span style="">678</span>:<span style="">8</span> SCO MTU: <span style="">48</span>:<span style="">10</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; UP RUNNING PSCAN ISCAN <br />
&nbsp; &nbsp; &nbsp; &nbsp; RX bytes:<span style="">1987</span> acl:<span style="">0</span> sco:<span style="">0</span> events:<span style="">57</span> errors:<span style="">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; TX bytes:<span style="">723</span> acl:<span style="">0</span> sco:<span style="">0</span> commands:<span style="">52</span> errors:<span style="">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; Features: 0xbf 0xfe 0x8d 0x78 0x08 0x18 0x00 0x00<br />
&nbsp; &nbsp; &nbsp; &nbsp; Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 <br />
&nbsp; &nbsp; &nbsp; &nbsp; Link policy: RSWITCH HOLD SNIFF PARK <br />
&nbsp; &nbsp; &nbsp; &nbsp; Link mode: SLAVE ACCEPT <br />
&nbsp; &nbsp; &nbsp; &nbsp; Name: 'Linux home'<br />
&nbsp; &nbsp; &nbsp; &nbsp; Class: 0x120104<br />
&nbsp; &nbsp; &nbsp; &nbsp; Service Classes: Networking, Object Transfer<br />
&nbsp; &nbsp; &nbsp; &nbsp; Device Class: Computer, Desktop workstation<br />
&nbsp; &nbsp; &nbsp; &nbsp; HCI Ver: <span style="">1</span>.<span style="">2</span> <span style="">&#40;</span>0x2<span style="">&#41;</span> HCI Rev: 0x1fe LMP Ver: <span style="">1</span>.<span style="">2</span> <span style="">&#40;</span>0x2<span style="">&#41;</span> LMP Subver: 0x1fe<br />
&nbsp; &nbsp; &nbsp; &nbsp; Manufacturer: Integrated System Solution Corp. <span style="">&#40;</span><span style="">57</span><span style="">&#41;</span></div>
</div>
</div>
<p></p>
<p>Desafortunadamente, desde aquí pude ver que no es muy recomendable el adaptador que compré porque de fábrica le programaron una dirección BD inválida a todos sus adaptadores Bluetooth: 11:11:11:11:11:11. Esto es realmente raro porque la compañía china que lo produjo si aparece registrada ante la IEEE y desafortunado porque se supone que esa dirección es única y puede haber conflictos si se usan dos o más de estos dispositivos al mismo tiempo. Aunque el adaptador funciona correctamente, algo en mi interior me dice que compré un producto pirata o que fue retirado del mercado por esa razón. </p>
<p>En <a href="http://standards.ieee.org/regauth/oui/index.shtml" onclick="pageTracker._trackPageview('/outgoing/standards.ieee.org/regauth/oui/index.shtml?referer=');">http://standards.ieee.org/regauth/oui/index.shtml</a> se puede consultar el identificador OUI en la base de datos de la IEEE, el cual se utiliza en las primeras tres cifras de la dirección BD. Curiosamente los identificadores de mi celular y del wiimote si aparecen, pero no así la de mi palm. ¡Benditas estandarizaciones!</p>
<p><strong>hcitool</strong></p>
<p>Siguiendo con cosas menos tristes, el comando para encontrar  dispositivos Bluetooth a nuestro alredor es:</p>
<div class="syntax_hilite">
<div id="text-119">
<div class="text"><span style="">&#91;</span>renato@linux renato<span style="">&#93;</span># hcitool scan<br />
Scanning ...<br />
&nbsp; &nbsp; &nbsp; &nbsp; XX:XX:XX:XX:XX:XX&nbsp; &nbsp; &nbsp; &nbsp;Palm Jorge Machin <br />
&nbsp; &nbsp; &nbsp; &nbsp; XX:XX:XX:XX:XX:XX&nbsp; &nbsp; &nbsp; &nbsp;Telefono Jorge Machin <br />
&nbsp; &nbsp; &nbsp; &nbsp; XX:XX:XX:XX:XX:XX&nbsp; &nbsp; &nbsp; &nbsp;Nintendo RVL-CNT-<span style="">01</span></div>
</div>
</div>
<p></p>
<h4>Applets de gnome:</h4>
<p><strong>próximamente</strong></p>
<h4>Wii Remote en Linux:</h4>
<p>Para poder usar el control remoto de la consola de juegos wii de Nintendo (aka wiimote), se puede usar un script de python llamado WMD (Wiiwanna Motte Dammiit!) desarrollado por Francois A. Bradet y amigos. El funcionamiento consiste esencialmente en direccionar los comandos del wiimote al teclado y al ratón  para poderlo usar en los juegos existentes en Linux.</p>
<p><strong>Prerequisitos</strong></p>
<p>Para poderlo instalar, es necesario tener los siguientes programas previamente instalados:</p>
<p>- Las librerias de desarrollo de BlueZ </p>
<div class="syntax_hilite">
<div id="text-120">
<div class="text">yum install bluez-libs-devel</div>
</div>
</div>
<p></p>
<p>- Librería pybluez para python</p>
<div class="syntax_hilite">
<div id="text-121">
<div class="text">wget http://org.csail.mit.edu/pybluez/release/pybluez-src-<span style="">0</span>.<span style="">14</span>.tar.gz<br />
tar -xvzf pybluez-<span style="">0</span>.<span style="">14</span>.tar.gz<br />
cd pybluez-<span style="">0</span>.<span style="">14</span><br />
python setup.py install</div>
</div>
</div>
<p></p>
<p>- python-xlib</p>
<div class="syntax_hilite">
<div id="text-122">
<div class="text">yum install python-xlib</div>
</div>
</div>
<p></p>
<p>Para evitar errores se recomienda aumentar el tamaño del buffer del socket cambiando:</p>
<div class="syntax_hilite">
<div id="text-123">
<div class="text">recv = self.socket.recv<span style="">&#40;</span><span style="">2048</span><span style="">&#41;</span></div>
</div>
</div>
<p></p>
<p>a lo siguiente</p>
<div class="syntax_hilite">
<div id="text-124">
<div class="text">recv = self.socket.recv<span style="">&#40;</span><span style="">4096</span><span style="">&#41;</span></div>
</div>
</div>
<p></p>
<p>en el archivo  /usr/lib/python2.5/site-packages/Xlib/protocol/display.py.</p>
<p><strong>Instalación:</strong></p>
<p>La versión más actualiza de GDM se baja por medio de svn:</p>
<div class="syntax_hilite">
<div id="text-125">
<div class="text">svn co https://svn.forthewiin.org/wmd/trunk/ wmd-trunk</div>
</div>
</div>
<p></p>
<p>Aquí no se compila nada porque son programas escritos en python. Para probar que todo este funcionando correctamente o para usar el wiimote como un ratón se hace los siguiente:</p>
<div class="syntax_hilite">
<div id="text-126">
<div class="text"><span style="">&#91;</span>renato@linux wmd-trunk<span style="">&#93;</span>#/sbin/modprobe uinput<br />
<span style="">&#91;</span>renato@linux wmd-trunk<span style="">&#93;</span># xhost +<br />
<span style="">&#91;</span>renato@linux wmd-trunk<span style="">&#93;</span># python WMD.py <br />
uinput: Attempting to autodetect device file<br />
uinput: /dev/misc/uinput isn't a usable uinput device file<br />
uinput: autodetection chose /dev/input/uinput as uinput device file<br />
uinput: Trying to open /dev/input/uinput as control device<br />
uinput: Writing WIIMOTE_UUD<br />
uinput: Registering <span style="">31</span> events<br />
uinput: Creating device<br />
uinput: initialized and ready<br />
CONNECTING<br />
Looking for Wiimote services at address <span style="">00</span>:<span style="">17</span>:AB:<span style="">36</span>:<span style="">09</span>:<span style="">52</span><br />
Failure. We have not found that Wiimote.<br />
Now trying to discover a willing Wiimote, please activate your Wiimote within <span style="">5</span> seconds.<br />
Found <span style="">2</span> Bluetooth Devices!<br />
Found a Wiimote at address XX:XX:XX:XX:XX:XX<br />
Looking for Wiimote services at address XX:XX:XX:XX:XX:XX<br />
Victory! We have found that Wiimote!<br />
We are now connected to Wiimote at address XX:XX:XX:XX:XX:XX<br />
CONNECTED</div>
</div>
</div>
<p></p>
<p>Cuando aparezca el letrero "Now trying to discover a willing Wiimote, please activate your Wiimote within 5 seconds." se debe presionar al mismo tiempo los botones 1 y2 del wiimote o bien presionar el botón sync que se encuentra en el compartimiento de las pilas para poner al wiimote en modo detectable.</p>
<p align="center">
<object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/SnO_-6WBMGg"></param><embed src="http://www.youtube.com/v/SnO_-6WBMGg" type="application/x-shockwave-flash" width="425" height="350"></embed></object><br />
<strong>Probando Unreal Tournament 2004 con el wiimote</strong>
</p>
<p>Desafortunadamente, el WMD parece estar muy enfocado a ser un "ratón inalámbrico" y el código está bastante desordenado y confuso (el mismo autor lo reconoce) por lo que para usarlo en alguna aplicación es necesario invertir algo de tiempo en el código fuente para ver como funciona. Danigm, un usuario de Linux y amante de los comics, se tomó la molestia de  escarbar en el código de WMD para hacer un <a href="http://danigm.blogspot.com/2007/06/wiimote-en-linux.html" onclick="pageTracker._trackPageview('/outgoing/danigm.blogspot.com/2007/06/wiimote-en-linux.html?referer=');">tutorial</a> donde incluye un esqueleto de como se podrían manejar las clases de WMD con una utilería UNIX (xsendkeycode) para usar el teclado con el control Wii.</p>
<p>Xsendkeycode se encuentra dentro del paquete lineakd, si no lo tiene instalado se puede recurrir a yum:</p>
<div class="syntax_hilite">
<div id="text-127">
<div class="text">yum install lineakd</div>
</div>
</div>
<p></p>
<p>Para jugar Unreal Tournament 2004, modifique ligeramente el ejemplo de Danigm para que quedara de la siguiente forma:</p>
<div class="syntax_hilite">
<div id="python-128">
<div class="python"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span><br />
<span style="color: #dc143c;">sys</span>.<span style="color: black;">path</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'.'</span><span style="color: black;">&#41;</span></p>
<p><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span></p>
<p>
<span style="color: #ff7700;font-weight:bold;">from</span> wmd.<span style="color: black;">Common</span> <span style="color: #ff7700;font-weight:bold;">import</span> *<br />
<span style="color: #ff7700;font-weight:bold;">from</span> wmd.<span style="color: black;">Config</span> <span style="color: #ff7700;font-weight:bold;">import</span> CFG<br />
<span style="color: #ff7700;font-weight:bold;">from</span> wmd.<span style="color: black;">UI</span>.<span style="color: black;">UIManager</span> <span style="color: #ff7700;font-weight:bold;">import</span> UIManager<br />
<span style="color: #ff7700;font-weight:bold;">from</span> wmd.<span style="color: black;">Wiimote</span>.<span style="color: black;">WMManager</span> <span style="color: #ff7700;font-weight:bold;">import</span> WMManager<br />
<span style="color: #ff7700;font-weight:bold;">from</span> wmd.<span style="color: black;">EVDispatcher</span> <span style="color: #ff7700;font-weight:bold;">import</span> EVDispatcher<br />
<span style="color: #ff7700;font-weight:bold;">from</span> wmd.<span style="color: black;">MotionSensing</span> <span style="color: #ff7700;font-weight:bold;">import</span> MSManager<br />
<span style="color: #ff7700;font-weight:bold;">from</span> wmd.<span style="color: black;">Pointer</span> <span style="color: #ff7700;font-weight:bold;">import</span> POManager<br />
<span style="color: #ff7700;font-weight:bold;">from</span> wmd.<span style="color: black;">CommandMapper</span> <span style="color: #ff7700;font-weight:bold;">import</span> CommandMapper</p>
<p><span style="color: #ff7700;font-weight:bold;">class</span> unrealManager:</p>
<p>&nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span> <span style="color: #008000;">self</span>, cf, ms, ev <span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">cf</span> = cf<br />
&nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">ev</span> = ev<br />
&nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">ms</span> = ms<br />
&nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">ev</span>.<span style="color: black;">subscribe</span><span style="color: black;">&#40;</span> WM_BT, <span style="color: #008000;">self</span>.<span style="color: black;">ev_buttons</span><span style="color: black;">&#41;</span></p>
<p>
&nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">def</span> ev_buttons<span style="color: black;">&#40;</span> <span style="color: #008000;">self</span>, ev <span style="color: black;">&#41;</span>:</p>
<p>&nbsp; &nbsp; &nbsp; button = ev<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; state&nbsp; = ev<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span></p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># This code is only for mnemonics reasons:</span></p>
<p>&nbsp; &nbsp; &nbsp; keyctrl = <span style="color: #ff4500;">9</span></p>
<p>&nbsp; &nbsp; &nbsp; key1 = <span style="color: #ff4500;">10</span><br />
&nbsp; &nbsp; &nbsp; key2 = <span style="color: #ff4500;">11</span><br />
&nbsp; &nbsp; &nbsp; key3 = <span style="color: #ff4500;">12</span><br />
&nbsp; &nbsp; &nbsp; key4 = <span style="color: #ff4500;">13</span><br />
&nbsp; &nbsp; &nbsp; key5 = <span style="color: #ff4500;">14</span><br />
&nbsp; &nbsp; &nbsp; key6 = <span style="color: #ff4500;">15</span><br />
&nbsp; &nbsp; &nbsp; key7 = <span style="color: #ff4500;">16</span><br />
&nbsp; &nbsp; &nbsp; key8 = <span style="color: #ff4500;">17</span><br />
&nbsp; &nbsp; &nbsp; key9 = <span style="color: #ff4500;">18</span></p>
<p>&nbsp; &nbsp; &nbsp; keyq = <span style="color: #ff4500;">24</span><br />
&nbsp; &nbsp; &nbsp; keyw = <span style="color: #ff4500;">25</span><br />
&nbsp; &nbsp; &nbsp; keye = <span style="color: #ff4500;">26</span><br />
&nbsp; &nbsp; &nbsp; keyr = <span style="color: #ff4500;">27</span><br />
&nbsp; &nbsp; &nbsp; keyt = <span style="color: #ff4500;">28</span><br />
&nbsp; &nbsp; &nbsp; keyy = <span style="color: #ff4500;">29</span><br />
&nbsp; &nbsp; &nbsp; keyu = <span style="color: #ff4500;">30</span><br />
&nbsp; &nbsp; &nbsp; keyi = <span style="color: #ff4500;">31</span><br />
&nbsp; &nbsp; &nbsp; keyo = <span style="color: #ff4500;">32</span><br />
&nbsp; &nbsp; &nbsp; keyp = <span style="color: #ff4500;">33</span><br />
&nbsp; <br />
&nbsp; &nbsp; &nbsp; keya = <span style="color: #ff4500;">38</span><br />
&nbsp; &nbsp; &nbsp; keys = <span style="color: #ff4500;">39</span><br />
&nbsp; &nbsp; &nbsp; keyd = <span style="color: #ff4500;">40</span><br />
&nbsp; &nbsp; &nbsp; keyf&nbsp; = <span style="color: #ff4500;">41</span><br />
&nbsp; &nbsp; &nbsp; keyg = <span style="color: #ff4500;">42</span><br />
&nbsp; &nbsp; &nbsp; keyh = <span style="color: #ff4500;">43</span><br />
&nbsp; &nbsp; &nbsp; keyj&nbsp; = <span style="color: #ff4500;">44</span><br />
&nbsp; &nbsp; &nbsp; keyk = <span style="color: #ff4500;">45</span><br />
&nbsp; &nbsp; &nbsp; keyl&nbsp; = <span style="color: #ff4500;">46</span></p>
<p>&nbsp; &nbsp; &nbsp; keyz = <span style="color: #ff4500;">52</span><br />
&nbsp; &nbsp; &nbsp; keyx = <span style="color: #ff4500;">53</span><br />
&nbsp; &nbsp; &nbsp; keyc = <span style="color: #ff4500;">54</span><br />
&nbsp; &nbsp; &nbsp; keyv = <span style="color: #ff4500;">55</span><br />
&nbsp; &nbsp; &nbsp; keyb = <span style="color: #ff4500;">56</span><br />
&nbsp; &nbsp; &nbsp; keyn = <span style="color: #ff4500;">57</span><br />
&nbsp; &nbsp; &nbsp; keym = <span style="color: #ff4500;">58</span></p>
<p>&nbsp; &nbsp; &nbsp; keyspace = <span style="color: #ff4500;">65</span></p>
<p>
&nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> state == <span style="color: #483d8b;">"DOWN"</span>:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">if</span> button == <span style="color: #483d8b;">"+"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyg <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 1"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"-"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyf <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 1"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"H"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyctrl <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 1"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"1"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyspace <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 1"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"2"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyc <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 1"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"U"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyw <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 1"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"D"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keys <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 1"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"L"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keya <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 1"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"R"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyd <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 1"</span><span style="color: black;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">elif</span> state == <span style="color: #483d8b;">"UP"</span>:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">if</span> button == <span style="color: #483d8b;">"+"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyg <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 0"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"-"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyf <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 0"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"H"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyctrl <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 0"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"1"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyspace <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 0"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"2"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyc <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 0"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"U"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyw <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 0"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"D"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keys <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 0"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"L"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keya <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 0"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"R"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyd <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 0"</span><span style="color: black;">&#41;</span></p>
<p>cf = CFG</p>
<p>ev = EVDispatcher<span style="color: black;">&#40;</span>cf<span style="color: black;">&#41;</span></p>
<p>ms = MSManager<span style="color: black;">&#40;</span> cf, ev <span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># Motion analysis</span><br />
po = POManager<span style="color: black;">&#40;</span> cf, ev <span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># Handles the pointer, receives WM_IR, sends out ABS_POS absolute position reports</span><br />
um = unrealManager<span style="color: black;">&#40;</span> cf, ms, ev <span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># Motion analysis</span><br />
cm = CommandMapper<span style="color: black;">&#40;</span> cf, ev <span style="color: black;">&#41;</span></p>
<p><span style="color: #808080; font-style: italic;"># Handles the Wiimote; connects to it, manages wiimote state and mode, parses wiimote reports</span></p>
<p>wm = WMManager<span style="color: black;">&#40;</span>cf, ev<span style="color: black;">&#41;</span></p>
<p>
<span style="color: #ff7700;font-weight:bold;">if</span> wm.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">and</span> wm.<span style="color: black;">setup</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; cycles = wm.<span style="color: black;">main_loop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></p>
<p>wm.<span style="color: black;">disconnect</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div>
</div>
</div>
<p></p>
<p>Obviamente el script le falta bastante trabajo pero seguramente puede servir de guía para programar otros juegos en Linux o para que alguien con más paciencia lo mejore.</p>
<h4>¿Hay algo más?</h4>
<p>Todo este rollo fue únicamente con fines didácticos porque no suelo jugar en Linux aunque hay buenos juegos. Sin duda dejé muchas cosas sin ver, como el manejo de los infrarrojos del wiimote y su bocinita; pero para mí fue suficiente y ya tengo una buena idea de como funcionan estos juguetes. Quizás regrese un día que me sienta nostálgico o por alguna razón tenga la necesidad; para entonces seguramente habrá mejores programas y utilerías... o tal vez sea cuando el Bluetooth pase a ser pieza de museo.</p>
<h4>Otro programa recomendado</h4>
<p>Wminput es un programa escrito en C para hacer la interfase con el wiimote. Es un programa interesante porque muchas de las distribuciones ya lo tienen en su repositorio, por lo que vale la pena revisarlo. Si no lo encuentra en su repositorio favorito, puede obtener las fuentes y más información en: <a href="www.cwiid.org">www.cwiid.org</a>.</p>

]]></description>
			<content:encoded><![CDATA[<p>Actualmente, muchos dispositivos personales como palms y celulares incluyen entre sus funcionalidades el poder interconectarse por medio de la tecnología inalámbrica Bluetooth.  Afortunadamente, hay muy pocas cosas de que preocuparse, porque al menosd desde Fedora 7 tiene soporte completo de bluetooth por medio de la pila de protocolos para Linux <a href="http://www.bluez.org" onclick="pageTracker._trackPageview('/outgoing/www.bluez.org?referer=');">Bluez</a>.</p>
<p>Como utilizo un servidor Dell para trabajar con Linux, este no incluía alguna interfaz Bluetooth de fábrica; por lo que la solución más sencilla y económica para agregarle esta capacidad fue comprar un adaptador USB Bluetooth. </p>
<p>Una vez enchufado (sin necesidad de reiniciar la máquina), se puede revisar su presencia con el siguiente comando:</p>
<div class="syntax_hilite">
<div id="text-129">
<div class="text"><span style="">&#91;</span>root@linux renato<span style="">&#93;</span># /sbin/lsusb</p>
<p>Bus <span style="">002</span> Device <span style="">001</span>: ID <span style="">0000</span>:<span style="">0000</span>&nbsp; <br />
Bus <span style="">005</span> Device <span style="">001</span>: ID <span style="">0000</span>:<span style="">0000</span>&nbsp; <br />
Bus <span style="">004</span> Device <span style="">001</span>: ID <span style="">0000</span>:<span style="">0000</span>&nbsp; <br />
Bus <span style="">003</span> Device <span style="">002</span>: ID <span style="">1131</span>:<span style="">1001</span> Integrated System Solution Corp. KY-BT100 Bluetooth Adapter<br />
Bus <span style="">003</span> Device <span style="">001</span>: ID <span style="">0000</span>:<span style="">0000</span>&nbsp; <br />
Bus <span style="">001</span> Device <span style="">004</span>: ID 045e:<span style="">0084</span> Microsoft Corp. <br />
Bus <span style="">001</span> Device <span style="">005</span>: ID 413c:<span style="">2003</span> Dell Computer Corp. <br />
Bus <span style="">001</span> Device <span style="">001</span>: ID <span style="">0000</span>:<span style="">0000</span></div>
</div>
</div>
<p></p>
<h4>Utilerías de línea de comando:</h4>
<p>El paquete bluez-utils contiene todas las herramientas que necesitamos para obtener o configurar nuestros dispositivos bluetooth. Algunas de ellas son:</p>
<p>- hciconfig<br />
- hcitool<br />
- hciattach<br />
- hcid<br />
- l2ping</p>
<p><strong>hciconfig</strong></p>
<p>Este comando se utiliza para configurar y obtener información de los adaptadores Bluetooth que tenemos conectados (obviamente, por lo general es uno). Para obtener la información de nuestro adaptador hacemos lo siguiente:</p>
<div class="syntax_hilite">
<div id="text-130">
<div class="text">/usr/sbin/hciconfig -a</p>
<p>hci0:&nbsp; &nbsp;Type: USB<br />
&nbsp; &nbsp; &nbsp; &nbsp; BD Address: <span style="">11</span>:<span style="">11</span>:<span style="">11</span>:<span style="">11</span>:<span style="">11</span>:<span style="">11</span> ACL MTU: <span style="">678</span>:<span style="">8</span> SCO MTU: <span style="">48</span>:<span style="">10</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; UP RUNNING PSCAN ISCAN <br />
&nbsp; &nbsp; &nbsp; &nbsp; RX bytes:<span style="">1987</span> acl:<span style="">0</span> sco:<span style="">0</span> events:<span style="">57</span> errors:<span style="">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; TX bytes:<span style="">723</span> acl:<span style="">0</span> sco:<span style="">0</span> commands:<span style="">52</span> errors:<span style="">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; Features: 0xbf 0xfe 0x8d 0x78 0x08 0x18 0x00 0x00<br />
&nbsp; &nbsp; &nbsp; &nbsp; Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 <br />
&nbsp; &nbsp; &nbsp; &nbsp; Link policy: RSWITCH HOLD SNIFF PARK <br />
&nbsp; &nbsp; &nbsp; &nbsp; Link mode: SLAVE ACCEPT <br />
&nbsp; &nbsp; &nbsp; &nbsp; Name: 'Linux home'<br />
&nbsp; &nbsp; &nbsp; &nbsp; Class: 0x120104<br />
&nbsp; &nbsp; &nbsp; &nbsp; Service Classes: Networking, Object Transfer<br />
&nbsp; &nbsp; &nbsp; &nbsp; Device Class: Computer, Desktop workstation<br />
&nbsp; &nbsp; &nbsp; &nbsp; HCI Ver: <span style="">1</span>.<span style="">2</span> <span style="">&#40;</span>0x2<span style="">&#41;</span> HCI Rev: 0x1fe LMP Ver: <span style="">1</span>.<span style="">2</span> <span style="">&#40;</span>0x2<span style="">&#41;</span> LMP Subver: 0x1fe<br />
&nbsp; &nbsp; &nbsp; &nbsp; Manufacturer: Integrated System Solution Corp. <span style="">&#40;</span><span style="">57</span><span style="">&#41;</span></div>
</div>
</div>
<p></p>
<p>Desafortunadamente, desde aquí pude ver que no es muy recomendable el adaptador que compré porque de fábrica le programaron una dirección BD inválida a todos sus adaptadores Bluetooth: 11:11:11:11:11:11. Esto es realmente raro porque la compañía china que lo produjo si aparece registrada ante la IEEE y desafortunado porque se supone que esa dirección es única y puede haber conflictos si se usan dos o más de estos dispositivos al mismo tiempo. Aunque el adaptador funciona correctamente, algo en mi interior me dice que compré un producto pirata o que fue retirado del mercado por esa razón. </p>
<p>En <a href="http://standards.ieee.org/regauth/oui/index.shtml" onclick="pageTracker._trackPageview('/outgoing/standards.ieee.org/regauth/oui/index.shtml?referer=');">http://standards.ieee.org/regauth/oui/index.shtml</a> se puede consultar el identificador OUI en la base de datos de la IEEE, el cual se utiliza en las primeras tres cifras de la dirección BD. Curiosamente los identificadores de mi celular y del wiimote si aparecen, pero no así la de mi palm. ¡Benditas estandarizaciones!</p>
<p><strong>hcitool</strong></p>
<p>Siguiendo con cosas menos tristes, el comando para encontrar  dispositivos Bluetooth a nuestro alredor es:</p>
<div class="syntax_hilite">
<div id="text-131">
<div class="text"><span style="">&#91;</span>renato@linux renato<span style="">&#93;</span># hcitool scan<br />
Scanning ...<br />
&nbsp; &nbsp; &nbsp; &nbsp; XX:XX:XX:XX:XX:XX&nbsp; &nbsp; &nbsp; &nbsp;Palm Jorge Machin <br />
&nbsp; &nbsp; &nbsp; &nbsp; XX:XX:XX:XX:XX:XX&nbsp; &nbsp; &nbsp; &nbsp;Telefono Jorge Machin <br />
&nbsp; &nbsp; &nbsp; &nbsp; XX:XX:XX:XX:XX:XX&nbsp; &nbsp; &nbsp; &nbsp;Nintendo RVL-CNT-<span style="">01</span></div>
</div>
</div>
<p></p>
<h4>Applets de gnome:</h4>
<p><strong>próximamente</strong></p>
<h4>Wii Remote en Linux:</h4>
<p>Para poder usar el control remoto de la consola de juegos wii de Nintendo (aka wiimote), se puede usar un script de python llamado WMD (Wiiwanna Motte Dammiit!) desarrollado por Francois A. Bradet y amigos. El funcionamiento consiste esencialmente en direccionar los comandos del wiimote al teclado y al ratón  para poderlo usar en los juegos existentes en Linux.</p>
<p><strong>Prerequisitos</strong></p>
<p>Para poderlo instalar, es necesario tener los siguientes programas previamente instalados:</p>
<p>- Las librerias de desarrollo de BlueZ </p>
<div class="syntax_hilite">
<div id="text-132">
<div class="text">yum install bluez-libs-devel</div>
</div>
</div>
<p></p>
<p>- Librería pybluez para python</p>
<div class="syntax_hilite">
<div id="text-133">
<div class="text">wget http://org.csail.mit.edu/pybluez/release/pybluez-src-<span style="">0</span>.<span style="">14</span>.tar.gz<br />
tar -xvzf pybluez-<span style="">0</span>.<span style="">14</span>.tar.gz<br />
cd pybluez-<span style="">0</span>.<span style="">14</span><br />
python setup.py install</div>
</div>
</div>
<p></p>
<p>- python-xlib</p>
<div class="syntax_hilite">
<div id="text-134">
<div class="text">yum install python-xlib</div>
</div>
</div>
<p></p>
<p>Para evitar errores se recomienda aumentar el tamaño del buffer del socket cambiando:</p>
<div class="syntax_hilite">
<div id="text-135">
<div class="text">recv = self.socket.recv<span style="">&#40;</span><span style="">2048</span><span style="">&#41;</span></div>
</div>
</div>
<p></p>
<p>a lo siguiente</p>
<div class="syntax_hilite">
<div id="text-136">
<div class="text">recv = self.socket.recv<span style="">&#40;</span><span style="">4096</span><span style="">&#41;</span></div>
</div>
</div>
<p></p>
<p>en el archivo  /usr/lib/python2.5/site-packages/Xlib/protocol/display.py.</p>
<p><strong>Instalación:</strong></p>
<p>La versión más actualiza de GDM se baja por medio de svn:</p>
<div class="syntax_hilite">
<div id="text-137">
<div class="text">svn co https://svn.forthewiin.org/wmd/trunk/ wmd-trunk</div>
</div>
</div>
<p></p>
<p>Aquí no se compila nada porque son programas escritos en python. Para probar que todo este funcionando correctamente o para usar el wiimote como un ratón se hace los siguiente:</p>
<div class="syntax_hilite">
<div id="text-138">
<div class="text"><span style="">&#91;</span>renato@linux wmd-trunk<span style="">&#93;</span>#/sbin/modprobe uinput<br />
<span style="">&#91;</span>renato@linux wmd-trunk<span style="">&#93;</span># xhost +<br />
<span style="">&#91;</span>renato@linux wmd-trunk<span style="">&#93;</span># python WMD.py <br />
uinput: Attempting to autodetect device file<br />
uinput: /dev/misc/uinput isn't a usable uinput device file<br />
uinput: autodetection chose /dev/input/uinput as uinput device file<br />
uinput: Trying to open /dev/input/uinput as control device<br />
uinput: Writing WIIMOTE_UUD<br />
uinput: Registering <span style="">31</span> events<br />
uinput: Creating device<br />
uinput: initialized and ready<br />
CONNECTING<br />
Looking for Wiimote services at address <span style="">00</span>:<span style="">17</span>:AB:<span style="">36</span>:<span style="">09</span>:<span style="">52</span><br />
Failure. We have not found that Wiimote.<br />
Now trying to discover a willing Wiimote, please activate your Wiimote within <span style="">5</span> seconds.<br />
Found <span style="">2</span> Bluetooth Devices!<br />
Found a Wiimote at address XX:XX:XX:XX:XX:XX<br />
Looking for Wiimote services at address XX:XX:XX:XX:XX:XX<br />
Victory! We have found that Wiimote!<br />
We are now connected to Wiimote at address XX:XX:XX:XX:XX:XX<br />
CONNECTED</div>
</div>
</div>
<p></p>
<p>Cuando aparezca el letrero "Now trying to discover a willing Wiimote, please activate your Wiimote within 5 seconds." se debe presionar al mismo tiempo los botones 1 y2 del wiimote o bien presionar el botón sync que se encuentra en el compartimiento de las pilas para poner al wiimote en modo detectable.</p>
<p align="center">
<object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/SnO_-6WBMGg"></param><embed src="http://www.youtube.com/v/SnO_-6WBMGg" type="application/x-shockwave-flash" width="425" height="350"></embed></object><br />
<strong>Probando Unreal Tournament 2004 con el wiimote</strong>
</p>
<p>Desafortunadamente, el WMD parece estar muy enfocado a ser un "ratón inalámbrico" y el código está bastante desordenado y confuso (el mismo autor lo reconoce) por lo que para usarlo en alguna aplicación es necesario invertir algo de tiempo en el código fuente para ver como funciona. Danigm, un usuario de Linux y amante de los comics, se tomó la molestia de  escarbar en el código de WMD para hacer un <a href="http://danigm.blogspot.com/2007/06/wiimote-en-linux.html" onclick="pageTracker._trackPageview('/outgoing/danigm.blogspot.com/2007/06/wiimote-en-linux.html?referer=');">tutorial</a> donde incluye un esqueleto de como se podrían manejar las clases de WMD con una utilería UNIX (xsendkeycode) para usar el teclado con el control Wii.</p>
<p>Xsendkeycode se encuentra dentro del paquete lineakd, si no lo tiene instalado se puede recurrir a yum:</p>
<div class="syntax_hilite">
<div id="text-139">
<div class="text">yum install lineakd</div>
</div>
</div>
<p></p>
<p>Para jugar Unreal Tournament 2004, modifique ligeramente el ejemplo de Danigm para que quedara de la siguiente forma:</p>
<div class="syntax_hilite">
<div id="python-140">
<div class="python"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span><br />
<span style="color: #dc143c;">sys</span>.<span style="color: black;">path</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'.'</span><span style="color: black;">&#41;</span></p>
<p><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span></p>
<p>
<span style="color: #ff7700;font-weight:bold;">from</span> wmd.<span style="color: black;">Common</span> <span style="color: #ff7700;font-weight:bold;">import</span> *<br />
<span style="color: #ff7700;font-weight:bold;">from</span> wmd.<span style="color: black;">Config</span> <span style="color: #ff7700;font-weight:bold;">import</span> CFG<br />
<span style="color: #ff7700;font-weight:bold;">from</span> wmd.<span style="color: black;">UI</span>.<span style="color: black;">UIManager</span> <span style="color: #ff7700;font-weight:bold;">import</span> UIManager<br />
<span style="color: #ff7700;font-weight:bold;">from</span> wmd.<span style="color: black;">Wiimote</span>.<span style="color: black;">WMManager</span> <span style="color: #ff7700;font-weight:bold;">import</span> WMManager<br />
<span style="color: #ff7700;font-weight:bold;">from</span> wmd.<span style="color: black;">EVDispatcher</span> <span style="color: #ff7700;font-weight:bold;">import</span> EVDispatcher<br />
<span style="color: #ff7700;font-weight:bold;">from</span> wmd.<span style="color: black;">MotionSensing</span> <span style="color: #ff7700;font-weight:bold;">import</span> MSManager<br />
<span style="color: #ff7700;font-weight:bold;">from</span> wmd.<span style="color: black;">Pointer</span> <span style="color: #ff7700;font-weight:bold;">import</span> POManager<br />
<span style="color: #ff7700;font-weight:bold;">from</span> wmd.<span style="color: black;">CommandMapper</span> <span style="color: #ff7700;font-weight:bold;">import</span> CommandMapper</p>
<p><span style="color: #ff7700;font-weight:bold;">class</span> unrealManager:</p>
<p>&nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span> <span style="color: #008000;">self</span>, cf, ms, ev <span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">cf</span> = cf<br />
&nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">ev</span> = ev<br />
&nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">ms</span> = ms<br />
&nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">ev</span>.<span style="color: black;">subscribe</span><span style="color: black;">&#40;</span> WM_BT, <span style="color: #008000;">self</span>.<span style="color: black;">ev_buttons</span><span style="color: black;">&#41;</span></p>
<p>
&nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">def</span> ev_buttons<span style="color: black;">&#40;</span> <span style="color: #008000;">self</span>, ev <span style="color: black;">&#41;</span>:</p>
<p>&nbsp; &nbsp; &nbsp; button = ev<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; state&nbsp; = ev<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span></p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># This code is only for mnemonics reasons:</span></p>
<p>&nbsp; &nbsp; &nbsp; keyctrl = <span style="color: #ff4500;">9</span></p>
<p>&nbsp; &nbsp; &nbsp; key1 = <span style="color: #ff4500;">10</span><br />
&nbsp; &nbsp; &nbsp; key2 = <span style="color: #ff4500;">11</span><br />
&nbsp; &nbsp; &nbsp; key3 = <span style="color: #ff4500;">12</span><br />
&nbsp; &nbsp; &nbsp; key4 = <span style="color: #ff4500;">13</span><br />
&nbsp; &nbsp; &nbsp; key5 = <span style="color: #ff4500;">14</span><br />
&nbsp; &nbsp; &nbsp; key6 = <span style="color: #ff4500;">15</span><br />
&nbsp; &nbsp; &nbsp; key7 = <span style="color: #ff4500;">16</span><br />
&nbsp; &nbsp; &nbsp; key8 = <span style="color: #ff4500;">17</span><br />
&nbsp; &nbsp; &nbsp; key9 = <span style="color: #ff4500;">18</span></p>
<p>&nbsp; &nbsp; &nbsp; keyq = <span style="color: #ff4500;">24</span><br />
&nbsp; &nbsp; &nbsp; keyw = <span style="color: #ff4500;">25</span><br />
&nbsp; &nbsp; &nbsp; keye = <span style="color: #ff4500;">26</span><br />
&nbsp; &nbsp; &nbsp; keyr = <span style="color: #ff4500;">27</span><br />
&nbsp; &nbsp; &nbsp; keyt = <span style="color: #ff4500;">28</span><br />
&nbsp; &nbsp; &nbsp; keyy = <span style="color: #ff4500;">29</span><br />
&nbsp; &nbsp; &nbsp; keyu = <span style="color: #ff4500;">30</span><br />
&nbsp; &nbsp; &nbsp; keyi = <span style="color: #ff4500;">31</span><br />
&nbsp; &nbsp; &nbsp; keyo = <span style="color: #ff4500;">32</span><br />
&nbsp; &nbsp; &nbsp; keyp = <span style="color: #ff4500;">33</span><br />
&nbsp; <br />
&nbsp; &nbsp; &nbsp; keya = <span style="color: #ff4500;">38</span><br />
&nbsp; &nbsp; &nbsp; keys = <span style="color: #ff4500;">39</span><br />
&nbsp; &nbsp; &nbsp; keyd = <span style="color: #ff4500;">40</span><br />
&nbsp; &nbsp; &nbsp; keyf&nbsp; = <span style="color: #ff4500;">41</span><br />
&nbsp; &nbsp; &nbsp; keyg = <span style="color: #ff4500;">42</span><br />
&nbsp; &nbsp; &nbsp; keyh = <span style="color: #ff4500;">43</span><br />
&nbsp; &nbsp; &nbsp; keyj&nbsp; = <span style="color: #ff4500;">44</span><br />
&nbsp; &nbsp; &nbsp; keyk = <span style="color: #ff4500;">45</span><br />
&nbsp; &nbsp; &nbsp; keyl&nbsp; = <span style="color: #ff4500;">46</span></p>
<p>&nbsp; &nbsp; &nbsp; keyz = <span style="color: #ff4500;">52</span><br />
&nbsp; &nbsp; &nbsp; keyx = <span style="color: #ff4500;">53</span><br />
&nbsp; &nbsp; &nbsp; keyc = <span style="color: #ff4500;">54</span><br />
&nbsp; &nbsp; &nbsp; keyv = <span style="color: #ff4500;">55</span><br />
&nbsp; &nbsp; &nbsp; keyb = <span style="color: #ff4500;">56</span><br />
&nbsp; &nbsp; &nbsp; keyn = <span style="color: #ff4500;">57</span><br />
&nbsp; &nbsp; &nbsp; keym = <span style="color: #ff4500;">58</span></p>
<p>&nbsp; &nbsp; &nbsp; keyspace = <span style="color: #ff4500;">65</span></p>
<p>
&nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> state == <span style="color: #483d8b;">"DOWN"</span>:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">if</span> button == <span style="color: #483d8b;">"+"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyg <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 1"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"-"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyf <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 1"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"H"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyctrl <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 1"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"1"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyspace <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 1"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"2"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyc <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 1"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"U"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyw <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 1"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"D"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keys <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 1"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"L"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keya <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 1"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"R"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyd <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 1"</span><span style="color: black;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">elif</span> state == <span style="color: #483d8b;">"UP"</span>:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">if</span> button == <span style="color: #483d8b;">"+"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyg <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 0"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"-"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyf <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 0"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"H"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyctrl <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 0"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"1"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyspace <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 0"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"2"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyc <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 0"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"U"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyw <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 0"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"D"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keys <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 0"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"L"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keya <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 0"</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #483d8b;">"R"</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: #dc143c;">popen2</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">"xsendkeycode "</span>+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span> keyd <span style="color: black;">&#41;</span>+<span style="color: #483d8b;">" 0"</span><span style="color: black;">&#41;</span></p>
<p>cf = CFG</p>
<p>ev = EVDispatcher<span style="color: black;">&#40;</span>cf<span style="color: black;">&#41;</span></p>
<p>ms = MSManager<span style="color: black;">&#40;</span> cf, ev <span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># Motion analysis</span><br />
po = POManager<span style="color: black;">&#40;</span> cf, ev <span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># Handles the pointer, receives WM_IR, sends out ABS_POS absolute position reports</span><br />
um = unrealManager<span style="color: black;">&#40;</span> cf, ms, ev <span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># Motion analysis</span><br />
cm = CommandMapper<span style="color: black;">&#40;</span> cf, ev <span style="color: black;">&#41;</span></p>
<p><span style="color: #808080; font-style: italic;"># Handles the Wiimote; connects to it, manages wiimote state and mode, parses wiimote reports</span></p>
<p>wm = WMManager<span style="color: black;">&#40;</span>cf, ev<span style="color: black;">&#41;</span></p>
<p>
<span style="color: #ff7700;font-weight:bold;">if</span> wm.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">and</span> wm.<span style="color: black;">setup</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; cycles = wm.<span style="color: black;">main_loop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></p>
<p>wm.<span style="color: black;">disconnect</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div>
</div>
</div>
<p></p>
<p>Obviamente el script le falta bastante trabajo pero seguramente puede servir de guía para programar otros juegos en Linux o para que alguien con más paciencia lo mejore.</p>
<h4>¿Hay algo más?</h4>
<p>Todo este rollo fue únicamente con fines didácticos porque no suelo jugar en Linux aunque hay buenos juegos. Sin duda dejé muchas cosas sin ver, como el manejo de los infrarrojos del wiimote y su bocinita; pero para mí fue suficiente y ya tengo una buena idea de como funcionan estos juguetes. Quizás regrese un día que me sienta nostálgico o por alguna razón tenga la necesidad; para entonces seguramente habrá mejores programas y utilerías... o tal vez sea cuando el Bluetooth pase a ser pieza de museo.</p>
<h4>Otro programa recomendado</h4>
<p>Wminput es un programa escrito en C para hacer la interfase con el wiimote. Es un programa interesante porque muchas de las distribuciones ya lo tienen en su repositorio, por lo que vale la pena revisarlo. Si no lo encuentra en su repositorio favorito, puede obtener las fuentes y más información en: <a href="www.cwiid.org">www.cwiid.org</a>.</p>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/126/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ligas útiles</title>
		<link>http://www.machin.com.mx/archives/92</link>
		<comments>http://www.machin.com.mx/archives/92#comments</comments>
		<pubDate>Sun, 10 Jun 2007 18:21:21 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[Fedora]]></category>
		<category><![CDATA[Sitios]]></category>
		<category><![CDATA[Videojuegos]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/?p=92</guid>
		<description><![CDATA[<p>Siempre es un fastidio no poder encontrar una página que se tiene enlazada cuando se cambia uno de máquina. En este post iré poniendo los enlaces a sitios que me han sido de gran utilidad.</p>
<p><strong>Fedora</strong></p>
<p><a href="http://forums.fedoraforum.org/showpost.php?p=769367&#038;postcount=40" onclick="pageTracker._trackPageview('/outgoing/forums.fedoraforum.org/showpost.php?p=769367_038_postcount=40&amp;referer=');">Compilar Kernel</a> - Es para Fedora Core 6, pero funciona en los posteriores.</p>
<p><a href="http://fedoranews.org/tchung/qemu/" onclick="pageTracker._trackPageview('/outgoing/fedoranews.org/tchung/qemu/?referer=');">RPMs de QEMU</a> - Por lo general atrasados.</p>
<p><a href="http://www.ezplanetone.com/xwiki/bin/view/KnowledgeBase/BrokenFC7FireWire" onclick="pageTracker._trackPageview('/outgoing/www.ezplanetone.com/xwiki/bin/view/KnowledgeBase/BrokenFC7FireWire?referer=');">HowTo fix a Fedora 7 installation with broken FireWire</A></p>
<p><strong>Graciosadas de Windows</strong></p>
<p><a href="http://winhlp.com/WxDMA.htm" onclick="pageTracker._trackPageview('/outgoing/winhlp.com/WxDMA.htm?referer=');">DMA reverts to PIO</A> - Windows XP y 2000.</p>
<p><strong>Juegos de Computadora</strong></p>
<p><a href="http://www.widescreengamingforum.com/wiki/index.php/Main_Page" onclick="pageTracker._trackPageview('/outgoing/www.widescreengamingforum.com/wiki/index.php/Main_Page?referer=');">Ayuda para configurar juegos en widescreen</A> - Obviamente para juegos que no los soportan.</p>
<p><a href="http://www.direct2drive.com" onclick="pageTracker._trackPageview('/outgoing/www.direct2drive.com?referer=');">Direct 2 Drive</a> - Tienda online de juegos.</p>
<p><a href="http://www.steampowered.com" onclick="pageTracker._trackPageview('/outgoing/www.steampowered.com?referer=');">Steam</a> - Tienda online de juegos.</p>
<p><strong>Herramientas gráficas</strong></p>
<p><a href="http://www.sentex.net/~mwandel/jhead/" onclick="pageTracker._trackPageview('/outgoing/www.sentex.net/_mwandel/jhead/?referer=');">Programa para manejo de encabezado y thumbnails de JPGs</a></p>
<p><strong>Pruebas de seguridad en línea</strong></p>
<p><a href="http://www.pcflank.com/" onclick="pageTracker._trackPageview('/outgoing/www.pcflank.com/?referer=');">PC Flank</a> - Revisa los puertos abiertos desde un servidor remoto.</p>
<p><strong>Utilerías</strong></p>
<p><a href="http://www.partimage.org/Main_Page" onclick="pageTracker._trackPageview('/outgoing/www.partimage.org/Main_Page?referer=');">Part Image</a> - Una herramienta de respaldo de particiones.</p>
<p><a href="http://gparted.sourceforge.net/index.php" onclick="pageTracker._trackPageview('/outgoing/gparted.sourceforge.net/index.php?referer=');">GParted</a> - Una herramienta tipo Partition Magic pero libre.</p>
<p><a href="http://www.sysresccd.org/Download" onclick="pageTracker._trackPageview('/outgoing/www.sysresccd.org/Download?referer=');">System Rescue</a></p>

]]></description>
			<content:encoded><![CDATA[<p>Siempre es un fastidio no poder encontrar una página que se tiene enlazada cuando se cambia uno de máquina. En este post iré poniendo los enlaces a sitios que me han sido de gran utilidad.</p>
<p><strong>Fedora</strong></p>
<p><a href="http://forums.fedoraforum.org/showpost.php?p=769367&#038;postcount=40" onclick="pageTracker._trackPageview('/outgoing/forums.fedoraforum.org/showpost.php?p=769367_038_postcount=40&amp;referer=');">Compilar Kernel</a> - Es para Fedora Core 6, pero funciona en los posteriores.</p>
<p><a href="http://fedoranews.org/tchung/qemu/" onclick="pageTracker._trackPageview('/outgoing/fedoranews.org/tchung/qemu/?referer=');">RPMs de QEMU</a> - Por lo general atrasados.</p>
<p><a href="http://www.ezplanetone.com/xwiki/bin/view/KnowledgeBase/BrokenFC7FireWire" onclick="pageTracker._trackPageview('/outgoing/www.ezplanetone.com/xwiki/bin/view/KnowledgeBase/BrokenFC7FireWire?referer=');">HowTo fix a Fedora 7 installation with broken FireWire</A></p>
<p><strong>Graciosadas de Windows</strong></p>
<p><a href="http://winhlp.com/WxDMA.htm" onclick="pageTracker._trackPageview('/outgoing/winhlp.com/WxDMA.htm?referer=');">DMA reverts to PIO</A> - Windows XP y 2000.</p>
<p><strong>Juegos de Computadora</strong></p>
<p><a href="http://www.widescreengamingforum.com/wiki/index.php/Main_Page" onclick="pageTracker._trackPageview('/outgoing/www.widescreengamingforum.com/wiki/index.php/Main_Page?referer=');">Ayuda para configurar juegos en widescreen</A> - Obviamente para juegos que no los soportan.</p>
<p><a href="http://www.direct2drive.com" onclick="pageTracker._trackPageview('/outgoing/www.direct2drive.com?referer=');">Direct 2 Drive</a> - Tienda online de juegos.</p>
<p><a href="http://www.steampowered.com" onclick="pageTracker._trackPageview('/outgoing/www.steampowered.com?referer=');">Steam</a> - Tienda online de juegos.</p>
<p><strong>Herramientas gráficas</strong></p>
<p><a href="http://www.sentex.net/~mwandel/jhead/" onclick="pageTracker._trackPageview('/outgoing/www.sentex.net/_mwandel/jhead/?referer=');">Programa para manejo de encabezado y thumbnails de JPGs</a></p>
<p><strong>Pruebas de seguridad en línea</strong></p>
<p><a href="http://www.pcflank.com/" onclick="pageTracker._trackPageview('/outgoing/www.pcflank.com/?referer=');">PC Flank</a> - Revisa los puertos abiertos desde un servidor remoto.</p>
<p><strong>Utilerías</strong></p>
<p><a href="http://www.partimage.org/Main_Page" onclick="pageTracker._trackPageview('/outgoing/www.partimage.org/Main_Page?referer=');">Part Image</a> - Una herramienta de respaldo de particiones.</p>
<p><a href="http://gparted.sourceforge.net/index.php" onclick="pageTracker._trackPageview('/outgoing/gparted.sourceforge.net/index.php?referer=');">GParted</a> - Una herramienta tipo Partition Magic pero libre.</p>
<p><a href="http://www.sysresccd.org/Download" onclick="pageTracker._trackPageview('/outgoing/www.sysresccd.org/Download?referer=');">System Rescue</a></p>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/92/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Escritorio remoto Linux</title>
		<link>http://www.machin.com.mx/archives/84</link>
		<comments>http://www.machin.com.mx/archives/84#comments</comments>
		<pubDate>Sat, 02 Jun 2007 06:09:45 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[Fedora]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/?p=84</guid>
		<description><![CDATA[<p>Me gusta usar Linux, pero me ha sido imposible dejar de usar Windows debido a que en ultimas fechas me he vuelto un amante de los videos-juegos y poco amigo de las consolas. Para cohabitar al mismo tiempo en estos dos mundos tan dispares, mi solución fue comprar una máquina para cada sistema operativo. Con ayuda de mi silla de llantitas, la mayoría de las veces no tengo problemas teniendo los escritorios uno frente al otro; pero cuando no quiero andar girando como tecladista en concierto de Madonna o quiero aprovechar de las bondades del "cut and paste", me conecto desde la máquina windows a mi escritorio en linux usando el protocolo XDMCP (X Display Management Control Protocol).</p>
<p>Esta forma de trabajo me ha funcionado de maravillas, pues al tener una red interna de 1 Gbps, no siento ninguna diferencia de cuando estoy localmente en la computadora Linux. Por supuesto hay otras soluciones que gastan menos luz, pero los emuladores y la virtualización se me hicieron muy lentos y no es práctico andar bootendo como loco cada que quiero hacer algo diferente.</p>
<h4>Configuración en la máquina Linux</h4>
<p><strong>Elección del administrador de pantalla</strong></p>
<p>Crear o editar el archivo /etc/sysconfig/desktop, eligiendo su administrador de pantalla favorito:</p>
<div class="syntax_hilite">
<div id="text-141">
<div class="text"># DISPLAY=&lt;value&gt;, where &lt;value&gt; is one of the following:<br />
#&nbsp; &nbsp; &nbsp; &nbsp;GNOME — Selects the GNOME desktop environment.<br />
#&nbsp; &nbsp; &nbsp; &nbsp;KDE — Selects the KDE desktop environment.<br />
# DISPLAYMANAGER=&lt;value&gt;, where &lt;value&gt; is one of the following:<br />
#&nbsp; &nbsp; &nbsp; &nbsp;GNOME — Selects the GNOME display manager.<br />
#&nbsp; &nbsp; &nbsp; &nbsp;KDM — Selects the KDE display manager.<br />
#&nbsp; &nbsp; &nbsp; &nbsp;XDM — Selects the XFree86 display manager.<br />
DISPLAYMANAGER=GNOME</div>
</div>
</div>
<p></p>
<p><strong>Configuración del administrador de pantalla</strong></p>
<p>1. Si se utiliza xdm:</p>
<p>En el archivo /etc/X11/xdm/xdm-conf:</p>
<p>- Comentar la línea:</p>
<div class="syntax_hilite">
<div id="text-142">
<div class="text">DisplayManager.requestPort:&nbsp; &nbsp; &nbsp;<span style="">0</span></div>
</div>
</div>
<p></p>
<p>con un signo de admiración al principio de la línea para que quede de la siguiente forma:</p>
<div class="syntax_hilite">
<div id="text-143">
<div class="text">!DisplayManager.requestPort:&nbsp; &nbsp; &nbsp;<span style="">0</span></div>
</div>
</div>
<p></p>
<p>En el archivo /etc/X11/xdm/Xaccess:</p>
<p>- Descomentar la línea:</p>
<div class="syntax_hilite">
<div id="text-144">
<div class="text">#*&nbsp; &nbsp; # any host can get a login window</div>
</div>
</div>
<p></p>
<p>Para que quede de la forma:</p>
<div class="syntax_hilite">
<div id="text-145">
<div class="text">*&nbsp; &nbsp; # any host can get a login window</div>
</div>
</div>
<p></p>
<p>Por supuesto, usted puede mejorar la seguridad limitando el acceso sólo a las computadoras que vayan a conectar a su servidor.</p>
<p>2. Si utiliza kdm como administrador de pantalla cambiar a Enable en /etc/kde/kdm/kdmrc.</p>
<p>3. Si utiliza gdm como administrador de pantalla /etc/gdm/custom.conf en la sección [xdmcp]:</p>
<div class="syntax_hilite">
<div id="text-146">
<div class="text">Enable=true<br />
Port=<span style="">177</span></div>
</div>
</div>
<p></p>
<p>4. Habilitar comunicación udp el puerto 177 en iptables por medio del programa que se encuentra en Sistema->Administración->Cortafuego y SELinux, o en la línea de comando con system-config-securitylevel-tui.</p>
<h4>XWin-32</h4>
<p>Yo utilizo el programa XWin32 para poder conectarme desde mi máquina Windows a mi escritorio Linux. Tiene la ventaja de que maneja aceleración 3D de forma local por medio de OpenGL e incluso algunos programas con gráficos 3D o de video funcionan más rápido porque la tarjeta gráfica de la máquina windows es mucho mejor que la que tengo en mi servidor Linux y se hace una especie de minicluster con latencias pequeñas al tener una red de alta velocidad.</p>
<h4>Solución a posibles problemas:</h4>
<p>Si videos o animaciones 3D corren durante un momento y se detienen, es porque el XWin-32 debe estar en "Siempre conectado" en la sección "Otra" de la ceja "Ventana"  en el programa de configuración del X-Win32.</p>

]]></description>
			<content:encoded><![CDATA[<p>Me gusta usar Linux, pero me ha sido imposible dejar de usar Windows debido a que en ultimas fechas me he vuelto un amante de los videos-juegos y poco amigo de las consolas. Para cohabitar al mismo tiempo en estos dos mundos tan dispares, mi solución fue comprar una máquina para cada sistema operativo. Con ayuda de mi silla de llantitas, la mayoría de las veces no tengo problemas teniendo los escritorios uno frente al otro; pero cuando no quiero andar girando como tecladista en concierto de Madonna o quiero aprovechar de las bondades del "cut and paste", me conecto desde la máquina windows a mi escritorio en linux usando el protocolo XDMCP (X Display Management Control Protocol).</p>
<p>Esta forma de trabajo me ha funcionado de maravillas, pues al tener una red interna de 1 Gbps, no siento ninguna diferencia de cuando estoy localmente en la computadora Linux. Por supuesto hay otras soluciones que gastan menos luz, pero los emuladores y la virtualización se me hicieron muy lentos y no es práctico andar bootendo como loco cada que quiero hacer algo diferente.</p>
<h4>Configuración en la máquina Linux</h4>
<p><strong>Elección del administrador de pantalla</strong></p>
<p>Crear o editar el archivo /etc/sysconfig/desktop, eligiendo su administrador de pantalla favorito:</p>
<div class="syntax_hilite">
<div id="text-147">
<div class="text"># DISPLAY=&lt;value&gt;, where &lt;value&gt; is one of the following:<br />
#&nbsp; &nbsp; &nbsp; &nbsp;GNOME — Selects the GNOME desktop environment.<br />
#&nbsp; &nbsp; &nbsp; &nbsp;KDE — Selects the KDE desktop environment.<br />
# DISPLAYMANAGER=&lt;value&gt;, where &lt;value&gt; is one of the following:<br />
#&nbsp; &nbsp; &nbsp; &nbsp;GNOME — Selects the GNOME display manager.<br />
#&nbsp; &nbsp; &nbsp; &nbsp;KDM — Selects the KDE display manager.<br />
#&nbsp; &nbsp; &nbsp; &nbsp;XDM — Selects the XFree86 display manager.<br />
DISPLAYMANAGER=GNOME</div>
</div>
</div>
<p></p>
<p><strong>Configuración del administrador de pantalla</strong></p>
<p>1. Si se utiliza xdm:</p>
<p>En el archivo /etc/X11/xdm/xdm-conf:</p>
<p>- Comentar la línea:</p>
<div class="syntax_hilite">
<div id="text-148">
<div class="text">DisplayManager.requestPort:&nbsp; &nbsp; &nbsp;<span style="">0</span></div>
</div>
</div>
<p></p>
<p>con un signo de admiración al principio de la línea para que quede de la siguiente forma:</p>
<div class="syntax_hilite">
<div id="text-149">
<div class="text">!DisplayManager.requestPort:&nbsp; &nbsp; &nbsp;<span style="">0</span></div>
</div>
</div>
<p></p>
<p>En el archivo /etc/X11/xdm/Xaccess:</p>
<p>- Descomentar la línea:</p>
<div class="syntax_hilite">
<div id="text-150">
<div class="text">#*&nbsp; &nbsp; # any host can get a login window</div>
</div>
</div>
<p></p>
<p>Para que quede de la forma:</p>
<div class="syntax_hilite">
<div id="text-151">
<div class="text">*&nbsp; &nbsp; # any host can get a login window</div>
</div>
</div>
<p></p>
<p>Por supuesto, usted puede mejorar la seguridad limitando el acceso sólo a las computadoras que vayan a conectar a su servidor.</p>
<p>2. Si utiliza kdm como administrador de pantalla cambiar a Enable en /etc/kde/kdm/kdmrc.</p>
<p>3. Si utiliza gdm como administrador de pantalla /etc/gdm/custom.conf en la sección [xdmcp]:</p>
<div class="syntax_hilite">
<div id="text-152">
<div class="text">Enable=true<br />
Port=<span style="">177</span></div>
</div>
</div>
<p></p>
<p>4. Habilitar comunicación udp el puerto 177 en iptables por medio del programa que se encuentra en Sistema->Administración->Cortafuego y SELinux, o en la línea de comando con system-config-securitylevel-tui.</p>
<h4>XWin-32</h4>
<p>Yo utilizo el programa XWin32 para poder conectarme desde mi máquina Windows a mi escritorio Linux. Tiene la ventaja de que maneja aceleración 3D de forma local por medio de OpenGL e incluso algunos programas con gráficos 3D o de video funcionan más rápido porque la tarjeta gráfica de la máquina windows es mucho mejor que la que tengo en mi servidor Linux y se hace una especie de minicluster con latencias pequeñas al tener una red de alta velocidad.</p>
<h4>Solución a posibles problemas:</h4>
<p>Si videos o animaciones 3D corren durante un momento y se detienen, es porque el XWin-32 debe estar en "Siempre conectado" en la sección "Otra" de la ceja "Ventana"  en el programa de configuración del X-Win32.</p>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/84/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
