<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2spanishfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feed.mundogeek.net/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Mundo Geek</title>
	
	<link>http://mundogeek.net</link>
	<description>Mundo geek, bitácora sobre todo lo geek: software, gadgets, tecnología, internet, ...</description>
	<lastBuildDate>Fri, 03 May 2013 18:16:23 +0000</lastBuildDate>
	<language>es-ES</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feed.mundogeek.net/mundogeekfeed" /><feedburner:info uri="mundogeekfeed" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>mundogeekfeed</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:browserFriendly>Añadiendo los feeds de tus sitios favoritos a un programa destinado a leerlos (agregador) puedes permanecer informado de las nuevas entradas o comentarios sin tener que visitar página por página cada minuto.</feedburner:browserFriendly><item>
		<title>Ofertaza de Wii U (y ahora, encima, pirateable)</title>
		<link>http://feed.mundogeek.net/~r/mundogeekfeed/~3/XSU5Qee9JYU/</link>
		<comments>http://mundogeek.net/archivos/2013/05/03/ofertaza-de-wii-u-y-ahora-encima-pirateable/#comments</comments>
		<pubDate>Fri, 03 May 2013 18:16:23 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[consolas]]></category>
		<category><![CDATA[nintendo]]></category>
		<category><![CDATA[ofertas]]></category>
		<category><![CDATA[videojuegos]]></category>
		<category><![CDATA[wii u]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=8404</guid>
		<description><![CDATA[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. ¿177€ por una consola que acaba de salir? Con un precio así puedo hacerme ya con mi primera consola de octava generación, y [...]]]></description>
				<content:encoded><![CDATA[<p>Aunque en España sigue costando 300€, en Amazon UK ya podemos encontrar el <a href="http://www.amazon.co.uk/gp/product/B004Y59P3A/ref=as_li_ss_tl?ie=UTF8&#038;camp=1634&#038;creative=19450&#038;creativeASIN=B004Y59P3A&#038;linkCode=as2&#038;tag=mundogeek-21">modelo de 8GB de Wii U</a><img src="http://www.assoc-amazon.co.uk/e/ir?t=mundogeek-21&#038;l=as2&#038;o=2&#038;a=B004Y59P3A" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> por sólo 149£. <strong>177€</strong> al cambio. Un 40% más barato que en España.</p>
<p style="text-align:center"><img src="http://mundogeek.net/wp-content/wii-u-oferta.jpg" alt="Oferta de Wii U"/></p>
<p>¿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.</p>
<p><img src="http://mundogeek.net/wp-content/wii-u-juegos.jpg" alt="Juegos de Wii U"/></p>
<p>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 <a href="http://www.elotrolado.net/noticia_anunciado-wiike-para-cargar-respaldos-de-wii-u-desde-un-disco-usb_21888" title="Anunciado WiikeÜ para cargar respaldos de Wii U desde un disco USB">cargar copias de seguridad en Wii U</a>. ¡Desde disco externo USB y sin soldaduras!</p>
<img src="http://feeds.feedburner.com/~r/mundogeekfeed/~4/XSU5Qee9JYU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2013/05/03/ofertaza-de-wii-u-y-ahora-encima-pirateable/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://mundogeek.net/archivos/2013/05/03/ofertaza-de-wii-u-y-ahora-encima-pirateable/</feedburner:origLink></item>
		<item>
		<title>Desarrollo rápido en Android con anotaciones</title>
		<link>http://feed.mundogeek.net/~r/mundogeekfeed/~3/8gJJ7U_MnYc/</link>
		<comments>http://mundogeek.net/archivos/2013/05/02/desarrollo-rapido-en-android-con-anotaciones/#comments</comments>
		<pubDate>Thu, 02 May 2013 15:06:30 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[anotaciones]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[movil]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=8397</guid>
		<description><![CDATA[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 [...]]]></description>
				<content:encoded><![CDATA[<p>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 <a href="http://mundogeek.net/android/" title="Tutorial de Android">Android</a> 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.<span id="more-8397"></span></p>
<p>La opción más interesante es <a href="http://androidannotations.org/" title="AndroidAnnotations">AndroidAnnotations</a>, 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 <a href="http://actionbarsherlock.com/" title="ActionBarSherlock">ActionBarSherlock</a>. ¿Suena bien? Entonces genera un proyecto con AndroidAnnotations en <a href="http://androidkickstartr.com/" title="AndroidKickstarR">AndroidKickstarR</a> y sigue leyendo; te aseguro que no te vas a arrepentir.</p>
<h2>Asociar un layout a una actividad o fragmento</h2>
<p>Sin AndroidAnnotations:</p>
<pre name="code" class="java">public class Actividad extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.actividad);
    }
}</pre>
<p>Con AndroidAnnotations podemos usar la anotación <code>@EActivity</code> (de <em>enhanced activity</em> o actividad mejorada) y pasarle el identificador del layout:</p>
<pre name="code" class="java">@EActivity(R.layout.actividad)
public class MyActivity extends Activity {}</pre>
<p>De forma parecida a las actividades, con la anotación <code>@EFragment</code> podemos obviar el método <code>onCreateView</code> del fragmento. Sin AndroidAnnotations:</p>
<pre name="code" class="java">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;
    }
}</pre>
<p>Con AndroidAnnotations:</p>
<pre name="code" class="java">@EFragment(R.layout.fragmento)
public class Fragmento extends Fragment {
}</pre>
<h2>Inyección de vistas</h2>
<p>Sin AndroidAnnotations:</p>
<pre name="code" class="java">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);
    }
}</pre>
<p>Con AndroidAnnotations usaríamos la anotación <code>@ViewById</code> pasando como parámetro el identificador de la vista</p>
<pre name="code" class="java">@EActivity(R.layout.actividad)
public class Actividad extends Activity {
	@ViewById(R.id.btnGuardar)
	Button btnGuardar;
	
