Monthly Archives: junio 2015

tecnología

Trello, el arma secreta para el developer desorganizado

Todo buen developer al menos una vez en su vida ha defendido que ser desorganizado es una virtud. Pero muy similar a la teoría de la relatividad de Einstein, la desorganización es relativa al estado de movimiento ánimo del observador. Teoría confirmada mil veces por mi madre y luego validada a través de mis jefes de trabajo.

Recientemente leí un artículo muy bueno titulado “The most important skill in software development”. El artículo no es muy largo como para hacer un tl;dr del mismo pero trata sobre la virtud de organizar algo. En este caso coding y cómo esta característica es crucial aun contando con un conocimiento técnico elevado.

Curiosamente esa semana me encontraba en una especie de catarsis sobre que en tecnologías debo enfocar mis energías y que cosas estoy haciendo o dejando de hacer para lograr esas metas técnicas. Una de las ideas que analice fue precisamente el cómo estoy organizando mi tiempo y cómo estoy manejando mis proyectos.

Llevando usando un web app por bastante tiempo para manejar prácticamente todo lo relacionado a como organizarme y poder visualizar hacia donde debo dirigir mi atención. Esa herramienta es Trello. No hay dudas que ha sido de gran utilidad y les voy a explicar porque y como lo he incorporado a mi rutina de desarrollo. Primero veamos que es Trello.

Trello es una aplicación que permite crear boards que se componen de listas, organizadas a través de tarjetas que puedes, si lo deseas, compartirlas entre diferentes miembros de un equipo. El factor del sharing es de gran utilidad pero igual funciona si eres un solo developer. Todo proyecto de software posee cierto grado de complejidad. No importa lo sencillo que pueda sonar al momento de la implementación debemos tener claro como lo vamos a ejecutar. Por tal razón cuando trabajamos desarrollando software debemos procurar organizarnos de la mejor manera posible. La calidad del código no depende de cuan robusto sea nuestro stack. Depende de cuan organizado y claro es nuestro trabajo. Ya seas que persigas las tendencias de Personal Kanban o en mi caso Scrum, Trello es un gran candidato para ser usado como herramienta de Project Management y Task Tracking. Adobe lo usa en el desarrollo de Brackets.

Scrum example

¿Que lo hace tan especial?

Trello es un gran software y es gratis. Es creado por la gente detrás de Stack Exchange (ya sabes StackOverflow?) y su mascota es un perro Husky llamado Taco. Sus aplicaciones mobile en iOS y Android son geniales y todo se mantiene finamente sincronizado. Con Evernote he tenido varios problemas manteniendo sincronizadas las notas. Hasta el momento Trello no ha fallado. Además de usarlo para manejar las tareas de mis proyectos, lo utilizo para otras cosillas como tomar notas en reuniones, organizar links para posibles artículos, para organizar mi colección de comics, mantener al día las reparaciones del hogar y más. No es para menos hayan varios que se atrevan a decir que Trello puedo ser utilizado para organizar prácticamente toda tu vida. Y créanme no están muy lejos de la verdad.

En cada tarjeta se puede colocar una descripción, imágenes, attachments, checklists, etc. Puedes mover cada elemento a diferentes tarjetas y organizarlas como mejor entiendas. Veamos como creamos un checklist.

Trello checklist

Apenas hemos tocado lo básico. Te invito a que lo pruebes por un rato y me cuentes si te ha gustado. ¿Te animas?

programación

HTTP Routing a través de Laravel

Uno de los fundamentos de cualquier aplicación web es el enrutado de componentes. Por conveniencia usaremos el anglicismo router en vez de enrutador y lo acompañaremos del protocolo básico que permite el routing entre los componentes de nuestra aplicación, el famoso HTTP.

El enrutamiento o routing se refiere a la determinación de como una aplicación responde a una petición de cliente a un punto final particular, que es un URI (o ruta) y un método de solicitud HTTP específico (GET, POST, y así sucesivamente).

Conocer cómo funciona el método de routing en tu framework favorito te provee el mecanismo para crear y modificar las URLs de tu aplicación para que sean más leíbles a los usuarios, mas convenientes a los motores de búsqueda o para proporcionar un URL más corto y/o relevante al momento de enlazar a otras webs o servicios.

La técnica de routing también añade una capa de abstracción entre los archivos que componen la aplicación y la dirección URL que se presenta al mundo exterior. Eso de crear un website o un web application reflejando la estructura de folders y archivos 1-a-1 resulta un poco inconveniente a la hora de crear una web moderna y robusta. En otras palabras el routing nos ayuda a que no se exponga el funcionamiento interno de un sitio web a los usuarios.

Para entender afondo todo esto del routing vamos a definir algunos ejemplos básicos usando como base el framework de Laravel. En Laravel la mayoría del routing se define en el archivo app/Http/routes.php. Cada uno de los ejemplos que usaremos son los ejemplos utilizados en la documentación de Laravel.

Basic Routing

Esta es la manera más básica de crear un URL.

Route::get('/', function () {
    return 'Hello World';
});

Este código se traduce a mostrar la frase “Hello World” en la pagina principal que es equivalente a visitar www.ejemplo.com/index.php. Si deseamos crear una sección o una ruta al login podemos hacerlo de la siguiente manera:

Route::get('login', function () {
    return 'Esto será nuestro login page.';
});

Route Parameters

Si deseamos capturar algún valor de nuestro URL podemos hacerlo de la siguiente manera:

Route::get('user/{id}', function ($id) {
    return 'User '.$id;
});

Este routing se traduce en el siguiente URL, http:///www.ejemplo.com/user/1.
En Laravel podemos definir x cantidad de parámetros según necesitemos.

Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
    //
});

El código anterior se transformaría en algo similiar a http:///www.ejemplo.com/post/1/comments/21.

Habrá momento que vamos a desear que el parámetro sea opcional. Esto lo logramos usando el carácter “?” como parte del parámetro, {name}.

Route::get('user/{name?}', function ($name = null) {
    return $name;
});

Route::get('user/{name?}', function ($name = Jaime) {
    return 'Soy ' . $name;
});

Regular Expression

Si deseamos restringir el valor de los parámetros podemos utilizar un regular expression para tener mayor control. Para aprovechar esta funcionalidad utilizaremos el método where de la instancia del router.

Route::get('user/{name}', function ($name) {
    //
})
->where('name', '[A-Za-z]+');

Muy convenientemente podemos mezclar diferentes tipo de expresiones regulares:

Route::get('user/{id}/{name}', function ($id, $name) {
    //
})
->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

Named Routing

A través de esta técnica podemos crear diferentes URLs y redirigirlas usando otro nombre dentro de nuestra aplicación. Este mecanismo es muy práctico para evitar el trago amargo de tener que cambiar los URLs a través de todo el código de nuestra aplicación. Esto lo logramos pasando un arreglo al segundo argumento en la instancia del router.

Route::get('user/profile', ['as' => 'profile', function()
{
    //
}]);

En este ejemplo nuestro si el URL ‘user/profile’ cambia, no habrá problema porque nuestra aplicación lo conoce como ‘profile’. En nuestro código podemos usar este URL o redireccionar de la siguiente manera:

$url = route('profile');
$redirect = redirect()->route('profile');

Route Groups

Si deseamos aplicar algún atributo que aplique a un grupo de URLs podemos hacerlo a través del método Route::group. En Laravel estos atributos esta reunidos en un arreglo que fácilmente podemos usar en nuestro método. Los atributos disponibles son:

  • Middleware
  • Namespaces
  • Domain
  • Prefix

Middleware

Para aplicar uno o varios middleware a todos nuestros URLs podemos hacerlo listando en un arreglo los nombres de cada uno. Estos se ejecutaran en el orden en que los escribas.

Route::group(['middleware' => ['check1', ' check2']], function()
{
    Route::get('/', function()
    {
        // Has check1 And check2 Middleware
    });

    Route::get('user/profile', function()
    {
        // Has check1 And check2 Middleware
    });

});

Namespaces

Un uso para este método es asignar un namespace a un grupo de controllers. Esto es un excelente mecanismo para mantener nuestro código lo más organizado posible.

Route::group(['namespace' => 'Admin'], function()
{
    // Controllers Within The "App\Http\Controllers\Admin" Namespace

    Route::group(['namespace' => 'User'], function()
    {
        // Controllers Within The "App\Http\Controllers\Admin\User" Namespace
    });
});

Sub-Domain Routing

¿Necesitas trabajar algún sub-dominio? No te preocupes Laravel también proveer un método para esto. Inclusive puedes asignar parámetros a los diferentes URLs.


Route::group(['domain' => '{account}.myapp.com'], function () {
    Route::get('user/{id}', function ($account, $id) {
        //
    });
});

Route Prefixes

Si deseamos aplicar un prefijo a un grupo determinado de URLs podemos hacerlo pasando el prefijo como un arreglo al metodo del router. Veamos el ejemplo:

Route::group(['prefix' => 'admin'], function () {
    Route::get('users', function () {
        // Matches The "/admin/users" URL
    });
});

También podemos usar el prefijo junto al un parámetro para asociar el valor de ese parámetro a un grupo de URLs:

Route::group(['prefix' => 'accounts/{account_id}'], function () {
    Route::get('detail', function ($account_id) {
        // Handles Requests To admin/user
    });
});

Básicamente hemos cubiertos lo básico del HTTP routing en Laravel. Aunque hayamos trabajado el routing directamente en el archivo router.php a traves utilizando Closures lo ideal es que la ruta puede tener una o más funciones de controlador, o sea las rutas deben apuntar a los controladores de nuestra aplicación. De pues de todo la arquitectura de Laravel se basa el modelo MVC.