Life changes fast

Life changes fast, without contemplations, we must to be cold and fast, like wind in winter.

Publicado en Personal, [Pe]n[sa]n[do] | Dejar un comentario

Lluvia y uñas pintadas de negro

La ventana estaba entreabierta. Cientos de gotas de lluvia trataban de entrar al mismo tiempo en la habitación para terminar su estrepitoso viaje desde el cielo. Esa habitación en la que tantas noches de lectura, tantas noches de pensamientos, preocupaciones o ilusiones por cosas insignificantes te quitaron el sueño.

Pero esa noche era distinta. Esa noche, una aguja de diamante se quedó sin el surco de un disco de vinilo que no dejaba de girar esperando a que alguien le diese la vuelta para devolverle la caricia de su compañera que tan sola se sentía. Compañera que protestaba con un sonido parecido al que producían las gotas de lluvia cuando chocaban contra la ventana en un intento esta vez de miraros o de quizá, comprender lo que sentíais al besaros.

Decenas, cientos, miles de besos que no se limitaban a una zona en concreto, caricias que no descansaban, no cedían en su tenaz misión de recordar el tacto, la forma, la reacción de cada centímetro de su cuerpo. Mordiscos sin fuerza, sin hambre de carne pero con mucha sed de sensaciones que no eran fáciles de saciar, que tú no querías saciar.

No querías dejar de jugar a desabrochar cada botón de su camisa mientras te hundías en su cuello de tela para besar el cuello que en realidad estabas buscando, emprendiendo un lento camino con tu lengua hacia sus hombros, memorizando su olor para siempre y escuchando con atención cada cambio en su respiración. Ella, optó por levantar tímidamente la parte inferior de tu camiseta a rayas en un intento nada tímido de alcanzar tu piel, notar su calor y dibujar formas en tu espalda con sus uñas pintadas de negro.

Publicado en Escrituras aleatorias, Personal, Sexo | Dejar un comentario

Jugando con ips y redes en php

Por la naturaleza de mi entorno profesional, lidio con conceptos de IT y redes en mi día a día que me ayudan a tener frescos conceptos que aprendí hace ya algún tiempo cursando el temario del programa CCNA de Cisco y del MCSE de Microsoft.

Concretamente en el área de redes, es muy útil saber cómo hacer subredes o saber a qué red pertenece una ip en concreto haciendo operaciones AND binarias con las máscaras y direcciones a evaluar.

Refresco de conceptos

Las direcciones ip se clasifican en lo que llamamos “clases de red” según el número de hosts que dichas redes puedan soportar (siendo un host un ordenador, impresora o cualquier cacharro que conectemos a dicha red).

Usamos comúnmente las siguientes clases de red:

  • Clase C, la más común, que puede tener hasta 254 dispositivos host conectados.
  • Clase B, que puede tener hasta 65.534 dispositivos host conectados.
  • Clase A, que puede tener hasta 16.777.214 dispositivos host conectados.

Para saber de qué clase es una red o una dirección ip, usamos máscaras de red. Las máscaras de red se componen de 4 fracciones y en cada una podemos rellenar hasta 8bits.

En una dirección de clase C tendremos un total de 24bits, en binario podríamos expresarla entonces como 11111111.11111111.11111111.00000000 (24bits = 8bits + 8 bits +8bits + 0bits) y en decimal como 255.255.255.0 .

No necesitamos escribir la máscara completa para indicar que la ip 192.168.1.2 es de clase C por ejemplo, bastaría con indicar al final de la misma que su máscara tiene 24bits de la siguiente forma: 192.168.1.2/24 .

En el resto de clases, tendríamos 8bits para las redes de clase A y 16bits para las de clase B.

Sin embargo, aunque en entornos domésticos o de mediana empresa se usen estas clases de red para crear las redes a las cuales se conecten los ordenadores, servidores e impresoras de la organización, en una empresa que provee servicios de internet o que tiene muchos departamentos, le es muy útil poder partir esas redes en subredes.

Hay escenarios en los que nos interesa tener varias subredes con un número concreto de equipos en cada una de ellas. De esta forma aislamos a qué recursos puede acceder uno o varios equipos de una determinada subred.

Para hacer subredes lo que se suele hacer es usar máscaras de red personalizadas. Por ejemplo, si tenemos la ip 192.168.129.3/18, tal y como hemos visto antes sabemos que su máscara de red tiene 18bits, es decir en binario 11111111.11111111.11000000.00000000 y en decimal 255.255.192.0. Ahora bien, al no tener una máscara de 16bits o de 24, ya que tenemos una fracción de las 4 sin rellenar totalmente por bits en la máscara de subred, no podríamos decir que esa ip pertenece a la red 192.168.129.0/24, ya que esta sería una dirección de red de clase C y la nuestra no pertenece a esa clase.

