Balconeando en casa con el @rulski

Back around

Ya pasó un tiempo largo desde la última vez que escribí aca, pero para los que me conocen, saben que las cosas vienen cambiando en tamaños agigantados últimamente.

Ando con 0 tiempo para nada, ya casi ni en twitter estoy, pero voy a tratar de este mes escribir un par de líneas al menos de lo que viene siendo la experiencia de trabajar en Olapic estos meses en New York.

Stay tuned… (voy a tratar de que sea esta noche)

Buscar archivo debajo del cursor en VIM

Trabajando con una aplicación que usa templates, me encontré muchas veces viendo que cierto script abre después cierto template, si quiero ver ese archivo, tengo que buscarlo. Lo mismo si tengo imports..

Buscando en el wiki de vim encontre un script que sirve para encontrar archivos dentro del directorio donde estas parado (cd).. Yo lo modifiqué un poco y quedó asi:

"Function for finding files
" Find file in current directory and edit it.
function! Find(name)
  let l:list=system("find . -name '".a:name."*[htm|html|php]' | grep -v .svn | perl -ne 'print \"$.\\t$_\"'")
  let l:num=strlen(substitute(l:list, "[^\n]", "", "g"))
  if l:num < 1
    echo "'".a:name."' not found"
    return
  endif
  if l:num != 1
    echo l:list
    let l:input=input("Which ? (CR=nothing)\n")
    if strlen(l:input)==0
      return
    endif
    if strlen(substitute(l:input, "[0-9]", "", "g"))>0
      echo "Not a number"
      return
    endif
    if l:input<1 || l:input>l:num
      echo "Out of range"
      return
    endif
    let l:line=matchstr("\n".l:list, "\n".l:input."\t[^\n]*")
  else
    let l:line=l:list
  endif
  let l:line=substitute(l:line, "^[^\t]*\t./", "", "")
  execute ":e ".l:line
endfunction
command! -nargs=1 Find :call Find("<args>")

Esta funcion se usa haciendo algo como

:Find <nombre>

Lo que hice fue que busce archivos con extension especificas [html|htm|php] y evita el directorio “.svn”. Este script se puede modificar de muchas formas, así es como me sirve a mi…

Otro detalle que le hice, fue hacer un keybiding para buscar directamente, sin escribir el comando.

:nmap <leader>f "zyiw:exe "Find ".@z.""<CR>

De esta forma con ”\f” buscas el archivo en el que el cursor esta parado. OJO si cambiaste el leader de VIM que cambia el binding.

Búsqueda recursiva en VIM

Hoy me encontré con la necesidad de corregir todos los archivos de una aplicación que hacían una llamada por ajax. Buscando un poco, encontré esto que es *muy* útil

