martes, 20 de enero de 2009

Buscadores Internos en PHP


Word-Forms-Aware Site Search
Más información Visitar Este script recorre tu sitio web y crea una base de datos con el contenido indexado. Para mostrar el formulario de búsqueda y/o los resultados de la búsqueda sólo tienes que añadir una línea de código....
Licencia: Freeware
plataformas: multiplataforma
idiomas: Inglés

Interspire FastFind
Más información Visitar Sistema para realizar un completo buscador interno en un sitio web en poco tiempo. Creado en PHP y con base de datos (MySQL o bien PostgreSQL). Dispone de un área de administración y un sistema de...
Licencia: Licencia comercial
plataformas: multiplataforma
idiomas: Inglés

NOTA: En este directorio no tenemos las descargas de código físicamente, sino que tenemos enlaces a las páginas donde se ofrecen los scripts.
Para descargar un script tenemos que visitar la página donde se ofrece el script. Para ello, en cada ficha del script hay un enlace que pone "Visitar" que debemos pulsar para obtenerlo.
El enlace visitar no lleva al script directamente, sino que lleva a la página donde está alojado. A veces en la página hay varios programas, por lo que en ocasiones además tendremos que buscar el script concreto que estábamos intentando descargar.
En la página donde nos lleva el enlace "Visitar " podremos encontrar además la documentación necesaria para instalar el script y configurarlo, así como otros detalles que haya querido destacar el autor del código, como la licencia, precio -si lo tiene-, versiones, idiomas, etc. Aunque en la ficha del script ya se adelantan muchas de estas informaciones, siempre es conveniente documentarse en la propia página.
En este directorio de scripts se clasifican miles de programas, aplicaciones o códigos para utilizar en una página web. El directorio en si no es más que una clasificación por tecnologías y funcionalidades, además de un foro para que los visitantes puedan dar sus opiniones, experiencias o puntuaciones a los scripts que aquí se presentan.

lunes, 19 de enero de 2009

¿Qué significa programar?

¿De qué nos ocuparemos?
Una introducción a la terminología de la programación, un poco de historia y una introducción a la estructura de un programa de computadora.

Vayamos a lo BASICO
La programación de computadoras es el arte de hacer que una computadora haga lo que nosotros querramos.

En el nivel más simple consiste en ingresar en la computadora una secuencia de órdenes para lograr un cierto objetivo. En el entorno de MS DOS los usuarios solían crear archivos de texto con comandos denominados "archivos por lotes" (.BAT). Estos simplemente ejecutaban la secuencia de órdenes en lotes, de allí su nombre. Bajo Windows es posible producir estos archivos, aunque en la práctica no es lo más común.

Por ejemplo, podrías producir un documento (como este tutorial) compuesto por varios archivos separados. Tu procesador de texto puede crear backups de cada uno de estos archivos cuando guardás una nueve versión de los documentos. Al final del día, querés colocar la versión actual del documento, es decir los últimos archivos, en una carpeta de respaldo. Finalmente, para poner un poco de orden, borrás las versiones previas. Un sencillo archivo BAT para hacer esto sería:

COPY *.HTM BACKUP
DEL *.BAK

Si el archivo se llamara SAVE.BAT, al final del día simplemente deberías tipear SAVE en la ventana de DOS y los archivos serían guardados y se borrarían los backups. Esto es un programa.

Nota: Los usuarios de Linux y otros sistemas operativos tiene su propia versión de estos archivos, usualmente conocidos como shell scripts. Los shell scripts de Linux son mucho más poderosos que los BATs de DOS, y además son compatibles con la mayor parte de las técnicas de programación que veremos en este tutorial.

Voy a decirlo otro vez
Si estás un poco impresionado por lo que acabamos de ver, no te preocupes. Un programa de computación es simplemente un conjunto de instrucciones que le dicen a la computadora cómo realizar una tarea en particular. Es parecido a una receta: un grupo de instrucciones que le dicen al cocinero cómo preparar un determinado plato. Describe los ingredientes (los datos) y la secuencia de pasos (el proceso) necesarios para convertir los ingredientes en una rica torta. Un programa tiene un concepto muy similar.

Un poco de historia
Tal como Ud. le hablás a un amigo en un idioma, para "hablarle" a una computadora es necesario utilizar un lenguaje en particular. El único lenguaje que una computadora entiende se denomina binario y tiene muchos dialectos. Esto demuestra porqué un programa escrito para una iMac no funciona en una PC y viceversa. Desafortunadamente el lenguaje binario es muy difícil de leer y escribir para un humano, por lo cual debemos utilizar un lenguaje intermedio que después será traducido a binario. Esto es como ver una reunión cumbre entre Clinton y Yeltsin. Clinton habla, luego un intérprete repite en ruso lo que se ha dicho. Luego Yeltsin contesta y un intérprete repite lo mismo en inglés.

