No me canso de verlo bailar, muy guaso
martes, 24 de julio de 2007
martes, 17 de julio de 2007
Radios on line
Me canse de tener que buscar la url de las radios que quiero escuchar todos los dias, así que me construí un pequeño script con dialog para hacerme más fácil la vida. Con el mismo me aparece un menu con las opciones de las radios que tengo cargadas. Funciona en consola o en modo gráfico, necesita de mplayer, gmplayer o vlc.
El script es el siguiente
#!/bin/bash #
# Simple utilidad para escuchar radios por internet #
# Casiva Agustin - casivaagustin@gmail.com
#
#dialog - para la consola
#Xdialog - Grafico
DIALOG="Xdialog"
#mplayer - Texto
#gmplayer - Grafico
#vlc - Grafico
REPRODUCTOR="gmplayer"
#Recursos
MITRE="mms://streammitre.uigc.net/mitrevivo"
RYPOP="mms://200.59.146.10/rockandpop-ba"
CONTI="http://66.175.96.10/arcontinental"
ARLOS="http://66.175.96.10/ARLOS40P"
DOLIN="mms://radio10.telecomdatacenter.com.ar/radio10" LMEGA="http://mega.telecomdatacenter.com.ar/mega" FM100="rtsp://g2.prima.com.ar/vivo/cadena100.rm"
TN24H="mms://wmedia01.uigc.net/TN"
#Menu de Opciones
$DIALOG --menu "Radios:" 0 0 0 \
$MITRE "Mitre" \
$RYPOP "Rock and Pop" \
$CONTI "Continental" \
$ARLOS "Los 40 principales" \
$DOLIN "Radio 10 (Dolina)" \
$LMEGA "La mega" \
$FM100 "FM 100" \
$TN24H "TN 24 HS" \
2> /tmp/opradio op=`cat /tmp/opradio`
#Lanzamos la App
$REPRODUCTOR $op > /dev/null &
Cluster MPI
Terminamos de instalar el Cluster en el Departamento de Física Atómica Molecular de la Facultad de Ciencias Exactas de la UNNE. En la imagen pueden ver el bicho casi terminado, faltan las tapas de Rack.
El Cluster esta compuesto por 6 servidores Sun Fire x2200 con dos micros Opteron 64 de dual core y 4 GB de Ram cada uno, unas maquinas atómicas.
Se instalo como sistema operativo base Open Suse 10.2, a pedido del personal de sistemas de la facultad sino instalábamos Gentoo :P. Cabe recalcar que ninguna de estas maquinas trae lectora de CD así que tuvimos que remasterizar una imagen del CD de instalación para que arranque desde un Pen Drive.
Sobre el sistema operativo se instalo un cluster MPI, con LAM-MPI. También se añadió un sistema para manejar procesos Batch o mejor llamados PBS, elegimos en nuestro caso torque. Por ultimo realizamos las pruebas con una aplicación que utilizan en el departamento llamada DIRAC.
Fue sorprendente cuando llegamos a obtener que los procesos que en una PC tardaban 8 hs en el cluster tardaban 35 min, aparentemente funciono bien.
lunes, 16 de julio de 2007
Razones para Usar Ubuntu y No Vista
Interesante articulo que manifiesta 15 razones para usar Ubuntu y no pasar a Vista.
Algunas no me parecen tan de ese modo, pero rescato las siguentes.
Algunas no me parecen tan de ese modo, pero rescato las siguentes.
- Ubuntu Dapper Drake soporta más hardware que Windows Vista.
- Ubuntu mejora más rápidamente el soporte de hardware.
- La instalación de programas es más sencilla.
- El sistema de actualización está a años luz.
- No necesitas Antivirus.
- No necesitas actualizar tu ordenador.
- Los dos sistemas necesitan aprendizaje.
- Costo cero.
- Puedes hacer tu vida normal con Ubuntu.
- Tendrás un sistema con más futuro.
jueves, 12 de julio de 2007
Transformers Reales!
Increible los Japoneses, miran un dibujo y lo hacen posible. Quien te dice que mañana no fabriquen sayayines y productos dentro de una capsula (vease dragon ball).
miércoles, 11 de julio de 2007
Npgsql2 Preview Release
Dario acaba de avisarme que esta próxima a salir una Release de Npgsql2, es decir el driver de .NET para postgresql compatible con la especificación 2.0 de ADO.NET.
Yo todavía utilizo la versión 0.7 sin problemas, pero no realizo nada super estrafalario con mi código dado que me gusta mantener todo lo más simple y estándar posible. Tampoco trabajo con ASP.NET, que según tengo entendido es donde están los grandes cambios de la especificación.
Mas info en
http://npgsql.projects.postgresql.org/
http://pgfoundry.org/frs/?group_id=1000140
Yo todavía utilizo la versión 0.7 sin problemas, pero no realizo nada super estrafalario con mi código dado que me gusta mantener todo lo más simple y estándar posible. Tampoco trabajo con ASP.NET, que según tengo entendido es donde están los grandes cambios de la especificación.
Mas info en
http://npgsql.projects.postgresql.org/
http://pgfoundry.org/frs/?group_id=1000140
lunes, 9 de julio de 2007
Esound
Desde que arme mi ultimo gentoo estube dando vueltas para no instalar el demonio esound, necesario para poder tener varios programas reproduciendo sonido simultaneamente. Hoy no aguante más y lo instale. Esta es una mini guia por si quieren guiarse.
Para ello empezamos recompilando mi kernel, poniendo como modulo el driver de audio. (Anteriormente lo tenia dentro del kernel).
#cd /usr/src/linux
#make menu config
Busquen los siguiente items en el menu de configuración
#make bzImage
Instalen la nueva imagen del kernel, (Si es necesario editen la entrada en Grub o si están seguros de que todo esta bien pisen su imagen de kernel anterior)
# cp arch/i386/boot/bzImage /boot/vmlinuz-XXXX
Paso siguiente compilar los módulos e instalarlos
#make modules
#make modules_install
Para finalzar con esta etapa añadan el modulo en /etc/modules.autoload.d/kernel-2.6,
(En mi caso snd-atiixp, para que se carge al arrancar la computadora)
Lo siguiente es instalar el flag para esound, esd, en /etc/make.conf.
Luego instalen los paquetes para esound.
#emerge esound
Por ultimo actualicen todo el sistema para que todas las aplicaciones soporten esound.
#emerge --sync
#emerge tuvaDN world
Para terminar, configuren todas las aplicaciones para que utilizen esound o esd que es lo mismo.
Lo gracioso de todo esto es que pude solucionar un problema que tenia con Firefox y el Flash Player, desde hace rato que el FP no funcionaba bien y terminaba colgando mi Firefox. Aparentemente con el demonio esound funciona de mil maravillas.
Para ello empezamos recompilando mi kernel, poniendo como modulo el driver de audio. (Anteriormente lo tenia dentro del kernel).
#cd /usr/src/linux
#make menu config
Busquen los siguiente items en el menu de configuración
device Drivers --->Compile el kernel con
Sound --->Sound card support
(OSS debe estar deshablitado)
Open Sound System --->
< > Open Sound System (DEPRECATED)
(En Alsa)
Advanced Linux Sound Architecture --->
Advanced Linux Sound Architecture
Sequencer support
OSS Mixer API
OSS PCM (digital audio) API
(Luego elijan su dispositivo de audio)
PCI Device
ATI IXP AC97 Controller
#make bzImage
Instalen la nueva imagen del kernel, (Si es necesario editen la entrada en Grub o si están seguros de que todo esta bien pisen su imagen de kernel anterior)
# cp arch/i386/boot/bzImage /boot/vmlinuz-XXXX
Paso siguiente compilar los módulos e instalarlos
#make modules
#make modules_install
Para finalzar con esta etapa añadan el modulo en /etc/modules.autoload.d/kernel-2.6,
(En mi caso snd-atiixp, para que se carge al arrancar la computadora)
Lo siguiente es instalar el flag para esound, esd, en /etc/make.conf.
Luego instalen los paquetes para esound.
#emerge esound
Por ultimo actualicen todo el sistema para que todas las aplicaciones soporten esound.
#emerge --sync
#emerge tuvaDN world
Para terminar, configuren todas las aplicaciones para que utilizen esound o esd que es lo mismo.
Lo gracioso de todo esto es que pude solucionar un problema que tenia con Firefox y el Flash Player, desde hace rato que el FP no funcionaba bien y terminaba colgando mi Firefox. Aparentemente con el demonio esound funciona de mil maravillas.
Deme 2!
Leyendo el este articulo del Diario La Nación, me sorprendo con los precios de Windows.
Tabla comparativa (en pesos)
Actualizar XP en línea. $ 390 (aprox.)
Vista Home Basic Actualización. $ 469
Vista Home Premium Actualización. $ 729
Vista Home Basic Full. $ 949
Vista Ultimate Actualización. $ 1239
Quiero aclarar que mi PC vale $ 1200, con todo y monitor, ¿ debería comprar un Sistema Operativo que vale más que mi PC para que probablemente no funcione como yo espero?, lo mas probable es que tambien necesite otro Software como Office, Antivirus y esas cosas que necesita Windows, las cuales obviamente tambien hay que pagar?!.
Mmmmmm, deja nomas....
Tabla comparativa (en pesos)
Actualizar XP en línea. $ 390 (aprox.)
Vista Home Basic Actualización. $ 469
Vista Home Premium Actualización. $ 729
Vista Home Basic Full. $ 949
Vista Ultimate Actualización. $ 1239
Quiero aclarar que mi PC vale $ 1200, con todo y monitor, ¿ debería comprar un Sistema Operativo que vale más que mi PC para que probablemente no funcione como yo espero?, lo mas probable es que tambien necesite otro Software como Office, Antivirus y esas cosas que necesita Windows, las cuales obviamente tambien hay que pagar?!.
Mmmmmm, deja nomas....
sábado, 7 de julio de 2007
Comparativa
Ya tengo casi terminado el driver para trabajar con las cámaras SparkLan en OCTV, estoy sorprendido de la diferencia de calidad que tienen estas cámaras con las Axis. Por ejemplo estuve viendo que el radio de visión de las Axis es más grande que las SparkLan, con una Axis se puede ver como mínimo un 30% más.
Los colores en las Axis son más vivos que en SparkLan, se nota mucho la diferencia, todo es mas gris en las segundas cámaras.
Por ultimo las diferencias entre las respuestas también es importante recalcar, con las cámaras SparkLan puede notarse que en ciertos momentos se queda "Dura" o que en la imagen aparecen zonas que no pudo procesar. En el mundo axis esto no existe, la calidad es excelente.
No esta de más recalcar que una cámara Axis cuesta 570 dolares Aproximadamente y las SparkLan 250 dolares.
Solaris Express Developer Edition
viernes, 6 de julio de 2007
Instalar Plugin de Java en Firefox
Llego a mis manos una cámara SparkLan CAS-330 para que desarrolle el driver de dicha cámara para el OCTV. La cosa es que cuando quiero ver como funciona la cámara, trato de acceder a su visor web de la cámara con firefox y poder verlo necesito el plugin de java para firefox.
Puse manos a la obra e instale el plugin en mi gentoo. Lo primero que deben hacer es agregar el flag de java y el de nsplugin, pueden hacerlo con ufed o directamente en make.conf.
Luego deben reinstalar su java, es recomendado que instalen la versión de sun, para ello puede hacer.
emerge sun-jdk
Les pedirá que descargen el paquete y lo pongan en /usr/portage/distfiles, luego lanzen el comando nuevamente.
Luego deben elegir el sistema java a utilizar con eselect.
eselect java-nsplugin set sun-jdk-1.5
Por Ultimo reinstalen su firefox
emerge mozilla-firefox
Tomese su tiempo, pueden ver una pelicula mientras tanto :P. Al finalizar todo debería estar funcionando, puden ver en la imgen que a mi me funciono de una.
jueves, 5 de julio de 2007
Nombre del Logo de PostgreSQL
Todos sabemos que el Pingüino de Linux se llama Tux y que el camaleón de Suse se llama Geeko. Había sido que el elefante de PostgreSQL se llama Slonik, que significa Elefante en Ruso. Y Slony, sistema de replicacion para PostgreSQL, significa manda de elefantes en el mismo idioma. Esto es según un thread en la lista de correo de PostgreSQL en español.
Particionado de Tablas en PostgreSQL
Estube estudiando como realizar un particionado de tabla en postgreSQL, la solución
oficial es bastante piola y fácil de realizar.
Vamos a suponer una tabla de ejemplo, personas a la que deseamos particionar.
CREATE TABLE personas(
id serial PRIMARY KEY,
nombre varchar(30) NOT NULL,
provincia varchar(30) NOT NULL);
Bien, ahora crearemos una tabla por cada partición que deseamos realizar a la tabla.
En este caso vamos a separar la tabla personas por el campo provincia, tomaremos las
personas que son de corrientes y las personas de chaco. Para esto al crear las nuevas
particiones heredamos de personas y ponemos la clausula check para definir el criterio.
CREATE TABLE personas_chaco(
CHECK ( provincia = 'chaco')
) INHERITS (personas);
CREATE TABLE personas_corrientes(
CHECK ( provincia = 'corrientes')
) INHERITS (personas);
Por ultimo debemos definir reglas en personas para que cuando entre un registro
con provincia = 'chaco' o provincia='corrientes', inserte los datos en la correspondiente partición y no directamente en el padre.
CREATE OR REPLACE RULE personas_chaco_part AS
ON INSERT TO personas WHERE (provincia='chaco') DO INSTEAD
INSERT INTO personas_chaco VALUES(NEW.id,NEW.nombre,NEW.provincia);
CREATE OR REPLACE RULE personas_corrientes_part AS
ON INSERT TO personas WHERE (provincia='corrientes') DO INSTEAD
INSERT INTO personas_corrientes VALUES(NEW.id,NEW.nombre,NEW.provincia);
Listo con esto ya tenemos la tabla particionada.
Pueden probar esto creando un script con los ejemplos anteriores y creando una base de ejemplo y cargar dicho script.
$createdb sampleDb
$psql -d sampleDb -f script_part.sql
Una vez en psql podemos ver lo que pasa cuando hacemos una consulta a
la tabla personas.
# EXPLAIN SELECT * FROM personas;
QUERY PLAN
--------------------------------------------------------------------------------------------
Result (cost=0.00..53.40 rows=2340 width=70)
-> Append (cost=0.00..53.40 rows=2340 width=70)
-> Seq Scan on personas (cost=0.00..17.80 rows=780 width=70)
-> Seq Scan on personas_chaco personas (cost=0.00..17.80 rows=780 width=70)
-> Seq Scan on personas_corrientes personas (cost=0.00..17.80 rows=780 width=70)
(5 rows)
Como pueden ver, se recorre la tabla padre y las hijas.
Bien, ahora vamos a discriminar por el campo provincia.
EXPLAIN SELECT * FROM personas WHERE provincia = 'chaco';
QUERY PLAN
------------------------------------------------------------------------------------------
Result (cost=0.00..59.25 rows=12 width=70)
-> Append (cost=0.00..59.25 rows=12 width=70)
-> Seq Scan on personas (cost=0.00..19.75 rows=4 width=70)
Filter: ((provincia)::text = 'chaco'::text)
-> Seq Scan on personas_chaco personas (cost=0.00..19.75 rows=4 width=70)
Filter: ((provincia)::text = 'chaco'::text)
-> Seq Scan on personas_corrientes personas (cost=0.00..19.75 rows=4 width=70)
Filter: ((provincia)::text = 'chaco'::text)
(8 rows)
Como pueden ver volvemos a buscar en todas las particiones, no se debería buscar en personas_corrientes, dado que buscamos chaco. Esto sucede por que por defecto no se encuentra habilitada la opcion constraint_exclusion. Para habilitarla podemos cambiar postgresql.conf para hacer definitivo el cambio o para probar podemos hacer.
$SET constraint_exclusion=on;
La consulta sería ejecutada así
# EXPLAIN SELECT * FROM personas WHERE provincia = 'chaco';
QUERY PLAN
-------------------------------------------------------------------------------------
Result (cost=0.00..39.50 rows=8 width=70)
-> Append (cost=0.00..39.50 rows=8 width=70)
-> Seq Scan on personas (cost=0.00..19.75 rows=4 width=70)
Filter: ((provincia)::text = 'chaco'::text)
-> Seq Scan on personas_chaco personas (cost=0.00..19.75 rows=4 width=70)
Filter: ((provincia)::text = 'chaco'::text)
(6 rows)
Como pueden ver nos evitamos realizar un seq scan en la partición de corrientes.
Las ventaja de hacer esto es que podemos logar una mejor performance en el motor dado que podemos partir nuestras tablas gigantescas por algun criterio conveniente dejando varias más
pequeñas, cosa muy deseable para el RDBMS.
La desventaja es que la administracion de los cambios sobre estas tablas no es tan sencilla como
administrar una sola tabla.
oficial es bastante piola y fácil de realizar.
Vamos a suponer una tabla de ejemplo, personas a la que deseamos particionar.
CREATE TABLE personas(
id serial PRIMARY KEY,
nombre varchar(30) NOT NULL,
provincia varchar(30) NOT NULL);
Bien, ahora crearemos una tabla por cada partición que deseamos realizar a la tabla.
En este caso vamos a separar la tabla personas por el campo provincia, tomaremos las
personas que son de corrientes y las personas de chaco. Para esto al crear las nuevas
particiones heredamos de personas y ponemos la clausula check para definir el criterio.
CREATE TABLE personas_chaco(
CHECK ( provincia = 'chaco')
) INHERITS (personas);
CREATE TABLE personas_corrientes(
CHECK ( provincia = 'corrientes')
) INHERITS (personas);
Por ultimo debemos definir reglas en personas para que cuando entre un registro
con provincia = 'chaco' o provincia='corrientes', inserte los datos en la correspondiente partición y no directamente en el padre.
CREATE OR REPLACE RULE personas_chaco_part AS
ON INSERT TO personas WHERE (provincia='chaco') DO INSTEAD
INSERT INTO personas_chaco VALUES(NEW.id,NEW.nombre,NEW.provincia);
CREATE OR REPLACE RULE personas_corrientes_part AS
ON INSERT TO personas WHERE (provincia='corrientes') DO INSTEAD
INSERT INTO personas_corrientes VALUES(NEW.id,NEW.nombre,NEW.provincia);
Listo con esto ya tenemos la tabla particionada.
Pueden probar esto creando un script con los ejemplos anteriores y creando una base de ejemplo y cargar dicho script.
$createdb sampleDb
$psql -d sampleDb -f script_part.sql
Una vez en psql podemos ver lo que pasa cuando hacemos una consulta a
la tabla personas.
# EXPLAIN SELECT * FROM personas;
QUERY PLAN
--------------------------------------------------------------------------------------------
Result (cost=0.00..53.40 rows=2340 width=70)
-> Append (cost=0.00..53.40 rows=2340 width=70)
-> Seq Scan on personas (cost=0.00..17.80 rows=780 width=70)
-> Seq Scan on personas_chaco personas (cost=0.00..17.80 rows=780 width=70)
-> Seq Scan on personas_corrientes personas (cost=0.00..17.80 rows=780 width=70)
(5 rows)
Como pueden ver, se recorre la tabla padre y las hijas.
Bien, ahora vamos a discriminar por el campo provincia.
EXPLAIN SELECT * FROM personas WHERE provincia = 'chaco';
QUERY PLAN
------------------------------------------------------------------------------------------
Result (cost=0.00..59.25 rows=12 width=70)
-> Append (cost=0.00..59.25 rows=12 width=70)
-> Seq Scan on personas (cost=0.00..19.75 rows=4 width=70)
Filter: ((provincia)::text = 'chaco'::text)
-> Seq Scan on personas_chaco personas (cost=0.00..19.75 rows=4 width=70)
Filter: ((provincia)::text = 'chaco'::text)
-> Seq Scan on personas_corrientes personas (cost=0.00..19.75 rows=4 width=70)
Filter: ((provincia)::text = 'chaco'::text)
(8 rows)
Como pueden ver volvemos a buscar en todas las particiones, no se debería buscar en personas_corrientes, dado que buscamos chaco. Esto sucede por que por defecto no se encuentra habilitada la opcion constraint_exclusion. Para habilitarla podemos cambiar postgresql.conf para hacer definitivo el cambio o para probar podemos hacer.
$SET constraint_exclusion=on;
La consulta sería ejecutada así
# EXPLAIN SELECT * FROM personas WHERE provincia = 'chaco';
QUERY PLAN
-------------------------------------------------------------------------------------
Result (cost=0.00..39.50 rows=8 width=70)
-> Append (cost=0.00..39.50 rows=8 width=70)
-> Seq Scan on personas (cost=0.00..19.75 rows=4 width=70)
Filter: ((provincia)::text = 'chaco'::text)
-> Seq Scan on personas_chaco personas (cost=0.00..19.75 rows=4 width=70)
Filter: ((provincia)::text = 'chaco'::text)
(6 rows)
Como pueden ver nos evitamos realizar un seq scan en la partición de corrientes.
Las ventaja de hacer esto es que podemos logar una mejor performance en el motor dado que podemos partir nuestras tablas gigantescas por algun criterio conveniente dejando varias más
pequeñas, cosa muy deseable para el RDBMS.
La desventaja es que la administracion de los cambios sobre estas tablas no es tan sencilla como
administrar una sola tabla.
Vi dentro de Monodevelop
Sorprendente Hack que hace posible utilizar como editor de Monodevelop a VI. Muy groso
el indú que pudo hacerlo.
Ver aquí
el indú que pudo hacerlo.
Ver aquí
Suscribirse a:
Entradas (Atom)