Archivo

Entradas Etiquetadas ‘programacion’

Herramientas Open Source para colorear código

Miércoles, 8 de Febrero de 2012 Gaspar Fernández Sin comentarios

Aquí muestro una recopilación de herramientas que nos ayudarán a mostrar código fuente con colores, y así poder enseñar orgullosos nuestro código, bueno más que nada porque se ve todo más claro y se puede identificar mejor a qué corresponde cada palabra que en texto plano sin color.
Dependiendo del proyecto que tengamos entre manos nos conviene más utilizar una herramienta online u offline, o si tenemos un blog, mejor utilizar una herramienta específica para blogs.

Aquí va la lista:

  • GeSHi : Es una clase en PHP que nos devuelve un código HTML con el código fuente que deseamos coloreado. Tiene muchas opciones y soporta muchos lenguajes. Podéis ver un ejemplo de cómo usarlo aquí (un post de hace unos días) y una web donde utilizando GeSHi nos colorean el código que queramos.
  • SyntaxHighlighter: Un interesante proyecto en Javascript para colorear código sin saturar nuestros servidores. Haciendo todo el proceso de coloreado desde la máquina cliente, en el navegador. Podemos ver un ejemplo aquí.
  • COOoder : Muy útil para incluir código en nuestros documentos de OpenOffice.org / LibreOffice . Basta con seleccionar el código, seleccionar la herramienta, elegir el lenguaje, y él se encarga de lo demás. Podemos ver el código fuente aquí.
  • Code Colorizer Formater : Otra extensión más para LibreOffice que nos ayuda a colorear nuestro código fuente. Cuando le cogemos manejo es muy fácil, pero al principio puede que nos atranquemos un poco.
  • Code Colorer Plugin: Plugin para Wordpress basado en GeSHi para colorear código fuente. Este es el que usa este blog.
  • WP-Syntax : Otro plugin para Wordpress, también basado en GeSHi.
  • Highlight : Es un software que se ejecuta tanto en entorno gráfico como en consola y simplemente pegamos nuestro código y salvamos en HTML, RTF, LaTeX, SVG, ansi, y algún que otro formato más.
  • c2html : Simple, convierte C a HTML desde nuestra consola
  • code2html : Otra utilidad más de consola, capaz de convertir algunos lenguajes a HTML coloreado.

Por Internet podemos encontrar muchas más, ¿qué herramientas conoces? ¿o has usado?

Coloreando código con GeSHi

Sábado, 4 de Febrero de 2012 Gaspar Fernández Sin comentarios

geshiCuando queremos publicar código fuente por Internet (como en esta web), debemos hacer que los usuarios se sientan bien con el código y que sea agradable de leer. Además del indentado, es de agradecer la introducción de colores, que separen palabras clave, identifiquen cadenas, funciones de biblioteca, funciones propias, números y demás elementos que encontramos en un fragmento de código.

Por Internet, podemos encontrar una biblioteca muy útil para este propósito: GeSHi. Vamos a intentar hacer algo sencillo con ella.

Para instalarla simplemente tenemos que descargarla y descomprimirla en uno de los directorios de nuestra web (no tiene por qué ser el principal), a continuación vamos a hacer un pequeño programa que mostrará el código fuente de un fichero PHP. Suponemos que geshi.php está situado en el mismo directorio que este ejemplo:

1
2
3
4
5
6
7
8
9
10
<?php
// Basado en los ejemplos de la página oficial
require_once("geshi.php");

$codigo=file_get_contents('mi_programa.php');

$ges=new GeSHi($codigo, 'php');

echo $ges->parse_code();
?>

Con este pequeño ejemplo, se mostrará de forma coloreada el código seleccionado, aunque es conveniente el uso de cachés, es decir, es una buena idea almacenar el código coloreado, es decir, el contenido que devuelve $ges->parse_code() en un archivo aparte y cargar directamente este archivo en la siguiente petición de la página. Por ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
include_once 'geshi.php';

function color_source_file($source_file, $language)
{
  $source_cache='cache/'.basename($source_file).'_'.$language.'.cache';
  if (@filemtime($source_cache)<filemtime($source_file))
    {
      $geshi= new GeSHi(file_get_contents($source_file), $language);
      $highlighted_source=$geshi->parse_code();
      file_put_contents($source_cache, $highlighted_source);
      return $highlighted_source;
    }
  return file_get_contents($source_cache);
}

$source = 'mi_programa.php';

echo color_source_file($source, 'php');
?>

Este código es capaz de guardar en un fichero el html generado por GeSHi en un archivo de caché (se guardará en un directorio llamado cache, el nombre del fichero será el mismo que el espeficado y su formato será [nombre]_[lenguaje].cache . La decisión se toma en base a las fechas de modificación de los archivos. Si el archivo de caché no existe (por eso la @ para que no devuelva fallos PHP) o su fecha de modificación es anterior a la fecha de modificación del archivo fuente, se generará un nuevo archivo de caché y se devolverá el código coloreado. Si no, se devolverá el código coloreado leyendo directamente del archivo de caché.

Activar números de línea

Lo podemos hacer así:

1
$ges->enable_line_numbers(GESHI_FANCY_LINE_NUMBERS);

Si ponemos GESHI_FANCY_LINE_NUMBERS cada 5 líneas saldrá el número en negrita, si ponemos GESHI_NORMAL_LINE_NUMBERS no sucederá así.

Resaltar líneas

Para resaltar líneas, debemos crear un array con los números de línea que queremos resaltar:

1
$lineas=array(5,6,7,43,53,54)

Y luego escribir:

1
$ges->hightlight_lines_extra($lineas);

Personalizando los estilos

Para ello podemos utilizar CSS. Por defecto GeSHi personaliza el style=”" de cada etiqueta, aunque genera mucho código html que podemos ahorrar. Para ello, podemos utilizar lo siguiente:

1
2
$ges->enable_classes();
file_put_contents('codigo.css', $ges->get_stylesheet(false));

Así crearemos un archivo .css que contendrá todos los estilos que puede tener un código fuente en un determinado lenguaje (en el cual hemos inicializado la clase), luego podemos incluir ese CSS ya generado en nuestro html resultante, y cambiar los colores, tipos de letra, etc.

GeSHi tiene muchísimas más opciones, para saber más, basta con un vistazo a la documentación oficial (en inglés) para descubrir todas las posibilidades de esta clase.

RIP Dennis Ritchie

Domingo, 16 de Octubre de 2011 Gaspar Fernández 2 comentarios

Muchos medios de comunicación y blogs ( 1, 2, 3, 4, 5 por ejemplo ) ya informaron de la noticia. Es una lástima que una de las grandes mentes del siglo XX y parte del XXI pasara tan desapercibida, y es que nos enteramos de la noticia hace 3 días habiendo sucedido hace una semana. Y es que sin él, este blog no existiría (C / C++ / PHP (hecho en C) / Linux (tipo Unix)), tal vez muchas de las cosas que hacemos en el ordenador no serían posibles, a lo mejor ni tendríamos ordenadores en casa, ni MP3, ni gadgets, ni smartphones, tal vez sea demasiado decir, puede que en un mundo paralelo todo esto exista sin su aportación lo que es seguro es que nada de esto sería como lo conocemos.

Dennis Ritche dejó su huella en el mundo de la informática, y una gran huella, si pudiéramos contar cuánto tiempo invirtió en su vida aprendiendo todo lo que tuvo que aprender y trabajando en su legado a la humanidad y todo el tiempo que el resto de la humanidad ha invertido utilizándolo estaríamos ante una persona situada en el Top 10 de la edad contemporánea. Desde aquí, le doy las gracias.

Después de enterarnos de esta pérdida, es inevitable compararla con la muerte de Steve Jobs, pocos días antes, alguien que sin duda, también ha hecho mucho por la tecnología, aunque se movieron en campos diferentes, uno nos proporcionó la base y las herramientas, otro utilizó esas herramientas para construir algo mayor y ver futuro en cosas que nadie consideraba útiles.

Y pensar que hace unos días estuve hablando de él en otro blog.
¡Descanse en paz Dennis Ritchie!

Creando bibliotecas o librerías para Arduino

Viernes, 12 de Agosto de 2011 Gaspar Fernández Sin comentarios

Aunque en inglés library, es biblioteca (ese lugar donde hay tantos libros y se requiere silencio), y no librería (ese lugar donde se venden libros), a la RAE le da igual, y no quiero entrar mucho en eso…
Una de las ventajas de los lenguajes modernos es que no tenemos que escribir todo el código junto, incluso muchas partes de código no son nuestras; existen bibliotecas con funcionalidades que podemos llamar desde nuestros programas, y de hecho si queremos programar bien, uno de nuestros deberes es la reutilización de código, para lo cual, nosotros podemos crear nuestras propias bibliotecas y utilizarlas en nuestros programas… o compartirlas con otros desarrolladores.

Contaré todo esto de dos formas: para en el entorno Arduino y para hacerlo sin él.

En principio, vamos a hacer un pequeño programa en el que hagamos parpadear un led, aunque para ello, crearemos una clase llamada Parpadeo que nos permita configurar el led y el retardo. Esta clase estará en los archivos parpadeo.h y parpadeo.cpp ; a continuación pongo el código fuente de parpadeo.h, parpadeo.cpp y blinky.pde (el programa principal).

parpadeo.h:

1
2
3
4
5
6
7
8
9
10
11
12
#include <WProgram.h>

class Parpadeo
{
public:
~Parpadeo();
Parpadeo(int ledpin, int retardo);
void blink();
private:
int ledpin;
int retardo;
};

parpadeo.cpp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "parpadeo.h"

Parpadeo::~Parpadeo()
{
}

Parpadeo::Parpadeo(int ledpin, int retardo): ledpin(ledpin), retardo(retardo)
{
pinMode(ledpin, OUTPUT);
}

void Parpadeo::blink()
{
digitalWrite(ledpin, HIGH);
delay(retardo);
digitalWrite(ledpin, LOW);
delay(retardo);
}

blinky.pde:

1
2
3
4
5
6
7
8
9
10
11
12
#include

Parpadeo p(10, 500);

void setup()
{
}

void loop()
{
p.blink();
}

Aunque, cómo debemos colocar estos archivos?

Con el IDE Arduino

SketchbookTenemos que mirar dónde tenemos nuestro sketchbook (File / Preferences), dentro de ese directorio, creamos otro llamado libraries (si no lo tenemos ya), y dentro de éste creamos parpadeo (el nombre de nuestra biblioteca). Ya podremos compilar libremente utilizando #include , e incluso si hacemos clic en Sketch / Import Library encontraremos parpadeo, para poder insertarla fácilmente en nuestros proyectos.

Con el script para scons

Lo bueno es este método es que podemos insertar nuestras bibliotecas donde queramos, por ejemplo para utilizar las incluidas dentro de sketchbook, podemos hacer lo siguiente:

$ scons EXTRA_LIB=/home/gaspy/sketchbook/libraries

La estructura debe ser siempre la misma:
[directorio de libraries] / [nombre de la biblioteca] / [nombre de la biblioteca.h] (y demás archivos)

Por lo tanto para compilar con el script de scons debemos incluir EXTRA_LIB=[directorio de libreries] y este directorio de libraries puede estar en cualquier lado, puede ser una ruta relativa o absoluta, puede llamarse de cualquier forma, por ejemplo, el mío se llama libs.

Si no queremos escribir mucho, y vamos a construir muchas veces desde línea de comandos podemos hacer lo siguiente:

$ LIBS=”EXTRA_LIB=[directorio de libraries]”
$ scons $LIBS

Un nuevo juguete… Arduino Diecimila

Lunes, 1 de Agosto de 2011 Gaspar Fernández 2 comentarios

Arduino DiecimilaGracias a mi amigo David Morán conozco Arduino. Arduino es una plataforma de hardware libre. En este caso formado por una pequeña placa con un micro-controlador, varios puertos de entrada y salida, un interfaz serie para programación o energía y una toma de corriente, que puede ser la base de gadgets, utensilios, juguetes, autómatas programables de cualquier tipo; además, se compone de un entorno de desarrollo con el que podemos realizar nuestros proyectos en multitud de lenguajes y plataformas.

Para instalar las herramientas necesarias en nuestra plataforma favorita, podemos seguir este enlace. Aunque tenemos que tener en cuenta que el IDE de desarrollo está hecho en Java, es algo pesado para mi gusto y no es gran cosa. Aunque está muy a mano la compilación y el hecho de subir los programas a nuestro Arduino, seleccionando el modelo que tenemos; tiene soporte para tabs y es muy sencillo, puede que te hayas quedado con la mosca detrás de la oreja y quieras más.
Captura ArduinoPuede que estés acostumbrado a un entorno de desarrollo y no quieras cambiar. Bien, para eso está el software libre, dado que el compilador de usaremos será AVR-GCC, podremos personalizar el proceso de compilado y subida de datos de nuestro proyecto para el procesador de Arduino.
A modo de presentación y antes de liarme haciendo posts sobre esta nueva (para mí) plataforma, dejo un par de vídeos:




No son lo más emocionante, pero tengo que empezar con algo :)