	@ViewById(R.id.txtNombre)
	EditText txtNombre;
}</pre>
<p>Si el nombre de la variable es igual al identificador de la vista el parámetro se puede obviar:</p>
<pre name="code" class="java">@EActivity(R.layout.actividad)
public class Actividad extends Activity {
	@ViewById Button btnGuardar;
	@ViewById EditText txtNombre;
}</pre>
<p>También podemos inyectar fragmentos con <code>@FragmentById</code></p>
<pre name="code" class="java">@EActivity(R.layout.actividad)
public class Actividad extends Activity {
	@ViewById Button btnGuardar;
	@ViewById EditText txtNombre;
	@FragmentById Fragmento fragmento;
}</pre>
<h2>Manipular las vistas</h2>
<p>Si usamos <code>@ViewById</code> para inyectar la vistas, por la manera que tiene de funcionar AndroidAnnotations, no tendremos todavía las instancias asociadas en <code>onCreate</code>, por lo que si tenemos que hacer algo con las vistas tendremos que anotar uno o varios métodos con <code>@AfterViews</code>. 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 <a href="http://mundogeek.net/archivos/2011/06/09/principios-solid-de-la-orientacion-a-objetos/" title="Principios SOLID de la orientación a objetos">Principio de Responsabilidad Única</a>.</p>
<p>De esta forma un código como</p>
<pre name="code" class="java">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);
	}
}</pre>
<p>se convertiría en lo siguiente</p>
<pre name="code" class="java">@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);
	}
}</pre>
<h2>Eventos</h2>
<p>Android cuenta con un atributo XML <code>android:onClick</code> con el que es muy rápido y sencillo asociar un listener a un evento clic. El equivalente en AndroidAnnotations es la anotación <code>@Click</code>, 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 <em>Clicked</em>).</p>
<pre name="code" class="java">@EActivity(R.layout.actividad)
public class Actividad extends Activity {
	@Click(R.id.button1)
	void mostrarVersion() {
		// ...
	}

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

	@Click
	void guardarClicked() {
		// ...
	}
}</pre>
<p>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 <code>@LongClick</code> para pulsaciones largas o <code>@TextChange</code> para cambios de texto.</p>
<h2>Menús</h2>
<p>Con la anotación <code>@OptionsMenu</code> podemos <em>inflar</em> el XML de menú, ahorrándonos sobreescribir <code>onCreateOptionsMenu</code>. Con <code>@OptionsItem</code> 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 <em>Selected</em>).</p>
<p>Versión sin anotaciones:</p>
<pre name="code" class="java">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() {
		// ...
	}	
}</pre>
<p>Versión con anotaciones:</p>
<pre name="code" class="java">@EActivity(R.layout.actividad)
@OptionsMenu(R.menu.actividad)
public class Actividad extends Activity {
	@OptionsItem(R.id.actualizar)
	void actualizar() {
		// ...
	}	

	@OptionsItem
	void acercaDeSelected() {
		// ...
	}	
}</pre>
<h2>Inyección de recursos</h2>
<p>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): <code>AnimationRes</code>, <code>BooleanRes</code>, <code>ColorRes</code>, <code>ColorStateListRes</code>, <code>DimensionPixelOffsetRes</code>, <code>DimensionPixelSizeRes</code>, <code>DimensionRes</code>, <code>DrawableRes</code>, <code>HtmlRes</code>, <code>IntArrayRes</code>, <code>IntegerRes</code>, <code>LayoutRes</code>, <code>MovieRes</code>, <code>StringArrayRes</code>, <code>StringRes</code>, <code>TextArrayRes</code>, <code>TextRes</code>. </p>
<p>De esta forma en lugar de:</p>
<pre name="code" class="java">String nombreApp = getResources().getString(R.string.nombreApp);</pre>
<p>simplemente podríamos escribir:</p>
<pre name="code" class="java">@StringRes String nombreApp;</pre>
<p>Además, en el caso concreto de que queramos obtener una cadena HTML de un archivo de recurso y establecerla como texto en un <code>TextView</code>, podemos llevar a cabo ambos pasos con una simple anotación <code>@FromHtml</code>.</p>
<h2>Hilos de ejecución</h2>
<p>¿Harto de usar <code>AsyncTask</code> o similares para ejecutar un cierto código en un hilo distinto del principal o de interfaz de usuario?</p>
<pre name="code" class="java">void ejecutarTareaSegundoPlano(URL urls) {
	new AsyncTask&lt;URL, Integer, Long&gt; {
		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();
}</pre>
<p>¿Qué tal si pudieras usar la anotación <code>@Background</code> para indicar que un método debe ejecutarse en un hilo en segundo plano y <code>@UiThread</code> para que se ejecute en el hilo de interfaz de usuario? De esta forma el ejemplo anterior se reduciría a:</p>
<pre name="code" class="java">@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");
}</pre>
<h2>Guardar y recuperar el estado</h2>
<p>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.</p>
<pre name="code" class="java">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);
    }
}</pre>
<pre name="code" class="java">@EActivity(R.layout.actividad)
public class Actividad extends Activity {
    @InstanceState
    Jugador jugador;

