sábado, 21 de enero de 2012

Como traducir tus posts


he estado buscando la manera de traducir los post de blogspot, donde tengo alojado este blog,  pero no he encontrado nada. Así que me he puesto manos a la obra y he escrito un poco de javascript para añadir esta funcionalidad a mi blog. La idea es muy sencilla, el post contiene ambos textos, en inglés y en español, y mediante jQuery muestro uno u otro. También leo el parametro lang de la url para determinar en que idioma se debe mostrar el post para poder crear links en el idioma deseado.


<title>
<span class="es">titulo en español</span>
<span class="en">English title</span>
</title>
<div class="es">
<a href="#" onclick="translate();">translate</a>
</div>
<div class="en">
<a href="#" onclick="translate();">traducir</a>
</div>
<div class="es">
html en español
</div>
<div class="en">
English's html
</div>
<div style="display:none">
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(init);
function init() {
language = getParameterByName("lang");
switch (language)
{
case "en":
$(".en").show();
$(".es").hide();
break;
default:
$(".es").show();
$(".en").hide();
break;
};
};
function translate(){
$(".es").toggle();
$(".en").toggle();
};
function getParameterByName(name)
{
name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
var regexS = "[\\?&]" + name + "=([^&#]*)";
var regex = new RegExp(regexS);
var results = regex.exec(window.location.href);
if(results == null)
return "";
else
return decodeURIComponent(results[1].replace(/\+/g, " "));
};
</script>
</div>
view raw translate.html hosted with ❤ by GitHub



Lo peor de todo es que ahora voy a tener que traducir los posts :(




viernes, 20 de enero de 2012

[Erlang] - Añadir un timer a un gen_server

En un proyecto que estoy desarrollando con Erlang necesito realizar unas comprobaciones periódicamente. El proyecto está basado en Erlang/OTP y para realizar dichas comprobaciones he añadido un gen server que, entre otras cosas, ejecuta un 'timer' periódicamente. En este post voy detallar el proceso que he seguido para añadir un 'timer' periódico a un gen server.

El proceso es muy simple, se envía un mensaje periodicamente al gen server con un mensaje concreto, y en la recepción de dicho mensaje realizamos la tareas necesarias, en este ejemplo mostramos un texto por pantalla.

Para realizar las llamadas periódicas al timer vamos a usar la función timer:send_interval/2.
send_interval(Time, Message) -> {ok, TRef} | {error, Reason}

Esta función se envía a sí misma el mensaje 'Message' repetidamente con un intervalo indicado en milisegundos (Time). Es decir, cada 'Time' milisegundos ejecuta 'Pid ! Message', donde el 'Pid' es el del proceso que lo ejecuta (Pid = self()).

Para leer el mensaje recibido en el gen_server utilizo el módulo handle_info/2.

A continuación se puede ver el código completo del gen server con un 'timer' periódico cada segundo.

%%%-------------------------------------------------------------------
%%% @author Pablo Vieytes <mail@pablovieytes.com>
%%% @copyright (C) 2012, pablo
%%% @doc
%%%
%%% @end
%%% Created : 20 Jan 2012 by Pablo Vieytes <mail@pablovieytes.com>
%%%-------------------------------------------------------------------
-module(timer_gen_server).
-behaviour(gen_server).
%% API
-export([start_link/0]).
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
-define(SERVER, ?MODULE).
-record(state, {}).
%%%===================================================================
%%% API
%%%===================================================================
start_link() ->
gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
%%%===================================================================
%%% gen_server callbacks
%%%===================================================================
init([]) ->
Milisegs = 1 *1000,
timer:send_interval(Milisegs, periodic),
{ok, #state{}}.
handle_call(_Request, _From, State) ->
Reply = ok,
{reply, Reply, State}.
handle_cast(_Msg, State) ->
{noreply, State}.
handle_info(periodic, State) ->
io:format("timer testing~p", []),
{noreply, State};
handle_info(_Info, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.

sábado, 14 de enero de 2012

[Git] - Moviendo trabajo pendiente

En mis desarrollos, tanto personales como los profesionales, uso git. Tengo varias máquinas y a veces necesito mover trabajo inacabado de una a otra. No se debería hacer un commit con código que no funciona o sin terminar, o por lo menos este código no debería quedar almacenado en el arbol una vez terminado el trabajo. A continuación voy a poner la secuencia de comandos que sigo para subir al repo código sin terminar de manera temporal y como lo integro en la rama final una vez terminado.

Partimos de la máquina #1 con modificaciones de código pero incompletas, hacemos lo siguiente:

git stash
git checkout -b working-branch
git stash pop
git commit  -m 'working'
git push oringin working-branch


Maquina #2
Actualizamos  el código código con git pull
nos ubicamos en la rama que deseemos seguir con el trabajo que estabamos realizando y compiamos el commit que hemos llamado 'working'
git cherry-pick  <commit-ish>
seguimos trabajando hasta tener el código terminado y hacemos un nuevo commit con la opción --amend
git commit --amend -m 'mensaje definitivo'