<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Linux, Java y programación</title>
	<atom:link href="http://casidiablo.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://casidiablo.net</link>
	<description>Blog de Java, Programación y Linux</description>
	<lastBuildDate>Fri, 11 Nov 2011 05:41:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Android, ADK, Arduino y otras hierbas</title>
		<link>http://casidiablo.net/android-adk-arduino/</link>
		<comments>http://casidiablo.net/android-adk-arduino/#comments</comments>
		<pubDate>Fri, 11 Nov 2011 05:25:17 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[arduino]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3908</guid>
		<description><![CDATA[Este semestre tuve la fortuna de asistir a unas clases de Robótica, presididas por el profesor John Nicolls, en donde a parte de otras cosas he podido, al fin, jugar un poco con Arduino, algo que había querido hacer siempre pero para lo cual no se había presentado oportunidad. Aún mejor, tuve la oportunidad de [...]]]></description>
			<content:encoded><![CDATA[
<p>Este semestre tuve la fortuna de asistir a unas clases de Robótica, presididas por el profesor John Nicolls, en donde a parte de otras cosas he podido, al fin, jugar un poco con Arduino, algo que había querido hacer siempre pero para lo cual no se había presentado oportunidad.</p>
<p>Aún mejor, tuve la oportunidad de trabajar con una plataforma relativamente nueva llamada ADK (<a href="http://developer.android.com/guide/topics/usb/adk.html">Accessory Development Kit</a>), presentada en el <a href="http://www.google.com/events/io/2011/index-live.html">Google I/O 2011</a> (en Mayo), la cual permite controlar dispositivos externos de hardware mediante un terminal Android. Así pues con esta quimera: Android y Arduino, me divertí bastante durante un par de semanas y en este artículo pretendo documentar un poco lo aprendido. No se trata de un tutorial paso a paso; más bien un punto de partida para los que quieran profundizar en el tema.</p>
<p>Antes que nada, aclaremos algunos conceptos:</p>
<ul>
<li><strong>Arduino</strong>: es una plataforma de hardware libre, basada en una placa con un microcontrolador y un entorno de desarrollo, diseñada para facilitar el uso de la electrónica en proyectos multidisciplinares [<a title="Artículo de Arduino en la Wikipedia" href="http://es.wikipedia.org/wiki/Arduino">wikipedia</a>]</li>
<li><strong>Shield:</strong> es un complemento para tarjetas Arduino que extienden sus capacidades ofreciendo nuevos servicios, por ejemplo: puertos de red, tarjetas bluetooth, etc.</li>
<li><strong>ADK Board</strong> es una tarjeta Arduino modificada que está preparada para trabajar usando el Open Accessory Protocol. Es básicamente una tarjeta <a href="http://arduino.cc/es/Main/ArduinoBoardMega">Arduino Mega</a> con un shield USB embebido. Sin embargo, es posible utilizar el ADK con una tarjeta Arduino normal (por ejemplo, la board <a href="http://www.arduino.cc/en/Main/arduinoBoardUno">UNO</a>) y un shield USB.</li>
<li>El <strong><a href="https://dl-ssl.google.com/android/adk/adk_release_0512.zip">paquete ADK</a></strong> incluye básicamente: el firmware para las tarjetas Arduino, las especificaciones del hardware (recordemos que es Open Hardware) y un programa de ejemplo (un proyecto de Android y el sketch de Arduino), etc.</li>
</ul>
<h3>Pre-requisitos</h3>
<p>Por supuesto, debemos contar con un terminal Android. Lo ideal es que sea un tablet corriendo Android Honeycomb. Según <a href="http://www.whizzosoftware.com/forums/blog/1/entry-47-tablets-and-the-android-open-accessory-development-kit-adk/">este artículo</a> escrito por Dan Noguerol, las siguientes tablets soportan ADK: Motorola XOOM, Acer Iconia A100, ASUS Eee Pad Transfomer TF101 y Samsung Galaxy Tab 10.1. En mi caso, tengo una Acer Iconia A100, que es lo más barato que pude conseguir en Amazon <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>El soporte oficial para el ADK se encuentra desde la versión Honeycomb de Android, en donde se pueden utilizar las clases del paquete <a href="http://developer.android.com/reference/android/hardware/usb/package-summary.html">android.hardware.usb</a>. Sin embargo, el equipo de Android proporciona un paquete de compatibilidad, que permite utilizar dichas clases en dispositivos corriendo Android 2.3.4 (Gingerbread) o superior, lo cual quiere decir que no solo funciona en tablets sino también en dispositivos móviles.</p>
<h3>Configuración del ADK</h3>
<p>No voy a entrar en detalles acerca de cómo configurar el IDE de Arduino y de Android, puesto que eso ya está muy bien detallado en la documentación oficial: <a href="http://developer.android.com/guide/topics/usb/adk.html#installing">Installing the Arduino software and necessary libraries</a>. De hecho, me parece que Alex de BricoGeek lo explica de una manera muy directa y fácil de seguir en su artículo: <a href="http://blog.bricogeek.com/noticias/arduino/el-adk-de-google-en-un-arduino-uno/">El ADK de Google en Arduino UNO</a>, que además incluye el esquema de hardware que hay que montar:</p>
<div align="center"><a href="http://casidiablo.net/wordpress/wp-content/uploads/2011/11/circuito.jpg"><img class="aligncenter size-full wp-image-3910" title="arduino adk android" src="http://casidiablo.net/wordpress/wp-content/uploads/2011/11/circuito.jpg" alt="" width="560" height="420" /></a></div>
<p>Puesto que los de Google y BricoGeek ya documentaron la parte de la configuración, solo voy a aportar un poco de información acerca de un problema que, al parecer, es bastante común al momento de preparar nuestro Android para usar el ADK (asumo de antemano que ya tienen un dispositivo corriendo Gingerbread). Esto puede aparecer al momento de instalar la aplicación:</p>
<div class="consola">E/PackageManager( 162): Package your.package.YourApp requires unavailable shared library com.android.future.usb.accessory; failing!<br />
W/PackageManager( 162): Package couldn&#8217;t be installed in /data/app/your.package.YourApp.apk</div>
<p>Este es un mensaje que aparece cuando el dispositivo no tiene instaladas las librerías necesarias para usar el ADK (o no están configuradas correctamente).</p>
<p>Lo primero que debemos constatar en este caso es que el archivo <code>com.android.future.usb.accessory.jar</code> se encuentre en el directorio <code>/system/framework/</code> del dispositivo. Este es la librería que contiene las clases del ADK. Además, debe existir el archivo <code>android.hardware.usb.accessory.xml</code> en el directorio <code>/etc/permissions/</code> con el siguiente contenido:</p>
<pre class="brush: xml; title: ; notranslate">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;!-- Copyright (C) 2011 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
--&gt;

&lt;!-- This is the standard feature indicating that the device supports USB accessories. --&gt;
&lt;permissions&gt;
    &lt;feature name=&quot;android.hardware.usb.accessory&quot; /&gt;
    &lt;library name=&quot;com.android.future.usb.accessory&quot;
            file=&quot;/system/framework/com.android.future.usb.accessory.jar&quot; /&gt;
&lt;/permissions&gt;</pre>
<p>La solución la leí de <a href='http://twitter.com/hpsaturn'>hpsaturn</a>, un entusiasta Colombiano de Android y el software libre, que al parecer tuvo este problema <a href="https://github.com/ezterry/manifest-gingerbread-DS/issues/32">hace tiempo</a>.</p>
<h3>Más allá del Hola Mundo</h3>
<p>El ejemplo incluído en el ADK utiliza prácticamente todos los aspectos de la API (sensores de luz, servo motores, análogos, etc), y luce así:</p>
<p style="text-align: center;"><iframe width="560" height="315" src="http://www.youtube.com/embed/3MrKLBtEjtc" frameborder="0" allowfullscreen></iframe></p>
<p>Sin embargo, creo que es un poco complejo, lo cual hace que difícil de entender para las personas que hasta ahora están comenzando. Como alternativa, me gustaría compartir con ustedes un ejemplo mucho más sencillo en donde básicamente se utiliza el ADK para controlar un brazo Scara desde una tablet. El resultado es el siguiente (ignorar el introito del video; no estaba en mis cabales ese día):</p>
<p style="text-align: center;"><iframe width="560" height="315" src="http://www.youtube.com/embed/na0rjCfHW0o?rel=0" frameborder="0" allowfullscreen></iframe></p>
<p>Este ejemplo me parece un poco más práctico y fácil de montar. Lo único que se necesita, obviando el brazo, son 3 servo motores. El código se puede descargar desde <a href="https://github.com/casidiablo/armuino">este repositorio Git</a> (en el README está el sketch de Arduino).</p>
<p>La idea es bastante simple; desde el tablet se hacen los cálculos de la cinemática inversa (es decir, calcular el ángulo que deben tener los servos a partir del punto en el cual queremos que el brazo ponga la mano). Posteriormente, se envía al Arduino los ángulos calculados y este a su vez actualiza la posición de los servos.</p>
<p>Lo importante aquí, y para concluir esta entrada, es reflexionar un poco sobre la manera tan fácil y rápida con la que se pueden desarrollar aplicaciones de robótica usando las librerías mencionadas. No hace falta ser un gurú de la electrónica ni mucho menos de la programación&#8230; la parte difícil ya está hecha, solo queda la parte más divertida: dejar que nuestra imaginación guíe los proyectos.</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/android-adk-arduino/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Más acerca del freelancing: tips y aclaraciones del uso de oDesk</title>
		<link>http://casidiablo.net/odesk-freelancing-tips/</link>
		<comments>http://casidiablo.net/odesk-freelancing-tips/#comments</comments>
		<pubDate>Wed, 13 Apr 2011 16:00:29 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[off-topic]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[freelance]]></category>
		<category><![CDATA[odesk]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3889</guid>
		<description><![CDATA[Este es un pequeño video en donde aclaro algunas dudas que surgieron a partir del último post, así como algunos tips para los que quieran departir como freelances en oDesk.com: Espero les sea de ayuda y si tienen dudas o sugerencias no duden en comentar.]]></description>
			<content:encoded><![CDATA[
<p><a href="http://www.youtube.com/watch?v=iYsFeVQrRhs">Este es un pequeño video</a> en donde aclaro algunas dudas que surgieron <a href="http://casidiablo.net/freelance-pros-contras/">a partir del último post</a>, así como algunos tips para los que quieran departir como freelances en <a href="http://odesk.com">oDesk.com</a>:</p>
<p style="text-align: center;"><iframe title="YouTube video player" width="853" height="510" src="http://www.youtube.com/embed/iYsFeVQrRhs?hd=1" frameborder="0" allowfullscreen></iframe></p>
<p>Espero les sea de ayuda y si tienen dudas o sugerencias no duden en comentar.</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/odesk-freelancing-tips/feed/</wfw:commentRss>
		<slash:comments>72</slash:comments>
		</item>
		<item>
		<title>Mi experiencia como freelance; pros, contras y cómo empezar</title>
		<link>http://casidiablo.net/freelance-pros-contras/</link>
		<comments>http://casidiablo.net/freelance-pros-contras/#comments</comments>
		<pubDate>Fri, 08 Apr 2011 05:20:27 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[freelance]]></category>
		<category><![CDATA[odesk]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3868</guid>
		<description><![CDATA[Hace ya más de 8 meses que trabajo como freelance y quisiera compartir con ustedes mi punto de vista respecto a este tipo de trabajos. Primero veremos las herramientas existentes para convertirse en freelance sin salir de casa (e incluso, sin tener contactos previos), y posteriormente mencionaré los pros y los contras. Así que si [...]]]></description>
			<content:encoded><![CDATA[
<p>Hace ya más de 8 meses que trabajo como freelance y quisiera compartir con ustedes <strong>mi</strong> punto de vista respecto a este tipo de trabajos. Primero veremos las herramientas existentes para convertirse en freelance sin salir de casa (e incluso, sin tener contactos previos), y posteriormente mencionaré los pros y los contras. Así que si quieres ser freelance y eres estudiante o simplemente no eres tan bueno con las relaciones sociales, este artículo te podría servir.</p>
<h3>¿Cómo empezar?</h3>
<p>Existen sitios en Internet que se dedican exclusivamente a eso: servir como puente entre contratistas freelance (programadores, diseñadores, traductores, etc.) y empresas o personas que requieren de dichos servicios. Las más importantes actualmente que recuerdo son: <a href="http://www.odesk.com/">oDesk</a>, <a href="http://www.elance.com/">elance.com</a>, <a href="http://www.freelancer.com/">Freelancer</a>, <a href="http://www.getacoder.com/">GetACoder</a>, entre otras. Actualmente trabajo usando oDesk, así que es la herramienta bajo la cual voy a dar mi punto de vista.</p>
<p>Este tipo de empresas son ideales para iniciar en el mundo del freelancing, puesto que no es necesario tener ningún tipo de experiencia previa y hace mucho más fácil la búsqueda de clientes. Antes que nada, <strong>¿cómo funcionan este tipo de empresas?</strong> bueno, es básicamente una bolsa de empleo online:</p>
<ul>
<li>Usted, como freelance, crea un perfil que es básicamente un Currículum Vitae virtual (tipo LinkedIn).</li>
<li>Los empleadores publican empleos de diversos tipos (PHP, Java, Android, iPhone, traducciones, etc.)</li>
<li>Usted puede aplicar a los trabajos que considere apropiados, con lo cual se inicia un proceso de selección.</li>
<li>Si gana un contrato, se define el modo de pago: por horas o a precio fijo. El precio por horas es contabilizado por un software especial, que básicamente nos monitorea mientras estemos trabajando.</li>
<li>Se recibe pagos de diversas maneras: una tarjeta débito de Payoneer, consignaciones directas a nuestra cuenta bancaria, Paypal, Moneybookers, etc.</li>
</ul>
<h3>Pros del trabajo como freelance</h3>
<ol>
<li><strong>Rentabilidad:</strong> sin duda alguna es más rentable que el trabajo convencional. O al menos debe serlo en países latino americanos, en donde el trabajo como programador no es tan bien remunerado como debería ser. No voy a entrar en detalles de mis ganancias pero, para que se haga una idea, desde que trabajo como freelance estoy ganando un 300% más que antes. Además, hay que tener en cuenta que me faltan décadas para ser experto, lo cual quiere decir que cualquier programador novato como yo puede tener ganancias considerables.</li>
<li><strong>No necesita ser profesional:</strong> al menos en Colombia (supongo que pasa en todas partes), cuando se busca trabajo y no se tiene un título de profesional, los empleadores se aprovechan de esto y pagan lo que les venga en gana. Cualquier excusa es buena para limitar los ingresos del programador (ser aún estudiante, no tener experiencia previa, no tener bonitas piernas, etc.). Este tipo de problemas no existen en empresas como oDesk: lo contratan porque saben que tiene conocimientos y capacidades de hacer el trabajo, y le pagan en base a esto. De hecho, usted decide cuanto le pagan.</li>
<li><strong>Menos monotonía:</strong> una de las razones por las cuales se pierde el gusto por el trabajo es la monotonía. La rutina se vuelve insoportable, lo cual afecta notablemente la productividad, perdemos el interés por lo que estamos haciendo, etc. Trabajando como freelance, el 90% de los proyectos no duran más de 3 meses, y por ende siempre se están haciendo y aprendiendo cosas nuevas.</li>
<li><strong>Trabajar en casa:</strong> ¿Tiene que cumplir un horario? ¿Tiene que madrugar? ¿Odia el transporte público? <span style="text-decoration: line-through;">¿No le gusta bañarse?</span> Pues bien, por esas razones me encanta mi nuevo estilo de vida. Antes dormía cuatro horas diarias, ahora duermo siete o más. Mi oficina queda a un metro de la cama. Cuando estoy aburrido juego con <strong>mi perro</strong>; cuando estoy cansado duermo en <strong>mi cama</strong>; y lo más importante: cuando hago mis necesidades fisiológicas <strong>voy a mi baño</strong> (todo sin despeinarme, vea usted!).</li>
<li><strong>Cambio constante de jefes:</strong> ¿odia a su jefe? ¿que tal si pudiera cambiar de jefe cada dos meses? la verdad no tengo queja alguna del 80% de los jefes que he tenido, pero no está mal saber que se puede cambiar de jefe cada contrato.</li>
<li><strong>La poligamia es legal!</strong> Es decir, puede tener tantos proyectos activos como su cuerpo resista. Incluso, si trabaja de manera normal, puede hacer trabajos extras como freelance. Esto va de la mano con la monotonía. Cuando me aburro de un proyecto, simplemente me pongo a trabajar en otro, etc.</li>
<li><strong>Las hojas de vida pierden importancia</strong>: los Currículum Vitae son sin duda un requisito para cualquier entrevista de trabajo. Es tal su importancia que incluso mientras estamos en la escuela (colegio, para los más afortunados) nos enseñan cómo preparar hojas de vida. La tendencia es a inflar la hoja de vida: entre más estudios tengamos, entre más experiencia laboral, entre más posgrados, etc., mucho mejor. Pues bien, para las personas con poca experiencia, pocos estudios, etc., trabajar como freelance es una gran ventaja ya que el CV pierde bastante peso, y lo que importa es lo que realmente sabes (que es demostrable como hablaré en otro post).</li>
</ol>
<h3>Contras</h3>
<ol>
<li><strong>Posible inestabilidad:</strong> cuando se trabaja con un contrato normal, se tiene un puesto seguro (o casi). Incluso si no hay mucho (o nada) por hacer, uno sigue recibiendo un sueldo fijo. Por otro lado, trabajar como freelance implica estar constantemente buscando un nuevo proyecto&#8230; y en ocasiones pueda que hayan espacios prolongados de tiempo en los cuales no se tenga ningún proyecto activo. Personalmente, lo que más he durado como &#8216;desempleado&#8217; siendo freelance ha sido 6 días. Nada grave, pero no está demás tenerlo en cuenta.</li>
<li><strong>Interacción con otras personas:</strong> lo más probable es que tenga que trabajar solo. ¿A quien jugará bromas o le contará esos chistes malos que se sabe? ¿Con quien va a hablar del partido de fútbol del domingo? Interactuar con la gente es algo que, definitivamente hace falta, y es un espacio que la mayoría de los perros no pueden llenar.</li>
<li><strong>Trabajar en casa:</strong> sí, también tiene sus contras. Es posible distraerse fácilmente: el hijo pidiendo ayuda para una tarea, el perro mordiéndonos los zapatos, la TV, una olla quemándose en la cocina, etc. Lo recomendable en este caso es tener un estudio, con un ambiente propicio para el trabajo y lejos de la mayor cantidad de distracciones posible.</li>
<li><strong>Es necesario saber inglés:</strong> o al menos en el 98% de los casos. Si no habla y/o escribe inglés de una manera decente, es difícil que consiga nuevos contratos. Tenga en cuenta que la mayoría de los clientes son estadounidenses, ingleses o árabes (que hablan inglés, claro).</li>
</ol>
<p>Hay aún muchos temas por tratar al respecto, sin embargo no quiero sobrecargar este artículo. Dependiendo de la respuesta que tenga podría publicar en detalle cómo funciona oDesk, además de dar algunos consejos para sacarle el mejor provecho y aclarar más dudas.</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/freelance-pros-contras/feed/</wfw:commentRss>
		<slash:comments>105</slash:comments>
		</item>
		<item>
		<title>Comprimir archivos con PHP</title>
		<link>http://casidiablo.net/ejemplo-comprimir-zip-bunzip-zlib-php/</link>
		<comments>http://casidiablo.net/ejemplo-comprimir-zip-bunzip-zlib-php/#comments</comments>
		<pubDate>Sun, 18 Jul 2010 04:54:54 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[bunzip]]></category>
		<category><![CDATA[compresión]]></category>
		<category><![CDATA[comprimir]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[gzip]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[zip]]></category>
		<category><![CDATA[zlib]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3847</guid>
		<description><![CDATA[Zlib es una librería que proporciona funciones que nos permiten realizar tareas de compresión y descompresión usando el formato GZIP. En esta entrada vamos a ver algunos ejemplos sencillos de compresión de archivos usando dicha librería, y además veremos cómo funcionan las librerías adicionales para comprimir archivos en ZIP y Bunzip&#8230; aunque también existen otros [...]]]></description>
			<content:encoded><![CDATA[
<p><img src="http://casidiablo.net/wordpress/wp-content/uploads/2010/07/avatardr.png" alt="" title="avatardr" width="108" height="175" style="float: right; margin: 5px;" /><a href="http://php.net/manual/en/book.zlib.php" class="external">Zlib</a> es una librería que proporciona funciones que nos permiten realizar tareas de compresión y descompresión usando el formato GZIP. En esta entrada vamos a ver algunos ejemplos sencillos de compresión de archivos usando dicha librería, y además veremos cómo funcionan las librerías adicionales para comprimir archivos en <code>ZIP</code> y <code>Bunzip</code>&#8230; aunque también existen otros formatos disponibles como <code>rar</code>, <code>lzf</code> y <code>phar</code>.</p>
<h3>Comprimir y descomprimir usando el formato GZIP</h3>
<p>Este es un ejemplo básico en donde se comprime y descomprime un archivo:</p>
<pre class="brush: php; title: ; notranslate">function descomprimir($origen, $destino) {
  $string = implode(&quot;&quot;, gzfile($origen));
  $fp = fopen($destino, &quot;w&quot;);
  fwrite($fp, $string, strlen($string));
  fclose($fp);
} 

function comprimir($origen, $destino) {
  $fp = fopen($origen, &quot;r&quot;);
  $data = fread ($fp, filesize($origen));
  fclose($fp);
  $zp = gzopen($destino, &quot;w9&quot;);
  gzwrite($zp, $data);
  gzclose($zp);
}
comprimir(&quot;archivo.txt&quot;,&quot;archivo.gz&quot;);
descomprimir(&quot;archivo.gz&quot;,&quot;archivo2.txt&quot;);</pre>
<p>Esta es una breve descripción de las funciones para Gzip incluidas en Zlib:</p>
<ul>
<li><code>gzclose</code> — Cierra un puntero gz-file</li>
<li><code>gzcompress</code> — Comprime una cadena de texto</li>
<li><code>gzencode</code> — Crea una cadena de texto comprimida en gzip</li>
<li><code>gzeof</code> — Verifica si es el fin del archivo en un puntero gz-file</li>
<li><code>gzfile</code> — Lee el contenido de un archivo gzip y lo almacena en un arreglo</li>
<li><code>gzgetc</code> — Obtiene el caracter al que apunta un gz-file pointer</li>
<li><code>gzgets</code> — Obtiene la linea a la que apunta un gz-file pointer</li>
<li><code>gzgetss</code> — Obtiene la linea a la que apunta un gz-file pointer y remueve las etiquetas HTML</li>
<li><code>gzinflate</code> — Descomprime una cadena comprimida</li>
<li><code>gzopen</code> — Abre un archivo gzip</li>
</ul>
<h3>Comprimir usando el formato Bunzip</h3>
<p>Aquí un ejemplo muy básico:</p>
<pre class="brush: php; title: ; notranslate">function comprimir_bzip($origen, $destino){
    // abrir el archivo en modo escritura
    $bz = bzopen($destino, &quot;w&quot;);
    // escribir el contenido del origen
    bzwrite($bz, file_get_contents($filename));
    // cerrar el archivo
    bzclose($bz);
}</pre>
<p>Información adicional y lista de las funciones disponibles: <strong><a class="external" href="http://www.php.net/manual/en/book.bzip2.php">PHP: Bunzip</a></strong>.</p>
<h3>Comprimir usando el formato ZIP</h3>
<p>En este caso se utilizan la clase <code>ZipArchive</code>:</p>
<pre class="brush: php; title: ; notranslate">function comprimir_zip($origen, $destino){
    $zip = new ZipArchive();
    if ($zip-&gt;open($destino, ZIPARCHIVE::CREATE)!==TRUE) {
        die(&quot;Error al crear el archivo&quot;);
    }
    $zip-&gt;addFile($origen, &quot;/&quot;.basename($origen));
    $zip-&gt;close();
}</pre>
<h3>Verificar la existencia de las librerías</h3>
<p>Esta es una manera sencilla de verificar si PHP fue compilado con soporte para estas librerías:</p>
<pre class="brush: php; title: ; notranslate">if( class_exists('ZipArchive') )
    echo &quot;ZIP: OK\n&quot;;
if( function_exists('bzwrite') )
    echo &quot;Bunzip: OK\n&quot;;
if( function_exists('gzwrite') )
    echo &quot;gzip: OK\n&quot;;</pre>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/ejemplo-comprimir-zip-bunzip-zlib-php/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Iniciar servicio en android después del boot</title>
		<link>http://casidiablo.net/iniciar-servicio-android-boot/</link>
		<comments>http://casidiablo.net/iniciar-servicio-android-boot/#comments</comments>
		<pubDate>Sun, 11 Jul 2010 18:08:00 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3839</guid>
		<description><![CDATA[Esta entrada, principalmente dedicada a mi mismo ya que se que se me va a olvidar cómo hacerlo, indica paso a paso como crear un servicio en Android que se ejecute al iniciar el sistema. Como sabemos, un servicio es un proceso que se ejecuta en background aun cuando ningún componente visual de nuestra aplicación [...]]]></description>
			<content:encoded><![CDATA[
<p>Esta entrada, principalmente dedicada a mi mismo ya que se que se me va a olvidar cómo hacerlo, indica paso a paso como crear un servicio en Android que se ejecute al iniciar el sistema. Como sabemos, un servicio es un proceso que se ejecuta en background aun cuando ningún componente visual de nuestra aplicación se encuentre activo.</p>
<p>La idea es más o menos sencilla: una vez que un sistema Android ha iniciado envía una acción broadcast llamada <code>android.intent.action.BOOT_COMPLETED</code>. La idea es crear un <code>BroadcastReceiver</code> que escuche este tipo de acciones e inicie el servicio que deseemos. Así pues, el primer paso es crear una clase que extienda <code>BroadcastReceiver</code>:</p>
<pre class="brush: java; title: ; notranslate">public class Recibidor extends BroadcastReceiver{
	@Override
	public void onReceive(Context context, Intent intent) {
		Intent servicio = new Intent();
		servicio.setAction(&quot;foo.bar.Servicio&quot;);
		context.startService(servicio);
	}
}</pre>
<p>Lo interesante aquí es que se ejecuta el método <code>startService</code> enviando como parámetro un <code>Intent</code> cuyo <em>action</em> es <em>&#8220;foo.bar.Servicio&#8221;</em>, el cual es el servicio que deseamos ejecutar. Dicho servicio es una clase que extiende de <code>Service</code>, y del cual debemos sobrescribir los métodos <code>onCreate</code> y <code>onStart</code>:</p>
<pre class="brush: java; title: ; notranslate">public class Servicio extends Service{

	private static final String TAG = &quot;EjemploServicioBoot&quot;;

	private Timer timer;

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

	@Override
	public void onCreate(){
		super.onCreate();
		Log.d(TAG, &quot;Servicio creado&quot;);
		timer = new Timer();
	}

	@Override
	public void onStart(final Intent intent, final int startId){
		super.onStart(intent, startId);
		timer.scheduleAtFixedRate(new TimerTask() {
			@Override
			public void run() {
				Log.i(TAG, &quot;Se ejecuta la tarea&quot;);
			}
		}, 0, 15000);
	}
}</pre>
<p>En este caso, el servicio realiza una tarea muy simple: imprime en el log del sistema un mensaje. Básicamente tenemos un objeto tipo <code>Timer</code> que ejecutará una tarea; en <code>onCreate</code> simplemente iniciamos el objeto <code>Timer</code>, mientras que en <code>onStart</code> usamos el método <code>scheduleAtFixedRate</code> indicando que ejecutaremos dicha tarea cada 15 segundos.</p>
<p>Por último, debemos registrar en el archivo <code>AndroidManifest.xml</code> el <code>BroadcastReceiver</code> y el servicio:</p>
<pre class="brush: xml; highlight: [12,17]; title: ; notranslate">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;manifest xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
      package=&quot;foo.bar&quot; android:versionCode=&quot;1&quot; android:versionName=&quot;1.0&quot;&gt;
    &lt;application&gt;
        &lt;service android:name=&quot;.Servicio&quot;&gt;
        	&lt;intent-filter&gt;
        		&lt;action android:name=&quot;foo.bar.Servicio&quot;/&gt;
        	&lt;/intent-filter&gt;
        &lt;/service&gt;
        &lt;receiver android:name=&quot;.Recibidor&quot;&gt;
        	&lt;intent-filter&gt;
        		&lt;action android:name=&quot;android.intent.action.BOOT_COMPLETED&quot;/&gt;
        	&lt;/intent-filter&gt;
        &lt;/receiver&gt;
    &lt;/application&gt;
    &lt;uses-sdk android:minSdkVersion=&quot;3&quot; /&gt;
    &lt;uses-permission android:name=&quot;android.permission.RECEIVE_BOOT_COMPLETED&quot; /&gt;
&lt;/manifest&gt;</pre>
<p>En el manifest podemos ver que añadimos un elemento <code>service</code> dentro de <code>application</code>, para registrar nuestro servicio. Y lo más interesante se ve en las líneas 12 y 17, que es donde indicamos el tipo de mensaje que nuestro recibidor estará esperando antes de ejecutar la tarea e indicamos que la aplicación requiere permisos para conocer cuando el boot del sistema a finalizado.</p>
<p><a class="descargacodigo" href="http://casidiablo.net/descargar/Servicio+Android" title="Descargar código fuente del ejemplo">Descargar código fuente</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/iniciar-servicio-android-boot/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
		<item>
		<title>Ganador del sorteo de los 4 e-books de Android</title>
		<link>http://casidiablo.net/ganador-sorteo-4-books-android/</link>
		<comments>http://casidiablo.net/ganador-sorteo-4-books-android/#comments</comments>
		<pubDate>Sat, 03 Jul 2010 04:43:29 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[off-topic]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[offtopic]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3834</guid>
		<description><![CDATA[Hace un par de semanas publiqué una entrada en donde proponía sortear 4 e-books de Android y hoy es el día en que se escogía un ganador! El video lo grabé hace unas horas en la oficina, donde no podía hacer mucho ruido así que es un video mudo (apenas se escuchan algunos murmullos y [...]]]></description>
			<content:encoded><![CDATA[
<p>Hace un par de semanas publiqué una entrada en donde proponía <a href="http://casidiablo.net/sorteo-4-e-books-de-android/">sortear 4 e-books de Android</a> y hoy es el día en que se escogía un ganador! El video lo grabé hace unas horas en la oficina, donde no podía hacer mucho ruido así que es un video mudo (apenas se escuchan algunos murmullos y el sonido del inicio de un Windows 7 <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_mrgreen.gif' alt=':mrgreen:' class='wp-smiley' />  ). En fin&#8230; aquí está el sorteo y felicidades al ganador:</p>
<p><center><embed src="http://blip.tv/play/g9MGgeuXUgI%2Em4v" type="application/x-shockwave-flash" width="640" height="440" allowscriptaccess="always" allowfullscreen="true"></embed></center></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/ganador-sorteo-4-books-android/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Java por siempre</title>
		<link>http://casidiablo.net/java-por-siempre/</link>
		<comments>http://casidiablo.net/java-por-siempre/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 18:36:05 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[videos]]></category>
		<category><![CDATA[trailer]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3827</guid>
		<description><![CDATA[Sencillamente estupendo! Lo vi en java.no. Edito: un amable usuario a puesto un comentario con la versión subtitulada: http://www.youtube.com/watch?v=9g1y7f1xjJ0 muchísimas gracias!]]></description>
			<content:encoded><![CDATA[
<p><center><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/KrfpnbGXL70&#038;hl=es_ES&#038;fs=1&#038;rel=0&#038;color1=0x3a3a3a&#038;color2=0x999999&#038;hd=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/KrfpnbGXL70&#038;hl=es_ES&#038;fs=1&#038;rel=0&#038;color1=0x3a3a3a&#038;color2=0x999999&#038;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object></center></p>
<p>Sencillamente estupendo! Lo vi en <a href="http://jz10.java.no/java-4-ever-trailer.html">java.no</a>. </p>
<p><strong>Edito:</strong> un amable usuario a puesto un comentario con la versión subtitulada: http://www.youtube.com/watch?v=9g1y7f1xjJ0 muchísimas gracias!</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/java-por-siempre/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Sorteo 4 e-books de Android</title>
		<link>http://casidiablo.net/sorteo-4-e-books-de-android/</link>
		<comments>http://casidiablo.net/sorteo-4-e-books-de-android/#comments</comments>
		<pubDate>Sun, 20 Jun 2010 00:50:47 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[off-topic]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3818</guid>
		<description><![CDATA[Mark Murhpy es uno de los personajes más conocidos en el mundo de Android y el autor de 4 excelentes libros: The Busy Coder&#8217;s Guide to Android Development, The Busy Coders Guide to Advanced Android Development, Android Programming Tutorials y Android Beyond Java. El valor de los cuatro libros es de $40 USD, el cual [...]]]></description>
			<content:encoded><![CDATA[
<p><img src="http://casidiablo.net/wordpress/wp-content/uploads/2010/06/android_development.png" alt="" title="android_development" width="120" height="147" style="float:left; margin: 5px;" /> <strong><a href="http://commonsware.com/">Mark Murhpy</a></strong> es uno de los personajes más conocidos en el mundo de Android y el autor de 4 excelentes libros: <a href="http://commonsware.com/Android/">The Busy Coder&#8217;s Guide to Android Development</a>, <a href="http://commonsware.com/AdvAndroid">The Busy Coders Guide to Advanced Android Development</a>, <a href="http://commonsware.com/AndTutorials">Android Programming Tutorials</a> y <em>Android Beyond Java</em>. El valor de los cuatro libros es de $40 USD, el cual es un precio bastante bajo para la calidad de los mismos.</p>
<p>Los ejemplos utilizados en los libros pueden ser descargados gratuitamente en el <a href="http://github.com/commonsguy">repositorio de Github</a>. Además de esto, <a href="http://stackoverflow.com/users/115145/commonsware">Mark es un usuario activo de StackOverflow.com</a>&#8230; ¿y qué con eso? Bueno, personalmente me ha resuelto bastantes dudas allí (¿qué mejor que tener un experto dispuesto a solucionarte dudas puntuales?). También se le ve en <a href="http://twitter.com/commonsguy">twitter</a> por si lo quieren seguir <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>En fin&#8230; Mark me ha enviado un cupón que permite subscribirse a su librería virtual por seis meses, y con la cual se puede acceder <strong>legalmente</strong> a todos sus contenidos. Los libros son actualizados regularmente cada mes o cada que sale una nueva versión del SDK. Además son distribuidos en formato PDF, EPUB o MOBI&#8230;</p>
<p>Así que pensé en sortear dicho cupón entre los lectores del blog que quisieran iniciarse en el mundo de <a href="http://casidiablo.net/tutorial-basico-android/">Android</a> (o que ya tengan experiencia pero quieran tener una referencia avanzada más directa). La verdad no sé que tanto pueda interesar a los lectores del blog el sorteo, pues no todos los que lo leen están interesados en la programación, pero no puedo dejar de compartir este valioso recurso con ustedes (tener en cuenta además que los libros están en inglés, por supuesto).</p>
<p>Así pues, si está interesado en adquirir estos títulos puede dejar un comentario indicando su interés, y si fuese posible la razón principal por la que desea aprender a desarrollar en esta plataforma (quisiera que el cupón se lo ganara alguien que realmente desea aprender del tema). El sorteo se realizará usando random.org (como habitualmente se hace) el día 2 de Julio (en honor al gran <a href="http://es.wikipedia.org/wiki/Andr%C3%A9s_Escobar">Andrés Escobar</a>&#8230; bueno, en realidad es coincidencia pero sí le tenía bastante aprecio).</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/sorteo-4-e-books-de-android/feed/</wfw:commentRss>
		<slash:comments>41</slash:comments>
		</item>
		<item>
		<title>Reproducir clip de audio en Android</title>
		<link>http://casidiablo.net/reproducir-clip-de-audio-en-android/</link>
		<comments>http://casidiablo.net/reproducir-clip-de-audio-en-android/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 00:50:06 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[reproducir]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3811</guid>
		<description><![CDATA[Esta receta es bastante simple para reproducir clips de audio en Android. Basta con usar el método create(context, int) de la clase MediaPlayer, pasándole como parámetro el actividad que desde donde se reproduce el sonido y la referencia al archivo de audio a reproducir. Tan sencillo como esto: En este caso, R.raw.slayer representa un archivo [...]]]></description>
			<content:encoded><![CDATA[
<p>Esta receta es bastante simple para reproducir clips de audio en Android. Basta con usar el método <code>create(context, int)</code> de la clase <code>MediaPlayer</code>, pasándole como parámetro el actividad que desde donde se reproduce el sonido y la referencia al archivo de audio a reproducir. Tan sencillo como esto:</p>
<pre class="brush: java; highlight: [16,17]; title: ; notranslate">import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class TestSonido extends Activity {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		Button boton = (Button) findViewById(R.id.reproducir);
		boton.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				MediaPlayer mp = MediaPlayer.create(TestSonido.this, R.raw.slayer);
				mp.start();
			}
		});
	}
}</pre>
<p>En este caso, <code>R.raw.slayer</code> representa un archivo de audio con nombre &#8220;slayer.mp3&#8243; almacenado en la carpeta <code>res/raw</code> y el sonido se reproduce al presionar el botón con id <code>reproducir</code>.</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/reproducir-clip-de-audio-en-android/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Obtener dirección IP del WIFI en Android</title>
		<link>http://casidiablo.net/get-ip-android-wifi/</link>
		<comments>http://casidiablo.net/get-ip-android-wifi/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 15:43:07 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[obtener ip]]></category>
		<category><![CDATA[wifi]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3799</guid>
		<description><![CDATA[Este es un tip muy útil que permite obtener la dirección IP que tengamos asignada vía una conexión Wireless. Existen otras maneras de hacerlo, por ejemplo usando las clases WifiManager y WifiInfo, pero es mucho más confiable el método anterior. Además, este método funciona no solo en *Android*, sino en cualquier proyecto Java.]]></description>
			<content:encoded><![CDATA[
<p style="text-align: center;"><img class="aligncenter" title="wifi" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/06/wifi.png" alt="" width="256" height="256" /></p>
<p style="text-align: justify;">Este es un tip muy útil que permite obtener la dirección IP que tengamos asignada vía una conexión Wireless.</p>
<pre class="brush: java; title: ; notranslate">public String getLocalIpAddress() {
    try {
        for (Enumeration&lt;NetworkInterface&gt; en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
            NetworkInterface intf = en.nextElement();
            for (Enumeration&lt;InetAddress&gt; enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                InetAddress inetAddress = enumIpAddr.nextElement();
                if (!inetAddress.isLoopbackAddress())
                    return inetAddress.getHostAddress().toString();
            }
        }
    } catch (SocketException ex) {}
    return null;
}</pre>
<p>Existen otras maneras de hacerlo, por ejemplo usando las clases <code>WifiManager</code> y <code>WifiInfo</code>, pero es mucho más confiable el método anterior. Además, este método funciona no solo en *Android*, sino en cualquier proyecto Java.</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/get-ip-android-wifi/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

