lunes, 3 de marzo de 2014

Lunes 2 de Enero de 2006 a las 3 de la tarde con 4 minutos y Go

En una de mis tantas travesías por aprender nuevas cosas me encontré con la necesidad de manipular fechas en el lenguaje go y bueno me encontré con la ¿grata? sorpresa de no podía utilizar mis conocimientos "ancestrales" de transformación de fechas, por ejemplo %Y para años o %H para horas sino que go tratando de "facilitarle" la vida a los programadores decidió utilizar la mnemotecnia para el formato de fechas (y obviamente de horas) empleando el siguiente estándar:

  1. Día
  2. Mes
  3. Hora (en realidad se usa el 15 que significa 3pm)
  4. Minutos
  5. Segundos
  6. Año
  7. Timezone

Entonces resumiendo, en lugar de utilizar representaciones para hacer el formato, utiliza una fecha:

01/02 03:04:05PM '06 -0700

Ejemplo:

viernes, 28 de febrero de 2014

Configurar multiples claves ssh

En algunas ocasiones necesitamos usar diferentes cuentas de git para manipular los repositorios, por ejemplo tenemos una cuenta de la empresa y por ende usamos la cuenta de la empresa pero tenemos algún proyecto personal y queremos manejarlo con nuestra cuenta personal.

Cuando esto sucede podemos llegar a tener problemas porque git dice que no se tiene permisos para ver tal o cual repositorio.

¿Cómo podemos solucionarlo?

Una de las opciones es configurar diferentes cuentas ssh y darle alias a los urls para que pueda distinguir que cuenta usar, para lo cual debemos seguir los siguientes pasos:

  1. Crear la clave
    ssh-keygen -t rsa -C "aquí@el_email.com"
  2. Agregar las claves al agente ssh
    ssh-add ~/.ssh/id_rsa_oficina
    ~/.ssh/id_rsa_personal
  3. Crear el archivo de configuración de shh
    cd ~/.ssh
    touch config
    chmod 0600
  4. Agregar las definiciones de alias y autenticación
    #Oficina
    Host github.com-oficina #Este es el alias
        HostName github.com
        User git
        IdentityFile ~/.ssh/id_rsa_oficina #Recuerda usar el path absoluto
    
    #Personal
    Host github.com-personal
        HostName github.com
        User git
        IdentityFile ~/.ssh/id_rsa_personal
  5. Al clonar el proyecto en lugar de usar github.com user el alias
    git clone git@github.com-oficina:oficina/repo.git
  6. Si ya tenías clonado el proyecto simplemente cambia el url del mismo
    git remote set-url origin git://git@githb.com-oficina:oficina/repo.git

miércoles, 26 de febrero de 2014

Numeros a letras

Hoy estaba todo juicioso como siempre, trabajando, cuando me quisieron meter la pica de cómo hacer el típico algoritmo para transformar de números a letras, pues bueno como estaba todo juicioso no cambié de tema y seguí trabajando (porque siempre trabajo juicioso) pero llegué a la casa y me puse manos a la obra.

Los requisitos eran hacerlo en ingles (you know numbers to words) y hacerlo en ruby.

