El cooperativista en 3D !!

El cooperativista en 3D !!

Saludos, hace unas horas armé un render muy bonito del cooperativista feliz con blender:

http://www.examplelab.com.ar/thumbs/blender/cooperativista/ima/render2.png http://www.examplelab.com.ar/thumbs/blender/cooperativista/ima/render1.png

claro, el modelo del cooperativista lo tenía hace unos días y se lo había encargado a un diseñador de verdad... mi mérito ha sido solamente ponerlo en una escena y jugar un poquito con blender...

Si quieren investigar un poco sobre blender he creado un tutorial indicando paso a paso cómo armé la escena:

y también escribí un pequeño ejemplo en losersjuegos:

para mostrar cómo se puede cargar este modelo dentro de un videojuego (usando panda3d y python).

Nos vemos!

RST en drupal :)

Gracias a que el amigo huguito hizo un parser de RST en php.

Yo me tome el atrevimiento de crear un input filter para drupal.

Ahora, podemos usar RST (nuestro mark-up amigo) en drupal (nuestro cms amigo).

Para usarlo: http://download.gcoop.coop/rst_filter.tar.gz

Jueguito v2

Ayer empecé el proyecto de un minijuego, clón de uno de blackberry.
Me di cuenta que sin colores era injugable, así que me puse a investigar como agregar colores a los prints de python, y me encontré con [1] en Stack Overflow, que explica como hacerlo.

Es muy fácil, con la salvedad que yo aproveche y cambié el color de fondo, en lugar del color del texto.

Ahora es mas cómodo de jugar.

La ultima versión (Provisoria) la encuentran en [2]

[1] http://stackoverflow.com/questions/287871/print-in-terminal-with-colors-using-python

[2] http://github.com/joac/joac-python/blob/master/minigame/minigame.py

Dejo unas capturas que hice:

 El inicio del juego


Un par de jugadas despues

Ganamos!

Si no alcanzan los movimientos... Nos espera la derrota

Jueguito

El otro día, me prestaron un blackberry que tenia un jueguito que me gusto, asi que hice una versión, para la consola, del juego, he aquí el código:

import random
import os

class Square:
"""This is the abstraction of one Square"""
def __init__(self, x, y, attrib, root):
self.x = x
self.y = y
self.attrib = attrib
self.root = root
self.rep = attrib

class Screen:
"""The Screen Array of the game"""
def __init__(self, x_size, y_size, tokens):
self.x_size = x_size
self.y_size = y_size
self.tokens = tokens
self.childs = []
self.squares = []
self.populate()
self.childs.append(self.squares[0][0])
self.childs[0].rep = '#'

def get_near_to(self, child):
vecinos = []
if child.x - 1 >= 0:
vecinos.append(self.get_square(child.x - 1, child.y))
if child.y - 1 >= 0:
vecinos.append(self.get_square(child.x, child.y - 1))
if child.x + 1 < self.x_size:
vecinos.append(self.get_square(child.x +1, child.y))
if child.y + 1 < self.y_size:
vecinos.append(self.get_square(child.x, child.y + 1))

return [vecino for vecino in vecinos if(not vecino in self.childs)]


def get_square(self, x, y):
return self.squares[y][x]

def populate(self):
for y in xrange(0, self.y_size):
self.squares.append([self.random_square(x, y) for x in xrange(0, self.x_size)])

def random_square(self, x, y):

attrib = random.choice(self.tokens)
square = Square(x, y, attrib, self)

return square

def check_arround(self, child):
"""We check the attrib of the near squares"""
vecinos = self.get_near_to(child)
if vecinos:
for vecino in vecinos:
if (vecino.attrib == child.attrib):
vecino.rep = '#'
self.childs.append(vecino)

def __repr__(self):
output = ''
for row in self.squares:
output += ''.join(['%s ' % str(a.rep) for a in row])
output += '\n'
return output

def update(self, attrib):
for child in self.childs:
child.attrib = attrib[0]
self.check_arround(child)


if __name__ == '__main__':
screen = Screen(10, 10, ['1', '2', '3', '4', '5'])
print screen
screen.update(screen.childs[0].attrib) #dirty Hack
limit = 18
win = False
for b in xrange(1, limit):
a = raw_input('_ ')
screen.update(a)
os.system('clear')
print screen
print "%4d moves of %4d" % (b, limit)
if len(screen.childs) == screen.x_size*screen.y_size:
win = True
break
if win:
print "You Win"
else:
print "You loose"

No pierdas tus datos, hacé backups periódicos automaticamente!


Es en esos momentos en los que uno accidentalmente borra datos importantes de su notebook, en que pregunta: "Si yo sé que tengo que hacer backups de mis datos!! Por qué #$%% no lo hago??" Quizás el dicho "En casa de herrero, cuchillo de palo" se ajusta a estos momentos de sosobra.

A pesar de que mi amigo Pablo, me recomendara algunas herramientas para hacer backup automático, ninguna de ellas me terminaba de cerrar. Fue así que decidí desempolvar mis oxidados conocimientos de Python y me puse a escribir un scriptcito que hiciera la tarea por mi.

El script que escribí me sirve para, en función de donde me encuentro, hacer backup via rsync de mis datos en el servidor de la cooperativa (malbec) o en la PC que tengo en mi casa (rey-lagarto), simplementen detectando el rango de IP que tiene la notebook asignada en ese momento.

Para que el script funcione correctamente, tenemos que tener algunas cosas en cuenta:

  1. Hay que intercambiar claves entre la notebook y los destinos a los cuales haremos backup, para no tener que poner nuestra contraseña cada vez que el script se ejecuta. Para eso, yo seguí esta guía.
  2. Hoy el sctipt funciona para hacer backup sólamente a 2 destinos, los cuales deben estar en rangos de IP diferentes (por ejemplo: 192.168.10.3 y 192.168.0.100) (Mejoras, son bienvenidas :D )

Paso a paso para usar el script de backup:

 

  1. Bajar el script desde desde este enlace y renombralo a  *.py y guardarlo en algún directorio de tu home.
  2. Intercambiar claves entre la PC sobre la cual queremos hacer backup y la/s PC que lo gardarán. Pueden seguir esta guia.
  3. Modificar el diccionario de la línea 30 del script, poniendo los rangos de IP y los destinos correspondientes.
  4. Completar en la línea 33 del script, los directorios dentro de nuestro home que queremos excluir a la hora de hacer el backup.
  5. Completar en la línea 36 del script, la dirección de correo, donde se nos enviará un mail con un log si el script no puede realizar el backup.
  6. Modificar la línea 39, colocando el directorio que queremos backupear.
  7. Cronear nuestro script para que se ejecute, por ejemplo, cada 3 horas. Para eso hacemos lo siguiente:

Abrimos una consola y ejecutamos:

jose@mafalda ~ $ crontab -e
 

Esto nos abrirá el editor de textos predeterminado, y en él, colocamos la siguiente línea (modificando la ruta al script en función de donde lo hayamos guardado):


0 */3 * * * DISPLAY=:0  python /home/jose/backup.py  

Esta línea le dice a cron, que ejecute el script cada 3 horas.

Como resultado, cada vez que se ejecute el backup veremos la siguiente notificación en nuestro escritorio:

y la siguiente, cuando finalice:

Instalando APC PHP Cache en Debian / Lenny para Drupal

Hace poco me estuve peleando con la lentitud de drupal 5 al que no le podía activar la cache que viene con el core. Entonces empecé a investigar la posibilidad para mejorar la performance del lado del servidor. Una de las cosas que miré y me ayudó fue el APC PHP Cache Accelerator

Este módulo de PHP hace un caché del código y reduce increíblemente la carga del sitio web. Sobre todo si tienen un drupal con muchos módulos!

Para instalar el php-apc en debian lenny como usuario root ejecutar:

aptitude install php-apc