Limitando el uso de Flash en Firefox

Miércoles, 20 de Julio de 2011 Gaspar Fernández 2 comentarios

Hace dos días leo en Usemos Linux un artículo sobre administrar el uso de Flash desde Firefox, aunque yo estaba preparando una recopilación parecida de extensiones que nos ayudarán para limitar el uso de esta tecnología.

Introducción

Debo destacar que Flash me parece una tecnología muy pesada, que encierra errores del pasado para asegurar retrocompatibilidad y eso se traduce en bajo rendimiento. Es multiplataforma, aunque a duras penas, y beneficia muchas veces a plataformas Windows.

Aunque tenemos alternativas, muchas veces se puede hacer lo mismo utilizando HTML+Javascript / Ajax o HTML5, también tenemos Silverlight / Moonlight (aunque el remedio no sea muy diferente a la enfermedad), a veces, tanto diseñadores como programadores se ponen en contra del mundo creando páginas con bastantes flash empotrados, por ejemplo, dificultando la navegación por la web, consumiendo ancho de banda y, a veces, consumiendo nuestro procesador haciendo que todo nuestro sistema nos vaya más lento.

I. Stop Autoplay

Es mi preferido, me permite, desactivar todos los elementos que se reproduzcan automáticamente, como música, vídeos empotrados, Flash o Silverlight, permitiendo reproducirlos cuando hacemos click sobre ellos.