Para saber a qué dirección de red pertenece tenemos que hacer una operación AND a nivel de bits binarios entre la dirección ip y su máscara de red.

En este caso la operación quedaría así:

Operación con ips

Al final deducimos que la dirección de red a la que pertenece la ip 192.168.129.3 es 192.128.0.0.

También podemos realizar operaciones para saber la cantidad de dispositivos que se pueden conectar a una determinada red o calcular una red que pueda albergar un determinado número de equipos.

Para calcular el número de dispositivos usamos la función 2x -2 donde X es la cantidad de bits disponibles en una subred es decir, el número de ceros que quedan al final de la misma. En la máscara de 18 bits que hemos usado en el ejemplo (11111111.11111111.11000000.00000000) serían 14 los bits disponibles (32bits posibles totales – 18 que estamos usando).

Aplicando la fórmula nos daría un total de 16.382 cacharros que podríamos conectar a nuestra red.

Utilizando php para realizar estos cálculos.

En php disponemos de una serie de funciones y operadores que nos hacen muy sencillo realizar cálculos de este tipo y automatizar este trabajo que de hacerlo manual nos haría consumir tiempo y estaría propenso a errores.

En este escenario utilizaremos tan sólo dos cosas:

  • La función ip2long para pasar una dirección ip separada por puntos a su representación numérica para poder realizar operaciones posteriores con ella.
  • La función decbin, para pasar de decimal a binario.
  • El operador bitwise & que es el que realizará la operación AND a nivel binario.

Volviendo al anterior ejemplo, podemos saber a qué dirección de red pertenece la ip 192.168.129.3/18 de la siguiente forma:


$ip_en_binario        = decbin( ip2long( "192.168.129.3" ) );

$mascara_en_binario   = decbin( ip2long( "255.255.192.0" ) );

$resultado_en_binario = $ip_en_binario & $mascara_en_binario;

echo long2ip( bindec( $resultado_en_binario ) );

Tal y como esperábamos, el resultado que nos devuelve este script es 192.168.128.0, que es la dirección de red a la que pertenece la ip 192.168.129.3/18.

Con este sencillo ejemplo vemos el juego que le podemos sacar a todo esto.

Por un lado se ve de forma clara que si queremos saber a qué red pertenece una ip dada de todas las que tenemos en nuestra empresa, las cuales almacenamos en una base de datos, bastaría con pasar a binario cada ip y compararla al resultado de la operación efectuada en el ejemplo.

Pero lo realmente útil es saber que podemos guardar en base de datos la dirección directamente en binario, ahorrando un espacio importante en la tabla al evitarnos usar un campo tipo texto (clave para el rendimiento con índices en motores como inndb de mysql) y realizar directamente la búsqueda contra el registro que necesitemos.

También podríamos conocer muy fácilmente con la formula que hemos visto antes, el número de equipos que puedo conectar a una red seleccionada y en base a las ips que podríamos tener registradas, los “huecos” e ips disponibles para los equipos nuevos que tenga que conectar a esa red en un futuro.

Publicado en Desarrollo Web, PHP | Dejar un comentario

Idea: servicio que recopila enlaces para ver al final del día o en otro momento

Ya sé lo que pensará la mayoría: esa idea ya existe, se llama readItlater.

Readitlater no me convence porque te obliga a usar sus herramientas o interfaz para guardar los enlaces que quieres leer luego.

Lo que yo propongo es desarrollar un cliente que consuma las apis de los servicios que la gente ya está usando, para no crearle esfuerzos adicionales y sobre todo para no reinventar la rueda.

Por ejemplo, trunk.ly te extrae automáticamente cada enlace que publicas en twitter, en cada RT o actualización. Sin embargo no te guarda los que tienes en favoritos.

Como producto mínimo o una primera fase, sería hacer lo mismo que hace trunk.ly pero añadiendo enlaces de Facebook, los que marcamos como favoritos en Google Reader y que parece que se van a quedar en el olvido tras hacerlo, los de delicious, nuestros favoritos en Flickr, nuestros favoritos en Stackoverflow, los proyectos que seguimos en github y el resto de herramientas online que utilizamos.

Podría también permitirte subir logs de conversaciones de messenger o skype para extraer los enlaces.

