• Shortcuts : 'n' next unread feed - 'p' previous unread feed • Styles : 1 2

» Publishers, Monetize your RSS feeds with FeedShow:  More infos  (Show/Hide Ads)


Date: Wednesday, 16 Apr 2014 15:53

Una de las definiciones más originales de lo que es un programador es la que da la uncyclopedia: un organismo pluricelular que convierte la cafeína en código fuente.

Protocolo cafetera

No sé si esta supuesta afición de los programadores por el café tiene algún fundamento real, pero está tan arraigada en el imaginario colectivo que incluso existe una parodia del protocolo HTTP orientado a cafeteras: el Hyper Text Coffee Pot Control Protocol (HTCPCP).

Este protocolo, que tiene hasta su propio RFC, nace de una broma por el Día de los Inocentes anglosajón, que algunos bromistas llevaron un poquito más allá. Existen, por ejemplo, implementaciones completas del protocolo, registros de bugs sugiriendo que Mozilla lo soporte en sus productos y algún que otro popular sitio de Internet que devuelve el código de error 418 (Soy una tetera) en determinadas circunstancias.

Author: "Zootropo" Tags: "General, cafe, cafetera, inocentes, prot..."
Comments Send by mail Print  Save  Delicious 
Date: Tuesday, 15 Apr 2014 09:57

Bill Gates cuando Steve Jobs acusó a Microsoft de haber robado a Apple tras el lanzamiento de Windows 1.0:

Bueno, Steve, creo que hay varias formas de verlo. Es como si ambos tuviéramos un vecino rico llamado Xerox y yo me colara en su casa para robarle el televisor, sólo para descubrir que ya lo habías robado tú.

Author: "Zootropo" Tags: "General, apple, citas, microsoft, window..."
Comments Send by mail Print  Save  Delicious 
Date: Tuesday, 01 Oct 2013 16:01

Marvel’s Agents of S.H.I.E.L.D. es sin duda una de las series más esperadas de la temporada. El miércoles los fanáticos de los cómics, los apasionados de las películas de super héroes y los seguidores de Joss Whedon se reunieron todos juntos delante de la pantalla: casi 12 millones de telespectadores, convirtiendo a Agents of S.H.I.E.L.D. en el mejor estreno de drama de la cadena desde 2009.

Agents of SHIELD

Muchos televidentes y muchas expectativas, la mayoría de las cuáles, en mi opinión, se han cumplido con creces. Tenemos el típico humor un poco tonto pero absurdamente divertido al que nos tiene acostumbrados Joss Whedon, multitud de referencias a las películas, al genial agente Coulson (Clark Gregg) y a la atractiva Maria Hill (Cobie Smulders). Combinada con una banda sonora compuesta por el ganador de un Emmy Bear McCreary (Battlestar Galactica, The Walking Dead), tenemos un cóctel tan explosivo como el Extremis.

Las continuas referencias, por cierto, es algo que he disfrutado sobremanera. Artefactos de tecnología Chitauri que desprenden radiación gama, mezclados con extremis, imbuidos con el suero del super soldado: una genial ida de olla. Y “With great power comes… a lot of weird stuff” simplemente, debería ser el lema oficial de la serie.

Equipo de Agents of SHIELD

Obviamente el piloto tiene sus defectos, pero en general son cosas sin demasiada importancia que se pueden ir limando. Los personajes parecen un poco planos y arquetípicos, por ejemplo, pero es algo de esperar en un piloto y siendo uno de los puntos fuertes de Whedon, no parece preocupante. Es seguro que Whedon también sabrá encontrar un buen equilibrio entre el procedimental (monstruo o misión de la semana) y un arco continuado, como ya hiciera con Buffy, Firefly (R.I.P) o Dollhouse.

Lo que no creo que vaya a cambiar, y tampoco creo que desentone con el tono general de la serie, son detalles como el coche volador de Coulson (otra referencia a los cómics). Habiéndome criado con películas como Regreso al Futuro, es algo que no solo no me resulta casposo o ñoño, si no que disfruto enormemente. Si este tipo de detalles te producen urticaria, simplemente, es probable que esta no sea tu serie.

En definitiva, Agents of S.H.I.E.L.D. es una serie con un gran potencial y tengo mucha curiosidad por ver hacia dónde la dirigen. Sólo espero que hagan algún cameo con algún super héroe menor de Marvel, del tipo de los que nunca podrían tener su propia película. Y alguno de Stan Lee. Y Nick Furia en un par de episodios. Eso sería fantástico.

Author: "Zootropo" Tags: "General, comics, marvel, reviews, series..."
Comments Send by mail Print  Save  Delicious 
Date: Thursday, 26 Sep 2013 16:12

Desde hace un tiempo vengo utilizando una Sony NEX 5R como cámara principal, una cámara que siempre me llamó la atención desde que Sony la anunciara, y que ahora parece aún más interesante después de la rebaja de precio que ha sufrido al presentarse su sucesora, la NEX 5T, una revisión que añade pequeños detalles a una ya de por sí magnífica cámara.

Lo que más llama la atención de la NEX 5R es la excelente calidad de imagen junto a su reducido tamaño. Sus dimensiones son similares a una cámara compacta, aunque los objetivos, a excepción del pancake, son algo voluminosos si los comparamos con el cuerpo. Si no tienes interés en los objetivos intercambiables y sólo necesitas una cámara con la mejor calidad de imagen y el tamaño más pequeño posible, quizás te interese en su lugar la Sony RX100 o la RX100 II.

Český Krumlov

Su peso también es bastante más ligero que el de una réflex, siendo más parecido a una compacta algo pesada. Combinada con una correa Black Rapid, uno se puede olvidar totalmente de que está ahí hasta que la necesita.

El sensor, de tamaño APS-C, como la mayoría de las réflex no profesionales, obtuvo una notable puntuación de 77 en DxOMark. La calidad de imagen es sobresaliente para su rango de precios, con muy buena definición, muy buen rango dinámico y muy poco ruido a sensibilidades ISO altas. Las fotografías son perfectamente usables hasta ISO 6400, sobre todo en RAW, con un poco de magia de Lightroom, y siempre dependiendo, claro está, del celo del consumidor.

Cisnes

El autofoco es bastante efectivo gracias a una de las novedades respecto de su predecesora, un sistema de enfoque híbrido combinando el enfoque por contraste con algunos píxeles del sensor de imagen dedicados a la detección de fase, el sistema utilizado por las réflex tradicionales. Así y todo, como la cámara no puede adivinar nuestras intenciones, a los usuarios que vengan de compactas y no estén acostumbrados a profundidades de campo bajas, les recomendaría habilitar la opción de enfocar y disparar pulsando sobre la pantalla táctil; de esta forma no nos encontraremos con que la cámara ha decidido enfocar el fondo en lugar del motivo principal de la fotografía.

En lo que al enfoque manual se refiere, la cámara tiene un modo de ayuda en pantalla muy útil, con una visualización ampliada del motivo y bordes que parpadean cuando la cámara detecta que están enfocados (focus peaking). También tenemos por último el enfoque manual directo, con el que la cámara enfocará automáticamente y podremos hacer pequeños ajustes manuales después para mejorar aún más la precisión.

Puente de Carlos

El diseño de la cámara está muy cuidado. Cuenta con unas líneas agradables, materiales que parecen de calidad y una buena ergonomía, aunque a veces se puede echar en falta algún botón extra si estamos acostumbrados a utilizar réflex más o menos avanzadas. Uno de sus peros, aunque no se le puede echar mucho en cara dado su precio, es que no tiene EVF integrado, aunque se puede comprar por separado y montarlo en la misma zapata que el flash, que también es externo pero sí está incluido en el pack.

Tiene una pantalla abatible hasta 180º, que puede llamar mucho la atención a los amantes de los auto retratos y que también es muy útil para composiciones en ángulos complicados. Por defecto, cuando la pantalla se gira 180º, la cámara toma una fotografía automáticamente a los 3 segundos. La cámara también tiene los típicos automatismos a los que nos han acostumbrado las compactas y los móviles últimamente, como captura automática al detectar una sonrisa, prioridad de enfoque y brillo a las caras conocidas, efecto de piel suave que reduce las arrugas y mejora el contraste entre los ojos y la boca, etc.

Mariánské Lázně

En lo que a modos se refiere, además de los habituales auto, programa, prioridad a la apertura, prioridad al tiempo de exposición y manual tenemos una opción para realizar barridos panorámicos y un modo automático superior, que, por ejemplo, utiliza HDR automáticamente cuando lo considera necesario y elige la mejor imagen. Entre los modos de escena, además de los sospechosos habituales, el más interesante es el de anti movimiento, que toma 6 fotografías y las combina para reducir al máximo el desenfoque y el ruido.

Además los principiantes también agradecerán las opciones de “Creatividad fotográfica”, a las que se puede acceder desde los modos de Auto inteligente y Auto superior. Estas permiten ajustar fácilmente el nivel de desenfoque de fondo, el brillo, la temperatura de color y el contraste que queremos, así como aplicar varios efectos, como cámara de juguete, color pop, posterización, retro o miniatura (tilt-shift)

Si lo que te va es grabar vídeos, la calidad es igual de impresionante, aunque se encuentra algo por debajo de la celebrada Panasonic Lumix GH2. Se puede grabar vídeos en AVCHD (50i 24M, 50i 17M, 50p 28M, 25p 24M, 25p 17M) o MP4 (1440×1080 o VGA) hasta 29 minutos, y hasta 2 GB si se usa el formato MP4, aunque en condiciones de altas temperaturas es posible que haya que dejarla descansar antes para evitar que el sensor se caliente demasiado.

En definitiva, una cámara que te permitirá tomar excelentes instantáneas sin tener que cargar con el peso de una réflex.

Nuestra Señora de Tyn Cabaña en el lago Fuente cantante

Cementerio judío Postres Candados

Author: "Zootropo" Tags: "General, analisis, fotografía, nex, rev..."
Comments Send by mail Print  Save  Delicious 
Date: Wednesday, 28 Aug 2013 15:06

Da igual que te acabes de comprar un móvil, que ya tengas dos Nexus 4, o que vivas en algún lugar recóndito sin cobertura. ¿Cómo no vas a comprarte un Nexus 4 ahora que Google ha rebajado 100€ más su ya de por si escandaloso precio?

¿199€ por uno de los mejores teléfonos del mercado? ¿por un procesador quad-core y 2GB de RAM? ¿por un Android actualizado siempre a la última versión y sin capas extra que lo ralenticen? Parece mejor negocio que la famosa compra de Manhattan por unos cuantos abalorios.

Author: "Zootropo" Tags: "General, android, chollos, google, movil..."
Comments Send by mail Print  Save  Delicious 
Date: Wednesday, 26 Jun 2013 17:51

En su artículo What Languages Fix, Paul Graham, autor de Hackers & Painters y fundador de Y Combinator examinaba hace unos años algunos de los lenguajes de programación más conocidos desde una óptica interesante: los problemas que sus creadores intentaban solucionar al crearlos.

Hoy me he vuelto a encontrar con este texto y he dedicado unos minutos a traducirlo y a crear una representación gráfica en forma de línea de tiempo que podéis ver a continuación.

  • Algol: Ensamblador trabaja a muy bajo nivel
  • Pascal: Argol no tiene suficientes tipos de datos
  • Modula: Pascal es limitado para programación de sistemas
  • Simula: Algol no es lo bastante bueno para simulaciones
  • Smalltalk: No todo en Simula es un objeto
  • Fortran: Ensamblador trabaja a muy bajo nivel
  • Cobol: Fortran da miedo
  • PL/1: Fortran no tiene suficientes tipos de datos
  • Ada: A todos los lenguajes que existen les falta algo
  • Basic: Fortran da miedo
  • APL: Fortran no es lo bastante bueno manipulando arrays
  • J: APL requiere su propio juego de caracteres
  • C: Ensamblador trabaja a muy bajo nivel
  • C++: C trabaja a muy bajo nivel
  • Java: C++ es una chapuza. Y Microsoft nos va a aplastar
  • C#: Sun controla Java
  • Lisp: Las máquinas de Turing son una forma extraña de describir computación
  • Scheme: MacLisp es una chapuza
  • T: Scheme no tiene librerías
  • Common Lisp: Hay demasiados dialectos de Lisp
  • Dylan: Scheme no tiene librerías, y la sintaxis de Lisp da miedo
  • Perl: Los shell scripts/awk/sed no parecen lenguajes de programación
  • Python: Perl es una chapuza
  • Ruby: Perl es una chapuza, y la sintaxis de Lisp da miedo
  • Prolog: La programación no se parece lo suficiente a la lógica
Author: "Zootropo" Tags: "General, lenguajes, programacio"
Comments Send by mail Print  Save  Delicious 
Date: Friday, 03 May 2013 18:16

Aunque en España sigue costando 300€, en Amazon UK ya podemos encontrar el modelo de 8GB de Wii U por sólo 149£. 177€ al cambio. Un 40% más barato que en España.

Oferta de Wii U

¿177€ por una consola que acaba de salir? Con un precio así puedo hacerme ya con mi primera consola de octava generación, y comprar una PS4 o una XBOX 720 en el futuro.

Juegos de Wii U

Además, para hacer la oferta aún más tentadora, los creadores de Wiikey anunciaron hace unos días que ya tienen casi lista la primera solución para cargar copias de seguridad en Wii U. ¡Desde disco externo USB y sin soldaduras!

Author: "Zootropo" Tags: "General, amazon, consolas, nintendo, ofe..."
Comments Send by mail Print  Save  Delicious 
Date: Thursday, 02 May 2013 15:06

Si llevas un tiempo programando en Java recordarás esas decenas de líneas de código de inicialización y aquellos enormes XML de configuración con los que teníamos que lidiar en frameworks como Spring, JPA o JSF antes de que se popularizaran las anotaciones. En Android esa tendencia todavía no ha impuesto, pero os alegrará saber que sí existen librerías externas con las que reducir enormemente el código auxiliar y centrarnos en lo que realmente importa.

La opción más interesante es AndroidAnnotations, ya que es muy completa, no impone penalización alguna en el rendimiento y no nos obliga a que nuestras actividades extiendan de una cierta clase, lo que al carecer Java de herencia múltiple complicaría ligeramente el uso de librerías como ActionBarSherlock. ¿Suena bien? Entonces genera un proyecto con AndroidAnnotations en AndroidKickstarR y sigue leyendo; te aseguro que no te vas a arrepentir.

Asociar un layout a una actividad o fragmento

Sin AndroidAnnotations:

public class Actividad extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.actividad);
    }
}

Con AndroidAnnotations podemos usar la anotación @EActivity (de enhanced activity o actividad mejorada) y pasarle el identificador del layout:

@EActivity(R.layout.actividad)
public class MyActivity extends Activity {}

De forma parecida a las actividades, con la anotación @EFragment podemos obviar el método onCreateView del fragmento. Sin AndroidAnnotations:

public class Fragmento extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragmento, container, false);
        return view;
    }
}

Con AndroidAnnotations:

@EFragment(R.layout.fragmento)
public class Fragmento extends Fragment {
}

Inyección de vistas

Sin AndroidAnnotations:

public class Actividad extends Activity {
	Button btnGuardar;
	EditText txtNombre;

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.actividad);
		
		btnGuardar = (Button) findViewById(R.id.btnGuardar);
		txtNombre = (EditText) findViewById(R.id.txtNombre);
    }
}

Con AndroidAnnotations usaríamos la anotación @ViewById pasando como parámetro el identificador de la vista

@EActivity(R.layout.actividad)
public class Actividad extends Activity {
	@ViewById(R.id.btnGuardar)
	Button btnGuardar;
	
	@ViewById(R.id.txtNombre)
	EditText txtNombre;
}

Si el nombre de la variable es igual al identificador de la vista el parámetro se puede obviar:

@EActivity(R.layout.actividad)
public class Actividad extends Activity {
	@ViewById Button btnGuardar;
	@ViewById EditText txtNombre;
}

También podemos inyectar fragmentos con @FragmentById

@EActivity(R.layout.actividad)
public class Actividad extends Activity {
	@ViewById Button btnGuardar;
	@ViewById EditText txtNombre;
	@FragmentById Fragmento fragmento;
}

Manipular las vistas

Si usamos @ViewById para inyectar la vistas, por la manera que tiene de funcionar AndroidAnnotations, no tendremos todavía las instancias asociadas en onCreate, por lo que si tenemos que hacer algo con las vistas tendremos que anotar uno o varios métodos con @AfterViews. Esto, que a alguno le puede parecer un incordio, a mí personalmente me gusta, porque prefiero extraer el resto del código a otros métodos siguiendo el Principio de Responsabilidad Única.

De esta forma un código como

public class Actividad extends Activity {
	TextView txtVersion;
	TextView txtFecha;

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.actividad);
		
		txtVersion = (TextView) findViewById(R.id.txtVersion);
		txtFecha = (TextView) findViewById(R.id.txtFecha);
		
		establecerVersion();
		establecerFecha();
    }
	
	void establecerVersion() {
		try {
			PackageInfo infoPaquete = getPackageManager().getPackageInfo(getPackageName(), 0);
			txtVersion.setText(infoPaquete.versionName);
		} catch(NameNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	void establecerFecha() {
		DateFormat formato = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
		Date fecha = new Date();
		String strFecha = formato.format(fecha);
		txtFecha.setText(strFecha);
	}
}

se convertiría en lo siguiente

@EActivity(R.layout.actividad)
public class Actividad extends Activity {
	@ViewById TextView txtVersion;
	@ViewById TextView txtFecha;
	
	@AfterViews
	void establecerVersion() {
		try {
			PackageInfo infoPaquete = getPackageManager().getPackageInfo(getPackageName(), 0);
			txtVersion.setText(infoPaquete.versionName);
		} catch(NameNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	@AfterViews
	void establecerFecha() {
		DateFormat formato = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
		Date fecha = new Date();
		String strFecha = formato.format(fecha);
		txtFecha.setText(strFecha);
	}
}

Eventos

Android cuenta con un atributo XML android:onClick con el que es muy rápido y sencillo asociar un listener a un evento clic. El equivalente en AndroidAnnotations es la anotación @Click, a la que se le pasa el identificador de la vista a la que se asocia el listener (se puede obviar en caso de que el nombre del método coincida con el identificador de la vista o que sea igual pero con el sufijo Clicked).

@EActivity(R.layout.actividad)
public class Actividad extends Activity {
	@Click(R.id.button1)
	void mostrarVersion() {
		// ...
	}

	@Click
	void mostrarFecha() {
		// ...
	}

	@Click
	void guardarClicked() {
		// ...
	}
}

En este caso la ventaja de las anotaciones no es tan obvia; quizás el poder ver la asociación entre la vista y el método en un golpe de vista. Tiene mayor interés el que podamos asociar listeners para unos pocos eventos más de forma igual de sencilla, con @LongClick para pulsaciones largas o @TextChange para cambios de texto.

Menús

Con la anotación @OptionsMenu podemos inflar el XML de menú, ahorrándonos sobreescribir onCreateOptionsMenu. Con @OptionsItem asociamos las distintas opciones de menú con distintos listeners, pasando el id de la opción a la anotación (también se puede obviar el id si coincide con el nombre del método, o si es igual pero con el sufijo Selected).

Versión sin anotaciones:

public class Actividad extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.actividad);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.actividad, menu);
		return true;
	}

	
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
			case R.id.actualizar:
				actualizar();
				return true;
			case R.id.acercaDe:
				acercaDeSelected();
				return true;
			default:
			  return false;
		}
	}

	
	void actualizar() {
		// ...
	}	

	
	void acercaDeSelected() {
		// ...
	}	
}

Versión con anotaciones:

@EActivity(R.layout.actividad)
@OptionsMenu(R.menu.actividad)
public class Actividad extends Activity {
	@OptionsItem(R.id.actualizar)
	void actualizar() {
		// ...
	}	

	@OptionsItem
	void acercaDeSelected() {
		// ...
	}	
}

Inyección de recursos

Para cada tipo de recurso existe una anotación que permite inyectar dicho recurso en nuestra clase pasándole simplemente el identificador (o sin pasarle nada si el nombre del recurso coincide con el de la variable): AnimationRes, BooleanRes, ColorRes, ColorStateListRes, DimensionPixelOffsetRes, DimensionPixelSizeRes, DimensionRes, DrawableRes, HtmlRes, IntArrayRes, IntegerRes, LayoutRes, MovieRes, StringArrayRes, StringRes, TextArrayRes, TextRes.

De esta forma en lugar de:

String nombreApp = getResources().getString(R.string.nombreApp);

simplemente podríamos escribir:

@StringRes String nombreApp;

Además, en el caso concreto de que queramos obtener una cadena HTML de un archivo de recurso y establecerla como texto en un TextView, podemos llevar a cabo ambos pasos con una simple anotación @FromHtml.

Hilos de ejecución

¿Harto de usar AsyncTask o similares para ejecutar un cierto código en un hilo distinto del principal o de interfaz de usuario?

void ejecutarTareaSegundoPlano(URL urls) {
	new AsyncTask<URL, Integer, Long> {
		protected Long doInBackground(URL... urls) {
			int numUrls = urls.length;
			Long tamanyoDescarga = 0;
			for (int i = 0; i < numUrls; i++) {
				tamanyoDescarga += ClienteHttp.descargar(urls[i]);
				publishProgress((int) ((i / (float) numUrls) * 100));
			}
			return totalSize;
		}

		protected void onProgressUpdate(Integer... progreso) {
			actualizarProgreso(progreso[0]);
		}

		protected void onPostExecute(Long tamanyoDescarga) {
			mostrarDialogo("Descargados " + tamanyoDescarga[0] + " bytes");
		}
	}.execute();
}

¿Qué tal si pudieras usar la anotación @Background para indicar que un método debe ejecutarse en un hilo en segundo plano y @UiThread para que se ejecute en el hilo de interfaz de usuario? De esta forma el ejemplo anterior se reduciría a:

@Background
void descargarArchivos(URL urls) {
	int numUrls = urls.length;
	Long tamanyoDescarga = 0;
	for (int i = 0; i < numUrls; i++) {
		tamanyoDescarga += ClienteHttp.descargar(urls[i]);
		actualizarEstadoDescarga((int) ((i / (float) numUrls) * 100));
	}
	mostrarDialogoFinDescarga(tamanyoDescarga);
}

@UiThread
void actualizarEstadoDescarga(int progreso) {
	actualizarProgreso(progreso);
}

@UiThread
void mostrarDialogoFinDescarga(Long tamanyoDescarga) {
	mostrarDialogo("Descargados " + tamanyoDescarga + " bytes");
}

Guardar y recuperar el estado

Esta es otra de esas tareas repetitivas que suponen gran cantidad de código. Comparemos una implementación típica con su correspondiente versión con anotaciones.

public class Actividad extends Activity {
    Jugador jugador;
    int puntuacion;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        if(savedInstanceState != null) { 
            jugador = (Jugador)savedInstanceState.getSerializable("jugador");
			puntuacion = savedInstanceState.getInt("puntuacion");
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putSerializable("jugador", jugador);
        outState.putInt("puntuacion", puntuacion);
    }
}
@EActivity(R.layout.actividad)
public class Actividad extends Activity {
    @InstanceState
    Jugador jugador;

    @InstanceState
    int puntuacion;
}

Otras funcionalidades de interés

  • @Trace nos permite trazar la ejecución de un método escribiendo una entrada en el log cuando se entra y se sale del método.
  • @HierarchyViewerSupport permite utilizar la herramienta Hierarchy Viewer aunque no dispongamos de un teléfono con permisos de root o de desarrollo
  • @RoboGuice nos permite integrar AndroidAnnotation con el framework de inyección de dependencias del mismo nombre (basado en Guice, de Google)
  • @OrmLiteDao nos permite integrar AndroidAnnotation con el framework de mapeo objeto-relacional OrmLite
  • @EView y @EViewGroup facilitan la creación de vistas personalizadas
  • @SystemService nos permite inyectar un servicio del sistema


Author: "Zootropo" Tags: "General, android, anotaciones, desarroll..."
Comments Send by mail Print  Save  Delicious 
Date: Sunday, 28 Apr 2013 15:35

Decía Larry Wall, el creador de Perl, que las tres virtudes principales de un programador son la pereza, la impaciencia y el orgullo desmedido. Pereza e impaciencia suficientes para querer invertir una gran cantidad de tiempo y esfuerzo en minimizar tareas repetitivas. Y de eso es de lo que vamos a hablar hoy.

Considera este fragmento de código, que podríamos encontrar varias veces repetido en una página JSF y que genera una caja de texto HTML con una etiqueta asociada y con un span en el que mostrar errores de validación para ese campo:

<h:outputLabel value="Nombre:" for="nombre"/>
<h:inputText id="nombre" label="Nombre" required="true" value="#{controlador.entidad.nombre}"/>
<h:message for="nombre"/>

NetBeans, y casi todo IDE que se precie, tiene una característica de plantillas de código con la que insertar automáticamente el código de la plantilla escribiendo una abreviatura que le hayamos asignado y pulsando Tab.

Pero casi todos los IDE van un paso más allá y permiten parametrizar estas plantillas de código, de forma que podamos sustituir estos parámetros por sus respectivos valores antes de la inserción final.

En NetBeans podemos consultar las plantillas de código predefinidas y añadir otras nuevas en Tools -> Options -> Editor -> Code Templates. La plantilla correspondiente al fragmento anterior tendría este aspecto, con los parámetros a sustituir siguiendo la sintaxis ${nombre del parámetro}:

<h:outputLabel value="${nombre}:" for="${id}"/>
<h:inputText id="${id}" label="${nombre}" required="true" value="#{controlador.entidad.${id}}"/>
<h:message for="${id}"/>

Al escribir el atajo que hayamos asociado al fragmento de código, NetBeans insertará el fragmento en esa línea y moverá el cursor al primer parámetro. Sólo tendremos que escribir el valor que queramos darle y pulsar Enter para que se cambie el valor en ese parámetro y todos los del mismo nombre. NetBeans situará el cursor en el siguiente parámetro para que podamos darle un valor, y así sucesivamente.




Author: "Zootropo" Tags: "General, codigo, desarrollo, netbeans, p..."
Comments Send by mail Print  Save  Delicious 
Date: Saturday, 27 Apr 2013 10:49

Cuando publiqué la entrada de las que, para mí, eran las 10 mejores canciones de videojuegos de la historia, me quedé con mal sabor de boca por haber dejado fuera a tantísimos de mis favoritos. Para remediarlo he montado una pequeña lista en mi adorado Spotify; tarea que, por cierto, es harto complicada al no ser tan habitual que se publicaran las bandas sonoras de los juegos antiguos.

Echadle una oída ;)

Author: "Zootropo" Tags: "General, canciones, listas, música, spo..."
Comments Send by mail Print  Save  Delicious 
Date: Sunday, 21 Apr 2013 12:36

Si compartes contenido en Internet eres un ladrón. Da igual que los precios no se ajusten a la realidad del mercado o que se introduzcan medidas antipiratería que no hacen más que molestar a aquellos que sí han pagado por el contenido. Simples excusas.

Directivo de grupo antipiratería culpable de tráfico de drogasToma ejemplo de Vytas Simanavicius, honrado ciudadano lituano, vicepresidente de la asociación antipiratería de su país, que no contento con dedicar sus días a la lucha contra el cáncer de la piratería, dedica sus noches al noble arte del tráfico de drogas para poder pagar por los discos de Bisbal. Un trabajador incansable, ejemplo e inspiración para todos.

Author: "Zootropo" Tags: "General, bittorrent, pirateria"
Comments Send by mail Print  Save  Delicious 
Date: Saturday, 20 Apr 2013 18:35

Cuando se programa con alguna librería o framework de terceros siempre es fundamental poder contar con su código fuente, ya sea para aprender o para ver cómo funcionan las cosas por dentro. Android no es una excepción; por eso lo primero que hago nada más instalar Eclipse con las Android Developer Tools es añadir el código fuente del SDK. De otra forma, al intentar ver el código de cualquier clase de Android Eclipse nos mostrará una pantalla similar a esta, con el código decompilado en lugar del código fuente:

Eclipse sin el código fuente de Android

Para solucionarlo sólo tienes que descargar el código fuente de la versión de Android para la que estés desarrollando utilizando el Android SDK Manager (paquete “Sources for Android SDK”), pulsar el botón Attach Source en Eclipse, seleccionar External Folder y buscar la carpeta en la que se ha descargado el código fuente; normalmente android/sdk/sources/android-nivel api

Author: "Zootropo" Tags: "General, android, codigo fuente, desarro..."
Comments Send by mail Print  Save  Delicious 
Moda geek   New window
Date: Wednesday, 17 Apr 2013 15:21

Al hablar de moda geek puede venirnos a la cabeza el cosplay, las camisetas con integrales y chistes informáticos, y otras curiosidades. Pero, ¿qué hacer si además de ser un amante de la cultura pop eres un fanático de la moda? ¿se puede llevar el cosplay a la vida diaria y hacerlo vistiendo bien? Esto es lo que propone Sartorial geek, dedicado, entre otras, cosas a publicar outfits inspirados en personajes tan famosos como Gandalf, Yoshi, Aqua man o el Capitán América.

Moda geek

Author: "Zootropo" Tags: "General, conjuntos, geek, moda, outfits,..."
Comments Send by mail Print  Save  Delicious 
Date: Tuesday, 16 Apr 2013 16:50

En mi trabajo suelo utilizar dos redes distintas: una red WiFi, de velocidad aceptable, y una red de área local, bastante más lenta que la primera y con algunas restricciones, pero que es necesaria para conectarse a ciertos recursos y páginas de la organización. Harto de tener que activar y desactivar ambas conexiones según lo que estuviera haciendo, recurrí a Google en busca de una solución. Su nombre: ForceBindIP.

Esta aplicación funciona interceptando las llamadas de red de las aplicaciones que carga. Sólo tenéis que crear un acceso directo a la aplicación que queráis forzar a utilice una determinada red, con ForceBindIP como ejecutable y la IP y la ruta de la aplicación a lanzar como parámetros. Por ejemplo:

ForceBindIP 174.193.48.35 “C:\Archivos de programa\Internet Explorer\iexplore.exe”

Si la red asigna IP de forma dinámica, tendrás que sustituir la IP por la clave que identifica a la red en el registro de Windows. Para ello, haz clic en el botón de Inicio, selecciona Ejecutar y escribe el comando regedit, lo que abrirá el editor de registro. En HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces busca la clave con un valor para DhcpIPAddress igual a la IP asignada actualmente para esa interfaz.

ForceBindIP {11388731-F073-4EC4-A52C-3EFA7F325A1D} “C:\Archivos de programa\Internet Explorer\iexplore.exe”

Por último, también puede resultar útil añadir entradas en el menú contextual de los ejecutables con los que seleccionar si ejecutar la aplicación con una interfaz de red u otra. Esto lo podríamos hacer con un archivo de registro como el siguiente; sólo tenéis que guardarlo en un archivo de texto con extensión .reg, acordándoos de cambiar las claves de las interfaces por vuestras claves o IPs.

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\exefile\shell\EjecutarWifi]
@="Ejecutar por WiFi"

[HKEY_CLASSES_ROOT\exefile\shell\EjecutarWifi\command]
@="ForceBindIP {11388731-F073-4EC4-A52C-3EFA7F325A1D} \"%l\""

[HKEY_CLASSES_ROOT\exefile\shell\EjecutarLAN]
@="Ejecutar por LAN"

[HKEY_CLASSES_ROOT\exefile\shell\EjecutarLAN\command]
@="ForceBindIP {EAEA78D4-05AA-4421-BD99-0B6C89FB9FC5} \"%l\""

Author: "Zootropo" Tags: "General, aplicaciones, interfaz, lan, re..."
Comments Send by mail Print  Save  Delicious 
Date: Monday, 15 Apr 2013 15:37

Me ha llevado algo más de tiempo de lo que preveía, pero al fin he terminado de traducir todos los tutoriales del sitio oficial de desarrolladores de Android que enseñan los conceptos básicos para la creación de aplicaciones. En total son 7 clases, en las que se tratan los siguientes temas:

  1. Construyendo tu primera aplicación
  2. Gestionando el ciclo de vida de la actividad
  3. Soportando distintos dispositivos
  4. Construyendo una interfaz de usuario dinámica con fragmentos
  5. Guardando información
  6. Interactuando con otras aplicaciones
  7. Compartiendo contenido
Author: "Zootropo" Tags: "General, android, castellano, desarrolla..."
Comments Send by mail Print  Save  Delicious 
Date: Tuesday, 12 Feb 2013 16:38

¿Sabes esas veces en las que algún cacharro no funciona y acabas dándole un golpe, un poco por frustración y un poco con la esperanza de que se arregle sólo? Pues este método tiene hasta un nombre “técnico“, mantenimiento percusivo, y aunque parezca cosa del pasado, con tanta maquinaria de precisión y tanto gadget futurista, siguen existiendo situaciones en las que puede dar resultado. Yo, sin ir más lejos, ¡ya lo he usado dos veces en lo que llevamos de semana!

Mantenimiento percusivo

Author: "Zootropo" Tags: "General, hardware, mantenimiento"
Comments Send by mail Print  Save  Delicious 
Date: Friday, 08 Feb 2013 17:01

Se acerca San Valentín y desde LELO este año te lo quieren poner fácil. Participa en nuestro sorteo y el regalo te puede salir gratis: un lujoso set de diseño Amore Me valorado en 139€ y que incluye antifaz de seda, esposas de seda y ante y un discreto vibrador con forma de pintalabios recargable por USB.

Sólo tienes que dejar un comentario explicando qué tecnología aplicarías a los juguetes para adultos (rellenando el campo de correo electrónico para que pueda ponerme en contacto contigo si resultas ganador o ganadora).

LELO Amore me

El sorteo está abierto para todo el mundo (aunque en algunos países de Sudamérica puede haber aduanas de las que la marca no se haría cargo) y finaliza el día 14 de febrero a las 23:59 hora española. ¡Suerte a todos!

Author: "Zootropo" Tags: "General, lelo, san valentin, sorteos"
Comments Send by mail Print  Save  Delicious 
Date: Wednesday, 06 Feb 2013 17:55

Tutorial Android en español

Aunque el inglés es un idioma que yo considero que hablo bastante bien (academia, escuela oficial de idiomas, parte de la carrera en inglés…) siempre es agradable poder leer un texto en tu lengua materna. Esto es un problema cuando se trata de documentación técnica, porque las obras de referencia a menudo no se traducen al castellano o tardan mucho en publicarse, y en ocasiones los textos que podemos encontrar en nuestras tiendas cuentan con muy poca calidad.

En su día ya intenté aportar mi granito de arena publicando el libro “Python para todos” como Creative Commons, una iniciativa que no salió demasiado mal. Desde hace ya bastante tiempo tengo un especial interés por Android, y cuando empecé a dar mis primeros pasos comprobé que la situación no era mucho mejor.

Desde que Google creara el sitio de Android Training este ha sido un recurso que siempre ha estado muy bien considerado por los desarrolladores, hasta el punto de que muchos lo recomiendan como la mejor forma de comenzar con Android. Por eso, y porque una empresa que gana más de 10 000 millones de dólares al año todavía no se ha molestado, me he propuesto traducir estas clases al español, aprovechando su licencia Creative Commons.

Ya podéis encontrar las 3 primeras clases en Formación Android. No os deberían llevar más de 2 horas.

Si tenéis cualquier duda, fallo o sugerencia que comentarme, podéis utilizar, como siempre, el formulario de contacto o los propios comentarios de esta entrada. Y si os gusta la iniciativa y queréis darle un poco de publicidad en las redes sociales, mejor que mejor ;)

Author: "Zootropo" Tags: "General, android, castellano, documentac..."
Comments Send by mail Print  Save  Delicious 
Date: Saturday, 26 Jan 2013 11:24

Cuando desarrollamos aplicaciones para móviles o tablets y no tenemos acceso a un dispositivo físico, o queremos probar nuestra aplicación en distintos tamaños de pantalla o densidades tenemos dos alternativas principales: los “simuladores”, como el que incluye el SDK de iOS, y los emuladores, como el del SDK de Android.

Emuladores vs simuladores

Un simulador sólo simula el entorno software en que se ejecutará la aplicación. Cuando ejecutamos una aplicación en el simulador de iOS, lo que ocurre realmente es que la aplicación se compila a código máquina nativo y se simulan las llamadas de sistema de iOS. Como la aplicación se ejecuta de manera nativa, es extremadamente rápida, pero a cambio, el resultado es menos fidedigno.

Por otro lado el emulador de Android, que básicamente es una versión modificada de QEMU con un frontend, emula todo el entorno software y hardware de un tablet o teléfono Android, a excepción de que no puede hacer llamadas. Esto permite hacernos una idea mucho más certera de cómo se comportará nuestra aplicación en un dispositivo real, pero a cambio, también es mucho más lento, sobre todo si activamos las funciones de depuración. Tanto es así que, gracias a lo sencillo y conveniente que es un utilizar un dispositivo físico para probar nuestro código en Android, muchos desarrolladores terminan desechando el emulador totalmente y utilizando teléfonos y tablets reales exclusivamente.

Acelerar el emulador de Android

Aunque es una información que se recoge en el sitio web de Android para desarrolladores y numerosas páginas se hacen eco, mucha gente no es consciente de que es posible utilizar imágenes de Android basadas en x86 y hacer uso de la GPU de nuestra máquina y las funciones de virtualización de las CPUs más modernas para mejorar dramáticamente el rendimiento del emulador de Android.

Como ejemplo de cómo pueden afectar estas opciones al rendimiento del emulador, sin ningún tipo de valor estadístico y sólo como curiosidad, aquí tenéis los tiempos obtenidos en el test SunSpider activando cada una de estas opciones de forma consecutiva:

Rendimiento del emulador de Android usando una imagen x86, VT-x y la GPU

Las imágenes de Android para x86 están disponibles a través del SDK Manager. Sólo es necesario desplegar la rama correspondiente a la versión de Android que estemos utilizando e instalar el paquete “Intel x86 Atom System Image”. Una vez instalado el paquete tendremos la opción de utilizar “Intel Atom (x86)” como CPU/ABI al crear un nuevo AVD.

Instalando la imagen x86 de Android

Seleccionando Intel x86 como CPU/ABI

Si disponemos de un procesador Intel con la tecnología VT-x podemos mejorar aún más el rendimiento utilizando virtualización basada en el propio hardware. Sólo tenemos que descargar el paquete “Intel x86 Emulator Accelerator (HAXM)” mediante el SDK Manager y ejecutar el instalador que encontraremos en \sdk\extras\intel\Hardware_Accelerated_Execution_Manager\IntelHaxm.exe una vez terminada la descarga.

Por último, para activar la aceleración mediante la GPU sólo tenemos que activar la opción “Use Host GPU” al crear un nuevo AVD.

Otras opciones que pueden ayudarnos a mejorar el rendimiento del emulador son utilizar versiones más antiguas de Android, usar resoluciones más bajas o aumentar la RAM que se le da al AVD, si contamos con memoria suficiente.

Author: "Zootropo" Tags: "General, acelerar, android, emulador, op..."
Comments Send by mail Print  Save  Delicious 
Date: Wednesday, 09 Jan 2013 12:54

Unos ladrones se cuelan en las oficinas de Microsoft y deciden que sus productos son tan sumamente malos que no merece la pena ni cargar con ellos. Lo único que terminan robando son varios iPads que los empleados utilizaban para desarrollo.

No es el principio de un chiste ni una noticia de El Mundo Today. Es algo que ocurrió el mes pasado y que comentan en más profundidad en The guardian y The Register. Pobre Steve Ballmer, que no gana para disgustos.

Author: "Zootropo" Tags: "General, apple, ironia, ladrones, micros..."
Comments Send by mail Print  Save  Delicious 
Next page
» You can also retrieve older items : Read
» © All content and copyrights belong to their respective authors.«
» © FeedShow - Online RSS Feeds Reader