vim-projectionist y AngularJS

Hace un tiempo que vi que Tim Pope había escrito un nuevo plugin llamado vim-projectionist y de primeras no conseguí saber de que iba exactamente .

Ayer estuve de “tool sharpening”, le dediqué un ratito y me gustó mucho.

Con Vim en proyectos Rails me he movido siempre con los comandos :R (Rcontroller, Rmodel, Rlib, …) y :A (ir al fichero alternativo y relacionado, por ej. de un modelo podría ser una migración o un test), que también disponen de un particular “fuzzy finder” o autocompletado.

En spines.me tenemos el front con AngularJS y todas esas facilidades de navegación que me daba el plugin vim-rails las perdí.

Son varios años de hábito a esos comandos y me tocaba cambiarlo por CtrlP. Lo conseguí un poco, pero no estaba convencido del todo, necesitaba poder acceder a los controladores con los “comandos R”.

En este punto entra este plugin.

La aplicación en AngularJS tiene una estructura como esta:

  • app/scripts/controllers
  • app/scripts/directives
  • app/scripts/filters
  • app/scripts/services
  • test/spec/controllers
  • test/spec/directivces
  • test/spec/filters
  • test/spec/services

Por supuesto hay más directorios pero básicamente en esos me muevo normalmente.

Configurando vim-projectionist se pueden crear comandos hacer que acceder a los controladores, directivas, filtros y servicios.

Estos comandos serán invocados con :Econtroller <fichero> (también :Edirective, :Efilter y :Eservice)

La “E” viene de editar, también se puede usar “S” (horizontal split), “V” (vertical split), “T” (tab). Además <fichero> tiene autocompletado.

Para ello en el proyecto he añadido en la raíz del projecto el fichero: .projections.json

$ cat .projections.json
{
  "app/scripts/controllers/*.js": {
    "type": "controller",
    "alternate": "test/spec/controllers/{}.js"
  },
  "app/scripts/directives/*.js": {
    "type": "directive",
    "alternate": "test/spec/directives/{}.js"
  },
  "app/scripts/filters/*.js": {
    "type": "filter",
    "alternate": "test/spec/filters/{}.js"
  },
  "app/scripts/services/*.js": {
    "type": "service",
    "alternate": "test/spec/services/{}.js"
  },

  "app/scripts/*.js": { "type": "script" },
  "app/scripts/app.js": { "type": "script" }
}

 

Con esto ya tengo esos comandos para acceder rápida y cómodamente a los ficheros de esos directorios. Además estando en esos ficheros si ejecuto el comando “:A” me lleva a su fichero alternativo que es su test.

También me he permitido el añadir el comando “:Escript” para llegar a ficheros que están fuera de esos directorios.

Otra cosa interesante es que también puedes crear ficheros y usar plantillas para generar su contenido inicial (mirar las templates en la configuración, aquí no lo he hecho). Para ello invocas el comando con el nombre de <fichero> y una exclamación al final.

También permite ejecutar comandos con vim-dispatch pero esta vía no la he explorado todavía.

Esto es sólo el PRINCIPIO de otra AVENTURA

Hace ya un mes y pico que terminó mi aventura con ideas4all, quería haber escrito antes sobre ello pero lo vas dejando y lo vas dejando… :)

Han sido más de 3 años que me han ayudado a crecer profesionalmente. Recuerdo cuando leí el libro “97 Things every programmer should know“, todos los errores que se nombraban allí ya los había cometido y algunos varias veces (uno que es duro de mollera), e incluso podría añadir más. También puedo decir que hubo aciertos. Otra cosa que sin duda he aprendido es que no me gusta la gestión en el sentido “tradicional”, ahora ya puedo decir que la he probado y  que no me gusta ;-)

En todo ese tiempo en ideas4all lo que he hecho(y lo he hecho muy bien) son buenos amigos y amigas.

Allí siempre he estado rodeado de personas con superpoderes y habilidades increíbles: algunas eran capaces de hacer arte con objetos peculiares como pelusas o cepillos de dientes, otras cantar con Baco al son de un piano, otras sacar lo mejor de ti en una sola foto, otras podían rezar a una manzanita durante horas, otras capaces de estar en cinco sitios a la vez(siempre saraos ;-) ), otras con la capacidad de comprar billetes de bus a sitios recónditos para librarse de nosotros(del equipo de Haití), otras con avanzados conocimientos de flora y materiales explosivos, otras que con una sola idea te montaban cenas de navidad muy originales, otras capaces de hacer el saludo trekkie a selacimorfos pezqueñines y grandotes, otras amantes platónicos de la música hasta el punto de llevar camisetas con ecualizador,  otras que te daban la vida siempre que salían a media mañana y te ofrecían una pieza de fruta, otras que podían varear aceituna mientras respondían emails y teléfono, y todo ello sin despeinarse, otras capaces de olvidar en santiamén pero nunca olvidaban a su Ath…, otras que con una mirada o “golpecito” en la mesa arreglaban las impresoras a distancia, otras con días XXL y sueños XS, y otras que eran capaces de conseguirte una estrella.

Para la gente de ideas4all, más o menos allí estáis todos, ahí tenéis las palabras que os debía de la comida de “hasta la vista”.

Para el resto ¿entendéis ahora que no fuera fácil abandonar el barco?

 

¿Y en qué AVENTURA estoy ahora metido?

En spines.me , haciendo una herramienta que “te ayude a aprender más” (con esa frase me lo describió Pablo Jimeno en su día y me fascinó la idea).

Para ello Pablo nos ha juntado a Adriano Latorre, Francho, Rodrigo y a un servidor. Cada uno el mejor de su portal en algo, y todos con muchas ganas de hacer y aprender :)

No me voy a extender sobre spines.me en este post y lo dejo para los posts venideros pero si queréis saber un poquito más podéis leer el post de Francho “3…2…1… Inception” y el de Pablo “Spines: An Awesome Journey Has Started” prácticamente recién salidos del horno.

Sí que me gustaría invitaros a que os paséis por spines.me y os deis de alta en el newsletter para que respondáis a nuestra encuesta (gracias de antepierna!).

Hasta la próxima

 

 

asterisco y doble asterisco en bash (sobre globbing)

En mi cabeza tenía que asterisco|wildcard(“*”) significaba en los patrones “cero o más caracteres” y poner dos asteriscos(“**”) era la leche en temas de ficheros, hacía un barrido por los directorios y subdirectorios, pero no me funcionaba (en algún momento de mi vida eso me funcionó).

Buscando por ahí encontré que Bash nos ofrece shopt (shell options) para modificar el comportamiento de nuestras terminales y que tenía que activar “globstar”:

shopt -s globstar

Al dejarlo ir a dejar esa opción fija en mi .bashrc para la posteridad vi en mi ordenador, con Ubuntu, que ya estaba pero comentado:

# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
# shopt -s globstar

Saludotes

Recuperando la contraseña de Transmission

Estos días estoy configurándome una Raspberry Pi[1] como centro multimedia y descargas. Por ahora no he hecho mas que instalar raspbmc[2] y transmission. Raspbmc se instala sin problemas y Transmission también pero hay un pequeño gotcha con los permisos del disco duro montado, escribiré otro día sobre ello.

 

Como decía aquel: “a lo que vamos tuerto”.

Continue reading

Mysqldump a lo loco (o como volcar los inserts y el esquema por separado)

Estos días me encuentro haciendo una migración de una aplicación antigua a una versión nueva. La estrategia que he decidido emplear ha sido, coger del sistema A (antiguo) los datos y el esquema del sistema B(el nuevo), y mezclarlos. Hay que tener en cuenta que el esquema de las bases de datos entre los sistemas A y B ha cambiado bastante pero se pueden combinar, haciendo algunos cambios previamente.

Para volcar del sistema A los datos he usado el siguiente comando (sólo los INSERTs):

mysqldump -u <user> -p --skip-triggers --no-create-info --no-create-db --extended-insert --complete-insert <database> | gzip -c > production_`date +%y%m%d`.sql.gz

Los parámetros “–no-create-.*” hace que no se cree ni la base de datos, ni el esquema y así sólo nos quedan los INSERTs.

