programación

El legado de Satoru Iwata

El trabajo de un programador es producir un buen trabajo, lo que significa que los planificadores y diseñadores no deben sentir las limitaciones del hardware. Les digo a mis programadores: piensen cuidadosamente antes de decir algo parecido a “no se puede hacer.” No hay mucho que no se puede hacer con un poco de inventiva.

La pérdida de Satoru Iwata nos mueve a reflexionar sobre cómo desafiar las limitaciones. Y más allá de enfrentarnos a ese desafío por métodos agresivo nos invita a que sea una llena de tacto.

Tal vez usted es especialmente bueno en la programación. Tal vez usted puede resolver los puzzles que otros no pueden. Cualquier cosa que te distingue está bien.

En la nota Satoru Iwata Passes Away, RIP del blog Kirai, a geek in Japan encontramos breves imágenes de su legado. Además en la serie “1994 Game Developers Interview Collection” de Shmuplations podemos leer un poco a cerca de sus métodos e ideologías.

Descanse en paz.

micro notas

Micro notas #9

A través de estas micro notas hablo brevemente de aquellas noticias o enlaces que me han parecido curiosas y relevantes al mundo de la programación y la tecnología.

Open Source .net libraries that make your life easier – A parte de los Top 100 packages que podemos encontrar en Nuget Thomas Van Machelen ha compilado una corta pero productiva lista de librerías de código abierto que son de gran utilidad para proyectos en .Net.

PHP vs ASP.NET – El eterno debate de nunca acabar. Aunque reconozco que el autor del artículo expone varios puntos interesantes. Muy buena lectura para aquellos que desarrollan en ambas plataformas.

Rankings de los lenguajes de programación durante el año 2014 – Aunque vayamos a mitad del 2015 nunca es tarde estudiar este tipo de información. En programación no es bueno dejarse llevar por tendencias pero no está demás visualizar a donde se está moviendo la industria.

SQLite, donde lo encajo? – En la misma documentación del proyecto te lo contestan. Buen recurso para cuando te encuentras en la disyuntiva de escoger si pasar todo el trabajo de instalar/configurar MySQL o SQL Server Express en vez de usar algo mas ligero como SQLite.

Michigan Micro Mote (M3) – Sorprendente logro de poder miniaturizar un ordenador en apenas algunos milímetros. Con la popularidad que esta alcanzando el IoT este es uno de esos proyectos que debemos mantener en el radar. Microsiervos le ha reseñado brevemente y hay un video donde explican muchas de sus utilidades.

How to Read Source Code – Spoiler de la vida de un programador… en múltiples ocasiones tendrás que leer código que no ha sido escrito por ti y llorarás, restallarás cosas de tu escritorio, suspirarás y rogarás no querer pasar por eso pero así es esto. Aria Stewart comparte una serie de consejos que harán de esta tarea una mas llevadera. Muy buena lectura si deseas aportar a proyectos open source.

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.

tecnología

Como instalar Laravel Homestead en Windows

Anteriormente había escrito como podemos aprovechar las ventajas de PuPHPet para construir de forma rápida ambientes de desarrollo enfocado en PHP. PuPHPet sigue siendo un gran proyecto y actualmente la cantidad de configuraciones que podemos generar a través de su aplicación web es impresionante.

Otra plataforma que podemos adoptar como ambiente de desarrollo para PHP es Laravel Homestead. Homestead es el virtual box oficial para crear aplicaciones utilizando el framework Laravel. Esta máquina virtual posee todo lo necesario para el desarrollo local de aplicaciones web e incluye PHP, HHVM, Nginx, MySQL y más (hasta NodeJS).

Existen un sin número de tutoriales de como instalar Homestead, inclusive unos de los puntos fuertes de usar un producto derivado de Laravel es su extensa y muy elaborada documentación. En este caso vamos a enfocarnos en como configurar Homestead en Windows.

Vamos a definir cuáles son los pre-requisitos. Antes de usar Homestead necesitamos instalar, Virtual Box, Vagrant y Git. Prácticamente vamos a ejecutar el instalador de cada una de las aplicaciones ciegamente instalando todo y aceptando las propiedades y parámetros que ofrecen como estándar. Estas 3 herramientas proveen las bases para poder levantar el vm de Homestead sin problemas.

windows-homestead-01

