martes, diciembre 31, 2013
Empezando con Node.js - Hello World!
Las ventajas de node son varias, empezando por las ya mencionadas callbacks y continuando con el hecho de que ahorra escribir validaciones en múltiples lenguajes; para ilustrar el punto anterior simplemente piensa en un formulario web que tiene que validar que ciertos campos contengan realmente información, y que algunos de ellos (el correo electrónico por ejemplo) tengan que cumplir con cierto formato; en este caso en un sistema escrito en Java, por ejemplo, tendrías que escribir cierta lógica en JavaScript para validar lo que el usuario captura en la página y luego reescribir la misma lógica en Java para que el backend pueda hacer lo propio (toma en cuenta que el lenguaje de backend podría incluso manejar las expresiones regulares para validar formatos de una forma diferente que podría causar que la validación fuera ciertamente diferente).
Sin más vamos al primer ejemplo de código:
var http = require('http');
var MyApp = {
getView: function(viewName, params){
var view = null, headers = null;
switch (viewName){
case 'home':
view = 'Hello world!';
break;
default:
view = null;
break;
}
if (view == null){
headers = 404;
} else{
headers = 200;
}
params.res.writeHead(headers, {"content-type": 'text/plain'});
params.res.end(view);
}
};
http.createServer(function(req,res){
var params = { "req": req, "res": res };
MyApp.getView('home',params);
}).listen(3124);
Para ser bien honesto la primer aplicación publicada aquí tiene demasiadas líneas de código, la mayoría no son necesarias para el tan famoso "Hello world", mi intención en este fragmento es ilustrar también el concepto de aplicación y modularización en JavaScript.
La primer línea (require) invoca a un módulo de node, en este caso es el servidor web como tal; si eres de los que, como yo, tiene experiencia en PHP, .NET, Java, etc; entonces estarás acostumbrado a utilizar Apache, IIS, Tomcat, JBoss, etc como servidores web o application containers; node no require ser contenido en alguno de estos productos pues proporciona su propio servidor web (aunque también puede correr en algún servidor existente).
El objeto MyApp, es en realidad la aplicación que deseamos desarrollar. Ella manejará en algún momento toda esa lógica que usualmente escribimos como parte del backend, en este momento lo único que realiza es administrar la entrega de vistas al servidor (objeto http creado en la primer línea), volveré a este objeto en breve.
Posteriormente tenemos una función "createServer" que toma como parámetros req (request) y res (response), un tanto intuitiva para quienes tenemos experiencia en desarrollo web. Para quienes no tienen experiencia en este campo, un servidor web recibe solicitudes de parte de los usuarios del sistema a través de un request que contiene la información de la página que estás utilizando principalmente (y otra información que no documentaremos aquí a fin de redactar un artículo lo más breve posible); una vez que el servidor recibe esta solicitud, el servidor decidirá en base a ella cuál es el recurso (la página o archivo solicitado) más adecuado y lo devolverá en forma de respuesta (el response). Al final del método createServer notarás la instrucción "listen(3124)", quiere decir que mi servidor responderá por el puerto 3124, en mi caso decidí hacerlo de esta manera dado que en mi equipo tengo en ejecución servidores en los puertos 80 y 8080, pero si no es tu caso puedes cambiarlo a cualquiera de esos puertos.
Con este código ya puedes ejecutar desde la línea de comandos:
node MyApp.js
(donde MyApp.js es el nombre del archivo que contiene el código escrito anteriormente).
Ve a tu navegador e ingresa la url:
localhost:3124
Podrás ver el mensaje "Hello world!" como resultado. Si te has equivocado al copiar el código podrás observar el error en la línea de comandos donde iniciaste la aplicación.
La aplicación MyApp está configurada para responder en este momento únicamente texto, pero puedes modificar los argumentos (como el formato de los headers) para responder de manera distinta.
Con esto concluimos Hello World!
domingo, enero 22, 2012
Programacion de alto rendimiento (continua)
viernes, diciembre 30, 2011
Programacion de alto rendimiento (continua)
- Lidiar con la compatibilidad de navegadores
- Permitir la orientacion a objetos
- Ser compatible con la notacion JSON (JavaScript Object Notation)
- Facilitar el manejo de eventos y funciones callback
- Facilitar la programacion de animaciones y/o componentes de UI (user interface)
sábado, febrero 19, 2011
Es C# lo de hoy?
jueves, mayo 06, 2010
Validación de fecha con javascript
miércoles, abril 28, 2010
Adendum a la generación en Word con PHP
martes, abril 27, 2010
Generando un documento Word con formato en PHP
- Para generar archivos de Word en nuestro servidor web sería útil a través de una plantilla de la cual solo baste con modificar los datos.
- Ésta plantilla debe estar en formato de texto plano para poder editarla con PHP, los documentos de Word, y en general los de Office, están hechos en archivos comprimidos que contienen a su vez múltiples archivos con el documento y metainformación, si no me crees basta con que cambies la extensión de uno de éstos archivos a .zip o .tar y lo abras con 7-zip (desconozco si con Winzip o alguna otra herramienta de compresión se pueda hacer).
- Al concluir el trabajo, el servidor no requerirá tener instalado Word para generar o editar documentos.
- El formato con el que trabajaremos será RTF (Rich Text Format), aunque posteriormente el usuario lo descargará como un archivo .doc de Word.
- Es un trabajo que nos tomará algún tiempo.
jueves, abril 22, 2010
Login lento en MySQL
martes, agosto 11, 2009
Codificando en UTF con PHP y MySQL
domingo, junio 28, 2009
Función para validar un número con decimales (float) con javascript
viernes, mayo 01, 2009
Conectando PHP con SQL Server Express 2008
domingo, abril 05, 2009
El futuro del desarrollo
martes, marzo 17, 2009
Editor de código Notepad++

