Le blog de Jean David TECHER, un Réunionnais à Saint-Priest/Lyon

Aller au contenu | Aller au menu | Aller à la recherche


< 1 2 3 4 5 6 7 8 9 10 11 12 13 14 >

dimanche 1 juin 2008

Installation de FreePascal 2.2.0 sous Gutsy Gibbon et test avec PostgreSQL 8.3

Le compilateur FreePascal (FPC) permet de se connecter à une base de données PostgreSQL. Ici nous allons voir un exemple d'utilisation. On procédera successivement à

  1. l'installation de FPC sous Ubuntu Gutsy Gibbon;
  2. la mise en place de la base de données et de la table pour le test.
  3. l'élaboration d'un petit programme en Pascal qui se connectera à la base de données.

1. Installationde FPC

Il faut commencer par installer le paquet bourré de binaires près à l'emploi. Ce qu'il y a de bien c'est qu'il est livré avec ce qu'il faut pour utiliser PostgreSSQL. On le télécharge à ftp://ftp.no.freepascal.org/pub/fpc/dist/i386-linux-2.2.0/fpc-2.2.0.i386-linux.tar

Ensuite
mkdir freepascal
cd freepascal
mv ../fpc-2.2.0.i386-linux.tar .
tar xvf  fpc-2.2.0.i386-linux.tar
sh install.sh
En guise d'installation, on aura l'affichage suivant
david@bremko:~/freepascal$ sh install.sh 
This shell script will attempt to install the Free Pascal Compiler
version 2.2.0 with the items you select

Install prefix (/usr or /usr/local)  [/home/david/fpc-2.2.0] : 
Installing compiler and RTL for i386-linux...
Installing utilities...
Install Textmode IDE (Y/n) ? Y
Install FCL (Y/n) ? Y
Installing fcl-base
Installing fcl-db
Installing fcl-fpcunit
Installing fcl-image
Installing fcl-net
Installing fcl-passrc
Installing fcl-registry
Installing fcl-web
Installing fcl-xml
Install packages (Y/n) ? Y
Installing a52
Installing bfd
Installing cairo
Installing cdrom
Installing dbus
Installing dts
Installing fftw
Installing forms
Installing fpgtk
Installing fpmkunit
Installing fv
Installing gconf
Installing gdbint
Installing gdbm
Installing ggi
Installing gnome
Installing graph
Installing gtk2
Installing gtk
Installing hash
Installing httpd-1
Installing httpd-2
Installing httpd-2
Installing ibase
Installing imlib
Installing ldap
Installing libasync
Installing libc
Installing libcurl
Installing libgd
Installing libpng
Installing mad
Installing modplug
Installing mysql
Installing ncurses
Installing netdb
Installing newt
Installing odbc
Installing oggvorbis
Installing openal
Installing opengl
Installing openssl
Installing oracle
Installing pasjpeg
Installing paszlib
Installing pcap
Installing postgres
Installing pthreads
Installing regexpr
Installing sqlite
Installing svgalib
Installing syslog
Installing tcl
Installing unixutil
Installing unzip
Installing utmp
Installing uuid
Installing x11
Installing zlib
Installing zvt
Done.

Install documentation (Y/n) ? Y
Installing documentation in /home/david/fpc-2.2.0/share/doc/fpc-2.2.0 ...
Done.

Install demos (Y/n) ? Y
Install demos in [/home/david/fpc-2.2.0/share/doc/fpc-2.2.0/examples] : 
Installing demos in /home/david/fpc-2.2.0/share/doc/fpc-2.2.0/examples ...
Done.

Running on linux
No write premission in /etc.
Found libgcc.a in .
/home/david/fpc-2.2.0/lib/fpc/2.2.0/samplecfg: 148: fpc: not found
Writing sample configuration file to /home/david/.fpc.cfg

End of installation.

Refer to the documentation for more information.

2. Mise en place de la base de données

Ici les tests ont lieu avec PostgreSQL 8.3. On se créed'abord une petit base pour nos tests. Connectons-nous donc en tant q'utilisateur postgres
su postgres
export PATH=/usr/local/pgsql/bin:$PATH
export PGDATA=/mnt/pgdata
pg_ctl start
createdb dbblob
Créons la table qui contiendra nos données
create table testblob(numero serial,nom text,source oid)with oids;
Le but ici est d'insérer des images en base