Lo que traduce nuestro lenguaje intermediario a binario también se denomina intérprete. De la misma manera que es necesario disponer de un intérprete distinto para traducir del inglés al ruso que para hacerlo del árabe al ruso, será necesario disponer de un intérprete distinto para traducir las órdenes de Python a binario y otra para traducir las de BASIC.

Los primeros programadores tenían que ingresar los códigos binarios, lo cual se conoce como programación en código máquina y es increíblemente compleja y difícil. El paso siguiente fue crear un traductor que simplemente convertía palabras en inglés equivalentes a los códigos binarios en los propios códigos binarios. De esta manera en vez de tener que recordar que el código 001273 05 04 significaba sumar 5 + 4 , los programadores podían escribir entonces ADD 5 4. Esta simple mejora hizo que la vida fuera más sencilla y estos sistemas de codificación fueron los primeros lenguajes de programación, habiendo distintas versiones para cada tipo de computadora. Se los conocía como lenguajes assembler ("ensamblador"). La programación en Assembler se utiliza todavía para algunas tareas de programación muy específicas.

Incluso este sistema era muy primitivo, pues le decía a la computadora lo que tenía que hacer en el nivel de hardware -mover bytes de una celda de memoria a otra, sumar este byte a este otro, etc. Lograr un objetivo sencillo era todavía bastante difícil e implicaba un gran esfuerzo de programación.

Gradualmente los expertos en computación desarrollaron lenguajes de alto nivel para facilitar el trabajo de los programadores. Esto fue también el resultado de una demanda por parte de los usuarios que reclamaban tareas más complejas y procesos más potentes para sus computadoras. La competencia entre los ingenieros y los usuarios continúa aun hoy, y nuevos lenguajes son desarrollados y potenciados. Esto vuelve muy interesante a la programación pero también implica que como programador debés comprender bien no solo los conceptos de la programación en general, sino también la práctica de la programación en un lenguaje particular.

Más adelante discutiremos en profundidad algunos de estos conceptos.

Características comunes a todos los programas
Hace tiempo Edsgar Dijkstra desarrolló el concepto de la programación estructurada. Esto significa que todos los programas pueden estructurarse de las siguientes cuatro formas:
Secuencias de instrucciones
Bucles
Bifurcaciones
Módulos

Además de estas estructuras los programas necesitan otras características que los hacen útiles:

Datos
Operaciones (sumar, restar, comparar, etc.)
Capacidad de Entrada/Salida (para mostrar resultados)
Una vez que se comprende cómo un lenguaje particular implementa estos conceptos, uno está preparado para escribir un programa en ese lenguaje.

Aclarando la terminología
Ya hemos dicho que la programación es el arte de hacer que una computadora haga lo que uno quiera, pero ¿qué es un programa?

De hecho hay dos conceptos distintos de lo que es un programa. El primero es el percibido por el usuario: un archivo ejecutable que se instala en la máquina y puede ser ejecutado repetidas veces para realizar una tarea determinada. Por ejemplo, los usarios utilizan el programa Word para escribir textos. El otro concepto se refiere a un programa visto desde la óptica de un programador: un archivo de texto con instrucciones a la computadora escritas en un determinado lenguaje de programación, que luego podrá convertirse en un ejecutable. Por esta razón, es necesario aclarar a qué nos referimos cuando hablamos de un programa.

Básicamente un programador escribe un programa en un lenguaje de alto nivel que es interpretado y traducido a bytes que la computadora pueda comprender. En la jerga técnica se dice que el programador genera el código fuente y el intérprete genera el código objeto. A veces, el código objeto también se denomina P-Code, código binario o código máquina.

El intérprete tiene varios nombres: uno es el de intérprete y el otro es el de compilador. Estos términos en realidad se refieren a dos técnicas diferentes de generación del código objeto a partir del código fuente. Antes los compiladores generaban el código objeto que podía ejecutarse como tal (un archivo ejecutable - otro término) mientras que un intérprete debía estar presente para poder ejecutar el código. Actualmente, la diferencia entre estos términos se ha vuelto difusa ya que algunos compiladores requieren que el intérprete esté presente para realizar a conversión final y algunos intérpretes compilan el código fuente en un objeto temporal y luego lo ejecutan.

Desde nuestra perspectiva no hay una diferencia real, ya que escribiremos código y usaremos una programa para que la computadora pueda leerlo y ejecutarlo.

La estructura de un programa
La estructura exacta de un programa depende del lenguaje que utilicemos y el entorno en el cual lo creemos. Sin embargo, hay algunos principios generales:

Un cargador - todo programa necesita ser cargado en la memoria por el sistema operativo. De esto se encarga el intérprete.
Definición de los datos - la mayoría de los programas operan con datos y por lo tanto en el código fuente debemos definir que tipo de datos vamos a utilizar en el programa. Esto se realiza de manera diferente en los distintos lenguajes. Todos los lenguajes que usaremos tienen la posibilidad de crear una nueva definición de datos simplemente al utilizar los datos. Veremos esto en la próxima sección.
Instrucciones - son la parte central del programa. Las instrucciones manipulan los datos que hemos definido, realizan cálculos, muestran los resultados, etc.
La mayoría de los programas siguen una de dos estructuras:

Programas de lotes
Estos se ejecutan típicamente desde una línea de comando o automáticamente desde otra aplicación (tipo scheduler) y tienden al siguiente patrón:

Inicialización interna de los datos
Lectura de los datos ingresados
Procesamiento de los datos
Visualización o ejecución de los resultados
Programas controlados por eventos
La mayor parte de las interfaces gráficas (y los sistemas de control presentes en un horno a microondas o una cámara por ejemplo) responden a eventos. Esto significa que el Sistema Operativo envía un evento al programa y este los responde tan pronto como estos le llegan. Los eventos incluyen acciones del usuario como apretar una tecla, mover el mouse, etc, y operaciones propias del sistema operativo tales como la actualización del reloj, el refresco de la pantalla, etc.

Los programas controlados por eventos son generalmente así:
Inicialización interna de los datos
Espera de los eventos
Identificación de los eventos y actuación en consecuencia

Para recordar
Los programas controlan a la computadora
Los lenguajes de programación nos permiten "hablar" con la computadora a un nivel más cercano al pensamiento humano que al de la computadora
Los programas operan con datos
Los programas pueden ser por Lotes o controlados por eventos

sábado, 10 de enero de 2009

Programar no es sólo hacer matemáticas

Cada cierto tiempo se oyen voces críticas sobre la falta de rigor con la que trabajan la mayoría de los programadores. La falta de métodos formales de verificación y benchmarking produce muchos programas lentos y nada fiables. Pero ¿es la programación sólo una extensión de las matemáticas por otros medios?

El pasado 9 de diciembre Robert Scoble tuvo la en apariencia inocente ocurrencia de preguntar en su blog porqué el software de gestión no puede ser igual de sexy que el de consumo Más de cien comentarios y acusaciones de que no entiende el software empresarial como la de Michael Krigsman pusieron de manifiesto que con la pregunta Scoble tocó hueso.
En defensa de Robert salió el reputado Nicholas Carr, diciendo que es Krigsman quien no entiende nada de software y que creando una falsa dicotomía entre el software de consumo y el software de gestión lo único que se consigue es dar a los fabricante de éste último la excusa perfecta para seguir creando aplicaciones difíciles y desagradables.
El flame war continuó con otra andanda de Krigsman argumentando que Carr vive en un mundo de fantasía donde es posible emplear tiempo en dotar a las aplicaciones empresariales de pijadas totalmente innecesarias antes que atender a los requisitos funcionales básicos, las prioridades del negocio, el soporte de aplicaciones legacy y las limitaciones tecnológicas de la infraestructura.
Pero el clímax de esta historia lo he alcanzado leyendo una referencia en el blog de Agustín González-Quel al artículo Where Are the Software Engineers of Tomorrow? de Robert B.K. Dewar y Edmond Schonberg. En el cual los papás de ADA despotrican abiertamente contra el uso de Java para fines pedagógicos en las universidades, argumentando que el uso de Java es nocivo porque en vez de incentivar la reducción de la complejidad formal de procesos a un pequeño conjunto de operaciones primitivas, lo que Java fomenta es la resolución de problemas cual fontanero en ferretería tirando de todo lo que pilla en lo cajones a modo de frameworks y librerías que acaban convirtiendo al estudiante en un ignorante total del coste computacional de lo que está haciendo y de nociones imprescindibles para la programación como son los punteros.
Es verdad que entre los programadores más jóvenes hay una excesiva tendencia a abusar de las librerías. Cogen unos mágicos tags de Java y convierten una JSP que antaño era fácilmente legible y rápida en un amasijo de abreviaturas crípticas que tiran contra lentísimos servlets que hay que recompilar cada vez que quieres tocar algo. O se pillan Castor (o lo que sea) y unas DTDs y te dejan varios cientos de clases basura pregeneradas para leer un archivo XML de 10 líneas. Es decir, a veces matan moscas a cañonazos simplemente porque lo que tienen a mano para combatir insectos es un cañón.
Pero no es menos cierto que Java ha supuesto un gran salto cualitativo hacia adelante en la programación. Quien ha programado con punteros se acuerda de que en los 80 y 90 estábamos hartos de ellos y de las pérdidas de memoria que siempre acaban provocando. Y fue por eso que acabamos quitándolos en los lenguajes modernos. Hubo un tiempo en el que se cuestionaba la eficiencia y la viabilidad de usar recolectores de basura como el de la máquina virtual de Java, cuya utilidad y eficacia ahora ya nadie se atreve a poner en duda. Cuando no teníamos esas librerías ballena de Java, nos dedicábamos a escribirlas ¿Alguien se acuerda de ACE o de Rogue Wave para C++?
Por supuesto que hay muchas cosas muy mejorables en Java. Pero para mi Java ha sido un avance y no un retroceso.
Sobre si el software empresarial tiene que funcionar bien y no necesariamente ser bonito opino que: nadie puede ser buen programador si ignora la reacción emocional que sus programas causan en los usuarios. Escribimos programas para que alguien los use (o los sufra). Bueno, si, algunos escriben módulos de control para satélites, pero no me refiero a ese tipo de software, sino al típico software de gestión que debe necesariamente interactuar con humanos.
Los que reclaman más métodos formales y algebraicos y menos giliflauteces, deben entender que la programación no es simplemente una variante de las matemáticas, porque en el momento en que entra el juego el factor humano, la idoneidad del programa realizado deja de ser rigurosamente medible.
En un mundo utópico los programas son bellas estructuras matemáticas y el arte de programar consiste en emplear el intelecto para reducir la complejidad, abstraer y sintetizar.
Pero en el mundo real las cosas están pensadas para ser simples, porque si fueran complejas no podríamos manejarlas en el día a día. Las herramientas están pensadas para que le des al botón de crear formulario, pegues unos cuantos controles visuales dentro, escribas un poco de código para procesar los eventos y a las seis te vayas a tu casa a jugar con tus hijos sin tener ni la menor idea de lo que es un puntero.
Y los usuarios no sólo quieren que el software funcione, quieren que mole y que les divierta. Porque ¿quién dijo que el daño económico que causa un bug es peor que el daño psicológico que causa no poder poner la foto de tu perro como fondo de pantalla?
Por último, haré una afirmación aún más radical, lo que diferencia a un programador bueno de uno sobresaliente no es su capacidad para buscar soluciones lógicas, sino su capacidad para buscar soluciones ilógicas. Me explico: cuando tiene delante un problema que tiene pies y cabeza, cualquier ingeniero cualificado puede atacarlo aplicando alguna determinada metodología y, con el paso del tiempo, tarde o temprano lo acabará resolviendo. Pero, de vez en cuando, se presentan problemas totalmente desconcertantes y aparentemente sin sentido. Puede, por ejemplo, que el ordenador haya sido infectado por un virus sibilino. Entonces es posible perder horas persiguiendo un bug fantasma hasta que alguien llega y dice ¡hey si no es el programa lo que funciona mal entonces debe ser otra cosa! y con dicha hipótesis ad-hoc completamente infundada dispara un proceso de pensamiento lateral de búsqueda de soluciones en las que no se había pensado. Algo así como cuando alguien dijo ¡hey, y si deterioramos la calidad de la imagen? Y entonces se inventó JPEG (sin menosprecio de su fundamento en la teoría de información) o cuando Steve Jobs se pregunto ¡hey, porqué todas las letras de la pantalla tienen que ser de ancho fijo? Los programadores comunes pierden horas buscando una explicación aparente razonable a un problema que les trae muertos. Los programadores de élite huelen el problema y buscan un atajo, es casi como si diagnosticaran el error con la punta de su nariz antes que con el cerebro.

La Vida de un Programador


La gente que no se dedica a esto no lo sabe, pero programar es una tarea muy estresante, pensar en como hacer que salga un programa, y resolver los errores que siempre hay puede haber, hay que tener cuidado porque podríamos llegar a este punto:

sábado, 3 de enero de 2009

TECNOLOGÍAS DE INFORMACIÓN

A finales del siglo XIX e inicios del siglo XX, el mundo vivió una revolución tecnológica, misma que originó procesos turbulentos de reacomodo, de estabilización, de entendimiento. La economía, la industria, la agricultura y la sociedad se encontraban en medio de todo este cambio, por ende, cada uno de ellos resultó afectado. (Kalakota y Robinson, 2001). Como lo dan a conocer Kalakota y Robinson (2001) y Norris Grant, Hurley James, Hartley Kennet, Dunleavy John, Balls John (2000), el Internet en toda esta revolución ha llegado a ser aceptado rápidamente por sobre los demás medios de comunicación como son el teléfono, la radio, la televisión, los cuales su tiempo de aceptación fue mucho mas largo. mas......

Desarrollo - Soluciones Cabezera Animada


Ver Estadisticas