Sep'12
27

No es la primera ni será la última vez que yo o gente que conozca, tenga problemas con los acentos en aplicaciones web que usen tecnologías PHP y MySQL. Realmente solucionar este problema no es tan complicado y, por ello, vamos a intentar abordar dos soluciones que se pueden usar por separado o unidas según nuestras necesidades.

Pero antes de proponer cada una de las soluciones por separado, vamos a ver un ejemplo de lo que estamos hablando: Supongamos que en nuestra página web hay un campo de entrada de datos, y en ella el usuario escribe:

Café Roma

Acto seguido pulsa el botón “Aceptar” para guardar ese texto en la base de datos. Todo parece ir bien, pero al recuperarlo de la base de datos y mostrarlo por pantalla vemos que escribe algo parecido a lo siguiente:

Café Roma

O, incluso

Caf� Roma

A grosso modo, esto ocurre porque estamos mezclando codificaciones uno o más sitios (navegador del usuario, servidor Apache con PHP instalado y la base de datos MySQL). Esto es un problema muy común y del que, mucha gente pregunta en foros todos los días y, por ello vamos a proponer soluciones para, en un principio mostrarlo en un navegador de forma correcta.

Conversión a caracteres HTML

HTML tiene una serie de caracteres especiales y reservados que tienen una función especial, un claro ejemplo son los caracteres mayor > y menor <, ya que, por ejemplo, estos caracteres se utilizan para delimitar las etiquetas XML en las que está basada la especificación HTML. Por ello, HTML especifica una serie de códigos llamados “Entidades HTML” que nos permiten codificar estos caracteres especiales. Por ello si queremos poner el símbolo <, realmente deberíamos escribir &lt; o bien &#60;. En el primer caso estaríamos indicando ese carácter usando un código alfanumérico y, en el segundo, estamos indicando el valor de dicho carácter en ASCII.

Como hacer esta conversión manualmente no siempre es posible y, en el caso de que si que lo sea, es bastante tedioso escribir usando esos códigos, PHP nos brinda una función que hará el trabajo sucio por nosotros: htmlentities; de manera que con invocar la función:

$str = htmlentities($str);

De manera que ahora en nuestra variable $str en lugar de tener, por ejemplo, “Camión”, que podría darnos problemas al guardarlo en una base de datos si el sistema está mal configurado (más adelante veremos como configurarlo bien), tendríamos una variable que contiene “Cami&oacute;n”, es decir, un string compuesto únicamente por caracteres ASCII que no debería darnos problema a la hora de persistirlo en cualquier base de datos; tenga el cotejamiento que tenga.

Finalmente, si vamos a mostrar el código por pantalla, tenemos dos opciones:

  1. Si vamos a mostrarlo en una web, no hace falta que tratemos el string para volver al formato original, ya que los navegadores son capaces de interpretar estos “caracteres codificados”.
  2. En caso de que no se coloque dentro de un fichero con formato (X)HTML, nos bastará con llamar al método html_entities_decode.

Almacenamiento directo

Lo que hemos visto en el apartado anterior, no deja de ser una chapuza (para la mayor parte de los casos) y que se puede solucionar de una forma bastante sencilla y, es que, si configuramos bien nuestro servidor Apache con PHP, nuestra base de datos MySQL y la conexión entre ambas, podemos ahorrarnos todo este tratamiento de datos; y no solo eso, sino que además, nos permitirá consultar cómodamente los datos almacenados desde cualquier otro sistema sin tener que perocuparnos de deshacer la codificación de caracteres extraños.

Vamos a ver los pasos para realizar esta configuración directamente:

  • El cotejamiento de la tabla (el de la base de datos también debería estarlo), debería de estar configurado en utf8, en mi caso, voy a utilizar utf8_unicode_ci. Esto podemos configurarlo, si usamos phpmyadmin, desde las opciones de la tabla.

  • Apache (con PHP instalado) y MySQL son dos servidores completamente separados y que, no tienen por qué usar el mismo idioma, de hecho, a no ser que tengamos instalado en PHP el conector de MySQL, no seremos capaces de comunicarnos entre ambos servidores. Por ello, es interesante configurar la conexión, en este caso, el idioma en el que van a hablar; para ello, tenemos que decirle a MySQL que queremos todos los campos en UTF-8 ejecutando la siguiente query:
 SET NAMES 'utf8' 
  • En caso de querer mostrar los datos en un fichero (X)HTML, deberíamos indicar el cotejamiento de la página añadiendo la siguiente etiqueta <meta> en el header de la página.
 <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> 
