Diez errores comunes de CSS

Recientemente he estado modificando el código en un sitio web diseñado por alguien más, cuando vi a varios errores comunes en la hoja de estilos. Pensé que sería útil

Como incluir jQuery usando los host de google

Actualmente hay dos maneras de incluir la librería jQuery en nuestras paginas. La primera opción es bajar una copia desde su sitio Web enjQuery.com e incluirla en nuestro código; pero veamos como hacerlo también usando la copia que Google nos hace el favor de tener siempre disponible en su propio servidor web.

combinando MS Access con Oracle

Combinando Microsoft Access y Oracle
En este artículo vamos a ver cómo implementar una sencilla aplicación que trabaje sobre una base de datos Oracle para actualizar datos y generar reportes, usando una herramienta amigable y disponible en la mayoría de los ordenadores como lo es Microsoft Access.

La idea es, en 5 pasos crear una interfase gráfica con poco esfuerzo y en tiempo récord, que facilite la vida de muchos usuarios no IT, como por ejemplo la del Gerente del Area de Recursos Humanos que necesita ingresar y consultar datos en su base de datos corporativa. No hay necesidad de comprar un caro producto comercial para esa sencilla tarea.

Qué software necesitamos para desarrollar y ejecutar nuestra aplicación?

- Microsoft Access, sino nuestro archivo .mdb no será reconocido por Windows.
- Un cliente Oracle, para que podamos conectarnos con la base de datos de destino.

(Este software debe estar presente ya sea en la máquina que usemos para desarrollar como en la máquina destino donde va a correr el programa. No está en el alcance de este artículo explicar cómo instalar estos dos productos)

Los 5 pasos para crear la aplicación

1) Crear una conexión ODBC
2) Vincular en Access las tablas de Oracle
3) Crear las relaciones existentes
4) Crear formularios
5) Crear un reporte

Nuestra aplicación va a conectarse y trabajar con el usuario Oracle SCOTT. Uso Windows Vista, Access 2003 y un cliente Oracle 10g.

Disculpas por las pantallas de Access en portugués y Windows en inglés, pero es todo lo que tengo en la vuelta :)

Paso 1. Crear una conexión ODBC

- En Windows, vamos al menú Start, Control Panel, Administrative Tools y seleccionamos Data Sources (ODBC)

- En la lengueta User DNS, presionar sobre el botón Add. Una lista de drivers disponibles aparecerá en un diálogo. Tenemos dos posiblidades para seleccionar, una es elegir el driver de Microsoft para Oracle (Microsoft ODBC for Oracle), y la otra es elegir el driver de Oracle que fue instalado con nuestro cliente (en mi caso Oracle em OraClient10g). Recomiendo usar el driver nativo de Oracle, ya que está optimizado y se corresponde exactamente con la versión de Oracle que acabamos de instalar.

Nota: En caso que se nos presente un mensaje de error con el título SQORAS32 y el mensaje An unsupported operation was attemped, se trata de un bug conocido cuya solución está en Metalink nota NR.5699495. Será necesario descargar un patch y reemplazar algunos archivos en el cliente Oracle. Es aplicable a los clientes 10.2.0.3.0 a 10.2.0.3.7 y las instrucciones vienen con el propio patch.

- En el diálogo siguiente, ingresar los datos de la conexión:

Data Source Name: Un nombre cualquiera describiendo nuestra conexión
Description: Opcional, puede ser nada
TNS Service Name: El mismo nombre de servicio en nuestro tnsnames.ora
User ID: Opcional, puede ser nada



- Pulsar Test Connection para ver si nuestra conexión funciona. Aparecerá un diálogo solicitando usuario y password. En mi caso colocaré scott/tiger. El mensaje Connection successfull deberá aparecer para poder continuar. De lo contrario, revisar el tnsnames.ora que está siendo usado, para ver si tiene la entrada correcta.

Luego de seleccionar OK en el diálogo principal, nuestra conexión ODBC está lista para ser usada.

Paso 2. Vincular en Access las tablas de Oracle

- Ingresar a Access y comenzar un nuevo proyecto en blanco.

- En el menú Insertar, elegir Tabla y Vinculación de tabla.



Aparecerá un diálogo como los de seleccionar archivos, pero tenemos primero que elegir en el combo Tipos de archivos, la opción Bases de datos (ODBC).

Luego se muestra el diálogo Select Data Source. Ir a la lengueta Machine Data Source y seleccionar la conexión ODBC creada en el paso anterior.



Somos solicitados para informar el usuario y password de la base de datos Oracle (scott/tiger).

Observar que se nos presentan todas las tablas y vistas a las que el usuario scott tiene acceso. Buscar aquellas que comienzan con el prefijo SCOTT y marcarlas: BONUS, DEPT, EMP y SALGRADE. Seleccionar OK.

- Access solicitará indicar para algunas tablas las columnas identificadoras (clave primaria). Eso dependerá si la clave está definida en la tabla original o no. En este caso vamos a ignorar el aviso simplemente seleccionando OK.

Listo! Las tablas ya están vinculadas en nuestro proyecto. Notar que el nombre de cada tabla asignado automáticamente por Access es [ESQUEMA]_[TABLA].

Paso 3. Crear las relaciones

Cuando se vinculan las tablas del esquema Oracle en Access, no se crean los relacionamientos entre ellas. Es necesario hacerlo manualmente, si queremos mantener el esquema de integridad de datos.

- En el menú Herramientas, ingresar a Relaciones.

- En el diálogo Mostrar Tabla, en la lengueta Tablas, seleccionar (presionando Control) las tablas SCOTT_EMP y SCOTT_DEPT, y pulsar Agregar. Las tablas se mostrarán en la ventana de relacionamientos, y podremos cerrar el diálogo Mostrar Tabla.

- Si la tabla SCOTT_EMP no muestra todas las columnas, agrandarla desde el vértice inferior derecho para permitir ver la columna DEPT.



- Hacer click (izquierdo) sobre la columna DEPT de SCOTT_EMP, y sin soltar, arrastrar la columna hacia la tabla SCOTT_EMP, soltándola encima de la columna DEPTNO (clave primaria de SCOTT_DEPT). Un nuevo diálogo se abrirá con la definición de la relación.

- Podemos elegir las propiedades de esta relación, en nuestro caso vamos a dejar todo por defecto, que corresponde a un INNER JOIN entre ambas tablas. Luego de seleccionar Crear, la relación entre las tablas será visible gráficamente en pantalla.



- Cerrar la ventana de relacionamientos y elegir Sí para guardar los cambios.

Paso 4. Crear formularios

Tenemos las tablas vinculadas en Access con sus relaciones, y de aquí para adelante depende exclusivamente de nuestros conocimientos en Access. Da lo mismo que sean tablas propias de Access o de Oracle con las que estemos trabajando. Podemos inclusive usar este mismo esquema para importar datos desde una tabla Oracle a una local.

Crearemos un formulario para cada una de las tablas importadas, para facilitar el mantenimiento de los datos a través de la aplicación. Explicaré cómo hacer los formularios de DEPT y EMP; para el resto es el mismo procedimiento.

- En la ventana principal de Access, ir a Formularios, y elegir la opción Crear formulario usando el asistente.

- Seleccionar la tabla SCOTT_DEPT en el combo de tablas, y seleccionar todos los campos disponibles (DEPTNO, DNAME, LOC) con el botón >>.

- Presionar Avanzar, elegir el layout 'Columna', el estilo 'Standard', y escribir el título 'Departamentos'. Seleccionar Concluir.



Ya está listo nuestro primer formulario donde daremos mantenimiento a los departamentos. Por defecto, todas las operaciones sobre los datos están permitidas. Si se desea, se pueden alterar las propiedades del formulario activando la caja Propiedades con Alt-Enter.

Ahora vamos al formulario de empleados.

- En la ventana Formularios, elegir la opción Crear formulario usando el asistente.

- Seleccionar la tabla SCOTT_EMP en el combo de tablas, y seleccionar todos los campos disponibles con el botón >>.

- Elegir las mismas opciones que en la tabla anterior, excepto por el título 'Empleados'.

Nuestro formulario de empleados está listo, pero vamos a introducir una pequeña mejora: que el campo DEPTNO en lugar de un texto numérico sea un combo list con los nombres de los departamentos, para evitar tener que recordar los números.

- Seleccionar en el menú Exibir, el modo Diseño.

- Marcar el campo DEPTNO en el formulario y borrarlo (pulsando la tecla DELETE)

- En la caja de herramientas (lateral izquierda) seleccionar la herramienta Caja de Combinación.



- Crear el combo en el lugar que eliminamos el campo numérico DEPTNO. Se abrirá automáticamente el asistente para caja de combinación.

- Seleccionar la primera opción para que el combo busque los datos a partir de una consulta y Avanzar.

- Elegir la tabla SCOTT_DEPT y Avanzar.

- Seleccionar los campos DEPTNO y DNAME y Avanzar

- Definir el orden de ordenamiento por DNAME (creciente) y Avanzar.

- Dejar seleccionado el checkbox Ocultar llave primaria y Avanzar.

- Dejar la opción Recordar valor para uso posterior y Avanzar.

- Si se desea modificar el rótulo, puede alterarse para 'DEPTO'.

- Concluir la operación.



Terminamos nuestro formulario para dar mantenimiento a los empleados.
Ahora nuestro campo de departamentos se actualiza dinámicamente a partir de la tabla SCOTT_DEPT.

Repetir el proceso de creación de formularios para el resto de las tablas, y estaremos aptos para insertar, borrar y alterar registros completamente a través de nuestra interface gráfica.

Paso 5. Crear un reporte

Crearemos un reporte para mostrar un ejemplo más de funcionalidad.

- En la ventana principal de Access, ir a Consultas, y elegir la opción Crear consulta en modo diseño.

- Cerrar la ventana Mostrar tabla y en el menú Exibir seleccionar SQL.

- Escribir la query:

SELECT e.empno, e.ename, e.job, e.sal, d.dname, s.grade
FROM scott_emp e, scott_dept d, scott_salgrade s
WHERE e.deptno=d.deptno
AND e.sal BETWEEN s.losal AND s.hisal

- Cerrar la ventana query y elegir Sí para grabar los cambios, asignando un nombre cualquiera para la consulta, por ejemplo 'Salarios de empleados por departamento'.