También le configuré algunos parámetros del apc ya que los que vienen por defecto a mi no me servían:

Abrimos el php.ini:

sudo vim /etc/php5/apache2/php.ini

Y pasteamos las siguientes lineas al final de todo:

#APC 3.0.16 tuning below

extension="apc.so"
apc.enabled=1
apc.shm_segments=1
apc.shm_size=128
apc.num_files_hint=2048
apc.user_entries_hint=4096
apc.gc_ttl=3600
apc.cache_by_default=1
apc.mmap_file_mask=/dev/zero
apc.slam_defense=0
apc.file_update_protection=2
apc.enable_cli=0
apc.max_file_size=1M
apc.stat=0
apc.write_lock=0
apc.report_autofilter=0
apc.include_once_override=1
apc.localcache=0

Luego de restartear nuestro servidor web (apache2 en nuestro caso) comienza a correr el APC.

sudo /etc/init.d/apache2 restart

De esta forma activamos el APC PHP para todos los virtualhost de nuestro apache2.

Si por alguna razón quisieramos deshabilitar el APC para alguno de los virtualhost que tenemos en el servidor, debemos agregar la siguiente linea en el .htaccess o la configuración del sitio web correspondiente.

php_flag apc.cache_by_default Off

Si queremos habilitar el APC únicamente para algunos sitios debemos agregar la linea

php_flag apc.cache_by_default On

Si queremos visualizar el uso del cache por el APC ejecutamos lo siguiente:

gunzip /usr/share/doc/php-apc/apc.php.gz
ln -s /usr/share/doc/php-apc/apc.php /var/www/apc.php

Deberiamos de ver unos gráficos como estos

APC INFO_1

APC INFO_2

Cómo suprimir el sonido de las vuvuzelas con SL

Para los apasionados del software libre y el espíritu mundialista (?), les acerco un truco que llega desde www.korben.info

<< (...) Pero, afortunadamente, un técnico alemán ha encontrado la solución para eliminar el ruido Vuvuzela! La nota principal de una vuvuzela es "La#". El tono dominante tiene una frecuencia de alrededor de 233 Hz y las frecuencias armónicas de 466, 932 y 1864 Hz. De repente, con una buena placa de sonido se puede suprimir el sonido de la vuvuzela en tiempo real durante los partidos>>

* Este screenshot es ilustrativo NO usen software no libre :)

Si utilizás VLC, esta es la línea de comando:

 vlc --param-eq-f1=233 --param-eq-f2=466 --param-eq-f3=932 --param-eq-gain1=-20 \
--param-eq-gain2=-20 --param-eq-gain3=-20 --param-eq-lowf 100 --param-eq-lowgain =15 \
--param-eq-q1=10 --param-eq-q2 =10 --param-eq-q3=10 \
http://www.korben.info/wp-content/uploads/2010/06/vuvuzela_avant.mp3

Acá podés escuchar la diferencia de audios!

Aportando traducciones

Dicen que todos, aun los que no son programadores, pueden aportar a los proyectos de Software Libre y una de las formas es con la traducción del sistema. Decidimos colaborar con la traducción de Ulteo, un software muy interesante para escritorios virtuales. Y al momento de hacer la traducción utilizamos una aplicación muy interesante para facilitar la tarea del traductor: Gtranslator. Para los usuarios de Ubuntu está como paquete, sino se puede descargar el fichero desde la página.

Más allá de las funcionalidades de gtranslator lo interesante es la forma de presentar los archivos .po para facilitar la traducción de cada una de las cadenas.

tv publica nacional y popular ole ole …

gracias al post del blog de ubuntuperonista.blogspot.com pude hacer funcionar el sintonizador de TV Digital Geniatech USB MyGica S870 con Ubuntu.


Los pasos a seguir son los siguientes:


sudo aptitude install mercurial linux-headers-$(uname -r) build essential
cd ~
hg clone http://linuxtv.org/hg/v4l-dvb
cd v4l-dvb
make
sudo make install