Adicionalmente debería poder reconocer tags en descripciones indicados como el carácter #, tener un buen sistema de búsqueda y también tener en cuenta la zona horaria del usuario a la hora de actualizar los datos.

Más adelante se podría complicar más, haciéndolo social, con sistemas de recomendaciones y esas cosas que hacen que una herramienta útil enganche. Evidentemente también crear clientes y las herramientas para guardar directamente en el servicio, pero esto después de comprobar si el producto mínimo funciona.

A priori no le veo por ningún sitio rentabilidad de verdad o un modelo de negocio no relacionado con publicidad, y más si se lanza al mercado español, pero creo que podría ser una herramienta útil, quizá un valor añadido si tenéis ya alguna herramienta de productividad desarrollada.

Publicado en Personal, [Pe]n[sa]n[do], ideas de proyectos | 2 Comments

La importancia de saber inglés para un español

Anuncio profesor de inglés japónSaber inglés es muy relativo, depende del nivel, fluidez de conversación y perfección gramatical que tenga cada uno (y supongo que existen más factores). Pero creo que cualquier persona en España que no se lo tome en serio, está perdiendo oportunidades cada minuto por no tener contacto con este idioma en su día a día.

Soy una persona que hasta hace unos cuatro años, daba mucha importancia a la experiencia y conocimientos técnicos casi en exclusiva, llegando a descuidar temas muy transcendentes y realmente útiles para llegar a conseguir lo que de verdad queremos en esta vida.

Afortunadamente en el mundo tecnológico el inglés está presente en casi cualquier recurso que necesites para avanzar en conocimiento. Sin embargo, hablarlo o estar acostumbrado a escucharlo es ya otro tema.

Por suerte también, para los que nos gustan las series de televisión, en especial las series o películas geek, en España no tenemos los mejores dobladores precisamente, por lo que nos empuja a los que realmente nos gustan estas cosas a escuchar las expresiones originales de los actores.

A pesar de todo esto, sigo viendo que no llegamos a darle la importancia que se merece. Sabemos que es importante, pero no lo priorizamos. Yo hoy en día valoro más mejorar mi inglés que mejorar mis conocimientos técnicos.

Volviendo a España, en este país tenemos un mercado muy pequeño y un número reducido de personas que pueden llegar a dar importancia a las mismas cosas que podemos considerar importantes cada uno de nosotros. Esto hace que estemos en desventaja con otra persona que se encuentre en un país en el que se habla inglés de forma nativa y en la que además, exista más población. Y por si esto no fuese suficiente desventaja, estamos en crisis y esta crisis es de las que se quedan.

No podemos ser los mejores en cualquier cosa y sólo poder comunicarlo a unos pocos y que encima esos pocos, no puedan contratarte, comprarte o escucharte.

Podemos pensar que hablar Español ya es una ventaja lo suficientemente grande porque es uno de los lenguajes más hablados en el mundo o porque podemos comunicarnos con países latinos y buscar oportunidades allí, sin tener que saber inglés. Sin embargo y a pesar de esto, el inglés es el estandar para comunicarse en todo el mundo. Mejor o peor, si estás acostumbrado a lanzarte a hablarlo, tienes muchas más posibilidades de encontrar una oportunidad para conseguir cualquier cosa que te plantees.

Últimamente me estoy tomando mi formación en inglés muy en serio, tanto a nivel personal como profesional. En estos últimos años estoy conociendo a gente de diversas culturas, edades y sectores profesionales a las que puedo consultar mis puntos de vista e incluso dudas en muchos aspectos. Creo que es imposible conseguir tanto contraste de opiniones basadas en experiencia real, aprender tanto de lo que funciona o no en Rusia, Rumanía, Japón o Estados Unidos por ejemplo, de las voces de profesionales con experiencia que se enfrentan a escenarios normalmente completamente distintos al español día a día.

Cada uno sabe a lo que tiene que dar importancia, pero creo que ahora mismo para un español saber inglés es tan importante como saber hacer una regla de tres.

Publicado en Personal, [Pe]n[sa]n[do] | 3 Comments

Fantasmas

“Fuimos entrenados por expertos de todo el mundo para convertirnos en fantasmas en el campo de batalla, tras las líneas enemigas. Algunos pensaron que tan sólo éramos una banda de asesinos degolladores, pero ese nunca fue el caso.”

Ron Guy, RM/30AU – Francotirador.

Publicado en Citas, Personal | Dejar un comentario

Una reflexión sobre el orgullo

Llevo un tiempo pensando sobre la importancia de tener orgullo, sobre todo cuando te tienes que enfrentar a cosas difíciles. El orgullo no te permite acomodarte y te da motivos para ignorar los intentos de los demás por convencerte de que tú no puedes hacer algo.

