domingo, 27 de septiembre de 2015

En esta entrada hablaremos sobre como manejar websockets desde php utilizando PHPSocketMaster, una librería que permite manejar tanto sockets como websockets. También explicaremos un poco como utilizar sockets comunes.


Los sockets son mecanismos de conexión y comunicación entre dos pc, todos los lenguajes de programación que conozco tienen algún tipo de soporte para manejar sockets. Los sockets trabajan con la metodología Cliente-Servidor, es decir uno de los sockets se conecta a otro (el cliente) y el otro socket recibe la conexión (El que sirve o servidor), generalmente el segundo tiene la facultad de aceptar más de una conexión, trabaja aceptando la conexión entrante y derivandola a un segundo socket que mantenga la conexion, reciba los mensajes, y responda, liberando el primero para aceptar nuevas conexiones y deribarlas a otros.

PHPSocketMaster es una librería de autoría propia que permite trabajar con sockets en php, tanto websockets como comunes, es decir mi librería permite conectarse a un programa hecho en otro lenguaje, o aceptar conexiones de otros programas o desde un websocket.

¿Cual es la diferencia entre un socket común y un websocket?, los websockets en realidad son sockets comunes que incluyen un protocolo de encriptación y handshake (es decir que todos los mensajes van encriptados y recorren un protocolo particular llamado websocket).

Aquí está el repositorio de la librería con la última versión estable.

La documentación, es muy extensa y explica bien como utilizar cada parte. (50% ingles, español completo).

Un socket puede estar en dos modos, como cliente para conectarse a otra pc, o como servidor a la escucha de conexiones de otra pc (es decir esperando que otra pc se conecte).

Si nosotros queremos crear un cliente es muy sencillo, incluimos la librería, y extendemos el PHPSocketMaster, aquí esta la documentacion y además hay ejemplos en la carpeta examples.

En terminos generales lo que hacemos es extender la clase principal creando una clase nueva que va a ser nuestro sockets, al estar orientado a eventos, nosotros tenemos que escribir las funciones de eventos en nuestra clase, y poner lo que hará nuestro codigo cuando ocurra cada uno de los eventos.
La lista de eventos se puede ver aquí. Dentro de nuestra clase escribimos lo que hará nuestro cliente al conectarse a algo.

Generalmente podemos conectarlo a servidores de distintas cosas, siempre que tengamos el protocolo correspondiente podemos conectarlo a un chat irc, o hacer una petición HTTP, incluso podemos conectarlo a los servidores de whatsapp (si conseguimos su protocolo).
Lamentablemente, PHPSocketMaster no soporta crear un cliente websocket (es decir no podemos hacernos pasar por un cliente web).

Luego si nosotros queremos crear un servidor es muy simple, hay que extender dos clases, la primera es la del socket que recibe las conexiones, como expliqué antes, este recibirá las conexiones entrantes y las derivará a socokets secundarios. Luego debemos extender la clase de los sockets que recibirán cada conexion, donde pondremos que pasará con cada uno de ellos.
Aquí está la documentación, y también hay ejemplos en la carpeta examples.

Para finalizar si quiciesemos crear un servidor que hacepte websockets, es mucho más sencillo, al servidor normal solo hay que agregarle una constante, y listo.
Aquí está la documentación.

Para simplificar las cosas cuando se trata de servidores, se me ocurrió crear una clase que se encarge de gestionar y controlar los sockets, porque el mayor problema en los servidores es poder organizar y controlar todos los sockets. Puedes ver el repositorio de esta librería aquí, también tiene ejemplos y requiere que se incluya PHPSocketMaster.

Si quieres saber qué se podría hacer con websockets para tener una idea, se puede crear un cliente de pocker multijugador en tiempo real, como éste, o crear un servidor de chat como aremos en esta serie de entradas, incluso podemos crear un servidor web como apache en php tranquilamente, o un servidor de XMPP, o cualquier otra cosa que utilice sockets, que a fin de cuentas es casi todo.

Saludos para todos! espero les haya gustado y estén atentos a nuevas entradas donde publicaremos como utilizar los sockets desde javascript para conectarnos a un server en php, y luego desarrollaremos un proyecto ejemplo donde crearemos un servidor de chat.

domingo, 20 de septiembre de 2015

Buenos dias lectores del blog del programador, como dije en una entrada previa estoy volviendo a escribir, y el día de hoy voy a comenzar con una serie de entradas que tratan sobr egit, a modo "capacitación" luego de haber presentado todas las entradas voy a publicar los papers correspondientes.

Git es un sistema de control de código para ordenar las distintas versiones de un código en su desarrollo, fué diseñado para desarrollar Linux, y está enfocado al desarrollo organizado por parte de múltiples programadores.

En la introducción de git estaremos explicando cómo manejar un repositorio de forma unipersonal, luego en el paper de profundización de git, estaremos explicando las mecánicas de trabajo por parte de múltiples programadores.

Necesidades de un control de versiones

La pregunta que muchos se podrían hacer, y que van a descubrir su respuesta cuando comienzen a trabajar con git, es ¿por qué necesitamos un sistema de control de versiones?, el desarrollo de software como se dijo en varias ocaciones es una actividad intelectual en la que interactúan distintos componentes y faces, uno tiene una idea, la diseña, la programa, y luego la refina sucesivamente mejorando el código hasta crear una versión estable RC (Release Candidate), en cada fase podríamos pensar que el código está en una versión específica y a medida que avanza, también avanza sus versiones. Hay distintas formas de versionar los códigos, en general se usa el versionado separado por puntos (4.3.2) en general [Major].[Minor].[Micro] los numeros aumentan dependiendo de cuan grande sea los cambios desde la versión anterior hasta la actual. Generalmente para pequeños fixes y reparaciones se aumenta un digito de Micro, cuando son cambios relativamente grandes, cambios de funcionalidad, novedades, y atraviesan varias partes del código, se aumenta un digito al Minor, luego si hablamos de grandes cambios, (incluso cambios de estructura general), podemos aumentar un valor al Major, para organizar todas las versiones del código, es decir para poder controlar los cambios en qué archivos, en que version, y no mezclar todo existen los sistemas de control de versiones, tales como Git, Mercurial, etc.
Un sistema de control de versiones nos ayudará a tener el código ordenado y saber exactamente qué cambios hicimos, cuando los hicimos, como los hicimos y a qué archivos o partes del código afectaron.
Git particulamente es bastante interesantes, un proyecto libre, que tiene interesantes ventajas (que explicaremos más adelante, mientras tanto pueden buscarlas), asique es el que elegiremos para llevar a cabo esta capacitación.
Por otra parte Github es una página que provee de repositorios gratuitos donde subir tus códigos utilizando Git, sin embargo hay otras páginas como bitbucket que son pagas pero que te permiten tener repositorios privados para proyectos no opensource.

Recomendamos revisar GIT en wikipedia.

Un saludo para todos los lectores y espero sigan visitando el blog a la espera de nuevas entradas respecto a git, websocket, criterios de calidad, sistemas operativos, diseño, paradigmas, entre otros.

jueves, 17 de septiembre de 2015


Hace ya tiempo que no creaba una entrada, pero decidí volver a darle un poquito de énfasis a mi blog, y de paso explicar un poco de las tecnologías que estoy utilizando hoy en día.

En esta entrada haremos una breve introducción a websockets, para luego crear una serie de entradas a modo "manual" del usuario de websockets.

Internet con el paso del tiempo fué avanzando en lo que es tecnología y fué implementando nuevas herramientas, una de las cosas que se enseñan de entrada cuando uno aprende a desarrollar web, es que el protocolo por el que se rigen los servidores web es HTTP y es un protocolo sin estado, ¿Qué quiere decir?, en términos simples podemos creer que nos está diciendo que http no se mantiene en el tiempo y no tiene un estado que varía en el mismo, HTTP es un protocolo simple donde con una cabecera se exige un recurso, el servidor procesa el recurso y lo entrega dando por finalizada la conexión, es decir, no se mantiene nada en ejecución ni nada por el estilo.

domingo, 8 de marzo de 2015

En la entrada de hoy les traeré un pequeño paper sobre las limitaciones de un bot conversacional que aplique únicamente AIML, para poder solucionarlas traigo un par de propuestas de ideas personales a las que les llamé PML.


AIML permite el almacenamiento de información adquirida por el bot, para su posterior uso, no obstante no especifica algunas especificaciones tales como, la forma en la que adquirir el conocimiento, y como formar algunas estructuras de ese conocimiento.

jueves, 5 de febrero de 2015

En la entrada de hoy hablaremos sobre aiml, un pequeño modelo para almacenar conocimientos de inteligencia artificial en nuetros bots.



Aiml permite el almacenamiento de conocimientos en grupos de topics, para ubicarlos mediante patrones.
En éste documento hablaremos sobre el formato de un documento aiml (basados en xml) y todas sus características.

Descarga Aquí

Saludos!

miércoles, 4 de febrero de 2015

En la entrada de hoy hablaremos sobre el patrón creacional de diseño Prototype, en entradas anteriores podemos apreciar diferentes patrones, como Factory, ObjectPool, etc. puedes ver por supuesto la entrada introductoria al tema aquí, y puedes ver el listado de teoría donde hay una sección de patrones aquí.

El patrón prototype tiene como idea fundamental, la de crear objetos basandose en clonar objetos previamente creados, debe incluir en su abstracción la funcion clonadora, para que luego en cada caso particular se establezca las especificaciones de la clonación (esto es la funcion __clone).

Este patrón es de utilidad cuando se quiere separar la lógica de la creación de objetos de su futura implementación creando así una instancia inicial pasando por todo el proceso de la creación, para luego simplemente copiar esa instancia y manejarla sin pensar en como fué construida y no tener que pasar por dicho proceso de nuevo.

La instancia prototipo solo debe ser utilizada para ser clonada, y no debe ser utilizada con otro propósito, por evidentes razones.

dejo aquí un ejemplo de código de prototype en php:


un saludo para todos los lectores!

martes, 3 de febrero de 2015

Buenas tardes lectores, en esta entrada hablaremos sobre el patrón singleton, quizá sea uno de los patrones más conocidos al menos en lo que se refiere a php, en entradas anteriores hablamos sobre ObjectPool, sobre Factory, y hasta sobre Prototype, también pueden ver aquí la entrada inicial al tema. En particular también hay una entrada que referencia a Singleton pero como una queja al mal uso que le da la mayoría de la gente al menos en php.

La utilidad de singleton comienza cuando nosotros requerimos de una clase una única instancia y nada más que una, y que la creación de multiples instancias de una clase pueda traernos problemas ya que no fué diseñada para eso.

De modo que el patrón establece una forma de obtener una sola instancia de la clase en todo momento, y si se trata de obtener una nueva, Singleton devolverá la instancia que ya tenía.

Para tales efectos se construye un metodo constructor del objeto, éste tiene que ser estático, y también se crea una propiedad estática que almacenará la instancia para devolverla en futuras ocaciones, el constructor si se puede, debe ser transformado en privado (dependiendo del lenguaje), ya que no se debe permitir a la persona construir el objeto directamente, luego en el metodo estático de construcción del objeto creamos una instancia de la clase si es que no hay una guardada en la propiedad destinada para tal trabajo, y si la hay simplemente devolvemos la que ya teníamos almacenada.

Quien quiera obtener una instancia de esa clase debe llamar al constructor estático de singleton para que asegure que tendremos siempre la misma instancia.

Un ejemplo de singleton en php:


Ahora que vamos cerrando las entradas relacionadas con patrones creacionales, siempre hay que tener en cuenta si el patrón que aplicamos corresponde con la situación dada, ya que estos patrones si se los usa en cualquier situacion sin importar si aplican al problema o es un problema que no tiene relación, estaremos en algunos casos derrochando recursos, y en otros estaremos limitando la usabilidad de las clases. Siempre que apliques un patrón debes tener una razón.

Un saludo lectores y espero que les haya gustado esta entrada.

sábado, 17 de enero de 2015

Buenas tardes ex-lectores de std-io.com y futuros lectores de programador.in, estamos aquí leyendo (en mi caso escribiendo) para presenciar la unión entre el blog de teoría de programación con un blog para programadores iniciados, medios y expertos.