Si disfrutaste del artículo, puedes suscríbete a nuestro feed RSS
Categoría(s): Manuales, PHP
Aug'12
1

MATLAB es una herramienta estupenda para tratar con grandes cantidades de datos de manera sencilla y, por eso mismo, es utilizado para desarrollar los algoritmos deseados (como por ejemplo uno de detección de pasos) antes de implementarlos en el dispositivo final. De esta manera eliminamos el factor humano al implementar algunas funciones que vienen de serie en MATLAB como, por ejemplo, una FFT (Fast Fourier Transform).

El primer paso para hacer esto es importar los datos en RAW (en crudo). Estos datos estarán formateados de una u otra manera que puede depender de nosotros o no. En mi caso, estoy trabajando con un formato CSV que separa cada uno de las “columnas” con un punto y coma (semicolon) en lugar de una coma; esto hace que no pueda hacer uso fácilmente de la función por defecto de MATLAB para abrir este tipo de archivos.

Por ello, vamos a aprender como importar datos en un formato cualquiera dado siempre que este simule a una tabla:

path = './pruebas/Sensor_record_20120731_214243_AndroSensor.csv';
formats = '%f%f%f%f%f%f%f%f%f%f';
headerLines = 1;
delimiter = ';';
[M{1:10}] = textread(path, formats,'headerlines', headerLines, 'delimiter', delimiter);

En la primera línea indicamos la ruta en la que almacenamos nuestros datos, en la segunda indicamos el formato de cada uno de los campo; en este caso estamos indicando que tenemos 10 campos y que todos ellos son un número decimal. En la tercera línea indicamos que tenemos una línea de cabecera y que ha de saltarse, esto es especialmente interesante cuando las primeras líneas no siguen el formato del resto del fichero CSV o si, simplemente, queremos obviar esas lineas y no importarlas. En la cuarta indicamos nuestro delimitados. Y, finalmente, en la sexta, le decimos que nos meta en un CellArray de 10 posiciones los datos de dicho archivo., de manera que trabajar con los datos de la primera columna es algo tan sencillo como:


plot(M{1});

Si disfrutaste del artículo, puedes suscríbete a nuestro feed RSS
Etiqueta(s):
Categoría(s): Manuales, MATLAB
Jul'12
16

El título puede llevar a malentendidos. No me he “peleado” con Google, él conmigo tampoco; pero el momento que sospechaba que llegaría en un momento u otro, finalmente lo hizo. El castigo ha llegado en forma de un descenso del 90% de las visitas del blog.

Este bajón de visitas no ha venido dado porque el ranking de la web haya descendido, tampoco por entrar en las blacklist de los buscadores; ha sido culpa del hackeo que sufrió el blog en los últimos 15 días. Como ya os comenté, el blog fue reinstalado desde 0 con la intención de cargarlo con los mismos datos. La forma de hacer el importado y exportado de datos (con el fin de eliminar los problemas que pudiese haber en la base datos) fue mediante las utilidades que vienen por defecto en WordPress y que utilizan XML para mover los datos. Esto hizo que las direcciones url, entre otras cosas, cambiasen, de modo que, por ejemplo: http://www.dipler.org/2009/07/%C2%BFcomo-funciona-facebook/ pasase a tener un enlace como http://www.dipler.org/2009/07/como-funciona-facebook/ . Objetivamente, podemos decir que, ahora, tenemos urls más limpias pero, por otro lado, ha aumentado muy significativamente el número de errores 404 de la web.

En definitiva, hemos pasado del rango de 300-500 visitas diarias al de 20-50 visitas diarias, es decir, la web ha sufrido un descenso de al más del 90% en lo que a número de visitas se refiere. Esto había que arreglarlo como sea, y no valía dejar que Google reindexase todas las nuevas direcciones, ya que el blog estaba enlazado por varias webs, entre ellas por la wikipedia y varias universidades.

