Category Archives: Desarrollo

WordPress y ‘connection reset’ en RedCoruna

Pequeño apunte rápido, que hoy he estado peleándome con WordPress y Firefox. Resulta que a raíz de un ataque de spam masivo a WordPress, los de RedCoruna pusieron una protección en su hosting que resetea las conexiones si el navegador sólo acepta páginas en inglés. En mi caso, que tengo todo el Mac en inglés, no me dejaba acceder a WordPress a través de Firefox.

La solución es sencilla: En Preferencias -> Contenido -> Idiomas, añadir “español” (el orden no importa) y recargar.

Pequeñas maravillas: Migrant

El otro día, buscando serializadores eficientes para Ocell, me encontré con esta pequeña maravilla del código: Migrant. Lo que más me llamó la atención no es lo que más publicitan en su repositorio (el soporte de serialización de grafos complejos de objetos), sino su serializador generado.

Para serializar datos (guardar un objeto de  memoria a un archivo), lo más rápido es la serialización binaria. Es, por así decirlo, como volcar los bits de memoria al archivo tal y como están. Ahora bien, hay un problema: ¿qué pasa cuando queremos guardar objetos diferentes? Hay que guardar en el archivo información de qué tipo de objeto es y qué campos tiene. El deserializador tiene que encargarse de leer esos datos y generar el objeto en memoria, normalmente usando Reflection, un proceso bastante lento. La principal ventaja es que no es necesario escribir un (de)serializador para cada tipo de objeto que vayamos a guardar. A cambio perdemos en velocidad.

Migrant coge un enfoque mixto. Al serializar un objeto, lo que hace es generar un serializador binario específico para esa clase, usando System.Reflection.Emit. Por así decirlo, programa automáticamente el serializador, lo carga como si fuese una clase que hayas escrito normalmente y es lo que usa para serializar. Los resultados son bestiales: es rapidísimo en cuanto vayamos a serializar colecciones grandes.

Es una verdadera lástima que no pueda usar System.Reflection.Emit en Windows Phone, porque Migrant me vendría genial.  Es muy, muy original y además extremadamente fácil de usar. Merece la pena no perderle de vista.

Overkill

Andaba yo leyendo reviews del Galaxy Gear vía Javipas y me he encontrado con una perla en Gizmodo.

There’s so much lag (likely due to the lowly 800MHz processor and half a gig of RAM), that you often don’t know if it didn’t read your touch or if it’s just hesitating.

Aunque yo cuando lo probé durante unos minutos no noté lag (y de hecho el resto de reseñas tampoco tratan especialmente este aspecto), me ha hecho pensar en algo más bien relacionado con el desarrollo y programación, algo que más de un profesor de mi universidad ha dicho en alguna clase. Continue reading

Tweetsharp for the Portable Class Library

Tweetsharp is a .NET library to connect with Twitter. Complete, easy to use, but with a little problem: it’s platform-depending. That means you can’t use it on PCL projects. For me, it was a big problem: Ocell depends heavily on Tweetsharp. I wanted to refactor the code, moving the ViewModels to a PCL project (it’s easier for testing, it would simplify the creation of a Windows Store app too) but I couldn’t do that with Tweetsharp being platform-dependent. So, open-source to the rescue, I forked it and migrated it.

Continue reading

Detecting WP8 LongListSelector’s end of scroll (stretching)

In Windows Phone 8, the new LongListSelector removed support for the Stretching events, which allowed your app to react when the user scrolled beyond the end of the list. With this events, you could easily implement pull to refresh behaviour. I’ve created a small class which detects this behaviour of the LongListSelector and fires an event accordingly. It’s fairly simple and doesn’t require any additional dependency.
This class listens to the change of manipulation state of the LLS, to the MouseMove event (in WP, this event is triggered when the user moves the finger through the screen) and to the ItemRealized/Unrealized events. Listening to MouseMove,  we can calculate the amount of finger movement. That is, we can detect when the user has scrolled the list. Continue reading

Software libre de pago

Tengo por ahí una aplicación, un cliente para Twitter. Se llama Ocell (pájaro en catalán, es lo mejor que se me ocurrió). Empezó como un proyecto de prueba, a ver cómo era eso de programar para Windows Phone. Me gustó, y decidí publicarlo en la Windows Phone Store. Y además, como me apetecía, lo subí a Github con licencia Apache. Hace casi un año de eso.

Poco a poco he ido mejorando el cliente. Según he ido aprendiendo más C# (no sabía prácticamente nada cuando empecé) he ido implementando más cosas, mejorando características, borrando código que me ha hecho llorar de lo feo que era… Todo esto, manteniendo la aplicación de forma gratuita. Estaba invirtiendo mi tiempo, pero como no tenía que pagar nada (ventajas de la MSDN Academic Alliance) pues seguí manteniéndola a 0€.

