Mostrando entradas con la etiqueta Consola. Mostrar todas las entradas
Mostrando entradas con la etiqueta Consola. Mostrar todas las entradas

Respaldar archivos usando Rsync

martes, septiembre 18, 2012

En ocasiones nos toca respaldar gran cantidad de información de un equipo a otro y una de las maneras más cómodas de hacerlo es a través de la red. Para esta tarea usaremos Rsync que, al igual que netcat, son unas navajas suizas en lo que a red se refiere. Rsync, entre otras cosas, nos permite sincronizar directorios a través de la red y de esa forma lo usaremos para enviar nuestros archivos de un equipo a otro.

Comando y parámetros

Lo primero que necesitamos es acceso vía SSH al equipo remoto. Puede ser por clave pública o con usuario y contraseña. Luego nos ubicamos en la carpeta que queremos respaldar y ejecutamos el comando: $ rsync -ravz archivo_a_respaldar usuario@IP:directorio_destino Donde:
  • r: recorre los directorios de manera recursiva
  • a: conserva los atributos de los archivos (usuario, permisos, etc)
  • v: imprime información en pantalla
  • z: comprime los datos antes de enviar
Luego de la autenticación comenzará la copia de los archivos. Es importante resaltar que en el directorio_destino debemos colocar la ruta absoluta a la carpeta.

Copiar un archivo

Supongamos que queremos respaldar el archivo backup.tar.gz en un equipo remoto con IP 192.168.0.3, el usuario es satanas y el directorio destino es el home del usuario, el comando nos quedaría así:
$ rsync -avz backup.tar.gz satanas@192.168.0.3:~
El símbolo ~ puede sustituirse por la ruta absoluta /home/satanas.

Copiar un directorio y todos sus subdirectorios

Ahora supongamos que queremos respaldar el directorio /tmp/music en el mismo equipo anterior pero ahora el destino es la carpeta /home/satanas/musica, el comando nos quedaría así: $ rsync -ravz /tmp/music satanas@192.168.0.3:/home/satanas/musica

Con esta receta podremos pasar nuestro respaldo de archivos de un equipo a otro sin mucho inconveniente. Espero que les sirva

Tip: Obtener el espacio usado de un directorio

jueves, marzo 22, 2012

Situación

Queremos conocer el espacio en disco usado por un directorio (y sus subdirectorios inmediatos) con un comando de consola.

Comando