Permite introducir máscaras para que no haya que pulsar sobre ciertos elementos y se reproduzcan automáticamente, pero yo prefiero hacer click si voy a reproducir.

Es muy útil para el primer caso descrito arriba, webs con muchos elementos flash que nos incomodan, nos permite pasar un poco de todos ellos ganando rendimiento y comodidad; por cierto, también es muy útil para juegos de Facebook donde te pones a aceptar regalos y cada vez que aceptas se carga el juego, con esto se acabaron los problemas.

Tiene cierto parecido con Flashblock, pero me gusta mucho más Stop Autoplay.

Lo podemos descargar desde aquí. Según dice el autor hubo problemas con votos negativos en la página de complementos de Mozilla y tuvo que retirarlo.

II. Low Quality Flash

Esta extensión hace que todos los elementos Flash se reproduzcan en baja resolución. Si tienes un ordenador con algunos años lo agradecerás…

Se puede descargar desde aquí.

Actualización 20/07/2011 10:16 — No funciona en Firefox 5, habrá que esperar un poco, o modificar el plugin a mano, creo que no hace nada que FF5 haya prohibido.

III. Flashtoggle y QuickJava

Nos permiten activar y desactivar Flash globalmente. Podemos desactivar Flash en cualquier momento, aunque para reactivarlo hace falta recargar la página.

QuickJava nos permite activar y desactivar Java / Javascript / Flash / Silverlight / Imágenes / CSS por lo que es mucho más completo.

Podemos bajarlos desde aquí: Flashtoggle / QuickJava

IV. Flash Resizer

Otra joya que nos permite ver un elemento Flash con menor o mayor tamaño del que viene en una web de una forma muy sencilla… redimensionándolo con el ratón.

