Conservando nuestro código: Dropbox

Supongo que ha estas alturas, casi todos sino todos, conoceréis Dropbox. Para el que no lo conozca, Dropbox es un servicio de alojamiento de archivos en la nube. Podéis leer algo más sobre él en la propia página de Dropbox o en Wikipedia:Dropbox.

Para los desarrolladores puede ser interesante por varios motivos, cada uno tendrá los suyos, tener nuestro código en la nube. Ya sea, por ejemplo, por disponibilidad de poder trabajar desde cualquier lado, o simplemente por seguridad a modo de backup por si pasa algún accidente. Obviamente, este post no aplica para grandes proyecto corporativos ya que estos deberían tener su propio servidores de subversión y servidores de backup, aunque lamentablemente, esto no siempre es así. Luego, todo son pánico, carreras, explicaciones al cliente y presión a los desarrolladores, pero bueno, esto es otra historia.

El post está enfocado más bien a nuestros pequeños proyecto caseros, esos que aunque no son relevantes, son muy importantes para nosotros. Esos en los que trabajas en cualquier sitio en cuanto tienes 5 minutos libres.

Yo voy a proponer dos pequeñas ideas apoyándome en Dropbox. La primera de ellas, está mas relacionada con el backup de nuestros proyectos, y la segunda, con la disponibilidad de estos.

En mi casa, aunque hay varios ordenadores, yo solo utilizo el mío y algún disco duro externo para backups, almacenamiento de datos y demás. Como el disco duro no lo tengo constantemente enchufado, cuando monto un servidor subversión lo hago sobre mi misma máquina, más pensado para controlar las versiones del código que voy escribiendo que pensando en que sea un backup en caso de desastre. Pero claro, un día se produjo este desastre y perdí bastante código, no todo, porque cada semana hago un backup de la máquina, pero si lo suficiente como para que decidiera buscar una solución. Y esta fue Dropbox. Decidí meter mis repositorios dentro de la carpeta de sincronización de Dropbox, y así de forma automática, cada vez que hago un “commit”, toda la información se sube a la nube. Esta fue la primera idea.

Pero, llegó el día en que no llevaba mi ordenador encima, tenía unas horas muertas para malgastar en algo y estaba rodeado de ordenadores, el único problema era que no tenía mi código a mano para trabajar un ratito sobre él. El código estaba en la nube, yo me podía bajar un eclipse en uno de los ordenadores que tenía a mano, pero por razones de capado de puertos, no podía montar un servidor subversión para  bajar el código en él y abrirlo en el eclipse. Y a partir de aquí, fue donde se me ocurrió la idea de meter directamente el workspace de trabajo en la carpeta de Dropbox. De esta forma, fuera donde fuera, con descargar un eclipse (o llevarlo en un USB) podía trabajar sobre mi código en cualquier parte.

Por supuesto, se pueden poner en práctica las dos ideas a la vez sin ningún problema obteniendo así los beneficios de ambas:

a) Tener a buen recaudo nuestro código y el versionado de este.

b) Tenerlos a nuestro alcance para trabajar en todo momento.

Espero que a alguno os sirva. Si alguien tiene algún método más sobre como ha resuelto el problema, que se anime a comentarlo. Nos vemos.

Kiai – Katas

No, no me vuelto loco ni nada parecido. Hoy vamos a hablar de Katas, pero no las que estáis pensando pertenecientes a algún arte marcial, sino de unas que os van a ayudar a fortalecer vuestro cerebro y vuestras habilidades como desarrollador.

Como muchos sabréis, aunque en el blog suelo escribir sobre temas enfocados a seguridad, realmente yo soy desarrollador. Estos últimos años principalmente de Java EE, aunque he pasado por unos cuantos lenguajes, pero esto, es una historia para otro día.

Pues bien, una de las cosas que obviamente hago en casa en mis ratos libres es desarrollar, ya sea algún proyecto propio, o simplemente, algún código pequeñito para solventar un problema puntual. A raíz de esto, descubrí las Katas de programación. Pero, vamos a empezar por el principio. ¿Qué es una kata? Según la Wikipedia, y estoy seguro que todo el que haya hecho artes marciales estará de acuerdo, una kata describe una serie de secuencias o movimientos preestablecidos que persiguen un fin. ¿Quién piensa que no se parece a una de las definiciones de algoritmo?

