SYMFONY

lunes, 21 de febrero de 2011

SYMFONY

INTRODUCCIÓN

Symfony es un framework PHP que facilita el desarrollo de las aplicaciones web. Symfony se encarga de todos los aspectos comunes y aburridos de las aplicaciones web, dejando que el programador se dedique a aportar valor desarrollando las características únicas de cada proyecto.
Si todavía programas aplicaciones PHP a mano, se está perdiendo el tiempo y mucho dinero. Symfony aumenta exponencialmente la productividad y ayuda a mejorar la calidad de sus aplicaciones web aplicando todas las buenas prácticas y patrones de diseño que se han definido para la web.
Symfony es además el framework más documentado del mundo, ya que cuenta con miles de páginas de documentación distribuidas en varios libros gratuitos y decenas de tutoriales.

Características

• Fácil de instalar y configurar en sistemas Windows, Mac y Linux
• Funciona con todas las bases de datos comunes (MySQL, PostgreSQL, SQLite, Oracle, MS SQL Server)
• Compatible solamente con PHP 5 desde hace años, para asegurar el mayor rendimiento y acceso a las características más avanzadas de PHP
• Basado en la premisa de "convenir en vez de configurar", en la que el desarrollador solo debe configurar aquello que no es convencional
• Preparado para aplicaciones empresariales, ya que se puede adaptar con facilidad a las políticas y arquitecturas propias de cada empresa u organización
• Flexible hasta cualquier límite y extensible mediante un completo mecanismo de plugins
• Publicado bajo licencia MIT de software libre y apoyado por una empresa comprometida con su desarrollo
• Traducido a más de 40 idiomas y fácilmente traducible a cualquier otro idioma

Symfony es adecuado tanto para programadores expertos como para principiantes del desarrollo web. El principal argumento para decidir si deberías o no utilizar Symfony es el tamaño del proyecto.
Si se va a desarrollar un sitio web sencillo con 5 o 10 páginas diferentes, acceso simple a bases de datos y no es importante asegurar un gran rendimiento o una documentación adecuada, debería realizar su proyecto sólo con PHP.
Sin embargo, si se desarrolla aplicaciones web medianas o complejas, en las que es importante la productividad de su desarrollo, la facilidad de su mantenimiento, su seguridad y la garantía de utilizar librerías probadas en algunos de los sitios web más grandes de Internet, entonces se debería utilizar un buen framework como Symfony.
Si es un programador web profesional y muy experimentado, es posible que conozca otros frameworks y lenguajes. Si se busca un equivalente en PHP para Grails, Struts, Spring, RubyOnRails o Django, entonces Symfony es lo que se estaba buscando.

INSTALACIÓN DE SYMFONY

Para realizar la instalación de symfony en un entorno GNU/Linux necesitamos tener instalados los siguientes paquetes:

  • Apache2
  • Php5
  • MySQL
  • Php5-xsl
  • Php-apc

Este tutorial se basa en el tutorial de instalación de la pagina oficial de symfony, el mismo que lo podemos encontrar en: http://www.symfony-project.org/jobeet/1_4/Doctrine/es/.

Como primer paso debemos crear una carpeta, en cualquier directorio que queramos que en este caso se llamará ingeniería; para ello abrimos una terminal y escribimos el siguiente comando:

mkdir /home/beto/ingenieria/

Luego nos ubicamos dentro de la carpeta mediante el comando

cd /home/beto/ingenieria/

Luego vamos a crear los subdirectorios lib/vendor con el siguiente comando:

mkdir -p lib/vendor

Luego de hacer esto descargamos el symfony de la pagina oficial y lo descomprimimos en el directorio vendor, le cambiamos de nombre de manera que el nombre de la carpeta sea solo symfony. Una vez hecho esto vamos al terminal y chequeamos si la configuracion de php cumple con los requisitos mínimos y para ello escribimos el siguiente comando:
pphp lib/vendor/symfony/data/bin/check_configuration.php
php lib/vendor/symfony/data/bin/check_configuration.php

Obteniendo lo siguiente:

Como vemos en la imagen nos aparecen algunos errores. Debajo de la descripción del error encontramos la solución al mismo. En este caso para los dos primeros errores debemos instalar el paquete php5-xsl y el paquete php-apc; los podemos instalar desde el gestor de paquetes synaptic o utilizando el comando sudo apt-get install nombrePaquete.

Para el tercer error que se nos presenta debemos editar el archivo php.ini como nos dice allí el comando show_open_tag debe ser puesto en Off. Para hacer esto escribimos en el terminal el siguiente comando:

sudo gedit /etc/php5/cli/php.ini


Si al ejecutar de nuevo el comando
php lib/vendor/symfony/data/bin/check_configuration.php

no aparece ningun error entonces escribimos en la terminal
php lib/vendor/symfony/data/bin/symfony -V

para comprobar que symfony se ha instalado correctamente.

La herramienta symfony es muy poderosa si queremos ver las opciones y tareas disponibles escribimos en la terminal el comando:

php lib/vendor/symfony/data/bin/symfony


Creación de un proyecto

Para la creación de un proyecto en symfony, debemos estar en la carpeta raíz, es decir dentro de la carpeta Joobet creada. Si no lo estamos escribimos en el terminal el comando

cd /home/beto/ingenieria/

Una vez ubicados allí ejecutamos el comando:

php lib/vendor/symfony/data/bin/symfony generate:project ingenieria


La tarea generate:project genera por defecto la estructura de directorios y archivos necesarios para un proyecto symfony:

Directorio             Descripción
apps/                    Hospeda todas las aplicaciones del proyecto
cache/                  Los archivos en caché
config/                  Los archivos de configuración del proyecto
lib/                       Las bibliotecas y clases del proyecto
log/                      Los archivos de registro
plugins/                Los plugins instalados
test/                     Los archivos de pruebas unitarias y funcionales
web/                   El directorio raíz web (véase más adelante)

La tarea generate:project también ha creado un atajo symfony en el directorio raíz del proyecto ingenieria para reducir el número de caracteres que tienes que escribir cuando se ejecuta una tarea.
Así, a partir de ahora, en lugar de utilizar la ruta completa al programa de Symfony, vamos a utilizar el atajo symfony.

Posteriormente vamos a crear una aplicación para ello en el terminal ponemos el siguiente comando:

php symfony generate:app frontend

Nos creará los siguientes directorios bajo el directorio apps

Directorio               Descripción
config/                    Los archivos de configuración de la aplicación
lib/                         Las bibliotecas y clases de la aplicación
modules/                El código de la aplicación (MVC)
templates/              La plantilla global

Si revisas el directorio web/, encontrarás dos archivos PHP: index.php y frontend_dev.php. Estos archivos son llamados controladores frontales: todas las peticiones a la aplicación se hacen a través de ellos. Pero, ¿por qué tenemos dos controladores frontales si hemos definido sólo una aplicación?

Ambos archivos apuntan a la misma aplicación pero para distintos entornos. Cuando desarrollas una aplicación, excepto si desarrollas directamente en el servidor de producción, necesitas varios entornos:
El entorno de desarrollo: Este es el ambiente utilizado por desarrolladores web para añadir nuevas funciones, corregir los errores, ...

El entorno de prueba: Este entorno se utiliza para probar automáticamente la aplicación.
El entorno staging: Este entorno es utilizado por el cliente para poner a prueba la aplicación e informar errores o características faltantes.
El entorno de producción: Este es el entorno donde un usuario final interactúa.

CONFIGURACIÓN DEL SERVIDOR WEB

Para realizar la configuracion del servidor web debemos editar el archivo httpd.conf el mismo que se encuentra en /etc/apache2/httpd.conf
En el terminal ejecutamos el siguiente comando:

sudo gedit /etc/apache2/httpd.conf

Luego de abierto el archivo copiamos lo siguiente:
# Asegúrate de tener sólo una vez esta línea en su configuración
NameVirtualHost 127.0.0.1:8080

# Esta es la configuración de Jobeet
Listen 127.0.0.1:8080

DocumentRoot "/home/sfprojects/jobeet/web"
DirectoryIndex index.php

AllowOverride All
Allow from All

Alias /sf /home/sfprojects/jobeet/lib/vendor/symfony/data/web/sf

AllowOverride All
Allow from All


Modificamos los directorios de acuerdo a los que tenemos en nuestra maquina:


En esta configuración, Apache escucha en el puerto 8080 de tu máquina, por lo que el sitio web de ingenieria será accesible en la siguiente URL:

http://localhost:8080/

Luego de realizado el cambio en el archivo lo guardamos y reiniciamos apache con el comando

sudo /etc/init.d/apache2 restart

Seguidamente abrimos un navegador y escribimos en la barra de direcciones:

http://localhost:8080/index.php/


Si todo está bien nos aparecerá una pantalla como la siguiente:



La aplicación en el entorno de desarrollo la podemos ver escribiendo:

http://localhost:8080/frontend_dev.php/

Jobeet, el nuevo tutorial de Symfony 1.2


DESCARGAR TUTORIAL COMPLETO DE JOBBET

WEBGRAFÍA:
http://www.librosweb.es/jobeet/capitulo2/nos_vemos_manana1.html

ANÁLISIS LÉXICO SINTÁCTICO Y SEMÁNTICO PARA ECUACIONES DE SEGUNDO GRADO

jueves, 17 de febrero de 2011

ANALIZADOR LÉXICO




DEFINICION DE LA GRAMATICA

G={VT,VN,S,R}

VT={1……9,a……z,2,1,0,4,=,raíz,(,)}

VN= {ecuación, asig, numeronulo,  variable, segundo, primerO, terceroO, exp, numerodef, parentesisI, parentesisC, discrimante, Raiz}

R=


REGLAS GRAMATICALES


     S                             -> ecuación asig numeronulo| ecuacion
ecuacion                 -> primerO operador segundoO operador tercerO | primerO operador segundo | primerO operador tercerO | primerO |operador ecuación |operador primeroO raíz discrimante |segundoO
primerO                   -> numero variable exp| variable exp
segundoO               -> numero variable| variable | segudoO variable
tercerO                   -> numero | variable
discriminante       -> parentesisI ecuacion operador ecuación parentesisC
numero                  -> 1……….9
variable                -> a………z
exp                         -> 2 | 1
asig                        -> =
numeronulo         ->  0
numerodef          -> 4
operador             -> + |- |/ | *
parentesisI         -> (
parentesisC      ->  )
Raiz                     ->  raiz

Ejemplo de la gramática
·         2x2+3x-4


ANALIZADOR SEMÁNTICO



     S                         ->  ecuación asig numeronulo | ecuación
Print(ecuación.val asig.valex numeronulo.valex)
Print(ecuación.val)
ecuacion           ->  ecuación.val operador tercerO | primerO operador segundoO | primerO |operador ecuación |operador primeroO raíz discrimante |segundo
    ecuación.val = ecuación.val operador.valex terceroO.val                                      
    ecuación.val =primero.val operador.valex segundo.val
    ecuación.val = operador.val ecuación.val
    ecuación.val = operador.valex primero.val raíz.valex discriminante.val
    ecuación.val = segundo.val
primeroO     ->  numero variable exp| variable exp
primero,val = numero.valex variable.valex exp.valex                                     
primero,val =variable.valex exp.val

segundoO  -> numero variable| variable | segudoO variable
    segundo.val = numero.valex variable.valex
    segundo.val =variable.valex
    segundo.val =segundo.val variable.valex

