Aserciones II: Teoría

En el tema recién expuesto de Aserciones no se ha hecho análisis profundo de la teoría detrás. Sin embargo, no está demás dar la interpretación de un estricto profesor de Teoría de Programación Orientada a Objetos (Medardo Rodríguez, por demás excelente profesor). Así que aquí les va el mismo tema (en catarsis)

Busquemos principios conceptuales en todo lo que hagamos:

  • Las restricciones son predicados que deben cumplirse para todo t elemento de T (conjunto con dominio tiempo)
  • Definamos predicado como «P: X -> {true,false}», X es una relación determinada de objetos (valores). Por ejemplo, los parámetros de una función.
  • En las precondiciones, postcondiciones, y los «assert» tradicionales; T tiene cardinalidad igual a 1.
  • Las precondiciones y postcondiciones más comunes (no las únicas) son las que definen respectivamente a T={instante de la llamada de una función} y T={instante en que una función termina}. Llevan esos nombres porque se refieren a un cuerpo dinámico cualquiera y se usa precondición si se aplica en el instante anterior o posterior al cuerpo.
  • En las invariantes, T es un conjunto acotado con cardinalidad > 1.
  • Los «assert» tradicionales se puede aplicar en cualquier instante casi siempre con una semántica a determinar por el contexto (ésta podría ser una precondición, una postcondición o la evaluación de una invariante para cualquier t elemento de su T.
  • En teoría de programación hay muchos usos de las restricciones, no sólo los de Eiffel. En la lógica de Floyd-Hoare sobre las «Bases axiomáticas de la programación de computadoras» se usan para definir la correctitud (cómo se dice eso en español) de los programas estructurados o algorítmicos. Ver http://en.wikipedia.org/wiki/Loop_invariant.
  • Las clases pueden definir invariantes donde la relación X es una de sus facetas (una faceta es un subconjunto de los atributos de un objeto cuyas fronteras lógicas están bien definidas).

Hay que dejar claro que cuando se habla de «Invariantes de Clases» se refieren a las definiciones, porque las invariantes siempre están en el plano de los objetos.

¿Como les quedó el ojo?  ;-)

El fingidor

El poeta es un fingidor
finge tan completamente
que hasta finge que es dolor
el dolor que en verdad siente

Fernando Pessoa

Aserciones

Estoy recuperando algunos de los correos de una lista de un curso de Python al que asistí hace ya un tiempo. Y como mi interés por Python en estos días ha crecido, pues aquí expongo algunos temas que me resultaron de gran interés. Servirán además como base de muestra de los conocimientos que voy adquiriendo, y como reto, para que aquellos que hayan ya pasado por algunos de estos temas, discutan sobre el mismo, y todo redunde en una mejor comprensión. Pues nada... esto es un pequeño bocadillo acerca de aserciones en Python.

Aserciones

Las aserciones son condiciones que pueden clasificarse en precondiciones, postcondiciones e invariantes. Las precondiciones y las postcondiciones  están asociadas a las funciones de las clases y las invariantes se aplican a toda la clase.

Una precondición debe cumplirse como requisito para ejecutar la función a la que esta asociada, mientras que de una postcondición podría decirse algo así «si esta función se ejecutó correctamente, entonces debería cumplirse esto otro» y las invariantes debe cumplirse en todo momento del trabajo de la clase.

Una cosa si debe quedar claro, las aserciones no sustituyen las instrucciones if..then , ni las excepciones, ni otras instrucciones de control de datos. pueden existir problemas que no tienen porque ser controladas por las aserciones y que deben ser tratadas.

Hay muchos problemas que se van de la mano del programador y/o de la computadora. Las  precondiciones/postcondiciones dicen: «si tus datos cumplen esto, y la función se ejecuta sin problemas, entonces yo te garantizo esto otro». Es decir, si hay resultados, entonces serán correctos. (Un caso en que no hay resultado, por ejemplo, podría ocurrir si estoy leyendo de la red y se cae la red).

Mininova cierra y se buscan alternativas

Para aquellos que gustan de descargas por torrent, se encontraba siempre disponible uno de los mejores trackers de la red P2P. Pero ahora se “convierte” a la fe de las más estricta y férrea legalidad. ¿Qué hacer ahora cuando deseamos buscar contenido que no aparece en otros sitios?

Aquí les dejo una lista de los algunos trackers que pueden sustituir a Mininova en su función.

  1. Vertor
  2. SeedPeer
  3. Torrentreactor
  4. Alive Torrents
  5. KickassTorrents
  6. BTjunkie
  7. isoHunt (muy recomendado)
  8. yourBitTorrent
  9. The Pirate Bay
  10. Fulldls
  11. EZTV
  12. UKNova
  13. TorrentBytes
  14. Legal Torrents
  15. Linux Tracker
  16. Monova
  17. YouTorrent
  18. ExtraTorrents
  19. Torrentz
  20. Torrentzap
  21. FlixFlux
  22. ShareReactor

En imágenes: Temporada 1-Episodio 1

En imágenes es una serie de artículos en los que se plasma sitios, sucesos, ideas… y todo … en imágenes.

En este episodio les presento algunos parajes de La Habana, Cuba, de las década de los '50.

image001[6] image002[1] image003[2] image004[2]    image005[3] image006[2] image007[1] image008[1] image009[1]

Diseño de software

Hay dos formas de diseñar software: la primera es hacerlo tan simple
que obviamente no hay deficiencias y la segunda es hacerlo tan
complicado que no hay deficiencias obvias. La primera forma es mucho
mejor y más difícil

C.A.R. Hoare

Inconformidades con Python

logo

Uno de los lenguajes que más me ha encantado con sólo ver el "Hola Mundo", es Python. Todas las cosas que ofrece me parecen tan naturales en el lenguaje ideal que todo pedimos una vez al Señor.
Una de las cosas que más me llamó la atención fue la propuesta de rapidez a la vez que flexibilidad, y junto a todo multiplataforma.
Y es en este punto donde quiero centrarme, ya que en recientes trabajos he tenido que implementar ciertas bibliotecas en las que existen grandes diferencias de funcionamiento entre una y otra plataforma. Por ejemplo un método que nos devuelva información acerca de los discos lógicos de la PC, es una sencillez para los sistemas unix-like. Sin embargo para Windows no existe nada estándar al respecto ¿Qué hacer?
En fórums y listas de discusiones, las argumentaciones sobre el tema van desde hacer la solución dependiente de la plataforma, hasta la creación de un entorno de sistemas de ficheros virtuales que encapsule toda funcionalidad de este tipo.
Me pregunto ahora si en verdad es tan multiplataforma, cuando muchas funciones útiles tienen limitantes similares.
Les dejo algunos enlaces para los que se enfrentan al problema de ejemplo:

http://code.google.com/p/pyfilesystem/

http://timgolden.me.uk/python/wmi_cookbook.html

Asimilación

day019 En una organización X vuelve a estudiarse la posibilidad de la implantación de una metodología de trabajo que optimice el desarrollo de software... Vaya que optimice... que haga efectiva tanta fuerza de trabajo puesta en función de una actividad. Pero resulta que esta tarea no es de las más fáciles en el mundo actual; un mundo en el que la palabra "organigrama" tiene tanto poder de convencimiento.

Pues es que en las organizaciones en las que más entusiasmo se observa por las nuevas formas de hacer, existe cierta estructura jerárquica sobre la que se han concedido determinados beneficios que minan cualquier intento en hacer de esta un mecanismo efectivo (que ni siquiera eficiente). Es pues imprescindible el estudio de las causas que provocan que la asimilación de cualquier metodología, proceso o pseudo-proceso sea un martirio y finalmente un despropósito para la propia organización y sus miembros.

Veamos que una buena parte de estas organizaciones poseen estructuras jerárquicas totalmente verticalizadas, con cuatro o cinco niveles de dirección; contando, sin embargo, con menos de 80 trabajadores que estén vinculados directamente con la actividad de la organización y otros 120 como equipo de soporte en el que se incluyen todas las áreas que cubren la logística, técnica y control. Estas estructuras muchas veces crecen cada vez más con la promesa de que cambios profundos traerán mejores resultados en la gestión. Pero, este crecimiento a una mayor verticalización del organigrama... ¿Será beneficioso? ¿Para quién?

