El credo de WordPress

“(…) recordaré los días en que aún no lo sabía todo (…)”

I will never stop learning. I won’t just work on things that are assigned to me. I know there’s no such thing as a status quo. I will build our business sustainably through passionate and loyal customers. I will never pass up an opportunity to help out a colleague, and I’ll remember the days before I knew everything. I am more motivated by impact than money, and I know that Open Source is one of the most powerful ideas of our generation. I will communicate as much as possible, because it’s the oxygen of a distributed company. I am in a marathon, not a sprint, and no matter how far away the goal is, the only way to get there is by putting one foot in front of another every day. Given time, there is no problem that’s insurmountable.

(extraido de “Why Your Company Should Have a Creed”)

La guerra de las tabletas, 2011

La guerra de las tabletas no cesa… Kindle Fire y Sony Tablet codician el trono del iPad (2)… junto con rivales “clásicos” Samsung Galaxy Tablet De momento los analistas afirman que Apple mantendrá el dominio durante 2012, pero si el Kindle Fire funciona bien, puede quedarse con el trozo del pastel de quien no va a gastarse 500 euros en un iPad, o equivalentes…

Todos los competidores se basan en Android, excepto el liquidado HP Touch Pad con su prometedor WebOS (linaje Palm). O sea, en otro plano, también sigue la batalla Apple iOS vs Google Android…

Recuperar ficheros borrados accidentalmente en Windows

Has borrado accidentalmente tus valiosos ficheros de tu disco duro (interno o externo)? Si no los encuentras en la papelera, seguramente hayan pasado a mejor vida… pero quizá no todo esté perdido… porque tienes una copia de seguridad de esos ficheros a mano, verdad?

Si la respuesta es no, aún sigue sin estar todo perdido (aunque te la estés jugando 😉 …) Con DiskGenius tus probabilidades de recuperarlos aumentan considerablemente. Siempre que no se haya escrito sobre ellos (por eso es importante expulsar el disco o apagar el ordenador lo antes posible). En caso de que los ficheros se encontraran en un disco interno, lo más recomendable es intentar la recuperación arrancando desde un CD como por ejemplo el Hiren Boot CD (que casualmente incluye DiskGenius)

DiskGenius soporta sistemas de ficheros NTFS & FAT (típicos de Windows). Si tu sistema operativo es Mac o Linux, probablemente tus ficheros se encuentren en un sistema HFS+ o ext3/ext4. La cosa se complica un poco…

Por cierto, DiskGenius también puede resolver tus problemillas con las particiones de disco…

Atajos teclado tmux

Tmux, reencarnación moderna de screen digna de ser probada.

Los atajos deben precederse con Control-b (puede cambiarse, por ejemplo al clásico Control-a de screen).

Por ejemplo, para cambiar de panel (atajo “o”), tendríamos que teclear “Control-b o”

Algunos atajos interesantes que vienen “de serie” son…

? “ayuda” (lista de atajos en uso)
c crear ventana
% dividir ventana actual en dos paneles verticales
número ir a ventana (por número 😉 )
, renombrar ventana actual
[ cambiar a modo selección (según modo de edición. Por defecto, )
] pegar lo copiado en el modo selección (por defecto, “copiar y pegar” sólo funciona “localmente”, es decir, entre sesiones de tmux en un mismo ordenador)
p / n ventana anterior / siguiente
o siguiente panel
; último panel
q lista de paneles (se puede elegir uno tecleando su número)
z “maximizar” panel (zoom)
M-cursor cambiar tamaño panel
M-1..M-5 Elegir distribución: equitativa horizontal (1) o vertical (2), en celdas (5)
espacio cambiar disposición paneles ventana actual (horizontal/vertical)
w lista de ventanas.
r redibujar
& matar ventana actual
d desconectar de la sesión tmux (se puede reconectar ejecutando tmux attach)
: prompt para ejecutar comandos, por ejemplo source-file ~/.tmux.conf (recargar configuración después de modificarla)

Para usar el portapapeles de las X, hace falta añadir en ~/.tmux.conf algo del estilo…

# "pegar" desde portapapeles X a buffer tmux
bind C-y run "tmux set-buffer \"$(xclip -o)\"; tmux paste-buffer"

