Archivo para la categoría ‘Lenguajes’

Visor de expresiones regulares

Representación de la expresión regular de validación de correos electrónicos

strfriend es una página que te muestra la representación de la expresión regular que le indiques. Muy útil cuando quieres entender lo que hacen (aunque ya de por sí son complicadas de hacer como para entenderlas ;) ). De todas formas, mejor planteároslo dos veces antes de usarlas.

En el dibujo anterior está la expresión ^(([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+([;,](([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+)*$ que valida múltiples direcciones de correo electrónico separadas por punto y coma.

Y no me acuerdo donde lo vi…

Curso de programación en Pascal

Buscando por el disco duro, como dije ayer, he encontrado el curso de Pascal que hicimos mi amigo Héctor (el que me da el hosting del blog) y yo en el año 2000 para la asociación de estudiantes (ya extinta, por desgracia) Unicyber.

Este curso es muy básico y sencillo tratando los elementos básicos del lenguaje incluyendo los tipos de datos, las estructuras de control y poco más.

Hay que tener en cuenta que esto es del 2000 (o antes, pero la fecha de creación del documento es de ese año) y que no ha sido modificado desde entonces, lo pongo aquí tal cual estaba. Además, había sido desarrollado por dos alumnos de segundo de informática con lo que el número de errores puede ser incontable (de hecho, en el pequeño vistazo que le di para imprimirlo ya he descubierto alguno).

No pretendo que aprendáis a programar en Pascal con él pero este curso se impartió en la asociación a 18 personas para la asignatura de E.D.I. y creo que aprobaron todas (bueno, igual el 90%, pero aún así es bastante, creo).

Curso de Programación en Pascal (PDF, 189 KB)

Por cierto, este documento no tiene licencia en él pero se aplica la misma que tiene el blog: Creative Commons: Reconocimiento, No comercial y Compartir bajo la misma licencia.

25 años de Turbo Pascal

Leo en Barrapunto que este se cumplen 25 años del lanzamiento de Turbo Pascal 1.0 para MS-DOS.

¡Qué recuerdos! Yo aprendí en la carrera a hacer listas lineales doblemente enlazadas en Pascal. En este lenguaje fueron mis primeros pasos en este mundo de la programación. Yo puedo presumir de que no empecé con BASIC (menos mal).

Incluso impartí un curso de Pascal (bastante simplón pero funcionó bastante bien) en una asociación de la Universidad. No lo he encontrado por la red (aunque estaba) así que en cuanto lo encuentre por el disco duro de casa lo pongo por aquí.

Luego, con eso del Windows y las interfaces gráficas, llegó el Delphi que no era más que Pascal orientado a objetos y con algún que otro añadido. Además, claro, de su entorno de desarrollo que permitía poner botones y demás controles de forma visual.

En Delphi tengo muchas aplicaciones hechas. Pero muchas. Lo único es que no están «hechas» del todo sino a medio hacer. Las únicas que se podrían permitir el lujo de ser para la comunidad son las que tengo en los downloads (y no mucho).

Después de la Universidad, con eso de que empiezas a trabajar, las empresas ya no usan tu querido Delphi, así que hay que moverse para no quedarse obsoleto. Y me moví hacia las tecnologías Web. Ahora todo toca en PHP, HTML, CSS, JavaScript, algo de Java,… pero vamos, que, de vez en cuando, si tengo tiempo, siempre le hecho un vistazo a todo lo que tengo hecho en Delphi. Incluso, a veces, hasta termino alguna de esas interminables aplicaciones.

Por cierto, creo que el Pascal es el mejor lenguaje de programación para aprender a programar. Sí, no me llaméis radical. Pero su sintaxis sencilla, su media potencia con los punteros (media pero válida para aprender) y su posibilidad de usar programación estructurada y programación orientada a objetos hace de él un buen lenguaje de aprendizaje. Y luego, si quieres hacer cosas más profesionales, usa Delphi (que también está la versión Turbo Delphi que es gratis).

Y si crees que no es libre, que sólo es para Windows, que… no, no, no. También tienes el FreePascal. Sintaxis extendida pero todo funcionando. Para aprender os recomiendo que lo probéis. Si ya sabéis programar y queréis hacer aplicaciones profesionales… mejor id a tecnologías Web. De momento es el futuro.

Fallo de segmentación en PHP

Haciendo un pequeño proyecto en PHP siguiendo el paradigma de la orientación a objetos, hoy me he encontrado con un pequeño problema del que PHP no te avisa.

Bueno, te avisa mostrando la pantalla del navegador totalmente en blanco (no genera ningún HTML) y si lo ejecutas mediante CLI te dice Fallo de segmentación (core dumped). Este es de los errores más bonitos que te pueden ocurrir programando, sobre todo cuando no eres tú el que hizo el software que falló.

Usando un poco el gdb como indican en la documentación de PHP cuando se produce un segfault, he visto que existen varias funciones que siempre se ejecutan en bucle infinito: zend_get_constant_ex(), zval_update_constant_ex() y zval_update_constant().

Como mi aplicación utiliza muchas constantes (no me gusta poner cadenas por el código; cada vez que una cadena se repite la refactorizo a una constante) me dio que pensar y al final (después de bastante rato) descubrí el error. Más o menos, para que lo podáis comprobar, bastaría con ejecutar en Linux el comando php5 -f segfault.php siendo segfault.php el siguiente código:

#!/usr/bin/php5
<?php

class BaseClass {
const THE_CONSTANT = "beosman";
}

class DerivedClass extends BaseClass {
const THE_CONSTANT = self::THE_CONSTANT;
function __construct() {
echo "THE_CONSTANT = ".self::THE_CONSTANT."\n";
}
}

$class = new DerivedClass();

?>

Para más información, estoy usando PHP versión 5.2.1 (Zend Engine v2.2.0) en Ubuntu 7.04 (kernel 2.6.20-17-generic).

Y por si alguien quire fuchicar un rato más porque no se queda agusto, para ejecutar gdb hay que usar el comando gdb php5 y luego, dentro de su propia consola hay que ejecutar el comando run /ruta/al/archivo/php/que/falla.php -e. Una vez que falle, hay que indicarle a gdb que imprima un backtrace mediante el comando bt.

QR Code

Navegando por la red he visto los códigos QR que son algo parecido a los códigos de barras que vemos todos los días pero estos son en dos dimensiones.

¿Y qué tienen de especial estos? Pues que pueden contener mucha más información que un código de barras normal. Un código de barras EAN13 puede contener hasta 13 caracteres numéricos mientras que un código QR puede contener hasta 4296 caracteres alfanuméricos (ASCII) aunque también puede almacenar otros tipos de datos (como números sólo, caracteres chinos y datos binarios).

Aquí en España están muy poco extendidos estos códigos pero en Japón están a la orden del día ya que aparecen en casi cualquier lado y, gracias a aplicaciones para móvil que los reconocen (en España algunos móviles ya las tienen), los usuarios tienen mucha información al alcance de su mano, como URL’s, programación de televisión, información de carteles, etc.

Lo que más me ha sorprendido (y gustado) es que se lleva mucho incluir un código QR en las tarjetas de visita conteniendo la información de una vCard, una tarjeta de visita electrónica que fácilmente se puede importar a los principales programas de PIM como iCal de Apple u Outlook de Microsoft.

Para decodificarlo hay que tener una aplicación que lo haga. Para PC solo he encontrado QuickMark for WebCam (está al final del todo de la página y hay que registrarse para bajarlo) que con una webcam puedes leer dichos códigos y te muestra su información.

Pero para el móvil hay muchos más, como i-nigma, Kaywa Reader o Semacode.

Y, como no, con un generador online de códigos QR, pues me he hecho mi propio código con mi vCard:

Mi vCard como un código QR

Aquí, lógicamente, hay poca información, vamos, la básica que se puede ver en este blog, pero en realidad se puede incluir bastante más.

Y como para friki yo, pues estoy pensando en hacerme una camiseta con el código. Ya os contaré ;) .

Cosas del ANSI C

Revisando el código fuente de la implementación del compilador de Ruby (así, por aprender) he visto algo en C que no había visto nunca (di que tampoco es que tenga mucha experiencia en C) y es la diferencia entre la declaración de parámetros entre ANSI C (C89) e ISO C (C99):

#include <stdio.h>

// compila con cualquier tipo de parámetros en la llamada (ANSI C)
int
testFunction1(parm1,parm2)
int parm1;
int parm2;
{
printf(“1. Funciona? parm1 = %d, parm2 = %d\n”,parm1,parm2);
printf(“1. En serio? parm1 = %s, parm2 = %d\n”,parm1,parm2);
return 0;
}

// compila pero sólo se le pueden pasar parámetros de tipo entero (ISO C)
int
testFunction2(int param1,int param2) {
printf(“2. Functiona? param1 = %d, param2 = %d\n”,param1,param2);
return 0;
}

int
main(void) {
printf(” -> testFunction1()\n”);
// funciona con cualquier tipo de parámetros (ANSI C)
testFunction1(“vida”,42);
printf(” <- testFunction1\n”);

// funciona sólo con enteros, con otro tipo no compila (ISO C)
printf(” -> testFunction2()\n”);
testFunction2(‘vida’,42);
printf(” <- testFunction2\n”);
return 0;
}

Con la primera forma, el tipo de los parámetros fuera de la declaración de la función, cuando se llamada a dicha función se le le puede parasar cualquier tipo de parámetros e, internamente, los convertirá al tipo declarado posteriormente aunque, como se puede ver en el segundo printf, dependiendo de si le pasas un %d o un %s, imprimirá una cosa u otra aunque su tipo sea distinto.

En la segunda forma, es el propio compilador el que muestra un error cuando pasas un parámetro que no coincide con el tipo declarado.

La salida es más o menos la siguiente (se puede ver que nuestro parámetro, aunque posteriormente declarado como int, también contiene la cadena vida):

-> testFunction1()
1. Funciona? parm1 = 134514096, parm2 = 42
1. En serio? parm1 = vida, parm2 = 42
<- testFunction1
-> testFunction2()
2. Funciona? param1 = 1986618465, param2 = 42
<- testFunction2

Para que esto compile también hay un pequeño truco y es que la palabra «vida» como primer parámetro de la segunda función va entre comillas simples, esto es, en lugar de tomarse como una cadena (char[] para ser exactos) se toma como un caracter (char), sí, como un caracter de 32 bits en lugar de 8 (es una palabra con 4 letras, un byte por letra). Por supuesto, con el correspondiente warning, pero compila.

Y aunque esto teóricamente es del C antiguo, viene muy bien para pasar cualquier tipo de parámetro a una función en lugar del famoso void*. El problema es saber, dentro de la función, qué es lo que llega.

No se si esta anotación es útil, pero al menos es curioso. El saber nunca está demás.

Rendimiento de PHP

Cuantas veces habré oído que si PHP es lento, que si el código es churrigueresco, que si las aplicaciones con PHP no son buenas… Y todo son bobadas.

Para lo de mal código la respuesta es bien sencilla: es el programador el responsable del código bueno o malo, no el lenguaje. Yo, al menos de momento, en todas las aplicaciones serias (las páginas web para el amigo del amigo pues como que no) hago código en condiciones. Y con «en condiciones» me refiero a utilizando un framework MVC, creando objetos de negocio y utilizando, siempre que algún problema se pueda solucionar con alguno de ellos, los patrones de diseño.

Para lo del rendimiento tenemos una página, The PHP Benchmark, donde nos lo ponen un poco más claro. Incluso tenemos una traducción en Sentido Web:

  • Realizar un foreach es siempre más rápido y si no recuperamos la clave del array mejor aún.
  • Un for es más rápido si no calculamos previamente en una variable el tamaño del array que recorremos. Además, sizeof es más rápido que count.
  • Cuando vamos a asignar el valor de una posición de un array a una variable para tratar con ella, es conveniente hacerlo por referencia ($alias = & $array[$i]).
  • No es más rápido crear un objeto como referencia ($obj =& new SomeClass();).
  • if es más rápido que switch/case y ligeramente más rápido es usar === que == (en la referencia en español está equivocado).
  • Parece ser que el uso de comilla simple o doble en las últimas versiones se ha mejorado y no existe apenas diferencia.
  • Contrariamente a lo que ponía en el manual hace tiempo, un echo "aa"."aa"."aa"; (echo de una cadena concatenada) ahora es más rápido que el echo "aa","aa","aa"; (echo de varias cadenas separadas por coma). No sucede lo mismo para variables donde el tiempo viene siendo similar.

Además, si queremos acelerar un poquito más nuestro código PHP, tenemos lo que se llama un opcode cacher, que es un plugin que cachea el código PHP pero ya precompilado en su bytecode, con lo que en sucesivas llamadas al script, no es necesario recompilarlo y ejecutarlo sino sólo ejecutarlo ya que lo coge precompilado de la caché.

Dos ejemplos de estos plugins son eAccelerator y XCache. eAccelerator lo he probado y funciona bastante bien (no es la panacea pero sí que se nota a simple vista) y ahora quiero probar con XCache.

E independientemente de todo esto del rendimiento tengo que decir que PHP es un lenguaje más. Un lenguaje como otro cualquiera, con sus ventajas e inconvenientes y tan potente o útil como el partido que le pueda sacar el programador. Porque herramientas, plugins, frameworks y clases reusables son lo que sobra para hacer buen código. Ahora ya no hay excusa.

C ofuscado

int i;main(){for(;i["]<i;++i){––i;}"];read(‘-’-'-’,i+++"hell\
o, world!\n",’/'/’/'));}read(j,i,p){write(j/p+p,i–––j,i/i);}

Esto es un pequeño programa en C… o eso dicen. Pero ¿qué hace exactamente? Pues según ponía en la página web donde lo encontré (que ni me acuerdo porque lo tengo en el disco duro desde hace mil años), imprime "hello, world!" por pantalla. Típico.

Esto es un programa en C, como he dicho antes, pero en C ofuscado. Os podréis imaginar a los más frikis programando esto. Pues si no lo hacéis ya podéis ir empezando porque encima hay un concurso a nivel mundial: IOCCC.

Como no, lo probé. Bueno, yo no, pero lo haré. Una amiga sí e inicialmente en Windows no compila. Dice que no se encuentra la función read(). A ver si tengo un rato y lo pruebo en Linux y pongo el resultado. Y, ya de paso, si alguien me lo explica pues estupendo…

P.D.: Si alguien es tan friki geek como yo y prueba a compilarlo, tened cuidado con las comillas simples y dobles a copiar y pegar en el archivo .c. Ale, ya me contáis a ver qué tal os va…

P.D.2: Y si habéis probado esto y os gustan las cosas ofuscadas, también podéis probar a programar con algún lenguaje esotérico como Ook! o Brainfuck.

Actualización 23/01/2008: He probado a compilar el programa en Linux con gcc y funciona a la primera y sin problemas imprimiendo hello, world!. ¡Y sigo sin entenderlo! Podéis probar vosotros si queréis.

D 2.0

Hace menos de 7 meses que el lenguaje de programación D había llegado a su versión 1.0 después de mucho tiempo y ahora resulta que han saltado directamente a la versión 2.0. Impresionante.

Leyendo la lista de correo (no muy asiduamente, la verdad, tiene muchísimo tráfico) me entero de que ha habido un cambio grande en la arquitectura del compilador para el manejo de las variables y parámetros constantes aunque también parece ser que se seguirán corrigiendo errores en las versiones 1.x.

Este tipo de acciones me parecen cuanto menos sorprendentes. Este lenguaje, aunque creo que estremadamente potente y muy prometedor, no había llegado tener demasiados programadores, por lo que estos cambios radicales yo no los haría con versiones estables, es decir, yo me curraría un lenguaje con todo lo que quisiera que tuviera y, cuando lo tuviese suficientemente desarrollado y probado, lo lanzaría, dejando bastante tiempo entre versiones grandes. Más o menos estilo Java o estilo Ruby.

Pero bueno, el señor Walter Bright es el arquitecto y el sabrá lo que hace, teniendo en cuenta su dilatada experiencia en esto de los compiladores. Recordemos que fue el que escribió el primer compilador de C++ para MS-DOS.

Visto lo visto, habrá que leerse otra vez la documentación a ver si por fin empezamos a crear nuestro Sistema Operativo ¿quién se anima?

Desasnar

Esta es la palabra que me ha llamado hoy la atención desde Halón Disparado.

Desasnar: Hacer perder a alguien la rudeza, o quitarle la rusticidad por medio de la enseñanza.

Que desasnar viene del prefijo des- y la palabra asno, vamos, hacer que cierta gente deje de ser una burra.

Y es que en este mundo lo que sobran son asnos «indesasnables». Y por más que te empeñes en decirles que no, que las cosas no son así, que hay que leer, estudiar, ser escéptico… pues nada, ellos a lo suyo. Y ahora mismo se me ocurren algunos… ¡uy…! no me lo tengáis en cuenta que ya sabéis como soy respecto a estos temas.

Escribir con faltas de ortografía

Escribir con faltas de ortografía en cualquier medio es como dejar que las visitas entren en tu casa y ésta estuviese sucia y descuidada.

Al hilo de la ortografía en los blogs desde
Eres lo que escribes, eres como escribes.

Yo soy lo que escribo

Por fin alguien en sus cabales que inicia una aventura para alfabetizarnos (me incluyo) en esta lengua nuestra que es el castellano. Porque no basta con saber hablar lo justo, no basta con que te entiendan, no. Hay que saber hablar correctamente para así cuidar nuestras ideas, compartirlas, plasmarlas, difundirlas, ampliarlas,… y esto sólo se consigue con una buena educación verbal.

Desde Eres lo que escribes, eres como escribes, nos instan a conocer el medio por el cual se transmite la inteligencia: el lenguaje. Y con ello intentarán que todos escribamos correctamente en estos proyectos mal-llamados blogs, en estos cuadernos de bitácora.

Ya hace tiempo que se iniciaron algunas campañas de este tipo, como CCFVLS, aunque no al nivel de reseñar los elementos necesarios para mejorar nuestra sintaxis. Pero por supuesto agradecida y apoyados sus argumentos.

Y seguro que a mi novia esto le encantaría. Sólo hay que ver su primera y única entrada.

El lenguaje de programación D ya es 1.0

Hoy estoy un poco más feliz, informáticamente hablando, porque el lenguaje de programación D ya es 1.0. Pues sí, después de 178 versiones, Walter Bright ha sacado la versión 1.0.

A partir de ahora habrá que ponerse al día con todo lo nuevo y ver que potencial se le puede sacar a este verdadero lenguaje de programación moderno de propósito general y compilado a lenguaje máquina. Aunque hay que tener en cuenta que es muy nuevo, hay que darle una oportunidad, oportunidad que llevo impulsando desde hace bastante.

A todos los frikis informáticos os animo a que lo probéis. Y para los no tan frikis también ;)

¡Ah! Y después de mirar un poco por aquí y por allá, creo que soy el primero (bueno, de los primeros) que se hace eco de la noticia… ¡cómo se nota que me gusta ¿eh?!

Figuras retóricas

Ya hace tiempo que vi esta entrada en el blog de Psicobyte sobre figuras retóricas (aunque con algo más…) y quería ponerla en este, por supuesto, con su permiso gracias a la licencia Creative Commons.

Pequeña introducción, con ejemplos, a algunas figuras retóricas de uso común:

Y como no, en la Wikipedia se puede encontrar una larga lista de las mismas con sus correspondientes ejemplos. Lectura (casi) obligada.

Host

Host es una palabra ampliamente usada por los informáticos. Host viene del inglés y significa anfitrión en el sentido estricto de la palabra, pero también puede significar presentar como verbo, o montón si lo tratamos como sustantivo.

Si lo llevamos al campo de la informática, un host es un ordenador que actúa como servidor proporcionando servicios de red, como por ejemplo servidor Web, FTP, etc.

Pero lo que he llamado la atención es que host también es hostia, pero la religiosa, no la otra (aunque se escriben igual). En inglés, host es la Holy Communion, es decir, la Sagrada Comunión, vamos, la hostia que te da el cura.

Y he estado mirando en Word Reference pero no hay nada bien traducido del tipo «¡que te doy una hostia!», ni «¡hala, qué hostia!». Las traducciones, por ejemplo para «echando hostias» al inglés sería «as far as possible», que nada tiene que ver con el significado exacto y el énfasis de la frase en español.

Así que cuando en inglés digamos «I am going to hit you a host!» os aseguro que no estaremos diciendo «¡Te voy a dar una hostia!». Cosas del lenguaje.

Dando órdenes

Me llama enormemente la atención la forma tan errónea con que se usa la forma imperativa del verbo. Es cierto que es un fallo frecuente en el habla coloquial, incluso en el decurso hablado sea del tipo que sea la conversación, pero cuando veo un informativo, escucho a un periodista o leo un periódico no puedo evitar “poner el grito en el cielo” ¿no se supone que en un informativo o en la prensa escrita se emplea un registro formal? ¿no se supone que tienen escrito lo que deben leer y que además lo están leyendo en el telepronter teleprompter? ¿no se supone que tienen unos libros de estilo? Entonces ¿por qué no se expresan correctamente? Y peor aún ¿por qué no escriben correctamente?

Es sabido por todos, desde el colegio, que el imperativo es una forma verbal empleada para dar órdenes y que sus formas morfológicas correctas son, por ejemplo, come tú, comed vosotros (las formas coma usted, comamos nosotros y coman ustedes las comentaré en otro momento) sin embargo es extremadamente habitual encontrarnos con que las órdenes hacia la segunda persona de plural (vosotros) se realizan utilizando una forma de infinitivo, por ejemplo: *comer (vosotros) las patatas o *comeros las patatas. Esta expresión es incorrecta, muy incorrecta, lo correcto es: comed (vosotros) las patatas o comeos las patatas en donde la desinencia de segunda persona de plural de imperativo –d se elimina al añadirle el pronombre os, tan sólo hay un verbo que conserva esta –d, es el verbo irse cuyo imperativo es idos no *íos ni *iros.

La explicación es muy simple. Cuando nosotros damos una orden estamos utilizando la función apelativa del lenguaje, es decir, estamos intentando que el receptor de nuestro mensaje lleve a cabo la orden que le estamos dando, pero esta apelación nunca, repito nunca, puede usarse con un infinitivo si nos estamos refiriendo a un “vosotros”, únicamente se acepta el infinitivo con valor imperativo cuando le anteponemos la preposición a (Niños, a dormir), o bien cuando el receptor del mensaje no es alguien concreto (No tocar, peligro de muerte).

Por tanto, a partir de ahora cuando oigáis o leáis una orden en la que utilizan un infinitivo como imperativo de segunda persona de plural ACORDAOS, no *acordaros, de esta pequeña explicación e INTENTAD, no *intentar, que vuestro uso sea el correcto, ya que a muchos que se consideran excelentes periodistas habría que darles con la Gramática en la cabeza.

Nota: Esta entrada la escribió mi novia hace tiempo cuando se lo pedí, pero resulta que no le gusta escribir en blogs. Digamos que es un poco «antitecnología» ¿influirá que haya estudiado Filología Hispánica, la antítesis de la Ingeniería Informática? Joer que mal rollo. Bueno, el caso es que estaba por aquí sin publicar por ella, así que lo hago yo.