<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Infosofía := 0×69AEE7</title>
	
	<link>http://infosofia.blogdns.com:8089</link>
	<description>Daría todo lo que sé, por la mitad de lo que ignoro.</description>
	<pubDate>Wed, 14 Oct 2009 07:11:19 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/Infosofa069aee7" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Remover direcciones IP bloqueadas por DenyHosts</title>
		<link>http://feedproxy.google.com/~r/Infosofa069aee7/~3/w02pi4oM4dE/</link>
		<comments>http://infosofia.blogdns.com:8089/2009/01/25/remover-ip-bloqueadas-por-denyhosts/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 00:01:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[GNU/Linux]]></category>

		<category><![CDATA[bloqueo]]></category>

		<category><![CDATA[denyhosts]]></category>

		<category><![CDATA[desbloquear]]></category>

		<category><![CDATA[ip]]></category>

		<guid isPermaLink="false">http://infosofia.blogdns.com:8089/?p=75</guid>
		<description><![CDATA[DenyHosts es un script escrito en Python que analiza los logs del servidor sshd y determinar posibles intentos de ataques. En caso de que se detecte tal intento se actualiza el archivo /etc/hosts.deny con la IP del posible ataque para prevenir cualquier intento futuro.
A través del archivo /etc/denyhosts.conf se setea la configuración, por ejemplo cantidad [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://denyhosts.sourceforge.net/index.html">DenyHosts</a> es un script escrito en Python que analiza los logs del servidor sshd y determinar posibles intentos de ataques. En caso de que se detecte tal intento se actualiza el archivo <tt>/etc/hosts.deny</tt> con la IP del posible ataque para prevenir cualquier intento futuro.</p>
<p>A través del archivo <tt>/etc/denyhosts.conf</tt> se setea la configuración, por ejemplo cantidad de intentos fallidos por el puerto ssh (por defecto 22) para que se considere un ataque.</p>
<p>¿Qué sucede si por equivocación DenyHosts nos confunde con un atacante al habernos confundido en la cantidad de intentos posibles? Nuestra IP es almacenada en <tt>/etc/hosts.deny</tt> y por lo tantos tenemos el acceso bloqueado. Para remediar esta situación no bastará con remover nuestra IP de <tt>hosts.deny</tt>. Tenemos que hacer lo siguiente:</p>
<ul>
<li>Detener DenyHosts (i.e. <tt>/etc/init.d/denyhosts stop</tt>)</li>
<li>Remover la IP bloqueada de <tt>/etc/hosts.deny</tt></li>
<li>Remover la IP bloqueada de <tt>WORK_DIR/hosts</tt></li>
<li>Remover la IP bloqueada de <tt>WORK_DIR/hosts-restricted</tt></li>
<li>Remover la IP bloqueada de <tt>WORK_DIR/hosts-root</tt></li>
<li>Remover la IP bloqueada de <tt>WORK_DIR/hosts-valid</tt></li>
<li>Remover la IP bloqueada de <tt>WORK_DIR/user-hosts</tt></li>
<li>Arrancar DenyHosts (i.e. <tt>/etc/init.d/denyhosts start</tt>)</li>
</ul>
<blockquote><p>
<strong>Nota:</strong> Para obtener WORK_DIR utilizar el siguiente comando: </p>
<pre class="codigo"><code>
$ cat /etc/denyhosts.conf | grep 'WORK_DIR ='
</code></pre>
<p>En Debian Etch la salida del comando anterior es <tt>WORK_DIR = <strong>/var/lib/denyhosts</strong></tt></p>
</blockquote>
<h3>Fuente</h3>
<ul>
<li><a href="http://denyhosts.sourceforge.net/faq.html#3_19">FAQ de DenyHosts</a>[sourceforge.net]</li>
</ul>
<img src="http://feeds.feedburner.com/~r/Infosofa069aee7/~4/w02pi4oM4dE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://infosofia.blogdns.com:8089/2009/01/25/remover-ip-bloqueadas-por-denyhosts/feed/</wfw:commentRss>
		<feedburner:origLink>http://infosofia.blogdns.com:8089/2009/01/25/remover-ip-bloqueadas-por-denyhosts/</feedburner:origLink></item>
		<item>
		<title>Normalizando paths</title>
		<link>http://feedproxy.google.com/~r/Infosofa069aee7/~3/pWSsaIxfkBE/</link>
		<comments>http://infosofia.blogdns.com:8089/2009/01/16/normalizando-paths/#comments</comments>
		<pubDate>Sat, 17 Jan 2009 02:39:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[ruby]]></category>

		<category><![CDATA[file]]></category>

		<category><![CDATA[normalizar]]></category>

		<category><![CDATA[path]]></category>

		<category><![CDATA[regexp]]></category>

		<guid isPermaLink="false">http://infosofia.blogdns.com:8089/?p=65</guid>
		<description><![CDATA[Básicamente normalizar un path consiste en remover todas las ocurrencias &#8216;..&#8217; y &#8216;.&#8217; para obtener un path absoluto. Por ejemplo, si tenemos: /foo/bar/../baz, normalizado quedaría /foo/baz.
Podemos hacer una sencilla función de normalización en Ruby con la ayuda de expresiones regulares. Por ejemplo:

def normalizar path
  ret = path.split(%r{/\.(/&#124;\Z)}).join
  ret = ret.split(%r{/[^/]+/\.\.}).join
  raise &#8220;path [...]]]></description>
			<content:encoded><![CDATA[<p>Básicamente normalizar un path consiste en remover todas las ocurrencias &#8216;..&#8217; y &#8216;.&#8217; para obtener un path absoluto. Por ejemplo, si tenemos: <tt>/foo/bar/../baz</tt>, normalizado quedaría <tt>/foo/baz</tt>.</p>
<p>Podemos hacer una sencilla función de normalización en Ruby con la ayuda de expresiones regulares. Por ejemplo:</p>
<pre class="codigo"><code>
def normalizar path
  ret = path.split(%r{/\.(/|\Z)}).join
  ret = ret.split(%r{/[^/]+/\.\.}).join
  raise &#8220;path incorrecto&#8221; if %r{/\.\.(/|\Z)} =~ ret ||
                                      ret[0] != ?/
  ret
end
</code></pre>
<p>Expliquemos que hace cada línea:</p>
<ul>
<li><tt>path.split(%r{/\.(/|\Z)}).join</tt>; remueve todas las ocurrencias &#8216;.&#8217; del path.</li>
<li><tt>ret.split(%r{/[^/]+/\.\.}).join</tt>; remueve todas las ocurrencias &#8216;..&#8217; del path.</li>
<li><tt>%r{/\.\.(/|\Z)} =~ ret || ret[0] != ?/</tt>; larga una excepción en caso de que se ingrese un path que no pueda ser normalizado. Verifica que el primer caracter  del path sea &#8216;<tt>/</tt>&#8216; y que no se tengan situaciones como &#8216;<tt>/../foo</tt>&#8216;.</li>
</ul>
<p>Dejo un par de ejemplo de prueba:</p>
<pre class="codigo"><code>
irb(main):002:0>  normalizar "/foo/../bar/."
=> "/bar"
irb(main):003:0> normalizar "/foo/./bar/../baz"
=> "/foo/baz"
irb(main):004:0> normalizar "./foo/./bar/../baz"
RuntimeError: path anormal `./foo/./bar/../baz'
        from (irb):4
irb(main):005:0> normalizar "../foo/"
RuntimeError: path anormal `../foo/'
        from (irb):5
irb(main):006:0> normalizar "/../foo/"
RuntimeError: path anormal `/../foo/'
        from (irb):6
</pre>
<p></code></p>
<p>Pueden probar los ejemplos online desde aquí: <a href="http://www.rubular.com/">http://www.rubular.com/</a></p>
<p>Son bienvenidos aportes y comentarios :-)</p>
<img src="http://feeds.feedburner.com/~r/Infosofa069aee7/~4/pWSsaIxfkBE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://infosofia.blogdns.com:8089/2009/01/16/normalizando-paths/feed/</wfw:commentRss>
		<feedburner:origLink>http://infosofia.blogdns.com:8089/2009/01/16/normalizando-paths/</feedburner:origLink></item>
		<item>
		<title>Restringir edición a usuarios anónimos</title>
		<link>http://feedproxy.google.com/~r/Infosofa069aee7/~3/kJocC7eVw5I/</link>
		<comments>http://infosofia.blogdns.com:8089/2008/12/09/restringir-edicion-a-usuarios-anonimos/#comments</comments>
		<pubDate>Tue, 09 Dec 2008 10:03:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[MediaWiki]]></category>

		<category><![CDATA[edición]]></category>

		<category><![CDATA[restringir]]></category>

		<category><![CDATA[usuario]]></category>

		<guid isPermaLink="false">http://infosofia.blogdns.com:8089/?p=74</guid>
		<description><![CDATA[Solamente hay que agregar en el archivo LocalSettings.php (válido para versiones 1.5 y superiores):

$wgGroupPermissions['*']['edit'] = false;

Referencia

Manual MediaWiki[mediawiki.org].

]]></description>
			<content:encoded><![CDATA[<p>Solamente hay que agregar en el archivo <tt>LocalSettings.php</tt> (válido para versiones 1.5 y superiores):</p>
<pre class="codigo"><code>
$wgGroupPermissions['*']['edit'] = false;
</code></pre>
<h3>Referencia</h3>
<ul>
<li><a href="http://www.mediawiki.org/wiki/Manual:Preventing_access#Restrict_anonymous_editing">Manual MediaWiki</a>[mediawiki.org].</li>
</ul>
<img src="http://feeds.feedburner.com/~r/Infosofa069aee7/~4/kJocC7eVw5I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://infosofia.blogdns.com:8089/2008/12/09/restringir-edicion-a-usuarios-anonimos/feed/</wfw:commentRss>
		<feedburner:origLink>http://infosofia.blogdns.com:8089/2008/12/09/restringir-edicion-a-usuarios-anonimos/</feedburner:origLink></item>
		<item>
		<title>Valores por defecto para argumento hash</title>
		<link>http://feedproxy.google.com/~r/Infosofa069aee7/~3/CpfpXTVN-5I/</link>
		<comments>http://infosofia.blogdns.com:8089/2008/12/04/valores-por-defecto-para-argumento-hash/#comments</comments>
		<pubDate>Thu, 04 Dec 2008 10:20:42 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[argumento]]></category>

		<category><![CDATA[hash]]></category>

		<category><![CDATA[opcional]]></category>

		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://infosofia.blogdns.com:8089/?p=73</guid>
		<description><![CDATA[Cuando un método requiere varios argumentos puede resultar difícil recordar el orden en que deben ser pasados. Es por esto que algunos lenguajes permiten invocar métodos a través de nombres de parámetros y sus valores. Ruby no soporta esa forma, pero se puede obtener, el mismo resultado, a través del uso de un hash en [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando un método requiere varios argumentos puede resultar difícil recordar el orden en que deben ser pasados. Es por esto que algunos lenguajes permiten invocar métodos a través de nombres de parámetros y sus valores. <strong>Ruby</strong> no soporta esa forma, pero se puede obtener, el mismo resultado, a través del uso de un hash en el argumento.</p>
<p>Buscando encontré esta estupenda forma de establecer valores por defecto en un hash, de manera de obtener argumentos opcionales en la invocación.</p>
<pre class="codigo"><code>
def foo args
  args[:unidad] ||= 0
  args[:total] ||= 1
  args[:unidad] / args[:total]
end

>> foo :unidad => 23
=> 23
>> foo :total => 12
=> 0
</code></pre>
<h3>Referencia</h3>
<ul>
<li><a href="http://marklunds.com/articles/one/387">http://marklunds.com/articles/one/387</a>[marklunds.com]</li>
</ul>
<img src="http://feeds.feedburner.com/~r/Infosofa069aee7/~4/CpfpXTVN-5I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://infosofia.blogdns.com:8089/2008/12/04/valores-por-defecto-para-argumento-hash/feed/</wfw:commentRss>
		<feedburner:origLink>http://infosofia.blogdns.com:8089/2008/12/04/valores-por-defecto-para-argumento-hash/</feedburner:origLink></item>
		<item>
		<title>Imprimir PDF: dos páginas por hoja y doble faz</title>
		<link>http://feedproxy.google.com/~r/Infosofa069aee7/~3/wv8JFPIGdjI/</link>
		<comments>http://infosofia.blogdns.com:8089/2008/12/03/imprimir-pdf-dos-pagina-por-hoja-y-doble-faz/#comments</comments>
		<pubDate>Wed, 03 Dec 2008 10:38:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[GNU/Linux]]></category>

		<category><![CDATA[bash]]></category>

		<category><![CDATA[impresion]]></category>

		<category><![CDATA[pdftk]]></category>

		<guid isPermaLink="false">http://infosofia.blogdns.com:8089/?p=72</guid>
		<description><![CDATA[Recurrente problema que he tenido hace tiempo; además de ser una manera excelente de economizar en impresiones de libros digitales.
Simplemente he codificado un pequeño script que divide el documento en cuestión en dos archivos: primeras.pdf y segundas.pdf. Cada archivo contiene las hojas divididas, teniendo en cuenta que se van a imprimir dos hojas por cara, [...]]]></description>
			<content:encoded><![CDATA[<p>Recurrente problema que he tenido hace tiempo; además de ser una manera excelente de economizar en impresiones de libros digitales.</p>
<p>Simplemente he codificado un pequeño script que divide el documento en cuestión en dos archivos: <tt>primeras.pdf</tt> y <tt>segundas.pdf</tt>. Cada archivo contiene las hojas divididas, teniendo en cuenta que se van a imprimir dos hojas por cara, para primero imprimir todas las hojas correspondientes a las caras superiores y el otro el de las inferiores.</p>
<p>Por ejemplo: tenemos un documento llamado <tt>libro.pdf</tt> el cual tiene 16 hojas. Al utilizar el script obtendremos dos archivos, los cuales contendrán las hojas:</p>
<ul>
<li><tt>primeras.pdf</tt>; <u>contiene hojas de las caras superiores</u>: 1, 2, 5, 6, 9, 10, 13, 14.</li>
<li><tt>segundas.pdf</tt>; <u>contiene hojas de las caras inferiores</u>: 3, 4, 7, 8, 11, 12, 15, 16.</li>
</ul>
<h2>Script</h2>
<pre class="codigo"><code>
#!/bin/bash
total=#Coloque la cantidad de hojas del documento
eval pdftk A=$1 cat `i=1;while [ $i -lt $((total)) ];
do echo A$i A$(($i+1));
let i=$(($i + 4));
done` output primeras.pdf
eval pdftk A=$1 cat `i=3;while [ $i -lt $((total)) ];
do echo A$i A$(($i+1));
let i=$(($i + 4));
done` output segundas.pdf
</code></pre>
<h2>Uso</h2>
<ol>
<li>Hay que editar el script (como se indica más abajo).</li>
<li>Colocar el documento en la misma carpeta que el script.</li>
<li>Abrir una terminal y teclear:
<pre class="codigo"><code>
$ ./script.sh foo.pdf
</code></pre>
</li>
<li>Genera dos archivos. Primero imprimir: <tt>primeras.pdf</tt>, luego <tt>segundas.pdf</tt>.</li>
</ol>
<h2>Consideraciones</h2>
<ul>
<li>Para que el script funcione se debe tener instalado <a href="http://www.accesspdf.com/pdftk/"><strong>pdftk</strong></a>; un pequeño software que manipula documentos PDF (en cualquier distribución Debian: <tt>aptitude install pdftk</tt>).</li>
<li>Lamento no ser un experto en bash; el script no es perfecto. Antes de utilizarlo hay que indicarle la cantidad de hojas del documento, editando el script, asignando el valor a la variable: <tt>total</tt>. He intentado automatizar esto pero no he podido lograrlo. Si alguien lograse hacerlo agradecería que compartiese la solución. (dejo una pequeña ayuda para obtener la cantidad de hojas del documento PDF: <tt>eval pdftk $documento dump_data | grep &#8220;NumberOfPages:&#8221; | awk &#8216;{print $2}&#8217;</tt>).</li>
</ul>
<img src="http://feeds.feedburner.com/~r/Infosofa069aee7/~4/wv8JFPIGdjI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://infosofia.blogdns.com:8089/2008/12/03/imprimir-pdf-dos-pagina-por-hoja-y-doble-faz/feed/</wfw:commentRss>
		<feedburner:origLink>http://infosofia.blogdns.com:8089/2008/12/03/imprimir-pdf-dos-pagina-por-hoja-y-doble-faz/</feedburner:origLink></item>
		<item>
		<title>Subversion y Squid</title>
		<link>http://feedproxy.google.com/~r/Infosofa069aee7/~3/3I7Q5KFSzWo/</link>
		<comments>http://infosofia.blogdns.com:8089/2008/08/13/subversion-y-squid/#comments</comments>
		<pubDate>Wed, 13 Aug 2008 08:27:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Debian]]></category>

		<category><![CDATA[commit]]></category>

		<category><![CDATA[squid]]></category>

		<category><![CDATA[subversion]]></category>

		<guid isPermaLink="false">http://infosofia.blogdns.com:8089/?p=70</guid>
		<description><![CDATA[Trabajando en un proyecto, que lo tengo administrado bajo un repositorio en Subversion, me encontré con problemas al momento de realizar commit, vía web, de los cambios.
Obtenía el siguiente mensaje de error.

$ svn ci -m "cambios"
svn: Falló el commit (detalles a continuación):
svn: MKACTIVITY de '/svn/repos/projectNew/!svn/act/0a63fbb4-16d4-40b1-bc87-2f0dbd0eb709': 400 Bad Request (http://192.168.6.3)

Después de muchos idas y vueltas, pude [...]]]></description>
			<content:encoded><![CDATA[<p>Trabajando en un proyecto, que lo tengo administrado bajo un repositorio en Subversion, me encontré con problemas al momento de realizar <tt>commit</tt>, vía web, de los cambios.</p>
<p>Obtenía el siguiente mensaje de error.</p>
<pre class="codigo"><code>
$ svn ci -m "cambios"
svn: Falló el commit (detalles a continuación):
svn: MKACTIVITY de '/svn/repos/projectNew/!svn/act/0a63fbb4-16d4-40b1-bc87-2f0dbd0eb709': 400 Bad Request (http://192.168.6.3)
</code></pre>
<p>Después de muchos idas y vueltas, pude hacerme con la solución. El problema surge de que <strong>el servidor de Subversión se encuentra detrás de un proxy web</strong>, específicamente un Squid, por lo tanto, cuando el cliente de Subversion se comunica con el servidor Subversion (vía HTTP), utiliza una serie de métodos que no eran interpretados por el proxy. Los métodos en cuestión pertenecen a un subconjunto del los <a href="http://es.wikipedia.org/wiki/WebDAV#Visi.C3.B3n_general_acerca_del_protocolo_webdav">métodos añadidos al HTTP</a> por <a href="http://es.wikipedia.org/wiki/WebDAV">WebDAV</a>.</p>
<p>Entonces, para poder solucionar esto, tendríamos que lograr que Squid interprete estos métodos. Por defecto, Squid no los interpreta <u>pero los soporta</u>, de modo que, tendremos que editar la configuración para indicárselo.</p>
<pre class="codigo"><code>
#  TAG: extension_methods
#       Squid only knows about standardized HTTP request methods.
#       You can add up to 20 additional "extension" methods here.
#
#Default:
# none
<span style="border: 1px solid red;">extension_methods REPORT MERGE MKACTIVITY CHECKOUT</span>
</code></pre>
<blockquote><p>
<strong>Nota:</strong> Lo que está encerrado en rectángulo <span style="color:red">rojo</span> es la configuración que debe ser agregada al archivo.
</p></blockquote>
<p>Una vez guardado los cambios, se debe reiniciar el servicio (<tt>/etc/init.d/squid force-reload</tt>) para que Squid tomé los cambios en la configuración.</p>
<p>Ahora si volvemos al cliente y probamos el <tt>commit</tt> no debería dar problemas</p>
<pre class="codigo"><code>
$ svn ci -m "cambios"
Enviando       informe/001.tex
Enviando       informe/002.tex
Enviando       informe/003.tex
Transmitiendo contenido de archivos .......
Commit de la revisión 87.
</code></pre>
<h3>Referencias</h3>
<ul>
<li><a href="http://subversion.tigris.org/faq.html#http-methods">Métodos HTTP utilizados por Subversion</a>[subversion.trigis.org]</li>
<li><a href="http://subversion.tigris.org/faq.html#proxy">FAQ de Subversion</a>[subversion.trigis.org]</li>
</ul>
<img src="http://feeds.feedburner.com/~r/Infosofa069aee7/~4/3I7Q5KFSzWo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://infosofia.blogdns.com:8089/2008/08/13/subversion-y-squid/feed/</wfw:commentRss>
		<feedburner:origLink>http://infosofia.blogdns.com:8089/2008/08/13/subversion-y-squid/</feedburner:origLink></item>
		<item>
		<title>Problemas con imágenes en MediaWiki</title>
		<link>http://feedproxy.google.com/~r/Infosofa069aee7/~3/3HzDAQTMMGQ/</link>
		<comments>http://infosofia.blogdns.com:8089/2008/08/07/problemas-con-imagenes-en-mediawiki/#comments</comments>
		<pubDate>Thu, 07 Aug 2008 10:28:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[MediaWiki]]></category>

		<category><![CDATA[convert]]></category>

		<category><![CDATA[imagemagick]]></category>

		<category><![CDATA[wiki]]></category>

		<guid isPermaLink="false">http://infosofia.blogdns.com:8089/?p=69</guid>
		<description><![CDATA[El otro día al administrar un wiki, potenciado por MediaWiki, me encontré con un problema con la visualización de imágenes, subidas en el servidor, cuando eran insertadas en artículos. Comentó cómo solucioné esto.
Al insertar una imagen muy grande o cuando la reducía me lanzaba el siguiente error.

Error al crear miniatura: /var/www/wiki/bin/ulimit4.sh: line 4: /usr/bin/convert: No [...]]]></description>
			<content:encoded><![CDATA[<p>El otro día al administrar un wiki, potenciado por MediaWiki, me encontré con un problema con la visualización de imágenes, subidas en el servidor, cuando eran insertadas en artículos. Comentó cómo solucioné esto.</p>
<p>Al insertar una imagen muy grande o cuando la reducía me lanzaba el siguiente error.</p>
<pre class="codigo"><code>
Error al crear miniatura: /var/www/wiki/bin/ulimit4.sh: line 4: /usr/bin/convert: No such file or directory
</code></pre>
<p>Resumiendo, el error surgía al intentar hacer alguna transformación sobre la imagen (e.g. agrandar, reducir, etc.), sumando esto a lo descripto por el error, estaba faltando instalar algún programa que se encarga de esta tarea.</p>
<p>Investigando un poco, el comando <strong>convert</strong> está disponible en el paquete <em>imagemagick</em> en Debian. Al verificar en el servidor que corría el wiki, sobre ese paquete, efectivamente <em>imagemagick</em> no estaba instalado; bastó hacer un <em>aptitude install imagemagick</em>.</p>
<p>Una vez instalado volví al wiki y pude verificar que la imagen se visualizaba perfectamente.</p>
<h3>Fuentes</h3>
<ul>
<li><a href="http://listas.fi.uba.ar/pipermail/lug/2006-September/023578.html">Acá obtuve a qué paquete correspondía el comando <em>convert</em></a>.[listas.fi.uba.ar]</li>
<li><a href="http://www.bluehostforum.com/archive/index.php/t-4502.html">Información interesante relacionada con el mismo problema</a>.[bluehostforum.com]</li>
<li><a href="http://www.thinkwiki.org/wiki/Issues_with_the_Wiki#Missing_imagemagick_on_server">Relación del error con posible causa</a>.[thinkwiki.org]</li>
</ul>
<img src="http://feeds.feedburner.com/~r/Infosofa069aee7/~4/3HzDAQTMMGQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://infosofia.blogdns.com:8089/2008/08/07/problemas-con-imagenes-en-mediawiki/feed/</wfw:commentRss>
		<feedburner:origLink>http://infosofia.blogdns.com:8089/2008/08/07/problemas-con-imagenes-en-mediawiki/</feedburner:origLink></item>
		<item>
		<title>Imágenes en Latex</title>
		<link>http://feedproxy.google.com/~r/Infosofa069aee7/~3/GVwMEgYEXk4/</link>
		<comments>http://infosofia.blogdns.com:8089/2008/07/25/imagenes-en-latex/#comments</comments>
		<pubDate>Fri, 25 Jul 2008 04:58:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[latex]]></category>

		<category><![CDATA[dvips]]></category>

		<category><![CDATA[graphicx]]></category>

		<category><![CDATA[imágenes]]></category>

		<category><![CDATA[pdftex]]></category>

		<guid isPermaLink="false">http://infosofia.blogdns.com:8089/?p=68</guid>
		<description><![CDATA[Lograr ser un Latexperto es difícil más aún con el uso de imágenes en documentos, debido al peculiar tratamiento de estas por Latex. Gran parte del problema es que las imágenes (por ejemplo una con formato PNG) son objetos que no interpreta Latex, por estar en un &#8220;lenguaje&#8221; no comprensible por él. De modo que [...]]]></description>
			<content:encoded><![CDATA[<p>Lograr ser un Latexperto es difícil más aún con el uso de imágenes en documentos, debido al peculiar tratamiento de estas por Latex. Gran parte del problema es que las imágenes (por ejemplo una con formato PNG) son objetos que no interpreta Latex, por estar en un &#8220;lenguaje&#8221; no comprensible por él. De modo que al incluir imágenes surgen problemas al integrarse con el flujo del documento y es cuando la experiencia empieza a jugar su rol en el desarrollo de documentos de calidad.</p>
<p>En Latex podemos utilizar el paquete <tt>graphicx</tt> para insertar gráficos y manipularlos. Por lo tanto, gran parte de la experiencia que comentaba requiere conocimientos sobre el uso de este paquete.</p>
<p>Aquí presentaré un par de ejemplos para incorporar imágenes PNG a un documento y otras cosas más.</p>
<p>Cuando incluimos el paquete <tt>graphicx</tt> a nuestro documento lo importante es determinar correctamente el <em>controlador</em> con que será cargado ¿Qué es el controlador? <strong>El controlador es el encargado de visualizar la imagen en nuestro documento</strong>. Cuál controlador elegir depende de qué formato de imágen vayamos a insertar. A continuación presento una lista (no exhaustiva) de controladores.</p>
<dl>
<dt>pdftex</dt>
<dd>Este controlador acepta los formatos: JPEG, TIF, TIFF, PNG y PDF.</dd>
<dt>dvips</dt>
<dd>Acepta los formatos: PS, EPS, PCX y BMP.</dd>
</dl>
<p>Veamos como queda el comando <tt>usepackage</tt> si queremos utilizar <tt>graphicx</tt> especificando un controlador para imágenes en formato PNG:</p>
<pre class="codigo"><code>
\usepackage[pdftex]{graphicx}
</code></pre>
<p>Ahora falta incluir el gráfico en el documento, supongamos que el documento fuente se encuentra en <tt>/home/user/src/trabajo/</tt> y creamos una carpeta donde alojamos las imágenes PNGs en <tt>/home/user/src/trabajo/images/</tt> . Entonces para incluir la imagen utilizamos el comando </p>
<pre class="codigo"><code>
\includegraphics{images/foto0839.png}
</code></pre>
<blockquote><p>
<strong>Nota:</strong> Al definir la ruta de la imagen incluida utilicé una <u>ruta relativa</u> ya que la carpeta <tt>images</tt> se encuentra bajo <tt>trabajo</tt> y es ésta la que aloja el fuente .tex
</p></blockquote>
<p>Presento un pequeño documento fuente Latex que integra los dos comandos citados arriba.</p>
<pre class="codigo"><code>
\documentclass{article}
\usepackage[pdftex]{graphicx}
\begin{document}

Probando imágenes PNG en Latex
\includegraphics{images/foto0839.png}

\end{document}
</code></pre>
<p>Para finalizar, comparto un uso muy habitual de imágenes en documentos para hacer que se visualicen varias imágenes en un misma figura. Estas subimágenes son indexadas por letras (a), (b), (c), etc. Muy útil cuando queremos hacer comparaciones entre imágenes. Hay que utilizar el paquete <tt>subfigure</tt> y luego el comando <tt>subfigure</tt> que toma como argumento a <tt>includegraphics</tt>. Dejo un ejemplo de un fuente que utiliza el paquete <tt>subfigure</tt>.</p>
<pre class="codigo"><code>
\documentclass{article}
\usepackage[pdftex]{graphicx}
\usepackage{subfigure}
\begin{document}
Ejemplo de subfiguras
\begin{figure}[h]
  \centering
\subfigure[Donald Knuth]{\includegraphics{/home/admin/Escritorio/knuth.png}}
\subfigure[Richard Stallman]{\includegraphics{/home/admin/Escritorio/stallman.png}}
  \caption{Algunas figuras relevantes.}
\end{figure}
\end{document}
</code></pre>
<p>Al compilarlo con PDFLatex genera un PDF que presenta una hoja como la siguiente.</p>
<p><a href="./images/2008/07/25/ejemplo_subfigura.png"><img src="./images/2008/07/25/ejemplo_subfigura.png" alt="PDF que resulta de compilar el código fuente que utiliza el paquete subfigure" /></a></p>
<p>Dejo un par de links interesantes sobre el tema:</p>
<ul>
<li><a href="http://www.artofproblemsolving.com/LaTeX/AoPS_L_PictMan.php">Ejemplos con fuentes de manipulaciones con imágenes con <tt>graphicx</tt></a>[artofproblemsolving.com].</li>
<li><a href="http://www.google.com.ar/url?sa=t&#038;ct=res&#038;cd=3&#038;url=http%3A%2F%2Fwww.math.boun.edu.tr%2Fassistants%2Ftopaloglu%2Flatex%2Fepslatex.pdf&#038;ei=CVSJSIjUN4i28AS3gbnhDw&#038;usg=AFQjCNHAgpK650tmM59vF15_XpyOnjuSvw&#038;sig2=NT3umsuzyO3TJ0kz-e0GSA">Usando gráficos importados en Latex</a>[pdf].</li>
</ul>
<img src="http://feeds.feedburner.com/~r/Infosofa069aee7/~4/GVwMEgYEXk4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://infosofia.blogdns.com:8089/2008/07/25/imagenes-en-latex/feed/</wfw:commentRss>
		<feedburner:origLink>http://infosofia.blogdns.com:8089/2008/07/25/imagenes-en-latex/</feedburner:origLink></item>
		<item>
		<title>Historias de la Argentina</title>
		<link>http://feedproxy.google.com/~r/Infosofa069aee7/~3/oKsVWbSUCVc/</link>
		<comments>http://infosofia.blogdns.com:8089/2008/07/17/historias-de-la-argentina/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 11:43:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Opiniones]]></category>

		<category><![CDATA[Cobos Julio]]></category>

		<category><![CDATA[retenciones]]></category>

		<category><![CDATA[Senado]]></category>

		<guid isPermaLink="false">http://infosofia.blogdns.com:8089/?p=67</guid>
		<description><![CDATA[Luego de la media sanción obtenida en Diputados, el proyecto del gobierno fue puesto en discusión ayer y hoy en el Senado. No soy especialista en política ni nada parecido, sólo quiero dar mi visión de lo sucedido.
Antes, quiero dejar en claro que no soy simpatizante ni del oficialismo, ni de la oposición. Tampoco estoy [...]]]></description>
			<content:encoded><![CDATA[<p>Luego de la media sanción obtenida en Diputados, el proyecto del gobierno fue puesto en discusión ayer y hoy en el Senado. No soy especialista en política ni nada parecido, sólo quiero dar mi visión de lo sucedido.</p>
<p>Antes, quiero dejar en claro que no soy simpatizante ni del oficialismo, ni de la oposición. Tampoco estoy a favor del campo o en contra de las retenciones, en cambio estoy a favor de una Argentina mejor para <strong>TODOS</strong>.</p>
<p>Hoy el clima que se vive en el país no es muy alentador, ni tampoco agradable. Toda la Argentina se encuentra dividida por un problema (las retenciones al sector del campo), que a mi entender sólo a ocasionado que se vislumbre esta separación que ha existido desde hace mucho tiempo.</p>
<p>Durante muchas horas los senadores dieron sus argumentos en &#8220;favor&#8221; o en &#8220;contra&#8221; del proyecto. Una vez terminado el debate y llegada la hora del voto, se obtuvo un empate. La Constitución Nacional da el poder al presidente de la Cámara de Senadores, Julio Cobos, a votar para desempatar. Como he comentado en <a href="/2007/12/19/el-arte-del-ingeniero/">éste post anterior</a> (que quede claro que tampoco soy simpatizante de él) y mi opinión, era que Cobos sólo era un político mas.</p>
<p>El político, como un empresario, busca (dentro de otras cosas) su beneficio propio. En este caso es obtener una buena imagen, para posteriormente obtener mayor cantidad de votos. No estoy en contra de este beneficio que persiguen, sólo estoy en contra de la ética que suelen utilizar para alcanzarlo.</p>
<p>Por ejemplo, un gobernado toma decisiones a nivel provincial que pueden afectar a varias personas. Pensemos en una persona que está cerca de la línea de indigencia. Una de estas decisiones puede ocasionar que se vuelva indigente. Esto trae aparejados varios problemas a nivel personal, como trastornos físicos (alimento, vestido, etc) o psíquicos (desempleo, ignorancia, etc) incluso producirle la muerte. Cuando sucede lo anterior, me pregunto ¿qué diferencia hay entre un político y un asesino? Es una pregunta difícil y fácil, según el contexto que utilicemos para responderla. Pero que no queda duda que las vidas de varias personas están en juego en las decisiones de uno (o varios) políticos. Esto me hace pensar en el compromiso que trae votar, ya que indirectamente somos parte de ésto&#8230;</p>
<p>Todo lo anterior se desprendió a lo que sucedió en el Senado. Hubieron algunos que defendieron sus intereses o los intereses de la &#8220;mayoría&#8221;. Dentro de este ámbito donde la mayor parte de los Senadores aprovechó esto como un trampolín para las próximas elecciones, quedó eclipsado por las palabras de Julio Cobos.</p>
<p>Aquí dejo un fragmento obtenido de <a href="http://www.criticadigital.com/index.php?secc=nota&#038;nid=7544#relacionadas">crítica digital</a>[criticadigital.com].</p>
<blockquote><p>
“Yo tengo que acompañar la institucionalidad. <u>Mi corazón</u> dice otra cosa y no creo que esto sea el motivo para poner en riesgo el país. Quiero seguir siendo el vicepresidente de todos los argentinos. (&#8230;) Yo creo que la presidenta de los argentinos me va a entender. <u>No creo que nos sirva una ley que no soluciona este conflicto</u>. La historia me juzgará no sé cómo. (&#8230;) No puedo acompañar. Y esto no significa que estoy traicionando a nadie. <u>Estoy actuando en forma a mis convicciones</u>. Yo le digo a la presidenta de los argentinos que tiene la oportunidad de enviar un nuevo proyecto que contemple todo lo que se ha dicho, todos los aportes que se han brindado. Que la historia me juzgue. <u>Pido perdón si me equivoco</u>. Mi voto no es positivo. Mi vito es en rechazo”
</p></blockquote>
<p>Los subrayados fueron mios, de ellos a mi parecer se puede ver la imagen de un hombre y no la careta de un político. Un hombre que quiere una mejor Argentina y no sólo para él o sus conocidos, sino para cada persona. Una Argentina no derrumbada por los beneficios o las idiosincrasias de la mayoría. Una Argentina unida. Él no estuvo a favor/contra del oficialismo/oposición. Estuvo a favor de sus convicciones, estas convicciones que pueden llevar a uno a ser una gran persona o ser un despreciable. Y la peor traición que pudo haber hecho es traicionar sus convicciones.</p>
<p>No soy optimista en cuanto al futuro de la Argentina, pero la actitud de éste hombre, que buscó el consenso de todos (él fue quien propuso llevar el debate al Congreso y además pidió un cuarto intermedio) da expectativas de un mañana mejor en este atormentado país.</p>
<img src="http://feeds.feedburner.com/~r/Infosofa069aee7/~4/oKsVWbSUCVc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://infosofia.blogdns.com:8089/2008/07/17/historias-de-la-argentina/feed/</wfw:commentRss>
		<feedburner:origLink>http://infosofia.blogdns.com:8089/2008/07/17/historias-de-la-argentina/</feedburner:origLink></item>
		<item>
		<title>Enlaces simbólicos y scp</title>
		<link>http://feedproxy.google.com/~r/Infosofa069aee7/~3/Q5ZeU_TI-Rc/</link>
		<comments>http://infosofia.blogdns.com:8089/2008/07/09/enlaces-simbolicos-y-scp/#comments</comments>
		<pubDate>Wed, 09 Jul 2008 23:16:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[GNU/Linux]]></category>

		<category><![CDATA[enlaces simbólicos]]></category>

		<category><![CDATA[respaldo]]></category>

		<category><![CDATA[rsync]]></category>

		<category><![CDATA[scp]]></category>

		<guid isPermaLink="false">http://infosofia.blogdns.com:8089/?p=66</guid>
		<description><![CDATA[Me tocó hacer unos respaldos de cantidades importantes de archivos, entre dos equipos que se encontraban localizados en la misma red. Al enfrentar dicho trabajo, supuse erróneamente que sería muy fácil utilizando el comando scp, utilizando el parámetro r.

# scp -r /home/dante root@192.168.1.1:/mnt/disk015/dante

Se necesitaban respaldar aproximadamente 210GB. Calculé que el proceso iba a tomar aproximadamente [...]]]></description>
			<content:encoded><![CDATA[<p>Me tocó hacer unos respaldos de cantidades importantes de archivos, entre dos equipos que se encontraban localizados en la misma red. Al enfrentar dicho trabajo, supuse erróneamente que sería muy fácil utilizando el comando <em>scp</em>, utilizando el parámetro <em>r</em>.</p>
<pre style="clear:both;" class="codigo"><code>
# scp -r /home/dante root@192.168.1.1:/mnt/disk015/dante
</code></pre>
<p>Se necesitaban respaldar aproximadamente 210GB. Calculé que el proceso iba a tomar aproximadamente unas 5 horas, dejo los cálculos, espero que estén bien :-P</p>
<blockquote>
<ul>
<li>210 GB = 225485783040 Bytes</li>
<li>225485783040 Bytes = 1803886264320 bits</li>
<li>1803886264320 bits = 1803886 mbits</li>
<li>A 100 mbps -> 18038 segundos</li>
<li>18038 segundos = 5 horas</li>
</ul>
</blockquote>
<p>La cuestión es que al pasar las cinco horas seguía copiando. Deje que siguiera, creyendo que había algún error de redondeo u horrores en los cálculos anteriores, pero luego de 3 horas más (con un total de 8 horas) ¡todavía seguía copiando!</p>
<p>Tenía dos hipótesis:</p>
<ol>
<li>Tengo serios problemas con las matemáticas.</li>
<li>Pasa algo raro con el comando <em>scp</em>.</li>
</ol>
<p>Con respecto a la primera todavía tengo dudas :-D En cuanto a la segunda, pude comprobar que <em>scp</em> no entiende <a lang="es" href="http://es.wikipedia.org/wiki/Enlace_simb%C3%B3lico">los links simbólicos</a>. Por lo tanto, al encontrar un link simbólico, no lo respeta y lo sigue, copiando todo el contenido al que apunta. Para entender la magnitud de esto, les sigo comentando mi experiencia.</p>
<div style="float:right;width:190px;padding:3px;background-color:#eaf3fa;margin-left:10px;text-align:center;">
<p style="border:0;padding:0;margin:0;background-color:#2683ae;color:#fff;"><strong>rsync</strong></p>
<p>Es un programa similar a rcp, pero tiene muchas más opciones. Además permite transferir sólo las diferencias entre archivos, logrando velocidad de transferencia.</p>
</div>
<p>Al revisar las copias, comprobé lo comentado anteriormente. Efectivamente, hacía copias de los contenidos apuntados por los links simbólicos. El problema principal fue un serie de links simbólicos que apuntaban a una carpeta llamada &#8220;Videos&#8221;,que pesaba unos 120GB y existían 3 links simbólicos a esta carpeta, entonces de los 120GB que creí que se debían copiar, pase a copiar ¡360GB!</p>
<p>Todo esto pude haberlo aludido si hubiese sabido sobre el comando <strong>rsync</strong>, su uso es tan sencillo como <em>scp</em>.</p>
<pre class="codigo"><code>
# rsync -r -l -t -v -u /home/dante root@192.168.1.1:/mnt/disk015/dante
</code></pre>
<p>Las opciones que utilicé indican.</p>
<dl>
<dt>r</dt>
<dd>Recursive, recurre dentro de los directorios.</dd>
<dt>l</dt>
<dd><strong><u>Links, al encontrarse con un link simbólico lo copia como tal</u>.</strong></dd>
<dt>t</dt>
<dd>Time, preserva los tiempos (de los archivos) al copiarlos.</dd>
<dt>v</dt>
<dd>Verbosity, incrementa la verbosidad en la salida del comando.</dd>
<dt>u</dt>
<dd>Updates, no copia archivos que estén actualizados en el receptor.</dd>
</dl>
<p>Además de estas opciones, se encuentran muchas más y muy útiles. Puedes consultar todas las opciones y ejemplos de uso en las <a lang="en" href="http://www.samba.org/ftp/rsync/rsync.html">páginas man de rsync</a>[samba.org].</p>
<h3>Excluyendo carpetas o archivos</h3>
<p>Al realizar un backup de una carpeta como <tt>home</tt> es frecuente que se encuentren archivos o carpetas que no necesitan ser respaldadas, esto puede ser indicado a <tt>rsync</tt> con el parámetro <tt>exclude</tt>. Por ejemplo, supongamos que queramos excluir del respaldo la carpeta <tt>foo/</tt> relativa <tt>/home/dante/</tt>:</p>
<pre class="codigo"><code>
# rsync -r -l -t -v -u --exclude 'foo' /home/dante root@192.168.1.1:/mnt/disk015/dante
</code></pre>
<blockquote><p>
<strong>Nota:</strong> el archivo o carpeta a excluir debe ir entre comillas simples.</p></blockquote>
<h3>Excluir más de un archivo o carpeta</h3>
<p>Será necesario editar un simple archivo de texto plano que liste los archivos o carpetas que no se deberán respaldar. Un pequeño ejemplo podría ser:</p>
<pre class="codigo"><code>
quux
quuux/tmp/*/*.pid
quuuux
baz
</code></pre>
<p>Guardamos el archivo como <tt>no_respaldar</tt> en <tt>/home/dante/</tt> y se lo indicamos a <tt>rsync</tt>:</p>
<pre class="codigo"><code>
# rsync -r -l -t -v -u --exclude-from 'no_respaldar' /home/dante root@192.168.1.1:/mnt/disk015/dante
</code></pre>
<h3>Problemas frecuentes</h3>
<p>Al ejecutar el comando puede ser que obtengas la siguiente salida:</p>
<pre class="codigo"><code>
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: remote command not found (code 127) at io.c(454) [sender=2.6.9]
</code></pre>
<p>Para solucionarlo basta instalar <tt>rsync</tt> también en la máquina remota.</p>
<img src="http://feeds.feedburner.com/~r/Infosofa069aee7/~4/Q5ZeU_TI-Rc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://infosofia.blogdns.com:8089/2008/07/09/enlaces-simbolicos-y-scp/feed/</wfw:commentRss>
		<feedburner:origLink>http://infosofia.blogdns.com:8089/2008/07/09/enlaces-simbolicos-y-scp/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic Page Served (once) in 1.046 seconds --><!-- Cached page generated by WP-Super-Cache on 2009-11-06 22:17:45 --><!-- Compression = gzip -->