Inicialmente no puse “–complete-insert”, hace que los INSERTs se hagan especificando los atributos que se están insertando, pero al mezclar los datos de A con el esquema de B no me coincidían los campos en algunas tablas y me encontraba con un maravilloso “error 1136 (21s01) column count doesn’t match value count at row 1

Para saber que hace cada uno de los parámetros usados os invito a que os paséis por la documentación de mysqldump[1].

 

Luego necesitaba el esquema de la base de datos de B:

mysqldump -u <user> -p --no-data <database> > production_schema_`date +%y%m%d`.sql

No me molesté ni en comprimir con gzip porque no ocupa mucho el dump.

 

Para restaurar los datos usaremos la receta que está escrita por todo Internet:

zcat production_*.sql.gz | mysql -u <user> bbdd_server_B_new_version

 

Si la base de datos es muy grande os tocará ampliar el tamaño máximo del paquete en MySQL. Modificas el fichero /etc/mysql/my.cnf o añades uno dentro de /etc/mysql/conf.d con lo siguiente:

[mysqld]
max_allowed_packet = 1G

 

Fin

[1] http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html

 

El capitán garfio no quiere que hagas commit en master (Git hooks)

El otro día leí un artículo en are you fucking coding me ?[1] que proponía un hook para no poder commitear en master directamente. Lo veo útil porque te fuerza a trabajar sí o sí en una rama, en mi cabeza, además, rama me implica abrir ticket (si no existe que puede ocurrir). La pega que le veo a este sistema es que no podré hacer commits de “cleanup” alegremente. Aun así probaré el experimento que proponen durante esta semana que viene y ya añadiré cómo ha ido.

 

En el blog te explican como poner el hook por proyecto pero tengo demasiados proyectos y creo que lo suyo es ponerlo global, para coger el hábito. Después de un rato de investigación me temo que actualmente Git no soporta los hooks globales. Puedes hacer un apaño para los proyectos nuevos con definiendo la variable”init.templatedir” (global), copiar en ese directorio todos los hooks que tengas y cada vez que inicialices/clones un repositorio los copiará.

 

Respecto al hook que proponen ellos, en el shebang usan sh como intérprete y a mi no me funcionó(error de sintaxis en el if), al cambiar el shebang a bash sí era interpretado correctamente.

 

Si tenéis curiosidad por ver que hooks podéis poner en Git leed esta sección del libro de Git “7.3. Customizing Git – Git hooks“[2]

 

[1] http://areyoufuckingcoding.me/2012/09/28/paranoid-git-workflow/

[2]http://git-scm.com/book/en/Customizing-Git-Git-Hooks

RiojaParty 2012 – quiero ser informático, ¿qué hago?

La aventura comenzó el día en que volvía de vacaciones y en un restaurante al norte de Navarra me encontré con @cmende3, sin saber como, ya tenía un hueco para dar una charla o taller en RiojaParty. El tiempo fue pasando y no tenía tema del que hablar, después de rumiarlo bastante y desechar varias ideas encontré algo que me pareció interesante, el hecho de que mucha gente se mete a la informática porque no sabe que hacer.

No me disgusta que la gente estudie/haga informática, cuantos más seamos más nos reiremos, pero sí me disgusta el que se hagan las cosas sin ganas, sin pasión. El campo de la informática es muy muy muy amplio, y está creciendo, como para que todo el mundo encuentre algo que le fascine y ya que vas a hacerlo que te guste.

En torno a este pensamiento giró la presentación. El formato para exponerla fue el de charla de colegas o grupo de autoayuda :)

El contenido de la presentación son una serie de consejos o ideas que practicar para “hacer informática y no morir, de aburrimiento, en el intento”.

Sobre el cómo fue la charla, empezamos a las 20:15 en punto, estábamos 7 personas (mi persona incluida) y la alargamos hasta las 21:55. Algo que tenía previsto durar unos 45 min. se alargó una hora más! así que ya os podéis imaginar. No creáis que me tiré casi dos horas hablando, los que me conocen saben que soy capaz pero no :) , en realidad se alargó porque estuvimos de charla, literalmente, comentando cada punto, añadiendo, contando experiencias personales,… en fin genial.

