000 Ipads

000 Ipads es el Trending del día (en Irlanda) en twitter. Por lo visto esta extraña cifra de cero iPads viene a cuenta de que a salido a la venta y está triunfando.

Desde mashable apuntan que son 90.000 y en el apartado de tecnología de la CNN dicen que son 120.000 vendidos el primer día de los cuales 50.000 en las primeras 2 horas.

Queda bastante claro que esta tableta pseudo-inutil causa estragos. Los fanboys de apple rondan por doquier y mantienen a su venerada empresa con las acciones bien altas.

Por lo visto los chicos de twitter tienen bastante en cuenta los singnos de puntuación a la hora de tomar los Trends. Cómo se suele puntuar en los números de más de 3 cifras (a veces con comas), los trends se han hecho un lio.

El algoritmo que hace hash a las palabras que aparecen en un twitt lo más probable es que lo realice de más de una palabra, ya que en ocasiones aparecen treads de incuso 4 conceptos, así no es raro pensar que realiza hash de todas las frases separadas por signos de puntuación, motivo por el que aparece este “fallo” en los temas de irlanda.

No es de extrañar que con toda esta plataforma detrás de un servicio, aunque parezca tan sencillo, tiene un volumen de mensajes que supera los 40 millones diarios. Es normal que procesando, almacenando y buscando entre toda esta inmensa maraña de mensajes de 140 caracteres Twitter tenga cada vez más caídas de servicio, aunque aun no son muchas, ya se dejan notar.

, , , ,

No hay Comentarios

Patrón Singleton implícito en JavaScript

Uno de los tantos patrones arquitectónicos en ingeniería del software es el llamado Singleton. No voy a explicar el patrón singleton por completo, simplemente decír que como idea principal se define una clase de la que solo existirá una instancia.

Por lo tanto en una clase qu cumpla con el singleton se define el método getInstancia() que solo se ocupa de devolver la única instancia existente. Así que el constructor no se ejecuta siempre, solamente invoca cuando no existe ninguna instancia. Cuando si la hay se devuelve la referencia a ella. Así de sencillo.

Y esto se implementa así en cualquier lenguaje orientado a objetos. De hecho incluso en JavaScript se puede implementar una clase con estas caracteristicas, el unico problema es que en JavaScript no hay métodos privados y siempre podría hacer un new miClase() y me devolveria una instancia nueva.

Pues bien, hay una caracteristica en JavaScript que me hace pensar que esto se puede hacer sin ningun problema, solo por las caracteristicas del propio lenguaje, ya que una funcion es una funcion y una variable también puede serlo etc. y jugando con esto podemos definir una clase que compla el partrón implicitamente y otra que no.

Definir el objeto

Objeto que no cumple el patrón singleton:

function objetoNoSingleton(){
   this.cadena = "cadena de texto";
   this.metodo = function(){
      alert(cadena);
   }
}

Objeto que cumple el patrón singleton:

var objetoSingleton = {
   cadena : "cadena de texto",
   metodo : function() {
      alert(cadena);
   }
}

Este objeto singleton es una variable y un objeto, pero es un objeto de clase irreproducible, de hecho al ejecutar new objetoSingleton() la instrucción falla.

Añadiendo funcionalidades

Existen diferencias de sintaxis debido al lenguaje. De hecho si queremos utilizar la propiedad prototype (no la libreria) para añadir métodos o variables a los objetos también existen diferencias.
Objeto que no cumple el patrón singleton:

objetoNoSingleton.prototype.valor2 = "valor dos";
objetoNoSingleton.prototype.metodo2 = function(){
   alert(valor2);
}

Para ser ejecutado necesitamos una instancia ya que estamos añadiendo funcionalidades a una clase no a un objeto en particular:

var instanciaNoSingleton = new objetoNoSingleton();
instanciaNoSingleton.metodo2();

Objeto que cumple el patrón singleton no hay que usar prototype. Crear un nuevo elemento en el objeto es simplemente nombrarlo y asignarle valor porque ya es una instancia.

objetoSingleton.valor2 = "valor dos";
objetoSingleton.metodo2 = function(){
   alert(valor2);
}

objetoSingleton.metodo2();

Con un objeto único se elimina el método getInstancia() típico del patrón Singleton, pero en si también desaparece la función new, por lo que en realidad el objeto a usar va a ser siempre la misma instancia.

