Mostrando las entradas con la etiqueta programacion. Mostrar todas las entradas
Mostrando las entradas con la etiqueta programacion. Mostrar todas las entradas

martes, diciembre 31, 2013

Empezando con Node.js - Hello World!

Amo JavaScript, un lenguaje dinámico capaz de muchas pero muchas cosas; su principal característica es el manejo de callbacks (llamadas a una función de manera asíncrona sin utilizar threads como Java). Hace unos cuantos años el mundo vio nacer node.js: JavaScript para servidores.

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)

Un simple truco para mejorar el rendimiento en JavaScript en relacion a los ciclos es evitar el uso de la propiedad length de los arreglos como parte de la definicion.

Asi, es preferible utilizar una variable antes del inicio del ciclo que obtenga la longitud que controlara el final de ejecucion, por ejemplo:

for (var i = 0; i < arreglo.length; i++){
//operaciones
}

La razon es simple, por cada ejecucion del ciclo se recalcula la longitud del arreglo, para arreglos (o ciclos) cortos podria no tener gran impacto; sin embargo el beneficio es mayor cuando hablamos de ciclos largos o de arreglos cuyo calculo de tamano es complejo. Un ejemplo de esta ultima situacion es cuando se trata de elementos del DOM, obtener el tamano de un arreglo que forma parte de un documento HTML (por ejemplo todos los descendientes li de una lista ul), esto se debe a que muchos navegadores tienen que recorrer el arbol del DOM completo. La velocidad con la que JavaScript obtendra la longitud del arreglo en cada ciclo dependera del navegador que el cliente este utilizando, Internet Explorer 7 en particular sera el mas beneficiado al utilizar el codigo que a continuacion se sugiere pues puede aumentar el rendimiento por ciclo ejecutado en mas de un 100% incluso.

El codigo que comentamos deberia sustituir el anterior por algo como:

var valorMax = arreglo.length;
for (var i = 0; i < valorMax; i++){
//operaciones
}

En este caso no importa el numero de ciclos ni la complejidad de obtencion del valor maximo, ya que este calculo (costoso o no) se ejecutara con seguridad solo una vez.

Optimizaciones sencillas como la anteriormente ilustradas pueden parecer una solucion "no elegante" pues genera una linea de codigo extra, esto parece chocar con los principios de ciertos programadores que creen que la calidad del codigo esta directamente relacionada, entre otras cosas, con el numero de lineas escritas.

Hablar de rendimiento en lenguajes como JavaScript que transfieren su codigo completo al navegador cliente es un poco complejo, por una parte es cierto que tratamos de reducir el tamano del codigo fuente para asi transferir un archivo mas pequeno a traves de la red, sin embargo, no hay que olvidar que el uso de una linea extra a costo de la transferencia puede mejorar mucho mas la experiencia en ejecucion. Para mejorar la transferencia del codigo de JavaScript se utiliza otra tecnica conocida como "minimizing" de la cual nos ocuparemos posteriormente.

viernes, diciembre 30, 2011

Programacion de alto rendimiento (continua)

(continuacion del post "Programacion de alto rendimiento")
Bueno, ya se decidieron por algun lenguaje de programacion para su back-end, perfecto!, aun tenemos varias decisiones que tomar.

De entrada, tenemos que ser concientes de que actualmente no podemos escapar de aprender JavaScript, en primera porque es el corazon de HTML 5, el nuevo y potente estandar que pronto dominara la Internet y es el lenguaje que utilizan actualmente las aplicaciones Web 2.0 para las llamadas asincronas (AJAX). Programar en JavaScript es un arte! no lo subestimen, mucha gente cree que es un pequeño lenguaje que sirve para unos cuantos detallitos en las paginas web... falso.

JavaScript es un potente lenguaje, le da vida a las paginas web y permite sacarlas de un status de una pagina util y ponerlas en el status de impresionante. Para facilitar el uso de JavaScript existen decenas de buenos frameworks que simplifican y/o mejoran el rendimiento de la programacion en este lenguaje, ademas de lidiar con el dolor de las particularidades de los navegadores web.

Un buen framework de JavaScript debe de:

  • 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)

De acuerdo a lo antoriarmente mencionado les puedo recomendar los siguientes frameworks (ordenados por prioridad, mia por su puesto):

Este poderoso framework se ha convertido en un "must". Apoyado por gigantes como Google y Microsoft provee un lenguaje muy sencillo de usar con funciones muy flexibles para el manejo de eventos y con una sintaxis totalmente JSON. De las mejores caracteristicas que puedo mencionar es el apoyo enorme de la comunidad de desarrolladores en toda la Internet, lo que permite que evolucione rapidamente y con una calidad muy alta. La otra caracteristica es su alto rendimiento logrado al ofrecer una version recortada "minified" que puede agregar componentes bajo demanda. La API esta bien documentada por lo que su adopcion no deberia representar mayor obstaculo.

Este framework esta impresionantemente bien documentado, ofrece componentes para la GUI muy elaborados, con muchas parametrizaciones que los vuelven muy flexibles y hacen que las aplicaciones web se sientan como aplicaciones de escritorio. Al igual que jQuery, cuenta con una version recortada para mejorar el rendimiento. Dada la cantidad de componentes la curva de aprendizaje puede ser un poco larga pero valdra la pena. Otro detalle con el que se tiene que lidiar es con la adaptacion de los CSS existentes. Por cierto, vale la pena revisar tambien a su hermano Sencha Touch que es otro JavaScript framework para aplicaciones web moviles.

En realidad aqui el framework es Prototype, un viejo lobo de mar en esto de los frameworks de JavaScript, uno de los pioneros con una buena madurez y un conjunto de funciones que permiten interactuar con el DOM (Document Object Model) a nivel elemento de una manera muy sencilla de tal forma que se pueden agregar, modificar, mutar (utilizando clases CSS o estilos individuales), etc. Las desventajas de este framework comparado con jQuery es que este no ha evolucionado al mismo ritmo, esto se traduce en la carencia de caracteristicas como la concatenacion de funciones (util para muchos efectos graficos, creanme!). Script.aculo.us es un add-on para Prototype que agrega componentes AJAX como autocompleters, efectos de transicion, drag n drop, etc.

Programar en JavaScript requiere, idealmente, considerar su utilizacion en un modo no intrusivo, esto significa que las funciones y cualquier codigo escrito en este lenguaje no debe formar por ningun motivo parte de la GUI. Esto se logra agregando manejadores de eventos directamente vinculados en tiempo de ejecucion a cada uno de los componentes una vez que todo el arbol DOM ha sido cargado. Uno de estos dias escribire al respecto para ilustrar de una mejor manera este concepto.


Nota: No uso acentos, me da flojera cambiar el layout de mi teclado
Nota 2: Si, se que solo me tomaria un par de clicks

sábado, febrero 19, 2011

Es C# lo de hoy?

Recordemos que .Net era la promesa de Microsoft al iniciar el milenio, prometía madurar sus lenguajes que, con excepción de Visual C++, estaban muy devaluados por la comunidad de desarrollo más avanzada. Lenguajes como Visual Basic eran muy mal vistos y con justa razón, poco rendimiento, únicamente funcionales en Windows, dependientes de librerías, con una alta tendencia de códigos deficientes por las características propias del lenguaje y todos los etcéteras que gusten agregarle.

Durante esa época, a nada de la gran penetración de la Internet en los hogares y negocios de todo el mundo, surgieron varios lenguajes que buscaban ganar un lugar en el mercado. Cuando Microsoft anunció .Net muchos supusimos que sería un buen intento para competir particularmente contra Java y que si bien no sería fracaso absoluto tampoco lograría recuperar prestigio dentro del mundo de los lenguajes de desarrollo.

Hoy la historia, la única que puede definir la verdad, demuestra que la apuesta de Microsoft por C# ha sido mejor de lo que cualquiera hubiera calculado. Las razones son simples, pero resultado de proyectos muy grandes y muy complejos. En C# se puede hacer aplicaciones para Web, escritorio Windows, móviles Windows y (gracias a Mono) plataformas Linux y Mac (incluyendo iPad), algo más?

Podríamos pensar que el ambiente para móviles pudiera ser muy reducido pues solo se puede programar para móviles justamente con tecnología Windows, pero... recuerden que Nokia, uno de los máximos contendientes en el sector de telefonía celular, acaba de anunciar que descontinuará Symbian y comenzará a utilizar Win Mobile, así que sumado a los iPhone que con Mono podrán utilizar estas aplicaciones que alguien me explique por qué no pensar en C# como una excelente opción para programar.

