Il y a quelques années, j'ai rencontré le projet FreePascal et Lazarus.
Si FreePascal était déjà capable de compiler du code Delphi, il restait encore un long chemin à parcourir.
Lazarus de son côté devait encore fortement évoluer.
Ce matin, je suis tombé sur cette vidéo (certes en Allemand) qui montre comment installer FreePascal + Lazarus sur Ubunu (vraiment simple puisque disponible depuis la logithèque).
Voici la vidéo, juste pour vous faire une petite idée:
L'IDE est visible en fin de vidéo.
mardi 10 avril 2012
vendredi 6 avril 2012
Comment automatiser les backups PostGreSql
Voici une bonne référence "How to automate PostGresSql backup from Command Line Shell".
Même si l'article est prévu pour Unix, il fait au moins appel à des commandes communes.
Même si l'article est prévu pour Unix, il fait au moins appel à des commandes communes.
lundi 2 avril 2012
PostgreSql - Transation Serializable & SELECT FOR UPDATE
Il semblerait que l'isolation des transactions de type "Serialized" ne soit pas totalement fiable en PostgreSql (je ne remets malheureusement pas la main sur le PDF expliquant ce problème... vive Internet).
C'est fort gênant si l'on veut créer un compteur sécurisé partagé entre plusieurs processus (comme en Sql Serveur).
Le cas échéant, il est possible de se rabattre sur les SELECT FOR UPDATE.
Je vous propose la lecture de l'article "Postgresql - SELECT FOR UPDATE example" de Walter.
Grâce à SELECT FOR UPDATE il est possible d'obtenir un résultat similaire au mode "Serialize" et de créer un compteur InterProcessus sécurisé :-)
jeudi 29 mars 2012
Debug file en Clipper
Introduction
Pouvoir disposer d'un outil de debugging minimal peut revêtir une importance capitale.
C'est encore plus vrai lorsque l'on maintient un vieux logiciel en Clipper (re-compilé avec Harbour + Visual Studio C++ 2008).
Comme je compile le soft en ligne de commande, je n'ai pas cette chance de pouvoir disposer d'un déboggeur ARFF!
Je voulais donc utiliser d'un fichier de déboggage et d'une fonction DMSG (Debug Message) me permettant de laisser des traces dans ce fichier de trace. Fichier bien utile car il permet de capturer des informations sur le fonctionnement du programme.
Clipper à prévu le coup avec les commandes "SET ALTERNATE TO" permettant de rediriger la sortie de la console vers un fichier. Idéal pour laisser une trace :-)
Malheureusement pour moi, cette fonctionnalité est déjà utilisé à d'autres fins... a moi donc d'utiliser un autre procédé pour y arriver.
FT_FUSE - manipulation de fichier
Il existe heureusement les fonction FT_FUSE et consort!
Voici l'implémentation de la procédure DMSG, une fonction qui écrit des message dans un fichier "debug.log".
Cette fonction utilise également la variable globale dbgLineCount pour incrémenter le numéro de ligne.
L'appel se résume à:
Et le contenu du fichier debug ressemble à ceci:
En savoir plus sur la manipulation de fichier en Clipper
Vous trouverez des informations sur les opérations fichier dans les références suivantes
Je me permet de reprendre le contenu ci-dessous (car il est trop précieux pour prendre le risque qu'il soit perdu!)
Pouvoir disposer d'un outil de debugging minimal peut revêtir une importance capitale.
C'est encore plus vrai lorsque l'on maintient un vieux logiciel en Clipper (re-compilé avec Harbour + Visual Studio C++ 2008).
Comme je compile le soft en ligne de commande, je n'ai pas cette chance de pouvoir disposer d'un déboggeur ARFF!
Je voulais donc utiliser d'un fichier de déboggage et d'une fonction DMSG (Debug Message) me permettant de laisser des traces dans ce fichier de trace. Fichier bien utile car il permet de capturer des informations sur le fonctionnement du programme.
Clipper à prévu le coup avec les commandes "SET ALTERNATE TO" permettant de rediriger la sortie de la console vers un fichier. Idéal pour laisser une trace :-)
Malheureusement pour moi, cette fonctionnalité est déjà utilisé à d'autres fins... a moi donc d'utiliser un autre procédé pour y arriver.
FT_FUSE - manipulation de fichier
Il existe heureusement les fonction FT_FUSE et consort!
Voici l'implémentation de la procédure DMSG, une fonction qui écrit des message dans un fichier "debug.log".
Cette fonction utilise également la variable globale dbgLineCount pour incrémenter le numéro de ligne.
#include "fileio.ch"
...
&& DMSG - Debugging Message
&& line counter for DMSG procedure
PUBLIC dbgLineCount
dbgLineCount = 0
...
*****************
PROCEDURE DMSG
*****************
* Write a debug.log file by inserting records on the top of the file
* If the file is not present, nothing is written into it
* see FT_USE @ http://www.ousob.com/ng/nanfor/ng2319d.php
* see FILE I/O @ http://www.itk.ru/clip-doc.en/categfileio.html
* beautiful sample @ http://www.groupsrv.com/computers/about324430.html
*
* 27/03/2012 - WARNING function is buggy and may turns into infinite loop !
* 29/03/2012 - Fixed :-)
parameters sMsg
private hFile
private sToWrite
dbgLineCount = dbgLineCount + 1 && Line counter
dbgFilename = "c:\stock\debug.log"
ft_fselect(1)
hFile := fopen(dbgFilename, FO_READWRITE + FO_SHARED)
hFile := ft_fuse(dbgFilename)
if hFile < 0
return
endif
* Data to write in the Debug File (place CR/LF at the end of file)
sToWrite = Str(dbgLineCount) + " " + TIME() + " " + sMsg + chr(13) + chr(10)
* Write a buffer
fwrite(hFile,sToWrite)
* close file
FT_FUSE()
return
L'appel se résume à:
DO DMSG WITH "L477:replace FAMI with TheResult"Note: le "DO" n'est normalement pas nécessaire, il passe les arguments par référence.
Et le contenu du fichier debug ressemble à ceci:
3 11:35:05 ------------------- STARTING STOCK ------------------------
4 11:35:12 0000, main menu exit, SET PRINT OFF
5 11:35:15 SAYA050 : Say Article - ENTER
6 11:35:15 before call xaFami(Fami) - validation of fami
7 11:35:15 L477:replace FAMI with TheResult
8 11:35:15 after call xaFami(Fami)
9 11:35:15 SAYA050 : Say Article - LEAVE
10 11:35:18 BEFORE SUIVANT - will exec skip
En savoir plus sur la manipulation de fichier en Clipper
Vous trouverez des informations sur les opérations fichier dans les références suivantes
- FT_USE http://www.ousob.com/ng/nanfor/ng2319d.php
- FILE I/O http://www.itk.ru/clip-doc.en/categfileio.html
Je me permet de reprendre le contenu ci-dessous (car il est trop précieux pour prendre le risque qu'il soit perdu!)
//*
//* privsmnu.prg source code
//*
#include "fileio.ch"
//* function load temporary privilege dbf
Function Prv_qProcess
local iEmpnum, iCcde, iUsrid, iSysid
local iPrecust, iSecpack, iUsrpriv
local prvEmpnum, prvCcde, prvUsrid, prvSysid
local prvPrecust, privSecpack, prvUsrpriv
local cntmsg, qUsr, dUsr, mycnt := 0
local mrt, mrb, mcl, mcr, msg_scrn
local rFilename, tmpFilename
tmpFileName := popupdir('C:\IAREVAL\INPUT\*.txt','D','Select Compare file',;
"w+/b,w+/r",.t.)
rFilename := "C:\IAREVAL\INPUT\" + tmpFilename
gFilename := "C:\IAREVAL\REPORTS\GAPFILE.TXT"
mFilename := "C:\IAREVAL\REPORTS\INMASTER.TXT"
if varlen(rFileName) < 20
return
end
ft_fselect(1)
rfile := ft_fuse(rFilename)
ft_fselect(2)
gFile := fcreate(gFilename,FO_READWRITE)
gFile := fopen(gFilename, FO_READWRITE + FO_SHARED)
gFile := ft_fuse(gFilename)
ft_fselect(3)
mFile := fcreate(mFilename,FO_READWRITE)
mFile := fopen(mFilename, FO_READWRITE + FO_SHARED)
mFile := ft_fuse(mFilename)
qUsr := ft_dispmsg( { { "Press [Y] to continue with", ;
"process. Press any other ", ;
"key to abort the process. " }, ;
{ "r/w", "r/w", "r/w" } } , ;
"Y" )
if qUsr = .t.
use PRIVQDBF index PRIVQDBF shared new
plswait(.t.,"Processing compare...")
ft_fselect(1)
rFile := ft_fuse(rFilename)
ft_fgotop()
do while ! ft_feof()
* read line
rline = ft_freadln(rFile)
mycnt = mycnt + 1
iEmpnum := substr(rline, 1, 6)
iCcde := substr(rline, 18, 3)
iUsrid := substr(rline, 28, 20)
iSysid := substr(rline, 49, 1Cool *** probablement iSysid := substr(rline, 49, 18)
iPrecust := substr(rline, 68, 20)
iSecpack := substr(rline, 89, 16)
iUsrpriv := substr(rline,106, 45)
iRevFile := substr(rline,152, 44)
select PRIVQDBF
dbgotop()
do while !eof()
BEGIN SEQUENCE
if iEmpnum = Empnum .and. iCcde = Ccde .and. iUsrid = Usrid ;
.and. iSysid = Sysid .and. iSecPack = Secpack .and. iUsrpriv =
Usrpriv
//* write dbf record to txt file *//
tmplne := empnum + ccde + usrid + sysid + precust + secpack +
usrpriv + revfile
fwrite(mfile,tmplne)
BREAK
else
forget()
skip
endif
End
end
//* record not found - write to gap file *//
tmplne := iEmpnum + iCcde + iUsrid + iSysid + iPrecust + iSecpack +
iUsrpriv + iRevfile
fwrite(gfile,tmplne)
tmplne := ""
ft_fselect(1)
ft_fskip()
enddo
close all
plswait(.f.)
msg_scrn = savescreen(0,0,Maxrow(),79)
msgcolor = "n/w,n/w,,,n/w"
setcolor(msgcolor)
mrt := maxrow()/2-2
mrb := maxrow()/2+1
mcl := maxcol()/2-9
mcr := maxcol()/2+9
clearbox(mrt,mcl,mrb,mcr,'Single')
@mrt+1,mcl+1 say " # Records read:"
@mrt+2,mcl+3 say " ==> " + ltrim(str(mycnt))
inkey(20)
setcolor(defColor)
restscreen(0,0,Maxrow(),79,msg_scrn)
endif
return nil
*: Eof: privsmnu.prg
jeudi 22 mars 2012
Guide de référence du langage Clipper
Si un jour vous avez besoin de référence sur la programmation clipper, allez donc jeter un œil ici.
- CA-Clipper 5.3 . Guide To CA-Clipper - Norton Guide
- Frequently Asked Questions (FAQ 2.31) about CA-Clipper
Idéal pour en apprendre beaucoup à propos de Clipper - CA-CLIPPER 5.x Memory Management
Vraiment pas mal non plus
BeagleBone, une plateforme de prototypage Linux.
28/03/2012: Le produit est disponible à la vente sur MCHobby.be :-)
22/03/2012: Article initialement paru sur Arduino Notepad, je pense qu'il intéresserait aussi les développeurs. Apparition prochaine de ce produit sur MCHobby.
Pour ceux qui s'intéressent à la programmation des micro-contrôleurs et un peu au monde Unix, je viens de faire la découverte de BeagleBoard.
C'est une carte de prototypage à mis chemin entre la plateforme Arduino et un PC Linux.
C'est une métaphore un peu radicale mais c'est exactement ce à quoi cela ressemble.
BeagleBone se présente comme une plateforme totalement indépendante... même pas besoin d'installer un environnement de développement et de la documentation, tout se trouve déjà sur la carte BeagleBone (qui dispose quand même de 2Go).
J'ai eu l'occasion de visionner la vidéo de Matt Richardson à propos de BeagleBone et je dois bien admettre être tombé sous le charme.
Cette petite vidéo montre comment mettre le pied à l'étrier avec BeagleBone, comment commencer à adresser les sorties (avec une LED) et même comment utiliser Python comme langage de programmation!
BeagleBone est une plateforme très excitante pour MCHobby.
MCHobby fonctionne entièrement sous Linux et forcement, l'approche de BeagleBone retient notre attention.
BeagleBone dispose d'un accès Internet (prise Ethernet) et sait faire un wget!
Python est aussi un langage que j'ai personnellement pratiqué par le passé (voir les articles sur Developer Notepad) et forcement c'est encore un point de plus en faveur de BeagleBone.
Il n'est pas nécessaire de connaître Python pour jouer avec BeagleBone. Vous pourrez trouvez toute l'information nécessaire sur le Net (la communauté BeagleBone est aussi active que celle d'Arduino).
Ressources
Pour plus d'information, je vous recommande les liens suivants:
22/03/2012: Article initialement paru sur Arduino Notepad, je pense qu'il intéresserait aussi les développeurs. Apparition prochaine de ce produit sur MCHobby.
Pour ceux qui s'intéressent à la programmation des micro-contrôleurs et un peu au monde Unix, je viens de faire la découverte de BeagleBoard.
![]() |
| Carte BeagleBone |
C'est une carte de prototypage à mis chemin entre la plateforme Arduino et un PC Linux.
C'est une métaphore un peu radicale mais c'est exactement ce à quoi cela ressemble.
BeagleBone se présente comme une plateforme totalement indépendante... même pas besoin d'installer un environnement de développement et de la documentation, tout se trouve déjà sur la carte BeagleBone (qui dispose quand même de 2Go).
J'ai eu l'occasion de visionner la vidéo de Matt Richardson à propos de BeagleBone et je dois bien admettre être tombé sous le charme.
Cette petite vidéo montre comment mettre le pied à l'étrier avec BeagleBone, comment commencer à adresser les sorties (avec une LED) et même comment utiliser Python comme langage de programmation!
BeagleBone est une plateforme très excitante pour MCHobby.
MCHobby fonctionne entièrement sous Linux et forcement, l'approche de BeagleBone retient notre attention.
BeagleBone dispose d'un accès Internet (prise Ethernet) et sait faire un wget!
Python est aussi un langage que j'ai personnellement pratiqué par le passé (voir les articles sur Developer Notepad) et forcement c'est encore un point de plus en faveur de BeagleBone.
Il n'est pas nécessaire de connaître Python pour jouer avec BeagleBone. Vous pourrez trouvez toute l'information nécessaire sur le Net (la communauté BeagleBone est aussi active que celle d'Arduino).
Ressources
Pour plus d'information, je vous recommande les liens suivants:
- How-To: Get Started with the BeagleBone de Make Magazine.
Vraiment très intéressant. - BeagleBone sur Beagleboard.org
Libellés :
Développement,
Divers,
Python
Inscription à :
Articles (Atom)
