Importing an OPML into Nokia N9 Feed Reader
As you know (and it's already reported), there's currently no way to import an OPML into the Nokia N9 Feed Reader application (see Harmattan Bug #159).
However, I noticed that when you open a feed link with the built-in browser, it launches the Feed Reader app, and asks you to subscribe to the feed. I guessed that it was communicating with the Feed Reader using D-Bus, so I dbus-monitored it, and that's what I found:
- First, the browser asks the application to subscribe to a given feed (here I'm asking the client to subscribe to my blog's feed):
dbus-send --print-reply --dest=com.nokia.FeedReader \ / \ com.nokia.FeedReader.subscribeFeed array:string:"http://simonpena.com/blog/feed/"
- If the user accepts that, then the Feed Reader application requests the Engine to actually subscribe to the Feed. The nice thing is that, although you cannot (AFAIK) ask the client to subscribe to more than one feed at the time, you can ask the Engine to do it, so this actually works (requesting the engine to subscribe to my blog, Planet Maemo and Planet Igalia):
dbus-send --print-reply --dest=com.nokia.FeedEngine \ / \ com.nokia.FeedEngine.subscribe \ array:string:"http://simonpena.com/blog/feed/","http://maemo.org/news/planet-maemo/rss.xml","http://planet.igalia.com/atom.xml" \ string:"rssatom"
From this point on, it should be quite straight forward to import an OPML into the Feed Reader application. You can use a QDomDocument to parse the OPML or use QML's XmlListModel to parse the OPML file.
XmlListModel {
property string subTitle: ''
query: subTitle ? "/opml/body/outline[@title='" + titleText + "']/outline": "/opml/body/outline"
XmlRole { name: 'text'; query: '@text/string()' }
XmlRole { name: 'title'; query: '@title/string()' }
XmlRole { name: 'type'; query: '@type/string()' }
XmlRole { name: 'xmlUrl'; query: '@xmlUrl/string()' }
XmlRole { name: 'htmlUrl'; query: '@htmlUrl/string()' }
}
Then, you can use this to subscribe to the feeds using D-Bus:
static const QString DBUS_IFACE("com.nokia.FeedEngine");
void Controller::subscribeFeeds(const QStringList &feedList) const
{
QDBusInterface dbusInterface(DBUS_IFACE,
"/",
DBUS_IFACE,
QDBusConnection::sessionBus());
dbusInterface.asyncCall("subscribe",
QVariant::fromValue(feedList),
QVariant::fromValue(QString("rssatom")));
}
I hope you find this useful
Mahjong Solitaire for the Nokia N9
Last week, we got Mahjong Solitaire for N9 finally published.
This has been a great opportunity to use QML in my daily work at Igalia, instead of using it simply for the occasional hacking, such as Butaca or the XKCD reader.
So far, comments in the Nokia Store have been really positive -although some people seem to miss the classic theme from the Mahjongs available back in Maemo. But not only the comments are positive: the application is currently listed in the first position of the Top Free games!
Drop me a line (spena at igalia.com) if you find issues, you have suggestions or if you simply want to complain about the colors
Eclipse CDT indexer with autotools
Quick note on Eclipse's CDT indexer: when using it with a C autotools project, it doesn't index headers and symbols with the AM_SILENT_RULES activated.
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
Commenting out the line let's Eclipse build its index, and then (it looks like) there's no problem setting it back.
UPDATE: In the project properties, under the C/C++ Build page, unclicking Use default build command and settingthe verbose mode for Make,
make V=1
does the trick, without the need to modify the configure.ac
SmashTheStack: Juegos de guerra
Si tuviera que escoger mi aplicación o servicio web favorita, probablemente escogería Google Reader. Inicialmente se "vende" como un lector de RSS, para seguir blogs, noticias y demás. Sin embargo, la componente social es lo que lo convierte en indispensable: puedes leer los elementos que tus contactos compartan, compartir con ellos los que a ti te parecen interesantes, dejar y recibir comentarios… En ocasiones, se crean discusiones muy ricas: mucho más que las que puedas encontrar en un blog "normal", o en Meneame, puesto que te permiten enterarte de la opinión de personas a las que conoces, y no de desconocidos.
Últimamente me estoy aficionando a leer "planets" (agregadores de blogs de una misma temática, bien sea una empresa, una plataforma, o cualquier cosa). Sigo el de Gnome, el de Maemo, el del Máster en Software Libre, el de Igalia… Y fue gracias al de Igalia, aquí, que conocí Smash The Stack.
Ellos se definen como
The Smash the Stack Wargaming Network hosts several Wargames. A Wargame in our context can be described as an ethical hacking environment that supports the simulation of real world software vulnerability theories or concepts and allows for the legal execution of exploitation techniques. Software can be an Operating System, network protocol, or any userland application.
Tienen distintas máquinas, con juegos distintos en cada una. En algunos casos tendrás que hacer buffer overflow exploits, en otros romper una contraseña usando John The Ripper, explorar el contenido de un binario que sospechas almacena la contraseña que te está pidiendo... Lo más interesante es que no se limitan a plantear los desafíos, sino que también plantean pistas, dan documentación, y hasta tienen un foro y un canal de IRC donde responden dudas.
¿Qué hace tan atractiva a esta propuesta? Que estás en un entorno controlado, que no hay posibilidad de hacer daño (o no debería) , que te guían en el aprendizaje... ¡Y que resulta muy divertido! Por lo de pronto estoy jugando en dos de las máquinas: IO y BLOWFISH. En la primera solo jugué un día, y estoy en el nivel 5. En la segunda, nivel 7.
No sé si podréis superarme (:P), pero ¡seguro que os lo pasáis genial si lo intentáis!
SheevaPlug: Instalando Redmine
Más vale tarde que nunca, espero, así que voy a comentar un par de detalles sobre la instalación de Redmine en el SheevaPlug. Redmine es una estupenda herramienta de gestión y seguimiento de proyectos, y en mi caso pretendo usarlo tanto para prácticas realizadas durante la carrera como para pequeños proyectos en fase de "incubación".
Para la instalación de Redmine he seguido varios documentos de referencia: este tutorial en PDF de instalación de Redmine en Debian, obtenido del foro de Redmine; la propia documentación oficial de instalación de Redmine y el apéndice de creación automática de repositorios SVN. Más reciente (noviembre de 2009) es este artículo de la documentación de Redmine, que cubre la instalación de Redmine en Ubuntu.
Pasos previos
Redmine está desarrollado con Ruby On Rails. Soporta diferentes configuraciones de bases de datos, e incorpora un servidor web propio. En mi caso, decidí emplear Apache y MySQL. En teoría es posible utilizar lighttpd como servidor web (ver, por ejemplo, estos tres enlaces), y cualquier otra base de datos (SQLite incluida) para almacenamiento.
Al crear las tablas que usaría Redmine encontré un problema: se me denegaba el acceso como usuario root. Al parecer es un bug común entre los usuarios del SheevaPlug, y estos dos enlaces me permitieron solucionar el problema: How to install mysql on a SheevaPlug y MySql: Access denied for user 'root'@'localhost'. Este debería ser el único problema en este proceso.
Instalación de Redmine
A continuación, se pueden seguir los tutoriales que comentaba antes (instalación de Redmine en Debian e instalación de Redmine en Ubuntu), limitándonos a copiar y pegar los comandos indicados. Es importante escoger bien entre entender los comandos e introducirlos manualmente o copiarlos directamente sin pensar. Ambas son opciones válidas, el problema es (ay, como en todo) mezclar. Las dos líneas que siguen me dieron muchísimos problemas: pensé que eran iguales, y las puse a mano. Y claro, una cosa es el acceso y otra la autenticación.
PerlAccessHandler Apache::Authn::Redmine::access_handler PerlAuthenHandler Apache::Authn::Redmine::authen_handler
Instalación y configuración de subversion
Para integrar nuestra instalación de subversion con Redmine, volvemos a los tutoriales que comentaba antes: automatización de la creación de repositorios y gestión de acceso a los repositorios mediante apache. De ese modo, al crear un proyecto, se creará su repositorio automáticamente (pasado el tiempo que indiquéis en el crontab). Los accesos que hagáis al repositorio a través de Apache comprobarán si estáis autorizados para verlo.
Importando contenido de un repositorio ya existente
En caso de que tuvierais algún repositorio funcionando previamente y estéis migrando la instalación a Redmine, quedaría por importar el antiguo contenido. Para eso nos guiaremos por Moving a Subversion Repository to Another Server. Básicamente, para cada repositorio que queramos preservar, haremos:
svnadmin dump /path/to/repository > repo_name.svn_dump
A continuación, si no hemos creado el repositorio automáticamente con el mecanismo automático, lo haremos mediante
svnadmin create /path/to/repository
Y realizaremos la importación tecleando
svnadmin load /path/to/repository < repo_name.svn_dump
SheevaPlug: Actualizando el Kernel
Actualizando el kernel
Para actualizar el kernel, los pasos a seguir también están perfectamente detallados en el wiki: Install Prebuilt Kernels From sheeva.with-linux.com. En primer lugar, deberemos conectarnos al SheevaPlug mediante puerto serie. En esta página se indican diferentes posibilidades Serial terminal program. Por mi parte utilicé screen del siguiente modo (el primer parámetro es el dispositivo reconocido como puerto serie, y el segundo, la velocidad de la conexión):
tu_usuario@tu_maquina:~$screen /dev/ttyUSB0 115200
Al pulsar una tecla, debería aparecer un prompt
login:
Introducimos ahí el usuario root y su contraseña, y entramos. Instalamos wget si no lo habíamos hecho ya:
#apt-get install wget
Guardamos el archivo README desde sheeva.with-linux.com. (Posiblemente haya kernels más recientes cuando leas este post).
#wget http://sheeva.with-linux.com/sheeva/README-2.6.31
Según la entrada en el wiki, se debe modificar el archivo /etc/sysctl.d/10-process-security.conf, y vm.mmap_min_addr debe valer 32768. Según la página, no realizar ese cambio inhabilitaría cualquier acceso distinto del puerto serie.
#vi /etc/sysctl.d/10-process-security.conf
Añade la siguiente línea
vm.mmap_min_addr = 32768
Dale permisos de ejecución al archivo descargado:
#chmod +x README-2.6.30.6
Ejecútalo para descargar y escribir los módulos e imagen del kernel.
# ./README-2.6.31 Use --nandkernel to write kernel to NAND Or --rootkernel to write kernel to /boot
En este punto, los nuevos scripts README no permiten la ejecución sin argumentos: debe especificarse --nandkernel para escribir en la NAND, o --rootkernel para escribir en la partición /boot. Si escoges la primera opción, se sobreescribirá el kernel que trae el Sheeva por defecto. Si escoges la segunda, deberás referenciar la ubicación del nuevo kernel en los parámetros de arranque. Yo empleé la primera opción, así que desconozco como indicar la ruta requerida por la segunda: si vas a seguir ese camino, consulta en el foro oficial
#./README-2.6.31 --nandkernel
Reinicia
#shutdown -r now
Ahora, cuando el SheevaPlug comience a cargar, debes pulsar alguna tecla para interrumpir el proceso. Entrarás en un prompt interactivo (la consola de uBoot), donde podrás modificar los parámetros de la carga.
Lo primero:
set mainlineLinux yes
A continuación
set arcNumber 2097
Ahora debes obtener los parámetros de arranque actuales y anotarlos, para su posterior modificación
printenv bootargs
A la ristra de información que te devolverá, deberás añadirle rootfstype=jffs2. También deberás sustituir nand_mtd por orion_nand. El resto debe permanecer igual. Es decir, si tenías
parametro1=valor1,valor2 parametro2=valor1,valor2 parametro3=nand_mtd
Tu nuevo bootargs deberá ser
rootfstype=jffs2 parametro1=valor1,valor2 parametro2=valor1,valor2 parametro3=orion_nand
(Y deberás establecerlo mediante)
set bootargs la ristra de parámetros modificada
Una vez hayas acabado de modificar los valores, teclea
saveenv
Y reinicia:
resest
En el siguiente arranque, el nuevo Kernel debería utilizarse.
¿Qué hacer si algo falla?
Lo primero, mantener la calma. Si utilizas --rootkernel por error, modificas los parámetros en uBoot pero no configuras la dirección de tu imagen en la variable boot_cmd, el mecanismo de arranque no será capaz de arrancar la imagen antigua con la nueva configuración.
Lo más sencillo es restaurar estas variables a sus valores anteriores, reiniciar usando la imagen antigua, e instalar el kernel en la NAND.
En Factory Default u-Boot Environment se indica el valor de las variables de uBoot en un sistema original, de fábrica: si solo habéis modificado esas dos variables, id a la segunda sección. Si habéis metido mano de un modo más general, en la primera sección se explica cómo resetear por completo la configuración.
SheevaPlug: Primeros pasos
En esta entrada comentaré los primeros pasos que se aconsejan dar con el SheevaPlug. Están tomados del wiki oficial, concretamente de New Plugger How To y QuickStart (principalmente la primera fuente), y traducidos. Aunque me referiré inicialmente a la conexión por ssh, en principio no debería haber ningún problema en ejecutar todos estos pasos desde el puerto serie.
ATENCIÓN: si copiáis y pegáis algo de lo que comento que vaya entre comillas, aseguraos de que son las adecuadas. Es muy habitual que los blogs sustituyan las comillas dobles por comillas literarias
Conectándonos al Sheeva
El SheevaPlug trae inicialmente un sistema Ubuntu instalado: Ubuntu 9.04 "Jaunty Jackalope". Para comenzar a utilizarlo nos conectaremos al sistema por ssh, de modo que habrá que enchufar el Sheeva a nuestra red. Los routers más habituales traen configurado por defecto un servidor dhcp, con lo que al conectar el sheeva a la red, ya obtendrá una ip.
Para consultar la ip asignada, podemos ir al menú de "Lista de clientes" de nuestro router, o, con una herramienta como nmap, consultar todas las ips de nuestra subred.
tu_usuario@tu_ordenador:~$ssh root@ip_asignada
El usuario a utilizar es root, y la contraseña, nosoup4u. Una vez dentro, es interesante cambiar este valor y poner el que más nos interese, mediante el comando passwd.
Arreglando la instalación
Lo primero que arreglaremos es la resolución de DNS. El cliente DHCP está configurado para ignorar los servidores que indica el servidor, y pretende resolver nombres localmente.
Edita el archivo /etc/dhcp3/dhclient.conf y comenta o borra la línea "supersede domain-name-servers 127.0.0.1;"
Actualiza las DNS:
#dhclient eth0
Comprueba que funcione
#ping kernel.org
El directorio /var/cache/apt/archives/partial, usado por el sistema de gestión de paquetes APT, está montado en la RAM, de modo que se limpia en cada arranque. Sin embargo, aunque el fabricante incluye un script para crear este directorio al inicio, el script no funciona correctamente.
Edita /etc/rc.local. Los dos comandos insmod fallan, y puesto que la shell se invoca con el flag -e, el fallo en un comando provoca que el script aborte su ejecución. Borra o comenta todas las líneas salvo "mkdir -p /var/cache/apt/archives/partial". Tras esa línea puedes añadir la línea "/usr/sbin/ntpdate-debian" para sincronizar tu reloj a través de internet. Tras finalizar la edición, ejecuta el script.
#/etc/rc.local
La zona horaria no está establecida: ejecuta el siguiente comando, y selecciona la más apropiada:
#dpkg-reconfigure tzdata
Actualizando la instalación
Al llegar a este punto, en el wiki se recomendaba precaución. Suponemos en todo momento que tenéis una conexión activa por ssh a vuestro Sheeva. Pues bien, al finalizar la actualización del sistema, se recomienda intentar establecer una nueva conexión sin cerrar la anterior: si algo falla, es más sencillo solucionarlo. Cierto problema al modificar el nombre de la máquina (hostname), combinado con la actualización del sistema, podría impedir que os conectaseis. En este enlace se explica el problema con más detalle, y en este otro se comenta como solucionarlo. De todos modos, yo no tuve ninguna complicación en los siguientes pasos.
Primero: actualizar la lista de paquetes:
#apt-get update
A continuación: actualizar la distribución
#apt-get dist-upgrade
Por último, eliminar aquellos paquetes que no sean necesarios
#apt-get autoremove
Al llegar a este punto, y antes de reiniciar, es cuando conviene comprobar que podemos establecer una nueva conexión por ssh. Si todo va bien, reiniciar.
#reboot -h now
A partir de aquí, ya podemos instalar paquetes (wget, por ejemplo) como en cualquier distribución basada en debian:
#apt-get install wget
Teniendo presente en todo momento las limitaciones de espacio que nos encontraremos.
En la siguiente entrada hablaré de cómo se actualiza el kernel. No es una tarea especialmente difícil, y tiene también su entrada en el wiki oficial: Install Prebuilt Kernels. Sin embargo, hay alguna diferencia entre el proceso actual y el descrito allí, y puedo aportar la solución a ciertos problemas por los que ya pasé
Sheeva wins: introducción al plug computing
El día 7 de septiembre encargamos un compañero de trabajo y yo un Sheeva Plug. Se trata de un dispositivo embebido de bajo consumo con las siguientes características:
- CPU ARM a 1.2 GHz
- 512MB DDR2 de Ram
- 512MB de memoria Flash interna
- Lector de tarjetas SD
- Puerto USB 2.0
- Puerto Ethernet GigaBit
Ukki, un conocido de la comunidad de Maemo, me había hablado maravillas del suyo. El suyo había tardado unas seis semanas en llegarle, pero nosotros fuimos más afortunados: el 21 de septiembre lo teníamos aquí. En esta galería de picasa tengo la sesión de desempaquetado completa, pero añado 3 imágenes al post.

SheevaPlug - Contenido del paquete

SheevaPlug vs Fuente de alimentación del MacBook

SheevaPlug - Puertos Ethernet y USB
Mis objetivos iniciales eran montar Redmine para mis proyectos personales, mt-daapd para compartir música de manera compatible con iTunes, y organizar un sistema de backup con rsnapshot. Ah, y tener más o menos permanentemente un cliente de IRC conectado mediante screen (irssi + screen). En las siguientes entradas iré comentado qué tal se me han dado estas tareas: la idea también es dar un poquito de soporte en español, puesto que en inglés ya existe muy buena documentación en la comunidad OpenPlug.
PD: Resulta que Sheeva es un personaje de la saga de Mortal Kombat