- En la ventana principal de Access, ir a Reportes, y elegir la opción Crear reporte usando el asistente.



- En el combo Tablas/Consultas elegir la consulta creada anteriormente, junto con todas las columnas disponibles en la consulta, y avanzar.

- En el nivel de agrupamiento, elegir DNAME (el departamento) y avanzar.



- Elegir el ordenamiento por orden de ENAME creciente.

- Dejar las opciones de diseño por defecto y avanzar hasta visualizar el reporte.



Nuestro reporte está listo luego de 10 minutos con cero esfuerzo de programación, simplemente usando una sencilla consulta SQL.

Combinamos la facilidad de uso y versatilidad de una herramienta como Access con el potencial de una base de datos Oracle. Las posibilidades dependen sólo de nuestra voluntad, pudiendo integrar planillas de Excel, gráficos, multimedia y mejorar la lógica de nuestra aplicacion con VBA (Visual Basic for Applications).

PD: hago mención de que esta tuto no es mio,, es publicad por Ifer de este blog, solo para que no digan repost o lammer o demas tonterias,, ahi se los dejo,, es bueno hacer este tipo de post xDXDXDXDXD KDSDSDSD

see u next time

Convertir campos públicos en propiedades publicas usando Expresiones Regulares

Buen día lectores ya llevaba algo de tiempo sin presentar nada en el blog, salvo, las intervenciones del Kellogs, que ha sido muy amable al postear varios artículos, ahora me encuentro

Aprendiendo Script en InDesign CS4 - Learning Script in ID CS4

bueno,, por motivos mas complejos e internos,, deje de postear hace mucho tiempo,, pero no he dejado de ver los post,, ya que me gusta ir aprendiendo cosas nuevas,, aki les traigo un pequeño manual que encontre en la red, con ejemplos muy practicos, para algunos puede ser muy fácil pero puede que vean puntos más claros o comprendan aun más algo que ya sabían.

Todo es en base a JavaScript,, pero pueden manejar apple o visualscript,, depende de cada uno,, lo cual se le haga más fácil,, de uno a otro no hay mucha diferencia de sintaxis XDXD asi que comenzamos:

manejando el ejemplo más auditable y común entre los newbies es un "Hola Mundo" jeje,, muchos van a decir,, "ahh ese es fácil con java o cualquier otro" pues sí, es fácil,, pero lo pongo :@ :P

var myWindow = new Window ("dialog"); ---> creamos una nueva ventana de tipo dialogo
var myMessage = myWindow.add ("statictext"); ---> la cual agregamos un elemento "myMessage" el cual tiene texto
myMessage = "Hola, Mundo"; ---> texto
myWindow.show (); ---> mostrando la ventana

