Linux Wiki


Back to Msoft Website docs

Lister le contenu d'un dossier en C++

9.16.2006

Pour parcourir un dossier et lister les fichiers qui s'y trouvent en C++:
scandir, alphasort, versionsort - Sélectionner des éléments d'un répertoire.
opendir - Ouvrir un répertoire.
closedir - Fermer un repertoire.
readdir - Consulter un répertoire.
rewinddir - Réinitialiser un flux répertoire.
seekdir - Positionner le pointeur de flux répertoire pour le prochain
appel readdir().

Pour toutes ces fonctions, il suffit de taper: man NomDeFonction pour un
exemple.

Admin settings GDM

9.03.2006

Several to disable options in GDM and gnome:

You need to change gdm's config to remove the menu options.
Open /etc/X11/gdm/gdm.conf in a text editor and find the [greeter]
section. Make sure there is a line like this:

[greeter]
...
SystemMenu=false

This removes the shutdown/reboot options from the log-in screen and the
log-out dialog. Alternatively run gdmconfig and provide the root
password, then uncheck the 'Show action menu' option on the security
tab.

To prevent users opening a terminal and running poweroff or reboot,
delete or move these files:

/etc/security/console.apps/poweroff
/etc/security/console.apps/reboot

If your machines use ACPI, you will also need to disable ACPI-driven
shutdowns from the power button.

On more to go now, to prevent someone switching to a virtual console and
hitting ctrl-alt-del, we need to edit inittab. Find the line that looks
like this:

# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

And change it to read:

# Disallow CTRL-ALT-DELETE
ca::ctrlaltdel:/bin/echo "ctrl-alt-delete has been disabled"

(You can use /bin/true, or /usr/bin/logger etc. here instead if you wish
- just watch out if someone tries ctrl-alt-del before /usr is mounted :)

Chaines de caractères en C++

Chaines de caractères en C++:

http://c.developpez.com/faq/cpp/?page=strings

Firefox Protocol Handlers


Firefox Protocol Handlers
<http://blog.ryaneby.com/archives/firefox-protocol-handlers/>

November 27th, 2005 in General
<http://blog.ryaneby.com/archives/category/general/> .

This is a tip I found back when I was having various problems with
external applications not working with Firefox the way I wanted. It also
helps if you want to create your own protocols for testing/development, etc.

By protocol what I mean is the URL prefix such as aim:// mailto:// etc.
Usually when you install a program that uses it’s own protocol prefix it
will update your browser with the correct information. On linux and OSX
though I’ve had mixed results and sometimes I want to send the
information to other programs such as mplayer or VLC even on Windows. My
original problem was with the Last.fm service whose radio player uses
the lastfm:// protocol.

If you don’t already know you can type about:config into the address bar
in Firefox and get advanced settings. This allows you to highly tweak
the browser if you wish. It also allows you to add custom settings which
is what we need to do. The general layout is:

network.protocol-handler.external.protocol = boolean (true or false)
network.protocol-handler.app.protocol = /path/to/program

I’ve found that there is no need to do the external boolean in my
testing just the app one. So to add the lastfm:// protocol you would go
to about:config and then right-click somewhere and choose new > string.
You would then enter the following information:

Preference Name: network.protocol-handler.app.lastfm
Value: /path/to/lasfm/player (/home/ebyryan/Downloads/lastfm/player in
my case)

For windows it would likely be the “C:\dir\to\file” structure while OSX
would have similar syntax to above (try terminal). You will likely need
to restart firefox to notice the change. I’ve also used this to handle
iTunes (itmss) protocols. If your in an internal setting where you
control people’s computers you could use this to create custom protocols
for your intranet that launch specific software on the users computers
when they click on items. Not sure how useful that is though.