No te empuja a demostrar nada a nadie, sino a luchar con fuerza para confirmarte, a tí mismo, que eres capaz de todo lo que te propongas y más.

Reconozco que ser orgulloso es malo, yo lo soy y mucho, pero por suerte no soy soberbio. La soberbia a diferencia del orgullo te hacer creer que eres capaz de cosas sin tener la necesidad de trabajar ni adquirir los conocimientos para conseguirlas.

Admiro a la gente que sabe tragarse el orgullo teniendo una serenidad y templanza dignas de admiración. Es algo que trabajo día a día por conseguir.

Esta tarde pensaba en un simil entre el orgullo y una espada samurai. Creo que podría resumir la idea con esta afirmación: el orgullo es como una espada samurai, te permitirá vencer a todo lo que intente atacarte, pero es más elegante cuando está enfundada.

Publicado en Emprendedores, Personal, [Pe]n[sa]n[do] | 2 Comments

Despertar

Esa es la sensación, como un aterrizaje brusco contra el suelo, música que suena con fuerza liberándose del surco de un disco de vinilo, una bofetada de agua fría por la mañana o verse de repente entre la multitud en un vagón de metro cuando sales de tus pensamientos.

Publicado en Personal, [Pe]n[sa]n[do] | Dejar un comentario

Leophard, próximos pasos y dos dudas

A principios de verano os adelanté una primera aproximación sobre lo que iba a ser Leophard, un framework para el desarrollo web con php (sí, otro más).

Pensaba que podría tener una primera versión para Septiembre pero como todo lo que puede complicarse se complica, no voy a poder alcanzar esta meta.

En parte no voy a poder alcanzarla, además de por estar hasta arriba de trabajo (no he podido tomarme ni un fin de semana de vacaciones todavía), va a ser por una serie de cambios que voy a asumir en mi forma de trabajar en general a partir de ahora.

TDD

El cambio más importante que voy a adoptar es aplicar sin excusas TDD es decir, desarrollo guiado por tests. Y lo primero que he empezado a hacer es a escribir los test sin escribir todavía una sola línea de código.

Es cierto que tenía un prototipo funcional con un sistema de enrutamiento, de vistas y controladores muy básicos ya funcionando. Sin embargo, me he dado cuenta de que ningún desarrollo y en especial un desarrollo de este tipo, debe ejecutarse sin asegurarse la calidad que te permiten obtener los test unitarios, siempre que un proyecto se plantee de esta forma desde el principio.

En teoría esto debería hacerme ir más lento al principio, pero creo que merecerá la pena para obtener una arquitectura de calidad y evitar problemas en el futuro.

Ciclos cortos de desarrollo

Cuando me puse a desglosar la complejidad de un framework de este tipo, aun queriendo hacer algo simple y ligero, las posibilidades de complicarlo para intentar cubrir posibles necesidades son difíciles de ignorar.

Por suerte cada vez tengo más control sobre mí mismo acerca de evitar ser demasiado previsor para problemas que no tocan y el objetivo principal del proyecto, que es conseguir un framework ligero y ante todo simple, me ayuda en esta meta.

Dividiré el desarrollo en fases muy cortas para evitar caer en la resolución de problemas no críticos y tener cuanto antes una versión que se pueda usar aunque no cubra todos los problemas que puedan cubrir otros frameworks como Symfony o Kohana.

Propel

Desde un principio he descartado el desarrollo de un orm propio ligero, es una auténtica locura y casi prefiero hacer un gestor de conexiones para PDO que intentar hacer un orm para el mismo.

Propel desde la versión 1.3 tiene una capa orm sobre PDO que funciona muy bien y es bastante más ligera y rápida que Doctrine2. También prefiero Propel a Doctrine2 porque lo encuentro más simple y porque al menos yo, me siento más cómodo usándolo.

De Propel hay dos cosas que no me gustan: la dependencia de Phing (que tiene los días contados) y por tanto de Pear (que lo odio) junto a que los esquemas y configuraciones se escriben en xml. Para esto último me haré una implementación para que estos xml puedan generarse desde php de forma sencilla y menos tediosa.

No obstante dejaré la puerta abierta para otras opciones.

Dudas en formularios y en la vista

Sobre la vista

Tengo una duda en la vista y es que no se por qué modelo decantarme, si por el modelo de herencia de Symfony2 o por el tipo de implementación decorator que teníamos en Symfony1.x.

Por ejemplo, en Symfony 1 teníamos un layout donde cargábamos el contenido de cada controlador en una variable llamada $sf_content. En las platillas usábamos include_component o include_partial para dividir las partes de nuestra aplicación web en la capa de vista. Por defecto la plantilla asociada a un controlador era contenida en la variable $sf_content que se incrustaba en el layout que indicásemos o se devolvía si indicábamos que esa vista no tenía layout.

En Symfony2 vemos un modelo basado en la herencia de vistas, algo que podemos encontrar en otros framework como asp.net mvc. En cada vista se indica el parent, en el que se ha definido un esqueleto de bloques, y se escribe el código html que su parent debe insertar en cada bloque.

Yo prefiero la opción que teníamos en Symfony1.x, pero no las tengo todas conmigo si este es el mejor modelo.

La vista usará la última versión de Smarty, que actualmente es el motor de plantillas más extendido y que más desarrolladores php conocen.

Sobre los formularios

Este es un tema que tengo que analizar con calma pero tengo una cosa clara: quiero que sea simple crear y validar formularios.

En la creación y validación tengo que pensar muy bien cómo hacerlo para evitar que el programador tenga que escribir mucho código o al menos tanto como en Symfony1.4.

Quiero simplificar el proceso a la hora de recibir los datos, hacer el binding y comprobar si es válido.

En symfony deberíamos hacer lo siguiente en el controlador:

  • Comprobar el tipo de método http para procesar el formulario en caso de que sea POST (en el más del 90% de los casos)
  • Hacer un $form->bind($array); para obtener y filtrar los datos
  • Hacer un $form->isValid() para comprobar que el formulario es válido.

Yo prefiero tener algo así en un sólo paso:

  • $form->validate(Request $request, $method=”post”);

Otra opción es que los formularios se validen en el mismo request de la petición, de una forma similar a como se hace con el request validation de asp.net mvc 3.

Es decir, la validación se haría en el mismo request del action del fomulario y no habría que ejecutarla de forma explícita en el controlador.

Tengo que dar unas vueltas a todo esto, sobre todo a la hora de crear los widgets y validadores.

Este será el último post de este tipo sobre Leophard que haga en este blog, intentaré montar un sitio web en las próximas semanas dedicado al proyecto.

Publicado en Desarrollo Web, Frameworks, leophard, proyectos | 8 Comments

La experiencia Starbucks

I Love Starbucks By Beniamino BajHe de hacer una confesión, soy un fan crónico de Starbucks. Cada vez que visito una ciudad que dispone de su presencia siento una necesidad imperiosa de ir a tomarme un Frappucino Venti hasta arriba de nata y a poder ser bañado con chocolate por encima, acompañado siempre de un pastel de queso con frambuesa.

He de hacer otra confesión, no me gusta el café de Starbucks.

Sin embargo, más de una vez he tomado su no delicioso café con leche y a pesar de su sabor, he disfrutado de él hasta el último sorbo.

Es curioso cómo desde la entrada, sea del tamaño que sea el local, se puede sentir un abrigo especial que hace contraste con lo que se puede observar a través de sus ventanas, en especial cuando te encuentras en una ciudad como Madrid, en la que sus calles alimentadas por caminantes hacen contraste con la imagen de otros seres similares sentados en compañía de su portátil, su lector de libros electrónicos, su libro de verdad e incluso de otro ser humano que alimenta la experiencia general de el simple hecho de estar allí, con ese toque auténtico de una conversación relajada a pesar de la lluvia de prisa que se desata en el exterior.

Es el local perfecto para tomarte tu tiempo, oler y sentir el café en el ambiente y sentir también que estás en la sala de espera de un lugar en el que debes tomarte tu desayuno con calma, a pesar de que no estés desayunando, y disfrutar de todo excepto del sabor de tu café con leche, que lejos de estar buenísimo, te hace comprender que lo último que valoras de estar allí es el sabor de dicho café.

Sus sofás verdes, su inconfundible logotipo esférico por lo general muy bien situado dentro y fuera del local, el sonido de las máquinas preparando el café, el ruido inexistente generado por las conversaciones que ves en el local (siempre y cuando el local no esté hasta arriba de personas que confunden Starbucks con Ikea) hacen que las demás cafeterías luzcan como un local donde perfectamente se podrían servir Kebabs, con un profundo respeto a los locales donde se sirven Kebabs, sea lo que sea que estos lleven en sus salsas.

Resumiendo, la experiencia es más importante que el producto.

Publicado en Marketing, Personal, [Pe]n[sa]n[do], branding | 1 Comment