tercerO  -> numero | variable
tercero.val= numero.val
tercero.val= variable.val
discriminante         ->  parentesisI ecuacion operador ecuación parentesisC
discriminante.val= parentesisI.valex ecuación.val operador.valex                    ecuación.val parentesisC.valex
numero                        ->  1……….9
numero.valex = 1.valex| 2.valex |3.valex|4.valex|5.valex|6.valex|7.valex 1 8.valex|9.valex
variable                       ->  a………z
variable.valex= a.valex………….z.valex
exp                                   ->  2
exp.valex=2.valex
asig                                  ->  =
asig.valex = =.valex
numeronulo                ->  0
numeronulo.valex = 0.valex
numerodef                   ->  4
numerodef.valex =4.valex
operador             ->   + |- |/ | *
operador.valex = +.valex | -.valex | /.valex | *.valex
parentesisI                ->  (
parentesisI.valex = (.valex
parentesisC             ->  )
parentesisC.valex = ).valex
Raiz                          ->  raíz
Raíz.val=raíz.valex

LA NUEVA TECNOLOGÍA DE ESCRITURA

lunes, 14 de febrero de 2011

 
La Mobile World Conference que se está celebrando estos días en Barcelona no deja de traer noticias y nuevas tecnologías.

Snapkeys es una de esas nueva tecnologías que nos ha llamado la atención porque podría aplicarse a nuestros iPhones, se trata de un teclado multitáctil sin botones que nos permite ver toda la pantalla donde estamos escribiendo, solo tiene un problema, requiere cierto aprendizaje, así que no creo que Apple esté interesada, pero tal vez Cydia traiga algo parecido pronto.


webgrafía: 


QWIKI: ENTRE GOOGLE Y WIKIPEDIA, UNA WEB QUE TE LO CUENTA TODO

domingo, 6 de febrero de 2011


Los cambios en Internet se suceden a una velocidad tan grande que apenas es posible aprehenderlos. Si redes sociales como Facebook o Twitter suman más de 500 y 200 millones de usuarios respectivamente, nuevas formas de comunicación o acceso a la comunicación surgen casi cada mes con un potencial enorme.
A Quora, la cuidada red de preguntas y respuestas o Diaspora, la alternativa social para los descontentos con Facebook, se suma ahora Qwiki, un híbrido entre Google y la Wikipedia que cautiva al primer vistazo. No en vano Techcrunch, una de las webs de tecnología más prestigiosas, calificó este proyecto en su presentación en septiembre en EEUU como "el futuro del consumo de información".
Hasta ahora, además de tratarse de una beta, sólo se podía entrar mediante invitación, pero una vez abierto el acceso se pueden comprobar todas sus posibilidades. Eso sí, continúa estando en inglés.

UNA WEB QUE SABE MILLLONES DE COSAS

"Qwiki sabe millones de cosas". Esto es lo que dice la web de sí misma desde su portada Si damos por buenas las cifras que ofrece la compañía, Qwiki cuenta ya con dos millones de entradas que, a la manera enciclopedia Wikipedia, incluyen todas las áreas de la actualidad y el conocimiento humanos: personajes célebres, monumentos, ciencia, naturaleza...
Hasta aquí Qwiki no diferiría demasiado de otros proyectos similares en los que la competencia se centra en la potencia del motor de búsqueda, la capacidad para captar colaboradores o los filtros que se establezcan para asegurar un mínimo de rigor en las informaciones.
Pero lo que no tiene nada que ver es la manera de presentar esta información: inspirado a medias en el profesor por un lado y en las películas de ciencia ficción por otro, Qwiki te habla. Y saca buen partido a las capacidades multimedia de Internet.

EL MEDIO, EL MENSAJE

Al introducir un término devuelve una atractiva presentación audiovisual, que resume la información más importante incluyendo galería de fotos, audio y, por supuesto contenido relacionado. Además, este contenido relacionado no se refiere sólo a otras entradas sobre el tema, sino que ofrece la posibilidad de profundizar en el mismo asunto enlazando a contenido de otras plataformas o a través de otros buscadores: Wikipedia, Fotopedia, Google, Youtube...
Los contenidos se enriquecen con la colaboración de cada usuario, que tiene la posibilidad de sugerir nuevas imágenes o vídeos relacionados sin necesidad de registrarse. 

FUENTE:



ANTLR

jueves, 3 de febrero de 2011

ANTLR es un generador de lenguajes, a partir de la especificación de un lenguaje a partir de una gramática podemos:
• Reconocer si un programa (o palabra) cumple una especificación.

• Traducir el programa (o palabra) a otro lenguaje.

• Realizar alguna serie de órdenes.

A veces nos interesara definir el lenguaje de una forma más laxa. Admitimos palabras/programas que en principio no tengan mucho sentido porque:


• Es más fácil definir la gramática.

• La estructura que define expresa la estructura que buscamos.

Ejemplo de utilización de ANTLR

Definamos una gramática para el lenguaje de los paréntesis.

gramar prueba;


principal

:’(’principal’)’|;

Primera prueba, ¿Cómo definir una gramática para que acepte lo mismo añadiendo los corchetes?

gramar prueba;

principal

: SI principal1 (CONTRA principal) ? |ALGO;

principal1


: SI principal1|ALGO;

SI :’sib’;

CONTRA: ’en_otro_caso’;

ALGO: ’algo’;

WS:(’\n’|’\t’|’\r’|’’) +{ skip ();};


gramar suma;


start: expresion;

expresion

: NUMERO OPERADOR expresión |NUMERO;

NUMERO: ’0’..’9’+;

OPERADOR: ’+’;


ESPACIOS: (’\n’|’\r’|’\t’){skip();};

El EBNF define reglas de producción donde las secuencias de símbolos se asignan respectivamente a a no terminal:


dígito excepto cero:: = “1” | “2” | “3” | “4” | “5” | “6” | “7” | “8” | “9” ;

dígito :: = “0”
dígito excepto cero;

Esta regla de producción define el no terminal dígito cuál está en el lado izquierdo de la asignación. La barra vertical representa un alternativa y los símbolos terminales se incluyen con las comillas seguidas por un punto y coma como terminar el carácter. Por lo tanto a Dígito es a 0 o a dígito excepto cero eso puede ser 1 o 2 o 3 y así sucesivamente hasta 9.


ANTLR

http://personales.unican.es/gomezd/Talf/antlr.pdf

Generador JavaCC

Principios básicos del generador JavaCC


El generador JavaCC (Java Compiler Compiler) es una herramienta para generar programas escritos en lenguaje Java; acepta como entrada una especificación de un determinado lenguaje y produce como salida un analizador para ese lenguaje. En la manera más simple de funcionamiento, la especificación proporcionada define las características sintácticas y lexicográficas de un lenguaje y se genera un analizador léxico-sintáctico del lenguaje especificado; pero también es posible completar una especificación léxico-sintáctica con la inclusión adecuada de código para que el programa generado llegue a ser un analizador completo del lenguaje.

Obtención de un analizador léxico-sintáctico

• Pasos para la generación del analizador

1.- Edición de la especificación (editor de texto plano)


vi | edit | • • • NombreFichero.jj

(El nombre del fichero puede tener cualquier extensión; suele usarse .jj)

2.- Ejecución del generador

javacc NombreFichero.jj

como resultado de la generación se obtiene (además de otros ficheros auxiliares) el fichero NombreDeLaEspecif.java

3.- Compilación del analizador generado

javac NombreDeLaEspecif.java

Como resultado de la compilación se obtiene (además de otras clases auxiliares) el fichero



• Ejecución del analizador generado


Si el nombre del fichero donde se encuentra el texto fuente (escrito en el lenguaje para el que se ha generado el analizador) que se pretende analizar es Programa.len

java NombreDeLaEspecif < Programa.len

Si se desea que los resultados del análisis, en vez de presentarse por pantalla, queden grabados en un fichero de nombre Salida.dat

java NombreDeLaEspecif < Programa.len > Salida.dat


Ejemplo de presentación


• Descripción del lenguaje

El lenguaje L está formado por las expresiones en las que pueden aparecer:

- variables

- constantes

- operadores + y *

Las variables son nombres formados por una única letra (minúscula o mayúscula); las constantes son números enteros de una o más cifras. El espacio y el tabulador pueden estar presentes, pero no tienen ningún significado; los finales de línea tampoco son significativos (una expresión puede codificarse ocupando una o más líneas).

La sintaxis de las expresiones se especifica mediante la siguiente gramática:

::= { + }


::= { * }

::= variable


| constante


| ( )

• Especificación léxico-sintáctica codificada con la notación JavaCC


Una manera de escribir la especificación (para la que se ha elegido el nombre ExprMin) de forma que sea aceptada por el generador es:

options { Ignore_Case = true; }

PARSER_BEGIN (ExprMin)

    public class ExprMin {

      public static void main (String[] argum) throws ParseException {

      ExprMin anLexSint = new ExprMin (System.in);

      anLexSint.unaExpresion();

     System.out.println("Análisis terminado:");

    System.out.println

        ("no se han hallado errores léxico-sintácticos");

   }

}

PARSER_END (ExprMin)

void unaExpresion() :

    { }

   {

       expresion()

   }

void expresion() :

   { }

  {

     termino() ( "+" termino() )*

  }

void termino() :

   { }

   {

       factor() ( "*" factor() )*

   }

void factor() :

    { }

    {

     

      |


      | "(" expresion() ")"

   }

TOKEN:


  {

     < variable : ["a"-"z"] >

  }

TOKEN:

  {

    < constante : ( ["0"-"9"] ) + >

  }

SKIP:

  { " " | "\t" | "\n" |  "\r" }


Obtención del analizador


Si la especificación precedente se tiene grabada en un fichero de nombre Ejemplo.jj, para obtener el analizador:

- se ejecuta el generador: javacc Ejemplo.jj

- se compila el analizador generado: javac ExprMin.java

• Ejecución del analizador


Si se quiere analizar una expresión grabada en un fichero de nombre PruebaExp.txt:

- se ejecuta el analizador obtenido: java ExprMin < PruebaExp.txt

Analizadores generados


En su funcionamiento más sencillo y habitual, JavaCC genera un analizador sintáctico, complementado con un analizador lexicográfico, para que, conjuntamente, se pueda realizar un análisis léxico-sintáctico de un texto de entrada.

El analizador sintáctico obtenido es, en general, LL(k): descendente y determinista con la consulta de k símbolos por adelantado; si la gramática proporcionada cumple la condición LL(1), se genera un analizador sintáctico descendente-predictivo-recursivo. Más adelante se hacen algunas precisiones sobre esta afirmación.

Si la especificación léxico-sintáctica de un lenguaje codificada en JavaCC tiene dado (como indicativo que acompaña a las palabras reservadas PARSER_BEGIN y PARSER_END) el nombre EspLexSin y se tiene grabada en un fichero de nombre Lenguaje.jj, cuando se ejecuta el generador tomando como entrada ese fichero

javacc Lenguaje.jj

Se obtienen los siguientes ficheros (clases) con código Java:


Token.java

   Descripciones para la comunicación entre los analizadores léxico y sintáctico

TokenMgrError.java

  Tratamiento de errores para el análisis lexicográfico

ParseException.java

  Tratamiento de errores para el análisis sintáctico

SimpleCharStream.java

  Componentes para la realización de las tareas de entrada/salida del analizador

EspLexSinConstants.java

 Definición de la representación interna de las piezas sintácticas

EspLexSinTokenManager.java

 Analizador lexicográfico

EspLexSin.java

 Analizador sintáctico


Puede apreciarse que hay dos categorías de nombres de ficheros generados: los cuatro primeros nombres citados no dependen del nombre de la especificación considerada, los otros nombres de ficheros se forman a partir del nombre dado a la especificación.


Una especificación para el generador JavaCC puede considerarse dividida en cuatro secciones:

Sección de opciones


Sección de ejecución

Sección de sintaxis

Sección de lexicografía.


SITIO OFICIAL JAVACC