Category: Desarrollo


DataNucleus16-300.jpgSi buscamos una estrategia de administración de la información, una forma unificada de encarar el desafío de persistir datos, DataNucleus es una de las alternativas a considerar.

Es un proyecto libre, open source, con licencia Apache. Derivado de JPOX (o simplemente renombrado) proporciona las herramientas para trabajar con APIs como JDO (2, 2.1 u 2.2 ), JPA (1 y 2), REST y contra motores de servidores de bases de datos relacionales (RDBMS), de objetos (DB4O), XML, soluciones de Cloud Computing (Amazon, Google, etc), OpenOffice, Excel, JSON, HBase, LDAP, etc. También hay casos con MongoDB

Los lenguajes son JDOQL, JPQL, SQL, db4o Native, NeoDatis Native, NeoDatis Criteria…. y requiere JRE 1.5 o superior

Entre los usos actuales, destaca ser la capa para las soluciones Google App Engine  en Java, o JFire (un ERP libre), por sobre estos casos.

Obviamente se conjuga con nuestro querido Eclipse del que ya hemos hablado y seguiremos haciéndolo.

La arquitectura es simple y muy clara

 

Debo reconocer que en parte doy con esta solución o mejor dicho me inclino por ella, por el buen soporte. Como saben, estoy usando DB4O, como base de objetos y esta muy bien documentada la opción

Eclipse y PHP

Gracias a nuestro aclamado Eclipse PDT, el desarrollo de PHP, nunca fue tan facil.

Si bien, gracias a symfony y al autocompletado, se hace todo muy intuitivo. Con Eclipse podemos hacernos nuestros propios atajos de codigo.

Menu  > Window > Preferences > PHP  > Templates

Nos ofrecera la posibilidad de editar los existentes o de crear uno nuevo. Le damos a NEW y debemos tener algo asi:

Eclipse Indigo

Ya tenemos entre nosotros la nueva versión de Eclipse este entorno de desarrollo integrado o ambiente-herramienta-comunidad (ya no tengo en claro que más puede llegar a ser). Me refiero a Eclipse Indigo (v3.7).

Ya habíamos hablado de Eclipse. Si bien la anterior versión ya era destacable, esta nueva versión, avanza en lo que respecta a modelado introduciendo AcceleoAgent Modeling PlatformModeling Amalgamation, CDO.

Otro aspecto a celebrar es en el campo del trabajo colaborativo, EGit 1.0 es provisto para una mejor integración con el sistema de versionado Git. Jubula ofrece una interfaz para efectuar testing tanro para Java como HTML. WindowBuilder, fue una donación de Google para Eclipse y ahora se puede contar con un excelente diseñador gráfico de Interfaz de Usuario (GUI). Xtext 2.0 permite crear facilmente domain specific languages.

Eclipse Modeling Framework también es referenciado como EMF. Es un importante proyecto dentro del universo Eclipse, que proporciona un marco de trabajo, herramientas y por sobretodo metodología para el modelado de objetos y generación de código que acelera el desarrollo de aplicaciones.
Si bien parece algo respecto solo a UML, va mas allá. La documentación es extensa. Ofreciendo diversos beneficios como conectividad de datos, validación, consulta, transacciones, persistencias, etc


Eclipse

Eclipse es un entorno de desarrollo integrado de código abierto multiplataforma para el desarrollo de sistemas y tecnologías. Muy conocido por los desarrolladores y programadores (software libre y código abierto) de lenguajes como JavaCC++,AdaCOBOLPerlPHPPythonRuby (Ruby on Rails ), Scala,ClojureScheme, etc. La lista puede serguir.

Pero no solo es un entorno, también es una plataforma en sí misma, es decir que puedes pensar en desarrollar toda tu ecosistema de software sobre utilizando como base Eclipse mismo. Esta construido sobre Equinox (una implementación OSGi). Sus objetivos pueden ser muy variados

  • Aplicaciones de Cliente Enriquecido.
  • OSGi
  • Web
  • Desarrollo de Aplicaciones para celulares y tablets.
  • Modelado
  • Análisis
  • Testing

Una de las cosas que siempre pasamos por alto, es realizar las típicas operaciones aritméticas sin pensar demasiado en como los compiladores o interpretadores lo realizan.

Por ejemplo, podemos comprobar como correcta la siguiente ecuación:

(int) ( (0.7 + 0.1) * 10 ) = (0.7 + 0.1) * 10

Como bien sabemos todos, (int), es una forma de obtener el Entero de un número. Otro aspecto interesante es su velocidad, ya que en muchos lenguajes, es un constructor de los mismos, es decir es un rasgo nativo del ellos y ahí radica la razón de su performance. View full article »

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.