El problema es que había una característica que pedían bastante los usuarios: notificaciones push. ¿Cuál es el problema? Que necesitaba un servidor. Y, amigo, un servidor para notificaciones push que soporte mínimo mil usuarios (en el momento en el que me lo planteé tenía unas 2.000-3.000 descargas) no es precisamente barato. Y una cosa es invertir tiempo y otra abrir un agujero en mi cuenta corriente para financiar el servidor.

Así que me lo planteé: ¿puedo subir una versión de pago y mantener Ocell como software libre? Por supuesto que sí. Pero claro, la versión de pago es algo especial.

Lo primero, todas las características que no tienen que ver con el servidor (salvo la integración con Buffer) están en las dos versiones, tanto la gratuita como de pago. Esto me permite liberar el código ocultando las cadenas de conexión al servidor (es decir, no subiéndolas al repositorio) de forma que nadie (teóricamente) puede usar mi servidor de gratis.

Por otra parte, está la integración con Buffer. ¿Por qué sólo en la versión de pago? Pues es más bien un experimento de marketing. Plantearme cuánta gente pagaría por Ocell sólo porque se integra con Buffer. Supuse que cualquiera que necesite integración con Buffer en su cliente de Twitter es un pro de las redes sociales, así que Ocell valdrá para él más de lo que está pagando. Y como no mucha gente lo necesita, tampoco molestará mucho mi experimento.

Con la versión 4, lancé de forma paralela Ocell Pro. Precio 1,29€. Me gusta bastante ese precio: es más que 0,99€ y menos que 2€. Es decir, sigue siendo barato pero da la sensación de tener algo más de valor que una aplicación a 0,99.

Ocell Pro apenas lleva un mes y no me he dedicado a promocionarla demasiado. Prefería ir poco a poco para detectar los fallos (aunque he detectado algunos que no he podido corregir hasta hace poco). No hay ni popups enormes para comprar Ocell Pro, ni estoy spameando en Twitter continuamente, ni he enviado mensajes a blogs para que hablen de ella. Ahora mismo, un usuario normal de Ocell sólo sabe que existe Ocell Pro si le da por pulsar el botón de Buffer, o de intentar activar las notificaciones push en Opciones (y, por lo que veo, muchos usuarios pasan olímpicamente del menú de opciones). Aun así, los resultados son muy buenos.

Estas descargas incluyen la versión de prueba y la de pago.

Estas descargas incluyen la versión de prueba y la de pago.

Conclusiones

¿Se puede vender algo que está disponible para descarga gratuita? Por supuesto. Lo único que hay que hacer es que sea infinitamente más fácil pagar que descargarlo de forma gratuita. En mi caso, si quieres puedes tener Ocell de forma gratuita. Bájate el código, pon tus tokens de Twitter, compílalo con Visual Studio, mételo a tu teléfono y listos. Y si eres todo un pro de la programación, te bajas un módulo de notificaciones push para Ruby o algo así (seguro que los hay) y lo adaptas a la aplicación. Tampoco es tan difícil, la mayor parte ya está hecho y depurado. Y quizás en algún momento libere el código del servidor (ahora mismo me da una vergüenza enorme, mi experiencia en servidores es 0 y el código lo refleja bastante bien) así que estará todo más fácil. Aun así, sigue siendo un esfuerzo considerable, mucho más que pulsar un botón y gastarte 1,29€.

Al final es lo que siempre decimos: si quieres vencer la piratería, pon fácil que los usuarios compren tu aplicación. No hay otra forma. O mejor dicho: no hay otra forma honesta de hacerlo, al menos desde mi punto de vista.

El hecho de que Ocell sea software libre también abre la puerta a posibles copias de mi aplicación. Pero no me importa demasiado.¿Quieres mejorar Ocell y venderlo en la Store? Genial me parece. Mientras no uses el nombre y logo de Ocell y no te conectes a mi servidor (para eso lo pago yo), me parece perfecto. Algunos dirán que esto es una amenaza para mi “modelo de negocio” (que yo no llamaría a la chapuza que he hecho modelo de negocio, pero bueno). En realidad, no lo es. Si quieres basarte en mi código, lo mejoras, lo vendes y me superas, enhorabuena, te lo mereces. Si lo copias y lo vendes más barato: tienes difícil hacerlo. La mayor parte de las características son gratis, y no creo que consigas hacer nada más barato que eso. Y si quieres vender las notificaciones push gratuitas… Pues adelante. Y me compadezco de tu cartera.

Ah, y una última cosa: la mayor parte de las características son gratuitas por el hecho de que no creo que deba cobrar por ellas. No porque sea la forma de evitar que me copien.