<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>luauf.com</title>
	
	<link>http://luauf.com</link>
	<description>Sistemas Operativos, Bases de Datos, Programación y Redes</description>
	<lastBuildDate>Thu, 12 Jul 2012 18:34:05 +0000</lastBuildDate>
	<language>es-ES</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/luauf" /><feedburner:info uri="luauf" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by/2.5/</creativeCommons:license><feedburner:emailServiceId>luauf</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Cambiar la codificación de archivos en Linux</title>
		<link>http://feedproxy.google.com/~r/luauf/~3/eYc-Qjrp3sY/</link>
		<comments>http://luauf.com/2012/06/17/cambiar-la-codificacion-de-archivos-en-linux/#comments</comments>
		<pubDate>Sun, 17 Jun 2012 10:00:48 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Sistemas Operativos]]></category>
		<category><![CDATA[Archivos]]></category>
		<category><![CDATA[codificacion]]></category>
		<category><![CDATA[ISO-8859-1]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[UTF-8]]></category>

		<guid isPermaLink="false">http://luauf.com/?p=1337</guid>
		<description><![CDATA[¿Alguna vez te has encontrado con el problema de tener que convetir algunos archivos y empezar a refunfuñar contra los acentos, las ñ, el signo de apertura de pregunta y cuanto caracter extraño...]]></description>
				<content:encoded><![CDATA[<p>¿Alguna vez te has encontrado con el problema de tener que convetir algunos archivos y empezar a refunfuñar contra los acentos, las ñ, el signo de apertura de pregunta y cuanto caracter extraño haya? A mi, la última vez que esto me ocurrió fue con unos subtitulos que descargué.</p>
<p style="text-align: center;">
<p><a href="http://luauf.com/wp-content/uploads/2012/06/iso-8859-1.png"><img class="aligncenter size-medium wp-image-1338" title="iso-8859-1" src="http://luauf.com/wp-content/uploads/2012/06/iso-8859-1-300x255.png" alt="" width="300" height="255" /></a></p>
<p style="text-align: center;">
<p>¿Qué hacer ante estos casos?</p>
<p><strong>Primero</strong>, para conocer la codificación de un archivo en Linux, el comando es file:</p>
<p>[CODE]<br />
$file archivo.txt<br />
archivo.txt: UTF-8 Unicode text<br />
[/CODE]</p>
<p><strong>Segundo</strong>, para cambiar el tipo de codificación, por ejemplo, de ISO-8559-1 a UTF-8 (si fuese al revés o utilizando otra codificación creo que los argumentos son muy naturales y no necesitan más explicación):</p>
<p>[CODE]<br />
$iconv &#8211;from-code=ISO-8559-1 &#8211;to-code=UTF-8 archivo.txt -o archivo_convertido.txt<br />
[/CODE]</p>
<p>&nbsp;</p>
<img src="http://feeds.feedburner.com/~r/luauf/~4/eYc-Qjrp3sY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://luauf.com/2012/06/17/cambiar-la-codificacion-de-archivos-en-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://luauf.com/2012/06/17/cambiar-la-codificacion-de-archivos-en-linux/</feedburner:origLink></item>
		<item>
		<title>Mis primeros pasos con Android SDK</title>
		<link>http://feedproxy.google.com/~r/luauf/~3/3NbbobVS-aQ/</link>
		<comments>http://luauf.com/2012/05/23/mis-primeros-pasos-con-android-sdk/#comments</comments>
		<pubDate>Thu, 24 May 2012 02:01:58 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Sistemas Operativos]]></category>
		<category><![CDATA[ADT]]></category>
		<category><![CDATA[AVD]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[hola mundo]]></category>
		<category><![CDATA[SDK]]></category>

		<guid isPermaLink="false">http://luauf.com/?p=1320</guid>
		<description><![CDATA[Hola Android, es mi primer aplicación en Android (repecto al clásico Hola Mundo solo difiere en la última palabra). En esta guía pretendo abarcar todo lo que necesitamos para empezar a escribir aplicaciones...]]></description>
				<content:encoded><![CDATA[<p><strong>Hola Android</strong>, es mi primer aplicación en Android (repecto al clásico Hola Mundo solo difiere en la última palabra).</p>
<p>En esta guía pretendo abarcar todo lo que necesitamos para empezar a escribir aplicaciones para <strong>Android</strong>: desde la instalación del JDK hasta la exportación del paquete APK e instalación en el dispositivo móvil.</p>
<p style="text-align: center;"><a href="http://luauf.com/wp-content/uploads/2012/05/android.gif"><img class="aligncenter size-medium wp-image-1336" title="android" src="http://luauf.com/wp-content/uploads/2012/05/android-300x185.gif" alt="" width="300" height="185" /></a></p>
<p><span id="more-1320"></span>Los siguientes 10 pasos relatan mi experiencia, derivada de: <a href="http://developer.android.com/sdk/installing.html">Installing the SDK</a>, <a href="http://developer.android.com/sdk/eclipse-adt.html#installing">Installing the ADT Plugin</a> y <a href="ttp://developer.android.com/resources/tutorials/hello-world.html">Hello, World</a></p>
<p>1 &#8211; Instalar el Development Kit de Java (<a href="http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u4-downloads-1591156.html">JDK</a>). Para el caso de Debian, Ubuntu, Mint o cualquier otro &#8220;debian based&#8221;:</p>
<p><strong>sudo apt-get install openjdk-6-jdk</strong></p>
<p>2- Descargar <a href="http://www.eclipse.org/downloads/">Eclipse</a>, <strong>Eclipse Classic</strong> preferentemente.</p>
<p>3- Descargar el <a href="http://developer.android.com/sdk/index.html">SDK Starter Package</a> de Android</p>
<p>4- Descomprimir ambos, <strong>Eclipse</strong> y <strong>Android SDK</strong> en alguna carpeta específica, yo lo hice en mi carpeta <strong>~/devel</strong></p>
<p>5- Correr Eclipse: <strong>~/devel/eclipse/eclipse</strong></p>
<p>6- Instalar el plugin de Android para Eclipse: ADT (Android Development Tool) . Para hacer esto, realizar los siguientes pasos en Eclipse, <strong>Help &gt; Install New Software</strong>&#8230;.</p>
<p>Hacer Clic en Add (arriba a la derecha) y completar con los siguientes datos:</p>
<ul>
<li>Name: ADT Plugin</li>
<li>Location: https://dl-ssl.google.com/android/eclipse/</li>
</ul>
<p><a style="text-align: center;" href="http://luauf.com/wp-content/uploads/2012/05/1.png"><img class="aligncenter size-medium wp-image-1322" title="1" src="http://luauf.com/wp-content/uploads/2012/05/1-300x218.png" alt="" width="300" height="218" /></a></p>
<p>Luego, del diálogo <strong>Available Software</strong>, seleccionar <strong>Developer Tools</strong> y continuar (Next). En la próxima ventana verás la lista de herramientas que serán descargadas, continuar (Next). Finalmente, leer y aceptar el acuerdo de licencia y terminar (Finish). Cuando la instalación haya terminado, reiniciar Eclipe.</p>
<p>Para más adelante, por actualizaciones, seleccionar <strong>Help &gt; Check for Updates.</strong></p>
<p>7- Configurar el<strong> ADT Plugin</strong></p>
<p>Seleccionar  <strong>Window &gt; Preferences</strong>&#8230;  y luego, del panel izquierdo: <strong>Android</strong>.</p>
<p>Lo primero que aparecerá es un diálogo preguntando si estamos de acuerdo con mandar estadísticas de uso a Google. Luego, nos solicitará: path del SDK, hacer clic en Browse y buscar el path donde descomprimimos el SDK (en mi caso, <strong>~/devel/android-sdk-linux)</strong>, aplicar y listo.</p>
<p>8 &#8211; Agregar plataformas y otros paquetes</p>
<p>El último paso antes de crear nuestro proyecto <strong>Hello Android</strong> es instalar varios paquetes y plataformas para las cuales desarrollaremos. Para esto hay una herramienta disponible en el directorio <strong>tools</strong> del <strong>sdk</strong>, en mi caso: <strong>~/devel/android-sdk-linux/tools/android. </strong>Se puede ejecutar la misma desde Eclipse: <strong>Window &gt; Adroid SDK Manager</strong></p>
<p><a href="http://luauf.com/wp-content/uploads/2012/05/2.png"><img class="aligncenter size-medium wp-image-1323" title="2" src="http://luauf.com/wp-content/uploads/2012/05/2-300x218.png" alt="" width="300" height="218" /></a></p>
<p>Con seleccionar Tools y la API de la plataforma para la que quieres desarrollar bastaría. No obstante, puedes ver los <a href="http://developer.android.com/sdk/installing.html#which">paquetes recomendados</a>.</p>
<p style="text-align: center;"><a href="http://luauf.com/wp-content/uploads/2012/05/3.png"><img class="aligncenter size-medium wp-image-1324" title="3" src="http://luauf.com/wp-content/uploads/2012/05/3-300x163.png" alt="" width="300" height="163" /></a></p>
<p>9 &#8211; Nuetro primer proyecto: <strong>Hello Android!</strong></p>
<p>Crear un <strong>AVD</strong> (Android Virtual Device): <strong>Window &gt; AVD Manager</strong> y <strong>New..</strong>. Se abrirá un díalogo donde completar el nombre del AVD y la plataforma (por ejemplo: Android  2.3.3).</p>
<p style="text-align: center;"><a href="http://luauf.com/wp-content/uploads/2012/05/4.png"><img class="aligncenter size-medium wp-image-1325" title="4" src="http://luauf.com/wp-content/uploads/2012/05/4-300x163.png" alt="" width="300" height="163" /></a></p>
<p>Crear un nuevo proyecto: <strong>File</strong> &gt; <strong>New</strong> &gt; <strong>Project</strong> y si el ADT fue bien instalado, debería aparecer una carpeta Android de donde debemos seleccionar<strong> Android Project </strong>y completar con los siguientes valores:</p>
<ul>
<li>Project name: HelloAndroid</li>
<li>Build Target: seleccinar una plataforma igual o menor a la del dispositivo virtual (AVD).</li>
<li>Application name: Hello, Android</li>
<li>Package name: com.example.helloandroid (o tu propio namespace privado)</li>
<li>Create Activity: HelloAndroid</li>
</ul>
<p>Y luego, <strong>Finish</strong>.</p>
<p>Creado el proyecto, podemos ver las primeras líneas de código en el archivo <strong>HelloAndroid.java</strong> (HelloAndroid &gt; src &gt; com.example.helloandroid). A las mismas, les agregamos algo de código para que se vea así:</p>
<p>[JAVA]<br />
package com.example.helloandroid;</p>
<p>import android.app.Activity;<br />
import android.os.Bundle;<br />
import android.widget.TextView;</p>
<p>public class HelloAndroid extends Activity {<br />
/** Called when the activity is first created. */<br />
@Override<br />
public void onCreate(Bundle savedInstanceState) {<br />
super.onCreate(savedInstanceState);<br />
TextView tv = new TextView(this);<br />
tv.setText(&#8220;Hello, Android&#8221;);<br />
setContentView(tv);<br />
}<br />
}<br />
[/JAVA]</p>
<p>Si quieres dar un pequeño paso más, puedes editar la GUI. Hacer doble clic en el archivo main.xml (HelloAndroid &gt; res &gt; layout) y agregar un botón (button1) con el texto &#8220;Salir&#8221;. Fíjate que la GUI se desarrolla en un archivo XML, pero gracias al ADT contamos con un editor gráfico &#8220;Graphical Layout&#8221;.</p>
<p style="text-align: center;"><a href="http://luauf.com/wp-content/uploads/2012/05/5.png"><img class="aligncenter size-medium wp-image-1326" title="5" src="http://luauf.com/wp-content/uploads/2012/05/5-300x163.png" alt="" width="300" height="163" /></a></p>
<p>Dejar el código, más o menos así:</p>
<p>[JAVA]<br />
package com.example.helloandroid;</p>
<p>import android.app.Activity;<br />
import android.os.Bundle;<br />
import android.view.View;<br />
import android.view.View.OnClickListener;<br />
import android.widget.Button;</p>
<p>public class HelloAndroid extends Activity {<br />
/** Called when the activity is first created. */<br />
@Override<br />
public void onCreate(Bundle savedInstanceState) {</p>
<p>super.onCreate(savedInstanceState);<br />
setContentView(R.layout.main);</p>
<p>Button boton = (Button) findViewById(R.id.button1);<br />
boton.setOnClickListener(new OnClickListener() {<br />
public void onClick(View v) {<br />
finish();<br />
System.exit(0);<br />
}<br />
});<br />
}<br />
}<br />
[/JAVA]</p>
<p>Correr la aplicación: Run &gt; Run y seleccionar &#8220;Android Application&#8221;. Ten paciencia, el emulador se puede tomar unos minutos en iniciar.</p>
<p style="text-align: center;"><a href="http://luauf.com/wp-content/uploads/2012/05/6.png"><img class="aligncenter size-medium wp-image-1327" title="6" src="http://luauf.com/wp-content/uploads/2012/05/6-300x272.png" alt="" width="300" height="272" /></a></p>
<p style="text-align: center;"><a href="http://luauf.com/wp-content/uploads/2012/05/7.png"><img class="aligncenter size-medium wp-image-1328" title="7" src="http://luauf.com/wp-content/uploads/2012/05/7-300x273.png" alt="" width="300" height="273" /></a></p>
<p>10 &#8211; Finalmente, luego de probar el ejemplo en la terminal virtual emulada, nos resta correrlo en el movil real. Para esto, sobre el proyecto creado (desde <strong>Package explorer</strong>) hacer clic derecho y seleccionar <strong>Android Tools \ Export Signed Application Package</strong> y seguir el asistente. Los firmaremos, de momento, con una key de debug (solo disponible para debugging), los datos que puede solicitar el asistente se detallan a continuación:</p>
<p>Keystore name: &#8220;debug.keystore&#8221;<br />
Keystore password: &#8220;android&#8221;<br />
Key alias: &#8220;androiddebugkey&#8221;<br />
Key password: &#8220;android&#8221;<br />
CN: &#8220;CN=Android Debug,O=Android,C=US&#8221;</p>
<p>Para saber más acerca de como firmar una aplicación ver <a href="http://developer.android.com/guide/publishing/app-signing.html">aquí</a>.</p>
<p>Solo queda copiar el apk generado al teléfono móvil e instalarlo (teniendo previamente habilitado <strong>Orígenes desconocidos</strong> en los <strong>Ajustes</strong> de <strong>Aplicaciones</strong>)</p>
<div>Eso es todo, espero que sirva y haya alcanzado, entiendo que si. Los próximos pasos en Android nos obligan a conocer algo más acerca del framework (<a href="http://developer.android.com/guide/topics/fundamentals/activities.html">Activities</a>, <a href="http://developer.android.com/guide/topics/fundamentals/services.html">Services</a>, <a href="http://developer.android.com/guide/topics/ui/index.html">User Interface</a>, <a href="http://developer.android.com/guide/topics/resources/index.html">Application Resources</a>, <a href="http://developer.android.com/guide/topics/data/data-storage.html">Data Storage</a>, etc.), Google Play, <a href="http://developer.android.com/guide/developing/index.html">Developing</a>, <a href="http://developer.android.com/guide/practices/compatibility.html">Best Practices</a>, etc. Nuestro próxima estación, por lo tanto, es  <strong><a href="http://developer.android.com/guide/index.html">allí</a>.</strong></div>
<div></div>
<img src="http://feeds.feedburner.com/~r/luauf/~4/3NbbobVS-aQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://luauf.com/2012/05/23/mis-primeros-pasos-con-android-sdk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://luauf.com/2012/05/23/mis-primeros-pasos-con-android-sdk/</feedburner:origLink></item>
		<item>
		<title>Alinear a la derecha los botones minimizar, maximizar y cerrar de Chromium en Gnome</title>
		<link>http://feedproxy.google.com/~r/luauf/~3/JiQe_b4whaY/</link>
		<comments>http://luauf.com/2012/05/04/alinear-a-la-derecha-los-botones-minimizar-maximizar-y-cerrar-de-chromium-en-gnome/#comments</comments>
		<pubDate>Fri, 04 May 2012 06:00:09 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sistemas Operativos]]></category>
		<category><![CDATA[Alineación]]></category>
		<category><![CDATA[Chromium]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://luauf.com/?p=1316</guid>
		<description><![CDATA[Una nueva ayuda memoria, en este caso, como alinear a la derecha los botones Minimizar, Maximizar y Cerrar en Chromium. Luego de instalar Ubuntu 12.04, gnome-shell y de personalizar todos los detalles de...]]></description>
				<content:encoded><![CDATA[<p>Una nueva ayuda memoria, en este caso, como alinear a la derecha los botones Minimizar, Maximizar y Cerrar en Chromium.</p>
<p>Luego de instalar Ubuntu 12.04, gnome-shell y de personalizar todos los detalles de mi escritorio, me encontré con un detalle estético poco feliz, que no era de mi agrado (que conste que era simplemente una cuestión personal). El <strong>detalle</strong>: los botones Minimizar, Maximizar y Cerrar de Chromium alineados a la izquierda x-(</p>
<p><a href="http://luauf.com/wp-content/uploads/2012/05/screenshot.png"><img class="aligncenter size-medium wp-image-1318" title="screenshot" src="http://luauf.com/wp-content/uploads/2012/05/screenshot-300x175.png" alt="" width="300" height="175" /></a></p>
<p><span id="more-1316"></span><br />
Como es la segunda vez que me encuentro con el mismo problema, y buscar la solución me demandó unos 10 minutos que no quiero perder la pròxima, dejo sentada aquí mi ayuda memoria:</p>
<p>Para cambiar la alineación de los botones minimizar, maximizar y cerrar a la derecha, simplemente ejecutar en una terminal:</p>
<p><strong>gconftool-2 &#8211;type string &#8211;set /apps/metacity/general/button_layout &#8220;menu:minimize,maximize,close&#8221;</strong></p>
<p>Si te gusta como quedaban a la izquierda (yo paso), puedes regresarlos de la siguiente forma:</p>
<p><strong>gconftool-2 &#8211;type string &#8211;set /apps/metacity/general/button_layout &#8220;close,minimize,maximize:&#8221;</strong></p>
<p>En uno u otro caso la actualización es inmediata, no se requiere reiniciar absolutamente nada.</p>
<img src="http://feeds.feedburner.com/~r/luauf/~4/JiQe_b4whaY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://luauf.com/2012/05/04/alinear-a-la-derecha-los-botones-minimizar-maximizar-y-cerrar-de-chromium-en-gnome/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://luauf.com/2012/05/04/alinear-a-la-derecha-los-botones-minimizar-maximizar-y-cerrar-de-chromium-en-gnome/</feedburner:origLink></item>
		<item>
		<title>Introducción a Control de Versiones con Git</title>
		<link>http://feedproxy.google.com/~r/luauf/~3/YPbQ9AGjV4o/</link>
		<comments>http://luauf.com/2012/02/25/introduccion-a-control-de-versiones-con-git/#comments</comments>
		<pubDate>Sun, 26 Feb 2012 00:47:54 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Gestión]]></category>
		<category><![CDATA[Miscelaneas]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[control de versiones]]></category>
		<category><![CDATA[CVS]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[Repositorio]]></category>
		<category><![CDATA[SVN]]></category>
		<category><![CDATA[versiones]]></category>

		<guid isPermaLink="false">http://luauf.com/?p=1199</guid>
		<description><![CDATA[Git es un software de control de versiones, como lo son, por ejemplo: CVS, SVN o VSS. Git fue diseñado por Torvalds con el objetivo de llevar el kernel de Linux en un...]]></description>
				<content:encoded><![CDATA[<p><strong>Git</strong> es un software de control de versiones, como lo son, por ejemplo: CVS, SVN o VSS.</p>
<p><strong>Git</strong> fue diseñado por <strong>Torvalds</strong> con el objetivo de llevar el kernel de Linux en un repositorio confiable o como el propio <strong>Linus</strong> dijo &#8220;rápido, muy rápido, fácil, bonito y espectacular&#8221;.</p>
<p style="text-align: center;"><a href="http://luauf.com/wp-content/uploads/2012/02/git_logo.png"><img class="aligncenter size-medium wp-image-1258" title="git_logo" src="http://luauf.com/wp-content/uploads/2012/02/git_logo-300x164.png" alt="" width="300" height="164" /></a></p>
<p>Una de las referencias de Linus en el diseño de <strong>git</strong> fue CVS, pero como un ejemplo de lo que NO HAY QUE HACER, pues lo sufrió durante siete años en una compañía y allí aprendió a odiarlo con pasión. Linus tampoco quizo probar con SVN, pues el lema de SVN era &#8220;hacer CVS bien&#8221;, y eso ya lo condenaba, pues no había forma de hacer a CVS bien.</p>
<p>Dejando de lado las anécdotas anteriores, Git es utilizado por la mayoría de los desarrollos open source de la actualidad:</p>
<ul>
<li>El propio Git</li>
<li>Linux Kernel</li>
<li>Perl</li>
<li>Eclipse</li>
<li>Gnome</li>
<li>KDE</li>
<li>Qt</li>
<li>Ruby on Rails</li>
<li>Android</li>
<li>PostgreSQL</li>
<li>Debian</li>
<li>X.org</li>
</ul>
<p><span id="more-1199"></span>Para quienes no saben lo que es un software control de versiones, básicamente, se puede resumir en un servidor donde se suben los archivos de un proyecto y a medida que se van modificando se van registrando y documentando estos cambios (versionando). En principio la idea es sencilla y más de un improvisado podría cuestionar el uso del mismo. No obstante, en la medida que un proyecto crece, la cantidad de archivos aumenta, los cambios y la cantidad de programadores también, resulta totalmente insostenible trabajar sin un control de versiones.</p>
<p>Trabajar sin control de versiones implica no saber donde está el último fuente, arrancar trabajando de una versión anterior y perderse los cambios de la que realmente era la última, no saber cuales son y quien realizó los cambios, no deshacer fácilmente los cambios realizados (downgrade), o no poder facilitar la transición a una versión totalmente nueva de un proyecto manteniendo el soporte a la anterior.</p>
<p>Una cosa más, la mayoría de los IDEs actuales tienen integración con Git, o si no la tienen, tienen algún plugin para hacerlo. Ahora, si no utilizas un IDE, tu caso es un poco más delicado <img src='http://luauf.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Sin más preámbulos, vamos a la práctica. En mis prácticas no utilizaré IDE, utilizaré un único archivo fuente y utilizaré el mismo equipo (dotado con Ubuntu Linux) como repositorio y cliente. Por lo tanto, primero, descargaré lo necesario: apt-get install git-core</p>
<p>Primer paso, en rol de &#8220;servidor&#8221;, creo el repositorio:<br />
[CODE]<br />
$ git init mi_repositorio<br />
[/CODE]</p>
<p>Initialized empty Git repository in /home/luciano/mi_repositorio/.git/</p>
<p>En caso de no pasar el último argumento, en mi caso: mi_repositorio, el repositorio se inicializará en el directorio actual.</p>
<p>Ahora, en rol de &#8220;cliente&#8221;, supongamos que tengo mis desarrollos en este path:<br />
[CODE]<br />
$ pwd<br />
/home/luciano/desarrollo<br />
[/CODE]<br />
Si quiero &#8220;sincronizar&#8221; mi directorio de desarrollo con el repositorio de git, debe hacer un &#8220;clone&#8221;, así:<br />
[CODE]<br />
$ git clone /home/luciano/mi_repositorio<br />
Cloning into luciano&#8230;<br />
done.<br />
warning: You appear to have cloned an empty repository.<br />
[/CODE]<br />
Estamos arrancando de cero, por lo tanto el warning es ignorable <img src='http://luauf.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>El argumento que cambiará del &#8220;clone&#8221; en el caso que el repositorio se encuentre en otro servidor, será el path del repositorio, que deberá ser antecedido por usuario@host, por ejemplo:<br />
[CODE]<br />
git clone username@host:/path/to/repository<br />
[/CODE]</p>
<p>Un repositorio administrador por git cuenta con lo que se denominan tres árboles, el primero, el directorio local (directorio de trabajo). El segundo es un &#8220;directorio intermedio&#8221; a donde van a parar los archivos que se agregan al proyecto, finalmente el &#8220;HEAD&#8221; donde reside la última versión confirmada. Ahora, veremos como agregar un archivo al repositorio y como &#8220;commitearlo&#8221;.</p>
<p>Primero, creo un archivo fuente en mi directorio de trabajo:</p>
<p>[CODE]<br />
$ pwd<br />
/home/luciano/desarrollo<br />
$ cd mi_repositorio<br />
$ touch holamundo.c<br />
[/CODE]</p>
<p>Observen lo siguiente, no hay nada que decir:<br />
[CODE]<br />
$ git status<br />
# On branch master<br />
#<br />
# Initial commit<br />
#<br />
# Untracked files:<br />
# (use &#8220;git add &#8230;&#8221; to include in what will be committed)<br />
#<br />
# holamundo.c<br />
nothing added to commit but untracked files present (use &#8220;git add&#8221; to track)<br />
[/CODE]</p>
<p>Ahora, agrego el archivo al repositorio:<br />
[CODE]<br />
$ git add holamundo.c<br />
[/CODE]</p>
<p>Finalmente, commit:<br />
[CODE]<br />
$ git commit -m &#8220;revision inicial&#8221; holamundo.c<br />
[master (root-commit) 2b983d9] revision inicial<br />
Committer: Luciano<br />
[/CODE]</p>
<p>Ahora, el estado nuevamente:<br />
[CODE]<br />
$ git status<br />
# On branch master<br />
nothing to commit (working directory clean)<br />
[/CODE]</p>
<p>Un último comentario acerca de lo último, el commit quedó registrado con mi usuario (Committer) y mi host luciano@lucid.</p>
<p>Una opción, antes de lo anterior, es setear esos valores de la siguiente forma:<br />
[CODE]<br />
$ git config –global user.name “Juan Del Rio”<br />
$ git config –global user.email juan@delrio.com<br />
[/CODE]</p>
<p>Ahora, modifico el fuente y observo el estado de nuevo:<br />
[CODE]<br />
$ echo &#8220;/* holamundo program */&#8221; &gt; holamundo.c</p>
<p>$ git status<br />
# On branch master<br />
# Changes not staged for commit:<br />
# (use &#8220;git add &#8230;&#8221; to update what will be committed)<br />
# (use &#8220;git checkout &#8212; &#8230;&#8221; to discard changes in working directory)<br />
#<br />
# modified: holamundo.c<br />
#<br />
no changes added to commit (use &#8220;git add&#8221; and/or &#8220;git commit -a&#8221;)<br />
[/CODE]</p>
<p>Hay cambios sin &#8220;commitear&#8221;, por lo tanto, hago un nuevo commit:<br />
[CODE]<br />
$ git commit -m &#8220;agregue encabezado&#8221; holamundo.c</p>
<p>$ git status<br />
# On branch master<br />
nothing to commit (working directory clean)<br />
[/CODE]</p>
<p>Para terminar (por ahora), si elimino el archivo:<br />
[CODE]<br />
$ rm holamundo.c</p>
<p>$ git status<br />
# On branch master<br />
# Changes not staged for commit:<br />
# (use &#8220;git add/rm &#8230;&#8221; to update what will be committed)<br />
# (use &#8220;git checkout &#8212; &#8230;&#8221; to discard changes in working directory)<br />
#<br />
# deleted: holamundo.c<br />
#<br />
no changes added to commit (use &#8220;git add&#8221; and/or &#8220;git commit -a&#8221;)<br />
[/CODE]</p>
<p>Por lo tanto debo:<br />
[CODE]<br />
$ git rm holamundo.c<br />
$ git commit -m &#8220;bye bye adios&#8221; holamundo.c<br />
$ git status<br />
# On branch master<br />
nothing to commit (working directory clean)<br />
[/CODE]</p>
<p>Por hoy esto es todo, a pesar de que es muy poco y aún no es lo suficiente para compreder las virtudes de un sistema de control de versiones, basta para saber como hacer &#8220;altas, bajas y modificaciones&#8221;.</p>
<p>En la próxima entrega, quedo comprometido en tratar los &#8220;push&#8221; a un servidor remoto, trabajar con &#8220;branches&#8221;, hacer &#8220;merges&#8221; y un poco más.</p>
<div></div>
<img src="http://feeds.feedburner.com/~r/luauf/~4/YPbQ9AGjV4o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://luauf.com/2012/02/25/introduccion-a-control-de-versiones-con-git/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://luauf.com/2012/02/25/introduccion-a-control-de-versiones-con-git/</feedburner:origLink></item>
		<item>
		<title>Ayuda memoria: loops infinitos en el shell</title>
		<link>http://feedproxy.google.com/~r/luauf/~3/n12OApAFwt4/</link>
		<comments>http://luauf.com/2012/01/26/ayuda-memoria-loops-infinitos-en-el-shell/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 01:44:47 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Miscelaneas]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[UNIX]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[bucle]]></category>
		<category><![CDATA[infinito]]></category>
		<category><![CDATA[ksh]]></category>
		<category><![CDATA[LOOP]]></category>
		<category><![CDATA[sh]]></category>
		<category><![CDATA[Shell]]></category>

		<guid isPermaLink="false">http://luauf.com/?p=1197</guid>
		<description><![CDATA[Este blog, me ha sido en más de una ocasión, mi ayuda memoria ideal. En otras tantas ocasiones, un link al mismo me permitió &#8220;ayudar al prójimo&#8221;, más bien, ahorrarme tiempo de utilización...]]></description>
				<content:encoded><![CDATA[<p>Este blog, me ha sido en más de una ocasión, mi ayuda memoria ideal. En otras tantas ocasiones, un link al mismo me permitió &#8220;ayudar al prójimo&#8221;, más bien, ahorrarme tiempo de utilización de cuerdas vocales y ahorrar al otro el fastidio de escucharme.</p>
<p>Por tal motivo, y ante un requerimiento del primer tipo (como &#8220;ayuda memoria&#8221;) quiero publicar algo que frecuentemente utilizo (o que cuando no es tan frecuente mi fragil memoria olvida):</p>
<p><strong>¿Cómo hacer un loop infinito en un intérprete de comandos (sh, ksh o similar)?</strong></p>
<p>Pongamos unas comillas al &#8220;infinito&#8221;, todo concluye al fin, nada puede escapar a un <strong>Ctrl+C</strong> o a un break (produce un abandono inmediato) dentro del bucle.</p>
<p><span id="more-1197"></span></p>
<pre>while :; do
  # Todo lo que quieras repetir infinitas veces
  echo "Hola Mundo"
  sleep 2
done</pre>
<p>No olvides el sleep, sino pasarán cosas muy rápido <img src='http://luauf.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Otras opciones son utilizar las <em>palabras especiale</em>s <strong>true</strong> (indica que una condición en verdadera) y <strong>false</strong> (indica que una condición es falsa) de<strong> bash</strong>:</p>
<pre>while true; do
  ...
  ...
done</pre>
<p>O:</p>
<pre>until false; do
  ...
  ...</pre>
<pre>done</pre>
<div></div>
<img src="http://feeds.feedburner.com/~r/luauf/~4/n12OApAFwt4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://luauf.com/2012/01/26/ayuda-memoria-loops-infinitos-en-el-shell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://luauf.com/2012/01/26/ayuda-memoria-loops-infinitos-en-el-shell/</feedburner:origLink></item>
		<item>
		<title>Exportar una base de datos MDB a SQL (mysql, oracle, sybase, etc.)</title>
		<link>http://feedproxy.google.com/~r/luauf/~3/6MzG6H18oas/</link>
		<comments>http://luauf.com/2011/09/12/exportar-una-base-de-datos-mdb-a-sql-mysql-oracle-sybase-etc/#comments</comments>
		<pubDate>Tue, 13 Sep 2011 02:00:38 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[access]]></category>
		<category><![CDATA[exportar]]></category>
		<category><![CDATA[mdb]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Postgres]]></category>
		<category><![CDATA[sybase]]></category>

		<guid isPermaLink="false">http://luauf.com/?p=1193</guid>
		<description><![CDATA[Recuerdo instantes de mi pasado donde he tenido la necesidad de llevar Bases de Datos MDB, Microsoft Access, a bases de datos MySQL. Recuerdo por entonces MySQL Migration Toolkit, una herramienta para realizar...]]></description>
				<content:encoded><![CDATA[<p>Recuerdo instantes de mi pasado donde he tenido la necesidad de llevar Bases de Datos MDB, Microsoft Access, a bases de datos MySQL.</p>
<p>Recuerdo por entonces MySQL Migration Toolkit, una herramienta para realizar esta carga requerida. No obstante no era de mi agrado, y lo que buscaba por entonces era simplemente obtener un script SQL con el código DDL y DML necesario para el CREATE de los objetos de la base de datos y los INSERTs de los datos. A esa utilidad, hoy Linuxeando, le encontré el nombre: <strong><a href="http://mdbtools.sourceforge.net/">mdbtools</a></strong>.</p>
<p>MDBtools es un suite de herramientas (mdb-array mdb-header mdb-parsecsv mdb-schema mdb-tables mdb-export mdb-hexdump mdb-prop mdb-sql mdb-ver) que permiten, entre sus funciones, obtener  esquema de una base de datos y exportar en SQL los datos de la misma.</p>
<p><span id="more-1193"></span>Veamos un ejemplo básico y sencillo que consiste en:</p>
<ul>
<li>Exportar el diseño de la vieja y querida Neptuno.mdb (conocida base de datos distribuida como ejemplo con Microsoft Access) en formato de sentencias de definición de datos SQL.</li>
<li>Obtener el nombre de las tablas de la misma base de datos</li>
<li>Exportar los datos de cada tabla bajo la forma de INSERTs SQL.</li>
</ul>
<p>[CODE]<br />
$ sudo aptitude install mdbtools</p>
<p>$ mdb-schema Neptuno.mdb mysql &gt; Neptuno_schema.sql #donde mysql se puede reemplazar por otro dialecto: oracle, sybase o postgres.</p>
<p>$ for tabla in `cat Neptuno_tables.txt`; do mdb-export -R \; -I Neptuno.mdb ${tabla}; done &gt; Neptuno_data.sql</p>
<p>$ rm Neptuno_tables.txt<br />
[/CODE]</p>
<p>Fácil, sencillo y util&#8230; lástima que en mi caso llega tarde, no obstante en conocimiento perdura y nadie puede asegurarme que no me encuentre alguna vieja MDB en mi camino.</p>
<p>Vía: <a href="http://www.wikipeando.com/index.php/archives/481">Wikipeando</a></p>
<img src="http://feeds.feedburner.com/~r/luauf/~4/6MzG6H18oas" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://luauf.com/2011/09/12/exportar-una-base-de-datos-mdb-a-sql-mysql-oracle-sybase-etc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://luauf.com/2011/09/12/exportar-una-base-de-datos-mdb-a-sql-mysql-oracle-sybase-etc/</feedburner:origLink></item>
		<item>
		<title>¿Cómo conectarse a MySQL desde un programa en C?</title>
		<link>http://feedproxy.google.com/~r/luauf/~3/NhUS4VgjhzU/</link>
		<comments>http://luauf.com/2011/07/09/%c2%bfcomo-conectarse-a-mysql-desde-un-programa-en-c/#comments</comments>
		<pubDate>Sat, 09 Jul 2011 18:01:54 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[librerias]]></category>

		<guid isPermaLink="false">http://luauf.com/?p=1192</guid>
		<description><![CDATA[La respuesta al título de esta publicación es muy sencilla, conectarse a MySQL desde C se realiza mediante una API provista por el mismo proveedor de base de datos. La API de C...]]></description>
				<content:encoded><![CDATA[<p>La respuesta al título de esta publicación es muy sencilla, conectarse a MySQL desde C se realiza mediante una API provista por el mismo proveedor de base de datos.</p>
<p>La API de C es ditribuida con MySQL, no es más que una librería (libmysqlclient) que interfacea entre el programa y la base de datos.</p>
<p>La documentación provista por MySQL es muy completa (<a href="http://dev.mysql.com/doc/refman/5.0/en/c.html">MySQL C API</a>), no obstante, fiel a nuestra costumbre iremos a un ejemplo sencillo y concreto.</p>
<p><span id="more-1192"></span>¿Qué necesitamos?</p>
<ul>
<li>Un servidor de base de datos MySQL, al cual conectarnos</li>
<li>Un programa cliente</li>
<li>La librería mysqlclient</li>
<li>mysql-devel, headers con la firma de la librería</li>
<li>gcc</li>
</ul>
<p>Con cualquier variante de UNIX más la instalación manual de la distribución binaria (tar.gz) tendremos todo lo que necesitamos. Caso contrario habrá que instalar los paquetes necesarios que incluya los requisitos mencionados, por ejemplo <strong>mysql-devel</strong>.</p>
<p>Primero, sin ir al detalle en concreto de cada línea (no cuesta nada interpretar el código, pues está bien comentado) veamos el siguiente fuente:</p>
<p>[C]<br />
/* mi_cliente */<br />
#include<br />
#include</p>
<p>main() {<br />
MYSQL *conn;<br />
MYSQL_RES *res;<br />
MYSQL_ROW row;</p>
<p>char *server = &#8220;localhost&#8221;;<br />
char *user = &#8220;root&#8221;;<br />
char *password = &#8220;PASSWORD&#8221;; /* set me first */<br />
char *database = &#8220;mysql&#8221;;</p>
<p>conn = mysql_init(NULL);</p>
<p>/* Connect to database */<br />
if (!mysql_real_connect(conn, server,<br />
user, password, database, 0, NULL, 0)) {<br />
fprintf(stderr, &#8220;%s\n&#8221;, mysql_error(conn));<br />
exit(1);<br />
}</p>
<p>/* send SQL query */<br />
if (mysql_query(conn, &#8220;show tables&#8221;)) {<br />
fprintf(stderr, &#8220;%s\n&#8221;, mysql_error(conn));<br />
exit(1);<br />
}</p>
<p>res = mysql_use_result(conn);</p>
<p>/* output table name */<br />
printf(&#8220;MySQL Tables in mysql database:\n&#8221;);<br />
while ((row = mysql_fetch_row(res)) != NULL)<br />
printf(&#8220;%s \n&#8221;, row[0]);</p>
<p>/* close connection */<br />
mysql_free_result(res);<br />
mysql_close(conn);<br />
}<br />
[/C]</p>
<p>Ahora si veamos la parte más interesa saber ¿cómo compilar?</p>
<p>Entre los argumentos a pasarle al gcc tenemos los directorios con las librerías, las librerías propiamente dichas, los directorios de encabezados (.h), y otras opciones más del compilador. Esto no representa ningún problema, menos aún con <a href="http://dev.mysql.com/doc/refman/5.0/en/mysql-config.html. mysql_config">mysql_config</a>  es un pequeño utilitario de MySQL que provee información para el compilador.</p>
<p>De esta forma:</p>
<ul>
<li><strong>mysql_config &#8211;libs</strong>: devuelve los path de las librerías y las librerías propiamente dichas a linkear.</li>
<li><strong>mysql_config &#8211;cflags</strong>: devuelve, entre otros argumentos, los path de los headers.</li>
</ul>
<p>Finalmente, podemos compilar de esta manera tan sencilla:</p>
<pre>$ gcc -o mi_cliente $(mysql_config --cflags) mi_cliente.c $(mysql_config --libs)</pre>
<p>Y luego ejecutar:</p>
<pre>$ ./mi_cliente</pre>
<p>Realmente, muy sencillo ¿no?</p>
<p>Vía: <a href="http://www.cyberciti.biz/tips/linux-unix-connect-mysql-c-api-program.html">nixCraft</a></p>
<img src="http://feeds.feedburner.com/~r/luauf/~4/NhUS4VgjhzU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://luauf.com/2011/07/09/%c2%bfcomo-conectarse-a-mysql-desde-un-programa-en-c/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://luauf.com/2011/07/09/%c2%bfcomo-conectarse-a-mysql-desde-un-programa-en-c/</feedburner:origLink></item>
		<item>
		<title>Ya falta menos para Gnome 3</title>
		<link>http://feedproxy.google.com/~r/luauf/~3/B3rI8AG9OKs/</link>
		<comments>http://luauf.com/2011/01/26/ya-falta-menos-para-gnome-3/#comments</comments>
		<pubDate>Thu, 27 Jan 2011 00:54:37 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sistemas Operativos]]></category>
		<category><![CDATA[Gnome]]></category>
		<category><![CDATA[gnome shell]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[Shell]]></category>

		<guid isPermaLink="false">http://luauf.com/?p=1185</guid>
		<description><![CDATA[En medio de las vacaciones de verano del hemisferio sur, y entre tantas pobres noticias del mercado futbolero y automotriz; aparece en mis feeds GNOME 3 &#8211; Made of Easy. Fue esa lectura...]]></description>
				<content:encoded><![CDATA[<p>En medio de las vacaciones de verano del hemisferio sur, y entre tantas pobres noticias del mercado futbolero y automotriz; aparece en mis feeds <a href="http://gnome3.org/">GNOME 3 &#8211; Made of Easy</a>. Fue esa lectura la que me hizo recordar de Gnome 3, la esperada novedad que debería salir a la luz no antes de Abril del presente año&#8230; aunque de ahí a que llegue a las principales distros de Linux habrá que esperar algo más.</p>
<p><em>&#8220;El nuevo escritorio de GNOME eleva la elegancia a un nuevo nivel. Simple, bello, GNOME3 ha &lt;barrido&gt; el desorden existente para llegar a un escritorio sencillo, simple, facil de usar y más hermoso que nunca; con nuevo tema, nueva fuente y animaciones cuidadas.&#8221;</em></p>
<p style="text-align: center;"><a href="http://luauf.com/wp-content/uploads/2011/01/window-picker.png"><img class="aligncenter size-medium wp-image-1190" title="window-picker" src="http://luauf.com/wp-content/uploads/2011/01/window-picker-300x225.png" alt="" width="300" height="225" /></a></p>
<p>No obstante, ansioso, sin poder esperar su lanzamiento hice lo mismo que había echo tiempo atrás, <a href="http://gnome3.org/tryit.html">Try it out</a>!. El proceso es sencillo, bajar los fuentes y compilar&#8230; cosa que está bien <a href="http://live.gnome.org/GnomeShell#building">aqui</a>, que se resume en pocos pasos y que de no mediar problemas, <strong>apt-get install</strong>&#8216;s de por medio se resume en:</p>
<p><span id="more-1185"></span></p>
<ul>
<li>curl -O http://git.gnome.org/browse/gnome-shell/plain/tools/build/gnome-shell-build-setup.sh</li>
<li>/bin/bash gnome-shell-build-setup.sh</li>
<li>sudo rm -rf /usr/lib*/*.la</li>
<li>jhbuild build</li>
</ul>
<p>Finalmente, para ejecutar el nuevo shell:</p>
<ul>
<li>cd ~/gnome-shell/source/gnome-shell/src</li>
<li>sudo ./gnome-shell &#8211;replace</li>
</ul>
<p>Luego de eso, deberiamos poder empezar a disfrutar de un entorno nuevo, sencillo, cuidado y que representa la principal innovación en GNOME en años.</p>
<p><a href='http://luauf.com/2011/01/26/ya-falta-menos-para-gnome-3/app-picker/' title='app-picker'><img width="150" height="150" src="http://luauf.com/wp-content/uploads/2011/01/app-picker-150x150.png" class="attachment-thumbnail" alt="app-picker" /></a><br />
<a href='http://luauf.com/2011/01/26/ya-falta-menos-para-gnome-3/overview-big/' title='overview-big'><img width="150" height="150" src="http://luauf.com/wp-content/uploads/2011/01/overview-big-150x150.png" class="attachment-thumbnail" alt="overview-big" /></a><br />
<a href='http://luauf.com/2011/01/26/ya-falta-menos-para-gnome-3/search-big/' title='search-big'><img width="150" height="150" src="http://luauf.com/wp-content/uploads/2011/01/search-big-150x150.png" class="attachment-thumbnail" alt="search-big" /></a><br />
<a href='http://luauf.com/2011/01/26/ya-falta-menos-para-gnome-3/search-results/' title='search-results'><img width="150" height="150" src="http://luauf.com/wp-content/uploads/2011/01/search-results-150x150.png" class="attachment-thumbnail" alt="search-results" /></a><br />
<a href='http://luauf.com/2011/01/26/ya-falta-menos-para-gnome-3/window-picker/' title='window-picker'><img width="150" height="150" src="http://luauf.com/wp-content/uploads/2011/01/window-picker-150x150.png" class="attachment-thumbnail" alt="window-picker" /></a></p>
<img src="http://feeds.feedburner.com/~r/luauf/~4/B3rI8AG9OKs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://luauf.com/2011/01/26/ya-falta-menos-para-gnome-3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://luauf.com/2011/01/26/ya-falta-menos-para-gnome-3/</feedburner:origLink></item>
		<item>
		<title>Borrar los archivos de más de N días (en Windows)</title>
		<link>http://feedproxy.google.com/~r/luauf/~3/pGvn8Fng2BQ/</link>
		<comments>http://luauf.com/2010/12/04/borrar-los-archivos-de-mas-de-n-dias-en-windows/#comments</comments>
		<pubDate>Sat, 04 Dec 2010 19:19:03 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Miscelaneas]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Sistemas Operativos]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[bat]]></category>
		<category><![CDATA[borrar archivos]]></category>
		<category><![CDATA[purgar]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[shell script]]></category>

		<guid isPermaLink="false">http://luauf.com/?p=1184</guid>
		<description><![CDATA[Las publicaciones al blog son cada vez más esporádicas, no por eso poco importantes. Es decir, aveces prefiero publicar poco y útil antes que periódico e inservible. En este caso, quiero aportar a...]]></description>
				<content:encoded><![CDATA[<p>Las publicaciones al blog son cada vez más esporádicas, no por eso poco importantes. Es decir, aveces prefiero publicar poco y útil antes que periódico e inservible.</p>
<p>En este caso, quiero aportar a este blog (mi humilde base de conocimientos) una forma muy sencilla de eliminar archivos de más de N de días de antigüedad en forma automática (ideal para ejecutar por el programador de tareas), algo muy útil para purgar logs o borrar temporales inútiles. En mi caso, fue utilizado para eliminar imágenes periódicas de una cámara IP (JPEG posting) que al final del día unía en un video diario.</p>
<p style="text-align: center;">
<p>Luego de buscar y buscar y estando a punto de escribir un Windows shell script bastante artesanal me encontré con <a href="http://ss64.com/nt/forfiles.html">FORFILES</a>, un <a href="http://ss64.com/nt/">comando de Windows</a>, que permite de una forma sencilla de seleccionar uno o más archivos y ejecutar un comando sobre los mismos.</p>
<p><span id="more-1184"></span><br />
Está de más decir que lo primero que deberías hacer es ver como funciona FORFILES:</p>
<p>[CODE]<br />
forfiles /?<br />
[/CODE]</p>
<p>De todas formas, si eres algo perezoso, aquí va la solución al problema que da título a esta presentación:</p>
<p>[CODE]<br />
forfiles -p &#8220;C:\donde\esten\tus\archivos&#8221; -s -m *.* -d -c &#8220;cmd /c del @path&#8221;<br />
[/CODE]</p>
<p>Vía: <a href="http://stackoverflow.com/questions/51054/batch-file-to-delete-files-older-than-n-days">stackoverflow</a></p>
<img src="http://feeds.feedburner.com/~r/luauf/~4/pGvn8Fng2BQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://luauf.com/2010/12/04/borrar-los-archivos-de-mas-de-n-dias-en-windows/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://luauf.com/2010/12/04/borrar-los-archivos-de-mas-de-n-dias-en-windows/</feedburner:origLink></item>
		<item>
		<title>Hojas de referencia de comandos de UNIX, vi/vim, etc.</title>
		<link>http://feedproxy.google.com/~r/luauf/~3/Qf_zfPcJqKo/</link>
		<comments>http://luauf.com/2010/09/27/hojas-de-referencia-de-comandos-de-unix-vivim-etc/#comments</comments>
		<pubDate>Mon, 27 Sep 2010 11:00:14 +0000</pubDate>
		<dc:creator>Luciano</dc:creator>
				<category><![CDATA[Miscelaneas]]></category>
		<category><![CDATA[UNIX]]></category>
		<category><![CDATA[cheat sheet]]></category>
		<category><![CDATA[Comandos]]></category>
		<category><![CDATA[hojas de referencia]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[rgb]]></category>
		<category><![CDATA[vi]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://luauf.com/?p=1178</guid>
		<description><![CDATA[Y un día volví&#8230; y como no podía ser de otra manera con las clásicas hojas de referencia, para imprimir y tener a nuestro lado en los escritorios. Como lo más destacado de...]]></description>
				<content:encoded><![CDATA[<p>Y un día volví&#8230; y como no podía ser de otra manera con las clásicas hojas de referencia, para imprimir y tener a nuestro lado en los escritorios.</p>
<p>Como lo más destacado de este post, les dejo una cheatsheet de comandos de UNIX.</p>
<p style="text-align: center;"><a href="http://luauf.com/wp-content/uploads/2010/09/unix_commands_cheatsheet.jpg"><img class="aligncenter size-thumbnail wp-image-1179" title="unix_commands_cheatsheet" src="http://luauf.com/wp-content/uploads/2010/09/unix_commands_cheatsheet-150x150.jpg" alt="" width="150" height="150" /></a></p>
<p style="text-align: center;">
<p><span id="more-1178"></span>Y como plus, algunas cheatsheet varias, de esas que encontrarás miles en Internet. Son una hoja de referencia de vi/vim (a menos que trabajes hace tiempo con vi o vim, esta hoja te será muy útil inclusive para saber como salir del editor <img src='http://luauf.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ).</p>
<p style="text-align: center;"><a href="http://luauf.com/wp-content/uploads/2010/09/vi-vim-cheat-sheet.gif"><img class="aligncenter size-medium wp-image-1180" title="vi-vim-cheat-sheet" src="http://luauf.com/wp-content/uploads/2010/09/vi-vim-cheat-sheet-300x212.gif" alt="" width="300" height="212" /></a></p>
<p>Y además, otras dos hojas acerca de las equivalencias en colores RGB/Hexadecimal (para imprimir a colores) y otra de JQuery, estas últimas dos para webmasters por sobre todas las cosas.</p>
<p style="text-align: center;"><a href="http://luauf.com/wp-content/uploads/2010/09/rgb-hex-cheat-sheet-v1.png"><img class="aligncenter size-medium wp-image-1181" title="rgb-hex-cheat-sheet-v1" src="http://luauf.com/wp-content/uploads/2010/09/rgb-hex-cheat-sheet-v1-220x300.png" alt="" width="220" height="300" /></a></p>
<p style="text-align: center;"><a href="http://luauf.com/wp-content/uploads/2010/09/Jquery-Cheat-Sheet-1.2.png"><img class="aligncenter size-medium wp-image-1182" title="Jquery-Cheat-Sheet-1.2" src="http://luauf.com/wp-content/uploads/2010/09/Jquery-Cheat-Sheet-1.2-300x225.png" alt="" width="300" height="225" /></a></p>
<p>Vía: <a href="http://www.pixelbeat.org/cmdline.html">PixelBeat</a></p>
<img src="http://feeds.feedburner.com/~r/luauf/~4/Qf_zfPcJqKo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://luauf.com/2010/09/27/hojas-de-referencia-de-comandos-de-unix-vivim-etc/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://luauf.com/2010/09/27/hojas-de-referencia-de-comandos-de-unix-vivim-etc/</feedburner:origLink></item>
	</channel>
</rss>
