viernes, octubre 22, 2010

[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.

miércoles, octubre 20, 2010

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/

domingo, octubre 17, 2010

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.

miércoles, octubre 13, 2010

compilando un paquete desde las fuentes en ubuntu/debian

para una cosa necesitaba agregar una columna con el timestamp a la salida de vmstat por lo que necesitaba el codigo y el entorno para modificarlo y recompilarlo.

despues de un poco de busqueda resulto ser bastante facil.

# donde esta vmstat?
$ which vmstat
# quien provee vmstat?
$ dpkg -S /usr/bin/vmstat
# traeme las fuentes de procps
$ apt-get source procps
# traeme las dependencias para construir procps
$ sudo apt-get build-dep procps
# vamos al directorio
$ cd procps-3.2.8/
# edicion furiosa de código
$ vim vmstat.c
# compilamos el codigo
make
# probamos nuestra creacion
$ vmstat -n 1

y voila!

martes, octubre 12, 2010

Si lo dice Trent Reznor... :P

if as many people really listened to Joy Division as list them on their Facebook page, Joy Division would be bigger than U2. That sense of, here’s the books I’m supposed to have read for the social archetype I want to fit into, so I’ll portray myself this way

Trent Reznor on Why Facebook "Sucks"

lunes, septiembre 20, 2010

gente que implementa en android cosas que uno hace

gracias a los aportes de don mateo bengualid la creciente comunidad (?) de repioleros podra disfrutar de su aplicacion favorita (?) en android.

a las pruebas me remito.





gracias a mateo por los aportes.

domingo, septiembre 19, 2010

*sensacion* de inseguridad

La capital argentina es la segunda ciudad más segura de las Américas, sólo superada por Toronto, Canadá. La tasa de homicidios del país es la cuarta más baja del continente y cayó casi un 40 por ciento desde 2002.

http://www.pagina12.com.ar/diario/elpais/1-153423-2010-09-19.html


Uno de los datos más curiosos del informe –un adelanto de las cifras oficiales que se conocerán en pocos días más– es la diferencia que existe entre lo que comúnmente se llama “sensación de inseguridad” y los datos que señalan las estadísticas reales. Una encuesta de victimización realizada en 2088 por Lapop (Latin American Public Opinion Project), precisó que la Argentina encabeza la compulsa, porque el 27,47 por ciento de los consultados afirman sentirse “inseguros” por haber sido víctimas de algún delito. El segundo lugar lo ocupa Chile (22,23) y el tercero Uruguay (22,04). Sin embargo, las cifras oficiales de esos tres países, del mismo año, señalan que los tres son los que tienen las tasas más bajas de homicidios: Chile (1,60), Argentina (5,30) y Uruguay (6,60).

De todos modos, en el caso de Chile, donde la tasa oficial es de 1,6 casos cada cien mil habitantes, se aclaró que hasta 2008 las cifras tuvieron como fuente el Ministerio del Interior, que releva datos del cuerpo de Carabineros. En el año 2009, el Ministerio Público de Chile (fiscalías), informó sobre un total de casos de homicidio que se traduciría en una tasa de 9,1 homicidios cada cien mil habitantes. “Esto indicaría que Argentina sólo tendría tasas más altas que Estados Unidos y Canadá”, explicó la fuente consultada por este diario.

obviamente son estadisticas y no hay que creerles del todo, pero si son ciertas...
Q. How do you stay on top of technology trends and innovation? 

A. Talk to people you respect and ask them what they're doing and what is interesting. Then read about those topics. When it makes a sense, you learn a lot more by actually doing a project in an area than by reading about it.

Q. Time management … technical leaders and executives are famous for being time-strapped. What strategies do you use to stay sane and use your time effectively?

A. Do the things that matter, stop doing the things that don't, and continuously examine your use of time so that you can tell the difference. Don't waste time on something just because that's the way it has been done.


-- Peter Norvig

viernes, septiembre 17, 2010

Se viene PyCon Argentina 2010

ya salio el schedule de charlas de pycon argentina 2010 y tengo el gusto de participar con 2 charlas.

acá esta el cronograma completo.

que haces que no reservaste los días para venirte a la docta al pycon?

domingo, septiembre 12, 2010

la sabiduria del pasado

después de escribir el post anterior me puse a buscar en mi blog cuantas veces hice comentarios fanáticos (tengo algunos en mente pero quería asegurarme de que no hubiera (o hubiese?) mas), encontre un post que resume el post anterior en una sola fase.

But there is a step beyond thinking of yourself as x but tolerating y: not even to consider yourself an x. The more labels you have for yourself, the dumber they make you.

ya lo dijo Pascal, el hombre nombrado en honor al lenguaje de programación (?)

I have made this letter longer than usual because I lack the time to make it shorter.

en mi caso me faltaba el tiempo y la sabiduría :D

humano meta

resulta que cometi el error de ponerme a leer comentarios de los siguientes eventos deportivos y otros:

  • argentina vs españa en futbol
  • argentina vs españa en basquet
  • argentina vs brasil en basquet
  • muchos partidos "chivos" del mundial de futbol
  • comentarios en youtube (OMG)
en diarios online de argentina y del otro pais.

TL;DR: anda hasta abajo para links con ejemplos.

me llevo a la conclusión de que me canse de las discusiones de "nosotros vs ustedes" y el interminable listado de razones por las cuales "nosotros somos mejores que ustedes" o bajar al simple "te denigro porque no sos como nosotros".

si no encontraste el patrón todavía el "nosotros vs ustedes" también me canso en otros ambientes como:

  • lenguajes de programación
  • sistemas operativos
  • licencias de software
  • frameworks
  • editores de texto
  • desktops
  • marcas de cualquier producto comercial
  • bandas musicales
  • carreras universitarias
  • metodologias de desarrollo
  • equipos de futbol
  • partidos políticos
  • religión
  • habitos alimenticios
  • preferencias sexuales
  • hobbies o como uso mi tiempo libre
y un largo etc que quizás siga completando.

para evitar este stress, debido a que por defecto con cada elección me pongo de un lado de la pelea, de ahora en mas me propongo definirme en terminos "meta".

Soy programador de unos cuantos lenguajes de programacion, elegi esos porque como vos elegiste los tuyos me interesaron de una forma u otra, como todos los lenguajes de programacion tienen sus ventajas y desventajas, si estas dispuesto a tener una conversacion centrada sobre el tema podemos analizar *en funcion de preferencias personales y totalmente subjetivas* porque elegí los que elegi, sino, por el bien de ambos, dejemos el tema de lado y charlemos de cualquier otra cosa.

reemplaza programador y lenguajes de programación por otros valores y vas a tener un template :P


En cuanto a las cosas que no puedo elegir, sino que soy, como nacionalidad o preferencias que resultan de algo que no puedo explicar racionalmente, dejemoslo en que es accidental y al igual que antes si querés que hablemos de las cosas que nos gustan y no nos gustan todo bien, si querés competir para ver cual es mejor, para eso están los comentarios de youtube.

Es muy difícil evitar ser trolleado y entrar en una discusión y mantenerse racional pero voy a intentarlo, para que esto quede mas allá de un post en un blog totalmente efímero cree una pagina que me permite recordarlo y distribuirlo fácilmente en una discusión para volver quizas a la recionalidad o establecer de forma simple y generica mi posicion.

la llamo la ley de wariano, esta basada en la ley de jante pero generalizada para que encaje en muchas cosas.

la instancia por defecto se refiere a países, porque es el tipo de discusión que mas me enerva pero puede ser parametrizado con lo que quieran.

les dejo unos ejemplos (por ahora en ingles porque es mas generica :P)

etc etc.

espero que sea útil :P

aclaracion, no creo que este en este nivel de "iluminacion", solo es un esfuerzo para evitar ponerme del lado "de los mejores" por preferencias o pertenencia a cierto grupo.

Intentare aplicarlo en lo que pueda y exponer mis preferencias de una forma centrada, lo que no implica que alguna vez no cumpla con mi propia ley :P.

por ultimo aclarar que esto no me convierte en un ser totalmente apático, festejare las victorias de los equipos o grupos a los que pertenezco, disfrutare los beneficios y ventajas que mis elecciones tengan, pero siempre evitando agredir a "los del otro bando".

miércoles, septiembre 01, 2010

martes, agosto 24, 2010

repiola 0.6: jump a direcciones, call, ret y compilacion

para darle un cierre a esta idea que tuve alguna vez, implemente lo que faltaba para considerar el proyecto "terminado", lo unico que puede llegar a faltar es UIs mas copadas (como guardar programas etc.)

en esta release agregue soporte para saltar a una direccion almacenada en un registro:

set r2 2
jmp r2

salta a la direccion 2

call y ret permiten simular rutinas, call empuja el instruction pointer al stack y salta al label especificado, ret saca la direccion del stack y salta a ella:

jmp begin

: donothing
ret

: begin
call donothing

con estas features ya no hay muchas cosas que no se puedan hacer.

y para cerrar ahora cuando ejecutas un programa lo compila a bytecode y despues la maquina virtual ejecuta el bytecode directamente, hasta ahora las instrucciones eran compiladas a bytecode pero el manejo de los saltos era manejado por la clase Interpreter.

esto da una mejora de velocidad considerable para mi pobre celular (el mas barato con j2me :D)

en la pagina http://code.google.com/p/repiola/ se encuentran los jars y documentacion de todas las instrucciones.

domingo, agosto 22, 2010

un poco de dylan



Come gather 'round people
Wherever you roam
And admit that the waters
Around you have grown
And accept it that soon
You'll be drenched to the bone.
If your time to you
Is worth savin'
Then you better start swimmin'
Or you'll sink like a stone
For the times they are a-changin'.

Come writers and critics
Who prophesize with your pen
And keep your eyes wide
The chance won't come again
And don't speak too soon
For the wheel's still in spin
And there's no tellin' who
That it's namin'.
For the loser now
Will be later to win
For the times they are a-changin'.

Come senators, congressmen
Please heed the call
Don't stand in the doorway
Don't block up the hall
For he that gets hurt
Will be he who has stalled
There's a battle outside ragin'.
It'll soon shake your windows
And rattle your walls
For the times they are a-changin'.

Come mothers and fathers
Throughout the land
And don't criticize
What you can't understand
Your sons and your daughters
Are beyond your command
Your old road is
Rapidly agin'.
Please get out of the new one
If you can't lend your hand
For the times they are a-changin'.

The line it is drawn
The curse it is cast
The slow one now
Will later be fast
As the present now
Will later be past
The order is
Rapidly fadin'.
And the first one now
Will later be last
For the times they are a-changin'.

de yapa

sábado, agosto 21, 2010

clear screen y stack en repiola (+ 400 posts)

a pedido de j0hn, el único usuario de repiola agregue soporte para limpiar la pantalla y stack en repiola.

para limpiar la pantalla se usa la instrucción clr con el color a usar para limpiar la pantalla, ya sea como un literal o con el nombre del registro donde esta el color:

# limpiar la pantalla con rojo
clr 0b111110000000000

# limpiar la pantalla con el color en r2 (verde)
set r2, 0b000001111100000
clr r2

el stack es como uno se esperaria

push 4
set r1, 8
push r1
pop r2
# r2 == 8

pop r2
# r2 == 4


a esta altura se están preguntando que demonios es repiola?

es un programita que interpreta un lenguaje muy parecido a assembly 80x86 que permite dibujar cosas en algo similar a un canvas, tiene implementación desktop (swing), mobile (j2me) y web (cortesia de j0hn y frutillita).

como nota adicional, este es el post numero 400 de este log personal, vino Ian Curtis y trajo pepsi.

domingo, agosto 15, 2010

MIentras tanto en escandinavia

Jante Law

From Wikipedia, the free encyclopedia
The Jante Law (Danish and Norwegian: Janteloven; Swedish: Jantelagen; Finnish: Janten laki; Faroese: Jantulógin) is a pattern of group behaviour towards individuals within Scandinavian communities, which negatively portrays and criticizes success and achievement as unworthy and inappropriate.
It has been observed as a form of behaviour for centuries, but the Norwegian/Danish author Aksel Sandemose identified it as a series of rules, the Jante Law, in his novel A fugitive crosses his tracks (En flyktning krysser sitt spor, 1933, English translation published in the USA in 1936). Sandemose's novel portrays the small Danish town Jante (modelled upon his native town Nykøbing Mors as it was at the beginning of the 20th century, but typical of all very small towns), where nobody is anonymous.[1]
Generally used colloquially as a sociological term to negatively describe an attitude towards individuality and success claimed to be common in Scandinavia, it refers to a supposed snide, jealous and narrow small-town mentality which refuses to acknowledge individual effort and places all emphasis on the collective, while punishing those who stand out as achievers.
The term may be used by those individuals who feel they are not allowed to take credit for their achievements, or to point out their belief that another person is being overly critical.

Definition

There are ten different rules in the law as defined by Sandemose, but they all express variations on a single theme and are usually referred to as a homogeneous unit: Don't think you're anyone special or that you're better than us.
The ten rules state:
  1. Don't think that you are special.
  2. Don't think that you are of the same standing as others.
  3. Don't think that you are smarter than others.
  4. Don't fancy yourself as being better than others.
  5. Don't think that you know more than others.
  6. Don't think that you are more important than others.
  7. Don't think that you are good at anything.
  8. Don't laugh at others.
  9. Don't think that any one of us cares about you.
  10. Don't think that you can teach others anything.
A further rule recognised in the novel is: 11. Don't think that there is anything we don't know about you.
In the book, those Janters who transgress this unwritten 'law' are regarded with suspicion and some hostility, as it goes against communal desire in the town to preserve social stability and uniformity.

martes, agosto 10, 2010

me uni a flattr

me uni a flattr me parece una opcion interesante para "premiar" a la gente que hace cosas interesantes en internet, ya le cargue unos euros y me puse a premiar a los proyectos de software libre que me parecian interesantes (y que estaban inscriptos)

por ahora mis flattrs fueron para:

* bottle (micro framework web en python)
* duck duck go (buscador)
* alien (rpm <-> deb)
* piratepad.net (lo uso de vez en cuando)
* Project Hamster the GNOME Time Tracker (porque es el unico proyecto gnome que encontre, a ver si algunos mas se unen :D)
* Lightspark
* dpkg (a este tendria que darle muchos flattrs :D)

ya que estabamos los agregue mis proyectos (emesene y efene) a ver que sale de esto.

si me genera confianza y no termina todo en un fiasco ire subiendo mis aportes para apoyar de una forma simple a las cosas que me interesan.

si a alguien le interesa me quedan dos invitaciones.

lunes, agosto 02, 2010

el dia que...

el dia que me acuerde cual es useradd y cual es adduser y me acuerde el orden de los parámetros en ln voy a subir un level en la vida.

-- yo

domingo, agosto 01, 2010

aguante restructured text (aka rst2man FTW)

estaba escribiendo la documentación del frontend del compilador de efene en restructured text (en que otra cosa podria uno escribir documentacion? ;) y pensé:

"que bueno que estaría generar el man page desde rst"

un google despues:

Generating Man Pages From reStructuredText

nota: no tienen que instalar nada, al menos en mi maquina rst2man ya esta disponible.

jueves, julio 29, 2010

que grande dolina

en una entrevista a Richard Stallman le preguntan que libros le gustan, una parte de lo que contesta es:

In other areas of fiction, I have enjoyed Jane Austen and Paul Auster,
Lewis Carroll and Edgar Allen Poe, among others. In Spanish, Jorge
Luis Borges, Arturo PÃrez Reverte (especially La Carta EsfÃrica and El
Club Dumas), and Alejandro Dolina.

http://blog.reddit.com/2010/07/rms-ama.html

nado sincronizado y riesgo pais

Mr. A: esta semana escuche / lei las palabras Inflacion y Riesgo Pais un par de veces
Yo: alla?
Mr. A: si
Yo: lololol
Mr. A: sisi
Mr. A: !!!1!!12oneEleven!!1!
Yo: (son tres personas levantando los brazos)
Mr. A: fourteeeen 
Yo: esto es nado sincronizado
Yo:  \o\
Yo: |o|
Yo: /o/
Yo: \o/
Yo: \o_
Yo: _o/
Yo: y asi...
Mr. A: sale gif
Mr. A: o script de bash
Yo: ahi va
Yo: http://marianoguerra.com.ar/random/nado.ogv

codigo:

import sys
import time
import random

ARM = ['\\', '_', '/', ' ']

def figure():
    fig = random.choice(ARM) + "o" + random.choice(ARM)
    sys.stdout.write(fig)
    sys.stdout.flush()

def erase():
    sys.stdout.write("\b\b\b")
    sys.stdout.flush()

def dance():
    while True:
        figure()
        time.sleep(0.5)
        erase()

if __name__ == '__main__':
    dance()

PD: "alla" es españa

recomendado gtk-recordmydesktop

sábado, julio 24, 2010

Desde el oeste - Almarfuerte

Python en Google

Where is Python used?

  • The Google build system is written in python.  All of Google's corporate code is checked into a repository and the dependency and building of this code is managed by python.  Greg mentioned that to create code.google.com took about 100 lines of python code.  But since it has so many dependencies, the build system generated a 3 megabyte makefile for it!
  • Packaging.  Google has an internal packaging format like RPM.  These packages are created using python.
  • Binary Data Pusher.  This is the area where Alex Martelli is working, on optimizing pushing bits between thousands of servers
  • Production servers.  All monitoring, restarting and data collection functionality is done with python
  • Reporting.  Logs are analyzed and reports are generated using Python.
  • A few services including code.google.com and google groups.  Most other front ends are in C++ (google.com) and Java (gmail).  All web services are built on top of a highly optimizing http server wrapped with SWIG.
fuente
Some findings on how language can affect thinking.

* Russian speakers, who have more words for light and dark blues, are better able to visually discriminate shades of blue.

* Some indigenous tribes say north, south, east and west, rather than left and right, and as a consequence have great spatial orientation.

* The Piraha, whose language eschews number words in favor of terms like few and many, are not able to keep track of exact quantities.

* In one study, Spanish and Japanese speakers couldn't remember the agents of accidental events as adeptly as English speakers could. Why? In Spanish and Japanese, the agent of causality is dropped: "The vase broke itself," rather than "John broke the vase."

fuente

sábado, julio 17, 2010

viernes, julio 09, 2010

Rust, un lenguaje interesante

pocos lenguajes me llaman la atención rápido y en pocas palabras, de los que puedo enumerar que me llamaron la atención de una forma u otra son: erlang (por el manejo de inmutabilidad, concurrencia y tolerancia a fallos), limbo (por los channels), go (porque es limbo pero mas marketinero), haskell (porque es haskell, lazy evaluation, inferencia de tipos, funcional puro, currying y un largo etc.) y el mas nuevo en llamarme la atención es Rust, un lenguaje bastante alpha desarrollado por mozilla.

del manual rescato algunas cosas que me parecieron interesantes.


The initialization state of every slot is statically computed as part of the typestate
system (see below), and requires that all slots are initialized before use. There is nonull value; uninitialized slots are uninitialized, and can only be written to, not read.


si no esta inicializada te da error de compilacion, no podes leer de la variable si no la inicializaste. asi de simple :D

Lightweight tasks with no shared mutable state

Like many actor languages, Rust provides an isolation (and concurrency) model based on lightweight tasks scheduled by the language runtime. These tasks are very inexpensive and statically unable to mutate one another’s local memory. Breaking the rule of task isolation is only possible by calling external (C/C++) code.
Inter-task communication is typed, asynchronous and simplex, based on passing messages over channels to ports.


te suena de otro lenguaje? ;)