Sobre RiojaParty 2012 no puedo hablar demasiado porque no pude disfrutarla (ni siquiera llegué a inscribirme), sin embargo la ternerica, si supiese escribir, os diría que estuvo genial porque se lo debió pasar en grande en el hinchable (este año la organización montó una ludoteca).

Aquí debajo os pongo la presentación que usé:

That’s all folks!

Conectando a través de proxies (web y SOCKS) desde una consola alegremente

Estoy en un entorno de trabajo “algo” cerrado en el cual solo me dejan conectar a los repositorios de ubuntu(web), rubygems(web) y el repositorio git(ssh). El acceso entre servidores es abierto totalmente.

 .

Para solucionar el tema de la actualización e instalación de paquetes vía aptitude a través del proxy web. Creamos el fichero /etc/apt/apt.conf y ponemos lo siguiente:

Acquire::http:Proxy "http://nuestro.web.proxy:puerto";

 .

La actualización de las gemas pasando por el proxy web hay que jugar con la variable de entorno HTTP_PROXY:

export HTTP_PROXY=http://nuestro.web.proxy:puerto

Nota: Si queremos lo podemos poner en nuestro /etc/profile para que quede configurado globalmente.

 .

El acceso al repositorio Git lo hacemos a través de un proxy SOCKS, las anteriores estrategias no nos sirven de nada. He tenido que usar tsocks, que captura las peticiones y las hace pasar por el proxy SOCKS que le indiques en la configuración.

Lo instalamos con aptitude. El fichero de configuración es autoexplicativo (/etc/tsocks.conf). Y su funcionamiento es sencillo, por ej:

$ tsocks git pull --rebase

 .

 .

¡Capistrano extraball!

En este entorno para que Capistrano funcione usando tsocks (conectar al repositorio través del proxy SOCKS) sólo he tenido que configurar la variable scm_command:

set :scm_command, "tsocks git"

Y así ha ido como la seda :-)

 .

Otra cosa que leí de aquí[1] y que me pareció interesante para un entorno totalmente cerrado(en el que haya que pasar por el proxy SOCKS incluso para conectar entre los servidores locales). Es la de hacer que todas las conexiones pasen por el proxy SOCKS modificando el config/deploy.rb de Capistrano:

require 'net/ssh/proxy/socks5'

sshproxy = Net::SSH::Proxy::SOCKS5.new('proxy.com', 1080)
set :ssh_options, { :proxy => sshproxy }

 .

[1] http://michaelshadle.com/2010/04/30/getting-apistranos-ssh-method-to-work-behind-a-socks-proxy

Instalando Database Test Suite

El proyecto Database Test Suite[1] nos da unas herramientas para hacer pruebas de carga de nuestros sistemas gestores de bases de datos y poder optimizarlos. Los benchmarks de Database Test Suite  son parecidos a los de TPC[2].Los tipos de benchmark que hay definidos con su explicación y su equivalencia con los definidos en TPC[2],  los puedes encontrar aquí[3]. Pero la realidad es que si quieres probar MySQL sólo puedes usar el benchmark dbt-2 (database test 2)[4], PostgreSQL está soportado en todos los tests y en otros sapdb y SQLite.

La última versión es la 0.40 y es del 2007 pero si miras el repositorio verás que sigue activo.

Continue reading

Clonar una máquina virtual

Virtualbox nos permite clonar las imágenes que tenemos en nuestro host. De esta manera podemos aprovechar repetidamente imágenes que tengan todo instalado y configurado, o que estén impolutas.

Para clonar las imágenes dentro del mismo host solo necesitamos ejecutar el siguiente comando:

VBoxManage clonevdi Ubuntu-server-10.04.2/Ubuntu-server-10.04.2.vdi clone-ubuntu-server/clone-ubuntu-server-10.04.2.vdi

Siendo el primer parámetro la imagen original y el segundo el destino de la imagen clon.

 

Si la imagen que clonas es Ubuntu y la red no funciona, ejecuta este comando:

$ sudo rm /etc/udev/rules.d/70-persistent-net.rules

Eliminamos ese fichero porque allí está asociada la tarjeta de red virtual(de la imagen original) a la interfaz de red y al clonar ya no le cuadra :-)

 

Saludos