# "copiar" desde buffer tmux a portapapeles X

# opción A: usar C-b C-w para copiar al portapapeles lo que se ha copiado en el "modo copia"
# con "xclip -i", tmux deja de responder al prefijo...
# bind C-w run "tmux save-buffer - | xsel -i -b"

# opción B: dentro del "modo copia", reutilizar el atajo M-w para copiar en el portapapeles X
bind -t emacs-copy M-w copy-pipe "xsel -i -b"

xclip por defecto usa el portapapeles “primario” (el de el botón medio del ratón), por eso si queremos usar el portapapeles “moderno” (el de “Control-C Control-V”) hay que especificárselo con “-selection c”. Más sobre xclip…

Sugerencia: usar xsel en vez de xclip con tmux

Los atajos se pueden definir en la tabla global, con “bind”, o en una tabla en concreto, con “bind -t”

Fn + F7 no funciona en Linux

Activar la salida de monitor o apagar la pantalla del portátil requiere de la intervención del servidor X, bien a través de la extensión Xrandr o bien a través del controlador nativo. Por ejemplo, en el caso de tarjetas ATI se recurriría al comando aticonfig

Si XRandr está activado, se pueden ejecutar los siguientes comandos:

 

xrandr -q
# muestra un listado de los monitores disponibles. Normalmente, la 
# pantalla del portatil (LVDS) y el monitor externo 
# (CRT1 o VGA) si está conectado.
# Apagar pantalla P
xrandr --output P -off

# Encender de nuevo la pantalla P
xrandr --output P --auto

Las últimas versiones de distribuciones como Ubuntu ya integran esa funcionalidad, y lo que hacen precisamente es llamar a estos comandos cuando el usuario pulsa el atajo Fn + F7

xrandr también soluciona el problema de que en Ubuntu, con la pantalla configurada en modo mirror, el monitor externo use una resolución inferior a la máxima. Por ejemplo, si el monitor se identifica como VGA1:

xrandr --output VGA1 --mode 1680x1050

Al cambiar la resolución, puede que el escritorio siga en la resolución anterior, ya que la pantalla del portátil seguramente no alcance la resolución que hemos puesto a la externa. La solución más simple es desactivar la pantalla del portátil (en este ejemplo, LVDS1):

xrandr --output LVDS1 --off

Los cambios se pueden hacer “permanentes” en el fichero /etc/gdm/Init/Default

Debian USB para EFI y BIOS

La idea es poder arrancar / instalar Debian desde un pendrive (llave / pincel USB) tanto en ordenadores con arranque BIOS (clásico de PCs y compatibles) como con arranque EFI (el supuesto futuro, por ahora casi exclusivo de ordenadores Mac Intel)

En “Cómo crear un USB con Ubuntu Live para Mac y PC” proponen un método que aprovecha la emulación BIOS de los microcódigos de algunos Mac, por lo que es propenso a fallos (por ejemplo, “Error: Not found while loading legacy loader”). La alternativa es integrar un gestor de arranque EFI, por ejemplo Grub2, como plantean en “Testing on UEFI

Todos los ficheros (grub, live cd, etc) deben ser para la arquitectura del ordenador en el que se va a usar (por ejemplo, amd64)

PASOS EN LINUX

Particionar el pendrive (por ejemlo, /dev/sdb)

sdb1: ext3 (en fdisk 82) –  32 MB (para que quepa el directorio boot del live cd)
sdb2: HFS+ (en fdisk AF) – 16MB
sdb3: FAT32 (en fdisk, b), activa (boot) – resto espacio disponible

Crear los sistemas de ficheros ext3 y FAT32 con mkfs

Montar la imagen filesystem.squashfs para poder copiar en sdb1 el directorio boot que contiene

Instalar grub2 en el MBR del pendrive, usando como directorio raiz el sistema de ficheros ext3 (sdb1)

grub-install --root-directory=/mnt/sdb1 /dev/sdb

Copiar los ficheros del Live-CD de Debian al sistema FAT32. En el live CD, los ficheros de arranque son /live/vmlinuz y /live/initrd.img (esto es importante para configurar el grub, ver más abajo)

PASOS EN MAC