Lo podemos bajar de su página oficial.

Algo más

Bueno, todo esto está muy bien, pero no podemos olvidarnos de Flash Video Replacer, extensión de la que ya hablé hace un año más o menos, que reemplaza el vídeo flash empotrado por un reproductor del sistema que sin duda irá más rápido y aprovechará mejor la aceleración hardware.

Índice de soluciones a todos los retos de #tuentiContest

Sábado, 2 de Julio de 2011 Gaspar Fernández Sin comentarios

Aunque se puede acceder a través de las categorías del blog, desechando un poco algunos contenidos, he decidido hacer un índice con las soluciones de todos los Challenges y sus últimas actualizaciones, porque a día de hoy todavía se siguen actualizando y añadiendo nuevas soluciones.
Esto también sirve de referencia para todos aquellos que van a hacer poco a poco y tranquilamente los retos, son y para tener un acceso directo a todos los retos sin necesidad de andar buscando por el blog:

Reto Última actualización Última colaboración
Challenge 1: Super Hard Sum 2011/07/03 @Rosapolis
Challenge 2: TLang 2011/07/08 captain_regex
Challenge 3: Emirps 2011/07/03 @Rosapolis
Challenge 4: Task Duration 2011/07/03 @Rosapolis
Challenge 5: The Milkman Problem 2011/07/03 @Rosapolis
Challenge 6: The Clock 2011/07/03 @Rosapolis
Challenge 7: The Tile Game 2011/07/03 @Rosapolis
Challenge 8: The Biologist Problem 2011/07/03 @Rosapolis
Challenge 9: Christmas Lights 2011/07/04 @lagunex
Challenge 10: Key Combos 2011/07/04 @lagunex
Challenge 11: Gas Stations 2011/07/08 @lagunex
Challenge 12: The Stargate Problem 2011/07/13 @lagunex
Challenge 13: The Other Clock 2011/07/13 @lagunex
Challenge 14: Colors Are Beautiful 2011/07/14 @lagunex
Challenge 15: The Robot 2011/07/19 @lagunex
Challenge 16: The Bus Stations 2011/07/19 @lagunex
Challenge 17: The ¿? Problem 2011/07/03 @Rosapolis
Challenge 18: The Riddle 2011/07/03 @Rosapolis
Challenge 19: The Caesar Salad 2011/07/03 @Rosapolis
Challenge 20: The Clumsy Programmer 2011/07/03 @Rosapolis

Iré actualizando estas páginas a medida que me vayan llegando soluciones. Si has resuelto los retos, ya hayas participado en el concurso o no, puedes enviarme un link con tus soluciones (en pastebin, github, tu blog, etc) en un comentario o un mensaje por twitter (@blakeyed).

Actualización: 2011/07/03 02:40 Añadidas nuevas soluciones a todos, por @frisco82 y @blakeyed
Actualización: 2011/07/03 14:00 Añadidas nuevas soluciones a todos menos el 16, por @Rosapolis
Actualización: 2011/07/04 12:54 Añadida la solución de @lagunex al Challenge 9
Actualización: 2011/07/04 17:35 Añadida la solución de @lagunex al Challenge 10
Actualización: 2011/07/08 12:44 Añadidas soluciones de captain_regex al Challenge 2 y de @lagunex al Challenge 11
Actualización: 2011/07/13 02:49 Añadida solución de @lagunex al Challenge 12
Actualización: 2011/07/13 16:11 Añadida solución de @lagunex al Challenge 13
Actualización: 2011/07/14 14:55 Añadida solución de @lagunex al Challenge 14
Actualización: 2011/07/19 17:55 Añadidas soluciones de @lagunex al Challenge 15 y Challenge 16

Recopilación de soluciones para los retos de #tuentiContest . Challenge #20

Jueves, 30 de Junio de 2011 Gaspar Fernández Sin comentarios

Últimamente he hablado acerca del I concurso de programación de Tuenti. Un concurso de programación Online que se llevó acabo durante la semana pasada (del 13 al 20 de Junio, muy mala fecha).