Ahora se nos da LA MISIÓN de evangelizar la organización hacia una cultura del logro (pura abstracción burocrática). Para esto, como snobs de nuestro tiempo, buscamos la metodología de moda, con una combinación letal, aquella que más bombo pero menos conocedores tenga. De tal forma que en nuestro puesto de CME (Chief Methodology Evangelist)... nuestras decisiones sean más alabadas que criticadas. Un reto de la asimilación es mapear una gestión de roles, como proponen muchas metodologías, con el organigrama, y concretar así el ansiado cambio. Los miembros de la jerarquía al sentirse aún con poder, pero poco a poco excluidos, minarán el proceso (claro mecanismo de supervivencia en un mundo en el que han quedado atrás). Otros tratarán de camuflarse bajo alardes de flexibilidad imponiendo criterios que echarán por la borda todo intento de éxito.

Lo reconozco... todo lo que les expongo, constituye quizás el peor de los escenarios; pero es que el poder que se alcanza con un arte milenario tantas veces aprendido, es difícil dejarlo ir por la mera adaptación al cambio (sobrevalorado... dicen).

;-)

Los Grupos del Mundial de Fútbol 2010

Así quedaron los grupos del Mundial después del sorteo

Grupo A
Grupo B
Grupo C
Grupo D
Sudáfrica
Argentina
Inglaterra
Alemania
México
Nigeria
Estados Unidos
Australia
Uruguay
Corea del Sur
Argelia
Serbia
Francia
Grecia
Eslovenia
Ghana

Grupo E
Grupo F
Grupo G
Grupo H
Holanda
Italia
Brasil
España
Dinamarca
Paraguay
Corea del Norte
Suiza
Japón
Nueva Zelanda
Costa de Marfil
Honduras
Camerún
Eslovaquia
Portugal
Chile

Si quiere conocer un poco más acerca de las ciudades que serán sede del mundial, revise nuestra serie acerca de las sedes:

Messi recibe al Balón de Oro

messi

Dedico el Balón de Oro a mis compañeros, comparto este trofeo con ellos. Estoy muy contento de ser no solo el primer argentino que lo gana, sino también el primero formado en la cantera del Barcelona. Gracias a mi familia, a mis amigos y especialmente a mis hermanos, que siempre están ahí para mí

Así agradecía Messi la entrega del Balón de Oro, en la que ha arrasado con las estadísticas. Es el que más porcentaje ha alcanzada jamás en la votación con 473 puntos, más del doble que su principal contrincante Cristiano Ronaldo (233 puntos).

Este chamaco el lo máximo; desde que salió por primera vez en los grandes escenarios, todos los amantes del fútbol lo seguían por su increíble velocidad y habilidad para descolocar cualquier defensa.

Esperamos muchos más de él en esta campaña, y los seguidores de Argentina de seguro lo ven como su carta más segura frente al Mundial que se avecina.

¡¡¡Felicidades!!!

Mundial de Fútbol Sudáfrica 2010. Las sedes: III parte y final

logo

Este es el último artículo de una serie que recorrió las sedes del próximo Mundial de Fútbol (Ver 1ra parte, 2da parte). Aquí les entregamos las últimas tres ciudades que tendrán actividad futbolística. … ;-)

Rustenburg

Situada en la sabana de Bushveld, es una región roca en minerales que cuenta con dos de las minas de platino más grandes del mundo. El estadio Royal Bafokeng es el más pequeño de los que presenta Sudáfrica para el Mundial, con cabida para 42.000 espectadores.

Polokwane

Esta ciudad, donde se encuentra el baobab, el árbol más grande de África, tiene frontera con tres países del continente: Botsuana, Zimbabue y Mozambique. Está considerada como un lugar de mitos y leyendas dado que ha sido habitada por varias tribus indígenas a lo largo de su historia. En el estadio de la ciudad, el Meter Mokaba, uno de los cinco que se han construido con motivo del Mundial, es en el que debutó Drogba como internacional y tiene una capacidad de 45.000 asientos.

Nelspruit

Rodeada de grandes reservas naturales, acantilados y cataratas, fue fundada por la familia Nel a principios del siglo XX. El estadio de la ciudad es el Mbombela, que significa en "siswati", una de las lenguas oficiales de la zona, “muchas personas juntas en un lugar pequeño”. Albergará partidos de la primera fase y de los octavos de final y tiene capacidad para 46.000 espectadores.

Mundial de Fútbol Sudáfrica 2010. Las sedes: II parte

logo

Esta es la segunda entrega de las sedes del Mundial de Fútbol Sudáfrica 2010 (Ver 1ra parte). Una pequeña explicación de la ciudad y del estadio sede de los partidos. ¡Disfruten de la previa del primer mundial en el Continente Negro!   ;-)

Pretoria

Es la capital de Sudáfrica y es donde residen innumerables embajadas. Aquí se celebró el llamado "juicio de la traición de Rivonia" (1963-1964), que dictó el encarcelamiento de Nelson Mandela, entre otros. Es uno de los focos futbolísticos del país y de su cantera han salido algunos de los mejores jugadores de Sudáfrica. El estadio de la ciudad es el Loftus Versfeld, uno de los más antiguos del país y en el que Sudáfrica logró la primera victoria ante un equipo europeo, Suecia (1-0). Tiene capacidad para 50.000 espectadores.

Durban

Situada en la costa oeste del país, es la tercera ciudad más grande y posee el puerto más concurrido de África. Cuenta, además, con la llamada “milla de oro”: cuatro kilómetros de paseo, playa y restaurantes. Su estadio, el Moses Mabhida, será la sede de una de las dos semifinales del Mundial. Ha sido construido específicamente para el campeonato y tiene capacidad para 70.000 espectadores.

Bloemfontein

La ciudad donde nació J.J. Tolkien, autor de la saga de “El señor de los anillos”, es la capital judicial de Sudáfrica y es popular por tener la afición más colorida y animada del país. Su estadio, el Free State (o Vodacom Park), ha sido ampliado para que tenga espacio para 48.000 personas y fue la sede de España en la Copa Confederaciones del 2009.

Servicios de Windows y timers en .Net

Hacer un servicio de Windows usando la plataforma .Net y Visual Studio es realmente sencillo. Como sucede con casi todas las herramientas de desarrollo de Microsoft, … la facilidad tiene su precio. Y es que después de comenzar a codificar un servicio y de hacer las primeras pruebas nos enfrentamos a algunos detalles a tener en cuenta.

Uno de estos es el uso de timers en los servicios de Windows. En .Net tenemos tres tipos de Timers (¡increíble! pero cierto), y su uso se explica en este artículo de MSDN.

La cuestión principal a saber con respecto a Timers y servicios es que en estos no se puede usar el Timer que deriva de la clase de componentes de Windows Forms; se recomienda el uso de System.Timers.Timer.

Otro detalle a tener en cuenta es en qué sistema operativo se va a desplegar. Si va a ser en una de las versiones para servidores de Windows se debe tener en cuenta que la cuenta sobre la que debe operar el servicio debe ser LocalSystem.

Parecen pequeños detalles insignificantes, pero estos fueron los que me hicieron perder una jornada de trabajo. Ya que no dan errores, ni levantan excepciones, simplemente no funcionan. Estos detalles no los encontraran en ningún tutorial, ni manual; sólo se tropezarán con ellos cuando estén en fase de despliegue.

Espero que les ayude… ;-)

Mundial de Fútbol Sudáfrica 2010. Las sedes: I parte

logo

Con esta serie Moropo les brinda un compendio de las ciudades que serán sede de los partidos del Mundial de Fútbol Sudáfrica 2010

Johannesburgo

La ciudad más grande de Sudáfrica es el centro financiero del país, con una gran oferta cultural y multitud de zonas verdes. Alberga a los dos equipos más importantes del país, el Orlando Pirates y el Kaizer Chiefs. Tiene dos estadios: el Soccer City, donde se disputará el partido inaugural, cuatro de la primera ronda, uno de octavos de final, otro de cuartos de final y la final, con cabida para 94.000 espectadores, y el Ellis Park (o Coca-Cola Park), donde se disputó la final de la Copa Confederaciones 2009.

Ciudad del Cabo

Es la capital legislativa de Sudáfrica y la segunda ciudad más grande del país. Es famosa por su puerto, que fue uno de los más importantes de la “ruta de las especias” hacia la India. En ella han nacido grandes futbolistas de la historia de la selección, como Benny McCarthy, Shaun Bartlett, Albert Johannensen y David Julios. El estadio que acogerá los partidos en Ciudad del Cabo será el Green Point, de nueva construcción y situado cerca del mar con capacidad para 70.000 espectadores y en él se disputará una de las semifinales del Mundial.

Puerto Elizabeth

Renombrada como Bahía Nelson Mandela en homenaje al primer presidente democrático de Sudáfrica, que reside en esta ciudad, está situada al sur del país y es uno de sus principales puertos. Está rodeada por 40 kilómetros de playas, lo que la hace un destino turístico preferente dentro del país. En una ciudad en la que no existen equipos de fútbol profesionales, el estadio Nelson Mandela es el primero dedicado en exclusiva al fútbol y construido especialmente para el Mundial y será el escenario del partido por el tercer y cuarto puesto.