, , ,

1 Comentario

UP y desarrollo ágil. Estragegia para triunfar en un proyecto

Las metodoligías ágiles, en lo que a modelos de proceso se refiere no son ya algo nuevo, pero puede que sí lo sea su uso. Como en general todo lo que se decidió usar a raíz de la crisis del software, hace más de 20 años, es en la actualidad cuando la industria del software se va dando cuenta que es útil.

El proceso unificado (UP) combina buenas prácticas comunmente aceptadas, un ciclo de vida iterativo y desarrollo dirigido por los riesgos (risk-driven), esto es, los riesgos son abordados para ser solucionados cuanto antes. Se considera un riesgo aquellas partes en las que las decisiones a tomar son criticas.

Etapas del UP

Etapas del UP

El proyecto software será dividido en iteraciones. Las iteraciones se pueden considerar unidades de desarrollo. Cada una es un miniproyecto. En la literatura (larman.pdf) al respecto del modelo UP (o RUP en ocasiones por Rational UP) se puede encontrar como consejo a la duracion de una iteración entre 2 y 6 semanas. Y a demas las iteraciones seran de duración fija, así que si en una iteración tenemos demasiado trabajo es momento de no dormir, y planificar menos tareas para la proxima iteración.

El resultado de una itración es un sistema ejecutable pero incompleto, NO un prototipo, el desarrollo iterativo no es prototipado. Lo que se tendrá es un subconjutno del sistema final.

Pero lo que caracteriza realmente los modelos ágiles es la relacion con el cliente. El cliente siempre que se le entrege algo lo probará y dira:  “sí, es lo que yo queria … pero”. Las continuas entregas y rectificaciones del cliente nos ayuda a adaptar el producto a las necesidades de quien nos contrata para desarrollarlo.

Así cada ciclo de desarrollo se convierte en un proceso de:

Construcción-Retroalimentación-Adaptación

Entregarle al cliente lo que él quiere y no lo que pensó sin mucha idea cuando firmó el contrato es lo que hace que los proyectos concluyan satisfactoriamente. Dentro de los modelos ágiles hay muchas variantes, el UP es una de ellas que da buenos resultados.

, , , ,

2 Comentarios

Validar formularios en JavaScript

En toda aplicación web de hoy en día no pasa sin que el usuario meta la pata, aunque sea de forma premeditada, por eso los fromularios hay que comprobar que no nos la cuelan. Validar los datos hay algo que siempre hay que hacer en el lado del servidor, pero le podemos dar agilidad a la web si antes de mandar el formulario lo verificamos en el lado del cliente.

Esto para nada es un problema nuevo, y ya se ha intentado solucionar de muchas maneras en JavaScript. Algunas de las librerias(bibliotecas) son especificas para validación, otras son usos especificos de otras más genericas. En cualquier caso si quieres ponerte a escribir tus funciones JS que validen los formularios que sepas que estas Reinventando la Rueda, porque ya se ha hecho unas cuantas veces:

Ketchup basado en JQuery:

http://demos.usejquery.com/ketchup-plugin/

Vanadium:

http://vanadiumjs.com/

JQuery:

http://bassistance.de/jquery-plugins/jquery-plugin-validation/ (demo)

Validation con Prototype:

http://tetlaw.id.au/view/javascript/really-easy-field-validation (demo)

MooTools:

http://mootools.floor.ch/en/demos/formcheck/ (demo)

JsVal:

http://jsval.fantastic-bits.de/

Validanguage:

http://www.drlongghost.com/validanguage.php (demo)

Django (basado en Google App Engine):

http://code.google.com/appengine/articles/djangoforms.html

LiveValidation:

http://livevalidation.com/ (demo/ejemplos)

wForms:

http://www.formassembly.com/wForms/ (demo)

Yav (última versión del 2008):

http://yav.sourceforge.net/

JSValidate/JValidate:

http://www.jsvalidate.com/ , http://www.jvalidate.com/

fValidator:

http://zendold.lojcomm.com.br/fvalidator/

qForms (últmia versión del 2007):

http://www.pengoworks.com/index.cfm?action=get:qforms

Validatious:

http://validatious.org/

Si te quieres montar tu propia libreria puedes empezar con los ejemplos propuestos en w3schools.

