Archive for the ‘TecTec’ Category

Configurar apps2sd desde Linux

Sábado, febrero 5th, 2011

Esta entrada no es sino un resumen de esta entrada de htcmania.com, ésta de 4ndroid.com y ésta de androidwik. Leedlos porque no voy a entrar en demasiados detalles aquí, toda la info está sacada de esos tres sitios.

El objetivo de este asunto es configurar la característica de Apps2sd incluida en la versión 2.2 (Froyo) de android para que por defecto se instalen todas las aplicaciones, excepto unas pocas en las que esto no es posible, en la tarjeta de memoria SD, para liberar la escasa memoria interna de la que disponen algunos terminales con android (como la HTC Desire que nos sirve de ejemplo hoy). Y hacerlo desde Linux, claro ;-)

El primer paso es instalar el SDK de android y la herramienta ADB para acceder al terminal. Tras instalar el SDK y descomprimir adb en la carpeta tools y darle permisos de ejecución… Seguimos,

El siguiente paso es configurar Linux para que reconozca nuestro terminal: En 4ndroid lo explican fácil, sólo tenemos que añadir una regla más al sistema udev para que reconozca nuestra Desire, en mi caso ha sido:

SUBSYSTEM==”usb_device”, SYSFS{idVendor}==”0bb4″, MODE=”0666

en /etc/udev/rules.d/51-android.rules. Leed el artículo original de 4ndroid para otras marcas de terminales.

Reiniciamos y ya deberíamos poder identificar el terminal conectado (habiendo activado el modo depuración y en modo “sólo carga”) con:

adb devices

A partir de ahí, y según lo explican en htcmania, el truco consiste en lanzar el comando

adb shell pm setInstallLocation 2

Para configurar el apps2sd de Foyo para que instale las aplicaciones (las que se pueda) directamente en la tarjeta de memoria en vez de en la memoria interna, independientemente de la opción que escogió el desarrollador al compilar la aplicación.

Si queremos volver al estado por defecto (en el que las aplicaciones se instalan donde seleccionó el desarrollador) pondríamos adb shell pm setInstallLocation 0 y si por algún extraño motivo quisiéramos forzar a que todas las aplicaciones se instalen en la memoria del teléfono adb shell pm setInstallLocation 1.

Conviene no olvidar que los Widgets no funcionan (o al menos no lo hacen bien) desde la tarjeta de memoria externa, así que podéis pasarlos de nuevo a la memoria interna con el propio apps2sd o con app2sd.

Pases de fotografías con kdenlive

Lunes, noviembre 29th, 2010

Kdenlive es uno de los (pocos) editores de video disponibles para Linux (con él monté los videos Sección 4.11 y Café) y si bien termina cumpliendo su misión, en ocasiones se comporta de manera errática y hacer algo tan sencillo como preparar un pase de fotografías, con transiciones entre ellas y música, puede convertirse en una tarea ciertamente frustrante.

Por suerte el otro día encontré un script que te permite generar un proyecto de kdenlive para crear un pase de fotografías de forma automática desde la consola: akw-qt. El script nos permite elegir el tiempo que se muestra cada fotografía, y la duración de las transiciones. Transiciones que se escogen al azar al generar el proyecto.

No soy muy amigo de los efectos especiales en las transiciones, y sólo me interesa utilizar la transición “Disolver”, así que me decidí a intentar modificar el script, y echando un vistazo al script de nowardev y comparándolo con el contenido de un proyecto con transiciones “Disolver”, la verdad es que no fue muy difícil adaptarlo para generar pases de fotografías a través de kdenlive a mi gusto.

El truco principalmente está en sustituir las funciones originales randomeffectlumaodd y randomeffectlumaeven por dissolveodd y dissolveeven respectivamente. Aparte de eso, sólo seguir las instrucciones y poco más.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
dissolveodd(){

number=0                                                     #initialize

echo "effect applied dissolve"                         # print the name of luma files

outslide=$(($2-1))
echo "<transition in=\"$1\" out=\"$outslide\" id=\"transition$3\" >">> "$tempfolder"/automaticslide.kdenlive
echo "<property name=\"a_track\" >4</property>" >>"$tempfolder"/automaticslide.kdenlive
echo "<property name=\"b_track\" >5</property >" >>"$tempfolder"/automaticslide.kdenlive
echo "<property name=\"factory\" >loader</property >" >>"$tempfolder"/automaticslide.kdenlive
echo "<property name=\"mlt_type\" >transition</property >" >>"$tempfolder"/automaticslide.kdenlive
echo "<property name=\"mlt_service\" >luma</property >" >>"$tempfolder"/automaticslide.kdenlive
echo "<property name=\"automatic\" >1</property >" >>"$tempfolder"/automaticslide.kdenlive
echo "<property name=\"kdenlive_id\">dissolve</property>" >>"$tempfolder"/automaticslide.kdenlive
echo "<property name=\"reverse\" >1</property >" >>"$tempfolder"/automaticslide.kdenlive
echo "<property name=\"force_track\" >0</property >" >>"$tempfolder"/automaticslide.kdenlive
echo "<property name=\"invert\" >0</property >" >>"$tempfolder"/automaticslide.kdenlive
echo "<property name=\"softness\" >0</property >" >>"$tempfolder"/automaticslide.kdenlive

echo " </transition >" >>"$tempfolder"/automaticslide.kdenlive

}

Además de utilizar sólo un tipo de transición, añadí una variable extra al principio del script, para seleccionar el perfil de proyecto para kdenlive que queramos. En mi caso hice uno con un tamaño de imagen de 1280×1024 (resolución habitual de monitores y de proyectores) y 23.976 imágenes por segundo, que es la velocidad que suelo utilizar cuando grabo vídeo.