Una vez dicho todo esto, una kata de programación, no es más que un pequeño problema de programación que persigue resolver un problema en un tiempo finito de unos 30 o 40 minutos. El objetivo de estas katas es, por un lado, desarrollar nuestros propios algoritmos para resolver la kata en ese corto espacio de tiempos, y por otro lado, ver la solución que le da otra gente a ese mismo problema. Además, estas katas son independientes del lenguaje, con lo cual, cada uno puede solucionarlas en el lenguaje que mejor le parezca. Y para añadirle un poco más de emoción, se pueden implementer utilizando “Extreme Programming” por parejas.

A raíz de descubrir estas katas, he encontrado un página en Internet llamada “12 meses 12 katas”. El objetivo, como ellos dicen es:

Un mes una kata, ¡mejora tu arte y compártelo con los demás! Ese es el objetivo principal de esta iniciativa que nace de una comunidad preocupada por mejorar sus habilidades y así crear software de más calidad.

Yo he empezado recientemente con la implementación de estas, y por un lado me estoy divirtiendo mucho picando el código, y por otro, estoy aprendiendo cosillas viendo el código de los demás.

Os recomiendo que le echéis una ojeadilla si os gusta programar y tenéis poco tiempo para hacerlo.

Bueno, como siempre, si tenéis dudas, sugerencias y/o conocéis alguna otra página de katas, estaría bien debatirlo. Nos vemos.

Bromas con PHP – Clonar Web

Si, lo se, este post no es nada serio, pero hay veces que estás conversando con alguien y no puedes evitar dejar correr la mente y hacer alguna tontería. Pues bien, hoy es uno de esos días. De un modo u otro, hoy ha salido el tema de como clonar una página web en nuestro propio servidor, no descargarla y tenerla offline, sino tener una página (una fuente) en php que sea capaz de hacerse pasar por la web clonada. Como la idea es solo hacer un pequeño experimente, pues hemos ido a lo básico, una página de un blog. Para el caso se ha elegido la de SecuritybyDefault (esperemos no se cabreen). Y la verdad es que los resultados han sido bastante mejores de lo esperado. Con solo un par de líneas hemos conseguido hacer un clon de ella. Solo de la página principal, pero si tuviéramos un formulario de registro, la petición se realizaría desde nuestro servidor (da que pensar). El código inicial ha sido algo así:

<? 
$html = file_get_contents('http://www.securitybydefault.com');
echo $html;
?>

Sorprendentemente, teníamos que nuestra página era capaz de reproducir la de securitybydefault a la perfección. Aquí, se ha comentado, que lo que primero suele hacer un usuario cuando accede a una página es navegar por sus links, con lo cual mediante el sistema creado hasta ahora, en cuento el usuario haga click en un enlace, volverá al dominio correcto.

Aquí, como primer experimento, hemos decidido coger una página html con varios enlaces. Por ejemplo, una así:

<html>
<head>
<title>pruebas</title>
</head>
<body>
<a href="www.google.com">Google(EN)</a><br />
<a href="www.google.es">Google(ES)</a><br />
<a href="www.yahoo.es">Yahoo</a><br />
<a href="www.microsoft.es">Microsoft</a><br />
</body>
</html>

Obviamente, si esta página la clonamos con nuestro sistema, en cuanto el usuario haga click en alguno de los enlaces, abandonará nuestro servidor para irse a uno de los correctos  ¿Cual es el problema? Los enlaces, deberíamos cambiar estos para hacer llamadas a nuestro clonador con las nuevas direcciones, así clonar la nueva página solicitada, pero permanecer en nuestro servidor.

Pues dicho, y sorprendentemente hecho.

