martes, 27 de mayo de 2008

Sólo se le podía ocurrir a un symio



Impresiona como de desafortunadas pueden ser algunas campañas publicitarias, no he contrastado si esto es cierto(es decir, puede que esto sea una leyenda urbana), pero al parecer existe una nueva campaña de symio orientada a la comunidad gay...lo que no sé es si sólo pensaban descartar esta comunidad como clientes en potencia, si es que el concepto de captar clientes no es el mismo que el mío o si la agencia de publicidad al completo bebía demasiado (o demasiado poco)...porque manda cojones la campaña

sábado, 24 de mayo de 2008

Un rincón de la nostalgia: the matrix


MORPHEUS: I imagine, right now, you must be feeling a bit like Alice, tumbling down the rabbit hole?
NEO: You could say that.
MORPHEUS: I can see it in your eyes. You have the look of a man who accepts what he sees because he is expecting to wake up.
[...]
MORPHEUS: The Matrix is everywhere, it's all around us, here even in this room.You can see it out your window or on your television. You feel it when you go to work, or go to church or pay your taxes. It is the world that has been pulled over your eyes to blind you from the truth.
NEO: What truth?
MORPHEUS: That you are a slave, Neo. Like everyone else, you were born into bondage, kept inside a prison that you cannot smell, taste, or touch. A prison for your mind.
MORPHEUS: Unfortunately, no one can be told what the Matrix is. You have to see it for yourself.
[Morpheus opens his hands. In the right is a red pill.In the left, a blue pill.]
MORPHEUS : This is your last chance. After this, there is no going back. You take the blue pill and the story ends. You wake in your bed and you believe whatever you want to believe.
You take the red pill and you stay in Wonderland and I show you how deep the rabbit-hole goes.

miércoles, 14 de mayo de 2008

Qué hace la gente cuando no es famosa

Pues no lo sé, ya escribiré si conozco a alguien que haya sufrido el cambio en uno u otro sentido.

De momento sólo puedo contar qué hacía George Clooney antes de alcanzar la fama, cuando nosotros aún no habíamos nacido y él aún no tenía canas....


Return to Horror High!





Esto no tiene la más mínima importancia, salvo por las maravillosas escenas que esta película ha dejado para la posteridad, como por ejemplo la de cómo te puede matar un ventilador industrial o cómo diseccionar a tu profesor como si fuera una rana...impresionante



Y también estuvo en este maravilloso clásico, el retorno de los tomates asesinos...jummy




En el siguiente se le puede ver actuando a partir de los 3:40 como compañero de piso del amante de la chica que hace de transportista de los tomates asesinos...apasionante, ¿verdad?


martes, 13 de mayo de 2008

Celebración

Hoy es día de celebración, éste es el post 104 (aleluya, aleluya, aleeeluya), que no me he dado cuenta antes... y ha tocado el 104.

Y para celebrar tan grande evento, ofrezco organizar para el que quiera uno o varios de los evento escritos a continuación:

  • Camino de Santiago.
  • Interrail por donde sea.
  • Tomatina en Buñol.

Completamente organizado, sólo poner fechas en común y listo, no lo dudéis, unios.

lunes, 12 de mayo de 2008

El lado correcto del espejo

Comenta Neil Gailman en boca de uno de sus personajes que "conducir en América es como conducir por el otro lado del espejo".
Supongo que esa referencia intenta decir cómo está de arraigado el personaje como hijo de la Gran Bretaña que es, tal vez para mostrar un poco de su personalidad.

En fin, a lo que iba, que independientemente de lo que quiera decir realmente esa referencia (lo mío nunca han sido las cosas de leer ;P ), es el mundo colonial el que está al otro lado del espejo...y me he puesto a pensar...

Bien, Henry Ford nació, creció y creó su emporio en los EEUU, donde conducen como personas civilizadas (;-P), aunque no fue él quién creó el primer automóvil, sino Karl Benz 24 años antes. Aunque Karl Benz no se posicionó en qué lado era el correcto (lo puso en el centro) sí lo hizo Ford, personaje involucrado en la evolución del mundo civilizado.

Ahora bien, teniendo en cuenta todo eso...¿cómo fue que en el Reino Unido y sus colonias se le dió a todo la vuelta?

De ahí que me imagine en 1885, a Sir. Carbide, en su lujosa mansión de Bloomsbury, recibiendo uno de los primerísimos modelos híbridos entre coche y carro de tiro, ordenándole a su encargado de cuadras que se las ingeniara de alguna manera para situar el mando del vehículo más hacia la izquierda, que un hombre de su posición no iba a permitir que le azotaran simples lacayos simulando hacérselo a sus caballos.
El pobre hombre, después de varios intentos, en los que casi pierde el empleo y su mano derecha, y haciendo gala de todo su ingenio y de sus conocimientos como aprendiz de relojero consigue aproximar el mal llamado volante hacia donde su amo dijo.

Unos cuantos años después, cuando sus vecinos comienzan a recibir los primeros modelos de Benz le piden al encargado de las cuadras de su vecino que haga lo mismo, Sir Carbide lo hace encantado, relamiéndose por el gran número de fiestas a las que va a ser invitado (aunque se le reconoce como un apuesto caballero él se teme que haya pasado su momento de resultar un buen partido para las damas).

Cuando los primeros modelos del Ford-T llegan al Reino Unido, el mercado potencial con el que se encuentra se niega a aceptar un volante en esa posición...¡imposible! con todo el esfuerzo que les ha costado conseguir manejar ese extraño carromato, como para que pretendan ahora volverles a enseñar. El encargado de Sir Cadbury hace años que dejó la mansión (ahora hogar de una enorme familia) para establecerse y fijar su primera cuadra para coches...la denomina "taller" (habráse visto...)

...el mozo se llamaba
Lionel Martin, y gracias a él comenzó la fabricación de la gama de lujo de estos vehículos (Aston Martin), ideados sólo (en principio) para los más grandes hijos de la Gran Bretaña...


viernes, 9 de mayo de 2008

Se acabó

Ya se ha acabado, hace...no sé si hemos ganado o no (dejé el trabajo una vez estuvo terminado el proyecto y nadie me ha dicho nada hoy)...pero si no he recibido ninguna notificación por parte de ninguno de los compañeros es que a nadie le ha llegado nada...

Eso sí, como nota de consolación, si alguna de las aplicaciones que habéis enviado (cliente-servidor, como es nuestro caso) ha tenido visitas después del 28 de abril es que estábais en el top 100,..., a mi me sirve de consuelo al menos...o eso creo, que tal vez es peor quedar segundo que tercero...

No obstante, aunque a nadie le interese, voy a continuar con android, tal vez (no, más bien seguro) mucho menos, pero voy a continuar,..., porque se ha metido mucho en mi vida y ahora me toca meterme en la suya...

Sólo me gustaría que viérais (leyérais) la ansiedad de la gente en los foros [1,2 y 3 de muchos], que es más o menos la que sentía yo por dentro

Hay un segundo ADC

Aparte de la segunda ronda del ADC actual existirá otra, bajo unas condiciones semejantes, a finales de este año, dada la acogida que por lo visto ha tenido el concurso... de acuerdo con uno de los desarrolladores:

"...There are two Challenges, which we call Challenge 1 and Challenge 2. Each

of these is allocated half of the $10,000,000 fund. Challenge 1 is the one
going on right now; Challenge 2 will begin later this year, after Challenge
1 has concluded.

Challenge 1, meanwhile, is broken into two parts and has two deadlines. The
first deadline is for anyone to submit an application (according to the
eligibility rules); this is the April 14th deadline, and we call it Round
1. Judges will then evaluate and choose the best submissions, and those
developers will receive $25,000. They'll also be given a period of time --
which we call Round 2 -- to further polish their applications, and submit
the new versions by a second deadline. The winners of the final, larger
prizes will be chosen out of the Round 2 submissions. Only developers who
are awarded a prize in Round 1 will be eligible to submit for Round 2.

To summarize: Challenge 1 has two phases, Round 1 and Round 2. Only
winners of Round 1 may participate in Round 2. Challenge 2 will begin later
this year, and will be a totally separate event. "


Así que preparaos para lo peor , XDDD

jueves, 8 de mayo de 2008

Android 101: los recursos, ese gran desconocido (I)

Bien, hoy vamos a hablar de recursos, sobre cómo incluirlos en nuestro código de manera que queden correctamente agrupados en la aplicación.

Tenemos tres alternativas para hacerlo:

  1. Meter lo que queramos en la carpeta assets(1)
  2. Meter los fichero de manera lógica en la carpeta res.
  3. Si los archivos son creados partiendo de la ejecución de la aplicación crearlos en un directorio asignado para la aplicación específica bajo la ruta /data/app/<paquete>/files (en el caso del post anterior la ruta sería /data/app/mi.paquete.test1/files).
Pero para ambas, lo que nos puede interesar, más que la manera de guardarlas es cómo acceder a ellas y, para eso (acabo de caer en ello y esta es la razón por la que ahora mismo pongo un (I) en el post, para no hacerlo eterno) hace falta que entendais qué es el contexto de la aplicación, es decir Context.

Parece una tontería que lo explique pero el Contexto encapsula todo el entorno de la aplicación para que, en teoría, sólo sea accesible desde dentro de ella.

A primera vista parece muy simple, pero esta clase abstracta (realmente de las instancias de su clase hija, ApplicationContext) es la que nos va a permitir acceder a la información de la aplicación y a sus recursos.

Considerando que existen realmente 5 bloques en toda aplicación android (Application, Activity, IntentReceiver, Service y Provider(2)) sería lógico que fuera accesible desde cualquiera de ellos, pero esto no es así en la realidad. Sólo es accesible directamente desde Application, Activity y Service, teniendo que recurrir a sucios trucos para poder utilizarla desde IntentReceiver por ejemplo.

Como curiosidad diré que si por ejemplo gestionais el evento de por ejemplo un botón dentro de una Actividad, dicho contexto no será accesible. hay dos alternativas:
  • Crear una variable accesible desde cualquier punto en la construcción de la instancia de la actividad.
  • Utilizar la variable de clase que incluyen los bloques constructores: <NombreActividad>.this. Suena como que a cualquier purista se le revolverían las tripas con esto, pero yo personalmente me quedo con ésta última.
Bueno, volvamos al código de la actividad, que así se verá todo mejor, en este apartado (el primero de dos) vamos a hablar de los facilones, de assets y de los archivos creado dinámicamente:
  • Si hablamos de assets podemos decir realmente que su función es poder meter lo que nos dé la real gana en la aplicación.
    • Accedemos a su gestor mediante context.getAssets(), que devuelve la instancia de la clase AssetManager que se corresponde con la aplicación.
    • Para listar el contenido de la carpeta context.getAssets(). list( "/" );(3)
    • Para extraer su contenido context.getAssets. open("archivoPrueba.txt"); [devuelve un InputStream]

  • Si estamos hablando de escritura y lectura sobre archivos, la única manera de hacerlo es mediante el espacio incluido como contexto de la aplicación mediante:
    • Context.openFileInput("archivoPrueba2.txt");
    • Context.openfileOutput("archivoPrueba3.txt",modo);(4)
Brevemente vamos a hacer una prueba con ambos.
Sobre la aplicación especificada en el post anterior ( es decir, sobre una aplicación vacía) vamos a acceder a los archivos siguiendo los pasos a continuación:
  1. Utilizaremos droiddraw para crear un layout con un campo de texto y tres botones (por ahora da igual como se disponga)
  2. Modificamos sus propiedades (pestaña properties):(5)
    1. id = @+id/btn1, text= abrir asset (extraera el contenido del asset y lo cargara en el campo de texto)
    2. id= @+id/btn2, text= guardar (guardara el campo de texto en un archivo en el contexto de la aplicacion).
    3. id=@+id/btn3, text = abrir (abrira el archivo del contexto si existe y los cargara).
    4. id=@+id/texto, text = vacio.
  3. Aplicamos los cambios, extraemos el código (generate) y lo reemplazamos por el anterior de res/layout/main.xml (que es el layout que se carga en la actividad)

    <?xml version="1.0" encoding="utf-8"?>
    <AbsoluteLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    xmlns:android="http://schemas.android.com/apk/res/android"
    >
    <Button
    android:id="@+id/btn1"
    android:layout_width="83px"
    android:layout_height="wrap_content"
    android:text="Abrir asset"
    android:layout_x="10px"
    android:layout_y="352px"
    >
    </Button>
    <Button
    android:id="@+id/btn2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="guardar "
    android:layout_x="100px"
    android:layout_y="352px"
    >
    </Button>
    <Button
    android:id="@+id/btn3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Abrir"
    android:layout_x="180px"
    android:layout_y="352px"
    >
    </Button>
    <EditText
    android:id="@+id/texto"
    android:layout_width="197px"
    android:layout_height="217px"
    android:text=""
    android:layout_x="20px"
    android:layout_y="22px"
    >
    </EditText>
    </AbsoluteLayout>

  4. Introducimos el siguiente código en la actividad (Actividad.java):
    package mi.paquete.test1;

    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import android.util.Log;
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;

    public class Actividad extends Activity {
    private static final String TAG = "Actividad";
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);
    //Accedemos al los objetos creados a través de su identificador
    final EditText texto = (EditText) this.findViewById(R.id.texto);
    Button btn1 = (Button) this.findViewById(R.id.btn1);
    Button btn2 = (Button) this.findViewById(R.id.btn2);
    Button btn3 = (Button) this.findViewById(R.id.btn3);
    btn1.setOnClickListener(new OnClickListener(){
    //Accion a realizar en el click del boton 1
    public void onClick(View vista) {
    InputStream is;
    try {
    is = Actividad.this.getAssets().open("archivoprueba.txt");
    int tam = is.available();
    byte [] buffer = new byte[tam];
    is.read(buffer);
    texto.setText(new String(buffer));
    } catch (IOException e) {
    Log.d(TAG,"Error en la lectura",e);
    }
    }
    });
    btn2.setOnClickListener(new OnClickListener(){
    //Accion a realizar en el click del boton 2
    public void onClick(View vista) {
    try {
    FileOutputStream fos =Actividad.this.openFileOutput("archivoprueba2.txt", MODE_WORLD_READABLEMODE_WORLD_WRITEABLE);
    fos.write(texto.getText().toString().getBytes());
    fos.close();
    } catch (IOException e) {
    Log.d(TAG,"Error en la escritura",e);
    }
    }
    });
    btn3.setOnClickListener(new OnClickListener(){
    //Accion a realizar en el click del boton 3
    public void onClick(View vista) {
    try {
    FileInputStream fis = Actividad.this.openFileInput("archivoprueba2.txt");
    int tam = fis.available();
    byte [] buffer = new byte[tam];
    fis.read(buffer);
    texto.setText(new String(buffer));
    fis.close();
    } catch (IOException e) {
    Log.d(TAG,"Error en la lectura",e);
    }

    }
    });
    }
    }

  5. Introducimos el archivo archivoprueba.txt en la carpeta assets con el contenido que queramos:
  6. Ejecutamos et voilá


PD: no sé si alguien me leerá, pero si me estoy yendo por las ramas, o si hay algo que no se entiende, por favor, postead, sólo intento escribir lo que sé sobre esto y que todos aprendamos (iaiaoooo...).



Notas:
(1) : de acuerdo con lo definido por la documentacion de la sdk, se considera un asset como un conjunto de datos asociados con una aplicacion (como blob), que serán organizados en la jerarquia de directorios tal y como están en el apk final, agrupados como un único fichero zip.
(2): aunque parece que me he saltado un paso al no explicar los bloques aún, es porque cada uno tiene una funcionalidad muy específica que requiere haberse adentrado un poquito más en la información y, de momento, con tener una actividad (es decir, una clase que visualice la información en la pantalla que es la que inluye el proyecto por defecto) vamos que chutamos. Pero será lo próximo que caiga como post, palabra.
(3): existe un bug en este punto (a fecha de hoy en revisión) por el que si se realiza list("") sería accesible el asset del framework y se solaparían las referencias si correspondiera al mismo nombre dos archivos, uno en la aplicación y otro en el del framework. (ver issue 373 y comentarios)
(4): los modos son MODE_APPEND para concatenar, MODE_WORLD_WRITEABLE para otorgar permisos de escritura, MODE_WORLD_READABLE para otorgar permisos de lectura y MODE_PRIVATE, el más restrictivo y el inlcuido por defecto.
(5): @+id indica que R.java (la clase que asocia a los recursos con identificadores) contendrá dentro del layout de main un índice para ese objeto (para evitar indexarlos todos). Si no lo ponemos no aparecerá aquí:

public final class R {
//...
public static final class id {
public static final int btn1=0x7f050000;
public static final int btn2=0x7f050001;
public static final int btn3=0x7f050002;
public static final int texto=0x7f050003;
}
public static final class layout {
public static final int main=0x7f030000;
}
//...
}

De aquí se deriva la conclusión que no puede duplicarse el id para NINGÚN elemento dentro de la misma aplicación, aunque estén en distintos layouts

miércoles, 7 de mayo de 2008

Android 101: o sobre cómo complicar las estructuras de un proyecto

Bien, si todo fue cómo esperábamos en el post anterior ( y confío en vosotros) ya tenemos un entorno adecuado de trabajo (lo siento chicos Solaris, muy probablemente vosotros no estáis en la lista...guaguaguaguaaaaa -sonido de trompetas-).


Aunque es muy posible que después explique cómo hacer todo esto desde la shell (atención expertos en python, os sentiréis como en casa), de momento vamos a hacerlo a lo perro (no me seáis malpensado, a partir de ahora en vuestras sucias mentes a lo perro==fácil, sencillo o simple), vamos a utilizar el plugin.

Veamos, ejecutamos desde "Fichero>Nuevo >Proyecto android" el asistente para nuestro nuevo proyecto:

  • Nombre del proyecto: nombre del proyecto en eclipse, sin repercusion en la aplicacion pero de alguna forma se tendrá que llamar (por cierto, no duplicar el nombre de los proyectos en eclipse en el mismo workspace). Así se llamará el apk a instalar (el símil de android a los jar de java).
  • Nombre de la aplicación: nombre con el que se visualizará la aplicacion en el manager de gphone y que la distinguirá de las demás aplicaciones. Este campo es puramente visual, si que se puede repetir, aunque después no podras distinguir cuál es cuál (el que avisa no es traidor).
  • Nombre de la actividad: nombre de la clase inicial a crear por el asistente.
  • Nombre del paquete: este es el punto más curioso; debido a que la máquina virtual dalvik cataloga las aplicaciones instaladas en el móvil a través del paquete dentro del cual han sido creadas (lo cual no implica que todas las clases que compongan una aplicacion estén en el mismo paquete, aunque sería recomendable para garantizar la unicidad de las clases, es decir, que no se machaquen por ejemplo arias versiones de una misma clase). Concluyendo, que el paquete es el identificador único de la aplicación, tened cuidado con eso (1).
Veamos, por ejemplo le pondremos al proyecto:
  • Nombre del proyecto: ProyectoTest
  • Nombre de la actividad: Actividad.
  • Nombre de la aplicacion: AplicacionTest
  • Nombre paquete: mi.paquete.test1
Obtendremos la siguiente estructura en el proyecto eclipse 'ProyectoTest':


Y al ejecutarlo como una aplicación android, (Run as>Android Application) el emulador nos devolverá (tras pasar algunos segundos cargando el ojo de cylon(2)) obtendremos esto:



Bueno, realmente aquí lo que nos interesa es una primera perspectiva de la estructura creada (requerida a menos que generemos nuestro propio constructor):
  • src (sources - fuentes): este punto no merecería la pena ser comentado si no fuera porque el asistente se ha sacado de la manga una clase llamada R.java. Esta clase es regenerada en cada actualización en eclipse por la herramienta de sdk aapt(3). De momento contiene:


    /* AUTO-GENERATED FILE. DO NOT MODIFY.
    *
    * This class was automatically generated by the
    * aapt tool from the resource data it found. It
    * should not be modified by hand.
    */

    package mi.paquete.test1;

    public final class R {
    public static final class attr {
    }
    public static final class drawable {
    public static final int icon=0x7f020000;
    }
    public static final class layout {
    public static final int main=0x7f030000;
    }
    public static final class string {
    public static final int app_name=0x7f040000;
    }
    }

    Es decir, una clase por cada carpeta dentro de res que reconozca la herramienta y un identificador numérico único para cada recurso.
  • res (resources - recursos): clasifica los distintos recursos de la aplicación que vienen catalogados de acuerdo a lo incluido en R.java. Aunque puede tener más, que veremos en el próximo post, por defecto tiene las carpetas:
    • drawable: imagenes (para incluirlas en R NO tiene en cuenta su extensión, así que dos imágenes con la misma extensión serán mal referenciadas por R).
    • layout: conjunto de archivos xml para determinar los widgets que estarán incluidos en cada Actividad, es decir, estores de la visualización de los elementos en lugar de hacerlo a través del código.
    • values: conjunto de elementos xml utilizados para agrupar valores (lo veremos en el próximo post); de momento sólo contiene el string con el nombre que le pusimos a la aplicacion (AplicacionTest).
  • AndroidManifest.xml: este archivo es vital, encapsula toda las información válida de las clases android que compondrán la aplicación. De hecho, si una actividad no está escrita aquí no podrá ser invocada (startActivity o startSubActivity). Este pto lo vemos dentro de dos post (se cumula el trabajo...lalala).
  • assets (asset- recurso) serán los recursos no catalogados dentro de R, la única diferencia con res (de momento) es que están desestructurados y no poseen referencia algunas; dependerá del programador cómo guardarlos).
Para que este post no se haga eterno, acabo aquí, gracias por aguantar apañaos.





(1) - Este puede ser un error muy frecuente y muy tonto: una de las cosas buenas de emulador de la sdk de android es que las aplicaciones instaladas no son eliminadas de la memoria, lo cual permite simular el ciclo de vida completo de una aplicación. Pero, si por un casual se nos ocurre cambiar el nombre del proyecto y ejecutarlo sobre el emulador con el antiguo proyecto cargado, nos surgirá la siguiente advertencia:
WARNING: Package mi.paquete.test1 is already registered by /data/app/ProyectoTest.apk
(ya que al no llamarse igual el plugin de eclipse no lo desinstala en instala como haría en caso normal) y dejando sin cargar la ultima versión en el emulador, aunque éste es lanzado (con la versión anterior todavía instalada).
(2) - Ojo de cylon, expresión tomada prestada de la serie BattleStar Galactica, que viene a ser la bolita roja con estela a modo ojo de Kitt del coche fantástico, que han puesto los desarrolladores del emulador para emular que carga (y sé que se toma su tiempo, tened calma).
(3) Las herramientas que incluye la sdk las veremos un poco más adelante cuando veamos como construir a mano una aplicación; de momento diremos que es magia.

martes, 6 de mayo de 2008

Php hebreo

Curioso:
"Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in..."

  • T = item o token a parsear
  • PAAMAYIM = dos veces ( en hebreo)
  • NEKUDOTAYIM = dos puntos (en hebreo, pasa lo mismo que en español sería tanto .. como :)
"Que la aldea global inunde vuestras vidas"

Aún no hemos perdido

Estamos a martes, día de 6 de Mayo, el resultado de la primera fase del concurso de google (o de la handset alliance) de ADC (android development challenge) en teoría se resolvía el 5 de mayo a las 00:00 (hora de pacífico) lo que nos deja realmente a las 9:00 am del martes a nosotros pobres europeos...es decir, ya ha salido...en teoría.

La cuestión es que el resultado del concurso NO se emite realmente hoy de acuerdo con el grupo oficial del concurso el resultado está postpuesto hasta el 7 de Mayo, o mejor dicho, queda relegado a ser enviado por correo a lo largo de esta semana....ainssss...se que no os importa mucho, pero aquí lo dejo.

Lo quiera o no, el androide me ha hecho soñar con ovejas eléctricas...


Aquí dejo para desconsuelo de las almas inquietas el siguiente post del grupo de ADC "Dear Android developer losers":

May 12, 2008. Monday.
Your android application is not in the top 50 ADC winners list.

Dear Android Developer Challenge losers,

I know you are drunk. I know you are hung over. I know you are feeling terrible. I know you are at your lows. I know life sucks. I know you can't get out of your bed. But wake up, will ya?

Your android application is not in the top 50 winners list. Cool. Take a deep breath. Look outside. Anything changed? Nah.. nothing changed. Your wife loves you as much as she did before. Your kids love you as much as they did before. Your friends love you just like before. You must do the same.
You must do the same to your Android application. Give it the same love, will ya?

First thing first, Send out your congratulations to the top 50 winners. Yes, you heard me right. Do it now, and do it fast. Better? It felt good right?
Yeah I know, It feels great. Wonderful.

Now that you are feeling better, let me tell you this:

lunes, 5 de mayo de 2008

Too far, too soon

Más o menos es eso, las cosas importantes están muy lejos y se van muy pronto, aunque eso no quiere decir que dejen de serlo. Son más importantes que nunca.

Esas cosas hacen que todo sea importante, todo sea precioso tal y como es; que todo sea digno de ser recordado, aunque no estén al alcance de la mano, aunque tengas que esperar, no desaparece una pizca de su grandeza, y merece la pena la espera, la merece con creces.

Y es que me gusta cosificar a la gente, si de hecho me cosifico a mi, una cosa ajquerosa con dudosas habilidades sociales y una empatía atrofiada ... para hacerlo bien, diré que soy el pegamento que aparece detrás de los embalajes cuando los deshaces, ese gordo, amarillento y que deja pegotes difíciles de eliminar, pero que a veces es útil para pegar posters.


domingo, 4 de mayo de 2008

Android 101: receta e ingredientes

Lo prometido es deuda (aunque sólo sea para mi misma), he intentado empezar a escribir esto unas 10 veces, tengo ya varios borradores para post posteriores, pero es que me da siempre la impresión de que si se parte desde cero hace falta tenerlo todo a punto y saber cómo hacerlo.

Para eso os dejo la siguiente receta de cómo poner android a punto, junto con los siguientes ingredientes:
  1. Eclipse 3.2 o superior (inferiores abstenerse)
  2. Java 5 (no basta sólo con la JDK, ya que el emulador corre sobre java)
  3. SDK de android
  4. Plugin de android para eclipse (ojo, lo que hay en esta referencia es el repositorio a colocar en eclipse que se explicará más abajo, si lo intentáis bajar no ubicará la página).
  5. Buen humor (porqué no)
  6. Si teneis Solaris, será necesario que lo hagáis vosotros mismos con la SDK, así que a bajar el código y a compilar con paciencia
Pasos:
  1. Instalar java [1,2,3]
  2. Instalar eclipse [1], en caso de que ya exista en el pequeño universo de tu ordenador, por favor, asegúrate que los plugins de JDT y WST.
  3. Descomprimir la SDK de android.
  4. Abrir eclipse e instalar el plugin:
    1. Help > Software updates> Find and install >Search for new features to install> New remote site: y aquí ponemos el repositorio, el resto estoy segura de que es piece of cake para vosotros.
  5. Configurar el plugin: no merece la pena asustarse, sólo hay que ponerle la ruta donde se extrajo la sdk (en Windows>Preferences)
  6. Et voilá. Para testearlo cread una aplicación, cuya estructura veremos en el próximo post, que es completamente operativa sobre el emulador desde el principio.
Sé que para lo que escribí en otros posts que iba a hacer no es demasiado, pero al menos es algo.

Os veo pronto.

El tiempo

Tenemos todo el conocimiento del mundo a nuestros pies, de todo el mundo.

Como una inmensa playa.
El conocimiento esta esparcido en los millones de granos de arena de la costa, sin considerar la procedencia de cada partícula, simplemente depositando herráticamente cada grano que ha sido arrastrado hasta allí.

Olas lamen nuestros pies mientras caminamos, dejando minúsculas notas de conocimiento que no llegamos a apreciar.

Pero vemos, más al fondo, lejos de la costa, castillos de arena que jamás llegaremos a poder construir y nos regodeamos en nuestras ignorancia, sin darnos cuenta del conocimiento que, sin quererlo, ya nos acompaña.


Así es esto, así es todo.