Habría que hacer mucha limpieza de cosas que no utilizo, pero mientras tanto… Aquí os dejo mi versión modificada de akw.

(Sí, la proyección con las fotos de Barcelona la he preparado con este sistema)

Leyendo XML con c#

Lunes, octubre 25th, 2010

Siguiendo con la aplicación de prueba que estoy pensando en hacer de la que os hablé el otro día

Hoy vamos a ver cómo sacar el token que nos servirá para autentificarnos contra Toodledo y obtener nuestras tareas de su servidor. Para ello tenemos que parsear la respuesta XML y buscar el elemento <token> para leer su contenido. Hay varias maneras de hacer esto, y parece que la más adecuada para esta aplicación es utilizar Linq to XML (que nos abstrae del XML en sí, y nos da acceso fácil al contenido), pero al menos una vez en la vida hay que parsear una cadena de texto a mano, así que en esta entrada utilizaré un objeto XmlTextReader para leer secuencialmente el XML hasta encontrar la información que buscamos (supuestamente ésta es la manera más rápida de parsear un archivo XML, así que no está de más conocerla por si en algún momento Linq es demasiado pesado cuando tengamos miles de tareas en nuestro Toodledo).

Hay que tener en cuenta que nos encontraremos una linea de información de la versión del xml, que no vamos a utilizar por ahora. Y a partir de ahí, ir leyendo hasta que encontremos un elemento que tenga el nombre esperado (token en este caso). Llegados a este punto, sacamos el contenido y salimos del bucle.

Fácil, ¿no?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private string getXmlValue(string _xml,string _element)
{
string result="";
XmlTextReader textReader = new XmlTextReader(new System.IO.StringReader(_xml));
textReader.WhitespaceHandling = WhitespaceHandling.None;
while (textReader.Read())
{
if(textReader.NodeType == XmlNodeType.Element && textReader.Name == _element)
{
result = textReader.ReadElementContentAsString();
break;
}
else

{
// Avoid parsing the xml definition, as it does not have closing element
 if (textReader.NodeType != XmlNodeType.XmlDeclaration)
{
if (!textReader.ReadToFollowing(_element)) break;
}
}
}
return result;
}

[Método visto (entre otros lugares) aquí.]

De este modo, pasando nuestra nueva función la cadena que nos devolvió Toodledo, ya tendríamos el token que utilizaremos para generar la clave de autenticación para acceder a nuestras tareas.

1
2
3
string respuesta = "<?xml version='1.0' encoding='UTF-8'?>\n<token>bar</token>"

string token=getXmlValue(respuesta,"token");

Y ya tendríamos token= “bar” :D

Nota aclaratoria: Esta serie de artículos no pretenden ser un manual sobre cómo escribir una aplicación real. Son sólo una prueba de concepto, una serie de notas y trozos de código ineficientes, posiblemente incorrectos, sin comprobación de errores y potencialmente peligrosos para la integridad de vuestra tostadora. Usar con precaución. No me hago responsable de lo que ocurra si tratáis si quiera de compilar este código.

Si realmente queréis hacer una aplicación de este tipo, un buen punto de partida sería utilizar la API sharpgtd de Doug Reichard (que probablemente sea lo que yo haga pronto :)

Peticiones http desde windows mobile con c#

Jueves, octubre 21st, 2010

Estoy considerando empezar a utilizar algún servicio de gestión de tareas en la nube, para probar de una vez por todas el método GTD. Mis mejores candidatos son Remember The Milk y Toodledo, pero ya que ninguno ofrece una manera adecuada (por un motivo u otro) de sincronizar las tareas con un dispositivo con Windows Mobile, estoy considerando hacerme yo mismo el programa que lo haga, que tampoco parece muy complicado…

Probaré con Toodledo para empezar, ya que su API me ha parecido más amigable.

El primer paso será poder enviar peticiones y recibir las respuestas del servidor, que tanto en RTM como en Toodledo son XML. Os dejo un pequeño pseudo-código que hace justo eso:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System;
using System.IO;
using System.Net;
using System.Text;

string res="";
string userID = "foo";
string req = "http://api.toodledo.com/api.php?method=getToken;userid=" + userID;

// Create the request
WebRequest request = WebRequest.Create(req);
// If required by the server, set the credentials.
request.Credentials = CredentialCache.DefaultCredentials;
// Get the response.
HttpWebResponse response = (HttpWebResponse)request.GetResponse ();
// Display the status.
textBox1.Text=response.StatusDescription;
// Get the stream containing content returned by the server.
Stream dataStream = response.GetResponseStream ();
// Open the stream using a StreamReader for easy access.
StreamReader reader = new StreamReader (dataStream);
// Read the content.
string responseFromServer = reader.ReadToEnd ();
// Display the content.
res=responseFromServer;
// Cleanup the streams and the response.
reader.Close ();
dataStream.Close ();
response.Close ();

return res;

En este ejemplo enviamos a Toodledo la petición del token de identificación asociado a nuestro usuario “foo”, y si todo ha ido bien tendremos en la variable “res” la respuesta del servidor, que será algo así:

1
<?xml version="1.0" encoding="UTF-8"?><token>bar</token>

Otro día intentaré interpretar el XML y sacar el valor que nos interesa: “bar”.

Encontrado aquí

Sí, lo sé, soy un insensato :D

Notas para wordpress

Lunes, junio 21st, 2010

Un par de notas rápidas sobre cómo hacer algunas personalizaciones a los temas de WordPress:

<?php wp_list_pages(‘depth=1&sort_column=menu_order&exclude=55&title_li=’ . __(”) . ” ); ?>

<?php $blog_title = get_bloginfo(‘url’); ?>

Y de regalo un par de enlaces más generales: