<?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>{francho(lab)} &#187; Programación</title>
	<atom:link href="http://francho.org/lab/tag/programacion/feed/" rel="self" type="application/rss+xml" />
	<link>http://francho.org/lab</link>
	<description>forjando ideicas</description>
	<lastBuildDate>Fri, 20 Aug 2010 10:56:13 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Truco Android: Textos largos en TextView</title>
		<link>http://francho.org/lab/627/truco-android-textos-largos-en-textview/</link>
		<comments>http://francho.org/lab/627/truco-android-textos-largos-en-textview/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 14:35:52 +0000</pubDate>
		<dc:creator>francho</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[truco]]></category>

		<guid isPermaLink="false">http://francho.org/lab/?p=627</guid>
		<description><![CDATA[A veces tenemos que colocar un texto demasiado largo en un TextView con lo que o no se ve completo o salta de linea con lo que rompe el diseño.
Una solución es activar el &#8220;marquee&#8221; para que se muestre solo lo que quepa y al recibir el foco haga automáticamente un scroll horizontal para mostrar [...]]]></description>
			<content:encoded><![CDATA[<p>A veces tenemos que colocar un texto demasiado largo en un TextView con lo que o no se ve completo o salta de linea con lo que rompe el diseño.</p>
<p>Una solución es activar el &#8220;marquee&#8221; para que se muestre solo lo que quepa y al recibir el foco haga automáticamente un scroll horizontal para mostrar el resto.</p>
<pre class="brush: xml;">
&lt;TextView
  android:text=&quot;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc lorem quam, laoreet scelerisque egestas ornare&quot;
 android:id=&quot;@+id/Text11&quot;
 android:layout_width=&quot;wrap_content&quot; android:layout_height=&quot;fill_parent&quot;

 android:ellipsize=&quot;marquee&quot;
 android:focusable=&quot;true&quot;
 android:focusableInTouchMode=&quot;true&quot;
 android:lines=&quot;1&quot;
/&gt;
</pre>
<p>No hay que olvidarse de ponerlo como &#8220;focusable&#8221; (el movimiento empezará cuando reciba el foco) y forzar la linea simple.</p>
<p>Visto <a href="http://groups.google.com/group/android-developers/browse_thread/thread/08f09e0fdb9d25e0/2ab50ff5dcc83109?show_docid=2ab50ff5dcc83109">aquí</a></p>
]]></content:encoded>
			<wfw:commentRss>http://francho.org/lab/627/truco-android-textos-largos-en-textview/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Jugando con Java y el API de Twitter</title>
		<link>http://francho.org/lab/529/jugando-con-java-y-el-api-de-twitter/</link>
		<comments>http://francho.org/lab/529/jugando-con-java-y-el-api-de-twitter/#comments</comments>
		<pubDate>Sat, 09 Jan 2010 17:38:00 +0000</pubDate>
		<dc:creator>francho</dc:creator>
				<category><![CDATA[Banco de pruebas]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://francho.org/lab/?p=529</guid>
		<description><![CDATA[Twitter tiene un API muy completa que nos permite interactuar con su servicio desde nuestras aplicaciones. Esta tarde he estado enredando un poco con ella y la verdad es que se me ocurren un montón de aplicaciones prácticas(logueos, análisis automáticos, integración en servicios de noticias, estadísticas, seguimiento de usuarios, actualizaciones automáticas del perfil, etc&#8230;)
Existen librerías [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://apiwiki.twitter.com/">Twitter tiene un API</a> muy completa que nos permite interactuar con su servicio desde nuestras aplicaciones. Esta tarde he estado enredando un poco con ella y la verdad es que se me ocurren un montón de aplicaciones prácticas(logueos, análisis automáticos, integración en servicios de noticias, estadísticas, seguimiento de usuarios, actualizaciones automáticas del perfil, etc&#8230;)</p>
<p>Existen librerías en un montón de lenguajes que facilitan aún mas su uso. Pero en este caso yo he preferido programar un servicio desde cero (lo cual, gracias a la <a href="http://apiwiki.twitter.com/Twitter-API-Documentation">documentación del API</a> no ha sido nada complicado).</p>
<p>El siguiente ejemplo es una aproximación sencilla que permite actualizar nuestro estado (enviar un post) desde aplicación Java.</p>
<pre class="brush: java;">
/*
 *   http://creativecommons.org/licenses/by-nc/3.0/deed.es
 */

package org.francho.java.twitter;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
// http://commons.apache.org/codec/
import org.apache.commons.codec.binary.Base64;

/**
 *
 * @author francho - http://francho.org/lab/
 */
public class Twitter {

    private String username;
    private String pass;
    private String response;

    Twitter(String username, String pass) {
        setCredentials(username, pass);
    }

    /**
     * Ejemplo de acción implementada.
     *
     * Actualiza el estado de Twitter con el texto que recibe
     *
     * @param status
     */
    public void statusesUpdate(String status) {
        try {
            URL url = new URL(&quot;http://twitter.com/statuses/update.xml&quot;);
            status = URLEncoder.encode(status, &quot;UTF-8&quot;);
            String parametros = &quot;status=&quot; + status;
            doTwitterRequest(url, parametros);
        } catch (MalformedURLException ex) {
            Logger.getLogger(Twitter.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnsupportedEncodingException ex) {
            Logger.getLogger(Twitter.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Se encarga de la conexión con Twitter.
     * Necesita tener precargada los datos de autentificación (constructor), la url y los parámetros
     */
    private void doTwitterRequest(URL url, String parametros) {
        response = &quot;&quot;;
        try {
            // Creamos una conexión
            URLConnection conn;
            conn = url.openConnection();
            conn.setAllowUserInteraction(false);
            conn.setDoOutput(true);

            // Configuramos la autentificación (sencilla basada en HTTP)
            conn.setRequestProperty(&quot;Authorization&quot;, &quot;Basic &quot; + getBasicCredentials());

            // Preparamos la conexión con el servidor (vamos a mandar un formulario por post)
            conn.setRequestProperty(&quot;Content-Type&quot;, &quot;application/x-www-form-urlencoded&quot;);
            // Abrimos el canal de comunicación de envío
            DataOutputStream out = new DataOutputStream(conn.getOutputStream());
            // Mandamos los parámetros de la acción que (los ha tenido que precargar el método correspondiente)
            out.writeBytes(parametros.toString());
            // Nos aseguramos de que todo se envíe
            out.flush();
            // Ya hemos dicho lo que teníamos que decir, así que cerramos la conexión de envio
            out.close();

            // Capturamos la respuesta
            BufferedReader input = new BufferedReader(new InputStreamReader(conn.getInputStream()));

            String l = &quot;&quot;;
            while ((l = input.readLine()) != null) {
                response += l + &quot;\n&quot;;
            }

        } catch (IOException ex) {
            Logger.getLogger(Twitter.class.getName()).log(Level.SEVERE, null, ex);

        }

    }

    public void setCredentials(String username, String pass) {
        this.username = username;
        this.pass = pass;
    }

    public String getBasicCredentials() {
        byte[] credentialsBytes = (username + &quot;:&quot; + pass).getBytes();
        byte[] encodedBytes = Base64.encodeBase64(credentialsBytes);
        return new String(encodedBytes);
    }

    public String getResponse() {
        return response;
    }
}
</pre>
<p>Este sería un ejemplo de uso de nuestra clase:</p>
<pre class="brush: java;">
/*
 *   http://creativecommons.org/licenses/by-nc/3.0/deed.es
 */

package org.francho.java.twitter;

import java.util.Date;

/**
 *
 * @author francho - http://francho.org/lab/
 */
public class Test {
    public static void main(String[] args) {
        Twitter twitter = new Twitter(&quot;yoEnTwitter&quot;, &quot;miclave&quot;);

        Date ahora = new Date();

        twitter.statusesUpdate(&quot;Jugando con Java y el API de Twitter &quot; + ahora);
        System.out.println(twitter.getResponse());
    }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://francho.org/lab/529/jugando-con-java-y-el-api-de-twitter/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Hola mundo en Flash (Flex) desde Linux</title>
		<link>http://francho.org/lab/477/hola-mundo-en-flash-flex-desde-linux/</link>
		<comments>http://francho.org/lab/477/hola-mundo-en-flash-flex-desde-linux/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 12:40:34 +0000</pubDate>
		<dc:creator>francho</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programa]]></category>
		<category><![CDATA[prueba]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://francho.org/lab/?p=477</guid>
		<description><![CDATA[Para un experimento que quiero hacer tengo que retocar un código hecho en Flex. Como nunca he programado Flex ni ActionScript  me ha tocado bucear en la red. Siguiendo este post y este otro, he conseguido montar el entorno de desarrollo.
Eclipse ya lo tenía instalado desde el aptitude de mi Ubuntu 9.10 así que solo [...]]]></description>
			<content:encoded><![CDATA[<p>Para un experimento que quiero hacer tengo que retocar un código hecho en Flex. Como nunca he programado Flex ni ActionScript  me ha tocado bucear en la red. Siguiendo este <a href="http://netpatia.blogspot.com/2009/09/flash-development-on-linux.html">post</a> y este <a href="http://netpatia.blogspot.com/2009/09/flash-development-on-linux-ii.html">otro</a>, he conseguido montar el entorno de desarrollo.</p>
<p>Eclipse ya lo tenía instalado desde el aptitude de mi Ubuntu 9.10 así que solo he tenido que añadirle los plugins que me faltaban (<a href="http://www.axdt.org">AXDT</a>).</p>
<p>Este es el código con el que he probado que todo funciona:</p>
<pre class="brush: as3;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;mx:Application xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot;
	layout=&quot;vertical&quot;&gt;
	&lt;mx:Script&gt;
&lt;![CDATA[
         public function about():void {
              texto.text = &quot;http://francho.org/lab/&quot;;
         }

         public function hola():void {
         	texto.text = &quot;Hola&quot;;
         }

]]&gt;&lt;/mx:Script&gt;
	&lt;mx:Label id=&quot;texto&quot;&gt;
		&lt;mx:text&gt;pulsa&lt;/mx:text&gt;
	&lt;/mx:Label&gt;
	&lt;mx:Button id=&quot;btnHola&quot; label=&quot;Hola&quot; click=&quot;hola()&quot; /&gt;
	&lt;mx:Button id=&quot;btnAbout&quot; label=&quot;About&quot; click=&quot;about()&quot; /&gt;
&lt;/mx:Application&gt;
</pre>
<p>y esta es resultado del programa una vez compilado: <a href="http://francho.org/lab/wp-content/uploads/2009/12/MxmlHelloWorld.swf">MxmlHelloWorld</a></p>
]]></content:encoded>
			<wfw:commentRss>http://francho.org/lab/477/hola-mundo-en-flash-flex-desde-linux/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Mostrando datos de forma bonita</title>
		<link>http://francho.org/lab/246/mostrando-datos-de-forma-bonita/</link>
		<comments>http://francho.org/lab/246/mostrando-datos-de-forma-bonita/#comments</comments>
		<pubDate>Sat, 04 Jul 2009 22:38:54 +0000</pubDate>
		<dc:creator>francho</dc:creator>
				<category><![CDATA[Docs]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[libreria]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://francho.org/lab/?p=246</guid>
		<description><![CDATA[Google a través de su Visualization API Gadget Gallery nos ofrece unas librerías JavaScript con las que podemos mostrar fácilmente los datos de una manera mucho mas amigable al usuarios.
Son ideales para aplicaciones de Business Intelligence. Como muestra un botón:

 // 
// ]]&#62;

El código fuente del ejemplo (copiado de la documentación del API)

   [...]]]></description>
			<content:encoded><![CDATA[<p>Google a través de su <a href="http://code.google.com/intl/es/apis/visualization/documentation/gadgetgallery.html">Visualization API Gadget Gallery</a> nos ofrece unas librerías JavaScript con las que podemos mostrar fácilmente los datos de una manera mucho mas amigable al usuarios.</p>
<p>Son ideales para aplicaciones de Business Intelligence. Como muestra un botón:<br />
<script src="http://www.google.com/jsapi" type="text/javascript"></script><br />
 <script type="text/javascript">// <![CDATA[
      // Load the Visualization API and the piechart package.
      google.load('visualization', '1', {'packages':['piechart']});
      // Set a callback to run when the API is loaded.
      google.setOnLoadCallback(drawChart);
      // Callback that creates and populates a data table, 
      // instantiates the pie chart, passes in the data and
      // draws it.
      function drawChart() {
        var data = new google.visualization.DataTable();
        data.addColumn('string', 'Task');
        data.addColumn('number', 'Hours per Day');
        data.addRows([
          ['Work', 11],
          ['Eat', 2],
          ['Commute', 2],
          ['Watch TV', 2],
          ['Sleep', 7]
          ]);
        var chart = new google.visualization.PieChart(document.getElementById('chart_div'));
        chart.draw(data, {width: 400, height: 240, is3D: true, title: 'My Daily Activities'});
      }</p>
<p>// ]]&gt;</script></p>
<p><span id="more-246"></span><br />
El código fuente del ejemplo (copiado de la documentación del API)</p>
<pre class="brush: jscript;">
    &lt;script type=&quot;text/javascript&quot; src=&quot;http://www.google.com/jsapi&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot;&gt;
      // Load the Visualization API and the piechart package.
      google.load('visualization', '1', {'packages':['piechart']});
      // Set a callback to run when the API is loaded.
      google.setOnLoadCallback(drawChart);
      // Callback that creates and populates a data table,
      // instantiates the pie chart, passes in the data and
      // draws it.
      function drawChart() {
        var data = new google.visualization.DataTable();
        data.addColumn('string', 'Task');
        data.addColumn('number', 'Hours per Day');
        data.addRows([
          ['Work', 11],
          ['Eat', 2],
          ['Commute', 2],
          ['Watch TV', 2],
          ['Sleep', 7]
          ]);
        var chart = new google.visualization.PieChart(document.getElementById('chart_div'));
        chart.draw(data, {width: 400, height: 240, is3D: true, title: 'My Daily Activities'});
      }
    &lt;/script&gt;
    &lt;div id=&quot;chart_div&quot;&gt;&lt;/div&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://francho.org/lab/246/mostrando-datos-de-forma-bonita/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
