Jun
29

En los últimos artículos sobre las Macros en C/C++ hemos explicado de una forma un tanto rápida todo el potencial que presenta esta herramienta si sabemos utilizarla con un nivel medio-alto en determinadas situaciones.

Uno de los problemas que se nos presentan en ocasiones a la hora de trabajar en un lenguaje como C es que, a pesar de que contamos con depuradores de código, no siempre tenemos uno a mano, por lo que si a la vez que documentamos podemos mostrar a nuestro capricho y en función de la situación un log de lo que está sucediendo durante su ejecución, podremos hacernos una idea bastante aproximada de si todo va bien o no.

Tras esta pequeña reflexión me lanzo a compartir con vosotros un pequeño fichero .h que nos facilitará enormemente la tarea en una 20 líneas y que he utilizado ya en el desarrollo de varios programas:


#include <stdio.h>
//#define DEBUG 0
#define DEBUG 1
#ifndef __LOG_H
#define __LOG_H
 #if DEBUG == 1
 #define log(format, args...) 
		fprintf (stderr, "%s - %i: ", __FILE__, __LINE__);
		fprintf (stderr, format "n", ##args);
 #define warning(format, args...) 
			log("/!\ "format" /!\", ##args)
#define error(format, args...) 
		log("(X) "format" (X)", ##args)
 #else
#define log(format, args...) ;
#define warning(format, args...) ;
#define error(format, args...) ;
 #endif
#endif

Este fichero tendremos que incluirlo en nuestro programa escrito en C mediante una directiva #include:

#include "log.h"

en este caso he llamado al fichero que contiene esas 20 líneas de código.

De manera que si tenemos declarado DEBUG con un valor de 0 no se mostrará salida alguna y no sólo eso, sino que las líneas desaparecerán (es un claro ejemplo de uso de macros, ya que en nuestro programa en producción puede que deseemos tener más velocidad de procesado y no nos interese interactuar con salidas ni llamar a funciones que no hagan nada), mientras que si tiene un valor de 1, escupirá toda la información que deseemos por, en este caso, la salida de error de nuestro programa.

Si ejecutamos el siguiente programa en C:


#include "log.h"
int main(int argc, char** argv){

log("asdf%i", 1)

log("asdf")

warning("esto es una alerta")

warning("esto es una alerta%i", 1)

error("esto es un error")

error("esto es un error%i", 1)

}

obtendremos la siguiente salida:

bottle.c – 4: asdf1

bottle.c – 5: asdf

bottle.c – 6: /! esto es una alerta /!

bottle.c – 7: /! esto es una alerta1 /!

bottle.c – 8: (X) esto es un error (X)

bottle.c – 9: (X) esto es un error1 (X)

La ausencia de puntos y coma después de llamar las macros no es un error, es que simplemente no hacen falta.

Finalmente y a modo aclaratorio, las constantes utilizadas en el fichero log.h __FILE__ y __LINE__ son dos directivas de preprocesador que nos indican en qué lína y fichero de código tenemos la llamada a ese log.

Categoría C/C++, Producción propia, Programación | 1 Comentario »
May
30

http://diary.dipler.org

Seguimos con el desarrollo de la modesta aplicación que nos permite llevar un diario mientras nos facilita la vida para llevar un listado de tareas e ideas de forma completamente privada, y es que después de un tiempo sin actualizaciones oficiales, me complace presentar Diary 2.3, esta versión viene con las siguientes novedades que, espero les parezcan interesantes:

  • Corrección de errores puntuales en la edición de entradas categorizadas con un flag distinto al de Diario.
  • Corregido el error al pulsar el botón more después de haber realizado una búsqueda.
  • Corregido el error al codificar los signos +.
  • Mejora de los estilos para mejorar su compatibilidad con Firefox 4 e Internet Explorer 9.
  • Añadida la función de crecimiento automático del area de texto en función del contenido para mensajes nuevos.
  • Añadida la función de crecimiento automático del area de texto en función del contenido para el modo de edición de mensajes.
  • Añadidos hastags al estilo de los tags de Twitter, en los que al pulsar en ellos se realiza automáticamente una búsqueda con dchos tags.
  • Por defecto cuando llegamos a la parte final de la lista de elementos cargados, s

http://diary.dipler.org

Tags:
Categoría PHP, Producción propia | Sé el primero en comentar!
Mar
4

http://diary.dipler.org

Llevabamos ya un tiempo sin añadirle mejoras a la aplicación Diary, así que he creido oportuno lanzar una actualización en estas fechas. Si bien la actualización no tiene grandes mejoras abre paso a un nuevo ámbito de desarrollo. Para futuras versiones se pretende añadir notificaciones por email, planificar tareas para fechas seleccionadas y la integración de la aplicación con redes sociales como Facebook y/o Twitter.

En resúmen, las mejoras añadidas y los errores corregidos en esta versión son los siguientes:

  • Mejorado el rendimiento interno de alguna de las funciones del núcleo de la aplicación.
  • Se permite el borrado de entradas.
  • Se permite la edición de entradas (en caso de ser una tarea, esta estará marcada como no terminada por defecto.
  • Cambios leves en las estrucutras de datos que almacenan la información relativa a las entradas.
  • Añadidos efectos de transiciones en la barra de notificaciones.
  • Movida a la parte inferior la barra de notifiaciones.
  • Corregido el error al introducir en una entrada la barra inclinada “”.
  • Si una tarea está finalizada se mostrará el borde de color verde.
  • Mejorada la notificación de cargando.
  • Leve cambio en la hoja de estilos en lo relevante a enlaces,…
Tags:
Categoría PHP, Programas | Sé el primero en comentar!
Feb
10

http://diary.dipler.org

Como ya sabréis, las versiones de Diary 0.2.x están girando en torno a los diferentes tipos de entradas que podemos tener, así como en una mejora del rendimiento y de la seguridad que presenta la aplicación para permitir al usuario utilizar de una forma sencilla y práctica la aplicación sin tener que preocuparse de nada en absoluto. Dentro de las mejoras podemos diferenciar las de dos tipos:

  • De usuario (mejora la experiencia del usuario para con la aplicación)
    • Nueva interfaz de usuario
    • Nueva interfaz de búsqueda con nuevos filtros
    • Nuevo estilo de marcado de tareas pendientes y terminadas (imágenes en lugar de chekbox)
  • De servicio (mejora la calidad del servicio de forma transparente al usuario)
    • Ajax combinado con XML
    • Mayor seguridad a la hora de intentar replicar sesiones

Por el momento la aplicación está optimizada, como ya hemos dicho, para navegadores modernos, es decir, últimas versiones de Chrome y Firefox, en este último caso, y para sacarle el máximo jugo a la interfaz, será necesario el uso de Firefox 4.0

http://diary.dipler.org

Tags:
Categoría PHP, Producción propia, Programas | 1 Comentario »
Feb
3

http://diary.dipler.org

Como ya comenté en el post de introducción de Diary 0.1.2, esa versión no era nada más que un aperitivo de la que estaba desarrollando en ese momento y, dado que algunas personas me recordaron lo incómodo que era el cambio de hora en los artículos escritos hice una pre-versión estable y la subí, pero no traía grandes cambios; esta sí:

  • Las tareas pueden marcarse como terminadas o no utilizando el checkbox que hay a la izquierda del texto que hemos introducido (más tarde se añadirá búsqueda según el estado de las mismas)
  • Mejorados los logs internos de funcionamiento
  • Coloreadas las entradas de contenido en función del tipo
    • Diario: borde gris
    • Tarea: borde rojo
    • Idea: borde azul
  • Mejorado el sistema de funcionamiento de ajax, basándose ahora en el intercambio de ficheros xml sencillos, permitiendo así gestionar varias partes de la ventana con una sola petición y por ende, mejorando la experiencia de usuario
  • Añadido panel oculto en la parte superior que muestra mensajes de estado de la aplicación, estos pueden ser de tres tipos
    • OK
    • Alerta
    • Error

http://diary.dipler.org

Tags:
Categoría PHP, Producción propia, Programas | 1 Comentario »
Feb
1

http://diary.dipler.org

Me complace presentarles la versión 0.1.2 de Diary. Esta versión ya mencionada se ha adelantado un poco a lo que estaba previsto por los comentarios de algunas de las personas que utilizan la herramienta, entre sus mejoras tenemos:

  • Muestra de la hora local de Madrid por el momento en lugar de la costa oeste de Estados Unidos (fecha que se estaba mostrando hasta ahora)
  • Posibilidad de guardar y buscar entradas por tipo, en un futuro no muy lejano se pretende permitir al usuario marcar las tareas como terminadas y las ideas con estados.
    • Log: función de diario
    • Idea: nos permite almacenar fácilmente las ideas que vamos teniendo
    • Tarea: nos permite almacenar las tareas que debemos hacer en un futuro y no queramos olvidarnos

http://diary.dipler.org

Tags:
Categoría PHP, Producción propia, Programas | Sé el primero en comentar!
Jan
10

http://diary.dipler.org

Fugaz entrada para informar de la actualización de la aplicación de Diary para corregir dos errores leves:

  • Los mensajes de más de una línea se muestran bien tras ser guardados
  • Eliminado el autofocus del formulario de registro en el campo del correo electrónico.

http://diary.dipler.org

Tags:
Categoría Producción propia, Programas | Sé el primero en comentar!
Jan
8

http://diary.dipler.org

Hace ya un tiempo, un amigo me preguntó acerca del día en el que había hecho una determinada actividad y no fui capaz de responderle, no suelo fijarme en las fechas en las que hago las cosas; el problema quedaría ahí de no ser porque si te roban una cuenta de correo electrónico te preguntan sobre la fecha aproximada en la que creaste la cuenta y así en muchos otros ámbitos; también cabe la posibilidad de que hayas establecido por sistema llevar un diario o simplemente que desees empezar a llevar uno.

Si la respuesta a alguna de estas preguntas es sí, eres un perfecto candidato para utilizar Diary, una aplicación muy sencilla que llevo desarrollando ya unos meses para uso exclusivamente personal pero que, después de que un amigo me dijese que le parecía una idea interesante y que quería usarlo también, hoy he abierto al público general para que pueda ser utilizada por aquellas personas que piensen que es una aplicación interesante para ellos.

¿Qué es Diary?

Diary es una aplicación escrita íntegramente en HTML5, PHP y Javascript apoyándose en hojas de estilo CSS3 y una base de datos MySQL, por lo que para poder visualizarlo perfectamente hará falta un navegador que soporte HTML5 y CSS3 (lo cual, sinceramente, no es muy complicado, todos los navegadores modernos deberían visualzarlo sin problema alguno.

¿Porqué no es compatible con todos los navegadores de la “historia”?

Muy sencillo, nació como una aplicación personal, y por ahora sigue siéndolo, si veo que a la gente le interesa y se va registrando gente, la aplicación irá creciendo, entre otras cosas, en compatibilidad con navegadores.

¿En qué se diferencia de un blog, Facebook o Twitter?

Es una aplicación de uso privado para el usuario registrado, el usuario que escribe algo podrá verlo de varias maneras, pero nadie más tendrá ese privilegio, por así decirlo es un diario en toda regla para el usuario que lo utilice con la ventaja de que está en la nube y puede ser accedido desde cualquier navegador moderno para insertar entradas nuevas a nuestra lista.

Es una aplicación muy simple ¿alguna mejora futura?

Yo soy de los que utilizan infinidad de aplicaciones de la web para escribir y leer cosas, así que una de las ideas que podrían ser interesantes en esta aplicación es permitir publicar (mediante un botón especial dentro del diario) una entrada determinada en redes sociales como Facebook o Twitter.

Otra mejora que se me había ocurrido es no solo utilizarlo como diario de cosas hechas, sino como lista de tareas pendientes.

Manual de uso

Continue reading “Diary 0.1” »

Tags:
Categoría PHP, Producción propia, Programas, Web | Sé el primero en comentar!
Oct
12

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

Hace ya un tiempo, publiqué una clase para conectar desde PHP con MySQL, dicha clase, si bien cumplía perfectamente con su función, no era eficiente y tampoco le daba mucho juego al programador, así que cuando empecé a desarrollar Keopens, un CMS que empecé a desarrollar con el fin de que fuese un núcleo muy minimalista y adecuado a las nuevas tecnologías que están surgiendo. Por desgracia, no tengo tiempo suficiente para seguir con el desarrollo del mismo, pero algunas clases, si bien forman parte de dicho proyecto, las he sacado del mismo y continuado desarrollando ya que para los pequeños proyectos en PHP que tengo que ir haciendo son muy útiles.

Esta es una de esas clases que han ido creciendo poco a poco y según iban surgiendo necesidades se le iba incrementando las funcionalidades. En general se ha intentado seguir una POO correcta, pero con el fin de compartir la clase aislada, he decidido incluir dos funciones que no deberían estar en dicha clase, una de ellas es la de validar un e-mail y la otra es la de enviarlo.

La clase consta de dos modos de trabajo, un primer modo de debug o testing y un modo de producción, para cambiar entre ambos modos tan sólo hay que cambiarle el valor a una variable, además en el modo testing, la clase nos mostrará, al destruir el objeto o bajo demanda, el número de consultas ejecutadas y el tiempo total entre la creación de la instancia de la clase hasta que esta ha sido borrada. Si ocurre un error grave, y se dan una serie de condiciones (hemos inicializado la clase con un correo electrónico y no estamos en modo testing) se enviará por correo electrónico el fallo, esto es muy útil para tener constancia de los errores e incluso detectar en ocasiones la SQL-Injection en el caso de que se genere una sentencia que no haya podido ser ejecutada debido a errores de sintaxis.

Otras características interesantes:

  • Funciona tanto con conexiones persistentes como no persistentes.
  • Permite la creación de una copia de seguridad de la base de datos escribiendo una única línea de código (MySQL dump desde PHP).
  • Nos permite monitorizar las sentencias, controlando en qué fichero y línea del mismo se ejecuta.
  • Envío de emails cuando sucede un error grave.
  • Conteo de tiempo de ejecución.
  • Conteo de memoria utilizada por el script.
  • Conteo del número de sentencias ejecutadas.
  • Previsualización automática de los datos de salida de una sentencia (modo testing).
  • En bases de datos InnoDB permite el uso de transacciones.
  • Los mensajes extras mostrados en el modo testing tienen asociados una serie de estilos que indican visualmente si la ejecución ha sido correcta o, por el contrario, se ha producido un error.

He aquí una serie de ejemplos muy sencillos para mostrar rápidamente el potencial de la clase.

Para conectar con la base de datos, nos bastará con escribir dos líneas en nuestro programa y ya estaremos listos para trabajar:


$db = new MyMysqli($db_host, $db_uname, $db_pword, $db_name, $debugging, $contactMail, 'MYSQLI_ASSOC');
$db->connect(false);

Para ejecutar una consulta nos basta con escribir una sola directiva.

$query = 'SELECT * FROM text';
$db->execute($query, __LINE__, __FILE__);

Las constantes __FILE__ y __LINE__ nos sirven para indicar, en caso de error, el lugar en el que se encuentra dicha consulta a la base de datos.

El método ejecutado devuelve un resultSet, pero la clase mantiene una referencia al último resultSet dado que es muy probable que nos interese trabajar con él en breves, por lo que devuelve el resultSet para utilizarlo en casos muy específicos, como por ejemplo en el caso de que necesitemos trabajar con dos a la vez.

Para recorrer un resultSet de una consulta nos basta con ir llamando al método fetch(), si no se le pasa como parámetro un resultSet, ejecutará la acción sobre el obtenido en la última petición a la base de datos

if($db->numRows() > 0){
 while($result = $db->fetch()){
//TODO
 }
}

Si somos un poco “vagos” o simplemente vamos a consultar muchas veces los datos, la clase proporciona un método para pasar los datos obtenidos a una tabla.


$db->getTable();

Al igual que en el ejemplo anterior, si no se le pasa como parámetro otro resultSet, formará la tabla partiendo del último restulSet obtenido.

Por último mencionar que, en las primeras lineas de la clase, podrá observar que hay unas líneas comentadas que citan lo siguiente:


//Access control
if(!defined('IN_APP')) exit('Access Forbidden');

Estas líneas están comentadas por una sencilla razón, en PHP es posible acceder a cualquer archivo por URL si el servidor no está bien configurado, esto hace que si la página cargada imprime algo por pantalla, no se muestre, ya que la constante IN_APP no está definida con anterioridad. Por ende para que funcione, antes de incluir el archivo en la ejecución, deberíamos declarar la constante IN_APP. Obviamente el nombre de la constante puede ser cualquiera, en este caso, la que yo usaba en Keopens era IN_APP.

Descarga: [download id="3"]

Categoría PHP, Producción propia, Programación, Web | Sé el primero en comentar!
Jun
20

Con este artículo termina la serie de artículos en las que describimos los principios básicos que hay que tener en cuenta para realizar un chat y en los que también se describe como hacer una pequeña aproximación a uno de estos programas que a muchos de nosotros nos acompañan en nuestro día a día.

En el artículo de hoy vamos a tratar el único tema que nos falta, el cual es el programa cliente que nos servirá a los usuarios para comunicarnos con el servidor y así, poder comunicarnos con el resto de usuarios que se encuentren conectados en un momento dado.

Si bien el cliente se basta de un sólo ejecutable, hoy vamos a tratar dicho ejecutable y otro que nos permita, mediante la redirección de descriptores de ficheros, añadirle una interfaz gráfica sencilla.

cli.c

Nos encontramos ante uno de los ficheros con la lógica esencial del cliente del chat, vamos a analizarlo paso a paso:


#include <stdio.h>
#include <stdlib.h>
// librería para manejo de strings
#include <string.h>
// librería para el uso de los sockets y las correspondientes constantes
#include <sys/socket.h>
// librería para el uso de la constante IPPROTO_TCP, in_addr, ...
#include <netinet/in.h>
// librería que nos permite hacer uso de la variable errno
#include <errno.h>
// librería de base de datos de red
#include <netdb.h>
// librería para el uso de primitivas unix
#include <unistd.h>
// librería para obtener acceso a variables como pid
#include <sys/types.h>
// librería para el manejo de señales
#include <signal.h>
// librería para mostrar la traza del programa
#include "trace.h"
// librería para gestionar los paquetes enviados y recibidos
#include "sms.h"
// librería con las flags que utilizaremos
#include "flags.h"
// incuimos la librería de tipos de datos
#include "type.h"
// incuimos la librería de herramientas para los echo
#include "tools.h"
// incluimos las librerías que nos permitirán hacer uso de SSL
#include "ssl.h"

#define DIM 1024 // definimos el tamaño de los array de textos

#define     READ    STDIN_FILENO
#define     WRITE    STDOUT_FILENO

Incluimos los archivos de cabecera o librerías necesarias para la ejecución del chat y realizamos las definiciones de tamaños, y ya puestos, definimos los descriptores de ficheros de entrada y salida con el nombre de las constantes genéricas en lugar de utilizar los números 0 para lectura y 1 para escritura.

Continue reading “Crea tu propio chat – Cliente” »

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