- Almacenamiento de los archivos de código en formatos UTF-8, ANSI, UCS-2
- Resaltado de sintaxis en distintos lenguajes
- Capacidad de plugins
- Multi tab para abrir varios archivos a la vez
- Edición orientada a desarrollo (por ejemplo, puedes identar el código de manera sencilla con la tecla de tabulador)
- Capacidad manejo de macros
- Contracción de código por funciones para facilitar la lectura del código fuente
- Numeración de las líneas de código
lunes, marzo 16, 2009
Por qué amo PHP?

- Implementar un editor WYSIWYG (What You See Is What You Get, en español "lo que ves es lo que obtienes) para el motor de blogs en solo una hora de trabajo.
- Implementar un framework de plantillas que trabaja con caché, ésto mejora notablemente el desempeño del servidor al entregar el contenido del portal, por otro lado facilita el mantenimiento del portal al tener que modificar una única plantilla para todo el look n' feel del portal (otro par de horas).
- Implementar un lector de RSS en 20 minutos
miércoles, febrero 11, 2009
BeOS
martes, enero 06, 2009
En PHP
domingo, noviembre 16, 2008
Procedimientos almacenados (stored procedures) en MySQL (2)
Para ello crearemos primero el esqueleto del cuerpo en un script de SQL que llamaremos spVenta.sql, al procedimiento almacenado que crearemos en éste lo llamaremos vendeProducto. De tal forma que nuestro script quedará así:
USE prueba;
DELIMITER //
CREATE PROCEDURE vendeProducto
BEGIN
END
//
Expliquemos de qué se trata, la primera línea contiene la sentencia USE prueba; lo que le indica a MySQL que utilice la base de datos llamada prueba, notarán que es la única línea que es cerrada con un punto y coma, éste signo de puntuación (;) es utilizado de manera predeterminada por MySQL para separar sentencias o bloques de código.
La segunda línea DELIMITER // le indica a MySQL que substituya al punto y coma (;) como separador de código y en su lugar utilice la doble diagonal (//), se pueden utilizar distintos delimitadores, por ejemplo, el producto phpMyAdmin utiliza en su lugar un doble signo de pesos ($$) en lugar de la doble diagonal; el por qué hemos substituido el punto y coma por una doble diagonal se debe a que dentro de los procedimientos almacenados las instrucciones se separan precisamente con punto y coma, lo que ocasionaría, de no cambiar el delimitador, que el motor de base de datos se confunda y envíe error al tratar de crear un procedimiento almacenado al no saber donde comienza y dónde termina éste.
La tercera línea CREATE PROCEDURE vendeProducto es la que en realidad inicia el cuerpo del procedimiento almacenado, siendo vendeProducto el nombre del mismo, posteriormente las siguientes dos líneas BEGIN y END contendrán el código del procedimiento y la última línea con la doble diagonal indicará al motor de base de datos el final del bloque de código que esperamos que procese.
En este momento deberemos cargar los scripts schema.sql y spVenta.sql, para ello iniciaremos una sesión desde la consola de MySQL y ejecutaremos las siguientes instrucciones una vez que hayamos ingresado.
Source schema.sql;
Source spVenta.sql;
sábado, noviembre 15, 2008
Procedimientos almacenados (stored procedures) en MySQL (1)
Para entender cómo funcionan primero tendremos que crear una base y sus respectivas tablas a fin de seguir los conceptos con ejemplos, para ello crearemos un script de SQL que llamaremos schema.sql
Delimiter ;
Create database prueba;
Create table inventario(
Id_producto int,
Producto varchar(255),
Precio double,
piezas int,
Primary key(id_producto)
);
Create table movimiento(
Fecha_venta datetime,
id_producto int,
cantidad_vendida int
);
Insert into inventario values (1, 'Paquete cervezas 6 pzas.', 10.50, 5);
Insert into inventario values (2, 'Refresco de lata', 1.50, 10);
Insert into inventario values (1, 'Agua embotellada 1 litro', 1.30, 3);
Supongamos que tenemos que crear un stored procedure que por cada producto vendido registre la venta efectuada en la tabla movimiento y también descuente la cantidad existente en almacén de dicho producto utilizando el campo piezas de la tabla inventario.
jueves, octubre 02, 2008
Cuál es el mejor lenguaje de programación
- Muy sencillo de aprender
- No es sensible a mayúsculas y minúsculas
- Para aprender (en su tiempo) era bueno ya que obligaba a tener ciertos buenos hábitos como el designar un lugar único para la declaración de variables. (Esto hoy en día no es tan válido debido a que las variables en los lenguajes modernos existen únicamente en ciertos ámbitos)
- Disponible para distintas plataformas
- Las mismas que Pascal con excepción de la disponibilidad de plataformas (existió una versión para Linux llamada Kylix de la que salieron si mal no recuerdo 3 versiones pero fué un fracaso)
- Amplia disponibilidad de componentes desarrollados por otros programadores
- Mucho código disponible en la web (ejemplo http://q3.nu/trucomania)
- Fue el primer lenguaje visual capaz de programar librerías de vinculación dinámicas para windows (dll's)
- La compilación de programas no requería (usualmente) la instalación de librerías adicionales en los sistemas cliente
- Desarrollo rápido de aplicaciones cliente / servidor
- Excelente rendimiento de las aplicaciones
- Apto también para el desarrollo de virus y malware (la neta, era bien fácil)
- Único lenguaje escrito en sí mismo (más que una ventaja es una curiosidad)
- Conectividad sencilla con los principales manejadores de bases de datos
- Falta de una tecnología definitiva para el desarrollo de aplicaciones web (hasta la versión de .Net), recordemos todas las tecnologías que propuso Borland durante varias versiones para el desarrollo de aplicaciones web como IntraWeb.
- Licencia costosa :S, la versión gratuita existente Turbo Delphi carece de muchos componentes
- Odio decirlo, habiendo sido usuario de Delphi por muchos años, éste ha dejado de ser un inovador para convertirse en un follower
- Filosofía "Escríbelo una vez, córrelo donde sea", o sea portabilidad al máximo
- Amplia disponibilidad de IDE's, para todos los gustos y presupuestos
- Plataforma capaz de generar aplicaciones Web, de escritorio, móviles, otros electrónicos (como reproductores de Bluray), etc
- Lenguaje que nos quitó los dolores de cabeza de los apuntadores
- Lenguaje sencillo y con mucho código disponible en la web
- Múltiples frameworks (aunque puede ser igualmente una desventaja porque le pega un poco a la estandarización)
- Mercado madurando constantemente e integrando aquellas tecnologías nuevas requeridas (ejemplo servicios web, ajax, etc)
- En móviles, no hay una estandarización de la máquina virtual, por lo que se requiere escribir mucho código para saber que librerías se pueden o no utilizar
- La máquina virtual es muy pesada sobre algunos sistemas operativos (ejem. Windows)
- Existen picos de memoria difíciles de controlar (fuente http://reddevnews.com/news/print.aspx?editorialsid=10250)
- Debido a algunas de sus ventajas (portabilidad y modelo de seguridad de la VM) no es apto para desarrollar aplicaciones que tengan que interactuar con las API de los sistemas operativos
- Te permite programar casi cualquier cosa
- Con los skills adecuados puedes hacer aplicaciones de alto rendimiento
- El rey del código ofuscado
- Multiplataforma
- Gran cantidad de compiladores, IDE's, librerías y otros recursos disponibles
- Bueno para hacer acceso a las API del sistema operativo
- Rico en características de OOP
- Bueno para programación electrónica
- Requiere un nivel de conocimientos de programación mayor al resto de los lenguajes (con excepción de ensamblador)
- No hay una forma (directa) de hacer aplicaciones web
- Los desarrollos toman más tiempo debido a su complejidad técnica
- Tienes que saber muy bien cómo utilizar apuntadores de memoria
- Desarrollo muy sencillo para aplicaciones de escritorio, web y móviles
- Disponibilidad de Windows y para Linux
- Disponibilidad de IDE's gratuitos (SharpDevelop y Visual Studio Express)
- Disponibilidad de entorno de desarrollo de juegos para X Box 360
- Lenguaje muy sencillo
- Alta integración con el sistema operativo Windows (un servidor ha hecho en cuestión de minutos aplicaciones de OCR y autocontestadores de Messenger con este lenguaje)
- Alta disponibilidad de recursos en la web
- Lenguaje en evolución constante
- La suite completa de desarrollo es costosa
- El IDE es algo pesado en memoria
- Requiere que cada aplicación distribuida utilice exactamente las librerías del Framework correspondiente (a diferencia de Java que éste si tiene compatibilidad hacia atrás con muy pocas excepciones)
- Para Linux no hay una versión para aplicaciones Web definitivas
- Muy casado a plataformas Windows (aunque hay versión para Linux en móviles, por ejemplo, solo se ejecuta sobre un Win Mobile, Win CE o Pocket Win)
- OpenSource
- Excelente integración con otros (grandes) productos de OpenSource como MySQL
- Muy baja demanda de recursos
- Mucha documentación disponible en la web
- Muchos proyectos de código abiertos listos para ser modificados y explotados (http://www.hotscripts.com)
- Los cambios in hot se pueden realizar fácilmente
- Lenguaje muy sencillo
- No requiere IDE
- No requiere compilación
- Depuración más compleja que con el resto de los lenguajes
- Debido a lo sencillo del lenguaje, se presta a tener un código muy revuelto (aunque ésto tiene que ver más con los hábitos del programador)
- Poca integración con el SO
- No es posible hacer aplicaciones móviles ni de escritorio (con una GUI propio del SO)