Ir al contenido principal

This is my blog, more about me at marianoguerra.github.io

🦋 @marianoguerra.org 🐘 @marianoguerra@hachyderm.io 🐦 @warianoguerra

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.

[EN] CouchApp I: setting up the environment

we will start our couchapp setting up the environment, for that we will install couchdb and couchapp


# install couchdb and python modules to install other modules
sudo apt-get install python-setuptools couchdb
# download pip
curl -O http://python-distribute.org/distribute_setup.py
sudo python distribute_setup.py
sudo easy_install pip
# install couchapp
sudo pip install couchapp

now that we have couchapp we will generate our project, we will call it "datos"


couchapp generate datos
cd datos
# edit the couchapprc file
vim .couchapprc

the .couchapprc file contains the targets where we can deploy our application, let's define the default target


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

save the content and run


couchapp push

it should display something like the following:


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

now go to that site with your browser, you should see a demo page.

hola mundo web con flask y mod_wsgi sobre apache2

necesitaba levantar una aplicación simple usando flask y mod_wsgi sobre apache para ver si encuentro la causa de un error en una aplicación un poco mas compleja y decidi ya que estoy documentarlo por si le es útil a alguien (en el futuro me va a ser útil a mi cuando me olvide ;)

empecemos con un poco de bash para establecer el ambiente

# creamos el directorio donde vamos a tener nuestro código
mkdir site
cd site

# bajamos los módulos que vamos a usar
wget http://pypi.python.org/packages/source/F/Flask/Flask-0.6.tar.gz
wget http://pypi.python.org/packages/source/J/Jinja2/Jinja2-2.5.5.tar.gz
wget http://pypi.python.org/packages/source/W/Werkzeug/Werkzeug-0.6.2.tar.gz

# instalar los paquetes necesarios
sudo apt-get install libapache2-mod-wsgi curl

# desempaquetamos
tar -xzf Flask-0.6.tar.gz
tar -xzf Werkzeug-0.6.2.tar.gz
tar -xzf Jinja2-2.5.5.tar.gz

# creamos enlaces simbólicos a las bibliotecas
ln -s Flask-0.6/flask/
ln -s Werkzeug-0.6.2/werkzeug/
ln -s Jinja2-2.5.5/jinja2/

ahora con tu editor favorito (osea vim ;)

vim server.py

escribí lo siguiente

import flask

app = flask.Flask(__name__)

@app.route("/")
def index():
return "hello world!"

if __name__ == '__main__':
app.run(host="127.0.0.1", debug=True)


probemos lo que tenemos hasta ahora

# levantamos el server de desarrollo
python server.py &

# probamos traer la pagina principal
curl http://localhost:5000/

# matamos el server
kill %

esto debería andar, ahora vamos con la parte de apache, con tu editor favorito edita un archivo llamado server.wsgi con el siguiente contenido, tené en cuenta de cambiar el path al directorio tuyo, tiene que ser un path absoluto.

import os
import sys

sys.path.insert(0, "/home/wariano/code/site/")

from server import app as application

ahora necesitamos crear nuestro sitio dentro de apache

sudo vim /etc/apache2/sites-available/flask

este es el contenido del archivo, tene en cuenta de cambiar todos los "wariano" por el nombre de usuario que va a correr el proceso. también podes renombrar flask por el nombre de tu proyecto, tené en cuenta de también hacerlo en los otros lugares.

<virtualhost *>
ServerName localhost

WSGIDaemonProcess wariano user=wariano group=wariano threads=5 processes=5
WSGIScriptAlias / /var/www/flask/server.wsgi

LogLevel info
ErrorLog /var/log/apache2/flask-error.log
CustomLog /var/log/apache2/flask-access.log combined

<directory /var/www/flask>
WSGIProcessGroup wariano
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>
</VirtualHost>


# creamos el directorio donde apache va a buscar nuestro script
sudo mkdir -p /var/www/flask
cd /var/www/flask/
# linkeamos al script en nuestro directorio (cambia el path al tuyo)
sudo ln /home/wariano/code/site/server.wsgi
# activamos nuestro sitio
sudo a2ensite flask
# desactivamos el sitio por default (no lo desactives si tenes algo andando,
# vas a tener que cambiar alguna configuración en el sitio de flask si haces esto)
sudo a2dissite default
# reiniciamos apache
sudo /etc/init.d/apache2 restart

# probamos que el sitio ande
curl http://localhost/

y voila! un sitio andando en python sobre apache, si nos queremos poner a jugar y correr un benchmark para medir vaya a saber que podemos usar el benchmark de apache

# instalamos las utilidades de apache
sudo apt-get install apache2-utils
# corremos el apache con 100 conexiones y 20 conexiones concurrentes
ab -n 100 -c 20 http://localhost/

material de charlas de PyConAr2010

mediante la presente hago disponibles los recursos utilizados en las charlas dadas por quien les escribe en el contexto de PyConAr 2010.


las anteriormente mencionadas se encuentran en un repositorio de git en github lo cual permitirá seguir el repositorio y ser notificado en caso de que alguna sea modificada o nuevas charlas sean agregadas.


el repositorio se encuentra aquí: http://github.com/marianoguerra/talks/tree/master/PyConAr2010/


para su mayor comodidad publico las charlas aquí.



por ultimo cumpliendo con mi promesa publico el código utilizado durante la charla click click, tu aplicación python en windows a un doble click de distancia, el mismo se encuentra como es de esperar en github aquí: http://github.com/marianoguerra/PyGtkOnWindows


promulgese, difundase y archivese

que semanita

miercoles Rage Against The Machine y Queens of the Stone Age en el Pepsi music, viernes y sabado PyConAr 2010 en Córdoba.

RATM fue impresionante, el mejor recital al que haya ido, el pogo fue lo mas groso que he visto, lo que se saltaba, los moshpits y encima de todo fuera de algunos golpes todos bastante respetuosos. Algo así como artistas del pogo :D

no se si es que escucho RATM hace mucho o que pero los temas elegidos fueron espectaculares y tocaron muy bien.



queens of the stone age también estuvo muy bueno aunque obviamente por el estilo fue un poco mas tranqui, los temas elegidos también estuvieron muy buenos y la banda sonó muy bien, mas que recomendable.



y por ultimo, el PyConAr 2010 en córdoba, acá no hubo mucho pogo pero no por eso no dejo de estar espectacular, la organización muy bien, las charlas mas que buenas, los lightning talks muy divertidos e informativos y lo mejor de todo es juntarse a charlar con gente grosa, divertida y recontra humilde.

esperando el a~no que viene por la próxima.