(source: http://blog.ryaneby.com/archives/firefox-protocol-handlers/)

Modifier la taille d'images dans un répertoire

1.15.2006

taille, script, sh, repertoire, image

En utilisant la fonction "convert":


#!/bin/bash

if [ $# -ne 1 ]
then
echo "Usage: './resizePictures.sh taille' avec la taille sous la forme largeurxhauteur (640x480)."
exit -1
fi

rep=resized-$1

if [ -d "$rep" ]; then
echo "Repertoire $rep existe. Je ne le crée pas."
else
echo "Repertoire $rep n'existe pas. Je le crée."
mkdir $rep
fi

if [ 'ls *JPG' ]; then
for i in *.JPG
do
let "n += 1"
done

echo "$n fichiers *.JPG existent. Je les converti."

for i in *.JPG
do
if [ -e $rep/$i ]; then
echo "Le fichier $i existe deja dans le repertoire $rep."
else
taille=`identify $i | awk '{print $3}'`
echo "Le fichier $i($taille) sera converti en $1 et enregistre dans le repertoire $rep."
convert -geometry $1 $i $rep/$i
fi
done
else
echo "Aucun fichiers *.JPG n'existent. Je ne fait rien."
fi

if [ 'ls *jpg' ]; then
for i in *.jpg
do
let "n += 1"
done

echo "$n fichiers *.jpg existent. Je les converti."

for i in *.jpg
do
if [ -e $rep/$i ]; then
echo "Le fichier $i existe deja dans le repertoire $rep."
else
taille=`identify $i | awk '{print $3}'`
echo "Le fichier $i($taille) sera converti en $1 et enregistre dans le repertoire $rep."
convert -geometry $1 $i $rep/$i
fi
done
else
echo "Aucun fichiers *.jpg n'existent. Je ne fait rien."
fi


Pour l'exécution:


chmod +x resizePictures.sh
cd Pictures
./resizePictures.sh 1024x768

Scripts SH pour modifier les noms de fichiers.

nom, fichier, modifier, script, sh, espace, underscore

Remplacer les espaces par des underscores


#!/bin/sh

for i in * ;
do
a=`echo $i | tr "[:blank:]" "_"`
mv "$i" "$a"
done


Remplacer les underscores par des espaces


#!/bin/sh

for a in * ;
do
b=$(echo $a | sed 's/_/ /g');
mv "$a" "$b";
done

Appliquer les drivers OpenGL à un nouveau kernel lorsque les pilotes sont déja installés.

1.14.2006

driver, kernel, opengl, installer, installation, nouveau

Lorsque on a démarré sur un nouveau kernel et que les drivers OpenGL ne sont pas pris en compte. Pour voir si les drivers sont pris en compte, il suffit de faire:


# glxgears


Si le nombre FPS affiché est inférieur à 500, les drivers ne sont pas pris en compte.

Si les pilotes ainsi que les fichies sources du kernel sont présents, il suffit de faire en tant que root:


# cd /lin/modules/fglrx/build_mod/
# ./make.sh
# cd ../
# ./make_install.sh


Si tout s'est bien passé, il suffit de rédemarrer et de refaire le test précédent.

Installation serveur CVS

1.05.2006

Mots-clé: cvs, installation, serveur, cvsd, pserver, authentification

Installation

Première chose à faire: installer le paquet du serveur CVS:


# apt-get install cvsd


Pour les clients, c'est le paquet cvs qu'il faut installer.

Préparation du jailroot

Maintenant, choisissez un emplacement pour le jailroot du serveur CVS. Ce jailroot contiendra le repository (le dossier ou sont stockées les sources de l'application que vous developpez), ainsi qu'un ensemble minimal de fichiers de configuration utilisés par le daemon cvsd. L'emplacement le plus logique pour ce jailroot est /var/lib/cvsd/.

Pour préparer ce jailroot:


# mkdir /var/lib/cvsd
# cvs -d /var/lib/cvsd/root init
# cvsd-buildroot /var/lib/cvsd
# cd /var/lib/cvsd
# mkdir -p var/lock


Configuration de cvsd

Il nous faut maintenant configurer cvsd de la façon suivante:


# nano -w /etc/cvsd/cvsd.conf


Recherchez et remplacez les lignes suivantes:

# Utilisateur et groupe pour le daemon cvsd

Uid cvsd
Gid cvsd


# Emplacement du rootjail

RootJail /var/lib/cvsd


# Port d'écoute (2401 par défaut)

Listen * 2401 # or whatever port you'd like it to listen on, up to you


# Emplacement du repository (dans le jailroot)
# ici il s'agit du répertoire /var/lib/cvsd/repository

Repos /root


Dans le cas où on veut ajouter plusieurs répertoire "jailroot", il faut procéder comme suit:

Repos /dossier1
Repos /dossier2


Veillez bien à ce qu'il y ai un retour charriot à la fin du fichier. C'est fini pour ce fichier de configuration.

Création des utilisateurs

Il ne reste plus qu'à créer des utilisateurs pour votre serveur:


# cvsd-passwd /var/lib/cvsd/root NOM_UTILISATEUR


On vous demandera un mot de passe. Pour autoriser l'accès à votre serveur en anonyme, créez simplement un utilisateur anonymous, et laissez un mot de passe vide.

Il faut maitenant donner des droits de lecture ou d'écriture à vos utilisateurs. Cela se fait avec les fichiers /var/lib/cvsd/root/CVSROOT/readers et /var/lib/cvsd/root/CVSROOT/writers

Rajoutez les utilisateurs à qui vous voulez donner des droits de lecture seulement dans le fichier readers


# touch /var/lib/cvsd/root/CVSROOT/readers
# chown cvsd:cvsd /var/lib/cvsd/root/CVSROOT/readers
# nano /var/lib/cvsd/root/CVSROOT/readers


un utilisateur par ligne, veillez bien à ce qu'il y ai un retour charriot à la fin du fichier.

Rajoutez les utilsateurs à qui voulez donner les droits d'écriture et de lecture dans le fichier writers. Il n'est pas possible de donner les droits d'écriture seulement.

Exemple de /var/lib/cvsd/root/CVSROOT/readers


guest
anonymous
john


Lancement du serveur

Avant de lancer le serveur CVS, n'oubliez pas de changer les permissions de fichiers dans votre jailroot (TRES IMPORTANT !):


# chown -R cvsd:cvsd /var/lib/cvsd
# chmod -R 775 /var/lib/cvsd/var


Une fois cela fait, vous pouvez enfin lancer le serveur CVS:


# /etc/init.d/cvsd start


et le rajouter au démarrage si vous voulez:


# rc-update add cvsd default


Test en local

1. Initialisez la variable globale CVSROOT


# export CVSROOT=:pserver:NOM_USER@localhost:/root


2. Authentifiez vous sur le serveur


# cvs login


En cas de problème référez vous aux Notes plus bas.

3. Importez ou synchronisez quelques fichiers. (voir man cvs)

4. Déconnectez vous


# cvs logout


Notes

N'oubliez pas d'ouvrir le port 2401 sur votre firewall.

Le paquet cvsd-1.0.2 a un problème avec la commande cvsd-buildroot qui ne copie pas toutes les librairies nécessaires dans le jailroot. Si vous rencontrez cette erreur:

cvs [login aborted]: reading from server: Connection reset by peer

Utilisez les commandes suivantes pour résoudre le problème:


# cp /lib/ld-* /var/lib/cvsd/lib/
# cp /lib/libdl.so.2 /var/lib/cvsd/lib/


Création des fichiers .cvsroot

Dans le dossier home de chaque utilisateur se connectant au serveur CVS, il faut créer un fichier $HOME/.cvsroot comme suit:


# touch $HOME/.cvspass
# chmod 700 $HOME/.cvspass

Personnaliser le message d'accueil de SSH/Telnet

12.10.2005

personnaliser, ssh, telnet, message, accueil

Il suffit de modifier le contenu du fichier:
/etc/motd

Gestion de l'exécution en C++

11.27.2005

gestion, execution, c++, cpp, sleep, resultat, programme, externe, alerte

(Le texte de cette page provient du site: http://c.developpez.com/faq/bcb/?page=gestionexecution)

Comment exécuter des commandes ?

Pour cela, utilisez la fonction system, déclarée dans stdlib.h, qui prend pour argument la commande à exécuter :


#include
//...
system("dir *.*");


Comment exécuter une commande et en récupérer le résultat ?

Pour récupérer le résultat de l'exécution d'une commande, il suffit d'utiliser la fonction system, définie dans stdlib.h, pour lancer une commande, et de spécifier une redirection de sortie (celles-ci fonctionnent aussi bien sous DOS/Windows que sous Linux) :


#include
// Version DOS/Windows :
system("dir *.* > results.txt");
// Version Linux : /* L'option -l permet d'avoir les détails des fichiers */
system("ls -l > results");


Le résultat de la commande se situe maintenant dans le fichier results.txt ou results.



Comment exécuter un programme externe ?

Utilisez la fonction ShellExecute.
Pour lancer Notepad, par exemple :


ShellExecute(
NULL, // Handle de la fenêtre parent
"open", // Action à effectuer
"notepad.exe", // Fichier
"", // Paramètres
"", // Répertoire par défaut
SW_SHOWDEFAULT // Manière d'afficher );



Attention, les chaînes passées en arguments de cette fonction sont des chaînes C standard. Pour passer des AnsiString en arguments, utilisez la méthode c_str() :


// Affiche une boîte de dialogue "Ouvrir un fichier" et ouvre le fichier avec notepad.
if (OpenDialog1->Execute())
{
ShellExecute(
NULL, // Handle de la fenêtre parent
"open", // Action à effectuer
"notepad.exe", // Fichier
OpenDialog1->FileName.c_str(), // Paramètres
ExtractFilePath(OpenDialog1->FileName).c_str(), // Répertoire par défaut
SW_SHOW // Manière d'afficher ); }


Comment récupérer les arguments de la ligne de commande passés à mon exécutable ?


Cela peut être effectué grâce aux fonctions ParamCount() et ParamStr(), la seconde prenant en argument le numéro de l'argument.
Dans l'exemple suivant, nous chargeons dans un TMemo le fichier placé en argument de la ligne de commande. Placez le code suivant dans le constructeur de votre fiche :


if ( ParamCount() > 0 )
Memo1->Lines->LoadFromFile(ParamStr(1));


Comment générer une alerte à destination de l'utilisateur ?


Il est souvent utile d'avertir l'utilisateur par un message rapide, pour lui faire part d'une information ou pour lui signaler une erreur. Il existe différentes méthodes. Les plus simples et les plus utiles sont ShowMessage et MessageDlg.

ShowMessage permet d'afficher un message tout simple dans une fenêtre. Elle prend pour argument une AnsiString qui est le contenu du message.


ShowMessage("Tâche effectuée");


L'autre méthode, plus perfectionnée, est MessageDlg. Cette fonction permet de personnaliser un peu la boîte de dialogue :


MessageDlg("La tâche a été effectuée correctement", mtInformation, TMsgDlgButtons() << mbOK, 0);


Cette fonction permet d'afficher un message (AnsiString passée en premier argument). Le second argument indique le type de boîte de dialogue. mtInformation affiche une icône "information" dans la boîte de dialogue. Enfin, l'avant-dernier argument permet de choisir quels boutons seront disponibles dans la boîte de dialogue. Le dernier argument permet de lier la boîte de dialogue à une rubrique d'aide. Un des grands avantages de cette fonction est qu'elle permet de savoir quel bouton a été enfoncé s'il y en avait plusieurs :


if (MessageDlg("Le document n'a pas été sauvegardé, voulez-vous le sauvegarder avant de quitter ?", mtConfirmation, TMsgDlgButtons() << mbYes << mbNo, 0) == mrYes)
Sauver();


Dans ce code, la méthode Sauver est appellée si le bouton Oui est cliqué. Pour plus de détails sur le fonctionnement de MessageDlg, consultez l'aide de C++Builder.

Comment faire pour qu'un traitement long ne fige pas l'application ?


Lors d'un traitement long, l'application ne traite plus les messages Windows de la queue de messages.
Le résultat est en général une aplication qui ne répond plus aux évenements utilisateurs, ou qui ne se redessine plus.

Dans ce cas, il faut faire un appel à la méthode ProcessMessages de la classe Application dans la boucle. L'exemple présenté ci-dessous déclenche une tâche ininterrompue lors du clic sur un bouton. Nous dessinons un quadrillage par rebonds successifs du pinceau sur les bords de la fenêtre. Déclarons tout d'abord une variable Stop en global :


//...
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm" TForm1 *Form1;
bool Stop; /* Placez la variable ici */ //---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
//...
}


Maintenant, nous allons écrire le gestionnaire d'événements OnClick du bouton de dessin.


void __fastcall TForm1::Button1Click(TObject *Sender)
{
static int x_inc = 1; // Incrémentation d'abscisse
static int y_inc = 1; // Incrémentation d'ordonnée
static int X = 10; // Position initiale (abscisse)
static int Y = 10; // Position initiale (ordonnée)
Stop = false; // La boucle est activée.
/* Le seul moyen d'arrêter la boucle est de positionner la variable Stop à true */
while(!Stop) { Canvas->MoveTo(X, Y); // Placement du pinceau en (X, Y)
X += x_inc; // Incrémentation des positions
Y += y_inc; // Change la couleur de la ligne aléatoirement
Canvas->Pen->Color = RGB(rand()%255, rand()%255, rand()%255);
Canvas->LineTo(X, Y); // Ligne jusqu'à la nouvelle position
/* Si la position du pinceau sort de la zone cliente de la fenêtre, on inverse les incrémentations, ce qui donne l'effet de "rebond" */
if (X > ClientWidth || X < 0) x_inc = -x_inc;
if (Y > ClientHeight || Y < 0) y_inc = -y_inc;
/* L'appel à cette méthode évite le blocage de l'application : les messages et clics sur autres boutons sont traités */
Application->ProcessMessages();
}
}


Maintenant, il nous faut pouvoir arrêter cette boucle dessin. Pour cela, nous avons vu qu'il suffit de placer la variable Stop à true. Placez un autre bouton sur la fiche. Dans son gestionnaire d'événements OnClick, placez le code suivant :


void __fastcall TForm1::Button2Click(TObject *Sender)
{
Stop = true;
}


Si un clic sur le bouton a lieu, il sera traité par l'appel à Application->ProcessMessages(). Enfin, il faut pouvoir quitter le programme. Pour cela, utilisez l'événement OnCloseQuery de la fiche et placez-y également le code Stop = true.

Comment faire une courte pause de quelques millisecondes ou secondes ?


Utilisez la fonction Sleep en lui passant en argument le nombre de millisecondes.


// Pause d'une seconde :
Sleep(1000);


Notez qu'en raison du fonctionnement interne de Windows, Sleep ne garantit qu'un minimum d'attente. En effet, Windows n'est pas un système temps-réel.