Etiquetas

importado (41) programación (34) desahogo (30) linux (28) cine y TV (22) humor (21) software libre (19) internet (17) música (13) móviles (12) videojuegos (8) English (7) libros (6) vodafone (6) google (5) java (5) libreoffice (3) openoffice (3) consumismo (2) desarrollo con qt en nokia 5800 (2) economía (2) nokia (2) qt (2) c++ (1) ciencia (1)
Mostrando entradas con la etiqueta programación. Mostrar todas las entradas
Mostrando entradas con la etiqueta programación. Mostrar todas las entradas

12/09/2014

C++: consts and const references and const pointers and const methods, oh my!

C++ is powerful. But it has some concepts that seem easy to understand... until you actually use them for the first time. This is a compilation of some of my head-scratching moments while grasping C++ capabilities that are foreign to C programmers like me.

References

Declare a variable with "&" and it is a reference. Think of a C pointer ("*"), but it can not be NULL and you can not cast it to reference another type (the case of C's malloc() returned void pointer). Examples:
    // With a basic type
    int number = 3;
    int &reference = number;
    cout << reference << endl; // Prints 3
    reference = 1;
    cout << number << endl; // Now it prints 1

    // With a class instance
    string stringInstance = "Hi!";
    string &stringReference = stringInstance;
    cout << stringReference.size() << endl; // Note we are not using the "->"
                                            //  operator! It is not a pointer.
References in method declarations allow you to pass the instance itself instead of the value
/* Reverse a string in place, avoiding copies */
void reverse(string input){
    for (int i = 0, j = input.size() - 1; i < j; ++i, --j){
        char tmp = input[i];
        input[i] = input[j];
        input[j] = tmp;
    }
}
That didn't do anything to the real "input" string. This is C++, so "input" is an instance of the class "string" and not a pointer. The method reverse() has been working on a copy of the class instance that was destroyed as soon as the method finished! Solution? We could pass a pointer (string *input) and go crazy like in C, but then we would have to check for NULL pointers, use the "->" operator and who knows what else. The C++ way? Use a reference!
/* Reverse a string in place, avoiding copies */
void reverse(string &input){
    for (int i = 0, j = input.size() - 1; i < j; ++i, --j){
        char tmp = input[i];
        input[i] = input[j];
        input[j] = tmp;
    }
}
No changes required to the method body. It is also required for optimization, cause it avoids a deep copy of the instance's internal structure.

Const

The qualifier "const" (which also exists in C) can be mostly read as "readonly" (think Java's "final"). It effects whatever is on its left. If there is nothing on its left, then it effects the first thing on its right. So this is a mistake:
const int const *p = ...; // Compiler error, duplicate const!
Now the caveats:
    const int number = 2; // int value is readonly now
    int &reference = number; // Compiler error: "int &" requires
                             // an "int", not a "const int"
Fix:
    const int number = 2;
    const int &reference = number; // But now "reference = 1;" is an error, careful!
Note that "const int & reference" and "int const & reference" is the same thing (remember, left unless there's nothing, if so, right). What if we start moving the const modifier around?
   int & const reference = number; // Compiler error: const attempts
                                    // to modify the reference itself (&),
                                    // but references are always readonly!

Const and pointers

A C refresher. Remember: const affects that on its left, including the pointer (*) itself.
    // With a basic type
    int number = 2;
    const int *p = &number;
    *p = 3;   // Compiler error: the value is readonly!
    int * const pp = &number;
    *pp = 3;    // OK
    pp = &argc; // Compiler error, the pointer is readonly!

Const and method declarations

Const applies also to method arguments:
void clearString(const string & input){
    cout << "Deleting this many characters: " << input.size() << endl;
    input.clear();  // Compiler error: the instance is readonly!
}
Wait... how did the C++ compiler know the method clear() would change the string, and size() wouldn't? Hardcore static code analysis? AI? Magic? Not really. Const has another use: specifying which member methods in a class change no values and hence are safe to be called when the class is readonly. This is the declaration of the size() method in string, note the const after the parenthesis:
// Capacity:
///  Returns the number of characters in the string, not including any
///  null-termination.
size_type size() const
{
    return _M_rep()->_M_length;
}
That use of const is exclusive to objects. It will throw a compiler error if you try to use it in a function declaration that does not belong to a class.

Done for today. Hope it helped you!

2/07/2011

Desarrollo con Qt en Nokia 5800 XpressMusic (2): configurar el entorno de desarrollo

Continúo con el desarrollo para Nokia 5800. Anteriormente hablé un poco de la historia y estado actual ("state of the art" que dirían los yanquis) del desarrollo para dispositivos Nokia.

Ahora empiezo la parte práctica con la configuración inicial del entorno de desarrollo y la ejecución de un ejemplo incluido en el entorno de desarrollo Qt Creator. Usaremos ahora el emulador, más adelante probaremos la ejecución directa en el móvil tras configurarlo.

1/18/2011

Desarrollo con Qt en Nokia 5800 XpressMusic (1): introducción


Esta es la primera de las entradas que dedicaré a programar en el Nokia 5800 con las herramientas actuales.

Empiezo con una introducción para comprender cuál es la actual situación del desarrollo en smartphones Nokia y cómo la competencia ha motivado algunos cambios importantes.

1/11/2011

Compilando gSOAP en HP-UX / Compiling gSOAP on HP-UX

El siguiente error al compilar gSOAP en HP-UX significa que el m4 instalado en la máquina es el de serie. Hay que instalar la versión GNU.

The following error when compiling gSOAP on HP-UX means that the m4 tool in use is HP's. You need to install and use the GNU version.

bison -y  -d -v `test -f 'soapcpp2_yacc.y' || echo './'`soapcpp2_yacc.y
conflicts: 1 shift/reduce
gmake[4]: *** [soapcpp2_yacc.c] Error 141

12/01/2010

La última de Oracle contra un proyecto de software libre (Hudson)

Hudson es un servidor de integración continua libre, famoso por su avanzado núcleo extensible mediante plug-ins.

Comenzó como un proyecto personal de un empleado de Sun que dejó de trabajar allí hace tiempo. Sin embargo sigue haciendo uso de las facilidades ahora propiedad de Oracle, en este caso la plataforma de proyectos java.net.

Ahora viene el problema: los desarrolladores no afiliados a Oracle quieren una migración a otras infraestructuras, GitHub entre otras. Uno de los desarrolladores principales de Hudson es un empleado de Oracle (reconocido así por la comunidad de Hudson como gesto de buena fe a la compañía).

¿La respuesta de Oracle? No quieren que se migre fuera de java.net, y no les conviene hacerlo ya que tienen la marca "Hudson" registrada. Toma ya.

Como podéis ver en la entrada del blog, la mayoría de los comentarios claman por hacer un fork y renombrar el proyecto. Veremos en qué acaba esto, pero Oracle no tiene una muy buena trayectoria con proyectos Open Source.

10/29/2010

Leyendo los datos de OCR del DNI

El DNI (Documento Nacional de Identidad) tenía una zona de lectura mecánica (MRZ) diseñada para que se pudiesen extraer fácilmente datos mediante una pasada de OCR a una imagen digitalizada del mismo. En el DNI electrónico se mantiene dicha zona, pero ha cambiado el formato de la primera línea.

En esta página tenéis la información sobre el formato en ambos DNIs:

http://www.pilila.com/nif.php

La información es interesante de cara tanto a automatizar la obtención de información a partir de la imagen, como a evitar fraude fiscal comprobando automáticamente datos falsificados.

10/25/2010

Detección y generación de códigos de barras con ZXing

Hace unos meses necesitaba una solución para detectar códigos de barras en imágenes, con el menor coste posible y que detectase distintos tipos de códigos, de cara al futuro.

Investigando di con ZXing, un proyecto desarrollado por Google que viene a ser el lector oficial de códigos QR de la plataforma Android.

Más tarde, por supuesto, ampliaron sus capacidades y para cuando empecé a usarlo ya funcionaba con el código 39 que necesitaba reconocer. En la actualidad decodifica gran cantidad de formatos de código de barras, y se integra en Android y Java con ports avanzados en C++, C#, actionscript y adaptaciones para iPhone, Symbian, RIM...

En un Pentium 4 a 2.4 GHz reconoce un folio A4 escaneado a 200 ppp en menos de 2 segundos de media. Nada mal, más rápido que una conocida solución en C++ que estuve probando antes. Por supuesto, fue la elección final y está cumpliendo con su labor por el momento.

Eso sí, hay que tener en cuenta a la hora de usarlo su origen como aplicación Android: los parámetros por defecto para el reconocimiento son adecuados para una imagen tomada de la cámara de un móvil, con el código de barras en el centro. Es necesario tocar algunos parámetros, especialmente DecodeHintType.TRY_HARDER si queremos usarlo para otros propósitos.

El proyecto también incluye código para generar los códigos de barras. Se puede probar el generador en esta dirección.

10/18/2010

10/11/2010

30 libros de programación gratis

Interesante el libro de creación de compiladores Compiler Construction de Niklaus Wirth:
http://citizen428.net/archives/434

10/05/2010

Plagio descarado en diseño web (actualizado)

Ya está eliminado, pero he leído aquí: http://www.meneame.net/story/nos-plagias-diseno-menos-no-plagies-contenidos cómo la compañía proIDEAS o alguna subcontrata ha plagiado completamente la web de Aperto, una compañía alemana. En la caché de Google ha quedado algún rastro, pero para que os hagáis una idea:


  • Habían dejado las mismas fotos, incluyendo la de los fundadores de la compañía.
  • Ídem para las listas de colaboradores y clientes, con una barbaridad de compañías alemanas que no encajan en una empresa supuestamente española
  • Por aquí y por allá enlaces rotos por hacer un "buscar y reemplazar" en URLs sin cambiar el nombre de los archivos del servidor.
  • Y etc.

En el blog de Aperto podéis ver en alemán la entrada de los trabajadores de Aperto riéndose de la descarada copia. y aquí una traducción automática de google al español.

Actualización: según un comentario en meneame del "plagiador", se trataba de un experimento personal que no tiene nada que ver con proIDEAS.

9/28/2010

Si los programadores fuesen albañiles (viejo)


Uno de enero
Hoy me han llevado al solar por primera vez. La situación es perfecta: tiene el Metro a dos pasos y una cafetería enfrente donde sirven menú del día. El viejo bloque de pisos, al que va a sustituir nuestra nueva construcción lleva un año al borde de la ruina. Mi propia empresa ha colocado varios puntales que, por el momento, han ido evitando que el caduco edificio reviente por sus múltiples grietas. La construcción de este megalito de ladrillo dio comienzo hace cinco años, y aunque los pisos superiores nunca llegaron a recibir el agua, la electricidad y el enfoscado de las paredes, en diez meses los cimientos ya se habían desplazado peligrosamente y las vigas presentaban peligrosas fisuras. La cansada torre de viviendas ya ha cumplido su propósito y ahora nosotros la conduciremos a una muerte dulce. Por supuesto, el viejo edificio no será demolido hasta después de construir y probar el nuevo, lo que nos deja poco espacio de maniobra; pero no vamos a dejar a todas esas familias en la calle durante la construcción. De cualquier modo, los vecinos de la vieja y decadente estructura nos miran con recelo. Saben que el nuevo edificio tendrá viviendas más cómodas, pero algunos de los residentes no podrán costearlas. Ni sé qué va ser de esta gente, ni es asunto mío. Llegan los primeros camiones de ladrillos. 
 
Dos de enero
Me han presentado a Alberto, la persona a quien "voy a reportar". No me han dicho si es el capataz, el jefe de obra, el aparejador o el arquitecto; sólo me han dicho que todo lo que tenga que "reportar" se lo "reporte" a él. Así que, por donde él diga, yo zaca como una locomotora. Esa es la definición que me han dado de nuestra metodología. He buscado "reportar" en el diccionario, y no aparece.
 
Seis de febrero
En algo más de un mes, hemos cavado medio metro de cimientos. Ayer Alberto nos dijo que empezáramos a poner ladrillos, porque el tiempo designado para la cimentación se había agotado hace dos semanas. No aceptó nuestras excusas de que las prometidas excavadoras no habían llegado, y que nos habíamos visto obligados a cavar con las paletas de enyesar. Un compañero se trajo una pala de cavar que guardaba de una obra anterior, y casi le echan por razones deontológicas. Según Alberto, lo que pasa es que frecuentamos demasiado la cafetería. El asunto se ha zanjado con un "hale, a levantar paredes y luego que cada palo aguante su vela". El trabajo sin planos es dificultoso. Los cimientos tienen una forma algo pintoresca. He pedido una plomada para que las paredes queden verticales, y he recibido improperios poniendo en duda mi masculinidad. Ya sé que Alberto no es el arquitecto, el arquitecto es un tal Ignacio. Pasó a supervisar la obra el otro día, aunque aún no había nada que ver. Me han llegado rumores, aunque no son muy dignos de crédito, de que existen fotocopias de planos.
 
Doce de mayo
Anoche estuvimos hasta las siete de la mañana cubriendo con tablas y enmoquetando el espacio que algún día ocupará el despacho de la sexta planta, aunque el edificio no es más que una maraña de vigas de todos los tamaños y algunas paredes que habrá que tirar más tarde porque están en el sitio equivocado. Hemos traído baterías para los fluorescentes, y unos muebles de caoba preciosos. Por suerte, todo estuvo a punto para la demo. Izamos al cliente con la grúa hasta su futuro despacho, y pudo contemplar la vista que se disfrutaría desde el emplazamiento. El viento hizo que la pared oeste, que dos de mis compañeros sujetaban con la espalda, se derrumbara con gran estruendo sobre la mesa de caoba en el peor momento. Gracias a Dios, el cliente fue comprensivo: esto pasa siempre en las demos, y él está curado de espanto, dijo mientras le sacudíamos el polvo del traje. Dice que el lunes que viene vendrá a probar las instalaciones sanitarias. Supliremos con cubos la inexistencia de tuberías.
 
Veintitrés de febrero
Han transcurrido casi catorce meses. Llevamos ya siete de retraso y el edificio no acaba de superar el estado de "casi terminado". Soy de los pocos albañiles que no han cambiado de obra en este tiempo. Alberto está consumido por la zozobra, y se pasa el día en la cafetería trasegando Soberanos. El arquitecto no ha vuelto a pasar por aquí. Los rumores dicen que existieron unos planos, pero que no eran de un bloque de pisos, sino de un polideportivo. Por lo visto, en las reuniones del comité de construcción se dijo que la filosofía era la misma, y que sólo harían falta modificaciones mínimas. Ahora comprendo por qué nos hicieron instalar aros de baloncesto en el hueco del ascensor. Siempre dije que acabaríamos teniendo que quitarlos o aquello no era un hueco de ascensor, que era una cuestión de lógica. Alberto siempre me contestaba que no le viniera con tecnicismos. Estoy perdiendo la vocación de albañil. He decidido apuntarme por las tardes a un curso de informática, a ver si puedo cambiar de vida. Este oficio mío no es serio.

9/21/2010

Google CodePro Analytix

Es noticia el lanzamiento de Instantiations como herramienta gratuita por parte de Google. Pero mientras que la mayoría de los lectores se han fijado en las herramientas de diseño de GUI en Swing, Google Web Toolkit y SWT, lo que más me interesa es el Analytix.

Acabo de probarlo y va a sustituir al vetusto FindBugs (en tanto no lancen la tan cacareada 2.0) en cuanto a comprobaciones de seguridad y rendimiento del código Java. También está interesante la parte de análisis de dependencias entre paquetes (marcando en rojo las dependencias cíclicas), complejidad ciclomática (tengo una clase monísima con una media de 5,16 y es un calvario), búsqueda de código muerto y duplicado...

Cada día adoro más a Google.

P.D.: huy, hace más de un año que no toco esto.

9/15/2009

Guessing TWAIN custom capabilities


  • 1.- Install Twirl TWAIN Probe

  • 2.- Start it and select your scanner from the combobox. Click "4 Souce Open", then "Monitor" so Twirl displays changes in every cap.

  • 3.- Make sure "Show device UI" is selected, then click "5 Source Enabled".

  • 4.- Change values you want to guess in the custom TWAIN UI, then either close it or do a full scan (depending on the maker/model, changes might be not triggered until you scan).

  • 5.- Watch changed caps in the text area, check the possible values for those caps in the caps list.

  • 6.- Document discovered information, test in custom program and enjoy!



Thanks to spike from Dosadi for the excelent tool that is Twirl.



9/12/2008

Desarrollo multiplataforma y VMWare


Es una maravilla esto de que ahora un Windows 2000 tire en una máquina virtual de 512 MB de RAM, instalado en portátil con 2 GB de RAM. Encima, la optimización de recursos de VMWare es cada vez más salvaje.

Para usuarios de Ubuntu interesados, hay instrucciones de instalación del VMWare Server bastante resultonas. Y funcionan con la versión 1.0.7 también.

9/05/2007

Libros de programación gratis para descargar

Brutal lista de libros que se han currado los chicos del foro de Ubuntu. La página que más me ha gustado ha sido la de www.freetechbooks.com, por organización y oferta.

Ahora a ver si acabo con los exámenes y le saco provecho a alguno de esos...

8/02/2007

Llamadas al sistema en el núcleo 2.6 de linux (escrito en octubre del 2005)

Esta mañana hemos realizado en clase de Diseño de Sistemas Operativos la práctica 2, de creación de llamadas de sistema en el núcleo (sin usar módulos).

Aunque el guión estaba preparado para un núcleo 2.4, hemos logrado adaptarlo para el 2.6.13.4 con unos cambios mínimos.

En primer lugar, hay que introducir la entrada de la llamada al sistema en la lista. Anteriormente se introducía en este archivo:

/usr/src/linux/arch/i386/kernel/entry.S


Pero ahora se han separado las entradas de llamadas al sistema en un archivo distinto, que es incluído en el anterior. El nuevo archivo es éste:

/usr/src/linux/arch/i386/kernel/syscall_table.S


La nueva llamada al sistema se introduce al final de la lista, con una entrada así:

.long sys_nueva_llamada /* 375 */


El comentario es el número de la llamada al sistema. Es opcional, pero se recomienda incluirlo cada 5 llamadas por legibilidad del código.

Una vez introducida en la tabla de llamadas, debemos introducir su prototipo en la cabecera unistd.h . En mi caso, lo añadí únicamente al unistd.h de la arquitectura i386, localizado en /usr/src/linux/include/asm-i386/unistd.h. El prototipo se incluye con esta entrada, nuevamente al final de la lista y siempre con cuidado de asignarle un número nuevo, no usado:

#define __NR_nueva_llamada 375


Justo debajo debería aparecer una línea que indica el número de llamadas al sistema en la lista. Debemos incrementar ese número tantas veces como llamadas nuevas hayamos introducido, o podrían darse problemas una vez compilado el núcleo:

#define NR_syscalls 376


Ahora que la nueva llamada consta en el sistema, podemos introducir el cuerpo de la llamada. Esto podemos hacerlo al final del archivo /usr/src/linux/kernel/sys.c . Por ejemplo:

asmlinkage long sys_nueva_llamada(void){
printk("Esta llamada es nueva\n");
return 0;
}


Ya sólo queda recompilar e instalar el núcleo con los cambios y hacer un programa que pruebe que nuestra llamada funciona.

Antes de ese paso, nos encontramos con problemas ya que el código estaba preparado para el núcleo 2.4, mientras que no era compatible con el 2.6.13. Por ejemplo, el puntero p_pptr (que apunta al padre de un proceso en la estructura task_struct) ahora es llamado parent.

También fue necesario cambiar la función verify_area (deprecada en el 2.6) por access_ok . Los parámetros son los mismos, pero el resultado es justo el contrario (mientras que verify_area devuelve 0 cuando se puede acceder al area de memoria indicada, access_ok devuelve 0 cuando no se puede acceder.

8/01/2007

Escribiendo código portable

Uno de los mayores problemas cuando un proyecto debe funcionar en varios sistemas es ver cómo diferentes compiladores se atragantan en código que funciona bien en otro compilador.

La guía de portabilidad en C++ del proyecto Mozilla es una buena lectura para evitarse quebraderos de cabeza después. Aunque está orientada a C++, tiene aspectos aplicables a C. Por ejemplo no hay que olvidar que el inlining de funciones es una lotería, especialmente en compiladores como el de HP-UX, donde directamente se sugiere aniquilar todo uso de inline.

5/29/2007

LOLCODE

LOLCODE, un lenguaje de programación creado para adaptarse a la forma cutre de escribir en internet. Hasta el punto de ir todo en mayúsculas. Los if-then-else son la pera. De un ejemplo de la página principal:


HAI
CAN HAS STDIO?
PLZ OPEN FILE "LOLCATS.TXT"?
AWSUM THX
VISIBLE FILE
O NOES
INVISIBLE "ERROR!"
KTHXBYE

12/13/2006

Cómo se hizo Another World / Out of this World

Impresionante artículo sobre Another World, uno de los videojuegos que hicieron época. Y Eric Chahi lo hizo en dos años en su garaje.

12/04/2006

Recreando el motor de Final Fantasy VII

Q-gears es un nuevo proyecto de software libre que pretende crear una nueva versión del motor de juego de Final Fantasy VII.

Una de las mejores partes de la página es el wiki con información del motor original, que es una lectura interesante para comprender cómo se desarrolla un juego de presupuesto multimillonario. Especialmente partes como el uso de "debug rooms" (salas de depuración), que son lugares del juego donde sus creadores pueden acceder directamente a cualquier parte de la historia para comprobar su correcto funcionamiento. Por supuesto, suelen deshabilitarlo en la versión final.