jci's blog

Earthquakes can't stop the rock

Escrito el 08/01/11 12:38:50 pm por jci

It's Gotta Be the Ugliest Hack I Have Ever Done

Categories: GNU/Linux, Programacion, Hacks, Ubuntu

[ debido a algun NDA, no puedo revelar ciertos detalles, pero contare los importantes ]

Intentando mejorar ciertos aspectos de [ censura ], se me ocurrio implementar un sistema de alarmas rapido, eficaz, economico y audaz. Ahora, el asunto es que jugar con protocolos de comunicacion no es uno de mis fuertes pero si lo es el [ censura ] y tambien [ censura ]. Despues claro de intentar hacer funcionar rancios programas hechos en C o Python.

IMG_3489
Snowy day here at the end of the world

De pasadita, encontre un bug que afecta a finch y pidgin, pero los contare otro dia. Ya esta el bug en Launchpad :B

A lo que ibamos.

Empece primero usando XMPP, ya que [ censura ] y ya estaba corriendo, asi que fue mi primera eleccion. Debido a que el servidor estaba corriendo con [ censura ] y no dejaba conectarse por otra cosa que no fuera pidgin...

Despues de reintentos varios donde tuve cosas como hostMistmatch y cepillandome un par de bibliotecas en Python decidi abortar mision. Aunque claro, instalando un XMPP server local, incluso con negociacion con TLS, andaba de peluches.

IMG_1325
Some friends call this a quick action photo

Recorde que hace tiempo me mostraron que Pidgin era compatible con Bonjour. Bonjour (antiguamente Zeroconf) permite mostrar servicios a traves de la red usando (inserte su magia favorita aqui) y los programas que sean capaces de entender estos mensajes, pues los interpretan.

Veamos un ejemplito, sin censura, claro.

Resolved service:
  fullname   = boba\032\09100\05821\0589b\0586a\058a6\058a6\093._workstation._tcp.local.
  hosttarget = boba.local.
  port       = 9
Service added; resolving
Resolved service:
  fullname   = lacantina\032\09100\05821\0589b\05872\058ac\05828\093._workstation._tcp.local.
  hosttarget = lacantina.local.
  port       = 9

Que carajos es esto? Pues bien, un mensaje que indica solamente la presencia de una workstation en la red local. Es todo.
Ah, lo interesante. Es manejado todo por debajo del capo usando Avahi. Si no saben que es, apliquense un google. Y 1000 internets menos.

IMG_3392
Dessert

Todos los que son hosttarget son las maquinas que mDns resuelve de forma economica y audaz. Si quieren mirar la forma de resolucion de estos nombres...

jci@socrates:~/Build/pybonjour-1.1.1/examples$ more /etc/nsswitch.conf 
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         compat
group:          compat
shadow:         compat

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4 # <- LOOKIE HERE!
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

Cierto. Primero mira /etc/hosts, de ahi usa mDns para la resolucion de hosts. Si no lo encuentra, usa una version mas completa. Y de ahi mDns en IPV4. Nota : este detalle de IPV4 es super importante en un problema que tuve haciendo pruebas.

Ahora miremos lo que necesitamos : Bonjour. Afortunadamente, este servicio tambien se registra en la red con el nombre de "presence". Y como Bonjour tambien identifica el tipo de conexion (tcp, en este caso), lo unico que nos queda es preguntar en la red local quienes tienen corriendo el servicio presence.

Y voila!

jci@socrates:~/Build/pybonjour-1.1.1/examples$ python browse_and_resolve.py _presence._tcp
Service added; resolving
Resolved service:
  fullname   = jci\064socrates._presence._tcp.local.
  hosttarget = socrates.local.
  port       = 5298
Service added; resolving
Resolved service:
  fullname   = user1\064lacantina._presence._tcp.local.
  hosttarget = lacantina.local.
  port       = 5298
Service added; resolving
Resolved service:
  fullname   = user2\064muldernix._presence._tcp.local.
  hosttarget = asterix.local.
  port       = 5298

Asi que lo que me queda : conectarme directo a cada uno de esos "hosts" (nota : los .local son agregados de la resolucion de mDns) y lanzarles un mensaje.

IMG_3376
Weird collection of weird toys

Spamming time!

#!/bin/bash

for i in `cat listahosts.txt`
do
      echo '<message type="chat"><body>'Feed me a stray cat'</body></message> ^] quit' \ 
      | telnet $i 5298
done

Les dije que el hack era algo feo.

Por supuesto que el mensaje de ejemplo de aca es bastante burdo. El real mensaje que debo enviar es [ censura ].

Si, yo tambien odio los NDA. Pero a fin de cuentas, lo importante no esta censurado. [ censura ]. Creo.

IMG_3431

That's not fog. It's a freaking cloud

Ah, y el problema que tuve con IPV4. Pues bien, al usar Bonjour con Pidgin, si esta habilitado IPV6, va a intentar resolver...con errores. Deshabilitar IPV6 con

# echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6

Dije que esto se veia feo.

5278 views » Send feedback »

Escrito el 07/22/11 01:20:08 am por jci

As I said before, go back to the matresses

Categories: GNU/Linux, Fotografia, Hacks

Los que se hayan dado cuenta, hice unos cuantos cambios por debajo del capo en mi glob. Primero, migre todo el contenido a MySQL 5 (conectado con un cliente en MySQL 3, pero no le cuenten a nadie). De ahi le di con un enshulamiento con todo.

Conversando con mi partner Rodrigo Fuentealba, me recomendo Perkins si es que me animaba a dise~ar algo. Debo confesar que a pesar de tener algo de experiencia en HTML, CSS es una perdicion para mi. No lo uso muy seguido y prefiero leer el codigo en HTML primero antes de tirarme las partes. Esta vez no fue la excepcion. Parti con el ejemplo y cambiar cosas...

...de ahi vino lo interesante : tomar el template de B2evolution y adaptarlo a perkins. Despues de un par de horas de errores garrafales, finalmente se arreglo.

Asi que recomiendo usar Perkins si es que estan en apuro de dise~o de HTML.

Ah, y de pasadita el glob quedo bien livianito para leer en navegadores. Que tal? :D

HDR
HDR!

Y en otras noticias menos interesantes, me di cuenta de algo horrible : me volvi obsesivo compulsivo. Ejemplo? Encontre una leve pelusa en las fotos con una camara relativamente nueva (Canon T2i). Asi que...empezar a buscar donde estaba la pelusa de mierda y removerla. La encontre, pero dentro del lente. Pensar que estuve casi 4 horas pensando (durante la noche) de como empujarla o removerla del autofocus. Si, requirio abrir el lente y mandar a la verga la garantia. Valio la pena, por supuesto.

IMG_1457
Pics should be THIS pristine, by the way

Y de pasadita encontre otra dentro del sensor, pero salio altiro.

1177 views » Send feedback »

Escrito el 05/23/11 02:40:36 pm por jci

After all this bullshit, something must come to a good end

Categories: Web Link Blog, GNOME, GNU/Linux, Programacion, Hacks

Hace un tiempo atras, Claudio subio un script en Python que permite esto:

jci@rock:~/Photos/l$ ls
IMG_1190.JPG  IMG_1191.JPG  IMG_1192.JPG  IMG_1193.JPG
jci@rock:~/Photos/l$ ~/scripts/picsdir.py .
IMG_1191.JPG
creating dir ./2011-05-23
./2011-05-23
IMG_1192.JPG
./2011-05-23
IMG_1193.JPG
./2011-05-23
IMG_1190.JPG
./2011-05-23
Traceback (most recent call last):
  File "/home/jci/scripts/picsdir.py", line 66, in <module>
    print sum(getsize(join(root, name)) for name in files)
NameError: name 'files' is not defined
jci@rock:~/Photos/l$ ls
2011-05-23

Pero desde que me dio por actualizar a Natty...

jci@socrates:~/Photos/untitled folder 2$ ~/scripts/picsdir.py  .
IMG_1101.JPG
Traceback (most recent call last):
  File "/home/jci/scripts/picsdir.py", line 64, in <module>
    start=Main(sys.argv)
  File "/home/jci/scripts/picsdir.py", line 62, in Main
    move_smartly (filename, dir_in, dir_out)
  File "/home/jci/scripts/picsdir.py", line 29, in move_smartly
    image = pyexiv2.Image(image_file)
AttributeError: 'module' object has no attribute 'Image'

Nada que un hack no pueda hacer :-)

#!/usr/bin/env python

# Copyright (C) 2008  Claudio Saavedra 
# modified by jci :-)
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see .

import sys
import pyexiv2
import os
import os.path
import shutil
import mimetypes

def move_smartly(file, dir_in, dir_out):
    image_file = os.path.join (dir_in, file)
    image = pyexiv2.ImageMetadata(image_file)
    image.read()
    try:
    	date_creation = image['Exif.Image.DateTime']  
    except:
	print "i'm ignoring this"
        return
    print date_creation
    str_date = date_creation.value.strftime('%Y-%m-%d')
    target_dir = os.path.join (dir_out, str_date)

    if (not os.path.exists(target_dir)):
        print "creating dir " + target_dir
        os.mkdir(target_dir)
    print target_dir
    shutil.move (image_file, target_dir)


def Main(args):
    if (len (args) < 1):
        sys.exit("not enough parameters")
    dir_in = args[1]
    if (len (args) < 3):
        dir_out = dir_in
    else:
        dir_out = args[2]

    for root, dirs, files in os.walk (dir_in):
        for f in files:
	    print f
            filename = os.path.join (root, f)
            if mimetypes.guess_type(filename)[0] == 'image/jpeg':
                move_smartly (filename, dir_in, dir_out)

start=Main(sys.argv)

print sum(getsize(join(root, name)) for name in files)
2851 views » Send feedback »

Escrito el 05/15/11 11:19:38 am por jci

Pretty much like Nutella and Chocolate, but with less fat

Categories: Web Link Blog, GNOME, GNU/Linux, Beer, Fotografia, Hacks

Para la gente que no me conozca, tengo varios hobbies que he conservado a lo largo del tiempo. Aparte del PS3, es la fotografia.

Nublado en la plataforma en Paranal

Bueh, y como desde hace un tiempo estoy trabajando en un lugar que tecnicamente se pueden ver las estrellas durante la noche. El gran problema de ciudades como Santiago es que la contaminacion luminica no permite ver las estrellas. Algo similar a "los arboles no dejan ver el bosque".

Entonces pense que seria interesante hacer un stop motion de las estrellas moviendose. Asi que a mirar no solamente el manual de la camara, sino tambien que clase de desechos podria tener en casa que pudieran ayudarme.

IMG_0928

Gphoto

Libgphoto2 es una biblioteca de manejo de camaras digitales. Pero, lamentablemente, tiene un soporte medio fulero para algunas camaras. Y lamentablemente, tengo una camara que no soporta a libgphoto2...

"Canon and some Nikon cameras only: capturetarget - setting this to sdram will make the camera capture directly into the camera RAM and not on the memory card. You need to download the image in the same gphoto2 call..."

Bueh, puedo vivir con eso. Incluso, la comunicacion con la camara me permite hacer video!

