Publicada Gastrotips, nuestra nueva app

vlcsnap-2016-05-02-11h31m47s238

Publicamos nuestra segunda app, esta para los que somos aficionados o expertos en la cocina, Gastrotips. El formato es el mismo que la de belleza pero enfocada a un mundo más “sabroso” :)

Si te gusta cocinar, los restaurantes o simplemente el buen comer descarga la app y disfruta de los trucos, consejos y recetas que encontrarás, y además puedes aconsejar a los demás con tu conocimiento.

¡Disfrutadla!

Promocionar tus apps con Facebook y Messenger en Android

Casi todas las apps que usamos alguna vez tienen una opción para invitar a tus amigos a usarla. Hay muchos métodos que permiten hacer esta operación en Android, pero si quieres aprovechar al máximo las posibilidades de cada plataforma los métodos genéricos dejan de ser útiles.

En el caso de Facebook y Facebook Messenger lo más habitual es usar el SDK de Facebook ya que en muchos casos ya lo estás usando para aprovechar la funcionalidad de Facebook Connect. Pero vamos a ver las distintas maneras que se pueden promocionar las apps en Facebook.

1. Compartir genérico de android

Android permite compartir texto mediante sus Intents, este método te permite enviar un texto predefinido y un enlace concatenado, no es el mejor método pero funciona para todas las plataformas. Un ejemplo sería:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT, "Texto predefinido para compartir " + enlaceACompartir);
intent.setType("text/plain");
startActivity(intent);

Con este código el usuario puede escoger qué aplicación quiere usar para compartir el contenido, incluidos Facebook y Facebook Messenger si los tiene instalados. Como en ambos casos la aplicación hace un preview de los enlaces si tienes bien puestos los meta tags open graph puede resultar un contenido atractivo para el receptor.

2. Compartir enlaces en Facebook (ShareLinkContent)

El SDK de Facebook incluye un tipo de contenido para compartir mediante su clase abstracta ShareContent que se llama ShareLinkContent y que como el propio nombre indica permite compartir enlaces a otros usuarios. Con este mismo tipo de contenido podemos enviar datos a Facebook y Facebook Messenger, en incluso si el usuario no tiene instaladas las aplicaciones hará un fallback a su versión web.

Facebook

En el caso de Facebook hay que usar la clase ShareDialog para compartir el ShareLinkContent, por ejemplo:

if (ShareDialog.canShow(ShareLinkContent.class)) {
    ShareDialog shareDialog = new ShareDialog(this);
    ShareLinkContent facebookContent = new ShareLinkContent.Builder()
        .setContentUrl(Uri.parse(url))
        .setContentTitle(title)
        .setContentDescription(content)
        .setImageUrl(Uri.parse(imageUrl))
        .build();
    shareDialog.show(facebookContent);
}

Este código abrirá la app de Facebook y permitirá compartir el contenido debidamente formateado.

Facebook Messenger

En el caso de Facebook Messenger hay un poco de confusión, en gran parte porque Facebook no documenta correctamente el SDK… como siempre. Hay dos métodos para compartir con Facebook Messenger. El primero mediante la clase MessengerUtils que permite compartir imágenes, audio o vídeo a través de Messenger pero solo ese tipo contenido. No hay que confundir la url externa, que sirve como fallback para la url interna del contenido o por si hay que descargarlo obligatoriamente desde el enlace, con un enlace que lleve a una página.

ShareToMessengerParams shareToMessengerParams =
                ShareToMessengerParams.newBuilder(Uri.parse(urlInterna), "image/jpeg")
                        .setExternalUri(urlExterna)
                        .build();

MessengerUtils.shareToMessenger(
        this,
        REQUEST_CODE_SHARE_TO_MESSENGER,
        shareToMessengerParams);

El segundo sistema es parecido al de Facebook pero usando otra clase para enviar el contenido ShareLinkContent, la clase MessageDialog permite abrir la app Messenger y enviar este contenido a otro usuario. Ojo con la imagen de preview que si la página que compartes tiene los tags open graph pueden sobreescribir la imagen que vea el usuario en el mensaje recibido.

if (MessageDialog.canShow(ShareLinkContent.class)) {
            ShareLinkContent shareLinkContent = new ShareLinkContent.Builder()
                .setContentTitle(titulo)
                .setContentDescription(descripcion)
                .setContentUrl(Uri.parse(urlContenido))
                .setImageUrl(Uri.parse(urlPreview))
                .build();
            MessageDialog dialog = new MessageDialog(this);
            dialog.show(shareLinkContent);

3. Invitación a probar aplicaciones en Facebook (AppInvites)

Las invitaciones para probar aplicaciones en Facebook son un sistema interesante para promocionar las apps en Facebook ya que permiten en un solo click ir a la app store de turno e instalar la app desde la propia app de Facebook. Además puedes hacer tracking de los usuarios que llegan a través de estas invitaciones por si quieres montar un programa de referidos. El código sería algo así:

AppInviteContent content = new AppInviteContent.Builder()
    .setApplinkUrl(appLinkUrl)
    .setPreviewImageUrl(previewImageUrl)
    .build();
AppInviteDialog.show(this, content);

Y Facebook enviará a los usuarios que se indique una invitación con un aspecto muy atractivo. Recuerda que en cualquier caso la URL de destino debe implementar los tags open graph para que Facebook envie correctamente a la app store que toque en cada caso.

Estos métodos ayudan mucho a la promoción de apps, pero la parte de tracking es otro mundo por lo que proximamente hablaremos de Branch.

PHP – Load 2 classes with the same name in different files

When you are dealing with code that is used in different sites or a site with different languages at least once you will find yourself in this situation: the need of using the same class coming from 2 different files. For example, using a configuration file from different sites in the same script.

If you tried, or even if you don’t, you will know that this results in a fatal error. The solution is usually doing a wrapper to execute the the script for the different situations you need, this is a good solution but the downside is the performance when you need to launch the script with a exec or passthru (because of the process fork).

Looking for a solution I found the runkit PHP extension that allows you, among other things, to load a different class with the same name overwriting the current one. This is done with the runkit_import function and passing the path of the class file as a parameter.

The bad thing is that this PECL library is not maintained since 2006 and you know what that means… in this case the library doesn’t work in PHP 5.2+ versions. But then… someone at the office sent me a link of a github project that continues this library and made it work with PHP 5.2 and 5.3.

You will only need to download the last version from github and compile the code with these simple commads:

phpize
./configure
make
make install

When you have that you will have a runkit.so file in the dynamic modules folder of PHP, so now you only need to add it to php.ini or use the dl function to dynamically load the extension.

in php.ini

extension=runkit.so

Now you can use the following code to prove that all I’m saying is right:

a.php

class A 
{
    function overloading()
    {
        echo 'I am calling from A class' ;
    }
}

b.php

class A 
{
    function overloading()
    {
        echo 'I am calling from A class from file b.php' ;
    }
}

runkit_test.php

class A
{
    function overloading ()
    {
        echo 'Calling for the same script' ;
    }
}

$a = new A() ;
$a->overloading() ;
echo "n";
// no need for so many flags but now you can see the possibilities
if(runkit_import('/full/path/to/a.php', RUNKIT_IMPORT_CLASS_METHODS | RUNKIT_IMPORT_OVERRIDE | RUNKIT_IMPORT_CLASSES | RUNKIT_IMPORT_CLASS_PROPS | RUNKIT_IMPORT_CLASS_STATIC_PROPS)) {
    $a1 = new A();
    $a1->overloading() ;
}
echo "n";
if(runkit_import('/full/path/to/b.php', RUNKIT_IMPORT_CLASS_METHODS | RUNKIT_IMPORT_OVERRIDE | RUNKIT_IMPORT_CLASSES | RUNKIT_IMPORT_CLASS_PROPS | RUNKIT_IMPORT_CLASS_STATIC_PROPS)) {
    $b = new A();
    $b->overloading() ;
}

Will result in

Calling for the same script
I am calling from A class
I am calling from A class from b.php

And that should do it 😉

How git changed everything

I have migrated almost all the source code at work to git… yeah I’m not the first and it’s not the first time you’ve heard something like that, but git is great. If you are not using a version control system or using Subversion you may ask why, I’ll try to explain.

Git is not another version control system, the way git works it will change the way you work. Branches, tags, merges, checkouts, … I know all of this exist in Subversion too, but in git there’s a difference. Your interaction in git is 90% done locally so all the commits, checkouts, merges and operations that you will need to do are done in your local filesystem… that means speed. If you use or had used Subversion you know that a switch between 2 branches gets slower every time your project grows and projects tend to be bigger, not smaller, but the same operation in git is instantaneous. And this applies to all local operations, but someone can think that the downside is in remote operations… wrong! Remote operations are also fast (excluding latency time) including merges, fetch, push and anything you can imagine.

For me Subversion was so slow that when I needed to upload some file to production that I was doing something I ended copying this content to a text editor, reverting the changes and applying the new changes to the Subversion and to the code in the text editor, that was my faster switch for Subversion. Now I can commit my changes in the feature branch I have created and switch to another one to pull the changes from the remote repository, that one increased my life quality. But what happens if you don’t want to commit the changes to the feature branch yet… you can use the stash, using the git stash command all the changes that you have in your current branch are stored in the stash and your code is clean, in that moment you can do whatever you want and when you are finished, go back to the branch and apply the changes from the stash. That’s great!

Now I’m planning on switch from FTP uploads to git deployments… that will be a great improve too because what about those situations where some code is incorrect and you have to revert it, in Subversion this was a hell of a task (well, maybe not that hard) but if you use git tags you only need to deploy the previous tag and you’re done.

That’s my experience based in 1 month of git usage.

Concatenation vs Interpolation

Looks like one of the PHP’s eternal discussions could be over, the interpolation of variables in strings versus the concatenation of its values.

I’ve always been a fan of concatenation, it’s more readable and looked more natural in the code and several days ago while discussing some changes in the way we create code at Trovit we had this classic confrontation.

We looked for this in the Internet a little bit and we found a comment in the PHP forums with some benchmark info about this particular subject.

This image shows that the code used for this benchmark took less (half of the time to be exact) when using concatenation with single quotes to send the code to the user, but the strange thing is when sending the same code to the output buffer the interpolation is faster… that’s hard to believe.

In this stackoverflow post all the commenters agree, concatenation with single quotes is way faster than other options (concatenation with double quotes is like the worst of both worlds).

So if you’re one of those using:

<?php
echo "Hello, {$user_name}" ;
?>

instead of using:

<?php
echo 'Hello, ' . $user_name ;
?>

you should switch now.

By the way, if you want to get more optimization ideas, this presentation by Ilia Alshanetsky is really good.

Thanks Gonzalo for the tips.

En defensa de los derechos fundamentales en internet

Ante la inclusión en el Anteproyecto de Ley de Economía Sostenible de modificaciones legislativas que afectan al libre ejercicio de las libertades de expresión, información y el derecho de acceso a la cultura a través de Internet, los periodistas, bloggers, usuarios, profesionales y creadores de internet manifestamos nuestra firme oposición al proyecto, y declaramos que:

1.- Los derechos de autor no pueden situarse por encima de los derechos fundamentales de los ciudadanos, como el derecho a la privacidad, a la seguridad, a la presunción de inocencia, a la tutela judicial efectiva y a la libertad de expresión.

2.- La suspensión de derechos fundamentales es y debe seguir siendo competencia exclusiva del poder judicial. Ni un cierre sin sentencia. Este anteproyecto, en contra de lo establecido en el artículo 20.5 de la Constitución, pone en manos de un órgano no judicial -un organismo dependiente del ministerio de Cultura-, la potestad de impedir a los ciudadanos españoles el acceso a cualquier página web.

3.- La nueva legislación creará inseguridad jurídica en todo el sector tecnológico español, perjudicando uno de los pocos campos de desarrollo y futuro de nuestra economía, entorpeciendo la creación de empresas, introduciendo trabas a la libre competencia y ralentizando su proyección internacional.

4.- La nueva legislación propuesta amenaza a los nuevos creadores y entorpece la creación cultural. Con Internet y los sucesivos avances tecnológicos se ha democratizado extraordinariamente la creación y emisión de contenidos de todo tipo, que ya no provienen prevalentemente de las industrias culturales tradicionales, sino de multitud de fuentes diferentes.

5.- Los autores, como todos los trabajadores, tienen derecho a vivir de su trabajo con nuevas ideas creativas, modelos de negocio y actividades asociadas a sus creaciones. Intentar sostener con cambios legislativos a una industria obsoleta que no sabe adaptarse a este nuevo entorno no es ni justo ni realista. Si su modelo de negocio se basaba en el control de las copias de las obras y en Internet no es posible sin vulnerar derechos fundamentales, deberían buscar otro modelo.

6.- Consideramos que las industrias culturales necesitan para sobrevivir alternativas modernas, eficaces, creíbles y asequibles y que se adecuen a los nuevos usos sociales, en lugar de limitaciones tan desproporcionadas como ineficaces para el fin que dicen perseguir.

7.- Internet debe funcionar de forma libre y sin interferencias políticas auspiciadas por sectores que pretenden perpetuar obsoletos modelos de negocio e imposibilitar que el saber humano siga siendo libre.

8.- Exigimos que el Gobierno garantice por ley la neutralidad de la Red en España, ante cualquier presión que pueda producirse, como marco para el desarrollo de una economía sostenible y realista de cara al futuro.

9.- Proponemos una verdadera reforma del derecho de propiedad intelectual orientada a su fin: devolver a la sociedad el conocimiento, promover el dominio público y limitar los abusos de las entidades gestoras.

10.- En democracia las leyes y sus modificaciones deben aprobarse tras el oportuno debate público y habiendo consultado previamente a todas las partes implicadas. No es de recibo que se realicen cambios legislativos que afectan a derechos fundamentales en una ley no orgánica y que versa sobre otra materia.

Críticas a los sites de clasificados

Hoy me han pasado un enlace de un artículo en el que se habla de los buscadores verticales y los sites de clasificados, antes que nada decir que yo trabajo en Trovit así que soy parte implicada, pero me ha surgido la duda de porqué se habla con tanta rabia de estos tipos de sites.

El autor, un tal Cesar, ya escribió este tweet hace unos días:

trovit.com – mitula.com – yakaz.com…. porque google no los vanea de una vez por todas? tanto dinero gana con ellos?

y hoy probablemente intenta explicar o razonar con un post en su blog el comentario de twitter.

Pero al leer el post del blog lo que se ve es lo siguiente.

Critica a páginas como OLX diciendo que no generan valor… es cierto que hay anuncios que no valen para nada o que son spam, pero yo creo que ese es el precio de generar una comunidad de usuarios que pueden publicar anuncios de forma gratuita y sin “obligarles” a rellenar ciertos campos para poder categorizar los anuncios, o simplemente teniendo una buena tecnología anti-spam. Aún así el ejemplo de Loquo, que aunque ahora parece que está un poco de capa caída, sigue siendo una de las webs más efectivas para alquilar un piso, ofrecer empleo, …

Critica a los sites de clasificados y buscadores verticales (que también habría que diferenciarlos ligeramente, pero bueno) diciendo que los sites están creados para que el usuario pinche en los anuncios publicitarios. Eso no es para nada cierto, ya que aunque prácticamente todos los sites de los que habla en parte se financian con publicidad (en muchos casos de Google) los formatos que se usan, por lo menos en el caso de Trovit, son para diferenciar claramente lo que es publicidad de los resultados orgánicos.

Habla, en una parte del post, de como evaluar una web… el punto de siempre: y si Google te banea… pues si Google te banea estás jodido. Pero eso no solo los sites de clasificados o buscadores verticales, prácticamente el 99% de las páginas web del mundo ya que la presencia en los buscadores es esencial, digan lo que digan, para generar marca, para generar tráfico, para no perder presencia en Internet y un largo etcétera.

Estadísticas en Trovit (widgets & twitter)

Desde hace ya un tiempo estamos dando un énfasis especial a los datos estadísticos que calculamos con nuestro catálogo de anuncios, de esta manera podemos ver precios medios de pisos en venta por ciudades o regiones en el vertical de casas, como por ejemplo precios medio de los pisos en Valencia, o por marcas y modelos en el vertical de coches, por ejemplo precio medio del renault clio, y ahora también en el vertical de empleo, como por ejemplo salario medio de director comercial en Madrid.

Pero estos datos no solo se pueden ver en la web de Trovit ya que hemos desarrollado unos widgets para que todo el mundo pueda ponerse en su blog o página web estadísticas que puedan ser de interés para sus lectores. Por ejemplo para este blog puede ser de interés una comparativa entre programador php y programador java:

Trovit

O la evolución histórica del precio medio de los pisos de alquiler en Barcelona:

Trovit, ¿Buscas Casa? – Alquiler pisos barcelona

Y aunque quizá no sea muy útil, pero para poner los 3 ejemplos, el precio de venta de un Audi TT dependiendo del año de fabricación:

Trovit, ¿Buscas Coche? – Audi TT

Y para rizar el rizo… también disponemos de un servicio para Twitter que nos permite saber a través de un twitt el sueldo medio de una profesión, para ello solo tenemos que mandar @trovit_empleo nombre_profesión y recibiremos la respuesta. Más instrucciones en el blog de Trovit.

Hablando de Facebook

facebook_logoCuando digo ‘Hablando de Facebook’ no me voy a poner a analizar las claves de su éxito, aunque por poner un ejemplo tener un gestor de subidas de fotos mejor que algunos servicios de almacenamiento de fotos puede indicar el camino, sino de dos de sus últimos movimientos. En primer lugar la nueva y tan criticada página principal, una especie de twitter con comentarios, muy parecido de hecho a lo que hoy ha anunciado WordPress: una nueva versión de su tema anteriormente llamado Prologue (ahora P2) y que permite convertir un blog de WordPress en un sistema de micro-blogging (una gran elección para empresas de Internet), que parece que confunde más al usuario, y contra la que ya hay grupos que han descubierto como volver a la versión anterior.

He de decir, antes que nada, que a mi no me gusta mucho la nueva página, no se distinguen bien lo que es cambios de estado de los usuarios, con subidas de fotos, publicaciones de enlaces u otro tipo de eventos y principalmente porque la barra lateral, aunque son eventos destacados de tus contactos (aunque no sé realmente como deciden que es destacado y que no) parece publicidad.

En segundo lugar está el tema de los términos de uso, aunque eso quedó en agua de borrajas, ya que la presión de los usuarios hizo que se tirara para atrás, lo que te lleva a pensar el peligro que les puede conllevar a estas redes sociales un cambio que no guste a sus usuarios. Supongo que por eso Tuenti hará referendum para cambiar sus términos de uso (aunque en este caso tras una huelga de usuarios).

Por otro lado hay que hablar de la noticia que he leído hoy en OJOInternet en la que se anuncia que si Facebook sigue con este ritmo de crecimiento será más grande que Google en 2011. Aunque estos estudios de consultoras “independientes” siempre me han parecido bastante inútiles solo he de hacer una comparación, si Pepito, un chico de 11 años, sigue creciendo al ritmo que creció el verano pasado en 2011 medirá 2.85 metros. Es bastante ingenuo pensar que habiendo sido 2008 el año del boom de Facebook, mantendrá ese ritmo de crecimiento durante otros 3 años, por supuesto puede que me equivoque, pero probablemente si buscamos en el tiempo veremos noticias similares, puede que hasta de las mismas consultoras, donde decían lo mismo de Google comparándola con algún otro gigante de Internet.

Finalmente quiero comentar que aunque parezca que no me gusta Facebook, creo que está haciendo un gran porcentaje de su trabajo de una manera espectacular y genial, así que es de esperar que aunque su crecimiento no mantenga esos número tan astronómicos siga ganando adeptos, tráfico y, suponemos, ingresos.