Compile / install 4.3.2 nodejs

I had some trouble recently trying to compile nodejs under Slackware 14 and I would like to share some notes about it,  just in case someone gets stuck in the same situation.

First of all: there is a precompiled package that should work, so why all the hassle?

Well, I like to compile my own packages. I use Slackware, we don’t have a package manager, we should be able to compile our software ourselves.

Second: slackbuilds can help you

slackbuilds.org has a build script for nodejs 4.2.4 If you are familiar with Slackware, for sure you know what to do with it. But there are three little problems;

  • I want nodejs 4.3.2 and the script is for 4.2.4
  • I am using Slackware 14, not 14.1
  • nodejs wont compile, any version of it

So, I download the script and the 4.3.2 sources, take a peek at nodejs.Slackbuild and modified it to compile the new version:

VERSION=${VERSION:-v4.3.2} #4.2.4

Let’s try it, it’s just a minor version change, it probably works… errr… no. During config, a message alerts that

WARNING: C++ compiler too old, need g++ 4.8 or clang++ 3.4 (CXX=g++)

Damn, Slackware 14 g++ is 4.7.1 !!  I don’t want to update gcc! It is A LOT of trouble! What if I just …

Third: use an alternative version of gcc / g++

Hmm… so install a newer version, tell configure and make that we want to compile using it… that can’t be so difficult.

I will install gcc and g++ from the oficial distro repos. Yes, I know what I said about “compiling my own software”, but NO, I am not compiling gcc. In the distro I trust.

So, get them from here and here and

# mkdir /opt/gcc
# installpkg --root /opt/gcc ./gcc-4.8.2-i486-1.txz
# installpkg --root /opt/gcc ./gcc-g++-4.8.2-i486-1.txz

Now just tell the script to use it.  Let’s add at the beggining of nodejs.Slackbuild

PATH=/opt/gcc/usr/bin:$PATH
export PATH=/opt/gcc/usr/lib/gcc/i486-slackware-linux/4.8.2:$PATH
export CC=/opt/gcc/usr/bin/cc
export CXX=/opt/gcc/usr/bin/g++

This must work now… and… and… NO!

Fourth: assembler error???

Compiling fails saying

{entrada estándar}: Mensajes del ensamblador:
{entrada estándar}:32423: Error: se espera una instrucción de cadena después de `rep'
make[1]: *** [/tmp/MKp/node-v4.3.2/out/Release/obj.target/v8_base/deps/v8/src/api.o] Error 1

After some thinking and testing, I finally realize that the “-march=xxx -mtune=xxx”  options are to blame. How? well, I just tried to compile the source without the build script, and suddenly I realized that what g++ was saying that there was something rotten when translating to assembler if I tried the default slackbuild options, but everything was fabulous when saying just “./.configure;make”

So, I add a new line to the build script, just under the $SLKCFLAGS assignment to override it

SLKCFLAGS="-O2 -pipe"

And… HEY, KNOW WHAT? IT WORKS!

Final thoughts

So, after some wrestling with the bloody nodejs, looks like it doesn’t like how my computer is arch-tuning it… I don’t know if mine is the only case, but for sure this took me some time to solve, so here it is for your compiling pleasure.

Next, I think I will dig into Slackware’s installpkg script, as I can’t find the new gcc/g++ listed under /var/log/packages and I don’t know why…

Publicado en GNU / linux | Deja un comentario

Voronoi / Delaunay GIMP plugin

This plugin will render Voronoi and Delaunay diagrams from a list of random points (sites). It uses Fortune’s algorithm (see libvoronoi.py) which is pretty fast; oddly enough, the slowest by far task in this plugin is the pdb.gimp_paintbrush_default part. Maybe I am doing something wrong…

gimp_voronoi_plugin_dialog

Anyway, try a small number of sites first, and be sure to select a small brush (1 pixel is great) or the diagram will be a blob.


gimp_voronoi_plugin_both gimp_voronoi_plugin_delaunaygimp_voronoi_plugin_voronoi


Extract the plugin to your ~/.gimpX.X/plug-ins folder under Linux or equivalent under Windows. The file py_tesselate.py must be executable.

You will find the plugin under Filters/Render/Tesselate

tesselate_0.1.tar.gz

Publicado en gimp | Deja un comentario

Gimp plugin for BPG

The BPG image format, developed by Fabrice Bellard, is a good alternative to the ubiquitous but very old JPEG. Using the HEVC encoding/compression algorithm, it can store images with a better quality per byte than jpeg, webp or png.  It also allows loseless compression, embedded metadata, and alpha channel. As a big bonus, HEVC enc/dec should be supported by video hardware in the near future, so the most time consuming processes will be vastly accelerated.

This is a (linux) Gimp plugin that uses his libbpg library to import BPG files.  The encoding part (data to BPG) is not yet included in the library,  so there is no export function in this plugin.

If you want to see what BPG is capable of,  look here for a comparison!! Also, take a look at this page; Bellard even wrote a javascript that decodes BPG files on the fly and renders them inside <canvas> elements !

file_bpg-0.1.tar.gz

Publicado en C, english, GNU / linux | 3 comentarios

Agilizando torrentz

El metabuscador www.torrentz.com muestra resultados p2p de Pirate Bay, eztv, monova, etc
Es rápido y bastante limpio, pero podemos hacernos la vida más fácil añadiendo un buscador a Firefox

torrentz-search.xml.tar
(descomprimir en .mozilla/firefox/<usuario>/searchplugins/ )

torrentz_search

y un script para greasemonkey que inserte el enlace a torcache y a IMDB si es una serie o película (basándose en los tags asociados y el formato que se suele dar al nombre del torrent)

// ==UserScript==
// @name        torrentz
// @namespace   http://www.mikropunto.org
// @include     /^https?://www\.torrentz\.(eu|ch|com)/.*/
// @include     /^https?://torrentz\.(eu|ch|com)/.*/
// @version     1.02
// @grant       none
// ==/UserScript==

function wrapper () { // wrapper for injection

  function addCssFile(url) {
      var link = document.createElement('LINK');
      link.rel = 'stylesheet';
      link.type = 'text/css';
      link.href = url;    
      document.body.insertBefore(link, null);    
  }

  addCssFile('//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.css');

  $(".results dt").each(function(i) {
    var match = /<a href="(.*?)">(.*?)<\/a>(.*)/g.exec($(this).html());
    var torrentHash =  match[1].toUpperCase();
    var title = match[2];
    var tags =  match[3];
    var imdb_link = '';
    if (tags && tags.match(/hd|movies|tv|action/)) {
      title = title.replace(/ \d\d\d\d.*$/,'');
      title = title.replace(/ S\d\dE\d\d.*$/,'');
      title = title.replace(/<\/?[^>]+(>|$)/g, ""); // strip tags
      imdb_link = '<a href="http://www.imdb.com/find?q='+title+'" target="_blank"><i class="icon-film"></i></a>';
    };
    var torcache_link = '<a href="http://torcache.net/torrent' + torrentHash + '.torrent" target="_blank"><i class="icon-download"></i></a>';
    $(this).prepend(torcache_link +' ' + imdb_link + ' ');
  });
}

var script = document.createElement("script");
script.type = "application/javascript";
script.textContent = "(" + wrapper + ")();";

document.body.appendChild(script);

nota: este hipervínculo abrirá la página que solicita el .torrent a torcache, si el navegador no lo abre automáticamente, refresca la página y empezará la descarga.

Publicado en greasemonkey | Etiquetado | Deja un comentario

extracting 3d meshes from ANZ files

This is a small C app that will extract static mesh 3d objects from an ANZ file to an OBJ.

Wavefront OBJ is a well known file format, supported by all major 3d editors, but it lacks bone and animation descriptors. This app will only extract meshes, UVs and embedded textures, but will also show bones and animation info if present.

anz2obj_0.9.tar.gz

Publicado en C, GNU / linux | Deja un comentario

extraer modelos 3d de un ANZ

Este es un pequeño programa en C para extraer modelos 3d de archivos ANZ. Como sólo necesitaba la geometría, el formato de salida elegido es Wavefront OBJ, que está muy extendido entre los editores 3d. Por eso, este conversor no extrae huesos ni pesos, sólo las mallas, posibles texturas embebidas y sus UVs. Aún así, muestra información acerca del esqueleto y las animaciones si las hay.

anz2obj_0.9.tar.gz

Publicado en C, GNU / linux | Deja un comentario

AngularJS, mysql, google maps y demasiados datos

AngularJS es una opción estupenda a la hora de escribir una aplicación interactiva; está diseñado para vigilar los cambios en la vista y reaccionar inmediatamente. Cuando se trata de hacer una página que funcione como un programa, el diseño es muy rápido y moderadamente sencillo.

Para una demostración de Los Nombres de Europa, de Alberto Porlan, escribí esta pequeña aplicación (que está desactivada en estos momentos) hace unos meses. Se presentaron varios problemas: para empezar, la base de datos de topónimos hubo que extraerla de un mdb de access que tiene aproximadamente 850.000 entradas. Para hacer más sencilla la búsqueda, convertí los topónimos a un sistema simplificado usando enteros en base 3 usando un script de perl y depurando las excepciones. por otro lado, cada búsqueda implica el cálculo de todos los topónimos cercanos, teniendo en cuenta que es una distancia topográfica y no sobre un plano recto, lo que la hace mucho más lenta. Por último la representación en un mapa de google dio sus problemas; la documentación brillaba por su ausencia.

En un futuro añadiré una búsqueda relacional por tres atingentes y un sistema de estadísticas, que muestren los datos de topónimos relacionados por áreas de la península.

nomeuropae

Cálculo de distancias

Para hallar la distancia entre dos puntos topográficos (a vista de pájaro) hay que tener en cuenta la curvatura terrestre. En este caso he usado la  fórmula del haverseno, ya que permite un cálculo lo suficientemente preciso sin tener que recurrir a algoritmos mucho mas lentos.

CREATE FUNCTION geo_distance(lon0 DECIMAL, lat0 DECIMAL, lon1 DECIMAL, lat1 DECIMAL) RETURNS DECIMAL(3,4)
 BEGIN
 DECLARE distance DECIMAL(3,4) DEFAULT 0;
 SET distance = 6372 * 2 * ASIN(SQRT(POWER(SIN((lat0 - lat1) * PI()/180/2),2) + COS(lon0 * PI()/180) * COS(lat1 * PI() / 180) * POWER(SIN((lon0 - lon1) * PI()/180/2),2) ));
RETURN distance;
END;

nota: El valor 6372 es el radio terrestre medio en km, suficiente para la precisión que se necesita para esta aplicación.

Este procedimiento es rápido, pero se puede mejorar el rendimiento total de una forma muy simple si sólo lo aplicamos entre los valores aproximados, filtrando por sus coordenadas de una forma aproximada:

SELECT *, ...
FROM temp_table JOIN temp_table1
WHERE
 (LON_ROOT BETWEEN temp_table.LON - 0.25 AND temp_table.LON + 0.25)
 AND
 (LAT_ROOT BETWEEN temp_table.LAT - 0.25 AND temp_table.LAT + 0.25)
HAVING ...

 

Publicado en AngularJS | 1 comentario

Renaming files with special characters

There are situations in wich a file containing special characters can be created in your file system, making it hard to remove or rename them as the file manager and even the console won’t escape the name correctly. If the file was created using UTF-8 there is no problem, but if it was first named using a different character set (say, SJIS for instance) or its name is stored in a descriptor (i.e. a ZIP file), Linux won’t be able to open it.

You can still get acces to it via its index node, without using the filename.

(一般コミック) [大友克洋] AKIRA 第01巻.zip

This file was created using Windows. KDE understands the japanese kanji and you can rename or delete it. But when you extract its contents, the file names stored inside the ZIP file do not have any character set associated, so the filesystem does not recognize them.

?????S?t????1_????.png
?????S?t????1_?-??.png
?????S?t????1_???-?+??.png
?????S?t????1_???-????.png
?????S?t????1_???-?-??.png

You can use find to rename them.

First, get their inode using ls -i

12323499 ?????S?t????1_????.png
12323351 ?????S?t????1_?-??.png
12323581 ?????S?t????1_???-?+??.png
12323418 ?????S?t????1_???-????.png
12323479 ?????S?t????1_???-?-??.png

Then using find …


$ find . -maxdepth 1 -inum 12323499  -exec mv '{}' ./akira_01.png \;

And so the file gets renamed.

To do this for a group of files in a subdirectory we will use a counter


$ let c=0;for i in `ls *.png -i|cut -d ' ' -f1`; \
do let c=c+1 ;  \
find *.png -maxdepth 1 -inum $i -exec mv '{}' ./AKIRA_01_$c.png \;  ; \
done

so files get their new readable name

AKIRA_01_1.png
AKIRA_01_2.png
AKIRA_01_3.png
AKIRA_01_4.png
AKIRA_01_5.png

Note: you must end the mv command given by -exec with ; before exiting the loop with ;done. Also, it is a good practice to prepend the semicolon with a \ to prevent the special characters messing with the mv.

Publicado en english, GNU / linux | Deja un comentario

Renombrar archivos con caracteres especiales

Cuando se crea un archivo con determinados caracteres especiales, puede llegar a ser dificil eliminarlo o renombrarlo. Si el archivo se ha copiado desde internet o desde un dispositivo externo  y el conjunto de caracteres establecido en el sistema es UTF-8, generalmente no hay problema; se puede acceder a él desde el entorno de ventanas o la terminal. Pero si se ha generado automáticamente (al ser descomprimido, por ejemplo), linux no reconocerá los caracteres y no se podrá leer ni eliminar.

La solución es acceder a él usando una terminal mediante su nodo, evitando el problema que supone usar su nombre.

(一般コミック) [大友克洋] AKIRA 第01巻.zip

Este archivo se ha creado en windows. Al copiarlo conserva los kanji japoneses y KDE permite operar con él normalmente, pero al descomprimirlo aparecen otros archivos cuyos nombres no son interpretados como válidos

?????S?t????1_????.png
?????S?t????1_?-??.png
?????S?t????1_???-?+??.png
?????S?t????1_???-????.png
?????S?t????1_???-?-??.png

Usando find se puede acceder a ellos y cambiar su nombre.

Para cambiar uno sólo, primero se obtiene su índice de nodo con ls -i

$ ls -i

12323499     ?????S?t????1_????.png
12323351     ?????S?t????1_?-??.png
12323581     ?????S?t????1_???-?+??.png
12323418     ?????S?t????1_???-????.png
12323479     ?????S?t????1_???-?-??.png

Despúes usando find…

$ find . -maxdepth 1 -inum 12323499  -exec mv '{}' ./akira_01.png \;

Y el archivo cambia de nombre.

Para cambiarlos todos en masa, asignando un número incremental

$ let c=0; \
for i in `ls *.png -i|cut -d ' ' -f1`; do let c=c+1 ; \
find *.png -maxdepth 1 -inum $i -exec mv '{}' ./AKIRA_01_$c.png \; ; \
done

Los archivos quedan como

AKIRA_01_1.png
AKIRA_01_2.png
AKIRA_01_3.png
AKIRA_01_4.png
AKIRA_01_5.png

Atención: hay que tener en cuenta que el penúltimo ; termina la orden dada con exec, así que si no se añade, bash devolverá un error de find: falta el argumento de `-exec’. Además es conveniente añadir el caracter de escape \ para prevenir posibles efectos derivados de la interpretación de los caracteres especiales.

Publicado en GNU / linux | Etiquetado , | Deja un comentario