¿Qué lógica utilicé?
Bueno, tanto las unidades como las centenas utilizan los mismos nombres salvo que las centenas llevan incorporada la palabra hundred así que utilicé un arreglo para manejar estas dos posiciones, luego caí en cuenta que en inglés (¿también en español?) el proceso se repite cada tres dígitos, es decir procesar por ejemplo 123 y 123xxx (nada en particular las 3 x's solo me refiero a cuales quiera dígitos que usemos) da exactamente igual salvo que cada 3 dígitos toca ponerle un nombre (miles, millones, billones, etc) por lo que para esta parte también generé un arreglo con los nombres, y el último caso es que los nombres para las decenas dependen del valor de las unidades cuando la decena es 1, es decir para los dieces (¿cómo se dice esto en español?) once, doce, etc, así que creé 2 arreglos, uno para las decenas con dígito 1 y otro para las decenas con cualquier otro dígito.

Y bueno, esto es lo que salió:

En Gist para que lo copien, mejoren, etc:

jueves, 13 de febrero de 2014

Inotify Watches Limit

Uno de los programas que utilizo en linux utiliza Inotify el cual permite monitoreas eventos relacionados con el sistema de archivo.

En los últimos días he estado recibiendo una alerta indicando que se ha llegado al límite de observadores. Esto se da porque tiene que monitorear gran cantidad de archivos (el límite por defecto es 8192).

¿Cómo se puede corregir este problema?
En Ubuntu se puede hacer de 2 maneras, si lo quieres arreglar para la sesión actual puedes usar:

echo 32768 > sudo tee /proc/sys/fs/inotify/max_user_watches

Si deseas arreglarlo de forma permanente entonces cambia el archivo /etc/sysctl.conf y agrega esta línea

fs.inotify.max_user_watches=32768

lunes, 28 de octubre de 2013

Nginx: 413 Request Entity Too Large

Estaba yo todo "juicioso" trabajando como siempre cuando de repente me dicen: "La aplicación está dando un problema!!!" y bueno, quienes me conocen, saben que nunca me equivoco por lo que debía existir un error en el servidor.

Haciendo el respectivo "debug" me encontré conque Nginx estaba botando el siguiente error: 413 Request Entity Too Large.

La aplicación permite subir fotos y estaban intentando subir una foto de más de 2MB de tamaño.

Resulta que Nginx está configurado por defecto para permitir un tamaño de mensaje de máximo 2MB por lo que procedí a hacer el siguiente cambio:

En el archivo /etc/nginx/nginx.conf (el path puede cambiar de acuerdo al S.O y forma de instalación) agregué la siguiente linea:

client_max_body_size 5M;

luego recargué Nginx y listo.

/etc/init.d/nginx reload

lunes, 14 de octubre de 2013

¿Cómo eliminar múltiples archivos de un repositorio git?

Estaba en la tarea de actualizar la version de Sencha Touch en un proyecto en el que estoy trabajando corriendo el muy conocido comando

sencha app upgrade /path/a/la/nueva/version

y pues al hacer las respectivas pruebas y arreglos, me puse en la tarea de actualizar el repositorio, por lo que, corrí el otro muy conocido commando

git status

Y oh sorpresa, existían muchos pero muchos archivos en diferentes carpetas que debían ser eliminados del repositorio, junto con muchos que debían ser agregados (al haber sido modificados y/o creados).

Para agregar los nuevos el siguiente commando hace el milagro

git add /path/

Pero para borrar no puedo usar simplemente

git rm .

dado que borraría TODOS los archivos.

¿Y el recontra conocido git -a o git -u?

Pues serviría siempre y cuando quieras subir TODOS tus cambios (y a veces no quieres hacer eso)

Entonces, ¿cuál es la solución?

Facilísimo:

git ls-files --deleted -z | xargs -0 git rm

Y bueno expliquemos un poco:

git ls-files: lista archivos del indice de git
--deleted: solo muestra los archivos eliminados
-z: pone \0 (el conocido NUL) como terminador del string (util si el path tiene espacios)
|: concatena la salida del primer commando con el siguiente
xargs: permite concatenar argumentos y pasarlos a un comando (en este caso git rm)
-0: utiliza \0 como character de separación (por esto usamos -z en git ls-files)

martes, 8 de octubre de 2013

¿Cómo configurar Nginx para que utilice autenticación HTTP?

Estaba haciendo una migración de servidores y decidí cambiar Apache por Nginx, todo resultó bastante "sencillo", pero ¡oh sorpresa! uno de los sitios web necesita autenticación HTTP para funcionar como se espera.

Y bueno, caí en cuenta de que no tenía idea de como hacerlo por lo que luego de una pequeña búsqueda en google investigación pues encontré estos pasos:

1. Para poder generar el password cifrado utilicé Apache Utils por lo que ejecuté:
sudo apt-get install apache2-utils

2. Crear el usuario y el password
sudo htpasswd -c /path/donde/mantener/el/archivo/.htpasswd el_nombre_de_usuario

Pedirá el password:
New password:
Re-type new password:
Adding password for user el_nombre_de_usuario

3. Actualizar el archivo de configuración de Nginx
sudo vi /etc/nginx/sites/available/el_archivo_de_configuracion_del_sitio_web

En este archivo, en la sección location se debe agregar lo siguiente:

auth_basic "Restricted";
auth_basic_user_file /path/donde/mantener/el/archivo/.htpasswd;

Ejemplo:

server {
  listen      numero_de_puerto;
  server_name el_dominio.com;
  location / {
    root                 /el/path/a/la/raiz/del/sitio;
    auth_basic           "Restricted";
    auth_basic_user_file /el/path/al/archivo/.htpasswd;
}

4. Luego simplemente recargamos Nginx y listo:

sudo /etc/init.d/nginx