Megapost de VIM

¡Hola a todos!

Este va a ser un recopilatorio de lo que he aprendido y de los enlaces que publiqué en este blog y no. Básicamente reviso lo que posteé, traduzco y anoto algo de todo lo interesante que hay en ellos . Este artículo va a tratar sobre:

Trabajar con múltiples ventanas en VIM

Para trabajar en vim lo mejor siempre son los tabs en mi opiníon. Pero si no queremos usarlos a ellos, o queremos copiar de un archivo a otro sin copiar y pegar porque tenemos que hacer algunas modificaciones mientras lo vamos copiando, el comando

`:split NOMBRE DE ARCHIVO`

`split %` // duplica la ventala actual

divide horizontalmente la pantalla. :vsplit, por su parte, la divide verticalmente. Para pasar de pantalla en pantalla hay que presionar control + W control + W.

Recomiendo de todas maneras también trabajar con tabs y instalar mi configuración de vim para poder cambiar de tabs con control av pag y control re pag.

Plugins de VIM

Los plugins que mas recomiendo de VIM son NerdTree que nos abre un explorador de archivos al ejecutar el comando `:NERDTree`. Si no quieren ejecutar este comando cada vez que abren el vim, pueden bajar mi configuración para que se abra automagicamente.

Tambien recomiendo doria, que es un theme en forma de plugin. Tambien está instalado en mi configuracion por defecto.

Usando VIM con BASH

Ahora esto si es interesante. Acá estan unos ejemplos:

:!cmd # ejecuta `cmd`, nos muestra el resultado y vuelve a VIM
!! cmd # ejecuta el comando y pone el resultado adentro de el archivo de texto
:!! #ejecuta el último comando nuevamente
:f nombrearchivo #renombra el archivo en el que estamos al nuevo nombre de archivo.
:w !cmd #envía el archivo completo al stdin de un comando y lo ejecuta. El potencial de esto es interesante.
:sh # abre una subconsola. Control + d vuelve a vim

Usando vimdiff para comparar archivos de consola

para comparar archivos desde consola hay que abrir el vim en modo diff.

`vimdiff archivo1 archivo2[ archivo3[...]]`

Si hay mas de dos buffers para comparar, hay que deshabilitar aquellos que no querramos modificar, poniendo

`:set nodiff`

Luego, cuando lo necesitamos nuevamente lo habilitamos con

`:set diff`

Para meter un diff ( un diff put ), hay que presionar dp. También se puede obtener con do. Control W Control W para cambiar de buffer.

Marcadores, mapeado de comandos, curiosidades

Los marcadores estan buenos para trabajar con vim. Interesantes porque no es tan fácil navegar como en otros IDEs sin ellos quizás. La matemática de los marcadores es simple: Marco un lugar con `mc`. c sería en este caso el nombre del marcador, podría haber sido cualquier letra. Luego, para ir hasta ese marcador hay que apretar `’c`. Eso sería comilla simple, c. Y voilá.

También se puede ir a la línea 55, por ejemplo, presionando `55gg`. ( Número de línea, gg )

El mapeado de comandos es muy interesante. En este caso lo vamos a usar para mapear el control S a la función guardar de vim ( `:w` )

Esto funciona mejor si lo colocan en su archivo de configuracion ~/.vimrc

map <C-s> :w<CR>
imap <C-s> <Esc>:w<CR>i

map es para cuando estamos en modo comando y imap es para cuando estamos en modo inserción

Esto también es muy sencillo, el primer parámetro es la combinación de teclas a presionar. Las letras mayúsculas en general representan funciones del teclado, C = Control, S = Shift. Hay un listado de todas las teclas en la documentación de VIM. El segundo parámetro indica en que se transforma dicha combinación. En el caso de que estemos en modo comandos, la transformación presiona las teclas :, la tecla w, y la tecla enter, de hecho guardando. En el modo inserción presióna Esc, :w, enter, y luego la I para volver a modo de inserción. :)

Respecto a las cosas curiosas, acá estan todas :)

Guardar con control S

Ups! ya maté esto con el ejemplo anterior. Bueno. Aprovecho este espacio para decirles que tengo un repositorio donde guardo toda mi configuración. Sientanse libres de descargarlo, usarlo, y modificarlo por supuesto. Está bueno porque tiene un montón de cosas mejoradas para mi gusto. :)

Un abrazo,
Pedro

Como usar south

¡Hola a todos!

Escribo este post para la empresa en la que ahora trabajo ( Brandigital ), como para documentar un poco el proceso que implica poner nuestra base de datos bajo control de versiones usando mercurial y #django-south. El proceso es relativamente sencillo. Este tutorial supone que tenemos una base de datos ya creada, y que ya leimos el manual de south respecto a la instalación, su uso y como convertir una aplicación ya creada a south.

Comprendiendo lo básico

South tiene 2 comandos que debemos saber: schemamigration y migrate. Sus usos mas comunes son los siguientes:

# identificar todos los cambios hechos en los modelos y escribirlos al disco duro.

root@alice# python manage.py schemamigration app_name --auto
 - Deleted field nombreTrue on web.CategoriaWidget
Created 0005_auto__del_field_categoriawidget_nombreTrue.py. You can now apply this migration with: ./manage.py migrate web

# aplicar los cambios

root@alice# python manage.py migrate app_name
Running migrations for web:
 - Migrating forwards to 0005_auto__del_field_categoriawidget_nombreTrue.
 > web:0005_auto__del_field_categoriawidget_nombreTrue
 - Loading initial data for web.

Aplicando cambios en los modelos en una versión y reflejándolos en el resto

Como primer paso tenemos que hacer un cambio en los modelos en este caso, quité un field llamado nombreTrue del modelo CategoriaWidget. Una vez hecho esto, debemos decirle a south que por favor nos reconozca los cambios

root@alice# python manage.py schemamigration web --auto
 - Deleted field nombreTrue on web.CategoriaWidget
Created 0005_auto__del_field_categoriawidget_nombreTrue.py. You can now apply this migration with: ./manage.py migrate web

Esto hace que los cambios se apliquen en el disco duro y sean vistos por nuestro sistema de control de versiones. Una vez hecho esto, tenemos que envíar nuestros cambios al repositorio. Nosotros usamos mercurial.

root@alice# hg add 
root@alice# hg commit -m 'testeando south'
root@alice# hg push

Una vez hecho esto, nos conectamos por ssh a la pc bob, y obtenemos la información desde el repositorio.

root@bob# hg pull 
root@bob# hg update 

Los cambios que tendrían que hacerse en la PC de Alice son los mismo que en la de bob, por lo que solo tenemos que aplicar los cambios que ha calculado el schemamigrate de Alice.

root@alice# python manage.py migrate web
Running migrations for web:
 - Migrating forwards to 0005_auto__del_field_categoriawidget_nombreTrue.
 > web:0005_auto__del_field_categoriawidget_nombreTrue
 - Loading initial data for web.

De esta misma manera podemos llevar los cambios a staging / producción.

¡Espero que les sirva! En realidad es bastante sencillo, y me parece que nos puede llegar a servir bastante.

Un abrazo,
Pedro

Google Chrome como root

¡Hola gente!

Les puede haber pasado que su chrome en ubuntu de repente no los dejase correr mas como root. Esto pasa no por una restricción intencional del equipo de ubuntu, sino por un error de cálculo. Ya está solucionado en la última versión de chromium.

so, running chrome as root: En consola, hagan lo siguiente

add-apt-repository ppa:chromium-daily/beta
apt-get update
apt-get install chromium-browser

Ahora, recordando que nuestro browser se llama ‘chromium-browser’, podemos volver a usar google chrome.

Creo recordar que esto era así, cualquier cosa me avisan.

EDIT: No estoy seguro de si esto sigue funcionando. Este post sigue teniendo visitas, asique les ofrezco lo que utilizo yo ahora:

# (recuerden crear el directorio que van a utilizar.)
mkdir /root/.config/chromium-browser

# lanzar el browser 
chromium-browser --user-data-dir=/root/.config/chromium-browser

