sisè / segona

Soy Víctor Rodríguez, programador web freelance con más de 10 años de experiencia

Herramientas de evaluación de código fuente

Hola, os voy a dejar una pequeña nota sobre estas herramientas, las de evaluación de código fuente. Hasta ahora no había trabajado con ninguna y la verdad es que me han sorprendido.

Son herramientas que permiten evaluar la ‘calidad’ del código que programas, basándose en unas reglas de conveniencia (estándares de codificación), permiten evaluar distintos tipos de errores, desde cosas convencionales como que te has dejado un bracket en una sentencia if hasta recomendarte usar un tipo de objeto en vez de otro (ej: StringBuilder vs StringBuffer, el Builder es asíncrono y gana éste en tiempo de ejecución).

Estas herramientas son útiles, sobre todo, en proyectos compartidos, así todos los programadores se fijan en programar con una normativa única y hace más legible el código y con menos rasgos de quien lo ha codificado.

Un ejemplo de estas herramientas es SonarQube, es con la que estoy trabajando actualmente y te da estadísticas de las incidencias que hay en tu código y también permite inspeccionarlo, no se escapa nada.

Un saludo!!

Crear un Servidor VPN con OpenVPN en tu Mac

Hayer configuré una VPN en un Mac-mini que tengo en casa con OpenVPN, la idea es tener conexión externa a este «servidor» en el día a día de mi trabajo. Una nota que creo necesaria hacer, la versión del OS X utilizada es la 10.6.8 (Snow Leopard) y no la más reciente Maverics porque no lo puedo instalar por ser un Mac-mini viejuno.

Al grano. Para configurar tu servidor VPN hay que seguir las directrices que ponen aquí: en concreto desde aquí hasta aquí son suficientes.

Para los pasos previos (instalación y tal) he usado MacPorts (openvpn2) y como cliente uso Tunnelblick en el portátil para conectarme como cliente.

Si has seguido los paso ya tienes la VPN creada y desde el cliente te has podido conectar. O no. Y es que me he encontrado con varios problemas.

Por ejemplo, para poder conectarme he tenido que usar un puerto TCP en lugar del UDP que se configura por defecto. Por alguna razón el Mac Mini, con Mac OS 10.6.8, no me deja abrir los puertos UDP usando el firewall que lleva instalado (ipfw).

Para conectarme desde mi red local he tenido que configurar dos remote en el fichero server.conf, uno con la IP pública y otra con la IP interna del servidor.

Si no te puedes conectar, aunque el firewall del servidor esté apagado desde Preferencias del Sistema, es muy posible que tengas que abrir el puerto desde la línea de comandos. Para abrir el puerto por línea de comandos debes ejecutar el siguiente comando:

sudo ipfw add 40000 allow tcp from any to any dst-port portnum

Donde 40000 es la regla que creas y portnum el puerto que quieres abrir. (para más información man ipfw)

Pero esto lleva a otro problema. Al crear la regla en el firewall (ipfw) desde línea de comandos, al reiniciar el Mac-mini, esta regla desaparece. Así que para que quede configurado de manera permanente te puede ayudar algún programa como NoobProof.

Una última cosa que nos queda es configurar un daemon en el servidor para que se lance como servicio cada vez que se pone en marcha. Creamos el fichero:

/Library/LaunchDaemons/org.openvpn.plist

Y le añadimos este código:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd";>
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>org.openvpn</string>
    <key>OnDemand</key>
    <false/>
    <key>Program</key>
    <string>/opt/local/sbin/openvpn2</string>
    <key>ProgramArguments</key>
    <array>
      <string>openvpn</string>
      <string>--config</string>
      <string>/etc/openvpn/server.conf</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>TimeOut</key>
    <integer>90</integer>
    <key>WorkingDirectory</key>
    <string>/etc/openvpn</string>
  </dict>
</plist>

Ten en cuenta que las líneas:

<string>/opt/local/sbin/openvpn2</string>

y

<string>/etc/openvpn/server.conf</string>

las tendrás que adaptar a tu configuración. Una vez lo tengas, para lanzar el daemon tienes que usar este comándo:

launchctl load -w /Library/LaunchDaemons/org.openvpn.plist

