Latest Entries »

Teorema CAP

Bueno, estas son de las cosas que a veces uno le gustaria haberse enterado hace algunas decadas…

Damas y Caballeros

EL TEOREMA CAP, también llamado Brewer’s theorem, establece que es imposible para un sistema de computo distribuído dar simultaneamente las siguientes tres garantías:

Consistency (Consistencia :todos los nodos ven la misma información al mismo tiempo)

Availability (Disponibilidad: la falla de un nodo no impedirá al resto de los nodos seguir funcionando)

Partition Tolerance (Tolerancia a Fallos: El sistema sigue funcionando a pesar de la pérdida de información)

Segun el teorema, solo se pueden satisfacer dos de estas tres carasterísticas al mismo tiempo, pero nunca las tres.

PHP Desreferenciado

En los artículos de Johnathan Wage y de Schlueters hay una excelente explicación sobre está característica de PHP.

Vamos a seguir con una forma muy practica de asignar un valor a una o rango de celdas. Para aclarar lo de Rango, lo podemos definir como una selección de 1 a n celdas, siendo esta selección siempre conjunta y consecutiva de manera de formar un rectángulo. Es decir podemos seleccionar las celdas b1, b2, b3,  c1, c2, y c3, pero no b1, b2, b3, y d8.

Aclarado lo que queremos entender por Rango, retomamos nuestra serie de códigos. En la función onOpen(), incluimos la siguiente linea :

 {name: "Rellenar Celdas", functionName: "rellenarCeldas"},

La función quedaría así:

function onOpen() {
 var planilla = SpreadsheetApp.getActiveSpreadsheet();
 var itemsDeAcciones = [
 {name: "Rellenar Celdas", functionName: "rellenarCeldas"},
 {name: "Recordar mi Email", functionName: "recordarEmail"},
 {name: "Pedir Nacionalidad", functionName: "pedirNacionalidad"}];
 planilla.addMenu(“Acciones”, itemsDeAcciones);
}

Ahora que ya tenemos nuestro nueva acción en el menú, vamos a establecer la funcionalidad propiamente dicha:

function rellenarCeldas() {
  var rellenar = Browser.inputBox("Rellenar las Celdas con:");
  SpreadsheetApp.getActiveRange().setValue(rellenar);
}

Paso a explicar el código de las siguiente forma. Se define una nueva función como habíamos aprendido anteriormente, se establece una nueva variable rellenar con la información que suministre el usuario a través de un cuadro de diálogo con el método inputBox(). Luego para el documento actual, se obtiene el Rango de Celdas seleccionadas con el método getActiveRange(), y a las mismas se les asigna un valor dado setValue().

Cabe recordar que para la prueba del ejemplo el usuario antes de elegir la acción del menú, debería hacer su selección de celdas.

Como siempre, para probar todo esto, guardamos el código en el editor, y recargamos la página en el navegador.

Antes de pensar que hoy hemos terminado, pensemos en que otras formas podemos asignar valores a una celda. Pensemos en poder indicar la celda y su valor. Reiniciamos entonces en la función onOpen(), incluimos la siguiente linea :

 {name: "Asignar Valor", functionName: "asignarValor"},

La función quedaría así:

function onOpen() {
 var planilla = SpreadsheetApp.getActiveSpreadsheet();
 var itemsDeAcciones = [
 {name: "Asignar Valor", functionName: "asignarValor"},
 {name: "Rellenar Celdas", functionName: "rellenarCeldas"},
 {name: "Recordar mi Email", functionName: "recordarEmail"},
 {name: "Pedir Nacionalidad", functionName: "pedirNacionalidad"}];
 planilla.addMenu(“Acciones”, itemsDeAcciones);
}

Ahora que ya tenemos nuestro nueva acción en el menú, vamos a establecer la funcionalidad propiamente dicha:

function asignarValor() {
  var planilla = SpreadsheetApp.getActiveSpreadsheet();
  var celda = Browser.inputBox("Indique la Celda:");
  var valor = Browser.inputBox("Indique el Valor:");

  if (typeof valor != "number") {
    // comprobamos que valor sea un número
    Browser.msgBox("El Valor ingresado, no es un número");
  } else {
    planilla.getRange(celda).setValue(valor);
    Browser.msgBox("Se ha asignado a la celda " + celda + ", el valor numérico " + valor );
  }

}

