<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>PSDM TechBlog</title>
	<atom:link href="http://techblog.psdm.co/feed/" rel="self" type="application/rss+xml" />
	<link>http://techblog.psdm.co</link>
	<description>Blog de tecnología &#124; PSDM Consulting</description>
	<lastBuildDate>Thu, 19 Apr 2012 14:54:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Java: convertir fecha y hora a otra zona horaria</title>
		<link>http://techblog.psdm.co/2012/04/java-convertir-fecha-y-hora-a-otra-zona-horaria/</link>
		<comments>http://techblog.psdm.co/2012/04/java-convertir-fecha-y-hora-a-otra-zona-horaria/#comments</comments>
		<pubDate>Thu, 19 Apr 2012 14:52:07 +0000</pubDate>
		<dc:creator>heavymetaldroid</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[convertir hora]]></category>
		<category><![CDATA[timezone]]></category>
		<category><![CDATA[zona horaria]]></category>

		<guid isPermaLink="false">http://techblog.psdm.co/?p=698</guid>
		<description><![CDATA[Es bastante sencillo, utilizando la clase DateFormat (y derivados), convertir un conjunto fecha/hora a otra zona horaria. Código a continuación: import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; /** * Simple Java program to convert local time into GMT or &#8230; <a href="http://techblog.psdm.co/2012/04/java-convertir-fecha-y-hora-a-otra-zona-horaria/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Es bastante sencillo, utilizando la clase <a href="http://docs.oracle.com/javase/1.4.2/docs/api/java/text/DateFormat.html" target="_blank">DateFormat </a>(y derivados), convertir un conjunto fecha/hora a otra zona horaria.</p>
<p>Código a continuación:</p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

/**
 * Simple Java program to convert local time into GMT or any other TimeZone in Java
 * SimpleDateFormat in Java can be used to convert Date from one timezone to other
 * @author Javin
 */
public class TimeZoneConverter {

    public static void main(String args[]) {

     //Date will return local time in Java
     Date localTime = new Date(); 

     //creating DateFormat for converting time from local timezone to GMT
     DateFormat converter = new SimpleDateFormat(&quot;dd/MM/yyyy:HH:mm:ss&quot;);

     //getting GMT timezone, you can get any timezone e.g. UTC
     converter.setTimeZone(TimeZone.getTimeZone(&quot;GMT&quot;));

     System.out.println(&quot;local time : &quot; + localTime);;
     System.out.println(&quot;time in GMT : &quot; + converter.format(localTime));

    }   

}
</pre>
<p>Si ejecutamos, la salida es:</p>
<pre class="brush: text; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
local time : Wed Apr 11 05:48:16 VET 2012
time in GMT : 11/04/2012:10:18:16
</pre>
<p>La clase TimeZone por su parte permite especificar el huso horario en varios formatos diferentes, que podemos ver <a href="http://docs.oracle.com/javase/1.4.2/docs/api/java/util/TimeZone.html" target="_blank">en este enlace</a>.</p>
<p>Vía | <a href="http://javarevisited.blogspot.com.es/2012/04/how-to-convert-local-time-to-gmt-in.html">Java Revisited</a></p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.psdm.co/2012/04/java-convertir-fecha-y-hora-a-otra-zona-horaria/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Varargs en Java: número variable de argumentos en Java</title>
		<link>http://techblog.psdm.co/2012/02/varargs-en-java-numero-variable-de-argumentos-en-java/</link>
		<comments>http://techblog.psdm.co/2012/02/varargs-en-java-numero-variable-de-argumentos-en-java/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 15:23:28 +0000</pubDate>
		<dc:creator>heavymetaldroid</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[argumentos]]></category>
		<category><![CDATA[argumentos variables]]></category>
		<category><![CDATA[método]]></category>
		<category><![CDATA[vargars]]></category>
		<category><![CDATA[variable]]></category>

		<guid isPermaLink="false">http://techblog.psdm.co/?p=686</guid>
		<description><![CDATA[Es posible implementar métodos con un número variable de argumentos en Java, desde la versión 5. Las condiciones a cumplir son las siguientes: Los parámetros variables tienen todos el mismo tipo (o son instancias del mismo objeto). Hay cero o &#8230; <a href="http://techblog.psdm.co/2012/02/varargs-en-java-numero-variable-de-argumentos-en-java/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Es posible implementar métodos con un número variable de argumentos en Java, desde la versión 5.</p>
<p>Las condiciones a cumplir son las siguientes:</p>
<ol>
<li>Los parámetros variables tienen todos el mismo tipo (o son instancias del mismo objeto).</li>
<li>Hay cero o más parámetros variables.</li>
<li>Sólo hay un conjunto de parámetros variables.</li>
<li>El conjunto de parámetros variables viene al final de la definición del método.</li>
</ol>
<p>Como ejemplo, la definición del método<em> java.io.PrintStream.printf()</em>:</p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
public PrintStream printf(String format,
                          Object... args)
</pre>
<p><span id="more-686"></span>Uso</p>
<p>Veamos un ejemplo sencillo: un método que devuelve la suma de un número variable de enteros:</p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
public static int sum(int... args)
{
   int result=0;
   for(int a:args)
   {
      result+=a;
   }
   return result;
}
</pre>
<p>Ejemplo de uso del método:</p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
System.out.printf(&quot;0 %d\n&quot;, sum()); // prints &quot;0 0&quot;
System.out.printf(&quot;1 %d\n&quot;, sum(1)); // prints &quot;1 1&quot;
System.out.printf(&quot;2 %d\n&quot;, sum(1, 2)); // prints &quot;2 3&quot;
System.out.printf(&quot;3 %d\n&quot;, sum(1, 2, 3)); // prints &quot;3 6&quot;
System.out.printf(&quot;4 %d\n&quot;, sum(1, 2, 3, 4)); // prints &quot;4 10&quot;
</pre>
<p>Supongamos que queremos forzar a que haya, al menos, dos enteros (no tiene sentido la suma de 0 ó 1 enteros):</p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
public static int sum(int arg0, int arg1, int... args)
{
   int result=arg0+arg1;
   for(int a:args)
   {
      result+=a;
   }
   return result;
}
</pre>
<p>Ahora no podemos llamar a la rutina sin argumentos. Un ejemplo de llamada:</p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
System.out.printf(&quot;6 %d\n&quot;, sum(1, 2, new int[]{2, 3, 4, 5})); // prints &quot;5 17&quot;
</pre>
<p>Object</p>
<p>Uso básico con objetos:</p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
public static int objector(Object... args)
{
   return args.length;
}
</pre>
<p>Probamos con unas cadenas (String):</p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
String[] strings = new String[]{&quot;one&quot;, &quot;two&quot;, &quot;three&quot;};
Object[] objects = new Object[]{Integer.valueOf(1), Boolean.TRUE, &quot;three&quot;};
System.out.printf(&quot;strings %d\n&quot;, objector(strings)); // prints &quot;strings 3&quot;
System.out.printf(&quot;objects %d\n&quot;, objector(objects)); // prints &quot;objects 3&quot;
</pre>
<p>De la misma manera, si requerimos al menos un objeto:</p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
public static int objector(Object arg0, Object... args)
{
   return args.length;
}
</pre>
<p>Si ejecutamos los printf del ejemplo de código anterior, utilizando la nueva versión de la rutina objector, veremos que devuelve una longitud <strong>cero</strong>. Esto se debe a que el array es un objeto en sí, y está siendo pasado a la rutina como primer argumento.</p>
<p>En un caso como este, podemos manejar el caso en que el número de argumentos es igual a cero de esta manera:</p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
public static void objector(Object... args)
{
   if(args.length==0)
   {
      // special case
   }
   else
   {
      // handle arguments
   }
}
</pre>
<p>En este caso, un mal uso quedaría de manifiesto en tiempo de compilación. Esto te da la opción de cambiar la interfaz.</p>
<p>Conclusión</p>
<p>Ya que los objetos pasados como argumentos van a ser tratados como un array de tipo Object[] (utilizando reflexión), parece sólo tiene sentido utilizar la versión Object&#8230; varargs si el método forma parte de un API y va a ser utilizado por otros.</p>
<p>Autoboxing</p>
<p>Otra cuestión a tener en cuenta es que podemos utilizar el Autoboxing, también introducido en la versión 5 de Java. Esto permite la conversión automática entre tipos y sus objetos correspondientes. Esto funciona si, por ejemplo, pasamos varios objetos Integer a una rutina con argumentos int&#8230; args. Sin embargo, no funciona si pasamos un Integer[], pues Java no puede convertirlo automáticamente a int[].</p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
public static int inter(int... args)
{
   return args.length;
}
</pre>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
int[] ints = new int[]{ 1, 2, 3, 4, 5 };
Integer[] integers = new Integer[]{ 1, 2, 3, 4, 5 };
System.out.printf(&quot;ints %d\n&quot;, inter(ints)); // prints &quot;ints 5&quot;
System.out.printf(&quot;Integer %d\n&quot;, inter(Integer.valueOf(1), Integer.valueOf(2))); // prints Integer 2&quot;
System.out.printf(&quot;Integer[] %d\n&quot;, inter(integers)); // compiler error
</pre>
<p>Si que funcionaría si lo hiciéramos al revés. Es decir, si el argumento esperado es de tipo Integer&#8230; args, podemos pasar un int[].</p>
<p>Vía | <a href="http://radio.javaranch.com/davo/2011/04/14/1302760520890.html">javaranch</a></p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.psdm.co/2012/02/varargs-en-java-numero-variable-de-argumentos-en-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java: recorrer una estructura de árbol usando Stacks sin llamadas recursivas</title>
		<link>http://techblog.psdm.co/2012/01/java-recorrer-una-estructura-de-arbol-usando-stacks-sin-llamadas-recursivas/</link>
		<comments>http://techblog.psdm.co/2012/01/java-recorrer-una-estructura-de-arbol-usando-stacks-sin-llamadas-recursivas/#comments</comments>
		<pubDate>Tue, 31 Jan 2012 14:21:51 +0000</pubDate>
		<dc:creator>heavymetaldroid</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[árbol]]></category>
		<category><![CDATA[no recursivo]]></category>
		<category><![CDATA[recursión]]></category>
		<category><![CDATA[recursivo]]></category>
		<category><![CDATA[sin recursión]]></category>
		<category><![CDATA[stack]]></category>

		<guid isPermaLink="false">http://techblog.psdm.co/?p=684</guid>
		<description><![CDATA[Consideramos una estructura de árbol, formada por objetos que heredan de Node. Cada objeto, subclase de Node, puede tener hijos que a su vez son subclases de Node. Podemos recorrer el árbol de objetos, sin utilizar llamadas recursivas, utilizando el &#8230; <a href="http://techblog.psdm.co/2012/01/java-recorrer-una-estructura-de-arbol-usando-stacks-sin-llamadas-recursivas/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Consideramos una estructura de árbol, formada por objetos que heredan de Node. Cada objeto, subclase de Node, puede tener hijos que a su vez son subclases de Node.</p>
<p>Podemos recorrer el árbol de objetos, sin utilizar llamadas recursivas, utilizando el código que se muestra a continuación:</p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
/**
* Returns a {@link Stack} having a Tree ordered in Depth First whose root is passed as the Parameter
*
* @param The implementation of {@link Node}
* @param treeRoot The root of the tree
* @return The {@link Stack} of T
*/
public static Stack depthFirstOrder(final T treeRoot)
{
   // Main stack, where the important stuff go
   Stack mainStack = new Stack();

   // Temp child stack, where we store children of before it gets put to the mainStack
   Stack tempChildStack = new Stack();

   mainStack.push(treeRoot);   // Put the tree root
   tempChildStack.addAll(treeRoot.getChildren()); // Put the children to the temp

   // Loop until no more children in the temp stack
   while (!tempChildStack.isEmpty())
   {
      T node = (T) tempChildStack.pop();   // Keep popping from the temp stack..
      mainStack.push(node);   // .. and Push to the main stack..
      tempChildStack.addAll(node.getChildren()); // .. while adding children to temp
   }

   // Now temp stack is empty and mainStack has things in DFS order!
   return mainStack;
}
</pre>
<p>Vía | <a href="http://www.gunith.com/2011/12/how-to-traverse-a-tree-in-depth-first-order-using-stacks-without-recursion-in-java/">gunith</a></p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.psdm.co/2012/01/java-recorrer-una-estructura-de-arbol-usando-stacks-sin-llamadas-recursivas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android: convertir dp a pixels</title>
		<link>http://techblog.psdm.co/2012/01/android-convertir-dp-a-pixels/</link>
		<comments>http://techblog.psdm.co/2012/01/android-convertir-dp-a-pixels/#comments</comments>
		<pubDate>Wed, 25 Jan 2012 12:03:00 +0000</pubDate>
		<dc:creator>heavymetaldroid</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[convertir]]></category>
		<category><![CDATA[dip]]></category>
		<category><![CDATA[dp]]></category>
		<category><![CDATA[pixel]]></category>

		<guid isPermaLink="false">http://techblog.psdm.co/?p=677</guid>
		<description><![CDATA[En Android, a veces, es necesario hacer un tratamiento del tamaño de ciertos elementos en pixels, durante la ejecución de la aplicación, como por ejemplo en: view.setPadding(int, int, int, int); Sin embargo, sabemos que, sobre todo al diseñar interfaces, es &#8230; <a href="http://techblog.psdm.co/2012/01/android-convertir-dp-a-pixels/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>En Android, a veces, es necesario hacer un tratamiento del tamaño de ciertos elementos en pixels, durante la ejecución de la aplicación, como por ejemplo en:</p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
view.setPadding(int, int, int, int);
</pre>
<p>Sin embargo, sabemos que, sobre todo al diseñar interfaces, es muy conveniente utilizar dip (density independent pixel) a la hora de especificar tamaños, para evitar variaciones entre dispositivos con resoluciones diferentes.</p>
<p>De manera que, para ejecutar código como el de arriba (cambios en runtime), podemos hacer lo siguiente:</p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
float sizeInDip = 10f;
int padding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, sizeInDip, getResources().getDisplayMetrics());
</pre>
<p>Vía | <a href="http://www.jameselsey.co.uk/blogs/techblog/converting-dp-to-pixels-in-android/?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+PlanetAndroidCom+%28Planet+Android%29">James Elsey Blog</a></p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.psdm.co/2012/01/android-convertir-dp-a-pixels/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java: invertir el orden de un array</title>
		<link>http://techblog.psdm.co/2011/04/java-invertir-el-orden-de-un-array/</link>
		<comments>http://techblog.psdm.co/2011/04/java-invertir-el-orden-de-un-array/#comments</comments>
		<pubDate>Wed, 13 Apr 2011 13:46:18 +0000</pubDate>
		<dc:creator>heavymetaldroid</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[array java]]></category>
		<category><![CDATA[invertir array java]]></category>
		<category><![CDATA[invertir orden array]]></category>
		<category><![CDATA[invertir orden array java]]></category>
		<category><![CDATA[java arrays]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=659</guid>
		<description><![CDATA[Ahí va un trozo de código, no sólo rápido sino además eficiente, para invertir el orden de un array en Java: public static T[] reverse(T[] array) { Collections.reverse(Arrays.asList(array)); return array; } Como indica el autor del post original, la ejecución &#8230; <a href="http://techblog.psdm.co/2011/04/java-invertir-el-orden-de-un-array/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ahí va un trozo de código, no sólo rápido sino además eficiente, para invertir el orden de un array en Java:</p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
public static <T> T[] reverse(T[] array) {
    Collections.reverse(Arrays.asList(array));
    return array;
}
</pre>
<p>Como indica el autor del post original, la ejecución no implica copia de arrays, de manera que resulta rápido y sin efectos laterales (se devuelve el mismo array recibido, con el orden modificado.</p>
<p><strong>Nota acerca de Arrays.asList()</strong></p>
<p>La documentación de esta API muestra que la lista que devuelve es de tamaño fijo. Esto implica que cualquier llamada a add() o remove() devolverá una excepción de tipo UnsupportedOperationException. Si se pasa a través de la interfaz java.util.List el resultado es indefinido, ya que cualquier programador esperaría que un objeto de ese tipo fuera modificable, en el sentido de poder añadir/eliminar elementos.</p>
<p>Vía | <a href="http://schneide.wordpress.com/2011/04/11/reversing-an-array-in-java/">http://schneide.wordpress.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.psdm.co/2011/04/java-invertir-el-orden-de-un-array/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Enum en Base de Datos</title>
		<link>http://techblog.psdm.co/2011/04/enum-en-base-de-datos/</link>
		<comments>http://techblog.psdm.co/2011/04/enum-en-base-de-datos/#comments</comments>
		<pubDate>Fri, 01 Apr 2011 11:40:03 +0000</pubDate>
		<dc:creator>heavymetaldroid</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[db]]></category>
		<category><![CDATA[enum]]></category>
		<category><![CDATA[enum base de datos]]></category>
		<category><![CDATA[enum db]]></category>
		<category><![CDATA[enum en base de datos]]></category>
		<category><![CDATA[enum en db]]></category>
		<category><![CDATA[enum sql]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=653</guid>
		<description><![CDATA[Hace unos días leí un artículo de Ben Boyter en el que explicaba cómo suele almacenar los enums que necesita utilizar un aplicación en Base de Datos. La solución me parece muy buena, así que la dejo aquí para que &#8230; <a href="http://techblog.psdm.co/2011/04/enum-en-base-de-datos/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Hace unos días leí un artículo de <a href="http://twitter.com/boyter" target="_blank">Ben Boyter</a> en el que explicaba cómo suele almacenar los enums que necesita utilizar un aplicación en Base de Datos.</p>
<p>La solución me parece muy buena, así que la dejo aquí para que no se me olvide&#8230;<br />
<span id="more-653"></span><br />
Partimos del hecho de que implementar una tabla por cada tipo de enum que queremos almacenar conlleva habitualmente un mantenimiento complicado y tedioso. Lo normal es tener varias tablas, con unas cuantas filas cada una, sin &#8220;foreign keys&#8221;.</p>
<p>La solución que propone <a href="http://twitter.com/boyter" target="_blank">Ben</a> incluye dos tablas, una llamada Lookup y la otra Value, independientemente de los enums que se necesite utilizar. Así el mantenimiento es más sencillo.</p>
<p>Los campos de la tabla Lookup serían:</p>
<pre class="brush: sql; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
+------+
|id
|lookup
|name
+------+
</pre>
<p>Esto es la representación del nombre de un tipo enum. El campo &#8220;id&#8221; es de tipo &#8220;autoincrement&#8221; y la clave principal (&#8220;primary key&#8221;) es &#8220;lookup&#8221;. Una entrada en esta tabla, entonces, equivale a un tipo de enum, no a sus valores.</p>
<p>Los valores se añaden en la tabla Value, cuyos campos serían:</p>
<pre class="brush: sql; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
+---------+
|id
|lookupid
|name
|sortorder
|deleted
+---------+
</pre>
<p>De esta manera se pueden obtener los valores de un tipo enum con un &#8220;join&#8221; bastante sencillo:</p>
<pre class="brush: sql; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
SELECT * FROM Value v INNER JOIN Lookup l ON l.id = v.lookupid WHERE l.name = '?';
</pre>
<p>Si además añadimos un índice sobre los campos id y lookupid, el acceso es muy rápido. Tienes todos tus enums en una única tabla, resulta sencillo añadirles información adicional, y evitas el problema de mantenimiento de N tablas, una por cada enum.</p>
<p>Vía | <a href="http://searchco.de/blog/view/how-i-store-enumerations-in-the-database">http://searchco.de</a></p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.psdm.co/2011/04/enum-en-base-de-datos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java: optimizaciones de código</title>
		<link>http://techblog.psdm.co/2011/03/java-optimizaciones-de-codigo/</link>
		<comments>http://techblog.psdm.co/2011/03/java-optimizaciones-de-codigo/#comments</comments>
		<pubDate>Thu, 10 Mar 2011 09:32:52 +0000</pubDate>
		<dc:creator>heavymetaldroid</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[java código más rápido]]></category>
		<category><![CDATA[java mejorar performance]]></category>
		<category><![CDATA[java optimizar código]]></category>
		<category><![CDATA[java performance]]></category>
		<category><![CDATA[optimización java]]></category>
		<category><![CDATA[optimizar java]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=650</guid>
		<description><![CDATA[Leo en Java Revisited algunos trucos para optimizar la ejecución de nuestro código Java que pueden ser muy útiles. Ahí van los trucos (añadiré encantado todos los que queráis aportar): Utilizar los operadores a nivel de bit para realizar multiplicaciones &#8230; <a href="http://techblog.psdm.co/2011/03/java-optimizaciones-de-codigo/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Leo en <a href="http://javarevisited.blogspot.com" target="_blank">Java Revisited</a> algunos trucos para optimizar la ejecución de nuestro código Java que pueden ser muy útiles.</p>
<p>Ahí van los trucos (añadiré encantado todos los que queráis aportar):<br />
<span id="more-650"></span></p>
<ol>
<li>Utilizar los operadores a nivel de bit para realizar multiplicaciones y divisiones por 2 (esto siempre que se quiera realizar una multiplicación/división entera, por supuesto). Ej: 20 &gt;&gt; 1 = 10; 10 &lt;&lt; 1 = 20;</li>
<li>Utilizar <a href="http://download.oracle.com/javase/6/docs/api/java/lang/StringBuffer.html" target="_blank">StringBuffer</a> en lugar de <a href="http://download.oracle.com/javase/6/docs/api/java/lang/String.html" target="_blank">String</a> cuando sea necesario realizar operaciones sobre las cadenas. Podemos utilizar String en caso de cadenas &#8220;estáticas&#8221;. A partir de java 5 se puede considerar también el uso de <a href="http://download.oracle.com/javase/6/docs/api/java/lang/StringBuilder.html" target="_blank">StringBuilder</a>.</li>
<li>Hacer que las variables, clases y/o métodos sean &#8220;final&#8221;, siempre que esto sea posible. Esto favorece la optimización por parte del compilador (compile time binding), y el bytecode resultante se ejecuta más rápido.</li>
<li>Los métodos estáticos también se resuelven en tiempo de compilación, mientras el resto se resuelven en tiempo de ejecución. Esto favorece a la performance de la aplicación. Pero ojo, que esto podría implicar una penalización en cuanto a uso de memoria.</li>
<li>No utilizar llamadas a métodos en los bucles for. Por ejemplo, para un bucle
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
for(int i=0; i<vector.size();i++) {}
</pre>
<p>Utilizar:</p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
int size = vector.size();
for(int i=0; i<size;i++) {}
</pre>
</li>
</ol>
<p>Vía | <a href="http://javarevisited.blogspot.com/2010/10/improving-performance-of-application-in.html">http://javarevisited.blogspot.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.psdm.co/2011/03/java-optimizaciones-de-codigo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android: código para leer el log</title>
		<link>http://techblog.psdm.co/2011/03/android-codigo-para-leer-el-log/</link>
		<comments>http://techblog.psdm.co/2011/03/android-codigo-para-leer-el-log/#comments</comments>
		<pubDate>Mon, 07 Mar 2011 13:55:38 +0000</pubDate>
		<dc:creator>heavymetaldroid</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[android acceder al log]]></category>
		<category><![CDATA[android acceder al log del sistema]]></category>
		<category><![CDATA[android java]]></category>
		<category><![CDATA[android java leer el log]]></category>
		<category><![CDATA[android leer el log]]></category>
		<category><![CDATA[android leer el log del sistema]]></category>
		<category><![CDATA[código para leer el log]]></category>
		<category><![CDATA[java leer el log del sistema]]></category>
		<category><![CDATA[leer el log por código]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=645</guid>
		<description><![CDATA[Sólo se me ocurre una razón para acceder al log directamente, por código, en una aplicación Android, y es con propósito de debug. De hecho, en la vía original, Hello Android, no nombra ninguna otra&#8230; En cualquier caso, allá va &#8230; <a href="http://techblog.psdm.co/2011/03/android-codigo-para-leer-el-log/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Sólo se me ocurre una razón para acceder al log directamente, por código, en una aplicación Android, y es con propósito de debug. De hecho, en la vía original, <a href="http://www.helloandroid.com" target="_blank">Hello Android</a>, no nombra ninguna otra&#8230;</p>
<p>En cualquier caso, allá va el código que permite hacerlo:<br />
<span id="more-645"></span></p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
public class LogTest extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    try {
      Process process = Runtime.getRuntime().exec("logcat -d");
      BufferedReader bufferedReader = new BufferedReader(
      new InputStreamReader(process.getInputStream()));

      StringBuilder log=new StringBuilder();
      String line;
      while ((line = bufferedReader.readLine()) != null) {
        log.append(line);
      }
      TextView tv = (TextView)findViewById(R.id.textView1);
      tv.setText(log.toString());
    } catch (IOException e) {
    }
  }
}
</pre>
<p>Y es cierto que, a priori, cabría pensar que se requieren permisos de superusuario para que funcione, pues el código ejecuta un proceso directamente en el terminal (proceso &#8220;logcat&#8221;). Sin embargo, se puede conseguir mediante el mecanismo de concesión de permisos de las aplicaciones Android:</p>
<pre class="brush: text; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
<uses-permission android:name="android.permission.READ_LOGS" />
</pre>
<p>Podéis consultar la <a href="http://developer.android.com/guide/developing/tools/adb.html#logcat" target="_blank">documentación</a> para ver qué otras opciones se pueden añadir al comando logcat.</p>
<p>Vía | <a href="http://www.helloandroid.com/tutorials/reading-logs-programatically?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed:+PlanetAndroidCom+(Planet+Android)">http://www.helloandroid.com/tutorials/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.psdm.co/2011/03/android-codigo-para-leer-el-log/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android: evitar que el móvil entre en reposo</title>
		<link>http://techblog.psdm.co/2011/02/android-evitar-que-el-movil-entre-en-reposo/</link>
		<comments>http://techblog.psdm.co/2011/02/android-evitar-que-el-movil-entre-en-reposo/#comments</comments>
		<pubDate>Wed, 09 Feb 2011 07:59:05 +0000</pubDate>
		<dc:creator>heavymetaldroid</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[android bloqueo]]></category>
		<category><![CDATA[android bloqueo automático]]></category>
		<category><![CDATA[android evitar bloqueo]]></category>
		<category><![CDATA[android evitar reposo]]></category>
		<category><![CDATA[android reposo]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=642</guid>
		<description><![CDATA[A veces una aplicación requiere que el teléfono no entre en modo reposo o ahorro de energía, por ejemplo, como dice el artículo original en inglés, durante una actualización o una descarga crítica. A continuación se muestra el código para &#8230; <a href="http://techblog.psdm.co/2011/02/android-evitar-que-el-movil-entre-en-reposo/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A veces una aplicación requiere que el teléfono no entre en modo reposo o ahorro de energía, por ejemplo, como dice el artículo original en inglés, durante una actualización o una descarga crítica.</p>
<p>A continuación se muestra el código para evitar que el gestor de energía pasa el terminal a reposo. Primero creamos una instancia de WakeLock:<br />
<span id="more-642"></span></p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wakeLock = pm.newWakeLock(
        pm.SCREEN_DIM_WAKE_LOCK, "My wakelook");
// Esto hará que no se apague la pantalla y el teléfono no pase a reposo.
</pre>
<p>A continuación tenemos dos opciones. La primera evitar el bloqueo durante un periodo de tiempo determinado:</p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
// Esto hará que se libere el wakeLock después de 1000 ms
wakeLock.acquire(1000);
</pre>
<p>La segunda &#8220;adquirir&#8221; el wakeLock y liberarlo cuando lo consideremos oportuno:</p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
// La alternativa es adquirir y liberar el wakeLock cuando sea conveniente:
wakeLock.acquire();
...
wakeLock.release();
</pre>
<p>Vía | <a href="http://www.vogella.de/blog/2011/02/07/android-wakelock/">http://www.vogella.de</a></p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.psdm.co/2011/02/android-evitar-que-el-movil-entre-en-reposo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java: parsear un texto – cómo descomponer un texto en palabras, frases, líneas, etc.</title>
		<link>http://techblog.psdm.co/2011/02/java-parsear-un-texto-como-descomponer-un-texto-en-palabras-frases-lineas-etc/</link>
		<comments>http://techblog.psdm.co/2011/02/java-parsear-un-texto-como-descomponer-un-texto-en-palabras-frases-lineas-etc/#comments</comments>
		<pubDate>Mon, 07 Feb 2011 11:00:20 +0000</pubDate>
		<dc:creator>heavymetaldroid</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[java descomponer string]]></category>
		<category><![CDATA[java descomponer texto]]></category>
		<category><![CDATA[java frases]]></category>
		<category><![CDATA[java líneas]]></category>
		<category><![CDATA[java palabras]]></category>
		<category><![CDATA[java parsear string]]></category>
		<category><![CDATA[java parsear texto]]></category>
		<category><![CDATA[java.text.BreakIterator]]></category>
		<category><![CDATA[java.text.BreakIterator sample code]]></category>

		<guid isPermaLink="false">http://blog.ilikeblues.com/?p=632</guid>
		<description><![CDATA[El JDK de Java incluye una clase tremendamente útil a la hora de parsear y descomponer un texto en palabras, frases y/o líneas. La clase es BreakIterator forma parte del paquete java.text. Esta clase está preparada incluso para funcionar con &#8230; <a href="http://techblog.psdm.co/2011/02/java-parsear-un-texto-como-descomponer-un-texto-en-palabras-frases-lineas-etc/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>El JDK de Java incluye una clase tremendamente útil a la hora de parsear y descomponer un texto en palabras, frases y/o líneas.</p>
<p>La clase es <strong>BreakIterator</strong> forma parte del paquete <strong>java.text</strong>. Esta clase está preparada incluso para funcionar con diferentes &#8220;locales&#8221;, y soporta cuatro tipos diferentes de &#8220;límites&#8221;, a la hora de determinar cómo &#8220;trocear&#8221; un texto:</p>
<ul>
<li>Líneas: getLineInstance()</li>
<li>Frases: getSentenceInstance()</li>
<li>Palabras: getWordInstance()</li>
<li>Caracteres: getCharacterInstance()</li>
</ul>
<p>Además tiene métodos como next() y previous() que puede dar la sensación de estar utilizando un iterador. Sin embargo, estos métodos realmente devuelven un entero que permite localizar dentro de la cadena el comienzo del siguiente item.</p>
<p>Ahí van algunos ejemplos de código:<br />
<span id="more-632"></span><br />
Crear y utilizar esta clase:</p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
public static void main(String args[]) {
   if (args.length == 1) {
      String stringToExamine = args[0];
      //print each word in order
      BreakIterator boundary = BreakIterator.getWordInstance();
      boundary.setText(stringToExamine);
      printEachForward(boundary, stringToExamine);
      //print each sentence in reverse order
      boundary = BreakIterator.getSentenceInstance(Locale.US);
      boundary.setText(stringToExamine);
      printEachBackward(boundary, stringToExamine);
      printFirst(boundary, stringToExamine);
      printLast(boundary, stringToExamine);
   }
}
</pre>
<p>Ordenar y mostrar los elementos:</p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
public static void printEachForward(BreakIterator boundary, String source) {
      int start = boundary.first();
      for (int end = boundary.next();
         end != BreakIterator.DONE;
         start = end, end = boundary.next()) {
         System.out.println(source.substring(start,end));
      }
}
</pre>
<p>Mostrar los elementos en orden inverso:</p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
public static void printEachBackward(BreakIterator boundary, String source) {
   int end = boundary.last();
   for (int start = boundary.previous();
      start != BreakIterator.DONE;
      end = start, start = boundary.previous()) {
      System.out.println(source.substring(start,end));
   }
}
</pre>
<p>Primer elemento:</p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
public static void printFirst(BreakIterator boundary, String source) {
   int start = boundary.first();
   int end = boundary.next();
   System.out.println(source.substring(start,end));
}
</pre>
<p>Último elemento:</p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
public static void printLast(BreakIterator boundary, String source) {
   int end = boundary.last();
   int start = boundary.previous();
   System.out.println(source.substring(start,end));
}
</pre>
<p>Elemento en una posición determinada:</p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
public static void printAt(BreakIterator boundary, int pos, String source) {
   int end = boundary.following(pos);
   int start = boundary.previous();
   System.out.println(source.substring(start,end));
}
</pre>
<p>Encontrar la siguiente palabra:</p>
<pre class="brush: java; auto-links: true; collapse: false; gutter: true; first-line: 1; highlight: []; html-script: false; light: false; pad-line-numbers: false; toolbar: true'">
public static int nextWordStartAfter(int pos, String text) {
   BreakIterator wb = BreakIterator.getWordInstance();
   wb.setText(text);
   int last = wb.following(pos);
   int current = wb.next();
   while (current != BreakIterator.DONE) {
      for (int p = last; p < current; p++) {
      if (Character.isLetter(text.codePointAt(p)))
         return last;
      }
      last = current;
      current = wb.next();
   }
   return BreakIterator.DONE;
}
</pre>
<p>Vía | <a href="http://www.gunith.com/2011/02/easily-break-text-sentences-lines-words-jdk/">http://www.gunith.com</a></p>
<p>Vía | <a href="http://download.oracle.com/javase/6/docs/api/java/text/BreakIterator.html">http://download.oracle.com/javase/6/docs/api/java/text/BreakIterator.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://techblog.psdm.co/2011/02/java-parsear-un-texto-como-descomponer-un-texto-en-palabras-frases-lineas-etc/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