State values can refer to non-state values, but not vice-versa. Rust therefore encourages the programmer to write in a style that consists primarily of immutable types, but also permits limited, local (per-task) mutability.

Structural types may be pattern-matched in an alt statement.

Rust provides a mechanism of partially binding arguments to functions, producing new functions that accept the remaining un-bound arguments. This mechanism combines some of the features of lexical closures with some of the features of currying, in a smaller and simpler package.

Rust supports local type inference:

signatures of functions, objects and iterators always require type annotation, but within the body of a function or iterator many slots can be declared auto and Rust will infer the slot’s type from its uses.

Rust has a lightweight object system based on structural object types: there is no “class hierarchy” nor any concept of inheritance.


parecido a go...

Method overriding and object restriction are performed explicitly on object values, which are little more than order-insensitive records of methods sharing a common private value.

Rust includes support for values of a top type, any, that can hold any type of value whatsoever. An any value is a pair of a type code and a boxed value of that type.

Injection into an any and projection by type-case-selection is integrated into the language.

Rust supports a system for syntactic extensions that can be loaded into the compiler, to implement user-defined notations, macros, program-generators and the like.

Rust has a system for propagating task-failures and other spontaneous events between tasks. Some signals can be trapped and redirected to channels; other signals are fatal and result in task-failure. Tasks can designate other tasks to handle signals for them.
This permits organizing tasks into mutually-supervising or mutually-failing groups.

bastante erlangoso :P

Dentro de las influencias nombra a Joe Armstrong



veremos para donde dispara este lenguaje, espero que le vaya bien.

jueves, julio 08, 2010

bash <3

necesito probar la implementación de declaracion de tipos en efene, para automatizarlo un poco decidi sacar todas las declaraciones de tipos del codigo de erlang con una linea de bash:

$ grep -R "^\-type" * | grep \.erl | cut -d ':' -f 2- > ~/all-erlang-types.txt

miércoles, julio 07, 2010

lo peor del mundial

si hay algo de este mundial que realmente me indigna es las actitudes que genera en cierto tipo de personas de todas partes de iberoamerica.

desde que comenzo el mundial sigo las noticias leyendo diarios de mexico, brasil, argentina y espa~na.

en la seccion de comentarios lo unico que se puede encontrar es soberbia, insultos entre nacionalidades, racismo y un nivel de violencia que da verguenza.

lo increible de esto es ver que los mexicanos, espanioles y brazileros nos tildan de soberbios y agrandados y renglon seguido tienen exactamente las mismas actitudes que los argentinos que comentan.

realmente da vergüenza, pero bueno por desgracia es lo que hay.

martes, julio 06, 2010

sobre traducciones

traducir IDE a EID y checkout (de svn) a revisar me ayuda menos de lo que piensan.

traducir un acronimo tecnológico no sirve porque los acronimos ya son bastante opacos (y encima de tres letras TLA (tree letter acronim) no LTA (la tenes adentro)), en lugar de traducirlo expandilo y traducilo, osea entorno integrado de desarrollo.

revisar no es la traducción mas feliz que conozco, ya que revisar no es lo que me trae a la mente cuando hago svn checkout, que es algo así como traer todo :P.

no soy buen traductor pero si vas a traducir algo, pensalo dos veces.

y no me hagan empezar con los que traducen los shortcuts :D

domingo, julio 04, 2010

Tirolesa, rapel y paseo en La Cumbrecita

aprovechando un día cuasi primaveral en el medio del invierno nos fuimos para la cumbrecita y alrededores a pasear y hacer algunas actividades.

además del paseo y sambuche viajero ya estandarizado hicimos rapel y tirolesa que estuvieron muy buenas.



tirolesa



rapel



algunas fotos de la cumbrecita





jueves, julio 01, 2010

adiccion

hace unos años, en el punto maximo de adiccion musical con mi hermano calculamos que en la semana previa habiamos escuchado un promedio de 8 horas diarias de musica.

con la finalidad de medir como ando actualmente con el tema decidi crearme una cuenta en last.fm y mandar la musica que estoy escuchando de mi notebook.

vamos a ver que estadisticas interesantes me da.

esto no cuenta la musica que escucho en el repdocutor de mp3 cuando salgo de mi casa pero me va a dar una idea de que y cuanto escucho.

nos vemos en un mes con numeros

lunes, junio 28, 2010

mire uste'

Currently, the Gmail program is comprised of 443,000 lines of JavaScript, with 978,000 lines if comments are included. All of it was written by hand, he said.



yo pensé que estaba hecho con GWT

fuente:http://www.computerworld.com/s/article/9178558/Google_to_use_HTML5_in_Gmail?taxonomyId=11&pageNumber=2

jueves, junio 24, 2010

Idea loca

Si tuviera que implementar facebook usando infraestructura de mails...

facebook seria como un gmail en donde cuando A le envía un mail a B le envia el mismo mail con copia oculta a todos en la agenda de A y de B.

hay una agenda publica y global.

tiene buen handling para mime types distintos de txt y html, es decir, muestra bonitamente adjuntos y cosas similares.

cuando entras a tu mail (emm facebook), los mails (emm mensajes en el muro) en lugar de estar colapsados están expandidos.

no tenes carpetas ni labels ni grupos.

los grupos/fans serian listas de correos.

algo mas?

sábado, junio 19, 2010

Londres II - Erlang Factory

Con el viaje a la erlang factory aproveche para encontrarme con mi viajero hermano en Londres y pasear un poco, estas son algunas de las fotos que saque.


en la fuente en memoria a lady di, alta siesta.


en Camden


Una disqueria con vinilos increíbles, me quería comprar todos


linda postal :D


Resulto ser la fiesta de pumplea~nos de la reina, así que vimos un desfile y a la reina.

Sobre el evento, estuvo muy bueno, tuve la oportunidad de charlar con los creadores de erlang y con gente metida en proyectos muy copados, además presente mi charla y pasee un poco por Londres.

No me puedo quejar :D

lunes, junio 07, 2010

Selling out

You sold out long ago in one way or another. The specifics of who you sell to and how much you make – those are only details.


http://youarenotsosmart.com/2010/04/12/selling-out/

pelicula recomendada SLC Punk!

spoiler alert! si la vas a ver, estos son los ultimos minutos.

domingo, junio 06, 2010

jueves, junio 03, 2010

webshots - a.k.a. ya tendria que empezar a trabajar :P

y si, esto de estar recibido y a la espera del día que entre a mi nuevo trabajo (solo 15 faltan dias) me da bastante tiempo libre para probar todas esas cosas que cuando estudiaba o trabajaba quedaban "para después".

En este caso necesitaba una herramienta para transformar mis presentaciones hechas con pepete a un formato que pueda ser distribuido offline.

pensé dos cosas, bajarlo a imágenes o a pdfs y como no me decidía hice las dos.