Paso a explicar el código de las siguiente forma. En realidad, salvo la última linea las demás ya son conocidas; lo único que introducimos en este ejemplo es el uso del método getRange(). Además hemos empleado un condicional if y de la palabra reservada typeof . Ambas se explican por sí mismas, pero sino, no se preocupen. Estas son las razones por las que Google eligió Javascript, existe un millón uno de tutoriales que explicarán mejor que este servidor su utilidad.

Para completar el tutorial anterior, lo mejor es asignar un sentido a cada acción del menu creado.

Con el siguiente código, habíamos creamos una función que se ejecutará automáticamente cada vez que la planilla se recargue.

function onOpen() {
// Esto es un comentario
}

Lo que este entre “{” y “}”, será parte de esta función onOpen().

Entonces editamos la función onOpen() para que quede de la siguiente forma. Las lineas que empiezan con “//” son lineas de comentarios que explican la linea de código debajo de ellas y por ende son ignoradas

function onOpen() {
 var planilla = SpreadsheetApp.getActiveSpreadsheet();
 var itemsDeAcciones = [
 {name: "Recordar mi Email", functionName: "recordarEmail"},
 {name: "Pedir Nacionalidad", functionName: "pedirNacionalidad"}];
 planilla.addMenu(“Acciones”, itemsDeAcciones);
}

Declaramos una variable “planilla” que representará a la hoja activa de nuestro documento

var planilla = SpreadsheetApp.getActiveSpreadsheet();

Declaramos los items de nuevo menu a crear, los mismo se contiene en una variable “acciones”

var itemsDeAcciones  = [

Declara cada item, con “name” establecemos que aparece,  con “functionName” establecemos que función debe ejecutarse

{name: "Recordar mi Email", functionName: "recordarEmail"}

A la planilla de nuestro documento ahora le agregamos un menu ( método addMenu() ), que se llame “Acciones”, que tendra como items lo anteriormente declarado en “itemsDeAcciones”

planilla.addMenu(“Acciones”, itemsDeAcciones);

Note que revisando las dos lineas que más se parecen, la única diferencia es que la última no termina con una coma (,).

Ahora es turno de escribir las dos nuevas funciones :

function recordarEmail() {
 var email = Session.getUser().getEmail();
 Browser.msgBox("Tu dirección de email es : " + Session.getUser().getEmail() );
} 

En la anterior función, solo reportamos un cuadro de diálogo con Browser.msgBox(), que muestre una leyenda mas tu dirección de correo electrónico

function pedirNacionalidad() {
 var nacion = Browser.inputBox("Indique su Nacionalidad:");
 Browser.msgBox("Gracias, la nacionalidad ingresada fue : " + nacion);
}

Aquí, un cuadro de diálogo con Browser.inputBox() pide que el usuario ingrese un dato, el mismo se guarda en la variable nacion y luego se informa junto a una leyenda para darle sentido.

Para empezar con un ejemplo simple, lo mejor es hacerlo también con uno que nos sirva para el resto de los ejemplos.

En esta primera oportunidad, crearemos una opción más para el MENU.

Vamos al editor, y en el cuerpo del mismo pegamos este código:

function onOpen() {
  var planilla = SpreadsheetApp.getActiveSpreadsheet();
  var itemsDeAcciones= [ 
    {name: "Primera Accion", functionName: "primerAccion"},
    {name: "Segunda Accion", functionName: "segundaAccion"},
    {name: "Tercera Accion", functionName: "terceraAccion"}
  ];
  planilla.addMenu("Acciones", itemsDeAcciones);
}

Guardamos el anterior script ( MENU ARCHIVO > GUARDAR ), y seguramente nos preguntara que nombre le daremos al archivo. De ustedes depende.

Cerramos el editor, y recargamos nuestra planilla de calculo.

Notarán al cabo de unos segundo un MENU ACCIONES, al lado de AYUDA.

¡Felicitaciones! han logrado pasar el primer tutorial.

Desde Google Docs, la empresa de la gran G, nos brinda una suite de soluciones increíbles e impensadas hasta hace poco. Tener una herramienta de ofimática colaborativa a costo de una conexión de Internet, parece ser el sueño de todo apasionado por la tecnología, sea un avanzado usuario o un interesado casual.

Ahora tenemos la posibilidad de agregar funcionalidades a nuestras planillas, al mejor estilo de los programadores.

GOOGLE APPS SCRIPTS, en adelante Google Scripts o GS, nos ofrece la oportunidad de crear soluciones para las mas diversas de nuestras necesidades. Y lo mejor de todo es que Google, sigue mejorando día a día esta tecnología. El lenguaje para aprovechar el poder ofrecido por la API de Google es, JAVASCRIPT. Un viejo amigo de los programadores y diseñadores web desde hace más de una década. Un poco olvidado en una época, pero resurgido de las cenizas con toda la movida de las Web 2.0, y navegadores web mas poderosos, como nuestro querido Mozilla Firefox. En la web, hay tutoriales a montones de como aprender esta tecnología.

Para empezar con ejemplos, suponemos que tenemos establecido al español nuestro perfil, y que para acceder al editor de javascript, usamos el menú HERRAMIENTAS > SECUENCIAS DE COMANDOS > EDITOR DE SECUENCIAS DE COMANDOS …

Vamos a establecer una lista de accesos a los ejemplos ahora mismo para los mas ansiosos:

1) Creando un Menú de Acciones Personalizado
2) Cuadro de Dialogo: Pidiendo e Informando
3) Dando valor a un Rango de Celdas
4) Conociendo quienes somos
5)

