10 de octubre de 2014

Raspbian en VirtualBox


Se recomienda leer el punto 6 antes del punto 1.
Para no perder el tiempo.


1) Descargamos Raspbian:
de http://www.raspberrypi.org/downloads/

en mi caso es el fichero: 2014-09-09-wheezy-raspbian.zip

2) Descomprimimos:
... y obtenemos el ficehro imagen 2014-09-09-wheezy-raspbian.img

3) Pasamos .img a .vdi
Linux:
# VBoxManage convertdd 2014-09-09-wheezy-raspbian.img 2014-09-09-wheezy-raspbian.vdi

Windows:
VBoxManage.exe convertdd 2014-09-09-wheezy-raspbian.img 2014-09-09-wheezy-raspbian.vdi

4) En VirtualBox configuramos una nueva maquina virtual:
linux, debian con el discoduro virtual: 2014-09-09-wheezy-raspbian.vdi

5) Arranamos la nueva maquina virtual Raspbian y ...




... veo todo negro, muy negro.

6) No funciona.

7) Explicación: VirtualBox solo emula procesadores x86 y Raspberry Pi tiene un procesador ARM, por lo que la imagende Raspbian NO FUNCIONA en VirtualBox.

8) Borrar ficheros y maquinas virtuales.

19 de septiembre de 2014

Copiar un Disco Duro a un USB y hacerlo bootable con Debian 7

Con mi antiguo pero incombustible FitPC (micra), se me ocurrió aprovechar una de las memorias USB que
tenia por casa y utilizarla como disco duro.

Con esto reduciría el consumo eléctrico, reduciría ruido del disco duro y pasaría un buen rato configurándolo todo.

También es un método de copiar un sistema en un disco duro (HD) de diferente tamaño, siendo especialmente útil cuando se nos ha quedado un HD pequeño y queremos transferir todo el sistema otro de mayor capacidad.

Con la clonación no podemos hacer esto directamente ya que crea una copia exacta,un espejo del sistema.

En el HD tengo un sistema debian 7 con XFCE.

Revisando, revisando,... no me acordaba que esto ya lo hice long long time ago ...
http://misnotaslinux.blogspot.com.es/2010/06/full-copy-hd-micra-server.html
Pero veo que esta algo obsoleto y lo actualizo con este post.

PROTOCOLO:

1) Arrancamos el sistema con un liveUSB
Como mi FitPC tiene un AMD sin PAE, solo puedo utilizar Xubuntu 12.04, ya que las siguietes versiones solo funcionan con microprocesdores con PAE.

2) Tenemos el disco duro interno (HD) a clonar en un USB.
Pues pinchamos el USB.

2) Hacemos las particiones en el USB:
- Usaremos Gparted.
- Borramos la partición del USB, será seguramente una FAT.
- Creamos una partición formateada con ext4.
- Creamos una mas pequeña tipo Linux-Swab, esto es opcional.

3) Montamos el disco duro a clonar HD y el USB:
# mkdir /mnt/HD
# mkdir /mnt/USB

# mount /dev/hda1 /mnt/HD
# mount /dev/sdb1 /mnt/USB

4) Copiamos todo el sistema raiz del HD al USB:
La copia debe ser de todo el árbol de directorios y todos los archivos con sus propietarios y permisos.
# cp -av /mnt/HD/* /mnt/USB/


5) Instalar Grub2 en el nuevo USB para que arranque.

- Arrancar el sistema desde el HD
- Pinchar el USB.

- Montar el USB en /mnt:
# mount /dev/sd(xx) /mnt

- Montar el resto de dispositivos:
# mount --bind /dev /mnt/dev

- Damos privilegios de root al sistema USB montado en /mnt:
# chroot /mnt
Ahora estamos trabajando con la riaz del sistema de archivos del usb (ojo)

- Ver en que nueva /dev/sd(xx) está ahora el usb:
# df -h

- Instalamos Grub2 en el USB:
# grub-install --recheck /dev/sd(x)

Importante: Hay que poner el /dev/sd(x) actual del USB, en su raiz.

- Actualizamos Grub:
# update-grub

- Reiniciamos el sistema.

- Cambiar en la bios pra que arranque desde el USB.

6) Comprobar que ha arrancado bien y que estamos en el USB.
Si !!!

7) Pues a celebrarlo

Conviene revisar que todo funciona correctamente.
Revisar el archivo /etc/fstab ya que es fácil que no se monte la partición swab, actualizar con las nuevas UUID si fuera el caso.

Ref.:
http://rootear.com/ubuntu-linux/como-reparar-grub2

3 de agosto de 2014

Google Charts Tips

Unos de las apis más completos para la presentación gráfica de datos en páginas web es
Google Charts.

https://developers.google.com/chart/

Su manejo es muy sencillo y hay numerosos ejemplos, documentación, y muchos post de usuarios (muchos de ellos erróneos, que no funcionan!!) lo que ayuda y a veces dificulta su uso.

Con los ejemplos y documentación la curva de aprendizaje es muy rápida y pronto tendremos gráficas realmente impresionantes en nuestra web.