Una vez terminen las instalaciones vamos a confirmar que las herramientas hayan instalado sin muchos contratiempos. Vamos a utilizar el Git Bash que incluye Git y verifiquemos que hayamos instalado Vagrant escribiendo:

$ vagrant -v

La version que estoy usando es Vagrant 1.7.2. Hagamos la misma verificación para Virtual Box.

$ "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" -v

Para Virtual Box estaremos usando la versión 4.3.12r93733.

Ahora vamos a seguir las instrucciones que se encuentran en la documentación de Homestead. Lo primero será añadir el box de HomesteadVagrant.

$ vagrant box add laravel/homestead

Este comando te preguntará que tipo de proveedor deseas usar,

1) virtualbox 2) vmware_desktop

Aquí es donde se descarga la máquina virtual a nuestra laptop o PC. Escojamos le opción de virtualbox y dejemos que el archivo baje. En una conexión decente esta acción puede tomar hasta 5 minutos.

Para comprobar que el box ha bajado correctamente lo verificamos listando los box que tenemos configurados en Vagrant. Ahí debe aparecer laravel/homestead.

$ vagrant box list
laravel/homestead       (virtualbox, 0.2.5)
precise32               (virtualbox, 0)
trusty64                (virtualbox, 0)

Ahora vamos a clonar el repositorio de Homesetead.

git clone https://github.com/laravel/homestead.git MyProject

Esto creará un folder MyProject que será el root de nuestros archivos. Vamos a entrar al folder MyProject y de ahí vamos a ejecutar:

bash init.sh

Este script creará el archivo Homestead.yaml en c:\.homestead. El archivo Homestead.yaml contiene la siguiente configuración:

---
ip: "192.168.10.10"
memory: 2048
cpus: 1
provider: virtualbox

authorize: ~/.ssh/id_rsa.pub

keys:
    - ~/.ssh/id_rsa

folders:
    - map: ~/Code
      to: /home/vagrant/Code

sites:
    - map: homestead.app
      to: /home/vagrant/Code/Laravel/public

databases:
    - homestead

variables:
    - key: APP_ENV
      value: local
...

Aquí es donde cambiaremos un poco las cosas para que adaptarlas a Windows. Lo primero que vamos a modificar es el SSH key. Si has usado Github de seguro ya tienes una de lo contrario obtener una a través de Git Bash es fácil. Solo necesitas copiar el siguiente código en el Git Bash:

ssh-keygen -t rsa -C "tu-nombre@homestead"
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/Jaime/.ssh/id_rsa):
...

El lugar en donde guardes la llave es importante porque luego lo vamos a utilizar para configurarlo en nuestro archivo Homestead.yaml. Es importante destacar que el archivo Homestead.yaml utiliza la notación de Unix para definir la localidad de los archivos. El uso de ~/ indica que este será nuestro home o root path. En Windows podemos encontrar nuestro equivalente verificando el path que contiene la variable HOME. Averiguar es muy fácil, vamos a System >> Advanced system settings >> Environment Variables…

windows-homestead-02Una vez aparezca la ventana de Environment Variables buscamos la variable HOME.

windows-homestead-03

En mi caso vemos que el path definido en la variable HOME apunta a C:\Users\Jaime. Por el contrarios, si deseamos utilizar al path completo tenemos que invertir los \ por /. Dicho esto los siguientes comandos son equivalentes:

authorize: ~/.ssh/id_rsa.pub

keys:
    - ~/.ssh/id_rsa
authorize: C:/Users/Jaime/.ssh/id_rsa.pub

keys:
    - C:/Users/Jaime/.ssh/id_rsa

Por último vamos a cambiar la configuración del parámetro map para apuntar al folder MyProject,

folders:
    - map: ~/Documents/Code/MyProject
      to: /home/vagrant/Code

Una vez hayas configurado por completo el archivo Homestead.yaml puedes ejecutar el comando vagrant up desde el folder MyProject y listo.
Ahora desde tu navegador puedes visitar la dirección de ip http://192.168.10.10 y si ves la siguiente oración, “No input file specified.” es que todo está listo para comenzar el desarrollo o para instalar Laravel.

diseño

Y qué tal si añadimos los test como parte del diseño

Nuevamente Sandijs Ruluks nos presenta un interesante artículo acerca de métodos para hacer test como parte del proceso de diseño, What if testing was a part of the design. Este artículo junto a Positioning in web design y 9 basic principles of responsive web design son referencias definitivas a la hora de hablar sobre diseño web.