Libreria de validacion abandonada en 2004 chrysalis.

A parte de la validación el elemento visual es también algo que deja que desear bastante en los formularios. CustomFormElements da un aspecto agradable a los formularios web, incluso se pueden parecer a aplicaciones de escritorio. Está disponible para usar con Mootools y JQuery.

, , , ,

1 Comentario

CoffeeScript enriquece y optimizar JavaScript

Leo en GitHub que CoffeScript es un proyecto para JavaScrit que realiza la misma tarea que SASS en CSS (¿cueces o enriqueces?).

CoffeeScript ofrece una sintaxis concisa inspirado por Ruby y Python, listas por comprensión, los operadores existencial para eliminar los controles typeof molestos, y un modelo de herencia fiable para arrancar. CoffeeScript
Algunos proyectos ya están apareciendo, como en rack de café e incluso una reescritura de underscore.js, Se puede comarar la version en JS pura (0.5.8) con la reescrita en Coffee (0.5.7), aunque no son la misma versión, entre versiones no cambian muchas cosas, y se puede ver que se clarifica el código y se ahorran unas cuantas lineas.

En su web comentan que CoffeeScript tiene los mismos “genes” que JS pero distinto estilo (XD). Aun está creciendo pero tiene buena pinta el lenguaje.

Estos lenguajes orientados a programadores muy especificos parece que sean una locura, pero para aplicaciones web con mucho uso JS pueden ser útiles (y con programadores que conozcan ruby o pyton aun más). Se puede decir que son lenguajes en el final del long tail, muchos frameworks también empezaron siendo para unos pocos.

, ,

No hay Comentarios

Lenguaje Sass. El CSS 2.0

Me he encontrado con el lenguaje SASS. Según sus autores hace el CSS fácil y divertido. Es como si un monton de diseñadores artos de algunas cosas de CSS se hubiesen puesto a programar, y esto es lo que ha salido.

Sass es un meta-lenguaje que está sobre CSS que se utiliza para describir el estilo de un documento de forma limpia y estructurada, con más potencia que que la que permite CSS plano.

Sass, proporciona una sencilla sintaxis más elegante para CSS e implementa varias características que son útiles para crear hojas de estilo manejable.

Dan algunos ejemplos de la sintaxis en comparación con el CSS tradicional y parece bastante lógico el haber implementado el lenguaje.
Embellecimiento:

// Sass

h1
  height: 118px
  margin-top: 1em

.tagline
  font-size: 26px
  text-align: right
/* CSS */

h1 {
  height: 118px;
  margin-top: 1em;
}

.tagline {
  font-size: 26px;
  text-align: right;
}

Anidación:

// Sass

table.hl
  margin: 2em 0
  td.ln
    text-align: right

li
  font:
    family: serif
    weight: bold
    size: 1.2em
/* CSS */

table.hl {
  margin: 2em 0;
}
table.hl td.ln {
  text-align: right;
}

li {
  font-family: serif;
  font-weight: bold;
  font-size: 1.2em;
}

Variables:

// Sass

!blue = #3bbfce
!margin = 16px

.content_navigation
  border-color = !blue
  color = !blue - #111

.border
  padding = !margin / 2
  margin = !margin / 2
  border-color = !blue
/* CSS */

.content_navigation {
  border-color: #3bbfce;
  color: #2aaebd;
}

.border {
  padding: 8px;
  margin: 8px;
  border-color: #3bbfce;
}

Mixins:

// Sass

=table-scaffolding
  th
    text-align: center
    font-weight: bold
  td, th
    padding: 2px

=left(!dist)
  float: left
  margin-left = !dist

#data
  +left(10px)
  +table-scaffolding
/* CSS */

#data {
  float: left;
  margin-left: 10px;
}
#data th {
  text-align: center;
  font-weight: bold;
}
#data td, #data th {
  padding: 2px;
}

Aunque no tiene muchas entradas, pero para más información el blog de SASS. Tambien está muy bien su proyecto hermano de nombre HALM que hace cosas similares pero para html/xhtml.

Funciona sobre Ruby y está licenciado con la MIT con lo cual es software libre y código abierto.

Interesante para proyectos donde el diseño tenga mucha relevancia que hoy en día son muchos.

1 Comentario