    @InstanceState
    int puntuacion;
}</pre>
<h2>Otras funcionalidades de interés</h2>
<ul>
<li><code>@Trace</code> 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.</li>
<li><code>@HierarchyViewerSupport</code> permite utilizar la herramienta <a href="http://developer.android.com/intl/es/tools/debugging/debugging-ui.html#HierarchyViewer" title="Hierarchy Viewer">Hierarchy Viewer</a> aunque no dispongamos de un teléfono con permisos de root o de desarrollo</li>
<li><code>@RoboGuice</code> nos permite integrar AndroidAnnotation con el framework de inyección de dependencias del mismo nombre (basado en Guice, de Google)</li>
<li><code>@OrmLiteDao</code> nos permite integrar AndroidAnnotation con el framework de mapeo objeto-relacional <a href="http://ormlite.com/" title="OrmLite">OrmLite</a></li>
<li><code>@EView</code> y <code>@EViewGroup</code> facilitan la creación de vistas personalizadas</li>
<li><code>@SystemService</code> nos permite inyectar un servicio del sistema</li>
</ul>
<link type="text/css" rel="stylesheet" href="http://mundogeek.net/sh/css/SyntaxHighlighter.css"></link>
<script language="javascript" src="http://mundogeek.net/sh/js/shCore.js"></script><br />
<script language="javascript" src="http://mundogeek.net/sh/js/shBrushJava.js"></script><br />
<script language="javascript">dp.SyntaxHighlighter.ClipboardSwf = 'http://mundogeek.net/sh//flash/clipboard.swf';
dp.SyntaxHighlighter.HighlightAll('code');</script></p>
<img src="http://feeds.feedburner.com/~r/mundogeekfeed/~4/8gJJ7U_MnYc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2013/05/02/desarrollo-rapido-en-android-con-anotaciones/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://mundogeek.net/archivos/2013/05/02/desarrollo-rapido-en-android-con-anotaciones/</feedburner:origLink></item>
		<item>
		<title>Cómo mejorar tu productivad con NetBeans en un 200%</title>
		<link>http://feed.mundogeek.net/~r/mundogeekfeed/~3/moA9fU-eQVA/</link>
		<comments>http://mundogeek.net/archivos/2013/04/28/como-mejorar-tu-productivad-con-netbeans-en-un-200/#comments</comments>
		<pubDate>Sun, 28 Apr 2013 15:35:40 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[codigo]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[plantillas]]></category>
		<category><![CDATA[productividad]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=8387</guid>
		<description><![CDATA[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 [...]]]></description>
				<content:encoded><![CDATA[<p>Decía Larry Wall, el creador de Perl, que <a href="http://mundogeek.net/archivos/2010/06/23/las-virtudes-del-programador/">las tres virtudes principales de un programador</a> 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.<span id="more-8387"></span></p>
<p>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:</p>
<pre name="code" class="xml">&lt;h:outputLabel value="Nombre:" for="nombre"/&gt;
&lt;h:inputText id="nombre" label="Nombre" required="true" value="#{controlador.entidad.nombre}"/&gt;
&lt;h:message for="nombre"/&gt;</pre>
<p>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.</p>
<p>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.</p>
<p><img src="http://mundogeek.net/wp-content/plantillas-codigo-netbeans.png"/></p>
<p>En NetBeans podemos consultar las plantillas de código predefinidas y añadir otras nuevas en Tools -&gt; Options -&gt; Editor -&gt; Code Templates. La plantilla correspondiente al fragmento anterior tendría este aspecto, con los parámetros a sustituir siguiendo la sintaxis <code>${<em>nombre del parámetro</em>}</code>:</p>
<pre name="code" class="xml">&lt;h:outputLabel value="${nombre}:" for="${id}"/&gt;
&lt;h:inputText id="${id}" label="${nombre}" required="true" value="#{controlador.entidad.${id}}"/&gt;
&lt;h:message for="${id}"/&gt;</pre>
<p>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.</p>
<link type="text/css" rel="stylesheet" href="http://mundogeek.net/sh/css/SyntaxHighlighter.css"></link>
<script language="javascript" src="http://mundogeek.net/sh/js/shCore.js"></script><br />
<script language="javascript" src="http://mundogeek.net/sh/js/shBrushJava.js"></script><br />
<script language="javascript" src="http://mundogeek.net/sh/js/shBrushXml.js"></script><br />
<script language="javascript">dp.SyntaxHighlighter.ClipboardSwf = 'http://mundogeek.net/sh//flash/clipboard.swf';
dp.SyntaxHighlighter.HighlightAll('code');</script></p>
<img src="http://feeds.feedburner.com/~r/mundogeekfeed/~4/moA9fU-eQVA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2013/04/28/como-mejorar-tu-productivad-con-netbeans-en-un-200/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://mundogeek.net/archivos/2013/04/28/como-mejorar-tu-productivad-con-netbeans-en-un-200/</feedburner:origLink></item>
		<item>
		<title>Canciones de videojuegos</title>
		<link>http://feed.mundogeek.net/~r/mundogeekfeed/~3/jEwVsbwlPo0/</link>
		<comments>http://mundogeek.net/archivos/2013/04/27/canciones-de-videojuegos/#comments</comments>
		<pubDate>Sat, 27 Apr 2013 10:49:06 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[canciones]]></category>
		<category><![CDATA[listas]]></category>
		<category><![CDATA[música]]></category>
		<category><![CDATA[spotify]]></category>
		<category><![CDATA[videojuegos]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=8379</guid>
		<description><![CDATA[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 [...]]]></description>
				<content:encoded><![CDATA[<p>Cuando publiqué la entrada de las que, para mí, eran <a href="http://mundogeek.net/archivos/2011/06/20/las-10-mejores-canciones-de-videojuegos-de-la-historia/" title="Las 10 mejores canciones de videojuegos de la historia">las 10 mejores canciones de videojuegos de la historia</a>, 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 <a href="http://mundogeek.net/etiqueta/spotify/" title="Entradas con la etiqueta Spotify en Mundo geek">mi adorado Spotify</a>; tarea que, por cierto, es harto complicada al no ser tan habitual que se publicaran las bandas sonoras de los juegos antiguos.</p>
<p>Echadle una oída <img src='http://mundogeek.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> <span id="more-8379"></span></p>
<p><iframe src="https://embed.spotify.com/?uri=spotify:user:mundogeek:playlist:7h17dK9wGB6QNvG2qrpwd3" width="540" height="400" frameborder="0" allowtransparency="true"></iframe></p>
<img src="http://feeds.feedburner.com/~r/mundogeekfeed/~4/jEwVsbwlPo0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2013/04/27/canciones-de-videojuegos/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		<feedburner:origLink>http://mundogeek.net/archivos/2013/04/27/canciones-de-videojuegos/</feedburner:origLink></item>
		<item>
		<title>Directivo de grupo antipiratería culpable de tráfico de drogas</title>
		<link>http://feed.mundogeek.net/~r/mundogeekfeed/~3/Rt1bEzIR2d0/</link>
		<comments>http://mundogeek.net/archivos/2013/04/21/directivo-de-grupo-antipirateria-culpable-de-trafico-de-drogas/#comments</comments>
		<pubDate>Sun, 21 Apr 2013 12:36:50 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[bittorrent]]></category>
		<category><![CDATA[pirateria]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=8369</guid>
		<description><![CDATA[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. Toma ejemplo de Vytas Simanavicius, honrado ciudadano lituano, vicepresidente de la [...]]]></description>
				<content:encoded><![CDATA[<p>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.</p>
<p><img align="right" style="margin-left:1em;width:125px" alt="Directivo de grupo antipiratería culpable de tráfico de drogas" src="http://mundogeek.net/wp-content/antipirateria-trafico-drogas.jpg">Toma 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, <a href="http://torrentfreak.com/anti-piracy-chief-pleads-guilty-to-drug-trafficking-130421/">dedica sus noches al noble arte del tráfico de drogas</a> para poder pagar por los discos de Bisbal. Un trabajador incansable, ejemplo e inspiración para todos.</p>
<img src="http://feeds.feedburner.com/~r/mundogeekfeed/~4/Rt1bEzIR2d0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2013/04/21/directivo-de-grupo-antipirateria-culpable-de-trafico-de-drogas/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://mundogeek.net/archivos/2013/04/21/directivo-de-grupo-antipirateria-culpable-de-trafico-de-drogas/</feedburner:origLink></item>
		<item>
		<title>Cómo añadir el código fuente de Android a Eclipse</title>
		<link>http://feed.mundogeek.net/~r/mundogeekfeed/~3/PK0Ir9OB72A/</link>
		<comments>http://mundogeek.net/archivos/2013/04/20/como-anadir-el-codigo-fuente-de-android-a-eclipse/#comments</comments>
		<pubDate>Sat, 20 Apr 2013 18:35:49 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[codigo fuente]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[moviles]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=8366</guid>
		<description><![CDATA[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 [...]]]></description>
				<content:encoded><![CDATA[<p>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:<span id="more-8366"></span></p>
<p><img src="http://mundogeek.net/wp-content/eclipse-sin-codigo-fuente-android.jpg" alt="Eclipse sin el código fuente de Android"/></p>
<p>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 &#8220;Sources for Android SDK&#8221;), 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 <code>android/sdk/sources/android-<em>nivel api</em></code></p>
<img src="http://feeds.feedburner.com/~r/mundogeekfeed/~4/PK0Ir9OB72A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2013/04/20/como-anadir-el-codigo-fuente-de-android-a-eclipse/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://mundogeek.net/archivos/2013/04/20/como-anadir-el-codigo-fuente-de-android-a-eclipse/</feedburner:origLink></item>
		<item>
		<title>Moda geek</title>
		<link>http://feed.mundogeek.net/~r/mundogeekfeed/~3/rD1EhFP9cnk/</link>
		<comments>http://mundogeek.net/archivos/2013/04/17/moda-geek-2/#comments</comments>
		<pubDate>Wed, 17 Apr 2013 15:21:47 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[conjuntos]]></category>
		<category><![CDATA[geek]]></category>
		<category><![CDATA[moda]]></category>
		<category><![CDATA[outfits]]></category>
		<category><![CDATA[ropa]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=8361</guid>
		<description><![CDATA[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 [...]]]></description>
				<content:encoded><![CDATA[<p>Al hablar de moda geek puede venirnos a la cabeza el <a href="http://mundogeek.net/archivos/2011/07/15/el-sindrome-de-la-princesa-leia/" title="El síndrome de la princesa Leia">cosplay</a>, las <a href="http://mundogeek.net/archivos/2008/03/28/camiseta-para-ligar-con-ingenieras/" title="Camiseta para ligar con ingenieras">camisetas con integrales</a> y <a href="http://mundogeek.net/archivos/2011/04/10/atajos-de-teclado-para-torpes/" title="Atajos de teclado para torpes">chistes informáticos</a>, y <a href="http://mundogeek.net/archivos/2009/02/20/piedra-papel-tijeras-lagarto-o-spock/" title="Piedra, papel, tijeras, lagarto o Spock">otras curiosidades</a>. 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 <a href="http://sartorialgeek.com/" title="Sartorial geek">Sartorial geek</a>, dedicado, entre otras, cosas a publicar <em>outfits</em> inspirados en personajes tan famosos como Gandalf, Yoshi, Aqua man o el Capitán América.</p>
<p><img src="http://mundogeek.net/wp-content/moda-geek.jpg" alt="Moda geek"/></p>
<img src="http://feeds.feedburner.com/~r/mundogeekfeed/~4/rD1EhFP9cnk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2013/04/17/moda-geek-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://mundogeek.net/archivos/2013/04/17/moda-geek-2/</feedburner:origLink></item>
		<item>
		<title>Cómo forzar a una aplicación a utilizar una determinada interfaz de red</title>
		<link>http://feed.mundogeek.net/~r/mundogeekfeed/~3/uaDk08hPHwE/</link>
		<comments>http://mundogeek.net/archivos/2013/04/16/como-forzar-a-una-aplicacion-a-utilizar-una-determinada-interfaz-de-red/#comments</comments>
		<pubDate>Tue, 16 Apr 2013 16:50:39 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[aplicaciones]]></category>
		<category><![CDATA[interfaz]]></category>
		<category><![CDATA[lan]]></category>
		<category><![CDATA[redes]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[wifi]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=8355</guid>
		<description><![CDATA[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 [...]]]></description>
				<content:encoded><![CDATA[<p>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: <a href="http://www.r1ch.net/stuff/forcebindip/">ForceBindIP</a>.<span id="more-8355"></span></p>
<p>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:</p>
<p class="code">ForceBindIP 174.193.48.35 &#8220;C:\Archivos de programa\Internet Explorer\iexplore.exe&#8221;</p>
<p>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 <code>regedit</code>, lo que abrirá el editor de registro. En <code>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces</code> busca la clave con un valor para DhcpIPAddress igual a la IP asignada actualmente para esa interfaz.</p>
<p class="code">ForceBindIP {11388731-F073-4EC4-A52C-3EFA7F325A1D} &#8220;C:\Archivos de programa\Internet Explorer\iexplore.exe&#8221;</p>
<p>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.</p>
<blockquote><p><code>Windows Registry Editor Version 5.00</code></p>
<p><code>[HKEY_CLASSES_ROOT\exefile\shell\EjecutarWifi]<br />
@="Ejecutar por WiFi"</code></p>
<p><code>[HKEY_CLASSES_ROOT\exefile\shell\EjecutarWifi\command]<br />
@="ForceBindIP {11388731-F073-4EC4-A52C-3EFA7F325A1D} \"%l\""</code></p>
<p><code>[HKEY_CLASSES_ROOT\exefile\shell\EjecutarLAN]<br />
@="Ejecutar por LAN"</code></p>
<p><code>[HKEY_CLASSES_ROOT\exefile\shell\EjecutarLAN\command]<br />
@="ForceBindIP {EAEA78D4-05AA-4421-BD99-0B6C89FB9FC5} \"%l\""</code></p></blockquote>
<img src="http://feeds.feedburner.com/~r/mundogeekfeed/~4/uaDk08hPHwE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2013/04/16/como-forzar-a-una-aplicacion-a-utilizar-una-determinada-interfaz-de-red/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://mundogeek.net/archivos/2013/04/16/como-forzar-a-una-aplicacion-a-utilizar-una-determinada-interfaz-de-red/</feedburner:origLink></item>
		<item>
		<title>Tutorial de Android en español</title>
		<link>http://feed.mundogeek.net/~r/mundogeekfeed/~3/YABFAXnG6L4/</link>
		<comments>http://mundogeek.net/archivos/2013/04/15/tutorial-de-android-en-espanol/#comments</comments>
		<pubDate>Mon, 15 Apr 2013 15:37:07 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[castellano]]></category>
		<category><![CDATA[desarrolladores]]></category>
		<category><![CDATA[español]]></category>
		<category><![CDATA[oficial]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[tutoriales]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=8351</guid>
		<description><![CDATA[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: Construyendo tu primera aplicación [...]]]></description>
				<content:encoded><![CDATA[<p>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:</p>
<ol>
<li><a href="http://mundogeek.net/android/primera-aplicacion/">Construyendo tu primera aplicación</a></li>
<li><a href="http://mundogeek.net/android/ciclo-vida-actividad/">Gestionando el ciclo de vida de la actividad</a></li>
<li><a href="http://mundogeek.net/android/soportando-dispositivos/">Soportando distintos dispositivos</a></li>
<li><a href="http://mundogeek.net/android/fragmentos/">Construyendo una interfaz de usuario dinámica con fragmentos</a></li>
<li><a href="http://mundogeek.net/android/almacenar-informacion/">Guardando información</a></li>
<li><a href="http://mundogeek.net/android/intenciones/">Interactuando con otras aplicaciones</a></li>
<li><a href="http://mundogeek.net/android/compartiendo/">Compartiendo contenido</a></li>
</ol>
<img src="http://feeds.feedburner.com/~r/mundogeekfeed/~4/YABFAXnG6L4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2013/04/15/tutorial-de-android-en-espanol/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		<feedburner:origLink>http://mundogeek.net/archivos/2013/04/15/tutorial-de-android-en-espanol/</feedburner:origLink></item>
		<item>
		<title>Mantenimiento percusivo</title>
		<link>http://feed.mundogeek.net/~r/mundogeekfeed/~3/3pPPCQ4Qavs/</link>
		<comments>http://mundogeek.net/archivos/2013/02/12/mantenimiento-percusivo/#comments</comments>
		<pubDate>Tue, 12 Feb 2013 16:38:36 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[hardware]]></category>
		<category><![CDATA[mantenimiento]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=8339</guid>
		<description><![CDATA[¿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 &#8220;técnico&#8220;, mantenimiento percusivo, y aunque parezca cosa del pasado, con tanta maquinaria de precisión y tanto gadget futurista, [...]]]></description>
				<content:encoded><![CDATA[<p>¿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 &#8220;<em>técnico</em>&#8220;, <a href="http://en.wikipedia.org/wiki/Percussive_maintenance" title="Mantenimiento percusivo">mantenimiento percusivo</a>, 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!<span id="more-8339"></span></p>
<p style="text-align:center"><img src="http://mundogeek.net/wp-content/mantenimiento-percusivo.jpg" alt="Mantenimiento percusivo"/></p>
<img src="http://feeds.feedburner.com/~r/mundogeekfeed/~4/3pPPCQ4Qavs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2013/02/12/mantenimiento-percusivo/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		<feedburner:origLink>http://mundogeek.net/archivos/2013/02/12/mantenimiento-percusivo/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 0.695 seconds. --><!-- Cached page generated by WP-Super-Cache on 2013-05-13 23:20:06 -->