Si falla la compilación, debemos editar el .config y cambiar la siguiente linea:
vim v4l-dv/v4l/.config
CONFIG_DVB_FIREDTV=m y la cambiamos a CONFIG_DVB_FIREDTV=n. Luego guardamos y cerramos el archivo.

Luego debemos bajarnos el firmware e instalarlo para nuestro kernel.


cd ~
wget http://www.linuxtv.org/downloads/firmware/dvb-usb-dibusb-6.0.0.8.fw
cd /lib/firmware
cd `uname -r`
sudo cp ~/dvb-usb-dibusb-6.0.0.8.fw .
cd ~
echo "# Canales UHF del 14 to 69 en el sistema argentino de televisión digital terrestre SATVD-T
T 473142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 14
T 479142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 15
T 485142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 16
T 491142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 17
T 497142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 18
T 503142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 19
T 509142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 20
T 515142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 21
T 521142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 22
T 527142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 23
T 533142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 24
T 539142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 25
T 545142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 26
T 551142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 27
T 557142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 28
T 563142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 29
T 569142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 30
T 575142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 31
T 581142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 32
T 587142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 33
T 593142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 34
T 599142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 35
T 605142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 36
# channel 37 not used
T 617142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 38
T 623142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 39
T 629142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 40
T 635142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 41
T 641142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 42
T 647142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 43
T 653142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 44
T 659142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 45
T 665142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 46
T 671142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 47
T 677142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 48
T 683142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 49
T 689142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 50
T 695142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 51
T 701142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 52
T 707142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 53
T 713142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 54
T 719142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 55
T 725142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 56
T 731142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 57
T 737142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 58
T 743142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 59
T 749142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 60
T 755142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 61
T 761142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 62
T 767142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 63
T 773142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 64
T 779142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 65
T 785142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 66
T 791142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 67
T 797142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 68
T 803142857 6MHz 3/4 AUTO AUTO AUTO AUTO NONE # channel 69" > freq.cnf
scan freq.conf > channels.conf

Deberia de ver por el momento los canales de la tvpublica y el canal encuentro.

Network Name ‘TVPublica’
0×0000 0xe741: pmt_pid 0×0102 (null) — HD TVPublica (???)
0×0000 0xe758: pmt_pid 0x1fc8 (null) — One Seg TVP 1 (???)
0×0000 0xe742: pmt_pid 0×0103 (null) — SD Encuentro (???)
0×0000 0xe740: pmt_pid 0×0101 (null) — SD Tvpublica (???)

Si queremos visualizar los canales tenemos el programa VLC

vlc channels.conf

Ahora ya somos felices, tenemos tele en la computadora y con High Definition.

A distrutar del mundial canejo!

Screen es tu amigo

Hoy tenía que monitorear muchos procesos al mismo tiempo y screen fue mi amigo:

Para dividir la pantalla horizontal: ctrl a + S

Para dividir la pantalla vertical: ctrl a + | (pipe)

Que les aproveche  :)

Conociendo Shutter

Gracias a mi amigo Hugo, conocí una herramienta muy útil para hacer documentación de proyectos. Permite trabajar las imágenes con múltiples opciones, más datos: http://shutter-project.org

Tips de svn y bash

Descomprimir masivamente

Descomprimir masivamente en directorio sites/all/modules cuando me baje los .tar.gz de los modulos usando wget

for i in `ls *.tar.gz`;do tar zxvf $i;done

Script agregar archivos

for i in $(svn st | grep ? | awk "{print $2}");do svn add $i;done

VI Encuentro Latinoamericano de Investigadores en Cooperativismo

Acaba de llegarme la información de este evento que parece interesante para acercarse a las investigaciones sobre cooperativismo del continente: "VI Encuentro Latinoamericano de Investigadores en Cooperativismo"

El evento se realizará tendrá lugar en el Campus de la Universidad Nacional de Asunción (Paraguay) los días 13, 14 y 15 de octubre de 2010.

Distribuir contenido