Analizando el listado de errores 404, la mayor parte de ellos venían dados por los caracteres ¿ y ¡, así que jugando un poco con los ficheros .htaccess, he hecho que ese problema desaparezca.

RewriteRule ^(.*)¿+(.*)$ $1$2 [R=301,L]
RewriteRule ^(.*)¡+(.*)$ $1$2 [R=301,L]

Finalmente y, con la intención de eliminar los errores 404 de rastreo introducidos por la famosa puerta de atrás que ha causado todos estos problemas, me dispongo a redirigir todo el tráfico a a la página principal.

RewriteRule ^(.*)wpbuzz(.*)$ $1 [R=301,L]

Ahora le toca “mover ficha” a Google y volver a mostrarme una media de 10.000 veces diarias en sus resultados y no las 1.000 que hace ahora (y bajando)

Si disfrutaste del artículo, puedes suscríbete a nuestro feed RSS
Categoría(s): Curiosidades, General
Jul'12
14

Este blog lleva online poco más de tres años. En este tiempo tanto el blog, como su autor, aquí presente, han pasado por varias etapas de dedicación y abandono a lo largo de estos años.

Como todo en un principio, se toma con ganas de dedicarle unas cuantas horas, pero estas ganas se van desvaneciendo hasta que se llega a un equilibrio entre ganas y dejadez; pero no nos entretengamos más en tonterías.

Por motivos de estudios y trabajo, dejé de escribir en el blog de forma regular; podría decirse que lo abandoné al 75%, porque he seguido entrando todos los días para aprobar y responder comentarios, hacer copias de seguridad y mantener al día el software sobre el que corre. Aun así, y pese a este periodo abandono de más de un año, las visitas sólo decrecieron en un par de años de 500 diarias a 300 diarias y siendo constantemente enlazado desde otros medios.

Pero la dejadez no perdona, y parece que la gente se da cuenta. Esto hizo que el blog fuese atacado y crackeado debido a una mala configuración en los permisos de una carpeta (hoy en día sigue siendo el punto de mira de una serie de ataques por fuerza bruta). Esta pequeña incursión no autorizada es la que quiero comentaros hoy en este artículo.

La carpeta imágenes tenía los permisos 777 (aun no sé si este fue el descuido o la tardía actualización del software de este CMS), es decir, todo el mundo podía leer, escribir y ejecutar; primer gran error. Aun así, no tenía consciencia de esta debilidad hasta que me llegó una carta de una agencia de protección de datos diciendo que estaba infringiendo las leyes de Copy Right al alojar unos artículos de una universidad. Rápidamente borré estos ficheros (que se encontraban dentro de una carpeta wpbuzz) que yo no había subido y le cambié los permisos a las carpetas que estaban mal configuradas. Hasta aquí todo bien, no parecía más que un susto; pero aun así, subí de nuevo los ficheros del blog, cambié todas las contraseñas,… en fin,… todas esas cosas que se suelen recomendar cuando has sufrido un ataque de este estilo.

La gran sorpresa vino cuando dos días después vuelvo a recibir una carta en la que me notifican que vuelvo a tener estos archivos alojados. “Jo***” es lo primero que pienso. Me dedico a analizar meticulosamente los logs de acceso al servidor por todas las vias posibles: no había nada raro. ¿Qué podía estar pasando?

Tras un rato de darle vueltas al tema, llego a la conclusión que tiene que haber algo raro, algo que iba más allá de los ficheros que borré. Media hora después, empiezo a ver cosas raras en el sistema de ficheros. ¿qué hacían ficheros .tar en la carpeta de imágenes?, ¿funciones eval con códigos en hexa dentro de los fuentes de wordpress? Efectivamente, sospecha confirmada, esos archivos comprimidos tenían todos los archivos que violaban la propiedad intelectual y por los que me habían dado un toque. ¡Ficheros fuera!

Si estos ficheros se han descomprimido varias veces, es porque hay código que se ejecuta y que no pertenece al código original de WordPress. Tras investigar un rato encontré un código de php con mala pinta; tras borrar este archivo y unas cuantas imágenes que en teoría estaban corruptas y me dirigí al Fórum Impulsa 2012 con un portátil bajo el brazo por si acaso había que ponerse a trabajar para arreglar el problema.

Dos días después, vuelve a aparecer la maldita carpeta wpbuzz.

Sigo con la investigación por tierra mar y aire; esta vez toca analizar plugins y base de datos. En los plugins parece no haber nada raro, las carpetas tenían los permisos correctos y no había ningún archivo con código que fuese claramente sospechoso. En cuanto a la base de datos, se me volvió inabarcable el hecho de analizarla detenidamente, ya que con el trabajo no he podido dedicarle el tiempo que ello requería; estaba en un camino sin salida.

Tras darle unas cuantas vueltas decidí hacer lo que hago con el ordenador como mínimo una vez al año como tarea básica de mantenimiento: reinstalarlo todo de cero. Pero esto suponía otro problema, y es que si la backdoor estaba en la base de datos, el problema no se solucionaría y habría perdido una serie de horas que no podía permitirme el lujo de perder.

Finalmente, y tras unas horas de darle vueltas a la cabeza y probar varios programas de backup, decidí probar el que trae preinstalado WordPress y que nos permite exportar nuestro contenido en un XML con la finalidad de poder mover los artículos entre plataformas; estos datos, al fin, parecían estar limpios.

En conclusión:

  • Hay que vigilar los permisos de las carpetas de nuestro servidor y configurarlas correctamente.
  • Hay que mantener el software actualizado siempre.
  • La solución estaba frente a mis narices y no me di cuenta por no ir primero a lo simple
Si disfrutaste del artículo, puedes suscríbete a nuestro feed RSS
Categoría(s): General, Seguridad
Feb'12
25

Cuando se desarrollan aplicaciones de una determinada envergadura nos encontramos con un “problema” durante su desarrollo, y es que, si bien los que nos dedicamos a crear sus funcionalidades y características, solemos tener el entorno de desarrollo instalado en nuestros equipos y podemos compilar código, otros equipos que trabajen en el mismo proyecto, no lo suelen tener.

Ésta es una limitación relativa, ya que en aplicaciones web y de escritorio no suele suponer un gran problema (basta con distribuir la dirección o el binario), pero cuando estamos hablando de aplicaciones móviles, la cosa cambia, sobre todo si no se tienen suficientes dispositivos móviles de cada uno de los tipos para todos los equipos que están trabajando en su desarrollo. Por esto vamos a intentar hacer la vida un poco más fácil a la gente escribiendo un tutorial paso a paso para instalar el emulador de Android (ADB) en equipos MAC OSX (en principio el proceso es similar para todos los sistemas operativos simplemente descargando el ejecutable correcto).

PASO 1: Descargarnos los binarios para realizar la instalación; para ello nos dirigimos a http://developer.android.com/sdk/index.html y descargamos, en este caso, el fichero para MAC OSX.

PASO 2: Descomprimimos el fichero descargado (En caso de haber descargado el ejecutable para Windows, puedes saltarte este paso).

PASO 3: Movemos la carpeta que hemos descomprimido a “/Applications/” (Este paso no es completamente necesario, pero nos vendrá bien para mantener todos los ficheros de nuestro sistema en orden).

PASO 4: Abrimos un “Terminal” (sí, esa pantallita que nos deja hacer de todo con nuestros equipos escribiendo pequeños comandos).

PASO 5: Nos dirigimos a la carpeta a la que hemos movido la que hemos descomprimido, en mi caso, la carpeta se llama “android-sdk-macosx”:

cd /Applications/

cd ./android-sdk-macosx/tools

PASO 6: Ejecutamos en consola el fichero llamado “android

./android

Con esto ejecutaremos un programa que, una vez cargado, presentará un aspecto similar al siguiente:

PASO 7: Instalamos los paquetes correspondientes a las plataformas que deseemos ejecutar (yo recomiendo la versión 2.2 +o 2.3, ya que por el momento son las más extendidas en los móviles en circulación)

PASO 8: Aceptamos los términos y condiciones al hacer click en instalar los paquetes seleccionados y esperamos a que el proceso llegue a su fin; este proceso puede tardar varios minutos.

PASO 9: Una vez instalados los paquetes deseado, nos dirigimos al menú contextual y hacemos click en “Tools” y en el menú que se despliega seleccionamos “Manage AVDs“, con lo que nos aparecerá una ventana similar a la siguiente:

PASO 10: Crear un dispositivo virtual: para ello hacemos click en “New…“, le damos un nombre y seleccionamos las características que deseemos, como por ejemplo las siguientes:

Hacemos click en “Create AVD

PASO 11: Seleccionamos el AVD que acabamos de crear y pulsamos en “Start“; opcionalmente, en la ventana que aparece, en lugar de darle a aceptar directamente, podemos modificar las dimensiones de la pantalla entre otros parámetros, pero eso ya os dejo explorarlo a vosotros.

Como resultado ya tenemos a nuestra disposición un emulador de Android completamente funcional y que nos permite simular desde posiciones de GPS hasta la cámara de fotos,…

Si disfrutaste del artículo, puedes suscríbete a nuestro feed RSS
Categoría(s): Android, Manuales
Dec'11
21

MATLAB, como no podía ser de otra manera, es una herramienta muy útil para el desarrollo ágil de algoritmos, probarlos y así, cuando nos decidamos a pasarlos a un lenguaje distinto que nos permita su mejor explotación, estemos seguros de que va a funcionar, que no hemos implementado funciones que realmente no nos hacían falta y que no vamos a dar demasiados pasos en falso.

Nosotros, los que estudiamos Ingeniería de Telecomunicaciones, estamos bastante acostumbrados a trabajar con MATLAB pero, al menos en mi caso, siempre me había visto tratando señales de audio o de radiación, nunca imágenes o vídeos. Pero ayer, en un intento de hacer algo diferente (mostrar la evolución de una imagen conforme se va comprimiendo), se me ocurrió la idea de mostrar cada una de las imágenes obtenidas por mi algoritmo como un frame de vídeo en una película.

Tras investigar un poco, puedo decir que crear un vídeo *.avi usando MATLAB, es de lo más sencillo, es más, sólo tenemos que escribir cuatro líneas (aunque usa podrá repetirse tantas veces como frames tengamos en nuestro vídeo).

Paso 1

Creamos una variable en la que insertaremos los distintos frames:

movie = avifile('video.avi', 'fps', 10, 'compression', 'none');

Esta función tiene la siguiente especificación:

aviobj = avifile(filename, ParameterName, ParameterValue)

Es decir, le tenemos que pasar el nombre del fichero y tantas parejas parámetro->valor como deseemos; en nuestro caso hemos especificado que queremos mostrar 10 frames por segundo y que no queremos compresión alguna en nuestro vídeo resultante.

Paso 2

Añadimos todos los frames que deseemos, para ello antes debemos convertir la imagen que queremos que aparezca en el vídeo en un frame; en definitiva:

frame = im2frame(image, gray(256));
movie = addframe(movie, frame);

Si tienes dudas sobre lo que hacen estas funciones puedes consultar las especificaciones de im2frame y de addframe.

Paso 3

Cerramos las variables y, por consiguiente dejamos el video listo para reproducirse en programas como el videolán:

movie = close(movie);
Si disfrutaste del artículo, puedes suscríbete a nuestro feed RSS
Categoría(s): Manuales, MATLAB
Nov'11
15

Recientemente adquirí un MacBook Pro 13″, tras 4 meses de uso, puedo decir con tranquilidad que es una maravilla de equipo; pero como todo cambio de sistema operativo, programas, equipo,… implica una serie de cambios a los que debemos acostumbrarnos poco a poco.

En este caso voy a comentar una solución al problema (o característica, según se vea) que nos impide seleccionar la url en Google Chrome al pulsar la techa F6 (o fn+F6) y al que nos permite refrescar/actualizar la página pulsando la tecla F5 (o fn+F5).

Realmente configurarlo para añadir esta característica es muy sencillo; para ello nos vamos a las preferencias del sistema>teclado; una vez ahí nos dirigimos a la pestaña “Atajos del teclado” ya que vamos a añadir 2. Antes de seguir con la configuración vamos a apuntar dos nombres de comandos tal y como aparecen en el menú de Chrome y que vamos a necesitar a la hora de definir nuestro atajo:

En el menú File (Archivo) del Chrome vemos que el comando que se corresponde con la techa ⌘L (Seleccionar la dirección)  es “Open Location…” en mi caso; esto debería hacer que al pulsar la combinación ⌘L, la URL se seleccione automáticamente (obtenga el foco); pues bien, nos apuntamos el nombre del comando “Open Location…” ya que lo necesitaremos más adelante.

Hacemos lo mismo pero con el comando ⌘R que está bajo el menú View (Ver), solo que en este caso con “Reload This Page“.

Continue reading “Configurando Google Chrome en OSX Lion [f5 & f6]” »

Si disfrutaste del artículo, puedes suscríbete a nuestro feed RSS
Etiqueta(s): , ,
Categoría(s): General, Manuales, OSX
Jul'11
6

Hace unas semanas publicamos una lista con 10 aplicaciones gratuitas recomendadas para iPad, pues bien, como es lógico, con el tiempo se van descubriendo nuevas aplicaciones que le darán una especial vidilla a nuestro nuevo equipo táctil.

10 de las aplicaciones de este artículo siguen siendo las del anterior, por lo que no vamos a volver a nombrarlas y describirlas, pero puedes verlas fácilmente dirigiéndote a dicho artículo.

Como dice el título del artículo, vamos a hablar de las 10 aplicaciones que nos faltan de una forma un poco más exhaustiva. Algunas de las aplicaciones que se describirán requerirán un proceso especial de instalación o bien, para poder disfrutarla al 100% habrá que hacerse con la versión de pago; pero si están aquí, es que ya merecen la pena sin haber pagado un duro.

Y sin más dilación, comencemos:

FeedlerRss: Una de mis herramientas favoritas de Internet y que relativamente poca gente usa o que ni siquiera sabe que existe, son los lectores de RSS. Esta herramientas, para los no enterados del tema, nos permite leer todas las actualizaciones de nuestras páginas favoritas, siempre y cuando den soporte a este sistema. Este tipo de lectores existen desde hace varios años, tanto como programas de escritorio o como otra página web que nos muestra el contenido de las demás; algunos ejemplos son: Google Reader, Netvibes, o el que estoy haciendo y pretendo publicar dentro de relativamente poco tiempo. Pues bien, en caso de que tengamos una cuenta de Google Reader, podremos vincular ésta con la aplicación Feedler, de manera que podremos leer cómodamente nuestro feed RSS desde nuestro iPad sin contar con las limitaciones de las aplicaciones web para dispositivos móviles. Como única pega, diría que abusa de las animaciones por todas partes. Continue reading “20 aplicaciones gratuitas recomendadas para iPad” »

Si disfrutaste del artículo, puedes suscríbete a nuestro feed RSS
Etiqueta(s):
Categoría(s): Programas
Jun'11
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.

Si disfrutaste del artículo, puedes suscríbete a nuestro feed RSS
Categoría(s): C/C++, Producción propia, Programación
Jun'11
23

Ayer, día 22 de junio del 2011, tuvo lugar una concentración de unas 1.000 personas en el palacio de congresos de Gerona con el fin de presentar en un único lugar a más de 500 jóvenes emprendedores o con ganas de serlo con otros tantos personajes ilustres del mundo de la empresa. El fin no es otro sino intentar apoyar a los más jóvenes a hacer realidad sus sueños y, quien sabe, quizá acudir al fórum como senior dentro de unos años.

Yo he sido uno de los privilegiados que, sin tener ninguna patente en curso, una empresa/idea medio montada,… ha tenido la oportunidad de asistir a tan magnífico evento, en el que no sólo hemos aprendido, sino que he hemos conocido a gente con las mismas inquietudes y con las que puede que, en un futuro no muy lejano, se pueda contar para intentar montar algo un poquito más grande que a lo que haríamos en condiciones normales.

Pero empecemos desde el principio… Continue reading “Fórum Impulsa 2011” »

Si disfrutaste del artículo, puedes suscríbete a nuestro feed RSS
Categoría(s): Emprendimiento