Archivos Mensuales: noviembre 2007

Jquery UI: usando draggables y droppables

En algún momento te haz preguntado; ¿Como obtengo el objeto, que estoy arrastrando con el ratón usando jquery.ui?; la pregunta es facil de responder y trataremos de explicar algunas cosas sobre draggables y dropables para entender mejor.

El concepto para comenzar a utilizar ui.draggables y ui.droppables es sencillo; simplemente creen un par de DIV (de ejemplo); cada uno con un nombre distinto (pueden, opcionalmente, agregarle el classname “draggable” o “droppable” para llegarle por selectores CSS como siempre se puede en jquery) y posicionenlos en cualquier area separada de pantalla (sea usando position: absolute o porque los han colocado dentro de tablas o celdas separadas).

Ahora viene la magia! detrás de jquery: para arrastrar simplemente declaren al DIV1 draggable:

$(“#dragged”).draggable();

Opcionalmente, pueden decirle al objeto draggable que genere un “clon”; esto es, que cuando se inicia el arrastre del objeto; no se arrastra al DIV1, sino a un “clon” del DIV1.

$(“#dragged”).draggable({
helper: ‘clone’
});

Posteriormente viene la declaración del DIV2, en este caso un contenedor de objetos “arrastrados” (droppable); igual que el anterior, podemos indicar que es droppable:

$(“#dropped”).droppable();

Claro, en este caso podemos contar con ciertas opciones para restringir o personalizar nuestro “droppable”:

accept: “.draggable”, : nos permite indicar que tipo de objeto (referencia a un id o selector) aceptará este droppable

activeClass: ‘droppable-active’, :cuando el droppable tenga dentro de si un “draggable”, cambiará su CSS a este estilo

hoverClass: ‘droppable-hover’, : cuando pasamos por encima (mouseover) el objeto draggable, esta será el estilo CSS aplicado

tolerance: ‘fit’ :tipo de tolerancia con los draggables, puede ser “fit”, si caen completo dentro del droppable, “intersect”, si los bordes del droppable y el draggable se intersectan.

Además, droppable posee una serie de “eventos” que pueden ser funciones callback que ocurren cuando un draggable los libera.

ejemplos:

drop: function(ev, ui) { //ocurre cuando el draggable cae dentro del droppable
},

activate: function(ev, ui) { //ocurre cuando el draggable se activa (comienza a ser arrastrado)
},

deactivate: function(ev, ui) { //ocurre cuando el draggable deja de ser arrastrado
},

como todo evento de droppable, posee 1 referencia implicita y dos parámetros; la referencia implicita es al objeto “this”; que se refiere al objeto droppable;

$(this).append(“”);

o sin necesidad de jquery: var iddrop = this.id;

y ev, que se refiere al gestor de eventos (al DOM Event de la página actual).

con EV podemos obtener ejemplo, las coordenadas de donde ha estado el draggable:

ev.ClientX / evClientY

ahora, quien es ui?, con ese nombre tan críptico, uno no sabe lo que es.

Pues bueno, siguiendo la regla de John Resig (primeras opciones, parámetros, segundas, propiedades, ultimas, callbacks); ese ui debe ser un objeto o una propiedad de droppable; en este caso, UI retorna una referencia al objeto arrastrado (es decir al draggable).

ej.

var id = ui.draggable.element.id;

o

$(ui.draggable.element).

Con lo cual podemos extraer toda la información que necesitemos del elemento que fue arrastrado.

El bloque de código que usé para pruebas fue el siguiente:


$(document).ready(function(){
$("#dragged").draggable({
helper: 'clone'
});
$("#dropped").droppable({
accept: ".draggable",
activeClass: 'droppable-active',
hoverClass: 'droppable-hover',
drop: function(ev, ui) {
//alert(ev.clientX);
$(this).append("<br>Dropped!");
},
deactivate: function(ev, ui) {
alert(ui.draggable.element.id);
$(this).append($(document.createElement('div')).text('deactivate'));
},
tolerance: 'fit'
});
});

Experimentos con XPATH y PHP5 DOM

Hola a todos; estoy en medio de un experimento (como los llama walter, medio criptico) de construcción de un XPATH parser para el DOM de tomates (basado en DOM de php5); en este caso, para resumir mucho más las largas estructuras DOM:XPATH (como lo hace jquery).

Por lo general yo nunca posteo preguntas (mas bien respuestas) en mi blog; pero estoy algo atrasado con esta idea y queria ver si alguien al leer este artículo se anima a participar.

Para los que aun no conocen XPATH, este es un lenguaje de localización y recepción de nodos dentro de un arbol DOM XML (o sea un archivo XML cualquiera); estas recepciones se crean mediante expresiones, tanto sencillas como complejas, para ubicar nodos dentro de un documento.
el ejemplo más sencillo es un documento XHTML, de la forma:

<html>
  <head>
    <title>Titulo de la pagina web</title>
  </head>
  <body><div id="capa1" style="font-family: verdana; color: #000cab; ">Prueba de DIV<span class="estilo1" style="font-family: arial; ">span anidado dentro de un div de id capa1</span><div>
</html>

Llegarle a BODY significa un path (eje o axis) es: /html/body … es util porque en muchos casos getElementById o getElementsByTagName no funcionan ya que requieren un DTD (Doctype Document Definition) y a veces el XML es propio (y no un XHTML).
sin embargo, llegarle al SPAN que está dentro del DIV es más dificil; para ello deberiamos llegarle al DIV y luego de todos sus hijos, seleccionar el SPAN que cumpla las reglas; algo como:

body -> div:id=capa1 -> span:class=estilo1

eso, en XPATH se escribe de la siguiente manera:

id(“capa1″)/child::span[@class=”estilo1”]

/child representa todos los hijos de id(); (::) representa el scope (alcance) actual (en este caso, todos los childs), span representa evidentemente el nombre de la etiqueta SPAN y dentro de los corchetes se coloca [] lo que se conoce como predicado, o expresión filtro; en este caso @ representa los atributos que la etiqueta span pudiera tener; @class se refiere al atributo class que es igual a estilo1.
Bueno, al caso; voy a mostrar algunos ejemplos de para que puede servir XPATH en experimentos realmente particulares con XHTML; fijense:

Ejemplos:
id(“capa1”)/parent::node()
//trae el padre del id capa1

id(“capa1″)/child::span[@class=”estilo1”]
//trae de id:capa1 todos los span que tengan como className:estilo1

/html/body/ul[1]/li[position()=last()]
//del primer UL, trae el li que tiene la ultima posicion

Tambien se puede escribir como //ul[1]/li[last()]

id(“tb1”)/child::tbody/child::tr[position() mod 2 = 1]
//del objeto id:tb1, revisa todos los childs tbody::tr que su posicion sea impar.

//ul/li[position()> 2 and position()< 8]
//trae todos los li, que su posicion ordinal sea mayor que dos y menor que 8

id(“lista_estados”)/li[starts-with(., “M”)]
//para la lista de id:lista_estados, traer todos los li que empiezan con M

//*[.=”item 1″]
//para todos los elementos que tienen como texto la palabra “item 1”

id(“tb1”)/child::tbody/child::tr/child::td[@id[starts-with(., “fecha_nacimiento”)]]
//de la tabla id:tb1; traer todas las celdas que su id comience con fecha_nacimiento.

id(“tb1”)/child::tbody/child::tr/child::td[@id[starts-with(., “fecha_nacimiento”)] and substring(., 1, 4)=”1970″]
//El mismo de arriba, pero ademas, que el valor de esa celda, pasado por la funcion substring, sea igual a 1970

Lo que ven empezando es una expresion XPATH, lo segundo (luego del //) es la explicacion de lo que hace la expresion XPATH; alguna vez se han preguntado, sobre todo trabajando con DOM; como hago para contar (sin tener que pegarme a la DB) desde una tabla cuantas personas femeninas nacieron posterior a 1970 y su nombre empieza con A?.
XPATH, en muchos casos es la respuesta.

Bueno, en el caso actual, deseo simplificar este proceso; haciendolo tal cual como lo hace jquery, pero en PHP; algo como:

$(‘ul li:first’)
es igual a:
/html/body/ul/li[position()=1]

ven a lo que me refiero?, ambas dicen: traeme todos los LI que su posicion sea 1, en todos los UL del documento HTML actual.

para hacer esto en PHP requiero dos cosas:

separar la expresion de arriba (el ‘ul li:first’) en “tokens” (ej: ul, li:first) y esos tokens analizarlos segun expresiones regulares (es lo más optimo que veo ahi) y hacer las transformaciones segun el siguiente mapa:

Algunas reglas robadas de jquery:

Reglas:                se traduce a:

#identificadores:
#name <- es id                 id(‘name’)
.class <- posee clase x     [@class=”class”]
div <- es un elemento        /div

#indicadores de posicion:
:first                                [position()=1]
:last                                [position()=last()]
:n (number)                      [position()=n]
:odd <- impares                [position() mod 2 = 1]
:even                               [position() mod 2 = 0]
:>2                                  [position() > 2]

#descendencia y ascendencia:
:child                child::*
:child::span            child::span
:parent                parent::node()
:self                self::node()

Lo que ven de primero, es como se “escribiria” y lo de la derecha, como es la expresion “traducida” en XPATH; entienden a lo que me refiero?, un parser de expresiones a XPATH; el problema por el que atravieso ahora es el poco tiempo disponible para obtener las expresiones regulares que separen en “tokens” y las que interpretan esos tokens; quien se anima a ayudar?.

Si se logra esto (crear el parser XPATH), esta expresion:
id(“tb1”)/child::tbody/child::tr/child::td[@id[starts-with(., “fecha_nacimiento”)] and substring(., 1, 4)=”1970″]
quedaria parecida como en jquery:
(“#tb1 tbody tr td:id=(starts-with(., ‘fecha_nacimiento’) and substring(., 1, 4)=1970)”)

Y para que podría ser util XPATH en PHP?, bueno, fijense este codigo:

$filas = $dom->query(‘id(“tb1”)/child::tbody/child::tr[position() mod 2 = 1]’);
foreach($filas as $fila) {
$fila->className(‘odd’);
}

Dice, “toma todas las filas impares del tbody de la tabla llamada tb1”; de esas filas (que es un DOMNodelist) itero sobre ellas y les aplico un estilo “odd” lo que hace que nuestra tabla sea una “zebra”; claro, esto ya lo hace jquery; pero es un ejemplo interesante de iteración sobre tablas estáticas ya existentes.

Alguno se ha preguntado como hacer un Total de la columna sub-total de una tabla? …
$subtotal = 0;
$celdas = $dom->query(‘id(“tb1″)/child::tbody/child::tr/child::td[@class=”subtotal”]’);
foreach($celdas as $celda) {
$subtotal+= $celda->nodeValue;
}

en la variable $subtotal tendremos el total general de todas las columnas que tengan como class “subtotal” (existen otras formas de identificarlas, pero es para plantear la idea).

y esperen a que llegue XPATH 2.0; podremos hacer cosas como:

sum(for $x in id(‘tb1’)/child::tbody/child::tr/child::td return $x/@cantidad * $x/@precio)

La expresion id(‘tb1’)/child::tbody/child::tr/child::td return $x/@cantidad * $x/@precio) retorna el subtotal de multiplicar las TD:class=cantidad * TD:class=precio; si ese subtotal, lo iteramos entre TODAS las filas (eso hace el for) y sumamos eso (eso hace el sum) obtendremos el total general.

Mientras, seguiré haciendo busquedas con XPATH normalito y básico; pero es un proyecto interesante que tengo por ahi …

El que quiera colaborar, un reply a este post…

I encuentro de Emprendedores del Software Libre

El miércoles y jueves he tenido el grato placer de participar en el I encuentro Nacional de Emprendedores del Software Libre; realizado por el CNTI y RINDE; en colaboración con FUNDACITE Lara, la UNEXPO y que tuvo como sede la Torre David de la ciudad de Barquisimeto.

Contamos con la presencia de Octavio Rossell y Eduardo D’Atellis que en conjunto presentaron una ponencia sobre Glove; Hector Colina presentandonos una amena presentación sobre servidores web en debian y Hector Rivero de CNTI una sobre RINDE (como una costumbre mia; le volví a recordar; ¿Cuando volverán a levantar FINDE? 😉 ).

En mi caso, asistí para dar una ponencia sobre Bases de datos Libres (hablé y dí ejercicios sobre postgresql y mysql; pero hablamos de firebird, berkeley db, ingres y otras); la cual estrené en ese evento y tuvo una buena aceptación; espero mejorar el material y los ejemplos con el tiempo.

Me parece un interesante modelo que aplicaré de ahora en adelante en todas mis ponencias:

Historia (como buena doña, no faltan anecdotas) -> teoría básica -> explicación extendida -> ejemplos básicos -> cierre y conclusiones -> ejemplos complejos (si queda tiempo y personas despiertas 😉 ).

proximanente me crearé un repositorio para todas mis ponencias; espero tenerlo pronto.

Gracias a CNTI, a Ezequiel (chekex), la gente de FUNDACITE Lara y todos los demás que hicieron posible este gran evento, como siempre la gente de Lara muy organizada y dispuesta!; felicidades a todos ….

PD: y Galeno, por favor!, pareces naufrago!; donde depositamos la colecta para que vayas al barbero??… 😉

Kernel 2.6.23.1: tips y principios iniciales

Siempre la gente en todos los foros, conferencias, fuentes de soda tomando café y durante los rezos de la iglesia se detienen para preguntarme; ¿Cuales reglas usas tu para compilar tu kernel?; aqui expongo algunas; no están todas; pero están las más útiles para tu desktop (las reglas para servidores vendrán despues).

Principios Iniciales: del GRUB al mkinitramfs

Levantar un kernel no siempre es “de fabrica”; muchas veces tenemos algunos dispositivos (como discos S-ATA) de los cuales no arrancan a la primera; o tarjetas de video que no levantan en framebuffer; aqui expongo las reglas con las cuales levanto mi actual kernel (2.6.23.1):

/vmlinuz-2.6.23.1 root=/dev/sda2 ro idebus=66 pci=routeirq pci=assign-busses irqpoll acpi=force vga=791

expliquemos algunas; idebus=66 sirve para establecer la velocidad del bus IDE; por defecto (y a manera de compatibilidad) en casi toda distribución de linux es de 33mhz (algo no muy rápido si tenemos de esos nuevos discos UDMA5 ó 6); idebus=66 sirve para reescribir ese valor.

irqpoll: Para algún hardware “extraño” (en mi caso, el fingerprint reader y el lector 7-1 de SD/MMC/CFC) el CPU crea algunos “polls” de acceso para detener su ejecución y preguntarle al hardware; “mira, necesitas hacer algo?”; esto para manejar alternativamente la inicialización correcta de algunos dispositivos “buggy” con las convenciones de la BIOS; en este caso, irqpoll puede hacer a tu arranque mas “lento” de lo normal; pero es la única forma de hacer funcionar correctamente este hardware; si no posees tal hardware que no funciona o no deseas hacerlo funcionar, quitar irqpoll puede mejorar en el performance general del arranque.

vga=791: representa correr framebuffer a 1024×768; algo util cuando corres sin el “quiet” y deseas ver lo que pasa en el arranque del kernel.

pci=assign-busses: excesivamente útil; muchas BIOS “buggy” asignan los irq como les viene en gana; causando que algún hardware se bloquee; con pci=assign-busses, logramos que el kernel sobre-escriba cualquier directiva de asignación de la BIOS y sea este (el kernel) quien asigne los buses de comunicación (PCI bus numbers).

pci=routeirq: en algunas ocasiones; cuando un dispositivo no levanta al arranque del kernel o causa que el kernel se “cuelgue” al levantar; muchos optan por no iniciar las ACPI (con las nefastas consecuencias de no tener gestión de energia, CPU frequency, disk y RAM suspend, modos de energía S3 y todas esas cosas que dependen de ACPI); sin saber que podemos hacer un “by-pass” de los dispositivos PCI buggy creando tablas de “routing” y haciendo que muchos dispositivos PCI funcionen con el “old-behavior” del kernel Linux; es a veces inocuo; pero util para algunas cosas (como los Yenta-Sockets PCMCIA).

Se supone que el algún futuro “no lejano” los drivers para linux serán compatibles con la directiva pci_enable_device y que por tanto, no se necesitará routeirq; pero aun hay afuera mucho de ese hardware.

Opciones que no tengo pero tambien son útiles:
pci=usepirqmask: se usa para que el kernel guarde las irq masks en una tabla (conocida como tabla PIR); se supone que en ciertas BIOS “buggy” (como las HP Pavilion) es útil para que el kernel administre dichas IRQ.

libata.atapi_enabled=1: si acaso tenemos un dispositivo S-ATA ATAPI (algunas unidades de DVD) y no son detectadas por el kernel Linux (o instaladores) pasamos esta directiva para que libata sea cargada al arranque del kernel y con esta que intente habilitar cualquier dispositivo SATA ATAPI.

Descargando y compilando el kernel 2.6.23

¿por qué cambiar de kernel?; bueno, ¿Por qué no?, es por lo general inocuo y muchas características de nuevos kernel pueden beneficiarnos a nosotros (como la incorporación del hipervisor de XEN) o a nuestro hardware (como la estabilización del driver bcm43xx de broadcom que ha hecho innecesario que alguna vez vuelva a mirar a ndiswrapper).

Esta guia no pretende ser “orientada a distro”; es decir, la compilación es generica y sin orientarse a distribución alguna (ej. fedora y debian tienen sus formas “oficialmente aceptadas” de compilar kernel, no es menester de esta guia responder dichas preguntas; hay muchos foros sobre compilar kernel “debian-way”, etc).

Principios iniciales:

Debemos tener incialmente instalado todo lo necesario para compilar; esto es por ejemplo:

Fedora: yum install gcc glib-devel bison

Debian: aptitude install fakeroot build-essential gcc glib-dev

Primer paso: descargar a /usr/src

apuntamos nuestro navegador a http://www.kernel.org y descargamos es más novel del kernel (en mi caso fue el 2..6.23.1, aunque ya va por la 2.6.23.8) de hecho, revisando los changelog, no veo ninguna novedad que ayude a mi hardware (excepto unas correcciones en la libata) asi que esperaré a una variante más estable.

luego que está en /usr/src descomprimimos dicho kernel:

tar xvf linux.2.6.23.1.tar.bz2

con lo cual, procederemos al siguiente paso.

Segundo paso: limpiar el kernel para iniciar

Limpiar el kernel significa dejarlo como nuevo como si nunca hubiera sido compilado; sabemos que acaban de descargarlo, pero por cada vez que quieran hacer cambios y compilarlo nuevamente es bueno ejecutar este comando:

make mrproper

ahora bien, si ya lo tienen compilado y solo desean “darle unas afinadas”, no necesitan ejecutar este comando, pues borrará incluso las directivas previamente configuradas y el archivo .config (residente de todo lo configurado en el kernel).

Tercer paso: revisar si el viejo kernel posee directivas de configuración

Para ello, basta con apuntar a /boot y revisar si nuestro kernel actualmente instalado posee un archivo .config (ej. /boot/config-2.6.18-4-686); si es así, podemos ejecutar:

make oldconfig

y todas las directivas pre-seteadas en el anterior kernel serán “copiadas” a este nuevo kernel; tomen cuenta, que si hay marcada diferencia entre los kernels, este puede preguntar sobre que valor ponerle a nuevas directivas; pueden darle ENTER sin problemas, ya que por defecto, vienen con un valor efectivamente “inocuo” para nuestra configuración actual.

Tomen en cuenta además, que si el archivo config no se encuentra en BOOT, van a necesitar instalar los kernel devel de su respectivo kernel:

fedora: yum install kernel-devel-2.6.20-1-fc7 (ejemplo)

debian: aptitude install linux-headers-2.6-686 (ejemplo)

Ya que tenemos un kernel “seteado” con las viejas opciones (es bueno leer estas nuevas opciones, algunas tal vez nos interesen) podemos entonces proceder a modificar y configurar nuestro kernel.

Modos: El bueno, el malo y el feo

Hay 3 modos de configurar el kernel, make config que simplemente nos va mostrando una a una las opciones en nuestra pantalla; lo cual es harto horrible y tedioso (además de malo); el modo “experto” o para hombres (como dice mi amigo hector colina) es hacer un

make menuconfig

Que presenta una pantalla ncurses digna de una instalación de debian; para poder usar esta pantalla de ncurses necesitamos los ncurses-devel instalados:

fedora: yum install ncurses-devel

debian: aptitude install ncurses5-dev libncurses-dev

la tercera forma es usando las respectivas formas X (gtk, X o Qt) dependiendo de nuestra distribución y nuestro entorno favorito; dichas ventanitas gráficas se obtienen con:

make gconfig

make xconfig

make kconfig

pero necesitamos los bindings de ej. si su caso es GTK, de gtk2++, glibc devel y otras cosillas que el mismo comando pedirá si acaso no las tienen instaladas.

Definiendo opciones

Cada día el kernel se hace más y más complejo, llevarle el conocimiento a todas las opciones es dificil; voy a tratar de ser conciso en las realmente “importantes”:
â?? -> Enable the block layer (BLOCK [=y])
â?? -> IO Schedulers
â?? -> Default I/O scheduler (<choice> [=y])

Activemos el I/O Scheduler y definamos como por defecto el kernel distribuye su ancho de banda entre los procesos de sistema; en mi caso, trabajo mucho con bases de datos, por lo que DEADLINE es mi opción, pero para los desktops más comunes; un scheduler CFQ es la mejor opción, que distribuye equitativamente los tiempos de tarea entre todos los procesos de sistema; equilibrando el uso (como debería ocurrir en un desktop normal).

â?? -> Processor type and features

Symmetric multi-processing support: Al activar esta opción, nuestro kernel será capaz de manejar multiples procesadores (o manejar multiples cores como si fueran procesadores individuales); en el caso de usuarios con Intel Core Duo, Core 2 Duo o AMD X2; activar esta opción permitirá tener multiples procesadores independientes a nuestra disposición (pueden notarlo al arranque, verán tantos pingüinos tux como cores o cpu’s tenga el computador).

Paravirtualization support: para aquellos que deseen correr multiples instancias de un kernel bajo las directivas de un hypervisor (ej. virtualizar con Xen) entonces podemos activar esta opción; ojo!, hay que acotar que si NO VAMOS a virtualizar el equipo; un kernel compilado con el soporte a paravirtualización y con el hypervisor de xen activado, es más lento.

Enable support for Xen hypervisor: como complemento a la anterior opción; podemos incluir directamente el hypervisor de XEN en nuestro boot aceptando esta opción; para los Fans de VMWARE; el hypervisor del ESX Server está en el actual kernel (pero claro, una versión GPL-mode reducida).

Processor Family: Lo que todos buscan!; Fedora se instala en modo 686 y el kernel linux de debian por defecto viene en versiones 486 y 686; como aprovechar entonces mi CPU si siempre va a estar a 800Mhz?; que desperdicio!; pues no, podemos modificar las directivas de cual CPU poseemos en esta lista; realmente la lista es autoexplicada (tengo que explicar que es un pentium-3?); sin embargo, en casos como los Xeon, veremos Xeon y newer Xeon, para los Xeon básicos (los viejitos, familias 4 y 5) se usa Xeon, para los familia 6 y 7 se usa Core 2/newer Xeon; en caso de tener un AMD K8, 64 o X2, activarán Opteron/Athlon64/Hammer/K8.

SMT (Hyperthreading) scheduler support: Si acaso poseen un Intel con hiperhilado (ese invento de meter buses de millones de hilos alrededor del CPU); pueden hacer que el kernel maneje eficientemente el hyperthreading activando esta opción (creo que aun ni Windows Vista maneja correctamente el hyperthreading; colapsando igualmente si se acaban los hilos del CPU).

Multi-core scheduler support: Sea que tengan un Intel Core o un AMD X2; activar esta opción permite al kernel linux manejar correctamente los multi-core CPU’s.

Preemption Model: La panacea del mejoramiento del kernel; por lo general (y por aquello de su necesidad de ser “genericos”) los kernels de la gran mayoría de las distribuciones viene con un modelo pre-emptivo (nivel de latencia del kernel) alto o nulo; esto es ideal para servidores, que requieren dedicar toda la potencia bruta del kernel a procesamientos únicos, computo científico o eso; pero como mi portatil no va a guiar cohetes a plutón; entonces en mi caso; cambio el modelo preemptivo del kernel a:

Preemptible Kernel (Low-Latency Desktop)

Con lo cual todo el kernel se vuelve preemptible; mejorando las latencias a factores de milisegundos; haciendo que las aplicaciones funcionen “suavemente” aun en condiciones de alta carga; claro, esto conlleva a un consumo realmente “excesivo” del CPU; pero para equipos con 2.0Ghz de CPU en dos nucleos; es algo que solo les causa cosquillas.

Timer frequency: En algunos casos, un kernel no preemptible (de alta latencia) no necesita tener una alta velocidad de respuesta ante eventos; por lo que la frecuencia de reloj del kernel es baja (por defecto, 300Mhz); en caso que requiramos una alta velocidad de respuesta (requerida para casi todo lo “divertido” hoy en día como juegos, edición de video, reproducción de DVD’s, etc) entonces pueden ubicar como “frecuencia de reloj” correcta a 1000Mhz.

â?? -> Power management options (ACPI, APM)

Cambiamos de opción; en este caso, la que maneja la gestión de energía y ACPI.

Suspend to RAM and standby: Si la BIOS soporta el estado ACPI S3 (lo verán al entrar en su BIOS y verificar si pueden activar el modo S3 en la sección de energía y ACPI); al activar esta opción, su máquina podrá suavemente suspenderse en RAM y colocarse en modo “stand-by”; este modo es utilísimo; ya que copia en RAM el estado de tu sesión y además solo gasta energía para mantener la RAM (volatil por lo general) alimentada para que no pierda los datos (y ej. el bombillo de power parpadeando en mi portatil); en casos muy normales; mi portatil ha mantenido (despues de uso) hasta 2 días de pila en modo suspensión.

Hibernation (aka ‘suspend to disk’): Si además de suspensión en RAM (STR); deseamos suspender a disco (STD o Hibernate); debemos activar esta opción; adicionalmente debemos especificar cual es la ruta a nuestra SWAP (si, swap, debemos tener swap activa ya que es AHI donde se suspende a disco el equipo):

y escribir el valor de la swap partition: Default resume partition: /dev/sda7 (mi caso)

Para descubrir cual es su swap (ACTIVA) deben ejecutar (como root):

swapon -s

a lo que obtendrán:

Filename Type Size Used Priority
/dev/sda7 partition 975168 928 -1

Si ACASO no tuvieran SWAP activa; pueden crearla (no es menester de la guia decirles como 😉 ) y activarla con:

swapon /dev/sda7

la partición debe SIEMPRE estar activa antes de mandar a hibernar; sino realmente no podrán enviar el equipo a hibernación.

Si acaso el equipo se fuera a hibernación y desean arrancar sin que el sistema cargue la hibernación; pueden arrancar con el parámetro “noresume” en el GRUB; noten sin embargo, que la partición aparecerá “corrupta” para el fsck que se ejecuta al arranque del kernel, por lo que es recomendable ejecutar mkswap a la partición y reactivarla con swapon.

Es evidente; además, que la dimensión de nuestra swap debe ser MAYOR que nuestra RAM (he medido factores de 30%, pero por algo por ahí dicen “swap=2 * RAM”).

Nota crítica (y que conste que se los advertí): Ningún filesystem con journalist debe quedar PRIMERO en el montaje que la swap al momento de “despertar de la hibernación” o este filesystem quedará corrompido extrañanamente (mi /usr/local que era JFS quedó convertido a ext2 con la data corrompida).

â?? -> Power management options (ACPI, APM)
â?? -> CPU Frequency scaling

Siempre me preguntan; como hago para gestionar la velocidad del CPU?; bueno, activan esta opción y definen los “gobernadores” que desean activar; estos son “performance” (por defecto), “ondemand”, “conservative” y “powersave”; creo que los nombres son bastante explicativos; lo interesante aqui es definir cual es el módulo del kernel que gestiona la gestión de velocidad del CPU (a saber, en AMD es la tecnología PowerNow! y en Intel se llama SpeedStep); ej. en caso de tener un CPU AMD optan por:

AMD Opteron/Athlon64 PowerNow!

En caso de ser un Intel Core; pueden usar el genérico ACPI Processor P-States driver o usar:

Intel Enhanced SpeedStep

Si los colocan como m (module); deben tener en cuenta de cargarlos al arranque (agregandolos en /etc/modules en debian o en /etc/modprobe.conf en fedora).

Ej.

modprobe acpi-cpufreq cpufreq-ondemand cpufreq-conservative

activará el CPU frequency de nuestro kernel.

Para cambiarle la frecuencia del CPU pueden ejecutar:

cpufreq-set -c [numero de CPU, empezando en cero] -g [nombre del gobernador]

Si deseamos dejar un gobernador por defecto (ej. ondemand) entonces ejecutamos (claro que como ROOT!):

echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

Claro, gnome viene con una aplicación (applet) llamado gnome-cpufreq-applet que permite la visualización del estado actual de la frecuencia y el gobernador; puede que no puedan modificar las escalas y los gobernadores; esto es porque la aplicación necesita tener un suid como superusuario (ya que accede a comandos que solo el superusuario podría acceder); en fedora esto no es necesario ya que el applet ya viene con su respectivo bit de suid; pero en el caso de debian toca ejecutar:


dpkg-reconfigure gnome-applets

Y responder “yes” a “Instalar CPUFREQ con SUID root”.
â?? -> Kernel hacking

En kernel hacking; por favor deben desactivar cualquier opción que implique “debug” como:

kernel debug

debug filesystem

Enable unused/obsolete exported symbols

Run “make headers/check”

SLUB debugging on by default

Ya que por defecto, si nuestro kernel falla, no somos kernel developers para descubrir que está pasando y ponernos a hacer debugging (a menos que realmente queramos descubrir que está pasando, en un equipo estable y en producción, estas opciones son innecesarias y ponen además de lento, más pesado el kernel).

Hay muchisimas opciones opciones que activar; en mi caso, deseo evitar usar ndiswrapper para mi tarjeta inalambrica broadcom; para ello activo lo siguiente:

Networking -> Wireless

luego:

â?? -> Device Drivers
â?? -> Network device support (NETDEVICES [=y])
â?? -> Wireless LAN

y escoger luego el driver que más se adecue a nuestras necesidades; en mi caso, broadcom:

Broadcom BCM43xx wireless support (modo modulo “m”)

y seleccionar DMA+PIO en el modo de data transfer.

Para usar el módulo bcm43xx:

instalar el firmware:
fedora: yum install bcm43xx-fwcutter

debian: aptitude install bcm43xx-fwcutter

En ambos casos, debemos tener un .sys (driver windows) para “extraer” el firmware (pero creo que esto lo expliqué en un post anterior y escapa del menester de este post).

modprobe bcm43xx

podremos tener nuestra broadcom funcionando (soporta WEP, WPA, WPA Empresarial, WPA+TKIP y otros modos de infraestructura, aun no soporta ad-hoc correctamente) usando un módulo del kernel y sin tener que usar ndiswrapper.

Virtualización:

Si nuestro CPU soporta virtualización por hardware (tecnologías van-derpool de AMD y Pacifica de Intel), entonces podemos activarla en este kernel en la opción:

â?? -> Device Drivers
â?? -> Virtualization (VIRTUALIZATION [=y])
â?? -> Kernel-based Virtual Machine (KVM) support (KVM [=m])

En este caso; con solo ejecutar:

modprobe kvm_intel (o kvm_amd para usuarios AMD)

tendremos el virtualizador KVM activo, solo nos faltaría instalar el qemu modificado para kvm.

Compilando:

Luego que hemos personalizado nuestro kernel, es hora de compilar!; para ello ejecutamos:

make all (ejecuta todos los make, incluido make docs, make headers y make check)

make modules (inicia la creación de los modulos del kernel)

Instalando:

Para instalar nuestro kernel debemos ejecutar:


make install

y para instalar los modulos:

make modules-install
(instala los modulos en /lib/modules/2.6.xx.xx, la ruta a nuestro kernel).

El make install tiene diversas acepciones dependiendo de la distro; en fedora, ejemplo, el make install creará el initrd y modificará el grub de manera acorde; algo que no ocurre en debian; por lo que hay que ejecutar:

make initramfs -o /boot/initrd-2.6.23.1 /lib/modules/2.6.23.1

El comando indica: crear un initrd de tipo ramfs en /boot, con el suffix de nuestro kernel, para el kernel instalado en /lib/modules/2.6.23.1 (o la ruta del kernel que estén instalando).

y luego editar el grub de la siguiente manera:

Editando el grub:

Observemos el siguiente ejemplo:

title Debian GNU/Linux, kernel 2.6.23.1-coreDuo
root (hd0,0)
kernel /vmlinuz-2.6.23.1 root=/dev/sda2 ro idebus=66 pci=routeirq pci=assign-busses irqpoll acpi=force vga=791
initrd /initrd.img-2.6.23.1
savedefault

La opción title indica el nombre que veremos en el grub bootloader; este nombre puede ser como deseemos, pero realmente es bueno que sea descriptivo (como el caso, nombre del kernel y sufijo).

root: indica donde debe quedar el kernel, en este caso, que partición contiene el ramfs y el vmlinux; en mi caso, la primera partición del primer disco (hd: disco[0]: primer disco; [0] primera partición.

Y cual partición sé que está activa?.

ejecuten:

fdisk -l /dev/sda

Este es mi primer disco (noten que grub es inocuo a si es SATA o IDE; siempre será un hd) y verán:

Disposit. Inicio Comienzo Fin Bloques Id Sistema
/dev/sda1 * 1 65 491368+ 83 Linux
/dev/sda2 66 2003 14651280 83 Linux
/dev/sda3 2004 3295 9767520 83 Linux

La partición con el asterisco es su primera partición activa (y la marcada como arranque) la que posee el el /boot.

kernel es la ruta (relativa a /boot) al vmlinux del kernel actual; la partición donde está root (fijense que /sda1 está activa pero root está en sda2, esto es porque mi mapa de particiones es:

df -hT

S.ficheros Tipo Tamaño Usado Disp Uso% Montado en
/dev/sda2 jfs 14G 7,3G 6,7G 53% /
/dev/sda1 ext2 450M 56M 371M 14% /boot
/dev/sda6 xfs 9,4G 7,4G 2,0G 80% /home
/dev/sda8 ext3 1,4G 35M 1,3G 3% /tmp
/dev/sda9 ext3 1,9G 926M 861M 52% /var
/dev/sda5 jfs 19G 791M 18G 5% /var/lib

Me gusta tener al GRUB en una partición propia; ext2 (no necesita tener journalist el boot), con algunos modos de protección como ro (read-only, se lo quito cuando compilo), nosuid y nodev.

y Listo!, reinicien el equipo y recen un par de plegarias.

Notas adicionales:

En el caso de equipos con solo dispositivos SATA; es completamente SEGURO quitar soporte para IDE/ATAPI en:

-> device drivers
-> ATA/ATAPI/MFM/RLL support

Ya que fuerzan al uso de la libreria libata (en mi caso, intel ata o:

â?? -> Device Drivers
â?? -> Serial ATA (prod) and Parallel ATA (experimental) drivers (ATA [=y])
-> Intel ESB, ICH, PIIX3, PIIX4 PATA/SATA support

Lo cual según pruebas con hdparm es mucho más rápido los accesos que con el básico generic_ide con que monta debian.

No obstante; cuidado!; si hacen esto, deben tomar en cuenta que las unidades se re-nombran de hdx a sdx; con lo cual, si no editan el /etc/fstab para actualizar el cambio de IDE a SATA; obtendran un error al arranque del kernel:

waiting for root filesystem

Lo que indica que el /etc/fstab apunta a un root que NO EXISTE; en mi caso, para evitar problemas, testeo el kernel primero con IDE activo y si funciona, activo el SATA driver y luego cambio el fstab (ya que si edito sin probar el kernel, cometo el craso ERROR de que ni cargará el kernel actual y no podré cargar el viejo kernel (que apuntaba a hda en vez de a sda).

Recuerden que ALSA y tu respectivo AGP GART (en mi caso:

â?? -> Device Drivers
â?? -> Sound
â?? -> Advanced Linux Sound Architecture
â?? -> PCI devices
y seleccionar como modulo a Intel HD Audio

y para AGP:

â?? -> Device Drivers
â?? -> Character devices
â?? -> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) (DRM [=m])

y seleccionar como modulo a: Intel 830M, 845G, 852GM, 855GM, 865G

Sin estos 2 cambios; ni tendremos Sonido y nuestra tarjeta de video no soportará Direct Rendering (util si deseas instalar compiz-fusion).

Tambien tengo una capturadora de video externa (en mi casa), en este caso, el chipset es BT848 y se ubica en:

â?? -> Device Drivers
â?? -> Multimedia devices
â?? -> Video For Linux (VIDEO_DEV [=m])
â?? -> Video capture adapters (VIDEO_CAPTURE_DRIVERS [=y])

y se selecciona BT848 video for Linux.

Es de acotar que todos los drivers de webcams soportados por Linux, están en esta carpeta (Video For Linux o V4L).

Conclusiones:

En el mundo de hoy, tan lleno de Core2, Core4, core8, multi-cores, Cores/Cores, X2Cores, Cores++ y tantas maquinas potentes, un kernel 2.6.18 compilado para i686 es una pérdida de recursos enorme y es casi que “necesario” compilar nuestro kernel para disfrutar de un montón de nuevas cosas.

Una compilación es algo que lleva tiempo; por lo general entre 20 y 40 minutos dependiendo del tamaño del kernel que se compile (si compilan uno a lo “cleaning mode”, donde quito las cosas que no tengo (como módulos SCSCI o infiniband) pueden reducir ese tiempo en un 30% más o menos) y del equipo dispuesto para la compilación; he visto compilaciones de una hora (en Pentium-3 regularmente); como las he visto de 15 minutos; es cuestión de dedicación, limpieza y recursos.

Pueden experimentar con calma, la compilación de un kernel no desactiva el anterior ni “dañará” tu PC ni nada por el estilo; por lo que pueden comenzar a compilar a sus anchas.

Disfruten de su kernel compilado!…

El síndrome de Pedro y Clarita

Todos alguna vez vimos aunque sea un único capítulo de Heidi:

Recordamos a el gran Perro  Niebla; a la cabra mascota Copo de Nieve y a la abuelita ciega y costurera de Pedro; e incluso muchas veces comparamos nuestras peores profesoras de la escuela con la Srta. Rottenmayer; pero este artículo no es para discutir de el animé que hace 30 años se transmite en TV; hemos de tratar un síndrome muy común en la sociedad venezolana (y creo que evidentemente poco documentado en la psiquiatría convencional); lo hemos de llamar el “Síndrome de Pedro y Clarita”.

nostalgia-animado-heidi2.jpg

Ya sabemos que esta serie marcó a muchisimas personas, tanto que muchos desean ser alguno de los personajes de la serie (hasta le han hecho un musical!);  y no menos en la sociedad venezolana donde existen cierto tipo de sujetos (creo que tristemente me incluyo) con una característica importante; todos se creen Pedro y que podrán hacer caminar a Clarita.

Este síndrome se basa en la búsqueda de chicas absolutamente conflictivas (una propia Clarita inválida)  y todos (absolutamente todos!) creemos que nosotros SI PODREMOS hacer caminar a Clarita!, entiendan!, están a tiempo!, solo Pedro pudo hacerla caminar! …

Este es como ese síndrome (aun no le tengo el nombre) donde las mujeres se buscan hombres absolutamente conflictivos, inútiles, mujeriegos, egocéntricos y narcisistas y ellas asumen que los podrán cambiar; además de ser un castigo auto-infligido (como si de alguna especie de karma de re-encarnación nos estuvieramos liberando), es un caso inútil; si acaso logras algún avance, terminas cayendo en el caso del amor de los puerco-espines.

Para colmo de males repetimos la formula una y otra vez; pues no solo yo; infinidades de amigos me han comentado la gran cantidad de cosas que desean cambiarle a sus parejas; de liberarlas de esos conflictos de los cuales hay un inmenso surtido: los que no les gustan sifrinas las buscan sifrinas porque se creen el trompetista de Ligia Elena;  los que se las buscan auto-destructivas porque serán los heroes que las salvarán de la destrucción (es mejor montarse en una nave y salvar a la humanidad de un meteorito; es algo creo yo, más productivo); los que las buscan superficiales para convertirlas en Rosa Luxemburgo eternizada o aquellos incrédulos que las buscan con la única finalidad de convertirla en otra completamente distinta (al final de cuentas; por qué no las buscamos completamente distintas?).

Sé que muchas y muchos se sentirán aludidos; considero que este síndrome no tiene sexo (aunque la referencia Clara sea, precisamente, Clarita); así que proclamo lo que siempre cuando un amigo me cuenta sus problemas con alguna conflictiva mujer:

“NO VAS A HACER CAMINAR A CLARITA!, dejale ese trabajo a las películas de ficción, a Hollywood y a Pedro …

Al final de cuentas me quedo con Heidi … 😛

Mis dos bases de datos favoritas en SVG

Por si llegaras a necesitar (para alguna presentación, pancarta, valla, etc) el logo de nuestras dos más famosas y entrañables bases de datos libres; pero solo encontrabas la versión png; aqui les dejo las versiones SVG (pueden abrirlas con inkscape):

mySQL (shakila, el delfín que sabe de triggers)

mysql.png

PostgreSQL  (el simpático elefante azul)

postgresql.png

Una foto interesante

Pocas veces uno logra enfocar su cámara y lograr un espectáculo de paisaje como este:

 El Pico Bolivar al atardecer

Es cuando uno se da cuenta; que la vida es algo más que números, dinero, economía, tecnología o capitales …

Esta foto es como la vida, Disfrutenla! …

Plenitud de libertades y SL: respuesta a Ghostbar (I parte)

Ya hace bastante que no tenia de estas peleas (como las llama Francisco Palm “discusiones sabrosas”) sobre algún tema (o algunos) salidos de tono; pero bueno, a veces mucha tecnología abruma y es bueno desquitarse un poco hablando, como no, de política.

Este caso; donde Ghostbar intenta indicar que el Software Libre es igual (==) (gracias a dios no === idéntico) al liberalismo; mezclando tecnologías con política; como preámbulo, me trae a colación un caso particular presentado hace ya algún tiempo entre gubatron y koshrf sobre si el SL podía ser compatible con el neoliberalismo; en aquella época, esta fue mi respuesta:

http://www.jesuslara.com.ve/blog/2006/12/23/respuesta-a-gubatron-a-koshrf-y-a-todo-el-que-se-identifique/

Como hice el planteamiento en ese artículo, discutí cosas sobre como el SL es completamente inerte e inócuo a las formas de gobierno subyacentes (fijate la India, uno de los mayores productores de Ingenieros del mundo, con un gobierno tan desigual, o en malasia; con una especie de monarquia-dictadura; es gran productor de sofware libre).

Pero centremonos en este caso en las licencias; vemos como; por ejemplo, la GPL es una licencia que no prohibe comercialización; pero se deben mantener intactas las libertades; esto hace que no podamos “cerrar el código” si nos da la gana (una de las preciosuras del liberalismo, libertades individuales por encima de las colectivas) por lo que en efecto, en el SL van primero las libertades tecnicas, civiles y culturales que las económicas.

Y fijate como son las cosas; empresas nacidas en cunas del liberalismo; donde esperan que lo único que se cumpla son las metas económicas; ven como las libertades escenciales del SL hacen temblar sus negocios; esto declaró Microsoft en su cierre de año fiscal ante el departamento del tesoro; declarando sus “factores de riesgo del negocio” para el próximo año:
open source community-based projects”; alegan que mientras sus productos pueden ser “comercialmente adecuados”; los proyectos libres pueden ser más efectivos en lás áreas técnicas, de marketing y además “proyectos de software abierto dedican muchos esfuerzos en hacer sistemas complejos que (segun ellos) imitan las capacidades de su software”; irónicamente, en vez de pensar en hacer software de mejor calidad que los del SL; Microsoft asume que su posición debe ser “desarrollar productos de capacidad limitada o de funcionalidad muy muy básica para poder competir en precio con el SL”; ¿Competir en precio?; eso es lo único que saben hacer las empresas acostumbradas al “libertinaje del mercado” y no a “libertad de elección” por sobre los costos económicos.

Es la “Economía de Mercado” versus “La Economía del Regalo” (Eric Raymond).

Y claro, de ese artículo hay dos comentarios que no tienen desperdicio:

http://ghostbar.ath.cx/node/354#comment-901

“El libertarianismo es una corriente del liberalismo, pero NO es como tu señalas, un “liberalismo clásico” planteado en aquellos años de finales del siglo XVII.”; en libertarianismo es tan ambiguo y laxo como las formas de comunismo; en este caso, los “liberalistas clasicos” nacieron alrededor del siglo XX como un intento de “renovar” el liberalismo agregando algunas libertades extremas (incluso las libertades negativas) profesadas por el libertarianismo; de esa renovación nace el “neoliberalismo”; del cual, pienso yo, muchisimas millones de personas alrededor del mundo están en desacuerdo.

Sobre liberalismo y Libertarianismo:
Existen multiples formas del mismo; incluyendo en el saco a los anarco-sindicalistas, los social libertarios, todos libertarios de izquierda y van desde los que apoyan el partido republicano de los EUA hasta los completamente anticapitalistas (como es mi caso); por lo que declararse libertario en estos dias es bastante ambiguo sin una posición concreta.
Incluso Nohan Chomsky (del cual Chávez es fan de sus libros) es un anarquista socialista que odia el populismo, a marx, a los comunistas pero tambien a los capitalistas que creen que el imperialismo es la salida; conclusión, los hay de todos los gustos; asi que si realmente profesas el libertarianismo (y no el liberalismo) entonces creo que deberias dar fe de las libertades individuales; y de que la gente profese lo que mejor le venga en gana; sino, estarás convirtiendote en un intervencionista (un liberalista clásico) más.

El otro comentario agrega:

http://ghostbar.ath.cx/node/354#comment-902

“El software libre, se puede relacionar con los libertarios del lado socialista o liberal, de cualquier forma se le puede asociar, como liberal creo en el libre pensamiento, en el estado limitado, muchas cosas que se asocian también a los libertarios.”

En efecto, como acoto arriba, el libertarianismo puede ser asociado con corrientes de “derecha” e “izquierda” indistintamente; porque sobre la base de la libertad “económica”; estan las libertades civiles, de acción y cohecho que permiten a los ciudadanos hacer “lo que les venga en gana” sin más intervención que el imperio de la ley y evidentemente (en el caso de los anarquistas-socialistas, o como nos gusta llamarnos, socialistas libertarios) de evitar además el menoscabe de las libertades colectivas sobre las individuales (para permitirle la libertad individual de enriquecerse a un ciudadano, no le debo permitir que menoscabe la libertad colectiva del disfrute de salarios dignos o jornadas laborales decentes y ambientes de trabajo adecuados).

Pero además agrega:

“No podemos obligar un cambio de esa naturaleza (hablando del 3390) y menos en un país donde no hay planificación, entrenamiento y seguimiento… y un estado que quiere decirle a la gente hasta lo que tiene que comer.”

Estamos de acuerdo; el SL no debe obligarse su uso; pero como individuo el estado no te está obligando a ello; si deseas, puedes seguir comprandole tus licencias a Microsoft; el 3390 obliga a las instituciones del estado (no personas, no individuos, solo entes jurídicos dependientes del estado, el estado está en el albedrío de decidir lo que deben hacer sus entes dependientes, ya que estos no son empresas, son organismos legales de hecho) a “regularizar” una situación de uso de software y evidentemente el SL es una forma perfecta de regularizarlo; cumpliendo entre otras cosas; con la posibilidad de contribuir con la “soberania del país” al usar software perfectamente “destripable” donde nadie nos podrá meter un “troyano silente” o un “agujero de seguridad” obligado por alguna regla del “Homeland Security”.

Irónicamente; la NSA agrega parches de “seguridad” al código Windows (para evidentemente, permitirle acceso a equipos windows alrededor del mundo) pero internamente, sus servidores están en Solaris y Linux; no es interesante como funciona el SL en una economía capitalista-imperalista?.

Hay que dejar de confundir a las naciones que generan “mucho dinero” con las naciones “realmente libres”; en ese caso, las libertades económica por lo general NUNCA van de la mano con las libertades civiles (“la libertad del mercado no significa la libertad del consumidor; algo que muy muy bien conocemos las personas que habitamos en el mundo del software libre, ¿te gusta ese poder del Zune de borrarte la canción a la tercera vez que la escuchas para no tener que violar derechos de autor musicales o actas de DRM?; A mi me fascinaba la licencia de Java antes de la GPL; era más restrictiva que la propia EULA de Microsoft, si vives en un país como Venezuela ni te preocupa, pero Java no permitia su uso a Paises que tuvieran conflictos o intervenciones políticas o militares de los Estados Unidos; asi que si vivias en Afganistan, Cuba, Sri Lanka o Indonesia, evidente que no podias programar en Java, por muy gratuito que este fuera”); como dijera anteriormente “El Movimiento del Software Libre gira en torno al usuario y su libertad de elección, no en torno a una empresa (Microsoft) y su libertad de mercado; son dos cosas completamente distintas; Microsoft y su 90% de mercado es una idea de lo que pasa en un mercado globalizado, abierto, altamente intervendo y bajamente regularizado.”

Y claro, esta discusión me lleva a un segundo artículo, que como no he podido leer el documento completo de Francisco Palm; entonces me remito a contestar lo que le contesté a Ghostbar en su blog:

Sobre los gobiernos:

En ese artículo, Ghostbar nombra como “exitos del capitalismo” a las siguientes naciones:

“¿Te refieres a Taiwán? ¿Te refieres a Dubai? ¿Te refieres a Suecia? ¿Te refieres a Sur Corea? ¿Te refieres a Austria? Y eso que ellos han tenido que pasar por toda la burocracia de estado y son capitalismo exitosos!! Eso es estar super-comprobado de que el capitalismo definitivamente funciona!!” …

Que bueno que nombres esos “paraisos capitalistas” según tu; a ver …
Suecia:
Monarquia constitucional hereditaria, actualmente el parlamento lo dominan los socialdemocratas. (los derechos divinos monarquicos creo yo, van en contra de las igualdades individuales profesadas por el libertarianismo).
O acaso las monarquias no son una forma de despotismo?; veo que te encantaría tener un rey para leer su vida todos los meses en Hola!.

Dubai:

Un Emirato musulman lleno de petróleo con una monarquía liberal a nivel económico, pero a nivel de libertades no fue sino hasta el 2005 que se permitieron las religiones “no oficiales” como los catolicos o los protestantes; con derechos civiles mermados bajo la excusa del coran e incluso la gran mayoria de las grandes y hermosas obras son construidas por pakistaníes, iranies e indues trabajando en condiciones infra-humanas (toda una falsa de liberalismo pues!).
Corea del Sur:
Esto es todo un caso; como sabrás, tus libertades civiles y económicas pueden estar completamente desconectadas del poder politico sub-yacente; en este caso, Corea del Sur ha tenido los periodos politicos más inestables de cualquier nacion asiatica, ha pasado de destituir presidentes por fraude electoral o por crear inexistentes crisis economicas para obtener fondos del FMI y fraudulentamente hacer gastos; su gobierno es una social-democracia representativa; sin embargo, eso no ha molestado a las grandes empresas para hacer crecer su economia.
En este caso, por qué la gente no deja de marchar y simplemente se pone a trabajar como lo hacen allá?.
Taiwan:
Como toda nación con una compleja situación politica (nacida de la renuncia de japon y de los protectorados ingleses, pero intervenida por China desde los años 60; siempre se mantuvo el regimen de libertad “economica” más no social, siendo una dictadura del KMT (Partido Popular de China) hasta el año 2000; donde por fin y por primera vez gana un partido no comunista); gobernado por una mezcla inconforme de comunistas (Kuonmingtan), Socialistas (alianza Panazul) y otros grupos tanto pro-independentistas como por la unificación con china; esta inestabilidad política tampoco lo hace el “capitalismo puro” que quisieras poner de ejemplo.
Que produzcan mucho dinero, no significa que sus ciudadanos gocen de libertades civiles; sino, mira el caso de China.
Austria:
Una republica federal y parlamentaria; donde son los consejos de estado (y no los ciudadanos) los que eligen la camara alta; es una sociedad de corte social; ya que a diferencia de los liberales de mercado; Austria gasta más del 30% de su presupuesto en labores sociales; apoyo a los necesidados y es el unico sistema de seguridad social de europa que incluye a las personas necesitadas o carentes de empleo; para ello el Estado se reserva el derecho sobre algunas empresas, sobre el financiamiento del Seguro y sobre su organización, para poder mantener este apoyo a los necesitados (a mi punto de ver, son un gobierno federativo, social-demócrata con tendencias socialistas).

Todos los ejemplos que haz puesto son naciones que realmente no son los “capitalismos plenos” que tu intentas profesar; para la próxima, ubica mejor los ejemplos.

En este caso, creo que lo que ha dicho Francisco Palm:

El pleno capitalismo, sin restricciones de ningún tipo, con igualdad total de oportunidades, -no-ha-existido-nunca- de hecho se ha practicado menos que cualquier intento de socialismo… Bajo ese estado de cosas ¿cómo puede estar super-comprobado?”

Es completamente correcto; el capitalismo puro no existe; como no existe el socialismo libertario puro; asi que basta de grandes estupideces de este tipo.

Pero lo que denota de los comentarios y los ejemplos acotados; es que realmente las libertades civiles individuales y las colectivas te importan un bledo; lo que te interesa es la libertad económica de las empresas por encima de los intereses sociales y los intereses colectivos; por lo que el querer seguir usando las libertades civiles como “excusa” es simplemente una mamarrachada (como en el ejemplo de decir que Taiwan es “libre” porque dijo “se pueden hacer empresas”; claro, quien dió la orden fue el partido comunista gobernante hasta la fecha, o crees que Taiwan tiene esos millones de dólares del 2000 para acá?).

En la segunda parte; trataré de leer el artículo de FPalm para tener una vision mas objetiva del asunto …

NO sin antes, cierro el artículo con la misma cita con la que cierro el anterior:

Donde estén las libertades de pensamiento y no donde estén las libertades económicas es donde estará el Software Libre; quien diga lo contrario, que lo demuestre! â?¦”

php5 DOM getElement versus XPATH

En una de las tantas pruebas que le he realizado a mi toolkit de manejo de XML (tomates xml) he llegado a la pregunta que muchos se habrán hecho; en vista que jquery usa XPATH para hacer busquedas y realmente es mucho más rapido que otros toolkits en javascript; ¿sucederá lo mismo con php5?, ¿quien será más rápido?, ¿DOM getElement o XPATH?; bueno, vamos a comprobarlo.

La librería:

una librería DOM XML que posee un método extendido llamado get; su código:

//retorna un nodo especificado como nodo dom:
public function get($name) {
if ($name) {
$node = $this->getElementById($name);
if ($node) {
return $node;
} else {
throw new splib_exception("Debe especificar un nombre de nodo valido: {$name} no existe");
return false;
}
} else {
throw new splib_exception("debe especificar un nombre de nodo valido");
}
}

He agregado luego una función para buscar usando xpath:

//un get basado en xpath
public function getXpath($name) {
if ($name) {
$node = $this->_xpath->query("//*[@id='{$name}']");
if ($node) {
return $node;
} else {
throw new splib_exception("Debe especificar un nombre de nodo valido: {$name} no existe");
return false;
}
} else {
throw new splib_exception("debe especificar un nombre de nodo valido");
}
}

Para la función anterior debemos primero crear un objeto xpath:

//gestor de busquedas xpath
$this->_xpath = new DOMXPath($this);

Y dos funciones más que buscan etiquetas (tags) y no id:

query usa xpath->query

//hace una consulta xpath sobre el arbol actual:
public function query($q, $item = null) {
if ($q) {
$node = $this->_xpath->query($q);
}
if ($node){
if ($item) {
return $node->item($item);
} elseif ($node->length == 1) {
#como no hay 2 items, devuelvo el unico que existe
return $node->item(0);
} else {
#retorno una serie de items, como elementos dom_element
return $node;
}
} else {
return false;
}
}

y element usa getElementsByTagName

#retorna uno o una coleccion de elementos xml en forma de nodos DOM
public function element($name, $item = null) {
if ($name) {
$node = $this->getElementsByTagName($name);
if ($node){
if ($item) {
return $node->item($item);
} elseif ($node->length == 1) {
#como no hay 2 items, devuelvo el unico que existe
return $node->item(0);
} else {
#retorno una serie de items, como elementos dom_element
return $node;
}
} else {
return false;
}
} else {
throw new splib_exception('debe especificar un nombre de elemento');
}
}

Las pruebas:

Ejecutamos ambas funciones sobre un documento HTML cualquiera 10 mil veces:

$this->_html = new splib_dom();
$this->_html->load('pruebas/index.html');
splib_config::start_clock();
for($i=1;$i _html->get('main');
}
echo 'busqueda basada en getElementById: ' . splib_config::time_elapsed() . '
'; splib_config::start_clock(); for($i=1;$i _html->getXpath('main'); } echo 'busqueda basada en xpath: ' . splib_config::time_elapsed() . '
'; splib_config::start_clock(); for($i=1;$i _html->element('title'); } echo 'busqueda basada en getElementsByTagName: ' . splib_config::time_elapsed() . '
'; splib_config::start_clock(); for($i=1;$i _html->query('html/head/title'); } echo 'busqueda basada en query XPATH /html/head/title: ' . splib_config::time_elapsed() . '
';

La idea es que cualquiera puede sustituir splib_dom por new DOMDocument (splib_dom es una extensión directa de DOMDocument con más funciones); y splib_config es una clase que uso para obtener informacion (en este caso; lleva un contador usando la funcion microtime()).

Los resultados son interesantes:

busqueda basada en getElementById: 0.06926 s
busqueda basada en xpath: 0.15377 s
busqueda basada en getElementsByTagName: 0.12167 s
busqueda basada en query XPATH /html/head/title: 0.15929 s

Como veremos; las búsquedas basadas en getElementById son muchisimo más rápidas que su contraparte búsqueda via xpath; igualmente las búsquedas via getElementsByTagName son más rápidas que la búsqueda via nodos xpath (aunque en este caso; es más util buscar usando paths de XPATH cuando se desea un mayor control sobre las busquedas).

Bueno, para todo el que tenía la duda, he aqui la respuesta.

Seguimiento a las metas del Milenio

Si quieres saber como están progresando los países en cumplir las metas del milenio (establecidas en el año 2000 para ser cumplidas antes del 2015) puedes visitar esta página web de la ONU (auspiciada por Google) para observar las estadísticas de como se han cumplido las metas del milenio en todos los países:

http://www.mdgmonitor.org/map.cfm?goal=&indicator=&cd=862
Se las recomiendo; encontrarán bastante información sobre el avance de las metas del milenio en Venezuela y el mundo; para recordarles esas metas son 8:

 

  1. Reducción de la pobreza

  2. Educación (sobre todo acceso a la escuela primaria)

  3. Igualdad de la mujer

  4. Mortalidad Infantíl

  5. Salud Maternal

  6. Enfermedades

  7. Medio Ambiente

  8. Desarrollo

Dichas estadísticas (para los que digan que son manipuladas medíaticamente por los gobiernos); son llevadas a cabo por el DESA, la UNESCO y UNICEF.

Destacan notablemente (para mi sorpresa tal vez); que un país petrolero como Venezuela solo lance a la atmosfera 6 Toneladas Métricas de CO2 per Cápita; pero que por ejemplo, USA emita 20 Toneladas Métricas de CO2 per cápita; con razón no desean firmar el protocolo de Kioto para reducción de emisiones; es que es más barato ser productivo que ser ecológicamente sustentable.

Otras estadísticas interesantes las obtenemos al descargar la metadata usada para hacer el mapa; un ejemplo es que Venezuela pasó de 90 mil usuarios con Internet en el año 1998 a 2 millones 312 usuarios para el 2006; o cosas como el 0.08% de la población con  líneas telefónicas celulares en 1990 a 8.65% de la población en 1998 hemos pasado al 69.04% en el 2007; una evidencia de mi sospecha de que la gente prefiere los celulares a las líneas telefónicas convencionales.

En el área de protección al medio ambiente; hemos pasado de un 39% en 1990 a un increíble 62% de zonas protegidas por régimenes especiales de explotación o por parques nacionales; contrasta enormemente con USA; que aun teniendo un territorio tan vasto; solo posee un 23% de territorio reglamentado como protegido.

La data en bruto para todos estos cálculos estan en:

http://mdgs.un.org/unsd/mdg/Default.aspx 

A %d blogueros les gusta esto: