@Darem0 si señor!

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)

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.

Bloquear flash en Safari

Bueno, hace un tiempo estoy haciendo un poco de benchmark sobre mi MacbookPro y noté que en ciertos momentos, aparte de que la temperatura del micro se va a las nubes, la batería me dura la mitad de lo que debería. Chequeando un poco los procesos que estan corriendo en la maquina, descubrí que cada tanto el micro gasta 20% de los recursos en ejecutar flash en Safari. Me parece un despropósito, más cuando los flash que se están ejecutando son publicidades del diario o porquerías de esas.

Inmediatamente recordé flashblock para firefox, un plugin que bloquea la ejecución de flash en firefox y para poder ejecutarlo necesitas hacerle click. Navegando un poco, encontré ClickToFlash que, aparte de estar buenisimo, es libre :)

Aparte del chiche obvio de ser un plugin de safari que bloquea flash, tiene un par de cosas muy interesantes, las que mas me interesaron fueron:

  • Posibilidad de ejecutar youtube en quicktime en lugar de en el plugin de flash
  • Listas blancas para sitios que si puedan ejecutar flash sin preguntar
  • Se instala con un .pkg y se actualiza solo cuando hace falta
  • ¡Es Libre!

Upload de imagenes en CakePHP

Primero que nada, quiero decir que no soy un power developer de CakePHP ni de PHP. De hecho medio que casi no me gusta escribir PHP. Con esto dicho, tiro un pequeño snippet que uso en CakePHP para hacer upload de imágenes en cakephp usando un file input en la vista

Para que entiendan mejor, esto es un admin_add de una news. Una news es como un post de blog que tiene titulo, cuerpo y una imagen asociada. En la tabla solo guardo la URL a la imagen que se hizo upload.

Primero, el snippet de la función que hace el upload. Esto lo pongo directamente en el controller como ultimo metodo, junto con los edit, add, admin_add, view, index, whatever.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function __upload($file_array){
    $file = new File($file_array['tmp_name']);
    $file_base = pathinfo($file_array['name']);;
    $ext = strtolower($file_base['extension']);
    if ($ext != 'jpg' && $ext != 'jpeg' && $ext != 'gif' && $ext != 'png') {
        $this->Session->setFlash('You may only upload image files.');
        $this->render();
    } else {
        $data = $file->read();
        $file->close();
        $full_path = '/upload_images/'.$file_array['name'];
        $file = new File(WWW_ROOT.$full_path, true);
        $file->write($data);
        $file->close();
         return $full_path;
    }
    return 'Ouch!';
}

Si usas este ejemplo, las imagenes se guardan en wwwroot/upload_images/

Este snippet funciona con cualquier tipo de archivos, no solo con imagenes. Es cuestión de sacarle el check que hago al tipo de extensión del archivo.

Si querés ver como lo uso, vas a tener que entrar al post.. :P

Seguir Leyendo »