3 de agosto de 2014

Cambiar los metadatos del titulo de un archivo PDF con pdftk

Con algunos archivos pdf tengo el problema que el eBook toma el título de los metadatos del pdf y en algunos casos este titulo no es correcto.

Para solucionar esto hay que cambiar los metadatos del archivo pdf y corregir su título.

He probado varios métodos y este es el que me ha funcionado en Debian Linux.

1) Instalar pdftk
# aptitude install pdftk

2) Extraer metadaos del archivo pdf
 # pdftk archivo.pdf dump_data > data.txt

3) Revisar y modificar los metadatos
# nano data.txt

4) Crear nuevo archivo pdf copia del anterior con los metadatos actualizados
# pdftk archivo.pdf update_info data.txt output archivo02.pdf

Además con pdftk se pueden hacer muchas mas cosas con los documentos pdf ...

Ref.:
http://en.wikipedia.org/wiki/Pdftk
http://jkwiens.com/2010/01/04/changing-pdf-metadata-on-ubuntu/

1 de julio de 2014

Programación ANDROID: Capturar y formatear fecha y hora


Para capturar la hora y fecha del sistema Android y formatearla se puede hacer en MainActivity.java con el siguiente código java:


...
         long date = System.currentTimeMillis(); 
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss yyyy/MM/d");
        String dateString = sdf.format(date);

...

y ya tenemos la hora y fecha formateada como string.

y lo podemos usar en un TextView previamente definido:

...
              tvFECHA.setText("DatWIF: " + dateString);
...

apareciendo como 15:45:01 2014/06/13

Ref.:
http://developer.android.com/reference/java/text/SimpleDateFormat.html




26 de junio de 2014

Programación ANDROID: Bloquear apagado de pantalla

En algunas aplicaciones ANDROID es necesario que la pantalla permanezca encendida y so se atenúe ni
apague.

En el archivo MainActivity.java
poner:

...
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
     
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

...

Y la pantalla permanecerá encendida.

Programación ANDROID: Bloquear rotación de pantalla

En una app que he programada cuando cambia la orientación de la pantalla se reinicia el layout y borra todas
las variables.

Para evitarlo se puede bloquear que responda al cambio de posición.

Editar el archivo AndroidManifest.xml añadir dentro del tag activity

android:screenOrientation="portrait"
ó
android:screenOrientation="landscape"

También se puede hacer con programación en java, edita el dicheo ActivityMain.java y poner :

 ...
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);                   setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
...

Cualquiera de estas dos maneras  funciona.

Ref.:
http://stackoverflow.com/questions/4675750/lock-screen-orientation-android

2 de marzo de 2014

Resolver los problemas de reconexión wifi en Xubuntu 13.10

Tengo problemas con la wifi de Xubuntu 13.10, se desconecta y no vuelve a reconectarse.

Debe ser un problema de la tarjeta wifi del equipo, ya que en otro ordenador FitPC con Xubuntu 13.10 no me ocurre esto y se reconecta sin problemas.

El equipo problemático es un Foxconn Netbox NT-A3500

Este es el hardware del equipo.

#lspci
00:00.0 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 14h Processor Root Complex
00:01.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Wrestler [Radeon HD 6310]
00:01.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Wrestler HDMI Audio
00:11.0 SATA controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 SATA Controller [AHCI mode]
00:12.0 USB controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB OHCI0 Controller
00:12.2 USB controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB EHCI Controller
00:13.0 USB controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB OHCI0 Controller
00:13.2 USB controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB EHCI Controller
00:14.0 SMBus: Advanced Micro Devices, Inc. [AMD/ATI] SBx00 SMBus Controller (rev 42)
00:14.1 IDE interface: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 IDE Controller (rev 40)
00:14.2 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] SBx00 Azalia (Intel HDA) (rev 40)
00:14.3 ISA bridge: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 LPC host controller (rev 40)
00:14.4 PCI bridge: Advanced Micro Devices, Inc. [AMD/ATI] SBx00 PCI to PCI Bridge (rev 40)
00:14.5 USB controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB OHCI2 Controller
00:15.0 PCI bridge: Advanced Micro Devices, Inc. [AMD/ATI] SB700/SB800/SB900 PCI to PCI bridge (PCIE port 0)
00:15.2 PCI bridge: Advanced Micro Devices, Inc. [AMD/ATI] SB900 PCI to PCI bridge (PCIE port 2)
00:15.3 PCI bridge: Advanced Micro Devices, Inc. [AMD/ATI] SB900 PCI to PCI bridge (PCIE port 3)
00:16.0 USB controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB OHCI0 Controller
00:16.2 USB controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB EHCI Controller
00:18.0 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 12h/14h Processor Function 0 (rev 43)
00:18.1 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 12h/14h Processor Function 1
00:18.2 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 12h/14h Processor Function 2
00:18.3 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 12h/14h Processor Function 3
00:18.4 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 12h/14h Processor Function 4
00:18.5 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 12h/14h Processor Function 6
00:18.6 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 12h/14h Processor Function 5
00:18.7 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 12h/14h Processor Function 7
02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 06)
03:00.0 USB controller: ASMedia Technology Inc. ASM1042 SuperSpeed USB Host Controller
04:00.0 Network controller: Intel Corporation Centrino Wireless-N 1000 [Condor Peak]

Para solucionar esto voy a hacer un script que verifique la conectividad y en caso de estar caída reinicie la red.

En Ubuntu el manejo de la red es poco transparente ya que no usa las configuraciones estandar de Debian.

Opto por configurar la red al estilo Debian:

Vamos a ello:

1) Configurar wpa_supplicant:
Ya esta instalado en el Xubuntu 13.10, hay que crear el archivo /etc/wpa_supplican/wpa_supplicant.conf

Para cifrar la clave de acceso al punto de acceso usar:

      #  wpa_passphrase [passphrase]

ejemplo:

      # wpa_passphrase TuSSID TuPASSWORD
      network={
              ssid="TuSSID"
              #psk="TuPASSWORD"
              psk=6119df2140edbedeacd5341d6065adbbae85fbb472407f5ffbfdc083aee39fe1
      }

y pegar el resultado en el fichero /etc/wpa_supplicant/wpa_supplicant.conf.

He añadido algunas opciones que me han fucionado y el resultado es este,
y borrar la línea donde aparece el password en texto plano!!!:

      # cat /etc/wpa_supplicant/wpa_supplicant.conf
      network={
              ssid="TuSSID"
              scan_ssid=1
              proto=WPA
              key_mgmt=WPA-PSK
              psk=6119df2140edbedeacd5341d6065adbbae85fbb472407f5ffbfdc083aee39fe1
      }

2) Configurar /etc/network/interfaces
Es una buena idea hacer una backup del archivo /etc/network/interfaces por si fuera necesario recuperarlo.

      # cp /etc/network/interfaces /etc/network/interfaces.bck

Configuramos la red y los interfaces que vamos a usar, en mi caso con ip estáticas:

      # cat /etc/network/interfaces
      auto lo
      iface lo inet loopback

      auto wlan0
      iface wlan0 inet static
              address 192.168.10.10  (poner aqui la direccion de red del interface)
              netmask 255.255.255.0
              gateway 192.168.10.1   (poner aqui la direccion de red del router)
              dns-nameservers 8.8.8.8 8.8.4.4 (poner aqui las direcciones de las DNS, estos son de google)
              wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

3) Reiniciar el sistema
      # reboot
... y comprobar que la red se ha activado y que hay conectividad interna y externa.

Revisar la red con:
      # ifconfig
      # iwconfig

4) Manejo de la red
Una vez configurada por el método Debian podemos activar y desactivar las tarjetas de red con los comandos:

      # ifup    
      # ifdown

Ahora ya tenemos herramientar para hacer un sencillo script que rvise si la red esta activa y que la reinicie en caso necesario.

5) Script de verificación y reincio de la red

Lo mas fácil será hacerlo en BASH, y ejecutarlo periodicamente con el demonio Cron.
El script lo llamaremos /root/netPatrol.sh

#!/bin/bash
interface="wlan0"
target="192.168.1.1"
if [ -z "`ping -c 3 $target | grep '64 bytes from'`" ]; then
        now=`date +"%Y%m%d%H%M%S"`
        echo "$now: Red down Restarting network" >> /var/log/netPatrol.log
        ifdown $interface
        ifup   $interface
fi
exit 0
En la variable $interface pondremos el dispositivo de red a controlar y reinciair.
En $target pondremos una equipo de la red, lo ideal es el router, o si queremos testear también el acceso a internet podemos poner www.google.com, que suele estar encendido y contesta a los pings ;))
Cuando el script detecta la red caída y la reinicia nos hace un log en /var/log/netPatrol.log 

Finalmente pondremos el script en /etc/crontab para que se inicie todas las horas a 15 minutos:
Añadir la línea en /etc/crontab:

      # m  h   dom  mon  dow  user    command
        15  *   *      *       *      root     /root/netPatrol.sh

Y reiniciamos el demonio cron:
      # service cron restart


Desde que he hecho esto en Xubunto 13.10 la red esta mas estable y me aseguro que como máximo estará caído 1 hora en caso de desconexión.

25 de febrero de 2014

Arduino: from string to integer

Dada una variable tipo string, para transformar su valor a integer (int) de todas las posibilidades:

int(stringVar);
atoi(stringVar);
atol(stringVar);
...

La que me ha funcionado ha sido:

stringVar.toInt();

1 de enero de 2014

MisNotasLinux os desea una Feliz Navidad y un Feliz 2014

Feliz Navidad y Feliz Año 2014 ...



... y aquí el código de la felicitación para el ArduinoUno + LCD 16x2-I2C:




15 de noviembre de 2013

Como clonar y compactar un disco virtual .vdi de VirtualBox

Desde que descubrí la forma de clonar discos ejecutables en VirtualBox, cuando doy de baja algún disco duro, en vez de hacer una backup tradicional hago un clon .vdi ejecutable en VirtualBox.
Una vez hecho el clon es muy recomendable quitar todo los ficheros que no usemos o no queramos conservar y compactarlo para ahorrarnos una gran cantidad de valiosos gigas conservando plenamente la funcionalidad de nuestro clon.

Ya describí una forma de compactar discos duros .vdi pero esta me parece algo mejor ya que trabaja directamente sobre el fichero clonado .vdi.

Protocolo:

1) Hacemos una imagen del disco a copiar:

# dd if=/dev/discoacopiar of=imagendeldisco.img

N.B.: El disco duro a clonar no debe estar montado, de modo que hay que arrancar el ordenador con un live usb: ubuntu, xubuntu o clonezilla ... También hay que tener en cuenta donde almacenar la imagendeldisco.img, se puede conectar y montar un HD externo usb y entonces ejecutar el comando dd anterior con if=(dev del disco a clonar) of=(/ruta del HD-USB/imagendeldisco.img).

2) Convertimos el archivo imagen a formato vdi:

# VBoxManage convertfromraw -format VDI imagendeldisco.img imagendeldisco.vdi

N.B.: Una vez terminado el paso anterior podemos reiniciar el sistema y arrancar desde el S.O. de la maquina. Debe estar instalado VirtualBox. Hay que contar con suficiente espacio de disco ya que no se borra imagendeldisco.img; y suelen ser ficheros de muchos gigas.

3) Ahora configuramos una máquina virtual linux con VirtualBox y arrancamos imagendeldisco.vdi trabajando ahora dentro de la máquina virtual.

4) Llenamos el disco duro virtual con ceros:

# dd if=/dev/zero of=fillfile bs=1M

Esto llena todo el espacio disponible del disco duro con un fichero repleto de ceros.


Tener mucho cuidado de no poner ningún otro disco como destino en of= ya que lo llenareis de ceros!!!! aunque estáis dentro de la maquina virtual y no podéis acceder al sistema real de discos duros de la del ordenador.

5) Borrar el archivo fillfile:

# rm fillfile

Esto liberará todo espacio del disco duro que llenamos con los ceros en el paso anterior.

6) Apagamos la máquina virtual:

# halt

7) Una vez fuera de la maquina virtual, desde el sistema anfitrión, compactamos el fichero del disco duro de la maquina virtual imagendeldisco.vdi

# VBoxManage modifyhd imagendeldisco.vdi --compact


8) Una vez terminado el proceso ya tenéis vuestro disco duro virtual imagendeldisco.vdi compactado y totalmente funcional en VirtualBox.

Ref:
http://blog.markloiseau.com/2010/10/how-to-compact-a-virtualbox-ubuntu-guests-vdi-file/

-(oo)-
----------------------------------------------------------------
La paradoja temporal de las máquinas virtuales.
Con este procedimiento ya tengo una pequeña colección de maquinas virtuales fruto de instalaciones y actualizaciones pasadas de linux en mi microservidor micra.
Y es posible ejecutarlas todas a la vez!!! en forma de maquinas virtuales, provocando una paradoja temporal, ya que tengo toda la evolución en el tiempo de mi servidor micra funcionando en la misma red y al mismo tiempo!!!.
Esto me ha sido especialmente útil para copiar datos de antiguas instalaciones a las nuevas y regresarlas al futuro.
--------------------------------------------------------------
Update (25/12/2018):
Se puede clonar el disco y crear el fichero .vdi en un solo paso mediante el siguiente comando:

# dd if=/dev/sda | VBoxManage convertfromraw stdin file.vdi num.de.bites  

[/dev/sda]: es el disco a clonar
[file.vdi]: ruta y nombre del fichero destino .vdi
[num. de bites]: bites del disco .vdi; es igual que el tamaño del disco a clonar, para obtenerlo se puede hacer con: # fdisk -l /dev/sda

De este modo es mas rápido crear el fichero .vdi y no es necesario espacio para los dos ficheros .img y .vdi.
--------------------------------------------------------------

1 de noviembre de 2013

Proyecto acuArduino: Sensor de Temperatura DS18B20 y ARDUINO UNO

Para ir haciendo cosas con arduino voy ha monitorizar un acuario tropical de 80L donde viven plácidamente peces cebra, balck tetras, ciclido ramirez, escalaraes, alguna gamba, un ancistrus y un khuli. Intentaré no electrocutarlos.


Lo primero interesante es monitorizar la temperatura del agua. Para ello usaré el sensor de temperatura DS18B20 en una sonda de acero inoxidable waterproof que es ideal para medir la temperatura del acuario.
El cable rojo corresponde a +5V, negro a GND y amarillo a Datos.
La sonda que compre tenia el cable verde en vez de amarillo.

El montaje con la placa de prototipado que he usado es el siguiente (ver nota al final del post):


Y el esquema electrónico que se ve mas claro (ver nota al final del post):


Ahora solo falta conectar arduino a nuestro ordenador por el serial y enviarle el script de control:
Para controlar el DS18B20 necesitamos un par de librerias:

onewire.h      http://playground.arduino.cc/Learning/OneWire
DallasTemperature.h   http://milesburton.com/Dallas_Temperature_Control_Library

Hay que utilizar las ultimas versiones de estas librerías para evitar errores de compilación.

Un sketch básico para arduino que lee el DS18B20 y envía los resultados por el serial se puede encontrar en: http://milesburton.com/Dallas_Temperature_Control_Library

Y funciona !!




Imagen del sketch para arduino y los datos medidos de temperatura con la sonda DS18B20 y enviados por el puerto serie.

Notas del autor: Para la sonda de temperatura DS18B20 el fabricante recomienda usar una resistencia de 4.7 K, pese a que he usado una de 1k y ha funcionado sin problemas, considero recomendable atender las recomdaciones y utilizar una resistencia de 4.7K; yo actualmente es la que utilizo.

2 de octubre de 2013

ArduiPong

Hace tiempo que tenia ganas de probar ARDUINO y empezara a encender y apagar artilugios desde el
ordenata.

Para comenzar e ir aprendiendo como usar y programar Arduino y usar los componentes básicos como leds, pulsadores, buzzers, etc. me voy a hacer una versión totalmente desmejorada del clásico Pong de Atari.



Y aquí la moderna retroversión con Arduino UNO, 7 leds, una resistencia de 330 ohm, un buzzer, y un montón de cables conectores ...



De momento solo es el código de avance de la pelota. La idea es ir ampliando con mas componentes como pulsadores para dos jugadores, tanteo, etc ... Just for Fun...and Learn.

Aquí tenéis el código de ArduiPong para Arduino que enciende de forma secuencial la cadena de leds y emite un sonido en los extremos:

/*
ArduiPong by www.misnotaslinux.blogspot.com
un clasico en su minima expresion. bypp 2013
 */
 
//-- Variables --------------------------------------
int ret = 50;
int ret2 = 25;

//--- Setup -----------------------------------------
void setup() {                
  // Digital 6-12 pines para LEDs y pin 5 buzzer
  for(int n = 5; n < 13; n++) {
    pinMode(n, OUTPUT);     
  } 
  
}

//--- Loop forever -----------------------------------
void loop() {
  for(int n = 6; n < 12; n++) {
    digitalWrite(n, HIGH);
    delay(ret);
    digitalWrite(n, LOW);
    delay(ret);
  }
  
  // Buzzer1
  analogWrite(5,100); //emite sonido
  delay(ret2); //espera
  digitalWrite(5, LOW); //deja de emitir
       
   for(int n = 12; n > 6; n--) {
    digitalWrite(n, HIGH);
    delay(ret);
    digitalWrite(n, LOW);
    delay(ret);
  }



  // Buzzer2
  analogWrite(5,65); //emite sonido
  delay(ret2); //espera
  digitalWrite(5, LOW); //deja de emitir
       
}