Por si estos argumentos fueran poco, un sector que no mencioné anteriormente por si ser muy reducido aunque la verdad sumamente interesante, es el desarrollo de video juegos, programar en C# con XNA es una experiencia verdaderamente sencilla, ofrece buen rendimiento y grandes resultados en poco tiempo.

Mi veredicto: larga vida a C#

jueves, mayo 06, 2010

Validación de fecha con javascript

Aquí les dejo una pequeña función que recibe una fecha y valida que ésta exista (por aquello de los años bisiestos).

function validaFecha(fecha)
{
var resultado = true;
var dia = fecha.substring(0,2);
var mes = fecha.substring(3,5);
var ano = fecha.substring(6,10);
var maxDias = 31;
if (mes == 4 || mes == 6 || mes == 9 || mes == 11)
maxDias = 30;
if (mes == 2)
{
if (ano % 4 == 0)
maxDias = 29;
else
maxDias = 28;
}
if (mes>12 || mes<1)>
if (dia>31 || dia<1)>
if (ano<1980>2200) return false;
if (dia>maxDias) return false;
return(resultado);
}

La premisa es simple, la mayoría de los meses del año (enero, marzo, mayo, julio, agosto, octubre y diciembre) tienen 31 días, por eso es el valor por defecto del máximo número de días del mes. Solo hay que ver que el máximo número de días cambie a 30 en el caso de los meses que así lo requieren (abril, junio, septiembre y noviembre); en caso de que sea febrero, habrá que determinar si es un año bisiesto (para ello me basé en la documentación de la wikipedia), el resto se explica por sí mismo.

El formato de fecha que espera ésta función es: dd/mm/aaaa, o sea, dos dígitos para el día, dos para el mes y cuatro para el año; en realidad el separador de éstos es indistinto, por lo que es factible utilizar "/" ó "-". El ejemplo de fecha para validar bajo ésta máscara es: 06/05/2010.

UPDATE:
La misma función pero con un par de líneas de código menos para hacerla más estética

function validaFecha(fecha)
{
var dia = fecha.substring(0,2);
var mes = fecha.substring(3,5);
var ano = fecha.substring(6,10);
var maxDias = 31;
if (mes == 4 || mes == 6 || mes == 9 || mes == 11)
maxDias = 30;
if (mes == 2)
{
if (ano % 4 == 0)
maxDias = 29;
else
maxDias = 28;
}
if (mes>12 || mes<1)>
if (dia>maxDias || dia<1)>
if (ano<1980>2200) return false;
return(true);
}

miércoles, abril 28, 2010

Adendum a la generación en Word con PHP


Tuve un problema al sustituir campos que contienen saltos de línea, ya que dichos saltos no aparecían en el texto reemplazado sino que todo quedaba junto haciéndolo ilegible.

Tuve que comenzar con la Wikipedia, http://en.wikipedia.org/wiki/Rich_Text_Format, para ir entendiendo un poco del formato RTF, pensé que sería necesario ir a leer bastante de la especificación para entender mejor que hacer pero no fue necesario.