Aquí dejo un borrador de las notas de las configuraciones que he tenido que hacer y como lo he conseguido:

0) Ejemplo y opciones de una Gráfica con GoogleCharts:
https://developers.google.com/chart/interactive/docs/gallery/linechart


1) Max / Min del eje Y:
vAxis: { minValue: 0, maxValue: 100 },

Si hay algún valor de los datos superior o inferior a minValue o maxValue, no seran tenidos en cuenta.
Para que no se rendericen valores superiores o inferiores a unos max/min hay que hacerlo con:
vAxis: { viewWindow:{max:"value", min: "value"},

https://developers.google.com/chart/interactive/docs/gallery/areachart


2) Fechas en el eje X:
Representar datos con fechas.
Hay que usar new Date( "date", "valor);
La fecha se puede indicar de muchas maneras, tambien se puede usar directamente un TimeStamp.


https://groups.google.com/forum/#!searchin/google-visualization-api/haxis$20date/google-visualization-api/E3XyVBLz8kc/IUOBrgEPxxEJ


3) Formatear fechas en el eje X:
Yo quería que en el eje x indicara la hora, seguido de la letra "h", día y mes: 12h02/04
El código para conseguir esto:
                    hAxis: { format: "HH'h'dd/MM/yy" }

https://developers.google.com/chart/interactive/docs/reference#dateformatter


4) Quitar separador decimal en el eje Y:
vAxis: {format: '0'}

http://stackoverflow.com/questions/15154226/setting-vaxis-format-in-google-line-chart


5) Centrar titulo del gráfico
        ???

6) Quitar leyendas o fijar su posición:
http://stackoverflow.com/questions/14341673/change-color-of-data-title-google-visualization


7) Recopilación de opciones de configuración:

var chart = new google.visualization.LineChart(document.getElementById('visualization'))
.draw(data, {
    legend: { position: "none" }, // turn off the legend
    curveType: "function",
    width: 900, height: 300,
    vAxis: {minValue:0},
    colors: ['#769dbb'], //Line color
    backgroundColor: '#1b1b1b',
    hAxis: { textStyle: {color: '#767676'  , fontSize: 11} },
    vAxis: { minValue: 0, textStyle: {color: '#767676'} },
});

http://stackoverflow.com/questions/14341673/change-color-of-data-title-google-visualization


8) Color y grosor de la lineas de la serie
http://stackoverflow.com/questions/6977877/how-to-change-the-appearance-of-the-google-line-chart


9) Borde y color del grafico:
backgroundColor: { stroke: '#000000', strokeWidth: 1, fill: 'color'}

https://developers.google.com/chart/interactive/docs/gallery/areachart_old?csw=1

10) Determinar color del area de la grafica y color del borde todo junto:
chartArea: { {backgroundColor: {stroke:'black', fill:'#eee', strokeSize: 1}}

https://developers.google.com/chart/interactive/docs/gallery/areachart_old?csw=1



11) Google Chars Wizart !!!!:
https://code.google.com/apis/ajax/playground/?type=visualization

Hay ejemplos y un editor de codigo en el que se pueder ver el resultado y debug


12) Determinar el número de lineas horizontales.
Todavia no he descubierto como hacer una division cada vg 50 puntos.

Se puede poner una matriz con la posición de cada linea.
vAxis: { ticks: [5,10,15,20] }

Y se pueden fijar el número de divisiones
vAxis: gridlines: { count: 4}

Fijar  el numero de lineas secundarias entre dos principales:
vAxis: {minorGridlines: { count:1 } }

Ok, pero no aparecen los numeros en los minorGridlines ???!!!!!

Mi ALGORITMO PARA DETERMINAR NUMERO DE LINEAS:
vAxis: { format: '0', minValue: $ymin, maxValue: $ymax, gridlines:{count:(($ymax-$ymin)/$div)+1} },


https://developers.google.com/chart/interactive/docs/gallery/areachart?csw=1


13) Unir dos series de datos indpendientes en un mismo grafico:
Cuando X es comun a las dos series no se hace con una matriz del tipo:
[x, y1, y2 ...]
Pero cuando los datos son independientes y no coinciden la variable X hay que unir los datos:
http://jsfiddle.net/asgallant/XF7JE/
Esto no me ha funconado, aunque tengo que revisar el código.

Otra forma seria hacruna consmta combinada en SQL,

14) Varios graficas en un pagina web:
https://groups.google.com/forum/#!topic/google-visualization-api/OaG0wS2k2N0

impo: si hay graficos gauge hay que cargar:
   google.load("visualization", "1" ackages:"corechart"]});
   google.load("visualization", "1", {packages:["gauge"]});



14) Dos escalas Y en un mismo gráfico:
Hay que tulizar el tipo de gráfico: ComboChart.

https://developers.google.com/chart/interactive/docs/gallery/combochart

http://stackoverflow.com/questions/11852711/google-visualization-api-format-secondary-y-axis-different-from-primary-y-axis


(  ) Continuará ...







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: