Jun
16

Como hemos comenzado a hacer en el artículo anterior, vamos a continuar comentando los ficheros que lo componen uno a uno, en este artículo vamos a comentar el fichero trace.h, éste es un archivo de cabecera que define una serie de macros muy simples que nos permitirán, en tiempo de compilación determinar cuál será el comportamiento de log en cada momento.

En este caso la macro definida tiene tres posibles comportamientos:

  • No hacer nada.
  • Imprimir por la salida estándar el mensaje especificado.
  • Imprimir en el mensaje en cuestión en el log del sistema para poder tener constancia de qué está pasando en cada momento en el chat

Código – trace.h:


#ifndef __TRACE_H
 #define __TRACE_H

Éste es un archivo de cabecera, por lo que sólo nos interesa incluirlo una vez en nuestro proyecto, para ello comprobamos si una constante ha sido previamente definida, en este caso esa constante se llama __TRACE_H, si esta está definida previamente, no hacemos nada, mientras que si no lo está, procedemos a definirla e incluir los datos de la cabecera.


#ifndef DEBUG
 #define DEBUG 0
 #endif // DEBUG defined

Dado que para determinar el comportamiento de nuestra macro hemos de tener definida la constante DEBUG, comprobamos si está definida, y si no, le damos un valor cualquiera en este caso, un valor para que las macros se sustituyan por un “;“, es decir que tengan un comportamiento nulo.


#if DEBUG == 1
 // librería para el uso de primitivas unix
 #include <unistd.h>

 /**
 * PDEBUG(x)
 * x string
 */

 #define PDEBUG(x) 
 printf("%s", x); 
 sync();

En el caso de que la variable DEBUG valga 1, lo que haremos es imprimir por la salida estándar los mensajes de log, esto es especialmente útil para tener constancia durante el desarrollo de qué es lo que está ocurriendo en cada instante de la ejecución.

La función sync(); se encarga de limpiar los bufferes y escribir el contenido de forma definitiva el contenido en el dispositivo en cuestión. OJO al utilizar esta función, hace que también se sincronice el contenido de los discos duros, lo que puede hacer que simplemente, nos carguemos las cabeceras del mismo.


#elif DEBUG == 2
 #include <syslog.h>

 /**
 * PDEBUG(x)
 * x string
 */
 // cat /var/log/syslog
 #define PDEBUG(x) 
 syslog(LOG_DEBUG, "%s", x);

En el caso de que DEBUG tenga un valor igual a 2,  vamos a imprimir el contenido de la macro en el log del sistema con la función syslog();

 #else
 #define PDEBUG(x) ;
 #endif    // DEBUG == 1
#endif    // __TRACE_H

Y por último definimos el comportamiento por defecto de la macro, que es vaciarlo todo.

Recuerda que si quieres echarle un vistazo al código completo del chat (tanto cliente como servidor), puedes dirigirte al primer artículo de la serie de artículos que tratan el tema del chat.

Categoría C/C++, Java, Linux, Producción propia, Programación | Sé el primero en comentar!
Jun
15

Continuando con la serie de artículos con los que vamos a explicar como hacer un chat muy simple, vamos a comenzar, con este artículo como el primero a comentar el contenido de cada uno de los archivos que hemos visto en el artículo anterior (Construye tu propio chat – Estructura).

En este artículo vamos a comentar el contenido de los ficheros de especificación y compilación del programa:

README:

Archivo en el que se especifica el funcionamiento del chat a grandes rasgos y comentando todas las funcionalidades del mismo.

El objetivo de este programa consite en el desarrollo de un chat mediante el uso de sockets
de internet TCP, por lo que en este caso seremos capaces de comunicarnos mediante
una conexión fiable entre el cliente y el servidor, siendo en este caso el cliente
un cliente múltiple que deberá recibir la información correspondiente a los mensajes
que han enviado el resto de clientes.

MANUAL DE USO Continue reading “Crea tu propio chat – Especificación” »

Categoría C/C++, Java, Linux, Producción propia, Programación | Sé el primero en comentar!
Jun
14

Continuado con el posta anterior (¿Cómo funciona un chat? – Introducción) en el que comentábamos de una manera generalista cómo debería funcionar un chat que cumpliese una serie de mínimos, vamos a empezar a desarrollar nuestro entorno para programar:

Estableciendo un entorno de desarrollo

Para que el chat funcione correctamente y que podamos reutilizar tanto código como sea posile, vamos a definir la estructura de nuestro programa.

Vale la pena mencionar que si bien es una estructura en la que en un inicio puede parecer que nos sobran muchas cosas, más adelante agradeceremos enormemente haberla utilizado, tanto si hacemos público el código fuente de la aplicación como si no.

Archivos:

ARCHITECTURE: fichero en el que vamos a definir la arquitectura de nuestro chat, es decir, de qué capas consta, qué comunicación hay entre ellas,…

INSTALL: es un fichero en el que indicaremos qué pasos hay que seguir para instalar nuestra aplicación de la forma más genérica posible en una serie de máquinas, además especificaremos también las dependencias necesarias para realizar la instalación.

README: el famoso archivo que no se lee nadie, aunque parezca mentira, resulta ser de más utilidad de la que en un principio podría parecer, esto es así porque es un fichero en el que se detallan todas las funcionalidades de una aplicación o proceso (en caso de no tener un archivo man a mano), además, en este fichero podemos indicar como hemos de proceder ante determinadas situaciones.

Archivos fuente: aunque en este ejemplo no vamos a crear una estructura jerarquizada, para proyectos medianamente grandes, en cualquier lenguaje, conviene crear una jerarquía mediante el uso de carpetas, separando los ficheros por funcionalidades.

Makefile: éste es un archivo que nos permitirá compilar y ejecutar todo lo que nos sea necesario simplemente ejecutando en consola el comando “make”.

A continuación, os pongo una captura de la carpeta con los archivos que vamos a tratar a lo largo de este tutorial si es que se le puede llamar así:

  • La Carpeta chat, es la que tiene los ficheros correspondientes con la interfaz gráfica de la que ya hablamos en el artículo anterior.
  • Los archivos ARCHITECTURE, README, INSTALL y Makefile, ya los hemos comentado anteriormente en este mismo artículo.
  • El archivo Cert.pem  es un certificado, el certificado que utilizaremos para identificar a los miembros que intervienen en la comunicación.
  • chat.db es una base de datos con el log de los eventos que suceden en el servidor.
  • chat.jar es el ejecutable de la interfaz gráfica.
  • cli5.c es el fichero principal para el manejo del clinete.
  • createDB.c es el fichero principal y que se encarga de la creación de una base de datos compatible con el programa por primera vez.
  • database.c es un fichero que contiene los métodos para tratar con la base de datos.
  • flags.h es un fichero de cabecera que contiene los flags para la comunicación entre cliente y servidor.
  • serv5.c es el fichero principal para el manejo del servidor.
  • interfaz.c es el fichero principal para el manejo de la interfaz.
  • servFunctions.c y *.h son los ficheros con las funciones genéricas del servidor.
  • sms.h y socket.h son unos ficheros de cabecera que contienen las estructuras necesarias para la comunicación.
  • tools.c y .h, y type.c y .h contienen una serie de funciones genéricas.
  • trace.h contiene una serie de macros un tanto precarias para hacer un seguimiento de qué es lo que ocurre en el chat.
http://www.dipler.org/2010/06/%C2%BFcomo-funciona-un-chat/

Recuerda que si quieres echarle un vistazo al código completo del chat (tanto cliente como servidor), puedes dirigirte al primer artículo de la serie de artículos que tratan el tema del chat.

Categoría C/C++, Java, Linux, Producción propia, Programación | Sé el primero en comentar!
Jun
13

Hoy en día, pocos son los que no conocen o hacen uso asiduo de los chats instantáneos, estén o no basados en estándares abiertos, pero ¿Cómo funciona un chat de este estilo?, ¿Es fácil hacer uno?. En este artículo vamos a intentar responder a estas preguntas así como dotarla de ejemplos para que al final seamos capaces de crear nuestro propio chat con SSL.

¿Cómo funciona un chat?

La respuesta es muy sencilla, al menos si no profundizamos en el tema, y es que, un chat es algo tan sencillo como dos procesos que intercambian datos entre sí. Comúnmente, estos procesos están situados en diferentes lugares, por ejemplo tenemos un proceso en el cliente, que es o debe ser una mera interfaz que se encargue de enviarle datos al otro proceso (servidor) y dejarle que este haga lo que tenga que hacer con ellos.

¿Porqué hablamos de SSL en un chat?

Muchos chats de los que utilizamos hoy en día, envían datos  por la red sin cifrar, lo que permite que un usuario malintencionado y que se sitúe entre el cliente y el servidor, sea capaz de, sin mucho problema, recoger los paquetes que pasen por ese puntos y leer su contenido.

¿Qué hay que tener en cuenta a la hora de implementar un chat?

Como ya hemos mencionado con anterioridad, vamos a trabajar con un mínimo de dos procesos, un proceso cliente y un proceso servidor, el primero de ellos viene a ser lo que un navegador a una aplicación web, ha de ser capaz de, en la medida de lo posible, dedicarse exclusivamente a mostrar los datos recibidos desde el mismo, mientras que el proceso servidor, es el que, en un principio habría de dedicarse a recibir peticiones, procesarlas y devolver una respuesta con el resultado si es que ha de hacer esto, en nuestro caso, el servidor, al recibir una petición ( un mensaje en este caso ), la analiza, detecta a quién va dirigida y se la envía a los destinatarios, los cuales estarán corriendo otros procesos cliente. Continue reading “¿Cómo funciona un chat? – Introducción” »

Categoría C/C++, Java, Linux, Producción propia, Programación | 18 Comentarios »
Feb
4

A día de hoy PHP es uno de los lenguajes web más utilizados y que cuenta con una comunidad más grande de desarrolladores, esto es así por varias razones, entre las que se encuentran:

  • OpenSource.
  • Fácil de aprender.
  • Se pueden cumplir (desarrollar) la mayor parte de los caprichos que tenga el desarrollador/cliente para una página web.

Pero, como no es oro todo lo que reluce, PHP es un lenguaje muy poco eficiente si lo comparamos con sus competidores, y esto es así, porque es un lenguaje interpretado, es decir, cada vez que se solicita una página web el servidor tiene que coger el archivo, interpretarlo y después ejecutarlo, lo que hace que la rapidez del script creado merme considerablemente, y esta es la razón de ser de HipHop.

HipHop es un compilador de PHP cuya tarea es realizar la conversión de PHP a C++, un lenguaje mucho más eficiente que el primero, ya que este es compilado.

HipHop ha sido desarrollado por Facebook durante los dos últimos años, y esto es así por una sencilla razón, Facebook es una de las páginas más grandes y con más tráfico que existen en la actualidad y que han sido desarrolladas en PHP (no en su totalidad pero sí la parte web, para más información puedes leer ¿Cómo funciona facebook? ), lo cual les está obligando a invertir grandes cantidades de dinero en servidores que podrían haberse ahorrado, de hecho, según los datos que proporcionan en la página del proyecto en, aproximadamente un 50%, lo cual, siendo claros es una auténtica barbaridad hablando en términos económicos para la empresa.

A mi modo de ver, este es un gran avance para PHP que tenía que ocurrir tarde o temprano, dado que si hasta el momento PHP era el lenguaje idóneo para crear proyectos pequeños e incluso medianos, con este compilador (una vez que funcione perfectamente), podrá ser utilizado, sin grandes problemas para realizar grandes proyectos, eso sí, teniendo siempre en cuenta que ha de haber alguna manera de interactuar con C++ desde PHP sin tener que utilizar aplicaciones como Thrift, así que tiempo al tiempo, habrá que ir viendo como va evolucionando el proyecto.

Por último os dejo un esquema con su funcionamiento:

Fuente: Facebook Developers

Tags:
Categoría PHP, Programación, Programas | 2 Comentarios »
Jan
14

Can’t speak spanish? you can also read this article in english, click here.

Count Project Lines 1.0 es, tal y como su propio nombre indica un cotador de lineas de proyectos de programación principalmente, aunque es capaz de contar correctamente las lineas de cualquier fichero que contenga texto plano, como por ejemplo un *.txt, *.sql,…

El programa está desarrollado en Java, por lo que es posible su ejecución en cualquier equipo que soporte dicho lenguaje.

El manejo del programa es muy sencillo, nada más abrirlo, observaremos una imagen como la que encabeza este artículo, en la cual tenemos:

  • Un selector de ruta, en el que deberemos seleccionar la ruta de la carpeta del proyecto o bien del archivo cuyas lineas deseemos contar.
  • Un juego de cuatro pestañas en las que hay un listado de todo aquello que deseamos omitir en el resultado del conteo, de manera que hay un elemento por cada linea:
    • Files to skip: en este área de texto, habremos de escribir los archivos que deseamos excluir del conteo, por ejemplo el archivo Thumbs.db que genera Windows de manera automáticamente y que no nos interesa contar.
    • Folders to skip: contiene, al igual que la pestaña anterior un listado de todas las carpetas que deseemos obviar en el análisis, especialmente útil si solemos utilizar librerías externas que no hemos programado nosotros por ejemplo.
    • Extensions to skip: listado con las extensiones de archivos que deseamos no examinar, por ejemplo las de las imágenes, videos,…
    • Patterns to Skip: Esta pestaña es especialmente útil, ya que nos permite determinar que archivos y/o carpetas deseamos saltarnos a la hora de realizar el análisis mediante la coincidencia de su nombre con una expresión regular estándar (por ejemplo los archivos ocultos que empiezan por “.” en Unix).
  • Un botón con el que seremos capaces de ejecutar el proceso que cuenta las lineas de nuestro proyecto.
  • Una consola con un log, en la que se muestra la acción que se está llevando a cabo así como un árbol con los archivos y carpetas escaneadas con el número de lineas que poseen a su derecha, para, por último mostrar las estadísticas que más nos interesan, el número de lineas, dicheros y carpetas escaneadas con las que cuenta nuestro proyecto.

Continue reading “Count Project Lines 1.0” »

Tags:
Categoría Open Source, Producción propia, Programación | Sé el primero en comentar!
Nov
20

En la página web de TIOBE podemos ver de manera regular unas estadísticas de los lenguajes de programación más utilizados en cada momento, os dejo unas capturas de Noviembre del 2009:

TIOBE-2009

tpci_trendsPara ver estas y más estadísticas puedes dirigirte a la página de TIOBE.

Categoría Programación | Sé el primero en comentar!
Oct
26

trac_logoEs curioso como algo tan sencillo como es añadir la autenticación de usuarios en un sistema Trac puede costar tanto y a la vez haber tan poca información en Internet sobre este tema que realmente resuelvan el “problema” que no hace más que lanzar mensajes como:

Internal Error: Authentication information not available. Please refer to the installation documentation.

Os pongo en situación, conforme instalas Trac, te encuentras con que el módulo de autenticación no está habilitado, lo que te impedirá acceder al menú de administrador entre otras tantas cosas, no sé si este problema se ha visto acentuado por que mi sistema Trac se encuentra instalado en un servidor compartido de Dreamhost haciendo uso del sistema One-click o si simplemente es tan complicado o de hacer siempre.

Antes de nada vamos a ver los requisitos necesarios:

  • Necesitamos tener instalado Trac en nuestro servidor.
  • Necesitamos acceso shell a nuestro servidor.

Suponiendo que tenemos todo esto, procedamos con la configuración e instalación de AccountManager plugin:

  • nos logueamos en la shell de nuestro servidor (sustituir SERVIDOR por el nombre del servidor de nuestra cuenta y USUARIO por el nombre de usuario):

ssh SERVIDOR -l USUARIO

  • Ahora os pedirá la contraseña, la tecleáis y presionáis intro.
  • Una vez logueados ejecutamos:

svn checkout http://trac-hacks.org/svn/accountmanagerplugin/0.11
cd 0.11
python setup.py bdist_egg
ls dist

  • Tras ejecutar estos comandos debería aparecer por pantalla algo parecido a:

TracAccountManager-0.2.1dev_r5836-py2.4.egg

  • Una vez que tenemos este dato, podemos ejecutar el siguiente comando (sustituimos TRAC por el dato que hemos obtenido anteriormente => TracAccountManager-0.2.1dev_r5836-py2.4.egg, y PATH lo sustituimos con el nombre de la carpeta o carpetas en las que se encuentre instalado nuestro Trac, en mi caso es trac.keopens.org):

cp dist/TRAC ~/PATH/plugins/TRAC

  • ahora nos dirigimos a:

cd ~/PATH/conf

  • Le decimos al Trac qué archivos queremos utilizar para loguearnos, para lo que añadimos el el archivo trac.ini que se encuentra en /conf (sustituimos USERNAME por el usuario con el que nos hemos logueado, y SVN con el nombre del repositiorio con el que se enlaza TRAC):

[account-manager]
password_file = /home/USERNAME/svn/SVN.passwd
password_store = HtPasswdStore

  • Añadimos nuestro usuario al grupo de administradores (sustituye USER por el usuario con el que te logueas en SVN)