Resulta que los saltos de línea (representados en php como "\r" y "\n) no se utilizan con los caracteres especiales de cualquier codificación, sino que en su lugar se utiliza el código especial \par

Así que, suponiendo que, la variable que tiene saltos de línea en su código se llama parrafo ($parrafo), basta con sustituir los caracteres de salto de línea por ese código especial:

$parrafo = str_replace("\n", ' \par ',$parrafo);

Y luego la agregamos a nuestra plantilla

$archivo = str_replace('tag_parrafo',csv_encode_conv($parrafo), $archivo);

Y listo!!!

martes, abril 27, 2010

Generando un documento Word con formato en PHP

Me costó un trabajo impresionante lograrlo, pero al final aquí está. Comencemos por algunos hechos:

  • 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.
Lo primero que hay que hacer es crear la plantilla en Word, un formulario que se adapte a tus necesidades, en él tienes que crear algunos textos que funcionarán a manera de etiquetas que posteriormente reemplazarán su contenido por el que tu elijas (idealmente de una base de datos). Por ejemplo, vamos a suponer que tienes en tu plantilla de Word un espacio donde tienes que escribir el nombre de alguien, teniendo:

Nombre:

Delante de ese texto no tienes escrito nada, ahí es donde tendrás que agregar un texto que utilizaremos como etiqueta, asegúrate tanto como puedas que éstas etiquetas no formen parte del texto que posteriormente agregarás, por ejemplo:

Nombre: tag_Nombre

En éste caso, en algún punto nuestro programa sustituirá tag_Nombre por algún valor que nosotros decidamos. Lo mismo haremos para cada valor que vayamos a reemplazar por contenido dinámico en algún punto. Al terminar la plantilla guarda el documento con extensión .rtf.

Aquí empieza el desmadre, ahora habrá que abrir el documento generado en RTF desde algún editor de texto que lo abra como texto plano, encontrarás que parece nada legible, te pongo un ejemplo a continuación:

\par \hich\af39\dbch\af31505\loch\f39 Nombre:
\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \f39\insrsid8026758 \hich\af39\dbch\af31505\loch\f39 tag_Nombre}{\rtlch\fcs1 \af0 \ltrch\fcs0 \f39\insrsid863771

Se ve de la fruta, busca tus etiquetas, en el ejemplo resalté la que uso en negrita, fíjate que ese tag esté completo, ya que verás que algunas están dividas (por ejemplo podrías estar por una parte "tag_Nom" y por otro lado más adelante "bre", si caes en ese caso tendrás que agregar manualmente en tu editor de texto plano la parte que falta para completarlo, ojo no vayas a borrar en ese mismo editor la otra parte, guarda tu documento, vuelve a editarlo en word y ahora si borra desde ahí la parte que sobra, en el ejemplo que te comento teóricamente en word quedaría en pantalla tag_Nombrebre teniendo que borrar el último "bre"; lo mismo tendrás que hacer para cada etiqueta que hayas implementado. Cuando hayas terminado con todas las etiquetas, entonces si tendrás una plantilla lista para trabajar con PHP.

Ahora viene la chamba de PHP, comienza copiando la siguiente función, cabe señalar que yo no la escribí y la encontré en otro blog, lamentablemente no recuerdo dónde fue y me apena mucho no poder reconocerlo como se debería:

function csv_encode_conv($var, $enc='Windows-1252') {
$var = htmlentities($var, ENT_QUOTES, 'utf-8');
$var = html_entity_decode($var, ENT_QUOTES , $enc);
return $var;
}

Ésta función la utilicé para convertir mi texto de UTF-8 que es en el que está mi base de datos al formato ANSI de Windows, si tu BD está en otro código de caracteres tendrás que modificar la función, a menos que de antemano ya la tengas compatible con el ANSI de Windows. Ésta función tenla a la mano porque más adelante la utilizaremos.

Ahora habrá que invocar la plantilla en una variable php:

$archivo = file_get_contents('plantilla.rtf');

Y aquí viene la magia, supón que tienes el nombre que deseas imprimir en tu plantilla en una variable llamada nombre que proviene de la BD, insisto en que en mi ejemplo la BD está codificada en UTF-8, así que lo sustituiremos en la plantilla con la línea:

$archivo = str_replace('tag_Nombre',csv_encode_conv($nombre),$archivo);

Esa sencilla línea hace la chamba de llenar ese campo en la plantilla, así que podrás hacer lo mismo con el resto de tus etiquetas y sus respectivas variables, si tu BD está ya en formato compatible con Windows en cuanto al código de caracteres hubiera bastado:

$archivo = str_replace('tag_Nombre',$nombre,$archivo);

Una vez que has reemplazado el contenido de todas tus etiquetas, solo resta guardar tu archivo, para ello puedes hacerlo con la siguiente línea:

file_put_contents('mi_archivo.doc',$archivo);

LISTO!!!

Espero haya sido de utilidad =)

jueves, abril 22, 2010

Login lento en MySQL

Instalamos un servidor de BD en Windows, el cliente (nuestro ambiente web) corre en un Linux, la aplicación jalaba muy lenta, al hacer varias pruebas nos percatamos que el problema era el tiempo que tomaba (unos 6 segundos aprox.) el Linux en validar credenciales de MySQL, después de ello las consultas corrían bastante bien.

Si conectábamos un cliente Windows (en mi equipo para probar) al mismo servidor el tiempo de login era inmediato, así que suponíamos que el problema era con el servidor Linux.

Tras buscar soluciones, encontré un dato muy interesante, contra todas mis teorías la modificación para corregir ésta situación no se tenía que hacer en Linux, sino en el servidor de BD, basta con modificar el archivo my.ini y agregar en la sección mysqld la siguiente línea:

skip-name-resolve

Reinicié el servicio y todo jaló a la perfección, éste parámetro tiene que ver con la resolución por medio del DNS, al principio no le encontré lógica alguna, ya que la conexión que realizo la hago mediante IP y no por nombre de host, por tal motivo parecería que el DNS sirve para nada en éste caso, pero por algún motivo ésto funcionó.

Espero sea de utilidad para algunos.

martes, agosto 11, 2009

Codificando en UTF con PHP y MySQL

El día de hoy tuve un problema al almacenar unos datos UTF-8 captados desde un formulario de PHP, existen al menos 2 formas de abordar éste problema.

1. El más correcto, es establecer en MySQL que la tabla (y por ende cada campo) utilice UTF-8 como código de caracteres por defecto, adicionalmente el archivo de PHP (el código fuente del formulario) deberá estar codificado igualmente enUTF-8, para ello hay que habilitar dicha opción en tu editor de código.
2. La que tuve que utilizar, dado que yo no administro el MySQL del ambiente productivo de ésta solución, fue convertir cada variable $_POST a UTF-8 y luego utilizar htmlentities para parsear acentos y caracteres especiales, el ejemplo es el siguiente:

$nombre = htmlentities(utf8_encode($_POST['nombre']), ENT_COMPAT, 'UTF-8');

Espero que les sea de utilidad

domingo, junio 28, 2009

Función para validar un número con decimales (float) con javascript

Estaba haciendo experimentos para validar un form dinámico en HTML, requería utilizar una función JavaScript para validar si un número es un float, para ello utilicé la función que encontré en el artículo http://blog.techsaints.com/2007/04/10/javascript-number-validation-integer/, el cual mediante expresiones regulares valida si un número es un entero, lo modifiqué y el resultado fue la siguiente función:

function validaFloat(numero)
{
if (!/^([0-9])*[.]?[0-9]*$/.test(numero))
alert("El valor " + numero + " no es un número");
}

Espero les sriva ;)

