Reparar el índice dañado de un archivo AVI en Linux Ubuntu

El problema

El día de hoy tenía que consultar un video en formato AVI que parecía tener problemas.  El Movie Player lo abría sin mensajes de error sin embargo se demoraba varios minutos en presentarlo, VLC en cambio mostraba un mensaje de error acerca del índice del video dañado y era posible repararlo pero aparentemente de manera temporal porque sucedía igual cada vez que abría el archivo.

A continuación se muestra el procedimiento utilizado para corregír el índice defectuoso del archivo de video utilizando una herramienta de linea de comando.

La solución

Instalar MEncoder si no se cuenta con él aún.

$ sudo aptitude install mencoder

Invocar el siguiente comando en el que original_video.avi es el archivo original del video y fixed_video.avi es el archivo resultante después de la corrección del índice.

$ mencoder -idx original_video.avi -ovc copy -oac copy -o fixed_video.avi

Los botones de Home y Search no funcionan con CyanogenMod en Android

El problema

Después de actualizar el teléfono con la versión nocturna del 26 de agosto este se empezó a comportar de manera extraña: no aparecía el bloqueo del teclado y no funcionaban los botones físicos del teléfono de Home (casita) ni Search (lupa).  Esto aparentemente puede suceder con diferentes versiones de CyanogenMod con cualquier teléfono, esta vez fue mi caso.

La solución

Probé varias opciones desde limpiar los distintos cachés hasta restaurar la configuración de ADW y reinstalar el ROM sin resultados.

La solución llegó con simplemente agregar una opción a la base de datos de configuración de Android de la siguiente manera a través de la terminal (Terminal Emulator).

$ su -
# sqlite3 /data/data/com.android.providers.settings/databases/settings.db "INSERT INTO secure (name,value) VALUES ('device_provisioned','1');"

A continuación se deberá reiniciar el teléfono y listo!

Instalación de Cyanogen Mod 7.2 en un teléfono LG Optimus One

Introducción

Cyanogen Mod [sigh-AN-oh-jen-mod] es un reemplazo open source del firmware de dispositivos Android con la adición de múltiples características y optimizaciones que no se encuentran por defecto en las distribuciones oficiales del sistema operativo.  En lo personal encuentro muy útiles la gran cantidad de opciones de personalización del teléfono y el ahorro de memoria (casi 50%) al no tener aplicaciones indeseadas instaladas por el vendedor.

Para tener mayor información acerca de Cyanogen Mod consultar su página web.

En este artículo se describen los pasos necesarios para instalar la versión 7.2 (basada en Android 2.3.7) en un LG Optimus One (otros móviles soportados).

Este procedimiento trae consigo posibles riesgos de daño, pérdida de información o pérdida de la garantía de los equipos en los que se efectue.  Debe realizarse bajo su propia responsabilidad.  Si requiere algún tipo de soporte consulte un foro especializado como XDA Developers.  No siga estos pasos si no está seguro de lo que está haciendo.

 

Prerequisitos

  • La batería del teléfono debe tener por lo menos 60% de carga para garantizar que no se va a apagar en medio del procedimiento.
  • El teléfono no debe tener las bandas cerradas (branded).
  • Se debe contar con acceso de root en el teléfono (rooted).
  • Se debe tener instalada una herramienta de recuperación (custom recovery).
  • Realizar una copia de seguridad de toda la información importante del teléfono.
  • Saber lo que se está haciendo y aceptar toda responsabilidad por el procedimiento.

Descargar el software necesario

  1. Cyanogen Mod, el ROM con el sistema operativo como tal.  En este caso se utilizó el archivo cm-7.2.0-p500.zip.
    http://download.cyanogenmod.com/?device=p500
  2. El Google Apps Package que incluye al Play Store.  En este caso se utilió el archivo gapps-gb-20110828-signed.zip.
    http://goo.im/gapps/
Estos dos archivos zip deben copiarse a la tarjeta SD del teléfono.

Instalar ROM Manager

Instalar esta aplicación de ClockworkMod en el teléfono desde el Play Store.
Con ella se recomienda realizar un backup del ROM actual (Backup current ROM).

Iniciar en modo de recuperación

Utilizando ROM Manager seleccionar la opción Flash ClockworkMod Recovery bajo la sección de Recovery.  Una vez terminado este proceso seleccionar la opción Reboot into Recovery.

Limpiar la información del sistema operativo

  1. Seleccionar la opción Wipe Data/Factory reset.
  2. Seleccionar la opción Wipe cache partition.
  3. Bajo la opción Advanced seleccionar la opción Wipe Dalvik cache.

Instalar los ROMs

Seleccionar la opción Install zip from SD card para instalar el ROM y Choose zip from SD card para establecer la ubicación en la tarjeta SD.

Este procedimiento se debe realizar tanto para el ROM de Cyanogen Mod como para el del Google Apps Package.

Reiniciar el teléfono

El paso final consiste en reiniciar el teléfono mediante la opción Reboot system now.  Si todo salió bien se deberá iniciar la versión de Cyanogen Mod recién instalada.

Enlaces

  1. Cyanogen Mod
    http://www.cyanogenmod.com/

    1. LG Optimus One
      http://www.cyanogenmod.com/devices/lg-optimus-one
    2. Announcement: CyanogenMod 7.2 Released! (2012-Jun-16)
      http://forum.cyanogenmod.com/forum-598/announcement-23-cyanogenmod-72-released-2012-jun-16/
    3. Wiki
      http://wiki.cyanogenmod.com/index.php?title=Main_Page
  2.  Google Apps Package
    http://goo.im/gapps/

Realizar el "rooting" de un teléfono LG Optimus One con Android 2.3 utilizando SuperOneClick

Introducción

El rooting de un teléfono con Android permite acceder al sistema operativo con el super usuario (root) lo que permite a su vez realizar tareas de administración que no son posibles para el usuario convencional.

Este procedimiento se realizó utilizando un PC con Windows 7 y un LG Optimus One con Android 2.3.3.  Las versiones recientes de SuperOneClick se encuentran desarrolladas en .NET por lo que teóricamente es posible ejecutarlas bajo Linux sin embargo las pruebas iniciales no fueron satisfactorias.

Este procedimiento conlleva posibles riesgos de daño, pérdida de información o pérdida de la garantía de los equipos en los que se efectue.  Debe realizarse bajo su propia responsabilidad.  Si requiere algún tipo de soporte consulte un foro especializado como XDA Developers.

Instalación de los drivers

Para realizar este procedimiento bajo Windows es necesario tener previamente instalados el driver de conexión al teléfono, ya sea el provisto por Google o el provisto por los diversos fabricantes (OEM).

Este driver puede ser instalado como parte del proceso de instalación del SDK de Android o desde la misma aplicación de SuperOneClick si no se cuenta con este en el momento de su ejecución.

Obtener SuperOneClick

El software se puede descargar desde la página de su desarrollador.  Para la realización de este procedimiento se utilizó la versión 2.3.3 la cual era la versión mas reciente en su momento.

Obtener y descomprimir el archivo SuperOneClickv2.3.3-ShortFuse.zip.

Activar USB debugging

Es necesario activar la opción de USB debugging en el teléfono, para hacer esto acceda a los siguientes menúes: Settings > Applications > Development y active la opción USB debugging.

Desmontar la tarjeta SD

Se recomienda desmontar la tarjeta SD para evitar conflictos o pérdida de información durante el desarrollo del proyecto.  Para desmontarla acceda a los siguientes menúes: Settings > Storage y presione la opción Unmount SD card.

Ejecutar SuperOneClick

Desde la ubicación donde fue descomprimido el paquete original ejecute la aplicación SuperOneClick.exe.  Es posible que esta deba ser ejecutada como administrador (opción de clic derecho).

Conecte el teléfono al PC a través del cable USB y finalmente presione el botón Root para que la aplicación inicie su proceso.

Ejecución de SuperOneClick

Ejecución de SuperOneClick

Postmortem

Una vez finalizado el proceso desactive la opción USB debugging activada anteriormente, monte nuevamente la tarjeta SD y busque en el teléfono la aplicación Superuser la cual indicará que el procedimiento de rooting ha sido exitoso.

Actualización menor de las versiones de Scientific Linux 5.x y 6.x

Introducción

Los procedimientos descritos a continuación permiten realizar la actualización de versiones menores en los sistemas operativos basados en Scientific Linux en sus versiones 5.x y 6.x, es decir, pasar de la 5.1 a la 5.3 por ejemplo mas no para pasar de la versión 5 a la 6.

Recuerde tener suficiente espacio en /var/cache para realizar este procedimiento así como contar con copias de seguridad en caso de que algo salga mal.  Realice los siguientes pasos bajo su propia responsabilidad.

Serie 5.x

# yum remove perl.i386 gaim.i386 gaim-devel.i386
# yum clean all
# rpm -Uvh ftp://ftp.scientificlinux.org/linux/scientific/5x/i386/misc/RPMS/yum-conf-latest.SL.noarch.rpm
# yum update yum
# yum update
# yum clean all
# /sbin/reboot
  • El paso #1 solamente se debe realizar bajo la arquitectura de 64 bits para remover versiones instaladas de 32 bits de estos paquetes.

Serie 6.x

# yum clean all
# yum update
# yum --releasever=6x update
# yum-conf-sl-other
# yum update
# yum clean all
# /sbin/reboot
  • En el paso #3 reemplazar el valor 6x por la versión a la cual desea realizarse la instalación (6.2 por ejemplo).
  • El paso #4 sólo es estrictamente necesario cuando la versión original del sistema operativo que se está actualizando es la 6.0.

Enlaces

Compartir una sesión de terminal con Screen en Linux utilizando el mismo usuario

Introducción

Frecuentemente me encuentro con compañeros de la universidad experimentando en los servidores del nodo grid, en estos casos es común que nos distribuyamos entre diferentes computadores pero a pesar de esto sea conveniente compartir una única terminal para que todos podamos ver lo que se está experimentando y que cada uno pueda proponer e implementar sus ideas.

Para hacer esto la solución mas simple que he encontrado es utilizando el comando screen que se incluye por defecto en la mayoría de las distribuciones de Linux.

El procedimiento descrito a continuación es útil cuando todos los usuarios acceden finalmente a la terminal compartida utilizando el mismo usuario en el mismo servidor, en caso contrario es necesario realizar unas modificaciones adicionales.

Procedimiento

El usuario que va a crear la terminal compartida ejecuta el siguiente comando para iniciar la sesión de screen y nombrarla (mySharedSession en este caso).

$ screen -d -m -S mySharedSession

El siguiente paso radica en unir la terminal del usuario a la sesión compartida de screen mediante la ejecución del siguiente comando que debe ser ejecutado por todos los usuarios incluyendo al creador de la sesión ya que esta se crea inicialmente separada de su terminal actual.

$ screen -x mySharedSession

En cualquier momento es posible listar las sesiones de screen disponibles mediante la ejecución del siguiente comando.

$ screen -ls

Salir y terminar sesiones

Para salir de una sesión compartida sin destruírla es necesario ejecutar la siguiente combinación de teclas: CTRL+a d.

Para salir de una sesión destruyéndola se puede utilizar el comando exit (cierre brusco) o la combinación de teclas CTRL+a k (cierre limpio) la cual es equivalente a CTRL+a :kill.  Debe tener en cuenta que la destrucción de la sesión afecta a todos los usuarios que se encontraban conectados a ella.

Enlaces

Creando un nuevo proyecto en GitHub bajo GNU/Linux

Introducción

Una vez instalado Git y configurado para GitHub es posible empezar a crear proyectos que sean monitoreados por este software de control de versiones.

Para cada proyecto se crea un repositorio donde se almacenarán las versiones de sus archivos y las ramas que se creen con ellos.

A continuación se describirán los pasos necesarios para crear un nuevo repositorio.

Crear el repositorio en GitHub

Para crear un nuevo repositorio en GitHub se debe ingresar con la información de la cuenta del usuario que será su propietario, acceder al enlace Create a new repository e ingresar la siguiente información.

Crear un nuevo repositorio en GitHub

Crear un nuevo repositorio en GitHub

Crear el directorio del proyecto

Si todavía no existe un directorio para el proyecto en el sistema de archivos del equipo del desarrollador, este se debe crear en la ubicación que la se requiera.

$ mkdir /ruta/al/proyecto123
$ cd /ruta/al/proyecto123

Esta nueva ubicación se debe activar para ser monitoreada por Git de la siguiente manera.

$ git init

Agregar una descripción ampliada del proyecto

Este paso es opcional pero se recomienda hacerlo.  Es posible agregar un archivo README al proyecto cuyo contenido se mostrará junto con la descripción del proyecto en GitHub.

$ vi README

Como este archivo es nuevo debe agregarse al registro de Git.

$ git add README

De ser necesario es posible agregar en un solo paso a todos los archivos ubicados en un directorio específico.

$ git add .

Una vez agregado y registrado el archivo es necesario hacer commit de esas modificaciones.

$ git commit -m 'First commit'

Enviar las modificaciones a GitHub

Debe tenerse en cuenta que el commit realizado en el paso anterior se realiza en la base de versiones local.  Para publicar estas modificaciones en el proyecto en GitHub es necesario sincronizarlo con el repositorio remoto de la siguiente manera.

Primero es necesario asociar el repositorio local con el remoto.

$ git remote add origin git@github.com:USERNAME/PROYECTO.git

Reemplazar las palabras USERNAME y PROYECTO con el nombre de usuario GitHub de quien va a publicar y el nombre del proyecto respectivamente.

Finalmente se realiza la sincronización con el repositorio remoto.

$ git push -u origin master

Consultar la página del repositorio en GitHub

Al consultar la página del repositorio en GitHub se deberá ver el listado de archivos sincronizados y el texto de la descripción ampliada (archivo README) especificado.  Para consultar este sitio se deberá acceder al URL con la siguiente estructura.

https://github.com/USERNAME/PROYECTO

Enlaces

Implementando la carga dinámica de clases en Processing

Introducción

La carga dinámica de clases es una característica muy conocida de los lenguajes orientados a objetos que permite crear instancias de clases con solo conocer su nombre.  Esto permite a los desarrolladores crear aplicaciones que utilicen clases que sean creadas después de la aplicación sin necesidad de recompilar la misma.  También es muy útil cuando se desea generalizar la creación de un conjunto de objetos mediante el patrón de fábrica.

Gracias a la reflexión en Java y otros lenguajes como C# es muy fácil de implementar, sin embargo en Processing (derivado de Java) su implementación fue un poco mas elaborada ya que las clases que implementa el usuario son en realidad clases internas del proyecto desarrollado.

Explicación

En Processing cuando se crea un Proyecto y en él se implementan las clases A, B y C, y este se compila, internamente se crea un archivo de código fuente Java conteniendo a este código de la siguiente manera.

import processing.core.*;
// Imports del usuario
// Otros imports
public class Proyecto extends PApplet {
    class A
    {
        // ...
    }
    class B
    {
        // ...
    }
    class C
    {
        // ...
    }
    static public void main(String args[]) {
        PApplet.main(new String[] { "--bgcolor=#DFDFDF", "Proyecto" });
    }
}

Implementación

Para realizar la implementación de una versión simple del patrón de fábrica utilizando la carga dinámica de clases en Processing se supondrá que existe la clase Padre de la cual se derivan las clases Hijo1 e Hijo2 del proyecto Demostracion.

Crear un objeto donde se almacenará la instancia a crearse de manera dinámica.

Padre instance = null;

Recuperar la referencia al cargador de clases del sistema.

ClassLoader classLoader = ClassLoader.getSystemClassLoader();

Cargar la referencia de la clase a partir de su nombre (className), en este caso podría ser Hijo1 o Hijo2.  Recuerde que esta clase es realmente interna a la clase Demostracion.

Class loadedClass = classLoader.loadClass("Demostracion$" + className);

Obtener una referencia al constructor que se desea utilizar para crear la instancia.  En este caso se eligió un constructor que recibe dos parámetros: una cadena y un real.  Nótese además que todos los constructores reciben una referencia al applet de Processing, en este caso de Demostracion (que hereda a su vez de PApplet).

java.lang.reflect.Constructor constructor = loadedClass.getConstructor(new Class[] {PApplet.class, String.class, float.class});

Crear la nueva instancia utilizando el constructor obtenido en el paso anterior.  Al método newInstance se le especifican los valores de los parámetros que serán suplidos en el constructor.

instance = (Padre) constructor.newInstance(new Object[] {applet, str, flt});

Nótese como el primero de ellos, applet, hace referencia al applet de Processing que se está ejecutando.  Al no encontrar una forma mas elegante para obtener esta referencia al applet, declarar una variable global para almacenarlo.

PApplet applet;

Y obtener su valor en el procedimiento setup.

void setup()
{
    // ...
    applet = this;
    // ...
}

En el código mostrado anteriormente se deberán manejar las excepciones ClassNotFoundException y ClassCastException para poder llevar a feliz término su ejecución.

Enlaces

Iniciando una máquina virtual con Libvirt/KVM desde CDROM

Introducción

En algunos casos es necesario iniciar una máquina virtual ya instalada desde el CDROM o en su defecto, una imagen ISO.  Por ejemplo cuando se deben realizar labores de administración o recuperación que requieran acceder al disco duro de la máquina virtual desmontado.

A continuación se muestra el procedimiento necesario para reconfigurar la máquina virtual para que monte una imagen ISO como su CDROM virtual e inicie el sistema operativo desde ella.

Procedimiento

Acceder a la consola de administración de las máquinas virtuales.

$ virsh --connect qemu:///system

Modificar la configuración de la máquina virtual (SL_57_x64_Generic en este caso) en dos partes.

virsh # edit SL_57_x64_Generic

Bajo domain/os agregue un nuevo registro boot para el cdrom.

 <boot dev='cdrom'/>

Identificar la configuración del CDROM bajo domain/devices/disk.  En mi caso se ve de la siguiente manera.

<disk type='block' device='cdrom'>
    <driver name='qemu' type='raw'/>
    <target dev='hdc' bus='ide'/>
    <readonly/>
    <address type='drive' controller='0' bus='1' unit='0'/>
</disk>

Modificar la configuración del CDROM para que se asocie con la imagen ISO deseada especificándole el valor de su respectivo source.

<source file='/b1/ISO/data_disk1.iso'/>

Una vez terminadas las labores de administración es necesario regresar la configuración a la original para evitar que la máquina continúe iniciándose desde el CDROM indefinidamente.

Modificar el contenido del CDROM (cambiar disco)

Otra tarea frecuente con respecto al manejo de medios en las máquinas virtuales será la manipulación del contenido de la unidad de CDROM.  Esto es necesario al realizar la instalación del sistema operativo o acceder información de diferentes medios/imágenes ISO.  Para hacer esto desde la linea de comando es necesario ejecutar el siguiente comando.

$ virsh attach-disk --type cdrom --mode readonly SL_57_x64_Generic /b1/ISO/data_disk2.iso hdc

Instalando KVM con Libvirt y la interfaz de red en puente bajo Ubuntu 11.10

Introducción

Desde la versión 9.10 de Ubuntu no había actualizado el proceso de instalación de KVM y de la interfaz de red en puente que realizo en mi servidor de desarrollo.  En este caso estoy utilizando la versión 11.10 y a continuación describo el procedimiento seguido para instalar KVM utilizando el metapaquete del repositorio estándar, crear la interfaz de red e instalar una máquina virtual inicial.

Instalación de KVM con Libvirt

$ sudo aptitude install ubuntu-virt-server

Es necesario que los usuarios que vayan a interactuar con las máquinas virtuales pertenezcan al grupo de libvirtd.  En el caso de la instalación es necesario que el usuario actual termine su sesión y la inicie nuevamente para que su suscripción al grupo sea tenida en cuenta.

Creación del puente en la interfaz de red

Asignar los permisos de manipulación de red requeridos al usuario que se encontrará activo durante la creación del puente.

$ sudo setcap cap_net_admin=ei /usr/bin/qemu-system-x86_64

Agregar el nombre de usuario elegido frente a la propiedad cap_net_admin.

$ sudo vi /etc/security/capability.conf
    cap_net_admin        USUARIO

Actualizar la configuración de las interfaces de red.

$ sudo vi /etc/network/interfaces
    auto lo
    iface lo inet loopback
    auto eth0
    iface eth0 inet manual
    auto br0
    iface br0 inet static
    address 192.168.1.250
    network 192.168.1.0
    netmask 255.255.255.0
    broadcast 192.168.1.255
    gateway 192.168.1.254
    bridge_ports eth0
    bridge_stp off
    bridge_fd 0
    bridge_maxwait 0

Reiniciar el servicio de red para que los cambios anteriores sean tenidos en cuenta.

$ sudo /etc/init.d/networking restart

Creación de una máquina virtual desde línea de comando

En el servidor instalar la herramienta de virt-install para la creación de máquinas virtuales desde la línea de comando.

$ sudo aptitude install virtinst

Solicitar la creación de la máquina virtual a partir de su configuración básica.

En este caso se va a instalar un Scientific Linux 5.7 llamada SL_57_x64_Generic con 384MB de RAM, un disco duro de 7GB y utilizará la interfaz de red en puente creada anteriormente.

$ virt-install \
    --connect qemu:///system \
    -n SL_57_x64_Generic \
    -r 384 \
    --os-type linux \
    --os-variant generic26 \
    --hvm \
    --cdrom /b1/ISO/SL.57.090911.DVD.x86_64.disc1.iso \
    --network bridge:br0 \
    --disk path=/home/vms/SL_57_x64_Generic.img,size=7 \
    --vnc --noautoconsole \
    --accelerate

Desde el cliente donde se deseen administrar las máquinas virtuales ejecutar el siguiente comando para conectarse a la máquina virtual recién creada para realizar el proceso de instalación.

$ virt-viewer -c qemu+ssh://SERVIDOR/system SL_57_x64_Generic

Enlaces