$ du -h -s /tu/directorio/*

Resultado

El comando te imprimirá algo como:
$ du -h --summarize /tu/directorio/*
2.5M /var/backups
286M /var/cache
139M /var/lib
4.1k /var/local
4.1k /var/lock
98M /var/log
4.4M /var/mail
4.1k /var/opt
103k /var/run
66k /var/spool
4.1k /var/tmp

Explicación

El comando du te da un estimado del espacio utilizado por un directorio, la opción -h te imprime los números en potencias de 1024, --sumarize muestra solo el total para cada elemento y /tu/directorio/* corresponde al directorio que deseas analizar. El * al final es la clave para indicarle al comando que queremos ver los subdirectorios.

Mostrar el log de ActiveRecord en la consola de Rails

miércoles, febrero 01, 2012

Si usualmente utilizas la consola interactiva de Ruby On Rails para realizar pruebas, correr tareas de Rake, entre otras cosas y te resultaría sumamente útil ver el log de lo que esta haciendo el ActiveRecord, entonces este tip es para ti.

Simplemente ejecuta la consola desde la carpeta raíz de tu aplicación Rails:

Para rails 3.x:
$ rails c
Para rails 2.x:
$ script/console
Y luego indícale al logger que use la salida estándar:
ActiveRecord::Base.logger = Logger.new(STDOUT)
Con eso los mensajes de log del ActiveRecord se imprimirán en la consola.

Configurar el Touchpad Synaptics de una HP Pavilion dm4 en Debian

lunes, octubre 31, 2011

En un artículo anterior expliqué cómo configurar el video Intel i915 con KMS en una HP Pavilion dm4. Esta vez explicaré cómo configurar el Touchpad Synaptics de esa misma laptop.

Leer el manual

Lo primero que debes hacer si deseas configurar correctamente el Touchpad es leer el manual (RTFM).
$ man synaptics

Yo configuré el touchpad a mi gusto, así que puedes probarlo y si no te gusta lo adaptas al tuyo. Sin embargo es una tarea de ensayo y error que no podrás completar a menos que conozcas todas las opciones que tienes disponibles.

Dependencias

Lo único que necesitamos es un Xorg bien configurado y los drivers synaptics. Para instalar los drivers ejecutamos:

En Debian:
# aptitude install xserver-xorg-input-synaptics


Entender cómo funciona el Touchpad

Básicamente no es un Touchpad, es un ClickPad y eso lo hace un poco especial. ¿Diferencias? Pues la superficie táctil también funciona como botón, que actua como uno u otro (left, right) dependiendo de la zona que se presione. No tenemos un área táctil con unos botones separados, tenemos con todo incluido, eso debe quedar muy claro.



Configuración

Xorg provee una serie de plantillas predeterminadas para la configuración de dispositivos. Estas plantillas se encuentran en /usr/share/X11/xorg.conf.d/ y basta con copiar a /etc/X11/xorg.conf.d/ la que necesitemos y comenzar a modificarla. Xorg se encargará de cargar estos valores luego de los valores predeterminados. Para nuestro caso usaremos la plantilla 50-synaptics.conf.

# mkdir /etc/X11/xorg.conf.d/
# cp /usr/share/X11/xorg.conf.d/50-synaptics.conf /etc/X11/xorg.conf.d/

Lo que haremos será modificar el InputClass para agregar los parámetros que deseamos configurar. En el manual de synaptics tenemos bien documentados cada una de las opciones con su descripción y posibles valores.

Mi configuración quedó así:
Section "InputClass"
    Identifier  "touchpad catchall"
    Driver      "synaptics"
    MatchIsTouchpad "on"
    MatchDevicePath "/dev/input/event*" 
        Option      "Protocol" "auto-dev"
        Option      "SHMConfig" "true"
        # Edges
        Option      "LeftEdge" "1500"
        Option      "RightEdge" "5200"
        Option      "TopEdge" "1350"
        Option      "BottomEdge" "3500"
        # Finger press
        Option      "FingerLow" "28"
        Option      "FingerHigh" "35"
        Option      "FingerPress" "70"
        # Taps time
        Option      "MaxTapTime" "180"
        Option      "MaxTapMove" "220"
        Option      "MaxDoubleTapTime" "180"
        Option      "SingleTapTimeout" "180"
        Option      "ClickTime" "100"
        Option      "FastTaps" "0"
        # Emulate
        Option      "EmulateMidButtonTime" "75"
        Option      "EmulateTwoFingerMinZ" "70"
        Option      "EmulateTwoFingerMinW" "5"
        # Scrolling
        Option      "VertScrollDelta" "100"
        Option      "HorizScrollDelta" "0"
        Option      "VertEdgeScroll" "1"
        Option      "HorizEdgeScroll" "0"
        Option      "CornerCoasting" "0"
        Option      "VertTwoFingerScroll" "1"
        Option      "HorizTwoFingerScroll" "1"
        # Pointer speed
        Option      "MinSpeed" "0.5"
        Option      "MaxSpeed" "7.0"
        Option      "AccelFactor" "0.35"
        Option      "TrackstickSpeed" "0"
        Option      "EdgeMotionMinZ" "29"
        Option      "EdgeMotionMaxZ" "59"
        Option      "EdgeMotionMinSpeed" "1"
        Option      "EdgeMotionMaxSpeed" "40"
        Option      "EdgeMotionUseAlways" "0"
        # Scrolling flags
        Option      "UpDownScrolling" "0"
        Option      "LeftRightScrolling" "0"
        Option      "UpDownScrollRepeat" "0"
        Option      "LeftRightScrollRepeat" "0"
        Option      "ScrollButtonRepeat" "100"
        # Touchpad mouse on/off
        Option      "TouchpadOff" "0"
        Option      "GuestMouseOff" "0"
        # Dragging
        Option      "LockedDrags" "0"
        Option      "LockedDragsTimeout" "5000"
        # Corners
        Option      "RTCornerButton" "0"
        Option      "RBCornerButton" "2"
        Option      "LTCornerButton" "0"
        Option      "LBCornerButton" "1"
        # Tap
        Option      "TapButton1" "1"
        Option      "TapButton2" "3"
        Option      "TapButton3" "2"
        # Click
        Option      "ClickFinger1" "1"
        Option      "ClickFinger2" "0"
        Option      "ClickFinger3" "0"
        # Circular
        Option      "CircularScrolling" "0"
        Option      "CircScrollDelta" "0.1"
        Option      "CircScrollTrigger" "0"
        Option      "CircularPad" "0"
        # Palm
        Option      "PalmDetect" "1"
        Option      "PalmMinWidth" "7"
        Option      "PalmMinZ" "40"
        Option      "CoastingSpeed" "0"
        # Grab
        Option      "GrabEventDevice" "1"
        Option      "TapAndDragGesture" "1"
        # Area
        Option      "AreaLeftEdge" "0"
        Option      "AreaRightEdge" "0"
        Option      "AreaTopEdge" "0"
        Option      "AreaBottomEdge" "3500"
EndSection

Section "InputClass"
    Identifier  "Ignore mouse devs"
    MatchDevicePath "/dev/input/mouse*"
    Driver      "synaptics"
    Option      "Ignore" "on"
EndSection

Actualización: Acá pueden ver la configuración actual que tengo en mi repo github

No explicaré en detalle cada una de las opciones (para eso está el manual de synaptics), solo explicaré las más relevantes o las "problemáticas". Lo primero es ignorar las pulsaciones en el área de los botones. Para eso definimos el rango de acción del dispositivo (límites):
        # Edges
        Option      "LeftEdge" "1500"
        Option      "RightEdge" "5200"
        Option      "TopEdge" "1350"
        Option      "BottomEdge" "3500"

        # Area
        Option      "AreaLeftEdge" "0"
        Option      "AreaRightEdge" "0"
        Option      "AreaTopEdge" "0"
        Option      "AreaBottomEdge" "3500"

Colocando el límite inferior (BottomEdge y AreaBottomEdge) en 3500 evitamos que el cursor se mueva al pasar sobre el área de botones. Estableciendo el límite derecho (RightEdge) a 5200 evitamos que el cursor se mueva en la columna derecha (para habilitar la zona de scrolling vertical). La imagen a continuación ilustra estos ajustes:



El dispositivo solo tiene un botón y a simple vista no encontré la forma de configurarlo para que funcione como ambos. Estuve compilando el driver synaptics con un patch para agregar el soporte de clickpads pero no he logrado generar el .ko, así que simplemente dejé su funcionamiento por defecto (left click) y configuré el click izquierdo con tap, el doble click con doble tap y el click derecho con tap de dos dedos.

Eso podemos verlo en:
        # Tap
        Option      "TapButton1" "1"
        Option      "TapButton2" "3"
        Option      "TapButton3" "2"

El botón para activar/desactivar el clickpad tampoco pude hacerlo funcionar pero creo que es cuestión de seguir trasteando hasta lograr una solución. Además de eso, el resto de la configuración es el ajuste de valores para la sensibilidad, aceleración y velocidad del puntero, pero eso lo dejo como tarea para el lector.

Tarea para la casa

Una de las herramientas más importantes para lograr una efectiva configuración es synclient. Gracias a esta herramienta pude determinar las coordenadas que definen los límites de mi dispositivo (que en las imágenes de arriba están marcados con azul y rojo) y verificar los valores de configuración

Usando el siguiente comando podemos verificar la actividad del touchpad en vivo:
$ synclient -m 10

La salida debería ser algo como:
   time     x    y   z f  w  l r u d m     multi  gl gm gr gdx gdy
 874.169  5392 4317   3 0  0  0 0 0 0 0  00000000
 874.269  5392 4317   0 0  0  0 0 0 0 0  00000000
 874.670  5392 4317   1 0  0  0 0 0 0 0  00000000
 874.770  5392 4317   7 0  0  0 0 0 0 0  00000000
 874.870  4143 1708   9 1 11  0 0 0 0 0  00000000
 874.970  4225 1811   3 0  0  0 0 0 0 0  00000000
 875.070  4225 1811   2 0  0  0 0 0 0 0  00000000

Donde:
  • x, y: definen las coordenadas de la pulsación
  • z: la presión aplicada
  • f: el número de dedos tocando la superficie
  • w: es una medida del ancho del dedo
  • l,r,m: el estado de los botones left, right y middle

Para más información:
$ man synclient

Espero que con esta guía puedas configurar tu ClickPad y usarlo decentemente. Me queda pendiente por investigar la función de deshabilitar el touchpad mientras se escribe, los botones left-right y el botón para activar. Cuando lo logré postearé nuevamente :)

Fuentes:

Configurar video Intel i915 + KMS en Debian Wheezy

viernes, octubre 28, 2011

Es esta receta explicaré como configurar y activar el KMS (Kernel Mode Setting) con el driver Intel i915 en una HP Pavilion dm4 . Las instrucciones están hechas para Debian Wheezy (testing a la fecha) y requiere de un kernel >= 2.6.29.

Instalar dependencias

Suponiendo que tenemos Xorg instalado y corriendo (quizás funcionando con el driver vesa) procedemos instalar el driver intel y sus dependencias:
# aptitude install libgl1-mesa-glx libglu1-mesa xserver-xorg-video-intel mesa-utils

Activar el KMS

Luego vamos al archivo /etc/modprobe.d/i915-kms.conf y agregamos la línea:
options i915 modeset=1

Regeneramos la imagen del kernel con:
# update-initramfs -u

Editamos el archivo /etc/default/grub y modificamos esta línea:
GRUB_CMDLINE_LINUX_DEFAULT="quiet i915.modeset=1 video=LVDS-1:e"

El parámetro i915.modeset=1 habilita el KMS al momento del booteo y para que la pantalla no se quede en negro luego de cargar el módulo, debemos agregar el parámetro video=LVDS-1:e.

Es importante no cargar ningún otro driver para framebuffer que no sea el de Intel y eliminar de los parámetros de booteo cualquier opción del tipo vga=xxx o video=xxx.

El parámetro video=LVDS-1:e tiene una razón de ser muy particular. El BIOS de esta máquina tiene un bug; cuando inicia, indica erróneamente que la tapa de la laptop está cerrada. El kernel, basándose en esa información, manda a apagar la pantalla y por eso todo se queda en negro, no es que se congela ni que deja de funcionar. Pueden corroborar esto cerrando y abriendo la tapa de la laptop cuando se apaga. Verán que el video vuelve mágicamente y que el equipo no se había detenido, seguía funcionando pero a ciegas.

Es bien conocido que el kernel no usa el BIOS para casi ninguna de sus tareas, sin embargo a partir del kernel 2.6.32 los desarrolladores decidieron "escuchar" al BIOS en este tipo de eventos, así que hasta que no se masifique el patch que corrige la situación debemos aplicar este correctivo.

Si desean más información pueden revisar el reporte y la resolución del bug en Launchpad o el reporte del error en fredesktop.org

Luego de ese paréntesis técnico continuamos con nuestra configuración. Reconfiguramos el grub para que se apliquen los cambios anteriores:
# update-grub

Configuración de Xorg

Lo siguiente es crear y personalizar el archivo de configuración de Xorg.

A partir de la versión 1.8, Xorg ya no necesita archivos de configuración. En lugar de eso intenta detectar y configurar todo el hardware (video y dispositivos de entrada) por si mismo. Sin embargo existen casos especiales que requieren algunos "ajustes". Este es uno de esos casos.

Procedemos entonces a detener el servidor X. Si tenemos un entorno de escritorio basta con detener el gestor de sesión (gdm, kdm, slim, xdm, etc), sino matamos las X.

Hecho esto pasamos a ejecutar:
# Xorg -configure

Eso debería generarnos un archivo xorg.conf.new que servirá como base. A ese archivo le editamos la sección "Device" para que nos quede algo como:
Section "Device"
        Option      "DRI"                       "True"
        Option      "Tiling"                    "True"
        Option      "XAANoOffscreenPixmaps"     "True"
        Identifier  "Card0"
        Driver      "intel"
        BusID       "PCI:0:2:0"
EndSection

Y agregamos al final del archivo la siguiente sección:
Section "Extensions"
        Option          "Composite" "enable"
EndSection

Observen que indicamos el driver de video y algunas opciones para mejorar el desempeño gráfico. Si conocen otras opciones (que apliquen para tarjetas Intel) también pueden agregarlas acá.

Con esto terminamos nuestra configuración del servidor X.

Reiniciar

Reiniciamos y ya deberíamos disfrutar de nuestro video usando KMS. Verán que la transición entre modos de video es casi instantánea y el parpadeo se redujo considerablemente. Además de que compiz y todas esas yerbas aromáticas se ven con una suavidad asombrosa.

Deshabilitar el KMS

Si desean deshabilitar el KMS basta con desactivar el modeset en la línea:
GRUB_CMDLINE_LINUX_DEFAULT="quiet i915.modeset=0 video=LVDS-1:e"

Reconfiguramos el grub:
# update-grub

Y KMS desactivado.

Espero que esta receta les haya servido de ayuda. En un próximo post explicaré cómo configurar el Touchpad Synaptics.

Fuentes:

Obtener audio de un video de Youtube

sábado, septiembre 17, 2011

¿No les ha pasado que a veces encuentran en Youtube videos que son unas verdaderas joyas musicales y les gustaría tenerlos en su colección musical? Bueno con este truco es muy fácil hacerlo.

Primero instalamos el Youtube Downloader. Desde Debian sería:
# aptitude install youtube-dl
Instalamos el ffmpeg (en caso de no tenerlo):
# aptitude install ffmpeg
Luego descargamosel video desde Youtube y extraemos el audio:
$ youtube-dl --extract-audio
Eso nos generará un archivo .aac, ahora procedemos a convertirlo a mp3 (o al formato de nuestra preferencia):
$ ffmpeg -i .aac -ar 22050 -ab 32 .mp3
Y ya podremos disfrutar de la pieza de audio en nuestro reproductor favorito a partir del video de Youtube

Debian Wheezy sin interfaz inalámbrica luego de un safe-upgrade

martes, mayo 24, 2011

Me ocurrió hace unos días que actualicé mi Debian y repentinamente me quedé sin conexión inalámbrica. Uso Debian Testing (Wheezy para la fecha) en una HP Pavilion dv2000 y la tarjeta de red inalámbrica es una Intel PRO/Wireless 4965 AG.

Leyendo y leyendo diferentes manuales todos afirmaban que con solo instalar el paquete firmware-iwlwifi del repo non-free la cosa funcionaba a la perfección y me constaba porque así lo había hecho en un principio. Sin embargo, luego de actualizar no anduvo más y lo curioso es que el lspci me devolvía señales de vida:

07:00.0 Network controller: Intel Corporation PRO/Wireless 4965 AG or AGN [Kedron] Network Connection (rev 61)

El paquete en efecto estaba instalado:

$ aptitude search iwl | grep ^i
i firmware-iwlwifi - Binary firmware for Intel Wireless 3945, 4


El lsmod me mostraba los módulos cargados y todo estaba bien:

$ lsmod | grep iwl
iwlagn                122417  0 
iwlcore                50368  1 iwlagn
mac80211              160285  2 iwlagn,iwlcore
cfg80211              106889  3 iwlagn,iwlcore,mac80211


Incluso, los binarios del firmware también parecían estar en orden:

# find / -name "*ucode*"
/sys/module/iwlagn/parameters/ucode_alternative
/lib/firmware/iwlwifi-6050-5.ucode
/lib/firmware/iwlwifi-3945-2.ucode
/lib/firmware/iwlwifi-6000g2b-5.ucode
/lib/firmware/iwlwifi-5000-5.ucode
/lib/firmware/iwlwifi-5000-1.ucode
/lib/firmware/iwlwifi-4965-2.ucode
/lib/firmware/iwlwifi-5000-2.ucode
/lib/firmware/iwlwifi-4965-1.ucode
/lib/firmware/iwlwifi-6000-4.ucode
/lib/firmware/iwlwifi-6000g2a-5.ucode
/lib/firmware/iwlwifi-1000-3.ucode
/lib/firmware/iwlwifi-6050-4.ucode
/lib/firmware/iwlwifi-3945-1.ucode
/lib/firmware/iwlwifi-5150-2.ucode
/lib/firmware/iwlwifi-100-5.ucode


Luego intento ver el log del kernel y me encuentro con algo que me dio algunas pistas:

# tail -f /var/log/syslog
May 24 23:03:31 mpn82 kernel: [ 6214.119061] iwlagn: Intel(R) Wireless WiFi Link AGN driver for Linux, in-tree:
May 24 23:03:31 mpn82 kernel: [ 6214.119064] iwlagn: Copyright(c) 2003-2010 Intel Corporation
May 24 23:03:31 mpn82 kernel: [ 6214.119140] iwlagn 0000:07:00.0: PCI INT A -> GSI 19 (level, low) -> IRQ 19
May 24 23:03:31 mpn82 kernel: [ 6214.119153] iwlagn 0000:07:00.0: setting latency timer to 64
May 24 23:03:31 mpn82 kernel: [ 6214.119187] iwlagn 0000:07:00.0: Detected Intel(R) Wireless WiFi Link 4965AGN, REV=0x4
May 24 23:03:31 mpn82 kernel: [ 6214.157779] iwlagn 0000:07:00.0: device EEPROM VER=0x36, CALIB=0x5
May 24 23:03:31 mpn82 kernel: [ 6214.157782] iwlagn 0000:07:00.0: Device SKU: 0Xb
May 24 23:03:31 mpn82 kernel: [ 6214.157979] iwlagn 0000:07:00.0: Tunable channels: 11 802.11bg, 13 802.11a channels
May 24 23:03:31 mpn82 kernel: [ 6214.158062] iwlagn 0000:07:00.0: irq 46 for MSI/MSI-X
May 24 23:03:31 mpn82 NetworkManager[1140]:  found WiFi radio killswitch rfkill4 (at /sys/devices/pci0000:00/0000:00:1c.3/0000:07:00.0/ieee80211/phy2/rfkill4) (driver )
May 24 23:03:31 mpn82 kernel: [ 6214.161805] iwlagn 0000:07:00.0: loaded firmware version 228.61.2.24
May 24 23:03:31 mpn82 kernel: [ 6214.162128] ieee80211 phy2: Selected rate control algorithm 'iwl-agn-rs'
May 24 23:03:31 mpn82 NetworkManager[1140]:    SCPlugin-Ifupdown: devices added (path: /sys/devices/pci0000:00/0000:00:1c.3/0000:07:00.0/net/wlan0, iface: wlan0)
May 24 23:03:31 mpn82 NetworkManager[1140]:    SCPlugin-Ifupdown: device added (path: /sys/devices/pci0000:00/0000:00:1c.3/0000:07:00.0/net/wlan0, iface: wlan0): no ifupdown configuration found.
May 24 23:03:31 mpn82 NetworkManager[1140]:  (wlan0): driver supports SSID scans (scan_capa 0x01).
May 24 23:03:31 mpn82 NetworkManager[1140]:  (wlan0): new 802.11 WiFi device (driver: 'iwlagn' ifindex: 6)
May 24 23:03:31 mpn82 NetworkManager[1140]:  (wlan0): exported as /org/freedesktop/NetworkManager/Devices/3
May 24 23:03:31 mpn82 NetworkManager[1140]:  (wlan0): now managed
May 24 23:03:31 mpn82 NetworkManager[1140]:  (wlan0): device state change: 1 -> 2 (reason 2)
May 24 23:03:31 mpn82 NetworkManager[1140]:  (wlan0): bringing up device.
May 24 23:03:31 mpn82 NetworkManager[1140]:  (wlan0): deactivating device (reason: 2).


1.- El firmware se estaba cargando con la versión más actualizada según la página de Intel
May 24 23:03:31 mpn82 kernel: [ 6214.161805] iwlagn 0000:07:00.0: loaded firmware version 228.61.2.24

2.- Por alguna razón la interfaz se estaba apagando luego que cargaba el NetworkManager

Decidí buscar un poco en internet y me conseguí con este reporte de bug en Red Hat que involucraba al NetworkManager, la interfaz wireless y un mensaje de error muy similar al mío.

Probé entonces con:

# rfkill list
0: hp-wifi: Wireless LAN
 Soft blocked: yes
 Hard blocked: no
2: hp-bluetooth: Bluetooth
 Soft blocked: yes
 Hard blocked: no
4: phy2: Wireless LAN
 Soft blocked: yes
 Hard blocked: yes


Jum... phy2 y hp-wifi bloqueados por software, adicionalmente phy2 bloqueado por hardware. Raro, raro.

Hago un:

# rfkill unblock 0 && rfkill unblock 4

Y voilá, volvió a enceder el led de la interfaz inalámbrica e inmediatamente se conectó a internet :D

Cosas tontas pero que te salvan la vida. Espero que les sea de utilidad

LoadError con el readline al intentar abrir una consola de Rails usando rvm

lunes, mayo 02, 2011

Si usando rvm, intentas abrir una consola de Rails (con rails c o con script/console) y te escupe un error como este:

no such file to load -- readline (LoadError)

Entonces sigue estos pasos y resolverás el problema.

Primero, debemos instalar el paquete del readline en rvm (y no en el Sistema Operativo). Para eso removemos la versión actual de Ruby que podamos tener:

$ rvm remove 1.8.7

Instalamos el paquete readline:

$ rvm install package

E instalamos Ruby pero indicándole la ubicación del paquete readline:

$ rvm install 1.8.7 --with-readline-dir=$rvm_path/usr

Acto seguido, entramos a la carpeta en donde rvm almacena los fuentes de las extensiones de Ruby, específicamente del readline. En mi caso:

$ cd ~/.rvm/src/ruby-1.8.7-p302/ext/readline

Luego (como root) instalamos las dependencias necesarias. En Debian sería:

# aptitude update
# aptitude install libreadline5-dev


Procedemos (como usuario) a compilar e instalar la extensión en cuestión:

$ ruby extconf.rb
$ make
$ make install


Y con eso ya deberíamos disfrutar nuevamente de la consola interactiva de Rails sin problemas.

Cómo determinar la ruta de ejecución de un script en BASH

domingo, enero 10, 2010

Este fin de semana estuve buscando la manera de hacer un script en BASH que funcione como lanzador para el Turpial y necesitaba saber la ruta de ejecución del propio script.

Por un momento no supe como hacerlo, pero La Gran Totuma me iluminó y recordé los parámetros básicos de cualquier script... fue entonces cuando llegó a mi mente el famoso $0.

$0 contiene la ruta completa del script en ejecución. Ese parámetro junto con otro programita nos permitirán hacer la magia.

La aplicación dirname recibe una ruta y devuelve la misma ruta pero sin el último componente (RTFM para más información).

Lo que hacemos es pasarle $0 a dirname y luego concatenamos el nombre de cualquier otro programa/script y voilá! Tendremos nuestro lanzador automático. Quedaría algo así:

#!/usr/bin/bash

CWD=$(dirname $0)
sh $CWD/otro_programa.sh


Cambiar zona horaria en Debian

martes, diciembre 16, 2008

Para ver o configurar la zona horaria establecida en nuestro sistema Debian basta con ejecutar:

# dpkg-reconfigure tzdata

Seleccionamos el Área Geográfica:


Y posteriormente el país:

Clonar un CD/DVD desde la consola

martes, noviembre 25, 2008

Si tenemos una sola unidad óptica (CD-RW o DVD-RW) y queremos duplicar un disco desde la consola entonces la siguiente receta nos será de mucha utilidad.

Primero colocamos el CD/DVD original (el que se desea duplicar) en la unidad para crear la réplica exacta en nuestro disco duro (es decir una imagen). Para ello necesitamos saber en que dispositivo se encuentra el CD-RW/DVD-RW, eso lo obtenemos con el comando ls:

$ ls /dev/cd*
/dev/cdrom /dev/cdrw

En nuestro caso se encuentra bajo el dispositivo /dev/cdrw.

Ahora con el comando dd realizamos la imagen:

$ dd if=/dev/cdrw of=nombre_imagen.iso
El argumento if nos indica el archivo (o dispositivo) de entrada, mientras que el of se refiere al archivo de salida, en nuestro caso el archivo de imagen .iso.

Luego de unos minutos tendremos un archivo idéntico al CD/DVD (con los mismos pelos y señales) en nuestro disco duro. Ahora para grabarlo en otro disco usaremos el comando wodim. Si no lo tenemos instalado lo hacemos con aptitude:

# aptitude install wodim

Para usar el wodim debemos especificar el nombre del dispositivo grabador. Por alguna extraña razón wodim no emplea la misma terminología para los dispositivos que dd, así que es necesario ejecutar el comando wodim para saber en que dispositivo grabaremos.

$ wodim --devices
wodim: Overview of accessible drives (1 found) :
-------------------------------------------------------------------------
0 dev='/dev/hdb' rwrw-- : 'TSSTcorp' 'CD/DVDW SH-S182F'
-------------------------------------------------------------------------

Como podemos observar wodim nos arroja que el dispositivo es el /dev/hdb. Con esa información procedemos a grabar. Insertamos entonces un disco en blanco en la unidad y ejecutamos la siguiente orden:

$ wodim -v -fs=128M -eject -dev=/dev/hdb nombre_imagen.iso

Al finalizar podremos disfrutar de una copia exacta de nuestro CD/DVD

Instalar driver NVIDIA a la Debian-Way

miércoles, octubre 29, 2008

El procedimiento descrito a continuación fue probado en Debian Lenny pero debería funcionar para la mayoría de las distribuciones derivadas de Debian sin mucho problema. Usaremos el paquete module-assistant para llevar a cabo la tarea

Lo primero es instalar el module-assistant:
# aptitude install module-assistant
Posteriormente instalarmos los headers del kernel que estamos usando:
# aptitude install linux-headers-$(uname -r)
Después de esto ejecutamos los siguientes pasos:
# module-assistant update
# module-assistant prepare
# module-assistant auto-install nvidia

O lo que es lo mismo:
# m-a update
# m-a prepare
# m-a a-i nvidia

Con eso le decimos al module assistant que se encargue de descargar, compilar, empaquetar e instalar el driver NVIDIA correspondiente a nuestra tarjeta de video.

Pero ahora nos falta configurar el servidor X.Org para que haga uso del driver. Para ello instalamos el paquete nvidia-xconfig:
# aptitude install nvidia-xconfig
Y luego lo ejecutamos:
# nvidia-xconfig
Con eso tendremos el archivo /etc/X11/xorg.conf configurado y listo para la acción.

Finalmente, reiniciamos las X's presionando Ctrl + Alt + Backspace o ejecutando el siguiente comando:
# /etc/init.d/gdm restart
Si todo ha salido bien deberíamos ver el logo de NVIDIA en nuestra pantalla y un driver completamente funcional

Formatear Pen Drive USB en GNU/Linux

sábado, septiembre 27, 2008

Para formatear un pen drive USB desde un terminal GNU/Linux solo necesitamos seguir estos sencillos pasos:

Primero conectamos el dispositivo a la PC y hacemos un tail para ver en que parte ha quedado:
$ tail /var/log/messages
Sep 27 03:12:30 desktop kernel: [27939.999977] usb 1-7: configuration #1 chosen from 1 choice
Sep 27 03:12:30 desktop kernel: [27940.002680] scsi8 : SCSI emulation for USB Mass Storage devices
Sep 27 03:12:35 desktop kernel: [27944.996927] scsi 8:0:0:0: Direct-Access Kingston DataTraveler 2.0 1.00 PQ: 0 ANSI: 2
Sep 27 03:12:35 desktop kernel: [27945.007031] sd 8:0:0:0: [sdc] 15769600 512-byte hardware sectors (8074 MB)
Sep 27 03:12:35 desktop kernel: [27945.007768] sd 8:0:0:0: [sdc] Write Protect is off
Sep 27 03:12:35 desktop kernel: [27945.010384] sd 8:0:0:0: [sdc] 15769600 512-byte hardware sectors (8074 MB)
Sep 27 03:12:35 desktop kernel: [27945.011009] sd 8:0:0:0: [sdc] Write Protect is off
Sep 27 03:12:35 desktop kernel: [27945.011019] sdc: sdc1
Sep 27 03:12:35 desktop kernel: [27945.127126] sd 8:0:0:0: [sdc] Attached SCSI removable disk
Sep 27 03:12:35 desktop kernel: [27945.127165] sd 8:0:0:0: Attached scsi generic sg3 type 0

La salida nos proporciona bastante información sobre el pen drive (marca, modelo, tamaño, etc) pero lo que nos interesa en este momento es el dispositivo al que ha sido asociado; en este caso es sdc, más especificamente sdc1.

Procedemos entonces (como root de ahora en adelante) a desmontar el volúmen:
# umount /dev/sdc1
Con fdisk vamos a eliminar las particiones (no es necesario pero es recomendable si el pen drive tiene algunas fallas lógicas)
# fdisk /dev/sdc1
Esto nos abrirá una consola, y al escribir m y presionar Enter nos debe salir un menú de ayuda similar al siguiente:
Orden (m para obtener ayuda): m
Orden Acción
a Conmuta el indicador de iniciable
b Modifica la etiqueta de disco bsd
c Conmuta el indicador de compatibilidad con DOS
d Suprime una partición
l Lista los tipos de particiones conocidos
m Imprime este menú
n Añade una nueva partición
o Crea una nueva tabla de particiones DOS vacía
p Imprime la tabla de particiones
q Sale sin guardar los cambios
s Crea una nueva etiqueta de disco Sun
t Cambia el identificador de sistema de una partición
u Cambia las unidades de visualización/entrada
v Verifica la tabla de particiones
w Escribe la tabla en el disco y sale
x Funciones adicionales (sólo para usuarios avanzados)

Para eliminar la partición escribimos d y presionamos Enter. Si hay una sola partición se borrará automáticamente, sino preguntará el número de la partición y debemos ir borrando una a una hasta que no quede ninguna.

Con la orden n se creará una nueva partición, escribimos p para que sea primaria y 1 para que sea la primera partición.

Esto nos crea una partición de tipo Linux, pero el pen drive debe tener formato FAT para que pueda ser reconocido tanto en máquinas Windows como Linux así que ingresamos la orden t para cambiar el tipo de la partición y escribimos posteriormente 6 para que tome el tipo FAT16.

Cuando todo esto se haya completado entonces damos la orden w para que se escriban los cambios al disco.

Por último, usamos la herramienta mkfs.vfat para darle el formato FAT16 y colocarle la etiqueta "USB" al pen drive:
# mkfs.vfat -F 16 -n USB /dev/sdb1
Eso es todo, siguiendo estos sencillos pasos tendremos un pen drive como nuevo, completamente funcional.

Respaldo usando Netcat

miércoles, marzo 12, 2008

Hace unos días me trajeron una máquina con Windows XP instalado sobre una partición NTFS. "Aparentemente" la partición estaba dañada, daba uno de esos famosos pantallazos azules y no cargaba por ninguno de los medios más conocidos para bootear particiones de Windows. Intenté incluso colocando el disco en otra máquina con Windows XP y booteando para al lo menos extraer la información y hacer el respaldo. Pero lamentablemente todo los intentos transcurrieron sin éxito alguno.

Bueno, como no soy partidario de Windows, decidí bootear la máquina usando un live-cd de Knoppix a ver que pasaba. Al primer intento no cargó la partición correctamente, reinicié y como al 3 intento cargo la partición sin problema alguno. BINGO! Ya podía leer los archivos y hacer el respaldo... Oh wait! Eran aproximadamente 6.1GB de información, solo tenía un pen drive de 512MB y la pc tenía quemador de cds pero allí estaba cargado el cd de Knoppix... Una situación díficil. He escuchado por ahí que se puede sacar el live-cd de Knoppix para usar la unidad en otras cosas pero nunca lo he probado ni tenía el tiempo para ponerme a investigar al respecto. El cronometro marchaba sin vuelta atrás.

En ese momento dije: "Sería bueno poder pasar esta toda información para otra máquina a través de la red..." y f
ue entonces cuando recordé el viejo Netcat. Para enviar archivos de una pc a otra se debe ejecutar el comando nc en ambas máquinas. Primero en la máquina que contiene la data a transmitir (servidor) y luego en la que recibirá la data (cliente).

Abri una consola en la máquina que actuaría como servidor y escribí lo siguiente:

$ tar -c - ruta_de_la_carpeta_a_copiar | nc -w 10 -p 5667 -l

Es una sola línea de código pero muy poderosa. Primero le decimos al comando tar que nos genere un archivo .tar de la carpeta ruta_de_la_carpeta_a_copiar (puede ser más de una carpeta si es necesario). La salida del comando tar no irá a ningún archivo, sino que la pasaremos al comando nc usando pipeline. Luego al comando nc le decimos que espere 10 segundos antes de realizar la conexión (-w 10), que use el puerto 5667 (-p 5667) y por último que se ponga a la espera de conexiones entrantes (-l).

Ahora del lado del cliente:

$ nc direccion_ip_del_servidor 5667 > nombre_del_archivo.tar

Aquí, se le indica al comando nc que intente conectarse al host cuya dirección es direccion_ip_del_servidor a través del puerto 5667 y que la data entrante sea volcada sobre el archivo nombre_del_archivo.tar

Para mejorar un poco la visualización de progreso en la transferencia se puede usar el comando pv. El comando en el cliente sería algo como:

$ nc direccion_ip_del_servidor 5667 | pv -b > nombre_del_archivo.tar
Eso nos da un pequeño aviso en la consola del cliente sobre la cantidad de datos que han sido transferidos .

Con ese par de comandos salvé la noche y puede guardar los datos para respaldarlos luego. Espero que también pueda servirles a ustedes en algún momento. Saludos

Formato a bajo nivel en GNU/Linux

viernes, febrero 22, 2008

Esta es una pregunta que estuve haciéndome por un buen tiempo. "¿Cómo puedo formatear a bajo nivel en GNU/Linux?". Bueno, la respuesta es muy sencilla... NO SE PUEDE

Voy a explicar por qué no se puede. Los primeros discos duros usaban un mecanismo impreciso para el movimiento de los cabezales basado en tecnología de motores de paso. Este mecanismo movía el motor un número determinado de pasos y la pista correcta "debería" aparecer bajo el cabezal. No obstante, si el disco era usado en posición vertical, la gravedad podía mover el cabezal haciendo que se desalineara ligeramente e impidiendo la localización de la pista deseada. La expansión térmica también podía hacer que la pista se moviera relativamente de la posición donde el cabezal esperaba encontrarla, resultando en un error de lectura.

Los daños en la superficie de los discos y en los materiales de almacenamiento magnéticos (con una baja resistencia a la desmagnetización) fueron problemas muy comunes que impedían la lectura de la data y ocasionaban muchos dolores de cabeza.

El formato a bajo nivel era usado entonces para establecer el patron MFM del disco, redefinir la geometría física (ubicando las pistas en las nuevas posiciones donde el motor de paso movía el cabezal) y mapeando los sectores defectuosos. Este último proceso se lograba estableciendo nuevos límites para el disco, permitiéndole al dispositivo funcionar nuevamente "como nuevo" pero con una considerable pérdida de espacio.

Esas son las razones por las cuales el término Formato a Bajo Nivel (o LLF - Low Level Formatting en inglés) se hizo tan popular en los 80 y continua siendo usado en la actualidad de una forma incorrecta.

Los nuevos discos duros están diseñados de una forma más precisa; usan estructuras internas complejas y mapean los sectores defectuosos de manera transparente y automática. Esta complejidad hace que los discos solo sean formateados a bajo nivel en la fábrica por el resto de su vida útil. No existe manera de hacer un formato a bajo nivel en un disco duro IDE/ATA/SATA/SCSI moderno (al menos no sin destruirlo...) y tampoco existe razón para intentarlo.

Existe una manera para redefinir la geometría lógica del disco y es haciendo particiones. Pero debe tenerse en cuenta que geometría lógica es una cosa completamente diferente de geometría física

Actualmente es común oír sobre formato a bajo nivel cuando la gente tiene problemas serios con el disco duro, bien sea por un virus en el sector de booteo, o porque el dispositivo a empezado a descubrir un montón de sectores dañados o incluso porque desean intentar recuperar ese viejo disco duro con "aparentes" daños en la superficie.

Después de investigar y leer mucho me dí cuenta que es imposible hacer un formato a bajo nivel en un disco nuevo. Lo que se necesita hacer es una Reinicialización a la Configuración de Fábrica o Formato a Nivel Medio. La reinicialización incluye identificar (y mapear si es posible) cualquier sector que no pueda ser escrito y leído correctamente, así como también el llenado de todas las localidades direccionables del disco con cero bytes (conocido también como Zero-Filling o Zero-Byte Filling). Cuando reinicializas un disco duro, basicamente usas una utilidad que sobreescribe todo el disco con ceros. Cada localidad del disco es limpiada.

Para reinicializar un disco cada fabricante debería proporcionar una aplicación especial desarrollada para tal fin. Sin embargo estas aplicaciones la mayoría de las veces solo funcionan sobre Windows o MS-DOS.

Afortunadamente eso no es limitante para nosotros, pues podemos hacer la reinicialización en GNU/Linux boteando desde un diskette de inicio (pruebe el Tom's Root/Boot en http://www.toms.net/rb) y ejecutando:

Para un floppy:
dd if=/dev/zero of=/dev/fda
Para un disco IDE:
dd if=/dev/zero of=/dev/hda
Para un disco SCSI o USB:
dd if=/dev/zero of=/dev/sda

Al terminar el proceso el dispositivo no tendrá particiones, necesitamos definir nuestra geometría lógica y formatear las nuevas particiones. Eso podemos lograrlo con:

mke2fs -j /dev/hda3

Con estos dos comandos tendremos nuestro disco como salido de la fábrica ;)