PHP 6: Que hay de nuevo

La llegada de PHP6, esta cerca. La promesa de una mejor POO y el soporte UNICODE, es bien conocido.

Con Unicode, tendremos una referencia única a cada caracter, así como una lista mas completa… mas de 99000.

Una de las formas mas populares de apreciar el cambio, es cuando en el resultado del buscador, aparecen caracteres “raros” o expresiones en otro idioma, o frases en árabe, chino, etc

Una idea de lo que podremos lograr, es con un ejemplo del Unicode composition, que permitirá crear caracteres nuevos a medida que cada lenguaje o idioma evolucione.

unicode

La internacionalización será mas fácil, y la Transliteración, nos permite escribir en un idioma y convertirlo a otro, para que lo podamos pronunciar sin vergüenza ninguna. Con PHP6, solo lleva un par de lineas de código.

El TextIterator es una nueva característica de PHP 6, puedes iterar en cada punto, caracter, palabra o linea, y en ambos sentidos. Y poder cortarlos es mucho más fácil.

El ROADMAP, se esta actualizando pero imagino que pronto tendremos una release de PHP6, aunque ello no impida un PHP5.4

Fuente : http://blogs.zdnet.com/BTL/?p=9313

Symfony 2 para phpBB4

En un reciente articulo de phpBB, se explica el porque se eligió Symfony 2, como base de desarrollo del nuevo phpBB4.

Sobre Symfony 2 : http://symfony-reloaded.org
Código http://github.com/symfony

¿Qué es Symfony 2?

Symfony 2 es una reescritura completa de su código original, el cual se enfoca en resolver los problemas de las anteriores versiones ( 1.0 a 1.4). Symfony, se convirtió en una herraminta apreciada por la comunidad PHP. Tiene una gran cantidad de plugins que resuelven distintos desafios y promete un mejor uso de los recursos que como lo hacia symfony 1.

¿Porque Symfony 2 para phpBB4?

La siguiente lista explica en cada punto las razones. La misma esta basada en los items de los Principios de Programación de phpBB4.

  • phpBB4: PHP 5.3+
    • Symfony 2 fue re-escrito en PHP5.3, consistentemente con el enfoque de phpBB4.
  • phpBB4: Hace uso de namespaces y de la autocarga standar.
    • Symfony 2 es el primer framework en seguir el autoloading standard de PHP5.3, mejorando la interoperabilidad del proyecto PHP.
  • phpBB4: Código limpio y modular orientado a objetos con clases desacopladas
    • Symfony 2 es un framework orientado a objetos. De arquitectura simple y fácil API.
  • phpBB4: Los Plugins pueden completamente reemplazar MODs sin ningun cambio en el código
    • Symfony 2: Como se menciono antes Symfony 2 esta en bundles que no necesitan de modificaciones. Symfony 2 hace uso de códifo generado.
  • phpBB4: Usar existentes librerias / frameworks en luhar de reinventar la rueda
    • Symfony 2: El uso de un framework como Symfony 2 ya casi permite esto. Además Symfony 2 digue de cerca al Zend Framework.
  • phpBB4: Fácil integración con software
    • Symfony 2: Usando Symfony 2 phpBB4 automaticamente podrá integrarse en un proyecto Symfony cualquiera. El diseño de Symfony 2 también requiere que hagamos phpBB de manera modular,.
  • phpBB4: Escalabilidad (ejecutarse sobre clusters)
    • Symfony 2: Symfony tiene una historia de ejecutar grandes services, y Symfony 2 esta diseñado para la alta performance.
  • phpBB4: Consistente con el uso de Dependency Injection
    • Symfony 2 esta construido alrededor de un Dependency Injection Container, usando Dependency Injection por todos lados.
  • phpBB4: Pruebas automatizadas: Pruebas Unitarias, integración de pruebas y pruebas funcionales con PHPUnit, Selenium
    • Symfony 2 tiene ya las pruebas automatizadas y permite a los proyectos usar cualquier framework de pruebas.
  • phpBB4: Un framework de desarrollo para phpBB (hacer aplicaciones basadas en phpBB, estandarizar nuestro framework en una libreria)
    • Symfony 2 es un framework y tiene mas sentido que hacer uno específico para phpBB. Partes de phpBB serán reusables.

