Bueno, pues ha pasado otro año. La web de CRySoL (tal como la conocemos hoy) cumple 3 años ya. Se inauguró el 20 de octubre de 2005. Aunque como muchos sabéis había algo parecido a una web cutre desde unos años atrás.
Gracias al inestimable y considerable esfuerzo de lk2, que ha incluido portar parte de algunos módulos y arreglar algún que otro bug en otros, ya tenemos el site de CRySoL migrado a Drupal-6.3. Muchas horas de pruebas y más PHP del que nos gustaría aprender. Como siempre, si encontráis cualquier anomalía en el funcionamiento del portal, o alguna feature perdida, no dudéis en dejar un comentario en este mismo post.
Saludos
Con la reciente actualización del drupal de CRySoL hemos podido hacer el necesario upgrade a PHP5, y eso nos ha permitido instalar un módulo bastante decente para colorear listados de código con GeSHi.
Después de algunos problemillas, hemos migrado el portal a drupal-5.7. Lo sentimos por las molestias que esto te haya podido causar, pero era necesario porque nos habíamos quedado bastante obsoletos. Los problemillas de última hora eran:
Hemos migrado a Drupal 5.1, sin embargo, no todo el trabajo está hecho. Debemos actualizar distintos módulos y herramientas que utilizábamos en la versión 4.6 y adaptar el sitio al nuevo Drupal.
Disculpad por los distintos problemas y carencias que podais observar en estos momentos. En breve las subsanaremos y todo volverá a ser como antes (o mucho mejor).
¡Un saludo!
Ayer fue el aniversario de la inauguración oficial de la web de CRySoL. Sin duda algunos de los que la pusimos en marcha, con más ganas que esperanzas, no creíamos que fuera a ir tan bien.
Uno de los objetivos de CRySoL es la defensa de la libertad del software y otras manifestaciones culturales. Cualquier otra demostracción de defensa de libertades está literalmente fuera de lugar, deberá hacerse en otros foros dedicados a tales asuntos. Por favor: aquél que quiera escribir, que tenga en mente cuál es el objetivo de esta web.
Este comentario no va por la mayor parte de vosotros, ya que existimos desde hace menos de un año y no ha habido ningún altercado digno de mención. Sin embargo, hoy he tenido que "banear" dos artículos y un usuario por su contenido. No importa si me encuentro a favor; no importa si me encuentro en contra. Lo que importa es que dicho contenido no tiene cabida en esta web.
Por favor: Si alguien ve contenido fuera tono/tema, que avise a los administradores para su inmediata eliminación. Recordad que estamos utilizando los servicios de la Universidad, y necesitamos sus favores. No queremos que nos cierren el sitio por un único alborotador.
Muchas gracias.
-- MagMax, uno de los admin.
En primer lugar quiero decir que todos los administradores y editores agradecemos que cada vez más gente empiece a escribir recetas, que son la columna vertebral de este portal.
Bueno, pues parece que la nueva etapa de la web de CRySoL está yendo realmente bien. Desde el día 20 de octubre que pusimos el contador de "webstats4u" (o sea, menos de un mes) hemos recibido más de 10.000 visitas.
Este documento define las normas de estilo que se deben aplicar a las recetas de la web de CRySoL. Se describe la estructura, el formato y típografía a utilizar. Esta receta sigue las normas que en ella se definen y sirve además como introducción a los formatos de entrada necesarios para poder escribir recetas.
Esta receta explica una forma sencilla de hacer una copia de seguridad de una base de datos PostgreSQL completa para poderla restaurar en caso de catástrofe o mudanza.
sudo may be configured to stop requesting passwords for specific commands to specific users or groups. This is very convenient for personal computers where there is only a user (and therefore she’s the administrator).
With next file /etc/sudoers, the sudo group members will be allowed to run apt, apt-get and dpkg commands absolutelly with no password.
For other users, the sudo behaviour do not change.
Defaults env_reset, insults
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Defaults timestamp_timeout=15
Cmnd_Alias APT = /usr/bin/apt, /usr/bin/apt-get, /usr/bin/dpkg
%sudo ALL = ALL, NOPASSWD: APT
Option ‘timestamp_timeout’ sets the time (in minutes) that the password will remain in cache, so it will not ask for it during that period. The value 0 disables the cache.
This is a new try to start using tmux. I am absolutly convenced about advantages of tmux, but for some strange reason, I am not able to learn its key combos…
I hope this recipe should be a way to have the very basic functions always at a glance.
Panes
horizontal split
C-b %
vertical split
C-b "
move cursor
C-b {arrow}
close
C-b x
maximize/minimize
C-b z
Windows
create
C-b c
change
C-b {n}
Sessions
detach
C-b d
attach
tmux a
list
tmux ls
kill
tmux kill-session -t {n}
Config file
In your ~/.tmux.conf
set -g mouse on
setw -g monitor-activity on
set -g visual-activity on
Enlazo un tutorial del colega Magmax para montar un entorno básico ELK (ElasticSearch + logstash + Kibana) como sistema de monitorización. Probablemente el que llega más lejos con menos rollo, y con screencast y todo.
When vagrant create Virtualbox machines, disks are created with VMDK format. Therefore, the VDI format has some interesting advantages. This recipe shows a setup to create VDI disks instead VMDK.
Virtualbox can use actual partitios for its disks. This task may be simple using the virtual GUI, but in this case, we want automatize the process with Vagrant.
ZeroC provides their own (non-official) Ubuntu packages for the version 3.6. This recipe includes all steps for a successful installation on Debian jessie.
Have a local debian package mirror may be helpful when you frequently perform recurring instalations: virtual machines, continuous integration, isolated integration testing, docker containers and so on. apt-mirror is a program that can make a perfect mirror clon in a very easy way.
According to its manual page “schroot allows the user to run a command or a login shell in a chroot environment”. As many others (chroot, lxc, docker, vserver) it is a OS virtualizer. Often, these “chroot environments” are known as “jails”. A jail is much faster that a full virtualizer as vmware, virtualbox, etc.
In that recipe we explore a interesting feature: jail snapshoting
augeas is a command line generic tool to manage configuration text files. augeas comes with many “lenses”. The lenses are files that specify rules to read and write each kind of file. This is a very good to for scripting or automatic configuration management (like puppet does).
sudo lets a user run commands as she was a different user (usually root). The common configuration of sudo requests your password before run the command. As that is annoying, you may be tempted to write something like this in your /etc/sudoers:
When you have a dual head display one of them is the “primary monitor”. Usually, window manager put special panels or content in that monitor (gnome-shell).
To see which are your connected monitors (and their names) run:
$ xrandr | grep connected
DVI-I-0 disconnected (normal left inverted right x axis y axis)
VGA-0 disconnected (normal left inverted right x axis y axis)
DVI-I-1 connected primary 1920x1200+0+0 (normal left inverted right x axis y axis) 530mm x 300mm
HDMI-0 connected 1920x1200+1920+0 (normal left inverted right x axis y axis) 530mm x 300mm
In this case my primary monitor is DVI-I-1. To change to the other available monitor, run:
Puppet is a powerful software infrastructure manager. That is, a program that enable you to specify what is installed and running in each computer of your network.
Con los últimos cambios en Debian sid gnome-shell no arranca (bug #712919) por una dependencia incorrecta de pulseaudio. Al ejecutarlo vemos el siguiente error:
$ gnome-shell --replace
gnome-shell: error while loading shared libraries:
libpulsecommon-4.0.so: cannot open shared object file: No such file or directory
Para arreglarlo instala una versión anterior del paquete libpulse-mainloop-glib0. Con la versión que hay en jessie (2.0.6) funciona correctamente.
Pruebas de estilo de los distintos tipos de listados de la web. Se muestran etiquetas HTML, soporte de liquid con highlight y gist. Echa un vistado al fuente de este post.
Sometimes you need to test that some procedure is deterministic, that
is, it is done exactly the same way again and again (builder or
factory method patterns are examples of that). The production code does exactly the same invocations for the same
arguments. In these situations were are not checking the “right” behavior but just the invocation sequence does not change.
You may use a doublex Mock to test that. The first execution “trains” the
Mock, the second time verify the same behaviour.
Si tienes Debian sid y has actualizado hace poco probablemente pdflatex ha empezado a fallar:
$pdflatex main.tex
This is pdfTeX, Version 3.1415926-2.4-1.40.13 (TeX Live 2012/Debian)
kpathsea: Running mktexfmt pdflatex.fmt
I can't find the format file `pdflatex.fmt'!
Hay un bug abierto sobre esto: #709164
La solución según este hilo es instalar una versión antigua de libkpathsea6, por ejemplo:
This recipe explain how to build a grid composed by 6 debian virtual machines running IceGrid. Once the setup is done, the whole process may be executed with absolutelly no user interaction. The process takes advantage from libvirt (for virtual machine installation), debian preseds (for unattended installation) and puppet (for configuration management).
The resulting virtual grid is suitable to make tesing and continuous integration for distributed applications (using ZeroC IceGrid in this case).
Generando el .tgz de distribución de un paquete “sample” e instalándolo con pip. Esto puede servir para comprobar que un paquete Python se puede instalar y desinstalar correctamente.
El SDK de android (en concreto adb) requiere algunas librerías para i386. Si tienes una distribución de 64 bits necesitas instalar algunos paquetes adicionales que permiten usar dichas librerías. Simplemente ejecuta:
Algunos altavoces, auriculares u otras cosas, como el Belkin Music Receiver (belkin U15) no funcionan directamente con GNOME (al menos en Debian). La solución es simple, aunque no es fácil de encontrar. Basta con:
Desde que los indices de paquetes en los repositorios incluyen traducciones, las actualizaciones son aún más lentas. Esos ficheros pueden tener tamaños de varios megabytes. Pero como estas traducciones no son muy necesarias que digamos podemos configurar apt para indicarle qué traducciones queremos. Para eso, escribe un fichero /etc/apt/apt.conf.d/99Translations con el siguiente contenido:
Acquire::Languages "none";
Como podrás imaginar, esta configuración hace que apt no descargue ninguna traducción. Verás que un apt-get update, y sobre todo un aptitude update, es bastante más rápido.
Sometimes interaction among your SUT class and their collaborators does not meet a synchronous behavior. That may happen when the SUT perform collaborator invocations in a different thread, or when the invocation pass across a message queue, publish/subscribe service, etc.
Esto es una receta rápida para tener a mano lo comandos para usar pypi (a.k.a. cheeseshop) desde consola. Todo esto y mucho más está por supuesto en el CheeseShopTutorial.
Hace tiempo que quería afinar la configuración del modo tabbar de emacs para poder cambiar entre pestañas usando la típica combinación de teclas alt-<número> cual si fuera navegador o emulador de terminal. Como mis conocimientos de elisp son principalmente anecdóticos, traté de buscar algo parecido de lo que poder sacar factor común, pero nada… hasta ahora.
Tipo de servidor: IMAP
Nombre del servidor: imap.mail.uclm.es
Puerto: 993
Nombre de usuario: Pepito.Grillo
Seguridad de la conexión: SSL/TLS
Método de autenticación: Contraseña normal
Envío
Nombre del servidor: smtp.mail.uclm.es
Puerto: 587
Nombre de usuario: Pepito.Grillo
Método de autenticación: Contraseña normal
Seguridad de la conexión: STARTTLS
Una clase magistral de sistemas operativos modernos y cómo la estrategia comercial de la plataforma puede afectar de forma determinante al rendimiento e incluso a la experiencia de usuario. Me parece muy relevante y bien argumentado cómo un sistema abierto como Android (llamarlo «libre» me parece arriesgado) sufre de limitaciones técnicas precisamente por el hecho de ser portable y abierto.
En las conferencias de la XPWeek, Sebastián Hermida nos explicaba los nueve reglas o (pasos) de Jeff Bay para conseguir mejores diseños orientados a objetos y, en general, código más limpio. Al loro, porque algunas te pueden sorprender:
Si eres un administrador de una máquina debian/ubuntu con un poco de amor propio seguramente no harás configure/make/make install o al menos te lo pensarás dos veces.
Os dejo aquí un script que permite ejecutar comandos predefinidos en un conjunto de máquinas. En realidad es un fabfile, es decir, un script para ejecutar con fabric.
El script que aparece en esta receta lo estoy usando para instalar un mismo paquete (debian) en varios servidores a la vez (lo cual es un latazo hacer una por una). Así que los comandos que tiene definidos son los recurrentes update, install y remove de aptitude. Obviamente se puede utilizar para ejecutar cualquier comando imaginable.
Llevo unos días oyendo a todo tipo de periodistas, tertulianos y «opinadores» profesionales de todo tipo, color y condición hablar sobre el asunto de la detención de la cúpula de la SGAE. E independientemente de la intención que está detrás de su opinión: echar la culpa a determinado tipo de gente, profesión, partido, ministra o presidente, todos coinciden en un argumento que me provoca verdadero estupor:
Seguro que más de uno se ha dado cuenta de que con la llegada de GTK3 no han aparecido los habituales python-gtk3 y compañía. Esto se debe a que ahora se utiliza un sistema de introspección de objetos que proporciona GObject (para que luego digan que no se puede hacer OO en C). Con este sistema se pueden crear «bindings al vuelo» de cualquier librería hecha con GObject con el consiguiente ahorro que implica no tener que hacer y mantener bindings. El sistema de introspección si que necesita bindings claro (PyGI), pero están integrados en python-gobject.
Quizá haya por aquí alguien que quiera escribir su PFC en LaTeX, pero sin liarse demasiado. Si es tu caso, instala la última versión del paquete arco-pfc incluye la clase LaTeX del mismo nombre (es decir, se usa directamente con \documentclass{arco-pfc}). Esta clase sigue el formato específico de la ESI de Ciudad Real, pero es fácil cambiarlo si estudias en otra parte.
En esta receta voy a contar cómo utilizar los «descriptores» de Python para poder crear atributos (variables de instancia) que no puedan cambiar de tipo durante la vida del objeto. Por supuesto, también es una excusa para aprender algo sobre los descriptores en sí.
This recipe shows how to setup a basic synchronization mechanism (similar to DropBox) by means of conventional GNU/Linux tools. This does not require root privileges and no packages (except ssh-server) need to be installed in the server.
Si utilizas Emacs y tienes varios PCs ¿cómo te apañas para que todos se comporten igual? Las mismas fuentes, los mismos colores, las mismas combinaciones de teclas… Realmente todo eso no es un gran problema; basta con tener tu ficherito .emacs en un repositorio personal para que todos los PCs tengan la misma configuración.
Pero ¿y los modulitos (los ficheros .el) que bajas de cualquier parte? Unos los bajas de un blog de alguien, otros de EmacsWiki, etc. etc. No es plan de subirlos también a tu repositorio de configuración, y además, aparecen nuevas versiones, sería un trabajo de chinos tenerlos actualizados. Hasta ahora yo había tomado la determinación de no utilizar ningún módulo de Emacs que no estuviera convenientemente empaquetado para Debian. Hasta ahora…
Donald Knuth, autor de «The art of computing programing» y creador de TeX es uno de los auténticos padres de las ciencias de la computación. Me temo que mucho menos conocido de lo que se merece.
Un Kōan es, en la tradición Zen, una especie de acertijo que el maestro propone a su discípulo para averiguar en qué punto se encuentra en su camino hacia la iluminación. Se trata de un problema cuya solución no puede ser encontrada a través de la razón, si no a través de la intuición…
Ya, ya, esto suena demasiado raro incluso para CRySoL.
Una de las cosas que más chocan al empezar a utilizar un lenguaje dinámico (Python, Ruby, Lua, etc.) es que las variables no se declaran o definen con un tipo concreto. Eso normalmente no es un problema y de hecho resulta bastante cómodo. Pero cuando un programa adquiere cierta envergadura empiezan a surgir problemas.
Poder forzar la interfaz de un método, sobre todo de un constructor es más que conveniente. Permite detectar muchos usos inadecuados cuando el usuario de una clase y su programador son personas distintas (o uno mismo si ha pasado demasiado tiempo). Esto es básico para cosas como el Diseño por contrato y otras metodologías en las que es imprescindible tener comprobación estricta de tipos.
La Escuela Superior de Informática en colaboración con Insula Barataria y CRySoL organizan un curso de introducción al Software Libre y GNU/Linux a partir de este mismo viernes 26 de noviembre.
El curso lo impartirán profesores de la ESI vinculados a los grupos de investigación Arco y Oreto. Son profesionales comprometidos con el uso y desarrollo de Software Libre y su difusión. Se trata de un curso muy orientado a la comunidad, que incide en las cuestiones sociales y filosóficas pero también en las importantes ventajas prácticas y tecnológicas del Software Libre.
Los ingresos de la matrícula de los alumnos se utilizarán para comprar material para los propios alumnos y en donaciones a la Free Software Fundation y otras entidades que promueven el software libre.
Me entero por Fernando Rincón en http://www.technologyreview.com/web/26678/ de PageSpeed, un proyecto bastante interesante de la mano de los chicos de Google. Se trata de un mod para Apache que implementa mejoras para optimizar la velocidad del servidor web.
Si lo pruebas en tu servidor, coméntanos tus impresiones.
La nueva versión del paquete arco-devel (la 0.46-1) incluye una configuración básica para el modo speedbar de emacs. Para usarla, simplemente añade lo siguiente a tu .emacs:
En las últimas versiones los chicos de GNOME han decidido que eliminar los iconos de menús y botones mejora la usabilidad. Si no estás de acuerdo, ésta es tu receta.
Aquí os pongo una lista de libros, documentos y enlaces para meterse en el mundo de los métodos ágiles y en especial en el TDD. La iremos completando. Deja tu comentario si quieres aportar alguno que conozcas.
Me entero por una noticia de barrapunto de un artículo bastante interesante que explica en detalle porqué Python es una buena opción para enseñar programación a novatos.
Después de unas cuantas décadas desde la «crisis del software», las cosas no han mejorado demasiado en las ciencias de la computación. El desarrollo de programas de computadora dista mucho de parecerse al proceso de fabricación típico de cualquier otra ingeniería; razón ésta por la que muchos consideran, no sin falta de razón, que el prefijo «ingeniería» le viene grande a la informática.
El principio KISS es uno de los principios de programación y diseño más conocidos y a la vez más difíciles de seguir. Como supongo que sabéis, KISS dice que «el objetivo principal de todo diseño debe ser la simplicidad».
Esta receta explica cómo incorporar a tus programas la posibilidad de realizar acciones cuando se crean, borran, cambian, etc. ficheros o directorios concretos.
El «centro de cálculo» del proyecto Manhattan (probablemente el primero de la historia) era una sala con un montón de grandes máquinas de IBM. Pero no eran computadores (hablamos del año 1944), eran máquinas completamente mecánicas y procesaban bloques de tarjetas perforadas.
Cómo cambiar rápida y cómodamente entre el fichero de implementación (.c, .cc, .cpp) y el de cabecera (.h, hpp) cuando se trabaja con un proyecto C o C++ (por lo visto también funciona con Ada y VHDL).
El tema es sencillo (o lo parece). Cuando utilizamos un contenedor de la STL (vector por ejemplo) ¿qué pasa con el contenido cuando se destruye el contenedor?
REST es el acrónimo de REpresentational State Transfer. Dicen que es un «estilo arquitectural». Seguramente te has quedado como yo, pero es que no es fácil encontrar material para entender realmente de qué va esto. Aquí os dejo algunos enlaces:
Esta receta es un compendio de pequeños trucos y utilidades para manipular ficheros PostScript con los programas libres habituales en un sistema GNU
En realidad pienso ir apuntando aquí las soluciones que voy encontrando a problemas que me surgen cuando tengo que hacer ciertas «operaciones imprevistas» con ficheros PS. Se admiten sugerencias para ir incorporando a la receta.
Convertir un documento a formato de varias páginas por hoja
Virtualbox permite crear un fichero .vmdk especial que «apunta» a una partición real de un disco duro. De ese modo es posible arrancar un sistema operativo instalado realmente en la máquina pero virtualizado dentro de otro S.O. El comando para lograrlo es:
Cómo interconectar dos redes inaccesibles entre sí ya sea porque ambas están detrás de NAT o por consecuencias de las nuevas e incomprensibles «políticas de seguridad» de la empresa.
GMX es una empresa alemana que ofrece servicio de correo (web, POP e IMAP), jabber y WebDAV de forma gratuita y de gran calidad. No está de más tener una alternativa en un mundo cada vez más dominado por Google.
Pues estaba buscando en CRySoL un enlace que yo mismo puse a una magnifica colección de Citas de Dijkstra. Pero claro, parece ser que todo lo que no esté en CRySoL resulta ser efímero y acaba por desaparecer.
¿Puede la industria del software comercial ofrecer una verdadera calidad en sus productos igual que la NASA o la ESA exige a sus proveedores? ¿Será éste el nacimiento de una auténtica ingeniería informática?
Hace no mucho me enteré por Paco de que el escudo/emblema/anagrama que usamos habitualmente y que usan muchas de las escuelas de informática de España está mal, principalmente porque tiene una rama de trigo y debería ser de olivo. A ver qué hago ahora con el pin tan chulo que me dieron cuando acabé… Se utiliza en documentos oficiales como la guía docente de la ESI (que por cierto el que aparece ahí es obra de Paco Moya y en el documento no se le da crédito por ello).
Permite asignar combinaciones de teclas personalizadas a cualquier opción de un menú solo con pulsarla mientras está seleccionado. Siempre me pareció una gran feature.
Esta receta incluye unas simples pautas para decidir qué referencias son adecuadas a la hora de elaborar cualquier documento técnico. En particular voy a hablar de referencias a documentos electrónicos aunque mucho de lo que digo creo que podría aplicarse también a libros y artículos científicos. Siento que los ejemplos que voy a poner sean tan mono-temáticos pero obviamente no me atrevo a hablar de buenas o malas referencias en campos que no conozco.
Parece que hay algunos problemillas legales en eso de que el gobierno intervenga las comunicaciones de los ciudadanos. A ver si aprenden de España; aquí si aparecen problemas legales para aplicar medidas antipopulares (es decir, en contra del pueblo) pues se cambia la ley, vaya problema!
El fit-PC es un computador basado en el chip Geode con un tamaño realmente pequeño (12×12×4 cm) pero con características muy interesantes. Esta receta explica como instalar Debian para sacarle el máximo rendimiento al pequeño de la casa.
La receta describe cómo preparar un servidor DHCP para instalar Debian (por PXE o Etherboot) en otras máquinas de la misma red (“netboot” lo llaman). Esto es especialmente útil cuando el PC en el que quieres instalar Debian no tiene lector de CD-ROM, como pasa en los netbooks (EeePC, Aspire One, etc) y otras cosas más “raras” como el fit-PC. Si lo pruebas verás que es más sencillo, cómodo y rápido que recurrir al arranque por USB.
Ya lo avisé, la manía (rozando la esquizofrenia) de llamar “Linux” a todo lo que pillas porque “es un nombre muy chulo” acabará siendo el fin del mejor y más importante invento del ser humano: el lenguaje. Cuando todo se llame “Linux” y sea imposible entendernos, la humanidad estará condenada a su propia extinción…
Barrapunto: " La fundación Linux presenta el concurso ‘Soy Linux’ ":http://softlibre.barrapunto.com/articles/09/01/16/1454211.shtml
Esta receta es una lista de programas de análisis de tráfico de red que están disponibles como paquetes Debian oficiales y que pueden resultar muy útiles
Voy a ir publicando como posts partes sueltas -pero con significado autónomo- de los libros Pensar en C++ I y II. La idea es darle un poco de visibilidad al proyecto, y de paso si alguien encuentra algún error o hace algún comentario puede ayudar a la revisión.
He encontrado casi por casualidad la página web de Javier Bezos (el maintainer de babel y algunos paquetes más) y me parecido muy interesante una página en la que explica las decisiones en spanish para babel que han tomado. Muy curiosa la explicación de la controversia tabla/cuadro que sé que preocupa a algunos miembros de CRySoL :-)
Decía Einstein que «hay dos cosas infinitas: el universo y la estupidez humana…». Yo añadiría unas cuantas más: la inmoralidad, la codicia y la ausencia de escrúpulos de la industria del copyright. ¿Hasta dónde serán capaces de llegar? Manipular niños: HECHO. siguiente?…
Por si necesitabas algún motivo más para sentir vergüenza de ser español
El título de este post es el slogan de la campaña Si eres legal, eres legal del Ministerio de Cultura, pero perfectamente podría ser el de cualquier ciudadano que quiera preservar su derecho a acceder libremente a la cultura. Porque mentir a la población diciendo que la ley dice cosas que no dice no debe ser muy legal, no? Al menos parece bastante inmoral.
Cómo instalar nuestra querida Debian en el Acer Aspire ONE. Sé que hay varias buenas recetas sobre lo mismo, pero son efímeras y al final nos quedamos sin receta. CRySoL perdura.
Supongo que sabréis que el Ministerio de Cultura y estamentos privados tan reputados como la SGAE, la industria de los contenidos y las empresas de comunicaciones están preparando un proyecto para acabar con el P2P en España (la semana que viene) y parece que la propuesta va a ser el sistema francés de tres amenazas avisos.
Con todo esto de las atribuciones, las competencias, los títulos, las huelgas, la mala información y la pura y llana desinformación (incluso intencionada) es un auténtico reto enterarse de qué va todo esto y hacia dónde va (si es que va) nuestra amada/odiada, al 50%, carrera de Informática.
Esta receta es una pequeña introducción al soporte de Python para diseño orientado a objetos. Para programadores noveles, se aconseja primero la lectura de nuestra ya veterana receta Mini tutorial de Python.
Los nuevos tiempos del ECTS y el espacio europeo traen nuevos “aires” a la vida universitaria. Esta nueva metodología docente aboga por la evaluación continua y el control del progreso del alumno a lo largo del curso. Eso ya se estilaba en mi cole cuando hice la EGB, tampoco es que sea nada innovador.
Pues nada, se trata de escribir un programilla en el lenguaje que quieras, que tome por línea de comandos un número de cualquier tamaño (menor que un googolplex) y lo represente como en el siguiente ejemplo:
logging es un módulo de la librería estándar de Python para “imprimir” mensajes de log. En esta receta se explica cómo conseguir que cada tipo de mensaje aparezca en consola con un color diferente.
La Forma Canónica Ortodoxa u Orthodox Canonical Form (OCF) es un modismo muy utilizado en C++ y definido por James Coplien en su libro Advanced C++: Programming Styles and Idioms. Este modismo permite que un tipo(clase) definido por el programador se comporte como un «tipo concreto de dato», es decir, tenga las mismas características que un tipo proporcionado por el lenguaje.
Aunque ha salido en todos los medios (excepto A3 y algún despistado más) yo no podía dejar pasar la oportunidad de celebrar el 25º cumpleaños del proyecto GNU, precursor y todavía principal motor del software libre (y por muchos años), a pesar del empeño que muchos ponen en negarlo.
Felicidades también a todos los que usan el sistema operativo GNU (aunque no lo sepan)
Hace tan solo unos días, Phil (el autor de scapy) anunciaba en la lista de correo una nueva (y muy remodelada versión de scapy): la 2.0.0.0. Y como es menester, ya está empaquetada para Debian y disponible en los repos oficiales de Debian con el nombre python-scapy.
Más de una vez (y de dos) he oído hablar sobre extrañas normas no escritas (o eso espero) sobre «buenas prácticas» de programación. De entre todas ellas, me permito destacar:
El break solo se puede usar en los switch (en cada case).
Usar el continue es un pecado capital, al infierno de cabeza.
El return solo puede ir en la última línea de una función o método, y únicamente para retornar algo. De lo contrario sufrirás indecible tormento.
Y la clásica: Usar el goto está penado con sufrimiento eterno.
Con esta paradoja se puede resumir la situación de la seguridad informática últimamente. Empezamos con la clave privada predecible de SSL en Debian (y Ubuntu y derivados, que son muchos), seguramente la cagada más grande en materia de seguridad de su historia.
Como supongo que sabéis, los pobres desgraciados que osan utilizar "continue" van al infierno y arden como teas por toda la eternidad. El castigo por usar "goto" no es muy distinto:
Interesante artículo sobre errores de programación que cometemos todos. Está especialmente orientado a programación orientada a objetos (valga la rebuznancia).
Mercurial es otro sistema de control de versiones distribuido (otro más) que no tiene nada (o poco) que envidiar a git (en lo referente a prestaciones) pero casi tan fácil de usar como subversion. Esta recetilla incluye unas nociones de su uso básico y algunas buenas referencias.
X-Wrt (a.k.a Webif2) es una interfaz web que facilita la administración y configuración de La Fonera y otros routers que usen OpeWrt. Webif2 está disponible como paquete ipkg, así que su instalación resulta tremendamente simple.
Esta receta es un resumen quick & dirty de los pasos necesarios para instalar un sistema OpenWRT estándar en La Fonera. Básicamente es una traducción simplificada de las dos recetas que aparecen en las referencias.
Esta receta explica cómo añadir de una forma muy fácil títulos a tu colección (gestionada con GCStar) mediante un scriptillo hecho en Python + amara. (menudo combo! :-))
El objetivo es borrar ficheros, directorios o incluso particiones de modo que sea imposible recuperar los ficheros originales. Eso se consigue a base de escribir datos aleatorios y normalmente ceros después. La utilidad de esto es, obviamente, que ningún listillo pueda recuperar datos sensibles de tu disco duro, disco externo, etc.
Se trata de un frontend para bittorrent y wget escrito en PHP. torrentflux-b4rt es un fork de torrentflux más flexible, ligero y potente que el original. En esta receta se explica cómo instalarlo sobre lighttpd y sqlite.
Desde el pasado día 8 de febrero, y con la inestimable ayuda de nuestro developer local (Paco Moya), amara ya es paquete Debian oficial. Amara es un toolkit sencillísimo para tratamiento de XML, con soporte de DOM, SAX, XPath, etc y todo de una manera muy “pythonica”. Nunca fue tan fácil tratar documentos XML.
Un “router chupachups” (más conocido como router on a stick) es una máquina que ruta tráfico entre dos o más redes que coexisten en la misma red física. Eso se consigue normalmente por medio de VLANes (aunque éste no es el caso). Es decir, es un router con una única interfaz de red.
Un par de lecturas muy interesantes (tanto para alumnos como para profesores) sobre los estudios en Computer Science. Es la opinión contrastada de dos profesores de la Universidad de Nueva York acerca del gran daño que hacen los nuevos planes de estudios a los titulados de hoy en día. Quizá lo más chocante (aunque no para todos) de sus conclusiones es el daño que, según ellos, causa Java como lenguaje para enseñar programación.
Incluye frases tan demoledoras como:
In short, today’s Java library cobbler is tomorrow’s pizza delivery man.
GNOMEVFS es una librería para realizar todo tipo de operaciones sobre ficheros independientemente del método de acceso necesario para llegar a ellos (FTP, HTTP, WebDAV, SMB, etc). Esta receta muestra ejemplos de lo sencilla y potente que puede llegar a ser esta pequeña maravilla.
Serie de 3 libros electrónicos sobre programación. El propio autor explica:
How do you build skills in programming? By doing a series of programming exercises that are focused on showing language features one at a time. These books build skills without asking you to assimilate too many technical concepts in a single sitting.
Esta receta incluye únicamente una clasificación de patrones a modo de catálogo y una pequeña descripción de cada uno. Desde aquí enlazaré las recetas específicas para cada patrón.
El título de este post es una frase acuñada por David Bravo y de la que cada día vemos más ejemplos. Hoy, otra prueba de que la libertad de expresión es un espejismo.
Desde hace ya algunos meses, nuestro teclado no es el que era. Me refiero a la forma de escribir el carácter virgulilla (también llamado ‘tilde’). ¿Qué ha pasado?
La nueva versión del paquete de scapy ya está en los repositorios de Debian. No es una nueva release, pero corrige un bug bastante tonto aunque importante que impedía utilizar scapy como módulo.
Por si alguien quiere probarlo, os comento que he puesto en el repo de GNESIS una utilidad a la que hace mucho que le tenía ganas. Es un applet para GNOME que indica en pantalla el nombre del escritorio actual (workspace en la jerga gnomera).
Una colección de recetas, tutoriales y enlaces sobre cómo hacer y mantener paquetes Debian. La iré completando con el tiempo. Si encuentras algún otro enlace interesante, por favor, deja un comentario.
Pues eso, enlazo unas cuantas frases atribuidas a Edsger Dijkstra, un gran científico y una de las mentes más sobresalientes de la Ciencia de la Computación.
Llevo un par de tardes mirando qué alternativas hay en GNOME para pintar texto en pantalla, es decir OSD, y he pensado ponerlo aquí en plan receta por si a alguien le resulta de utilidad y sobre todo para tenerlo a mano cuando me haga falta.
Esta receta explica cómo instalar y configurar dicho SAI en un sistema Debian GNU/Linux o derivado para sacarle el máximo partido. Te recomiendo que leas al menos la introducción de Configuración y disfrute de un SAI para que tengas una idea de lo que se puede hacer y lo que necesitas, ya que no lo voy a repetir aquí.
Esta receta incluye la implementación “comentada” de una metaclase Python para conseguir que el constructor de la superclase se invoque automáticamente.
Esta receta es una pequeña introducción a la meta-programación, concretamente voy a contar algunas cosillas sobre uno de los mecanismos más populares y potentes: las metaclases.
Esta receta trata algunas prestaciones interesantes que ofrece el driver intel (para tarjetas nuevas) por medio de la utilidad xrandr. Lo realmente interesante es que puedes activar y desactivar la salida externa y cambiar la resolución de ambos monitores sin tener que reiniciar el servidor X.
Como ya sabrás, los discos duros no son perfectos, y cuando hacen “crash!” no hay mucho que se pueda hacer. ¿o sí? Esta receta explica cómo recuperar datos de un disco duro durante su agonía, o intentarlo al menos.
Si usas con frecuencia ssh, habrás notado que muchas veces tarda muchísimo en conectar incluso aunque utilices autenticación por clave pública. Estos son algunos ajustes de configuración que pueden hacer que la conexión sea mucho más rápida.
Acelerando el login
DNS
Si la máquina a la que quieres conectar tiene IP fija, puedes utilizar tu fichero de configuración de ssh para indicar la IP y así te ahorras resolver la dirección de la máquina cada vez que conectes. Para eso, escribes en ~/.ssh/config:
Host example.com
Hostname 208.77.188.166
User Gil.Puertas
Otra cosa que hace SSH y que puede influir mucho en la duración del «login» es la opción «UseDNS». Según dice el manual:
UseDNS specifies whether sshd should look up the remote host name and check that the resolved host name for the remote IP address maps back to the very same IP address. The default is “yes”.
Y claro, si trata de hacer la resolución inversa de una IP de una conexión ADSL puede tardar bastante (suponiendo que pueda). De modo que una buena forma de ahorrar unos valiosos segundos es poner lo siguiente en el /etc/ssh/ssd_config:
UseDNS no
Recuerda que ésta es una cuestión de seguridad que estás decidiendo no usar. La seguridad tiene un coste, pero no tenerla también, tú decides.
GSSAPI
GSSAPI es un API genérico normalizado para usar mecanismos de seguridad como Kerberos o SASL. Por defecto, al menos en Debian, ssh viene configurado para utilizar autenticación GSSAPI. Si no sabías lo que era, lo más probable es que no lo necesites. Así que lo puedes desactivar comentando la línea correspondiente en /etc/ssh/ssh_config:
# GSSAPIAuthentication yes
Esto supone una diferencia considerable en el tiempo de acceso. En una prueba ejecutando un simple “ssh example ls” en una máquina de la misma LAN, el tiempo necesario pasa de 15.2 a 0.1 segundos.
ControlMaster
Si sueles abrir varias sesiones (login, repos, sftp, etc) hacia el mismo servidor, SSH permite reutilizar una conexión establecida para sesiones adicionales. Eso supone un ahorro de tiempo considerable ya que no necesita establecer una nueva conexión. Para ello, simplemente escribe esto en un ~/.ssh/config
Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
Acelerando la transferencia
Si utilizas SCP o SFTP para copiar ficheros también hay algunas cosas que puedes hacer para mejorar la velocidad.
Compresión
SSH permite comprimir el flujo de datos, que muchas veces viene desactivado por defecto. Tienes que activarlo tanto en el servidor como en el cliente. Para el servidor edita /etc/ssh/sshd_config y añade una línea tal que:
Compression delayed
Es la opción por defecto si no se especifica. Para el cliente puedes activarlo para todo el mundo editando el /etc/ssh/ssh_config:
Compression yes
O que sólo los usuarios que lo deseen escriban esa línea en su ~/.ssh/config.
Comentarios
Si conoces otras formas de mejorar el rendimiento de SSH, por favor, deja un comentario.
Los responsables de la oficina electoral “nuevos tiempos” nos han invitado a dar una charla sobre software libre. Ellos lo han llamado “conferencia” aunque mi idea es que sea mucho menos formal y mucho más participativo que una “conferencia”, pero vale, intentaremos que lo parezca.
El próximo jueves a las 11:30 será el acto de presentación del cub.net de Ciudad Real en la ESI. No os lo perdáis, seguro que ofrece muchas y fascinantes oportunidades para todos.
Esto es tan chorra que casi me da pena ponerlo, pero bueno, igual a alguien le sirve. Pues eso, se trata de un “script” (una línea de shell) para general un fichero .m3u a partir de los ficheros .mp3 que haya en un directorio, o sea:
Esta receta explica cómo usar las utilidades de comprobación de ortografía «mientras escribe» que trae GNU Emacs en su distribución oficial. Por mucho que insistas, no tienes excusa para escribir mal.
Microsoft nos sorprende una vez más con su innovadora tecnología. En esta ocasión se trata de ReadyBoost. Al parecer se trata de una “feature” que permite al sistema optimizar el acceso a disco usando dispositivos Flash. Aunque he leído que la idea es utilizar ese espacio del pendrive como memoria virtual me resisto a pensar que en verdad sea así.
Recientemente hemos instalado en nuestro drupal el módulo “taxonomy_images”, que permite poner una imagen alusiva a cada término de las taxonomías. En principio sólo vamos a asociar imágenes a los “tipos de nodo”, que son:
¿Estás harto de que las solapas de Iceweasel(Firefox) se cierren cada vez que intentas cortar un trozo de texto pulsando “C-w”? Si te pasa eso es porque eres un honorable usuario de emacs y la extensión Firemacs es la solución a tus problemas.
La que más echaba de menos era el “C-s” y buscar el siguiente con otro “C-s”, qué alivio!
Esto debe tener más años que el sol, pero yo lo vi el otro día. Se trata de material docente de la Stanford CS Education Librar sobre los punteros y la gestión de memoria. Destacan, por lo raro, los vídeos de Binky Pointer Fun Video en los que Binky (un muñeco de plastilina) explica cómo funcionan los punteros en distintos lenguajes: C, C++, Ada, Java, etc. Los punteros nunca fueron tan fáciles.
Saludos
Cómo configurar Apache2 para disponer de un directorio WebDAV, accesible para lectura/escritura desde GNOMEVFS, konqueror, cadaver o como una “web folder” desde el “sistema operativo más rentable de todos los tiempos”.
Esta receta en realidad es una traducción de un artículo de Rob Klein titulado Packet Wizardry: Ruling the Network with Python usando la magnífica herramienta scapy. Igual es un poco largo para receta, pero bueno, no tiene desperdicio.
A través del blog de David Bravo he sabido de un artítulo de El País, que describe de un modo bastante acertado cómo es el mundo en la ‘era de Internet’ (al menos eso me parece a mi).
Se trata de usar subversion para controlar los cambios en un directorio, normalmente ficheros de configuración, para que si metes la pata, puedes saber qué demonios has cambiado.
Cómo usar el servidor subversion para ejecutar automáticamente programas personalizados. Como ejemplo, la receta explica cómo actualizar una página web mantenida en un repositorio.
Esta receta es un “remake” de la que hizo Nacho (con su permiso) sobre el mismo tema. Sólo tiene algunos añadidos y alguna pequeña corrección.
Ingredientes
Módem ADSL Contrend CT-350 USB de Telefónica “el azulito”.
Debian GNU/Linux
Linux >= 2.6.10
subversion
unp
br2684ctl
ppp
pppoe
Módulos
Descarga los fuentes con subversion:
$svn co svn://svn.gna.org/svn/ueagleatm/trunk/ueagle-atm
A ueagle-atm/usbatm.h
A ueagle-atm/ueagle-atm.c
A ueagle-atm/COPYING
A ueagle-atm/usbatm.c
A ueagle-atm/Makefile
Revisión obtenida: 323
Puedes echar un vistazo a /var/log/syslog para comprobar que todo ha ido bien. Debe aparecer algo como:
[ueagle-atm] driver ueagle 1.3 loaded
usb 2-2: [ueagle-atm] ADSL device founded vid (0X1110) pid (0X9021) : Eagle II
usb 2-2: reset full speed USB device using uhci_hcd and address 3
usb 2-2: [ueagle-atm] using iso mode
usb 2-2: [ueagle-atm] (re)booting started
usbcore: registered new driver ueagle-atm
usb 2-2: [ueagle-atm] modem operational
usb 2-2: [ueagle-atm] ATU-R firmware version : 44e2ea17
Bridge RFC-2684
El programa br2684 es un puente para transportar diferentes protocolos sobre una conexión ATM, que es lo que suelen hacer los proveedores de ADSL. Para arrancarlo, ejetucta:
# br2684ctl -c 0 -b -a 8.32
br2684ctl[2508]: Interface "nas0" created sucessfully
br2684ctl[2508]: Communicating over ATM 0.8.32, encapsulation: LLC
br2684ctl[2508]: Interface configured
El 8.32 son el VPI y el VCI de tu ISP. Estos corresponden a Telefónica con IP dinámica. Si tienes otra cosa, tendrás que usar los adecuados.
Usuario/contraseña
Tienes que añadir el nombre de usuario y contraseña al final del fichero /etc/ppp/pap-secrets. Si tienes la ADSL de Telefónica, la línea es:
adslppp@telefonicanetpa * adslppp
Proveedor
También para Telefónica ADSL, escribe un fichero /etc/ppp/peers/adsl:
user "adslppp@telefonicanetpa"
mtu 1412 # IMPORTANTE: imprescindible si vas a compartir la conexión, en caso contrario puedes quitarlo
plugin rp-pppoe.so
nas0
noipdefault
usepeerdns
defaultroute
persist
noauth
Para levantar la interfaz
Y si todo ha ido bien, al ejecutar lo siguiente deberías tener una conexión perfectamente funcional:
# ifconfig nas0 up
# pon adsl
Y para desactivar la conexión
# poff
# killall br2684ctl
Automatizar la conexión:
Añade la siguiente sección al fichero /etc/network/interfaces:
auto ppp0
iface ppp0 inet ppp
pre-up br2684ctl -c 0 -b -a 8.32
pre-up ifconfig nas0 up
provider adsl
Seguro que más de una vez, y de 20, se os ha colgado el firefox (a.k.a iceweasel), lo matas (o se muere solo) y a veces al volverlo a ejecutar sale un mensajito como este:
Cuesta mucho hacer entender a un neófito “de Linux” cuáles son los motivos por los que vale la pena sufrir el software libre. Lo habitual hace un par de años era que sólo los que estaban dispuestos a currárselo se acercaran a este mundillo. Pero todo eso ha cambiado, gracias a (o por culpa de) cosas como Ubuntu o Beryl, una nueva horda ávida de nuevas experiencias (o cansada de las experiencias de su Windows) se lanza de cabeza a probar la última y supermolona live de Ubuntu. ¡La informática chachi (y gratis) ha llegado! pero no borres todavía el XP, que el “Dead or Alive” no tira en Ubuntu.
Cómo usar y aprovechar el soporte de Unicode que Python trae de serie. Si no tienes muy claro de que va esto del Unicode, te recomiendo leer primero la receta Unicode y UTF-8.
Esta receta recoge algunas herramientas que pueden resultar interesantes para trabajar con las cabeceras EXIF de los JPEG. Si lo que buscas es modificar la imagen propiamente dicha, mira la receta titulada Edición de imágenes en consola, con ImageMagick.
Esta receta explica los usos más habituales de iptables. No trata de ser un manual de uso, sólo son unos cuantos comandos que solucionan problemas frecuentes.
Esta receta recoge algunas posibilidades interesantes del programa a2ps. Por cierto, el título es sólo un juego de palabras, no abuses de la impresora que quedan pocos árboles y la tinta está muy cara ;-)
El principal objetivo de este concurso es estimular a los estudiantes universitarios para que se involucren en la participación y creación de proyectos SL. De esta forma se crearán las condiciones idóneas para generar un tejido tecnológico de futuros profesionales que serán capaces de dar soporte de soluciones basadas en SL a empresas y a la administración.
Según parece, el próximo curso se entregará una copia de GNESIS 2.0, en su versión DVD Live, a todos los alumnos en el momento de formalizar su matrícula. El DVD incluye el software necesario para las prácticas de muchas de las asignaturas, además de la Guía Docente del centro. Hablamos de qué es GNESIS no hace tanto.
GNU Emacs puede ser un excelente editor (como no?) también para SGML, XML, o derivados tan populares com XHTML o DocBook. Esta receta concretamente introduce el uso del paquete psgml, aunque hay otros.
La etiqueta de este nodo es “historia” aunque creo que le iría mejor otra como “scifi”. Nada que comentar del tema, podéis verlo y oirlo vosotros mismos… espeluznante…
Me ha llamado la atención esta guía de malas prácticas. Es curioso hasta qué punto muchos de nosotros seguimos o hemos seguido alguna vez estos consejos… ¿tú no? ¿seguro?
Esta receta recoge algunas features interesantes del frontend de consola de gphoto2
Introducción
gphoto2 es una librería que soporta un montón de modelos de cámaras fotográficas digitales. Además dispone de un pequeño frontend que permite usar la mayor parte de sus posibilidades desde consola, algo que puede resultar muy útil para automatizar tareas.
Ingredientes
gphoto2
una cámara digital soportada por gphoto2
Copiar todas las fotos con su fecha y hora
Situados en un directorio creado al efecto simplemente ejecuta:
$gphoto2 -P==--filename"%Y-%m-%d_%H:%M_%n.%C"==
Y gphoto2 descargará y renombrará todas las fotos y vídeos que tengas en la cámara, sin borrarlos de ésta. Dependiendo del modelo de tu cámara quizá tengas que indicar algún parámetro adicional como el puerto o similar; mira la documentación.
Si no te gusta tener tooodas las fotos en el mismo directorio, puedes utilizar este pequeño script Python para clasificar los ficheros en directorios por fecha.
Echa un ojo a la receta de Sacando jugo a EXIF, en consola que tiene algunos trucos útiles para clasificar y organizar fotos.
Esta receta explica cómo utilizar SAMBA para servir ficheros y cómo acceder a ellos desde otro ordenador. Supondremos que en ambos equipos tienes Debian o sucedáneos.
hdparm es una pequeña herramienta que sirve para manipular la configuración de las unidades de disco. El objetivo es optimizar el tiempo de acceso o la velocidad de transferencia.
No creo que sea un problema para muchos de los que andamos por aquí, que dudo que vayamos a poner “el Vista” es nuestro portátil, pero me ha parecido curioso un artículo titulado Vista beta sucks up battery juice por el “precio” que tendrán que pagar muchos por tener un escritorio super-pijo. Cada día más motivos para pasarse a Windows…
Esta receta explica qué hacer para poder reproducir DVD en nuestro sistema operativo favorito. Puede resultar trivial para un iniciado pero como ya me lo han preguntado alguna que otra vez lo dejo aquí para la posteridad :-)
Éste es fácil. Se premiara la claridad y elegancia del código. Pero que quede claro que la programación no es arte :-)
Hacer un programa que cuente las funciones (no prototipos) que hay en un fichero C. Debe imprimir el resultado por salida estándar. Puedes utilizar cualquier lenguaje. No se veta el uso de NINGUNA característica de ningún lenguaje.
Esta receta explica qué hacer para poder utilizar dicha cámara con gphoto2. La cuestión es que esta cámara no es reclamada por ningún driver, a pesar de que está soportada por libgphoto2. De modo que el motivo real de esta receta es explicar lo qué puedes hacer en estos casos, sea con ésta o con cualquier otra cámara en las mismas circunstancias.
Como el año pasado, la asociación “linux Albacete” organiza las Jornadas de Software Libre. Tendrán lugar los días 20, 21 y 22 de abril en la Escuela Politécnica de Albacete.
No te voy a engañar, emacs es complejo pero ¿qué hay que merezca la pena y no lo sea?. Si algo tiene emacs son opciones y comandos, cienes y cienes de ellos. Y claro, cuando necesitas hacer algo, no te acuerdas de cuál era el maldito comando y tienes que ponerte a mirar la documentación, aunque en realidad siempre acabas buscando las mismas cosas. O quizá sólo me pasa a mi. Pues en esta receta voy a poner los comandos que suelo necesitar y que siempre se me olvidan, que son casi todos.
Aunque parece el título de una película de miedo, el «kill ring» es la peculiar manera que tiene emacs de entender el ‘portapapeles’. En lugar de tener un único espacio de almacenamiento donde cortar y pegar, emacs tiene una pila; la verdad es que de entrada sí que acojona un poco… :-P
No, no, tranquilo, el título de la noticia es ficticio, por el momento al menos. Sin embargo, cada día tengo más razones para pensar que no pasará mucho tiempo hasta que se haga realidad y lo veamos en un periódico de tirada nacional y/o televisión.
Esta receta pretende ser una chuleta de pequeños trucos y utilidades para manipular DVD Video, usando los programas libres habituales en un sistema GNU
Copiopego de la entrevista en barrapunto a Ricardo Galli. Me ha parecido curioso que alguien le preguntara esto:
9) Profesores universitarios
por HaCHa
¿Qué opinas de la situación y las condiciones laborales bajo las que ejercen su profesión los profesores asociados de las universidades públicas este país?
Ricardo:
Están fatalmente pagados, salarios de miseria, casi vergonzosos. Al igual que los ayudantes y un poco en menor medida los colaboradores.
No sé si estáis informados sobre los detalles de la nuevaLey de PropiedadIntelectual= que, como era de esperar y conociendo como conocemos a los “entusiastas” del copyright, es aún más restrictiva que la anterior. La ley aún no es definitiva, pero es poco probable que el texto sufra modificaciones importantes. No parece que haya habido mucho debate, todos los partidos han estado bastante de acuerdo desde el principio; sólo se han negociado pequeños detalles. Unanimidad a la hora de hacer una ley que antepone el beneficio económico de una minoría al beneficio cultural de la gran mayoría.
Esta receta es (o será) un compendio de pequeños trucos y utilidades para manipular ficheros AVI usando los programas libres habituales en un sistema GNU.
La primera edición de la Party Quijote se celebró el año pasado en Albacete y fue organizada por la EPSA. Asistieron más de 400 personas que participaron durante 3 días en numerosos talleres, concursos, juegos y actividades de toda índole informática, incluyendo promoción y uso de software libre.
CVS es un sistema de control de versiones concurrente. Era hasta hace poco el más utilizado en proyectos de software libre, está siendo rapidamente reemplazado por subversion por sus evitentes ventajas prácticas. En esta receta se explica cómo realizar las operaciones básicas con un repositorio CVS.
Esta receta explica una forma sencilla de hacer una copia de seguridad de una base de datos MySQL completa para poderla restaurar en caso de catástrofe o mudanza.
Supongo que todos lo habéis visto en Barrapunto, pero lo pongo de todos modos para que quede constancia. Está bien que se vea que en Castilla La-Mancha hay gente que de verdad usa y contribuye al software libre, y no sólo dice que lo usa. Mi enhorabuena desde aquí para Carlos González Morcillo, profesional donde los haya, y también para su equipo. Si todos los profesores hicisemos nuestro trabajo la mitad de bien que Carlos, seríamos la mejor universidad de España, como poco.
Cómo activar el soporte SSL de apache-2 para utilizar HTTPS y navegación segura. Los pasos que se describen son para una Debian o sucedaneos, pero supongo que no será muy distinto a otra distro.
Esta receta trata únicamente de las peculiaridades de este módem a la hora de compartir la conexión. Quizá te interese nuestra receta sobre Compartir la conexión s Internet con GNU/Linux para cuestiones más generales.
Subversion es un sistema de control de versiones concurrente. Su objetivo es muy similar al de CVS aunque tiene grandes ventajas sobre éste, y por eso, cada día muchos proyectos de desarrollo de software cambian a subversion.
Algunas de las miles de distribuciones live que ruedan por ahí tienen una característica muy interesante; consiste en montar tu home desde un disco USB. De ese modo vayas donde vayas puedes tener un sistema decente. Pero a esto le veo varios problemas.
Esta receta explica formas de conocer la IP pública con la que te estás concectando a Internet
Si utilizas un router o algo del estilo que incorpore un servidor DHCP, la dirección asignada a tu ordenador con toda seguridad será una dirección IP privada Pero a veces, es necesario conocer cuál es la IP pública con la que sales a Internet, con el fin de configurar un cliente DNS dinámico u otro tipo de aplicación específica.
Para conocerla puedes usar alguno de estos métodos:
lynx -dump http://checkip.dyndns.org/ | grep IP | awk {'print $4'}
$curl -s checkip.dyndns.org | grep-Eo'[0-9\.]+'
Shell (avisa por mail)
#!/bin/bash
# Requiere los paquetes "mailx" y "lynx"
# Te envía un email cada vez que te cambia la IP pública. Ejecutar en background
while true
do
old_ip="`cat ~/public.ip 2> /dev/null`"
new_ip="`lynx -source http://www.whatismyip.com/ | grep '<TITLE>' | awk '{print $4}'`"
if [ "$old_ip" != "$new_ip" ]; then
echo $new_ip | mail tu@email.com -s "Tu IP ha cambiado"
echo $new_ip > ~/public.ip
fi
sleep 60
done
PHP
<?phpecho"Tu dirección IP externa es: ",$_SERVER['REMOTE_ADDR'];?>
Acabo de ver en la tele la nueva campaña de “concienciación” y en contra de la piratería. El anuncio apela a los sentimientos del cuidadano instándole a preservar nuestra cultura “no pirateando”. Pero la cultura no se protege encerrándola bajo llave. La cultura se preserva sacándola a la luz y haciéndola llegar al mayor número posible de personas, compartiéndola. Las lenguas muertas lo están porque nadie las usa (sus respectivos propietarios deben estar muy contentos :-) )
Yo aún no la he probado, pero la 1.2 estaba muy bien y si ésta está basada en Breezy merece la pena echarle un vistazo. Se puede descargar directamente. Más información en la página de Molinux
devhelp es un brower de documentación técnica. Hay disponibles libros para instalar en devhelp. Un libro es la documentación empaquetada de algún programa o herramienta concreta. Esta receta explica como hacer tus propios libros.
En esta recetilla se explica el uso de alguos programamas de Debian (o distros derivadas) que pueden ayudar a mantener el sistema limpio y no tener más basura de la deseada
Recogiendo las sugerencias que muchos habéis hecho después de la party, creo que una buena opción es hacer algo parecido a lo que apuntaba Tobías. Me explico:
Se trata de reunirnos en un aula o laboratorio (dependiendo de la disponibilidad). Alguien cuenta a los demás el uso de alguna herramienta o cualquier otra cosa curiosa, o que consiedere útil o divertida. Es una especie de receta en vivo, aunque también debería pasar a ser una receta escrita para que quede constancia.
Como usar GNU less para ver ficheros fuente con resalte de sintaxis en consola
Aprovechando lesspipe es sencillo conseguir que less se comporte de modo distinto dependiendo del tipo de fichero que se abre y de ese modo integrarlo con highlight o GNU source-highlight para conseguir resaltado sintáctico en consola.
1. lesspipe
lesspipe es un programa que permite modificar el comportamiento de less de un modo muy sencillo. Primero debes escribir un fichero $HOME/.lessfilter. Este fichero normalmente es un script bash que debe tener permisos de ejecución.
En los próximos apartados se incluyen ejemplos de lessfilter para highlight y souce-highlight que se utilizan para colorear código, aunque en realidad se puede usar less para todo tipo de ficheros, como listado de archivos comprimidos, imágenes, ps, html, etc.
Para que funcione es necesario además incluir lo siguiente en tu fichero $HOME/.bashrc:
Es una utilidad que permite colorear ficheros fuente de varios lenguajes y generar varios formatos de salida, como HTML, LaTeX o secuencias de escape ANSI.
La posibilidad de generar salida para la consola (opción -A) se incorporó en la versión 2.1, así que asegúrate que tienes una versión igual o superior.
Fichero .lessfilter
#!/bin/sh
set -e
file "$1" | grep text > /dev/null
highlight -A "$1"
exit 0
Si usas highlight 2.2-4 o posterior el script es aún más sencillo:
Cómo utilizar module-assistant para instalar el driver propietario para las tarjetas gráficas de nvidia en Debian GNU/Linux, Ubuntu y demás distros derivadas.
Hay varias alternativas para instalar este driver. Esta receta explica la forma más sencilla, que es también la más “Debian compliant”. Consulta las referencias si quieres probar las otras alternativas.
Actualiza tu Linux
Instalar el driver de nvidia es una buena oportunidad para aprovechar y actualizar el núcleo. Se supone que vas a utilizar un Linux precompilado y empaquetado por Debian. Por ejemplo:
#apt-get install linux-image-2.6.22-1-386
También vas a necesitar las cabeceras, que es un paquete con el mismo nombre, cambiando image por headers.
#apt-get install linux-headers-2.6.22-1-386
Si usas grub, no olvides hacer el update-grub correspondiente. Y ahora reinicia para usar el núcleo recién instalado.
Ahora… lo divertido
Esto es tan fácil que casi no tiene gracia. Primero instala module-assistant y nvidia-kernel-common:
Esto crea el /etc/apache2/ssl/apache.pem que contiene el certificado y la clave del servidor. El número de serie debería ser uno más de lo que haya en el certificado anterior.
En /etc/apache2/ssl.crt/ hay sendos enlaces simbólicos (server.key y server.crt) que apuntan al fichero generado.
A veces se necesita ejecutar un programa con interfaz gráfica que reside en una máquina distinta y queremos verlo en la máquina que estamos. Esta receta explica cómo conseguirlo sin tener que abrir una sesión X ni tener que utilizar un “escritorio remoto” como vnc.
Método 1: Exportar display
El método ‘clásico’ cuando queremos ejecutar un programa en una máquina remota y ver su interfaz en nuestro cliente X local es:
user@local:~$xhost remoto
remoto being added to access control list
user@local:~$
Con eso se consigue que el servidor X, que corre en nuestra máquina, acepte conexiones externas de la máquina “remoto”. Pero si queremos que admita conexiones de cualquier máquina hay que poner:
user@local:~$xhost +
access control disabled, clients can connect from any host
user@local:~$
Aunque esto puede suponer un problema de seguridad grave.
Ahora accede a la máquina remota con telnet o algo similar y exporta el ‘display’ para aplicaciones X.
La instrucción export declara una variable de entorno de la shell (no tiene nada que ver con la expresión exportar display).
Con esto, la aplicación X sabrá que debe utilizar el servidor X de la máquina llamada ‘local’ en lugar de usar el de la máquina en la que se ejecuta. Puedes comprobar que funciona con algo como:
user@remoto:~$xeyes
user@remoto:~$
Con lo que deberías ver el clásico programilla de los ojos en la máquina local.
Método 2: ssh
El servidor ssh es capaz de gestionar automáticamente la conexión X siempre que servidor y cliente estén configurados adecuadamente.
Edita el fichero /etc/ssh/sshd_config del servidor y haz la siguiente modificación, que sirve para que el servidor ssh remoto devuelva el tráfico X11.
X11Forwarding = yes
Edita el fichero /etc/ssh/ssh_config del cliente y haz la siguiente modificación, Esto hace que el cliente ssh local solicite el tráfico X11.
ForwardX11 = yes
Como alternativa a esto, el usuario puede solicitarlo por línea de comando al hacer la conexión:
ssh -X <em>remoto</em>
Si lo haces en las dos máquinas, podrás utilizar este mecanismo en ambos sentidos. Sólo queda reiniciar el servidor con:
ATENCIÓN: Aunque los efectos visuales de 3ddesktop pueden seguir resultando interesantes para alguno, XGL deja a este programa bastante obsoleto. Mira la receta de XGL y Beryl en Ubuntu Dapper si de verdad quieres increibles efectos 3D en tu escritorio libre.
Acabo de ver esta noticia en barrapunto de nuestros colegas de Albacete sobre el fenómeno BookCrossing y era algo a lo que hace tiempo que llevaba dándole vueltas. Creo que es un mecanismo sencillo y barato para difusión de cultura libre. ¿Qué te parece? ¿Crees que podría funcionar aquí? ¿Estarías dispuesto a ayudar a poner el tema en marcha?
Esta receta es muy similar a esta otra de SSHfs + FUSE. La diferencia es que aquí se usa un driver específico llamado SHFS. Igualmente se trata de acceder a ficheros de una máquina remota a través de SSH.
Esta receta es un compendio de pequeños trucos y utilidades para manipular ficheros PDF con los programas libres habituales en un sistema GNU
En realidad pienso ir apuntando aquí las soluciones que voy encontrando a problemas que me surgen cuando tengo que hacer ciertas «operaciones imprevistas» con ficheros PDF. Se admiten sugerencias para ir incorporando a la receta.
En realidad se trata de aumentar los márgenes reduciendo el tamaño del área impresa. También con pdfnup:
$pdfnup --nup 1x1 --scale 0.9 original.pdf
Cambiar el formato de página
Si tienes que imprimir un .pdf cuyo formato de página no es A4 probablemente acabarás desperdiciando gran parte de la hoja porque por aquí todas las impresoras domesticas son A4. Con los siguientes comandos puedes convertir el formato de página:
Si has hecho un .pdf con pdflatex lo más probable es que no incluya las fuentes, de modo que el programa pueda renderizar el documento con las fuentes del sistema. Sin embargo, a veces se requiere disponer de un .pdf auto-contenido para garantizar que se verá del mismo modo en cualquier parte. Para lograrlo ejecuta lo sisguiente:
Esta receta explica cómo configurar un ordenador con Debian (también Ubuntu y sucedáneos) para que sirva como router de tu pequeña red doméstica. La idea es que varios equipos puedan salir a Internet por medio de una sola conexión y con una única IP pública. Una vez consigas esto, hay varias cosas más que puedes hacer con él...
Ingredientes
Un ordenador:
Este equipo hará de router. Sirve cualquier cosa mayor de un Pentium. Un K6 o un PII con 64 MB de RAM es más que suficiente para los servicios básicos. Es una buena oportunidad para reciclar tu viejo sobremesa, una vez instalado le sobre el monitor, teclado, ratón, CD-ROM y tarjeta de sonido; la de vídeo déjala puesta por si acaso.
iptables:
Herramienta de administración de filtrado de paquetes IP.
Un Linux "de los nuevos":
Como vas a utilizar iptables necesitas un Linux-2.6 o superior (aunque también serviría un 2.4).
dnsmasq >= 2.46:
Es un servidor DHCP y caché DNS muy versátil y fácil de configurar.
Configuración de las interfaces de Red
Ese ordenador "de desecho" del que hablaba antes lo llamaremos a partir de ahora con el original nombre de Router. Bien, Router debe tener, al menos, dos interfaces de red:
Una conexión a Internet (eth0).
Debe ser algún tipo de conexión a Internet, que puede ser RTC, ADSL, cable-modem, etc. Supondremos para esta receta que usas un modem ADSL con conexión Ethernet.
Conste que podría ser RDSI, ppp o cualquier otro tipo de interfaz de red sin que ello afecte al resto del procecimiento. Supondremos que esta interfaz ya la tienes configurada conforme a las instrucciones de tu ISP.
Una conexión a tu red local (eth1):
Será una tarjeta de red Ethernet 10/100. Esto permitirá que puedas enchufarle un conmutador y conectar "cienes y cienes" de ordenadores si quieres.
Esta interfaz debes configurarla de forma estática, con una dirección IP privada, por ejemplo 192.168.0.1.
Aquí puedes ver un fichero completo /etc/network/interfaces para el caso en que eth0 se configure por DHCP contra tu ISP.
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
auto eth1
iface eth1 inet static
address 192.168.0.1
netmask 255.255.255.0
broadcast 192.168.0.255
Activa el forwarding (reenvío)
Normalmente un ordenador conectado a una red TCP/IP descarta todos los paquetes IP que le llegan pero no van dirigidos a él, es decir, aquellos cuya direcci IP no corresponde a ninguna de las interfaces de la máquina. Sin embargo, un router debe tratar paquetes IP que no son para él. Para conseguir esto debes activarlo explícitamente con:
Router:~#echo 1 > /proc/sys/net/ipv4/ip_forward
O mejor aún, como queremos que ocurra la siguiente vez que arranque el equipo, modifica el fichero /etc/sysctl.conf para que quede así:
net.ipv4.ip_forward=1
Activa el NAT
El NAT es una técnica que permite que varios ordenadores puedan acceder a Internet aunque sólo se disponga de una IP pública. El NAT se encarga de "traducir" las direcciones IPs privadas por la única pública al enviar y realiza el proceso inverso al recibir las respuestas. Para activarlo escribe:
Router:~#iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Con esto, los equipos conectados a la interfaz eth1 de Router ya tienen conexión a Intenet, aunque sus IPs habría que configurarlas "a mano" y no son capaces de resolver nombres. Vamos a ver cómo solucionar esas dos cuestiones.
Servidor DHCP y caché DNS
Una vez instalado dnsmasq, haz las siguientes modificaciones en el fichero /etc/dnsmasq.conf:
Este fichero está muy bien documentado con comentarios e incluye ejemplos de todas las posibilidades. Después de realizar las modificaciones reinicia el servicio con:
Router:~#/etc/init.d/dnsmasq restart
Restarting DNS forwarder and DHCP server: dnsmasq.
Simplemente con eso, dnsmasq te da los siguientes servicios:
Si configuras los clientes de tu red local para usar DHCP obtendrán una IP del rango 192.168.0.[2-254]
Se configuran automáticamente para usar tu Router como pasarela y como DNS.
Router cachea todas las peticiones DNS que realicen los clientes y las redirije a los servidores DNS configurados en el /etc/resolv.conf de Router.
Dispone de DNS dinámico local. Si los clientes especifican un nombre al hacer su petición DHCP, el resto de los clientes podrán usar ese nombre para resolver su IP.
Además dnsmasq permite asignar IPs fijas (del rango) y nombres dependiendo de la MAC y otras muchas opciones avanzadas.
Para guardar las reglas activas (las que has ido poniendo hasta ahora) ejecuta:
Router:~#iptables-save > /etc/iptables.up.rules
Y ahora hay que hacer que esa configuración se cargue automáticamente al levantar la interfaz de red principal (la externa). Para ello, edita de nuevo el fichero /etc/network/interfaces para que la entrada de eth0 quede así:
auto eth0
iface eth0 inet dhcp
pre-up iptables-restore < /etc/iptables.up.rules
Esta receta explica cómo instalar y configurar la herramienta NUT para aprovechar al máximo las posibilidades de un SAI en un sistema Debian GNU/Linux. Concretamente, los pasos son para un MGE Pulsar Extreme 1500C
Introducción
Instalar un software de control para un SAI sólo tiene sentido si podemos hablar con él para obtener datos de su estado y funcionamiento. Si el SAI no tiene ningún tipo de conexión de datos (tal como serie o USB) esta receta no te sirve. En cualquier caso, un SAI que no dice nada sobre su estado es de muy poca utilidad. Si estás pensado en comprar un SAI, elige uno con el que puedas hablar. En la página de nut hay una lista de las marcas y modelos compatibles.
Instalación
Si tienes una distro compatible Debian, instalar el paquete nut es así de fácil:
#apt-get install nut
Descripción
Este software tiene una arquitectura cliente/servidor. Esta configuración permite que varios equipos alimentados por un único SAI (y que ejecutan un cliente) puedan hablar, a través de la red, con el equipo que tiene la conexión de datos del SAI (y que ejecuta el servidor). De este modo, ante un corte de corriente, todos los equipos quedan informados y pueden actuar en consecuencia.
Por este motivo, aunque el SAI dé servicio a una sola máquina, será necesario instalar un servidor y un cliente.
Funcionalidad
Lógicamente, la función de un SAI o UPS (mantener la alimentación durante cortes de luz) es insuficiente para un servidor, ya que es muy probable que no haya nadie para apagar el equipo durante el tiempo de duración de las baterías. El software nut ofrece servicios mucho más interesantes:
Fijar un umbral de bateria, por debajo del cual el equipo conectado al SAI se apaga automáticamente.
Desconexión del SAI. De este modo las baterías no se agotan inútilmente, pues ya no hay nada que alimentar.
Fijar umbrales de carga máxima.
Monitorización y configuración remota (por medio de CGI).
Con esa configuración, ante un corte de luz, ocurre lo siguiente:
El SAI pasa a modo batería.
Al bajar el nivel de carga de la batería al umbral fijado, el driver que corre en el servidor lo detecta e informa a todos los clientes.
Los clientes inician el proceso de apagado de cada equipo.
Justo antes de apagarse, el servidor envía al SAI el comando de desconexión.
El SAI recibe el comando, espera un tiempo prefijado y después se apaga.
Al volver la corriente:
El SAI enciende automáticamente.
Cuando la fuente de alimentación del PC detecta voltaje (procedente del SAI) arranca el equipo. Para esto es necesario configurar el BIOS Setup de cada ordenador.
No todos los SAIs pueden hacer todo lo que se índica. Tendrás más o menos posibilidades dependiendo de la gama y precio del SAI.
Configuración
Configuración común
Lo primero, y antes de que se nos olvide, será cambiar los permisos del puerto serie (/dev/ttyS0 o /dev/ttyS1), pues nos debe dejar leer y escribir en él como root. En Debian, los puertos serie suelen pertenecer al grupo dialout, así que la manera más fácil de conseguir permiso es:
#addgrp nut dialout
En /etc/nut/ups.conf habrá que realizar algunos cambios (tanto en cliente como en servidor). Aquí es donde se añade el driver (cada familia de SAIs tiene su propio driver):
[id]
driver = (driver)
port = (port)
(options)
Por ejemplo, para un SAI “MGE Pulsar Extreme” será:
[mge]
driver = mge-utalk
port = /dev/ttyS0
LowBatt = 90
Configuración del servidor
Edita el fichero /etc/default/nut modificando la línea “START_UPSD=no” por “START_UPSD=yes”
En el fichero /etc/nut/upsd.conf tienes que crear la lista de control de acceso (ACL). Para ello incluye (si no existe ya):
ACL all 0.0.0.0/0
ACL localhost 127.0.0.1/32 # host actual
ACL [NombreMáquina] 192.168.0.0/24 # toda la red
ACCESS grant login localhost [password]
ACCESS grant monitor localhost [password]
ACCESS grant login [NombreMaquina] [password]
ACCESS grant monitor [NombreMáquina] [password]
ACCESS deny all all
Por último, edita el fichero /etc/nut/upsd.users para dar acceso a los usuarios. Para ello, añade las líneas:
[monuser]
password = [password]
allowfrom = localhost 192.168.0.0/24 # tu red
Configuración del cliente
Edita el fichero /etc/default/nut modificando la línea “START_UPSMON=no” por “START_UPSMON=yes”
Lo siguiente será /etc/nut/upsmon.conf. Éste es el fichero de configuración del cliente. La línea obligatoria a añadir es la del monitor:
MONITOR [id]@[ip] 1 [password] slave|master
Lo normal para el equipo que tiene la conexión de datos al SAI es que funcione en modo “master”. Eso significa que debe esperar a que los “slaves” apaguen antes de hacerlo él. Así que quedará algo como esto:
MONITOR mge@192.168.0.1 1 [password] master
Ahora debes reniciar el servicio de la forma habitual:
#/etc/init.d/nut restart
Consejos
Lo mejor es que la primera vez se arranque todo a mano, pues el script descrito en la sección anterior redirige todos los errores a /dev/null. Para ello se hará:
#upsdrvctl start
Network UPS Tools - UPS driver controller 1.2.1
Network UPS Tools - MGE UPS SYSTEMS/U-Talk driver 0.51.0 (1.2.1)
##upsd
Network UPS Tools upsd 1.2.1
##upsmon
UPS: mge@192.168.0.1 (slave) (power value 1)
Using power down flag file /etc/killpower
#
Puedes ver que la monitorización funciona adecuadamente con el comando upsc:
Para instalar grub en el arranque del disco debes ejecutar:
#grub-install /dev/hda
siempre que tu disco de arranque sea /dev/hda.
Configuración
Grub puede crear un fichero de configuración por defecto...
#update-grub
Este programa averigua qué kernels tienes instalados y modifica o crea (si no existe) un fichero menu.lst con los datos necesarios. Hazlo también después de instalar un nuevo kernel.
El fichero menu.lst
Su aspecto típico es:
timeout 4
color black/cyan yellow/cyan
default 0
title Debian GNU/Linux [2.4.19-686 precompiled]
root (hd0,4)
kernel /boot/vmlinuz-2.4.19-686 root=/dev/hda5
initrd /boot/initrd.img-2.4.19-686
title Debian single-user (kernel 2.2.18)
root (hd0,4)
kernel /boot/vmlinuz-2.2.18 root=/dev/hda5 ro single
initrd /boot/initrd-2.2.18.gz
title Windows 98
rootnoverify (hd0,0)
makeactive
chainloader +1
Cómo utilizar el gestor de instalación de paquetes GNU stow
Introducción
stow es una pequeña herramienta que sirve para instalar paquetes (normalmente a partir de sus fuentes). Permite que los binarios, ficheros de cabecera y de ayuda del paquete estén accesibles; pero teniendo controlado dónde va a parar cada fichero, de modo que la desistalación elimina TODO lo instalado. En cualquier caso, siempre es preferible utilizar el sistema de paquetes de la distribución (deb, rpm,) pues suele permitir un mejor control del sistema.
Instalación de stow
Suele estar disponible como paquete en las distribuiciones de GNU/Linux más extendidas. En Debian GNU/Linux y distribuciones derivadas (como Ubuntu) es tan fácil como:
#apt-get install stow
Instalación de un paquete usando stow
Supongamos que vas a instalar un paquete a partir de sus fuentes, por ejemplo, gnome-commander-1.1.5.tar.gz. Primero se descomprime:
A continuación "configuramos" el sistema de compilación. Con prefix se indica a configure el directorio en el que se va a instalar el programa. Lo más aconsejable es utilizar un subdirectorio que cuelgue de /usr/local/stow es un buen sitio. Si ese directorio no hay que crearlo. El grupo propietario del directorio stow debería ser staff. Resulte este punto puedes proceder:
Con esto, los binarios quedan instalados en el directorio indicado. Sin embargo, esos directorios no están en el PATH y el programa no se puede invocar a menos que se indique la ruta completa. Aquí es donde entra en juego stow.
Una vez instalado hacemos lo siguiente. Es importante cambiar al directorio /usr/local/stow o de lo contrario habría que indicar las rutas explícitamente.
/usr/local/stow$stow gnome-commander
stow crea enlaces a los ficheros de modo que son accesibles desde /usr/local/bin, /usr/local/lib, etc.
Para poder hacer esto hay que ser root, o mejor, hacer que tu usuario pertenezca al grupo staff (el propietario del directorio).
Des-intalar un paquete gestionado con stow
Si quieres que stow elimine los enlaces que creó para un paquete concreto simplemente ejecuta:
/usr/local/stow$stow -D gnome-commander
Después de esto puedes borrar el directorio /usr/local/stow/gnome-commander sin problema, y todo habrá quedado tan limpito como antes de instalarlo.
Listar los paquetes que contienen cierta cadena en su nombre
$COLUMNS=120 dpkg -l | grep string
Obtener el estado(hold, purge) de un paquete
$dpkg --get-selections nombre_paquete
Eliminar un paquete y sus ficheros de configuración
#dpkg --purge nombre_paquete
Ver las dependencias de un paquete y su descripción
$apt-cache showpkg nombre_paquete
Buscar paquetes relacionados con un término
$apt-cache search string
Posibles problemas
Al instalar un paquete, puede ocurrir que su script de post-instalación falle por alguna razón, lo cual impide que el paquete se instale correctamente. Si eso ocurre puedes editar su script correspondiente en /var/lib/dpkg/info/nombre_paquete.postinst e intentar arreglarlo. Después simplemente ejecuta:
#dpkg --configure-a
Reinstalar todos los paquetes instalados
Útil para limpiar los binarios si el sistema ha sido infectado con un virus o un rootkit. USARCON PRECAUCIÓN.
En determinadas «circunstancias especiales» puede ser necesario que un PC tenga una tarjeta de red con una dirección MAC específica. Esta receta explica cómo conseguirlo con ifconfig, iproute o macchanger
Un minúsculo tutorial para quién necesite o simplemente le apetezca aprender Python.
Introducción
Python es un lenguaje interpretado, interactivo y orientado a objetos. Se le compara con C++. Java o Perl. Tiene variables, clases, objetos, funciones y todo lo que se espera que tenga un lenguaje de programación «convencional». Cualquier programador puede empezar a trabajar con Python con poco esfuerzo. Según muchos estudios, Python es uno de los lenguajes más fáciles de aprender y que permiten al novato ser productivo en tiempo record, lo cual lo hace ideal como primer lenguaje.
Python es perfecto como lenguaje «pegamento» y para prototipado rápido de aplicaciones (aunque finalmente fuera necesario rehacerlas en otros lenguajes), aunque eso no implica que no se puedan ser definitivos. Dispone de librerías para desarrollar aplicaciones multihilo, distribuidas, bases de datos, con interfaz gráfico, juegos, gráficos 3D, cálculo científico, machine learning y una larga lista.
Este pequeño tutorial utiliza la versión actual de Python (3.9) y presupone que el lector tiene nociones básicas de programación con algún lenguaje como C, Java o similar.
Empezamos
Nada como usar algo para aprender a usarlo. El intérprete de Python se puede utilizar como una shell (lo que se llama modo interactivo), algo que viene muy bien para dar nuestros primeros pasos.
$ python3
Python 3.9.1+ (default, Jan 20 2021, 14:49:22)
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
Variables y tipos
Las variables no se declaran explícitamente, se pueden usar desde el momento en que se inicializan. Y normalmente no hay que preocuparse por liberar la memoria que ocupan, tiene un «recolector de basura» (como Java).
$ python3
>>> a = "hola"
En el modo interactivo se puede ver el valor de cualquier objeto simplemente escribiendo su nombre:
>>> a
'hola'
Python es un lenguaje de tipado fuerte, pero dinámico. Eso significa que no se puede operar alegremente con tipos diferentes (como se hace en C). Las operaciones están definidas para trabajar con los tipos previstos.
>>> a + 1
Traceback (most recent call last):
File "", line 1, in
TypeError: Can't convert 'int' object to str implicitly
Esa operación ha provocado que se dispare la excepción TypeError. Las excepciones son el mecanismo más común de notificación de errores.
Pero se puede cambiar el tipo de una variable sobre la marcha:
>>> a = 3
En realidad no hemos cambiado el tipo de a, sino que hemos creado una nueva variable que reemplaza la anterior.
Tipos de datos
Valor Nulo
Una variable puede existir sin tener valor ni tipo, para ello se asigna el valor None. Es el valor adecuado cuando se quiere indicar que una variable no se refiere a ningún objeto:
>>> a = None
>>> a
>>>
Booleanos
Lo habitual:
>>> a = True
>>> a
True
>>> not a
False
>>> a and False
False
>>> 3 > 1
True
>>> b = 3 > 1
>>> b
True
Numéricos
Python dispone de tipos enteros de cualquier tamaño que soportan todas las operaciones propias de C, incluidas las de bits. También hay reales como en cualquier otro lenguaje. Ambos tipos se pueden operar entre si sin problema. Incluso tiene soporte para números complejos de forma nativa.
>>> a = 2
>>> b = 3.0
>>> a + b
5.0
>>> b - 4j
(3-4j)
Secuencias
No hay tipo carácter, se utilizan cadenas de tamaño 1. Las cadenas admiten operaciones como la suma y la multiplicación.
El tipo bytes permite manejar secuencias de bytes. Es especialmente útil para serialización de datos. Por ejemplo, podemos convertir una cadena de caracteres UTF-8 a bytes y viceversa:
Las tuplas son una agrupación de valores similar al concepto matemático de tupla. Se pueden empaquetar y desempaquetar varias variables (incluso de tipo diferente).
>>> x = greeting, 'f', 3.0
>>> x
('hola ', 'f', 3.0)
>>> v1, v2, v3 = x
>>> v2
'f'
Las Listas son similares a los vectores o arrays de otros lenguajes, aunque en Python se pueden mezclar tipos.
>>> x = [1, 'f', 3.0]
>>> x[0]
1
Las listas también se pueden sumar y multiplicar:
>>> x = [1, 'f', 3.0]
>>> x + ['adios']
[1, 'f', 3.0, 'adios']
>>> x * 2
[1, 'f', 3.0, 1, 'f', 3.0]
Cualquier secuencia se puede indexar desde el final o mediante «rodajas» (slices):
Python dispone de otros tipos de datos nativos como conjuntos (sets), pilas, colas, listas multidimensionales, etc.
Type checking
Aunque Python es un lenguaje de tipado dinámico, en la versión 3.0 ya se daba la opción de hacer anotaciones sobre las variables y sus tipos, y actualmente (se introdujo con el PEP 484) existe un módulo donde se definen la semántica y convenciones para especificar de forma opcional esas anotaciones o hints.
>>> pi: float = 3.14
Las anotaciones de las variables se almacenan en el atributo __annotations__:
El comportamiento del lenguaje es el mismo, y las variables puede cambiar el tipo de valor que almacenan independientemente de su definición sin producir errores:
>>> pi: float = 3.14
>>> pi = "Tres coma catorce"
Sirve principalmente para facilitar la comprensión del código y poder llevar a cabo comprobaciones de tipos o type checking sobre el código escrito con herramientas como MyPy.
Orientado a objetos
Casi todo en Python está orientado a objetos, incluyendo las variables de tipos básicos, y hasta los literales!
Los módulos son análogos a las 'librerías' o 'paquetes' de otros lenguajes. Para usarlos se utiliza la sentencia import:
>>> import sys
>>> sys.exit(1)
Estructuras de control
Están disponibles las más habituales: for, while, if, if else, break, continue, return, etc. Todas funcionan de la forma habitual excepto for. El for de Python no es un while disfrazado, como ocurre en algunos lenguajes. Este for hace que, en cada iteración, la variable de control tome los valores que contiene una secuencia, es decir, que itere sobre ella. Ejemplo:
>>> for c in "hello":
... print(c)
...
'h'
'e'
'l'
'l'
'o'
Indentación estricta
En muchos lenguajes se aconseja «tabular» de determinada manera para facilitar su lectura. En Python este estilo es obligatorio porque el esquema de indentación define los bloques. Es una importante peculiaridad de este lenguaje. Se aconseja tabulación blanda de 4 espacios. Mira el siguiente fragmento de un programa Python:
El cuerpo del bloque for queda definido por el código que está indentado un nivel debajo de él. Lo mismo ocurre con el if. La sentencia que define el bloque siempre lleva un ':' al final. No se utilizan llaves ni ninguna otra cosa para delimitar los bloques.
Funciones
Nada mejor para explicar su sintaxis que un ejemplo:
deffactorial(n):ifn==0:return1returnn*factorial(n-1)# y su invocación
print(factorial(10))
Python is different
Como cualquier lenguaje, Python tiene sus peculiaridades, y conocerlas puede ayudar a sacarle el máximo potencial. Siempre hay una manera más «pythónica» de hacer las cosas, utilizando por ejemplo las características de programación funcional que incorpora. Como ejemplo, el factorial se puede hacer aún más compacto con algo como:
Lo normal es escribir un programa en un fichero de texto con extensión .py, utilizando algún buen editor (como code). Después ese fichero se puede ejecutar como cualquier otro programa. Para eso, la primera línea del fichero debe tener un «shebang», es decir, algo como:
#!/usr/bin/python3
Y no olvides darle permisos de ejecución al fichero:
Netcat es una de las herramientas más potentes y flexibles que existen en el campo de la programación, depuración, análisis y manipulación de redes y servicios TCP/IP. Es un recurso imprescindible tanto para expertos en seguridad de redes como para hackers. Esta receta incluye varios ejemplos de uso de GNU netcat.
Introducción
Aunque netcat puede hacer muchas cosas, su función principal es muy simple:
Crea un socket con el destino indicado si es cliente, o en el puerto indicado, si es servidor
Una vez conectado, envía por el socket todo lo que llegue en su entrada estándar y envía a su salida estándar todo lo que llegue por el socket
Algo tan simple resulta ser extraordinariamente potente y flexible como vas a ver e continuación. Por simplicidad se utilizan conexiones locales aunque, por supuesto, se pueden utilizar entre máquinas diferentes.
Podemos usar netcat para enviar correo electrónico por medio de un servidor SMTP, utilizando el protocolo directamente:
~$nc mail.servidor.com
220 mail.servidor.com ESMTP Postfix
HELO yo
250 mail.servidor.com
MAIL FROM:guillermito@microchof.com
250 Ok
RCPT TO:manolo@cocaloca.es
250 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Aviso: su licencia ha caducado. Me deben un pastón.
.
250 Ok: queued as D44314A607
QUIT
221 Bye
HTTP
Es sencillo conseguir un cliente y un servidor HTTP rudimentarios.
Servidor
$nc -l-p http -c"cat index.html"
Al cual podemos conectar con cualquier navegador HTTP, como por ejemplo firefox.
Cliente
$echo"GET /" | nc www.google.com 80 > index.html
Streaming de audio
Un sencillo ejemplo para hacer streaming de un fichero .mp3:
Servidor
$nc -l-p 2000 < fichero.mp3
y para servir todos los .mp3 de un directorio:
$cat*.mp3 | nc -l-p 2000
Cliente
$nc server.example.org 2000 | madplay -
Streaming de video
Servidor
$nc -l-p 2000 < pelicula.avi
Cliente
$nc server.example.org 2000 | mplayer -
Proxy
Sirva para redirigir una conexión a otro puerto u otra máquina:
$nc -l-p 2000 -c"nc example.org 22"
El tráfico recibido en el puerto 2000 de esta máquina se redirige a la máquina example.org:22. Permite incluso que la conexión entrante sea UDP pero la redirección sea TCP o viceversa!
Clonar un disco a través de la red
Esto se debe usar con muchísima precaución. ¡Si no estás 100% seguro, no lo hagas! No digas que no te avisé.
Es este ejemplo voy a copiar un pen drive USB que está conectado al servidor a un fichero en el cliente y después lo voy a montar para acceder al contenido.
Tienes tarifa plana en casa pero tu IP es dinámica. A pesar de eso te gustaría tener un servidor web y tus "cosillas" accesibles desde cualquier sitio. La solución a tus problemas es un servicio de DNS dinámico.
Ingredientes
Una conexión a internet
Debian GNU/Linux o derivados
ddclient
Servidor de DNS dinámico
Lo primero es crearte una cuenta en uno de los muchos sitios que tienen un servicio de DNS dinámico, muchos son gratuitos. Por ejemplo, DynDNS.org.
Hay otros:
Al crear tu cuenta tendrás que indicar cómo se va a llamar tu máquina, por ejemplo, miservidor.dyndns.org.
Instalar ddclient
Simplemente:
#apt-get install ddclient
Configuración
El propio sistema de instalación de paquetes de Debian te preguntará los parámetros de configuración. A continuación se ponen unos valores de ejemplo figurados.
Si metes la pata y te cargas la cuenta de root o simplemente has olvidado la clave, esta receta explica cómo recuperar la cuenta de root sin conocer la clave, siempre que uses GRUB como gestor de arranque.
Cuando aparezca el menu de grub, tras encender la máquina, situate con los cursores en la línea del kernel que quieres usar. Pulsa 'e' para editar la entrada y edita la línea kernel (pulsando 'e' de nuevo). Añade al final de la línea lo siguiente:
init=/bin/bash
Esto hace que el sistema arranque una shell root sin pedir password. Es posible que el teclado esté en inglés y no puedas escribir el '=' y la '/', prueba '¡' y '-'. Pulsa 'b' para comenzar el arranque del kernel.
La partición raíz suele montarse como sólo lectura, asi que si olvidaste la clave de root y quieres cambiarla primero deberás remontarla como lectura/escritura. Para ello:
#mount -o remount,rw /dev/hda3
suponiendo que /dev/hda3 es tu partición raíz. Puedes averiguarlo ejecutando simplemente mount.
Por último, cambia la clave de root ejecutando:
Cómo configurar SSH para poder usar ssh y scp para acceder a otras máquinas autorizadas sin necesidad de indicar la clave de usuario cada vez que se conecta. También muy útil cuando se usan repositorios remotos que se acceden por SSH.
Siempre me ha gustado escribir aplicaciones extensibles, pero picarme todo un sistema de plugins me ha parecido tedioso.
Por eso he intentado buscar librerías que me ayuden a crear plugins, aunque siempre he tenido problemas para la distribución de éstos, como me ha pasado con Yapsy.
La verdad es que me he sentido como un auténtico estúpido al descubrir que Python tiene un sistema para escribir plugins muy sencillo de usar. Vamos a ver cómo.
Puedes encontrar el artículo original en: MagMax Blog.
Atención: Este artículo se ha copiado de la web de MagMax(que es su autor). Es posible que sufra cambios. Podéis encontrar la última versión de este artículo en su ubicación original. Muchas gracias.
Últimamente he estado cotilleando en el mundo ICE con Java, así que aquí os dejo mis conclusiones. Si alguna de ellas es errónea, os agradecería vuestros comentarios.
Por supuesto... Java + IDE (Netbeans o Eclipse)
A menudo he necesitado este script y por fin me he puesto a implementarlo. Consiste en un script-fu que se le puede pasar a gimp para recortar una imagen de forma automática. Contaré los pasos que he seguido y al final hay un resumen para 'ir más rápido'.
Ingredientes
No os lo vais a creer: gimp.
#apt-get install gimp
Seguro que en Mindows es más fácil de instalar.
Mi primer script
Lo primero que necesitado ha sido una manera de ejecutar un script. Para ello, he abierto mi imagencilla con Gimp de la forma habitual:
$gimp tab1.png
Después hay que irse a la ventana principal de Gimp, donde están las herramientas, y acceder a "Exts"->"Script-fu"->"Consola de Script-fu". Se nos abrirá una ventana bastante fea. Antes de avanzar, pulsamos el botón "examinar". Se nos abrirá la ventana de ayuda que podemos tener danzando por ahí mientras nos damos cabezazos contra la pared con nuestro script.
Vamos con mi "hola mundo". En esta ocasión, consistió en seleccionar toda la imagen :-D
(gimp-selection-all 1)
Ahora lo explico: estoy llamando a la función "gimp-selection-all" con el parámetro "1", que es el identificador de la imagen (como la acabamos de abrir, debería ser el 1 :D). Para comprobar el resultado, vamos a la ventana de la imagen y debería estar seleccionado todo.
El Script
Ahora que sabemos usar perfectamente script-fu, vamos con el script que recorta una imagen:
Lo he separado en líneas para que lo veáis bonito :D. La barra invertida: "\" sólo sirve para indicar que va todo en la misma línea.
Ahora explico: "let*" me permite definir variables. Así defino dos: una es "img" y otra "drw". Casi todas las funciones requieren estos parámetros, así que me los guardo "para luego" y así es más fácil todo. Al declarar "img" le asigno el valor devuelto por la función "gimp-file-load", que me ha cargado la imagen, pasándole un "0" ("no interactivo"), la ruta hasta la imagen y "el nombre dado por el usuario", que creo que es el nombre de la imagen sin el path.
Igualmente, a "drw" le asigno el resultado de "gimp-image-get-active-drawable", donde " (car img)" es una llamada a una función que me da el primer elemento del vector "img" (no sé explicarlo mejor. No he conseguido quitarme de encima el "car" ése).
Con eso ya tengo las dos variables locales que, como locales que son, sólo existirán hasta que cierre el "let*" (por eso lo cierro al final).
El primer argumento del resto de funciones siempre es el modo interactivo, el problema es que de homogeneidad nada: unas funciones toman el 0 como "interactivo" y otras como "no-interactivo". En el ejemplo todas están a "no-interactivo".
Por orden, hago: Cargar la imagen (como hemos visto), recortar la imagen, transformar el color blanco a alpha (éste es un bonus track) y guardar la imagen.
No me enrollo más.
Batch mode
Claro, nada de esto tiene gracia si tengo que estar abriendo el gimp para cada una de mis 159 imágenes que quiero procesar... Así que a currarme la línea de órdenes:
A gimp tengo que pasarle la orden "-i" (no interactivo) y "-b" (ejecútame este batch) con la ristra que hemos comentado antes. Tan sólo le he añadido un detallito, que es la orden "gimp-quit" para que no se quede en "modo gimp".
Hay una forma de hacer que me procese todas las imágenes de golpe... Pero eso lo dejaré para otra receta, ya que yo voy a utilizar un precioso Makefile que me va a ir transformando todas las imágenes y me las va a actualizar cuando las modifique (mientras que con gimp tendría que volver a procesar todas), así que lo dejaré en el tintero.
Y fin
No sé si esto resultará útil para alguien, pero puedo asegurar que para mí sí, y como no sabía dónde ponerlo y el script-fu es infernal, lo he plantao aquí, que hacía mucho que no saba señales de vida.
Hasta las narices de que me quieran sajar por un minuto de canción más o menos lo mismo que por una canción completa (con una calidad ridícula), aquí tenéis un manual para reducir el tamaño y la calidad de vuestras canciones favoritas. Eso sí: siempre y cuando tengáis un “título de propiedad” de la canción…
Paso 0: A WAV
Lo primero que hago es obtener el wav. Como lo tengo en CD uso grip (paquetito debian y tal). Si lo tenéis ya en mp3, saltaros este paso.
Paso 1: Recortando
Pues yo uso mhwaveedit. Abre tanto el mp3 como el wav. Recortas, pruebas, recortas, pruebas, pruebas, recortas, pruebas, deshaces, recortas, pruebas… Ale, ya tienes el trocito que te gusta.
Paso 2: Calidad paupérrima
¿Vas a difrutar de la música? La respuesta es: NO. Un montón de investigación para obtener mejor calidad y al final lo que queremos es basura. ¿Qué se le va a hacer? Pero… ¡No hay problema!
$lame -m m -b 56 ficherito.wav ficherito.mp3
Con esto conseguiréis una calidad regulera, pero un tamaño enano. Para un wav de 5Mb he conseguido un mp3 de 200Kb. Podéis jugar con el parámetro de -b hasta encontrar lo que queréis (si ponéis un valor inválido, os avisa de cuáles son los buenos).
Ironic mode: ON
Ale… a difrutar de la música
Ironic mode: OFF
—
20070522 – Añadida opción “-m m” para transformar a Mono. Gracias, Paco; se me había pasado al transcribirlo.
Cualquiera que lea el título puede caer en la desgracia de creérselo. Sin embargo, son afirmaciones que cualquiera que no sepa un poquitín de historia cree. He aquí una pequeña historieta con lo que me ha pasado a mí para descubrir al inventor del ratón.
A menudo, después de liar una buena o bien de instalar sistemas operativos no permisivos y totalitaristas, nos encontraremos que se han cargado GRUB y no podemos volver a iniciar nuestro GNU/*. Siempre olvido alguno de los pasos, así que voy a ponerlos aquí y así a lo mejor le viene bien a alguien.
A menudo necesitamos cambiar de aplicación y lo hacemos rápidamente mediante una combinación de teclas "ALT+TAB". Este cambio, además, muestra una pequeña ventanita que nos indica la aplicación que se va a abrir.
A menudo me ha ocurrido que he tenido que abrir ficheros Makefile. Realmente es un fastidio que tabbar agrupe por extensiones: a mí me gustaría tener disponibles mi Makefile, los .C y los .CPP que utilizo constantemente.
Hoy editaremos a mano, una vez más, nuestro queridísimo .emacs (_emacs para los Windozes). Ahí va un ejemplo de hacer lo que he descrito:
Claro, que suele ser un fastidio tener todas las pestañitas ésas: scratch, Messages, ... Ahí va mi configuración:
(defun tabbar-buffer-groups (buffer)
"Return the list of group names BUFFER belongs to.
Return only one group for each buffer."
(with-current-buffer (get-buffer buffer)
(cond
((member (buffer-name) '("*scratch*")) '("Misc") )
((member (buffer-name) '("*Messages*")) '("Misc") )
((member (buffer-name) '("*Completions*")) '("Misc") )
((member (buffer-name) '("*Ediff Registry*")) '("Misc") )
((eq major-mode 'dired-mode) '("Main") )
((memq major-mode '(c-mode c++-mode makefile-mode)) '("Coding") )
(t '("Main") )
)
)
)
Como podéis ver, tengo 3 grupos principales: Misc, Coding y Main. Por defecto lo mete todo en "Main", salvo los ficheros de c, c++ y Makefiles que son "Coding", y los buffers habituales van a "Misc".
Con esta base y un poco de imaginación, se pueden hacer muchas cosas muy apañadas...
Bueno... Podéis observar que he roto lo habitual de escribir cada semana. A parte de que estoy muy liado, ¡se me están acabando las ideas!.
David ha proporcionado unos cuantos TES y Brue también ha puesto su granito de arena. Si alguien más participa, ¡estupendo! pero, por mi parte, se acaban los TES.
De todas maneras, podéis poner vuestros trucos y marcarlos como "emacs" en la pestaña "Tema". Siempre son bienvenidos ;)
Bogofilter es un filtro antispam que es muy sencillo de combinar con sylpheed y otros clientes de correo. El paquete bogoutils nos permite acceder a las estadísticas y opciones de la base de datos de bogofilter para obtener información adicional. Aquí se muestran algunas de las opciones
Ingredientes
Evidentemente, nos hará falta bogofilter (que ya incluye bogoutil), algún cliente de correo configurado con bogofilter y varias semanas de filtrado de spam.
Notas y cosas
Una nota aclaratoria para todos los ejemplos que se vean en este artículo: He reutilizado la base de datos que tuve hace tiempo, donde no filtré correctamente todos los mailes que me llegaron. Eso ha repercutido en algunas de las estadísticas que mostraré a continuación (como por ejemplo, en la cantidad de mailes que muestran como ham algunas de las palabras, cuando son claramente spam).
Otra cosa: las estadísticas que se muestran aquí sólo son de 3 meses, por lo que no se pueden generalizar (harían falta años para eso).
Ham vs. Spam
Como nota aclaratoria, diré que siempre que me refiera a "Ham" (jamón) me referiré a los mails deseados, mientras que "Spam" (la historia tiene algo que ver con una marca que hacía "Ham" malo) hace referencia a todo mail no deseado.
Cómo funciona
Bogofilter es un filtro bayesiano. Ni idea de qué significa eso, pero por lo que he podido ir observando, utiliza un sistema para puntuar cada palabra, y después calcula algún tipo de media con respecto a las palabras que hay (o algo así). Por ello, cada palabra recibe una puntuación. Este articulillo hará referencia a estas puntuaciones.
Histórico
¿No sentís curiosidad por saber si realmente se puede decidir si un mail es bueno o no por un conjunto de palabras? ¿No encontraremos palabras que son Ham y Spam al mismo tiempo? ¿Será eso lo corriente?
Bueno, pues la manera de saberlo es simple:
Resulta curioso observar que el 61.20% de las palabras que recibo sólo se encuentran en correos Ham, y que el 27.24% sólo están en correos Spam. Así que se puede observar que es cierto que hay palabras que, directamente, deciden cuándo un correo es Spam.
Fijaros que las concentraciones principales están en los extremos y el centro. Es lógico: los conectores (preposiciones, artículos, pronombres, ...) no serán decisorios.
¿Qué probabilidad hay de que "Sexo", "sex", "viagra", "ordenador" estén entre el spam
$bogoutil -p ~/.bogofilter/wordlist.db
spam good Fisher
sexo
sexo 3 3 0.558117
sex
sex 25 0 0.999658
viagra
viagra 2 3 0.457457
ordenador
ordenador 21 48 0.356059
En cuanto introduzcáis la orden arriba citada, el cursor se quedará esperando que tecleéis las palabras a buscar o bien que pulséis CTRL+D para salir.
Observando las estadísticas de arriba se observa que 3 buenos y 3 malos no son un 50%... Bueno, dije que bogofilter hacía "algún tipo de media", no la media aritmética :-D
Despedida
He escrito esto porque me parece curioso, no excesivamente útil. De todas maneras, permite comprobar que nuestro filtro bogofilter está funcionando realmente (y si no lo creéis, probad a mirar las posibilidades de una palabra y después marcad como spam un mail que la contenga).
Espero que a alguien más también le parezca algo en lo que perder un ratejo ;)
A menudo se nos abren muchos Emacs cuando sólo queremos tener uno, y se termina haciendo inusable. Si ya tenemos pestañas con el paquete tabbar, ¿para qué queremos tener varios emacs abiertos?
Ingredientes
Emacs ya trae los ingredientes que nos hacen falta hoy.
Servidor
Vamos a comenzar por la manera fácil: abrimos un Emacs y lanzamos la orden siguiente:
M-x server-start
Ya hemos arrancado un servidor en Emacs. También podemos ponerlo en nuestro .emacs haciendo que se arranque automáticamente mediante:
(server-start)
Cliente
Si tenemos un servidor es porque vamos a tener un cliente, como es lógico. En este caso se llamará emacsclient. En lugar de editar con "emacs", lo haremos con "emacsclient" y arreglado.
Cliente-Servidor todo en uno
Es un rollo eso de tener que decidir si vamos a utilizar emacs o emacsclient... ¡Yo sólo quiero un editor! Además el nombre de "emacsclient" es demasiado largo...
Vamos a probar a hacer lo siguiente: Primero cerramos todos los emacs que tengamos abiertos, y después lanzamos las órdenes siguientes (espero que hayáis puesto el (server-start) en vuestro .emacs):
¡La primera vez se ha abierto un Emacs y la segunda se ha reutilizado! Esto va mejorando, ¿no?
Por cierto.. el -n es equivalente a --no-wait, para que no se quede pillao esperando a que cerréis el buffer y se os devuelva el control.
Más fácil. Más rápido
Ahora nos enfrentamos a una línea de órdenes atroz e insufriblemente larga que no vamos a volver a teclear en la vida. No problem. Siempre podemos hacernos un alias en nuestro .bashrc:
alias emacs=emacsclient -n -a /usr/bin/emacs
Existen otras dos formas que no he probado. La primera es utilizar la variable de entorno ALTERNATE_EDITOR y lanzar emacsclient todas las veces. La segunda está en un fichero que no sé cómo funciona llamado /etc/emacs.bash .
Estaba harto de encontrarme ficheros ~, ## y .semantic por todas partes, y puede llegar a ser muy aburrido borrarlos periódicamente. ¡Tiene que haber alguna manera de optimizar esto! Y, efectivamente...
Ingredientes
Pues el Emacs. No más.
backups
Hoy vamos a tocar a saco el .emacs (recordad que en Windón es _emacs).
Para empezar, veamos los backups, es decir, los ficheros ~. Éstos se crean como medida de recuperación ante fallos. Hay gente a la que le gustaría que no existieran. Hay gente que quiere más backups.
Existe una variable llamada version-control que nos permite crear ficheros loquesea~1~ de tal manera que podamos tener más de 1 backup. Sus valores son t para que se hagan; nil para que no se hagan y t never que es lo mismo pero así, como con más énfasis: ¡que no pongas versiones!. Yo me quedo con una única versión, así que tengo:
(setq version-control t never)
Por si acaso, le digo también que me borre las versiones viejas:
(setq delete-old-versions t)
Situar ficheros
Vale, ahora ya se hacen los backups que yo quiero... Pero sigo teniendo los *~, #*# y *.semantic por todas partes:
La primera instrucción indica dónde quiero que me deje los ~ y la segunda, dónde los .semantic. Es MUY IMPORTANTE que estos directorios existan. Además, hago que comiencen por punto, para que así existan, pero yo no los veo ;)
La segunda de las instrucciones indica dónde debe dejar los .semantic, como es evidente.
Y con esto tengo los directorios limpitos de basura (vamos, con la justa ;D )
A veces es un poco aburrido encontrarse con 20 Emacs diferentes abiertos, sobre todo cuando activamos la opción tabbar. Bien, pues hay una manera de hacer que se reutilice siempre el mismo...
libxml2 es una librería que facilita el manejo de los XMLs. La librería permite el acceso tanto para lectura como para escritura. Si dispones de DTD, también trae funciones para su uso.
A menudo hay cosas que hacen de un editor algo más bonito: iluminar la línea actual, cambiar el color de fondo, algún iconillo... Pues Emacs no iba a ser menos, claro.
Un IDE para unirlos a todos. Muy útil para C, C++, Java, ... Consiste en un conjunto de ventanas que nos permiten acceder directamente a código.
Ingredientes
Emacs, por supuesto, y el paquete ecb.
Activación
Escribiremos una orden Emacs. Para ello podemos pulsar ESC+x o bien M+x (que es, realmente, lo mismo) y después escribir:
M-x ecb-activate
Y veremos las pantallitas nuevas.
Más bonito
Existen distintos tipos de ventanas. Podemos cambiar entre ellos en "Options"->"Customize Emacs"->"Specific Option"->"ecb-layout-name". Si miráis abajo veréis todas las posibilidades. A mí me gusta "top1", aunque podéis ir probando...
Más rápido
A menudo es un rollo tener que estar activándolo y desactivándolo. Por ello me gusta tener accesos de teclado para estos menesteres. Para ello sólo hay que editar nuestro .emacs (al final, por ejemplo):
; Mis atajos de teclado
(global-set-key [f12] 'ecb-toggle-ecb-windows)
(global-set-key [C-f12] 'ecb-activate)
(global-set-key [M-f12] 'ecb-deactivate)
Las teclas que seleccionéis son opcionales. Con éstas podréis:
f12 Me permite mostrar/ocultar las ventanas cuando el modo ecb está activo.
C-f12 Me permite cargar el modo ECB sólo cuando yo quiero (así Emacs es más rápido en general).
M-f12 Sirve para descargar el modo ECB cuando me arrepiento (suelen ser pocas veces).
Con el epígrafe "TES" comenzaré una serie de articulillos sobre emacs. Se corresponden con las siglas "Truco Emacs de la Semana". Procuraré escribirlo todos los lunes, pero no aseguro nada. En esta ocasión, os explicaré cómo activar las pestañas (tabbar).
A menudo es necesario comparar ficheros. Existen numerosos programas; pero me encuentro con que cada uno de ellos tiene un problema que hace que no me solucione la vida en todas las ocasiones. Se me ha ocurrido comentarlo aquí para ver si entre todos podemos aportar ideas.
DIFF
Paquete Debian.
Interfaz: ascii. No es interactivo.
Repositorios: No.
Compara binarios: Sí (-a)
Máximo ficheros: 2
Hexadecimal: No?
Ebcdic: no
Licencia: GPL
Permite edición: No
Automatizable: Sí
Genera patches: Sí
MELD
Paquete Debian.
Interfaz: GTK
Repositorios: CVS/SVN (limitado)
Compara binarios: No
Máximo ficheros: 3
Hexadecimal: no
Ebcdic: no
Licencia: GPL
Permite edición: Sí
Automatizable: No
Genera patches: No?
VBINDIFF
Paquete Debian.
Interfaz: ascii
Repositorios: no.
Compara binarios: Sí
Máximo ficheros: 2
Hexadecimal: Sí
Ebcdic: sí
Licencia:GPL
Permite edición: No
Automatizable: No
Genera patches: No?
Bugs: da problemas con más de 4Gb
Tabla comparativa
.deb
Ifaz
Repos
Bin
Max Fich
Hex
EBCDIC
Licencia
Edit
Auto
Patch
Comentarios
DIFF
sí
ascii
no
sí (-a)
2
no?
no
GPL
no
sí
sí
MELD
sí
GTK
CVS/SVN
no
3
no
no
GPL
sí
no
no
VBINDIFF
sí
ascii
no
si
2
sí
sí
GPL
no
no
no?
Puede dar problemas con más de 4 Gb.
(aquí me falta una leyenda de lo que he puesto en la tablica)
Otras notas
Se agradece vuestra colaboración, aportando nuevos comparadores así como otras características por la que compararlos entre sí (qué paradoja ;)).
Poco a poco los iré añadiendo al artículo. En cuanto pueda haré una tablita comparativa.
Enlace
Hace ya algún tiempo que comencé esta receta... y hoy me encuentro esto en la wikipedia, que no deja de sorprenderme.
Ale, el trabajo ya estaba hecho ;)
¿Se os olvidan los cumpleaños de vuestros amigos? ¿No recordáis cuándo son las fiestas? ¡En 5 minutos podéis solucionarlo!
Material
Necesitaremos instalar el paquete birthday en la máquina que más habitualmente utilicemos:
#apt-get install birthday
Configuración
Editaremos un fichero que no existe aún: ~/.birthdays. Yo recomiendo crear una carpeta (por ejemplo ~/.birthday) donde organizar un poco mejor todos los cumpleaños y eventos. Luego comentaré cómo lo tengo yo configurado.
El formato de este fichero es lo mejor: sencillo. consiste en poner lo que quieras, un igual (=) y la fecha en formato dd/mm, dd/mm/yy o bien dd/mm/yyyy. Ya está. Acordaros de pulsar un intro al final o se os comerá la última de las letras :-D. Ejemplito:
Pepito=15/12/1978
Fulanito=01/09/1977
Cuando hayáis metido 2 ó 3 (que sucendan en las próximas 3 semanas, por favor), probad a ejecutar
$birthday
Os mostrará los eventos de las próximas 3 semanas.
Mi configuración
Dado que el ficherito ~/birthdays te permite incluir ficheros, el mío sólo contiene inclusiones. Las fechas se encuentran en varios ficheros dentro del directorio ~/birthday, donde tengo los ficheros "amigos", "familia" y "fiestas" (éste último os lo podéis bajar más abajo).
¿Y cómo hago para que no sea muy pesado pero me avise antes de que ocurran las cosas? Pues metiéndolo en mi .bashrc. De esa manera, cada vez que abro una consola me aparecen 3 ó 4 líneas con los próximos eventos :-D.
Comentarios
Vaaaale, sí. Ya sé que este truco no os va a salvar la vida y que posiblemente no os importe un carajo, ¿pero cuántos de vosotros conocíais este paquetito?
El caso es que me he picao y ya he comenzado a hacer un programita similar, con idiomas, compatible pero ampliable. En python, por supuesto. Le meteré alguna opción para colorines y esas cosas.
Desde hace algún tiempo (acabo de descubrir que muy posiblemente desde GNOME 2.14), el terminal de GNOME me muestra las tildes, eñes y otros caracteres como caritas. Aunque al principio resulta gracioso, terminas cansándote :-D. Aquí lo arreglaremos de la manera más sencilla.
Arreglarlo
Para arreglarlo basta con editar el fichero ~/.dmrc y añadir al final la línea Language=es_ES.iso88591. Si lo preferís, basta con ejecutar lo siguiente:
$echo"Language=es_ES.iso88591">> .dmrc
¿Qué estaba pasando?
Lo que pasa es que en los GNOMEs anteriores se tomaban las locales del sistema, pero parece que en las últimas no lo hace muy bien. Por ello, al fallar la carga, tomaba las locales por defecto, es decir, ANSI_X3.4-1968 que no tiene tildes y demás.
Yo sabía que se podía cambiar en el menú del gnome-terminal, en "terminal"->"Establecer codificación de caracteres", pero es un rollo tener que hacerlo para cada pestaña del gnome-términal. Así, sólo lo hacía cuando tenía que leer algo un poco grande :-D
Editando el fichero .dmrc le decimos a GDM cuál es el "encoding" que queremos utilizar, puediendo elegir entre los que configuramos con el paquete locales. Para cambiar los "encodings" compilados en "locales", se hace así (los chicos de UBUNTU no sé cómo leches lo hace, pero en Debian se hace así):
#dpkg-reconfigure locales
Y para saber cuáles son los disponibles (qué cadenitas poner en "Language=XXXXXXX"), basta con hacer:
$locale -a
Enlaces
Llevo buscando bastante tiempo, y al final lo encontré en el blog de David Pashley. Este documento es, básicamente, una transcripción de lo que se comenta en el enlace.
Desde hace bastante tiempo estoy tratando de iniciarme en el Proceso de Software Personal. Estuve leyendo un libro bastante pesadete sobre este tema y, aunque me motivó bastante, no conseguí llevarlo a cabo. Parece que he encontrado un nuevo libro que me ha facilitado el paso. Trataré de escribir aquí mis conclusiones y facilidades para seguirlo.
Cuando he abierto mi aptitude en UBUNTU para actualizarme y he visto los paquetes nuevos que han metido en EDGY me he llevado una grata sorpresa al descubrir que el maintainer tenía una dirección @uclm.es.
Tengo un siemens, y me gusta hacer backups periódicos. La perioricidad es variable (cuando me quedo sin memoria para los mensajes), pero me gusta que sea sencillo. Aquí tienes un pequeño script que usa scmxx.
Qué necesitamos
Necesitamos un cable y un móvil soportado por scmxx. También necesitaremos scmxx, por supuesto.
El script
Sin más, ahí va:
#!/bin/bashDIR=`date +"%Y%m%d"`SCMXX_TTY=/dev/ttyUSB0
MEMS="FD SM ON LD MC RC OW SD MS CD BL RD CS VCF"mkdir$DIR
scmxx --get--pbook--sms--slot=all --out=$DIR/sms.p
for i in$MEMS;do
scmxx --get--pbook--mem=$i--out=$DIR/$i.p ;done
Configurar el script
Como podéis ver, el script crea un directorio con la fecha actual, dentro de la que meterá un montón de ficheritos terminados en .p. Éstos tendrán el contenido de cada una de las memorias.
Pero... ¿Cómo sabemos qué memorias debemos consultar? Es fácil: basta con hacer:
$scmxx --info
En caso de que no encuentre nuestro móvil, el problema está en el puerto donde lo conectamos. Por ello, recomiendo que establezcamos la variable de entorno SCMXX_TTY. Como en mi caso está en el USB, el valor de esta variable debe ser /dev/ttyUSB0. Se puede indicar en línea de órdenes, pero me falla bastante.
Poco más que decir. Existe un GUI para scmxx (gscmxx) pero es "más malo" que un dolor de muelas (por el momento).
A menudo nos encontramos con noticias del tipo "hoy se acaba el mundo", debido a diferentes motivos sumamente importantes como que la fecha es el 1999-12-31, un eclipse lunar o a que ayer nos cruzamos con un gato negro. En fin... Que resulta sorprendente que no haya ninguna noticia del fin del mundo para hoy, día 2006-06-06 :-D
Pues eso, chicos, que hoy es día 666.
¡Pasad un buen día!
Recientemente he perdido las fuentes de mi querido Emacs. Estaban ahí, y de repente sólo me aparecían cuadritos de colores (muy monos, eso sí, de colores y todo). Sin embargo, por fin, he encontrado una solución, aunque sea temporal.
Solución provisional
Qué fuentes tienes en el sistema
Lo primero es saber qué fuentes tienes en el sistema. Para ello basta ejecutar:
xlsfonts
Eso sí... preparaos para una salida laaaaarga.
Una fuente para Emacs
Ahora basta con decirle a Emacs la fuente que quieres. A mí me ha gustado una courier (se parecía bastante a la que tenía antes):
Como escribir esa parrafada cada vez es un rollo... pues vamos a hacerle un alias. Para ello editamos el fichero .bashrc y le añadimos la línea siguiente:
alias emacs="emacs -font -adobe-courier-medium-r-normal--14-140-75-75-m-90-iso10646-1"
Y conseguimos que Emacs se abra con esa fuente. No es lo mejor, pero funciona.
Ciertas tareas dependen del tiempo para funcionar (por ejemplo, el salvapantallas, make, cron, …). Es interesante no tener que preocuparse de la hora del sistema, así como que la hora no cambie bruscamente. ¡Y es muy fácil!
Paquetes necesarios
Sólo necesitaremos un paquete: ntpdate. En nuestro sistema basado en Debian es tan sumamente complicado como de costumbre:
#apt-get install ntpdate
Explicación
En el mundo hay una serie de relojes de alta precisión (relojes atómicos) que son los que de verdad llevan la hora del mundo (¿u os pensábais que lo hacía el reloj de la Puerta del Sol? :P). Mediante fibra óptica, están conectados una serie de servidores de acceso restringido. A éstos, se les conectan una serie de servidores de acceso restringido… y así un par de niveles más, hasta que llegan los servidores públicos. Así hay muchos y no los sobrecargamos.
Cada vez que un host intenta sincronizarse lo que se hace es lanzar varias peticiones, calcular el tiempo de retardo existente debido a la red, tomar en cuenta varios factores y estimar la hora real. El error es mínimo (salvo algunas veces que casca todo el sistema y te pone la hora del día anterior, como me ha pasado hace un rato).
Así, groso modo -como mandan las recetas- es como funciona.
Tiempo lineal
Algunos programas pueden tener problemas con los saltos de tiempo misteriosos. Este es el caso del salvapantallas, por ejemplo: si lo tenemos puesto cada 10 minutos y adelantamos el reloj 1 hora, salta. Cron también puede tener problemas: si en nuestro PC de casa tenemos la tarea “salvar_el_mundo” programada para las 13:45 y a las 13:30 cambiamos la hora a las 14:30, la tarea no se ejecutará, con resultados desastrosos.
Por ello conviene que nuestro PC no se salte ni un minuto, ¿no creéis?
Pues hacerlo es tan sencillo como cambiar la configuración de ntpdate, que se encuentra en el fichero /etc/default/ntpdate, y añadirle a la línea “NTPOPTIONS” la opción “-B”. A mí me quedaría así:
# servers to check. (Separate multiple servers with spaces.)
NTPSERVERS="pool.ntp.org"
#
# additional options for ntpdate
#NTPOPTIONS="-v"
NTPOPTIONS="-u -B"
Y, ahora, el mundo está a salvo (aunque en algunos casos nuestro PC puede tardar horas semanas en sincronizarse…) ;D
Lo que ocurre ahora es que los minutos de nuestro PC son más lentos/rápidos que los habituales, pero eso no significa que nos saltemos ni un segundo ;)
¿Usas Evolution y aún tienes Spam? ¿Quieres eliminarlo de una vez por todas? Bien... La verdad es que aún no lo he conseguido, pero estoy tras la pista. A ver si entre todos conseguimos quitarnos de enmedio el molesto spam.
Ante las preguntas realizadas por Oscar sobre el uso de GDB y problemas con el famoso "segmentation fault", me he decidido a hacer un pequeño manual de GDB y otras herramientas útiles para el depurado. Seguramente se me queden muchas cosas en el tintero, pero todos sabemos que las recetas no están cerradas cuando se publican. Se agradecerán todos los comentarios.
gdb
GDB o el GNU DeBugger, es el programa usado para depurar los programas en GNU/Linux. No es el único, pero sí uno de los más potentes, sobre todo para programas escritos en C y C++.
Para poder utilizar todas sus características, será necesario que, durante la compilación, dejemos información de depurado en el ejecutable. Si estamos utilizando gcc o cc, esto se hace mediante la opción -ggdb.
¡Ya tenemos nuestro fichero preparado para ser depurado! Ahora basta utilizar la orden:
$gdb ejecutable
y se nos abrirá la línea de órdenes de gdb (todo en modo texto, claro).
Hay que tener en cuenta una cosa: cuando un programa falla, puede deberse a un error o bien a los efectos colaterales de un error. Me explico con un ejemplo: si tenemos un puntero no inicializado y le asignamos un valor, puede que dé error o puede que no (depende de dónde esté apuntando); por ello puede dar el problema más adelante (esto se conoce como el "Síndrome del puntero loco" entre los coleguitas :-D).
Por ello, es interesante no pensar que gdb te dice "aquí está el problema", sino "el problema está por aquí", que es muy diferente.
Uso de GDB
gdb es bastante complejo, y sólo detallaré aquí los pasos iniciales para debugar el típico "hola mundo".
Primero, cargaremos el ejecutable compilado con las opciones de debug "-ggdb":
gdb ejecutable
Se nos inicia la línea de órdenes gdb. Lo primero, será poner un punto de ruptura ("Breakpoint"). Se puede poner en una línea determinada o bien en una función. Dado que nuestro programa "hola mundo" es pequeñín y no sabemos dónde pusimos el main, plantamos la ruptura en el propio main:
gdb>br main
Y lo siguiente es ejecutar el programa:
gdb>r
Así que se parará en la primera instrucción del main. Ahora podemos utilizar una serie de argumentos que explicaré brevemente:
p "print" imprime el valor de una variable.
d "display" igual que print, pero se muestran cada vez que pulsemos "s" o "n".
n "next" Continúa con la siguiente instrucción de la función actual
s "step" Continúa con la siguiente instrucción de la que se tiene información de depurado (si hay una llamada a función, entrará dentro).
c "continue" continúa la ejecución del programa.
h "help" muestra la ayuda
GNU/Emacs
GDB sólo es muy poco amigable, así que yo prefiero utilizarlo junto con GNU/Emacs. Gano dos cosas, principalmente: ver el código y coloreado del mismo.
Para ello, basta con pulsa ESC+x (o M+x) y escribir la orden "gdb". Emacs nos pedirá el resto de la línea de órdenes, donde pondremos el nombre del ejecutable y del core (si es que existe). Cuando lo tengamos, nos aparecerá una pantalla tipo terminal igual que si hubiéramos iniciado gdb en una consola, pero cuando comencemos a trazar el código se nos dividirá la pantalla en dos, mostrando en el otro lado el código (con una flechita muy molona que nos cuenta por dónde vamos).
ddd
Aunque muchas veces uso Emacs con gdb, debo admitir que mi favorito es ddd. Su instalación es realmente compleja:
#apt-get install ddd
Seguro que los de Windows lo tienen más fácil. Bien. El caso es que la pantalla se divide en tres partes (si no es así mira las opciones del menú "View") en las que tenemos, de arriba abajo: datos, código y terminal gdb. Precioso. Si cargamos un programa con opciones de debug ("-ggdb") podremos ver cómo se mueven los punteritos, cómo cambian las direcciones a las que apuntan, cómo se construyen las estructuras, ... Vamos, muchas cosas que nos cuentan pero no se ven ;)
Y, a parte de los menús TK pseudo-molones, siempre tenemos la parte de abajo con un gdm normal.
NOTA He observado un comportamiento extraño al pulsar con el ratón en la zona de datos o en la de GDB, ya que toma las teclas que pulses como entradas de la pantalla GDB, pero no funcionará el intro. Sin embargo, si pulsas directamente sobre la ventana de código, te funciona todo igual y el intro sí va. No me preguntéis porqué es así, pero ocurre. Seguramente esto sea así porque lo tenéis configurado de esta manera. Para solucionarlo, tenéis que ir a "Edit"->"Preferences", y en la pestaña "Startup" veréis que pone "Keyboard focus a)Point to Type b) Click to Type". Os podéis imaginar: seleccionáis si queréis que el foco se obtenga cuando el puntero del ratón está justo encima (bastante molesto) o os hace falta hacer click para dar el foco (molesto, pero no tanto).
COREs
Una gran ayuda frente a los "segmentation faults" son los archivos COREs. Te preguntarás dónde andan, claro :-D pues no andan por ningún sitio porque los tienes desactivados. Para activarlos, sólo tienes que hacer:
$ulimit-c unlimited
Cuando vuelvas a ejecutar el programa te pondrá "segmentation fault (core dumped)". Genial. Ahora ejecuta gdb de la siguiente manera:
$gdb ejecutable core
y puedes ver dónde cascó exactamente con la orden de gdb "whereis", que te mostrará la pila. Acuérdate de volver a quitar el límite de los cores o te ocuparán espacio en el disco duro (y no poco):
A ver... que estamos muy paradetes...
El problema consiste en hacer un programa C que permita conocer el endian de la máquina en que se ejecuta.
Fácil, fácil, ¿eh?
¿Sabríais hacerlo en otros lenguajes (Java, por ejemplo)?
A menudo se piensa que una aplicación estaría mucho mejor si se encontrara en varios idiomas. Podemos pensar en distintas formas de soportar esto, pero otros ya lo han pensado por nosotros y han creado las fabulosas herramientas gettext. Este documento pretende ser una guía para el uso rápido (rápido de verdad) de estas herramientas.
Ingredientes
gettext
Modificaciones en el código
Lo primero es acordarse de evitar cadenas sin más (al menos las que se muestran) en nuestro código. Ahora importaremos la librería gettext y utilizaremos la función gettext. Se encuentra disponible para numerosos lenguajes, aunque aquí se explicará con ejemplos en python (las diferencias serán mínimas en el resto de lenguajes).
No os asustéis: Las funciones “textdomain” y “bindtextdomain” sirven para decirle a gettext dónde se encuentran las traducciones. Aquí se está poniendo un ejemplo, así que sustituid “programita” por el nombre de vuestro programa, y “./mo” por el directorio donde vamos a meter las traducciones.
A menudo, además, se suele importar la función gettext cambiándole el nombre a algo más sencillo como la barra baja. De esta manera, nos evitamos tener que escribir “gettext.gettext” cada vez. Para hacer esto hay distintas maneras, una de ellas es durante la importación:
fromgettextimportgettextas_
Generación de la plantilla de traducción (.pot)
Podemos obtener la plantilla del código en casi cualquier lenguaje: C, C++, Python, Perl, Glade, Java, … Y se hace así:
$xgettext --language=Python -j programita.py
Las opciones son: —language indicando el lenguaje del código, y -j que indica que, si hay ya un .pot existente, se deben mezclar los mensajes.
Si hemos usado algún cambio y no aparece la función como “gettext”, será necesario usar también la opción —keyword. Por ejemplo:
$xgettext --language=Python -j-k _ programita.py
Ale, ya tenemos el messages.pot.
Generar el fichero de traducciones (*.po)
Ahora se utiliza el messages.pot para generar cada plantilla. Nosotros queremos la traducción al castellano, así que será es.po:
$msginit -i messages.pot -o es.po
Ahora viene la parte en la que editamos el fichero es.po (yo suelo usar gtranslator o kbabel) y demás.
Mezclar el fichero de traducciones (.po) con una nueva plantilla (.pot)
Este sistema sería poco eficiente si tuviéramos que traducirlo todo de nuevo cada vez que se cambie el fuente. Por ello, hay un sistema por el que se mezcla el fichero ya traducido con la plantilla nueva (es decir: volvemos al paso de creación de plantilla y después ejecutamos esto):
$msgmerge -U es.po messages.pot
Y, nuevamente, volvemos a traducir :-D
Creación del fichero de equivalencias (.mo)
Realmente, el ficherito .po no se utiliza en el ejecutable. Es necesario utilizar un ficherito .mo. Aquí crearemos nuestro es.mo, como es lógico:
$msgfmt es.po mo/es/LC_MESSAGES/programita.mo
Como podéis observar, el resultado lo dejamos en mo/es/LC_MESSAGES/. Eso lo hacemos así porque en el código fuente dijimos que las traducciones colgarían del directorio mo, el idioma es Español (las locales son “es”), y porque todos los .mo deben colgar de un directorio LC_MESSAGES dentro de las locales para que sea encontrado correctamente.
Utilización
Ya está. No hay nada más que contar. Si las locales son “es”, escribirá nuestra traducción, y si son “en”, lo escribirá en inglés. Eso es todo.
Ejemplo
Veamos un ejemplo, sugerencia hecha por david.villa:
Editamos el archivo es.po que se nos habrá creado, traduciendo la única cadena. Mi archivo pinta así:
# Spanish translations for PACKAGE package.
# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# miguel <miguelangel.garcia@gmail.com>, 2010.
#
msgid""msgstr"""Project-Id-Version:PACKAGEVERSION\n""Report-Msgid-Bugs-To:\n""POT-Creation-Date:2010-05-2507:31+0200\n""PO-Revision-Date:2010-05-2507:32+0200\n""Last-Translator:miguel<miguelangel.garcia@gmail.com>\n""Language-Team:Spanish<>\n""MIME-Version:1.0\n""Content-Type:text/plain; charset=ASCII\n"
"Content-Transfer-Encoding:8bit\n""Plural-Forms:nplurals=2; plural=(n != 1);\n"
#: hello.py:12
msgid "hello, world!"msgstr"hola,mundo!"
Por ahora no nos fijaremos mucho en las cosa que deberíamos cambiar, como el PACKAGE y demás. Sólo nos queda compilar:
A menudo resulta interesante crear un paquete debian de un programa, para su sencilla instalación/desinstalación. Esta receta, inicialmente escrita por Fernando Rincón, explica cómo hacer lo básico en pocos pasos.
Generación de la estructura de directorios
En primer lugar debe crearse un directorio de trabajo (debian), a partir del cual se generará la estructura de directorios del paquete, considerando que el directorio de trabajo es el directorio raíz. A continuación se distribuirán los archivos que forman parte del paquete en los subdirectorios correspondientes.
Si se desea instalar el fichero mi_ejecutable en la ubicación /usr/bin/mi_ejecutable, la estructura del directorio de trabajo debería ser la siguiente:
./debian/usr/bin/mi_ejecutable
Generación de los ficheros de control
Hay varios tipos de ficheros de control. El fichero control propiamente dicho indica las características y dependencias del paquete. Los ficheros preinst, postinst, prerm y postrm son los scripts que se ejecutan durante la instalación, la actualización y el borrado de un paquete, para la configuración/desconfiguración de los programas incluidos en el paquete (Ver sección 6 de [3]).
Los ficheros de control deben almacenarse en la siguiente ubicación:
debian/DEBIAN
El fichero Control
Para la generación del paquete es imprescindible la creación de un fichero de control (también llamado control), en el que se indicará el nombre del paquete, la versión, la sección a la que pertenece, la prioridad de instalación, etc ... La descripción exacta del contenido de cada campo puede encontrarse en la sección 3 de [3].
Por ejemplo:
Package: linuxstatus
Version: 1.1-1
Section: base
Priority: optional
Architecture: all
Depends: bash (>= 2.05a-11), textutils (>= 2.0-12), awk, procps (>= \
1:2.0.7-8), sed (>= 3.02-8), grep (>= 2.4.2-3), coreutils (>= 5.0-5)
Maintainer: Chr. Clemens Lee
Description: Linux system information
This script provides a broad overview of different
system aspects.
Configuración mediante debconf
Debconf proporciona una base de datos con un frontend que facilita el proceso de configuración de un paquete recién instalado o actualizado. Se basa en el uso de una serie de reglas que definen las preguntas a realizar al usuario, y el tipo de valores que
Construcción del paquete
Desde el directorio inmediatamente superior al directorio de trabajo debian debe ejecutarse:
Mirando en la biblioteca de mi padre me he llevado una sorpresa mayúscula al encontrarme un libro sobre las leyes de Murphy. En el prefacio, te explica que han hecho recopilación de todas las que han encontrado (y se ve claramente que han buscado en google). El libro consiste en una lista interminable de frases relacionadas con la ley de Murphy, pero, en la primera página pone eso de "El contenido de este libro no podrá ser reproducido, ni total ni parcialmente, sin el previo permiso del editor". ¿Significa ésto que no puedo utilizar las frases que vienen dentro, aunque éstas no sean del autor del libro?
¿Nunca habéis deseado probar un programa de una distribución más inestable sabiendo que podéis volver atrás? ¿Nunca habéis tenido que recurrir a una versión anterior de ningún paquete? Pues existía una manera más fácil, y aquí os explico cómo.
Asunciones
Asumiremos que tenemos instalada una "unstable", pero queremos tener acceso a algunos paquetes de "experimental" y... bueno, ya que nos ponemos, también de "stable" y "testing", pero con menor prioridad.
Configurar la "release" por defecto
Editáis el fichero (si no existe lo creáis) /etc/apt/apt.conf y añadís la línea:
APT::Default-Release "unstable";
Configurar las otras distros
APT ya sabe cuál es la distro que queremos tener instalada, pero hay que decirle que existe más mundo. Para ello se utiliza el fichero /etc/apt/preferences:
NOTA: No, aún no lo he probado.
Debo advertir que las prioridades son bastante curiosas y hay que tener cuidadín:
< 0: La versión no se instalará jamás.
0 - 100: El paquete no se reemplazará por una versión superior. Los paquetes instalados tienen prioridad 100.
101-500: La versión se instala si es más moderna que la existente y no existe ningún ejemplar en la versión objetivo.
501-1000: La versión se instala aunque no esté en la distro por defecto.
1000: La versión se instalará a toda costa, incluso si es inferior a la actual.
Típicamente se utilizan los valores -1, 100, 500, 900 y 1001.
Lo de bloquear Ubuntu no es por mala leche: a menudo suele dar problemas mezclar paquetes. Cada uno que haga lo que quiera.
Editar sources.list
Claro, nos falta editar el sources.list y añadir todos los repositorios que nos dé la gana. Ya sabemos que no se va a instalar nada "extraño" (siempre que no metáis repositorios "extraños").
Cómo usarlo
Muy fácil: Para los paquetes de la distribución por defecto, como siempre:
apt-get install lo-que-sea
Para el resto, también fácil (donde pongo "experimental" poner el nombre de la distro):
apt-get install -t experimental lo-que-sea
Todos ellos se "updatean" a la vez por el método habitual.
Otras referencias
Me disponía a escribir esta receta basándome en un ejemplo que tenía por algún lado. No he encontrado el ejemplo, pero sí un documento titulado Jugando con APT, que explica cómo hacer lo mismo para Ubuntu.
También están interesantes el Manual de APT y un documentillo que he encontrado titulado Using APT with more than 2 sources, este último en inglés, claro.
Llevo utilizando ordenadores casi toda mi vida, y a veces me parece increíble que aún se sigan cometiendo fallos de usabilidad tan simples. Se me ha ocurrido que puede ser buena idea exponerlos aquí. Por ello, he creado una lista con los primeros que se me han ocurrido; la intención es hacer crecer esta lista con aquéllos que pongáis en los comentarios y con los nuevos que me vaya encontrando.
Las X-Windows de los sistemas Unix tienen una arquitectura cliente-servidor. Aunque lo habitual es que los programas que vemos se ejecuten en nuestra máquina, es perfectamente posible abrir una sesión X en una máquina distinta mediante XDMCP
Configuración
Edita el fichero /etc/gdm/gdm_conf de la máquina que ejecuta el servidor X.
Busca la sección [xdmcp], y activa la opción enable=true.
Es muy recomendable dejar la opción: AllowRemoteRoot=false para evitar problemas de seguridad.
Esto es válido si se usa gdm como gestor de conexión. Si usas kdm o xdm la configuración puede variar.
Ahora busca la sección [server-Standard] y edita la opción command para que NO incluya el argumento -nolisten tcp. Quedará algo como:
command=/usr/X11R6/bin/X -deferglyphs 16 -audit 0
Conexión
Para conectar, bastará con escribir en la consola:
El 0.1 indica el display y el screen. Normalmente variará entre 0.0, 1.0, 2.0 y 3.0, y se podrá acceder, respectivamente, con F7, F8, F9 y F10.
Varias sesiones X en la misma máquina
Puede ser interesante tener una o varias sesiones X adicionales en la máquina local. Por ejemplo, con:
$xinit -- :1
se abre un segundo cliente X (en F8) que ejecuta únicamente un x-terminal, pero sin gestor de ventanas ni de escritorio.
Sesión X anidada
Si en lugar de utilizar el comando X usa Xnest consigue el mismo efecto que en los ejemplos anteriores, pero en lugar de tener un terminal gráfico a pantalla completa obtiene una ventana del tamaño adecuado.
El documento pretende ser un manual "paso a paso" que permita configurar un proyecto Java con Eclipse. Se utilizará Eclipse 3.1 y el proyecto creado será un "tomcat project".
¿Tanto cuesta buscar un portátil?
Pues sí. Sobre todo si lo que buscas es tan específico como lo que busco yo.
¿Qué le pedirías a un portátil? Bien... Pues aquí os dejo lo que YO le pido a un portátil:
Peso. Para mí lo más importante es el peso. No quiero un portátil que pese 3 Kg.
Batería. Esto no consigo verlo en ninguna oferta: ¿Cuál es su tamaño? ¿Y su peso? ¿De qué me sirve un portátil de 1,1 Kg si su batería va a pesar otro 1.1 Kg, o bien es más grande que el propio portátil? También es importante la duración: ¿4 horas? ¿Más?
RAM. Ya que me pongo... 1Gb.
Disco duro. Con 60Gb me conformo.
Precio. En principio, debería ser lo más importante, pero como no hay manera de encontrar todo lo anterior, he decidido bajarlo en el "ranking".
Grabadora de DVD. Hay que amortizar el cánon.
Pantalla. Luego dirán que el tamaño no importa...
Microprocesador. Sí, bueno... Habrá que mirarlo. Sobre todo por la tecnología: los céleron ni en pintura. La velocidad te puede dar una idea del tiempo que llevan en el mercado, pero no creo que sea algo determinante: cualquier portátil hoy día te da potencia de sobra (A no ser que quieras jugar al Doom 3, claro).
Puertos y otras tonterías. Total, hoy en día todos los portátiles te traen 20.000 puertos, wifi, módem, cafetera, altavoces, microondas, refrigerador, ...
¿Se me olvida algo? Supongo que cada uno tiene sus preferencias. Las mías son muy claras: quiero un portátil portable, no un portátil de sobremesa. Quiero algo que pueda mover sin necesitar una carretilla o un coche.
Aun así, ¿Cambiaríais algo?
--
Amortiza el cánon siendo legal: copia música y películas.
Soy el primero que debería aprender lo que voy a poner en este blog. Es importante aprender a escribir correctamente en la web, y donde digo web, quiero decir foros, blogs, mail, ... . No vale todo, como solemos pensar. ¡Intentémoslo!
Porque también hay amantes del software libre a los que les gusta comer bien, igual que puedes escribir recetas informáticas, puedes escribir recetas de cocina (¿o era al revés?). Este documento trata de establecer unas pautas que permitan dos cosas: que no se nos olvide poner nada y que todos tengan un estilo similar.
Apartados
El título va fuera del área de texto. Debe ser claro y conciso: "Macarrones boloñesa de Luis"
Los apartados que debe tener son los siguientes:
Ficha
Tiempo requerido: Aproximado, claro. "45 minutos".
Dificultad: Novato, Experto, etc
Coste: La pela es la pela. Aproximado. "Unos 5 euros".
Comensales: Para cuántas personas está pensada la receta.
Ingredientes: Lista con los ingredientes necesarios.
Preparación: Pasos a realizar indicando tiempos de cocción y cosas por el estilo. Cuanto más precisa mejor. Evitar las generalidades como "un poco", "una pizca". Se trata de hacer recetas para los que no tenemos ni idea. Ejemplo: "un poco de sal, pégale un pellizco al salero y lo que se te quede entre los dedos".
Comentarios: Aquí podéis contar lo que queráis: "con esta receta ligué con mi novia", "ideal para cuando llegas de resaca", "muy útil para quedar bien". También se admiten anécdotas.
Estilo
Como se trata de que sea todo muy sencillito, símplemente poned los apartados como títulos ("h1"), los ingredientes como una lista no ordenada("ul") y los puntos de la preparación como párrafos. Los comentarios quedan completamente a vuestra disposición.
Con esto ya deberías tener funcionando la ATI con un solo monitor. Para comprobar si el 3d te rula, ya sabes:
#glxinfo | grep direct
direct rendering: Yes
Antes de hacer esto, he probado con el instalador de la ATI (bajandolo de su página web) y no rula.
Doble monitor
Para el doble monitor:
#aticonfig --initial=dual-head
Con el xorg.conf que te genera, tienes dos escritorios distintos en cada monitor, puedes cambiar iconos de uno a otro pero no cambiar aplicaciones entre ellos. Si quieres verlo todo como un único monitor debes habilitar la opción Xinerama dentro del ServerLayout del xorg.conf:
Esta receta es una introducción al uso de los programas libres dynamips y dynagen que nos permiten emular Cisco IOS. Las posibilidades son infinitas, aqui damos los pasos para poder empezar a trabajar de una forma básica.
Si alguna vez has querido aprender a configurar redes seguramente te has encontrado con un problema para encontrar entornos reales que te permitan aprender los comandos y configuraciones que se necesitan para echar a andar una red real.
Entre los equipos de mayor calidad nos podemos encontrar la gama de routers Cisco. Tener acceso a routers cisco para prácticar es díficil y caro. Afortunadamente existen dos programas que nos pueden simplificar la vida extraordinariamente. Dynamips y Dynagen son dos programas que te permiten configurar una red medianamente compleja y configurar cada uno de los routers presentes en dicha red mediante un emulador que carga una imagen real del sistema operativo de Cisco IOS, es decir, exactamente el mismo sistema operativo que se ejecuta en los equipos reales.
Las ventajas se ven de forma clara, la imagen que carga el dynamips es exactamente la misma que se ejecuta en un router real por lo que el realismo va mucho mas allá del que puedes conseguir con programas como el PacketTracer. PacketTracer es un programa (la licencia no es libre) que te permite modelar redes y configurarlas.
Instalación
Bueno, al tema, los programas dynamips y dynagen son paquetitos debian, asi que, simplemente, apt-get install dynamips y apt-get install dynagen.
En realidad el programa de emulación es dynamips que puede emular los modelos de routers 7200/3600/3725/3745/2600/1700 mientras que dynagen es un front-end basado en texto que te permite crear redes virtuales y trabajar con ellas.
Estos programas han sido creados para prácticar con la configuración de los routers pensando en las certificaciones CCNA/CCNP/CCIE.
Emulando redes virtuales
Una vez instalados, empezar a trabajar con ellos es sumamente sencillo, arrancas dynamips con las opciones que necesites, por ejemplo, en nuestro caso le indicamos que el puerto va a ser el 7200 :
#dynamips -H 7200
Cisco Router Simulation Platform (version 0.2.8-RC2-x86)
Copyright (c) 2005-2007 Christophe Fillot.
Build date: Oct 17 2007 06:50:15
ILT: loaded table "mips64j" from cache.
ILT: loaded table "mips64e" from cache.
ILT: loaded table "ppc32j" from cache.
ILT: loaded table "ppc32e" from cache.
Hypervisor TCP control server started (port 7200).
A ese puerto se conectará dynagen para pasarle los parámetros de configuración de la simulación.
A continuación arrancamos dynagen indicandole el escenario que queremos crear. El paquete debian tiene unos cuantos ejemplos, veamos uno sencillito creado por nosotros:
La primera sección [ [ 7200 ] ] nos indica la configuración general de los routers, hay muchos parámetros pero el mas importante y que no puede faltar es la imagen, este parámetro determina la imagen del sistema operativo IOS que debe cargar. Aqui hay un problema, el sistema operativo Cisco IOS es privativo por lo que debemos obtener una imagen de algún sitio autorizado. Y aviso a navegantes YO NO PUEDODISTRIBUIRCISCOIOS por lo que tendrás que conseguirla por tus propios medios. (ACTUALIZACIÓN: Parece que hay gente que puede distribuirlas, mira al final de esta receta).
A continuación se definen dos routers [[ROUTER R1]] y [[ROUTER R2]] ambos con
el modelo 7200 (que debe coincidir con la imagen de sistema operativo que cargamos), el atributo model proporciona el modelo de router (7200 en nuestro caso) mientras que tambien debemos especificar las conexiones:
s1/0 = R2 S1/0
Esta sentencia nos indica que la linea serial del router R1 la conectamos a la linea serial S1/0 del router R2.
Si arrancamos el dynagen pasándole como argumento este archivo, que llamaremos simple.net, obtenemos una consola de texto:
La cantidad de opciones y configuraciones posibles son infinitas, lo mas básico para empezar a trabajar es observar los dispositivos que existen en la red con el comando list:
=>list
Name Type State Server Console
R1 7200 stopped localhost:7200 2000
R2 7200 stopped localhost:7200 2001
=>
Arrancar los routers:
=>start /all
Warining: Starting R1 with no idle-pc value
100-VM 'R1' started
Warining: Starting R2 with no idle-pc value
100-VM 'R2' started
y obtener una consola para trabajar con los distintos routers:
=>console /all
=>
Al ejecutar este comando deben aparecer dos consolas, cada una de ellas representa un router y puedes ver como carga la imagen del sistema operativo y podremos empezar a trabajar con comandos reales.
Para terminar varios consejos, dynamips y dynagen consumen muchos recursos, si quieres optimizar y que no consuma tanto mira la opción idle-pc.
Entre las características de dynagen te permite capturar paquetes en distintas interfaces de tu red virtual en el formato .cap que con posterioridad puedes visualizar con programas como wireshark.
Si quieres echarle un vistazo a las posibilidades de estos programas:
Siguiendo el hilo de la receta anterior, vamos a ver cómo podemos clasificar el tráfico que generamos para meterlos en las colas que vamos a crear y así clasificar el tráfico. Para ello, aunque existen multitud de formas de clasificar el tráfico vamos a utilizar el campo TOS (type of service) del protocolo IP.
Clasificando paquetes
Bueno, esta claro que si queremos establecer clases de tráfico podemos hacer dos cosas, una marcar el tráfico de paquetes en el origen y sólo clasificar en el nodo que hace de enlace con, por ejemplo, Internet y otra, no marcar en el origen y filtrarlo (ademas de clasificar) todo en el nodo que hace de enlace.
Si nos imaginamos un nodo con dos interfaces, una conectada a Internet y otra a una red ethernet través de la cual se conectan otros nodos podemos establecer reglas de marcado en esos nodos mientras que en el enlace simplemente clasificamos el tráfico que le llega en el sistema de colas.
El problema de tener que marcar en el origen, es que pueden existir nodos que no marcan sus paquetes o que los marcan mal para obtener el ancho de banda asociado a un tráfico de prioridad mas alta. Vamos a considerar que todos los nodos son buenos y marcan sus paquetes.
Para marcar un paquete debemos usar iptables. Si observamos una regla de iptables para marcar paquetes:
Vemos que lo primero que nos encontramos es el "-t mangle" , que le indica la tabla dónde vamos a operar, por la tabla mangle pasan todos los paquetes por lo que no se nos escapa ninguno, si quieres ver una descripción de las tablas, y su uso mira aquí.
Lo siguiente que viene es "-I POSTROUTING" que nos indica dónde vamos a aplicar la clasificación, como hemos dicho antes, estamos marcando el tráfico que el nodo genera por lo que lo marcamos despues del enrutado de los paquetes. En este punto hay que hacer una pequeña parada, el sitio ideal para marcar el paquete que ha sido originado en un sistema es en OUTPUT, ya que por ahí pasa todo el tráfico generado en un nodo, no obstante a mi me interesa hacerlo en POSTROUTING por que me interesa marcar tráfico que pasa por mi sistema y que no esta marcado (cosas del curro:-)).
El 1 que viene a continuación es el número de la regla que vas a crear, acuerdate de esto si quieres borrarla luego.
A continación vienen las reglas que debe cumplir el paquete para marcarlo, en nuestro caso buscamos todo el tráfico tcp que viene de la dirección 111.11.11.105, "-p tcp -s 111.11.11.105". Y por último especificamos qué queremos hacer con esos paquetes, en nuestro caso vamos a poner el valor 16 en el campo TOS.
Si queremos ver como queda la regla despues de que la ejecutemos en nuestro sistema:
Para borrar todas las reglas de marcado, en el caso de la tabla mangle:
#iptables -F-t mangle
Obviamente podemos especificar el marcado de los paquetes como queramos y atendiendo a multitud de parámetros. Veamos algunos ejemplos:
Especificar que todo el tráfico de salida de un host que sale del puerto 12345 se marque con el valor 4 en el campo TOS:
En general, despues de la opción -p puedes poner cualquier tipo de protocolo (si esta incluido en /etc/protocols), tambien existe la posibilidad de marcar los paquetes que van a un destino específico (con -d), que entraron por un interfaz específico o van a salir etc. existen módulos asociados a protocolos que enriquecen las posibilidades, pero vamos estudiando un poco seguro que puedes marcar y filtrar lo que quieras.
Por ejemplo un paquete muy majo es este que te permite filtrar de forma cómoda por protocolos de la capa de aplicación y habilitar reglas como esta:
Como vimos en la receta anterior, para crear colas, usamos la herramienta tc.
Por ejemplo si queremos establecer cuatro colas, cada una para un tipo de tráfico distinto, y que tengan el mismo ancho de banda, una estructura como esta sería apropiada:
#tc qdisc add dev eth0 root handle 1: htb default 1
#tc class add dev eth0 parent 1: classid 1:1 htb rate 3125kbps
#tc class add dev eth0 parent 1: classid 1:2 htb rate 3125kbps
#tc class add dev eth0 parent 1: classid 1:3 htb rate 3125kbps
#tc class add dev eth0 parent 1: classid 1:4 htb rate 3125kbps
Tal y como hemos creado las estructuras, el ancho de banda es dividido, es necesario resaltar que para que compartieran el ancho de banda deberíamos crear una cola hija de root de la cual "colgar" la clasificación. De esta forma si una clase de tráfico no ocupa su ancho de banda, el que sobra, es repartido en las otras clases de tráfico.
Nuestras colas, quedan, por lo tanto:
Una vez que tenemos el tráfico marcado y las clases de tráfico creado, debemos establecer las reglas para encolar el tráfico en su clase correspondiente, dentro de la clasificación de colas preestablecida.
Para ello, de nuevo utilizamos la herramienta tc:
#tc filter add dev eth0 parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff flowid 1:4
#tc filter add dev eth0 parent 1:0 protocol ip prio 9 u32 match ip tos 0x08 0xff flowid 1:3
#tc filter add dev eth0 parent 1:0 protocol ip prio 8 u32 match ip tos 0x04 0xff flowid 1:2
#tc filter add dev eth0 parent 1:0 protocol ip prio 7 u32 match ip tos 0x02 0xff flowid 1:1
Con estas instruciones le indicamos que vamos a crear un filtro "tc filter" y asociarlo a la interfaz eth0 "add dev eth0" y a la clase root "parent 1:0" (la qdisc que hemos creado antes). Este filtro es sobre el protocolo ip "protocol ip" y le fijamos una prioridad para indicar en que orden se aplican los filtros "prio 10" (mayor número, mayor prioridad). A continuación viene qué condiciones debe cumplir nuestro paquete (con el filtro u32), en nuestro caso, como hemos utilizado el campo TOS, lo especificamos con "match ip tos 0x10 0xff" y por último el flujo al que pertenece si cumple los criterios "flowid 1:4".
Si queremos ver que todo se ha configurado bien:
#tc filter show dev eth0
filter parent 1: protocol ip pref 7 u32
filter parent 1: protocol ip pref 7 u32 fh 803: ht divisor 1
filter parent 1: protocol ip pref 7 u32 fh 803::800 order 2048 key ht 803 bkt 0 flowid 1:1
match 00020000/00ff0000 at 0
filter parent 1: protocol ip pref 8 u32
filter parent 1: protocol ip pref 8 u32 fh 802: ht divisor 1
filter parent 1: protocol ip pref 8 u32 fh 802::800 order 2048 key ht 802 bkt 0 flowid 1:2
match 00040000/00ff0000 at 0
filter parent 1: protocol ip pref 9 u32
filter parent 1: protocol ip pref 9 u32 fh 801: ht divisor 1
filter parent 1: protocol ip pref 9 u32 fh 801::800 order 2048 key ht 801 bkt 0 flowid 1:3
match 00080000/00ff0000 at 0
filter parent 1: protocol ip pref 10 u32
filter parent 1: protocol ip pref 10 u32 fh 800: ht divisor 1
filter parent 1: protocol ip pref 10 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:4
match 00100000/00ff0000 at 0
#
Comprobando que todo funciona
Vale, y todo esto, ¿cómo comprobamos que funciona?, bueno, hay un script en perl que te permite visualizar las clases de tráfico que hay en tu sistema, el dispositvo y el tráfico que entra por cada clase en tiempo real:
Puedes bajártelo de aquí. El script no está mantenido pero de momento funciona bastante bien. Si observais, en la ejecución del comando sólo va tráfico a la clase 1 que es por defecto, se pueden generar tráfico con una herramienta (tipo scapy) para comprobar qué tráfico va a cada una de las colas.
Vamos a describir en esta receta algunos de los comandos útiles para lo que se ha venido a denominar traffic shaping, en cristiano, control de nuestro ancho de banda. Aviso a navegantes, este tema es un poco lioso y yo no soy ni mucho menos un experto por lo que, primero, espero comentarios, correcciones, mejoras, etc. y segundo, ojo con lo que haces!!
Enviando paquetes a la red
Bueno vamos con algunos comandos y de paso vamos introduciendo algunos conceptos:
# ip link show
1: lo: <LOOPBACK,UP,10000> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:e0:4c:00:84:bb brd ff:ff:ff:ff:ff:ff
Este comando muestra los “enlaces” presentes en un computador, en esta información va incluida alguna información muy útil, dejando aparte la interfaz loopback, nos centramos en el enlace número dos, es decir la eth0 que es una interfaz ethernet. Despues de la información relativa a la mtu (Maximum transmission unit) que en una ethernet es 1500 tenemos la disciplina de colas (qdisc). Para que nos entendamos, todos los paquetes que se envían son almacenados en un sistema de colas hasta la entrega a la red.
Ahora bien, cómo se gestionan las colas y qué algoritmo se utiliza para decidir qué paquete desencolamos es un mundo un poco complejo que trataremos de introducir en esta receta.
Antes de continuar hay que indicar que, aparte de las colas, están las clases de tráfico y los filtros. Generalmente (esto depende mucho del tipo de colas que estamos usando) se definen clases de tráfico y los filtros clasifican el tráfico en esas clases atendiendo al protocolo, ip, etc..
Tipos de Colas
El algoritmo por defecto es “pfifo_fast”, que es el más sencillo, el primer paquete que llega es el primero que sale y lo más rápido posible, esto no tiene ningún misterio. Con esta política todo el mundo es feliz y todos los paquetes son tratados exactamente igual buscando las máximas prestaciones. No obstante estaremos de acuerdo en que no todas las aplicaciones y ordenadores son de igual importancia por lo que asignar un recurso tan escaso como el ancho de banda, puede ser una buena idea y muy útil.
Hay mas disciplinas de colas, entre las cuales podemos enumerar:
FIFO – simple FIFO (packet (p-FIFO) or byte (b-FIFO) ): la que hemos visto, tambien hay ha nivel de byte.
PRIO – n-band strict priority scheduler: En esta disciplina tenemos un sistemas de encolado basado en clases de tráfico a las cuales se les asigna una prioridad, Las clases de tráfico son desencoladas en funcíon de la prioridad (el 0 es la mayor prioridad y cuanto mayor es el número menor prioridad).
TBF – token bucket filter: Esta es una disciplina para establecer límites en el ratio de entrega de paquetes para las distintas colas. Si quieres limitar el ancho de banda de una interfaz, esto es lo que necesitas.
CBQ – class based queue: Otro sistema basado en colas un poco mas complejo que el PRIO, aquí puedes establecer jerarquías de clases y prioridades. Hay que resaltar que dentro de cada una de las clases hay una qdisc que, por defecto es una pfifo pero que puede ser configurada por lo que la cantidad de combinaciones es enorme.
CSZ – Clark-Scott-Zhang: Para que nos entendamos garantiza el ancho de banda de los servicios garantizados y el resto lo deja para los paquetes que no se clasifican (best-effort traffic), la teoría de esto es compleja.
SFQ – stochastic fair queue: Tienes diferentes colas asociadas a flujos y vas sacando de cada cola un paquete a la vez (round robin) para que todas los flujos tengan el mismo ancho de banda, el tema es que si una aplicación establece muchos flujos obtiene mas ancho de banda.
RED – random early detection: Esto esta diseñado para backbones, el tema es que trata de aprovechar las características de control de flujo del protocolo TCP para ajustar los parámetros de entrega de los paquetes y evitar la congestión antes de que se produzca. Lo que hace es eliminar aleatoriamente paquetes cuando las colas empiezan a llenarse, cuanto mas llena esta la cola, va aumentando la probabilidad de eliminar un paquete de forma aleatoria. TCP cuando pierde paquetes reduce su tasa de envío por lo que reduce la posibilidad de congestiones, hay que ajustar muy bien los valores para que no perdamos mas paquetes de los que perderíamos en congestión (vamos eliminando paquetes por que la red no da mas de si). Esto plantea un problema ya que UDP no implementa un mecanismo similar con lo que los flujos UDP no se ajustan.
GRED – generalized random early detection: El tema es que RED descarta aleatoriamente paquetes cuando hay una posible congestión y de forma aleatoria tratando todos los flujos igual, como en el campo del señor no todos somos iguales, GRED crea una serie de colas virtuales y establece políticas RED distintas (como por ejemplo la probabilidad de eliminar un paquete cuando se empieza a llenar la cola) a cada una de ellas.
ATM – asynchronous transfer mode: Esto es para que emules el comportamiento de una red ATM transmitiendo unidades de información en celdas.
DSMARK – DSCP (Diff-Serv Code Point)marker/remarker: Esto mas que una disciplina es una política de marcado de paquetes en función de reglas específicas.
Hierarchical Token Bucket (HTB): Podemos dividir el ancho de banda especificando el mínimo y el máximo, si alguien no esta usando su ancho de banda, se asigna al resto de clases. Este se considera mas sencillo que el CBQ y bastante flexible por lo que lo usaremos para los ejemplitos.
La herramienta tc: comándos básicos
Vamos con algunos comandos, de aqui en adelante si queremos ver como van nuestras colas:
Este primer comando define una cola que se añade a la raiz (root) con un manejador handle 1: y que
por defecto manda el tráfico a la clase de tráfico 1.
Ahora creamos la clase de tráfico:
$tc class add dev eth0 parent 1: classid 1:1 htb rate 1kbps ceil 5kbps
Para esta clase de tráfico, el padre es la qdisc que acabamos de crear (parent 1:) y cuyo identificador es 1 (classid 1:1). Por último, la parte de comando que delimita el ancho de banda que pueden consumir viene determinado por la parte del comando “rate 1kbps ceil 5 kbps” que le dice al kernel, que, asegure una tasa de 1kbps en caso de congestión y que como mucho esa clase puede llegar a 5 kbps. Si no ponemos la parte ceil, la clase consumirá todo el ancho de banda sobrante que quede (esto es así por que estamos usando HTB).
En teoría ya esta todo, al indicarle al crear la cola que la clase por defecto es la 1, todo el tráfico es dirigido a esa clase que ya esta limitada. Ahora bien, si queremos indicarle explícitamente que mande todo el tráfico ip a esa clase debemos crear un filtro:
$tc filter add dev eth0 protocol ip parent 1: handle 1 fw classid 1:1
De nuevo le indicamos que el parent es la qdisc htb root (parent 1:), el manejador de este filtro es el 1 y la acción es forwardear todo el protocolo ip (protocol ip) a la clase 1:1 (fw classid 1:1).
Varios temas, primero sólo podemos controlar el tráfico que sale por eth0, para controlar el tráfico de entrada hay que trabajar con la cola de entrada (ingress). A menos que estes probando cosas, es recomendable meter tu configuración (lista de comandos) en un script ya que es frecuente cometer errores, y aunque se pueden cambiar las especificaciones, muchas veces puede ser lioso.
Viendo como va nuestra configuración
Si queremos ver como va nuestra configuración de filtros:
#tc filter show dev eth0
filter parent 1: protocol ip pref 49152 fw
filter parent 1: protocol ip pref 49152 fw handle 0x1 classid 1:1
Nuestras clases:
#tc class show dev eth0
class htb 1:1 root prio 0 rate 8000bit ceil 40000bit burst 1603b cburst 1619b
El rate es en bit, le pusimos 1kb es decir 1000*8 bits (lo coge en bytes).
Y las colas:
#tc qdisc show dev eth0
qdisc htb 1: r2q 10 default 1 direct_packets_stat 294
Cada sistema de colas diferentes tiene comandos y parámetros específicos , en algunos casos puedes añadirle a las clases de tráfico qdisc propias que tienen nuevas clases (en forma de árbol) por lo que las combinaciones son múltiples.
Vamos a tratar de describir el proceso de programación de un nodo Mica2 con un ejemplo mínimo. Para ello vamos a usar el equivalente para sistemas empotrados del hola mundo que es la aplicación Blink para el tinyOS. Adicionalmente iremos ampliando este tema con las herramientas que nos proporciona la toolchain.
Hardware
Los equipos adquiridos en el grupo Arco son las micas2 uno de los equipos mas ampliamente usados en Wireless Sensor Networks junto con el tinyOS.
Hay dos tipos de dispositivos, las micas2 (4 nodos) y las micas2dot (4 nodos) ademas de un programador MIB510.
Las micas2 cuentan con un puerto de extensión dónde se le pueden conectar plaquitas con sensores, nuestras micas2 tienen las placas MTS310CA que cuentan con sensor de luz, temperatura, micrófono y un pequeño altavoz ademas
de un acelerómetro y un sensor magnético.
El procesador y la radio de las micas2 cuenta con un MPR400CB que esta basado en el procesador Atmel ATmega128L, para mas datos mirar el datasheet
Las micas2dot son algo mas limitadas como podemos ver en su página web
Programando la Mica2
La instalación del tinyOS y del toolchain ya lo vimos en la receta anterior
Esta aplicación basicamente lo que hace es encender y apagar el led rojo de la mota a una frecuencia de 1Hz. La aplicación se encuentra en el directorio:
/opt/tinyos-1.x/apps/Blink
El compilador que vamos a usar es el de NesC que es el ncc:
ncc --help
Usage: avr-gcc [options] file...
Options:
-pass-exit-codes Exit with highest error code from a phase
--help Display this information
--target-help Display target specific command line options
(Use '-v --help' to display command line options of sub-processes)
-dumpspecs Display all of the built in spec strings
-dumpversion Display the version of the compiler
-dumpmachine Display the compiler's target processor
-print-search-dirs Display the directories in the compiler's search path
-print-libgcc-file-name Display the name of the compiler's companion library
-print-file-name=<lib> Display the full path to library <lib>
-print-prog-name=<prog> Display the full path to compiler component <prog>
-print-multi-directory Display the root directory for versions of libgcc
-print-multi-lib Display the mapping between command line options and
multiple library search directories
-print-multi-os-directory Display the relative path to OS libraries
-Wa,<options> Pass comma-separated <options> on to the assembler
-Wp,<options> Pass comma-separated <options> on to the preprocessor
-Wl,<options> Pass comma-separated <options> on to the linker
-Xlinker <arg> Pass <arg> on to the linker
-save-temps Do not delete intermediate files
-pipe Use pipes rather than intermediate files
-time Time the execution of each subprocess
-specs=<file> Override built-in specs with the contents of <file>
-std=<standard> Assume that the input sources are for <standard>
-B <directory> Add <directory> to the compiler's search paths
-b <machine> Run gcc for target <machine>, if installed
-V <version> Run gcc version number <version>, if installed
-v Display the programs invoked by the compiler
-### Like -v but options quoted and commands not executed
-E Preprocess only; do not compile, assemble or link
-S Compile only; do not assemble or link
-c Compile and assemble, but do not link
-o <file> Place the output into <file>
-x <language> Specify the language of the following input files
Permissible languages include: c c++ assembler none
'none' means revert to the default behavior of
guessing the language based on the file's extension
Options starting with -g, -f, -m, -O, -W, or --param are automatically
passed on to the various sub-processes invoked by avr-gcc. In order to pass
other options on to these processes the -W<letter> options must be used.
For bug reporting instructions, please see:
<URL:http://gcc.gnu.org/bugs.html>.
Si analizamos el proceso de compilación que ya usamos para comprobar que la toolchain estaba correctamente instalada:
$make mica2
mkdir -p build/mica2
compiling Blink to a mica2 binary
ncc -o build/mica2/main.exe -Os -finline-limit=100000 -Wall -Wshadow -DDEF_TOS_AM_GROUP=0x7d -Wnesc-all -target=mica2 -fnesc-cfile=build/mica2/app.c -board=micasb -I%T/lib/Deluge -DIDENT_PROGRAM_NAME=\"Blink\" -DIDENT_USER_ID=\"root\" -DIDENT_HOSTNAME=\"homer\" -DIDENT_USER_HASH=0xbc4a9a92L -DIDENT_UNIX_TIME=0x45b09151L -DIDENT_UID_HASH=0x04c03c51L Blink.nc -lm
compiled Blink to build/mica2/main.exe
1632 bytes in ROM
49 bytes in RAM
avr-objcopy --output-target=srec build/mica2/main.exe build/mica2/main.srec
avr-objcopy --output-target=ihex build/mica2/main.exe build/mica2/main.ihex
writing TOS image
Vemos que lo primero crea un directorio para meter los binarios y que todo lo va a meter en main.exe, las opciones le indican diversos parámetros para la generación del código entre los cuales podemos ver el target, en nuestro caso la mica2, el usuario y el host, y al final nos aparece los bytes generados para la RAM y para la ROM.
Si echamos un vistazo al directorio build/mica2 vemos los siguientes archivos:
donde aparecen diversos archivos como las imágenes generadas por avr-objcopy como són el formato de intel (.ihex) y el de motorola (.srec)
Para instalarlo concectar físicamente el nodo a la interfaz de programación (la placa mib510) y esta al puerto serie mediante un cable RS232, por último ejecutar el siguiente comando:
# make mica2 reinstall mib510,/dev/ttyS0
cp build/mica2/main.srec build/mica2/main.srec.out
installing mica2 binary using mib510
uisp -dprog=mib510 -dserial=/dev/ttyS0 --wr_fuse_h=0xd8 -dpart=ATmega128 --wr_fuse_e=ff --erase --upload if=build/mica2/main.srec.out
Firmware Version: 2.1
Atmel AVR ATmega128 is found.
Uploading: flash
Fuse High Byte set to 0xd8
Fuse Extended Byte set to 0xff
rm -f build/mica2/main.exe.out build/mica2/main.srec.out
installing mica2 bootloader using mib510
uisp -dprog=mib510 -dserial=/dev/ttyS0 --wr_fuse_h=0xd8 -dpart=ATmega128 --wr_fuse_e=ff --upload if=/opt/tinyos-1.x/tos/lib/Deluge/TOSBoot/build/mica2/main.ihex
Firmware Version: 2.1
Atmel AVR ATmega128 is found.
Uploading: flash
Fuse High Byte set to 0xd8
Fuse Extended Byte set to 0xff
Y ya esta, tanto el led rojo de la placa de programación (la MIB510) como el de la mota parpadean a una frecuencia de 1 Hz, a continuación puedes desconectar la mica de la placa de programación y el led continua parpadeando.
No es mucho, pero como ya comentamos es el hello world de las micas y la prueba definitiva de que todo el toolchain funciona correctamente.
Existen dentro del directorio apps bastantes ejemplos que podeis probar y sobre todo, podeis mirar como ejemplos de programación:
Lo siguiente es echarle un vistazo a NesC y ver como desarrollar nuestros propios programas, tambien veremos como usar las herramientas de depuración y el simulador TOSSIM, pero eso para las siguientes entregas.
Enlaces
Los enlaces básicos son los de la receta anterior:
Por que no sólo de GNU/Linux vive el hombre, vamos a describir brevemente la instalación y el uso de un sistema operativo libre denominado TinyOS. Este sistema operativo esta destinado a redes inalámbricas de sensores por lo que necesitaremos para probarlo alguna de las plataformas soportadas por el sistema operativo o el simulador TOSSIM.
Instalación TinyOS 2.0
Vamos a aprender su instalación y dejaremos para más adelante la construcción de un pequeño hello world o incluso la instalación del propio simulador.
Se va a instalar todo en una debian con kernel 2.6.15.7
Instala Java 1.5 JDK. Se necesita para comunicarse con el nodo desde el PC.
Compilador cruzado
Esto va a depender del dispositivo para el cual quieras desarrollar una aplicación y concretamente del procesador con el que estén desarrollados. Por ejemplo, para la familia de las MICAs (dispositivos para redes de sensores) se necesita la toolchain AVR, ya que llevan unos procesadores ATMEL. En la receta supondremos que vamos a trabajar con estas motas, por lo que instalamos todo lo relativo a la citada toolchain. En debian esto implica, instalar los siguientes paquetes:
gcc-avr, el gcc para los atmel
gdb-avr, el gdb para los atmel
binutils-avr, utilidades binarias.
avr-libc, la librería estándar de C
avarice, para utilizar el gdb con JTAG (sistema para depuración típico de sistemas empotrados)
Si peiensas utilizar el apt-get para instalar todo eso será mejor que eches un vistazo a esta página de tinyOS. En resumen dice que no es buena idea, ya que necesitamos versiones muy concretas. Lo mejor es bajarse los rpm y pasar los paquetes a .deb con alien, para luego instalarlos. Un tema importante, primero desinstala todo lo que tengas de avr y no te olvides de bloquear todos los paquetes para que no se actulicen cuando hagas un “upgrade”.
Una vez que tengas los compiladores cruzados (necesarios para compilar el sistema operativo TinyOS) necesitas el compilador de nesC. nesC es el lenguaje en el que está escrito tiniyOS y que se usa también para escribir las aplicaciones. En la página web tienes paquetes rpm para el nesC (que usará los compiladores y para la toolchain de tinyOS por lo que, como esto en una debian tienes que tirar de alien para convertir los paquetes.
#alien tinyos-tools-1.2.2-1.i386.rpm
Warning: Skipping conversion of scripts in package tinyos-tools: postinst prerm
Warning: Use the --scripts parameter to include the scripts.
tinyos-tools_1.2.2-2_i386.deb generated
#dpkg --force-overwrite-i tinyos-tools_1.2.2-2_i386.deb
(Leyendo la base de datos ...
161803 ficheros y directorios instalados actualmente.)
Desempaquetando tinyos-tools (de tinyos-tools_1.2.2-2_i386.deb) ...
dpkg - aviso, no se tendrá en cuenta el problema por estar activa
una opción --force:
intentando sobreescribir `/usr/share/man/man1/uisp.1.gz', que está también en el paquete uisp
dpkg - aviso, no se tendrá en cuenta el problema por estar activa
una opción --force:
intentando sobreescribir `/usr/bin/uisp', que está también en el paquete uisp
Configurando tinyos-tools (1.2.2-2) ...
El sistema operativo
Un paso similar se realiza para instalar el sistema operativo propiamente dicho, es decir el tinyOS. Se coge el paquete .rpm se pasa a .deb con alien y se instala con el dpkg.
Configuración del entorno
Configurar las variables de entorno (mételo en un script para configurarlo de forma automática), por ejemplo en ~/bin/tinyos-setup.sh:
Y ejecuta lo siguiente cuando vayas a compilar para TinyOS:
$. ~/bin/tinyOS.sh
Cambia el propietario del directorio donde esta el tinyOS:
$chown-R felix /opt/tinyos-2.x
y no olvides cambiar los permisos del dispositivo (puerto serie, paralelo, USB) que uses para comunicarte con las motas.
chmod 666 /dev/<devicename>
graphviz
Instalar Graphviz desde su paquete debian correspondiente con
#apt-get install graphviz
Probando
Bueno, enhorabuena, si has hecho todos estos pasos, ya tienes el tinyOS instalado en tu ordenador, ahora necesitas probar todo esto que hemos hecho. No está de más echarle un vistazo a la estructura general del SO para entender como está estructurado y sus posibilidades.
La mejor forma de ver si todo esta correctamente instalado es tratar de compilar y probar algunas de las aplicaciones de ejemplo que vienen con el propio sistema operativo. Como ya habrás notado el sistema operativo se ha instalado por defecto en el directorio /opt/tinyos-2.x
Dentro de este directorio a su vez puedes encontrar los siguientes directorios:
apps: Aplicaciones de ejemplo del tinyOS
support: código fuente del toolchain
tos: el sistema operativo propiamente dicho.
Puedes probar que todo está correcto compilado una aplicación de prueba que viene con el sistema. Copia el directorio apps/Null a algún sitio de tu home. Este directorio es un esqueleto de aplicación para tinyOS, que si bien no hace nada útil, te permite comprobar que has realizado correctamente todos los pasos anteriores.
Dentro de ese directorio, ejecuta el siguiente comando:
$make <plataforma_destino>
donde plataforma_destino puede ser uno de los siguientes:
Vamos a describir una serie de comandos básicos para el uso de gnuplot. Un programa para generar gráficas 2D y 3D a partir de datos "crudos" y funciones matemáticas.
Los usos y aplicaciones de esta herramienta son infinitas y lo más interesante, bastante simple de usar mediante comandos.
Instalación
La instalación no tiene ningún misterio y creo que está empaquetado para todas las distribuciones que generalmente usamos.
No obstante en su página web se encuentra toda la información necesaria para la instalación y algunas gráficas de muestra de lo que se puede realizar con este sistema.
Gráficas a partir de datos
Creo que lo mejor es echarle un vistazo a un ejemplo e ir comentando los detalles. En el siguiente ejemplo sacamos una gráfica con el consumo de energía medio de un nodo a partir de una simulación del ns2.
set terminal postscript eps color
set grid
set xlabel "Node ID"
set xrange [0:50.0]
set ylabel "Energy(Joules)"
set yrange [0:20.0]
set title "Average energy consumed by Node"
plot "average-consume-bynode.data" with boxes
Todos los comandos tienen opciones varias para variar la presentación, tipo de gráfica, límites de la gráfica, etc. Sería imposible verlas todas por lo que os remito al manual :-).
Volvamos con el ejemplo, la primera línea indica cómo queremos que nos saque la gráfica, le decimos que la saque por terminal, en postcript, eps y a todo color.
Con "set grid" le indicamos que nos muestre la regilla en la gráfica.
A continuación vamos con el eje de las X (es una gráfica 2D), primero indicamos con xlabel, la etiqueta que le queremos poner, y a continuación el rango. finalmente establecemos lo mismo con el eje de las Y.
Para terminar de modelar nuestra gráfica le ponemos el titulo con "set title".
Vale, lo último es indicarle dónde estan los datos a representar y cómo queremos que nos lo pinte, en este caso le decimos (última linea del ejemplo) que nos pinte los datos en average-consume-bynode.data con cajas (boxes).
El archivo de los datos tiene esta pinta:
La primera columna son las X y la segunda las Y.
Bueno, pues vamos a pintar, podemos teclear los comandos anteriores aunque os recomiendo que los metais en un archivo (en nuestro caso en el archivo average-consume-bynode.dem), con lo cual si ejecutamos:
$gnuplot average-consume-bynode.dem > grafica.ps
En gráfica.ps tendremos nuestra gráfica:
$gv grafica.ps
con solo cambiar el estilo (palabra a la derecha del with en la última linea) podeis tener diferentes tipos de gráficas para adaptarla a aquellas que mejor representen vuestros datos.
Concretamente se pueden usar:
Otra posible aplicación es obtener datos de funciones matemáticas. Vamos a ver un ejemplo extraido de la demo gallery, dónde hay un montón de ejemplos que os pueden servir como referencia de lo que se puede hacer.
Ahora lo vamos ha realizar desde la línea de comandos ejecutando gnuplot estableciendo la rejilla y utilizando la función splot (usada para funciones 3D y superficies). Esta genera una gráfica con las funciones que le especifiques. Si quieres representar mas de una función no te olvides de separarlas por comas.
Aqui esta el ejemplo tal y como se ejecuta:
felix$gnuplot
G N U P L O T
Version 4.0 patchlevel 0
last modified Thu Apr 15 14:44:22 CEST 2004
System: Linux 2.6.14-2-386
Copyright (C) 1986 - 1993, 1998, 2004
Thomas Williams, Colin Kelley and many others
This is gnuplot version 4.0. Please refer to the documentation
for command syntax changes. The old syntax will be accepted
throughout the 4.0 series, but all save files use the new syntax.
Type `help` to access the on-line reference manual.
The gnuplot FAQ is available from
http://www.gnuplot.info/faq/
Send comments and requests for help to
<gnuplot-info@lists.sourceforge.net> Send bugs, suggestions and mods to
<gnuplot-bugs@lists.sourceforge.net>
Terminal type set to 'x11'
gnuplot>set grid
gnuplot>splot x**2+y**2, x**2-y**2
gnuplot>
Y ya tienes tu primera gráfica en 3D.
La ayuda
Las combinaciones son infinitas para lo cual gnuplot nos da una ayuda por comandos bastante extensa.
generalmente con un help te muestra una ayuda en secciones para que veas las distintas posibilidades.
Como ya he dicho arriba, en mi opinión la mejor fuente de ayuda son los ejemplos, simplemente busca el tipo de gráfico que quieres y fijate en como lo han diseñado.
Una de las aplicaciones más útiles a realizar con los móviles Bluetooth es poder atender una llamada mediante el micrófono y los altavoces del PC o portátil. Lo que vulgarmente se denomina un "manos libres". En esta receta vamos a configurar nuestro GNU/Linux para poder ser utilizado de esta forma.
Compilando el servicio
Lo primero que hay que reconocer es que el servicio está un poco verde y no va a sonar todo lo bien que esperais, con paciencia y buceando en el código supongo que se puede ajustar, pero eso, simplemente supongo..
Bueno, lo primero que hay que hacer es bajarse el servicio handsfree de su página web.
Básicamente hay que seguir las instrucciones de la página web para compilar el servicio y como pre-requisitos :
Tener instalada la pila bluez y las herramientas asociadas. En la anterior receta ya se daban unas nociones básicas de cómo usar estas herramientas.
Tenemos que tener instalado las librerias de desarrollo. En debian el paquete es libbluetooth1-dev.
Otra cosa a tener correctamente configurado es el sistema alsa así como sus librerías de desarrollo (libsound2-dev) para el tema del sonido.
La aplicacion handsfree viene con un Makefile por lo que salvo errores de librerias y rutas con un simple make deberíais tener el servicio compilado.
Ejecutando el servicio
Bueno, ahora viene la parte de ejecución del servicio, lo primero es asociar el móvil con el PC, generalmente te pedirá el pin. Este paso no es necesario y siempre puedes introducir el pin cada vez que uses el servicio, pero vamos, lo más cómodo es asociarlo (bluez-pin es la herramienta para gestionar los PIN desde la parte del PC).
A continuación es necesario añadir dos servicios al registro de servicios del PC, el serial port y el handsfree. Esto se realiza con sdptool, por lo tanto:
felix#:sdptool add SP
felix#:sdptool add HF
A continuación ejecutamos el servicio con:
felix#:./handsfree ADDR 3
ADDR es la dirección de tu móvil y 3 el canal del handsfree.
Para ver cuales son tus parámetros lo mejor es realizar un escaneo:
felix:hcitool scan
Scanning ...
00:15:A0:42:34:8D Nokia 6680
En cuanto al canal, pues mostrar todos los servicios de tu móvil y fijarnos en el canal (Channel) con:
felix:~# sdptool browse 00:15:A0:42:34:8D
Browsing 00:15:A0:42:34:8D ...
...todos los servicios
y ya esta todo, en teoría cuando recibas una llamada descuelgas y se escucha por los altavoces y hablas por el micro. Eso si, como dije al principio y dependiendo de la tarjeta de sonido puede sonar como los teleñecos :-).
Es posible descolgar mediante comandos AT directamente desde el PC y utilizando el propio programa.
Con esto y un poquito de shell puedes tener tu GNU/Linux siempre listo para atender llamadas.
un saludo
Probablemente NS2 es el simulador de redes open source más extendido tanto en investigación como para propósitos docentes, en esta receta vamos a aprender a instalarlo y a simular un escenario para MANET's muy simple.
Su configuración está en /etc/bluetooth/hcid.conf y la base de datos con los pin en /etc/bluetooth/pinDB
Descubrimiento de servicios
El demonio del protocolo de descubrimiento de servicios SDP (Service discovery protocol) es sdpd
Gestión de SDP
#sdptool
sdptool - SDP tool v2.24
Usage:
sdptool [options] <command>[command parameters]
Options:
-h Display help
-i Specify source interface
Commands:
search Search for a service
browse Browse all available services
records Request all records
add Add local service
del Delete local service
get Get local service
setattr Set/Add attribute to a SDP record
setseq Set/Add attribute sequence to a SDP record
Services:
DID SP DUN LAN FAX OPUSH FTP HS HF SAP NAP GN PANU HID CIP CTP
A2SRC A2SNK AVRCT AVRTG SR1 SYNCML ACTIVESYNC HOTSYNC PALMOS
NOKID PCSUITE
Es importante resaltar que para que un servicio sea descubierto, debes añadirlo mediante un sdptool add <servicio>, la lista de abajo del comando anterior nos muestra los servicios disponibles.
Algunos comando útiles
Con hcitool scan obtendrás una lista de los dispositivos presentes a tu alrededor.
$hcitool scan
Scanning ...
00:15:A0:42:34:8D Nokia 6680
Muestra la dirección bluetooth y el nombre, puedes comprobar la dirección bluetooth en los nokia 66** tecleando el código “*#2820#”
Para obtener una lista de los servicios que ofrece cada dispositivo usamos la herramienta sdptool, en nuestro caso, y para ver lo que ofrece el móvil:
#sdptool browse 00:15:A0:42:34:8D
Browsing 00:15:A0:42:34:8D ...
Service Name: Hands-Free Audio Gateway
Service RecHandle: 0x10003
Service Class ID List:
"Handfree Audio Gateway" (0x111f)
"Generic Audio" (0x1203)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 2
Language Base Attr List:
code_ISO639: 0x454e
encoding: 0x6a
base_offset: 0x100
Profile Descriptor List:
"Handfree Audio Gateway" (0x111f)
Version: 0x0101
Service Name: Headset Audio Gateway
Service RecHandle: 0x10004
Service Class ID List:
"Headset Audio Gateway" (0x1112)
"Generic Audio" (0x1203)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 3
Language Base Attr List:
code_ISO639: 0x454e
encoding: 0x6a
base_offset: 0x100
Profile Descriptor List:
"Headset" (0x1108)
Version: 0x0100
...todos los servicios
Esto proporciona toda la información que necesitas acerca de todos los servicios presentes en el dispositivo, en este caso el teléfono móvil.
Servicio dial-up networking
Nos vamos a centrar en el servicio dial-up networking, para ello observamos que la salida del comando anterior nos presenta la siguiente información:
Service Name: Dial-Up Networking
Service RecHandle: 0x1000e
Service Class ID List:
"Dialup Networking" (0x1103)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 3
Language Base Attr List:
code_ISO639: 0x454e
encoding: 0x6a
base_offset: 0x100
Profile Descriptor List:
"Dialup Networking" (0x1103)
Version: 0x0100
Para indicarle al ordenador que vamos a usar ese servicio necesitas editar el archivos /etc/bluetooth/rfcomm.conf e insertar una entrada tal que:
donde el device es el identificador del movil y el channel el que nos indica el registro obtenido con sdptool, justo despues de “RFCOMM” (0×0003).
Reinicia para cargar la nueva configuración:
#/etc/init.d/bluez-utils restart
Restarting bluez-utils: hcid sdpd rfcomm.
#rfcomm release 1
#rfcomm connect 1
Connected /dev/rfcomm1 to 00:15:A0:42:34:8D on channel 10
Press CTRL-C for hangup
Ya tienes una conexión lista, con lo cual, por ejemplo, si estas en un portátil en mitad del campo y quieres conectarte a internet con tu
portátil a través de tu móvil tienes que configurar un enlace ppp a través del móvil.
Para eso, tienes comandos muy interesantes:
pand: TCP/IP sobre Bluetooth
—listen para el servidor
—connect para el cliente
/etc/bluetooth/pan/dev-up: pand ejecuta este script al levantar TCP/IP.
dund: Ejecutar PPP sobre Bluetooth RFCOMM
—listen para el servidor
—connect para el cliente
Si no has establecido una “relación de confianza” entre tu móvil y tu
portátil te pedirá en ambos dispositivos el pin.
Protocolo OBEX
Si quieres mandarle un archivo a tu teléfono puedes utilizar el protocolo OBEX. Con gnome-obex-send puedes mandarle un archivo y con gnome-obex-server debe aparecer una opción en nautilus, de forma que, si haces click en el botón derecho sobre un archivo debería aparecer una opcion para enviarlo via bluetooth.
Configurando un Headset
Una interesante aplicación es la de poder usar uno de esos micrófonos y auriculares bluetooth. Estos dispositivos implementan un servicio denominado headset.
Para ello existe un interesante proyecto basado en Alsa, lo puedes encontrar en bluetooth-alsa (no es paquete debian).
Dos errores que surgieron en la configuración son:
felix:#btsco
Error: control open (hw:0): No such device
Error: Can't find device. Bail
Esto indica que no tienes configurados los drivers de alsa y no encuentran los dispositivos. Prueba a instalar y ejecutar el alsaconf para instalar alsa.
Otro problema, despues de instalar los drivers de alsa puede ser:
felix:#btsco
Error: hwdep next device (hw:0): Operation not permitted
Error: control open (hw:1): No such device
Error: Can't find device. Bail
No tienes cargado el modulo del kernel snd-bt-sco, está en el directorio kernel del programa btsco, tienes que ejecutar make; make install en dicho directorio.
Si al hacer modprobe snd-bt-sco, no lo encuentra (y se te ha compilado todo bien) copia el .ko a mano a /lib/modules/2.6.14-2-386/kernel/drivers/ poniendo la versión del kernel que tengas (la mia es una 2.6.14-2-386).
Comentarios
Esta receta se irá ampliando conforme se prueben mas servicios y utilidades.
Si te gusta la tira Ecol, ahora puedes devolverle a su autor, algunas de las carcajadas con un pequeño favor, te necesita para llevarse unas pelas en el concurso de 20minutos por su blog (es tan bueno o mas que la tira).