El resultado es webshot, quizás le sea útil a alguien, quizás no, que importa, el código esta ahí :D.

webshot es un webkit adentro de una ventana gtk que tiene algunos bindings útiles como ir a fullscreen, guardar la porción visible de la pantalla a png o pdf y no mucho mas.

esta herramienta me permite dar las presentaciones de pepete con un visor limpio, poder ir a fullscreen y volver y si quiero transformar las presentaciones en pdf simplemente saco screenshot de cada slide y luego los junto.

mostrar un screenshot de webshot es lo mismo que mirar tu browser actual así que mucho sentido no tiene, eso si, hay dos ejemplos del resultado de guardar la pagina en el proyecto:

la pagina del proyecto en pdf

la pagina del proyecto en png

una presentación sobre webshot en pepete (te recomiendo abrirla en webshot :P)

http://marianoguerra.github.com/pepete/show.html#webshot.json
eso es todo

martes, junio 01, 2010

Cosas de la musica

Algunas cosas que junte de volver a estudiar musica.

La escala menor melódica fue creada como un workaround a una prohibición de la iglesia católica que prohibía el intervalo de segunda aumentada por considerarlo diabólico.

Las dos notas no naturales de la escala de Re Mayor son Do sostenido y Fa sostenido que en notación americana son C# y F#. Algún ingeniero de MS musico o pura coincidencia?

Mozart on Fire

volviendo a intentar aprender a tocar el piano me tope con la necesidad de practicar lectura de notas en una partitura.

La metodología propuesta por el profesor el cual recomiendo:

http://www.youtube.com/watch?v=hkG29pIBPuI&feature=PlayList&p=253192EED47525A8&playnext_from=PL

es escribir notas aleatorias en tarjetas y pasarlas intentando adivinar. Como era de noche, las librerías están cerradas y mucha plata no tengo me hice un programática con pygame para practicar.

Después de un rato de pelear (primera vez que uso pygame) quedo algo bastante usable y que después de un rato de practica parece estar dando sus primeros frutos (hay varias notas que ya las tengo grabadas y demoro muy poco en decir cual es).

screenshot de rigor:



pagina del proyecto:

http://github.com/marianoguerra/MozartOnFire

lunes, mayo 31, 2010

llega el momento en la vida de toda persona

en la que se cansa de mostrar código en slides que se ven feas y escribe su propio programa para hacer presentaciones en la web basado en json.

Una idea que se me ocurrió hace un tiempo y a la cual fui un poco obligado ante la necesidad de mostrar bastante código y pelear por horas con oo impress, mas que mis slides son siempre similares y tengo que aplicar el mismo estilo a todo.

si, se que hay formas, pero las formas son mas complicadas de lo que desearía, ahora puedo tener mi código resaltado con pygments en archivos aparte, cargarlos a voluntad desde cualquier parte de la interwebs, cambiar el color del resaltado de sintaxis cambiando una archivo css, reusar estilos y slides a diestra y siniestra etc.

si lo quieren ver esta acá:

http://github.com/marianoguerra/pepete

unos slides introductorios (no podría ser de otra forma) acá, entra y apreta load:

http://marianoguerra.github.com/pepete/

disclaimer: los slides los hice a las patadas (no me gusta hacer slides :D)

martes, mayo 18, 2010

pynerl

tras unas horas de codear, tengo la primera version de pynerl, un modulo en erlang que permite ejecutar python y obtener los resultados en erlang.

mas facil si lo explica xzibit.



el proyecto esta hosteado en github aca:

http://github.com/marianoguerra/pynerl

un ejemplo:

1> pynerl:eval("t = 1", "t").
1
2> pynerl:eval("t = 1 * 2", "t").
2
3> pynerl:eval("import time;t = time.time()", "t").
1274236802.877999
4> pynerl:eval("import random;t = random.random()", "t").
0.45102117275294684
5> pynerl:eval("t = print('hello erlang or python')", "t").
hello erlang or python
none
6> pynerl:call("time", "time", []).
1274236859.510859
7> pynerl:call("random", "random", []).
0.9623136682858975
8> pynerl:eval("t = True", "t").
true
9> pynerl:eval("t = 2.3", "t").
2.3


como ves las dos funciones principales son eval y call, que hacen lo que esperarias, eval evalua una expresion y devuelve el valor de la variable que pases como segundo parametro. call llama a la funcion dentro del modulo pasandole los parametros del tercer argumento y devuelve el resultado.

El estado actual es alpha, el mapeo de tipos funciona solo para los tipos basicos y el paso de parametros en call todavia no esta implementado (simplemente porque lo empece hace 2 horas :P).

Como es la primera vez que programo python y erlang internamente seguro que estoy leakeando por todos lados, se va a resolver cuando lea un poco mas.

evaluando python desde erlang

y el secreto se develo, como tener algo como eval de python pero corriendolo desde erlang.

el codigo no es lo mas bonito de la tierra pero ya va a ir mejorando.

primero que todo bajate erlang R13B04 para tener la ultima version de la API de NIF.

crea un archivo pynerl.c

/* pynerl.c */
#include <stdio.h>
#include "erl_nif.h"
#include <Python.h>

#define STR_SIZE 1024
char code[STR_SIZE];