trac-admin .. permission add USER TRAC_ADMIN

  • Por último habilitamos los componentes que nos permitan loguearnos, registrar nuevos usuarios,… (editamos de nuevo trac.ini)

[components]
trac.web.auth.LoginModule = disabled
acct_mgr.admin.* = enabled
acct_mgr.api.* = enabled
acct_mgr.db.* = enabled
acct_mgr.htfile.* = enabled
acct_mgr.http.* = enabled
acct_mgr.notification.* = enabled
acct_mgr.pwhash.* = enabled
acct_mgr.svnserve.* = enabled
acct_mgr.web_ui.* = enabled

Tags:
Categoría Open Source, Programación, Web | 1 Comentario »
Oct
1

phpLa optimización de código es algo que ha preocupado a los programadores desde hace mucho tiempo, aunque por suerte o por desgracia, esta preocupación está decrementando día a día dado que los ordenadores con cada vez más potentes y por lo tanto importa menos el malgaste de ciclos de CPU.

Esta preocupación por el tiempo de ejecución de un programa viene dado sobre todo por el desarrollo de proyectos grandes (muchas visitas simultáneas) en los que sea crucial la velocidad de ejecución del algoritmo, por otro lado para aquellos proyectos que dada su escalabilidad pudiesen aumentar su complejidad de una forma un tanto brusca, es importante que el núcleo sea tan eficiente como sea posible además de, obviamente, tener el mínimo número de errores como sea posible, y por último puede que se dé el caso que en el caso de que tengas un servidor compartido, tu hosting te haya dado un toque porque haces uso de demasiados ciclos de CPU a la vez que te instan a migrarte a un plan de hosting más avanzado y que por consiguiente posea más recursos para tu script.

En este artículo vamos a intentar dar algunos consejos que permitan mejorar el rendimiento de nuestras aplicaciones web escritas en PHP con relativamente poco esfuerzo.

1.- Versión de PHP

Si estás utilizando una versión antigua de PHP será conveniente que hicieses una actualización de la misma en tu servidor, esto es así porque con cada versión, el equipo desarrollador de PHP ha ido implementando nuevas funciones así como optimizando partes de código, llegando a, reducir notablemente el tiempo de ejecución y la memoria consumida por determinados scrips y funciones de las que vienen por defecto.

A día de hoy, las últimas versiones estables de PHP son la 5.3.0 y la 5.2.11, eso sí, en ningún caso recomiendo instalar en un servidor en producción una versión que no sea estable.

2.- Utilizar algún sistema de Cacheado

En lenguajes interpretados, como es PHP, cada vez que se desea ejecutar un script, éste ha de ser interpretado, lo que hace que el consumo de CPU se incremente más que si se tratase de un lenguaje compilado, además de que ha de ejecutar todas las operaciones y funciones cada vez que se ejecute, lo que hace que si éstas son complejas, el script se ralentice considerablemente; un ejemplo de estas funciones son las llamadas a la base de datos.

A pesar de que no es recomendable cachear todas las páginas en algunos proyectos, en ocasiones es bastante recomendable utilizar aplicaciones como Memcache para así evitar que se ejecute el script siempre que se hace una petición de una página.

Otra opción es hacer uso de sistemas de templates, como es Smarty, que hace un cacheado de la página pero ejecutando siempre las consultas a la base de datos.

3.- Optimizar el código

3.1.- Strings

En PHP las cadenas de caracteres (Strings) pueden, al contrario que en lenguajes como C o Java, ir rodeados, tanto de comillas dobles () como de comillas simples (), pero a pesar de que el resultado pueda llegar a ser el mismo, el comportamiento de una cadena delimitada por uno u otro de estos caracteres se comporta de manera diferente. Continue reading “20+ Consejos para optimizar tus programas PHP” »

Tags:
Categoría Manuales, Open Source, PHP, Programación | 3 Comentarios »
Sep
24

Leo en Making Good Software (una web que por cierto acabo de descubrir) una serie de frases de programador, algunas de las cuales son bastante llamativas y otras, simplemente ciertas, pero la que más me ha llamado la atención es la que se corresponde con el punto número 7, traduzco:

No es un bug, es una nueva característica:

- Tío el sistema se reinicia dos veces al día!!!…

- Es una medida que se ha tomado para asegurarse de que los archivos temporales son borrados correctamente…

bug_vs_feature

Fuente Original

Categoría Curiosidades, Programación, Programas | Sé el primero en comentar!