El resto de las ciudades en próximos artículos. ;-)

Errores graciosos en Linux/Unix

Estos errores fueron encontrados en viejos grupos de noticias.

  1. FATAL system error #nnnn CAUSE: We should never get here!
  2. OHHHH…. I give up Core dumped
  3. ERROR: A really big FUCK UP has been detected !!
  4. “Keyboard not present, press any key”
  5. “You lied to me when you told me this was a program”
  6. “PROGRAMMER GOOFED . . . YOU SHOULD NEVER SEE THIS MESSAGE”
  7. YOU CAN’T DO THAT!
  8. Man the Lifeboats! Women and children first!
  9. That makes 100 errors; please try again.
  10. You can now delete more, or insert, or whatever.
  11. Sorry, I don’t know how to help in this situation.
  12. Maybe you should try asking a human?
  13. Sorry, I already gave what help I could…
  14. An error might have occurred before I noticed any problems.
  15. If all else fails, read the instructions.
  16. This can’t happen.
  17. I’m broken. Please show this to someone who can fix can fix
  18. I can’t go on meeting you like this.
  19. BAD.
  20. A funny symbol that I can’t read has just been input.  Continue, and I’ll forget that it ever happened.
  21. I suspect you’ve forgotten a `}’, causing me to apply this control sequence to too much text. How can we recover? My plan is to forget the whole thing and hope for the best.
  22. Dimensions can be in units of em, ex, in, pt, pc, cm, mm, dd, cc, bp, or sp; but yours is a new one!
  23. Something Rotten in Denmark, Interp Stack Not ALigned
  24. ILLEGAL ERROR
  25. bad magic number
  26. “very funny”
  27. “Unexpected ‘;’, expecting ‘;’”
  28. You can’t do that in horizontal mode.
  29. Can’t cast a void type to type void (because the ANSI spec. says so, that’s why)
  30. Huh ?
  31. can’t go mucking with a ‘void *’
  32. we already did this function
  33. This label is the target of a goto from outside of the block containing this label AND this block has an automatic variable with an initializer AND your window wasn’t wide enough to read this whole error message
  34. “Your expression has defeated me”
  35. “Your formula has defeated me”
  36. WARNING: 54 - PROGRAM NOT RECURSIVE
  37. Help is not available for you.
  38. Masscomp C compiler:”Insane structure member list”
  39. User Error: An unknown error has occurred in an unidentified program while executing an unimplemented function at an undefined address. Correct error and resubmit.
  40. Liar, Liar! Pants on Fire!
  41. Error: Success

Thunderbird 3 RC2

La tan esperada versión 3 del cliente de mensajería de Mozilla acaba de llegar a un hito importante el Release Candidate 2. A este momento se llega luego de una larga fase de depuraciones en las betas y RC1 anteriores. Pueden consultarse las notas del lanzamiento en este enlace: http://www.mozillamessaging.com/en-US/thunderbird/3.0rc2/releasenotes/

Entre las mejores notables de la versión 3 sobre la 2 de Mozilla Thunderbird se encuentra la utilización del motor de render Gecko 1.9.1.5, brindando mejoras en desempeño, estabilidad y compatibilidad con los estándares web. Podemos hallar además en esta versión una mejorada búsqueda con filtros avanzados y autocompletamiento; además de la tan solicitada funcionalidad soporte de pestañas.

Estas son sólo algunas de las novedades de esta entrega, esperemos que la versión estable no sufra otro atraso como lamentablemente ha sucedido a menudo con este proyecto de Mozilla.

Calcular el checksum en MD5 ó SHA1 de un fichero

Muchas veces necesitamos un identificador único para un fichero, que nos garantice además una diferenciación frente a cambios que se puedan producir en el fichero. Uno de los mecanismos ampliamente utilizados es la creación de un checksum (valor numérico que se calcula usando la información de un fichero). Existen muchos algoritmos matemáticos para esta tarea, pero los más extendidos con MD5 y SHA1.
Aquí les presento una función en C# que les permitirá calcular el checksum MD5 y SHA1 de determinado fichero.
Para MD5:
// Genera hash MD5
protected string GetMD5HashFromFile(string fileName)
{
MD5 md5 = MD5.Create();
StringBuilder sb = new StringBuilder();

using (FileStream fs = File.Open(fileName, FileMode.Open))
foreach (byte b in md5.ComputeHash(fs))
sb.Append(b.ToString("x2").ToLower());
return sb.ToString();
}
Para SHA1:
// Genera hash SHA1
protected string GetSHA1HashFromFile(string fileName)
{
SHA1 sha1 = SHA1.Create();
StringBuilder sb = new StringBuilder();

using (FileStream fs = File.Open(fileName, FileMode.Open))
foreach (byte b in sha1.ComputeHash(fs))
sb.Append(b.ToString("x2").ToLower());
return sb.ToString();
}
Recuerden siempre poner en uso las bibliotecas criptográficas de .Net
using System;
using System.Security.Cryptography;
using System.IO;

jQuery y las referencias en las MasterPages de ASP.Net

La siguiente situación se da con el uso de jQuery y plantillas en ASP.Net, pero bien podría repetirse con cualquier librería javascript que usemos en nuestras aplicaciones. Luego de hacer las pruebas correspondientes en nuestras páginas, muchos desarrolladores optan por mover a las MasterPages aquellas referencias comunes, como es el caso de jQuery y algunos plugins indispensables.
Uno de los detalles a tener en cuenta es el uso de ContentPlaceHolder
  <head runat="server">
    <asp:contentplaceholder id="head" runat="server">
    </asp:contentplaceholder>
    <script type='text/javascript' src='scripts/jquery-1.3.2.js'></script>
  </head>
En el código anterior se carga el segmento de código propio de cada página antes de que se cargue jQuery. Por tanto cualquier referencia a jQuery en estos segmentos de código devolverán errores, ya que jQuery no se carga sino después de llamado el segmento.El código arreglado quedaría de la siguiente forma:
  <head runat="server">
    <script type='text/javascript' src='scripts/jquery-1.3.2.js'></script>
    <asp:contentplaceholder id="head" runat="server">
    </asp:contentplaceholder>
  </head>
Parece una simpleza, pero esta sencillez puede determinar muchos de los errores a los que nos enfrentamos con javascript… el orden en el que los navegadores ejecutan las sentencias.Otras de las cuestiones problemáticas con el uso de MasterPages es el tratamiento a los caminos relativos; principalmente cuando en nuestro sitio usamos, para una mejor organización, una jerarquía de carpetas. Para evitar todos los problemas que se puedan derivar de esta situación recomiendo fuertemente el uso de ResolveUrl.
El código final quedaría así:
  <head runat="server">
    <script type='text/javascript' src='<%= ResolveUrl ("~/scripts/jquery-1.3.2.js") %>'></script>
    <asp:contentplaceholder id="head" runat="server">
    </asp:contentplaceholder>
  </head>
Cualquier otra solución que encuentren, siéntanse libres de comentar.

Esquema de base de datos multilenguaje

En el desarrollo de una aplicación que soporte múltiples lenguajes, siempre aparece la interrogante ¿Cómo manejar el contenido de la base de datos?

Los textos que aparecen en la interfaz gráfica de cualquier aplicación han sido ampliamente abordados, y existen varias soluciones todas ellas factibles. Pero cómo lograr de forma eficiente, que el contenido de nuestras tablas coexista en diferentes versiones (tantas como lenguajes soporte nuestra aplicación), y se mantenga intacta a su vez la integridad referencial de nuestro esquema.

Existen muchas formas de como llegar ese “estado ideal”; en este artículo proponemos una de las soluciones, que puede estar sujeta a todo tipo de crítica (afortunadamente). En artículos posteriores expondré otras propuestas.

En la imagen podrán ver el modelo:

multilanguage-schema

En esta solución se crea una tabla paralela con los campos que pueden tener contenido en diferentes idiomas. Esta idea es particularmente útil cuando quieres mantener consistente cualquier nivel de normalización tu base de datos.

Aquí les dejo la consulta de creación de este esquema en MySQL:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
USE `mydb`;

-- -----------------------------------------------------
-- Table `mydb`.`Categoría`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Categoría` (
`Id` INT NOT NULL AUTO_INCREMENT ,
PRIMARY KEY (`Id`) );


-- -----------------------------------------------------
-- Table `mydb`.`Artículo`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Artículo` (
`Id` INT NOT NULL ,
`Categoría_Id` INT NULL ,
PRIMARY KEY (`Id`) ,
INDEX `fk_Artículo_Categoría` (`Categoría_Id` ASC) ,
CONSTRAINT `fk_Artículo_Categoría`
FOREIGN KEY (`Categoría_Id` )
REFERENCES `mydb`.`Categoría` (`Id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION);


-- -----------------------------------------------------
-- Table `mydb`.`Cultura`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Cultura` (
`Id` INT NOT NULL AUTO_INCREMENT ,
`Nombre` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`Id`) );


-- -----------------------------------------------------
-- Table `mydb`.`Artículo_Locale`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Artículo_Locale` (
`Artículo_Id` INT NOT NULL ,
`Cultura_Id` INT NOT NULL ,
`Titulo` VARCHAR(255) NOT NULL ,
`Cuerpo` TEXT NULL ,
PRIMARY KEY (`Artículo_Id`, `Cultura_Id`) ,
INDEX `fk_Artículo_has_Cultura_Artículo` (`Artículo_Id` ASC) ,
INDEX `fk_Artículo_has_Cultura_Cultura` (`Cultura_Id` ASC) ,
CONSTRAINT `fk_Artículo_has_Cultura_Artículo`
FOREIGN KEY (`Artículo_Id` )
REFERENCES `mydb`.`Artículo` (`Id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Artículo_has_Cultura_Cultura`
FOREIGN KEY (`Cultura_Id` )
REFERENCES `mydb`.`Cultura` (`Id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION);


-- -----------------------------------------------------
-- Table `mydb`.`Categoría_Locale`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Categoría_Locale` (
`Categoría_Id` INT NOT NULL ,
`Cultura_Id` INT NOT NULL ,
`Nombre` VARCHAR(45) NOT NULL ,
`Descripción` TEXT NULL ,
PRIMARY KEY (`Categoría_Id`, `Cultura_Id`) ,
INDEX `fk_Categoría_has_Cultura_Categoría` (`Categoría_Id` ASC) ,
INDEX `fk_Categoría_has_Cultura_Cultura` (`Cultura_Id` ASC) ,
CONSTRAINT `fk_Categoría_has_Cultura_Categoría`
FOREIGN KEY (`Categoría_Id` )
REFERENCES `mydb`.`Categoría` (`Id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Categoría_has_Cultura_Cultura`
FOREIGN KEY (`Cultura_Id` )
REFERENCES `mydb`.`Cultura` (`Id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION);



SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Guía rápida de instalación de Eclipse + PDT

Para los que quieran desarrollar en PHP existe una amplia variedad de IDEs; todos ellos con sus ventajas y sus desventajas. Les propongo el uso de uno de los mejores: Eclipse. La historia de este IDE puede que se las haga en otro artículo, pero baste decir que cuenta con el prestigio de haber sido desarrollado por IBM, pero que actualmente es soportado por una gran cantidad de no menos prestigiosas compañías de desarrollo de software (Microsoft, Sun, Apple).
Una de las fortalezas de Eclipse es que cuenta con una potente plataforma de plugins, que lo hace extremadamente flexible. Con un conjunto de plugins interoperando podemos lograr un cúmulo de nuevas funcionalidades que de otra forma requerirían un esfuerzo mayor. PDT (PHP Development Tools) es uno de esos plugins, que en coordinación con otros convierten a Eclipse + PDT en una excelente herramienta de desarrollo.
Requisitos
Eclipse está desarrollado sobre Java, por lo que es imprescindible tener una versión adecuada (1.5 ó superior) de la máquina virtual de Java.
Descargar
Les recomiendo descargar la el bundle All-in-one, desde esta dirección http://www.eclipse.org/pdt/downloads/
En esta página pueden escoger el sistema operativo y la versión del PDT que desean (les recomiendo la estable). En el momento de escribir estas líneas el bundle All-in-one incluye la versión estable de PDT 2.1-SR1, la versión estable de Eclipse 3.5-SR1 y todos los plugins requeridos.
La versión para Windows se llama eclipse-php-galileo-SR1-win32.zip y pesa ~140MB. Versiones similares se encuentra en el sitio para distintas plataformas.
Instalar
La instalación es bastante sencilla. Luego de descargado el bundle en forma de fichero zip, lo descompactamos con nuestro compactador de preferencia. Veremos que se ha creado una carpeta llamada Eclipse y dentro de esta hallarás un ejecutable llamado eclipse.exe (windows), que es el programa en cuestión. Movemos esta carpeta para donde nos parezca, aunque recomiendo fuertemente que para una mejor organización de nuestra estación de trabajo, la movamos a la carpeta "Archivos de Programas" y creemos un acceso directo del ejecutable en nuestro escritorio.

Representante de Google se reporta

Para mis amigos que dicen que sería un excelente representate de los intereses de Google: aquí les dejo el enlace a Google Translator, el traductor de este «monstruo» de Internet.

Las mejoras son muchas: desde un paquete adicional de lenguajes que se han adicionado, la inclusión de una la funcionalidad de traducción "as-you-type", hasta la reproducción automática de texto (por el momento sólo en inglés)

Para los que trabajan con contenidos en diversos idiomas, estas mejoras les serán imprecindibles en su actividad diaria.

Sólo nos falta una utilidad para el escritorio que funcione en modo desconectado para olvidarnos del Babylon Translator.

¿Es la cafeína realmente perjudicial?


¿Quién podría negar que un sabroso cafecito siempre es bueno después de una rica comida, o como compañero infaltable en la charla con amigos; quién no se tienta con una gaseosa bien helada cuando el calor golpea y la sed acecha; o quién no disfrutó de un exquisito té con galletitas una tarde cualquiera? Todas estas bebidas, aunque aparentemente tan diversas, tienen algo en común: la cafeína.
Este ingrediente activo del café está presente en muchas comidas y bebidas, y es la droga estimulante más popular del sistema nervioso central. Se la encuentra en más de 60 especies de plantas distribuidas en todo el planeta.
Se ha descubierto que la cafeína está presente en el café, el té, el cacao, el chocolate y los refrescos -como las bebidas cola y el guaraná-. Fue descubierta en las semillas del café en 1820 y unos años más tarde se demostró que la teína, un alcaloide presente en las hojas de té, era en realidad cafeína. Más aún, el té, en peso, contiene más cafeína que el café. Es la droga estimulante más aceptada socialmente y, a su vez, la menos perjudicial.
Qué es y cómo actúa la cafeína
De acuerdo a los expertos, la cafeína, que pertenece al grupo de sustancias llamadas xantinas, estimula el cerebro al interferir en la acción de la adenosina -un transmisor nervioso que produce calma y tranquilidad- y provoca una sensación de euforia y de fuerza durante algunas horas. También facilita la actividad intelectual y la creatividad, al mantener despierto y en estado de alerta a su consumidor. Todo esto ocurre junto con un incremento de los niveles de adrenalina y noradrenalina, que son neurotransmisores activadores.
La máxima concentración en la sangre se alcanza entre los 30 y 45 minutos de haberla ingerido. A las tres horas ya se ha eliminado la mitad de lo que se absorbió.
Según el libro de Farmacología, del doctor Manuel Litter, esta sustancia actúa en distintos niveles en todo el cuerpo. A dosis habituales de dos a cuatro tazas diarias -150 a 250 miligramos- estimula las funciones psíquicas, lo que aparentemente no es seguido de depresión; y se hace más fácil el esfuerzo intelectual, la asociación de ideas y la atención. En el nivel del sistema cardiovascular actúa estimulando el corazón -incrementa la frecuencia cardíaca y la fuerza de contracción- y además aumenta la presión arterial en forma transitoria.
Tanto la cafeína como la teofilina provocan disminución del flujo sanguíneo cerebral por vasoconstricción, aliviando de esta manera la cefalea.
Otro efecto importante es que aumenta la secreción de jugos -como el ácido clorhídrico y la pepsina- en el estómago. Esta acción la convierte en una droga irritante de la mucosa gástrica; pero, a su vez, tiene acción antiespasmódica en la vesícula.
La cafeína posee también un leve efecto diurético; aumenta la capacidad de trabajo muscular, refuerza la contracción, retarda y alivia la fatiga. Finalmente, produce un muy pequeño efecto en los pulmones, dilatando los bronquios.
Lo que hay que saber
Existen en la población general mitos acerca de la cafeína, de los cuales algunos son ciertos, pero muchos otros, por suerte, no lo son :
"Un café después de comer facilita la digestión"
La cafeína estimula la secreción de saliva y de los jugos gástricos y favorece la digestión; pero hay algo más interesante: el consumo de café reduce considerablemente la aparición de cálculos biliares, de acuerdo con un estudio publicado en junio de 1999 en el Journal of the American Medical Association. Según los investigadores de la Universidad de Harvard, los adultos que beben dos a tres tazas de café con cafeína tienen un 40 por ciento menos de posibilidades de padecer esa dolencia. Parece ser que la cafeína puede prevenir la cristalización del colesterol, principal componente de los cálculos biliares. Sin embargo, los especialistas no han querido recomendar el aumento del consumo del café, debido a las consecuencias negativas que puede tener para otros aspectos de la salud.
"La cafeína interfiere en la actividad de los medicamentos"
Algunos compuestos, como los anticonceptivos y los fármacos para el corazón o las úlceras, reducen la capacidad del organismo para eliminar la cafeína por los riñones, esto puede provocar insomnio, irritabilidad y palpitaciones. La cafeína reduce el efecto sedante de algunos tranquilizantes y, si se toma con algunos antidepresivos, puede causar una crisis de hipertensión arterial grave y alteraciones del ritmo cardíaco.
"Los padres deben evitar que sus hijos tomen café"
De acuerdo con lo expresado por la doctora Judith Rapaport, jefa de psiquiatría infantil del Instituto Nacional de Salud Mental (National Institute of Mental Health) en Estados Unidos, casi ningún niño reacciona de manera adversa a la cafeína con las porciones que se consumen de manera típica. Ella recomienda a los padres "que apliquen el sentido común al ofrecer a sus hijos porciones normales de alimentos y bebidas con cafeína, incluyendo bebidas gasificadas y té"; y agrega: "Sigo siendo escéptica respecto de cualquier afirmación en el sentido que la cafeína cause hiperactividad en los niños, con base en nuestra propia investigación y el peso de la evidencia científica".
"Las embarazadas no pueden consumir cafeína"
Las investigaciones indican que su consumo moderado no provoca efectos adversos en la salud de la mujer embarazada, y tampoco afecta la fertilidad. El doctor James Mills, jefe de la sección de epidemiología pediátrica del Instituto Nacional de Salud Infantil y Desarrollo Humano (National Institute of Child Health and Human Development) de Estados Unidos, sostiene: "tenemos una gran base de datos sobre la cafeína en el embarazo proveniente de diferentes estudios. En general, la información refuerza la inocuidad del consumo moderado de esta sustancia durante el embarazo". En el caso de las embarazadas que deseen consumir alimentos y bebidas que la contengan, Mills recomienda 300 miligramos al día como nivel seguro de cafeína, la cantidad en tres a cinco tazas de café o varias latas de gaseosas.
"La cafeína causa enfermedades en las mamas"
Tanto el Consejo de Asuntos Científicos de la Asociación Médica Norteamericana (American Medical Association’s Council on Scientific Affairs) como el Instituto Nacional del Cáncer (National Cancer Institute) concluyeron, que no hay relación alguna entre la ingesta de cafeína y la enfermedad fibroquística de la mama -patología benigna que se presenta como abultamientos- así lo afirma la doctora Laurie Green, tocoginecóloga del Centro Médico del Pacífico de California.
"La cafeína es como las drogas peligrosas porque crea adicción"
Si bien la cocaína y la heroína son drogas sumamente adictivas y provocan efectos graves en la salud, en el nivel social y psicológico no hay evidencias que sugieran que la cafeína provoque resultados similares, afirma el doctor Charles O`Brien, jefe de psiquiatría del Centro Médico de Administración de Veteranos y profesor de psiquiatría de la Facultad de Medicina de la Universidad de Pennsylvania. En el sentido médico estricto, la "adicción" a la cafeína implicaría consumirla de una manera abusiva. Una vez que la gente alcanza su nivel diario normal de consumo de cafeína, por lo general no desea consumir más; y casi nadie tiene problemas cuando reduce su consumo en el transcurso de varios días en vez de hacerlo de una sola vez, opina O`Brien.
"La cafeína sube la presión arterial y daña el corazón"
Se ha demostrado que una ingesta moderada produce un aumento de la tensión, pero durante un período corto, y que no se incrementa el riesgo de infarto y de enfermedades coronarias. Pero según un estudio publicado en la revista American Journal of Hipertensión, la cafeína junto con el estrés elevan la presión arterial, y aquellos con hipertensión experimentan mayor riesgo. Como toda sustancia estimulante, de la que no se puede abusar, provoca en el organismo un estado de hiperactividad en todos los niveles, entre ellos el cardiovascular, por la secreción de catecolaminas.
Efectos nocivos de la cafeína
El consumo excesivo de cafeína puede provocar dependencia, aunque con un síndrome de abstinencia mucho más benigno que en otros casos -dolor de cabeza, irritabilidad y somnolencia patológica-. A dosis altas produce excitación, ansiedad e insomnio, temblor, un aumento generalizado de la sensibilidad y disminución de los reflejos. También puede provocar gastritis por estimulación de la secreción gástrica.
En el deporte es considerada una sustancia restringida, es decir, que su uso está permitido siempre que no se llegue a una concentración en la orina de 12 microgramos por mililitro. Como este dato puede decir poco, hay que saber que dos cafés tomados a la vez o prácticamente seguidos producen este nivel de cafeína en la orina hasta dos o tres horas después de su ingestión. Si se sobrepasan estos valores se considera doping, porque mejora el rendimiento físico.
La cafeína se encuentra en numerosos preparados antigripales en asociación con otros fármacos. Se puede utilizar en el tratamiento de la migraña porque produce vasoconstricción en los vasos pericraneales dilatados.
Dados los variados y extremadamente potentes efectos de la cafeína, y su uso extensivo en todas las capas sociales, quizás algún día se considere la restricción más general de su consumo como un inicio a la atención sanitaria preventiva. Ciertamente, aumentar la educación pública para ayudar al reconocimiento de que las sustancias frecuentemente consumidas y socialmente aceptadas como el té, café, alcohol y tabaco contienen importantes drogas psicoactivas ayudaría al público a distinguir entre los tipos y patrones de consumo.

Drupal en la Casa Blanca

Excelente noticia saber que una plataforma de Código Abierto, alcanza semejante reconocimiento. En este momento los administradores del proyecto deberán poner todos los ojos a los temas de seguridad ... o no?

in reference to:

"Después de meses de planificación, la Casa Blanca ha decidido utilizar el sistema de gestión de contenidos de código abierto Drupal en su sitio web, reemplazando al software propietario instalado desde Bush hijo. Todo un espaldarazo al software libre.
Drupal es un CMS multiplataforma, modular y multipropósito que destaca por la calidad del código y cumplimiento de los estándares web.
Software Open Source, está liberado bajo licencia GPL y tiene un potencial que no ha pasado desapercibido por los responsables administrativos del ejecutivo estadounidense que en la búsqueda de una alternativa más flexible y dinámica.
//<!--
printAdvert("http://ad.es.doubleclick.net/adj/_mpu.inquirer.es/contenido;cat=contenido;sz=336x280,300x250,250x250,200x200;tile=2");
//-->


<a href="http://ad.es.doubleclick.net/jump/_mpu.inquirer.es/contenido;cat=contenido;sz=336x280,300x250,250x250,200x200;tile=2;ord=123456789?">
<img src="http://ad.es.doubleclick.net/ad/_mpu.inquirer.es/contenido;cat=contenido;sz=336x280,300x250,250x250,200x200;tile=2;ord=123456789?" border="0"
alt="Publicidad"></a>



“El código abierto es una excelente forma de participación cívica”, indicó Marcon Phillips, el nuevo director de medios de la Casa Blanca, responsable del contrato de licitación de mantenimiento del sistema que también será abierto.
Un pequeño gesto, pero significativo de la Casa Blanca que debería continuar en otros niveles de la administración USA y ya de paso trasladado a otros países cuyos gobernantes tanto gusta de imitar a Obama."
- El portal web de la Casa Blanca migra a Drupal | The Inquirer ES (view on Google Sidewiki)

Últimos resultados de la clasificación al mundial Sudáfrica 2010

Con un excelente resultado por parte de Portugal, que le permite ir a la repesca concluyó la última jornada clasificatoria para el Mundial de Fútbol Sudáfrica 2010.
in reference to:
"Alemania 1 - Finlandia 1
Un gol de Lukas Podolski, a dos minutos del final, salvó a Alemania de despedirse de la fase de clasificación con una derrota ante Finlandia, que en todo caso no hubiera tenido repercusiones puesto que los alemanes llegaron al partido con el pase a Suráfrica en el bolsillo y los fineses sin opciones de alcanzar la repesca.




Azerbaiyán 1 - Rusia 1
La selección de Azerbaiyán ha conseguido un empate con sabor a victoria ante una Rusia desmotivada y con los ojos centrados en la repesca, donde buscará conseguir su pase al mundial de Suráfrica 2010. Aunque sin ya nada en juego en el Grupo 4 europeo, este partido de la última jornada había sido anunciado por el técnico de la selección rusa, el holandés Guus Hiddink, como un asunto de honor y de motivación para sus hombres.




Suiza 0 - Israel 0
Suiza salió airosa del brusco reto al que le sometió Israel, que afrontó el duelo con opciones aún de formar parte de las eliminatorias de repesca para el Mundial 2010, y obtuvo el punto necesario en sus cuentas para sellar su presencia en Suráfrica. El cuadro que dirige el alemán Ottmar Hitzfeld se aseguró su novena presencia mundialista después de completar un duelo espeso, plagado de interrupciones y brusco. Israel insistió más en el tramo final pero la entrada de Shechter y Vermouth en la punta de ataque no mejoró la puntería hebrea, que se marchó de la fase de clasificación sin lograr su objetivo. Suiza dejó fuera a Grecia, que tras ganar 2-1 en Atenas a Luxemburgo disputará las eliminatorias de repesca.




Rumanía 3 - Islas Feroe 1
Rumanía ganó con facilidad a las Islas Feroe en el duelo de colistas del grupo 7, en la despedida de los dos equipos de su triste singladura en la fase de clasificación para el Mundial. Los rumanos impusieron su superioridad sobre el campo en todo momento, ante un rival que nunca dio muestras de poder controlar el partido y apenas si se acercó a la portería de Pantilimon.




Irlanda 0 - Montenegro 0
Con todo decidido en su grupo de clasificación, las selecciones nacionales de Irlanda y Montenegro empataron en Dublín a cero goles en un encuentro falto de intensidad competitiva, que sólo sirvió para engordar algunas estadísticas del once local que dirige el italiano Giovanni Trapattoni. Irlanda espera un rival para la eliminatoria de repesca, que se jugará a doble partido, que saldrá del sorteo que se celebrará el próximo lunes en Zúrich. Montenegro se vuelve a casa con un punto más, insuficiente para abandonar el penúltimo puesto.




Polonia 0 - Eslovaquia 1
Un golpe de fortuna, un tanto en propia puerta del zaguero del Lech Poznan Seweryn Gancarczyk a los tres minutos de partido, propició la victoria de Eslovaquia, que logró su primera clasificación para un Mundial, el de Suráfrica 2010. Eslovaquia acudió a Polonia con la necesidad imperiosa de la victoria para evitar que el conjunto esloveno, que venció a San Marino, culminara una remontada clasificatoria.




Suecia 4 - Albania 1
La selección de Suecia se despidió de su trayecto clasificatorio hacia el Mundial 2010 con una inútil victoria frente la débil Albania. El conjunto de Lars Lagerbäck, que afrontó los dos últimos compromisos de la fase como líder del Grupo 3 y con el pase hacia Suráfrica en su mano, se encontró en una situación inesperada e indeseada en el duelo de cierre. Pendiente de las evoluciones de Portugal en Guimaraes contra Malta para agarrarse a las eliminatorias de repesca, dejó de lado el juego en el partido frente Albania.




Inglaterra 3 - Bielorrusia 0
Sin presiones y con el objetivo de rematar la campaña de forma triunfal, la Inglaterra de Fabio Capello concluyó su último trámite del grupo 6 hacia Suráfrica con un merecido 3-0 ante el combinado bielorruso. Los "tres leones" que tutela el técnico italiano querían noche de celebración y lo lograron en Wembley, donde finiquitaron la fase como campeones de grupo.




Portugal 4 - Malta 0
La selección portuguesa, que no contó con el lesionado Cristiano Ronaldo, jugará la repesca para el Mundial 2010 tras despachar sin complicaciones a una débil Malta por 4-0, triunfo que le garantiza el segundo puesto del Grupo 1. El técnico luso, Carlos Queiroz, consiguió la tercera victoria consecutiva apostando por un 4-3-3 que no le había funcionado, en cambio, en los primeros partidos de la fase de clasificación del grupo.




Dinamarca 0 - Hungría 1
Hungría le aguó la fiesta a Dinamarca, recién clasificada para Sudáfrica, y acabó con su condición de invicta en esta fase en un partido en el que marcó cuando mejor jugaba su rival y luego supo mantener el resultado. Con la clasificación en el bolsillo, Dinamarca ofreció su mejor versión, con los dos Poulsen mandando en el centro y moviendo con rapidez el balón a los extremos




Italia 3 - Chipre 2
Italia se despidió de la fase
clasificatoria con una victoria ante Chipre, en un encuentro en el que los chipriotas plantaron cara desde el principio a los italianos y que los "azzurri" remontaron gracias a Alberto Gilardino. Los hombres de Marcello Lippi, que en algunos de los últimos partidos han motivado dudas sobre su estado de juego, pasaron con sufrimiento un mero trámite futbolístico en la ciudad de Parma, toda vez que la clasificación para Suráfrica ya estaba en el bolsillo.




Francia 3 - Austria 1
Francia cumplió ante Austria en un partido intrascendente en el que marcaron Karim Benzema, Thierry Herny y André-Pierre Gignac para los galos y Marc Janko para los alpinos y cerró la clasificación mundialista del grupo 7 de la zona europea, con Serbia como líder y los "bleus" en segunda posición.




Grecia 2 - Luxemburgo 1
El pase suizo condena a la repesca a Grecia, que ganó 2-1 a Luxemburgo pero que pagó su mal comienzo en la fase de clasificación. El lunes en Zúrich conocerá su rival.




Turquía 2 - Armenia 0
Fatih Terim se despidió del banquillo de la selección turca con una victoria 2-0 contra Armenia, ya que presentó su dimisión el pasado fin de semana al no haber conseguido la clasificación para la fase final del Mundial de Suráfrica 2010. Visiblemente emocionado, Terim compareció ante los medios de comunicación tras el partido y agradeció a todos los jugadores, la federación de fútbol turca, los seguidores y los periodistas.




Andorra 0 - Ucrania 6
Ucrania encontró premio tras golear a la colista Andorra (0-6), junto a San Marino que no ha logrado punto alguno en el torneo. El cuadro ucraniano acabó como segunda del Grupo 6 de la zona europea y accede la repesca. Este resultado invalida la victoria de Croacia ante Kazajistán y la deja fuera al acabar tercera."
- Portugal, a la repesca · ELPAÍS.com (view on Google Sidewiki)

En Finlandia es un derecho ciudadano conectarse a 1Mb

Esperemos que una medida similar se produzca en todos los países desarrollados; de esa forma los menos desarrollados puedan experimentar un acelerón en la adopción de nuevas tecnologías.
En Cuba, isla del Caribe con una montaña de problemas tecnológicos, por diversas razones, todavía algo similar es un sueño.
Sólo nos queda esperar que el cable desde Venezuela sea algo más que una noticia, o en todo caso que desde EEUU se produzca alguna iniciativa para conectarnos al país con más internautas... y finalmente podamos entrar al siglo XXI.

in reference to:

"El Gobierno finlandés garantizará por ley el derecho de sus ciudadanos a tener un conexión de un megabit. El próximo mes de julio tendrá formalmente reconocido este derecho. Pero ello será únicamente el principio. En 2015, el Gobierno se ha comprometido a reconocer como un derecho adquirido el acceso a una conexión de 100 Mb. Esta garantía sólo tiene una excepción en el caso de los teléfonos móviles, cuando se produzcan problemas de acceso."
- Finlandia declara un derecho ciudadano la conexión de un megabit · ELPAÍS.com (view on Google Sidewiki)

Por qué todavía no me compré un DVD

    Lo que me pasa es que no consigo andar por el mundo tirando cosas y cambiándolas por el modelo siguiente sólo porque a alguien se le ocurre agregarle una función o achicarlo un poco.

    No hace tanto, con mi mujer, lavábamos los pañales de los críos, los colgábamos en la cuerda junto a otra ropita, los planchábamos, los doblábamos y los preparábamos para que los volvieran a ensuciar.

    Y ellos, nuestros nenes, apenas crecieron y tuvieron sus propios hijos se encargaron de tirar todo por la borda, incluyendo los pañales.

    ¡Se entregaron inescrupulosamente a los desechables! Si, ya lo sé. A nuestra generación siempre le costó tirar. ¡Ni los desechos nos resultaron muy desechables! Y así anduvimos por las calles guardando los mocos en el bolsillo y las grasas en los repasadores.

    ¡¡¡Nooo!!! Yo no digo que eso era mejor. Lo que digo es que en algún momento me distraje, me caí del mundo y ahora no sé por dónde se entra. Lo más probable es que lo de ahora esté bien, eso no lo discuto. Lo que pasa es que no consigo cambiar el equipo de música una vez por año, el celular cada tres meses o el monitor de la computadora todas las navidades.

    ¡Guardo los vasos desechables!

    ¡Lavo los guantes de látex que eran para usar una sola vez!

    ¡Apilo como un viejo ridículo las bandejitas de espuma plástica de los pollos!

    ¡Los cubiertos de plástico conviven con los de acero inoxidable en el cajón de los cubiertos!

    ¡Es que vengo de un tiempo en el que las cosas se compraban para toda la vida!

    ¡Es más!

    ¡Se compraban para la vida de los que venían después!

    La gente heredaba relojes de pared, juegos de copas, fiambreras de tejido y hasta palanganas de loza.

    Y resulta que en nuestro no tan largo matrimonio, hemos tenido más cocinas que las que había en todo el barrio en mi infancia y hemos cambiado de heladera tres veces.

    ¡¡Nos están fastidiando!! ¡¡Yo los descubrí!! ¡¡Lo hacen adrede!! Todo se rompe, se gasta, se oxida, se quiebra o se consume al poco tiempo para que tengamos que cambiarlo. Nada se repara. Lo obsoleto es de fábrica.

    ¿Dónde están los zapateros arreglando las media-suelas de las Nike?

     ¿Alguien ha visto a algún colchonero escardando sommiers casa por casa?

    ¿Quién arregla los cuchillos eléctricos? ¿El afilador o el electricista?

    ¿Habrá teflón para los hojalateros o asientos de aviones para los talabarteros?

    Todo se tira, todo se desecha y, mientras tanto, producimos más y más basura.

    El otro día leí que se produjo más basura en los últimos 40 años que en toda la historia de la humanidad.

    El que tenga menos de 40 años no va a creer esto: ¡¡Cuando yo era niño por mi casa no pasaba el basurero!!

    ¡¡Lo juro!! ¡Y tengo menos de... años!

    Todos los desechos eran orgánicos e iban a parar al gallinero, a los patos o a los conejos (y no estoy hablando del siglo XVII)

    No existía el plástico ni el nylon. La goma sólo la veíamos en las ruedas de los autos y las que no estaban rodando las quemábamos en la Fiesta de San Juan.

    Los pocos desechos que no se comían los animales, servían de abono o se quemaban. De 'por ahí' vengo yo. Y no es que haya sido mejor. Es que no es fácil para un pobre tipo al que lo educaron con el 'guarde y guarde que alguna vez puede servir para algo', pasarse al 'compre y tire que ya se viene el modelo nuevo'.

    Mi cabeza no resiste tanto.

    Ahora mis parientes y los hijos de mis amigos no sólo cambian de celular una vez por semana, sino que, además, cambian el número, la dirección electrónica y hasta la dirección real.

    Y a mí me prepararon para vivir con el mismo número, la misma mujer, la misma casa y el mismo nombre (y vaya si era un nombre como para cambiarlo) Me educaron para guardar todo. ¡¡¡Toooodo!!! Lo que servía y lo que no. Porque algún día las cosas podían volver a servir. Le dábamos crédito a todo.

    Si, ya lo sé, tuvimos un gran problema: nunca nos explicaron qué cosas nos podían servir y qué cosas no. Y en el afán de guardar (porque éramos de hacer caso) guardamos hasta el ombligo de nuestro primer hijo, el diente del segundo, las carpetas del jardín de infantes y no sé cómo no guardamos la primera caquita. ¿Cómo quieren que entienda a esa gente que se desprende de su celular a los pocos meses de comprarlo?

    ¿Será que cuando las cosas se consiguen fácilmente, no se valoran y se vuelven desechables con la misma facilidad con la que se consiguieron?

    En casa teníamos un mueble con cuatro cajones. El primer cajón era para los manteles y los repasadores, el segundo para los cubiertos y el tercero y el cuarto para todo lo que no fuera mantel ni cubierto. Y guardábamos... ¡¡Cómo guardábamos!! ¡¡Tooooodo lo guardábamos!! ¡¡Guardábamos las chapitas de los refrescos!! ¡¿Cómo para qué?! Hacíamos limpia-calzados para poner delante de la puerta para quitarnos el barro. Dobladas y enganchadas a una piola se convertían en cortinas para los bares. Al terminar las clases le sacábamos el corcho, las martillábamos y las clavábamos en una tablita para hacer los instrumentos para la fiesta de fin de año de la escuela. ¡Tooodo guardábamos!

    ¡¡¡Las cosas que usábamos!!!: mantillas de faroles, ruleros, ondulines y agujas de primus. Y las cosas que nunca usaríamos. Botones que perdían a sus camisas y carreteles que se quedaban sin hilo se iban amontonando en el tercer y en el cuarto cajón. Partes de lapiceras que algún día podíamos volver a precisar. Tubitos de plástico sin la tinta, tubitos de tinta sin el plástico, capuchones sin la lapicera, lapiceras sin el capuchón. Encendedores sin gas o encendedores que perdían el resorte. Resortes que perdían a su encendedor.

    Cuando el mundo se exprimía el cerebro para inventar encendedores que se tiraban al terminar su ciclo, inventábamos la recarga de los encendedores descartables. Y las Gillette -hasta partidas a la mitad- se convertían en sacapuntas por todo el ciclo escolar. Y nuestros cajones guardaban las llavecitas de las latas de sardinas o del corned-beef, por las dudas que alguna lata viniera sin su llave. ¡Y las pilas! Las pilas de las primeras Spica pasaban del congelador al techo de la casa. Porque no sabíamos bien si había que darles calor o frío para que vivieran un poco más. No nos resignábamos a que se terminara su vida útil, no podíamos creer que algo viviera menos que un jazmín.

    Las cosas no eran desechables. Eran guardables. ¡¡¡Los diarios!!! Servían para todo: para hacer plantillas para las botas de goma, para poner en el piso los días de lluvia y por sobre todas las cosas para envolver. ¡¡¡Las veces que nos enterábamos de algún resultado leyendo el diario pegado al trozo de carne!!!

    Y guardábamos el papel plateado de los chocolates y de los cigarros para hacer guías de pinitos de navidad y las páginas del almanaque para hacer cuadros y los cuentagotas de los remedios por si algún medicamento no traía el cuentagotas y los fósforos usados porque podíamos prender una hornalla de la Volcán desde la otra que estaba prendida y las cajas de zapatos que se convirtieron en los primeros álbumes de fotos. Y las cajas de cigarros Richmond se volvían cinturones y posa-mates y los frasquitos de las inyecciones con tapitas de goma se amontonaban vaya a saber con qué intención, y los mazos de naipes se reutilizaban aunque faltara alguna, con la inscripción a mano en una sota de espada que decía 'éste es un 4 de bastos'.

    Los cajones guardaban pedazos izquierdos de palillos de ropa y el ganchito de metal. Al tiempo albergaban sólo pedazos derechos que esperaban a su otra mitad para convertirse otra vez en un palillo.

    Yo sé lo que nos pasaba: nos costaba mucho declarar la muerte de nuestros objetos. Así como hoy las nuevas generaciones deciden 'matarlos' apenas aparentan dejar de servir, aquellos tiempos eran de no declarar muerto a nada: ¡¡¡ni a Walt Disney!!!

    Y cuando nos vendieron helados en copitas cuya tapa se convertía en base y nos dijeron: 'Cómase el helado y después tire la copita', nosotros dijimos que sí, pero, ¡¡¡minga que la íbamos a tirar!!! Las pusimos a vivir en el estante de los vasos y de las copas. Las latas de arvejas y de duraznos se volvieron macetas y hasta teléfonos. Las primeras botellas de plástico se transformaron en adornos de dudosa belleza. Las hueveras se convirtieron en depósitos de acuarelas, las tapas de botellones en ceniceros, las primeras latas de cerveza en portalápices y los corchos esperaron encontrarse con una botella.

    Y me muerdo para no hacer un paralelo entre los valores que se desechan y los que preservábamos. ¡¡¡Ah!!! ¡¡¡No lo voy a hacer!!! Me muero por decir que hoy no sólo los electrodomésticos son desechables; que también el matrimonio y hasta la amistad son descartables.

    Pero no cometeré la imprudencia de comparar objetos con personas. Me muerdo para no hablar de la identidad que se va perdiendo, de la memoria colectiva que se va tirando, del pasado efímero. No lo voy a hacer. No voy a mezclar los temas, no voy a decir que a lo perenne lo han vuelto caduco y a lo caduco lo hicieron perenne. No voy a decir que a los ancianos se les declara la muerte apenas empiezan a fallar en sus funciones, que los cónyuges se cambian por modelos más nuevos, que a las personas que les falta alguna función se les discrimina o que valoran más a los lindos, con brillo y glamour.

    Esto sólo es una crónica que habla de pañales y de celulares. De lo contrario, si mezcláramos las cosas, tendría que plantearme seriamente entregar a la 'bruja' como parte de pago de una señora con menos kilómetros y alguna función nueva. Pero yo soy lento para transitar este mundo de la reposición y corro el riesgo de que la 'bruja' me gane de mano y sea yo el entregado.

    Hasta aquí Eduardo Galeano

Ética profesional

Ningún ingeniero de software con un poco de ética escribiría nunca un procedimiento DestruirBagdad. La ética profesional más básica requeriría escribir un procedimiento DestruirCiudad genérico, al que se le pudiera pasar Bagdad como parámetro.
Nathaniel Borenstein


The Universe

There is a theory that if ever anyone discovers what the Universe is for and why it is here, it will instantly disappear and be replaced with something even more bizarre and inexplicable. There is another theory that this has already happened.
Douglas Adams, «The Restaurant at the End of the Universe»

Inyectar un bloque de Drupal usando PHP

Este es el segemento de código que se utiliza para "inyectar" un bloque desde código PHP:
<?php
$block = module_invoke('block', 'block', 'view', delta_number_of_block);
print $block['content'];
?>
Pero su aplicación necesita de algunos detalles. El método module_invoke recibe en este caso cuatro parámetros, de ellos sólo modificaremos el primero y el cuarto. El primero será el módulo que se utilizó para la creación del bloque. Por ejemplo, un bloque creado utilizando la página de bloques (admin/build/block) tendrá como módulo creador a 'block'. Sin embargo, un bloque creado por la página de configuración de menúes (admin/build/menu) tendrá como módulo creador a 'menu'. En la siguiente lista muestro las correspondencias de módulo-identificador que he hallado en mi experiencia en Drupal.

Página de bloques (admin/build/block)'block'
Página de menúes (admin/build/menu) 'menu'
Forum'forum'
Localización'locale'
Comentarios'comment'
Imágenes'image'
Del sistema'system'
Usuario'user'
Finder'finder'

Ahora, el cuarto parámetro es el identificador delta del bloque para el módulo especificado. En los sitios en que he buscado información al respecto asumen que es un número, sin embargo esto depende del módulo, ya que para los bloques de menúes el identificador es una cadena de texto formada por la palabra 'menu' + 'nombre-del-menu', con excepción de los menúes que provee el sistema ('primary-links', 'secondary-links'). Con esto sucede algo curioso: y es que aunque en la página de configuración de menúes aparezca el menú de navegación como uno más, su bloque correspondiente pertenece al módulo de tratamiento de usuarios.

WCF: Inicios

Desde hace años Microsoft intenta unificar en una plataforma todas las tecnologías para el desarrollo de sistemas distribuidos, teniendo en cuenta que estas tecnologías comparten mucho en común, principalmente su interacción con la capa de red y transporte de la arquitectura TCP/IP.
En estas andanzas surge el proyecto Indigo que luego de un extenso período de pruebas, pasó a su versión estable como Windows Communication Foundation (WCF). En este se agrupaba el desarrollo de Servicios Web, DCOM+, Remoting y todo el paraguas de tecnologías distribuidas, de forma tal que el desarrollo de funcionalidades en nuestros servicios no interviniera con la forma en la que este se sirviera. Así podríamos brindar una misma funcionalidad de diferentes maneras sin tener que modificar el código de la funionalidad en sí.
Para entender de que va WCF debemos saber (como en todo) el ABC, en este caso Address, Binding y Contract.

Address
Especifica la dirección del servicio. Esta dirección incluye el protocolo usado (TCP, HTTP, MSMQ, ...).
Binding
Mecanismos de comunicación que se usarán para acceder a la dirección. Con estos mecanismos se definen como se codificarán los datos, la seguridad de las comunicaciones, la compresión de datos, etc.
Contract
Indica cuál es el servicio a ofrecer, cuáles son las funcionalidades que se van a exponer.

Una combinación de estos tres elementos crea lo que se denomina como endpoint. Un mismo servicio puede tener varios endpoints ya que se puede acceder a la misma funcionalidad a través de diferentes protocolos, diferentes puertos, diferentes mecanismo.

Herramienta para descargar vídeos de Youtube

¿Quién no ha querido descargar sus vídeos prefereridos de Youtube? Que tal hacerlo con un gestor de descarga como con cualquier otro fichero. Pues para esto le recomendamos YouDown. Una excelente herramienta con excelente usabilidad. Agregas los enlaces de tus videos en la cola (o simplemente los importas de un txt) y ... ¡a descargar!
YouDown está hecho con las últimas tecnologías de Microsoft para .Net por lo tanto debemos tener instalada la plataforma .Net versión 3.5 con SP1 o superior y es compatible con Windows XP/Vista/7.
Otra de las ventajas que ofrece YouDown es la posibilidad de elegir la calidad con la que queremos que se descarguen nuestros videos.
Sin más aquí esta el enlace: http://youdown.codeplex.com/




Drupal: Taxonomy + Contemplates

Muchas veces hemos querido mostrar nuestros términos de vocabularios como un campo CCK más. La mejor opción para esto es el uso del módulo contemplate y de un poco de código PHP que nos permita extraer los términos por vocabulario para su presentación.
Para esto comenzaremos añadiendo a template.php el siguiente código:
function phptemplate_taxonomy_links($node, $vid) {
if (count($node->taxonomy)){
$tags = array();
foreach ($node->taxonomy as $term) {
if ($term->vid == $vid){
$tags[] = array('title' => $term->name, 'href' => taxonomy_term_path($term), 'attributes' => array('rel' => 'tag'));
}
}
if ($tags){
return theme_links($tags, array('class'=>'links inline'));
}
}
}
Luego en el contemplate de nuesto tipo de contenido hacemos una llamada a la función definida:
<?php print phptemplate_taxonomy_links($node, $vid) ?>
... donde sustituimos $vid por el id del vocabulario del cual queremos extraer los términos asignados al nodo en particular. Utilizando nuestro conocimiento de Contemplate, HTML y CSS podemos darle el estilo que deseemos a nuestra salida.
Un ejemplo de lo que les muestro lo pueden ver aquí, donde Técnica y Manifestación aparecen como si se tratase de campos CCK, sin embargo son vocabularios con los términos asociados a ese nodo.

Notas:
  1. Esta solución fue probada usando Drupal 6.12.
  2. La función phptemplate_taxonomy_links puede ser sustituida por otra en la que se muestre la relación jerárquica de aquellos vocabularios que la tengan.

Negro que soy

A los que aún luchan en cimarronaje
Negro que soy
Quiero ser bozal,
Ladino al suelo que soy,
Bozal de corazón,
Sin oreja al paredón.
De bozal a cimarrón,
De carabalí yoruba a bozal,
De negro en casa África Grande,
A blanco encima cepo apreta'o.
Orro quedo por bozal cimarrón,
De ladino nacido sin tierra,
A rumba nostalgia,
A mano vacía,
A pie forra'o,
Sangrando el cuerpo engrilleta'o.
Bozal, bozal, bozal,
Cimarón, cimarrón,
Ladino que pena que soy.
Orro de corazón


IBM & Sybase se unen


IBM entra en un acuerdo con Sybase (el creador de lo que luego fuera Microsoft SQL Server), para explotar el comercio de soluciones móviles. En esto se incluye una plataforma unificada de banca, para reducir el pronóstico de riesgo en las operaciones de un banco.
“Esta relación entre Sybase e IBM lleva más allá nuestra estrategia para construir una asociación global que permita un ecosistema de comercio móvil seguro que beneficia tanto a los usuarios como a los operadores móviles e instituciones financieras de todo el mundo", declara Matthew Talbot, vicepresidente de mCommerce de Sybase 365.

Disney compra a Marvel

La compañía insignia de los dibujos animados Walt Disney Company ha adquirido al gigante de los cómics Marvel por cerca de 4 mil millones de dólares. Con esta operación se unen Blanca Nieves con Iron Man en el conglomerado de animados más grande del mundo.
Por todos es conocido que la marca Marvel ha recibido un reciente impulso dado el gran éxito de las versiones fílmicas de las historias de varios de sus personajes históricos, como Spider Man.
Marvel se suma entonces a Pixar y engrosa el universo que rodea a los míticos personajes de Disney.

Niños

image023
image022
image021


image020
image018
image019


image017
image016
image015


image014
image013
image012
image011


image010
image009
image008


image007
image006
image005


image004
image003
image002
image001