<?xml version="1.0" encoding="iso-8859-1"?><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>Enrique González. Programador web, Flash, iPhone.</title><atom:link href="http://enriquegonzalez.net/blog.xml" rel="self" type="application/rss+xml" /><link>http://www.enriquegonzalez.net</link><description>RSS Feed del blog</description><lastBuildDate>Sun, 20 May 2012 00:31:27 +0200</lastBuildDate><language>es-ES</language><copyright>Copyright (C) 2011 Enrique González</copyright><sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator><item><title><![CDATA[Páginas multi idioma en PHP con gettext y POEdit]]></title><description><![CDATA[<p>Los programadores que hacemos webs con programación a medida en PHP, cuando nos plantean hacer una página en múltiples idiomas, cada uno tiene una fórmula distinta para poner las palabras que salen en el interface de la web en los diferentes idiomas. La fórmula que yo utilizaba antes, es muy común&hellip;</p>]]></description><content:encoded><![CDATA[<p>Los programadores que hacemos webs con programación a medida en PHP, cuando nos plantean hacer una página en múltiples idiomas, cada uno tiene una fórmula distinta para poner las palabras que salen en el interface de la web en los diferentes idiomas. La fórmula que yo utilizaba antes, es muy común entre los programadores: Los arrays. Se trata de tener arrays asociativos con todas las palabras que van en cada idioma, cada idioma en un fichero.</p>
<p>De esta forma si elijo el idioma "inglés", se carga el fichero "eng.php" que contiene un array con todas las palabras del interface en ese idioma, luego en la plantilla llamo al elemento del array correspondiente por su clave.<br />Este sistema está bien, pero recientemente me he cambiado a otro más efectivo y estándar: Los ficheros generados por POedit. Es el sistema que usa Wordpress y muchos otros CMS / Frameworks.<br /><br />Lo primero es hacerse con el POEdit: http://www.poedit.net/ e instalarlo.<br />Ahora vamos a nuestra página multi idioma, y editamos todos los ficheros donde aparezcan cadenas de texto que van en múltiples idiomas.<br />Por ejemplo, encontramos en nuestro formulario de contacto algo como:<br /><br /><label>Nombre y apellidos:</label><br /><br />Esto lo cambiamos por:<br /><br /><label><?=_("Nombre y apellidos")?>:</label><br /><br />Efectivamente, toda cadena o conjunto de ellas que sean para traducir, las metemos en esta notación de PHP: _(), que es lo mismo que poner gettext(), vamos que si nos gusta más ponemos:<br /><br /><label><?=gettext("Nombre y apellidos")?>:</label><br /><br />Una vez lo tenemos todo hecho, creamos un nuevo proyecto en POEdit: Archivo -> Nuevo catálogo.<br />Aquí especificamos varias cosas: En "Información del proyecto" rellenamos los datos. En "carpetas", escribimos en "directorio raíz" el path local raiz del proyecto de nuestra web, por ejemplo (en mac): "/Users/Enrique/Desktop/trabajos/nuevaweb/"<br />A continuación, debemos decir dentro de ese raíz, donde están las carpetas con los ficheros a ser traducidos. Para ello pinchamos en el botón "Nuevo" (el 2º icono) y ahí metemos las rutas a las carpetas, por ejemplo (en mac): "/Users/Enrique/Desktop/trabajos/nuevaweb/website".<br />En "Palabras Clave", lo dejamos como está porque por defecto ya trae el "_" o el "gettext" que hemos usado.<br />Le damos a Aceptar y ya tenemos el proyecto creado. Ahora pinchamos en "Actualizar", y POEdit escaneará las carpetas que hemos especificado buscando los "_()" o "gettext()".<br />Una vez termine, nos mostrará todas las palabras que ha encontrado. Ahora prodecemos a traducir una por una.<br />Una vez hemos terminado, le damos a "Guardar", y POEdit crea dos ficheros: "default.mo" (fichero compilado) y "default.po" (fichero editable). <br />El "mo" lo subimos a: "nuevaweb/website/locale/es_ES/LC_MESSAGES/" donde "es_ES" sería la cadena del idioma que corresponda. La carpeta "website" sería la raiz de la web en sí, donde estaría el "index.php".<br />Cada vez que pongamos nuevas cadenas o modifiquemos cadenas existentes en nuestra web, hay que volver a generar los "po" y "mo" y subir el "mo". Para ello abrimos el fichero "po" con el POEdit, escaneamos, el programa encuentra todas las palabras nuevas o modificadas, escribimos las nuevas traducciones, guardamos, y subimos el "mo" generado. <br /><br />Ahora para que nuestra web en PHP cargue esos idiomas, debemos hacer lo siguiente:<br />Al inicio de cada script PHP, con un include o con la fórmula que se quiera, obtendremos el idioma escogido. El idioma lo debemos tener en este formato: "es_ES".<br />Entonces ponemos el siguiente código:<br /><br /><code class="highlight">$locale="es_ES";<br />putenv("LC_ALL=$locale");<br />setlocale(LC_ALL, $locale);<br />bindtextdomain("default", "./locale");<br />textdomain("default");</code><br />Y ya está, en principio. Digo en principio, porque tenemos un problema: El caché del servidor.</p>
<h3>El problema del caché</h3>
<p>Nuestro fichero "mo" se queda en la memoria del servidor, esto está muy bien porque hace que las traducciones sean rapidísimas, pero nos crea un gran problema: si modificamos un fichero de idiomas y lo subimos, no veamos los cambios inmediatamente, puesto que el antiguo está "cacheado" en la memoria. Una solución es resetear el Apache, pero esto no lo podemos hacer la mayoría de las veces. Para solucionarlo, usamos este codigo en vez del anterior:</p>
<p><code class="highlight"> function translation($lang) {<br />  $rname="default";<br />  if (GETTEXT_CACHING == 0) {<br />       $targetFolder = "locale/".$lang."/LC_MESSAGES/";<br />       $folder = opendir($targetFolder);<br />       while (false !== ($file = readdir($folder))) {<br />            $pathFiles = $targetFolder."/".$file; <br />            if ($file != ".." AND $file != "." AND !is_dir($file) AND strrchr($file,'.') == '.mo' AND $file != $rname.'.mo') {<br />              unlink($pathFiles);<br />            }<br />        }<br />        closedir($folder);<br />        $translatefile = $rname.time();<br />        copy('locale/'.$lang.'/LC_MESSAGES/'.$rname.'.mo','locale/'.$lang.'/LC_MESSAGES/'.$translatefile.'.mo');<br />        } else $translatefile = $rname;<br />       <br />        setlocale(LC_ALL, $lang);<br />        putenv("LC_ALL=".$lang);<br />        bindtextdomain($translatefile,'./locale'); <br />        bind_textdomain_codeset($translatefile, 'utf8');  <br />        textdomain($translatefile);<br />} <br /><br />translation($locale);</code></p>
<p>Lo que hace es duplicar el fichero "mo" con otro nombre y usar ese nuevo fichero, con esto siempre usaremos una versión nueva no cacheada.<br />Hay que darle permisos de escritura a la carpeta "LC_MESSAGES". Evidentemente esto lo mantendremos solo en tiempo de desarrollo, una vez la web sea definitiva, el cache ya no nos importará y usaremos el primer código de 5 líneas.</p>]]></content:encoded><link>http://www.enriquegonzalez.net/blog/2012-01-10/paginas-multi-idioma-en-php-con-gettext-y-poedit/</link><pubDate>Tue, 10 Jan 2012 00:00:00 +0100</pubDate></item><item><title><![CDATA[¿Qué tienda online necesito?]]></title><description><![CDATA[<p>El problema de las personas que quieren poner en marcha una tienda online, según mi experiencia, es dar con empresas que les colocan productos que no necesitan. Es de lo más común ver a un señor que sólo vende un par de productos al que le han colocado un supermega hosting y está pagando una pasta&hellip;</p>]]></description><content:encoded><![CDATA[<p>El problema de las personas que quieren poner en marcha una tienda online, según mi experiencia, es dar con empresas que les colocan productos que no necesitan. Es de lo más común ver a un señor que sólo vende un par de productos al que le han colocado un supermega hosting y está pagando una pasta mensual, y el piensa que es lo normal, simplemente porque no se ha informado. Antes de iniciar una aventura de este tipo, lo mejor es pedir consejo, que es gratis, a 10 empresas / freelances diferentes mejor que a 5.<br /><br />Las personas que van a poner en marcha una tienda online son del tipo:</p>
<ul>
<li>Persona que tiene una buena idea y quiere iniciar un negocio online desde cero, sin tener tienda física</li>
<li>Tienda física que quiere tener tienda online</li>
<li>Persona que ya tiene una tienda online pero la quiere renovar porque se ha quedado anticuada o bien piensa que está pagando al mes una cantidad demasiado elevada a un "hosting especializado en tiendas online".</li>
</ul>
<p>Aunque yo lo simplificaría más: Personas con conocimientos informáticos a nivel de usuario y personas que no los tienen. Si una persona no tiene conocimientos informáticos a nivel de usuario, o bien no tiene tiempo para ocuparse de la tienda online, entonces tendrá que ponerse en manos de una empresa especializada en tiendas online. A mi este tipo de empresas me da bastante reparo, porque suelen ser bastante caras en relación con lo que ofrecen, sin contar que muchas de estas empresas ofrecen soluciones obsoletas, pero como los clientes no saben de informática, nadie se les va a quejar. Además cuando un cliente se da cuenta de lo que le están haciendo, y se quiere salir, ponen toda clase de trabas para que el cliente se pueda llevar sus datos a otra parte.<br /><br />Como programador, las tiendas online las dividiría en las que pueden despacharse con un CMS y las que hay que realizar con programación a medida. ¿Cuando debo utilizar una solución u otra? Siempre debemos partir del esquema de tienda que requiere el cliente.</p>
<h3>CMS</h3>
<p>Los CMS de tienda tipo Prestashop, Magento, etc&hellip; se utilizan en estos casos:</p>
<ul>
<li>El cliente no tiene web existente, y su esquema de tienda es de lo más típico: categorías, productos, ofertas, outlet, etc&hellip; por lo tanto un CMS se le ajusta perfectamente.</li>
<li>El cliente ya tiene otro CMS y le quiere integrar tienda, en este caso si tiene un Wordpress, se le pone un Jigoshop, etc..</li>
<li>En el esquema de tienda del cliente hay algunas cosas que no se pueden resolver con un CMS, pero se puede desarrollar / modificar un plugin existente para ese CMS y resolver el problema.</li>
<li>Al cliente le parece bien el diseño tipico de los CMS de tienda: Portada-Listado-Ficha etc.. con la maquetación Cabecera-columnas-pie.</li>
</ul>
<p>La ventaja de los CMS es que inicialmente y con pocas horas de desarrollo ponemos la tienda a funcionar, El problema puede venir después, si el cliente, una vez está la tienda funcionando, quiere meter nuevas características a la tienda que no son fácilmente realizables con un CMS.</p>
<h3>Programación a medida</h3>
<p>Por mucho que les pese a los fans de los CMS, hay muchos casos, donde es imposible utilizar un CMS para darle al cliente todas las características que él quiere. Por eso es tan importante que el cliente haga un esquema de la tienda que requiere, antes de ponerse en contacto con ninguna empresa / freelance para su desarrollo. Casos donde se requiere una programación a medida:</p>
<ul>
<li>El cliente quiere un diseño que se aparte del típico de las tiendas mencionado antes.</li>
<li>Se necesitan características que son de dificil resolución en un CMS, por ejemplo un probador virtual de productos, un customizador de características a medida, reglas complejas de tarificación / envío, etc..</li>
<li>El propio esquema de la tienda no es el típico carrito-checkout-pasarela.</li>
<li>Se necesita integrar la tienda con el software de gestión de la tienda física, y este software es del paleolítico (lo más común).</li>
</ul>
<p>En definitiva, cualquier esquema que se aparte del típico usado por los CMS.<br /><br />El problema de la programación a medida es precisamente ese, que es "a medida", por lo tanto será más caro y habrá que delimitar todo lo que se quiere hacer de manera precisa.<br />No vale decir "quiero todo lo que trae el Magento", porque eso te va a salir por un ojo de la cara. En una programación a medida, vas a tener exactamente lo que requieres, en cuanto a diseño y programación, y si luego quieres "estadísticas como las del Prestashop" o cualquier añadido, lo tendrás que pagar. <br /><br />Evidentemente la ventaja es que tendrás un producto completamente a tu medida, y le podrás poner cualquier característica que se te ocurra.<br /><br />En resumen, para hacer una tienda online lo primero es escribir en un documento todo lo que va a tener la tienda, y luego informarse informarse informarse, no quedarte con lo que te diga la primera empresa / freelance con la que contactes, pedir valoraciones económicas, e intentar huir siempre que sea posible de las "empresas especializadas en tiendas online que te lo dan todo hecho", porque la final probablemente estarás pagando una pasta mensual por la solución de tienda genérica que te dan ellos, no la que querías tu.</p>]]></content:encoded><link>http://www.enriquegonzalez.net/blog/2012-01-07/que-tienda-online-necesito/</link><pubDate>Sat, 07 Jan 2012 00:00:00 +0100</pubDate></item><item><title><![CDATA[De Flash a HTML5 para el iPad]]></title><description><![CDATA[<p>Después de muchos años animando y programando en Flash, parece que esta herramienta va a desaparecer de la web en favor del HTML5 (sólo de la web, porque se seguirá usando para aplicaciones de escritorio y demás). Una de las razones es la negativa de Apple de dar soporte a Flash en sus dispositivos&hellip;</p>]]></description><content:encoded><![CDATA[<p>Después de muchos años animando y programando en Flash, parece que esta herramienta va a desaparecer de la web en favor del HTML5 (sólo de la web, porque se seguirá usando para aplicaciones de escritorio y demás). Una de las razones es la negativa de Apple de dar soporte a Flash en sus dispositivos móviles, y dado que estos dispositivos se usan cada vez más para navegar, habrá que pasar por el aro. <br />De manera que para hacer animaciones que se vean en el iPhone / iPad, no queda otra que hacerlas en HTML5.<br />Ahora mismo hay varias formas de convertir los Flash en HTML5:<br /><br /><strong><img class="imagen_contenidos_dcha" src="http://enriquegonzalez.net/intranet/uploads/web/wallaby.jpg" alt="wallaby" title="wallaby" />Adobe Wallaby</strong><br /><br />Esta herramienta aun en fase beta de la propia Adobe importa directamente los fuentes "fla" y los convierte en HTML5 (genera varios ficheros, incluidos los gráficos en formato SVG).</p>
<p>El problema es que es muy limitada, al menos en esta fase beta. Solo permite hacer animación muy básica: No permite alfas, botones, actionscript (bueno, el stop() sí funciona) y muchas cosas más, por lo que por ahora vale para muy poco.<br /><br /><strong><img class="imagen_contenidos_dcha" src="http://enriquegonzalez.net/intranet/uploads/web/swiffy_150x150.jpg" alt="swiffy_150x150" title="swiffy_150x150" />Google Swiffy</strong><br /><br />Esta herramienta de Google es toda una sorpresa, partiendo del "swf" (ha de ser generado con compatibilidad Flash Player 8 - Actionscript 2) genera HTML5 con bastantes posibilidades. Al contrario que el Wallaby, sí permite botones, alfas, actionscript básico y bastantes cosas más.<br />El swf es convertido en 2 ficheros, un html y un runtime.js. <br />Swiffy crea una representación en JSON de la animación, que es interpretada mediante Javascript. <br />Todas las pruebas que he hecho han ido bien, se ven perfectamente en el iPad tanto en el Safari como en una app con una uiwebview. De hecho la <a href="http://www.google.com/doubleclick/studio/swiffy/gallery.html" target="_blank">galería de ejemplos</a> que aporta Swiffy está muy bien, a ver que futuro nos depara el tema.<br /><br />Mientras los editores HTML5 sigan tan verdes (veremos que pasa con el Adobe Edge), habrá que seguir convirtiendo Flash a HTML5.</p>]]></content:encoded><link>http://www.enriquegonzalez.net/blog/2011-10-16/de-flash-a-html5-para-el-ipad/</link><pubDate>Sun, 16 Oct 2011 00:00:00 +0200</pubDate></item><item><title><![CDATA[50 euros en Adwords]]></title><description><![CDATA[<p>Adwords es una valiosa herramienta para darnos publicidad en  Internet, una de las pocas herramientas de Google que es de pago, y  además nada barata (usandola te das cuenta de donde salen los miles de  millones de dólares que tiene Google). El problema es precisamente ese:  Una mala utilización de&hellip;</p>]]></description><content:encoded><![CDATA[<p>Adwords es una valiosa herramienta para darnos publicidad en  Internet, una de las pocas herramientas de Google que es de pago, y  además nada barata (usandola te das cuenta de donde salen los miles de  millones de dólares que tiene Google). El problema es precisamente ese:  Una mala utilización de la herramienta hará que se pierda mucho dinero  para nada.<br /> <br /> Adwords nos permite poner nuestros anuncios en dos sitios: Las búsquedas  de Google (cuando alguien haga una búsqueda, nuestro anuncio saldrá con  los resultados) y la red de afiliados (nuestro anuncio saldrá en las  webs que tienen contratada publicidad de Google tipo Adsense). Adwords  sólo nos cobra cuando alquien hace click en nuestro anuncio. Para saber  cuando debe aparecer nuestro anuncio y no el de otros (o el orden de  aparición), existen las keywords y el CPC (coste por click). Nosotros  definimos una serie de keywords (palabras compuestas) que definen  nuestro producto, y a cada keyword le asignamos un CPC máximo. Por  ejemplo: Si nuestra campaña de Adwords es para anunciar una tienda  online de botas, tendremos entre otras muchas una keyword llamada "botas  de piel". Entonces si alguien busca en Google "botas de piel", nuestro  anuncio podría salir en sus resultados de búsqueda. Entonces es cuando  entra el CPC máximo, si por ejemplo otro usuario de Adwords también ha  puesto en su campaña la keyword "botas de piel", saldrá el anuncio de  quien haya puesto un CPC máximo más alto (podrían salir los dos  anuncios, pero uno encima del otro). Esto quiere decir que cuanto más  estés dispuesto a pagar por click en cada keyword, más posibilidades hay  de que el anuncio salga el primero para esa keyword. Las keywords mas  raras pagan menos que las mas generales, porque las mas raras tienen  menos competencia, pero claro, también atraen a menos usuarios.<br /> <br /> Pero no todo es que la gente haga click en nuestro anuncio, lo debe  hacer la gente correcta, usuarios que realmente puedan estar interesados  en lo que anunciamos. Si descubrimos que algunos clicks son de usuarios  que vienen de busquedas o páginas que no tienen que ver con nuestro  anuncio, debemos eliminar o modificar las keywords que los provocan.<br /> <br /> Aunque se han hecho estudios de 1000 páginas sobre Adwords, yo creo que  todo se resume en lo que hemos comentado. Para hacer una buena campaña  de Adwords, hay que seguir unas pautas:<br /> <br /> Si se quiere afinar bien y se dispone de dinero, sobre un mismo producto  habría que hacer varias campañas, cada una orientada a un público en  concreto (un rango de edades, una región, un país) porque cada tipo de  público tiene sus peculiaridades.<br /> <br /> En cada campaña, crear varios anuncios donde en cada anuncio se van  metiendo diferentes keywords. Esto nos ayudará a descartar los que  tengan menos clicks. Es importante que en los anuncios mezclemos  keywords genéricas (por ejemplo "creación de páginas web") con keywords  más específicas (por ejemplo "plugins de Joomla").<br /> <br /> A la hora de crear las keywords, hay que pensarselas muy bien, mas vale  pocas bien que muchas mal. Poner pocas keywords genéricas de  concordancia amplia, porque aunque atraen muchos clicks, la mayoría no  tienen que ver con nuestro anuncio, y además suelen ser muy caras. Mejor  usar muchas de concordancia de frase. Luego con el paso del tiempo, se  va viendo qué keywords son más efectivas a la hora de atraer usuarios  correctos. Hay que poner el CPC individual para cada keyword, las que  tienen más competencia hay que subir el precio.<br /> Poner tambien keywords negativas, porque limpian mucho los resultados  (Por ejemplo, si te dedicas a vender, pon la keyword "free" o "gratis"  como negativa).<br /> <br /> Es muy importante vincular nuestra cuenta de Adwords con la de Analytics  (no están vinculadas por defecto), porque nos ayudará a averiguar de  donde viene la gente que hace click en nuestros anuncios. También hay  que analizar si los clicks que vienen de búsquedas o de afiliados son  buenos, y si no lo son podemos quitar una de las dos fuentes (hay mucha  gente que se queja de que los clicks que vienen de afiliados suelen ser  basura).<br /> <br /> Si ponemos un gasto límite diario, hay que cuidar que no se gaste  demasiado rápido y luego estemos la mayor parte del dia sin anuncios.<br /> <br /> En definitiva, intentar salir por encima de la competencia, que buen dinero nos cuesta.</p>]]></content:encoded><link>http://www.enriquegonzalez.net/blog/2011-10-02/50-euros-en-adwords/</link><pubDate>Sun, 02 Oct 2011 00:00:00 +0200</pubDate></item><item><title><![CDATA[iBuildApp review]]></title><description><![CDATA[<p>Los asistentes para la creación de apps nativas de movil online son sobradamente conocidos, páginas como iBuildApp, appMakr y muchas otras existen desde hace tiempo. Son una solución para quien no sepa programar y necesite una app nativa muy sencilla.<br /><br />Vamos a probar iBuildApp.com, porque es la&hellip;</br></br></p>]]></description><content:encoded><![CDATA[<p>Los asistentes para la creación de apps nativas de movil online son sobradamente conocidos, páginas como iBuildApp, appMakr y muchas otras existen desde hace tiempo. Son una solución para quien no sepa programar y necesite una app nativa muy sencilla.<br /><br />Vamos a probar iBuildApp.com, porque es la página mas famosa de este tipo. Curiosamente, buscando por Google solo he encontrado menciones a la página, pero nadie que la haya probado a fondo para ver si vale la pena. Pues yo mismo lo hare :-)<br /><br />iBuildApp promete generar aplicaciones nativas de iPhone, iPad, Android y HTML5 totalmente gratis, y sin saber programar en absoluto, lo cual no es poco.<br /><br />En cuanto nos registramos, ya nos sale un asistente para que hagamos nuestra primera app. Para ello, nos dan a elegir varias plantillas, entre las que se encuentran "Small Business", "Musicians", "Business", "E-book" y algunas otras. Son todas básicamente "presets" que incluyen gráfica y determinadas funciones, pero que podemos cambiar posteriormente por completo. Selecciono el tipo "Custom App".</p>
<p><img src="http://enriquegonzalez.net/intranet/uploads/web/ibuildapp1_575.jpg" alt="ibuildapp1_575" title="ibuildapp1_575" /><br /><br />Entonces entramos en el asistente de creación de app. Le doy el nombre a la app "barbacoa" :-) , y selecciono que voy a crear una app de iOS (iPhone) y Android. Selecciono entonces la imagen de fondo y el logo, que saldrán en la pantalla de inicio de la app. La plantilla "custom app" te permite tener un menu con 6 iconos. Definimos entonces lo que hará cada icono. <br /><br />La lista de cosas que se pueden poner en cada menu (ver imagen) incluye lo siguiente: HTML, Audio Stream, Google Map, Contactos, Video Stream, Google Calendar, RSS, Galería de fotos, Llamar por tfno, Lista de videos, ebook, enviar correo, eventos, Twitter, navegar web, Noticias, Facebook y E-commerce.</p>
<p><img src="http://enriquegonzalez.net/intranet/uploads/web/ibuildapp2_575.jpg" alt="ibuildapp2_575" title="ibuildapp2_575" /><br /><br />La mayoría son bastante obvios, voy a probar 7 que pueden tener algo de miga: E-commerce, ebook, Eventos, Google Map, Contacts, Audio Stream y Video List<br /><br />E-Commerce: Te permite subir productos, cada producto se compone de ID, Nombre, Precio y Foto. Los productos que subas salen en un listado en que en cada elemento pone el thumbnail de la foto, el nombre, precio, y dos botones "info" y "add to bag". En el asistente no se puede ver como funcionan.<br /><br />E-Book: Te permite crear un libro, cada página la tienes que escribir en un rich-editor tipo Tinymce.<br /><br />Eventos: Te saca una lista de eventos, que puede venir de un RSS feed o los puedes meter manualmente. Cada evento lleva Fecha, Nombre y Descripción. <br /><br />Google Map: Es eso mismo, un mapa donde puedes ir poniendo marcadores. Cada marcador lleva Nombre, Longitud, Latitud, Detalles y URL.<br /><br />Contacto: Una página para que pongas unos datos de contacto.  Lleva Nombre, Telefono, Dirección, Email y URL. No tiene relación con la libreta de direcciones del iPhone. Cada elemento es pinchable (el teléfono lleva a marcar, la dirección a Google Maps, etc..)<br /><br />Audio Stream: Te permite hacer una lista de streams de audio a base de URLs (no se suben ficheros, evidentemente).<br /><br />Video List: Te permite subir videos a la aplicación, que se muestran en forma de lista.<br /><br />Una vez definidas las funciones de la app, procedemos a finalizarla. Entonces nos permite definir la splash screen (pantalla de inicio), y los datos para publicarla en el Appstore: Nombre, categoría, descripción, keywords, web de la app y el icono.<br /><br />Llegamos a la pantalla de publicación. Como había seleccionado hacer la app para iPhone y Android, hay dos pantallas de publicación distintas. En la de iPhone, podemos seleccionar publicarla bajo nuestra cuenta de desarrollador de iPhone, para lo cual tenemos que generar los certificados correspondientes. Pero si no tenemos cuenta de desarrollador de iPhone, ellos nos hacen la cuenta de desarrollador a nuestro nombre por $199 + $99 anuales que cobra Apple, y la publican por nosotros.<br /><br />La publicación Android es gratis total. Sólo tenemos que firmarla, y si lleva Google Maps, poner nuestra Maps API Key (el asistente de publicación lo hace todo).<br /><br />Una vez publicadas, las apps no van directamente al Appstore o al Android Market, sino a un apartado de tu cuenta de ibuildapp llamado "Mis aplicaciones". Desde ahí puedes publicar en las correspondientes stores, o bajar los binarios para tu uso personal.<br /><br />Asi que voy a probar la versión Android de la app que he creado. Me bajo el apk, y lo meto en mi Nexus One con Android 2.3.3.<br />La primera impresión es buena, se ve igual que se veía en el asistente. Pruebo las opciones: El ebook es como estaba previsto, listado de páginas - contenido. Probamos ahora el e-commerce, al dar al icono en el menu la app se congela. Vaya. Lo mismo pasa si voy a la opción Eventos.  El Google Map tampoco funciona. Vamos, por resumir, solo funciona el ebook, todas las demás opciones cuelgan la app, vaya fiasco.<br /><br />Viendo el desastre de la app versión Android, voy a probar la versión iPhone. Después del lio habitual con los certificados, consigo hacer una publicación con un certificado ad-hoc (no voy a publicar este test en el Appstore evidentemente). ¿Pero, donde está mi "ipa"? Tarda un poco, pero acaba apareciendo en "Mis aplicaciones".<br />Lo descargo y lo instalo en mi iPhone 4 con el iOS 4.3.3. Como en la versión Android, el apartado ebook funciona bien.  Voy al apartado e-commerce, y entra, pero el producto que había puesto no sale en la lista. El apartado Eventos parece que va bien, el Google Map también aunque la descripción de las marcas no sale en la pantalla de ficha. Contacto va bien, y en Video List la lista sale vacía, yo había puesto la ficha de un video (aunque no lo había subido).</p>
<h3>Resumen</h3>
<p>Crear una app con iBuildApp solo te vale si necesitas una app que se pueda hacer con los "presets" que tienen, y aun así, es una lotería que funcione correctamente. Aun asi hay que reconocer que el asistente online que han montado está muy bien. ¿que ganan estos de ibuildapp si todo es gratis (excepto la publicación en Appstore)? Es un gancho para hacer apps mas complejas a medida. Es como los CMS tipo Wordpress o Joomla en web, todo el mundo sin saber programar se puede hacer una web con un CMS, pero tienen sus limitaciones, cuando necesitas algo específico tienes que ir a programación a medida, pues ibuildapps hacen los mismo, podriamos llamarlos los "CMS del movil".</p>]]></content:encoded><link>http://www.enriquegonzalez.net/blog/2011-08-18/ibuildapp-review/</link><pubDate>Thu, 18 Aug 2011 00:00:00 +0200</pubDate></item><item><title><![CDATA[El Flash en los kioskos táctiles de las exposiciones]]></title><description><![CDATA[<p><img class="imagen_contenidos_dcha" src="http://enriquegonzalez.net/intranet/uploads/web/kiosko.jpg" alt="kiosko" title="kiosko" />Llega el verano y con él las exposiciones, stands, ferias de muestras. Gracias a ellos, me suele llegar trabajo todos los veranos para hacer multimedias para kioskos táctiles.</p>
<p>Un kiosko táctil no es mas que un PC con pantalla táctil. Para hacer un multimedia para este tipo de dispositivos, nada&hellip;</p></img></p>]]></description><content:encoded><![CDATA[<p><img class="imagen_contenidos_dcha" src="http://enriquegonzalez.net/intranet/uploads/web/kiosko.jpg" alt="kiosko" title="kiosko" />Llega el verano y con él las exposiciones, stands, ferias de muestras. Gracias a ellos, me suele llegar trabajo todos los veranos para hacer multimedias para kioskos táctiles.</p>
<p>Un kiosko táctil no es mas que un PC con pantalla táctil. Para hacer un multimedia para este tipo de dispositivos, nada como el Flash. Ahora que el Flash pierde terreno en web debido al HTML5, en los multimedia de sobremesa donde hay que generar un ejecutable (projector) sigue siendo el rey, por su efectividad y facilidad de uso.</p>
<p>En este post voy a poner algunos consejos a la hora de hacer projectors con Flash para kioskos táctiles:</p>
<p>Las dimensiones del Flash deben coincidir con las de la pantalla donde va a ser mostrado, por lo que antes de empezar hay que averiguar las características del kiosko donde va a ser mostrado. El Flash siempre se ejecutará a pantalla completa.</p>
<p>Los PCs que hay dentro de los kioskos suelen ser mini-PCs no muy potentes, por lo tanto no pasarse con los FPS del Flash, para que no vaya a saltos.</p>
<p>Hacer los botones del Flash gigantes. No quiero decir que los botones en sí sean grandes, sino que la superficie pulsable del botón (que puede tener alpha 0) debe ser lo más grande posible. Esto es así porque a veces las pantallas táctiles se descalibran con el uso, y si los botones son pequeños, al pinchar con el dedo la pantalla no lo podremos pulsar porque en cuanto se descalibre un poco ya no coincidirá el botón con el lugar donde hemos pinchado con el dedo.</p>
<p>No poner botones de salir de la aplicación. Parece una tontería, pero ya he visto algún multimedia de kiosko con el botón de "salir", ¿para que?</p>
<p>Poner el tipo de letra de los textos legible y bien grande, que los usuarios no tengan que pegar la nariz al kiosko para leerlo.</p>
<p>Poner un timer de inactividad, de manera que si el multimedia está sin tocar durante varios minutos, ejecute una animación o algo que llame a los usuarios.</p>
<p>Recordar meter un acceso directo del ejecutable del multimedia en el menu de inicio del Windows del PC que lleva el kiosko, para que al encender el kiosko ya arranque también el multimedia.</p>
<p>Cuidado con el audio. Antes de poner música o efectos de sonido al multimedia, hay que preguntar donde va a estar el kiosko, porque pueden molestar al público.</p>
<p>Y cuidado con el video: Para poner video a este tipo de multimedias, hay que seguir un par de consejos:</p>
<ul>
<li>Al ir a pantalla completa, debemos de poner al visor de video FLVPlayback el parametro fullScreenTakeOver a false. Además no debemos utilizar el FLVPlayback como componente visual, sino declararlo como objeto en el código, porque sino nos va a dar bastantes problemas. </li>
<li>Si le ponemos el evento COMPLETE al FLVPlayback, hay que acordarse de quitarlo y volver a ponerlo si vamos a usar ese mismo componente para reproducir diferentes videos, pues "memoriza" el fin del primer video y nos puede dar "fines falsos" en los siguientes videos.</li>
</ul>
<p> </p>]]></content:encoded><link>http://www.enriquegonzalez.net/blog/2011-08-04/el-flash-en-los-kioskos-tactiles-de-las-exposiciones/</link><pubDate>Thu, 04 Aug 2011 00:00:00 +0200</pubDate></item><item><title><![CDATA[Instalando un SSD Crucial M4 en el Mac Mini 2009]]></title><description><![CDATA[<p>Un Mac Mini del 2009 es mi herramienta de trabajo, por lo que me gusta tenerlo bien actualizado. Hace poco ya le había instalado 8 Gb de RAM, y hoy toca instalar un disco SSD. He comprado el Crucial M4 de 256 Gb.</p>
<p><img class="imagen_contenidos_dcha" src="http://enriquegonzalez.net/intranet/uploads/web/ssdmini3.jpg" alt="Instalando Crucial M4 de 256 Gb" title="Instalando Crucial M4 de 256 Gb" /></p>
<p>Lo primero es clonar el disco actual al nuevo disco SSD. Para ello hay que conectar&hellip;</p></img></p>]]></description><content:encoded><![CDATA[<p>Un Mac Mini del 2009 es mi herramienta de trabajo, por lo que me gusta tenerlo bien actualizado. Hace poco ya le había instalado 8 Gb de RAM, y hoy toca instalar un disco SSD. He comprado el Crucial M4 de 256 Gb.</p>
<p><img class="imagen_contenidos_dcha" src="http://enriquegonzalez.net/intranet/uploads/web/ssdmini3.jpg" alt="Instalando Crucial M4 de 256 Gb" title="Instalando Crucial M4 de 256 Gb" /></p>
<p>Lo primero es clonar el disco actual al nuevo disco SSD. Para ello hay que conectar el SSD por USB, se puede hacer de varias formas, por ejemplo metiendolo en una carcasa USB, pero yo prefiero utilizar el adaptador "<a href="http://www.conceptronic.net/site/desktopdefault.aspx?tabindex=1&tabid=212&cid=10&gid=1070&pid=CSATAI23U" target="_blank">Conceptronic Serial ATA & IDE to USB Adapter</a>", que permite conectar "en caliente" cualquier disco por USB.</p>
<p>En la foto se puede ver cómo he conectado el SSD al ordenador mediante el Conceptronic Adapter.</p>
<p>Entonces clono el disco con el SuperDuper. Dos horas y media más tarde, ya está hecho. Evidentemente hay que mirar que en el disco origen haya menos datos que la capacidad del disco destino.</p>
<p>Una vez clonado el disco, hay que desarmar el Mac Mini. Tengo que decir que acojona más de lo que luego es. En Youtube se pueden encontrar tutoriales de como desarmarlo, y es bastante sencillo si se tiene un mínimo de cuidado.</p>
<p>La parte más delicada es la de la espátula, al abrir la carcasa. Una foto de mi Mac Mini abierto y la espátula usada:</p>
<p><img src="http://enriquegonzalez.net/intranet/uploads/web/ssdmini2.jpg" alt="Instalando Crucial M4 de 256 Gb" title="Instalando Crucial M4 de 256 Gb" /></p>
<p>A continuación se instala el disco, es bastante fácil. En la foto inferior se puede ver el disco SSD ya puesto en su habitáculo.</p>
<p><img class="imagen_contenidos_dcha" src="http://enriquegonzalez.net/intranet/uploads/web/ssdmini1.jpg" alt="Instalando Crucial M4 de 256 Gb" title="Instalando Crucial M4 de 256 Gb" />Pues nada, se vuelve a armar el aparato, y a continuación yo hago lo siguiente:</p>
<p><strong>Resetear la PRAM</strong>: Es una buena costumbre resetear la <a href="http://www.planetamac.es/resetear-la-pram-del-mac" target="_blank">PRAM</a> cada vez que se instala nuevo hardware:<br /><br />1. Reinicia el Mac y mantén pulsada la combinación de teclas Comando-Opción-P-R.<br />2. Manten pulsadas dichas teclas hasta que el Mac se reinicie dos veces (suene dos veces el arcorde de inicio).</p>
<p><strong>Activar el TRIM</strong>: Actualmente el Snow Leopard no tiene soporte nativo para <a href="http://es.wikipedia.org/wiki/TRIM" target="_blank">TRIM</a>, pero se le puede activar con este fix: <a href="http://www.groths.org/?p=308" target="_blank">TRIM Enabler for Mac</a>. Es muy importante activarlo para que la velocidad de lectura/escritura del SSD no se degrade con el tiempo.</p>
<p><strong>Actualizar el firmware del SSD</strong>: Este paso no es tan importante, sería más bien un paso posterior si el SSD diera algún problema.</p>
<p>El resultado: No se como irá la cosa a lo largo del tiempo, pero la mejora inicial del rendimiento del sistema gracias al SSD es <strong>IMPRESIONANTE</strong>. Tanto como ver arrancar el Adobe Photoshop CS5 en 4 segundos, ver arrancar el Mac OS en 9 segundos, vamos de infarto, y encima sabiendo que el SSD consume menos corriente que cualquier HDD, no emite ruido en absoluto y es menos proclive a estropearse por un golpe al no tener partes móviles. Eso sí, es caro, pero en herramientas para la profesión no se puede escatimar.</p>]]></content:encoded><link>http://www.enriquegonzalez.net/blog/2011-07-01/instalando-un-ssd-crucial-m4-en-el-mac-mini-2009/</link><pubDate>Fri, 01 Jul 2011 00:00:00 +0200</pubDate></item><item><title><![CDATA[Publicar tu RSS feed en la portada de Linkedin]]></title><description><![CDATA[<p>El blog de esta página (enriquegonzalez.net) está hecho con programación propia, no con un Wordpress o similar, y como todo blog tiene su RSS feed. Yo quería colocar este feed en la portada de mi perfil de Linkedin, a través de alguno de sus plugins (ellos llaman "aplicaciones"), pero sólo tienen&hellip;</p>]]></description><content:encoded><![CDATA[<p>El blog de esta página (enriquegonzalez.net) está hecho con programación propia, no con un Wordpress o similar, y como todo blog tiene su RSS feed. Yo quería colocar este feed en la portada de mi perfil de Linkedin, a través de alguno de sus plugins (ellos llaman "aplicaciones"), pero sólo tienen un plugin para Wordpress.</p>
<p>Así que había que hacer creer al plugin que el feed prevenía de un Wordpress. Lo primero es añadir a la programación de tu feed todas las tags típicas de los feeds del Wordpress, incluso la que es:</p>
<blockquote><generator>http://wordpress.org/?v=3.0.1</generator></blockquote>
<p>No se si es necesaria, pero al menos te aseguras de que el plugin de Wordpress encontrará lo que busca.</p>
<p>Y a continuación, hay que modificar el .htaccess, puesto que el plugin va buscando una dirección del tipo:</p>
<blockquote>http://enriquegonzalez.net?feed=rss2</blockquote>
<p>La cual tiene que servir tu feed, por lo que se coloca en el .htaccess:</p>
<p><code class="highlight">RewriteCond %{QUERY_STRING} ^feed=rss2$<br />RewriteRule ^(.*)$ rss.php</code></p>
<p>Y ya está, tienes tu feed en la portada de tu perfil de Linkedin mediante la "aplicación" Wordpress.</p>]]></content:encoded><link>http://www.enriquegonzalez.net/blog/2011-06-14/publicar-tu-rss-feed-en-la-portada-de-linkedin/</link><pubDate>Tue, 14 Jun 2011 00:00:00 +0200</pubDate></item><item><title><![CDATA[Los spambots de formulario de contacto]]></title><description><![CDATA[<p>Un cliente me llamó diciendo que le estaban llegando correos desde el formulario de contacto de su web, de forma regular, y que todos eran spam. Los mensajes eran de este tipo:</p>
<blockquote>
<p>Referencia: 65011<br />Nombre y apellidos: Loree<br />Empresa: oupJboHYzHQPLIawhe<br />Teléfono: 1286843212349<br />Correo&hellip;</br></br></br></br></p></blockquote>]]></description><content:encoded><![CDATA[<p>Un cliente me llamó diciendo que le estaban llegando correos desde el formulario de contacto de su web, de forma regular, y que todos eran spam. Los mensajes eran de este tipo:</p>
<blockquote>
<p>Referencia: 65011<br />Nombre y apellidos: Loree<br />Empresa: oupJboHYzHQPLIawhe<br />Teléfono: 1286843212349<br />Correo electrónico:fairplay@vidc.org<br />Mensaje:?Hey, youÂ&rsquo;re the goto expert. Tahkns for hanging out here.</p>
</blockquote>
<p>Lo primero que te preguntas es ¿qué interés puede tener el que hace esto? Haciendo spam a una persona que no conoce. En fin, la cuestión es que el formulario tenía validación de campos y captcha, pero eso no detenía al spambot, que seguía enviando los correos mediante ese formulario.</p>
<p>Dado que este tipo de ataques se suele hacer de forma indiscriminada, o sea, que el spammer no está mirando si pones alguna medida de seguridad para modificar su script de ataque, se pueden solventar sin problemas.</p>
<p>Hay varias cosas que suelen funcionar:</p>
<ul>
<li>Usar campos ocultos mediante CSS: El spambot autorellena los campos, e intenta poner los datos correctos según el nombre del campo (si se llama email, pone un email, si se llama telefono/phone, pone numeros) para evitar la validación, pero si rellena un campo real oculto mediante CSS y compruebas que ese campo ha sido rellenado, es que solo lo ha podido rellenar un spambot.</li>
<li>Con lo comentado en el punto anterior, si no llamas a los campos de formulario con nombres comunes, o sea por ejemplo llamas al campo email "juanin", el spambot no sabrá qué tipo de datos usar para el relleno con lo que la validación lo detendrá.</li>
<li>La "pregunta humana": Poner esto es un coñazo, pero puedes poner al final del formulario una pregunta para humanos tipo ¿Cuanto son 2 + 2? y comprobar antes de enviar.</li>
<li>Si ya quieres hilar fino, puedes usar el API de <a href="http://akismet.com/" target="_blank">Akismet</a>, que permite comprobar si el mensaje que se va a mandar por email es spam o no. En forma de plugin es muy popular entre los usuarios de Wordpress, que evitan así que los machaquen a spam (sobre todo en los comentarios de los posts).</li>
</ul>
<p>Hay muchos otros métodos, pero los spambots tampoco son tan listos.</p>]]></content:encoded><link>http://www.enriquegonzalez.net/blog/2011-06-02/los-spambots-de-formulario-de-contacto/</link><pubDate>Thu, 02 Jun 2011 00:00:00 +0200</pubDate></item><item><title><![CDATA[¿Da eBay ahora más confianza?]]></title><description><![CDATA[<p>Yo no soy usuario habitual de eBay, aunque sí lo vengo utilizando desde hace muchos años. Recuerdo que en los primeros años en que empecé a utilizarlo, eBay (al menos en España) era un lugar con desprotección total, por mucha historia que contaran en la página, si un comprador no te pagaba, o si un&hellip;</p>]]></description><content:encoded><![CDATA[<p>Yo no soy usuario habitual de eBay, aunque sí lo vengo utilizando desde hace muchos años. Recuerdo que en los primeros años en que empecé a utilizarlo, eBay (al menos en España) era un lugar con desprotección total, por mucha historia que contaran en la página, si un comprador no te pagaba, o si un vendedor no te servía el pedido, te quedabas sin nada porque nadie te ayudaba.</p>
<p>Parece que ahora las cosas mejoraron un poco, al menos por una experiencia personal. Hace unas semanas, tuve un problema con un vendedor. Yo gané un item en la subasta, y el vendedor me dijo que pagara por transferencia (era español) en vez de por Paypal, por el tema de la comisión de Paypal. En este caso no me importó, a pesar de que la comisión de Paypal que el vendedor se ahorra, es comisión por transferencia bancaria que me cargan a mi. El vendedor parecía de confianza (votos positvos y tal).</p>
<p>La cuestión es que una vez pagado, recibo un email de eBay diciendo que han retirado el artículo porque el vendedor infringió una regla de eBay que no me quisieron decir. O sea, retiran el artículo una vez finzalizada la subasta y una vez pagado, y encima no me dicen por qué. Para más indignación, veo que la cuenta de eBay del vendedor también la han cancelado. Por supuesto, el vendedor dejó de contestar emails y demás.</p>
<p>El escenario parecía una estafa con la connivencia de eBay.</p>
<p>Lo primero que hice es abrir una disputa en eBay por mercancía no recibida, a pesar de que yo pensaba que no serviría para nada. A la vez, envíe emails al servicio de ayuda de eBay explicando lo que había pasado. Lo primero que me dicen por email es que al no haber pagado por Paypal, no me pueden devolver el dinero, que lo reclame en la entidad bancaria donde hice la transferencia. Esto no se puede hacer sin el permiso del dueño de la cuenta bancaria destino, permiso que evidentemente no tenía.</p>
<p>Como colofón, eBay me dice por carta que puedo denunciar el caso ante el servicio de delitos telemáticos de la Guardia Civil. Lo que parecía un lavado de manos total por parte de eBay, dió un vuelco unos días después. Ante mi insistencia por saber la identidad del vendedor, recibo una llamada de eBay (la primera que recibo de ellos en la vida, no sabía que ni tuvieran SAT telefónico) donde me dicen que no me pueden revelar quién es el vendedor pero que se han puesto en contacto con el para que se identifique.</p>
<p>Imagino que el vendedor recibió una llamada de eBay, porque al día siguiente, el vendedor que había estado callado todo este tiempo, de repente me envia un mail pidiendo perdon, contandome no se qué película, etc..</p>
<p>Al final todo se resolvió bien, pero la cuestión es que a pesar de todas las medidas de seguridad que uno toma, aun hay gente que sigue intentando estafar en eBay, que parece ser que al menos ahora es algo más seguro que antes.</p>]]></content:encoded><link>http://www.enriquegonzalez.net/blog/2011-05-25/da-ebay-ahora-mas-confianza/</link><pubDate>Wed, 25 May 2011 00:00:00 +0200</pubDate></item></channel></rss>
