Archive for July, 2008

Imágenes en Latex

Friday, July 25th, 2008

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 “lenguaje” 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.

En Latex podemos utilizar el paquete graphicx para insertar gráficos y manipularlos. Por lo tanto, gran parte de la experiencia que comentaba requiere conocimientos sobre el uso de este paquete.

Aquí presentaré un par de ejemplos para incorporar imágenes PNG a un documento y otras cosas más.

Cuando incluimos el paquete graphicx a nuestro documento lo importante es determinar correctamente el controlador con que será cargado ¿Qué es el controlador? El controlador es el encargado de visualizar la imagen en nuestro documento. Cuál controlador elegir depende de qué formato de imágen vayamos a insertar. A continuación presento una lista (no exhaustiva) de controladores.

pdftex
Este controlador acepta los formatos: JPEG, TIF, TIFF, PNG y PDF.
dvips
Acepta los formatos: PS, EPS, PCX y BMP.

Veamos como queda el comando usepackage si queremos utilizar graphicx especificando un controlador para imágenes en formato PNG:


\usepackage[pdftex]{graphicx}

Ahora falta incluir el gráfico en el documento, supongamos que el documento fuente se encuentra en /home/user/src/trabajo/ y creamos una carpeta donde alojamos las imágenes PNGs en /home/user/src/trabajo/images/ . Entonces para incluir la imagen utilizamos el comando


\includegraphics{images/foto0839.png}

Nota: Al definir la ruta de la imagen incluida utilicé una ruta relativa ya que la carpeta images se encuentra bajo trabajo y es ésta la que aloja el fuente .tex

Presento un pequeño documento fuente Latex que integra los dos comandos citados arriba.


\documentclass{article}
\usepackage[pdftex]{graphicx}
\begin{document}

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

\end{document}

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 subfigure y luego el comando subfigure que toma como argumento a includegraphics. Dejo un ejemplo de un fuente que utiliza el paquete subfigure.


\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}

Al compilarlo con PDFLatex genera un PDF que presenta una hoja como la siguiente.

PDF que resulta de compilar el código fuente que utiliza el paquete subfigure

Dejo un par de links interesantes sobre el tema:

Historias de la Argentina

Thursday, July 17th, 2008

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 a favor del campo o en contra de las retenciones, en cambio estoy a favor de una Argentina mejor para TODOS.

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.

Durante muchas horas los senadores dieron sus argumentos en “favor” o en “contra” 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 éste post anterior (que quede claro que tampoco soy simpatizante de él) y mi opinión, era que Cobos sólo era un político mas.

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.

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…

Todo lo anterior se desprendió a lo que sucedió en el Senado. Hubieron algunos que defendieron sus intereses o los intereses de la “mayoría”. 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.

Aquí dejo un fragmento obtenido de crítica digital[criticadigital.com].

“Yo tengo que acompañar la institucionalidad. Mi corazón 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. (…) Yo creo que la presidenta de los argentinos me va a entender. No creo que nos sirva una ley que no soluciona este conflicto. La historia me juzgará no sé cómo. (…) No puedo acompañar. Y esto no significa que estoy traicionando a nadie. Estoy actuando en forma a mis convicciones. 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. Pido perdón si me equivoco. Mi voto no es positivo. Mi vito es en rechazo”

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.

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.

Enlaces simbólicos y scp

Wednesday, July 9th, 2008

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 unas 5 horas, dejo los cálculos, espero que estén bien :-P

  • 210 GB = 225485783040 Bytes
  • 225485783040 Bytes = 1803886264320 bits
  • 1803886264320 bits = 1803886 mbits
  • A 100 mbps -> 18038 segundos
  • 18038 segundos = 5 horas

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!

Tenía dos hipótesis:

  1. Tengo serios problemas con las matemáticas.
  2. Pasa algo raro con el comando scp.

Con respecto a la primera todavía tengo dudas :-D En cuanto a la segunda, pude comprobar que scp no entiende los links simbólicos. 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.

rsync

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.

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 “Videos”,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!

Todo esto pude haberlo aludido si hubiese sabido sobre el comando rsync, su uso es tan sencillo como scp.


# rsync -r -l -t -v -u /home/dante root@192.168.1.1:/mnt/disk015/dante

Las opciones que utilicé indican.

r
Recursive, recurre dentro de los directorios.
l
Links, al encontrarse con un link simbólico lo copia como tal.
t
Time, preserva los tiempos (de los archivos) al copiarlos.
v
Verbosity, incrementa la verbosidad en la salida del comando.
u
Updates, no copia archivos que estén actualizados en el receptor.

Además de estas opciones, se encuentran muchas más y muy útiles. Puedes consultar todas las opciones y ejemplos de uso en las páginas man de rsync[samba.org].

Excluyendo carpetas o archivos

Al realizar un backup de una carpeta como home es frecuente que se encuentren archivos o carpetas que no necesitan ser respaldadas, esto puede ser indicado a rsync con el parámetro exclude. Por ejemplo, supongamos que queramos excluir del respaldo la carpeta foo/ relativa /home/dante/:


# rsync -r -l -t -v -u --exclude 'foo' /home/dante root@192.168.1.1:/mnt/disk015/dante

Nota: el archivo o carpeta a excluir debe ir entre comillas simples.

Excluir más de un archivo o carpeta

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:


quux
quuux/tmp/*/*.pid
quuuux
baz

Guardamos el archivo como no_respaldar en /home/dante/ y se lo indicamos a rsync:


# rsync -r -l -t -v -u --exclude-from 'no_respaldar' /home/dante root@192.168.1.1:/mnt/disk015/dante

Problemas frecuentes

Al ejecutar el comando puede ser que obtengas la siguiente salida:


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]

Para solucionarlo basta instalar rsync también en la máquina remota.

Problemas de instalación con WP Super Cache

Monday, July 7th, 2008

Tuve varios problemas a la hora de poder realizar una instalación satisfactoria de este plugin para Wordpress. Por lo tanto, dejo un par de problemas y cómo resolverlos.

Antes que nada, debe tener habilitado los módulos mime y rewrite. Para consultar qué módulos tiene habilitado nuestro servidor Apache, podríamos usar el comando a2dismod. La función de este comando es para deshabilitar módulos, pero para deshabilitarlos nos pide que elijamos qué módulo deshabilitar y nos muestra una lista de los módulos habilitados, con lo cual nos sirve para consultar qué módulos hay habilitados. Por ejemplo.


# a2dismod
Your choices are: alias auth_basic authn_file authz_default authz_groupfile authz_host authz_user autoindex cgi dav deflate dir env mime negotiation php5 rewrite setenvif status
Which module(s) do you want to disable (wildcards ok)?

En este caso tengo habilitados dichos módulos, pero sino es su caso, bastará el siguiente comando.


# a2enmod rewrite mime
Enabling module rewrite.
Enabling module mime.
Run '/etc/init.d/apache2 restart' to activate new configuration!

Y para que los cambios tengan efecto, como nos indica la salida del comando, debemos reiniciar el servidor.

Mi principal problema con WP Super Cache, fue que al crear/editar .htaccess con las reglas que me indicaba el plugin y entrar al blog, el servidor me devolvía un error 403, forbidden. Básicamente ¡no tenía permisos para acceder al blog!


Forbidden

You don't have permission to access /wp-admin/options-general.php on this server.

Esto lo pude solucionar editando el archivo de configuración de los sitios virtuales en el servidor, estos archivos se deberían alojar en /etc/apache2/sites-available/. Fue necesario sólo agregar las siguientes opciones FollowSymLinks y SymLinksIfOwnerMatch. Dejo un fragmento de mi archivo para guiarlos.


NameVirtualHost *:8089

   ServerAdmin webmaster.infosofia@gmail.com
   ServerName infosofia.blogdns.com
   Options Indexes +FollowSymLinks MultiViews Includes +SymLinksIfOwnerMatch

…
FollowSymLinks
Permite que el servidor siga los enlaces simbólicos del directorio en donde fue definido.
SymLinksIfOwnerMatch
Permite que el servidor siga aquellos enlaces donde el objeto apuntado pertenezca al mismo usuario del enlace.

Nota: El signo + indica que se aplique esa opción a todos los directorios anidados al directorio en donde se efectuó la declaración.

Eso sería lo más importante, espero que le pueda servir a alguien.

Hello world!

Friday, July 4th, 2008

Welcome to WordPress. This is your first post. Edit or delete it, then start blogging!

Coloreado de sintaxis en MediaWiki

Thursday, July 3rd, 2008

Para lograr colorear la sintaxis de las fuentes que incluyamos en nuestras páginas en Mediawiki, existe una extensión que facilita enormemente esta tarea. La extensión se llama SyntaxHighlight GeSHi.

Instalación

La extensión se encuentra en un repositorio de Subversion, por lo tanto necesitaremos un cliente Subversion para obtenerla. En caso de que no tengan algún cliente instalado, en este post explico cómo instalarlo.

Luego hay que ir a la carpeta extension, la cual se encuentra dentro del directorio donde tengamos instalado el wiki. Podríamos suponer que se encuentra en /var/www/wiki/extension/.

Dentro de la carpeta extension, utilizaremos el cliente subversión para bajar la extensión. Ejecutando el siguiente comando:


# svn co http://svn.wikimedia.org/svnroot/mediawiki/trunk/extensions/SyntaxHighlight_GeSHi

Adicionalmente necesitaremos bajar actual de GeSHi, la cual también se encuentra disponible en un repositorio Subversion. La extensión sería recomendado bajarla dentro de la carpeta extension/SyntaxHighlight_GeSHi/.


# cd SyntaxHighlight_GeSHi
# svn co http://geshi.svn.sourceforge.net/svnroot/geshi/branches/RELEASE_1_0_X_STABLE/geshi-1.0.X/src/ geshi

Habilitar la extensión

Ahora indicaremos al wiki sobre la nueva extensión, para esto debemos editar el archivo LocalSettings.php, que se debería encontrar en la raíz del directorio del wiki (ej. /var/www/wiki/). La edición consiste en agregar estas dos líneas al final del archivo.


require_once("extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php");
require_once( '/var/www/wiki/extensions/SyntaxHighlight_GeSHi/geshi/geshi.php' );

Nota: En el caso del segundo require_once, es necesario que especifiquen la ruta en donde se localiza geshi. De acuerdo a este ejemplo, la ruta que especifico es correcta, pero no podría ser en su caso.

Verificación de la instalación

Para verificar que realmente tenemos la extensión funcionando, podemos revisar la página Especial:Version (deben ser administradores del wiki para poder ver ésta página), en donde debería describir (dentro de otras cosas) las extensiones instaladas. Pueden ver la imagen de como luciría la descripción de la extensión

Página Especial:Version

Uso

Hay que utilizar la etiqueta source y a través de la propiedad lang especificamos el tipo de fuente que vamos a escribir. Acá dejo un pequeño ejemplo como se vería un fragmento de XHTML.


<source lang="xml">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>XHTML 1.0 un ejemplo</title>
 </head>
 <body>
 <p>Esto es una muestra de la extensión<p>
 </body>
</html>
</source>

El código anterior se vería como la siguiente imagen.

Sintaxis coloreada por la extensión SyntaxHighlight GeSHi en MediaWiki

Los parámetros que se le pueden pasar a la etiqueta source son los siguientes:

lang
Define el lenguaje
line
Habilita la numeración de lineas en el código.
start
Número con que comenzará a numerar las líneas.
enclose
Coloreado especial para etiquetas que envuelven el código.
strict

En la tabla de abajo presento los valores que puede tomar la propiedad lang.

lang Lenguaje
abap ABAP
actionscript ActionScrip
ada Ada
apache Apache Log
applescript AppleScript
asm ASM
asp Active Server Pages (ASP)
autoit AutoIt
bash Bash
basic4gl Basic4GL
blitzbasic Blitz BASIC
bnf Backus-Naur Form
c C
c_mac C (Mac)
caddcl AutoCAD DCL
cadlisp AutoLISP
cfdg CFDG
cfm ColdFusion
cpp-qt C++ (Qt toolkit)
cpp C++
csharp C#
css Cascading Style Sheets (CSS)
d D
delphi Delphi
diff Diff
div DIV
dos DOS batch file
dot DOT
eiffel Eiffel
fortran Fortran
freebasic FreeBASIC
genero Genero
gml Game Maker Language (GML)
groovy Groovy
haskell Haskell
html4strict HTML
idl Uno IDL
ini INI
inno Inno
io Io
java Java
java5 Java(TM) 2 Platform Standard Edition 5.0
javascript JavaScript
latex LaTeX
lisp Lisp
lua Lua
m68k Motorola 68000 Assembler
matlab MATLAB M
mirc mIRC scripting language
mpasm Microchip Assembler
mysql MySQL
nsis Nullsoft Scriptable Install System (NSIS)
objc Objective-C
ocaml-brief OCaml
ocaml Ocaml
oobas OpenOffice.org Basic
oracle8 Oracle 8 SQL
pascal Pascal
per per
perl Perl
php-brief PHP
php PHP
plsql PL/SQL
python Python
qbasic QBasic/QuickBASIC
rails Rails
reg Windows Registry
robots robots.txt
ruby Ruby
sas SAS
scheme Scheme
sdlbasic SdlBasic
smalltalk Smaltalk
smarty Smarty
sql SQL
tcl Tcl
text Plain text
thinbasic thinBasic
tsql Transact-SQL
vb Visual Basic
vbnet Visual Basic .NET
vhdl VHDL
visualfoxpro Visual FoxPro
winbatch WinBatch
xml XML
xpp X++
z80 ZILOG >80 Assembler

Bibliografía

Instalación y configuración de un Wiki semántico

Tuesday, July 1st, 2008

Logotipo de semantic MediaWiki

Para darle semántica a nuestro wiki, sólo es necesario instalar la extensión Semantic MediaWiki, esta extensión es sólo para MediaWiki, por lo tanto necesitamos tener instalado un wiki con MediaWiki.

Introducción

Semantic MediaWiki (SMW), ayuda a la búsqueda, organización, evaluación y muestra de tags y también ayuda a compartir los contenidos del wiki. Esta extensión posibilita que los textos de nuestro wiki puedan ser interpretados por las máquinas y no sólo por personas, dando pie a la futura Web semántica.

Instalación

Para facilitar la instalación (y la explicación) será necesario tener instalado un cliente de subversión. En caso de no tener instalado el cliente, es necesario instalar el paquete subversion, en Debian o Ubuntu (u otros forks) aptitude install subversion.

Luego hay que ir a la carpeta extension, la cual se encuentra dentro del directorio donde tengamos instalado el wiki. Podriamos suponer que se encuentra en /var/www/wiki/extension/.

Dentro de la carpeta extension, utilizaremos el cliente subversión para bajar la extensión. Ejecutando el siguiente comando:


# svn checkout http://svn.wikimedia.org/svnroot/mediawiki/trunk/extensions/SemanticMediaWiki/

Habilitar la extensión

Una vez que se descargue el código, debemos indicar al wiki que habilite la extensión, para esto debemos ir editar el archivo LocalSettings.php, que se debería encontrar en la raíz del directorio del wiki (ej. /var/www/wiki/). La edición consiste en agregar estas dos líneas al final del archivo.


include_once('extensions/SemanticMediaWiki/includes/SMW_Settings.php');
enableSemantics('example.org');

Nota: Hay que reemplazar el string example.org, por su dirección http del wiki, por ejemplo versatil.org/wiki/ o por la dirección IP.

Actualización de la base de datos

Por último falta actualizar la base de datos. Esto se puede realizar a través de la página “Special:SMWAdmin” (ver imagen), por ejemplo http://versatil.org/wiki/index.php/Especial:SMWAdmin. Para poder tener acceso a está página tienen que estar logeados como un usuario administrador del wiki.

Página Special:SMWAdmin

Una vez en la página Special:SMWAdmin, deben presionar el botón que dice Initialise or upgrade tables. Si al presionarlo no apareció ningún error, significa que la actualización de la base de datos se ejecuto sin problemas.

Verificación de la instalación y configuración

Para verificar que realmente tenemos la extensión funcionando, podemos revisar la página Especial:Version, siguiendo con el ejemplo en http://versatil.org/wiki/index.php/Especial:Version. En esa página salen las extensiones instaladas en nuestro wiki, ahí debería estar la extensión Semantic MediaWiki (ver imagen).

Página Especial:Version

Palabras finales

Una vez instalada la extensión, pueden colaborar con el proyecto dándose de alta en un registro de wiki semánticos. Dicho registro es para recolectar datos que faciliten futuras implementaciones.

Bibliografía