viernes, mayo 01, 2009

Conectando PHP con SQL Server Express 2008

La configuración de SQL Server 2008 Express estaba algo rara, lo primero es instalar PHP con la extensión mssql, posteriormente tienes que bajar la librería ntwdblib.dll, la puedes conseguir aquí, luego la tienes que copiar a la carpeta c:\windows\system32 (para Windows Vista, Server 2003 y XP), una vez hecho lo anterior solo tienes que reiniciar Apache y a tirar código.

$dbconnect = mssql_connect('NOMBREDETUEQUIPO\SQLExpress', 'usuarioBD', 'contrasenaDB'); 

domingo, abril 05, 2009

El futuro del desarrollo

Los que nos dedicamos al desarrollo de aplicaciones de cómputo estamos al pendiente de una noticia: la casi inminente compra de SUN por parte de IBM, ésto traerá muchos cambios sobre cómo conocemos el mundo de desarrollo.

Los Javeros, están al pendiente de si IBM dejará vivo NetBeans, el eterno competidor de Eclipse; la existencia del último no está discusión, ya que IBM no lo dejaría morir, sin embargo, no se puede asegurar lo mismo de NetBeans. Cientos (o miles) de desarrolladores utilizan NetBeans, o desarrollan plugins para éste.

En el mundo de la bases de datos se avecina una tormenta, habemos muchos preocupados por el futuro de MySQL, si bien, no creo que IBM lo desaparezca y mucho menos que elimine su versión gratuita, es muy difícil pronosticar si habrá una fuga de ingenieros para dicho proyecto, recordemos que cuando SUN adquirió MySQL eso fue lo que ocurrió. La otra preocupación es qué tanta importancia le de al desarollo de MySQL, porque obviamente IBM es una gigante corporación y no es ninguna hermanita de la caridad como para invertirle demasiados recursos a un sistema gratuito en lugar de tratar de posicionar su DB2.

En cuanto a servidores hay algo que también es de llamar mucho la atención, Solaris (sistema operativo de los servudores SUN) tiene un gran competidor en AIX, si IBM decide mantener solo uno (adivinen cuál), estaríamos hablando también de la desaparición de los servidores SPARC; ésto tendría un ingrediente más en la actual crisis económica ya que, de acuerdo a mi experiencia, los grandes centros de cómputo tienen una gran base instalada tanto en servidores IBM como SUN, imaginen cuánto le costaría a las empresas hacer una transición a mediano plazo a servidores IBM.

En fin, como diría Yoda "incierto el futuro es".

martes, marzo 17, 2009

Editor de código Notepad++

Para nosotros los programadores old school que gustamos de escribir código en texto, sin utilizar herramientas como Dreamweaver, Visual Studio, etc, o que simplemente no tenemos para dichas licencias, les presento mi herramienta de diseño favorita: Notepad++

Notepad++ es un editor de texto pensado para nosotros los desarrolladores, principalmente de páginas web, soporta el reconocimiento de sintaxis de distintos lenguajes como php, ASP, c, c++, c#, lisp, ADA, SQL, HTML, java, javascript, pascal, perl, python, etc. 

Otra característica importante es el soporte a plugins, lo que aumenta todavía más su funcionalidad, uno de mis favoritos es el function list (que se aprecia del lado derecho de la imagen) que te permite localizar rápidamente funciones dentro del código fuente.

Aunque tiene bastantes funciones, destaco las siguientes:
  • 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?

Comenzar a desarrollar para web puede ser una cuestión tan importante como decidir con quién te casas, es decir, el lenguaje que ocupes puede determinar muchísimo en tu desarrollo profesional. A diferencia del matrimonio, en el mundo de la programación puedes convivir con distintos lenguajes sin que ésto sea ilegal, en lo personal he desarrollado aplicaciones Web utilizando Visual C#, ASP y PHP.

Recuerdo que aprender PHP fue uno de mis propósitos de año hace ya unos 4 años aproximadamente, la verdad fue una decisión difícil ya que tenía como otra opción Java para ese entonces.

El día de hoy, estoy seguro de haber tomado la mejor alternativa, y no es que Java sea malo, pero después de haber trabajado en distintos proyectos en PHP me he dado cuenta del poder de éste lenguaje de programación, el más claro ejemplo es la intranet en la que estoy trabajando actualmente, un proyecto que inicié apenas en diciembre y en éste momento he utilizado tecnología que ha dado mucha potencia a mi desarrollo y todo con una inversión de $0.00 en costos de licencia. Lo que he logrado gracias a la comunidad de desarrolladores de PHP, por ejemplo, para éste proyecto:

  • 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
Dentro de los ToDo, está la implementación de servicios web disponibles al público interno, situación que tomará otro par de horas.

Por razones como ésta, es que PHP se ha convertido en mi lenguaje de programación favorito, alto rendimiento, costo total de propiedad sumamente bajo, alta disponibilidad de código fuente y componentes gratuitos en la red, mucha documentación, fácil de implementar, etc. 

Así que si estás pensando en que lenguaje de programación iniciar prueba PHP, no te arrepentirás.

miércoles, febrero 11, 2009

BeOS

Dentro de la guerra de los sistemas operativos no todo es Linux, Windows y MacOS; hoy, vía Barrapunto, me enteré que el legendario sistema operativo BeOS (un sistema operativo que tenía un aspecto gráfico interesante) ha sido revivido.

No dejen de probarlo, podría resultar ser una alternativa muy interesante para la reducción del costo de licencias, desde hoy me apunto para probarlo y si me convence comenzar a hacer aplicaciones propias del SO.

martes, enero 06, 2009

En PHP

Solo por no dejar de comentarlo, sitios de empresas tan importantes (y comentadas en ésta semana por la Barriada) como BestBuy y Dish en México utilizan PHP en su portal. Lo anterior lo comento porque un servidor es fan de éste popular lenguaje de programación.

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)

De acuerdo a la Wikipedia, un procedimiento almacenado es:

Un procedimiento almacenado (stored procedure) es un programa (o procedimiento) el cual es almacenado físicamente en una base de datos. Generalmente son escritos en un lenguaje de bases de datos propietario como PL/SQL para Oracle database o PL/PgSQL para PostgreSQL. La ventaja de un procedimiento almacenado es que al ser ejecutado, en respuesta a una petición de usuario, es ejecutado directamente en el motor de bases de datos, el cual usualmente corre en un servidor separado. Como tal, posee acceso directo a los datos que necesita manipular y solo necesita enviar sus resultados de regreso al usuario, deshaciéndose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes.

Sus ventajas son varias, entre las que destacamos que permiten ejecutar sentencias de SQL una tras otra, ya que algunas veces los programas de cómputo requieren antes de la ejecución (inserción, borrado ó modificación) de un query determinar o desencadenar otra serie de condiciones, piensa por ejemplo, que tienes una tabla donde manejas el inventario de productos y otra donde manejas las ventas, si pretendes registrar la venta de un producto tendrías que descontarlo del inventario, para tal efecto desde la aplicación (sin procedimientos almacenados) ejecutarías un par de queries, el primero para registrar la venta y el segundo para descontar en el inventario las unidades salientes, aunque en el mundo real es mucho más complejo ya que primero tendrías que determinar si existen unidades de ese producto, si hay descuentos aplicables, etc, etc, etc. Toda esa parte se puede encapsular en un procedimiento almacenado.

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

En 1997 cuando decidí que aprendería a programar, le pregunté a mi maestro ¿cuál es el mejor lenguaje de programación?, a lo que me respondió "el que mejor domines".

Pasó el tiempo y decidí por convicción no aprender Basic, en aquél entonces aprendí Pascal (y Delphi por consecuencia) y posteriormente en la carrera llevé C++ y Java, al paso de los años cuando Delphi comenzó a decaer y decidí aprender C#, luego la necesidad me llevó a aprender PHP.

Como verán he trabajado con lenguajes muy diferentes entre sí, con características diversas y sobre IDEs distintos, esta situación me ha permitido poder apreciar ciertas ventajas en cada uno y por lo tanto poder compararlos entre sí; igualmente he visto de cerca proyectos en la mayoría de éstos lenguajes y he sido curioso de revisar el impacto de la herramienta de desarrollo elegida y el resultado de los proyectos.

A continuación anotaré algunas de mis experiencias con cada uno y cada quien es libre de estar o no de acuerdo conmigo:

Pascal
Ventajas:
  • 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

Delphi (Pascal visual)
Ventajas
  • 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
Desventajas
  • 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

Java
Ventajas:
  • 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)

Desventajas
  • 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
C++
Ventajas:
  • 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
Desventajas:
  • 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
C# (Aunque se supone que éste es un derivado de C la verdad a mi parecer tiene más de Java)
Ventajas
  • 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
Desventajas
  • 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)

PHP
Ventajas
  • 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
Desventajas
  • 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)

Como se puede observar, y como todo en la vida, cada uno de éstos lenguajes ofrece diferencias en sus características, no puedo decir que tan superior o inferior es uno de otro ya que he visto excelentes y pésimas aplicaciones desarrolladas en cada uno de ellos. Creo que quien se atreva a afirmar que un lenguaje de ellos es superior (o inferior) al resto es porque tiene una visión limitada de las características de cada uno, es un tanto como hablar de cuál es el mejor coche sin contemplar como para qué (puedes buscar el del mejor diseño, el de más accesorios, el de mayor rendimiento de combustible, el más veloz, el más estable, etc).

En conclusión, creo que no hay un lenguaje "mejor" que los demás, pero si puede suceder que algunos de ellos sean los más adecuados para cierto tipos de proyectos, no se puede evaluar un lenguaje por su costo, fama, facilidad de código, etc.

Creo que los elementos para decidir qué lenguaje utilizar tienen que ver más con la naturaleza del o los proyectos que se implementarán, el presupuesto, el skill del personal que desarrollará, la disponibilidad de material de estudio, otros recursos (librerías, IDE's, plugins, etc) disponibles e incluso presupuesto.

Finalmente, he de decir que a mi juicio, creo que tampoco es necesario que un proyecto se desarrolle únicamente bajo un lenguaje, sin que se abuse de ello es posible mezclar distintos lenguajes para construir soluciones ricas en posibilidades, uno de mis ejemplos favoritos es Flickr un proyecto que mezcla PHP, Ajax, Java y MySQL y que funciona con un rendimiento con un nivel de disponibilidad ciertamente impresionante.

A todos los que gusten de la tecnología me gustaría invitarlos a opinar en éste post al respecto, ya que creo que éste tema es bastante rico y se le puede aportar muchísimo más en favor de aquellos que se inician en la tecnología y que buscan guías al respecto.