jci@arthur:~$ gphoto2 --list-config
/main/actions/uilock                                                           
/main/actions/syncdatetime
/main/actions/autofocusdrive
/main/actions/manualfocusdrive
/main/actions/eoszoom
/main/actions/eoszoomposition
/main/actions/eosviewfinder
/main/actions/eosremoterelease
/main/settings/datetime
/main/settings/reviewtime
/main/settings/output
/main/settings/evfmode
/main/settings/ownername
/main/settings/artist
/main/settings/copyright
/main/settings/capturetarget
/main/settings/capture
/main/status/model
/main/status/ptpversion
/main/status/batterylevel
/main/status/lensname
/main/status/serialnumber
/main/status/shuttercounter
/main/status/availableshots
/main/imgsettings/imageformat
/main/imgsettings/imageformatsd
/main/imgsettings/iso
/main/imgsettings/whitebalance
/main/imgsettings/whitebalanceadjusta
/main/imgsettings/whitebalanceadjustb
/main/imgsettings/whitebalancexa
/main/imgsettings/whitebalancexb
/main/imgsettings/colorspace
/main/capturesettings/autoexposuremode
/main/capturesettings/drivemode
/main/capturesettings/picturestyle
/main/capturesettings/aperture
/main/capturesettings/shutterspeed
/main/capturesettings/meteringmode
/main/capturesettings/bracketmode
/main/capturesettings/aeb
/main/other/d402
/main/other/d407
/main/other/d406
/main/other/d303
/main/other/5001
jci@arthur:~$ 

Todas las anteriores son las opciones que puedo modificar : autoexposure, drive mode...pero no le puedo decir donde almacenar las fotos. Ok, como dije, puedo vivir con eso.

Asi que solamente dejar seteada la camara y hacer :

jci@arthur:~$ gphoto2 -I 60 -F 120 --capture-image-and-download

El veintiunico problema es que debe estar conectado a una maquina con USB. Lo otro es que, algunas veces, no tener actividad en la maquina termina activando los modos de ahorro de energia que a veces involucran desconectar el subsistema de USB.

Pollona FTW!
Like cooking this

Teniendo todas las imagenes, luego montar usando mencoder. Aqui esta la parte truculenta. Entre comillas, por que es la mas simple...

Encode all *.jpg files in the current directory:
mencoder "mf://*.jpg" -mf fps=25 -o output.avi -ovc lavc -lavcopts vcodec=mpeg4

// mencoder man page

La otra opcion, por cierto, es ir META. O sea, conseguir un disparador remoto. Programable, ojala.

Aqui es donde aparece este juguetito. Una baratela en Amazon :-)

IMG_1068

Con este juguetito se puede programar el delay inicial, la cantidad de tiempo de exposicion (dejando el sensor abierto), el intervalo entre capturas y la cantidad de tomas a sacar.

Es como tener

jci@arthur:~$ sleep 5s; gphoto2 -I 60 -F 120 --capture-image-and-download

pero en version fisica :-)

Ah, ademas estoy intentando comprender como funcionan las curvas de color automaticas/manuales de las camaras.

Algo que GIMP ayuda bastante para lograr algo como esto...

Clouds over the mountains

Como queda? Este es un resultado de un experimento, claro que fue hecho _manualmente_

O mejor aun...

1887 views » Send feedback »

Escrito el 04/09/11 09:26:52 am por jci

To the hammer, all problems look like bent nails

Categories: Web Link Blog, GNOME, GNU/Linux, Hacks
ERROR 1251: Client does not support authentication protocol requested by server; 
consider upgrading MySQL client

Debido a "ciertos problemas con mis maquinas" (lease : viejas instalaciones), no he podido sincronizar bien las versiones de MySQL. Asi que tengo dos maquinas, una con MySQL Client 3 y el server, MySQL 4.1

Y no se hablan.

Hasta que...

jci@eatatjoes:$ mysql -u root -p -h XX.XX.X.XXX
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 181 to server version: 5.0.75-0ubuntu10.3

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> update mysql.user set password=old_password('shiaaaaaa') where 
host='xx.xxx.xx.xxx' and user='user'; 

mysql> flush privileges

1208 views » Send feedback »

Escrito el 04/08/11 11:05:12 am por jci

:: Next >>

Acerca de este glob

On the Sixth Day, there was a Running Man looking for a Predator to stop a Raw Deal with a Commando. Only True Lies were said. But nao, Junior is about to get Twins, with the help of a Kindergarden Cop. That will be the Terminator of all struggles.

Archives