static ERL_NIF_TERM pyeval(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
Py_Initialize();

if (enif_get_string(env, argv[0], code, STR_SIZE, ERL_NIF_LATIN1) < 0) {
return enif_make_string(env, "code too long", ERL_NIF_LATIN1);
}
else {
PyRun_SimpleString(code);
}

Py_Finalize();

return argv[0];
}
static ErlNifFunc nif_funcs[] =
{
{"pyeval", 1, pyeval}
};

ERL_NIF_INIT(pynerl,nif_funcs,NULL,NULL,NULL,NULL)


y uno llamado pynerl.erl

-module(pynerl).
-export([init/0, pyeval/1]).

-on_load(init/0).

init() ->
erlang:load_nif("./pynerl", 0).

pyeval(_Str) ->
"NIF library not loaded".


despues compila ambos:


gcc -fPIC -shared -o pynerl.so pynerl.c -I $ERL_INCLUDE -I/usr/include/python3.1/ -D_THREAD_SAFE -lpthread -ldl -lutil -lpython3.1 -lm
$ERLC pynerl.erl


en mi caso


$ echo $ERL_INCLUDE
/home/mariano/Software/otp_src_R13B04/erts/emulator/beam
$ echo $ERLC
/home/mariano/Software/otp_src_R13B04/bin/erlc


despues de eso lo probamos


$ $ERL
Erlang R13B04 (erts-5.7.5) [source] [rq:1] [async-threads:0] [kernel-poll:false]

Eshell V5.7.5 (abort with ^G)
1> pynerl:pyeval("print('hello python 3.1 from erlang!')").
hello python 3.1 from erlang!
"print('hello python 3.1 from erlang!')"


observaciones:

uso $ERL porque tengo dos versiones de erlang instalando, esa variable apunta al erlang mas nuevo que tengo compilado.

la primera linea de salida es la ejecucion de la linea, la segunda es el string que le pase como parametro, que es lo que devuelve por ahora pyeval, algun dia va a devolver el objeto que devolvio la evaluacion (mientras sea algo que pueda ser convertido a un tipo de erlang).

implementar una function en C y llamarla en erlang

Si leiste el post anterior y este podes empezar a formarte una idea de lo que quiero hacer.

para poder llamar codigo de C en erlang hay que hacer un NIF (native implemented functions), estoy siguiente el ejemplo del manual de erlang pero como tiene un error pongo el codigo aca.

creamos un archivo niftest.c y ponemos el siguiente codigo

/* niftest.c */
#include "erl_nif.h"
static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
return enif_make_string(env, "Hello world!");
}
static ErlNifFunc nif_funcs[] =
{
{"hello", 0, hello}
};
ERL_NIF_INIT(niftest,nif_funcs,NULL,NULL,NULL,NULL)



creamos niftest.erl (tranquilamente se podria hacer en efene :D)

-module(niftest).
-export([init/0, hello/0]).
init() ->
erlang:load_nif("./niftest", 0).
hello() ->
"NIF library not loaded".


compilamos


gcc -fPIC -shared -o niftest.so niftest.c -I/usr/lib/erlang/erts-5.7.4/include/


y lo probamos


$ erl
cErlang R13B03 (erts-5.7.4) [source] [rq:1] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.4 (abort with ^G)
1> c(niftest)
1> .
{ok,niftest}
2> niftest:hello().
"NIF library not loaded"
3> niftest:init().
ok
4> niftest:hello().
"Hello world!"
5>


vamos avanzando

Embebiendo python en otra aplicacion

tengo una idea en la cabeza que requiere embeber python en otro lado, como seguro la voy a dejar a la mitad no te voy a contar que es :P pero si voy a documentar los pasos por si me olvido o a alguien le sirve.

Estoy siguiendo la documentacion oficial

Elegi empezar con python 3.1 porque estoy jugando y porque si anda me gustaria no tener que portarlo a la larga.

el primer ejemplo es bastante simple

ponelo en un archivo llamado one.c y corre lo siguiente


gcc one.c -I/usr/include/python3.1/ -D_THREAD_SAFE -lpthread -ldl -lutil -lpython3.1 -lm -o one


una vez compilado, si lo ejecutamos:


$ ./one
Today is Tue May 18 18:25:59 2010


bien para empezar, si sigo, vas a ver mas posts como este.

Frases en aleman

hojeando un libro me encontré con frases de viajes en alemán, rescato 2 que están buenas.

Die Welt ist ein Buch, von dem man nur die erste Seite gelesen hat, wenn man nur sein Land gesehen hat.


-- Fougeret de Moubron (1706-1760)

Lo que se traduciría a

El mundo es un libro, del cual uno solo ha leído la primera pagina, cuando solo su tierra a visto.



otra

Wenn ein Reisender nach Hause zurückkehrt, soll er nicht die Bräuche seiner Heimat eintauschen gegen die der Fremden Landes. Nur einige Blumen, von dem, was er in der Ferne gelernt hat, soll er in die Gewohnheiten seines eigenen Landes einpflanzen.


Mas duro de traducir, pero intentemos :P

Si un viajero vuelve a casa, no debe cambiar las costumbres de su patria por las del país extranjero. Sólo unas pocas flores, las cuales ha aprendido en la lejania, debe plantar en las costumbres de su propio país.


-- Francis Bacon (1561 - 1626)

jueves, mayo 13, 2010

La prueba de la teoria de la evolucion? el primer chico pokemon?

titulo de La Nación:

Evoluciona el chico que sobrevivió a la tragedia aérea en Libia