Especificando este parámetro, podemos correr chrome como root.

Un abrazo,
Pedro

Enlaces recomendados && bonus

¡Hola gente!

Como ya es costumbre, hoy voy a agregar un listado de enlaces recomendados que he encontrado por ahi.

Además, una especie de follow monday con un par de blogs muy interesantes:

  • Bad ass JS – Interesantes recopilados de enlaces. Se nota mucho que está involucrado con Javascript.
  • The site with the lamp – La verdad es que no entiendo mucho de que habla el sujeto este, pero tiene post interesantes, como este por ejemplo
  • Single founder – Encara los problemas con los que se enfrentan las personas que intentan fundar su empresa por si solos. Tiene post mas interesantes que otros, destacando particularmente los que leí, este y este
  • Rasmus’ Toys Page

¡Espero que les sea de utilidad!

Un saludo,
Pedro

http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-stringAdd

Regex para convertir urls a links

¡Hola!

En el curso de mis viajes, me encontré en una situación en la que tenía que reemplazar URLs obtenidas desde un feed por links a esas URLs. Pensé en crear mi propio código regex, pero al final opté por utilizar google. Hoy me alegro de haberlo hecho, porque me encontré una expresión regular excelente que cubre las urls que veran si clickean este enlace.

Me parece que está muy completo, y hasta ahora no me ha fallado con ninguna url.

El código regex es:

<?php
$regexUrl = "/\b(([\w-]+:\/\/?|www[.]|(\w+\.))([^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/))))/";
// $2 = subdomain $3 resto de la url $1 cadena completa

Hice una función que simplifica bastante todo, simplemente hemos de pasarle como parámetro la variable en la que queremos que se transformen las URLs. La dejo a continuación, junto con un ejemplo de su uso. (es muy sencilla de utilizar.)

<?php

function urls_to_links($originalString) {
	return preg_replace("/\b(([\w-]+:\/\/?|(www[.]|\w+\.))([^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/))))/", '<a href="http://$3$4">$1</a>', $originalString);
}

$cadena = "esta es una www.match.com con regex.urls.com para transformar a links. Dije alguna vez regex transformar urls? regex.urls.com/transformar/a/links";
$transformada = urls_to_links($cadena);

// ¡la cadena tiene ahora transformados los enlaces!
echo $transformada;

Para aquellos a los que les interese, el test case de esta aplicación es el siguiente:

<?php // regex to transform links test case / regex para transformar urls a enlaces - links test case

