Wednesday, January 9, 2008

Mover Proyecto Symfony de Ubuntu a Redhat

Actualmente estoy trabajando con PHP Symfony y instalado un proyecto en Redhat que fue generado y construido en Ubuntu por lo que al instalar el symfony usando pear(al igual que ubuntu) la ruta de los archivos de symfony es diferente y al ejecutar cualquier comando de symfony('symfony cc' por ejemplo) ocurren errores al hacer los includes. Ejemplo: jhernandez@POSEIDON-LINUX:~/WebApps/$ symfony cc Warning: include(/usr/share/pear/data/symfony/bin/symfony.php): failed to open stream: No such file or directory in /usr/bin/symfony on line 39 Warning: include(): Failed opening '/usr/share/pear/data/symfony/bin/symfony.php' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /usr/bin/symfony on line 39 Esto sucede porque el archivo config/config.php apunta a una direccion de los archivos de symfony invalida. En Ubuntu por ejemplo, el archivo config/config.php debe verse similar a este: // symfony directories $sf_symfony_lib_dir = '/usr/share/php/symfony'; $sf_symfony_data_dir = '/usr/share/php/data/symfony'; En Redhat por ejemplo, el archivo config/config.php debe verse similar a este: // symfony directories $sf_symfony_lib_dir = '/usr/share/pear/symfony'; $sf_symfony_data_dir = '/usr/share/pear/data/symfony'; Esto se debe a que el PEAR instala los archivos de php symfony en diferentes rutas de acuerdo a la distribucion. Solo es cuestion de corregirlo para que el problema se solucione.

Monday, December 3, 2007

Como funciona HTTP como Separador de Mensajes TCP

Tal como ya había comentado en un post anterior, TCP es un Protocolo de Control de Flujo de Datos, no de Mensaje de Datos por lo que es necesario implementar un separador de Mensajes sobre TCP. ¿Qué exactamente Hace un Separador de Mensajes? Un separador de Mensajes es un conjunto de reglas que se aplican sobre la transmisión de datos para saber de que parte de que flujos comienzan o finalizan los mensajes, casi siempre el Separador de Mensajes se implementa con un Encabezado y un Contenido donde una de las múltiples funciones del encabezado es el de informar del tamaño total del cuerpo del mensaje en caso de que exista. Protocolos como HTTP implementan su propio separador de Mensajes. Ejemplo:

HTTP/1.1 POST /

Content-Length:16

txtNombre=Johan

El ejemplo anterior es un mensaje HTTP, se compone de un encabezado y un cuerpo. El encabezado se compone de un conjunto de Líneas separadas por un tabulado LFCR?? Que se separa del cuerpo del mensaje por una línea en blanco. Si el encabezado contiene una línea Content-Length entonces después de la línea en blanco se recibirá como cuerpo del mensaje el número total de bytes que se especifico en la línea Content-Length, si no se especifica Content-Length, entonces el mensaje se compone solo del encabezado y los siguientes bytes recibidos después de la línea en blanco son tomados como el Encabezado de otro Mensaje.

Para el ejemplo del Mensaje HTTP que se mostro anteriormente corresponde a el siguiente conjunto de bytes:

72, 84, 84, 80, 47, 49, 46, 49, 32, 80, 79, 83, 84, 32, 47, 10,13,67, 111, 110, 116, 101, 110, 116, 45, 76, 101, 110, 103, 116, 104, 58, 49, 54,10,13,10,13,116, 120, 116, 78, 111, 109, 98, 114, 101, 61, 74, 111, 104, 97, 110

Debido a que el encabezado del Mensaje HTTP es siempre ASCII cada byte del encabezado corresponde a un carácter ASCII, la combinación de byte 10(LF, Representado en Espace Unicode de C# como ‘\n’) y 13(CR, Representado en Escape Unicode de C# como ‘\r’) indican que finaliza una Linea del Encabezado HTTP. El dato binario anterior compone un mensaje HTTP completo pero ese dato binario puede recibirse en multiples flujos de datos TCP de cualquier tamaño, Es decir, que podríamos recibir:

  1. 72, 84, 84, 80, 47, 49, 46, 49, 32, 80, 79, 83, 84, 32, 47, 10

  2. 13,67, 111, 110, 116, 101, 110, 116, 45, 76

  3. 101, 110, 103, 116, 104, 58, 49, 54,10,13,10,13,116, 120, 116

  4. 78, 111, 109, 98, 114, 101

  5. 61, 74, 111, 104, 97, 110

Cuando se está percibiendo datos TCP y haciendo un parsing para Formatear Mensajes, se tiene que saber que bytes corresponden a el encabezado del mensaje actual, el contenido del mensaje actual o el encabezado de los siguientes mensajes que se recibirán. Las operaciones a realizar son las siguientes:

  1. Leer todas las líneas del encabezado hasta encontrar una línea en blanco, que equivale a encontrar la secuencia de bytes 10,13,10,13.

  2. Si el encabezado contiene una sentencia Content-Length y su valor es mayor a 0, entonces después del encabezado se tomaran cuantos bytes se reciban como contenido del Mensaje hasta agotar la cantidad especificada. Ejemplo: Si se recibe en el encabezado la línea ‘Content-Length:3563’, entonces se tomaran los 3563 bytes que se reciban en uno o más flujos de datos después de encontrar la secuencia 10,13,10,13.

Ejemplo:

Ultima Línea del Encabezado

Fin de Línea en Blanco

56

34

673

10

13

10

13

43

48

34

Final de Encabezado HTTP

Contenido

En una proxima entrega explicare como se ha implementado este Procolo en C#.

Siguiendo Tutorial de PHP Symfony en Ubuntu

Desde hoy me han encargado de un proyecto en PHP, especificamente con PHP Symfony(un framework MVC) asi que me he descargado el Symfony Sandbox y configurado en mi Apache2 pero he encontrado algunas dificultades con los comandos de symfony al ejecutar el Tutorial y por eso escribi este post para guiarles acerca de los paquetes necesarios para seguir correctamente el Tutorial. Los paquetes con los siguientes: php5-xsl php5-sqlite Debido a que el tutorial trabaja con SQLLite para almacenar los datos, se debe reiniciar apache2 para que el php de apache cargue los modulos recientemente instalados: $apache2ctl restart o $/etc/init.d/apache1 restart El libro se pude descargar por eMule o en la pagina oficial de Symfony. Suerte con PHP Symfony.

Wednesday, November 28, 2007

Seminario: "Capacidades de Ubuntu Linux 7.10 Gutsy Gibbon" en Kapacita

Hoy 28 de Noviembre estare dictando un seminario de Ubuntu Linux en Kapacita, un instituto de Tecnologia aqui en la ciudad de Caracas que esta introduciendo excelentes Cursos para Certificacion en Linux y Ubuntu. Pronto estaremos impartiendo otro seminario que puede ser de tu interes, escribeme un comentario o enviame un correo a johan@ubuntu.org.ve o a thepumpkin1979@gmail.com. El 8 de Diciembre tambien estare en la ciudad de Maracaibo para un evento de Ubuntu, pronto les dare mas detalles. Si eres de Maracaibo tambien podras asistir. Saludos.

Sunday, November 18, 2007

Separador de Mensajes TCP

Hace tiempo que no escribo y es que he estado trabajando en Demasiadas, Demasiadas cosas interesantes, una de ellas es la reconstruccion de mi Servidor HTTP. La otra tarea no tan trivial es un Protocolo de Mensajeria Interna en LAN y con routing a varios servidores. En fin, el punto es que Ambos requieren que sobre TCP se transmitan diferentes tipos de mensajes. Porque no usar .NET Remoting? Muy pesado para tantas conexiones y necesito hacer clientes en diferentes plataformas basados en un sola definicion de protocolo y no tengo tanta experiencia haciendo SinkProviders de Remoting asi que he decidido hacer un separador de Mensajes TCP. Porque TCP necesita un separador de mensajes? TCP(combinado con IP) es un protocolo de transmision de flujos de datos, no de mensajes. Cual es la diferencia? En un protocolo de Flujo de Datos(Data Stream) se envian los datos en el mismo orden pero no se tiene seguridad de que lleguen de la misma forma y lo voy a explicar asi. Un punto de Red llamado A envia datos a un punto de red llamado B: Punto de Red 'A' Envia los siguientes flujos(cada linea representa un flujo de datos):
  1. 23,34,11,73
  2. 34,67,83,96
El punto de Red 'B'(quien recibe los mensajes) podria recibir los mismos datos en la misma o diferente cantidad de flujos:
  1. 23
  2. 34,11
  3. 73,34,67
  4. 83,96
Como veran los datos llegan en el mismo orden pero no de la misma forma debido a que TCP garantiza que el flujo llegue al destino en el orden original pero no de la misma forma y esto se puede observar en el ejemplo donde 'A' envia 2 flujos pero 'B' recibe 4, sin embargo los bytes llegan de la misma forma. Tambien se puede demostrar esto asi: 'A' envia los siguientes textos representados en flujos(cada linea representa un flujo):
  1. Este es el contenido de el Archivo 1
  2. pero el Archivo 1 tambien tiene otra linea que es esta.
  3. (B, Aqui comienza el Archivo2)
  4. Esta es la linea del Archivo 2
'B' recibe:
  1. Este es el contenido de el
  2. Archivo 1pero el Archivo 1
  3. tambien tiene otra linea que
  4. esta
  5. (B
  6. , Aqui comienza el Archivo2)
  7. Esta es la linea
  8. del Archivo 2
Como podran observar no es posible contar con TCP para manejar conceptos de 'formas de datos', solo podemos contar con TCP para conceptos de 'transmision de datos'. En un protocolo de Red basado en mensajes se Garantiza que los Datos lleguen en el mismo Orden en la Forma original(esto se conoce como 'Mensaje'): Ejemplo: El Punto de Red 'A' envia 2 mensajes:
  1. {23,34,11,73}
  2. {34,67,83,96}
El punto de Red 'B' recibe 2 mensajes:
  1. {23,34,11,73}
  2. {34,67,83,96}
Nota: las llaves indican agrupacion de bytes, es decir, un mensaje completo. Con un protocolo basado en Mensajes se puede tener la seguridad de que los mensajes enviados llegaran de la misma forma con la que fueron enviados. Hay una implementacion de Ordenamiento y Forma de Mensajes de Red llamado SCTP pero es implementado por el Sistema Operativo, no por la aplicacion. Porque no usar SCTP? SCTP es soportado en pocas plataforma(Windows no es una de ellas) sobre IPv6 y mi Protocolo de Mensajeria LAN tiene que funcionar en IPv4 sobre Linux y Windows, ademas debo reutilizarlo para HTTP el cual trabaja sobre IPv4 y IPv6. No tengo mas opciones que desarrollar uno, publicare el codigo fuente pronto en Google Code. En una nueva entrega explicare como funciona HTTP y como estoy desarrollando el separador de mensajes en C# y Mono. Saludos.