viernes, julio 25, 2008

El melenas de Cifras y Letras no tenía ni puta idea

Siempre habíamos sospechado que el tío del pelo canoso, largo y grasiento miraba las soluciones a la prueba de las letras en el ordenador, pero ¿cómo es el programa que busca todos los anagramas de los subconjuntos de las letras dadas?

Pues ayer* me dio por programarlo y es una gilipollez. La parte más complicada es obtener el lemario, que manda cojones que para el inglés, que no tiene ningún organismo normativo, sea extremadamente fácil encontrar una lista muy completa de palabras inglesas y para el español lo más parecido que hay sea el COES que, sin ánimo de ofender a sus autores (según me dijo uno de ellos pringaron como unos campeones sin recibir ninguna ayuda de la RAE), es bastante deficiente.

Volviendo al asunto principal, aquí os dejo el programilla en Python que no es muy eficiente en memoria (para un fichero con 109230 palabras, de 1.2MB, la imagen del proceso son 36MB), pero que una vez cargado (el archivo de 1.2MB tarda unos 9 segundos en mi ordenador nuevo) las consultas son prácticamente instantáneas (¡olé mi rigurosidad midiendo tiempos! la verdad es que estoy bastante hasta los huevos de hacer experimentos cambiando parámetros y luego sacar gráficas, así que si yo digo que son instantáneas, es que lo son xD).


import time
import sys
alpha_chars = filter(lambda x: x.isalpha(), map(chr, range(256)))

"""
quita los elementos con multiplicidad cero de la lista l, cuyos
elementos son tuplas del tipo (n, k)
"""
def remove_zeros(l): return filter(lambda x: x[0] > 0, l)

"""
l es una lista de tuplas del tipo (n, k) donde n es el numero de veces
que aparece el elemento k
"""
def subsets(l):
if l:
(n, k), t = l[0], l[1:]
for i in range(n+1):
for j in subsets(t):
yield remove_zeros( [(i,k)] + j )
else:
yield []

"""
ordena las combinaciones, de menor a mayor numero de elementos
"""
def sort_subsets(cl):
def put_size(nkl): return sum(map(lambda x: x[0], nkl)), nkl
keylist = map(put_size, cl)
keylist.sort()
return map(lambda x: x[1], keylist)

"""
devuelve el string s como una lista de tuplas (n, k), siendo k las
letras por orden alfabetico y n el numero de veces que aparecen
"""
def normalize(s):
s = s.lower()
return remove_zeros(map(lambda x: (s.count(x), x), alpha_chars))

"""
crea un diccionario inverso, con las claves las palabras normalizada y
los valores una lista de las palabras validas
"""
def make_dict(f):
d = {}
for i in f:
i = i.strip()
norm = str(normalize(i)) #la clave no puede ser una lista
if norm not in d:
d[norm] = []
d[norm].append(i)
return d
"""
devuelve todos los anagramas y subanagramas de la palabra s que haya en el diccionaro d
"""
def get_anagrams(d, s):
sssns = sort_subsets(subsets(normalize(s)))
def getif(x):
if x in d:
return d[x]
else:
return []
return filter(None, reduce(lambda x, y: x+y, map(lambda x: getif(str(x)), sssns), []))

"""
El primer argumento es el nombre del fichero con la lista de palabras, despues lee las letras por la entrada estandar
"""
def main():
fdict= file(sys.argv[1])
t1 = time.time()
print "making dictionary..."
d = make_dict(fdict)
print "ready!"
t2 = time.time()
print "took", t2-t1, "seconds"
dict_stats(d)
print ">>" ,
line = sys.stdin.readline()
while line:
print ", ".join(get_anagrams(d, line.strip()))
print ">>",
line = sys.stdin.readline()
main()


Pues eso, regocijaos con la elegancia y el poder de Python. ¡Te alabamos, oh, Guido Van Rossum!

De todos modos, el tema del rendimiento al construir el diccionario me tenía algo preocupado, no lucía nada... así que me puse a optimizar. Primera opción: meter el optimizador JIT para Python Pysco. En teoría es la repolla, para código algorítmico tienes incrementos del rendimiento de hasta un 100x, aunque lo normal está en torno a 4x. Pues ĺa primera decepción es que no funciona para AMD64 (si es que todavía no estámos preparados :-s). Después lo probé en el ordenador de mi despacho y me llevé la segunda decepción: iba más lento. Bastante más lento.

Había que optimizar a mano, así que me lancé a por la tercera opción: paralelizar con threads. Estos son los cambios que introduje (el resto igual):

import threading

def split_seq(seq, size):
newseq = []
splitsize = 1.0/size*len(seq)
for i in range(size):
newseq.append(seq[int(round(i*splitsize)):int(round((i+1)*splitsize))])
return newseq

def merge_dicts(dlist):
d = {}
for i in dlist:
for k in i:
if k not in d:
d[k] = []
d[k] += i[k]
return d

def get_nprocs():
count = 0
try:
lines = file("/proc/cpuinfo").readlines() #solo funciona en unixes
except:
lines = []
for i in lines:
if "processor" in i:
count += 1
return count

class ParallelMakeDict (threading.Thread):
def __init__(self, lines):
threading.Thread.__init__(self)
self.lines = lines

def run(self):
self.d = make_dict(lines)

"""
El primer argumento es el nombre del fichero con la lista de palabras, despues lee las letras
por la entrada estandar
"""
def main():
fdict= file(sys.argv[1])
nthreads= get_nprocs()
t1 = time.time()
print "making dictionary..."
lines = fdict.readlines()
print "words loaded"
print "splitting list and creating threads"
threadlist = map(ParallelMakeDict, split_seq(lines, nthreads))
print "threads created"
for i in threadlist:
i.start()
print "thread running"
for i in threadlist:
i.join()
print "thread joined"
print "merging"
d = merge_dicts(map(lambda x: x.d, threadlist))
print "ready!"
t2 = time.time()
print "took", t2-t1, "seconds"
print ">>" ,
line = sys.stdin.readline()
while line:
print ", ".join(get_anagrams(d, line.strip()))
print ">>",
line = sys.stdin.readline()

main()

¿Mejoraba el rendimiento? Qué va, también iba más lento que la versión secuencial... le eché un vistazo al monitor del sistema mientras construía el diccionario y las barritas iban alternando el 100% de ocupación entre un procesador y el otro, pero nunca se ponían al 100% los dos a la vez. Algo me decía que los threads de Python tenían un problemilla... hice alguna búsqueda y efectivamente, no van muy bien para paralelizar cómputo por cuestiones de cómo están programados los cerrojos del intérprete, así que su mayor utilidad es para hacer servidores que puedan despachar multiples peticiones mientras otras esperan a la E/S en sistemas monoprocesador.

Ya sí que estaba a punto mosquearme... la siguiente opción era buscar algo más serio, como MPI, pero por suerte encontré exactamente lo que estaba buscando, una librería muy "pythónica" para hacer computación paralela con memoria compartida y clusters: Parallel Python.

Le eché un vistazo al tutorial y en seguida tenía la nueva versión, que consistía en introducir los siguientes cambios (sobre la de threads, quitando la clase del thread):

import pp
"""
def normalize_no_globals(s, chars):
s = s.lower()
return remove_zeros(map(lambda x: (s.count(x), x), chars))

def make_dict_no_globals(f, chars):
d = {}
for i in f:
i = i.strip()
norm = str(normalize_no_globals(i, chars)) #la clave no puede ser una lista
if norm not in d:
d[norm] = []
d[norm].append(i)
return d

def main():
fdict= file(sys.argv[1])
nthreads= get_nprocs()
t1 = time.time()
print "making dictionary..."
lines = fdict.readlines()
print "words loaded"
print "splitting list and creating threads"
job_server = pp.Server()
fdeps = (normalize_no_globals, remove_zeros)
jobs = [job_server.submit(make_dict_no_globals, (x, alpha_chars),fdeps,tuple()) for x in split_seq(lines, nthreads)]
print "threads created"
d = merge_dicts(map(lambda x: x(), jobs))
print "ready!"
t2 = time.time()
print "took", t2-t1, "seconds"
print ">>" ,
line = sys.stdin.readline()
while line:
print ", ".join(get_anagrams(d, line.strip()))
print ">>",
line = sys.stdin.readline()
main()

¡Ahora sí que se notaba el speedup! El diccionario que antes tardaba unos 9 segundos en construirse ahora tardaba sólo 6, un 33% de aceleración, no estaba mal. La verdad es que me he quedado con las ganas de probarlo en los dos nodos con 16 cores cada uno que tenemos en la Universidad, pero es que el Parallel Python no tiene opción de instalar en local para un único usuario y no me apetecía molestar al administrador y ni ponerme a instalar yo los módulos a mano...

Mientras investigaba con la versión paralela, me dio por reimplementarlo en Java a ver si iba más rapidillo o más lento. Después de escribir 4 o 5 clases (una para las tuplas caracter-número de veces que aparece; otra para las palabras normalizadas, un par más anónimas para los Iterator de subconjuntos, otra para el Main...) me di cuenta de una cosa: Java se ha vuelto para mí un coñazo insoportable.

Así que tras la frustración inicial de intentar portar el elegante y conciso código en Python al tedioso y aburrido Java, decidí hacer un poco de gimnasia mental y pasarlo a un lenguaje del que ya había hablado en los comentarios del post sobre lenguajes para listos y lenguajes para tontos: OCaml.

He intentado mantener el estilo puramente funcional en todo lo que me ha sido posible (excepto en la tabla del diccionario y en la entrada/salida, claro) y la verdad es que se me escapa alguna sonrisita al recordar a mi profesor Paradigmas de Programación diciendo que la programación funcional es la hostia de legible (sobre todo en LISP :-p), como Joyce, no te jode xD. Tampoco quiero desmerecer, creo que programar este tipo de algoritmos es mucho más fácil en un lenguaje con características funcionales que en uno totalmente imperativo; y también es más fácil verificar formalmente que hace lo que se supone que tiene que hacer, pero si no sabes de antemano qué es, resulta bastante complicadillo hacer ingeniería inversa sobre el código. Yo ahora mismo sería incapaz de descifrar qué hacen algunas funciones que escribí ayer si no fuese porque he puesto comentarios.

El código resultante tras una tarde y un ratillo de una noche estrujándome un poco las neuronas (traducir de un lenguaje a otro no siempre es tan directo como nos gustaría, echadle un vistazo las 3 funciones necesarias para generar los subconjuntos), el código resultante en OCaml es este:

(* de una lista de tuplas (c,n) quita las que tienen n = 0 *)
let remove_zeros l =
let f x =
match x with
_, 0 -> false
|_,_ -> true
in
List.filter f l

(* devuelve una lista que contiene listas formadas a partir de la
concatenacion de todos los elementos de la primera lista con la segunda *)
let cat_lh_l a b =
let rec priv_cat_lh_l acc rest_a =
match rest_a with
[] -> acc
| h::t -> priv_cat_lh_l ((h::b)::acc) t
in
priv_cat_lh_l [] a

(* devuelve una lista que contiene las listas formadas a partir de la
concatenacion de todos los elementos de la primera lista con todas las
listas contenidas en la segunda*)
let cat_lh_llh a b =
let rec priv_cat_lh_llh acc rest_b =
match rest_b with
[] -> acc
| h::t -> priv_cat_lh_llh ((cat_lh_l a h)@acc) t
in
priv_cat_lh_llh [] b


(* genera todo el rango de tuplas (c,n) con multiplicidad de c desde n hasta 0 *)
let make_range (c, n) =
let rec priv_make_range acc m =
match m with
-1 -> acc
| _ -> priv_make_range ((c,m)::acc) (m - 1)
in
priv_make_range [] n

(* devuelve true si la lista no esta vacia, false de lo contrario *)
let not_empty x =
match x with
[] -> false
| _ -> true

(* devuelve todos los subconjuntos validos de una lista de tuplas (c, n) *)
let subsets l =
let rec priv_subsets l =
match l with
[] -> [[]]
| h::t -> cat_lh_llh (make_range h) (priv_subsets t)
in
List.filter not_empty (List.map remove_zeros (priv_subsets l))

(* devuelve una lista de letras desde first hasta last *)
let make_charlist first last =
let rec priv_make_charlist l c =
match c with
d when d == first -> (c,0)::l
| _ -> priv_make_charlist ((c,0)::l) (Char.chr ((Char.code c)-1))
in
priv_make_charlist [] last

(* devuelve una nueva lista de tuplas (c,n) en la que las tuplas con c
== k tienen n incrementado en 1 *)
let inc_charlist lcn k =
let f (c, n) =
match c with
d when d == k -> (c, n+1)
| _ -> (c, n)
in
List.map f lcn


let lowletters = make_charlist 'a' 'z'

(* devuelve la forma normalizada, como lista de tuplas (c,n) en minusculas, de un string *)
let normalize s =
let slc = String.lowercase s
in
let rec priv_normalize l i =
match i with
-1 -> l
| _ -> priv_normalize (inc_charlist l slc.[i]) (i-1)
in
remove_zeros (priv_normalize lowletters ((String.length s)-1))

(* devuelve el diccionario construido con las palabras del fichero *)
let make_dict fname =
let dict = Hashtbl.create 262144
in
let cin = open_in fname
in
let freadline _ =
try Some (input_line cin)
with End_of_file -> None
in
let lines = Stream.from freadline
in
let add_entry s =
Hashtbl.add dict (normalize s) s
in
Stream.iter add_entry lines;
close_in cin;
dict


(* devuelve todos los anagramas y subanagramas que hay en el
diccionario para la palabra pasada por parametro*)
let get_anagrams dict word =
let rec priv_get_anagrams acc rest =
match rest with
[] -> acc
| h::t -> priv_get_anagrams (acc @ (Hashtbl.find_all dict h)) t
in
let cmp a b =
(List.length a) - (List.length b)
in
priv_get_anagrams [] (List.sort cmp (subsets (normalize word)))

(* El argumento por parametros es el nombre del fichero de palabras,
luego lee de la entrada estandar *)
let main =
print_endline "making_dictionary";
let dict = make_dict Sys.argv.(1)
in
let rec loop _ =
try
print_string ">>";
print_endline (String.concat ", " (get_anagrams dict (read_line ())));
loop ()
with
End_of_file -> true
in
loop ()

let _ = main


Cosas que me han gustado de OCaml después de este programilla de tamaño pequeño y complejidad media:
  • El pattern matching mola, aunque no lo he llegado a explotar al máximo porque en este programa no era necesario (combinarlo con los tipos variantes es ya la leche).
  • La inferencia de tipos es como ir a una playa nudista, al principio te sientes incómodo e inseguro, pero luego te das cuenta de que es de lo más natural y te hace sentir más ligero.
  • Escribir funciones grandes es bastante feo, así que te fuerza a hacer el código muy modular.
El principal problema que le veo es que he tardado demasiado (el doble que en Python, y eso que tenía el otro como plantilla), pero claro, es normal teniendo en cuenta que es el segundo programa en OCaml que escribo (y el primero fue una gilipollez enorme y encima hace casi un año). La sensación de ser un pez fuera del agua tampoco me la he conseguido quitar del todo, todavía no me siento suficientemente suelto con OCaml y siento que hay algo perverso en él que está esperando para joderme en cuanto decida usarlo para algún proyecto mediano-grande. Este artículo confirma en parte mis miedos: OCaml Sucks.

Bueno, vamos al tema del rendimiento, que era al fin y al cabo por lo que me puse a transcribir el código de Python a OCaml (que dicen que es casi tan rápido como C bien escrito).

Primero lo probé con el intérprete y el compilador a bytecode (ocamlc) y cargando el diccionario de siempre (de 1.2MB) tardaba lo mismo que Python, unos 9 segundos. Pues vaya mierda de optimización para tanto curro.

Después me acordé de que hay un compilador optimizador que genera código nativo (ocamlopt), así que me decidí a probarlo. Resultado: tarda en cargar el diccionario cerca de 1 segundo. Ahora sí, ni Python en paralelo ni pollas.

Pero como con todo, recibí una de cal y otra de arena; en el tiempo de consulta la situación se invierte. En las palabras cortas es despreciable tanto en Python como en OCaml, pero cuando crece la longitud, se nota mucho que el programa en Python usa generadores perezosos y que el que está escrito en OCaml está construyendo y aplanando un árbol en memoria. Para la palabra "ljegogjfglafsdshak" el programa en Python tarda unos 2 segundos en mostrar todos los anagramas y subanamgramas y el de OCaml tarda la friolera de unos 35 segundos (seguro que también se puede usar evaluación perezosa en OCaml y que los tiempos se igualarían, pero ya me parecía que tardaría demasiado mirándolo).

Conclusión: yo qué sé, si había empezado antesdeayer hablando del melenas de Cifras y Letras y he terminado con 4 versiones del mismo programa. Bueno, voy a intentar decir algo coherente. Lo más interesante ha sido poner a prueba un par de lenguajes que desde el punto de vista de diseño y funcionamento son bastante antagónicos (tipado estático vs tipado dinámico, interpretado vs compilado), pero ambos son de muy alto nivel (gestión automática de memoria, multiparadigma).

El resultado en ambos ha sido que el tiempo de desarrollo ha sido rápido (más en Python por mi trasfondo pythonero), tanto que ahora mismo no me veo capaz de aguantar el coñazo que supondría hacerlo en un lenguaje que no tuviese como tipos built-in listas, diccionarios, funciones de orden superior y gestión automática de memoria. Otros posibles candidatos para implentar un código parecido serían Erlang (creo que este programa se podría traducir literalmente desde OCaml), Lisp o a lo mejor Ruby, si es que un día consigo quitarme la aversión que siento hacia él.

En cuanto al rendimiento, está contenido dentro de unos límites prácticos, si bien el programa en OCaml era mucho más rápido inicialmente, no escala demasiado bien para consultas grandes, lo cuál nos lleva a una máxima que muchos "entendidillos" se empeñan en ignorar (esos que dicen que ciertos lenguajes son lentos y que hay que programar siempre en C y C++): lo que importa es la idoneidad del algoritmo y de las estructuras de datos utilizadas. Utilizar un "lenguaje eficiente" normalmente lo que hace es enmascarar ineficiencias en el diseño (p.e. "como tardo demasiado en programar una tabla hash, pues me hago un array de estructuras clave-valor y busco secuencialmente, que total, como C es muy rápido, no pasa nada.").


¿Quién se anima a hacer su versión en algún otro lenguaje? Si alguien tiene huevos a hacerlo en Java, C o similar, que me diga cuántas líneas le ha ocupado (con un estilo normal, sin hacer el marrullero) y cuánto tiempo le ha llevado programarlo. Probablemente más que todas las versiones que he hecho yo aquí.

Los freaks de Perl estoy seguro de que pueden hacerlo en una sola línea.

*Ese ayer se refiere al día antes de empezar a escribir el post, no de cuando lo he publicado.

domingo, julio 20, 2008

Bestia Team en Gredos

La semana pasada nos fuimos unos colegas y yo a dar un pirulo por la Sierra de Gredos, a ver si respirábamos algo de aire puro y de paso nos subíamos al pico más alto del Sistema Central: el Pico del moro Almanzor (2592m).

Esta vez sí que he ido bien preparado para no chamuscarme como una vulgar chusta de porro, pero aún así el sol pega que es una barbaridad ahí arriba y el protector solar se me quitaba con el roce de la cinta de la bolsa que llevaba a modo de bandolera, así que tengo un bonito contraste entre el cogote y la espalda.

La excursión estaba planeada para hacerla en dos días: salir el sábado temprano, llegar a Hoyos del Espino, ir hasta la plataforma, llegar al refugio de Elola, dejar allí los sacos de dormir y las cosas que no necesitaríamos por el camino, luego subir hasta el Almanzor, bajar, pernoctar en el refugio y a la mañana siguiente volver hasta la plataforma y después irnos a pegar un baño a una poza cercana; luego a casita.

Como la planificación la seguimos más o menos bien, paso a contar las cosas que molan, que son las anécdotas y gilipolleces que se nos ocurren por el camino. Creo que para la próxima sí que voy a sacar el cuaderno para ir apuntándolas, porque mi memoria ya no es la de antes...
  • Teorema de las corrientes de agua: por muy pura que parezca el agua, siempre hay un viejo lavándose los bajos 100 metros más arriba.
  • Teorema de los dormitorios comunales: cuando hay 18 personas en una habitación, los primeros en dormirse son los que roncan.
  • Hipótesis de la comida comunal: los cabroncetes de los encargados del refugio ponen de comer fabada para que la gente no se aburra por la noche. En lugar de contar ovejitas, puedes contar pedos.
También merecería la pena comentar cómo le temblaba el labio al figura cuando tenía que escalar la penúltima pared que llevaba al minipico que está al lado de la cima del Almanzor; que el chaval se tuvo que poner una grapa. Yo tuve mi ración de tembladura cuando salté de una cornisa a otra inferior y estuve a punto de perder el equilibrio y caer hacia adelante y despeñarme muy malamente.

Durante la noche, el Figura y yo nos estuvimos descojonando un buen rato cuando yo le decía en voz baja "¡¡¡NECESITO UNA MUJEEEEEEEER!!!" (aunque la versión que conocíamos nosotros variaba ligeramente respecto a la enlazada).

Otra anecdotilla que podría merecer la pena ser contada es que nos paró la Guardia Civil, por ser yo educado en demasía y saludarles con la mano en el control... por suerte ya deberían haber completado su cupo de multas, porque no quisieron encalomarme por cualquier tontería.

Aquí os dejo algunas fotos panorámicas de la excursión.

viernes, julio 18, 2008

Tócate los güevos, ¡que tó era un sueño!

Después de un porrón de años sin ver Los Serrano (creo que dejé de verlo cuando les empezaron a hacer la competencia con Aquí no hay quien viva los de Antena 3), hoy me ha dado por ver el último episodio... y los tíos se estaban metiendo en un fregado del que sólo había una manera de salir, la manera japonesa: todo era un sueño.

Por lo visto Dragon Ball y Doraemon terminan así, la verdad es que no soy lo suficientemente otaku como para haberlo visto por mis propios ojos, pero al menos eso dicen las malas lenguas (también hay otros que dicen que Doraemon termina cuando Nobita madura y estudia para ser ingeniero y para arreglar al simpático gato azul, que recordemos que es un robot del futuro, y otros, es más, dicen que no termina).

Por lo menos podrían haber sido previsores y haber rodado el final al comienzo de la serie, que por mucho que le pongan coletas a Teté, esas tetillas dicen a gritos que ya no es la niña de la primera temporada, al igual que las nuevas ubres de Belén Rueda, las canas y los aumentos de frente de los personajes masculinos y los cambios de voz de los otrora niños, que se nota casi tanto como en Harry Potter.

Yo sigo pensando en lo que les cunden los sueños a esta gente...

lunes, julio 14, 2008

Cómo comprarse una cámara réflex y no morir en el intento

Creo que llevo dándole vueltas al asunto lo suficiente como para comentar algunas cosillas sobre el equipamiento, de cara a que algunos colegas se quieren aficionar al mundillo y dudan sobre qué es lo más interesante para comprar.

Aquí os pongo una foto (hecha con la vieja Nikon Coolpix S-1, mi hermano me preguntó que por qué no hice la foto con la nueva... pues porque tiene que salir en la foto, coño) de las cosas que he ido comprando recientemente:




La cámara


La cámara es una Samsung GX-10, la versión un poco más económica y un poco menos glamurosa de la Pentax K-10D (aunque depende de dónde mires, en el Saturn la encontré por 900€ y a su hermana pija por menos de 600€; en el MierdaMarkt los precios estaban al revés xD).

Uno de los motivos principales que me hizo decantarme por Samsung/Pentax es que mantienen la montura de bayoneta K, que permite usar objetivos fabricados desde los años 70. Eso sí es compatibilidad hacia atrás y no las mierdas que hacen los de Microsoft.

Otro motivo que me llamó la atención es la filosofía que tienen Pentax/Samsung de ir mejorando constantemente los firmwares, no sólo para corregir fallos, sino también para añadir nuevas funcionalidades. La verdad es que todavía no he actualizado el mío (tengo la versión 1.11 y ya han sacado la 1.30, un día de estos se lo meto), pero está bien saber que piensan en la satisfacción del consumidor también después de que este haya soltado la pasta (lo que también se nota por lo de que puedes usar los mismos objetivos de las cámaras viejas sin adaptadores ni polladas).

También me encanta el tacto que tiene... en cuanto la sopesas, notas que tienes algo serio entre las manos. Se nota ese acabado "semi-rugged" que te dice que es una cámara para hombres hechos y derechos, que estén dispuestos a llevar al cuello el casi 1Kg de peso que suma con el objetivo a todas horas. Otro plus es que está sellada herméticamente contra el agua y el polvo, así que no hay que temer que caigan cuatro gotas (eso sí, no es sumergible).

Un detalle muy importante es que tiene uno de los visores más grandes y luminosos de entre las réflex de entrada... aunque claro, realmente no es una cámara para pringaetes, es el tope de gama (bueno, lo era hasta que sacaron la GX-20/K20D, que no sé si me arrepentiré de no haber esperado algo y comprarme esa).

Algunas pijadas que también me llamaron la atención, pero que luego se han demostrado bastante futiles son el estabilizador de imagen incorporado (que no vale para gran cosa) y lo de la limpieza automática del sensor (que pese a todo he tenido que andar soplando para quitar unas motas de polvo, será que cambio demasiado los objetivos).

Otras opciones que estuve considerando fueron las siguientes:

Canon EOS 400D (o la 450D si vas holgado de pasta)

Ventajas:
  • Es un best-seller de las réflex para principiantes.
  • Fácil de usar, ligera, cómoda.
  • El sistema fotográfico de Canon llega hasta donde te alcance la pasta, si inviertes en objetivos, sabes que siempre habrá cuerpos mejores que comprar (y viceversa).
Inconvenientes:
  • No tiene visor de LCD (como los de los relojes) para ver rápidamente la configuración, todo va con el TFT, lo cuál gasta más batería...
  • El acabado dice "gama baja" a gritos por todas partes.
  • Usa tarjetas Compact Flash, lo cuál tiene su parte buena porque son más baratas que las Secure Digital equivalentes, pero también son más frágiles, ocupan más y son una tecnología a la que yo diría que le queda menos tiempo de vida.

Nikon D40 (o D40X, que tiene un sensor mejor)

Ventajas:
  • Obviamente, es una Nikon.
  • La medición de luz es de lo mejor ("foolproof", a prueba de tontos no se cansan de decir los guiris).
  • Dicen que es la más fácil de usar.
Inconvenientes:
  • Te deja con la sensación de que estás pagando más por menos (como cuando miras los precios de los BMW).
  • No tiene limpieza del sensor (aunque la verdad es que es un poco tongo).
  • El sensor de la D40 está muy desfasado (6Mpx, rango ISO de 200-1600 y con mucho ruido)

Olympus E-510

Ventajas:
  • Justo la sensación contraria que con la Nikon. Tiene todas las pijadas del mundo y más (la más importante quizá el Live View).
  • Es ligera (aunque eso le quita el aplomo que tiene la mía).
  • Los objetivos Zuiko son bastante buenos... y si no es suficiente para ti, siempre puedes intentar conseguir uno Leica de las Panasonic ;-)
Inconvenientes:
  • El acabado parece un poco más chungo y menos cuidado que en las otras (si la Nikon era sensación de BMW, aquí es de Citroën xD)... las proporciones no son muy elegantes (aunque la cámara es muy compacta).
  • Sensor más pequeño que el APSC y en formato 4:3 (las de toda la vida son 3:2).
  • Intentan tongarte con la mierda de las tarjetas XD (mira, parece que se ríen de ti), pero al menos ésta también permite usar CF.

Sigma SD14

Ventajas:
  • Vas a tener una cámara jodidamente exclusiva.
  • Sensor Foveon 3X, ni interpolación con patrón bayer ni hostias, cada píxel con sus 3 componentes RGB de verdad.
  • Permite hacer fotografías infrarrojas quitando el protector anti-polvo.
Inconvenientes:
  • Resolución efectiva un poco baja (se quedaba en unos 4.7MP) .
  • Sólo tienes objetivos Sigma (aunque son bastante buenos).
  • El ruido se dispara a partir del ISO 400, aunque creo que las actualizaciones del firmware y del software que traen lo mitigaban bastante.

Otras que me plantearía si me sobrase el dinero son la Panasonic DMC-L10 (puntos fuertes: óptica Leica y el LCD móvil con Live View) y la Fujifilm S5-Pro (puntos fuertes: sensor con 2 tipos de diodos para abarcar un mayor rango dinámico, casi como tirar en HDR por defecto; montado sobre un cuerpo Nikon).

Las que hoy por hoy ni me planteo, y no por el tema de la pasta, son las Sony Alpha. Ya tuve suficiente con un vídeo Beta y un MiniDisc. Pero al menos, el Beta y el MiniDisc eran alternativas superiores al "estándar" del momento (VHS y el Casette), las SLR Alfa son sencillamente una mierda pinchada en un objetivo Zeiss (las caras, las baratas ni eso).

Unos cuantos enlaces útiles a páginas donde puedes encontrar información técnica y comparativas:
http://www.cameralabs.com/
http://www.dzoom.org.es/camaras.html
http://www.dcresource.com/


Los objetivos


Volviendo a los objetivos, son tan importantes o más que el propio cuerpo de la cámara. Esto es como una cadena, su resistencia global será la del eslabon más débil, por mucho megapixel que tengas, si el objetivo no da la talla lo único que tendrás es un montón de píxels borrosos e indefinidos (que además ocuparán montones de espacio sin darte ninguna calidad extra).

Hay una cosa que cualquier fotógrafo serio no se cansará de decir nunca: la relación calidad/precio de los objetivos de distancia focal fija es muchísimo mejor que la de los zooms. Yo he podido comprobarlo fehacientemente. Tengo 4 objetivos:
  • Schneider D-Xenon 18-55mm f3.5-5.6 (venía con la cámara)
  • Vivitar Macro Zoom 28-210mm f3.5-5.6 (de 2ª mano en ebay)
  • Pentax DA 35mm f2 (de 2ª mano en una tienda en Madrid)
  • Pentax KA 50mm f1.7 (de 2ª mano en ebay)
Estoy realmente enamorado del 50mm f1.7. Aunque es de enfoque manual, es una gozada de usar... las imágenes tienen una nitidez y una viveza de color impresionantes. El bokeh cuando el diafragma está abierto al máximo es una preciosidad, os pongo una foto realmente estúpida para que os imaginéis el juego que puede llegar a dar:


Un uso algo más normal del objetivo, para captar detalles arquitectónicos a media-distancia:


En cambio, el super-zoom 28-210mm f3.5-5.6 puede llegar a ser un suplicio. Hacer una foto realmente nítida es difícil, además de que en el gran angular es difícil enfocar y que en el teleobjetivo es muy fácil que la foto salga movida, la resolución del objetivo no da para mucho más. Otro detalle molesto es que la distancia mínima de enfoque es bastante grande (a partir de un metro y medio más o menos creo recordar).

Sin duda su peor enemigo es la luz frontal... a lo mejor es que su multi-coating hace ya mucho tiempo que pasó a mejor vida, pero como el sol le de directamente, por muy escorada que entre la luz, te arruina la foto. En el mejor de los casos, la imagen aparece con un velo blanco y con una pérdida de saturación y contraste bastante chungos (aunque en parte recuperables con postprocesado, pero por favor, disparad en RAW! yo al principio lo hacía en JPEG y en casos muy extremos hay una pérdida de calidad considerable al retocar), como podéis ver en esta foto:
Imagen original
Después de hacerle el apaño


En el peor de los casos, tienes unos flares (¿bengalas?) y una aberración cromática realmente aberrante (valga la rebuznancia), sin posibilidad de que el GIMP venga en tu ayuda para salvar el día:


Pero tampoco hay que ser demasiado cruel con él, sabe darte diversión si le tratas con cariño y no pretendes forzarlo en condiciones más duras de las que puede aguantar (al fin y al cabo, esas dos fotos creo que están tomadas en los extremos del zoom y con el diafragma abierto al máximo). Al final puede que sea por un poco de masoquismo, pero acabo dándome cuenta de que pasa mucho tiempo montado en mi cámara, me lo paso bien experimentando y salen algunas buenas fotos. Como el zoom es deslizante, incluso puedo hacer fácilmente cosas como esta:


y si además se alinean los astros, es posible que incluso puedas pillar in-fraganti a algún bicho:

El 35mm f2 es una buena opción para cuando quieres sacar imágenes naturales (en un sensor APSC abarca más o menos lo que el ojo humano)... quizá se eche un poco de menos esa mayor apertura que tiene el 50mm, pero compensa con que este sí que tiene autofocus y te ahorra unos cuantos segundos por fotografía (aunque esos segundos normalmente se invierten bien, porque mientras enfocas también le dedicas el tiempo a mejorar la composición). Como otros puntos fuertes, enfoca desde bastante cerca y no mete mucha distorsión.

Esta es una foto de mi primo sujetando un bicho:
Esta es otra de la vieja Estación del Norte (actual Príncipe Pío):

En la fotografía anterior, cuando se ve a máxima resolución, se puede observar un fallo bastante curioso en las líneas de contorno del edificio con el cielo. Se ven los "dientes de sierra", achacables presumiblemente a la interpolación del color. Ese es el principal motivo por el que merecería la pena comprarse una Sigma SD14, pero si encojo mi imagen hasta sus 4.7MP con una buena interpolación seguramente me quede más o menos igual.


Del 18-55mm f3.5-3.6 no tengo muchas quejas, porque tampoco se puede esperar demasiado... hace unas fotos resultonas y tiene un rango focal bastante versátil (sobre todo en el gran angular, ya que no tengo ningún otro objetivo que me cubra esas distancias focales). El cacharro es bastante ligero y no excesivamente grande, pero la calidad de la imagen en los bordes es horrible... muy poca resolución y mucho viñeteado (el oscurecimiento) en las esquinas.

En esta fotografía se puede apreciar bastante lo que significa usar un objetivo barato...
En la fotografía anterior, el problema no se debe (al menos exclusivamente) a una escasa profundidad de campo, en otras fotografías con los extremos menos alejados del centro (el sujeto situado en el plano normal a la cámara) sucede lo mismo.

En el extremo del teleobjetivo medio parece que funciona un poco mejor:


El complemento ideal para los objetivos son sus parasoles, si hay mucha luz, úsalos (que no muerden) y te quitarán muchos de esos molestos destellos. Además, parecerás mucho más profesional.

Otro punto a tener en cuenta a la hora de comprar objetivos, es si están específcamente diseñados para cámaras digitales (para el tamaño de un sensor APSC) o para una cámara de carrete de 35mm. La ventaja que tienen los diseñados para digitales es que suelen ser más ligeros (tienen menos cristal), pero con los diseñados para 35mm tienes la ventaja de que están sobredimensionados, así que tendrás una imagen mejor (ya que los bordes, que suelen ser las zonas más chungas, caerán fuera del sensor) y también puedes utilizarlos en una cámara de carrete, lo cuál siempre está bien si te gusta el fotoreportaje de aventura y vas a hacer fotos en condiciones extremas donde las baterías no duran nada; además también te valdrán si te compras una cámara digital full frame (pero supongo que no será el caso, ya que suelen costar más de 2.000€).

Resumiendo el apartado de los objetivos: si quieres fotos impecables, hazte con unos cuantos de focal fija con una buena apertura (yo todavía me estoy arrepintiendo de un 55mm f1.2 que perdí en una puja :-s). Si te vale con sacar fotos medio guarrindongas (y no me refiero a que fotografíes tías en pelota, que eso siempre está bien) sin complicarte demasiado, consigue un Tamron 18-250mm o un Sigma 18-200mm, que no están mal de precio, y no tendrás que volver a cambiar de objetivo en tu vida (aunque yo personalmente sigo prefiriendo tener varios objetivos más baratos y mejores, que para eso me he comprado una SLR de objetivos intercambiables y no una compacta super-zoom).


Otros accesorios


Ahora vamos con esas pequeñas cosas que no son especialmente caras, pero que te hacen la vida mucho más fácil.

Los filtros

Son como los condones, protegen lo que más quieres. Con la ventaja de que no son de usar y tirar. Por unos 10€ puedes proteger tu objetivo de huellas pringosas y rayajos accidentales y además conseguir algunas mejorillas extra.

Si no te apetece complicarte la vida, ponle un filtro UV neutro a cada objetivo y déjaselo puesto siempre. Además de protegerlo físicamente, te quitará algún rayo ultravioleta que otro que puede afearte una foto con un halo púrpura (por suerte, los objetivos SMC de Pentax no son propensos a esto).

Si quieres dar un pasito más, píllate un polarizador. Dicen que quita los reflejos de las superficies no metálicas (p.e. un cristal o el agua), pero la verdad es que yo no lo noto mucho (al menos con el polarizador circular). Si te has comprado un objetivo de enfoque manual, ponle un polarizador lineal (los autofocus no funcionan bien con ellos, así que aprovecha) y girándolo podrás seleccionar qué polarización de la luz le va mejor a tu foto. Es ideal para conseguir cielos de color azul intenso, como puedes ver en estas dos fotos con el polarizador en un ángulo distinto:

Por cierto, están alineadas a mano... un trabajo fino, fino, ¿eh?

El polarizador circular tiene el problema de que oscurece demasiado la imagen, así que si lo usas con un objetivo con poca apertura (p.e. de f3.5 para arriba) asegurate de que haya mucha luz o prepara un buen apoyo para la cámara.

La mayoría de los demás filtros (como los de colores o los de enfoque suave) se pueden reproducir fácilmente en el postprocesado, así que tampoco merecen mucho la pena...

Los filtros de efectos creativos (tipo caleidoscopio, de bengala, etc.) me parecen una pollada, así que paso de hablar de ellos.

Una nota importante sobre los filtros: al comprarlos asegurate de que su diámetro coincide con el de tus objetivos.

Los negratas con tres patas

Si te gusta hacer fotografías nocturas, olvídate del perro, el trípode es ahora tu mejor amigo.

Si necesitas algo fácilmente transportable, también hay monopies, pero no te garantizan la misma estabilidad durante un periodo de tiempo prolongado, así que sólo son útiles en situaciones de media iluminación como museos.

Hay otro invento bastante curioso que consiste en atarle un cordel a un tornillo que encaje en la rosca de la cámara y si pisas el extremo con el pie y lo mantienes tenso tirando de la cámara hacia arriba, se consigue un poco más de estabilidad. No lo he probado porque no he encontrado un tornillo que encaje (realmente no he buscado) y porque me da más vergüenza ir haciendo el friki con eso que sacarme el trípode (cualquiera de los trípodes).

Otra variedad que me ha llamado la atención es el trípode llamado "Gorilla", que tiene patas flexibles que permiten aferrarlo a distintos objetos. Yo personalmente no tengo el valor suficiente de dejar en vilo sobre el vacío mi cámara de casi 1Kg y más de 500€ sujeta únicamente por un cacho de plástico. Quizá para una compacta tenga su utilidad, pero para una réflex no me la juego.

Una consideración importante a la hora de escoger el trípode, además de la altura máxima y mínima es que debería pesar al menos tanto como la propia cámara (o si no en cuanto la inclines un poco fuera del centro de gravedad, se irá todo al suelo y eso no mola nada).

El complemento ideal para el trípode es el "quick-shoe" (¿zapata rápida?), un mecanismo que tiene dos partes (una para la cámara y otra para el trípode) que te permitirá acoplar y desacoplar a la misma velocidad que en una película porno. En la foto de mi equipo podéis ver que la cámara lo tiene puesto.

El kit de limpieza

Recuerdo cómo Antonio "el Gitano" limpiaba con mimo la pantalla de su GameBoy (seguramente robada), escupiendo sobre el cristal y frotándolo vigorosamente con la camiseta del pringado que tenía a su lado.

Espero que vosotros tengáis un poco más de respeto por vuestro equipo (y por las camisetas de la gente) y os gastéis unos 5€ en un kit con líquido limpiador para lentes, una escobilla/soplador y unos cuantos papelillos ópticos.

Ni se os ocurra darle con toallitas bañadas en alcohol u os podéis ir despidiendo del recubrimiento anti-reflejos del objetivo (sí, el maravilloso Super-Multi-Coating).

Cada uno tiene su propio estilo al limpiar, algunos mejor y otros peor. Yo he pasado momentos realmente terribles limpiando el 35mm y viendo cómo se quedaba el trazo del papel al evaporarse el limpiador, así que os ahorraré el trauma y os diré el truco: no os paséis con el líquido, una gota sobra. Si os quedan trazas, probad a echarle un poco de vaho con el aliento y a pasar el papel seco muy cuidadosamente.

De todos modos, si habéis sido buenos chicos y le habéis puesto un filtro a cada objetivo, la limpieza será menos traumática.

Gimme da powah

Los buenos viejos tiempos en los que toda la energía que podía necesitar la cámara para funcionar se la daba uno mismo armando el obturador con el dedo ya se acabaron. Mentalízate de esto: si te quedas sin batería, tu cámara chupiguay no vale un pimiento.

Así que cómprate otra batería de reserva y tenla cargada siempre a mano, o en el peor momento te puedes quedar con el culo al aire.

Si quieres prolongar la vida de la batería y de paso aumentar la calidad de tus fotos, apúntate esto también: el flash es para mariconas. No lo comenté antes cuando hablé de los trípodes porque me parecía bastante obvio, pero por si acaso lo diré aquí, el flash es inútil en la mayoría de las situaciones, dado su escaso alcance (su mayor utilidad es en retratos, pero tus sujetos se cagarán en tu puta madre en cuanto les pegues 3 flashazos). Si hay poca luz, abre el diafragma al máximo (¿ahora te arrepientes de haber comprado un zoom guarruzo en lugar de unas prime-lens f1.4, eh?) y si no es suficiente, pues planta el trípode y con calma. Si a pesar de todo tienes que hacer fotos de acción a distancia media-corta de noche, cómprate un flash de verdad (o incluso uno inalámbrico y ubícalo cerca del sujeto), que el que viene incorporado con la cámara no vale ni para tomar por culo.

La tarjeta de memoria

Ahí es otro punto en el que puede merecer la pena hacer una mediana inversión, ya que la cámara sin tarjeta es tan inútil como sin batería.

Si vas a hacer salidas largas sin oportunidad de descargar, cómprate una de mucha capacidad, o aprieta el culo y dispara en JPEG a media calidad, pero ya que te has dejado la pasta en una réflex lo suyo es que dispares siempre en RAW, ya que te permitirá corregir la mayoría de los defectos de exposición y balance de blancos a posteriori sin pérdida de calidad apreciable.

Si sobre todo vas a hacer fotografías rápidas a granel (p.e. en eventos deportivos), te interesará tener una tarjeta con una velocidad de escritura elevada, para que tu tasa de disparo no se vea interrumpida de forma inoportuna al llenarse el buffer de la cámara.

En cualquier caso, no te obsesiones demasiado con este tema, porque cada día las tarjetas son más baratas y de mayores prestaciones... y si realmente tienes unas necesidades de almacenamiento atroces, siempre puedes ir por ahí con el portátil o un disco duro externo.

La pantalla de enfoque

Yo estoy contínuamente tentado de comprarme una pantalla de enfoque con un prisma partido (split prism focusing screen) para que me ayude a enfocar a mano. Las cámaras viejas de mi padre lo tienen y se nota una barbaridad. El problema es que la medición de luz se ve alterada, sobre todo con objetivos poco luminosos.

Si me compro una, ya tiro la casa por la ventana y me la pido con guías para ayudarme también la composición (que si no muchas fotos salen torcidas o con los sujetos de interés descuadrados).

Por desgracia no es que sean baratas precisamente (las Katz Eye te cuestan entre 100 y 200 dólares) y su montaje es delicado (a veces incluso no quedan bien alineadas), así que si no vas a estar usando todo el día el enfoque manual no creo que merezca mucho la pena arriesgarse... por suerte, las cámaras modernas, te echan un cable si estás un poco cegato a la hora de enfocar, iluminando los puntos de enfoque cuando están bien enfocados.

Aunque a lo mejor me compro una super-jincha por 20€ para experimientar un poco y si no me convence, pues sigo con la normal.

Hay una cosa interesante sobre el visor y la miopía... yo estaba realmente acojonado cuando me compré la cámara porque pensaba usarla en modo manual y al ser miope tenía la duda de si mi problema al enfocar se trasladaría a las fotografías. Un colega óptico me dijo que sí y ya estaba yo temiendo que tendría que ajustarla perfectamente (la cámara tiene una palanquita para ajustar las dioptrías) y los mismos ajustes no valdrían si la usaba con gafas o lentillas. Pues al final, resulta que no; el ojo lo que tiene que ver bien es la pantalla de enfoque (que está a unos 5 centímetros como mucho, teniendo en cuenta el recorrido de la luz por el prisma) ya que la luz se difunde de forma homogénea sobre su superfice, es decir, que no es como mirar en un espejo (tienes que enfocar según mires más lejos o más cerca) sino como mirar el mismo plano de cerca (y tiene sentido, sinó podrías enfocar a voluntad con el ojo por el visor). Así que el problema gordo realmente lo tienen los hipermétropes.

Otro asuntillo relacionado es sobre la limpiezaa, a veces veréis mugre en el visor y es posible que las fotografáis salgan impolutas, entonces deberíais echarle un ojo a la pantalla y también al espejo, a ver si necesitan un delicado soplido (sin flemas, eh?).

Si la mugre sale en las fotografías, buscadla en la parte opuesta en el sensor.

La bolsa de transporte

Pues todo este material hay que llevarlo de un lado a otro. En mis primeras salidas, cuando sólo tenía un objetivo, no tenía mucho problema para transportar el equipo, con la bolsa del portátil, que está acolchada, sobra para guardar la cámara más o menos resguardadita cuando no la estás usando.

En cuanto empecé a ampliar mi colección, tuve que comprarme una bolsa más apta. La que tengo ahora es una tipo bandolera bastante cutrilla que me compré para salir del paso rápidamente, pero me sirve bastante bien para llevarlo todo (la cámara, los objetivos, los cables, el cargador, la batería extra, los filtros, las tarjetas, el kit de limpieza...). El problema que tiene es que para hacer excursiones largas es un coñazo llevarla colgando del hombro.

En este momento estoy considerando comprarme una mochila en condiciones, pero entonces se presenta otro problema: el tamaño. Si la compras pequeña, no podrás meter más cosas, que normalmente son necesarias cuando sales de excursión o de viaje (un bocadillo, a lo mejor el portátil, el trípode, calzado de repuesto, unos gayumbos extra...) y es muy absurdo llevar dos mochilas (sin embargo sí que puedes llevar una mochila y una bandolera). Si te la compras grande y únicamente quieres dar un paseo por la ciudad, entonces irás haciendo el panoli con un macuto enorme y vacío. Además, la mochila tiene otro problema, y es lo incómodo que resulta andar guardando y sacando la cámara (otro punto para la bandolera).

Quizá la combinación ideal sea la mochila mediana/grande para el transporte del equipo y cosas extra y una mini-bandolera para desenfudar rápido la cámara (ever-ready pouch creo que las llaman los guiris).

Si te sobra la pasta, cómpratelo todo y escoge según la ocasión :-p

A mí me esta mochila me está pidiendo a gritos que la compre... ¡¡¡Cállate zorra!!! ¡¡¡Lo haré en cuanto reúna el dinero!!!


Resumen Final

Antes de nada, pregúntate lo siguiente ¿Realmente necesitas una SLR? Son caras, grandes, pesadas, ruidosas, incómodas de manejar, requieren cierto mantenimiento y no te garantizan que las fotos salgan bien, sino todo lo contrario, exigen mucho trabajo de postprocesado para obtener las fotografías perfectas.

Así que si realmente estás dispuesto a sufrir para sacar las mejores fotografías posibles, tienes ganas de leer libros sobre técnica fotográfica y notas que una cámara compacta le corta las alas a tu creatividad, entonces es posible que te merezca la pena invertir pasta en una SLR. Antes de gastarte la pasta, pásate por las tiendas (preferiblemente el MediaMarkt/Saturn, que suelen tenerlas casi todas las de gama media de las que hablamos, pero no les compras nada, por cabrones, ve sólo a tocarles los huevos) para toquetearlas un poco, piensa en qué cosas necesitas y cuáles no. Si vas a hacer algún viaje a los EEUU, o a Hong Kong, aprovecha la fortaleza del €uropowah y cómpratela allí.

Otro día sigo hablando sobre el software guay para trabajar con las fotos.

miércoles, julio 09, 2008

Principios básicos de fotografía

Estoy preparando un par de posts sobre fotografía digital, dedicados a los colegas que quieren meterse en este mundillo sacacuartos y me he dado cuenta de que hay bastante vocabulario técnico que convendría explicar con antelación.

Así que aquí va el glosario:
  • SLR: Single Lens Reflex. Son las cámaras "profesionales", que tienen un visor que muestra "exactamente" lo que se ve a través del objetivo. Realmente no es exacto, porque no suelen abarcar toda la imagen (entre un 90% y un 98%, dependiendo de la calidad de la máquina). El componente que gira la imagen que llega del objetivo (recordemos que llega invertida) para que se vea igual es el pentaprisma.
  • Obturador: elemento mecánico que permite que pase o no la luz hasta el sensor (o la película). El obturador regula el tiempo de exposición (es decir, durante cuánto tiempo está llegando la luz al sensor o al viejo carrete). Normalmente el tiempo se expresa en fracciones de segundo para valores pequeños. Las cámaras compactas y de los móviles no lo tienen, controlan electrónicamente la duración de la exposición.
  • Diafragma: elemento mecánico que regula la apertura variable del objetivo, dejando así pasar más o menos luz por unidad de tiempo. Los móviles no tienen, las compactas sí suelen tener uno básico.
  • Sensibilidad (valores ISO o ASA): característica del sensor o el carrete, que indica cuánta luz es necesaria para que sea registada. En los carretes, el grano del haluro de plata era mayor cuanta más sensibilidad, con la consecuente pérdida de resolución; en los sensores, la consecuencia es que aumenta el ruido eléctrico.
  • Distancia focal: básicamente, es la distancia que hay entre la lente y el sensor. Viene expresada en milímetros. Cuanto mayor sea su distancia focal, más "aumentos" tendrá un objetivo. Para las cámaras de 35mm, la distancia focal normal (equivalente al ojo humano) está en torno a los 50mm, para la mayoría de las digitales (con sensor APS-C) está en torno a los 35mm.
  • Tamaño del sensor: es la superficie sobre la cuál se capta la imagen. Cuanto mayor sea, más calidad global tendrá la fotografía. Los tamaños más comunes son: 35mm (fotografía de carrete y cámaras SLR de muy alta gama), APS-C (cámaras de carrete ultra-compactas como la Canon Ixus y la mayoría de las réflex digitales), 4:3 (digitales Olympus y Panasonic). El ratio entre el tamaño del sensor de 35mm y el de una digital se suele llamar crop factor (factor de recorte) y determina la equivalencia de las distancias focales entre ambos formatos.
  • Número F: es el valor que determina la luminosidad de un objetivo, definido como el ratio entre la distancia focal y el radio de la apertura máxima del diafragma. Cuanto menor sea el número (más grande es el "agujero" en relación al "largo"), más luz entrará por el objetivo y por lo tanto se podrán hacer fotos más rápidas y con menos ruido (valores de sensibilidad más bajos). El diafragma permite regular la apertura por debajo del valor máximo, para que entre menos luz. Como el área de apertura crece de forma cuadrática con el radio, los objetivos vienen graduados en pasos que siguen una serie geométrica de factor 2^0.5, para que cada marca tenga una apertura de la mitad de superficie que la anterior (entra exactamente la mitad de luz).
  • Profundidad de campo: es el rango de distancia de la imagen que está enfocado. La profunidad de campo es proporcional a la distancia de enfoque (cuanto más lejos enfoques, más profundidad de campo tendrás) e inversamente proporcional a la apertura (cuanto más abierto esté el diafragma, mayor será el círculo de confusión y por lo tanto menor profundidad de campo).
  • Aberraciones: son las imperfecciones producidas por los objetivos. La lente perfecta no existe, todos los objetivos introducen un cierto grado de distorsión. Algunos diseños intentan corregir un tipo de aberraciones e introducen otras nuevas, que han de ser a su vez subsanadas, así que las mejores lentes suelen estar compuestas por muchos elementos, lo cuál hace que sean más pesadas. Hay dos tipos básicos de aberraciones: las geométricas (afectan a todos los colores por igual, alterando la geometría del sujeto) y las cromáticas (debido a las distintas longitudes de onda, los colores se desvían de forma distinta).
  • Megapíxels: al fin los dichosos megapíxels... son el número de puntos que componen la imagen (expresados en millones). Se obtienen multiplicando el ancho por el alto de la imagen y dividiendo entre 10^6. No están directamente relacionados con la calidad de la imagen, hay otros muchos factores importantes que intervienen, aparte de la óptica, como son el conversor Analógico/Digital, la geometría del sensor (patrón de color, captación directa, super-ccd...), la sensibilidad máxima y mínima, los niveles de ruido eléctrico, etc.
  • JPEG: es el nombre del formato de compresíon de imagen con pérdida de calidad más popular. El mayor inconveniente de usar JPEG para almacenar las fotos capturadas es que se pierde mucha profundidad de color. Los sensores normalmente captan 4096 tonalidades distintas para cada componente RGB (Rojo, Verde, Azul), mientras que en JPEG se almacenan sólo 256 tonalidades para cada componente.
  • RAW: es como se llaman a los distintos formatos de almacenamiento de imagen sin pérdida de cada fabricante de cámaras. Guardan la información según llega del sensor (con toda la profundidad de color y sin pérdidas debido a la compresión), por lo que es muy útil para hacer un revelado digital a posteriori (cambiar la exposición, el balance de blancos, etc.).
  • Balance de Blancos: el ojo y el cerebro manejan mucha información subliminal sin que nos demos cuenta... una de las cosas que hacen es filtrar los colores de la luz cuando ésta no es del todo blanca para que las cosas tengan la apariencia que esperamos. Por ejemplo, la luz incandescente es amarilla, la fluorescente es verdosa y la de los flashes es azul. Si queremos que las imágenes tengan el color "natural" cuando no están iluminados con luz blanca, hay que indicarle a la cámara qué tipo de luz hay para que corrija las componentes del color. A esto se le llama balance de blancos.

Notas sobre la exposición

Los valores de velocidad de obturación, apertura del diafragma y sensibilidad están relacionados para obtener la exposición adecuada mediante la siguiente fórmula: Cantidad de Luz Necesaria ~ Tiempo * Sensibilidad / (Apertura * Apertura)

La constante de proporcionalidad no me la sé, pero lo importante es saber que cuanta menos iluminación haya, mayor han de ser los valores de tiempo, apertura (teniendo en cuenta que mayor apertura es un número f menor) y sensibilidad.


Para cualquier duda, están los comentarios... iré actualizando el post con las cuestiones más interesantes.

jueves, julio 03, 2008

Nuevo cacharro

Me he comprado una cafetera nueva, básicamente porque la vieja se me colgaba de vez en cuando (pensaba que era la RAM, pero los últimos tests que hice no mostraron ningún error, así que si ya había que meterse con la placa o el micro era muy costoso reparar un trasto viejo), si no sería perfectamente feliz con mi AMD K7@1033Mhz, 768MB DDR1 (ni idea de la frecuencia, de hecho creo que los dos módulos que tenía no podían ser más dispares), (40+160)GB HDD.

Ahora que caigo, a lo mejor era un problema de sobrecalentamiento, porque los cuelgues se estaban haciendo más intensos ahora en verano... pero después de un cuelgue miré la temperatura del micro y creo que no pasaba de los 40ºC y el ventilador es un Akasa bastante hermosote. Bueno, da igual, el caso es que para demostrar que eso de la crisis es como Freddy Kruegger, sólo afecta a los que creen en ella (¿o ese era otro malo de película?), cogí mis talegos y me fui a gastarlos tan felizmente.

Al final no me gasté demasiada pasta, porque para las cuatro gilipolleces que hago no necesito demasiada máquina, así que me pillé un AMD Athlon X2 BE-2400 (no tira mucho, pero es de bajo consumo, sólo 45W), OCZ DIMM 4 GB DDR2-800 Kit (eso sí, es de baja latencia, CL4), una placa MSI K9N Neo-F V2, un disco duro SATA Samsung HD502IJ 500 GB, una tarjeta de vídeo ATI Sapphire RX1650PRO (también de bajo consumo, otros 45W a plena carga), una grabadora de deuvedeses Samsung SH-S203D, una fuente de alimentación HEC HEC-400AR-PTFR (de 400W, con este cacharro me sobra) y una cajita Asus TA-863. Todo ello por 350€ (sin montaje). También le añadiría la otra grabadora de DVD's del ordenador viejo y el disco duro de 160 GB (ambos IDE).

Lo del montaje pensaba que sería algo bastante sencillo para un ingeniero, sobre todo cuando has cacharreado con los ordenadores viejos y has puesto y quitado componentes a tuti plein... pero no es tan sencillo. Si la caja no es especialmente grande, montar el ordenador puede ser algo así como jugar al tetris. Yo no escogí el orden adecuado para poner las piezas y me encontraba que cuando quería montar el disco duro, el ventilador de la CPU no me dejaba espacio, cuando quería poner los cables del bus IDE me daba cuenta de que no me llegaba porque había separado demasiado las unidades, la RAM me estorbaba para poner la grabadora de DVD... eso por no hablar del coñazo que es poner todos los conectores de los ventiladores, los leds de estado, el botón de apagado y reset, los USB frontales, el kit de audio frontal, etc. cuando tienes las manos grandes. Además de que lo que pone en el manual de la placa no siempre coincide exactamente con lo que pone en los cables de la caja (tenía que haberme pillado una placa ASUS a juego con la caja, cachis...).

Así que si os compráis un ordenador por piezas, os voy a dar un consejo sobre cuál debería ser el orden de montaje:
  1. Coloca los discos duros en su posición (las unidades ópticas pueden esperar, ya que se pueden meter desde fuera), teniendo en cuenta la longitud de los cables (de datos y de alimentación).
  2. Ensambla los componentes sobre la placa (cpu, ventilador, memoria) y sobre todo conecta los cables IDE y SATA. La tarjeta de vídeo puede esperar.
  3. Acerca la placa a la caja y conecta los cablecitos de los botones y demás pijadas, conecta también los buses de datos a las unidades.
  4. Acerca la fuente de alimentación (para que lleguen los cables) y conécatalos a la placa y las unidades.
  5. Monta la placa en la caja.
  6. Monta la fuente de alimentación en la caja.
  7. Cierra la caja.
Si sigues ese orden, no deberías tener muchos problemas a la hora de darte cuenta de que no llegas a los sitios o que te hace falta más espacio.

En mi caso, tuve un problema extra y es que el ordenador no se encendía. Tócate los huevos, ¿qué andaría mal?. Mi super-intuición guió mi mano hacia uno de los cables de alimentación de la placa (está dividido en dos segmentos, uno grande y uno pequeño) y desenchufé el pequeño. Funcionó. Sin haber leido nada al respecto en el manual ni en ninguna parte. Acojonante.

Pero los problemas no se iban a parar ahí, qué va... Metí un live-cd de una Fedora 9 de 32 bit que tenía por ahí y todo parecía funcionar bien, un alivio. Reinicié el ordenador con el DVD de instalación de Fedora 9 de 64 bit. La cosa parecía marchar... hasta que salta una pantalla de error con la traza de la excepción en python del instalador. Como yo no soy el desarrollador, hago lo que hace todo el mundo: reiniciar y volver a probar. Tampoco, el mismo error.

Me resigno a instalar la Fedora de 32 bit desde el live-cd. Parece que el procedimiento funciona sin errores. Reinicio y... la jodimos, ni siquiera sale el GRUB.

Empiezo a barruntarme que va a ser algo por los dos discos duros, SATA e IDE, que no se han hecho amigüitos precisamente. Desenchufo el disco SATA e instalo un Windows XP de 32 bit en el IDE (porque como no tengo disquetera, en el SATA va a ser complicado si no me grabo una versión personalizada con mis drivers) y la cosa va sin problemas, lo cuál da una cierta tranquilidad.

Después de pensar un poco y de buscar por internet, me doy cuenta de cuál es el problema... la placa base está configurada en modo RAID con el disco IDE, así que me voy a la configuración de la BIOS y lo desactivo. Vuelvo a probar a instalar La Fedora 9 de 32Bit con los dos discos y funciona. Pero no me mola eso de desaprovechar parte de la memoria al usar un S.O. de 32 bit (bueno, con el Windows no hay más remedio, porque los 64 bit, ya sea en XP o en Vista dan muchísimo asco); así que me quiero bajar uno de 64, con un par.

Pruebo con Nexenta, que es un OpenSolaris con el espacio de usuario GNU, basado en Debian. Por desgracia, los muy mamones han quitado en la versión 1.0 el soporte para las X que había en las versiones alpha, así que opción desestimada, además de que al instalar no te deja particionar el disco duro a tu gusto y te coge por cojones una unidad entera. Que le den, al menos hasta la 2.0.

La siguiente opción "cacharrera" era un FreeBSD 7, pero la verdad es que aunque tuve la versión 5 en un ordenador viejo en la facultad e iba muy bien, no me apetece perderme algunas de las ventajillas del mundo Linux, que es algo más dinámico en cuanto al tema de los nuevos drivers y de tener actualizadas las distribuciones con las últimas tecnologías.

Después del disgusto con el instalador (no el live) de la Fedora 9 de 64 bit (que es posible que fuese por que el disco estaba dañado, pero no me apetecía tirar un DVD intentándolo por si volvía a fallar), me decido a darle una segunda oportunidad a la Mierduntu, que tanto asco me dio en sus primeras versiones... supongo que algo debería haber mejorado en estos años, al fin y al cabo mis compañeros de despacho la usan (Kubuntu) y están bastante satisfechos. Yo desde luego que no voy a usar KDE, me gustan las cosas más minimalistas (sin pasarse, eso sí, todavía no le cojo el puntillo al TWM ni al FWM... como mucho BlackBox y derivados o IceWM y WindowMaker), así que me decanto por una Xubuntu, ya que XFCE me parece un escritorio completo sin pijadas innecesarias.

Me instalo la Xubuntu de 64 bit desde el Live CD y todo va bien. Aunque la verdad, echo de menos a mi añorada Fedora... con sus system-config*, su yum (vale que aquí está el apt, pero una vez que te acostumbras al yum le coges mucho cariño), sus versiones bleeding-edge de Xorg y PulseAudio (que de hecho a veces no funcionan como deberían xD) y sobre todo, unos temas cuyos colores no te recuerdan a mierda constantemente y unos cursores del ratón decentes (vale que todo eso se puede cambiar, pero la primera arcada no te la quita nadie).

El siguiente problema con el que me encuentro es con que el mundo todavía no está preparado al 100% para los 64 bit. Somos unos marginados de la vida, por culpa de la gente de Redmond y su estancamiento en los 32 bit (porque cada vez que intentan pasarse a los 64 la cagan). A pesar de que casi todo el software libre está portado para montones de arquitecturas (AMD64 entre ellas), hay algunas cosas que nos hacen la vida más fácil y son muy difíciles de encontrar en versión de 64 bit... por ejemplo:
  • Adobe Flash Player
  • Skype
Para el flash player puedes usar alguna de las opciones open-source (como Gnash, porque lo de andar usando un Firefox entero de 32 bit sí que me parece un retraso de la leche), pero no acaban de ir todo lo finas que nos gustaría... para el Skype, tienes que andar con librerías de compatibilidad hacia atrás. Vaya atraso.

Y todo esto, después de que los procesadores x86-64 lleven ya al menos 4 o 5 años danzando por ahí... está claro que los únicos que le llevan sacando partido de verdad son los servidores y a saber cuánto, porque tiene algunos inconvenientes de rendimiento frente a los 32 bit (que no voy a comentar aquí, porque es un tema muy manido).

Resumiendo: que el cacharro que me he comprado va bastante bien (estoy escribiendo desde él), que si te vas a gastar unos 350€ en un ordenador a lo mejor no te merece la pena pagar otros 50€ por que te lo monten, pero si te vas a comprar uno más caro seguramente sí y que el paso de 32 a 64 bit es un poco más traumático de lo que debería ser después de tanto tiempo en marcha.