sábado, abril 23, 2011

lista de lecturas 16/04/11

no mas dispersion, elimine mi cuenta de twitter (aka, no existe mas), elimine buzz, reader (no los usaba pero si entrabas ahi estaba esperandome con cara de perro mojado) el perfil de google y los contactos de lo que sea que google guarda contactos, obviamente elimine la aplicacion que importa twitter en facebook y la que importa blogger en facebook y elimine dos blogs secundarios que nunca nadie conocio (y no va a conocer :D), una sola vez puse fotos en facebook pero ya no mas, me compre espacio en picasa.

muchas de las cosas casi no las usaba, pero entre el "casi" y el "no" hay un trecho, asi que para no mentirme a mi mismo decidi eliminarlas completamente (o lo mas completamente que la aplicacion permita)

como twitter solo lo usaba como repositorio de links interesantes (no "followeaba" a nadie) decidi migrar esa utilidad aca, una vez por semana si blogger se digna a postearlo automaticamente, va a salir una lista de las cosas que lei esa semana y que me parecieron interesantes.

si queres saber de mi, este blog, mi mail, gtalk y picasa, no hay mas cosas (realmente no hay mas :).

la unica cosa que casi no uso pero que queda abierta es facebook debido a que a pesar de que lo uso hace un mes aproximadamente, descubri que hay gente que es solo accesible por facebook, si logro concientizar a la gente que me dice "che, desaparecido, no se nada de vos, en que andas" de que entre a mi blog o me mande un mail (cosa que no va a pasar, no soy tan importante) quizas cierre facebook, hasta entonces, solo sere notificado por mail cuando algo importante ocurra.

este es un intento de evitar la procastinacion y usar mi tiempo libre para cosas mas creativas y menos consumistas (as in "consumir contenido"*), espero que no decaiga.


* si, leer es consumir contenido, pero intento alejarme del amarillismo, sensacionalismo, contenido de utilidad temporal o gatos con captions. Espero que se refleje en la lista

jueves, abril 21, 2011

un mouse, el fordismo y la anti especializacion

debido a lo que parece ser un principio de RSI gracias al touchpad de mi nueva maquina, decidí ir a comprarme un mouse usb.

entro a una casa de computación cualquiera de tamanio mediano (digamos, no la casa de computación unipersonal pero tampoco un emporio de la informática).

voy a la góndola, agarro el mouse que me gusta, voy a "la caja", un mostrador con una computadora y una persona cerca de la entrada dispuesto a pagar y fallo en dicha empresa al ser informado de que ese era el mostrador de despacho o algo similar.

Sigo el cartel de "caja" que esta al medio del local y voy mouse en mano dispuesto a pagar, fallo nuevamente al ser informado de mi deber civil de "facturar" el mouse por uno de los vendedores.

Voy a la caza de un ser de dicha especie, al encontrarlo me consulta mi nombre, un poco adverso a dar mi información personal para la compra de un roedor usb le digo mi nombre, procede a darme "de alta" en "el sistema" pidiéndome datos personales que carecerían de utilidad para este negocio en el 99.9% de las circunstancias.

Luego de darme de alta, procede a secuestrar el mouse de mis manos y me informa que vaya a caja a pagar, mi intento de readquirir el producto falla estrepitosamente al ser informado que me lo entregaran luego que pague.

Hago 3 extensos pasos hasta la caja donde me consultan mi nombre nuevamente, le informo el mismo (el mismo nombre) y procedo a entregarle mi tarjeta de débito.

Obviamente ante un despliegue de fordismo impecable es razonable no recibir tan común medio de pago, le doy una cosa que es como una tarjeta de crédito pero no tanto y logro salir airoso de la situación, me pide un numero de teléfono y procedo a darle un numero ficticio for teh lulz.

Luego de esto me da 2 recibos abrochados y me dice que vaya a retirar el producto, hago 4 interminables pasos y otra persona me espera con mi producto, recibe las hojas segundos atrás obtenidas por este humilde ser humano, escribe algo, sella y me entrega el preciado mouse.

me retiro airoso y feliz de haber sido parte de semejante ejemplo de serializacion innecesaria y anti especialización.

sábado, abril 02, 2011

el bajo fondo hindu

esto seria como bajo fondo pero version hindu

por lo que se son todos franceses los musicos pero lo que cuenta es la musica





viernes, abril 01, 2011

"no se hace pogo en un solo"

(la frase del titulo es propiedad de mi hermano)

- creo que el viernes toca children of bodom

se hace jueves a la noche

- che, toca maniana children of bodom hay que comprar las entradas

viernes a la tarde

- che, toca children of bodom, vamos a ver si venden entrada en la puerta

en el recital

- a ver cual es la banda soporte?

- Amon Amarth!*

así de improvisada fue nuestra visita a las tierras del falso metal para ver a children of bodom y amon amarth tocando en la universidad de norwich

tocaron dos bandas de soporte que no puedo recordar, después amon amarth y para cerrar children of bodom

les dejo con "una que sepamos todos" de amon amarth (?)



y otra de childen of bodom



como observación del recital, estuvo bueno, pude ver a COB que es una banda que escuche mucho en algún momento y escuchar algo mas de amon amarth.

el recital estuvo bueno, amon amarth sonó muy bien, COB estaba un poco mal ecualizado pero se compenso con la puesta en escena y los jóvenes universitarios poniendo en riesgo su integridad física y la de las personas en sus cercanías (lease, me metí al pogo en el primer tema y me comí un codazo en la jeta que ni te cuento, de ahí en mas me quede al un costadito actuando como centro gravitatorio de gente que cambiaba su trayectoria moshpitera y decidía intentar disminuir su inercia contra mi persona).

* cabeceala nassto

domingo, marzo 20, 2011

rage against the ukelele

andaba buscando una guitarra chiquita para poder llevar a los viajes sin tener que pagar por equipaje extra y vi este video


lo cual resulto en

foto gentilmente cedida por mi hermano
la razon del titulo es que anoche fuimos a ver una banda tributo a rage against the machine llamada enraged que sono muy bien.




ahora a encontrar una bicicleta...

jueves, marzo 17, 2011

windows es osom

tengo que instalar SQL express no se que para el laburo

  1. bajo el instalador después de googlear
  2. lo ejecuto
  3. se desempaca
  4. loading...
  5. necesitas .NET framework 3.5 SP1!
  6. me da una url, la cual visito
  7. me dice que salio .NET 4.0 que incluye 3.5 y todos los SPs
  8. lo bajo
  9. ejecuto
  10. baja mas cosas
  11. repita de 2 a 4
  12. repita 5!
  13. busco en google y bajo .NET framework 3.5 SP1
  14. ejecuto
  15. baja mas cosas
  16. éxito!
  17. repita de 2 a 4
  18. necesita windows installer 4.5!
  19. busco en google eso
  20. lo bajo
  21. lo ejecuto
  22. me dice que para instalar windows installer tengo que cerrar windows installer (?)
  23. le doy que si
  24. instala
  25. unilateralmente me reinicia la maquina (o quizás me lo advirtió en algún lado, ni idea)
  26. se queda en "shuting down"
  27. después de un rato le doy hard reset
  28. arranco de nuevo
  29. que estaba haciendo?
  30. ahh, SQL express no se que.., corro el instalador
  31. le doy a instalar
  32. corre un check
  33. no tenes power shell!
  34. busco power shell en google, llego a una pagina, muchos links
  35. elijo uno random, acerte!
  36. me lleva a otra pagina que dice que tengo que correr Windows Genuine Check (no WPA, es otro que genera un código)
  37. bajo eso
  38. lo ejecuto
  39. me da un código con un boton "copy to clipboard"
  40. lo copio y lo pego en la pagina
  41. me lleva de nuevo a la pagina de #35
  42. le doy download
  43. ejecuto
  44. next, I agree, next, finish (no los puse en todos porque se haria denso)
  45. en que estaba? ahh SQL express no se que..
  46. re run el check, next, next, next, next, Install, next, finish

lunes, marzo 14, 2011

PubHubSubBub Developer Tutorial

Note: the project and this document are hosted here: https://github.com/marianoguerra/pshb-example improvements and corrections are welcome!

welcome, this document contains an example application written in python that will help you play with a pshb (pubsubhubbub from now on) hub and an application that publishes its content to it.

this guide explains how to install a pubsubhubbub server in your computer so you can play with it, normally on a web application you would use a pshb compatible server like:

 

Requirements

 

  • python >= 2.5 (I'm using 2.6.1)
  • git (for the example)
  • subversion (to download pshb code)
  • bash or similar shell to run the scripts

 

Installing

 

git clone https://github.com/marianoguerra/pshb-example.git
cd pshb-example
bash setup.sh
the first command will fetch the project from github, the third one will get some libraries needed for the example to run.

note: answer "y" to sammy and "n" to all the other questions that the script does (we don't need those libraries)

 

Running

 

now we will start the example application called pleinu twice (so we can test the communication using the hub) and we will start a local pshb hub.

open 3 terminals and run one comment on each one:

google_appengine/dev_appserver.py src/ -p 8000 --datastore_path=/tmp/tubes1
google_appengine/dev_appserver.py src/ -p 8001 --datastore_path=/tmp/tubes2
google_appengine/dev_appserver.py pubsubhubbub/hub/
this commands asume that you are at the root of the pshb-example folder.

 

Playing

 

open a browser tabs pointing to:
click the signup link and create a new user.



I will create one called spongebob, you will have to change the username whenever you see it.



after the signup process click the login button and enter the user and password you just entered.



create a message and click send, the message should appear below.





now go to http://localhost:8000/atom/messages/from/spongebob/



you should see an atom feed with the message you just created.

 

Publishing

 

now that we have a page that generates information we need to publish it on the hub.

open a tab in your browser pointing to http://localhost:8080/ and click on the publish link near the bottom.



if you get an error remove the s from the https protocol in the address bar and refresh.



on the Topic field enter the url to the atom feed we saw before: http://localhost:8000/atom/messages/from/spongebob/



and click Publish, the page wont change, that's ok.

 

Subscribing

 

now we need to subscribe one user from the other site (http://localhost:8001/) to the messages sent by our user.

go to http://localhost:8001/ and create another user, I will call it patrick



in the main page of the hub (http://localhost:8080/) click on the subscribe like near the bottom

enter http://localhost:8001/p/notify/patrick/ on the Callback field (change patrick for your username if you used another one) enter http://localhost:8000/atom/messages/from/spongebob/ on the Topic field (change spongebob for your username if you used another one)



click the "Do it" button, the page won't change, that's ok.

 

Sending a message

 

Go to http://localhost:8000/ (login if you closed it) and send a message.



 Now go to http://localhost:8001/ and refresh the page, you should see the messages published by the user in the other site.



Note


to make it work and avoid an exception I had to add a return statement at the beginning of the log_message function at google_appengine/google/appengine/tools/dev_appserver.py

if you get that exception like this:

in log_request
    self.requestline, str(code), str(size))
  File "/home/asd/pubsubhubbub/pshb/google_appengine/google/appengine/
tools/dev_appserver.py", line 3314, in log_message
    if self.channel_poll_path_re.match(self.path):
AttributeError: DevAppServerRequestHandler instance has no attribute
'path'
edit the function to look like this:
 
def log_message(self, format, *args):
  """Redirect log messages through the logging module."""
  return
  if self.channel_poll_path_re.match(self.path):
    logging.debug(format, *args)
  else:
    logging.info(format, *args)



you will have to set write permissions to the file to save it (chmod u+w dev_appserver.py)



you will have to restart the pshb server:


google_appengine/dev_appserver.py pubsubhubbub/hub/

miércoles, marzo 09, 2011

campania por un futuro mas matematico y divertido

logremos que la creadora de http://vihart.com/ se case con el creador de http://xkcd.com/ y den a luz a una nueva generación de matemáticos artisticamente hábiles que dominaran el mundo for fun and profit.

atte.

la administración

sábado, febrero 26, 2011

exige tu propia aventura

costo ponerle titulo al post, acá van algunos de los que se me ocurrieron:

Set the Controls for the Heart of the Sun, por el tema de pink floyd



last day on heart, por el tema de marilyn manson (no se dejen llevar por los estereotipos y escuchenla)



pero al final me decidí por una frase que leí al pie de una pagina de la revista orsai

y ustedes se preguntaran, porque tanta introducción?

si blogger le da bola a la configuración que le di, este post esta saliendo en el momento que me subo al avión, sino sale en el instante que aprieto publish y todo el misticismo se va al tacho.

bue, resulta que de vuelta cruzo el charco y me voy para el viejo continente, conseguí un trabajo en inglaterra que me da suficiente libertad como para hacer varias cosas que tengo en mente (no muy relacionadas con lo laboral) así que decidí aprovecharla.

muchos planes mas que ir allá y hacer cosas que se me vengan a la mente no tengo y para ponerle mas emoción no he planificado nada mas que comprarme una bicicleta (alla) y llevar una carpa gentilmente donada por los pichis.

vamos a ver que sale de esto, lo que vaya saliendo saldrá por este blog si consigo una computadora (la miá feneció de tristeza* los otros días)

nos vemos al rato

* quizás el puñetazo que le pegue al teclado para ver si reactivaba algunas teclas muertas ayudo a la tristeza (sin contar la tristeza del disco que decidía fallar cada unos minutos)

PD: blogger no lo publico, ya llegue, se fue la posibilidad de postear un blog mientras estaba en el aire

lunes, febrero 14, 2011

iterar por directorios con espacios en un shell script

la vida nos sonríe, nos sentimos cual neo escribiendo comandos en el shell a diestra y siniestra, estamos a punto de para las balas con las manos, corremos:

for i in $(ls); do echo $i; done

y nuestra ilusión hacker se nos cae a pedazos al ver que cada palabra de un directorio o archivo con espacios sale en una linea nueva.

no desesperaos (?) he aquí la solución.

reproduzcamos el error para después arreglarlo:

$ mkdir -p "t/folder 1" "t/folder 2" "t/folder 3 with more spaces"
$ cd t
$ for i in $(ls); do echo $i; done
folder
1
folder
2
folder
3
with
more
spaces



vamos de nuevo ahora con la solución:

$ IFS="$(echo -e "\n\r")"
$ for i in $(ls); do echo $i; done
folder 1
folder 2
folder 3 with more spaces

y todos felices (incluso carlin calvo que puede seguir hackeando literalmente a dos manos en sus computadoras auspiciadas por fravega)

lunes, enero 31, 2011

voy a tener que cambiar de maquina :(

si bien mi maquina ha prestado servicios por algo asi como 4 años con su über potente celeron de 1.6 ghz hoy tengo una razon para cambiarla.


se le rompio la tecla esc.

no parece mucho?

cabe recordar que fuera de firefox, vim es lo que mas uso en la maquina


:P

viernes, enero 28, 2011

como empece "con esto de las computadoras"

En el laburo surgió una charla en el canal de irc que usamos que estuvo muy interesante, surgió de la pregunta "cual fue tu primer computadora y cual fue tu primer hola mundo".

Después de reírnos un rato de las anécdotas una de mis compañeras de trabajo decidió recopilarlas para publicarlas en un blog interno de IBM, yo mande la miá y como casi nunca la conté decidí traducirla y postearla acá.

Tengo computadoras desde que tenia 8 años, pero solo las usaba para jugar algunos juegos (principalmente sim city 2000 y indiana jones) hasta que tuve 14 años.

Ese año salio una noticia en CNN sobre una chica de mi edad que tenia una pagina web sobre HTML, yo pensé "aparece en CNN porque tiene 14 años y sabe como hacer paginas web? no debe ser tan difícil!".

Ese verano fui algunas mañanas a un lugar que tenia internet gratis (si lavabas el auto ahí ;), en esas épocas internet era muy cara (10 dolares la hora aproximadamente), así que bajaba toda la información sobre HTML que podía obtener en una hora, los guardaba en diskettes y me iba a mi casa a leerlos e intentar hacer paginas en notepad e internet explorer 4.0.

Cuando supe suficiente cree algunos sitios que hostee en freeservers y me interese por otras cosas (mi guitarra, streetboard y basket si mal no recuerdo).

A los 16 años estaba en mi casa, mi hermano volvía de una de sus primeras clases en la universidad, me tiro un libro y dijo "a vos te gustan las computadoras, lee esto y explicame".

Era un libro llamado "Programación en C para ingenieros", lo leí todo y lo ayude a corregir algunos problemas pero nunca escribí un programa yo debido a que no podía entender la enorme IDE que usaba (alguna versión de Borland C++ para windows).

Un año después nos mudamos a una casa nueva y lo único que tenia era una computadora vieja y una radio. Por las tardes empezaba a escuchar la radio a las 8PM hasta las 2AM (cucuruchos en la frente de peña y zero a la izquierda en la rock and pop y después dolina). Mientras escuchaba la radio no tenia nada que hacer así que fui a un cyber y me baje TurboC++ 1.01, una IDE muy simple para DOS para programar en C y C++, la idea vino debido a que un tiempo atrás estaba jugando el juego de la viborita en un celular de mi madrina:



Y pensé, como se hacen estos juegos? puedo hacer uno de estos?

empece a programar todas las noches mientras escuchaba la radio y por prueba y error (No conocía a ninguna persona que supiera programar y no tenia internet) aprendí a programar e hice la primera versión del juego.

después aprendí assembly para hacer juegos gráficos en increíbles 320x200 pixels a impresionantes 256 colores, luego aprendí C++ porque escuche que la programación orientada a objetos era lo mejor desde el pan rebanado.

un año después estaba por empezar a estudiar Administración de empresas y mi viejo me dijo "hay mucha gente estudiando economía, tendrías que estudiar algo relacionado con computadoras, sos bueno en eso" y acá estoy :)

La ultima cosa graciosa fue que cuando le pregunte a un vecino a donde debería estudiar me dijo "en famaf (facultad de astronomía, matemática y física) tienen una buena carrera de Ciencias de la Computación", fui a la ciudad universitaria a averiguar y como no sabia donde quedaba famaf fui a la UTN y termine estudiando Ingeniería en Sistemas :D

viernes, enero 07, 2011

busco

busco guitarrista en los alrededores de córdoba con guitarra criolla/acústica para juntarnos por ahí a tocar temas como los siguientes:





tengo guitarra eléctrica con ampli y criolla.

se aceptan canciones similares o zapadas del estilo.

jueves, enero 06, 2011

del correo y otros menesteres

medio tarde para hablar sobre el correo (el real no el que usan todos).

en primer lugar nos ponemos anarcos y tratamos de subvertir el sistema.

salvando las estampillas con tracking, que evita reutilizar un sobre o estampilla si se suele enviar y recibir información de y a los mismos lugares?

usted en este momento pensara*, "que rata es este ser humano", lo que usted no tuvo en cuenta es el costo de la estampilla.

para enviar hasta 100g a buenos aires sale ~ $25, si señor, escucho bien, la módica suma de $25 para la cartera de la dama y el bolsillo del caballero.

esto significa que si quisiera enviar mi humilde existencia** a buenos aires me saldría algo así como $17000, el calculo de mi peso (una operación solo realizable por la computación cuántica y hábiles mercaderes) queda como tarea para el lector.

para darle un toque místico a la cuestión permitanme advertirlos de una situación que la ciencia todavía no ha podido explicar:

por las noches los (escasos) buzones de la empresa OCA desaparecen de la faz de la tierra.

abundan teorías sobre el destino de los mismos***, algunas de ellas involucran seres mágicos como hadas, magos o políticos honestos.

lo único que les puedo asegurar es que si algo de bueno tenia el correo era su carácter asincronico, ahora dicha asincronicidad queda circunscripta**** al horario laboral, momento en el cual su dichosa asincronicidad me importa un bledo ya que estoy trabajando (o debería).

ultimo pero no menos importante (?) es la ausencia en esta etapa madura de dicho servicio de interoperabilidad entre servicios competidores. El hecho se aprecia en este mundo post moderno en el cual la cantidad de lugares donde uno puede dejar su carta disminuye a la misma velocidad que mi capacidad de inventar frases graciosas a esta altura del post, en donde la cantidad de buzones de OCA en el centro de la república separatista de córdoba es cercano a 1, el correo argentino no me permite depositar el sobre en sus buzones para luego de buena manera intercambiar los mismos con su empresa competidora de alguna manera*****.

A esta epifanía llegue de manera abrupta al preguntar a un empleado de OCA si tal facilidad para el usuario del servicio existía, recibiendo como respuesta una risa y la simple explicación "como va a existir eso?".

con este simple post pretendo advertirlos sobre algunos de los oscuros rincones de un servicio con el que me he visto obligado a interactuar por cuestiones laborales.

* si, no solo que leo la mente sino que si nota el tiempo verbal le induzco que pensar.
** una forma cheta de decir cuerpo.
*** los mismos buzones
**** mira mama, uso palabras complicadas!
***** la cual poco me importa, para eso me cobran $25

compilar ruby en fedora (RHEL o Centos) e instalar gems y rails

estuve ayudando a alguien a instalar esto y me parecio util dejarlo documentado

disclaimer: no programo en ruby ni en rails (tampoco uso fedora) :D

estableciendo el entorno


su
yum install gcc make binutils wget openssl-devel zlib zlib-devel automake readline-devel sqlite-devel
exit

compilando e instalando


cd
mkdir ruby
cd ruby
wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p330.tar.gz
tar -xzf ruby-1.8.7-p330.tar.gz
cd ruby-1.8.7-p330
./configure --prefix=/opt/ruby-1.8.7-p330 --enable-pthread --enable-shared --enable-openssl --enable-readline --enable-zlib
make

su
make install
exit

facilitandonos la vida y probando que todo ande


echo "export PATH=/opt/ruby-1.8.7-p330/bin/:$PATH" >> ~/.bashrc
bash
# aca deberia andar
irb

instalando gems y rails


cd ..
wget http://rubyforge.org/frs/download.php/73779/rubygems-1.4.1.tgz
tar -xzf rubygems-1.4.1.tgz
cd rubygems-1.4.1
su
ruby setup.rb
gem install rails --include-dependencies
exit

probando que anda


rails new testapp
cd testapp
# por alguna razon tuve que hacer esto aca
su
bundle install
exit
rails server

y visitando http://0.0.0.0:3000/ en el browser me salio la pagina de bienvenida.

miércoles, enero 05, 2011

Indice Punk de Precios (IPP)

debido a la creciente indiferencia hacia el indice de precios oficial este humilde contribuyente propone un indice mucho mas punk.

alguna vez dijo ricky espinoza de la mitica banda punk argentina flema:

hoy pegamos un 50, tomaremos 1000 cervezas

considerando que con mucha suerte hoy "pegando un 50" conseguimos máximo 10 cervezas podemos concluir que el poder adquisitivo punk (PAP) disminuyo en 100 veces considerando la canasta basica punk (CBP) que consiste de los siguientes elementos

* cerveza

espero que les haya gustado, esto fue el Indice Punk de Precios para los fichines, ahora seguimos con mas nivel X

action!

viernes, diciembre 31, 2010

la naranja mecanica, el punk argentino y no me gusta stanley kubrick

hace un rato termine de leer la naranja mecánica, durante todo el libro pensaba que había muchas frases de la canción de los violadores "uno dos ultraviolentos".

nunca le presto atención a las letras así que no fue muy obvio para mi, pero el estribillo tenia muchas referencias al libro.

Al terminar el libro leí la letra y definitivamente esta lleno de términos del libro :D

acá va la letra:

Uno-Dos Ultraviolento
Uno-Dos Ultraviolento
Uno-Dos Ultraviolento
Uno-Dos Ultraviolento

Varias debotchas
caminan por ahi
Mueven sus scahrros
con frenesi
Los mal chicos de cuero
nos queremos divertir
Con mis drugos
al ataque vamos a ir

Y ahora que pasa, eh?
Y ahora que pasa, eh?
Y ahora que pasa, pasa:
Uno-Dos Ultraviolento.

Sin militscos en la esquina
Es mas fácil para mi
El dremcom en la goloba
Me hace decidir
La de grudos mas bolches
La quiero para mi
Crobo rojo entre sus capas
Les haremos salir

Y ahora que pasa, eh?
Nos quieren transformar
No lo lograran
No lo lograran
No, no lo lograran
No... no, no, no

Y ahora que pasa, eh?
Uno-Dos-Ultravio-len-to.

después de terminar el libro vi la película del mismo titulo de stanley kubrick.

y acá es donde le doy de comer a los amantes del cine arte para que me bardeen de lo lindo.

me parece muy mala la película.

No soy muy critico de las películas, son películas y listo, o me gustan o no. Normalmente cuando leo el libro antes suelo terminar pensando "el libro esta mejor" pero supongo que es una cosa normal ya que tratar de meter un libro en dos horas es difícil, pero en este caso me pareció definitivamente mala.

ya me había pasado con el mismo director después de leer 2001 odisea del espacio, no pude terminar la película porque me aburrí a los 30 minutos. En ese caso se justificaba porque el libro era puro relato que no se podía llevar a la pantalla fácilmente, pero en el caso de la naranja mecánica esta relatada por el personaje principal así que no tenia una excusa similar.

bue no voy a seguir porque no soy critico de cine (tampoco soy camionero) pero para cerrar, las omisiones, las modificaciones y el hecho que la película termine unos cuantos capítulos antes que el libro justifica al menos mi opinión.

para los amantes del cine arte con ganas de bardear a verdaderos trolls del cine los invito a pasar por el cine apesta :P

jueves, diciembre 30, 2010

an idea

build a couchdb backend for the logger module in emesene 2 so you can have log synchronization between machines.

one step further:

document the design and make it generic for any IM client so people can store all their chat logs in the same database.

sábado, noviembre 13, 2010

code coverage en python

convirtiéndome en un unittester necesito motivación para seguir testeando, esa motivación me sirve para mejorar, en el caso de python compito contra el puntaje que me da pylint, en el caso de testing estaba buscando algo para competir y encontré coverage, que es una herramienta que mide cuando código cubren tus tests.


si bien el code coverage no es indicativo que no hay bugs, es una buena forma de intentar superarse y agregar mas pruebas.


acá va una mini receta de como instalarlo y usarlo, en mi caso ubuntu 10.10 pero debería adaptarse fácilmente a otros SO.


instalando lo necesario


sudo apt-get install build-essential python-dev
sudo easy_install pip

instalando coverage


sudo pip install coverage

probandolo


yo tengo todos los tests en un directorio llamado test (que original) y en el archivo __main__.py importo todas las clases que heredan de unittest.TestCase y llamo a unittest.main()


para correr coverage ejecuto


coverage run test/__main__.py
coverage html --omit="/usr/*"

con el primero se mide la cobertura de código, con el segundo se genera un reporte html, ahora miramos el reporte


firefox htmlcov/index.html

para tener algo mas simple y fácil de correr para medir el avance podemos usar


coverage report --omit="/usr/*"

que nos muestra el reporte en consola, podemos hacerle un watch o un grep para seguir mas de cerca algún modulo


bueno, esta fue la forma de hacer el testing algo mas parecido a una competencia por quien consigue el puntaje mas alto, al menos a mi eso me sirve

martes, noviembre 09, 2010

si mis hermanos fueran canciones

si, leiste bien, este post iba a ser sobre la banda kyuss, pero en el medio estaba escuchando un tema de la banda y pense


si war fuera una cancion seria esta

(war es mi hermano mas chico) y automaticamete pense, que idea chiflada, que cancion seria pablo? (mi otro hermano, el mas grande), sin mucho pensar se me vino un tema a la mente


aqui estan, estos son... ante ustedes les presento a mis hermanos


pablo, tambien llamado Immigrant Song de Led Zeppelin




war, Whitewater de Kyuss




espero que mis canciones, ehem, hermanos les caigan bien

domingo, noviembre 07, 2010

apoyo moral a Martín Gaitán en su carrera

yo le hago el aguante a Martín Gaitán en su carrera despiadada.

espero que este link le permita subir un poco mas en el ranking de google :P

ya hablando en serio, no solo me parecio interesante su carrera sino que el articulo esta muy bien escrito.

PD: me voy a mirar contra quienes compito ;)

martes, noviembre 02, 2010

charla sobre efene en la utn cordoba

gracias a los muchachos del grupo uni-code voy a estar dando una charla sobre el lenguaje de programación efene en la utn este viernes.

del anuncio del grupo:


los esperamos este Viernes 5 de Noviembre, a las 17:30 Hs en el 1º Piso del Edificio Central de la U.T.N.

PS: se emocionaron un poco con el cartel, yo no tuve nada que ver con la concepción del mismo :P

CouchApp V: filtrar documentos por tag ordenados por fecha

ahora tenemos documentos y para pertenecer a este siglo decidiste agregar tags a algunos elementos para poder filtrarlos y categorizarlos (decí folksonomia y vas a sonar mucho mas hip!)

ahora, como filtro documentos por tag?

si puedo hacer eso, como filtro por tag y ordeno por fecha?

ya que estamos, no seria lindo poder filtrar por tag *y* por fecha?

vamos a resolver todos estos requerimientos con una simple vista

primero creamos la vista

couchapp generate view by-tag

esto crea una vista en el directorio views llamado by-tag, este es un directorio que contiene dos archivos, map.js y reduce.js

en este caso vamos a usar solo map.js asi que borra reduce.js

cd views/by-tag
rm reduce.js

ahora edita map.js para que se vea como esto

function(doc) {
    if (doc.tags) {
        doc.tags.forEach(function (element, index) {
                emit([element, doc.created], doc);
        });
    }
}

por cada documento en la base de datos, vemos si tiene el atributo tags, si lo tiene, por cada tag en tags emitimos un documento cuya llave es un array con el tag y la fecha y cuyo valor es el documento en si.

ahora empujamos los cambios a couchdb

couchapp push

para probar que funciona, crea algunos documentos con el un campo llamado tags que contenga un array de strings y otro campo llamado created que contenga el timestamp en el que el documento fue creado

si pongo esta URL http://localhost:5984/datos/_design/datos/_view/by-tag/ en mi navegador, obtengo algo así:

{"total_rows":8,"offset":0,"rows":[
{"id":"d6de7e9a63039dc1af500a40af0014d7","key":["bar",1288644825761],"value":{"_id":"d6de7e9a63039dc1af500a40af0014d7","_rev":"1-eab86fbc2b4c24f31e1d60dfdd762793","author":"wariano", "created":1288644825761, "tags":["test","foo","bar"], ...}},
...
]}

esto significa que la vista funciono, ahora para filtrar por tag la URL se va a poner un poco rara

vamos a usar filtros en la vista para filtrar solo los documentos con un tag especifico

http://localhost:5984/datos/_design/datos/_view/by-tag?descending=false&startkey=["test", 0]&endkey=["test", 9999999999999]

con este request decimos que queremos los resultados de la vista llamada by-tag, filtrando los documentos empezando con la llave ["test", 0] y terminando con la llave ["test", 9999999999999]. Esto significa que solo queremos los documentos con la llave "test" y que queremos todos los timestamps (por eso el numero enorme en endkey)

si queremos ordenar los tags en orden descendente deberíamos cambiar el orden de starkey y endkey: http://localhost:5984/datos/_design/datos/_view/by-tag?descending=true&startkey=["test", 9999999999999]&endkey=["test", 0]

podemos jugar con startkey y endkey para obtener rangos de tags o un tag en un periodo de tiempo especifico, por ejemplo: "cosas taggeadas con fun en los últimos dos días"

el código para hacer el request a couchdb desde javascript es el siguiente

datos.getByTag = function (tag, descending, okCb, errorCb, startStamp, endStamp) {
    var tmp;

    startStamp = startStamp || 0;
    endStamp = endStamp || 9999999999999;

    if (descending) {
        tmp = endStamp;
        endStamp = startStamp;
        startStamp = tmp;
    }

    $.couch.db(datos.db).view("datos/by-tag",
        {"descending": descending, "startkey": [tag, startStamp], "endkey": [tag, endStamp],
            "success": okCb, "error": errorCb});
};

con esto tenes una forma de listar documentos por uno o mas campos, podes modificar este ejemplo un poco para listar por usuario o por otras cosas

[EN] CouchApp V: filter documents by tag ordered by timestamp

you now have documents and to be in this century you decide to add tags to some elements so you can filter and categorize (say folksonomy and you will sound really hip!)


now, how do I filter the documents by tag?


if I can do that, how do I filter by tag and order by date?


now that we are at it, wouldn't be nice to have a filter by tag *and* date?


we will solve all this requirements with a simple view


first we create the view


couchapp generate view by-tag

this creates a view in the views called by-tags, this is a directory that contains two files, map.js and reduce.js


in this case we will only use the map.js file, so remove the reduce.js file


cd views/by-tag
rm reduce.js

now edit the map.js file to look like this


function(doc) {
    if (doc.tags) {
        doc.tags.forEach(function (element, index) {
                emit([element, doc.created], doc);
        });
    }
}

here for each document in the database we check if the document has the tags attribute and if it has the attribute, for each tag we emit a document that contains as key an array with the tag and timestamp when the document was created and as value the document itself


now we push our changes to couchdb


couchapp push

to test that this works, create some documents with a field called tags that contains a list of strings and a field called created that contain the timestamp when the item was created


if I put this URL http://localhost:5984/datos/_design/datos/_view/by-tag/ in my browser I get something like this


{"total_rows":8,"offset":0,"rows":[
{"id":"d6de7e9a63039dc1af500a40af0014d7","key":["bar",1288644825761],"value":{"_id":"d6de7e9a63039dc1af500a40af0014d7","_rev":"1-eab86fbc2b4c24f31e1d60dfdd762793","author":"wariano", "created":1288644825761, "tags":["test","foo","bar"], ...}},
...
]}

this means the view worked, now to filter by tag the URL will get weird


we will use filters in the view to filter only for a specific tag


http://localhost:5984/datos/_design/datos/_view/by-tag?descending=false&startkey=["test", 0]&endkey=["test", 9999999999999]


with this request we say that we want to get the result of the view called by-tag, filtering starting with the key ["test", 0] and ending with the key ["test", 9999999999999]. This means that we only want the documents with the key "test" and we want all the timestamps (that's why the huge number in the endkey


if we want to sort the tags in descending order we should switch the start and endkey like this: http://localhost:5984/datos/_design/datos/_view/by-tag?descending=true&startkey=["test", 9999999999999]&endkey=["test", 0]


we can play with startkey and endkey to get a range of tags or one tag in a specific period, for example, "things tagged fun in the last 2 days"


the code to do the request to couchdb from javascript is the following


datos.getByTag = function (tag, descending, okCb, errorCb, startStamp, endStamp) {
    var tmp;

    startStamp = startStamp || 0;
    endStamp = endStamp || 9999999999999;

    if (descending) {
        tmp = endStamp;
        endStamp = startStamp;
        startStamp = tmp;
    }

    $.couch.db(datos.db).view("datos/by-tag",
        {"descending": descending, "startkey": [tag, startStamp], "endkey": [tag, endStamp],
            "success": okCb, "error": errorCb});
};

with this you have a way to list documents by one or more fields, you can modify this a little to list by users, or by some other thing

viernes, octubre 29, 2010

Como generar archivos .exe e instaladores para una aplicación python (y pygtk)

Como generar archivos .exe e instaladores para una aplicación python


Este documento describe los pasos necesarios para crear un archivo ejecutable
de una aplicación python y como generar un instalador y una versión portable
para dicha instalación.

Este documento asume que la aplicación se basa en GTK pero debería funcionar
con menores cambios en otros toolkits.

porque un instalador

  • se requiere instalar muchos componentes a mano por el usuario final para una sola aplicación
  • muchos instaladores pequeños
  • difíciles de encontrar
  • difícil encontrar las versiones exactas que funcionan en conjunto
  • requiere instalarlos en un orden definido
  • rezar
  • algunas veces incluso haciendo todo bien puede no funcionar
  • fácil de automatizar y documentar para replicar con cada nueva versión
  • liberar al usuario final de los problemas para poder usar la aplicación

componentes requeridos

  • python
  • todas las librerías utilizadas por la aplicación
  • py2exe
  • nsis
  • tiempo y suerte

orden de instalación

algunos instaladores son independientes de otros, pero para evitar posibles problemas recomiendo la instalación en el siguiente orden.

  • python
  • gtk-runtime
  • gtk2-themes
  • nsis
  • pygobject
  • pycairo
  • pygtk
  • pywin32
  • py2exe

tareas extra

  • setear la variable de entorno PATH para agregar el path a la instalación de python
  • probar la instalación con una pequeña aplicación gtk
>>> import gtk
>>> w = gtk.Window()
>>> l = gtk.Label("asd")
>>> w.add(l)
>>> w.show_all()
>>> gtk.main()

prueba con una aplicación de ejemplo

Cree un repositorio con una aplicación de ejemplo para probar los pasos, la aplicación esta disponible en github acá:

http://github.com/marianoguerra/PyGtkOnWindows

pasos

  • descargarla
  • descomprimirla
  • ejecutar python setup.py py2exe
  • copiar los directorios lib y share de la instalación del runtime de gtk (no de la instalación de pygtk) al directorio dist
  • copiar todos los archivos del directorio dll al directorio dist
  • borrar los locales y temas no usados de los directorios copiados a dist (yo solo dejo el theme MS-Windows)
  • crear la siguiente estructura de directorios dentro de dist: etc/gtk-2.0
  • dentro de ese directorio crear un archivo llamado gtkrc con una linea como la siguiente dentro:
    • gtk-theme-name = "MS-Windows"
    • podes cambiar el tema usado manteniendo otro theme dentro de share/themes y cambiando el nombre del theme en gtkrc
  • right click en ejemplo.nsi y seleccionar "Compile NSIS Script"
  • right click en ejemplo-portable.nsi y seleccionar "Compile NSIS Script"
  • deberías tener el instalador y la versión portable disponibles
  • para probar que funciona correctamente, correr el instalador y la versión portable en una instalación de windows sin los paquetes que instalaste anteriormente

probar con una aplicación real

ahora para sentirlo mas real, creemos un instalador y una versión portable de
un programa real, en este caso, un proyecto personal llamado emesene 2
(http://www.emesene.org/).

pasos

  • descargarlo de http://github.com/emesene/emesene
  • descomprimirlo
  • copiar setup.py and ez_setup.py al directorio emesene
  • cd emesene
  • correr python setup.py py2exe
  • cd ..
  • copiar los directorios lib y share de la instalación del runtime de gtk (no de la instalación de pygtk) al directorio dist
  • copiar todos los archivos del directorio dll al directorio dist
  • borrar los locales y temas no usados de los directorios copiados a dist (yo solo dejo el theme MS-Windows)
  • crear la siguiente estructura de directorios dentro de dist: etc/gtk-2.0
  • dentro de ese directorio crear un archivo llamado gtkrc con una linea como la siguiente dentro:
    • gtk-theme-name = "MS-Windows"
    • podes cambiar el tema usado manteniendo otro theme dentro de share/themes y cambiando el nombre del theme en gtkrc
  • right click en emesene.nsi y seleccionar "Compile NSIS Script"
  • right click en emesene-portable.nsi y seleccionar "Compile NSIS Script"
  • deberías tener el instalador y la versión portable disponibles
  • para probar que funciona correctamente, correr el instalador y la versión portable en una instalación de windows sin los paquetes que instalaste anteriormente

notas

[EN] How to generate .exe files and installers for a python (and pygtk) applications

How to generate .exe files and installers for a python applications


This document describes the steps required to create an executable file from a
python program and how to build an installer and portable file from that
application.


The document assumes that the application is based on GTK but it should work
with minor changes for other toolkits.

why an installer

  • many components are required to install by hand by the end user for a simple application
  • a lot of small installers
  • hard to find
  • hard to match the exact versions that work together
  • install them in the required order
  • pray
  • sometimes even doing everything right it may not work
  • easy to automate and document to replicate with each new version
  • free the end user from problems to use the app

required components

  • python
  • all the libraries used by the application
  • py2exe
  • nsis
  • time and luck ;)

installation order


some installers are independent from the others, but to avoid posible problems I recommend the installation in this order.

  • python
  • gtk-runtime
  • gtk2-themes
  • nsis
  • pygobject
  • pycairo
  • pygtk
  • pywin32
  • py2exe

extra tasks

  • set the PATH environment variable to add the path to the python installation
  • test that the installation works with a simple gtk application
>>> import gtk

>>> w = gtk.Window()
>>> l = gtk.Label("asd")
>>> w.add(l)
>>> w.show_all()
>>> gtk.main()

test with a sample application


I created a repository with a sample application to test the steps, the application is available in github here:

http://github.com/marianoguerra/PyGtkOnWindows

steps

  • download it
  • unpack it
  • run python setup.py py2exe
  • copy the lib and share directory from the gtk runtime installation (not the pygtk installation) to the dist directory
  • copy all the files from the dll directory to the dist directory
  • remove unused locales and unused themes (I keep only ms theme)
  • create the following dirs inside dist: etc/gtk-2.0
  • inside that create a file called gtkrc with a line like this inside:
    • gtk-theme-name = "MS-Windows"
    • you can change the theme by keeping that theme inside share/themes and changing the name in gtkrc
  • right click on ejemplo.nsi and select "Compile NSIS Script"
  • right click on ejemplo-portable.nsi and select "Compile NSIS Script"
  • you should have the installer and portable versions available
  • to test that it works correctly, run the installer and portable versions in a windows installation without the packages you installed previously

test with a real application

now to make it feel more real let's create an installer and portable versions
for a real world program, in this case, a project of mine called emesene 2
(http://www.emesene.org/).

steps


  • download it from http://github.com/emesene/emesene
  • unpack it
  • copy setup.py and ez_setup.py to the emesene directory
  • cd to emesene
  • run python setup.py py2exe
  • cd ..
  • copy the lib and share directory from the gtk runtime installation (not the pygtk installation) to the dist directory
  • copy all the files from the dll directory to the dist directory
  • remove unused locales and unused themes (I keep only ms theme)
  • create the following dirs inside dist: etc/gtk-2.0
  • inside that create a file called gtkrc with a line like this inside:
    • gtk-theme-name = "MS-Windows"
    • you can change the theme by keeping that theme inside share/themes and changing the name in gtkrc
  • right click on emesene.nsi and select "Compile NSIS Script"
  • right click on emesene-portable.nsi and select "Compile NSIS Script"
  • you should have the installer and portable versions available
  • to test that it works correctly, run the installer and portable versions in a windows installation without the packages you installed previously

notes

viernes, octubre 22, 2010

CouchApp IV: creando funciones show con templates HTML

necesitamos mostrar una entidad en su propia pagina, para eso vamos a necesitar un template html con los valores del documento almacenado en la base de datos, un template es una buena herramienta para eso, veamos como hacerlo en nuestra couchapp


primero creamos la funcion show, esta funcion es llamada para mostrar un documento en algun formato, en nuestro caso html


# generamos la funcion show
couchapp generate show dato
# la editamos con un editor de texto
vim shows/dato.js

en un principio vamos a ver este contenido



function(doc, req) {  
  
}

reemplazamos por algo parecido a esto



function(doc, req) {
    if (doc !== null && doc.name) {
        var ddoc = this,
            Mustache = require("vendor/couchapp/lib/mustache"),
            path = require("vendor/couchapp/lib/path").init(req),
            assetPath = path.asset();

        provides("html", function() {
            return Mustache.to_html(ddoc.templates.dato, {
                assetPath: assetPath,
                doc: doc
            });
        });
    }
    else {
        return "not found";
    }
}

en el codigo controlamos que tenemos un documento, sino mostramos "not found",
tambien creamos algunos objetos que nos ayudan y finalmente renderizamos el template pasandole algunos valores que seran usados dentro del template.


mi template esta en templates/dato.html (por eso ddoc.templates.dato) y contiene un template mustache, mira la documentacion de mustache para mas informacion sobre el formato


la url par acceder a esta funcion es [database]/_design/[app]/_show/[showname]/[docid] un ejemplo podria ser http://localhost:5984/datos/_design/datos/_show/dato/6bd97648d74961996c8f0d42b2005761

[EN] CouchApp IV: creating show functions with html templates

we need to display some entity in its own web page, for that we need to fill an html template with the values of the document stores in the database, a template is a nice fit for this, let's see how we do this in our couchapp


first, create the show function, this is a function that when called displays a document in some format, in our case in HTML


# generate the show function
couchapp generate show dato
# open it with a text editor
vim shows/dato.js

we will see this content



function(doc, req) {  
  
}

we replace the content with something like this



function(doc, req) {
    if (doc !== null && doc.name) {
        var ddoc = this,
            Mustache = require("vendor/couchapp/lib/mustache"),
            path = require("vendor/couchapp/lib/path").init(req),
            assetPath = path.asset();

        provides("html", function() {
            return Mustache.to_html(ddoc.templates.dato, {
                assetPath: assetPath,
                doc: doc
            });
        });
    }
    else {
        return "not found";
    }
}

here we check that we have a document, if not return "not found", also we create some objects that will help us and finally we render the template passing some values that will be used in the template.


my template is located at templates/dato.html (that's why ddoc.templates.dato) and contains a mustache template, see mustache documentation for information about the format


the url to access this function is [database]/_design/[app]/_show/[showname]/[docid] an example could be http://localhost:5984/datos/_design/datos/_show/dato/6bd97648d74961996c8f0d42b2005761

jquery.couch snippets

algunos snippets para hacer tareas comunes en jquery.couch


var datos = {};
datos.db = "datos";

datos.login = function (user, password, okCb, errorCb) {
    $.couch.login({"name": user, "password": password, "success": okCb, "error": errorCb});
};

datos.logout = function (okCb, errorCb) {
    $.couch.logout({"success": okCb, "error": errorCb});
};

datos.checkSession = function (okCb, errorCb) {
    $.couch.session({"success": okCb, "error": errorCb});
};

datos.create = function (data, okCb, errorCb) {
    $.couch.db(datos.db).saveDoc(data, {"success": okCb, "error": errorCb});
};

datos.get = function (id, okCb, errorCb, rev) {
    $.couch.db(datos.db).openDoc(id, {"success": okCb, "error": errorCb, "rev": rev});
};

datos.remove = function (id, rev, okCb, errorCb) {
    $.couch.db(datos.db).removeDoc({"_id": id, "_rev": rev}, {"success": okCb, "error": errorCb});
};

datos.getRecent = function (limit, okCb, errorCb) {
    $.couch.db(datos.db).view("datos/recent-items",
        {"limit": limit, "descending": true, "success": okCb, "error": errorCb});
};

CouchApp III: subiendo los cambios automaticamente

ahora que tenemos todo lo que necesitamos para crear nuestra couchapp, podemos ir al directorio _attachments y empezar a modificar el código para que haga lo que queramos


después de un rato vas a notar que necesitas hacer push de los cambios a couchdb cada vez que queres probarlos, si sos como yo esto se va a poner molesto bastante rápido, hagamos que las herramientas nos ayuden


#install inotify-tools
sudo apt-get install inotify-tools

con inotify tools vamos a correr un script que va a monitorear cualquier cambio de archivos y va a hacer un push cuando eso suceda, voy a excluir los cambios en *.swp ya que vim crea esos archivos y cambian bastante seguido


corre este comando en algún shell y dejalo corriendo


inotifywait -q -e modify -m -r . | while read line; do if echo $line | grep -v .*.swp; then couchapp push; fi; done

ahora edita algún archivo y guardalo, anda al shell donde tenes el script corriendo, vas a ver algo como esto:


./_attachments/ MODIFY index.html
2010-10-22 11:00:48 [INFO] Visit your CouchApp here:
http://wariano:secret@localhost:5984/datos/_design/datos/index.html

ahora podes editar tus archivos y los cambios van a ser automáticamente subidos a couchdb

[EN] CouchApp III: pushing the changes automatically

now we have all we need to start creating our couchapp, go to the _attachments directory and start modifying the code to do what you want


after a moment you will notice that you need to push the changes to couchdb each time you want to test it, if you are like me this will get annoying pretty fast, let's make the tools help us


#install inotify-tools
sudo apt-get install inotify-tools

with inotify tools we will run a script that will monitor any file change and make a couchapp push when that happens, I will exclude the changes in *.swp files since vim create those and they change pretty often


in some shell run this and leave it running


inotifywait -q -e modify -m -r . | while read line; do if echo $line | grep -v .*.swp; then couchapp push; fi; done

now edit some file and save it, go back to the shell where the script is running, you should see something like:


./_attachments/ MODIFY index.html
2010-10-22 11:00:48 [INFO] Visit your CouchApp here:
http://wariano:secret@localhost:5984/datos/_design/datos/index.html

now you can edit your files and the changes will be pushed automatically to couchdb

CouchApp II: arreglando la fiesta de admins

ahora que tenemos nuestra aplicacion corriendo podemos ver que hay un problema con la demo, no tenemos autenticacion, por default couchdb esta en modo "fiesta de admins", para leer mas sobre la fiesta de admins en couchdb podes leer Couchdb the definitive guide


para arreglarlo necesitamos usar futon (el panel administrativo de couchdb) y crear el primer admin


anda a futon con tu browser a http://localhost:5984/_utils/index.html


abajo a la derecha de la pagina deberias leer algo como "Welcome to Admin Party! Everyone is admin. Fix this", hace click en el link y crea el primer admin


voy a crear el admin como "wariano" y como password "secret", cuando veas esto deberías cambiarlo por tu usuario y password


si intentamos hacer push de nuestra couchapp de nuevo vamos a obtener un error que nos dice que no estamos autorizados, esto es porque necesitamos proveer usuario y contraseña para modificar la base de datos ahora, para hacer esto vamos a editar el archivo .couchapprc de nuevo para agregar el usuario y contraseña


edita la url de


http://localhost:5984/datos

a


http://wariano:secret@localhost:5984/datos

intenta hacer push de nuevo, debería funcionar. Intenta usar la demo de nuevo usando tu usuario y contraseña

[EN] CouchApp II: fixing the admin party

now that we have our app running we can see a problem in the demo, we don't have authentication, and by default couchdb is in "admin party" mode, read more about the admin party in Couchdb the definitive guide


to fix this we need to go to futon (the admin panel of couchdb) and set up the first admin


go to futon pointing your browser to http://localhost:5984/_utils/index.html


at the bottom right corner of the page you should read something like "Welcome to Admin Party! Everyone is admin. Fix this", click on the link and set the first admin


I will create the admin as "wariano" and password "secret", whenever you see that change for your user and password


if we try to push our couchapp again we will get an unauthorized error, that's because we need to provide credentials to modify the database now, to do this we will edit the .couchapprc again to add the user and password


edit the url from


http://localhost:5984/datos

to


http://wariano:secret@localhost:5984/datos

and try pushing again it should work now, try the demo again using your user and password

CouchApp I: instalando el entorno

vamos a empezar nuestra couchapp instalando el entorno, para eso necesitamos instalar couchapp y couchdb


# instalar couchdb y los modulos de python para poder instalar otros modulos
sudo apt-get install python-setuptools couchdb
# descargar pip
curl -O http://python-distribute.org/distribute_setup.py
sudo python distribute_setup.py
sudo easy_install pip
# instalar couchapp
sudo pip install couchapp

ahora que tenemos couchapp vamos a generar nuestro proyecto, vamos a llamarlo "datos"


couchapp generate datos
cd datos
# editamos el archivo couchapprc
vim .couchapprc

el archivo .couchapprc contiene los destinos donde vamos a instalar nuestra aplicación, definamos el target por defecto


{"env": {
  "default": {
   "db": "http://localhost:5984/datos"
  }
 }
}

guardar el contenido y correr


couchapp push

deberia mostrar algo como lo siguiente:


2010-10-22 10:21:10 [INFO] Visit your CouchApp here:
http://localhost:5984/datos/_design/datos/index.html

ahora anda a esa URL con tu browser, deberías ver la pagina de demostración.

Seguidores

Archivo del Blog