Es absolutamente asombroso como Symfony 2 coincide con los requisitos de phpBB4.

¿Que otra cosa puede Symfony 2 dar?

Ya que su comunidad es muy grande, podemos contar con mas desarrolladores y mas aportes. Los clientes necesitan una integración de un foro dentro de un proyecto Symfony y es problema común para los programadores. En vez de crear un propio, se puede usar phpBB integrado. Los desarrolladores con esta necesidad pueden ayudar a phpBB.

Para conocer mas http://symfony-reloaded.org

Bueno siguendo con el tema de rendimiento, esta claro que el ORM, no es un elemento mas de nuestro framework.

La encuesta sigue en http://spreadsheets.google.com/viewform?formkey=dFVFLXdBcGNvcFEwdVZmN3ZLU193cmc6MA

Como recordaran por el benchmark que comente aqui http://groups.google.com/group/symfony-es/browse_thread/thread/6a6cc2ec5b1d0920/66bdce04bcd7a2b4?hl=en#66bdce04bcd7a2b4

Pronto publicare el resultado de usar SF1.3+Doctrine2 con el resto de los resultados existentes en  http://www.puentesdiaz.com.ar/blog/?p=167

Hasta ahora, el ranking del mas veloz, queda así

Symfony 1.3 ALPHA2 + Propel 1.4 BETA

supera a

Symfony 1.3 ALPHA2 + Propel 1.3 Final

supera a

Symfony 1.3 ALPHA2 + Doctrine 1.2 Final

Lo curioso es que Propel sigue siendo mucha mas rápido que Doctrine, e incluso a partir de las modificaciones que tiene PROPEL 1.4… es aun mas rápido… mucho mas rápido

Segun me comenta Francois Zaninotto en http://groups.google.com/group/propel-users/msg/8c512ae7c5f91059?hl=en
Si eliminamos los tiempos de carga propios de Symfony, es decir lo ajeno a los ORM. El verdadero rendimiento del ORM, se deja ver. Mostrando un rendimiento de casi el doble del calculado inicialmente.

Una explicaciones la expone aqui
http://groups.google.com/group/propel-users/msg/e1fa266179ae20da?hl=en

En pocas palabras, se puede decir que este es otro ejemplo de “sobreingenieria”. Doctrine es muy impresionante por todo lo ofrecido. Una fuerte OO, etc.

Sin embargo, la eleccion entre PROPEL y DOCTRINE, se me presenta como otro caso en que debemos determinar donde esta linea. Merece hacer tanta herencia de clases? Hasta cuanto podemos renunciar al rendimiento…

Hasta ahora la encuesta muestra unos votos a favor de Doctrine…. Yo por mi parte le doy mi voto a PROPEL

Desde hace ya unas cuantos días termine el proyecto de tener traducido a nuestro idioma la segunda edición del Libro Oficial de Capacitación Practical Symfony : JOBEET,  y esta vez no solo para Symfony 1.2 sino también para el nuevo Symfony 1.3. Como imaginarán es el mismo libro pero adaptado para la nueva versión.

El tutorial como es lógico está en constante cambio, revisando errores, y mejorando sus partes, con el finde dar un mejor recurso para los rrhh de las empresas. Con mejores versiones de cada una de sus partes así como el uso de las mejores prácticas del mundo profesional de desarrollo web
Y aunque esta muy bien realizado, se recomienda ver las últimos cambios en cada día del tutorial.

Como siempre, para nuestros dos más queridos ORMs

Symfony 1.3 + Propel:
http://www.symfony-project.org/jobeet/1_3/Propel/es/

Symfony 1.3 + Doctrine:
http://www.symfony-project.org/jobeet/1_3/Doctrine/es/

Symfony 1.2 + Propel:
http://www.symfony-project.org/jobeet/1_2/Propel/es/

Symfony 1.2 + Doctrine:
http://www.symfony-project.org/jobeet/1_2/Doctrine/es/