Tutoriales sobre dokku

Hoy he empezado el primero de los que espero que sea una pequeña pero útil lista de tutoriales sobre Dokku.

Este primer tutorial Introducción a Dokku posiblemente sea el más extenso debido a que hay que explicar más cosas, pero los próximos serán más concretos, algunos de los temas que tengo en mente son:

  • Backups de bases de datos.
  • Cronjob.
  • Dominios, redirecciones, http basic y certificados con letsencrypt.
  • Multiples entornos (production, staging).
  • Buildpacks.

Rails log tags

Rails 5 por defecto en el log nos añade el :request_id, pero además podemos añadir los tags :uuid,:host y :remote_ip.

En realidad el :request_id y :uuid parace ser lo mismo.

config.log_tags = [ :request_id, :host, :remote_ip]

En el caso de que queramos mostrar otros datos, como por ejemplo un API key que venga en el header tendremos que usar lambda.

config.log_tags = [ :uuid, :remote_ip, lambda {|req| req.headers['HTTP_AUTHORIZATION'] }]

Ngrok para exponer una aplicación en desarrollo

Para algunas cosas es necesario durante el desarrollo exponer nuestra aplicación a la red, por ejemplo cuando estamos trabajando con webhooks como por ejemplo en pasarelas de pago.

Un sistema muy sencillo es ngrok el cual permite exponer el puerto que queramos de la forma más sencilla.

Nos descargamos el binario para nuestra plataforma y ejecutamos:

$  ./ngrok http localhost:3000

Esto expondría localhost al puerto 3000 en el puerto 80 de la dirección que te diga.

Podemos exponer otros puertos e ips locales según necesitemos, por ejemplo:

ngrok console

Como ves nos da los endpoints http y https, además una consola web en donde podremos ver las peticiones entrantes y hacer replay de las peticiones.

Vagrant y letter_opener

Si estas usando Vagrant para el desarrollo con Rails tendrás problemas porque letter_opener no funcionará correctamente porque trarará de abrir el mail desde la maquina virtual de vagrant.

Como solución tenemos letter_opener_web que permite ver los correos desde el navegador.

Desde la propia gema sugieren la siguiente configuración compatible si desarrollas con o sin Vagrant.

# config/routes.rb
Your::Application.routes.draw do
  if Rails.env.development?
    mount LetterOpenerWeb::Engine, at: "/letter_opener"
  end
end

# config/environments/development.rb
config.action_mailer.delivery_method = ENV['USER'] == 'vagrant' ? :letter_opener_web : :letter_opener

Configurar redirección si el usuario no está autentificado con devise

Para cambiar la redirección o acciones por defecto de devise cuando el usuario no está autentificado podemos hacerlo de esta manera:

# app/controllers/application_controller.rb
protected

def authenticate_user!
  if user_signed_in?
    super
  else
    redirect_to '/my-custom-route'
    # or render something
  end
end

En este caso es authenticate_user! porque el resource es user, si fuera por ejemplo el resource fuese admin tendríamos que usar authenticate_admin!.

Cuando reinicio Jenkins pierdo la configuración de rbenv

Si estás usando Jenkins y el plugin de rbenv puede que hayas notado que cuando reinicias se pierde la configuración de rbenv de tus jobs.

Este bug se produce por culpa del plugin Ruby-Runtime 0.13. Haciendo un downgrade a la 0.12 se arregla.

Para hacer el downgrade debes descargar Ruby-Runtime 0.12 y subirlo a http://$JENKINS/pluginManager/advanced.

Link: Guia Big-O Notation para programadores Ruby

A Rubyist's Guide to Big-O Notation es un artículo muy claro y sencillo que explica la notación Big-O.

Lo más interesante del artículo es la tablita que explica cada expresión en Big-O con un emoticono y el resultado.

En las entrevistas de trabajo siempre hay alguien que te pregunta sobre el tema así que no está mal repasarlo 😎

Link: Rails Database Best Practices

Listado de buenas prácticas para lidiar en Rails con la base de datos.

Son solo 9 reglas algunas bastante básicas, pero está bien recordarlas.

Rails Database Best Practices

Personaliza el comando rails generate

Por defecto los generadores de rails crean muchos ficheros que no siempre usamos y al final acabamos teniendo decenas de ficheros vacíos que generan ruido.

En mi caso he desactivado los fixtures, los assets y los helpers

  config.generators do |g|
    g.test_framework  :test_unit, fixture: false
    g.stylesheets     false
    g.javascripts     false
    g.helper          false
  end

También puedes configurar el ORM, el sistema de plantillas o el framework de testing.

config.generators do |g|
  g.orm             :active_record
  g.template_engine :erb
  g.test_framework  :test_unit, fixture: false
  g.stylesheets     false
  g.javascripts     false
end

Más información en Rails Guides.

Como eliminar las www en Rails

Las www son una mala costumbre que de una manera u otra ha llegado hasta nuestros días. Te gusten o no lo mejor es hacer que nuestra web sea accesible con o sin ellas para que los visitantes despistados no se pierdan.

Pero el mismo contenido para dos dominios distintos como www.example.com y example.com nos penalizará en algunos buscadores de busqueda, así que lo mejor es redigir uno de los dominios al otro.

Esto se puede hacer a nivel de NGINX o Apache, incluso con Cloudflare, pero si no tienes acceso a estas capas puedes hacerlo directamente en Rails.

En Rails 4 para eliminar las www:

# config/routes.rb

constraints subdomain: 'www' do
  get ':any', to: redirect(subdomain: nil, path: '/%{any}'), any: /.*/
end

Para añadirlas:

# config/routes.rb

constraints subdomain: false do
  get ':any', to: redirect(subdomain: 'www', path: '/%{any}'), any: /.*/
end

Cómo validar una URL en Rails

La forma más sencilla de validar una URL en Rails con ActiveModel es usando URI.

 validates :url, presence: true, format: {with: URI::regexp(%w(http https))}

Error en Ace con acentos y otros carácteres especiales en Chrome 53+

Para el que no lo sepa Ace es un estupendo editor de código para el navegador.

En las últimas semanas se ha detectado un error en las versiones 53 en adelante de Chrome al introducir caracteres especiales que requieran de otra tecla.

Por ejemplo, este era mi caso al introducir una tilde con el teclado en inglés americano:

Error de ACE

Ya tienen una solución para el problema pero aún no hay una release, por lo que tendrás que usar la versión de master.

Si usas Brace (la versión de Ace compilada con Browserify) puedes usar el fork de ziliwesley/brace que aplica el parche hasta que no lo haga el proyecto principal.

Cuidado con open-uri

Es muy común que usemos open-uri si queremos descargar un fichero remoto, pero si lo usas para descargar un fichero que introduce un usuario puede que tengas un agujero de seguridad.

open-uri usa por debajo Kernel#open el cual puede ejecutar código malicioso.

Por ejemplo para Kernel#open esto | ls sería una url válida al igual que | rm -rf ~.

Puedes probarlo con un comando no dañino:

open("| ls -lah").read

Janko Marohnić lo explica con más detalle en su blog y nos propone su gema down.

Introducción al stack de javascript

Si como yo te sientes que el stack de javascript es como una maraña gigante que ha crecido de repente tu un día para el otro este es tu tutorial.

Con el tutorial no vas a aprender javascript, se trata de una introducción a las herramientas disponibles para instalar paquetes, trabajar con ES6, Gulp, Webpack, el famoso React + Redux...

Visitar: JavaScript Stack from Scratch.