Le projet Racanet vise à fournir du réseau Internet haut débit sur le territoire rural du canton de Neuvy-le-Roi, administré de façon intercommunale par la Communauté de Communes de Racan.
Archives de l’auteur : Jissouille
Skinner une appli avec les outils DevExpress (dxRibbon)
Poser un dxSkinController sur le DataModule, virer le NativeStyle, choisir une skin.
Dériver la fiche principale de TdxRibbonForm (use dxRibbonForm
)
Poser un dxRibbon
SupportNonClientDrawing = true
Sur le OnSkinChanged du dxRibbonSkinChooser :
procedure TFMain.dxSkinChooserGalleryItem1SkinChanged(Sender: TObject;
const ASkinName: string);
begin
DM.dxSkinController1.NativeStyle := False;
DM.dxSkinController1.SkinName := ASkinName;
dxSkinChooserGalleryItem1.LargeGlyph := dxSkinChooserGalleryItem1.SelectedGroupItem.Glyph;
//must set ColorSchemeName separately
//see http://www.devexpress.com/Support/Center/p/S20045.aspx
dxRibbon1.ColorSchemeName := ASkinName;
with TRegistry.Create do
Try
if OpenKey('\Software\Cat\ProgName',True) then Begin
WriteString('SkinName',ASkinName);
CloseKey;
end;
finally
Free;
end;
end;
Et dans le Main.OnFormShow :
with TRegistry.Create do
Try
if OpenKey('\Software\Cat\Progname',False) then Begin
DM.dxSkinController1.SkinName:=ReadString('SkinName');
dxRibbon1.ColorSchemeName := DM.dxSkinController1.SkinName;
CloseKey;
end;
finally
Free;
end;
Être féministe avec une bite
Un article qui synthétise simplement plusieurs choses à propos des hommes et du féminisme.
http://lemauvaisgenre.wordpress.com/2012/07/17/etre-feministe-avec-une-bite/
Et si on fermait la Bourse…
Ce n’est pas une blague mais une proposition du très sérieux économiste Frédéric Lordon. À méditer.
Sexisme chez les geeks
Pourquoi notre communauté est malade, et comment y remédier. Un article très [très] complet. Ma référence en la matière.
Fiches Delphi avec nxCachedDataSet
- Déposer une TNxQuery (qXXX), un TNxCachedDataset (cXXX), un TDataSource (dsXXX) et un TNxSqlUpdateObject (uXXX).
- Rattacher le dsXXX à cXXX
- Rattacher qXXX à cXXX (champ cXXX.SourceDataSet)
- Rattacher uXXX à cXXX (champ cXXX.UpdateObject)
- Définir la requête qXXX.Text pour récupérer le contenu de la table
- Ajouter les champs persistants à qXXX et cXXX
- Si qXXX a une Datasource, définir un événement cXXX.AfterInsert et y placer :
===
procedure TFFicheContrat.cLienContratCategorieAfterInsert(DataSet: TDataSet);
begin
cLienContratCategorieidcontrat.AsInteger:=fContratsId.Value;
end;
- Définir des requêtes pour uXXX
INSERT
INSERT INTO lienscontratscategories (idcontrat,idcategorie,abattement)
VALUES (:idcontrat,:idcategorie,:abattement)
MODIFY
UPDATE lienscontratscategories
SET idcategorie=:idcategorie, abattement=:abattement
WHERE id=:id
DELETE
DELETE FROM lienscontratscategories WHERE id=:id
Les paramètres :zzz se rapportent à cXXX
- Ajouter une demande de confirmation de suppression dans cXXX.BeforeDelete :
#
procedure TFFicheContrat.cLienContratCategorieBeforeDelete(DataSet: TDataSet);
begin
if (MessageDlg('Retirer cet abattement pour cette catégorie de ce support ?', mtWarning, [mbYes, mbNo], 0) = mrNo) then
Abort;
end;
Les mots clé dans Firefox
Ou comment rechercher des infos sur le net plus vite que tout le monde. Cet article s’adresse aux utilisateurs de Firefox mais pour les amis de Google, on peut faire la même chose avec Chrome et Chromium.
Continuer la lecture
NexusDB
LastAutoInc
START TRANSACTION;
insert into titres (nom) values ('test IDENTITY');
SELECT LASTAUTOINC;
COMMIT;
Dans du Delphi, ça donne :
q:=TNxQuery.Create(application);
try
q.Database:=dm.dbinpro;
q.sql.text:='START TRANSACTION; '+
'INSERT INTO titres (isrc,nom,interprete) values (:isrc,:titre,:interprete); ';
'SELECT LASTAUTOINC; '+
'COMMIT; ';
q.ParamByName('titre').AsString:=LTitre.Caption;
q.ParamByName('isrc').AsString:=LIsrc.Caption;
q.ParamByName('interprete').AsString:=LArtistes.Caption;
q.Open;
i:=q.FieldValues['LastAutoInc'];
finally
q.free;
end;
Insérer des valeurs nulles
with q.ParamByName('idtitre') do Begin
Clear;
Bound:=True;
DataType:=ftString;
End;
Delphi – Exceptions et Exit
Je viens de faire une découverte très intéressante :
procedure TForm1.Button1Click(Sender: TObject);
begin
Try
exit;
Finally
ShowMessage('Finally called !');
End;
end;
Le message est affiché.
Courier-mta et virtual users
J’ai enfin un truc qui marche… Récapitulons.
Créer un utilisateur vmail
qui opérera seul sur les fichiers de mail.
adduser vmail
Configurer vmail comme on veut. Noter ses UID/GID (ici 1009
)
Configurer courier-mta normalement.
installer courier-authlib-postgresql :
apt-get install courier-authlib-postgresql
Modifier /etc/courier/authdaemonrc
. Il faut avoir :
authmodulelist="authpam authpgsql"
et pour commencer :
DEBUG_LOGIN=1
Modifier aussi /etc/courier/authpgsqlrc
. Les lignes importantes sont :
PGSQL_HOST 127.0.0.1
PGSQL_PORT 5432
PGSQL_USERNAME postgres
PGSQL_PASSWORD
Créer une base de données (dans postgres) nommée mail par exemple avec la table passwd ayant la structure suivante :
CREATE TABLE passwd (
id varchar(128) DEFAULT '' NOT NULL,
crypt varchar(128) DEFAULT '' NOT NULL,
clear varchar(128) DEFAULT '' NOT NULL,
name varchar(128) DEFAULT '' NOT NULL,
uid int DEFAULT 65534 NOT NULL,
gid int DEFAULT 65534 NOT NULL,
home varchar(255) DEFAULT '' NOT NULL,
maildir varchar(255) DEFAULT '' NOT NULL,
defaultdelivery varchar(255) DEFAULT '' NOT NULL,
quota varchar(255) DEFAULT '' NOT NULL,
CONSTRAINT id PRIMARY KEY (id)
);
Insérer un enregistrement de test dans la base :
INSERT INTO passwd (id,crypt,name,uid,gid,home) VALUES ('taste','$1$CY7vG$bjUINelvcc2niojOcDibQ.','taste account',1009,1009,'/home/mail/taste');
Le champ crypt
est obtenu en utilisant la commande :
authpasswd
Ici, le mot de passe crypté est 123
.
Vérifier que la connexion en socket TCP marche bien -sinon jeter un œil du côté de /etc/postgresql/
et notamment pg_hba.conf
:
psql -h 127.0.0.1 -U postgres mail
À ce stade, on doit pouvoir s’authentifier et voir taste
dans la liste des comptes :
# authenumerate |grep taste
taste 1009 1009 /home/vmail/taste
# authtest taste
Authentication succeeded.
Authenticated: taste (uid 1009, gid 1009)
Home Directory: /home/vmail/taste
Maildir: (none)
Quota: (none)
Encrypted Password: $1$CY7vG$bjUINelvcc2niojOcDibQ.
Cleartext Password: (none)
Options: (none)
Créer /home/vmail/taste :
mkdir -p /home/vmail/taste
Créer le .courier-default
de ce compte. Par exemple :
echo './Maildir' >/home/vmail/taste/.courier-default
Créer ensuite un alias qui pointe vers notre taste
:
echo '@gitenville.com: taste' >/etc/aliases/gitenville
makealiases