vimgrep /$.ajax/ **/*.html

Después podes ver los resultados con:

:copen

Les dije que VIM es *GENIAL*?

Encriptar archivos en unix

Como mi memoria es un asco, tengo un archivo en el disco de la mac que tiene mis passwords anotadas, y dicho archivo se hace backups todos los días por las dudas mediante time-machine..
Ahora.. ese archivo, claramente, no puede estar en texto plano así nomas así que estuve buscando alguna forma de encriptar el archivo y que sea al menos un poco mas seguro (y de paso molesto para mi)..

Una forma es hacer un .zip con clave, lo cual suckea jodidamente.. buscando un poco más, encontré esto:

Para encriptar:

openssl des3 -salt -in passwords -out passwords.crypt

Para desencriptar

openssl des3 -d -salt -in passwords.crypt -out passwords

Simple..
Ahora tengo que buscar una forma de que encripte y desencripte on-the-fly para ver ese archivo pidiendo la clave.. Ya se me va a ocurrir un script, mientras… esto sirve

UPDATE:
Me tiraron el dato que vim encripta archivos y despues los podes leer usando la opcion -x, es decir:

vim -x [archivo]

Css tip del día

*{ outline: none; }

Te borra todo los bordes cuando haces focus en cosas. El famoso borde punteado feo..

Amo VIM

Si leyeron el post anterior… Quizas entiendan porque esto que estoy haciendo está bueno…

:%s/^\(\d\d\)\(.*\)/<li><a href="images\/membranofonos\/\1.jpg">\2<\/a><\/li>

Renombrar archivos en batch chetamente

Ayer me encontré con un problema interesante. Resulta que estoy haciendo un laburo que consta de quichimil imágenes nombras de formas exóticas, la forma del nombre era algo como [numeros]{unmontondecosasquecambiaban}.jpeg/gif, yo necesitaba trabajar con algo mas facil de reconocer automágicamente, ademas los numeros eran consecutivos y no se repetían… no tarde mucho en decidirme en [numeros].jpeg/gif

Bien, la cosa era como hacer ese laburo, se me ocurrió empipar cosas, y hacer cosas como

find ./ -name [0-9]*.* | Algo que pase ese nombre a algo útil

Pero es muy difícil sacar las partes del nombre que te hace falta y chantarselo despues de un mv. Cuando me di por vencido, me fui a un canal innombrable de IRC a preguntar.. Me tiraron el dato de un script que viene con un paquete en Debian cuando instalas xfce. El script en Debian se llama prename pero es una variación de un script mas viejo que se llama rename. Está escrito en perl y es *muy* cheto porque funciona con expresiones regulares. Esto me permitió hacer cosas como:

perl renamer.pl 's/(\d+).*\.([\w]+)/$1.$2/' *.*

Si no entendes expresiones regulares.. andá a leer sobre expresiones regulares.. esto busca algo de la forma que nombré mas arriba y lo reemplaza en el nombre del archivo, borrando el anterior y dejando el nuevo con el nombre bonito.

Esto es genial por si no se dieron cuenta, porque permite renombrar todo lo que quieran usando estas expresiones regulares que son un bodrio pero amamos.

Por si les interesa el script, lo subí a GitHub y a BitBucket. Y lo ejecutas con la forma que puse mas arriba. Esto va a andar en cualquier computadora que tenga perl instalado (Linux y Mac lo tienen, Windows no tengo la mas remota idea)

Resumen 2010

Este es mi resumen del 2010 sin orden aparente, solo como vino llegando

  • Cumplí otro bello año de novios con @mcwelschen
  • Me compré una MacBook Pro
  • Me compré un iPhone
  • Laburé 6 meses en Media 8, una de las mejores experiencias de laburo que tuve (gracias Gaby y Martin)
  • De ahí salí con dos grandes amigos, Darem0 y Lisa
  • Cumplí otro año más trabajando en la Facultad de Filosofía y Humanidades, van 2
  • Me compré una cámara de fotos, y tuve mi época de turista japones
  • Empecé y terminé el proyecto de tesis de la facultad con @mcwelschen, @andy_mcpalace y otro compañero más
  • Salvé una materia gracias a @mcwelschen y otro compañero de la facu
  • Fuí 2 veces a Buenos Aires
  • Fuí a 2 Barcamps
  • Mandé muchos presupuestos grandes que no se dieron
  • Mandé muchos presupuestos chicos que si se dieron
  • Vinieron clientes nuevos que trajeron proyectos muy interesantes
  • Di una charla en Barcamp junto a @pablius
  • Cambié mi objetivo de laburo, ahora soy más selectivo (algunos dicen que hice un retiro zen)
  • Di una charla en Barcamp junto a @ezequielprieto
  • Largué con 3 pet projects
  • 1 de esos proyectos es a largo plazo con un amigo que si pega nos hacemos millonarios :P
  • Conocí y no me enamoré de La Rioja
  • Conocí y me enamoré de La Cumbrecita
  • Vine a Neuquén en avión y espero no tener que volver a venir en colectivo nunca más
  • Facultativamente hablando este año dió asco
  • Me diagnosticaron 3 alergias malaonda que no se curan
  • Hice amigos nuevos con los cuales vienen saliendo proyectos lindos

Si me voy acordando de más cosas, las agrego

Redimensionar imágenes en CakePHP

Desarrollando una app en CakePHP, me encontré con que necesitaba hacerle resize a un par de imagenes para mostrarlas en el frontend. Es un tema común en cualquier desarrollo y no debería ser tan complicado. Buscando, encontré esta solución que si bien estaba buena, en la versión de CakePHP que estoy usando no servía, asi que la modifiqué un poco y ahora anda. Es un helper, por lo que se puede usar directamente desde el template previamente llamándolo en el controller

El helper solito se encarga de hacerle el resize a las imágenes y guardarlas en el directorio /webroot/image_cache, hay que asegurarse de que ese directorio exista

/app/views/helpers/resizer.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?php  
class ResizerHelper extends AppHelper { 
    var $helpers = array('Html'); 
    var $cacheDir = 'image_cache'; // relative to IMAGES_URL path 
 
    /** 
     * Automatically resizes an image and returns formatted IMG tag 
     * 
     * @param string $path Path to the image file, relative to the webroot/img/ directory. 
     * @param integer $width Image of returned image 
     * @param integer $height Height of returned image 
     * @param boolean $aspect Maintain aspect ratio (default: true) 
     * @param array    $htmlAttributes Array of HTML attributes. 
     * @param boolean $return Wheter this method should return a value or output it. This overrides AUTO_OUTPUT.
     * @return mixed    Either string or echos the value, depends on AUTO_OUTPUT and $return. 
     * @access public 
     */ 
    function resize($path, $width, $height, $aspect = true, $htmlAttributes = array(), $return = false) {
        $types = array(1 => "gif", "jpeg", "png", "swf", "psd", "wbmp"); // used to determine image type
        $fullpath = ROOT.DS.APP_DIR.DS.WEBROOT_DIR.DS;
        $url = $fullpath.$path; 
        if (!($size = getimagesize($url)))  
            return; // image doesn't exist 
        if ($aspect) { // adjust to aspect. 
            if (($size[1]/$height) > ($size[0]/$width))  // $size[0]:width, [1]:height, [2]:type
                $width = ceil(($size[0]/$size[1]) * $height); 
            else  
                $height = ceil($width / ($size[0]/$size[1])); 
        } 
        $relfile = $this->webroot.$this->cacheDir.'/'.$width.'x'.$height.'_'.basename($path); // relative file 
        $cachefile = $fullpath.$this->cacheDir.DS.$width.'x'.$height.'_'.basename($path);  // location on server 
        if (file_exists($cachefile)) { 
            $csize = getimagesize($cachefile); 
            $cached = ($csize[0] == $width && $csize[1] == $height); // image is cached 
            if (@filemtime($cachefile) < @filemtime($url)) // check if up to date 
                $cached = false; 
        } else { 
            $cached = false; 
        } 
        if (!$cached) { 
            $resize = ($size[0] > $width || $size[1] > $height) || ($size[0] < $width || $size[1] < $height);
        } else { 
            $resize = false; 
        } 
        if ($resize) { 
            $image = call_user_func('imagecreatefrom'.$types[$size[2]], $url); 
            if (function_exists("imagecreatetruecolor") && ($temp = imagecreatetruecolor ($width, $height))) {
                imagecopyresampled ($temp, $image, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);
              } else { 
                $temp = imagecreate ($width, $height); 
                imagecopyresized ($temp, $image, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);
            } 
            call_user_func("image".$types[$size[2]], $temp, $cachefile); 
            imagedestroy ($image); 
            imagedestroy ($temp); 
        }          
        return $this->output(sprintf($this->Html->tags['image'], $relfile, null), $return); 
    } 
}
?>

Entonces, para poder usarlo en el template hay que agregarlo en el controller

1
var $helpers    = array('Html', 'Form', 'Session', 'Resizer');

Y finalmente, en el template

1
<?php echo $this->Resizer->resize($image['url'], 150, 150, true) ?>

Markup.io :: Web app infaltable para web development

Acabo de descubrir a traves de Online una aplicación web para hacer anotaciones sobre las páginas web y pasar las URLs con las notas

Para usarlo, simplemente tenes que entrar al sitio oficial y copiar el bookmark button para usarlo

Es impresionantemente útil durante el desarrollo de paginas web. Podes hacer trazos, círculos, flechas y anotaciones textuales. Mi nueva webapp favorita.