3. Tests

On élabore donc le programme pgimg.pas dont le contenu est
Program testpg;

Uses postgres,strings,sysutils,strutils;

Procedure usage();

begin
   writeln('- permet d''importer une image en base');
   writeln('- pgimg dbname=<database> img=<path_to_image>');
   writeln('Exemple: pgimg dbname=mabasededonnees img=/home/toto/tata.png');
   halt(1);
end;

Procedure exit_nicely(Conn : PPGconn);

begin
  PQfinish(conn);
  halt(1);
end;


Var
  pghost,pgport,pgoptions,pgtty,dbname,img : Pchar;
  nFields,i : longint;
  conn : PPGConn;
  res,sel : PPGresult;
  dummy,stdummy : string;

begin
  pghost := 'localhost';       
  pgport := '5432';       
  pgoptions := NiL;    
  pgtty := NiL; 
  if (paramcount<>2) then
  begin
   usage;
 end;
  if (paramcount=2) then
    begin
    dbname := 'xxx';
    img := 'xxx';
     if AnsiContainsStr(paramstr(1),'dbname=') then
      begin
    	dummy:=paramstr(1)+#0;
    	dbname:=@dummy[8];
      end;
     if AnsiContainsStr(paramstr(2),'img=') then
      begin
    	stdummy:=paramstr(2)+#0;
    	img:=@stdummy[5];
      end;    
    writeln('dbname => ',dbname,' img =>' ,img); 
    end
  else
    ;

  { make a connection to the database }
  conn := PQsetdb(pghost, pgport, pgoptions, pgtty, dbName);


  if (PQstatus(conn) = CONNECTION_BAD) then
    begin
    Writeln (stderr, 'Connection to database ',dbname,' failed.');
    Writeln (stderr, PQerrorMessage(conn));
    exit_nicely(conn);
    end;

  res := PQexec(conn, Pchar('INSERT INTO testblob(nom,source) VALUES ('''+ExtractFileName(img)+''',lo_import('''+img+'''));'));
  if (PQresultStatus(res) <> PGRES_COMMAND_OK) then
    begin
    Writeln (stderr, 'Insertion n''a pas réussie!');
    PQclear(res);
    exit_nicely(conn);
  end;


   sel := PQexec(conn,Pchar('SELECT * FROM testblob WHERE nom='''+ExtractFileName(img)+''''));

  nFields := PQnfields(sel);
  Writeln('|',PQfname(sel, 0),'|',PQfname(sel, 1),'|',PQfname(sel, 2),'|');
 { writeln ('+----+------------------+');}

  { next, print out the instances }
  for i := 0 to PQntuples(sel)-1 do
    begin
    write('|',PQgetvalue(sel, i, 0),' ');
    write('|',PQgetvalue(sel, i, 1),' ');
    write('|',PQgetvalue(sel, i, 2),' ');
    writeln ('|');
    end;
 
  PQclear(sel);
  PQclear(res);

  { close the connection to the database and cleanup }
  PQfinish(conn);
end.
Pour la compilation
./fpc-2.2.0/bin/fpc -Fl/usr/local/pgsql/lib/ pgimg.pas
ou si on préfère
./fpc-2.2.0/bin/fpc -Fl$(pg_config --libdir) pgimg.pas
Pour l'utilisation
PGUSER=postgres ./pgimg dbname=dbblob img=/home/david/jana/jana-experimental02-set1/JANA-EXPERIMENTAL02-SET1.JPG
Si par exemple, on a tout un répertoire contenant des images
for file in $(ls /home/david/jana/jana-experimental02-set1/*.JPG);do PGUSER=postgres ./pgimg dbname=dbblob img=${file};done
On peut vérifier que tout a bien été importé
dbblob=# select * from testblob ;
 numero |               nom               | source 
--------+---------------------------------+--------
      1 | JANA-EXPERIMENTAL02-SET1-01.JPG |  24685
      2 | JANA-EXPERIMENTAL02-SET1-02.JPG |  24687
      3 | JANA-EXPERIMENTAL02-SET1-03.JPG |  24689
      4 | JANA-EXPERIMENTAL02-SET1-04.JPG |  24691
      5 | JANA-EXPERIMENTAL02-SET1-05.JPG |  24693
      6 | JANA-EXPERIMENTAL02-SET1-06.JPG |  24695
      7 | JANA-EXPERIMENTAL02-SET1-07.JPG |  24697
      8 | JANA-EXPERIMENTAL02-SET1-08.JPG |  24699
      9 | JANA-EXPERIMENTAL02-SET1-09.JPG |  24701
     10 | JANA-EXPERIMENTAL02-SET1-10.JPG |  24703
     11 | JANA-EXPERIMENTAL02-SET1-11.JPG |  24705
     12 | JANA-EXPERIMENTAL02-SET1-12.JPG |  24707
     13 | JANA-EXPERIMENTAL02-SET1-13.JPG |  24709
     14 | JANA-EXPERIMENTAL02-SET1-14.JPG |  24711
     15 | JANA-EXPERIMENTAL02-SET1-15.JPG |  24713
     16 | JANA-EXPERIMENTAL02-SET1-16.JPG |  24715
     17 | JANA-EXPERIMENTAL02-SET1.JPG    |  24717
     18 | JANA-EXPERIMENTAL05-SET1-01.JPG |  24719
     19 | JANA-EXPERIMENTAL05-SET1-03.JPG |  24721
     20 | JANA-EXPERIMENTAL05-SET1-11.JPG |  24723
     21 | JANA.JPG                        |  24725

Faire un collage de plusieurs images

ImageMagick fournit un utilitaire montage qui peut s'avérer très puissant pour coller à la suite des images et en faire un fond d'écran Par exemple pour coller les images

montage JANA-EXPERIMENTAL05-SET1-01.JPG JANA-EXPERIMENTAL02-SET1-03.JPG JANA-EXPERIMENTAL02-SET1-04.JPG\
 JANA-EXPERIMENTAL02-SET1-09.JPG JANA-EXPERIMENTAL05-SET1-03.JPG ../jana6/JANA17.JPG JANA-EXPERIMENTAL02-SET1-10.JPG \
JANA-EXPERIMENTAL02-SET1-12.JPG JANA-EXPERIMENTAL02-SET1-13.JPG ../jana6/JANA19.JPG \
-geometry 330x527 -tile 5x2 JANA.JPG
Ici j'ai listé les images de gauche à drote pour qu'elle tienne sur deux rangées de 5 images par ligne. L'image finale est JANA.JPG Pour obtenir les dimensions de l'image d'output, on installe libimage-size-perl
apt-get install libimage-size-perl
puis on fait
for img in JANA.JPG;do echo "dimension de $(basename ${img}):$(imgsize -r ${img})";done
dimension de JANA.JPG:1650 1054
Pour obtenir une imagette (réduire l'image d'un rapport de 4 par exemple), il faut d'abord calculer les nouvelles dimensions
 for dim in $(imgsize -r JANA.JPG);do echo $(expr ${dim} / 4);done
412
263
On utilise ensuite convert pour obtenir l'imagette
convert JANA.JPG -resize 412x263 jana.jpg
Au finale, on a l'image suivante

Imagette résultante du collage d'images
On en fait de belles choses avec Linux......notamment avec Jana Defi...

samedi 26 avril 2008

Encodage de fichier wmv et mov en flv etflv-player

C'est sur ma Ubuntu Feisty Studio que j'ai fait les conversions wmv--> flv.

Installation des Win32 Codecs sous Ubuntu Studio

Il me manquait les win32codecs. Pour les installer, il suffit de suivre les directives de http://doc.ubuntu-fr.org/w32codecs. Ce qui donne donc pour l'installation:
cd
wget http://www1.mplayerhq.hu/MPlayer/releases/codecs/essential-20061022.tar.bz2
mkdir /usr/lib/win32
tar xvjf  essential-20061022.tar.bz2
cp essential-20061022/* /usr/lib/win32/

Encodage en flv

Pour encoder des fichiers flv:

for i in *.wmv;
do video=$(basename ${i} .wmv); 
mencoder $i -forceidx -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -of lavf  \
-oac mp3lame -lameopts abr:br=56 -srate 22050 -ovc lavc -lavcopts \
vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -vf scale=320:240 -o flv/${video}.flv; \
done
La ligne video=$(basename ${i} .wmv); est super pratique car elle permet de récupérer le nom d'un fichier sans le suffixe de l'extension. Au moins maintenant j'ai le son avec la vidéo

Le lecteur Flash flv-player

Les lecteurs Fash ne manquent pas sur internet. Un que j'ai de suite adopté c'est flv-player dont le site est http://flv-player.net/players/maxi/generator/ qui est très bien car il fourni un générateur de code qu'il suffti ensuite de copier dans son blog

Générerdes imagettes du film

Il faut avoir php compilé avec l'extension ffmpeg-php. Le script suivant que l'on invoque en ligne de commande par
php -q test_ffmepg.php
est disponible dans les sources de ffmpeg-php Je l'ai un peu arrangé à ma sauce histoire d'avoir 12 images en sortie. SOn contenu est le suivant
<?
/*
 * This test script is not part of the automatic regression tests. It serves
 * as a simple manual test script and an example of the syntax for calling
 * the ffmpeg-php functions
 *
 * To run it from the command line type 'php -q ffmpeg_test.php 'or from a
 * browser * copy this file into your web root and point your browser at it.
 */

$extension = "php_ffmpeg";
$extension_soname = $extension . "." . PHP_SHLIB_SUFFIX;
$extension_fullname = PHP_EXTENSION_DIR . "/" . $extension_soname;

// load extension
//if (!extension_loaded($extension)) {
//    dl($extension_soname) or die("Can't load extension $extension_fullname\n");
//}
if ( extension_loaded('ffmpeg') != 1)
{
    switch (PHP_OS)
    {
     case "WINNT": $php_suffix = ".dll";
                    break;

     default:  $php_suffix = ".so";
               break;
    }
  dl("ffmpeg.".PHP_SHLIB_SUFFIX);
}
if (php_sapi_name() != 'cgi') {
    echo '<pre>';
}

printf("ffmpeg-php version string: %s\n", FFMPEG_PHP_VERSION_STRING);
printf("libavcodec build number: %d\n", LIBAVCODEC_BUILD_NUMBER);
printf("libavcodec version number: %d\n", LIBAVCODEC_VERSION_NUMBER);
printf("libavcodec build number: %d\n", LIBAVCODEC_BUILD_NUMBER);

print_class_methods("ffmpeg_movie");
print_class_methods("ffmpeg_frame");
print_class_methods("ffmpeg_animated_gif");

// get an array for movies from the test media directory
$movies = getDirFiles('/var/www/videos/jana/videos');//dirname(__FILE__) . '/tests/test_media');

echo "--------------------\n\n";
foreach($movies as $movie) {
    $mov = new ffmpeg_movie($movie);
    printf("file name = %s\n", $mov->getFileName());
    printf("duration = %s seconds\n", $mov->getDuration());
    printf("frame count = %s\n", $mov->getFrameCount());
    printf("frame rate = %0.3f fps\n", $mov->getFrameRate());
    printf("comment = %s\n", $mov->getComment());
    printf("title = %s\n", $mov->getTitle());
    printf("author = %s\n", $mov->getAuthor());
    printf("copyright = %s\n", $mov->getCopyright());
    printf("get bit rate = %d\n", $mov->getBitRate());
    printf("has audio = %s\n", $mov->hasAudio() == 0 ? 'No' : 'Yes');
    if ($mov->hasAudio()) {
        printf("get audio codec = %s\n", $mov->getAudioCodec());
        printf("get audio bit rate = %d\n", $mov->getAudioBitRate());
        printf("get audio sample rate = %d \n", $mov->getAudioSampleRate());
        printf("get audio channels = %s\n", $mov->getAudioChannels());
    }
    printf("has video = %s\n", $mov->hasVideo() == 0 ? 'No' : 'Yes');
    if ($mov->hasVideo()) {
        printf("frame height = %d pixels\n", $mov->getFrameHeight());
        printf("frame width = %d pixels\n", $mov->getFrameWidth());
        printf("get video codec = %s\n", $mov->getVideoCodec());
        printf("get video bit rate = %d\n", $mov->getVideoBitRate());
        printf("get pixel format = %s\n", $mov->getPixelFormat());
        printf("get pixel aspect ratio = %s\n", $mov->getPixelAspectRatio());
        printf("get frame = %s\n", is_object($mov->getFrame(10)) ? 'true' : 'false');
        printf("get frame number = %d\n", $mov->getFrameNumber());
    }

$duration =intval( $mov->getFrameCount()/12.0);
for($IterFrame=1;$IterFrame<13;$IterFrame++){
$frame = $duration * $IterFrame;
$filename = $mov->getFileName();
$imgfilename =  dirname($filename)."/../images_max/".str_replace(".flv","_".$IterFrame."_.png",basename($filename));

$ff_frame = $mov->getFrame($frame);
if ($ff_frame) {
    $gd_image = $ff_frame->toGDImage();
    if ($gd_image) {
        $imgtmp = $imgfilename."tmp";
        printf("Génération de  l'image = %s...", $imgfilename);
        imagepng($gd_image,$imgtmp);
        resize_png($imgtmp, $imgfilename,184,144);
        imagedestroy($gd_image);
        printf("...[OK]\n");
       unlink($imgtmp);
    }
}
}


    echo "\n--------------------\n\n";
}

if (php_sapi_name() != 'cgi') {
    echo '</pre>';
}

/* FUNCTIONS */
function print_class_methods($class) {
    echo "\nMethods available in class '$class':\n";
    $methods = get_class_methods($class);
    if (is_array($methods)) {
        foreach($methods as $method) {
            echo $method . "\n";
        }
    } else {
        echo "No Methods Defined\n";
    }
}

function getDirFiles($dirPath)
{
    if ($handle = opendir($dirPath))
    {
        while (false !== ($file = readdir($handle))) {
            $fullpath = $dirPath . '/' . $file;
            if (!is_dir($fullpath) && $file != "CVS" && $file != "." && $file != "..")
                $filesArr[] = trim($fullpath);
        }
        closedir($handle);
    }

    return $filesArr;
}


function resize_png($src,$dst,$dstw,$dsth) {
    list($width, $height, $type, $attr) = getimagesize($src);
    $im = imagecreatefrompng($src);
    $tim = imagecreatetruecolor($dstw,$dsth);
    imagecopyresampled($tim,$im,0,0,0,0,$dstw,$dsth,$width,$height);
//    $tim = ImageTrueColorToPalette2($tim,false,255);
    imagepng($tim,$dst);
}
?>

jeudi 14 juin 2007

Capture d'écran/fenêtre avec scrot

scrot pour SCReenhOT est un outil bien sympathique pour faire des captures d'écran ou des captures de fenêtres. Son utilisation en simple ligne de commande est vraiment des plus rudimentaires. Pour l'installer

apt-get install scrot
Pour l'utiliser, le premier conseil que je puisse donner est de faire
man scrot
pour obtenir une aide contextuelle de son utilisation. En plus il regorge d'options. Supposons que je veuilles sur le bureau suivant
avoir une capture de mon client de messageries thunderbird.
sleep 3; scrot -b -s 'thunderbird-%Y-%m-%d.png' -t 75
En m'inspirant de http://www.commentcamarche.net/faq/sujet-6019-capture-d-ecran-avec-scrot
  • sleep 3 d'attendre 3 secondes, le temps nécessaire pour aller cliquer sur la fenêtre qui m'intéresse;
  • -b et -s sont expliqués à http://www.commentcamarche.net/faq/sujet-6019-capture-d-ecran-avec-scrot;
  • thunderbird-%Y-%m-%d.png va me permettre de nommer mon image en thunderbird-"année"-"mois"-"jour". J'aurais donc une image nommée par exemple thunderbird-2007-06-13.png;
  • -t 75 me permet de définir une miniature de mon image, ici à 75%.
Ainsi j'aurais deux images thunder-2007-06-13.png et thunderbird-2007-06-13-thumb.png (miniature). Et la minitature se présentera par exemple comme-ceci: