Ruta Moto – 20110323-24

[xtrasgu.org]Esta semana amenazaban lluvia para el fin de semana (acertaron), por lo que aprovechando que los días han crecido lo suficiente como para que anochezca pasadas las 19:30, la opción de coger la moto para dar una vuelta por semana resultaba tan tentadora que al final salí en moto dos días.

Las rutas no fueron gran cosa, pero tras unas cuantas salidas con la se√Īora a cuestas, lo de ir solo se agradece… o:-)

El martes decid√≠ ir hasta El Escamplero, para luego bajar hasta Trubia, y volver a Oviedo por la carretera vieja, una subida con buena carretera y bastantes curvas, que debe de ser una ruta muy transitada por moteros, ya que la mayor√≠a de los quitamiedos est√°n adaptados para proteger de ca√≠das. La ruta estuvo bien, pero sal√≠ de casa con 10¬ļ y en una hora el fr√≠o se nota un mont√≥n.

Ruta Moto – 20110323


View Ruta Moto – 20110323 in a larger map

El mi√©rcoles la idea era coger la carretera por la que vuelvo de trabajar, la vieja que va de Tudela Vegu√≠n a Oviedo pasando por el cementerio, ya que es una carretera que llevo haciendo a√Īo y medio en coche, es tranquila, y me la conozco al dedillo. Para llegar a Tudela Vegu√≠n, fui por la A-66 en direcci√≥n a Mieres hasta Olloniego, y aunque parezca mentira, una autopista en moto, en hora punta, y con la limitaci√≥n a 110 km/h, acojona bastante…

Por lo dem√°s, la subida de vuelta a casa me gust√≥ bastante; entre que le empiezo a coger el punto a la moto, que iba s√≥lo, y que de la carretera me conozco hasta los baches… coser y cantar. La sensaci√≥n que me dio es que hac√≠a menos fr√≠o que el d√≠a anterior, que tambi√©n ayuda.

Ruta Moto – 20110324


View Ruta Moto – 20110324 in a larger map

Twitter Semanal – 2011-03-20

  • La cornuda, a poner el siguiente: RT @BreakingNews Hillary Clinton arrives in Egypt to support transition from Mubarak's rule #
  • Revit Siren Lady roja pedida ayer en FC-Moto… ¬°y no es para mi! http://is.gd/mIjcAW #
  • Por cierto, Revit Siren roja de http://is.gd/MDSRsV puesta en casa por 188‚ā¨; las alternativas en tienda off-line se iban a 240‚ā¨… ¬°As√≠ no! #
  • Confirmado tras acabar de leer ¬ęA twist of the wrist II¬Ľ, mucho mejor que el primer libro. #
  • Tras la buena experiencia con Chrome en el ordenador del trabajo, cambiando #Iceweasel por #Chrome en casa. #
  • A poner al nuevo, como en Egipto: RT @BreakingNews US Sec. of State Clinton arrives in Tunisia – Al Jazeera http://bit.ly/fYeI0i #

AndroidGameOfLife: El Juego de la Vida

[xtrasgu.org]Siguiendo con las aplicaciones programadas para Android, esta vez tengo el gusto de presentar una versión simplificada de El Juego de la Vida. La simplificación viene dada por las reglas que se aplican en la frontera del tablero, que no son las correctas.

A continuación, una captura de pantalla:

AndroidGameOfLife: El Juego de la Vida

El programa lo puedes descargar en AndroidGameOfLife, y el código fuente lo tienes aquí debajo:

/*
 * AndroidGameOfLife - Game of Life for Android. 
 * 
 * Copyright (c) 2011, Pablo López Cienfuegos <xtrasgu@gmail.com>
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *   
 */

package org.xtrasgu.gameoflife;

import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

public class AndroidGameOfLife extends Activity {
	ViewGameOfLife viewgameoflife;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// Set full screen view:
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);

		// Set screen always on:
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
				WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

		// Set full brightness:
		WindowManager.LayoutParams lp = getWindow().getAttributes();
		lp.screenBrightness = 1.0f;
		getWindow().setAttributes(lp);

		// Set portrait orientation:
		this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

		viewgameoflife = new ViewGameOfLife(this);
		setContentView(viewgameoflife);
	}

	private class ViewGameOfLife extends View {
		int HDIM = 160;
		int VDIM = 266;
		int SUM = 0;
		int MATRIXA[][] = new int[HDIM][VDIM];
		int MATRIXB[][] = new int[HDIM][VDIM];
		Paint paint = new Paint();

		public ViewGameOfLife(Context context) {
			super(context);
			generateGameOfLifeSeed();
		}

		public void generateGameOfLifeSeed() {
			for (int i = 0; i < HDIM; i++)
				for (int j = 0; j < VDIM; j++)
					MATRIXA[i][j] = (int) (Math.floor(Math.random() * 2.0));
			invalidate();
		}

		@Override
		public boolean onTouchEvent(MotionEvent event) {
			generateGameOfLifeSeed();
			return true;
		}

		@Override
		protected void onDraw(Canvas canvas) {

			// Set background:
			paint.setColor(Color.BLACK);
			paint.setStyle(Paint.Style.FILL);
			canvas.drawPaint(paint);

			// Game of Life:
			for (int i = 1; i < HDIM - 1; i++)
				for (int j = 1; j < VDIM - 1; j++) {
					SUM = MATRIXA[i - 1][j - 1] + MATRIXA[i - 1][j]
							+ MATRIXA[i - 1][j + 1] + MATRIXA[i][j - 1]
							+ MATRIXA[i][j + 1] + MATRIXA[i + 1][j - 1]
							+ MATRIXA[i + 1][j] + MATRIXA[i + 1][j + 1];
					if (SUM == 2)
						MATRIXB[i][j] = MATRIXA[i][j];
					else if (SUM == 3)
						MATRIXB[i][j] = 1;
					else
						MATRIXB[i][j] = 0;
				}

			for (int i = 0; i < HDIM; i++)
				for (int j = 0; j < VDIM; j++)
					MATRIXA[i][j] = MATRIXB[i][j];

			paint.setColor(Color.BLUE);
			for (int i = 0; i < HDIM; i += 2) {
				canvas.drawCircle(i * 2 + 1, 1, 1, paint);
				canvas.drawCircle(i * 2 - 1, VDIM * 2 - 1, 1, paint);
			}
			for (int j = 0; j < VDIM; j += 2) {
				canvas.drawCircle(1, j * 2 + 1, 1, paint);
				canvas.drawCircle(HDIM * 2 - 1, j * 2 + 3, 1, paint);
			}

			paint.setColor(Color.YELLOW);
			for (int i = 1; i < HDIM; i += 2) {
				canvas.drawCircle(i * 2 + 1, 1, 1, paint);
				canvas.drawCircle(i * 2 - 1, VDIM * 2 - 1, 1, paint);
			}
			for (int j = 1; j < VDIM; j += 2) {
				canvas.drawCircle(1, j * 2 + 1, 1, paint);
				canvas.drawCircle(HDIM * 2 - 1, j * 2 - 1, 1, paint);
			}

			paint.setColor(Color.GREEN);
			for (int i = 0; i < HDIM; i++)
				for (int j = 0; j < VDIM; j++)
					if (MATRIXA[i][j] == 1)
						canvas.drawCircle(i * 2 + 1, j * 2 + 1, 1, paint);
			invalidate();
		}
	}
}

Ruta Moto – 20110311

[xtrasgu.org]Nunca es tarde si la bicha es buena; salimos el Viernes pasado, pero hasta hoy no me ha dado por escribir nada. Tercera salida en moto en modo duo, esta vez incluyendo un kil√≥metro de autopista… ¬°100km/h!

Cuando le dices en un sem√°foro que la vas a meter por la autopista se menea un poco y sujetar la moto para que no la tire cuesta, pero yo creo que de esta ya va, y la pr√≥xima vez podemos ir a alg√ļn sitio de verdad. De hecho, ya est√° mirando una Revit Siren Lady y todo.

La ruta, como estas √ļltimas, no tiene nada:


Ver Ruta Moto – 20110311 en un mapa m√°s grande

Twitter Semanal – 2011-03-06

  • ¬°Qu√© pesados los de @Fnac_ESP con su tarjeta de socio! Que si puntos acumulados, ticket con puntos, correos… ¬°Vaya ganas de que caduque! #
  • Sorprendentemente, la p√°gina del Banco Popular lleva toda la ma√Īana sin funcionar… mira que me extra√Īa… #
  • WordPress actualizado a 3.1 sin problemas. #

Ruta Moto – 20110306

[xtrasgu.org]Segunda ruta con mi se√Īora a bordo, a ver si va perdiendo el ¬ęrespeto¬Ľ a la moto. Paseo tranquilo por los alrededores de Oviedo, pasando por Colloto, Lugones y la Pista Finlandesa. ¬°Hemos llegado a 80km/h!

La paciente de momento no presenta reacciones adversas, por lo que calculo que con otra ruta de broma cogiendo un poco de autopista, ya estar√° lista para empezar a salir en moto de verdad… y sino, tambi√©n.


Ver Ruta Moto – 20110306 en un mapa m√°s grande

AndroidGenerateSID: Generador Aleatorio de Nombres de Sistema SAP

[xtrasgu.org]Teniendo en cuenta el gran éxito de GenerateSID: Generador Aleatorio de Nombres de Sistema SAP, y el de su secuela GenerateSID: Generador Aleatorio de Nombres de Sistema SAP (v2.0), era evidente que la saga no podía terminar ahí.

Aprovechando el entorno de desarrollo que estuve configurando en Installing the Android SDK under Debian GNU/LiNUX 5.0 Lenny, he modificado el Generador Aleatorio de Nombres de Sistema SAP para que ahora funcione en Android.

El aspecto de la aplicación, como suele ser habitual, impecable:

AndroidGenerateSID: Generador Aleatorio de Nombres de Sistema SAP

Si te apetece probarlo, lo puedes descargar en AndroidGenerateSID.

Ya por √ļltimo, y como de costumbre, el c√≥digo fuente del programa:

/*
 * AndroidGenerateSID - Let Android choose an SAP SID for you. 
 * 
 * Copyright (c) 2010, Pablo López Cienfuegos 
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see .
 *   
 */

package org.xtrasgu.generatesid;

import java.util.Arrays;
import android.app.Activity;
import android.view.MotionEvent;
import android.view.Window;
import android.view.WindowManager;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.View;

public class AndroidGenerateSID extends Activity {
	ViewGenerateSID viewgeneratesid;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// Set full screen view:
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);
		requestWindowFeature(Window.FEATURE_NO_TITLE);

		// Set full brightness:
		WindowManager.LayoutParams lp = getWindow().getAttributes();
		lp.screenBrightness = 1.0f;
		getWindow().setAttributes(lp);

		viewgeneratesid = new ViewGenerateSID(this);
		setContentView(viewgeneratesid);
	}

	private class ViewGenerateSID extends View {

		public ViewGenerateSID(Context context) {
			super(context);
		}

		@Override
		public boolean onTouchEvent(MotionEvent event){
			invalidate();
			return true;
		}
		
		@Override
		protected void onDraw(Canvas canvas) {
			Paint paint = new Paint();
			
			// Set background:
			paint.setColor(Color.BLACK);
			paint.setStyle(Paint.Style.FILL);
			canvas.drawPaint(paint);
			
			// Set foreground: 
			paint.setColor(Color.WHITE);
			paint.setStyle(Paint.Style.FILL_AND_STROKE);
			paint.setAntiAlias(true);
			paint.setTextSize(120);
			paint.setTextAlign(Paint.Align.CENTER);
			canvas.drawText(generateSID(), canvas.getWidth()/2, canvas.getHeight()/2, paint);
		}
		
		public String generateSID() {
			int rnd;
			String sid;
			String alfa="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
			String alfanum=alfa+"0123456789";
			String[] existingSIDs={};	//Add your existing system landscape SIDs
			String[] exceptionSIDs={"ADD", "ALL", "AND", "ANY", "ASC", "AUX", "COM", "CON", "DBA",
					"END", "EPS", "FOR", "GID", "IBM", "INT", "KEY", "LOG", "LPT",
					"MON", "NIX", "NOT", "NUL", "OFF", "OMS", "PRN", "RAW", "ROW",
					"SAP", "SET", "SGA", "SHG", "SID", "SQL", "SYS", "TMP", "UID",
					"USR", "VAR"}; 
			
			sid="ADD";
			while(Arrays.binarySearch(existingSIDs, sid)>-1 || Arrays.binarySearch(exceptionSIDs, sid)>-1){
				rnd=(int)Math.floor(Math.random()*alfa.length());
				sid=""+alfa.substring(rnd, rnd+1);
				for(int i=0;i<2;i++){
					rnd=(int)Math.floor(Math.random()*alfanum.length());
					sid+=alfanum.substring(rnd, rnd+1);
				}
			}
			return sid;
		}
	}
}