no es necesario hacer una explicación,, ya que esto es fácil de comprender para cada uno de los que lee este post, prosigamos (en las lineas principales coloco un comentario hacer de "que hace" ,,,

Puedo imaginar que saben que existen los tipos de ventana, los cuales son "dialog" y "palette"

para crear el ejemplo anterior en una ventana de tipo palette agregamos el siguiente codigo:

#targetengine "session";

var myWindow = new Window ("palette");
var myMessage = myWindow.add ("statictext");
myMessage = "Hola, Mundo";
myWindow.show ();


eeee,,, "no me vengas con tonterías, es muy fácil", jaja pues si, really easily

ok,, continuemos,, ahora iremos complementando el pequeño app, agregando controles XDXD:
pues ya lo hemos echo,, jeje,, en la linea var myMessage = myWindow.add ("statictext") esto es el control --> statictext

complementando lo anterior al código, sería algo como esto:

var myWindow = new Window ("dialog", "Form");
myWindow.add ("statictext", undefined, "Name:");
var myText = myWindow.add ("edittext");
myWindow.show ();


si se dan cuenta,, despues de "dialog" agrege "Form", esto hace que le de un nombre visible.
Además,, si ponen atención,, la orientación de los elementos es en columna,, extraño no,, pues no,, por default esta de esta manera en columna, pero podemos cambiarla a fila,, digamos que son un poco mas quisquillosos en este sentido, pues sería algo así:

var myWindow = new Window ("dialog", "Form");
myWindow.orientation = "row";
myWindow.add ("statictext", undefined, "Name:");
var myText = myWindow.add ("edittext");
myWindow.show ();


agregamos el control orientation XDXDXD, ahora digamos que debe tener un texto cuando corra la aplicación pero que sea editable, con una longitud limitada, seguimos con el código de esta manera:

var myWindow = new Window ("dialog", "Form");
myWindow.orientation = "row";
myWindow.add ("statictext", undefined, "Name:");
var myText = myWindow.add ("edittext", undefined, "Hector F.");
myText.characters = 30;
myWindow.show ();


pueden editar la longitud a su gusto manejando los controles de characters, ahora digamos, que queremos que cuando ejecutemos la aplicación quede activa la parte del texto,, es decir,, cuando este visible el cursor este en la parte del campo de texto, jojo,, :

var myWindow = new Window ("dialog", "Form");
myWindow.orientation = "row";
myWindow.add ("statictext", undefined, "Name:");
var myText = myWindow.add ("edittext", undefined, "Hector F.");
myText.characters = 30;
myText.active = true;
myWindow.show ();


mmm, divertido,, interesante y motivador,, agregemos unos botones de acción (asi me gusta nombrarlos XDXD):

var myWindow = new Window ("dialog", "Form");
myWindow.orientation = "row";
myWindow.add ("statictext", undefined, "Name:");
var myText = myWindow.add ("edittext", undefined, "Hector F.");
myText.characters = 30;
myText.active = true;
myWindow.add ("button", undefined, "OK");
myWindow.add ("button", undefined, "Cancel");
myWindow.show ();


ejecuten la aplicación, al parecer todos los elementos estan orientados en fila, esto es porque la ventana esta orientada a esa posición, para cambiar la orientación, usaremos unos items,, group y panel, estos dos hacen lo mismo, agrupar los controles, pero difieren de la siguiente manera, group tiene bordos, el panel no, para no afectar a todo lo que concierne a esa ventana en la orientación, agregaremos esto XDXD:

var myWindow = new Window ("dialog", "Form");
var myInputGroup = myWindow.add ("group");
myInputGroup.add ("statictext", undefined, "Name:");
var myText = myInputGroup.add ("edittext", undefined, "John");
myText.characters = 20;
myText.active = true;
var myButtonGroup = myWindow.add ("group");
myButtonGroup.alignment = "right";
myButtonGroup.add ("button", undefined, "OK");
myButtonGroup.add ("button", undefined, "Cancel");
myWindow.show ();


he agregado dos grupos, myInputGroup y MyButtonGroup, fijense que he eliminado la linea que setea la orientacion, esto es por que ya no es necesario, por que lo he divido en dos grupos,, digamo que juan es programador,, y botanas es analista, cada quien esta orientado a una funcion diferente aunque esten en la misma empresa, otro punto agregado es ".aligment = right", fácil de deducir :P XDXD, claro esta que si te gusta experimentar más a fondo puedes hacer lo siguiente,, no explicare porque es muy deducible:

var myWindow = new Window ("dialog", "Form");
myWindow.orientation = "row";
var myInputGroup = myWindow.add ("group");
myInputGroup.add ("statictext", undefined, "Name:");
var myText = myInputGroup.add ("edittext", undefined, "John");
myText.characters = 20;
myText.active = true;
var myButtonGroup = myWindow.add ("group");
myButtonGroup.orientation = "column";
myButtonGroup.add ("button", undefined, "OK");
myButtonGroup.add ("button", undefined, "Cancel");
myWindow.show ();


un poco de lucides al app, pondremos la ventana hacia arriba, podemos agregar el siguiente código antes o después de la segunda linea,, no importa:

var myWindow = new Window ("dialog", "Form");
myWindow.orientation = "row";
myWindow.alignChildren = "top";
var myInputGroup = myWindow.add ("group");
myInputGroup.add ("statictext", undefined, "Name:");
var myText = myInputGroup.add ("edittext", undefined, "John");
myText.characters = 20;
myText.active = true;
var myButtonGroup = myWindow.add ("group");
myButtonGroup.orientation = "column";
myButtonGroup.add ("button", undefined, "OK");
myButtonGroup.add ("button", undefined, "Cancel");
myWindow.show ();


hasta aqui es bueno, pero los botones ok y cancel no hacen nada, pues utilizariamos funciones como if else, si se presiona ok que vuelva a mostrar el app, en caso contrario que salga, algo por el estilo sería asi:

if (myWindow.show () == 1)
var myName = myText.text;
else
exit ();


bueno,, seguire en otra ocasión, esto salio por un rato de ocio en la oficina, pero como ya tengo trabajo que hacer, pues hasta aqui le dejo,, ahi cualquier cosa comenten,, no he agregado algo hacia indesign,, pero el punto principal era que tomaran en cuenta que hacer script es dirigido para cualquier cosa que quieras hacer, bla bla,, jaja, k cosas, después pondre scripts dedicados al soft de indesign,, pero son algos complejos,, algo como agregar grids, o posicionar una imagen, hacer un resize de imagens, recolocar texto, cortar texto, y demás, se oye interesante, pero aun no hago algo concreto, he practicado pero necesito mas tiempo para postear un ejemplo práctico funcionable, jeje, suerte nenas, besos.

Google: mod_pagespeed, tus sitios optimizados

El modulo, llamado mod_pagespeed, puede ser instalado y configurado en los servidores web Apache, el software más utilizado para el funcionamiento de sitios web. Una vez instalado, mod_pagespeed determina sobre la marcha la manera de optimizar el rendimiento de una web. Por ejemplo, comprime imágenes de manera más eficiente y cambia la configuración para que un mayor número de páginas se almacenen en el caché del navegador del usuario, de modo que los mismos datos no tengan que cargarse en varias ocasiones. El software se actualiza automáticamente, señala Richard Rabbat, gerente de producto para el nuevo proyecto. Afirma que esto significa que a medida que Google y otras terceras partes realicen mejoras, las personas que lo instalen se beneficiarán de dichas mejoras sin tener que realizar ningún cambio. "Creemos que hacer que toda la red sea más rápida es algo crítico para el éxito de Google", señala Rabbat. Hacer que la red sea más rápida debería animar a la gente a usarla más y aumentar la probabilidad de que usen los servicios y el software de Google. Rabbat señala la frustración que sienten los usuarios cuando hacen clic en un enlace o escriben una dirección URL y observan una página en blanco durante varios segundos. "En muchos casos," afirma, "personalmente abandono esa página cuando algo como eso ocurre". Google ya ofrece una herramienta llamada Page Speed, encargada de medir la velocidad a la que se carga una página web y sugerir formas de mejorarla. "Nos hicimos la siguiente pregunta: en lugar de simplemente decirle a la gente cuáles son los problemas, ¿podemos arreglarlos de forma

Parametros Opcionales en C# 4.0

Buen día SQLeros después de un buen rato de no poner nada en el blog, les preparé un post que versa sobre los parámetros opcionales en el C# 4.0 y la gran utilidad que estos proporcionan  a la hora de codificar y también un pequeño ejemplo de ellos.

Ahora empecemos... ¿Que son los parámetros opcionales?

En la definición de un método, constructor, indizador o delegado se puede especificar si sus parámetros son obligatorios u opcionales. Todas las llamadas deben proporcionar argumentos para todos los parámetros obligatorios, pero pueden omitir los argumentos para los parámetros opcionales.

Cada parámetro opcional tiene un valor predeterminado como parte de su definición. Si no se envía ningún argumento para ese parámetro, se utiliza el valor predeterminado. Los valores predeterminados deben ser constantes.

Los parámetros opcionales se definen al final de la lista de parámetros, después de los parámetros obligatorios. Si el llamador proporciona un argumento para cualquiera de los parámetros opcionales de una sucesión de este tipo, debe proporcionar argumentos para todos los parámetros opcionales anteriores. No se admiten los espacios separados por comas en la lista de argumentos.

Por ejemplo en el siguiente código especificamos parámetros opcionales.

SQLeros HotSpot Creator

Bueno mis estimados lectores en este post, les traigo un programa que escribí para darle una GUI, a netsh. En este caso para la interface inalambrica.

Se me ocurrió; por que para mi es tedioso estar haciendo los pasos citados aquí.

Ahora les presento unas pantallas:

[caption id="attachment_468" align="aligncenter" width="279" caption="Pantalla principal"][/caption]

[caption id="attachment_469" align="aligncenter" width="281" caption="Opciones del programa..."][/caption]

[caption id="attachment_470" align="aligncenter" width="300" caption="en la bandeja del sistema"][/caption]

[caption id="attachment_471" align="aligncenter" width="300" caption="Opciones del icono de notificación"][/caption]


Como pueden ver es algo sencillo pero funcional...




[caption id="attachment_472" align="aligncenter" width="219" caption="Red creada..."][/caption]

Bueno mis estimados lectores, les dejo el código del programa aquí.


Y también les mando un caluroso saludo,¡hasta otro post!

Open Source y NoSQL

Ya he escrito en julio de 2009 sobre los novísimos sistemas de almacenamiento no relacional y el paradigmaNoSQL, pero me parece interesante volver sobre el asunto desde la perspectiva del Software Libre.

Resulta que las redes sociales le han dado a pensar a los desarrolladores que un sistema gestor de base de datos relacional (SGBDR) no es la infraestructura óptima para un sitio web con decenas de millones de usuarios registrados. Además, los servicios más importantes han liberado sus sistemas de almacenamiento no relacional. De LinkedIn salió Voldemort, Facebook donó Cassandra a la Apache Software Foundation, VMWare esponsoriza Redis(usado por Craigslist), en 2009 Baidu se convirtió en sponsor de Hypertable y se sospecha que HBase, la base de datos que corre sobre el framework Hadoop extensamente usado por Yahoo!, también se usa en Bing tras la compra de Powerset por parte de Microsoft en 2008.

Vale la pena señalar que en los sistemas de almacenamiento no relacional los substitutivos al Software Libre no son sistemas privativos sino software como servicio. La competencia del software de Apache no es mayormente software de Microsoft u Oracle (aunque tengan el veterano BerkelyDB) sino Amazon Dynamo como parte de S3 o la implementación de BigTable disponible en Google App Engine.

Lo más probable es que los usuarios de almacenamiento no relacional se dividan en dos grupos, los de software Open Source y los de software como servicio.

Una buena porción de la tarta Open Source se la llevará Apache con CassandraCouchDBHBaseJackrabbit.

Habrá también proveedores independientes como mongoDB de 10gen o Tokyo Cabinet, con unas pocas funcionalidades estrella o especialmente adaptados a algún lenguaje de programación como Ruby o PHP, pero yo dudo que vaya a haber un próximo producto estrella como MySQL o JBoss fuera de Apache que domine el nicho de sistemas almacenamiento no relacional Open Source.

Otra fracción importe de los desarrolladores se convertirán en usuarios de los sistemas de almacenamiento como servicio de Amazon, Google, Azure, o cualquier otro. Incluso algunas de las ofertas de almacenamiento como servicio estarán basadas en Software Libre.

Lo importante es la creación de un API estándar como SQL. Si apareciera un API estándar para almacenamiento no relacional con soporte para ACID, bloqueos, y replicación, entonces sería posible escribir una aplicación para que corriese en cualquier infraestructura y así eliminar el vendor lock-in que produce el uso de las soluciones de almacenamiento como servicio. A falta de un estándar yo recomendaría a cada desarrollador que antes de basar su solución an Google App Engine o Amazon S3 o Azure o lo que sea, al menos escriba un wrapperque permita cambiar el proveedor de infraestructura en caso de que ello fuere conveniente o necesario.

También habrá un hype de moda dentro de poco, que pronto pasará. Los sistemas de almacenamiento clave/valor tampoco son la solución perfecta. En realidad son una simplificación extrema de los sistemas gestores de bases de datos relacionales surgida para solucionar los problemas de rendimiento y escalabilidad de sitios web con centenares de millones de usuarios. Los sistemas NoSQL casi siempre se usan en combinación con caches comomemcachedJBoss Cache, con bases de datos relacionales como MySQL y con indexadores como Lucene. Y defensores a ultranza del modelo relacional tampoco faltan. Los hay que argumentan que una base de datos relacional paralela es superior en todos los aspectos a un sistema de clave/valor o que simplemente la mayoría de ellos no escalan como deberían, o incluso que están impacientes por ver morir el movimiento.

El precio de la memoria RAM y la evolución hacia las nuevas tecnologías DDR3DDR4 también será un factor determinante en la evolución de las arquitecturas. Con el precio actual de ~35€ por Gigabyte de memoria DDR2 se puede almacenar una base de datos de 96Gb enteramente en RAM por poco más de 3.000€. Aunque dicho precio es aún 10 veces superior de lo que cuesta la misma cantidad de espacio en disco, empieza a ser económicamente viable para muchos sitios web manejar una gran parte de su información no-multimedia en RAM utilizando la base de datos sólo como copia de respaldo ante caídas.

Mark Zuckerberg donará $100M a educación pública en EEUU



El CEO y fundador de Facebook Mark Zuckerberg donará 100 millones de dólares para las escuelas públicas en los EE.UU., y se le informó que se anunciará la donación el viernes en el show de Oprah Winfrey.

La donación será la primera parte de una fundación que Zuckerberg está creando para mejorar la educación en los EE.UU, y la primera donación 100 millones de dólares se va aNewark.

Mark Zuckerberg fue elegido recientemente como una de las persona más rica del mundo con una fortuna estimada en alrededor de 6,9 mil millones dólares, lo que lo pondría por delante del consejero y delegado de Apple Steve Jobs.

Mucha gente llamará a la donación un movimiento calculado, ya que se dará a conocer el mismo día que la película “The social Network” es puesta en marcha en los cines americanos, una película que retrata Zuckerberg de una forma poco favorable como les puede pasar a muchos universitarios(todos fuimos jovenes y alguna tonteria seguro que hicimos).

Al final del día, independientemente de sus motivaciones para la donación, sigue siendo una donación increíblemente generoso que ayudará al sistema escolar publico. Enhorabuena por ese apoyo a la educación.

Release del Internet Explorer 9 Beta

Buen día SQLeros, Microsoft, lanzó oficialmente la primera Beta Oficial de Internet Explorer 9 puede ser descargado desde aquí (a las 14:00hs es el evento oficialhttp://beautyoftheweb.com vía webcast)

clip_image001

Microsoft hizo mucho foco en los estándares, HTML 5, la aceleración asistida por GPU, y otras funcionalidades adicionales como la compatibilidad con Windows 7.

Si bien se trata del primer beta, el futuro para este navegador se ve muy promisorio.

Desde el arranque la aplicación es más rápida, así también las diversas demos disponibilizadas en el sitio de el preview.

Al arrancar el navegador por primera vez se sugiere escoger los Addons o complementos que utilizamos, para mejorar la performance como muestra el gráfico inferior:

image

image

La interface nueva aprovecha el efecto Glass disponibles en Windows Vista y Windows 7, asi también la barra de navegación y tabs están mejor distribuídas y consumen menos espacio.

image

La apertura de nuevos Tabs, sugiere sitios populares y la navegación “en privado”

image

También se disponibiliza un Download Manager, algo que mucha falta le hacía a Internet Explorer y que otros navegadores ya lo tenían.

image

La integración con Windows 7, es más que evidente al hacer clic derecho sobre el icono en la barra de aplicaciones

image

Saludos.

Qué es NoSQL?

Originalmente el término NoSQL, que fue acuñado en 1998, se refería a una base de datos relacional de código abierto que no usaba un lenguaje de consultas SQL(Structured Query Language).

Hasta 2009 estas cinco letras cayeron en el olvido, pero fue Johan Oskarsson, entonces empleado de Last.fm, quien organizó un evento para tratar las bases de datos distribuidas de código abierto no relacionales, llamándolas “NOSQL”, Not-Only SQL.

Las características comunes entre todas las implementaciones de bases de datos distribuidas no relacionales, propietarias o no, suelen ser las siguientes:

  • Consistencia Eventual: No se implementan mecanismos rígidos de consistencia como los presentes en las bases de datos relacionales, donde la confirmación de un cambio implica una comunicación del mismo a todos los nodos que lo repliquen. Esta flexibilidad hace que la consistencia se dé,eventualmente, cuando no se hayan modificado los datos durante un periodo de tiempo. Esto se conoce también como BASE (Basically Available Soft-state Eventual Consistency, o coherencia eventual flexible básicamente disponible), en contraposición a ACID, su analogía en las bases de datos relacionales.

  • Estructura distribuida: Generalmente se distribuyen los datos mediante mecanismos de tablas de hash distribuidas (DHT) ya que realmente se trata, según las distintas implementaciones, de redes p2p.

  • Escalabilidad horizontal: La implementación típica se realiza en muchos nodos de capacidad de procesado limitado, en vez de utilizar grandes Mainframes.

  • Tolerancia a fallosRedundancia.


De entre todas las implementaciones de bases de datos NoSQL, hay muchas que no utilizan el lenguaje de consultas SQL (por ejemplo, MongoDB usa JSON), pero hay algunas que siguen usándolo, como por ejemplo BigTable (GQL), que lo ha transformado manteniendo su estructura básica.

Definitivamente, con el término NoSQL nos referimos a una multitud de bases de datos que intentan solventar las limitaciones que el modelo relacional se encuentra en entornos de almacenamiento masivo de datos, y concretamente en las que tiene en el momento de escalar, donde es necesario disponer de servidores muy potentes y de balanceo de carga

Los 10 errores mas comunes al programar orientado a objetos en PHP

El dominio de la programación orientada a objetos es, sin duda, uno de los paradigmas más codiciado por los programadores. Sin embargo, muchas veces estos cometen "atrocidades" al intentar implementarlo solo por decir a sus amigos, empresas u otros "Yo sé programar orientado a objetos".

Los 21 errores más comunes al programar con php

Leyendo en Zend.com, encuentro una completa lista de errores comunes de los programadores de PHP.
Aunque muchos de los que programamos constantemente en PHP hemos superado varios puntos, siempre hay cosas en las que caemos, pudiendo mejorar la calidad de nuestro código.

Los errores están divididos en 3 partes, siendo los primeros

SNAPSHOT DATABASE

Han visto que el Object Explorer en el SQL Server Management Studio donde se encuentran las bases de datos hay una carpeta que dice Database Snapshots.

Esto puedo confundir mucho ya que pareciera que fuera parte de la replicación pero no es así, realmente es una base de datos sólo lectura, estática basada en una base datos normal (fuente).

En la parte de abajo hay un ejemplo reemplacen la información por sulla y aparecerá ya base datos bajo la carpeta de Database Snapshots.

Cuál es su función:
Pueden ser utilizados para los informes. Asimismo, en el caso de un error del usuario en una base de datos de código fuente, puede restaurar la base de datos fuente al estado en que estaba cuando se creó el snapshot.

La pérdida de datos se limita a las actualizaciones de la base de datos desde su creación de la instantánea. Además, la creación de una snapshot de base de datos puede ser útil inmediatamente antes de hacer un cambio importante de una base de datos, como cambiar el esquema o la estructura de una tabla.

Tiene 3 posibles usos:


• Mantener los datos históricos para la generación de informes (Reporteria)
• Protección de datos de errores de usuario (Backup).
• La gestión de una base de datos de prueba (Base datos de pruebas)

Importante:
Database snapshots, fueron introducidos en SQL Server 2005, sólo están disponibles en las ediciones Enterprise de SQL Server 2005, SQL Server 2008 y SQL Server 2008 R2.

En la parte de abajo hay un ejemplo reemplacen la información por sulla y aparecerá ya base datos bajo la carpeta de Database Snapshots.

Crear una base datos snapshots



SNAPSHOT CREATE DATABASE AdventureWorks_dbss1800 ON
( NAME = AdventureWorks_Data, FILENAME =
'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\AdventureWorks_data_1800.ss' )
AS SNAPSHOT OF AdventureWorks
;


Si hacer un restore de en base a un SNAPSHOT seria de la siguiente manera:

Restore


USE master
RESTORE DATABASE AdventureWorks FROM DATABASE_SNAPSHOT = 'AdventureWorks_dbss1800';
GO


Que permisos necesito para crear una:
La única manera de crear una SNAPSHOT CREATE DATABASE es utilizar Transact-SQL. Cualquier usuario que pueda crear una base de datos puede crear una snapshot de base de datos, sin embargo, para crear una instantánea de una base de datos reflejada, usted debe ser un miembro de la función de servidor sysadmin.

Articulo de referencia:
http://msdn.microsoft.com/en-us/library/ms175469.aspx
http://msdn.microsoft.com/en-us/library/ms187054.aspx
http://www.sqlcoffee.com/Tips0004.htm

LINQ paralelo ( PLINQ ) para SQL server

Lo primero es que no corre con el framework 3.5 tiene que trasladarse ya al 4.0

Los procesadores multinúcleo ya están aquí. Los procesadores multinúcleo solo estaba disponibles para servidores y PCs de escritorio. Pero ahora, ya se están usando en teléfonos móviles y PDA, lo cual genera grandes ventajas en relación con el consumo de energía. En respuesta al aumento de disponibilidad de plataformas con procesadores multinúcleo, Parallel Language Integrated Query (PLINQ) ofrece una manera fácil de sacar partido del uso de hardware paralelo, incluidos equipos tradicionales con varios procesadores y la última ola de procesadores multinúcleo.

PLINQ es un motor de ejecución de consultas que acepta cualquier consulta LINQ to Objects o LINQ to XML y usa automáticamente varios procesadores o núcleos para su ejecución cuando estos están disponibles. El cambio en el modelo de programación es minúsculo, lo cual significa que no es necesario ser un gurú para usarlo.

Usar PLINQ es casi exactamente lo mismo que usar LINQ to Objects y LINQ to XML. Puede usar cualquiera de los operadores disponibles.


Ejemplos con conexión a base de datos.

Linq
var query = from c in db.Customers
where c.Country == "USA"
orderby c.CompanyName
select new { c.CustomerID, c.CompanyName };

plinq
var query = from c in db.Customers.AsParallel()
where c.Country == "USA"
orderby c.CompanyName
select new { c.CustomerID, c.CompanyName };


El genio Joe Duffy es el responsable de desarrollo del equipo Parallel FX de Microsoft y participa habitualmente en el blog www.bluebytesoftware.com/blog. Está escribiendo un libro, Concurrent Programming on Windows, que va a ser publicado por Addison-Wesley.

Transliteración de Español a Ruso

Hola SQLeros el día de hoy comparto con ustedes una pequeña aplicación que permite transliterar algo escrito en español a ruso, es decir con el alfabeto cirilico.



Bueno les dejo el codigo y les mando un afectuoso saludo. Y gracias a RCK, por la ayuda.

¡Hasta pronto!

Conexión PHP - PostgreSQL

Para empezar a usar PostgreSQL con PHP, primero deberás conectarte a él. Esto es realizado con la función pg_connect(). Esta función es muy directa y solo espera un argumento, la cadena de conexión. La cadena de conexión contiene toda la información necesaria para conectarse a la base de datos. Los argumentos válidos para la cadena de conexión son el servidor, puerto, tty, opciones, nombre de la base de datos, usuario y contraseña. Normalmente te conectas a la base de datos de la siguiente forma:



CREACIÓN DE UNA TABLA CON PG_QUERY


Ahora creemos nuestra primer tabla. Haremos un script para ello, mostrando el uso de pg_query(). Crearemos una tabla llamada Contactos con los campos 'nombre', 'apellidos', 'email'. Para hacerlo, usa la siguiente consulta:


Si ocurrió algún error al usar este script, entonces verifica si proporcionaste el usuario y contraseña correctos, y verifica que PostgreSQL este corriendo. También se cuidadoso, ejecuta este script una sola vez y después borralo. De otro modo obtendrás errores diciendo que ya existe una tabla llamada "contactos".


Nota: También puedes usar una herramienta de administración para ejecutar la consulta anterior. Para ello existen PHPPgAdmin yWebMin.



INSERCIÓN DE REGISTROS EN LA BASE DE DATOS


Ahora que ya tienes una tabla, es tiempo insertar algunos registros en ella. Es hora de usar la función pg_query de nuevo. En esta ocasión guardaremos información dentro de nuestra base de datos. Usaremos el comando SQL 'INSERT' para hacerlo, su sintaxis es la siguiente:



INSERT INTO nombre_tabla (columna1, columna2,...) VALUES (valor1, valor2,....)

donde; nombre_tabla es el nombre de la tabla, en los paréntesis puedes especificar en que columnas quieres insertar datos. En los valores, pondrás lo que quieres guardar en la base de datos de este modo INSERT INTO contactos VALUES ('Juan', 'Perez' , 'juanperez@dominio.com ') insertaría Juan como nombre, Perez como apellidos, y juanperez@dominio.com como dirección de email. Ahora escribamos un script para hacer esto.



' );
document.write( addy80860 );
document.write( '<\/a>' );
//-->\n ')";
$result = pg_query($query);
if($result)
{
echo "El registro ha agregado";
}
else
{
echo "Ocurrió un error ! ".pg_last_error();
}
?>

Esto debió haber hecho lo que queríamos, si fallo verfica tu consulta e intenta de nuevo. Si todo marchó bien, insertemos más registros. De hecho, ¿por que no hacemos un formulario para insertarlos?. Para eso debemos empezar con una formulario muy básico.




Nombre:
Apellidos:
Email:


Ahora debemos agregar los valores reales a nuestro formulario. Primero debemos verificar que todos los campos hayan sido llenados, y entonces insertarlos en la base de datos:



		

Nombre:
Apellidos:

Eso es todo. Ya tenemos un formulario para insertar registros dentro de nuestra base de datos, si lees los comentarios deberás entender completamente que hace cada parte del script.



VISUALIZACIÓN DE LOS REGISTROS EN LA BASE DE DATOS


Ahora que ya podemos agregar registros a nuestra base de datos, necesitaremos ver todos los registros en la misma. Eso podemos hacerlo usando el comando SELECT de SQL. Ten en cuenta que aún seguimos usando la función pg_query(). Si quisieramos mostrar todos los campos de la base de datos, podríamos hacer un script que seleccionara todos (* en SQL) los registros.


No te preocupes si no entiendes cada parte del script. Tan solo use la función pg_fetch_array() para traer los resultados de la consulta dentro de un arreglo asociativo. Las llaves del arreglo son nombradas después de los nombres de columna de la tabla. De este modo $row['nombre'] contendrá lo que haya en la columna "nombre" de nuestra tabla, simple ¿no?. La variable $query es la consulta que quieres traer. NULL es el número de fila, cuando especificas NULL, la función simplemente se saltará ese parámetro. El último parametro, el que dice PGSQL_ASSOC, elige que tipo de arreglo regresará. PGSQL_ASSOC tendrá arreglos con los nombres de columna como llaves. PGSQL_NUM regresará un arreglo númerico, y PGSQL_BOTH regresará ambos. Como nota final, puedes reemplazar cada uno de los echo's por un print_r() para ver el arreglo completo.



ACTUALIZACIÓN DE REGISTROS


Ahora veremos el comando update, que es bastante sencillo. Su sintaxis es: UPDATE nombre_tabla SET nombre_columns = nuevo_valor WHERE nombre_columna = algun_valor. Así UPDATE contactos SET nombre = 'Juanito' WHERE apellidos = 'Perez Perez' pondría el valor 'Juanito' en los registros donde 'Perez Perez' sean los apellidos.



		

Nombre:
Apellidos:

LIMINACIÓN DE REGISTROS



Finalmente cubriremos como borrar registros de nuestra base de datos. Para comenzar modificamos el script de visualización de registros para crear un enlace a nuestro script de borrado:

';
}
}
else
echo "Ocurrió un error ! ".pg_last_error();
}
?>