A estas alturas ya deberías ser capaz de conectarte tanto desde tu red LAN como desde fuera de ella (si has abierto el puerto correspondiente en tu router).

Yo lo he conseguido :P

Frameworks PHP: Laravel

Hace unas semanas se me presentó la oportunidad de trabajar en un proyecto. Y aunque parece que va a ser que no, me «obligó» a buscar un framework PHP con el que me sintiera cómodo y con el que se puedan realizar proyectos de un tamaño medio o grande.

Haberlos haylos que dicen Galicia. El primero que se te viene a la mente suele ser Symfony, pero tiene una línea de aprendizaje larga. Con Zend he llegado a trabajar, sus módulos son buenos pero hay que tirar de configuración para casi todo. CakePHP o CodeIgniter son otros de los que he oído hablar «maravillas». Y buscando encontré Laravel.

La web de Laravel lo define como

THE PHP FRAMEWORK FOR WEB ARTISANS. PHP THAT DOESN’T HURT. CODE HAPPY & ENJOY THE FRESH AIR.

Como casi todos, es un framework MVC. Pero sus puntos fuertes creo que son usar principios que ya conocía de Ruby on Rails, un ORM basado en ActiveRecord, Eloquent y primar la convención sobre la configuración. Además tiene una manera sencilla de crear y usar librerías de terceros mediante Composer y gran parte de su código está basado en los módulos ya probados y fiables de Symfony.

Algo que también ayudó a entenderlo mejor y a que me gustara fue que encontré una serie de posts escritos por Phillip Brown en Culttt (tag Cribbb). Muy recomendable.

Trabajar con SpringJDBC y PKs autoincrement

Hola, para aquellos que quereis currar sin SEQUENCES, porque pueden provocar excepciones de PK duplicada si no se hace bien, Spring te recomienda esto en su documentación de referencia 13.2.7 Retrieving auto-generated keys.

Por otro lado, yo siempre he trabajado con el objeto jdbcTemplate llamando a la funcion update(String sql, Object… params) de esta manera creo un ArrayList de objetos y, junto a la query, le paso los parametros sin preocuparme de qué tipo son cada uno.

Para poder mezclar ambos casos existe el objeto ArgumentPreparedStatementSetter así, en vez de hacer para cada parámetro algo como esto ps.setString(1, name); podemos usar su funcion setter.setValues(ps);

Os dejo un pequeño ejemplo:

StringBuffer sbQuery = new StringBuffer("INSER INTO user (username, password, name) VALUES ");

sbQuery.append(" (?, ?, ?) ");
List<Object> vParams = new ArrayList<Object>();
vParams.add(user.getUsername());
vParams.add(user.getPassword());
vParams.add(user.getName());

final String query = sbQuery.toString();
final ArgumentPreparedStatementSetter setter = new ArgumentPreparedStatementSetter(vParams.toArray());

KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(
  new PreparedStatementCreator() {
    public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
      PreparedStatement ps = connection.prepareStatement(query, new String[] {"id"});
      setter.setValues(ps);
      return ps;
    }
  }, keyHolder);

user.setId((Long) keyHolder.getKey());

Un saludo!!

Hay un nuevo freelance en la ciudad

Hace días que le estoy dando vueltas a la idea de trabajar por mi propia cuenta y, qué demonios, lo peor que me puede pasar es que dentro de 3, 6 o X meses tenga que volver a buscar trabajo por cuenta ajena. Que gran expresión, por cuenta ajena :P

Pues eso, si tienes un proyecto que necesite los servicios de un programador freelance o conoces alguien que lo necesite estoy disponible para contratar hoy mismo.

Tengo una experiencia laboral de más de 10 años como programador en entornos web. Conozco Java (certificado hace 7 años), Php y Ruby on Rails principalmente. Maquetar y dinamizar con Javascript (JQuery for the win) tampoco se me dan mal.

¿Cómo contactar conmigo?
Puedes hacerlo a través de mi perfil de Linkedin o puedes mandarme un mail a victor@rodriguezortega.com, como te vaya mejor. Explícame el proyecto que quieres hacer, te hago un presupuesto y si llegamos a un acuerdo montamos una fiesta! Bueno, eso no hará falta, solo te prometo mimar tu proyecto para que quedes satisfecho.

¡A qué esperas!