<?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>Uhuru Labs</title>
	<atom:link href="http://www.uhurulabs.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.uhurulabs.com</link>
	<description>Laboratorio de investigación informática. Páginas web, aplicaciones móviles y extensiones para terceros.</description>
	<lastBuildDate>Thu, 03 May 2012 17:31:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Configuración y uso de rsync contra un Ubuntu Server</title>
		<link>http://www.uhurulabs.com/2012/01/configuracion-y-uso-de-rsync-contra-un-ubuntu-server/</link>
		<comments>http://www.uhurulabs.com/2012/01/configuracion-y-uso-de-rsync-contra-un-ubuntu-server/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 13:53:08 +0000</pubDate>
		<dc:creator>Alfredo</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[rsync]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.uhurulabs.com/?p=509</guid>
		<description><![CDATA[rsync es una aplicación que se puede encontrar en vuestros sistemas Linux, MacOS o  Windows y que permite sincronizar archivos y directorios entre dos máquinas de una red o entre dos carpetas de una misma máquina. Su uso es sencillo &#8230; <a href="http://www.uhurulabs.com/2012/01/configuracion-y-uso-de-rsync-contra-un-ubuntu-server/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-523" title="rsync_ubuntu" src="http://www.uhurulabs.com/wp-content/uploads/rsync_ubuntu.jpg" alt="" width="700" height="150" /><em>rsync</em> es una aplicación que se puede encontrar en vuestros sistemas Linux, MacOS o  Windows y que permite sincronizar archivos y directorios entre dos máquinas de una red o entre dos carpetas de una misma máquina. Su uso es sencillo y es ideal para mantener al día copias de elementos utilizados por varias personas,  hacer copias de seguridad de nuestros datos de manera rápida y segura o mantener actualizada nuestra página web.<br />
Puede funcionar de dos maneras:</p>
<ol>
<li>Instalando un <em><a title="daemon" href="http://es.wikipedia.org/wiki/Demonio_(inform%C3%A1tica)">daemon</a></em> (un servicio) en nuestro servidor (donde tenemos los elementos a sincronizar) al cual accederemos mediante el protocolo rsync.</li>
<li>Mediante un terminar remoto como <a title="SSH" href="http://es.wikipedia.org/wiki/Secure_Shell">SSH</a></li>
</ol>
<p><strong>Caso 1.</strong>El objetivo es instalar un <em>daemon</em> en nuestro servidor que atienda las peticiones de sincronización. Para ello los pasos a seguir son:</p>
<p>1.a) Instalar <em>rsync</em>. En general viene instalado de serie, y más en una versión server de Ubuntu, pero si no fuera así simplemente instálalo con Synaptic o mediante:</p>
<pre class="sh_html">sudo apt-get install rsync</pre>
<p>1.b) Hay que crear el fichero de configuración del <em>daemon</em> <strong>&#8220;/etc/rsyncd.conf&#8221;</strong>. En él definimos las caracterísiticas generales de la conexión, así como las de cada uno de los módulos o,  para definirlo mejor, las posibles ubicaciones de sincronización. El fichero tendrá una forma similar a esta</p>
<pre class="sh_html">max connections = 2
log file = /var/log/rsync.log
timeout = 300

    [nombremodulo1]
    comment = Carpeta de documentos personales sobre Linux
    path = /carpeta/sobre/la/que/sincronizo/los/documentos/personales
    read only = yes
    list = yes
    uid = usuario1
    gid = usuario1  
    auth users = usuario1
    secrets file = /etc/rsyncd.secrets

    [nombremodulo2]
    comment = Carpeta de documentos Uhuru
    path = /carpeta/sobre/la/que/sincronizo/los/documentos/uhuru
    read only = yes   
    list = yes   
    uid = nobody
    gid = nogroup   
    auth users = usuario1 usuario2
    secrets file = /etc/rsyncd.secrets</pre>
<p>Al principio del fichero se definen aquellas características generales de la conexión. En este caso aparecen el número de conexiones simultáneas, donde se va a ubicar el fichero log y el tiempo máximo de espera. En esta parte es posible indicar también algunas de las características que aparecen en los módulos para que todos ellos la hereden (salvo que se redefinan dentro de uno en concreto). Por ejemplo, en el código anterior, podríamos haber escrito en las características generales la configuración de <em>secrets file</em> o la opción <em>list</em>, ya que su valor es común para todos los módulos.</p>
<p>A continuación aparecen la definición y características del módulo. Los elementos más importantes son:</p>
<ul>
<li><em>comment</em>: un comentario sobre que se sincroniza con ese módulo.</li>
<li><em>path:</em> el camino completo de la ubicación.</li>
<li><em>uid:</em> nombre del usuario con el que rsync realizar las acciones.</li>
<li><em>gid</em>: grupo con el que rsync realizará las acciones.</li>
<li><em>auth</em> <em>users:</em> usuarios a los que se les está permitido la sincronización. Estos usuario en principio no tiene porque coincidir con ningún usuario del sistema.</li>
<li><em>secrets file</em>: lo vemos en el apartado siguiente.</li>
</ul>
<p>1.c)  Crear el fichero <strong>&#8220;/etc/.rsyncd.secrets&#8221;</strong><wbr>. Este fichero almacena parejas <em>usuario:contraseña</em>, que hacen relación a los usuarios definidos en el fichero <strong>&#8220;/etc/rsyncd.conf&#8221;</strong>. En nuestro caso podría ser algo como esto:</wbr></p>
<pre class="sh_html">usuario1:mipassword1
usuario2:mipassword2</pre>
<p>Obviamente este fichero, al ser texto plano,  ha de ser protegido contra &#8220;mirones&#8221;, ya que en caso contrario nuestras contraseñas quedan fácilmente accesibles. Es más <em>rsync</em> ni siquiera funcionará si no asignamos unos permisos adecuados a este fichero. Para ello:</p>
<pre class="sh_html">sudo chmod 600 /etc/rsyncd.secrets</pre>
<p>Es decir, el propietario debe ser el root y sólo puede ser leído por él.</p>
<p>1.d) Una vez configurado, sólo nos queda arrancarlo. Para ello lo mejor es utilizar <em>xinetd</em>, otro de los demonios que podemos encontrar en linux y que permite gestionar las conexiones de otros demonios bajo demanda.</p>
<p>Para ello lo primero es instalarlo (si es que no lo tienes aún):</p>
<pre class="sh_html">sudo apt-get install xinetd</pre>
<p>1.e) Configurar <em>xinetd</em>. Si no existe crea el fichero <strong>&#8220;/etc/xinetd.d/rsync&#8221;</strong> con el contenido siguiente.</p>
<pre class="sh_html">service rsync
{
    disable = no
    socket_type = stream
    wait = no
    user = root
    server = /usr/bin/rsync
    server_args = --daemon
    log_on_failure += USERID
}</pre>
<p>1.f) Comprobar el puerto por el que el servidor rsync escuchará. Para ello ves al fichero&#8221;<strong>/etc/services&#8221;</strong> y comprueba que la siguiente línea existe y no está comentada:</p>
<pre class="sh_html">rsync 873/tcp</pre>
<p>1.g) Reinicia el daemon <em>xinetd</em>. Para ello:</p>
<pre class="sh_html">sudo /etc/init.d/xinetd restart</pre>
<p>1.h) Ya tenemos el servidor funcionado. ¿Como lo usamos?. Sencillo, en local ejecutamos:</p>
<pre class="sh_html">rsync -v --recursive --times --perms --links --delete /mi/carpeta/personal/local rsync://usuario1@miservidor/nombremodulo1</pre>
<p>donde estamos haciendo una sincronización recursiva, preservando fechas y permisos de los archivos origen, incluyendo vínculos, borrando archivos que fueron borrados en el directorio origen. Todo ello desde un directorio origen <em>/mi/carpeta/personal/local</em> y utilizando el protocolo rsync contra el servidor miservidor, con el usuario1 y utilizando el módulo nombremodulo1</p>
<p><strong>Caso 2.</strong> La segunda opción consiste en la utilización del terminal remoto seguro ssh.</p>
<p>El proceso de creación de clave pública y privada y configuración del terminal escapa de este tutorial.</p>
<p>En este caso no es necesaria la configuración del demonio en el servidor, tan sólo que <em>rsync</em> esté instalado en él. Para ejecutar la sincronización:</p>
<pre class="sh_html">rsync -v --rsh=/usr/bin/ssh --recursive --times --perms --links --delete /mi/carpeta/personal/local usuario1@servidor:carpeta/destino/servidor</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.uhurulabs.com/2012/01/configuracion-y-uso-de-rsync-contra-un-ubuntu-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java en aplicaciones para móviles</title>
		<link>http://www.uhurulabs.com/2011/04/java-en-aplicaciones-para-moviles/</link>
		<comments>http://www.uhurulabs.com/2011/04/java-en-aplicaciones-para-moviles/#comments</comments>
		<pubDate>Mon, 11 Apr 2011 20:22:43 +0000</pubDate>
		<dc:creator>Alfredo</dc:creator>
				<category><![CDATA[Aplicaciones móviles]]></category>
		<category><![CDATA[CLDC]]></category>
		<category><![CDATA[JavaME]]></category>
		<category><![CDATA[MIDP]]></category>
		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://uhurulabs.com/blog/?p=93</guid>
		<description><![CDATA[Acabábamos el post anterior comentando que el uso de J2Me podía hacer que la programación para ciertas plataformas se realizara de manera común.  ¿Común? bueno, si, pero no tanto, ya que no todos estos dispositivos tiene el mismo soporte de &#8230; <a href="http://www.uhurulabs.com/2011/04/java-en-aplicaciones-para-moviles/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.uhurulabs.com/wp-content/uploads/java-moviles.png"><img class="aligncenter size-full wp-image-413" title="java-moviles" src="http://www.uhurulabs.com/wp-content/uploads/java-moviles.png" alt="" width="700" height="200" /></a></p>
<p>Acabábamos el <a href="http://www.uhurulabs.com/2010/12/empezando-a-programar-aplicaciones-para-dispositivos-moviles/">post anterior</a> comentando que el uso de J2Me podía hacer que la programación para ciertas plataformas se realizara de manera común.  ¿Común? bueno, si, pero no tanto, ya que no todos estos dispositivos tiene el mismo soporte de J2ME. ¿la razón? Tal vez lo primero sea definir que es exactamente J2ME.</p>
<p>J2ME, o ahora mismo llamada Java ME,  es una de los componentes de la llamada plataforma Java  junto con Java EE y Java SE. Su objetivo es proporcionar una serie de API&#8217;s para el desarrollo de aplicaciones en dispositivos con recursos limitados como PDA&#8217;s, coches, móviles, electrodomésticos&#8230; Es decir, el campo de dispositivos que abarca J2ME es muy grande y con unas características de hardware muy variadas.</p>
<p>Es por ello que Java ME se divide en las llamadas configuraciones. Existen dos: la CDC (pensada principalmente para domótica o automóviles) y la CLDC (<em>Connected Limited Device Configuration)</em>, que es la que está en la mayoría de los móviles. Cada una de ellas proporciona unas API especiales para cada tipo de hardware.</p>
<p>Pero hay más. En cada configuración existen los llamados &#8220;profiles&#8221; (perfiles). Estos nos definen características concretas, por ejemplo la interfaz de usuario. Para CLDC hay tres perfiles: DoJa, pensado para móviles japoneses, IMP (para móviles sin interfaz de usuario) y MIDP (<em>Mobile Information Device Profile</em>) que es una versión del anterior pero con interfaz de usuario.</p>
<p>Es decir, que dentro de Java ME trabajaremos con la configuración CLDC  y el perfil MIDP.</p>
<p>Pero claro, no todo podía ser tan bonito <img src='http://www.uhurulabs.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  . A partir de aquí empiezan las particularizaciones. Cada dispositivo móvil puede incluir soporte para distintas APIs opcionales. Por ejemplo, en función del modelo sobre el que queramos programar podemos necesitar una API para el manejo de la geolocalización, de la cámara, del bluetooth,&#8230;  o de una interfaz gráfica personalizada.</p>
<p>¿Que ocurre al final? Pues que cada fabricante realiza sus propias implementaciones de J2ME, basándose siempre en la original de Oracle, pero pensadas en particular para sus dispositivos. De esta manera hay funcionalidades que pueden existir en una versión y en otra no, o que aún existiendo, tengan comportamientos distintos.</p>
<p>A día de hoy la última versión del <a href="http://java.sun.com/products/cldc/">CLDC</a> es la 1.1 y del <a href="http://www.oracle.com/technetwork/java/index-jsp-138820.html">MIDP</a> la 2.0.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.uhurulabs.com/2011/04/java-en-aplicaciones-para-moviles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Uploadify: Subida de archivos con jQuery</title>
		<link>http://www.uhurulabs.com/2011/03/uploadify-subida-de-archivos-con-jquery/</link>
		<comments>http://www.uhurulabs.com/2011/03/uploadify-subida-de-archivos-con-jquery/#comments</comments>
		<pubDate>Thu, 31 Mar 2011 15:43:48 +0000</pubDate>
		<dc:creator>Carlos</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[uploadify]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://uhurulabs.com/?p=311</guid>
		<description><![CDATA[La última página web que hemos creado en Uhuru Labs, Navarro y Soler CAD-PLM Software, requería una sección donde los usuarios de la web pudieran mandar a nuestro cliente ficheros de un tamaño considerable. Teniendo este requerimiento empezamos a investigar &#8230; <a href="http://www.uhurulabs.com/2011/03/uploadify-subida-de-archivos-con-jquery/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-411" title="uploadify_jquery" src="http://www.uhurulabs.com/wp-content/uploads/uploadify_jquery2.png" alt="" width="750" height="85" />La última página web que hemos creado en Uhuru Labs, Navarro y Soler CAD-PLM Software, requería una sección donde los usuarios de la web pudieran mandar a nuestro cliente ficheros de un tamaño considerable. Teniendo este requerimiento empezamos a investigar por la red buscando algún uploader que no fuese el simple formulario de subida de ficheros, sino que proporcionara algo más, aparte de ser fácilmente configurable.</p>
<p>Enamorados como estamos de <a title="jQuery" href="http://jquery.com/">jQuery</a> y de todo lo que lleva consigo esta potente librería en javascript, buscamos algún uploader que estuviera hecho a partir de <a title="jQuery" href="http://jquery.com/">jQuery</a> y encontramos <a title="Uploadify" href="http://www.uploadify.com/" target="_blank">Uploadify</a>. Un pequeño vistazo por encima nos hizo darnos cuenta de las grandes posibilidades que tenía este pequeño trozo de código.</p>
<p>Al estar utilizando <a title="Wordpress" href="http://wordpress.org" target="_blank">WordPress</a> como backend primero miramos si había algún plugin hecho ya que nos facilitara las cosas. Encontramos uno, pero no conseguimos hacerlo funcionar, así que lo pusimos a pelo en la plantilla que estábamos creando. Nos basamos en la <a title="Uploadify v2.1.4" href="http://www.uploadify.com/wp-content/uploads/Uploadify-v2.1.4.zip" target="_blank">última versión que tiene uploadify ahora mismo estable, la 2.1.4</a>, ya que la beta 3.0 carecía de documentación y no queríamos embarrarnos las manos con cosas no probadas.</p>
<p>Una vez bajado el archivo comprimido con todos los archivos necesarios, descomprimimos en la carpeta de nuestro tema. Con lo que quedaría todo dentro de una carpeta, en nuestro caso la llamamos uploadify.</p>
<p>Entonces hicimos la carga de los archivos .js necesarios y de la hoja de estilos .css. Nosotros siempre cargamos las hojas de estilo en la etiqueta &lt;head&gt;:</p>
<pre class="sh_html">&lt;link rel="stylesheet" type="text/css" media="all" href="&lt;?php bloginfo( 'template_url' ); ?&gt;/uploadify/uploadify.css" /&gt;</pre>
<p>y la carga de los archivos javascript lo hacemos en el footer.php, justo antes del cierre del tag &lt;body&gt;:</p>
<pre class="sh_javascript sh_php">&lt;!-- Uploadify --&gt;
&lt;script type="text/javascript" src="&lt;?php bloginfo( 'template_url' ); ?&gt;/uploadify/swfobject.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="&lt;?php bloginfo( 'template_url' ); ?&gt;/uploadify/jquery.uploadify.v2.1.4.js"&gt;&lt;/script&gt;</pre>
<blockquote><p>Utilizamos el código php <strong>bloginfo(&#8216;template_url&#8217;)</strong> para poner la dirección absoluta donde se encuentran los archivos.</p></blockquote>
<p>Queríamos que cada cliente tuviera su propio directorio para subir archivos con lo que necesitábamos el nombre de usuario una vez logueado el cliente. Así que en la página donde queríamos el uploader pusimos este trozo de código:</p>
<pre class="sh_javascript sh_php">&lt;script type="text/javascript"&gt;
var files = new Array();
var user = '&lt;?php echo $username; ?&gt;';
var $cont = 0;
           jQuery(document).ready(function() {
             jQuery('#file_upload').uploadify({
               'uploader'  : '&lt;?php bloginfo( 'template_url' ); ?&gt;/uploadify/uploadify.swf',
               'script'    : '&lt;?php bloginfo( 'template_url' ); ?&gt;/uploadify/uploadify.php',
               'cancelImg' : '&lt;?php bloginfo( 'template_url' ); ?&gt;/uploadify/cancel.png',
               'folder'    : '&lt;?php echo URI_UPLOADS.'/'.$username.'/'; ?&gt;',
               'auto'      : false,
               'removeCompleted' : false,
               'simUploadLimit' : 3,
               'buttonText' : '&lt;?php _e('SELECCIONAR','nysplm'); ?&gt;',
               'multi' : true,
               'onError' : function (event,ID,fileObj,errorObj) {
                 alert(errorObj.type + ' Error: ' + errorObj.info);
               },
               'onComplete' : function (event, ID, fileObj, response, data) {
                        var json = {"name": fileObj['name'], "size": fileObj['size'], "type": fileObj['type']};
                        files[$cont] = json;
                        $cont++;
                },
               'onAllComplete' : function (event, data) {
                        //alert("Response: "+response);
                        send_confirmation(data);
                        $cont = 0;
                        files = [];
                 }
              });
           });</pre>
<p>Donde le decimos a uploadify:</p>
<ul>
<li><strong>uploader</strong>: donde está el archivo .swf que contiene el código flash que nos permitirá subir los archivos</li>
<li><strong>script</strong>: donde está el archivo .php que necesita uploadify para hacer la carga de los archivos</li>
<li><strong>cancelImg</strong>: donde se encuentra la imagen que se muestra para cancelar la subida de los archivos</li>
<li><strong>folder</strong>: el directorio donde queremos subir los archivos. En nuestro caso esto es dinámico, así el cliente subirá los archivos a su propio directorio.</li>
<li><strong>auto</strong>: indica que la subida no será automática, sino que el usuario deberá, una vez cargados los archivos, presionar un enlace para comenzar la carga.</li>
<li><strong>removeCompleted</strong>: indicamos que no quite de pantalla los archivos subidos.</li>
<li><strong>simUploadLimit</strong>: establecemos a 3 ficheros el límite de subida simultánea.</li>
<li><strong>buttonText</strong>: ya que este gran software está en inglés, utilizamos esta opción para cambiar el texto del botón de carga de archivos.</li>
<li><strong>multi</strong>: indicamos que se pueden subir varios archivos simultáneamente.</li>
<li><strong>onError</strong>: función que mostrará una alerta js si se produce algún error.</li>
<li><strong>onComplete</strong>: función que se ejecutará cada vez que se suba correctamente uno de los ficheros</li>
<li><strong>onAllComplete</strong>: función que se ejecutará cuando se hayan subido todos los ficheros.</li>
</ul>
<p>Alguien se habrá dado cuenta del comentario que hay en el onAllComplete:</p>
<pre class="sh_php"> <strong>alert("Response: "+response);</strong></pre>
<p>Esto sirve de mucha ayuda cuando estamos desarrollando. Puede ser que el archivo no se suba correctamente por falta de permisos. Esto para uploadify no es un error, ya que no es competencia suya, con lo que el error es devuelto a la función <strong>onAllComplete</strong> en lugar de lanzar un error la función <strong>onError</strong>. Por ello, si vemos que no se muestra ningún error pero el archivo no se sube al servidor correctamente, descomentar esta línea puede aclarar que está pasando.</p>
<p>Y por último, y no menos importante, habrá que poner el tag donde se cargará uploadify:</p>
<pre class="sh_html">&lt;input id="file_upload" name="file_upload" type="file" /&gt;
&lt;a href="javascript:$('#file_upload').uploadifyUpload();"&gt;&lt;?php _e('Subir archivos','nysplm'); ?&gt;&lt;/a&gt;</pre>
<p>donde ponemos el input con el identificador que cargará uploadify y un enlace para subir los archivos simultáneamente.</p>
<p>Y hasta aquí, esperamos haber sido de ayuda. Si alguien tiene alguna duda pues a comentar. Ayudaremos en lo que podamos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.uhurulabs.com/2011/03/uploadify-subida-de-archivos-con-jquery/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Extensión VLC: MMP</title>
		<link>http://www.uhurulabs.com/2011/02/extension-vlc-mmp/</link>
		<comments>http://www.uhurulabs.com/2011/02/extension-vlc-mmp/#comments</comments>
		<pubDate>Mon, 21 Feb 2011 20:36:25 +0000</pubDate>
		<dc:creator>Alfredo</dc:creator>
				<category><![CDATA[Extensiones]]></category>
		<category><![CDATA[Uhuru Labs]]></category>
		<category><![CDATA[MMP]]></category>
		<category><![CDATA[VLC]]></category>

		<guid isPermaLink="false">http://uhurulabs.com/blog/?p=100</guid>
		<description><![CDATA[Hace unos meses, oyendo una emisora de radio local, nos percatamos que durante varias horas al día la música y anuncios que sonaban lo hacían en bucle, es decir había una lista de reproducción que combinaba una serie de canciones &#8230; <a href="http://www.uhurulabs.com/2011/02/extension-vlc-mmp/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-215" title="MMP Managing Multiple Playlists" src="http://www.uhurulabs.com/wp-content/uploads/mmp_proy.png" alt="" width="700" height="138" /></p>
<p>Hace unos meses, oyendo una emisora de radio local, nos percatamos que durante varias horas al día la música y anuncios que sonaban lo hacían en bucle, es decir había una lista de reproducción que combinaba una serie de canciones con unos anuncios de manera predefinida y que se repetía todos los días (cosa comprensible pensando que era pleno verano y que mucha gente trabajando no debería de haber <img src='http://www.uhurulabs.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ).</p>
<p>Fue entonces cuando pensamos en la posibilidad de poder crear algún sistema que permitiera combinar varias listas de reproducción indicando el número de canciones consecutivas de cada lista. De esta manera, a partir de las mismas listas fuente se podrían realizar varias combinaciones mezcladas con una supuesta lista de anuncios. Y de ahí nació MMP: Manage Multiple Playlist, la que es nuestra primera extensión para VLC.</p>
<p>Por supuesto, su uso va mas allá del meramente radiofónico, ya que la posibilidad de mezclar listas de reproducción de diversas fuentes puede venir muy bien. ¿O es que nadie ha hecho una fiesta y todo el mundo se ha peleado por poner sus canciones? <img src='http://www.uhurulabs.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Hace unos días publicamos la segunda beta (0.6b). <strong><a title="MMP (Managing Multiple Playlists)" href="http://uhurulabs.com/portafolio/extensiones-para-terceros/mmp-managing-multiple-playlists/">Descárgala y ayúdanos a mejorarla.</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.uhurulabs.com/2011/02/extension-vlc-mmp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Empezando a programar aplicaciones para dispositivos móviles</title>
		<link>http://www.uhurulabs.com/2010/12/empezando-a-programar-aplicaciones-para-dispositivos-moviles/</link>
		<comments>http://www.uhurulabs.com/2010/12/empezando-a-programar-aplicaciones-para-dispositivos-moviles/#comments</comments>
		<pubDate>Sun, 26 Dec 2010 01:00:52 +0000</pubDate>
		<dc:creator>Alfredo</dc:creator>
				<category><![CDATA[Aplicaciones móviles]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[BlackBerry]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaME]]></category>
		<category><![CDATA[MeeGO]]></category>
		<category><![CDATA[Symbian]]></category>
		<category><![CDATA[WebOS]]></category>

		<guid isPermaLink="false">http://uhurulabs.com/blog/?p=80</guid>
		<description><![CDATA[&#8220;¡Por fin! Ya tenemos una idea para crear alguna aplicación para un móvil.  ¿Y ahora qué?&#8221; Eso mismo nos preguntamos hace unos meses, cuando empezamos a pensar en desarrollar aplicaciones para móviles: ¿por dónde empezamos?. Tal vez la primera pregunta a &#8230; <a href="http://www.uhurulabs.com/2010/12/empezando-a-programar-aplicaciones-para-dispositivos-moviles/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-238" title="post-moviles" src="http://www.uhurulabs.com/wp-content/uploads/post-moviles.png" alt="" width="700" height="258" /></p>
<p>&#8220;¡Por fin! Ya tenemos una idea para crear alguna aplicación para un móvil.  ¿Y ahora qué?&#8221; Eso mismo nos preguntamos hace unos meses, cuando empezamos a pensar en desarrollar aplicaciones para móviles: ¿por dónde empezamos?.</p>
<p>Tal vez la primera pregunta a hacerse sea para qué dispositivo trabajar. No cabe duda que el mercado está cada vez más lleno de opciones y cada una con un sistema operativo, unas herramientas de desarrollo y una serie de recursos disponibles. Pero no sólo eso. Además de la parte técnica hay una importantísima parte comercial, en la que hay que contestar a preguntas como ¿a qué tipo de personas va dirigido el software que  desarrollamos? ¿qué dispositivo(s) es mayoritario en ese sector? ¿cómo funciona el canal de distribución (AppStore, OVI, Android Market&#8230;)?, etc. En esta serie de posts vamos a olvidar esta parte comercial y vamos a centrarnos en la parte técnica. Es decir, una vez elegido el sistema de destino ¿cómo se programa para él?.</p>
<p>Y para empezar lo primero es centrarnos en intentar hacer un resumen de lo que hoy en día podemos encontrar en la calle, especificando, aunque sea de manera muy superficial, que tipo de lenguajes y con que herramientas es posible programar cada una de ellas. ¿Preparados? Empezamos <img src='http://www.uhurulabs.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Hoy por hoy tenemos 7 Sistemas Operativos para móviles que copan el mercado:</p>
<ul>
<li>iOS (iPhone, iPad)</li>
<li>Windows 7 Phone (HTC, Samsung, LG, Sony Ericsson, ..)</li>
<li>Android (HTC, Motorola, Samsung, Nexus&#8230;)</li>
<li>RIM (BlackBerry)</li>
<li>Symbian (Nokia)</li>
<li>MeeGo (Nokia, algunos coches, )</li>
<li>WebOS (Palm, HP)</li>
</ul>
<p>La programación sobre <em>iOS</em> y sobre <em>W7P</em> va aparte y merece una atención especial (incluso porque las herramientas de desarrollo sólo existen en sus &#8220;hermanos mayores&#8221; MacOS  y Windows). El primero permite el desarrollo con Objective-C, sobre Cocoa, con XCode como herramienta de desarrollo principal. El segundo parece que se centrará en la plataforma .Net con lenguajes como C# o en Silverlight, aquel framework que creó Microsoft para hacer la competencia en el desarrollo de aplicaciones web enriquecidas a Flash y a Ajax y que, visto lo visto, parece  que va a terminar centrándose en ser el sistema de desarrollo de aplicaciones para <em>Windows Phone</em>. Su IDE de trabajo es Visual Studio y Expression Blend.</p>
<p><em>WebOS</em> es un sistema relativamente reciente. Está desarrollado por la Palm, Inc que ahora pertenece a HP  y basado en <em>Linux</em> (como <em>Android</em> y <em>MeeGO</em>). Para programar sobre él se requiere básicamente conocimientos de creación de paginas web: HTML, Javascript, CSS, JSON &#8230; y como entorno de programación se dispone de Ares, un IDE integrado en un navegador web, con un editor visual bastante útil.</p>
<p>De <em>MeeGO </em>podríamos decir que es la descendencia de Linux para móviles ya que, a diferencia de <em>Android</em> y <em>WebOS</em>, <em>Meego</em> esta apoyado por la Linux Foundation. Un aplicación para <em>MeeGo</em> es como una aplicación normal escrita para KDE, es decir con las librerías Qt, sólo que con las características especiales que supone programar para dispositivos con recursos limitados.</p>
<p>Por su parte <em>Symbian</em> desarrolla en C++ y Java (aunque de esta opción hablaremos más adelante), normalmente sobre Eclipse. Aun así, existen otras opciones como Origo IDE, que permite la creación de aplicaciones de manera rápida y visual con un lenguaje de script propio o lenguajes más comunes como python o ruby,</p>
<p>Por último, programar en el resto (<em>BlackBerry</em>, <em>Android</em> o incluso en <em>Symbian</em>)  puede tener similitudes que hagan que nuestros programas &#8220;puedan&#8221; ser ejecutados en un sistema u otro. ¿por qué? por el uso de Java , en concreto de J2ME, común, en principio, a todas las plataformas. Será sobre estos últimos sistemas sobre los que hablaremos en las próximas entradas.</p>
<p>Más información | <a href="http://www.microsoft.com/express/Phone/">Visual Studio</a>, <a href="http://www.eclipse.org/">Eclipse</a>, <a href="http://origoide.com/">OrigoIDE</a>, <a href="http://ares.palm.com/Ares/about.html">Ares</a>, <a href="http://www.silverlight.net/">Silverlight</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.uhurulabs.com/2010/12/empezando-a-programar-aplicaciones-para-dispositivos-moviles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pods CMS</title>
		<link>http://www.uhurulabs.com/2010/10/pods-cms/</link>
		<comments>http://www.uhurulabs.com/2010/10/pods-cms/#comments</comments>
		<pubDate>Mon, 25 Oct 2010 09:50:12 +0000</pubDate>
		<dc:creator>Carlos</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[pods]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://uhurulabs.com/blog/?p=40</guid>
		<description><![CDATA[Al empezar la creación de una página web siempre nos habíamos preguntado cual sería la mejor opción a la hora de elegir un CMS. Nuestras investigaciones por internet y después de barajar varias opciones hizo que descubriéramos Pods CMS. Pods es &#8230; <a href="http://www.uhurulabs.com/2010/10/pods-cms/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://podscms.org/"><img class="alignnone size-full wp-image-241" title="logo_pds" src="http://www.uhurulabs.com/wp-content/uploads/logo_pds.png" alt="" width="175" height="73" /></a></p>
<p>Al empezar la creación de una página web siempre nos habíamos preguntado cual sería la mejor opción a la hora de elegir un <acronym title="Content Management System">CMS</acronym>.</p>
<p>Nuestras investigaciones por internet y después de barajar varias opciones hizo que descubriéramos <a title="Pods CMS" href="http://podscms.com" target="_blank">Pods CMS</a>. Pods es un plugin para <a title="Wordpress" href="http://wordpress.org/" target="_blank">WordPress</a> que lo convierte en un cms cómodo, rápido y muy fácil de configurar.</p>
<p>Para empezar a trabajar con Pods simplemente hay que bajar el plugin y activarlo en una instalación de WordPress. Podéis encontrar el <a title="Pods CMS para WordPress" href="http://wordpress.org/extend/plugins/pods/" target="_blank">plugin Pods CMS en la web de plugins para wordpress</a>.</p>
<p>Pods funciona principalmente como un generador de tipos de contenido, desde el punto de vista del programador podríamos verlo como un generador de clases, esto es, permite definir un modelo y asignarle varios campos de diferente tipo para luego poder crear objetos de dicha clase e interaccionar con ellos. Simplemente con esta funcionalidad ya es suficiente para dejarte con los ojos abiertos, pero hay mucho más.</p>
<p>Con Pods puedes hacer cualquier cosa, ya que tienes muchas formas de sacar la información introducida en la base de datos:</p>
<ul>
<li>Mediante páginas desde Pods en el área de administración. En estas páginas se puede poner tanto código php como caracteres comodín en las URL. Por ejemplo la página <em><strong>recetas/*</strong></em> será el handler por defecto de todas las páginas que empiecen por <em><strong>recetas/</strong></em>. Una forma de routing sencilla para el usuario&#8230;</li>
<li>Se puede también añadir código en php directamente en los templates del tema que estés utilizando en WordPress.</li>
<li>Utilizar <a href="http://codex.wordpress.org/Shortcode_API" target="_blank">shortcode</a> de WordPress para incluir instancias de Pods o detalles de un Pod específico dentro de páginas o entradas de WordPress.</li>
<li>Y por último y la más importante de todas creo yo, la API de Pods, que te permite hacer CRUD directamente de cualquier Pod que tengas creado en el sistema. Esto viene de perlas por ejemplo para hacer plugins que utilicen el sistema Pods como entrada de datos en las tablas.</li>
</ul>
<p>Por poner un ejemplo, estamos trabajando en una web donde utilizamos Pods como entrada de datos en el sistema. Una de las partes de la página principal muestra los servicios más llamativos que proporciona nuestro cliente cada mes. Para ello creamos un Pod (que llamaremos <em><strong>Servicios destacados</strong></em>) que contendrá los siguientes datos: nombre, imagen, activa, oferta del mes, enlace.</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-243" title="pod_servicios" src="http://www.uhurulabs.com/wp-content/uploads/pod_servicios.png" alt="" width="199" height="99" /></p>
<p>Una vez creado el Pod podemos introducir datos desde la sección <strong>Add Servicios destacados</strong> que aparece en el menú principal de Pods (esto puede cambiarse mediante <a href="http://wordpress.org/extend/plugins/pods-ui/" target="_blank">Pods UI</a> o creando un menú nuevo mediante un plugin, pero eso lo comentaremos en otro post):</p>
<p style="text-align: center;"><img class="size-full wp-image-244" title="pod_entrada_datos" src="http://www.uhurulabs.com/wp-content/uploads/pod_entrada_datos.png" alt="" width="590" height="207" /></p>
<p>Ya introducidos los datos podremos asociar una página de WordPress a un template concreto y modificar ese template para que lea los datos del pod que queremos. En este caso creamos un template con este código:</p>
<pre class="sh_php sh_html">&lt;?php
/*
Template Name: Servicios destacados
*/
&lt;?php get_header(); ?&gt;
&lt;?php
	// Consultamos la base de datos en Pods. 4 servicios destacados que estén activos
	$imagenes = new Pod('servicios_destacados');
	$imagenes-&gt;findRecords('name ASC','4','t.activa = 1');
	$total_imagenes = $imagenes-&gt;getTotalRows();
?&gt;

//Bucle por los servicios destacados encontrados para crear la página
&lt;div id="servicios-destacados"&gt;
&lt;?php if( $total_imagenes&gt;0 ) : ?&gt;
	&lt;ul&gt;
	&lt;?php while ( $imagenes-&gt;fetchRecord() ) : ?&gt;
		&lt;?php
			// iniciamos nuestras variables
			$id        	= $imagenes-&gt;get_field('id');
			$nombre      	= $imagenes-&gt;get_field('name');
			$imagen  	= $imagenes-&gt;get_field('imagen');
			$imagen_url     = $imagen[0]['guid'];
			$enlace		= $imagenes-&gt;get_field('enlace');
			if($enlace=="") $enlace = "#";
		?&gt;

		&lt;li&gt;
			&lt;a href="&lt;?php echo $enlace; ?&gt;"&gt;
			&lt;img src="&lt;?php echo $imagen_url; ?&gt;" alt="&lt;?php echo $nombre; ?&gt;" /&gt;
			&lt;/a&gt;
		&lt;/li&gt;
	&lt;?php endwhile ?&gt;
	&lt;/ul&gt;
&lt;?php endif ?&gt;
&lt;/div&gt;&lt;!-- #servicios-destacados--&gt;
&lt;?php get_footer(); ?&gt;</pre>
<p>En este template lo que hacemos es:</p>
<ol>
<li>consultar cuatro productos destacados activos</li>
<li>hacer un bucle por los productos para mostrarlos en pantalla</li>
</ol>
<p>Con esto hemos visto lo fácil que es meter contenido propio en una base de datos utilizando el gran backEnd que tiene WordPress y consultar ese contenido con un template. Todo esto gracias a Pods.</p>
<p>Por último os dejo con un video de uno de los autores rascando un poco por encima las posibilidades de Pods y de su creciente documentación:</p>
<p>&nbsp;<br />
<object style="width: 532px; height: 300px;" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="532" height="300" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=15086927&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" /><embed style="width: 532px; height: 300px;" type="application/x-shockwave-flash" width="532" height="300" src="http://vimeo.com/moogaloop.swf?clip_id=15086927&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=&amp;fullscreen=1&amp;autoplay=0&amp;loop=0"></embed></object>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.uhurulabs.com/2010/10/pods-cms/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Hola mundo, hola Uhuru</title>
		<link>http://www.uhurulabs.com/2010/10/hola-mundo-hola-uhuru/</link>
		<comments>http://www.uhurulabs.com/2010/10/hola-mundo-hola-uhuru/#comments</comments>
		<pubDate>Thu, 30 Sep 2010 22:01:25 +0000</pubDate>
		<dc:creator>Alfredo</dc:creator>
				<category><![CDATA[Uhuru Labs]]></category>

		<guid isPermaLink="false">http://uhurulabs.com/blog/?p=11</guid>
		<description><![CDATA[¡Por fin! ¡Ya estamos aquí! Bienvenidos a Uhuru Labs. Hace varios años que Carlos y yo venimos dándole vueltas a la posibilidad de crear &#8220;algo&#8221;, &#8220;algo&#8221; que nos permitiera llevar a cabo con libertad nuestras ideas, probar nuevas tecnologías, aprender, &#8230; <a href="http://www.uhurulabs.com/2010/10/hola-mundo-hola-uhuru/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;"><img class="alignnone size-full wp-image-246" title="uhuru-ico-256" src="http://www.uhurulabs.com/wp-content/uploads/uhuru-ico-256.png" alt="" width="256" height="256" /></div>
<p>¡Por fin! ¡Ya estamos aquí! Bienvenidos a Uhuru Labs.</p>
<p>Hace varios años que Carlos y yo venimos dándole vueltas a la posibilidad de crear &#8220;algo&#8221;, &#8220;algo&#8221; que nos permitiera llevar a cabo con libertad nuestras ideas, probar nuevas tecnologías, aprender, juguetear e intentar sacarle a ello rentabilidad. Y la oportunidad se ha presentado ahora.</p>
<p>Así nace <a href="http://www.uhurulabs.com">Uhuru Labs</a>. Tal vez la mejor manera de definirlo sea como un laboratario de tecnologías informáticas, con el objetivo de ser aplicadas en la creación de los mejores proyectos posibles. Nuestro campo de investigación es amplio, desde las ya casi olvidadas aplicaciones de escritorio, hasta las aplicaciones móviles, pasando por páginas y aplicaciones web, pero sin olvidar elementos tan relacionados con estas últimas como el diseño o la fotografía.</p>
<p>El trabajo ya ha empezado. Ya podeis encontrar en el portafolio, algunas de las páginas web que hemos desarrollado. Pero viene más, mucho más <img src='http://www.uhurulabs.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Afortunadamente las ideas siguen llegando, así que esperamos en poco tiempo ir dejando nuevos recursos para que podais utilizarlos y ayudarnos a mejorarlos.</p>
<p>Por cierto, para los curiosos: uhuru es una palabra suajili (lengua que se habla en gran parte del África negra, principalmente en Kenia y Tanzania) y significa libertad&#8230; a buenos entendedores <img src='http://www.uhurulabs.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.uhurulabs.com/2010/10/hola-mundo-hola-uhuru/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