<?
$url = $_POST['url'];
if(!empty($url)) {
$patternHref = "/href=\"(.*?)\"/is";
$html = file_get_contents($url);
$insertCode = "<script language=\"javascript\" type=\"text/javascript\">
function redirectUrl(destination) {
window.localtion.href = 'cloner.php?url=' + destination; }
</script></head>";
$htmlConstruida = str_replace("</head>", $insertCode, $html);
$matches = array();
preg_match_all($patternHref, $htmlConstruida, $matches);
for($i = 0; $i < count($matches[0]); $i++) {
$htmlConstruida = str_replace($matches[0][$i],
          "href=\"javascript:redirectUrl(" . $matches[1][$i] .");\"",
          $htmlConstruida);
}
echo $htmlConstruida;
}
else
{
?>		
<html><head><title>Cloner v0.1</title></head><body>
<form name="urlCloner" method="POST" action="cloner.php">
Url: <input type="text" name="url" size="60"/>
<input type="submit" value="Submit" />
</form></body></html>
<? } ?>

Como podéis ver lo único que se hace, es a través de expresiones regulares, hacer un par de inserciones y modificaciones en el código de la página que vamos a clonar, algo que no las afecte visualmente, pero si afecte su funcionamiento.

Una de las cosas que se hace es insertar una función javascript (redirectUrl) que llamará a nuestro clonador con una url que reciba. La otra modificación que se hace es la de remplazar los enlaces por llamadas a nuestra función manteniendo las url’s de estos.

De esta forma el ejemplo de página html que hemos visto antes, quedaría de está forma al clonarlo:

<html>
<head>
<title>pruebas</title>
<script language="javascript" type="text/javascript">
function redirectUrl(destination) {
window.localtion.href = 'cloner.php?url=' + destination; }
</script>
</head>
<body>
<a href="javascript:redirectUrl(www.google.com);">Google(EN)</a><br />
<a href="javascript:redirectUrl(www.google.es);">Google(ES)</a><br />
<a href="javascript:redirectUrl(www.yahoo.es);">Yahoo</a><br />
<a href="javascript:redirectUrl(www.microsoft.es);">Microsoft</a><br />
</body>
</html>

Ahora, aunque el usuario navegue por la página, seguirá estando en nuestro servidor sin tener que tener un montón de páginas almacenadas en él.

Como todo esto era un experimento para pasar el rato, y el rato ha pasado, pues aquí nos hemos quedado. Obviamente no creo que funcione en todas las páginas, ni que reconozca todos los enlaces, por ejemplo, aquellos que en vez de comillas dobles sean con comillas simples, solo sirve para navegar por partes públicas de la aplicación, ya que no clona sesiones ni ningún tipo de seguridad, los enlaces al pasar el ratón sobre ellos se ven modificados, etc… pero bueno, aquí lo dejo. Como se suele decir, es un experimento de laboratorio, donde todo esta controlado, no pasa de ser una curiosidad. Cualquiera es libre de coger el código y seguir jugando con él, y por supuesto de comentarlo aquí. Ya sabéis GPL y esas cosas. Nos vemos.

TryParse

Acabo de descubrir paseando por ahí y leyendo cosillas, una nueva incorporación a C# de .NET a partir de la aparición de “.NET Framework 2.0“.
Seguro que a más de uno se sonará haber escrito más de una vez algo así para convertir un string en algún tipo de valor:

string numero = “1″;
int resultado = 0;

try
{
resultado = int.Parse(numero);
}
catch (Exception e)
{
//Aquí el error
}

Bien pues esto se va a terminar con la llegada del “TryParse“. Este método devuelve true si se ha podido realizar la conversión y false en caso contrario. además de conseguir en valor de la conversión realizada.

string numero = “1″;
int resultado = 0;

if(!int.TryParse(numero, out resultado)
//Aquí el error

Como se puede ver se recorta considerablemente el número de lineas necesarias además de clarificar, en mi opinión el código. Por supuesto, aunque el ejemplo esta hecho sobre un dato de tipo entero, se puede relalizar con todos o casi todos los tipos de datos; Boolean, Byte, DateTime, Char, Decimal, Double, Int16, Int32, Int64, SByte, Single, UInt16, UInt32, UInt64.

Para mas información os recomiendo pasar por las páginas de MSDN Library.

Bueno, hoy espero haber contribuido a que el dicho ese de “nunca te acostarás sin aprender nada nuevo” se haya hecho realidad.