Formatear la partición HFS+ (disk2s2 en Mac) con Disk Utility

Copiar la carpeta efi (dentro del paqute refit .dmg) a la partición HFS+

Ejecutar como superusuario el script efi/refit/enable.sh.

sudo enable.sh

Este script instala refit en el pendrive, con lo que la tabla de particiones pasa a formato GPT

Al arrancar el Mac, dejar pulsada la tecla Alt para que permita elegir el dispositivo de arranque. Elegir el pendrive.

Una vez en grub, configurar el arranque a mano:

root (hd0,3)
linux /live/vmlinuz boot=/live live-config
initrd /live/initrd.img
boot

El autologin debería estar activado (gracias al parámetro live-config). En caso de que pregunte por usuario y clave, usar user y live.

Ejecutar el instalador (debian-installer)

Se puede consultar documentación sobre configuración del linux live en las páginas live-boot y live-config (usando man)

Para instalar Debian desde el Live-CD se está desarrollando el paquete live-installer. Otra forma de instalar Debian desde USB es copiando los ficheros de un disco de instalación, por ejemplo netinst. En este caso los ficheros son install.amd/vmlinuz e install.amd/initrd.gz (una vez definida la raiz con root, se puede ejecutar ls para buscar esos ficheros)

Otras distribuciones como Fedora permiten crear un pendrive de instalación UEFI directamente

Enlaces de interés:

Manual de Debian-Live

GPT

Linux en Apple Xserve

Depurar código con gdb


> gdb programa

# especificar los argumentos del programa
run argumentos

# se pueden especificar puntos de parada usando fichero y linea,
# el nombre de una funcion, o clase y método
break fichero.c:linea
break nombre_funcion
break clase::metodo

# listado de puntos de parada
info breakpoints

# eliminar punto de parada X
delete breakpoint X
# eliminar todos
delete breakpoints

watch
awatch 

# Inspeccionar variables
display variable
print variable

# mostrar codigo fuente "alrededor" de la línea en ejecución
list 

# Control de ejecución
# siguiente linea, sin entrar en la llamada (atajo: "n")
next
# siguiente, entrando dentro de la llamada (atajo: "s")
step
# proseguir (atajo: "c")
continue

# Imprimir la pila de llamadas (atajo: "bt")
backtrace

#Recorrer la pila de llamadas
up

# gdb también permite "tracear" el código, con los "tracepoint commands"

Depurar codigo Java JNI en Linux

Depurar una mezcla de código Java y C++ no es trivial, sobre todo porque aún no hay disponibles entornos (o plugins) estables que soporten esta posibilidad. Con lo cual hay que recurrir a la siguiente receta, que permite interactuar a la vez con los depuradores nativos de cada lenguaje (sean para consola como gdb, o gráficos como NetBeans)

Primero iniciar el programa en modo de depuración remota:

java -Xdebug -Xnoagent -Djava.compiler=none -Xrunjdwp:transport=dt_socket,server=y,suspend=y -Djava.library.path=$LD_LIBRARY_PATH -cp . -jar PROG.jar
Listening for transport dt_socket at address: 37112

Es importante definir java.library.path para que contenga el directorio donde se encuentra la biblioteca .so con el código nativo (en este caso, se le asigna el valor de la variable de entorno LD_LIBRARY_PATH).

Iniciar el depurador de Java y conectarse al puerto indicado por el comando anterior (en el ejemplo, 37112)

jdb -attach 37112

También se puede utilizar un depurador gráfico, por ejemplo el que viene con Eclipse. Para ello basta crear un perfil de depuración de tipo “Remote Java Application”. En Connection Properties usar localhost y como puerto el que nos devolvio el anterior comando java (siguiendo con el ejemplo, 37112)

Establecer el punto de parada en el código Java

stop at CLASE:NUM_LINEA
run

Una vez alcanzado el punto de parada en el código Java, iniciar el depurador de código nativo y vincularlo con el proceso java mediante su PID

gdb
attach PID
break JNI_FUNCTION

continue (retoma la ejecución del programa java)

Importante: para que el depurador C++ encuentre la función JNI, el programa Java debe tener ya cargada la biblioteca C++ (archivo .so). Si paramos la ejecución del programa Java demasiado pronto, cuando entremos en el gdb la biblioteca aún no se habrá cargado y por lo tanto al intentar el “break” se quejará de que no encuentra la función.

Estos tres comandos gdb también pueden ejecutarse dentro de ddd, lo cual nos permite depurar el código C++ con la comodidad de un entorno gráfico

Por último, de vuelta en jdb ejecutar run de nuevo (continua la ejecución en el depurador y se detiene en el breakpoint del código nativo definido en gdb)

Plugins WordPress interesantes

Para hacer copias de seguridad de la base de datos, WordPress Database Backup. Para limpiarla (“optimizarla”), WP-Optimize.

Para agilizar la carga de las páginas, WP Super Cache.

Para una integración en Facebook y Twitter: Facebook Open Graph, Google+ & Twitter Card Tags o WP Facebook Open Graph protocol.

SEO: All in One SEO Pack

Para mostrar código, SyntaxHighlighter Evolved.

Para incrustar fácilmente videos de Youtube (si no viene de serie), WP Youtube Lyte

Para “proteger” los cambios, Revision Control.

Para recibir alertas cuando se hacen cambios, Email Post Changes.

Para reducir el spam, WP-SpamShield.

Formularios: WP Forms Lite o Contact Form 7

Humildad y aprendizaje

En “Por qué soy el mejor programador del mundo” (ironicamente) Jeff Atwood resume las opiniones sobre la humildad que aparecen en “Code Complete 2.0”:

Los peores programadores son aquellos que se niegan a aceptar el hecho de que
sus cerebros no son iguales a la tarea.
Sus egos les impiden ser grandes programadores.
Cuanto más aprendas a compensar tu pequeño cerebro, mejor programador serás.
Cuanto más humilde seas, más rápido mejorarás.

Ya lo decía un Mestre:

Menino seja humilde
e louve ao seu camarada
quem diçer que tudo sabe
é porque não sabe nada

La humildad con sabor árabe:

Quien no sabe que no sabe, es un necio: aléjate de él.
Quien sabe que no sabe es humilde: enséñale.
Quien no sabe que sabe está dormido: despiértale.
Quien sabe que sabe se percata de cuánto le queda por saber, y continúa por la senda del aprendizaje.

Sabiduría china: “Quien le gusta aprender está cerca de saber”

Desde Dinamarca: “A quien teme preguntar le avegüenza aprender”

En la música popular: “Sólo de errores se aprende” (Alejandro Sanz). Variante italiana: “Por la ignorancia nos equivocamos y por las equivocaciones aprendemos”

Recuperar contactos iPhone

Al sincronizar con iTunes por defecto se hace una copia de seguridad automática de los datos del iPhone, incluyendo los contactos. Pero a veces ocurre que al restaurar esa copia de seguridad los contactos no se restablecen.

En esos casos no todo está perdido: se puede acceder a los contactos del backup siguiendo los siguientes pasos:

  • Abrir el fichero 31bb7ba8914766d4ba40d6dfb6113c8b614be442.mddata (que está dentro del backup que hace iTunes) con sqlite3
  • Configurar la salida de sqlite con los comandos “.header on”, “.mode csv” y “.output contactos.csv”
  • Ejecutar la siguiente consulta en sqlite: “select First, Last ,Organization, Department, Note, ABMultiValue.value from ABPerson, ABMultiValue where ABMultiValue.record_id = ABPerson.ROWID;”
  • Salir (“.quit”)

Con esto tendremos en el fichero contactos.csv un volcado de los contactos según se guardaron en el backup. A partir de aquí se puede procesar ese fichero para adaptarlo al formato de la herramienta que vayamos a usar para introducirlos de nuevo en el iPhone (Google Contacts, Address Book, Outlook…)

Como siempre, es mucho más sencillo hacer múltiples backups antes del desastre que intentar restaurar datos después del desastre. Por eso es conveniente habilitar la sincronización de los contactos con algún programa externo (nuevamente Outlook, Address Book, Google Contacts o similares) y hacer copias de seguridad tanto del iPhone como de los datos de esos programas extrernos (Google Contacts permite exportar los contactos en formato csv y vcal)