La única línea añadida al script es la sig:

La cual agrega un enlace al script de borrar.php pasando como parámetro el e-mail del registro a eliminar. Y ahora el código del script de eliminación.

CONCLUSIÓN


Ok, si me seguiste hasta aquí, probablemente estes pensando que PostgreSQL no es muy diferente de MySQL, es verdad. Como lo dije al principio de este tutorial, este es un tutorial BÁSICO. Si llegaste hasta aquí sin ningún problema, te recomiendo que leas la documentación de PostgreSQL y veas algunas de sus características. Hay un mundo entero más allá de MySQL.



Porque es importante la programación paralela

Cuando hablo con alguna gente acerca de las novedades de Visual Studio 2010 y sale lo de las mejoras para la programación en paralelo, mucha gente lo ve como una

Java4Ever

No, no, no para nada no me he vuelto maricón, lo que pasa es que me encontré este video y se me hizo algo gracioso. No se lo pueden perder...



Ah jaja ¡espero y eso nunca me lo hagan mis hijos! Ah jajaja, esta muy buena la forma para programar, ¡tendré que probarla!


¡Saludos!

Crear Interfaces Fluidas en C #

Eric Evans y Martin Fowler fueron los responsables de esta tendencia llamada Fluent Interface. El objetivo de la misma no era otro que el de mejorar la legibilidad del código. Para saber cómo son

DocTranslator: Traduce documentos de Office conservando su presentación

DocTranslator es un servicio online gratuito que te permite traducir los textos de Office, conservando su formato y presentación intacta.


Las traducciones son realizadas a través de Google Translate en sus 50 idiomas, no hay límite en el tamaño del documento a traducir y no se necesita estar registrado para utilizar el servicio.


Documentos de Word y Excel son totalmente compatibles y también lo son archivos .txt. En caso de que use un sistema operativo diferente a Windows, deberás consultar la tabla de compatibilidad.


¡Saludos!

Codeplex: Hostea tu proyecto OpenSource

Si bien en sus inicios, el sitio fue muy criticado, por ser una copia de SourceForge.net


Hoy te vamos a hablar de  CodePlexde Microsoft, el que ya lleva su buen tiempo en la red, convirtiéndose en un sitio muy visitado por los programadores.


CodePlex es una herramienta que ayuda a los desarrolladores en su administración de proyectos Open Source.


Estas son algunas de las características y prestaciones que podemos encontrar en CodePlex:




  1. Posibilidad de publicar nuestros proyectos open source.

  2. Hosting para nuestros archivos de código.

  3. Página para el proyecto.  Es posible editarla.

  4. Administración de miembros del equipo de desarrollo.

  5. Upload de código.

  6. Manejo de versiones.

  7. Comunidad y área de discusiones para nuestro proyecto.

  8. Subscripciones vía RSS.

  9. Los usuarios pueden escribir reviews o comentarios por cada versión.

  10. Estadísticas de proyecto.

  11. Varios tipos de licencias para escoger, entre ellas figuran GNU y GNU v2


Proyectos interesantes publicados en el sitio:




  • AjaxControlToolkit Un conjunto de herramientas de Ajax para aplicaciones ASP.NET

  • SilverLight Toolkit Una colección de controles para la plataforma SilverLight

  • BlogEngine Es un programa con prestaciones similares a las que ofrece WordPress hecho en .NET

  • IronPython La implementación de Pythom para .NET

  • FacebookToolkit Herramientas para la manipulación de la API de Facebook

  • MVC Samples Conjunto de aplicaciones ejemplo de MVC de Microsoft

Escuchando Ahora: Actualiza tu estado de facebook con lo que escuchas en winamp


Hace una semana estaba langareando muy feliz, en mi casa y se me ocurrió una brillante idea… Vaya sé que no es original pero se me ocurrió.


Pensé:
¿Existirá una aplicación que sea capaz de poner lo que estoy escuchando en winamp en mi muro de publicaciones de Facebook?

Hola Mundo con PHP y el API de Facebook

Ultimamente me esta interesando bastante el tema las APIs de Facebook y Twitter. Asi que me decidi a buscar info y como siempre la comparto con todos ustedes.


El dia de hoy quiero mostrarles como hacer su primera aplicacion para facebook usando PHP. No es una aplicacion para nada util pues solo muestra un ‘Hola mundo’ seguido de tu nombre. Pero antes hay que entender algunas cosas.

XSS – Cross-Site-Scripting IV

Defendiendo Nuestros Usuarios.


Las formas más sencillas de defender nuestros usuarios son mediante las siguientes acciones:

Cookies:

Evitar almacenar datos vitales

XSS – Cross-Site-Scripting III

Defendiendo Nuestra Aplicación.


El primer modo de defensa que veremos, será la defensa de nuestra aplicación, misma que nos enseñara técnicas sencillas para defender nuestro sitio mediante la validación de entradas de datos.


Tenemos que tener claro que lo que debemos hacer es impedir la entrada de scripts en nuestros campos de inserción de datos, validando cada entrada para asegurarnos que no contenga código que pueda afectar nuestra aplicación o a nuestros usuarios.




  1. Limitación de caracteres de entrada.
    Lo primero que debemos hacer

XSS - Cross-Site-Scripting II

Al referirnos al Cross-Site-Scripting podemos encontrar bastante material didáctico acerca del tema, algunos de ellos describen los modos de ataques como directos e indirectos, pero realmente creo que podemos simplificar y enfocar de una forma mas directa en dos simples componentes que son:


1. Ataque al usuario.
2. Ataque al Aplicativo.


XSS - Cross-Site-Scripting I

El Cross-Site-Scripting, conocido también como XSS por sus siglas en ingles, es una vulnerabilidad que muchos desarrolladores dejan pasar por alto, quizás por falta de un planeamiento de análisis de riesgos en el proceso de diseño, desarrollo e implementación de sus aplicativos, o simplemente no lo vean como una falla que les va a presentar problemas en su aplicación, incluso por desconocimiento de esta vulnerabilidad.


¿ASP.Net o PHP?

Hace algún tiempo inicié con una serie de posts sobre .NET y por razones de tiempo no pude continuar con la regularidad que me hubiera gustado, pero bueno, aquí estoy de nuevo retomando los temas pendientes.

¿Peras o manzanas?, así de absurdo es intentar comparar estas 2 tecnologías. Es como querer comparar un camión con una carretera. Igualmente puede resultar decir cosas como “PHP es mejor que ASP.NET” (o viceversa), en todo caso el punto de comparación adecuado sería PHP con ASP “clásico” (la versión anterior), tecnología obsoleta desde el año 2000 aprox. Personalmente conozco las 2 tecnologías y he trabajado varios años con cada una de ellas. Pero bueno, entonces, ¿Cuál es la diferencia?…

PHP es un lenguaje de scripts, es decir que cada vez que se solicita una página PHP, se necesita interpretar el código para después ejecutarlo. Sin embargo, esto también tiene sus ventajas como por ejemplo, para hacer un cambio en un script PHP, solo se necesita guardar el archivo y listo. En general no es necesario compilar, registrar DLL’s o componentes en el sistema operativo del servidor.

En el caso de ASP.NET recordemos que es parte de toda una plataforma de desarrollo, la plataforma .NET. Como decía en el post anterior, el .NET no sólo sirve para crear páginas Web. Es por esto que ASP.NET se convierte en una opción mucho más poderosa en cuanto a la versatilidad. Al ser ASP.NET un componente de interface de todo el .NET Framework, ASP.NET puede servir para crear una interface Web rápida y fácilmente de por ejemplo, una aplicación Win32 (o de escritorio) reutilizando casi todo el código, o construir rápidamente una capa de Servicios (Web Services) que pueda ser aprovechada por aplicaciones móviles, Web y de escritorio simultáneamente. Esto tiene un valor muy grande sobre todo para empresas, donde el beneficio es construir rápidamente (y por lo tanto más barato) aplicaciones que puedan interactuar con otras ya existentes en la organización, o inclusive hacerlo con productos ya existentes.

Sin embargo, la implementación de una aplicación ASP.NET puede no ser tan simple como copiar y pegar los archivos. Y esto es porque ASP.NET solo se interpreta una vez, se pre-compila y cada vez que se ejecuta una página, el código se ejecuta directamente, sin pasar por la interpretación. Esta forma de interpretar el código solo una vez y después ejecutar directamente el código “compilado” es muy similar a la forma en que funcionan las páginas Web de JAVA (Una comparación de iguales sería más bien ASP.NET y JSP). En el caso de PHP, hay un producto desarrollado por Zend, que permite hacer un proceso similar de “pre-compilación”, para no tener que interpretar en cada solicitud el código con productos como el Zend Optimizer.

ASP.NET fue creado para poder desarrollar aplicaciones empresariales, que sean rápidas de desarrollar, que permitan ser escalables (en general agregar más servidores fácilmente), que puedan ejecutar procesos críticos o de alto impacto en la operación de la empresa, etc. Por todo lo anterior, el argumento de que “PHP es gratuito” no es necesariamente válido para una organización, donde el valor que tiene su información los hace no escatimar en la inversión para implementar sus sistemas. Es de sobra sabido que simplemente con los costos de licenciamiento de Windows, SQL Server (y toda la gama de productos extra que se pueden agregar), el costo de crear una aplicación puede crecer bastante, sin embargo el tiempo de desarrollo puede ser dramáticamente menor, lo que para la mayoría de las empresas resulta más redituable al poder tener en mucho menos tiempo una aplicación que empiece a recuperar la inversión rápidamente.

PHP es open source, y fue creado como hobbie. Está pensado específicamente para el Web y también tiene como objetivo ser extremadamente fácil de aprender. Sin embargo, por su naturaleza open source, ha tenido que pasar por un largo proceso de entrar al mundo empresarial y a ganarse el respeto como para que se decida crear una aplicación crítica en PHP. Hoy en día ha empezado a ganar mucho terreno en este campo, gracias a que algunas empresas han decidido utilizar el open source para su infraestructura y PHP es la elección natural en ese proceso. También gracias a los esfuerzos de Zend (empresa fundada por los inventores de PHP) de hacerlo atractivo para las empresas con iniciativas como el reciente Zend Framework o la Zend Platform que tratan de atender requisitos empresariales puntuales.

Otro hecho que debe ser interpretado con cuidado, es la penetración en el Web de cada tecnología. Estadísticamente, PHP es amo y señor del Web, ya que posee la mayor cantidad de sitios, sin embargo, la gran mayoría de esos sitios son páginas personales, blogs (basados en scripts como WordPress), foros (basados en scripts como phpBB), etc. que en su mayoría no son sitios con fines de poner en línea procesos críticos de negocio empresariales, por lo tanto es una cifra que no necesariamente significa que al ser la tecnología más utilizada sea “mejor”.

Así que, cuando oigas esta pregunta podrás responder con algo así como “Depende lo que quieras hacer, que plataforma tienes disponible, que presupuesto, que tan crítico es el proceso que quieres automatizar, es necesario interactuar con otras aplicaciones?, cuáles son tus necesidades de performance, etc”. Finalmente en este mundo del desarrollo de sistemas es mejor ser versátil que estar “casado” con uno u otro lado de la moneda

CODEORGAN:¿A qué suena tu sitio web?

Buen día SQLeros!! En esta ocasión estaba langareando en Internet y me encontré con una aplicación muy interesante, la cual esta desarrollada en Flash, y convierte el sitio web que le proporcionamos en una linda canción (Bueno a veces no pero esta chusca la cosa esta :) ).





[caption id="" align="aligncenter" width="300" caption="http://www.codeorgan.com/"]http://www.codeorgan.com/[/caption]

Ahora según nos cuenta el About del sitio, codeorgan, toma le código de la página y analiza el el contenido del cuerpo y lo transforma en musica, removiendo todos los caracteres que no se encuentran en la escala musical, es decir solo deja de la A a la G, despues de esto selecciona el sintetizador para el sonidito, donde se utiliza el número total de caracteres en el sitio.


Actualmente se cuenta con 10 estilos de sintetizadores y estos son utilizados de acuerdo a un porcentaje del contenido del sitio.


Y finalmente para definir el ritmo de la batería se utiliza la razón entre el número de caracteres de la página y el número de caracteres que son notas musicales y de igual forma se cuenta con 10 patrones de batería.


Al final de todo la (pinche) página suena (no!?). Acá el vinculo CODEORGAN.


Un Saludo!!


¿Qué es el CAPTCHA y RECAPTCHA?

Para poder distinguir a los humanos de los robots en las páginas web, sobre todo para evitar el spam y otros abusos, aparecieron los CAPTCHA: esas letras y números, normalmente distorsionadas que tienes que identificar en un formulario para que te deje enviarlo. Este término, marca registrada propiedad de la Carnagie Mellon University, es el acrónimo de “Completely AutomatedPublic Turing test to tell Computers and Humans Apart”. El Test de Turing tiene como objeto ver la capacidad de una máquina de mostrar inteligencia. Descrito por el profesor Alan Turing en 1950 el test consiste en una conversación entre un juez humano y otros dos interlocutores, uno humano y el otro una máquina, mediante un programa de teletipos o chat, para comprobar estrictamente la capacidad de la máquina de expresarse, no de reproducir palabras. Si el juez no es capaz de diferenciarlos, la máquina habrá pasado el test. Por eso los CAPTCHA están considerados tests de Turin inversos, ya que es el humano el que ha de demostrar su condición.


Los primeros CAPTCHA eran generados por programas que distorsionaban las imágenes, pero hecha la ley hecha la trampa, los chicos malos pronto encontraron métodos para saltárselos. Así que cada vez se hicieron más complejos añadiendo líneas y motivos de fondo.


Lo último son los reCAPTCHA cuyo lema ya casi lo explica todo (stop spam, read books), en lo que viene a ser un divertido ejercicio de “recontra-ingeniería-inversa”. El sistema es parecido, pero en vez de utilizar fondos raros o rayas, te presentará un par de palabras sacadas de libros antiguos que los programas de reconocimiento de escritura (OCR) no han sido capaces de identificar a los que además se le añade distorsión. Así que de paso que demuestras que eres humano, colaboras en la digitalización de libros antiguos. Según los datos de reCAPTCHA cada día se completan 60 millones de CAPTCHAs en todo el mundo, así que de la “computación distribuída” hemos pasado a la “computación distribuída humana”.


Además reCAPTCHA es gratuito y puedes implementarlo en tu blog (hay plugin para WordPress), y tiene una opción sonora para personas con problemas visuales.


Un Saludo!!

MariaDB, La Hermanita Menor de MySQL

Es por todos sabido que Oracle ha adquirido Sun, y con ello lo que Sun había adquirido meses atrás, hablo en concreto de MySql.


MySql es o era (no sé cuál de los dos calificativos es correcto) el sistema de bases de datos Open Source más famoso y utilizado en el mundo.


Sin embargo, ahora tenemos que Sun forma definitivamente parte de Oracle, y Oracle tiene ahora la "patita" en máquinas de Sun, la "pattita" en lenguajes con Java, y la "patita" de bases de datos con MySql, pero Oracle es famosa precisamente por tener un gestor de bases de datos muy poderoso, el propio Oracle que da nombre a la compañía, así que, ¿qué hacer con MySql?.


Hay que tener en cuenta además, que la sombra de Oracle es muy larga y lo suficientemente ancha como para ocultar a MySql de la faz de la tierra. La incertidumbre por lo tanto, es bastante grande con respecto al futuro de MySql.


De momento no ha hecho nada "raro" con MySql, sin embargo, hay mucha gente que comenta que Oracle va a empezar a cobrar soporte con MySql y en el futuro...:s ya veremos qué...;) igual incluso hasta desaparece...


Aún y así, un irreducible finlandés no se va a quedar de brazos cruzados.
Hablo de Ulf Michael Widenius a quién se le conoce con el apodo de "Monty" (blog de Monty).


Monty es el principal autor de MySql y miembro fundador de MySql AB, empresa que fue adquirida en Febrero de 2008 por Sun Microsystems como comentaba anteriormente. Por la nada depreciable cantidad de 16 millones de € ($ 252883200 MXN).


Con la venta de MySql, Monty se embolsó mucho dinero y en Febrero de 2009 dejó Sun para montar una nueva compañía. Los motivos por los que dejó Sun no están claros.


Lo peor para Oracle, es que Monty se ha puesto a crear un nuevo motor de bases de datos de datos teniendo en mente a MySql y agregándoles "esas" cosas que quería haberle agregado a MySql en su día y que por las razones que sean, no ha podido llevar a cabo.


La iniciativa de Monty tiene que ver sobre todo con la adquisición de Sun por parte de Oracle.


Adquisición maestra, ya que se ha manejado la situación estratégica de forma expecional. Primero Sun compra MySql,  todo normal y coherente, no!?.


Luego Oracle compra Sun, y aquí aparecen las dudas. Monty duda de la compra (seguramente se sintió engañado/decepcionado/triste como amante de un sistema gestor de bases de datos abierto).


El departamento de la libre competencia de la Unión Europea analiza entonces si vulnera la libertad, pero aunque Oracle y Sun tienen un frente común en el mundo de las bases de datos, no es menos cierto que al tener Sun sus departamentos de Hardware y Software con Java a la cabeza, se ha hecho claramente la vista gorda sobre MySql.


Sin dudas, siento que esto ya estaba pactado de ante mano y Monty fue engañado. Quitaron a MySql, y así Oracle solo tendría un único competidor real y de importancia, hablo de SQL Server.


Al menos a Monty le quedó la tranquilidad de haberse hecho rico. Pero Monty es como comentaba antes, un hombre irreducible y tenía pensado vengar su honor como si de un duelo se tratara.


En Internet apareció entonces una iniciativa impulsada por el propio Monty para salvar a MySql, hecho que motivó que Monty se adentrara en esta aventura.


El producto en el que anda trabajando se llama MariaDB. El nombre de Maria se debe a su hija menor.


En realidad, MariaDB es un fork (bifurcación, branch o rama) que parte del código base de MySql. Es decir y como ellos lo comentan en el wiki de la página MariaDB es un upgrade de MySQL.


La empresa de Monty encargada de llevar a cabo la aventura de MariaDB se llama Monty Program AB.


El icono elegido por Monty en este caso es una foca, icono que posiblemente utilice para sus distribuciones.




MariaDB Logo
MariaDB Logo


Ahora bien... ¿cuál es la versión actual de MariaDB?.
La versión actual es MariaDB 5.2.0 Beta que está basada en MySql 5.1.


Monty afirma que esta versión es estable, aunque no quiere decirlo muy alto porque es una versión en desarrollo y por lo tanto, no debería ser utilizada en producción.


El caso es que a Oracle le ha salido un emergente y posible competidor, porque el irreducible Monty no tiene pensado dejar tirada a la Comunidad y va a hacer todo lo posible por sacar adelante el proyecto de MariaDB.


Por su hija y por él mismo, va a luchar para prevalecer su honor. Una noticia que personalmente celebro de pie.

Diferencias entre TRUNCATE y DELETE en MySQL

Si os habeis preguntado alguna vez las diferencias entre truncate y delete en la base de datos MySQL Server. Aquí os pongo una pequeña explicación de cuando utilizar una u otra.


TRUNCATE


Este comando borra todas las filas de una tabla sin registrar las eliminaciones individuales en el log de transacciones.


Por ejemplo:


[sourcecode lang="sql"]TRUNCATE Cursos;[/sourcecode]


Borra todos los registros de la tabla Cursos


DELETE


DELETE borra las filas de una tabla, pero registra las eliminaciones individuales en el log de transacciones. Podemos utilizar la clausula WHERE para filtrar las filas que necesitemos eliminar.


Ejemplo:


[sourcecode lang="sql"]DELETE FROM Cursos  WHERE CursoId = 50;[/sourcecode]


DIFERENCIAS ENTRE TRUNCATE Y DELETE




  • Ambas eliminan los datos, no la estructura.

  • Solo DELETE permite la eliminación condicional de los registros.

  • DELETE es una operación registrada en el log de transacciones y trucate no.

  • TRUNCATE es una operación registrada en el log de transacciones, pero como un todo, en conjunto, no por eliminación individual. TRUNCATE se registra como una liberación de las páginas de datos en las cuales existen los datos.

  • TRUNCATE es más rápida que DELETE.

  • Ambas se pueden deshacer con un ROLLBACK.

  • TRUNCATE reiniciará el contador para una tabla que contenga una columna IDENTITY.

  • DELETE mantendrá el contador de la tabla para una columna IDENTITY.

  • TRUNCATE es un comando DDL(lenguaje de definición de datos) mientras que DELETE es un DML(lenguaje de manipulación de datos).

  • TRUNCATE no desencadena un TRIGGER, DELETE sí.

  • TRUNCATE recrea una tabla.


CUANDO USARLAS




  • Usar Truncate es más rapido que Delete si vas a borrar toda una tabla y no te importan los indices(identity) o bien quieres resetearlos.

  • Usar Delete para borrados selectivos.

  • Usar Delete en caso de tener Foreign Key, es decir .. usarla en caso de borrados en cascada.

Google Over SSL

Hace unos pocos días, fue de conocimiento público el hecho de que Google había estadorecolectando datos de redes Wi-Fi abiertas a través de sus vehículos asociados con el servicio Google Street View. Una oleada de protestas y dos demandas después, el asunto parece haber sido corregido en Mountain View, aunque la ignorancia por parte de miles de usuarios al dejar sus redes Wi-Fi completamente abiertas y sin una protección eficientesigue tan vigente como antes del incidente (N. del. R.: Cierren sus redes. No es broma.). Mientras tanto, Google se encuentra trabajando sobre una capa extra de protección para los resultados de las búsquedas hechas en su motor. En otras palabras, ha aparecido unaversión beta del clásico portal de Google, con una conexión segura utilizando el protocolo criptográfico SSL.




Google SSL



es Facebook. La gente acostumbra a ingresar a la red social con la clásica dirección WWW, pero si agregan una "s" al http, verán que Facebook tiene certificado de seguridad, y es compatible con esta clase de conexión. Google ha incluido conexiones seguras en varios de sus servicios, como es el caso de Gmail, pero ahora es el turno del portal de búsquedas. Actualmente el servicio se encuentra en fase beta, y es posible que los usuarios obtengan un rendimiento inferior al acostumbrado, pero lo hemos estado probando desde hace un buen rato, y no hemos tenido inconveniente alguno.

Tal vez pase algún tiempo hasta que la conexión segura en el portal de búsquedas de Google se convierta en la opción por defecto. Google ha explicado que la conexión segura sólo encripta las palabras claves y los resultados enviados. En caso de que el ordenador se encuentre infectado por alguna clase de malware o keylogger que pueda registrar la actividad del usuario, dicha conexión segura sería irrelevante, pero nunca está de más contar con una capa extra de seguridad. Desde todo punto de vista esto se ve como una especie de compensación ante el "error" cometido con los coches de Google Street View. No es necesario decir que Mountain View deberá tener más cuidado para la próxima, pero esto ha servido para que los usuarios obtengamos algo mejor. Después de todo, las búsquedas encriptadas no suenan nada mal.

Numeros Aleatorios Reales Con Random.Org

Hola SQLeros, el día de hoy les presento una aplicación web que es muy interesante se encuentra en la dirección RANDOM.ORG.





[caption id="attachment_306" align="aligncenter" width="300" caption="RANDOM.ORG"]RANDOM.ORG[/caption]

Lo peculiar es la forma en que los numeros aleatorios son generados, tal vez  se han preguntado cómo las máquinas predecibles como las computadoras pueden generar aleatoriedad.


En realidad, los números aleatorios usados en la mayoría de los programas de compudatora son pseudo-aleatorios, lo que significa que cada numero se genera en una forma predecible mediante una fórmula matemática.


Esto está bien para muchos propósitos, pero no puede ser al azar en la forma en que lo esperamos, por ejemplo si estás acostumbrado a juegos de azar o a la lotería.


RANDOM.ORG ofrece auténticos números al azar para cualquier usuario de la  Internet. El azar viene de ruido atmosférico, que para muchos propósitos es mejor que el algoritmos de números pseudo-aleatorios que se  utilizan normalmente en los programas de la computadora.

La gente usa RANDOM.ORG para la creación de dibujos, la lotería y sorteos, para realizar juegos, etc. , para aplicaciones científicas y para el arte y la música.


El servicio ha existido desde 1998 y fue construido y está siendo operado por Mads Haahr de la Facultad de Ciencias de la Computación y Estadística en el Trinity College de Dublín en Irlanda.


No esta demás señalar que la página cuenta con un API el cual esta expuesto en intenet y se puede consumir desde distintos lenguajes de programación con sus respectivas implementaciones.


Después de una breve platica sobre este servicio haremos un ejercicio en PHP.


Supongamos que necesitamos obtener un intervalo de números aleatorios para hacer alguna actividad.


[sourcecode lang="php"]
< ?php
/* Titulo: Numeros Aleatorios Reales Con Random.Org
* Autor: RammsZeñábI.
* Blog: SQLeros.Com.Ar 2010
*Funcion para recolectar una serie de numeros aleatorios desde la página RANDOM.ORG
* $numeros, es la cantidad de numeros que se decean obtener por defecto es 1.
* $minimo, es el intervalo izquierdo de la serie por defecto es 0.
* $maximo, es el intervalo derecho de la serie por defecto es 10.
* $base, es la base de la serie de los numeros obtenidos, por defecto es 10.
* $formato de la serie resultante puede ser "plain" o "html" por defecto es "plain".
*/
function aleatorioDeRandomDotORG($numeros=1,$minimo=0,$maximo=10,$base=10,$formato="plain")
{

$repuesta_http=""; //guardamos la serie de los numeros generados
$servidor="www.random.org"; //el dominio a donde crearemos la conexión.
$consulta="/integers/?num=$numeros&min=$minimo&max=$maximo&col=1&base=$base&format=$formato&rnd=new"; //la consulta GET que harémos.
$puerto=80; //puerto a donde se conecta el socket.
$tiempoEspera=30; //tiempo de espera para la conexión.

//Creamos un socket y si todo sale muy bien
if($fsock = fsockopen($servidor,$puerto, $errno, $errstr, $tiempoEspera))
{
//ejecutamos la consulta
@fputs($fsock, "GET $consulta\r\n");
// y leemos los datos.
while (!@feof($fsock))
{
//guardamos en la variable lo que leemos
//agregamos la marca "," para separalas por comas al final.
$repuesta_http .= fgets($fsock, 128).",";
}
//Cerramos el socket.
fclose($fsock);
}
//y finalmente devolvemos un arreglo con los valores de la serie.
return explode(",",$repuesta_http);
}
?>


Creación de Numeros Aleatorios Usando RANDOM.ORG


< ?php
//probamos el codigo.
$cosa=aleatorioDeRandomDotORG(5);
//ahora mostramos los valores.
echo "
    ";
    for($i=0;$i {
    echo "
  1. $cosa[$i]";
    }
    echo "";
    ?>

    SQLeros.Com.Ar



    [/sourcecode]

    Bueno un Saludo!!

Corriendo Wordpress ¿En SQL Server?

Creo que la posibilidad de correr Wordpress con SQL Server será del agrado de muchos, ya que por fin existe una solución tanto de forma local como en la nube mediante el uso de Windows Azure SQL Azure.


Existen dos formas de realizar la instalación:




  • Distribución: esta es la forma más fácil de empezar. Incluye la última versión de Wordpress con el parche de SQL Server ya aplicado.

  • Parche: son únicamente los archivos modificados, mismos que pueden ser aplicados a la versión de Wordpress que descargues.


El propósito de este parche es proporcionar una abstracción en la estructura de la base de datos dentro de Wordpress, causando un mínimo de errores en el core de Wordpress y sin perdidas en las características del CMS.


El tutorial completo de instalación consta tan sólo de 8 pasos.


Enlace: Download WordPress on SQL Server Distro & PatchWordpress on MicrosoftGetting Started

Microsoft Visual Studio 2010 En Castellano

Visual Studio 2010 es la nueva versión del entorno de desarrollo integrado para sistemas Windows que incorpora nuevas características mejoradas que hacen que todo el proceso de desarrollo, desde el diseño a la implementación, sea más sencillo.

Con este lanzamiento Visual Studio 2010 cuenta con versiones en inglés, francés, alemán, japones y español.

Visual Studio 2010 dispone de las soluciones, 2010 Profesional, 2010 Premium, 2010 Ultimate y Test Profesional 2010 que podrás compararse desde www.microsoft.com.

Interesados pueden encontrar más información acerca de Visual Studio 2010 así como acceder a la compra o descarga de una versión de prueba desde www.microsoft.com.

¿Que diablos es foobar?

Hola que tal SQLeros, me da mucho gusto que me estén leyendo en este post. Ahora hablaremos un poco de  los terminos  foobarfoobar, and baz,  esta palabra, ¿cosa?, ¿termino?, o lo que sea que se usa en la jerga informatica desde ya hace tiempo.


Pero apoco nunca se han preguntado (que chingaos) ¿cual es su significado?


Buscando un poco por la Internet, me he encontrado muchas cosas muy interesantes (y que realmente me han sorprendido) como:


la definición de la Wikipedia nos dice:



Foo es un término genérico ampliamente usado para aludir a cualquier entidad informática cuyo nombre se ignora o no se quiere expresar. Por sí misma la palabra foo no tiene un significado preciso, solamente es una representación lógica en el sentido en que las letras xy se usan en álgebra para representar un número desconocido.

La palabra foo aparece en el idioma inglés como un neologismo dada su popularidad en describir conceptos en las ciencias informáticas y muchas personas la consideran un ejemplo canónico de una variable metasintáctica. Se usa de forma amplia en la literatura informática anglosajona, generalmente en los ejemplos de programaciónpseudocódigo. La Real Academia Española no reconoce esta palabra como parte del idioma español.

El origen de tal palabra no está muy claro porque tiene antecedentes muy complicados, incluyendo una larga historia en los guiones decómicscaricaturas. Sintácticamente podría ser una abreviación de File Or Object.

Tal como se pueden nombrar a personas desconocidas como fulanomenganoperenganocitranozutano, en la informática también existe una familia de palabras como foobarfoobarbaz.

foobar en Facebook


¡Un RFC sobre la etimología del Foo!


Tambien como lo explica la wikipedia y demas definiciones es usada para describir, objetos, elementos o alguna cosa que es muy trivial o no tiene ninguna relevancia en el contexto.


Para dar ejemplos de código, configuraciones y demás aplicaciones en las que se muestra el comportamiento mas no el valor del elemento, objeto, cosa.


[sourcecode lang="php"]
< ?php
if($foo>$bar):
echo $foo;
endif;
?>
[/sourcecode]

Un Saludo!

El móvil de Hansel y Gretel

Anoche le contaba a la Nina un cuento infantil muy famoso, el Hansel y Gretel de los hermanos Grimm. En el momento más tenebroso de la aventura los niños descubren que unos pájaros se han comido las estratégicas bolitas de pan, un sistema muy simple que los hermanitos habían ideado para regresar a casa.Hansel y Gretel se descubren solos en el bosque, perdidos, y comienza a anochecer. Mi hija me dice, justo en ese punto de clímax narrativo: “No importa. Que lo llamen al papá por el móvil”.


Yo entonces pensé, por primera vez, que mi hija no tiene una noción de la vida ajena a la telefonía inalámbrica. Y al mismo tiempo descubrí qué espantosa resultaría la literatura —toda ella, en general— si el teléfono móvilhubiera existido siempre, como cree mi hija de cuatro años. Cuántos clásicos habrían perdido su nudo dramático, cuántas tramas hubieran muerto antes de nacer, y sobre todo qué fácil se habrían solucionado los intríngulis más célebres de las grandes historias de ficción.
Piense el lector, ahora mismo, en una historia clásica, en cualquiera que se le ocurra. Desde la Odisea hasta Pinocho, pasando por El viejo y el mar, Macbeth, El hombre de la esquina rosada o La familia de Pascual Duarte. No importa si el argumento es elevado o popular, no importa la época ni la geografía.


Piense el lector, ahora mismo, en una historia clásica que conozca al dedillo, con introducción, con nudo y con desenlace.


¿Ya está?
Muy bien. Ahora ponga un teléfono móvil en el bolsillo del protagonista. No un viejo aparato negro empotrado en una pared, sino un teléfono como los que existen hoy: con cobertura, con conexión a correo electrónico y chat, con saldo para enviar mensajes de texto y con la posibilidad de realizar llamadas internacionales cuatribanda.


¿Qué pasa con la historia elegida? ¿Funciona la trama como una seda, ahora que los personajes pueden llamarse desde cualquier sitio, ahora que tienen la opción de chatear, generar videoconferencias y enviarse mensajes de texto? ¿Verdad que no funciona un carajo?


La Nina, sin darse cuenta, me abrió anoche la puerta a una teoría espeluznante: la telefonía inalámbrica va a hacer añicos las nuevas historias que narremos, las convertirá en anécdotas tecnológicas de calidad menor.


Con un teléfono en las manos, por ejemplo, Penélope ya no espera con incertidumbre a que el guerrero Ulises regrese del combate.


Con un móvil en la canasta, Caperucita alerta a la abuela a tiempo y la llegada del leñador no es necesaria.


Con telefonito, el Coronel sí tiene quién le escriba algún mensaje, aunque fuese spam.


Y Tom Sawyer no se pierde en el Mississippi, gracias al servicio de localización de personas de Telefónica.


Y el chanchito de la casa de madera le avisa a su hermano que el lobo está yendo para allí.


Y Gepetto recibe una alerta de la escuela, avisando que Pinocho no llegó por la mañana.


Un enorme porcentaje de las historias escritas (o cantadas, o representadas) en los veinte siglos que anteceden al actual, han tenido como principal fuente de conflicto la distancia, el desencuentro y la incomunicación. Han podido existir gracias a la ausencia de telefonía móvil.


Ninguna historia de amor, por ejemplo, habría sido trágica o complicada, si los amantes esquivos hubieran tenido un teléfono en el bolsillo de la camisa. La historia romántica por excelencia (Romeo y Julieta, de Shakespeare) basa toda su tensión dramática final en una incomunicación fortuita: la amante finge un suicidio, el enamorado la cree muerta y se mata, y entonces ella, al despertar, se suicida de verdad. (Perdón por el espoiler.)


Si Julieta hubiese tenido teléfono móvil, le habría escrito un mensajito de texto a Romeo en el capítulo seis:


M HGO LA MUERTA,PERO NO STOY MUERTA.NO T PRCUPES NIHGAS IDIOTCES. BSO.


Y todo el grandísimo problemón dramático de los capítulos siguientes se habría evaporado. Las últimas cuarenta páginas de la obra no tendrían gollete, no se hubieran escrito nunca, si en la Verona del siglo catorce hubiera existido la promoción “Banda ancha móvil” de Movistar.


Muchas obras importantes, además, habrían tenido que cambiar su nombre por otros más adecuados. La tecnología, por ejemplo, habría desterrado por completo la soledad en Aracataca y entonces la novela de García Márquez se llamaría ’Cien años sin conexión’: narraría las aventuras de una familia en donde todos tienen el mismo nick (buendia23, a.buendia, aureliano_goodmornig) pero a nadie le funciona el messenger.


La famosa novela de James M. Cain —’El cartero llama dos veces’— escrita en 1934 y llevada más tarde al cine, se llamaría ’El gmail me duplica los correos entrantes’ y versaría sobre un marido cornudo que descubre (leyendo el historial de chat de su esposa) el romance de la joven adúltera con un forastero de malvivir.


Samuel Beckett habría tenido que cambiar el nombre de su famosa tragicomedia en dos actos por un título más acorde a los avances técnicos. Por ejemplo, ’Godot tiene el teléfono apagado o está fuera del área de cobertura’, la historia de dos hombres que esperan, en un páramo, la llegada de un tercero que no aparece nunca o que se quedó sin saldo.


En la obra ’El jotapegé de Dorian Grey’, Oscar Wilde contaría la historia de un joven que se mantiene siempre lozano y sin arrugas, en virtud a un pacto con Adobe Photoshop, mientras que en la carpeta Images de su teléfono una foto de su rostro se pixela sin remedio, paulatinamente, hasta perder definición.


La bruja del clásico ’Blancanieves’ no consultaría todas las noches al espejo sobre “quién es la mujer más bella del mundo”, porque el coste por llamada del oráculo sería de 1,90€ la conexión y 0,60€ el minuto; se contentaría con preguntarlo una o dos veces al mes. Y al final se cansaría.


También nosotros nos cansaríamos, nos aburriríamos, con estas historias de solución automática. Todas las intrigas, los secretos y los destiempos de la literatura (los grandes obstáculos que siempre generaron las grandes tramas) fracasarían en la era de la telefonía móvil y del wifi.


Todo ese maravilloso cine romántico en el que, al final, el muchacho corre como loco por la ciudad, a contra reloj, porque su amada está a punto de tomar un avión, se soluciona hoy con un SMS de cuatro líneas.


Ya no hay ese apuro cursi, ese remordimiento, aquella explicación que nunca llega; no hay que detener a los aviones ni cruzar los mares. No hay que dejar bolitas de pan en el bosque para recordar el camino de regreso a casa.


La telefonía inalámbrica —vino a decirme anoche la Nina, sin querer— nos va a entorpecer las historias que contemos de ahora en adelante. Las hará más tristes, menos sosegadas, mucho más predecibles.


Y me pregunto, ¿no estará acaso ocurriendo lo mismo con la vida real, no estaremos privándonos de aventuras novelescas por culpa de la conexión permanente? ¿Alguno de nosotros, alguna vez, correrá desesperado al aeropuerto para decirle a la mujer que ama que no suba a ese avión, que la vida es aquí y ahora?


No. Le enviaremos un mensaje de texto lastimoso, un mensaje breve desde el sofá. Cuatro líneas con mayúsculas. Quizá le haremos una llamada perdida, y cruzaremos los dedos para que ella, la mujer amada, no tenga su telefonito en modo vibrador. ¿Para qué hacer el esfuerzo de vivir al borde de la aventura, si algo siempre nos va a interrumpir la incertidumbre? Una llamada a tiempo, un mensaje binario, una alarma.


Nuestro cielo ya está infectado de señales y secretos: cuidado que el duque está yendo allí para matarte, ojo que la manzana está envenenada, no vuelvo esta noche a casa porque he bebido, si le das un beso a la muchacha se despierta y te ama. Papá, ven a buscarnos que unos pájaros se han comido lasmigas de pan.


Nuestras tramas están perdiendo el brillo —las escritas, las vividas, incluso las imaginadas— porque nos hemos convertido en héroes perezosos.


por Hernán Casciari