$testCases = "http://google.com/mail
http://google.com/mail/
(Something like http://google.com/mail)
http://en.wikipedia.org/wiki/Wikipedia:Manual_of_Style_(disambiguation_pages)
(Something like http://en.wikipedia.org/wiki/Wikipedia:Manual_of_Style_(disambiguation_pages))
http://google.com/mail.
http://google.com/mail/.
<http://google.com/mail>
<http://google.com/mail/>
http://google.com/mail,
http://www.tokyoflash.com/blog/?p=1288.
http://website.ws/faq
http://userid:password@example.com:8080
http://userid@example.com
http://userid@example.com:8080
http://userid:password@example.com
<tag>http://google.com/mail</tag>
Just a www.google.com link.
this is a adsense.google.com
this is a adsense.google.com/
this is a http://adsense.google.com
this is a http://adsense.google.com/";

$testCases = explode("\n", $testCases);

$urlRegex = "/\b(([\w-]+:\/\/?|(www[.]|\w+\.))([^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/))))/";
foreach($testCases as $testCase) {
	$stringWithUrls = preg_replace($urlRegex, '<a href="http://$3$4">$1</a>', $testCase);
	echo $stringWithUrls . "<br />";
}

¡Eso sería todo!

Espero que les sea de utilidad, me costó bastante esfuerzo, y modifiqué bastante la expresión original. :)

Un saludo
Pedro

Fuente:
Liberal regex for matching URLs

Como lograr la máxima rentabilidad de sus programadores

Un programador, mas importantemente, es un ser humano. Esto algunas veces tiende a olvidarse, presionando al programador – la única persona en la empresa capaz de solventar cierto tipo de problemas urgentes en la empresa – a trabajar demasiadas horas seguidas, sin preguntarse por el impacto en su rendimiento. Estudios realizados demuestran que un programador trabajando 10 horas diarias rinde menos que uno trabajando 8 horas.

Uno ha de preguntarse, antes de emprender – o sugerir a alguien que emprenda – la sacrificada lucha heróica en contra de ese problema, lo siguiente:

  • ¿Es rentable aumentar las horas de trabajo a una cantidad mayor de 8 horas?
  • ¿Qué efecto tiene sobre la capacidad de tener nuevas ideas el trabajar demasiado?

¿Es rentable aumentar las horas de trabajo a una cantidad mayor de 8 horas?

De acuerdo a al estudio mencionado previamente, no. Cito a continuación:

A largo plazo, cuando un empleado del software trabaja mas de 40 horas por semana, se ralentiza el desarrollo del software y se generan mas bugs.

A corto plazo, el trabajar mas de 21 horas continuamente es el equivalente a estar legalmente alcoholizado.

A continuación, un extracto de datos interesantes, demostrados por estudios científicos:

  • “Cinco días de trabajo de 8 horas maximizan la productividad en todas las industrias en donde se han realizado estudios en el siglo pasado.”
  • “Es verdad, se aumenta lo producido aumentos horarios por plazos cortos. En casos de aumentos horarios de 60 horas por semana, el “corto plazo” no debería ser jamás de mas de 2 meses, ya que en este punto es en el que se logra lo que se hubiera logrado si se hubieran trabajado 40 horas por semana en el mismo tiempo. Después de ese punto, no solo se perderían las horas ganadas, sino que se comenzarían a perder horas”
  • “El trabajo continuo reduce las funciones cognitivas en un 25% cada 24 horas. Muchas noches seguidas sin dormir tienen un efecto acumulativo.”
  • “La taza de probabilidad de que un ser humano cometa un error, especialmente con falta de sueño, suben. Eventualmente algo de niveles catastróficos tiene la posibilidad de ocurrir. Con un deadline tan cerca, ¿está dispuesto a correr ese riesgo?”

Estudios, desarrollados para el pentagono, tienen resultados interesantes:

En nuestro estudio, soldados de el escuadron FDC [Escuadron de direccionamiento de artillería], fueron puestos a prueba durante situaciones de combate continuo simulado durante 36 horas. Durante esas 36 horas, su habilidad para calcular correctamente el rango, elevacion y dirección, fue excelente. Sin embargo, después de 24 horas de haber comenzado, ellos no sabían si estaban disparandole a unidades enemigas o aliadas. No sabían a que le estaban disparando. Antes de este tiempo, cuando dimos la orden de fuego simulado a un hospital, el equipo checkeaba el mapa situacional, observaba la naturaleza del objeto y rechazaba la orden. Mas tarde en la simulación, atacaban sin dudarlo a cualquier objeto.

¿Qué efecto tiene sobre la capacidad de tener nuevas ideas el trabajar demasiado?

Muchas veces se nos olvida, pero frecuentemente la solución a un problema no está en golpearlo con un martillo, sino en encontrar la solución inteligente.

¿Cuantas veces, y después de enfrentarse a una situación por mucho tiempo, nos encontramos con que existía una solución muy sencilla al alcance de nuestra mano?

La inspiración viene a nosotros lenta y silenciosamente. Fundamentalmente con un poco de soledad.

Además, la mayoría de la gente que hoy por hoy es millonaria lo ha logrado a travéz de la materialización de una idea, idea que surgió en un momento de inspiración.

¿Realmente vale la pena el correr sin importar en que dirección estamos yendo? Después de todo, somos humanos, y sabemos que existe la posibilidad de que estemos atacando un hospital aliado, por citar un ejemplo.

Un saludo,
Pedro Worcel (Perfil de linkedin)

Fuentes:
Did your boss thank you for coding yourself to death?
Why crunch mode doesn’t work
Impact of overtime on productivity

Seguir

Get every new post delivered to your Inbox.

Únete a otros 345 seguidores