Podéis ver los enunciados de todos los problemas, con ejemplos sobre la entrada y salida (aunque a veces no hay que hacerles mucho caso) en la web oficial del concurso, pero en Vidas Concurrentes lo encontramos todo en español.

Challenge #20 : The Clumsy Programmer

Tenemos un viejo Debian de 32bits y hemos borrado nuestro home, además hemos perdido las claves para descifrar nuestros datos, ¡tenemos que recuperarla!

Este reto, casi nadie lo completamos, y en principio yo pensaba que era más difícil de lo que era. Romper un RSA de 1024 es algo muy lento, y vi que algunos lo resolvían en menos de 20 minutos. Cuando me enteré me arrepentí de no haber pasado un poco más de tiempo buscando información en lugar de abandonar, la verdad es que llevaba un ritmo de sueño muy raro esa semana, y preferí dormir un poco.

Para resolverlo, teníamos que tener en cuanta la época, no nos decían cuando, pero era un viejo Debian, era de 32bits y estábamos utilizando openssl. Parece ser que allá por 2008 se descubrió un fallo en la versión de OpenSSL que instalaba Debian (y derivados), en la que los números aleatorios necesarios para la clave RSA, en lugar de ser a través de /dev/random eran a través de la PID de OpenSSL, con lo cual tenemos muy pocas posibilidades teniendo en cuenta que muchas veces, las PID no es muy alta (más de 500 y menos de 15000, vamos generalmente), es decir, tenemos un número muy acotado de posibles claves RSA a utilizar, por lo que podemos hacer un script en bash para probarlas todas.

Para más información, podéis visitar:

Soluciones:

Si no estás en la lista y quieres plantear tu solución, deja un comentario con tu link !

Actualización 2011/07/03 01:52 : Añadida solución de @frisco82
Actualización 2011/07/03 13:52 : Añadida solución de @Rosapolis

Recopilación de soluciones para los retos de #tuentiContest . Challenge #19

Jueves, 30 de Junio de 2011 Gaspar Fernández Sin comentarios

Últimamente he hablado acerca del I concurso de programación de Tuenti. Un concurso de programación Online que se llevó acabo durante la semana pasada (del 13 al 20 de Junio, muy mala fecha).

Podéis ver los enunciados de todos los problemas, con ejemplos sobre la entrada y salida (aunque a veces no hay que hacerles mucho caso) en la web oficial del concurso, pero en Vidas Concurrentes lo encontramos todo en español.

Challenge #19 : The Caesar Salad

Un mensaje cifrado con 4 métodos distintos, todo acompañado de una adivinanza
Soluciones:

Si no estás en la lista y quieres plantear tu solución, deja un comentario con tu link !

Actualización 2011/07/03 01:49 : Añadida solución de @frisco82
Actualización 2011/07/03 13:52 : Añadida solución de @Rosapolis

Recopilación de soluciones para los retos de #tuentiContest . Challenge #17

Miércoles, 29 de Junio de 2011 Gaspar Fernández Sin comentarios

Últimamente he hablado acerca del I concurso de programación de Tuenti. Un concurso de programación Online que se llevó acabo durante la semana pasada (del 13 al 20 de Junio, muy mala fecha).

Podéis ver los enunciados de todos los problemas, con ejemplos sobre la entrada y salida (aunque a veces no hay que hacerles mucho caso) en la web oficial del concurso, pero en Vidas Concurrentes lo encontramos todo en español.

Challenge #17 : The ¿? Porblem

También conocido como “Just do it.” por las palabras de su enunciado. Lo que no nos decían es que nos mandaban una imagen PNG en base64 por la entrada estándar. Si la abríamos como texto, después de muchos datos binarios podíamos leer un texto: “There is more data in this image than meets the eye“, pensemos ahora en esteganografía, por ahí iban los tiros.
Soluciones:

Si no estás en la lista y quieres plantear tu solución, deja un comentario con tu link !

Actualización 2011/07/03 01:49 : Añadida solución de @frisco82
Actualización 2011/07/03 01:59 : Añadida mi solución (@blakeyed)
Actualización 2011/07/03 13:52 : Añadida solución de @Rosapolis

Visita otras webs de la red