Evoluciona favorablemente sera?

El copete:

El niño permanece estable tras ser operado por fracturas en sus dos piernas; viajaba con su familia; revelan más detalles sobre su identidad


Si permanece estable entonces no evoluciona.

De la RAE:

1. intr. Dicho de un organismo o de otra cosa: Desenvolverse, desarrollarse, pasando de un estado a otro.

sábado, mayo 08, 2010

hola mundo web con mochiweb y simplebridge

a falta de buenos ejemplos de como hacer un hola mundo web en erlang hago uno yo aca

para el ejemplo vamos a usar mochiweb y simplebridge

de sus paginas, saco lo siguiente

mochiweb:

MochiWeb is an Erlang library for building lightweight HTTP servers.

simplebridge:


SimpleBridge takes the pain out of coding to multiple Erlang HTTP servers by creating a standardized interface. It currently supports Mochiweb, Inets, and Misultin, with Yaws coming soon.


para usarlos tenemos que tener ambos instalados, asi que empezemos por bajarlos y compilarlos


# creemos una carpeta
mkdir erlweb
cd erlweb
# descargamos simplebridge
git clone http://github.com/rklophaus/SimpleBridge.git

# lo compilamos
cd SimpleBridge/
make

# volvemos a la base
cd ..

# descargamos mochiweb
svn checkout http://mochiweb.googlecode.com/svn/trunk/ mochiweb

# lo compilamos
cd mochiweb/
make

# volvemos a la base
cd ..



bueno, ya tenemos los componentes necesarios, vamos con el ejemplo, crea un archivo hello.erl y pega el siguiente codigo:

-module(hello).
-export([start/0, loop/1]).

start() ->
Options = [{ip, "127.0.0.1"}, {port, 8000}],
Loop = fun loop/1,
mochiweb_http:start([{name, mochiweb_example_app}, {loop, Loop} | Options]).

response(Req, Root) ->
simple_bridge:make_response(mochiweb_response_bridge, {Req, Root}).

response_ok(Req, Root, ContentType, Data) ->
Response = response(Req, Root),
Response1 = Response:status_code(200),
Response2 = Response1:header("Content-Type", ContentType),
Response3 = Response2:data(Data),
Response3:build_response().

loop(Req) ->
HTML = ["<h1>Hello, World!</h1>"],
response_ok(Req, "./wwwroot", "text/html", HTML).


ahora abrimos una consola interactiva incluyendo en el path los modulos que vamos a usar (mochiweb y simplebridge)


erl -pa ./mochiweb/ebin/ -pa ./SimpleBridge/ebin/


en la consola:


Eshell V5.7.4 (abort with ^G)
1> c(hello).
{ok,hello}
2> hello:start().
{ok,<0.42.0>}


abrimos nuestro navegador apuntando a http://localhost:8000/ y deberiamos ver nuestro hola mundo

obviamente que te voy a dar la version en efene ;) pero esta ves en ifene (la diferencia es que ifene define bloques por indentacion en lugar de llaves)

@public
start = fn ()
Options = [(ip, "127.0.0.1"), (port, 8000)]
Loop = fn loop:1
mochiweb_http.start([(name, mochiweb_example_app), (loop, Loop) : Options])

response = fn (Req, Root)
simple_bridge.make_response(mochiweb_response_bridge, (Req, Root))

response_ok = fn (Req, Root, ContentType, Data)
Response = response(Req, Root)
Response1 = Response.status_code(200)
Response2 = Response1.header("Content-Type", ContentType)
Response3 = Response2.data(Data)
Response3.build_response()

@public
loop = fn (Req)
HTML = ["<h1>Hello, World!</h1>"]
response_ok(Req, "./wwwroot", "text/html", HTML)


lo guardamos en hello.ifn y lo compilamos


fnc hello.ifn


lo ejecutamos desde la consola de erlang (mas facil ;)


erl -pa ./mochiweb/ebin/ -pa ./SimpleBridge/ebin/


en la consola:


Eshell V5.7.4 (abort with ^G)
1> hello:start().
{ok,<0.42.0>}


deberiamos obtener el mismo resultado.

strings are lists :S

me llevo un rato encontrar este bug


2> lists:suffix(".fn", io_lib:format("~p-~p-~p.~s", [1,2,3,"fn"])).
false
3> lists:suffix(".fn", lists:flatten(io_lib:format("~p-~p-~p.~s", [1,2,3,"fn"]))).
true


la razon es que


1> io_lib:format("~p-~p-~p.~s", [1,2,3,"fn"]).
["1",45,"2",45,"3",46,"fn"]


y no lo que uno esperaria


4> lists:flatten(io_lib:format("~p-~p-~p.~s", [1,2,3,"fn"])).
"1-2-3.fn"

domingo, mayo 02, 2010

efene 0.5 - dos lenguajes para la maquina virtual de erlang - publicado

llega el momento en la vida de toda persona en la que crea dos lenguajes de programación para la maquina de erlang.

Esta es la versión 0.5 consistente en una reescritura completa y que trae con sigo ifene (o efene indentado) para los amantes de python que se quieren aventurar a la programación funcional en general y erlang en particular.

mas info en el blog del proyecto.

http://efene.tumblr.com/post/564850557/efene-0-5-two-languages-for-the-erlang-vm-released

cualquier consulta/observación es mas que bienvenida.

Seguidores

Archivo del Blog