tag:blogger.com,1999:blog-80408893496827674302023-11-16T16:16:52.668+01:00Felinfo: Java, Linux, Virtualización. Open Source.Ideas, trucos, sugerencias acerca del software libre y la programación.Felipe Martínez D.http://www.blogger.com/profile/04078426213350478089noreply@blogger.comBlogger109125tag:blogger.com,1999:blog-8040889349682767430.post-32883031626078286982017-01-13T14:18:00.000+01:002017-01-13T14:18:54.757+01:00Convertir un archivo epub a mobi (Kindle) desde Linux<img alt="kindle" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBY32EfpV1B-xDNDEZYnmvHiXVzjNqPiUjnrW_YGh4FAWVaqTOaxiYvQpbsXy74AAxLs7sepyWmdWyJhoiv3xxQYmu0djRMCCSfe1CAyYhdupYZ8ZpoE6NSum4SHF-dN4HBshj0cgQHu4d/s200/Kindle_Paperwhite.png" width="166" /><br />
<span style="font-family: "verdana" , sans-serif;">Para poder leer un archivo <b>epub </b> en un <b>Kindle</b>, hay que <b>convertir a </b>formato <b>mobi</b>. Vamos a ver cómo hacerlo en Linux desde la línea de comandos:</span><br />
<br />
Instalar Calibre (si estamos en Archlinux o derivadas):<br />
<pre><code class="language-sh">yaour -S calibre
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Convertir el archivo epub en mobi:</span><br />
<pre><code class="language-sh">ebook-convert archivo.epub .mobi
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Con esto obtendríamos el archivo .mobi que podemos pasar a nuestro Kindle y disfrutar de una buena lectura.</span>Felipe Martínez D.http://www.blogger.com/profile/04078426213350478089noreply@blogger.com0tag:blogger.com,1999:blog-8040889349682767430.post-9563170949015627112017-01-12T16:06:00.000+01:002017-01-12T16:06:02.759+01:00Uso básico de Git y Github<img alt="git" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJaVsilpmUOrYYOAGDC2FvYJ6DO9HLttpV6OS-QhsNy2JFYdJHTUjbRbZYdqPVvNnq4ESpEkOrZtWzoZPfWO150ZjRoSV5T4t_pVNZrqiscTSzAIr3IJmGDUVEetARmv-dDR2UTwG0D-5W/s200/git-logo.png" width="200" /><br />
<span style="font-family: "verdana" , sans-serif;"><a href="https://es.wikipedia.org/wiki/Git">Git</a> es un gran sistema de control de versiones creado por Linus Torvalds y uno de los más utilizados en la actualidad. Pasemos a ver cómo utilizar sus funciones más básicas:</span><br />
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Instalar Git (en distribuciones Arch Linux y derivadas):</span><br />
<pre><code class="language-bash">sudo pacman -S git
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Configurar el nombre de usuario e email:</span><br />
<pre><code class="language-bash">git config --global user.name <span class="hljs-string">"(usuario)"</span>
git config --global user.email <span class="hljs-string">"(email)"</span>
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Movernos al directorio del proyecto que queremos gestionar mediante Git, por ejemplo:</span><br />
<pre><code class="language-bash"><span class="hljs-built_in">cd</span> ~/miproyecto
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Inicializar el proyecto:</span><br />
<pre><code class="language-bash">git init miproyecto
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Añadir todos los archivos del directorio a Git:</span><br />
<pre><code class="language-bash">git add .
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Hacer un commit (la opción -m nos permite una pequeña descripción del commit):</span><br />
<pre><code class="language-bash">git commit -m <span class="hljs-string">"mensaje"</span>
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Comprobar los cambios hechos desde el último commit:</span><br />
<pre><code class="language-bash">git status
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Comparar los cambios preparados con el último commit:</span><br />
<pre><code class="language-bash">git diff</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Ver los cambios que hay entre los distintos commits:</span><br />
<pre><code class="language-bash">git whatchange
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Los siguientes comandos son para el uso de Github, que es el repositorio de Git en la “nube”, donde poder subir y alojar nuestros proyectos que tenemos en local.</span><br />
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Conectar con el repositorio remoto en Github (tendremos que registrarnos previamente en <a href="http://github.com/">github.com</a>):</span><br />
<pre><code class="language-bash">git remote add origin https://github.com/xxx/xxx.git
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Empujar el contenido del repositorio local hacia el repositorio remoto (nota: “origin” es la rama local y “master” es la rama remota, la que tenemos en Github):</span><br />
<pre><code class="language-bash">git push origin master
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Se nos pedirá introducir las credenciales de inicio de sesión (nombre de usuario y contraseña).</span><br />
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Git permite otras muchas cosas como la creación de ramas, forks, etc, … pero eso daría para otro post. Espero que este post sirva como introducción a esta fantástica herramienta.</span>Felipe Martínez D.http://www.blogger.com/profile/04078426213350478089noreply@blogger.com0tag:blogger.com,1999:blog-8040889349682767430.post-12720791049065194492017-01-11T16:03:00.000+01:002017-01-11T16:03:03.728+01:00Uso de archivos temporales en Linux<img alt="terminal" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLMaQ04WYi-ATo9viRuNb-8gNUDFur34qiGNoHb0FTECJCx_eKxFCS_XqOa_vh9f6Wwqvln8Qka7j7Ezypt9-LCTcW6RubVD8Wt9L7O64WBwsEWmxwWKqtKudj6cZiUMwVV3rdli_qoq_R/s200/bash.png" width="200" /><br />
<span style="font-family: "verdana" , sans-serif;">Una herramienta muy interesante a la hora de hacer nuestros scripts son los archivos temporales. Aunque podamos crearlos nosotros de forma “manual”, en este post veremos cómo hacerlo de forma más segura, utilizando la función <b>mktemp</b>. Creo que la forma más fácil de verlo es con un ejemplo:</span><br />
<pre><code class="language-sh"><span class="hljs-shebang">#!/bin/bash</span>
tmpfile1=$(mktemp /tmp/pruebaTemporal.XXXXXX) <span class="hljs-comment"># Crear el archivo temporal</span>
sed -i <span class="hljs-string">'s/Pepe/Jose/g'</span> <span class="hljs-variable">$1</span> > <span class="hljs-string">"<span class="hljs-variable">$tmpfile1</span>"</span> <span class="hljs-comment"># Ejecutar la orden y guardar en archivo temporal</span>
cat <span class="hljs-variable">$tmpfile1</span> > <span class="hljs-variable">$1</span> <span class="hljs-comment"># Guardar el archivo temporal en el archivo de entrada</span>
rm <span class="hljs-variable">$tmpfile1</span> <span class="hljs-comment"># Eliminar el archivo temporal</span>
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Siguiendo los comentarios del script podéis entender lo que se hace en cada línea. Con archivo de entrada me refiero al archivo que pasamos como parámetro de entrada del script. En la primera línea utilizamos el comando mktemp, que nos permite crear un archivo temporal cuyo nombre será único y cumplirá con la plantilla dada, pruebaTemporal.XXXXXX . Es decir, se sustituirán las ‘X’ por números y letras. Además, el archivo tendrá permisos de lectura y escritura asignados únicamente a su propietario (a no ser que usemos el flag -u). </span><span style="font-family: "verdana" , sans-serif;">Este mecanismo permite el uso de <b>archivos temporales</b> en scripts de <b>forma segura</b> y evita posibles ataques, por ejemplo de denegación de servicio, ya que el nombre del archivo no será tan previsible para los posibles atacantes. Si queréis tener más información sobre ésto, recomiendo la lectura del enlace indicado en “Fuentes”.</span><br />
<h4>
</h4>
<h4>
<a href="https://www.blogger.com/null" id="Fuentes_20"></a>Fuentes:</h4>
<a href="https://www.mktemp.org/manual.html">https://www.mktemp.org/manual.html</a>Felipe Martínez D.http://www.blogger.com/profile/04078426213350478089noreply@blogger.com1tag:blogger.com,1999:blog-8040889349682767430.post-37619127139857646022017-01-10T16:02:00.000+01:002017-01-10T16:02:17.442+01:00Sustituir los espacios en blanco en el nombre de un archivo (Linux)<img alt="terminal" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLMaQ04WYi-ATo9viRuNb-8gNUDFur34qiGNoHb0FTECJCx_eKxFCS_XqOa_vh9f6Wwqvln8Qka7j7Ezypt9-LCTcW6RubVD8Wt9L7O64WBwsEWmxwWKqtKudj6cZiUMwVV3rdli_qoq_R/s200/bash.png" width="200" /><br />
<span style="font-family: "verdana" , sans-serif;">Los espacios en blanco en el nombre de un archivo son un fastidio, sobretodo si estamos utilizando utilizando un script u orden Linux que tengan que trabajar con dichos archivos. Por ello, no es recomendable que el nombre del archivo contenga dichos espacios. Hoy veremos una orden sencilla para <b>quitar </b>(en este caso sustituir por el caracter _) esos <b>espacios </b>de <b>todos </b>los <b>archivos del directorio actual</b>. Veamos el comando que utilizaremos para ello:</span><br />
<pre><code class="language-sh"><span class="hljs-keyword">for</span> f <span class="hljs-keyword">in</span> *\ *; <span class="hljs-keyword">do</span> mv <span class="hljs-string">"<span class="hljs-variable">$f</span>"</span> <span class="hljs-string">"<span class="hljs-variable">${f// /_}</span>"</span>; <span class="hljs-keyword">done</span>
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Utilizamos un <i>for</i> para recorrer todos los archivos del directorio actual que renombraremos con <i>mv</i>. En ${f// /_} determinamos el patrón de sustitución, en este caso sustituimos el espacio en blanco por _ . Por suspuesto, podemos cambiar este patrón según nuestras necesidades.</span><br />
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Espero que sea de utilidad y para cualquier duda podéis utilizar los comentarios.</span><br />
<h4>
</h4>
<h4>
<br /></h4>
<h4>
<a href="https://www.blogger.com/null" id="Fuentes_16"></a>Fuentes:</h4>
<a href="http://stackoverflow.com/questions/2709458/bash-script-to-replace-spaces-in-file-names">http://stackoverflow.com/questions/2709458/bash-script-to-replace-spaces-in-file-names</a>Felipe Martínez D.http://www.blogger.com/profile/04078426213350478089noreply@blogger.com0tag:blogger.com,1999:blog-8040889349682767430.post-59945001409262524832016-05-13T16:43:00.000+02:002016-05-13T16:43:00.148+02:00Creación de pendrive de instalación de Linux<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmivh-gXFRdSdijKzaFgU8eaikYmVmqcN8HVLRTbU4ap5tlsFu1hws9xBHsSFrefYVKTVx81NdPmDhUf7rwUqlT71SrryNHa5W5wS8wpkbSxKlWqg5B-SikWnKmdCB9aY_ju2lISvB5rlr/s1600/estudiante.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmivh-gXFRdSdijKzaFgU8eaikYmVmqcN8HVLRTbU4ap5tlsFu1hws9xBHsSFrefYVKTVx81NdPmDhUf7rwUqlT71SrryNHa5W5wS8wpkbSxKlWqg5B-SikWnKmdCB9aY_ju2lISvB5rlr/s200/estudiante.png" width="200" /></a></div>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;"><b>Nota:</b> El comando dd hay que utilizarlo con mucha precaución, ya que un uso incorrecto puede borrar toda la información de un disco duro o partición. Utilízalo bajo tu propia responsabilidad.</span><br />
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Cuando queremos instalar una nueva distribución y nos hemos descargado un archivo .iso se nos presenta siempre la misma duda ¿lo grabo en un CD/DVD o en un pendrive?. Si lo grabo en un pendrive ¿lo creo con alguna aplicación o lo hago desde la línea de comandos?. En este artículo vamos a ver cómo hacerlo desde la línea de comandos sin necesidad de instalar ninguna aplicación y de forma rápida.</span><br />
<h4>
</h4>
<h4>
<br /></h4>
<h4>
<a href="https://www.blogger.com/null" id="El_comando_6"></a>El comando:</h4>
<span style="font-family: "verdana" , sans-serif;">Vamos a utilizar el comando <b>dd</b>, que se usa para diversas operaciones como clonar discos duros o crear un pendrive booteable a partir de un archivo iso, que es lo que haremos nosotros:</span><br />
<pre><code class="language-sh"><span style="font-family: "verdana" , sans-serif;">sudo dd bs=<span class="hljs-number">4</span>M <span class="hljs-keyword">if</span>=archivo.iso of=/dev/sdb && sync
</span></code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">El parámetro <strong>bs</strong> es el tamaño de bloque en bytes, poniéndolo a 4M (4 Megabytes) funciona de forma óptima. Con <strong>if</strong> indicamos el archivo iso y con <strong>of</strong> la unidad de destino (en nuestro caso sdb, sin número). Por favor, ten mucho cuidado con este último parámetro y asegúrate de que apunta al pendrive y no a un disco duro. Para conocer el nombre del pendrive podemos usar el siguiente comando:</span><br />
<pre><code class="language-sh">sudo fdisk <span class="hljs-operator">-l</span>
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Tras unos minutos el proceso habrá finalizado y ya tendremos listo nuestro pendrive de instalación.</span><br />
<br />
<h4>
<br /></h4>
<h4>
Fuentes:</h4>
<a href="https://en.wikipedia.org/wiki/Dd_(Unix)">https://en.wikipedia.org/wiki/Dd_(Unix)</a>Felipe Martínez D.http://www.blogger.com/profile/04078426213350478089noreply@blogger.com0tag:blogger.com,1999:blog-8040889349682767430.post-37685047690581570522016-05-11T16:40:00.000+02:002016-05-12T08:15:55.294+02:00Persistencia en Android mediante shared preferences<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmv_Pkrj_x14-QI1vwAunhWJ39PdQVf4V1bTBJuQ6WK4fpa0pym1k_oMn4fRFXCAwAUQejJGrh_EESBQOpGGra6xEMuMsg0AZejRpTSfJQH41No-ZcJuap0vi7nxS4tlTy8R9WvjZoCrGS/s1600/java.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmv_Pkrj_x14-QI1vwAunhWJ39PdQVf4V1bTBJuQ6WK4fpa0pym1k_oMn4fRFXCAwAUQejJGrh_EESBQOpGGra6xEMuMsg0AZejRpTSfJQH41No-ZcJuap0vi7nxS4tlTy8R9WvjZoCrGS/s200/java.png" width="200" /></a></div>
<br />
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Existen varias de formas de dotar de persistencia a una aplicación Android, pero seguramente la más sencilla y menos engorrosa sea usar <b>Shared Preferences</b>. Cuando hablo de persistencia me refiero a que la configuración o los valores de nuestra aplicación queden guardados, de modo que aunque la cerremos, al volver a iniciarla no se perderán. Por ejemplo, tenemos una aplicación del tiempo (condiciones metereológicas) y queremos que nuestra ciudad quede guardada para próximas consultas. Vamos a ver cómo hacerlo utilizando un ejemplo muy sencillo, ya que sólo guardaremos la variable </span><span style="font-family: "verdana" , sans-serif;">ciudad (nota: </span><span style="font-family: "verdana" , sans-serif;">no pongo el código completo de la aplicación por que lo interesante es centrarnos en la parte de la persistencia, así que pongo tres puntos</span><span style="font-family: "verdana" , sans-serif;"> suspensivos para indicar donde iría el resto del código de la aplicación):</span><br />
<div>
<br /></div>
<h4>
</h4>
<h4>
</h4>
<h4>
<a href="https://www.blogger.com/null" id="Recuperar_datos_5"></a>Recuperar datos</h4>
<pre><code class="language-sh">...
public class MainActivity extends AppCompatActivity {
public static final String PREFS_NAME = <span class="hljs-string">"MyPrefsFile"</span>;
public static SharedPreferences settings;
...
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
<span class="hljs-built_in">set</span>ContentView(R.layout.activity_main);
settings = getSharedPreferences(PREFS_NAME, <span class="hljs-number">0</span>);
city = MainActivity.settings.getString(<span class="hljs-string">"ciudad"</span>, <span class="hljs-string">"Madrid"</span>);
...
}
...
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Como vemos, básicamente lo que se hace es llamar a <b>getSharedPreferences</b> para obtener el objeto que guarda las preferencias. Posteriormente obtenemos el valor (si existiera) y lo asignados a la variable city que es la que utilizaremos en la aplicación y cuyo valor podremos modificar si es necesario dentro de nuestra aplicación. </span><br />
<span style="font-family: "verdana" , sans-serif;">Nota: en <i>MainActivity.settings.getString(“ciudad”, “Madrid”);</i> el segundo parámetro (“Madrid”), es el valor que se devuelve en caso de que la variable (en este caso “ciudad”) sea nulo.</span><br />
<h4>
</h4>
<h4>
</h4>
<h4>
</h4>
<h4>
<a href="https://www.blogger.com/null" id="Guardar_datos_25"></a>Guardar datos</h4>
<pre><code class="language-sh">protected static void <span class="hljs-function"><span class="hljs-title">guardarCiudadSettings</span></span>(){
SharedPreferences.Editor editor = settings.edit();
editor.putString(<span class="hljs-string">"ciudad"</span>, city);
editor.commit();
}
protected void <span class="hljs-function"><span class="hljs-title">onStop</span></span>(){
super.onStop();
SharedPreferences.Editor editor = settings.edit();
editor.putString(<span class="hljs-string">"ciudad"</span>, city);
editor.commit();
}
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Aquí vemos como guardar una determinada variable en los SharedPreferences. En el primer caso se hace desde un método al que podemos llamar cuando queramos desde nuestra aplicación. En el segundo método se llamará al cerrar nuestra aplicación (método onStop()). </span><br />
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Espero que os sea de utilidad. Para consultar cualquier duda, podéis utilizar los comentarios.</span><br />
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<br />
<br />
<h4>
Fuentes:</h4>
<a href="http://developer.android.com/intl/es/training/basics/data-storage/shared-preferences.html">http://developer.android.com/intl/es/training/basics/data-storage/shared-preferences.html</a>Felipe Martínez D.http://www.blogger.com/profile/04078426213350478089noreply@blogger.com0tag:blogger.com,1999:blog-8040889349682767430.post-22874715803780905912016-05-09T16:00:00.000+02:002016-05-09T16:00:16.091+02:00Convertir de int a String y viceversa en Java<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwDw2jZiX6bvYmfuHzW3bGu8g8MCKFzsEez5ftyXFvTIgNi8gwOZ7Ks9IEtKoQyOKqJa2T0_NlTBw6k0dPe2ES8gNwNYTOenGgHlddIkAbuZhHPfDQ3Lx9aAADMk7rzcl24EUWxLjKNbc0/s1600/konsole.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwDw2jZiX6bvYmfuHzW3bGu8g8MCKFzsEez5ftyXFvTIgNi8gwOZ7Ks9IEtKoQyOKqJa2T0_NlTBw6k0dPe2ES8gNwNYTOenGgHlddIkAbuZhHPfDQ3Lx9aAADMk7rzcl24EUWxLjKNbc0/s1600/konsole.png" /></a></div>
<span style="font-family: verdana, sans-serif;"><br /></span>
<span style="font-family: verdana, sans-serif;"><br /></span>
<span style="font-family: verdana, sans-serif;"><br /></span>
<span style="font-family: verdana, sans-serif;"><br /></span>
<span style="font-family: verdana, sans-serif;"><br /></span>
<span style="font-family: verdana, sans-serif;"><br /></span>
<span style="font-family: verdana, sans-serif;"><br /></span>
<span style="font-family: verdana, sans-serif;"><br /></span>
<span style="font-family: verdana, sans-serif;">Una conversión muy utilizada en Java es pasar una variable de tipo <b>int a String</b>, al igual que de <b>String a int</b>. Veamos como se realiza cada una de ellas:</span><br />
<h4>
</h4>
<h4>
<br /></h4>
<h4>
<a href="https://www.blogger.com/null" id="De_int_a_String_4"></a>De int a String</h4>
<pre><code class="language-sh">int numero = <span class="hljs-number">123</span>
String st = Integer.toString(numero);
</code></pre>
<br />
<h4>
<br /></h4>
<h4>
<br /></h4>
<h4>
<a href="https://www.blogger.com/null" id="De_String_a_int_11"></a>De String a int</h4>
<pre><code class="language-sh">String numero = “<span class="hljs-number">123</span>”
int num = Integer.parseInt(numero);
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Este post es muy corto y sencillo, pero treméndamente útil. Espero que os sirva.</span>Felipe Martínez D.http://www.blogger.com/profile/04078426213350478089noreply@blogger.com3tag:blogger.com,1999:blog-8040889349682767430.post-12656869245508692332016-02-25T16:16:00.000+01:002016-02-25T16:16:02.837+01:00Comprobar archivos duplicados desde el terminal Linux (Fdupes)<br />
<div style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;">
<img alt="terminal" height="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLMaQ04WYi-ATo9viRuNb-8gNUDFur34qiGNoHb0FTECJCx_eKxFCS_XqOa_vh9f6Wwqvln8Qka7j7Ezypt9-LCTcW6RubVD8Wt9L7O64WBwsEWmxwWKqtKudj6cZiUMwVV3rdli_qoq_R/s200/bash.png" width="100" /></div>
<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Cuando trabajamos con muchos archivos es fácil que tengamos el mismo archivo repetido en distintas carpetas o con distinto nombre. Por eso resulta útil </span><strong style="font-family: verdana, sans-serif;">comprobar</strong><span style="font-family: "verdana" , sans-serif;"> la existencia de </span><strong style="font-family: verdana, sans-serif;">archivos repetidos</strong><span style="font-family: "verdana" , sans-serif;"> y evitar así redundancias y espacio en disco mal aprovechado. Veremos cómo realizar dicha comprobación utilizando la aplicación </span><strong style="font-family: verdana, sans-serif;">fdupes</strong><span style="font-family: "verdana" , sans-serif;">. Es verdaderamente rápida y funciona realizando distintas comprobaciones: primero el tamaño de los archivos, el md5 parcialmente, el md5 completamente y finalmente la comparación byte a byte. Evidentemente, si en la primera comprobación resuelve que dos archivos no son iguales, no pasa a la segunda, y así sucesivamente.</span><br />
<span style="font-family: "verdana" , sans-serif;">Lo primero es <strong>instalar</strong> la aplicación, si estamos en Arch Linux:</span><br />
<pre><code class="language-sh">sudo pacman -S fdupes
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">En Ubuntu / Debian sería así:</span><br />
<pre><code class="language-sh">sudo apt-get install fdupes
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Luego nos situamos en el directorio correspondiente y ejecutamos:</span><br />
<pre><code class="language-sh">fdupes -r .
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Con -r lo que hacemos es la comprobación de forma recursiva (buscamos en los subdirectorios).</span><br />
<span style="font-family: "verdana" , sans-serif;">Si añadimos la opción -d se nos preguntará qué archivos queremos borrar o si queremos mantenerlos todos. Al final nos mostrará un listado de archivos que no son iguales entre sí:</span><br />
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<img alt="terminal" height="245" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM-R-c5S7AEJ5_CHDxVHhaqRg5TnBkdi3giCvA_V4O5XB8q5Oox_13YsiBVEhsZEVI4KXE4geTBglGBdI68LNY-KAIc1INYidA_UPNnyYLdytQxEXRO1L5xAXy25p8Dn-zZHYKnI-ODbjl/s400/fdupes.png" width="400" /><br />
<h4>
</h4>
<h4>
<a href="https://www.blogger.com/null" id="Fuentes_33"></a>Fuentes:</h4>
<a href="http://www.commandlinefu.com/commands/view/3555/find-duplicate-files-based-on-size-first-then-md5-hash">http://www.commandlinefu.com/commands/view/3555/find-duplicate-files-based-on-size-first-then-md5-hash</a>
<a href="https://en.wikipedia.org/wiki/Fdupes">https://en.wikipedia.org/wiki/Fdupes</a>
<a href="https://github.com/adrianlopezroche/fdupes">https://github.com/adrianlopezroche/fdupes</a>Felipe Martínez D.http://www.blogger.com/profile/04078426213350478089noreply@blogger.com1tag:blogger.com,1999:blog-8040889349682767430.post-27362797081305878452016-02-24T16:12:00.000+01:002016-02-24T16:12:02.337+01:00Cortar un vídeo desde el terminal Linux (FFmpeg)<br />
<div style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;">
<img alt="terminal" height="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLMaQ04WYi-ATo9viRuNb-8gNUDFur34qiGNoHb0FTECJCx_eKxFCS_XqOa_vh9f6Wwqvln8Qka7j7Ezypt9-LCTcW6RubVD8Wt9L7O64WBwsEWmxwWKqtKudj6cZiUMwVV3rdli_qoq_R/s200/bash.png" width="100" /></div>
<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">La edición de vídeo es una tarea que seguramente hayáis necesitado realizar más de una vez. Existen multitud de aplicaciones, tanto libres (KDEenlive … ) como propietarias. También las hay con interfaz gráfica o sin ella. Y dentro de este último tipo está el proyecto de software libre </span><strong style="font-family: verdana, sans-serif;">FFmpeg</strong><span style="font-family: "verdana" , sans-serif;">, el cual consiste en librerías y programas de edición y conversión multimedia. En éste artículo veremos qué sencillo y rápido es </span><strong style="font-family: verdana, sans-serif;">cortar un vídeo</strong><span style="font-family: "verdana" , sans-serif;"> para quedarnos con el fragmento deseado usando sólamente el </span><b style="font-family: verdana, sans-serif;">terminal Linux</b><span style="font-family: "verdana" , sans-serif;"> (y la librería FFmpeg) .</span><br />
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<br />
<h4>
<a href="https://www.blogger.com/null" id="El_comando_7"></a>El comando</h4>
<span style="font-family: "verdana" , sans-serif;">Lo primero es instalar FFmpeg. Si estamos en Arch Linux sería así:</span>
<br />
<pre><code class="language-sh">sudo pacman -S ffmpeg
</code></pre>
<div>
<br /></div>
<div>
<span style="font-family: "verdana" , sans-serif;">Para realizar el corte utilizaríamos el siguiente comando:</span></div>
<pre><code class="language-sh">ffmpeg -i (nombre_video) -ss (tiempo_inicio) -to (tiempo_fin) -c:v copy -c:a copy (nombre_video_salida)
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Los parámetros son los siguientes:</span><br />
<span style="font-family: "verdana" , sans-serif;"><i>(nombre_video)</i> es el nombre del vídeo que queremos editar.</span><br />
<span style="font-family: "verdana" , sans-serif;"><i>(tiempo_inicio)</i> es el instante inicial desde donde queremos cortar, en formato hh:mm:ss (h: hora. m: minutos. s: segundos).</span><br />
<span style="font-family: "verdana" , sans-serif;"><i>(tiempo_fin)</i> es el instante final donde acaba el corte, en formato hh:mm:ss.</span><br />
<span style="font-family: "verdana" , sans-serif;"><i>(nombre_video_salida)</i> es el nombre del vídeo resultante que se creará.</span><br />
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Ejemplo:</span><br />
<pre><code class="language-sh">ffmpeg -i mi_video.avi -ss <span class="hljs-number">00</span>:<span class="hljs-number">01</span>:<span class="hljs-number">03</span> -to <span class="hljs-number">00</span>:<span class="hljs-number">05</span>:<span class="hljs-number">04</span> -c:v copy -c:a copy mi_video_cortado.avi
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">El resultado será mi_video_cortado.avi , que corresponde al fragmento indicado de mi_video.avi. </span><br />
<span style="font-family: "verdana" , sans-serif;">Este comando es muy rápido, ya que <strong>no realiza</strong> ningún tipo de <strong>conversión</strong> y la calidad y resolución del vídeo resultante se mantiene intacta.</span><br />
<h4>
</h4>
<h4>
<br /></h4>
<h4>
<a href="https://www.blogger.com/null" id="Fuentes_33"></a>Fuentes:</h4>
<a href="http://superuser.com/questions/377343/cut-part-from-video-file-from-start-position-to-end-position-with-ffmpeg">http://superuser.com/questions/377343/cut-part-from-video-file-from-start-position-to-end-position-with-ffmpeg</a>Felipe Martínez D.http://www.blogger.com/profile/04078426213350478089noreply@blogger.com4tag:blogger.com,1999:blog-8040889349682767430.post-59005268659754244442016-02-23T16:08:00.000+01:002016-02-23T16:08:06.304+01:00Actualizar Arch Linux ignorando algunos paquetes (Pacman / Yaourt)<br />
<div style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;">
<img alt="terminal" height="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLMaQ04WYi-ATo9viRuNb-8gNUDFur34qiGNoHb0FTECJCx_eKxFCS_XqOa_vh9f6Wwqvln8Qka7j7Ezypt9-LCTcW6RubVD8Wt9L7O64WBwsEWmxwWKqtKudj6cZiUMwVV3rdli_qoq_R/s200/bash.png" width="100" /></div>
<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Quizás nos haya pasado que tenemos un determinado paquete o paquetes que no nos interesa actualizar, ya sea porque no merece la pena o porque nos da algún error. Vamos a explicar cómo hacerlo para aquellos que utilicen distribuciones con el gestor de paquetes <strong>Pacman/Yaourt</strong>, como puede ser Arch Linux y derivados. Es decir, vamos a realizar las actualizaciones disponibles, exceptuando los paquetes que le indiquemos. Para ello usaremos el siguiente comando:</span><br />
<pre><code class="language-sh">yaourt -Syua --ignore paquete_a_ignorar_1 --ignore paquete_a_ignorar_2
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">o también:</span><br />
<pre><code class="language-sh">yaourt -Syua --ignore paquete_a_ignorar_1, paquete_a_ignorar_2
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Ejemplo:</span><br />
<pre><code class="language-sh">yaourt -Syua --ignore android-sdk --ignore android-sdk-build-tools
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">O también:</span><br />
<pre><code class="language-sh">yaourt -Syua --ignore android-sdk, android-sdk-build-tools
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Con yaourt -Syua sincronizamos tanto los paquetes del repositorio oficial como los del repositorio AUR. El parámetro <strong>–ignore</strong> nos sirve para indicar qué paquetes queremos dejar intactos, sin actualizar.</span>Felipe Martínez D.http://www.blogger.com/profile/04078426213350478089noreply@blogger.com0tag:blogger.com,1999:blog-8040889349682767430.post-47223372614288135892015-12-10T16:05:00.000+01:002015-12-10T16:05:00.144+01:00Convertir a formato moneda (euros/céntimos) en Java<img alt="Java" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9aFGEBShzrQuaV0w9JRZwcWhBviUsj1kQSHIwh2vKM5WX526OyIQW7FoK8c-zpH2xGWO-qrUFs2YqOpFtwkBWzn-l1R4W_VyZddGTqPdh1xeL-_kuRwlN0vDl0wAkC0Vcfobit088E0la/s200/java.png" width="200" /><br />
<span style="font-family: "verdana" , sans-serif;">Vamos a mostrar como formatear un número cualquiera al formato moneda, más concretamente a euros (x,xx €). Veamos un ejemplo:</span><br />
<pre><code class="language-java"><span class="hljs-keyword">import</span> java.text.NumberFormat;;
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Principal</span> </span>{
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
<span class="hljs-keyword">double</span> euros = <span class="hljs-number">0.4556456</span>;
NumberFormat formatter = NumberFormat.getCurrencyInstance();
System.out.println(formatter.format(euros));
}
}
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">La salida será:</span><br />
<pre><code><span class="hljs-number">0</span>,<span class="hljs-number">46</span> €
</code></pre>
<br />
<span style="font-family: "verdana" , sans-serif;">Cuando llamamos a <b>NumberFormat.getCurrencyInstance();</b> lo que se hace es crear el formateador en función del objeto Locale que está utilizando Java. Al estar en España, nos lo muestra en euros. ¿Pero qué pasa si queremos mostrarlo por ejemplo en dólares americanos?. Debemos definir el objeto <b>Locale </b>correspondiente a Estados Unidos, como se muestra a continuación:</span><br />
<pre><code class="language-java"><span class="hljs-keyword">import</span> java.text.NumberFormat;
<span class="hljs-keyword">import</span> java.util.Locale;
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Principal</span> </span>{
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
<span class="hljs-keyword">double</span> dolares = <span class="hljs-number">0.4556456</span>;
Locale usa = <span class="hljs-keyword">new</span> Locale(<span class="hljs-string">"us"</span>, <span class="hljs-string">"US"</span>);
NumberFormat formatter = NumberFormat.getCurrencyInstance(usa);
System.out.println(formatter.format(dolares));
}
}
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">En este caso la salida será:</span><br />
<pre><code>USD <span class="hljs-number">0.46</span>
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Si necesitas definir otra constante de idioma para crear el objeto Locale, puedes ver todos las disponibles aquí:</span><br />
<span style="font-family: "verdana" , sans-serif;"><a href="http://docs.oracle.com/javase/7/docs/api/java/util/Locale.html">http://docs.oracle.com/javase/7/docs/api/java/util/Locale.html</a> .</span><br />
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Por tanto, gracias a NumberFormat, no tenemos que definir un formateador ya que por sí solo según el Locale definido, es capaz de darle formato a los números y mostrar el nombre de la moneda.</span><br />
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<br />
<h4>
Fuentes:</h4>
<span style="font-family: "verdana" , sans-serif;">
<a href="http://www.avajava.com/tutorials/lessons/how-do-i-use-numberformat-to-format-currencies.html">http://www.avajava.com/tutorials/lessons/how-do-i-use-numberformat-to-format-currencies.html</a></span>Felipe Martínez D.http://www.blogger.com/profile/04078426213350478089noreply@blogger.com0tag:blogger.com,1999:blog-8040889349682767430.post-59978862878704417512015-12-09T16:03:00.000+01:002015-12-09T16:03:00.256+01:00Generador de clases Java desde JSON<img alt="JSON" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3g41IPrYO7VmuWTo_dudDFVFm_eej38eEHU_N3Uuds8Mw8S9kxUbQSMp7GMY2MnB1-HoYA27AO-kQk_lgAKLwOrtYTqakh-itguMdKtB24MNWwqBnYo8chiST88pxY7wN_gYnJT3pj5Cx/s200/JSON_vector_logo.svg.png" width="200" /><br />
<span style="font-family: "verdana" , sans-serif;">Es muy probable que alguna vez tengáis que trabajar con <b><a href="https://es.wikipedia.org/wiki/JSON">JSON</a> </b>desde Java, si no lo habéis hecho ya. Como seguramente ya sepáis, se trata de un formato de intercambio de datos que cada día se está volviendo más popular. Pues bien, la herramienta que os mostraré os facilitará tremendamente las cosas.</span><br />
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Si el esquema del JSON es sencillo, osea, que tenga tres o cuatro campos, podréis generar las clases manualmente. El problema viene cuando dicho esquema es bastante complejo y extenso. Aquí es donde un <b>generador de clases</b> nos ahorrará mucho trabajo. El que recomiendo es <b>jsonschema2pojo</b>, que tiene además la ventaja de que puede utilizarse desde un navegador y por tanto no es necesario instalar nada. La URL es <a href="http://www.jsonschema2pojo.org/">http://www.jsonschema2pojo.org/</a> .</span><br />
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Una vez que estemos en la dicha web, lo primero que tenemos que hacer es copiar el código JSON resultante de la consulta (aunque también podríamos usar el esquema JSON) en el cuadro de texto que hay habilitado para ello. Posteriormente hay que introducir los campos “Package” y “Class name” deseados, marcar en “Source type” la opción “JSON” y en “Annotation style” marcar “None”. A continuación marcaremos las opciones que deseemos para la generación de las clases, que en mi caso son las siguientes:</span><br />
<ul>
<li><span style="font-family: "verdana" , sans-serif;">Generate builder methods</span></li>
<li><span style="font-family: "verdana" , sans-serif;">Use double numbers</span></li>
<li><span style="font-family: "verdana" , sans-serif;">Include getters and setters</span></li>
<li><span style="font-family: "verdana" , sans-serif;">Include constructors</span></li>
<li><span style="font-family: "verdana" , sans-serif;">Allow additional properties</span></li>
</ul>
<span style="font-family: "verdana" , sans-serif;">Ya sólo nos queda pulsar en “Preview” para previsualizar el resultado y finalmente en “Jar” para descargarnos el archivo jar con las clases generadas. Hay que tener en cuenta que Chrome puede bloquear este tipo de archivos jar y no permitir descargarlos por cuestiones de seguridad. <b>Firefox</b> sí lo permite, así que es el navegador que recomiendo.</span><br />
<span style="font-family: "verdana" , sans-serif;"><b><br /></b></span>
<span style="font-family: "verdana" , sans-serif;"><b>NOTA:</b> Antes de pegar el código JSON en jsonschema2pojo puede ser interesante validarlo y formatearlo. Para ello yo utilizo <b>jsonformatter</b>: <a href="https://jsonformatter.curiousconcept.com/">https://jsonformatter.curiousconcept.com/</a></span><br />
<br />
<span style="font-family: "verdana" , sans-serif;">Espero que os sea de utilidad. Para plantear cualquier duda, podéis utilizar los comentarios.</span>Felipe Martínez D.http://www.blogger.com/profile/04078426213350478089noreply@blogger.com0tag:blogger.com,1999:blog-8040889349682767430.post-54660365633433684722015-12-04T16:00:00.000+01:002015-12-04T16:00:07.537+01:00Día de la semana en español con Java<img alt="Java" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9aFGEBShzrQuaV0w9JRZwcWhBviUsj1kQSHIwh2vKM5WX526OyIQW7FoK8c-zpH2xGWO-qrUFs2YqOpFtwkBWzn-l1R4W_VyZddGTqPdh1xeL-_kuRwlN0vDl0wAkC0Vcfobit088E0la/s1600/java.png" /><br />
<span style="font-family: "verdana" , sans-serif;">Siguiendo con los post dedicados a fechas, en este artículo se explicará cómo obtener el día de la semana dada una fecha en concreto. </span><span style="font-family: verdana, sans-serif;">Supongamos que nos dan un String con la fecha en formato año-mes-día. Lo primero que habría que hacer sería </span><b style="font-family: verdana, sans-serif;">trocear</b><span style="font-family: verdana, sans-serif;"> la cadena:</span><br />
<pre><code class="language-java"> String fecha = <span class="hljs-string">"2015-11-19"</span>;
StringTokenizer st = <span class="hljs-keyword">new</span> StringTokenizer(fecha, <span class="hljs-string">"-"</span>);
String año = st.nextToken();
String mes = st.nextToken();
String dia = st.nextToken();
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Posteriormente creamos el objeto Calendar y mostramos el día de semana, que corresponderá al campo <b>DAY_OF_WEEK</b> del objeto Calendar:</span><br />
<pre><code class="language-java"> Calendar cal = GregorianCalendar.getInstance();
cal.set(Integer.parseInt(año), Integer.parseInt(mes) - <span class="hljs-number">1</span> , Integer.parseInt(dia));
System.out.println(cal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, <span class="hljs-keyword">new</span> Locale(<span class="hljs-string">"ES"</span>)));
</code></pre>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Aquí tenemos que tener en cuenta varios aspectos:</span><br />
<ul>
<li><span style="font-family: "verdana" , sans-serif;">El número de <b>mes empieza en 0</b>, correspondiendo el 0 a Enero, el 1 a Febrero, el 2 a Marzo, … Por eso hacemos mes-1 al pasar el parámetro mes.</span></li>
<li><span style="font-family: "verdana" , sans-serif;">Hemos definido el idioma español mediante <b>new Locale (“ES”)</b>. Podemos consultar otras constantes para definir el lenguaje aquí: <a href="http://docs.oracle.com/javase/7/docs/api/java/util/Locale.html">http://docs.oracle.com/javase/7/docs/api/java/util/Locale.html</a> .</span></li>
<li><span style="font-family: "verdana" , sans-serif;">El día de semana se muestra en formato largo, ya que lo hemos indicado en <b>Calendar.LONG</b> . Si lo queremos en formato corto, lo sustituiremos por Calendar.SHORT.</span></li>
<li><span style="font-family: "verdana" , sans-serif;">Los parámetros año, mes y día los hemos convertido de String a int mediante <b>Integer.parseInt</b> .</span></li>
</ul>
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<span style="font-family: "verdana" , sans-serif;">Como siempre, podéis utilizar los comentarios para plantear vuestras dudas.</span>Felipe Martínez D.http://www.blogger.com/profile/04078426213350478089noreply@blogger.com2tag:blogger.com,1999:blog-8040889349682767430.post-9418179265043523242015-10-01T16:24:00.000+02:002015-10-01T16:24:00.088+02:00Calcular la diferencia en días entre dos fechas con Joda Time (Java)<span style="font-family: Verdana, sans-serif;"><img alt="Java" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9aFGEBShzrQuaV0w9JRZwcWhBviUsj1kQSHIwh2vKM5WX526OyIQW7FoK8c-zpH2xGWO-qrUFs2YqOpFtwkBWzn-l1R4W_VyZddGTqPdh1xeL-_kuRwlN0vDl0wAkC0Vcfobit088E0la/s1600/java.png" /></span><br />
<span style="font-family: Verdana, sans-serif;">Vamos a calcular la diferencia en días entre dos fechas, utilizando la librería <strong>Joda Time</strong>. En el post <a href="http://felinfo.blogspot.com.es/2009/09/calcular-la-diferencia-en-dias-entre.html">Calcular la diferencia en días entre dos fechas en Java</a> ya lo hicimos, pero esta vez utilizaremos una <strong>librería específica</strong> para trabajar con fechas y tiempo más completa que la que se incluye en Java.</span><br />
<h4>
<span style="font-family: Verdana, sans-serif;"><br /></span></h4>
<h4>
<span style="font-family: Verdana, sans-serif;"><a href="https://www.blogger.com/null" id="Descarga_de_la_librera_8"></a>Descarga de la librería</span></h4>
<span style="font-family: Verdana, sans-serif;"><br /></span><span style="font-family: Verdana, sans-serif;">Nos dirigimos a la <strong>página oficial</strong> de Joda Time: <a href="http://www.joda.org/joda-time/">http://www.joda.org/joda-time/</a>, más concretamente aquí: <a href="https://github.com/JodaOrg/joda-time/releases">https://github.com/JodaOrg/joda-time/releases</a> . Descargamos el archivo joda-time-x.x.x-dist.tar.gz (donde x.x.x es el número de versión) y lo descomprimimos. Dentro estará el archivo que nos interesa: <em>joda-time-x.x.x.jar</em> .</span><br />
<span style="font-family: Verdana, sans-serif;">Una forma de <strong>importarla</strong> en Eclipse es la siguiente: pulsando en menú Project / Properties / Java Build Path / Libraries / Add External JARs … y seleccionamos joda-time-x.x.x.jar .</span><br />
<h4>
<span style="font-family: Verdana, sans-serif;"><br /></span></h4>
<h4>
<span style="font-family: Verdana, sans-serif;"><a href="https://www.blogger.com/null" id="Uso_de_la_librera_14"></a>Uso de la librería</span></h4>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Veamos un ejemplo:</span><br />
<pre><code class="language-java"><span class="hljs-keyword">import</span> org.joda.time.*;
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Principal</span> </span>{
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
DateTime inicio = <span class="hljs-keyword">new</span> DateTime(<span class="hljs-number">2015</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">3</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>);
DateTime fin = <span class="hljs-keyword">new</span> DateTime(<span class="hljs-number">2015</span>, <span class="hljs-number">3</span>, <span class="hljs-number">1</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>);
<span class="hljs-keyword">int</span> dias = Days.daysBetween(inicio.toLocalDate(),fin.toLocalDate()).getDays();
System.out.println(dias);
}
}
</code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">La salida será <em>59</em> , que corresponde a la diferencia en días entre el día 01/01/2015 y el día 01/03/2015 .</span><br />
<span style="font-family: Verdana, sans-serif;">Como vemos, el código es muy sencillo: creamos un objeto <a href="http://joda-time.sourceforge.net/apidocs/org/joda/time/DateTime.html"><strong>DateTime</strong></a> para la fecha inicio y otro para la fecha final. Llamamos al método <strong>daysBetween</strong> de la clase <a href="http://joda-time.sourceforge.net/apidocs/org/joda/time/Days.html">Days</a> , pasándole como argumentos los objetos DateTime (inicio y fin) . Cómo la salida de este método nos dará un objeto Days, lo pasamos a <em>int</em> mediante el método <strong>getDays</strong> de esa misma clase.</span><br />
<span style="font-family: Verdana, sans-serif;">Igualmente podemos calcular los meses entre dos fechas:</span><br />
<pre><code class="language-java"><span class="hljs-keyword">int</span> meses = Months.monthsBetween(inicio.toLocalDate(),
fin.toLocalDate()).getMonths();
System.out.println(meses);
</code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Esta librería es muy completa en lo que a operaciones con fechas se refiere y es recomendable su uso en caso tener que hacer cálculos complejos de tiempo, usando zonas horarias, etc</span><br />
<h4>
<span style="font-family: Verdana, sans-serif;"><br /></span></h4>
<h4>
<span style="font-family: Verdana, sans-serif;"><a href="https://www.blogger.com/null" id="Fuentes_50"></a>Fuentes</span></h4>
<a href="http://www.joda.org/joda-time"><span style="font-family: Verdana, sans-serif;">http://www.joda.org/joda-time</span></a><br />
<div>
<br /></div>
Felipe Martínez D.http://www.blogger.com/profile/04078426213350478089noreply@blogger.com9tag:blogger.com,1999:blog-8040889349682767430.post-81619683482625472892015-09-30T16:19:00.000+02:002015-09-30T16:19:00.183+02:00Usar una segunda pantalla en i3 wm<span style="font-family: Verdana, sans-serif;"><img alt="VGA" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyN-zpkpdXC4UalpEYQrjFRdhj7nfMJK3hCkFMU6TNUXECINztL4in_MNrPc00S3zgCXLyHcBEAetcFdnzgrZ17fFZhhLANzT94IV68kN5lQF6YB26AW1C5HMjaaL-5Q9fFMSvDwJIfgjg/s1600/VGA-pics.png" /></span><br />
<span style="font-family: Verdana, sans-serif;">Si eres programador sabrás lo útil que es utilizar una <b>segunda pantalla</b> para trabajar. Todos los sistemas operativos son capaces de gestionar y configurar esta característica fácilmente. Pero si utilizas un window manager como <b>i3</b> también sabrás que no existe un interfaz gráfico para configurarlo y hay que usar el terminal. Vamos a ver cómo configurarlo utilizando como ejemplo una conexión por VGA.</span><br />
<span style="font-family: Verdana, sans-serif;">Lo primero que tenemos que hacer es conectar la segunda pantalla (monitor) a nuestro pc y a continuación ejecutar en el terminal ésto:</span><br />
<pre><code class="language-sh">xrandr
</code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Con ello veremos los monitores conectados a nuestro PC. La salida en mi caso fue la siguiente:</span><br />
<pre><code class="language-sh">Screen <span class="hljs-number">0</span>: minimum <span class="hljs-number">8</span> x <span class="hljs-number">8</span>, current <span class="hljs-number">2560</span> x <span class="hljs-number">1024</span>, maximum <span class="hljs-number">32767</span> x <span class="hljs-number">32767</span>
LVDS1 connected primary <span class="hljs-number">1280</span>x800+<span class="hljs-number">0</span>+<span class="hljs-number">0</span> (normal left inverted right x axis y axis) <span class="hljs-number">0</span>mm x <span class="hljs-number">0</span>mm
<span class="hljs-number">1280</span>x800 <span class="hljs-number">59.94</span>*+
<span class="hljs-number">1024</span>x768 <span class="hljs-number">60.00</span>
<span class="hljs-number">800</span>x600 <span class="hljs-number">60.32</span> <span class="hljs-number">56.25</span>
<span class="hljs-number">640</span>x480 <span class="hljs-number">59.94</span>
<span class="hljs-number">640</span>x400 <span class="hljs-number">60.00</span>
VGA1 connected <span class="hljs-number">1280</span>x1024+<span class="hljs-number">1280</span>+<span class="hljs-number">0</span> (normal left inverted right x axis y axis) <span class="hljs-number">338</span>mm x <span class="hljs-number">270</span>mm
<span class="hljs-number">1280</span>x1024 <span class="hljs-number">60.02</span>*+ <span class="hljs-number">75.02</span>
<span class="hljs-number">1152</span>x864 <span class="hljs-number">75.00</span>
<span class="hljs-number">1024</span>x768 <span class="hljs-number">75.08</span> <span class="hljs-number">75.03</span> <span class="hljs-number">60.00</span>
<span class="hljs-number">832</span>x624 <span class="hljs-number">74.55</span>
<span class="hljs-number">800</span>x600 <span class="hljs-number">75.00</span> <span class="hljs-number">60.32</span>
<span class="hljs-number">640</span>x480 <span class="hljs-number">75.00</span> <span class="hljs-number">60.00</span>
<span class="hljs-number">720</span>x400 <span class="hljs-number">70.08</span>
VIRTUAL1 disconnected (normal left inverted right x axis y axis)
</code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">De modo que deberemos ejecutar lo siguiente desde el terminal para que funcionen ambos monitores:</span><br />
<pre><code class="language-sh">xrandr --output LVDS1 --mode <span class="hljs-number">1280</span>x800; xrandr --output VGA1 --mode <span class="hljs-number">1280</span>x1024 --right-of LVDS1
</code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Lo que se hace es definir el <em>mode</em> o resolución de cada monitor y además, señalamos que el segundo monitor (VGA1) lo queremos poner a la derecha del principal (LVDS1). En base a la instrucción anterior podemos crear un script, que llevará el siguiente código:</span><br />
<pre><code class="language-sh"><span class="hljs-shebang">#!/bin/bash</span>
IN=<span class="hljs-string">"LVDS1"</span>
EXT=<span class="hljs-string">"VGA1"</span>
<span class="hljs-keyword">if</span> (xrandr | grep <span class="hljs-string">"<span class="hljs-variable">$EXT</span> disconnected"</span>)
<span class="hljs-keyword">then</span>
xrandr --output <span class="hljs-variable">$IN</span> --auto --output <span class="hljs-variable">$EXT</span> --off
<span class="hljs-keyword">else</span>
xrandr --output <span class="hljs-variable">$IN</span> --auto --primary --output <span class="hljs-variable">$EXT</span> --auto --right-of <span class="hljs-variable">$IN</span>
<span class="hljs-keyword">fi</span>
</code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span><span style="font-family: Verdana, sans-serif;">Aquí comprobamos si el segundo monitor está conectado o no. Si no está conectado, lo deshabilitamos. Si está conectado, lo ponemos a la derecha del principal, como hicimos anteriormente. Además, utilizamos <em>–auto</em> para que se configure el <em>mode</em> de forma automática.</span><br />
<span style="font-family: Verdana, sans-serif;">Si queremos que el script se ejecute cada vez que iniciemos sesión en el window manager i3, solamente tenemos que añadir la siguiente línea al final del archivo <em>config</em> que se encuentra en la carpeta .i3 (normalmente ~/.i3) y que se encargará de llamar al script que hemos creado.</span><br />
<pre><code class="language-sh"><span class="hljs-keyword">exec</span> --no-startup-id ~/ruta_script/nombre_script.sh
</code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Espero que os haya sido útil. Si tenéis alguna duda, podéis utilizar los comentarios.</span><br />
<h3>
<span style="font-family: Verdana, sans-serif;"><br /></span></h3>
<h4>
<span style="font-family: Verdana, sans-serif;"><a href="https://www.blogger.com/null" id="Fuentes_63"></a>Fuentes</span></h4>
<a href="https://wiki.archlinux.org/index.php/Xrandr"><span style="font-family: Verdana, sans-serif;">https://wiki.archlinux.org/index.php/Xrandr</span></a><br />
<a href="http://www.x.org/archive/X11R7.5/doc/man/man1/xrandr.1.html"><span style="font-family: Verdana, sans-serif;">http://www.x.org/archive/X11R7.5/doc/man/man1/xrandr.1.html</span></a>Felipe Martínez D.http://www.blogger.com/profile/04078426213350478089noreply@blogger.com0tag:blogger.com,1999:blog-8040889349682767430.post-78019415969948231482015-09-29T16:11:00.000+02:002015-09-29T16:11:00.379+02:00Exportar notas de Kindle en Linux<span style="font-family: Verdana, sans-serif;"><img alt="Kindle" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBY32EfpV1B-xDNDEZYnmvHiXVzjNqPiUjnrW_YGh4FAWVaqTOaxiYvQpbsXy74AAxLs7sepyWmdWyJhoiv3xxQYmu0djRMCCSfe1CAyYhdupYZ8ZpoE6NSum4SHF-dN4HBshj0cgQHu4d/s320/Kindle_Paperwhite.png" width="265" /></span><br />
<span style="font-family: Verdana, sans-serif;">Los que tengáis el lector de libros electrónicos <strong>Kindle</strong> seguramente sabréis cómo gestiona las <strong>notas</strong> de vuestros libros y documentos. En la memoria interna hay una carpeta llamada documents y dentro hay un archivo llamado <strong>My Clippings.txt</strong> que es el que guarda todas las notas, subrayados y marcas que hagamos en nuestros documentos, ordenados cronológicamente. Por ejemplo:</span><br />
<pre><code>==========
blogs_2015.07.26
- Tu subrayado en la posición 3115-3116 | Añadido el lunes, 3 de agosto de 2015 23:57:42
GitHub lanza la primera edición estable de su editor Atom | La mirada del replicante
==========
blogs_20150817_2121
- Tu subrayado en la posición 42-42 | Añadido el sábado, 22 de agosto de 2015 16:27:23
Tails 1.5
==========
La conjura de los necios (John Kennedy Toole)
- Tu marcador en la posición 2179 | Añadido el domingo, 30 de agosto de 2015 8:35:45
==========
La conjura de los necios (John Kennedy Toole)
- Tu marcador en la posición 2236 | Añadido el domingo, 30 de agosto de 2015 23:57:49
==========
</code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Si queremos exportar nuestras notas, lo que podemos hacer es <b>conectar </b>mediante <b>USB </b>nuestro Kindle y copiar donde deseemos el archivo My Clippings.txt . ¿Cual es el problema?, que todas esas notas y subrados de nuestros libros están mezclados, de modo que no podemos <b>exportar únicamente las notas de un determinado libro</b>. Claro, se podría hacer a mano, copiando y pegando pero sería un proceso de lo más tedioso. Por eso vamos a explicar cómo hacerlo rápidamente utilizando el terminal Linux y en concreto el comando sed. Ya vimos en el post <a href="http://felinfo.blogspot.com.es/2010/02/reemplazar-texto-en-varios-archivos.html">Reemplazar texto de varios archivos en Linux</a> el uso de este comando pero en esta ocasión no reemplazaremos texto sino que lo redireccionaremos a un nuevo archivo.</span><br />
<span style="font-family: Verdana, sans-serif;">Veamos:</span><br />
<pre><code>sed -n '/La conjura de los necios/,/==========/p' My\ Clippings.txt > La conjura de los necios
</code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Ésto lo que hará será copiar todas las subcadenas entre <em>La conjura de los necios</em> y <em>==========</em> y las copiará a un archivo llamado <em>La conjura de los necios</em>. Ésta sería la idea básica, pero existe un pequeño escollo que salvar, que es el caso de que la cadena de entrada tenga espacios en blanco. En el siguiente script se soluciona:</span><br />
<pre><code>#!/bin/bash
read -r -p "Indica el nombre (o parte del nombre) del libro:" archivo
busqueda=$(echo"$archivo" | sed 's/ /\\ /g')
sed -n '/'"$busqueda"'/,/==========/p' My\ Clippings.txt > $archivo.txt
echo"Creado el archivo "$archivo.txt
</code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">La línea <em>busqueda=$(echo “$archivo” | sed ‘s/ /\ /g’)</em> del script lo que hace es sustituir los espacios en blanco de la cadena de entrada y los sustituye por barra invertida y espacio en blanco. Ésto se hace así para que la búsqueda con sed se haga correctamente en caso de que la cadena de entrada tenga espacios en blanco, como pasa con <em>La conjura de los necios</em>.</span><br />
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;"><strong>Nota:</strong> La búsqueda es sensible a mayúsculas y minúsculas.</span><br />
<span style="font-family: Verdana, sans-serif;">Espero que os sea útil. Podéis utilizar los comentarios para aclarar cualquier duda.</span><br />
<h4>
<span style="font-family: Verdana, sans-serif;"><br /></span></h4>
<h4>
<span style="font-family: Verdana, sans-serif;"><a href="https://www.blogger.com/null" id="Fuentes_51"></a>Fuentes:</span></h4>
<a href="http://linux.die.net/man/1/sed"><span style="font-family: Verdana, sans-serif;">http://linux.die.net/man/1/sed</span></a><br />
<a href="http://stackoverflow.com/questions/2462385/getting-an-ambiguous-redirect-error"><span style="font-family: Verdana, sans-serif;">http://stackoverflow.com/questions/2462385/getting-an-ambiguous-redirect-error</span></a>Felipe Martínez D.http://www.blogger.com/profile/04078426213350478089noreply@blogger.com0tag:blogger.com,1999:blog-8040889349682767430.post-25556918843970236972015-09-28T16:39:00.000+02:002015-09-29T08:43:57.543+02:00CMUS: Reproductor de audio desde el terminal Linux<span style="font-family: Verdana, sans-serif;"><img alt="cmus headphones" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiB2QirwrIHogpMVqAr8IZ_G-1UAokfFvkFtjeDRFARSRN1l90jk9oZ4CcALsAU1H6ZSrHuri0A74dN5-ZghsLY1vJqExDMyGQJljkdyUuAlx2KNCgrkb3_PU1pTdpLTWnjKzn-IOUMMxPa/s1600/headphones.jpg" /></span><br />
<span style="font-family: Verdana, sans-serif;"><b><br /></b></span>
<span style="font-family: Verdana, sans-serif;"><b>Cmus </b>es probablemente el <b>reproductor musical</b> más conocido dentro de los que se ejecutan desde el <b>terminal</b>. Aunque haya gente a la que las aplicaciones de terminal no le agraden demasiado, pienso que Cmus merece una oportunidad: por su poco consumo de recursos, por la facilidad para configurarlo a nuestro gusto y porque se puede controlar utilizando únicamente el teclado. Si estás familiarizado con el editor Vi, utilizar Cmus te resultará sencillo, ya que se utilizan comandos muy parecidos.</span><br />
<span style="font-family: Verdana, sans-serif;"><br /></span>
<br />
<h4>
<span style="font-family: Verdana, sans-serif;"><a href="https://www.blogger.com/null" id="Instalacin_11"></a>Instalación</span></h4>
<span style="font-family: Verdana, sans-serif;">Desde Debian/Ubuntu:</span><br />
<pre><code>sudo add-apt-repository ppa:jmuc/cmus
sudo apt-get update
sudo apt-get install cmus
</code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Desde Arch Linux y derivados:<br />
</span>
<pre><span style="font-family: Verdana, sans-serif;"><code>sudo pacman -S cmus</code></span></pre>
<span style="font-family: Verdana, sans-serif;">
</span>
<h4>
<span style="font-family: Verdana, sans-serif;">
<span style="font-family: Verdana, sans-serif;"><br /></span></span></h4>
<span style="font-family: Verdana, sans-serif;">
<h4>
<span style="font-family: Verdana, sans-serif;"><br /></span></h4>
<h4>
<span style="font-family: Verdana, sans-serif;"><a href="https://www.blogger.com/null" id="Vistas_28"></a>Vistas</span></h4>
<span style="font-family: Verdana, sans-serif;">La aplicación se divide en varias vistas o pantallas. Podemos cambiar a cada una de ellas pulsando su número correspondiente:</span><br />
<span style="font-family: Verdana, sans-serif;"><b>1. Librería:</b> Es la vista por defecto. Se divide en dos pestañas: album/artista y canciones del álbum seleccionado. Podemos pasar de una a otra pulsando la tecla <i>tab</i>.</span><br />
<span style="font-family: Verdana, sans-serif;"><b>2. Librería ordenada:</b> Muestra la vista de playlist, permitiendo saltar a canciones (o tracks) específicos. Ésta lista puede ser filtrada utilizando la vista 6.</span><br />
<b><span style="font-family: Verdana, sans-serif;">3. Lista de reproducción.</span></b><br />
<b><span style="font-family: Verdana, sans-serif;">4. Cola de reproducción.</span></b><br />
<b><span style="font-family: Verdana, sans-serif;">5. Navegador de archivos.</span></b><br />
<span style="font-family: Verdana, sans-serif;"><b>6. Filtros:</b> Se trata de una lista de filtros predefinidos para aplicar a la librería (vista 2).</span><br />
<span style="font-family: Verdana, sans-serif;"><b>7. Configuración</b> Muestra los comandos y las teclas rápidas.</span><br />
<span style="font-family: Verdana, sans-serif;"><br /></span><h4>
<span style="font-family: Verdana, sans-serif;"><br /></span></h4>
<h4>
<span style="font-family: Verdana, sans-serif;"><a href="https://www.blogger.com/null" id="Uso_bsico_48"></a>Uso básico</span></h4>
<span style="font-family: Verdana, sans-serif;">Lo primero que debemos hacer es añadir nuestra música a la librería. Se puede hacer mediante el siguiente comando:</span><br />
<pre><code>add: /ruta/de/audio
</code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Ejemplo:</span><br />
<pre><code>add: ~/mi_musica
</code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Para reproducir una canción simplemente nos situamos sobre ella y pulsamos <i>intro</i>. Sabremos desde qué vista se está reproduciendo la canción mirando en la parte inferior derecha, en la que se indicará playlist, queue, all library … </span><br />
<span style="font-family: Verdana, sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVTIZJ0zUeUu66LGZeodQlf827yNMIY7RlSfIJljsWQEP12vp84zCxcJvnr5KQPAWE5Du9dwbAwgKKwZx3cMex2jnDs9SnLVAQvvs7YFXUvNkpAuAGYfiVXiCCJ0gbO57Rcz0DtPkc67Ph/s1600/cmus.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="124" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVTIZJ0zUeUu66LGZeodQlf827yNMIY7RlSfIJljsWQEP12vp84zCxcJvnr5KQPAWE5Du9dwbAwgKKwZx3cMex2jnDs9SnLVAQvvs7YFXUvNkpAuAGYfiVXiCCJ0gbO57Rcz0DtPkc67Ph/s320/cmus.jpg" width="320" /></a></div>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Los controles básicos de reproducción son los siguientes:</span><br />
<ul>
<li><span style="font-family: Verdana, sans-serif;"><b>z</b>: Canción Anterior</span></li>
<li><span style="font-family: Verdana, sans-serif;"><b>c</b>: Pause/Unpause</span></li>
<li><span style="font-family: Verdana, sans-serif;"><b>v</b>: Stop</span></li>
<li><span style="font-family: Verdana, sans-serif;"><b>b</b>: Siguiente canción</span></li>
<li><span style="font-family: Verdana, sans-serif;"><b>+ / - :</b>: Subir / bajar volumen</span></li>
</ul>
<span style="font-family: Verdana, sans-serif;">También pueden resultar útiles las siguientes teclas:</span><br />
<ul>
<li><span style="font-family: Verdana, sans-serif;"><b>e</b>: Añadir canción/álbum a la cola</span></li>
<li><span style="font-family: Verdana, sans-serif;"><b>y</b>: Añadir canción/álbum a la lista</span></li>
<li><span style="font-family: Verdana, sans-serif;"><b>p, P</b>: Ordenar la canción dentro de la cola o la lista</span></li>
<li><span style="font-family: Verdana, sans-serif;"><b>Supr</b>: Eliminar canción/álbum de la cola ó lista</span></li>
</ul>
<span style="font-family: Verdana, sans-serif;">Si queremos vaciar una la lista de reproducción o la cola de reproducción, nos colocamos en la vista correspondiente y escribimos lo siguiente:</span><br />
<pre><code>:clear
</code></pre>
<h4>
<span style="font-family: Verdana, sans-serif;"><br /></span></h4>
<h4>
<span style="font-family: Verdana, sans-serif;"><br /></span></h4>
<h4>
<span style="font-family: Verdana, sans-serif;"><a href="https://www.blogger.com/null" id="Busqueda_de_una_cancin_81"></a>Busqueda de una canción</span></h4>
<span style="font-family: Verdana, sans-serif;">En la segunda vista podemos saltar a una canción usando el caracter <b>/</b> , para ello hay que escribir parte del título de la canción (al estilo Vi) y pulsar <i>intro</i> dos veces para reproducirla. O podemos pulsar <i>n</i> para pasar a la siguiente ocurrencia (también al estilo Vi).</span><br />
<h4>
<span style="font-family: Verdana, sans-serif;"><br /></span></h4>
<h4>
<span style="font-family: Verdana, sans-serif;"><br /></span></h4>
<h4>
<span style="font-family: Verdana, sans-serif;"><a href="https://www.blogger.com/null" id="Customizar_la_vista_lista_ordenada_85"></a>Customización de la vista lista ordenada</span></h4>
<span style="font-family: Verdana, sans-serif;">Podemos filtrar las canciones para que sólo se muestren las de duración menor a dos minutos mediante:</span><br />
<pre><code>:filter duration<120
</code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">O que sólo se muestren los de un estilo en concreto:</span><br />
<pre><code>:filter genre=”rock”
</code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Para combinar ambos filtros:</span><br />
<pre><code>:filter duration<120 amp="" genre="”rock”</code"><!--120--></120></code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Podemos anular cualquier filtro mediante:</span><br />
<pre><code>:filter
</code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span><span style="font-family: Verdana, sans-serif;"><br /></span><br />
<span style="font-family: Verdana, sans-serif;">Cmus tiene muchas más características de las que aquí se citan y que te animo a que vayas descubriendo conforme vayas utilizándolo, si así lo deseas. </span><br />
<h4>
<span style="font-family: Verdana, sans-serif;"><br /></span></h4>
<h4>
<span style="font-family: Verdana, sans-serif;"><br /></span></h4>
<h4>
<span style="font-family: Verdana, sans-serif;"><a href="https://www.blogger.com/null" id="Fuentes_108"></a>Fuentes</span></h4>
<a href="http://www.increasinglyadequate.com/cmus.html"><span style="font-family: Verdana, sans-serif;">http://www.increasinglyadequate.com/cmus.html</span></a><br />
<a href="http://linux.die.net/man/1/cmus"><span style="font-family: Verdana, sans-serif;">http://linux.die.net/man/1/cmus</span></a></span>Felipe Martínez D.http://www.blogger.com/profile/04078426213350478089noreply@blogger.com0tag:blogger.com,1999:blog-8040889349682767430.post-43544004962191297832015-05-15T10:45:00.000+02:002015-05-15T15:53:02.035+02:00Convertir imágenes PNG a JPG de forma masiva en Linux<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJkpZRt_yWwTJoaWefzEM0HYHOyYd03yQvXaQ-xQk2iReKuFB1iA7As727FT8Bwd2_EghxWhLS1raChxtyRs9wSnWLxrvSxq7W-52JT6p5XGlyFgWS4k7Q_h3G4hLzWOo6b3Iyep84xI7Z/s1600/tux_painter_mobile_wallpaper.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJkpZRt_yWwTJoaWefzEM0HYHOyYd03yQvXaQ-xQk2iReKuFB1iA7As727FT8Bwd2_EghxWhLS1raChxtyRs9wSnWLxrvSxq7W-52JT6p5XGlyFgWS4k7Q_h3G4hLzWOo6b3Iyep84xI7Z/s200/tux_painter_mobile_wallpaper.png" width="200" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;"><br /></span><span style="font-family: Verdana, sans-serif;">En este post vamos a hablar de cómo convertir imágenes PNG en imágenes JPG usando la utilidad <b>mogrify</b> de ImageMagick. </span><br />
<span style="font-family: Verdana, sans-serif;"><br /></span>
<br />
<h4>
Instalación</h4>
<span style="font-family: Verdana, sans-serif;">Tenemos que instalar la utilidad del modo habitual:</span><br />
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Debian / Ubuntu y derivados:</span><br />
<pre><code>sudo apt-get install imagemagick</code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Arch Linux y derivados:</span><br />
<pre><code>pacman -S imagemagick </code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Podéis encontrar más información de cómo instalarla desde aquí: <a href="http://www.imagemagick.org/">http://www.imagemagick.org</a> .</span><br />
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<br />
<h4>
Ejemplos de uso</h4>
<span style="font-family: Verdana, sans-serif;">Una vez instalada podemos realizar la conversión. Veamos algunos ejemplos:</span><br />
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Convertir una imagen PNG a JPG:</span><br />
<pre><code>mogrify -format jpg archivo.png </code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Convertir todas las imágenes png de la carpeta actual a imágenes JPG:</span><br />
<pre><code>mogrify -format jpg *.png </code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Convertir todas las imágenes del directorio actual y todas las subcarpetas. Nos ayudaremos del comando find:</span><br />
<pre><code>find -name *.png -exec mogrify -format jpg {} ';'</code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Una vez que hayamos hayamos realizado la conversión, quizás queramos eliminar las imágenes PNG (cuidado con este comando, ya que eliminará todas las imágenes PNG que haya en el directorio actual y todos sus subdirectorios. Debemos asegurarnos previamente de cual es nuestro directorio actual con pwd</span><span style="font-family: Verdana, sans-serif;">):</span><br />
<pre><code>find -name *.png -exec rm {} ';'</code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Hemos podido ver algunos ejemplos de uso, aunque la funcionalidad de ImageMagick es mucho más amplia, puesto que es capaz de realizar conversiones entre más de 100 formatos.</span>
<br />
<h4>
<br /></h4>
<div>
<br /></div>
<h4>
Fuentes</h4>
<span style="font-family: Verdana, sans-serif;"><a href="http://superuser.com/questions/71028/batch-converting-png-to-jpg-in-linux">http://superuser.com/questions/71028/batch-converting-png-to-jpg-in-linux</a></span>Felipe Martínez D.http://www.blogger.com/profile/04078426213350478089noreply@blogger.com0tag:blogger.com,1999:blog-8040889349682767430.post-25168938014126182092015-05-09T13:04:00.000+02:002015-05-11T10:12:47.039+02:00Uso del comando tr en Linux<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLC8_chlam0AcRLuoLll8eIhWZuV6n46TibL_iRzPYqSh8tkgDisEv3c6uwS_br2Y7dvBR7RungiTUcGrIsDvGLXsTQvE8JH7ur8HIkgZf1sf9IZ8zeh98CdqWLYZuOCSa4tO_aAk7MBt_/s1600/konsole.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLC8_chlam0AcRLuoLll8eIhWZuV6n46TibL_iRzPYqSh8tkgDisEv3c6uwS_br2Y7dvBR7RungiTUcGrIsDvGLXsTQvE8JH7ur8HIkgZf1sf9IZ8zeh98CdqWLYZuOCSa4tO_aAk7MBt_/s1600/konsole.png" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-family: Verdana, sans-serif;">El comando <b>tr </b>se usa para <b>sustituir </b>o <b>eliminar </b>determinados caracteres. Es realmente útil y lo mejor que podemos hacer para comprobar su funcionamiento es ilustrarlo con algunos ejemplos:</span><br />
<span style="font-family: Verdana, sans-serif;"><br /></span><span style="font-family: Verdana, sans-serif;">Sustituir los caracteres en minúscula por caracteres en mayúscula:</span><br />
<pre><code>$ echo “Hola Mundo” | tr a-z A-Z</code></pre>
<pre><code>HOLA MUNDO</code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Sustituir los espacios en blanco por tabuladores:</span><br />
<pre><code>$ echo "Hola Mundo Hola Mundo" | tr [:space:] '\t'</code></pre>
<pre><code>Hola Mundo Hola Mundo</code></pre>
<br />
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Suprimir la repetición de espacios en blanco:</span><br />
<pre><code>$ echo "Hola que tal " | tr -s [:space:]</code></pre>
<pre><code>Hola que tal</code></pre>
<br />
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Eliminar un caracter concreto:</span><br />
<pre><code>$ echo "Hola que tal" | tr -d 'a'</code></pre>
<pre><code>Hol que tl</code></pre>
<br />
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Dejar sólo los caractéres numéricos:</span><br />
<pre><code>$ echo "El día 14 cumpliré 23 años" | tr -cd [:digit:]</code></pre>
<pre><code>1423</code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Unir las líneas de todo un archivo en una sóla línea:</span><br />
<pre><code>tr -s '\n' ' ' < prueba.txt</code></pre>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif;">Como vemos, el comando tr tiene muchas y variadas aplicaciones. Aquí sólo he mostrado algunos ejemplos que espero que sean útiles y que sirvan para iniciarse en su uso.</span>Felipe Martínez D.http://www.blogger.com/profile/04078426213350478089noreply@blogger.com1tag:blogger.com,1999:blog-8040889349682767430.post-62560885377611797182015-02-11T17:04:00.001+01:002015-02-11T17:04:29.384+01:00Acceso directo a aplicación ejecutada mediante Wine (Linux)<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWq-ycc-MyKhyXGX-pE1Rcbf2p_Uojg_Tl4T4hl70-enc6ZCq2TmYi4RRGuoNyo1I4LM4I61E1jeZft8XrZrCSkmsW6Q8-6OSLM0oCom3oJyYmY9FzjrhWEarQjgh56xLBaksVflCHoSlf/s1600/wine.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWq-ycc-MyKhyXGX-pE1Rcbf2p_Uojg_Tl4T4hl70-enc6ZCq2TmYi4RRGuoNyo1I4LM4I61E1jeZft8XrZrCSkmsW6Q8-6OSLM0oCom3oJyYmY9FzjrhWEarQjgh56xLBaksVflCHoSlf/s1600/wine.png" height="200" width="123" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-family: Verdana,sans-serif;">Vamos a crear un lanzador que nos permita ejecutar una aplicación desde Wine con solo hacer doble click desde el escritorio. Para ello vamos a seguir los siguientes pasos:</span><br />
<br />
<ol>
<li><span style="font-family: Verdana,sans-serif;">Ejecutar <b>winecfg </b>desde el terminal.</span></li>
<li><span style="font-family: Verdana,sans-serif;">Pulsar en la pestaña <b>Unidades</b>.</span></li>
<li><span style="font-family: Verdana,sans-serif;"><b>Configurar una unidad</b>. Para ello tenemos que pulsar en “Añadir…” , seleccionar una letra (por ejemplo la D) y finalmente pulsar rellenar el campo Ruta: con la partición donde se encuentre la aplicación (por ejemplo: /media/datos ).</span></li>
<li><span style="font-family: Verdana,sans-serif;"><b>Crear un lanzador</b> en el escritorio, pulsando con el botón derecho y pulsando en “Crear lanzador”. En el campo “Comando” deberá poner lo siguiente:</span></li>
</ol>
<pre><code> wine "RUTA_EJECUTABLE"</code></pre>
<br />
<span style="font-family: Verdana,sans-serif;"> Donde RUTA_EJECUTABLE será la ruta completa del ejecutable, usando la notación Windows. Por ejemplo:</span><br />
<pre><code>wine "D:\Aplicaciones\notepad.exe"</code></pre>
<br />
<span style="font-family: Verdana,sans-serif;"> Démonos cuenta de que la letra D corresponde a la unidad configurada en el punto 3 (en mi caso correspondería a /media/datos ).</span><br />
<br />
<br />
<span style="font-family: Verdana,sans-serif;">Y eso es todo. Con este truco podremos ejecutar cómoda y rápidamente las aplicaciones para Windows desde nuestra distribución Linux. Para resolver cualquier duda podéis utilizar los comentarios. </span>Felipe Martínez D.http://www.blogger.com/profile/04078426213350478089noreply@blogger.com2tag:blogger.com,1999:blog-8040889349682767430.post-62374390042315792342015-02-03T16:07:00.001+01:002015-02-12T13:35:14.881+01:00Copiar / cortar y pegar en el editor Vi<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoFqU4rzer29lzi-aSrhGcKeWIIntKwzZoxoLeXsaM34CO8VuYFHvQ_TQ9OeFOGcaqAJP3IlBDoRbac6LUNsG91qm36-C_1BlVcddedVsthtNWEoifPGSyQbbT0C78wwRn6txGiwitwuon/s1600/mzl.wdqeweks.175x175-75.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoFqU4rzer29lzi-aSrhGcKeWIIntKwzZoxoLeXsaM34CO8VuYFHvQ_TQ9OeFOGcaqAJP3IlBDoRbac6LUNsG91qm36-C_1BlVcddedVsthtNWEoifPGSyQbbT0C78wwRn6txGiwitwuon/s1600/mzl.wdqeweks.175x175-75.jpg" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-family: Verdana,sans-serif;">Como en cualquier editor de texto, las operaciones de <b>copiar y pegar</b> (ó <b>cortar y pegar</b>) son muy importantes. Vamos a ver como hacerlo en <b>Vi</b>:</span><br />
<ol>
<li><span style="font-family: Verdana,sans-serif;">Posicionarse al principio del texto que queremos seleccionar.</span></li>
<li><span style="font-family: Verdana,sans-serif;">Presionar <b>v </b>para iniciar la selección (también podemos seleccionar la línea completa con <b>V</b> ).</span></li>
<li><span style="font-family: Verdana,sans-serif;">Movernos con las teclas de cursor para seleccionar el texto deseado.</span></li>
<li><span style="font-family: Verdana,sans-serif;">Presionar <b>d </b>para cortar o <b>y </b>para<b> </b>copiar.</span></li>
<li><span style="font-family: Verdana,sans-serif;">Movernos a la línea donde queremos pegar el texto.</span></li>
<li><span style="font-family: Verdana,sans-serif;">Presionar <b>p </b>para copiar después del cursor o <b>P </b>para pegar antes del cursor.</span></li>
</ol>
<span style="font-family: Verdana,sans-serif;"><br /></span>
<span style="font-family: Verdana,sans-serif;"><br /></span>
<span style="font-family: Verdana,sans-serif;">Se puede hacer también una <b>copia múltiple</b>. Podemos guardar varios fragmentos de texto, cada uno en un registro distinto. Cada registro será identificado por una letra.</span><br />
<span style="font-family: Verdana,sans-serif;"><br /></span>
<span style="font-family: Verdana,sans-serif;">Por ejemplo, seleccionamos Madrid y luego pulsamos <b>"ay</b> (en el registro <b>a </b>se habrá guardado el texto Madrid). Luego seleccionamos Barcelona y pulsamos <b>"by</b> (en el registro <b>b </b>se habrá guardado el texto Barcelona). Ahora podremos irnos a otra parte del texto y pegar la palabra Madrid pulsando <b>"ap</b> y la palabra Barcelona pulsando <b>"bp</b> .</span><br />
<span style="font-family: Verdana,sans-serif;"><br /></span>
<span style="font-family: Verdana,sans-serif;">Lo mejor es practicar, para ir cogiendo el manejo de estos y otros muchos comandos. Espero que haya sido de utilidad. Podéis utilizar los comentarios para plantear dudas.</span><br />
<span style="font-family: Verdana,sans-serif;"><br /></span>
<br />
<h4>
Fuentes:</h4>
<h4>
<a href="http://vim.wikia.com/wiki/Copy,_cut_and_paste"><span style="font-weight: normal;"><span style="font-family: Verdana,sans-serif;">http://vim.wikia.com/wiki/Copy,_cut_and_paste</span></span></a></h4>
Felipe Martínez D.http://www.blogger.com/profile/04078426213350478089noreply@blogger.com0tag:blogger.com,1999:blog-8040889349682767430.post-77168166466449637292015-01-23T17:05:00.001+01:002015-01-26T10:27:27.010+01:00Deshabilitar la tarjeta wifi integrada y usar solo el adaptador wifi USB (Manjaro / Arch Linux)<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjW5zrZOj30Herz7RC78_F0PcGJaIpF1Pt2Fd9z7C-XMHWrnc-xXufeSeGoa29ibYyvYdgkDgx-ddgHaLax-SucR-zEkUfMx_MoFadm1fMQ5GSTmg3EFwZlOSkt0I_CsZ5zvXFLT4M_oUvH/s1600/TPLINK2_Adaptador-USB-WirelessN-150Mbps-TPLink-TLWN722N_2.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><br /></a></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjozyvThGfcDETdJ3b_GB4SnPs6-87u0JG0NzRv3d51qhEBzyI34_4moaDb2JgYOwlw7WHv2QqR1rowBBB5vNDn6cjeP_MOtfB-bnLtlKlWjnXH5MLxtgJPGrEWlu8_9g04WWQo9fnW1W5j/s1600/TPLINK2_Adaptador-USB-WirelessN-150Mbps-TPLink-TLWN722N_2b.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjozyvThGfcDETdJ3b_GB4SnPs6-87u0JG0NzRv3d51qhEBzyI34_4moaDb2JgYOwlw7WHv2QqR1rowBBB5vNDn6cjeP_MOtfB-bnLtlKlWjnXH5MLxtgJPGrEWlu8_9g04WWQo9fnW1W5j/s1600/TPLINK2_Adaptador-USB-WirelessN-150Mbps-TPLink-TLWN722N_2b.gif" height="200" width="200" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-family: Verdana,sans-serif;">Hace unos días me llegó un adaptador wifi USB, en concreto el TP-LINK TL-WN722N. Así que me puse a instalarlo en el portátil, sobre la distribución Manjaro. Por lo leído en diversos foros, este adaptador tiene buena compatibilidad con Linux. Con solo enchufarlo ya lo detectó correctamente y la luz verde se puso a parpadear. Eso sí, al usarlo en un portátil el botón de la tarjeta wifi integrada debía de estar activado, por tanto <b>ambas tarjetas</b>, la integrada y la USB <b>quedaban activadas</b>. Mi intención era dejar <b>activada sólo la USB</b>, así que desactivé la integrada con el siguiente comando:</span><br />
<pre><code>sudo ip link set interfaz_red down</code></pre>
<br />
<br />
<span style="font-family: Verdana,sans-serif;">Donde <b>interfaz_red</b></span><interfaz_red><span style="font-family: Verdana,sans-serif;"> debemos sustituirlo por el nombre de la interfaz de red que queremos desactivar. Si no sabes cual es, puedes obtenerlo mediante el comando <b>iwconfig</b>. En mi caso, desactivé la tarjeta integrada mediante el siguiente comando: </span></interfaz_red><br />
<pre><code>sudo ip link set wlp6s0 down</code></pre>
<br />
<br />
<span style="font-family: Verdana,sans-serif;">Al ejecutar <b>ifconfig </b>veremos que ya no aparece esa interfaz.<br /> </span><br />
<span style="font-family: Verdana,sans-serif;">Puede que no sea necesario, pero si al reiniciar vuelve a estar activa la tarjeta integrada, lo que se podría hacer es crear un script con el comando anterior y añadirlo a “Autoarranque de aplicaciones” dentro de “Sesión e inicio”. De esta forma se ejecutará cada vez que iniciemos el sistema.</span><br />
<span style="font-family: Verdana,sans-serif;"><br /></span>
<br />
<h4>
<span style="font-family: Verdana,sans-serif;">Fuentes:</span></h4>
<span style="font-family: Verdana,sans-serif;"><a href="http://askubuntu.com/questions/168032/how-to-disable-built-in-wifi-and-use-only-usb-wifi-card">http://askubuntu.com/questions/168032/how-to-disable-built-in-wifi-and-use-only-usb-wifi-card</a><br /><a href="https://wiki.archlinux.org/index.php/Network_configuration">https://wiki.archlinux.org/index.php/Network_configuration</a></span>Felipe Martínez D.http://www.blogger.com/profile/04078426213350478089noreply@blogger.com0tag:blogger.com,1999:blog-8040889349682767430.post-6372381865195739952014-06-19T19:20:00.001+02:002014-06-19T19:20:27.650+02:00Mantenimiento y optimización de Manjaro, operaciones manuales<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoFETRqSwvmr_7iNHgODVzn1bgMhlZkgKURQlmmV2SYrunwSgDmmgxDwUExTIsKHhc9MMUabb6OvCLJoNyQgeOmsHUrE6ZEeYl83resron4ZY_11V-16RoawYgssSaABXx1c745TKA08NB/s1600/manjaro-logo-128x128.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoFETRqSwvmr_7iNHgODVzn1bgMhlZkgKURQlmmV2SYrunwSgDmmgxDwUExTIsKHhc9MMUabb6OvCLJoNyQgeOmsHUrE6ZEeYl83resron4ZY_11V-16RoawYgssSaABXx1c745TKA08NB/s1600/manjaro-logo-128x128.png" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-family: Verdana,sans-serif;">Éste es el tercer post dedicado a mantenimiento y optimización de Manjaro. Puedes leer los artículos anteriores aquí: <a href="http://felinfo.blogspot.com.es/2014/06/mantenimiento-y-optimizacion-de-manjaro.html">http://felinfo.blogspot.com.es/2014/06/mantenimiento-y-optimizacion-de-manjaro.html</a> y <a href="http://felinfo.blogspot.com.es/2014/06/mantenimiento-y-optimizacion-de-manjaro_19.html">http://felinfo.blogspot.com.es/2014/06/mantenimiento-y-optimizacion-de-manjaro_19.html</a> . En este caso vamos a ver cómo realizar algunas tareas que no se pueden automatizar y que nos servirán para listar algunos paquetes innecesarios y que pueden borrarse. Finalmente se verá cómo listar algunos archivos de configuración, a los que deberíamos hacerle copia de seguridad.</span><br />
<span style="font-family: Verdana,sans-serif;"><br /></span>
<br />
<span style="font-family: Verdana,sans-serif;"><br /></span>
<br />
<h4>
Identificar archivos que no pertenecen a ningún paquete</h4>
<span style="font-family: Verdana,sans-serif;">Se trata de identificar los archivos que están fuera de la base de datos de pacman. Son los archivos de aplicaciones de terceros que suelen instalarse mediante ./configure && make && make install . Dichos archivos se pueden listar con el siguiente script:</span>
<br />
<pre><code> #!/bin/sh
tmp=${TMPDIR-/tmp}/pacman-disowned-$UID-$$
db=$tmp/db
fs=$tmp/fs
mkdir "$tmp"
trap 'rm -rf "$tmp"' EXIT
pacman -Qlq | sort -u > "$db"
find /etc /opt /usr ! -name lost+found \( -type d -printf '%p/\n' -o -print \) | sort > "$fs"
comm -23 "$fs" "$db"
</code></pre>
<br />
<span style="font-family: Verdana,sans-serif;"><br /></span>
<span style="font-family: Verdana,sans-serif;"><br /></span>
<span style="font-family: Verdana,sans-serif;">Y podemos generar la lista así:</span><br />
<pre><span style="font-family: Verdana,sans-serif;"><code>
sh pacman-disowned > non-db.txt
</code></span></pre>
<span style="font-family: Verdana,sans-serif;"><br /></span>
<span style="font-family: Verdana,sans-serif;"><br /></span>
<span style="font-family: Verdana,sans-serif;">NOTA IMPORTANTE: No se deben de borrar todos los archivos listados en non-db-txt, ya que ahí pueden aparecer archivos de configuración, logs, etc. Así que usa la lista con responsabilidad y en caso de duda en algún archivo, no lo elimines.</span><br />
<span style="font-family: Verdana,sans-serif;"><br /></span>
<span style="font-family: Verdana,sans-serif;"><br /></span>
<br />
<h4>
Listar los paquetes instalados que no pertenecen al sistema base</h4>
<span style="font-family: Verdana,sans-serif;">Se quieren mostrarán los paquetes que no pertenecen al sistema. Para ello habría que instalar expac: </span><br />
<pre><span style="font-family: Verdana,sans-serif;"><code>
sudo pacman -S expac
</code></span></pre>
<span style="font-family: Verdana,sans-serif;"><br /></span>
<span style="font-family: Verdana,sans-serif;">Y posteriormente listar los paquetes con el siguiente comando:</span><br />
<pre><code>
expac -HM "%011m\t%-20n\t%10d" $( comm -23 <(pacman -Qqen|sort) <(pacman -Qqg base base-devel|sort) ) | sort -n
</code></pre>
<br />
<span style="font-family: Verdana,sans-serif;"><br /></span>
<span style="font-family: Verdana,sans-serif;"><br /></span>
<br />
<h4>
Listar los archivos de configuración modificados</h4>
<span style="font-family: Verdana,sans-serif;">Si quieres hacer una copia de seguridad de los archivos de configuración simplemente tienes que copiar el directorio /etc . Pero si sólo quieres copiar los archivos modificados, puedes conocer dichos archivos con el siguiente comando: </span><br />
<pre><code>
pacman -Qii | awk '/^MODIFIED/ {print $2}'
</code></pre>
<br />
<br />
<br />
<span style="font-family: Verdana,sans-serif;">Como siempre, podéis utilizar los comentarios para formular cualquier pregunta.</span><br />
<span style="font-family: Verdana,sans-serif;"><br /></span>
<br />
<h4>
Fuentes: </h4>
<a href="https://wiki.archlinux.org/index.php/System_maintenance"><span style="font-family: Verdana,sans-serif;">https://wiki.archlinux.org/index.php/System_maintenance</span></a><br />
<span style="font-family: Verdana,sans-serif;"><br /></span>
Felipe Martínez D.http://www.blogger.com/profile/04078426213350478089noreply@blogger.com0tag:blogger.com,1999:blog-8040889349682767430.post-72132891302925193802014-06-19T19:17:00.001+02:002014-06-19T19:26:39.156+02:00Mantenimiento y optimización de Manjaro, el script<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoFETRqSwvmr_7iNHgODVzn1bgMhlZkgKURQlmmV2SYrunwSgDmmgxDwUExTIsKHhc9MMUabb6OvCLJoNyQgeOmsHUrE6ZEeYl83resron4ZY_11V-16RoawYgssSaABXx1c745TKA08NB/s1600/manjaro-logo-128x128.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoFETRqSwvmr_7iNHgODVzn1bgMhlZkgKURQlmmV2SYrunwSgDmmgxDwUExTIsKHhc9MMUabb6OvCLJoNyQgeOmsHUrE6ZEeYl83resron4ZY_11V-16RoawYgssSaABXx1c745TKA08NB/s1600/manjaro-logo-128x128.png" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-family: Verdana,sans-serif;">Después de haber visto los comandos (<a href="http://felinfo.blogspot.com.es/2014/06/mantenimiento-y-optimizacion-de-manjaro.html">http://felinfo.blogspot.com.es/2014/06/mantenimiento-y-optimizacion-de-manjaro.html</a>), vamos a utilizarlos para crear un script y automatizar las tareas de mantenimiento y optimización de Manjaro. He de decir que aunque me he basado en el artículo <a href="https://wiki.archlinux.org/index.php/System_maintenance">https://wiki.archlinux.org/index.php/System_maintenance</a> , este script es personal y adaptado a mis propias necesidades. Lo pongo aquí por si a alguien le sirve de guía, no debe ser una norma a seguir. Por tanto, os recomiendo que cada uno lo analice y lo modifique para que haga exactamente lo que quiere. Debéis utilizarlo bajo vuestra propia responsabilidad. Si tienes alguna duda, puedes preguntarme.</span><br />
<pre><span style="font-family: Verdana,sans-serif;"><code>
#!/bin/bash
echo "--------------- Actualizando el sistema (1/5) ---------------"
read -r -p "Quieres actualizar tu sistema (incluyendo incluyendo Aur)? [S/n] " response
if ! [[ $response =~ ^([nN][oO]|[nN])$ ]]
then
# sudo pacman -Syu
yaourt -Syua
fi
echo "--------------- Actualizado el sistema (1/5) ---------------"
echo "--------------- Eliminando los paquetes huerfanos (2/5) ---------------"
if [[ ! -n $(pacman -Qdt) ]]; then
echo "No orphans to remove."
else
sudo pacman -Rns $(pacman -Qdtq)
fi
echo "--------------- Eliminados los paquetes huerfanos (2/5) ---------------"
echo "--------------- Optimizando la base de datos (3/5) ---------------"
read -r -p "Se va a optimizar la base de datos. Si además quiere borrar la caché de las aplicaciones instaladas pulse i. Para borrar toda la caché pulse t. Para no borrar nada pulse N (recomendado). Pulse [i/t/N].
" response
if [[ $response =~ ^([iI])$ ]]
then
sudo pacman -Sc && sudo pacman-optimize
elif [[ $response =~ ^([tT])$ ]]
then
sudo pacman -Scc && sudo pacman-optimize
else
sudo pacman-optimize && sync
fi
echo "--------------- Optimizada la base de datos(3/5) ---------------"
echo "--------------- Actualizando los repositorios (4/5) ---------------"
# ¿Desea actualizar sus repositorios?
read -r -p "Quieres actualizar tus repositorios? [s/N] " response
if [[ $response =~ ^([sS][iI]|[sS])$ ]]
then
cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.backup
sudo pacman-mirrors -g
pacman -Syy
fi
echo "--------------- Actualizados los repositorios (4/5) ---------------"
echo "--------------- Vaciando las papeleras (5/5) ---------------"
read -r -p "¿Quieres vaciar las papeleras de reciclaje de todos los usuarios (incluido root)? [S/n] " response
if ! [[ $response =~ ^([nN][oO]|[nN])$ ]]
then
rm -rf /home/*/.local/share/Trash/*/** &> /dev/null
sudo rm -rf /root/.local/share/Trash/*/** &> /dev/null
fi
read -r -p "¿Quieres vaciar la carpeta Descargas [S/n] " response
if ! [[ $response =~ ^([nN][oO]|[nN])$ ]]
then
sudo rm -rf ~/Descargas/* &> /dev/null
fi
echo "--------------- Vaciadas las papeleras (5/5) ---------------"
</code></span></pre>
<span style="font-family: Verdana,sans-serif;"><br /></span>
<span style="font-family: Verdana,sans-serif;"><br /></span>
<span style="font-family: Verdana,sans-serif;"><br /></span>
<span style="font-family: Verdana,sans-serif;">Si tenéis alguna sugerencia, duda ó corrección, podéis utilizar los comentarios.<br /> </span><br />
<h4>
<span style="font-family: Verdana,sans-serif;">
Fuentes:</span></h4>
<span style="font-family: Verdana,sans-serif;"><a href="https://wiki.archlinux.org/index.php/System_maintenance">https://wiki.archlinux.org/index.php/System_maintenance</a></span>Felipe Martínez D.http://www.blogger.com/profile/04078426213350478089noreply@blogger.com2tag:blogger.com,1999:blog-8040889349682767430.post-24519952078302905332014-06-19T19:14:00.001+02:002014-06-20T08:27:26.187+02:00Mantenimiento y optimización de Manjaro, los comandos<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiP4PobOgCP9tzqsqDLXT8Z6ScTZAZXICuPuMyQn7hJMYbQDJSqNM0MUE02bdWU-G1sMxWq5LggFjF9eSZWH8i01X4Urg4ZFeTyrEGYJI9m_Cn_ohHV-UWPtQcCAA1UEKx86Cfq4mKaUdWl/s1600/manjaro-logo-128x128.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiP4PobOgCP9tzqsqDLXT8Z6ScTZAZXICuPuMyQn7hJMYbQDJSqNM0MUE02bdWU-G1sMxWq5LggFjF9eSZWH8i01X4Urg4ZFeTyrEGYJI9m_Cn_ohHV-UWPtQcCAA1UEKx86Cfq4mKaUdWl/s1600/manjaro-logo-128x128.png" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-family: Verdana,sans-serif;">Después de llevar algunos meses utilizando Manjaro, me he decidido a hacer un post donde se explique cómo realizar el mantenimiento y optimización de esta excelente distribución. Me he basado en el artículo "System maintenance" de la Wiki de Arch Linux (<a href="https://wiki.archlinux.org/index.php/System_maintenance">https://wiki.archlinux.org/index.php/System_maintenance</a>). Sin más, pasamos a enumerar y explicar los comandos.</span><br />
<span style="font-family: Verdana,sans-serif;"><br /></span>
<span style="font-family: Verdana,sans-serif;"><br /></span>
<br />
<h4>
<span style="font-family: Verdana,sans-serif;">
Actualizar el sistema</span></h4>
<span style="font-family: Verdana,sans-serif;">Podemos actualizar los paquetes del repositorio oficial:</span><br />
<pre><span style="font-family: Verdana,sans-serif;"><code>sudo pacman -Syu</code></span></pre>
<span style="font-family: Verdana,sans-serif;"><br /></span>
<span style="font-family: Verdana,sans-serif;">O bien actualizar los paquetes del repositorio oficial y de AUR (Arch User Repository):</span><br />
<pre><span style="font-family: Verdana,sans-serif;"><code>yaourt -Syua</code></span></pre>
<span style="font-family: Verdana,sans-serif;"><br /></span>
<span style="font-family: Verdana,sans-serif;"><br /></span>
<br />
<h4>
<span style="font-family: Verdana,sans-serif;">
Eliminar los paquetes huérfanos</span></h4>
<span style="font-family: Verdana,sans-serif;">Se van a eliminar los paquetes que no dependen de ninguna aplicación. Para listar dichos paquetes usamos:</span><br />
<pre><span style="font-family: Verdana,sans-serif;"><code>pacman -Qdt</code></span></pre>
<span style="font-family: Verdana,sans-serif;"><br /></span>
<span style="font-family: Verdana,sans-serif;">Si hay paquetes huérfanos los eliminamos así:</span><br />
<pre><span style="font-family: Verdana,sans-serif;"><code>sudo pacman -Rns $(pacman -Qdtq)</code></span></pre>
<span style="font-family: Verdana,sans-serif;"><br /></span>
<span style="font-family: Verdana,sans-serif;"><br /></span>
<br />
<h4>
<span style="font-family: Verdana,sans-serif;">
Borrar la caché de los paquetes</span></h4>
<span style="font-family: Verdana,sans-serif;">Ésto solo lo haremos en caso de que estemos seguros de que los paquetes instalados son estables. Borrará las versiones anteriores de la carpeta de caché y por tanto no podremos hacer downgrade:</span><br />
<pre><span style="font-family: Verdana,sans-serif;"><code>sudo pacman -Sc</code></span></pre>
<span style="font-family: Verdana,sans-serif;"><br /></span>
<span style="font-family: Verdana,sans-serif;">El comando siguiente es aun más agresivo, ya que borra completamente la carpeta de caché. No debemos usarlo a no ser que desesperadamente queramos obtener espacio en disco:</span><br />
<pre><span style="font-family: Verdana,sans-serif;"><code>sudo pacman -Scc</code></span></pre>
<span style="font-family: Verdana,sans-serif;"><br /></span>
<span style="font-family: Verdana,sans-serif;"><br /></span>
<br />
<h4>
<span style="font-family: Verdana,sans-serif;">
Optimizar el acceso a la base de datos</span></h4>
<span style="font-family: Verdana,sans-serif;">Con el siguiente comando se mejora la velocidad de acceso a la base de datos y por tanto también el tiempo necesario para las operaciones sobre ésta:</span><br />
<pre><span style="font-family: Verdana,sans-serif;"><code>sudo pacman-optimize && sync </code></span></pre>
<h4>
<span style="font-family: Verdana,sans-serif;">
</span></h4>
<h4>
<span style="font-family: Verdana,sans-serif;">
</span></h4>
<h4>
<span style="font-family: Verdana,sans-serif;">Actualizar los repositorios</span></h4>
<span style="font-family: Verdana,sans-serif;">Se va a rehacer el archivo mirrorlist, de foma que ordene los servidores disponibles dependiendo de su tiempo de acceso (previamente deberemos hacer una copia de seguridad del archivo mirrorlist, como se muestra a continuación):
</span><br />
<pre><span style="font-family: Verdana,sans-serif;"><code>
cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.backup
sudo pacman-mirrors -g
pacman -Syy</code></span></pre>
<h4>
<span style="font-family: Verdana,sans-serif;">
</span></h4>
<h4>
<span style="font-family: Verdana,sans-serif;">
</span></h4>
<h4>
<span style="font-family: Verdana,sans-serif;">Vaciar las papeleras de reciclaje y otras carpetas</span></h4>
<span style="font-family: Verdana,sans-serif;">Este paso es opcional y no aparece en el artículo "System maintenance" que mencioné al principio. Cada uno debe pensar si es conveniente llevarlo a cabo o no. Se vaciarán las papeleras de reciclaje de todos los usuarios del sistema, incluida la de root:
</span><br />
<pre><span style="font-family: Verdana,sans-serif;"><code>
rm -rf /home/*/.local/share/Trash/*/** &> /dev/null
sudo rm -rf /root/.local/share/Trash/*/** &> /dev/null
</code></span></pre>
<span style="font-family: Verdana,sans-serif;"><br /></span>
<span style="font-family: Verdana,sans-serif;">Personalmente también borro la carpeta de Descargas, ya que ahí siempre quedan archivos que no voy a volver a necesitar:
</span><br />
<pre><span style="font-family: Verdana,sans-serif;"><code>sudo rm -rf ~/Descargas/* &> /dev/null</code></span></pre>
<span style="font-family: Verdana,sans-serif;"><br /></span>
<span style="font-family: Verdana,sans-serif;"><br /></span>
<span style="font-family: Verdana,sans-serif;"><br /></span><span style="font-family: Verdana,sans-serif;">Si te ha parecido interesante, puedes pasar al post <a href="http://felinfo.blogspot.com.es/2014/06/mantenimiento-y-optimizacion-de-manjaro_19.html">Mantenimiento y optimización de Manjaro, el script</a>, donde se explica como automatizar todas estas tareas usando un script.</span>
<span style="font-family: Verdana,sans-serif;"><br /></span>
<br />
<h4>
<span style="font-family: Verdana,sans-serif;">
Fuentes:</span></h4>
<span style="font-family: Verdana,sans-serif;"><a href="https://wiki.archlinux.org/index.php/System_maintenance">https://wiki.archlinux.org/index.php/System_maintenance</a></span>
Felipe Martínez D.http://www.blogger.com/profile/04078426213350478089noreply@blogger.com0