Linux Wiki


Back to Msoft Website docs

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.

Raccourcis clavier pour Emacs

11.22.2005

raccourci, clavier, emacs

1) Déplacements
2) Commandes principales (Menu Fichier)
3) Edition (annulation / recherche / remplacement)
4) Buffers (fenêtrage)
5) Divers


===============================================================================
1) DEPLACEMENTS
===============================================================================

C-v Pagedown
M-v Pageup

C-p Ligne du dessus (previous line)
C-n Ligne du dessous (next line)

C-b Caractère précédent (back)
C-f Caractère suivant (next)

M-b Mot précédent
M-f Mot suivant

C-a Début de ligne
C-e Fin de ligne

M-a Début de phrase
M-e Fin de phrase

M-< Fin de fichier
M-> Début de fichier

C-l Curseur en milieu de page
C-u C-v Curseur en haut de page

===============================================================================
2) COMMANDES PRINCIPALES (MENU FICHIER)
===============================================================================

C-x C-f Ouvrir fichier (tab de complétion)
C-x C-s Sauvegarder fichier
C-x C-c Quitter Emacs
C-z Sortie provisoire (récupération possible par fg ou %emacs)

C-g Arrêt d'une commande (ou sortie d'un sous-menu de commande)
ESC ESC ESC Idem (mais sortie d'un recursive editing level)

===============================================================================
3) EDITION
===============================================================================

C-x u Annulation (C-_)
C-x z Répéter

Suppr Suppression du caractère avant
C-d Suppression du caractère après

M-suppr Suppression du mot avant
M-d Suppression du mot après

C-k Couper (kill) jusqu'en fin de ligne
M-k Couper (kill) jusqu'en fin de phrase
C-x k Couper (kill) le buffer

C-espace Marquer (début d'un copier/couper)
C-w Fin d'un couper (kill)
M-w Fin d'un coller
M-h Marque le paragraphe
C-x h Marque la totalité du buffer

C-x C-espace Coller (pop) global mark

C-y Coller (yank du killed)
M-y Passage entre les différents kills (anciens copier, après un C-y)

C-s Recherche après (suivi de C-w recherche le mot sous le curseur)
C-r Recherche avant (suivi de C-w recherche le mot sous le curseur)

M-x replace-string Remplacer
ESC % Remplacer
M-% Remplacer
Espace Pour remplacer l'occurence suivante
Suppr Pour passer l'occurence sans la remplacer
! Pour remplacer toutes les occurences

M-u Mot en majuscule
M-l Mot en minuscule

===============================================================================
4) BUFFERS (fenêtrage)
===============================================================================

C-x C-b Liste des buffers (fichiers ouverts)
C-x s Sauvegarde les buffers (pose la question)

C-x 0 Supprime cette fenêtre
C-x 1 Supprime les autres fenêtre
C-x 2 Divise la fenêtre en 2 verticalement
C-x 3 Divise la fenêtre en 2 horizontalement
C-x o Passage d'un écran à l'autre (other)
C-x ^ Aggrandir la fenêtre
CV-v Pagedown dans l'autre fenêtre (ESC C-v en cas de non méta)
C-x 4 C-f nomFichier Ouverture de nomFichier dans une fenêtre en bas
C-x 4 b Fermeture fenêtre

===============================================================================
5) DIVERS
===============================================================================

C-u chiffre Itération d'une action (ex : C-u 5 C-n Descend de 5 lignes)

C-x Commande suivi d'un seul caractère

M-x Commande à partir d'une commande texte (tab de complétion)

C-h ? Aide générale
C-h c nomCommande Description de la commande
C-h k nomCommande Aide sur la commande
C-h f nomFonction Description d'une fonction
C-h a nom (Apropos) : liste les commandes contenant le nom
C-h i Lire les infos (Manuels en-ligne)

C-x m Composer un mail
ESC ! Commande shell

Paramètrer les raccourcis clavier sous Gnome

11.19.2005

raccourci, clavier, gnome, parametrage

Run "gconf-editor".
Drill down to apps --> metacity -->
global_keybindings.
Find "run_command_1"
Cchange it to your key such as "F12" or "S".

Then in apps --> metacity --> keybinding_commands find "command_1".
Set it to "/usr/bin/3ddesk".

Installer Open Office 2 sous Debian

(Ce texte provient intégralement du site http://www.generation-libre.com/content/view/784/74/)

intaller, installation, openoffice2, open, office, alien, deb, debian, rpm

Comme tout le monde le sait, OpenOffice 2 est sortie il y a quelques semaines.
Depuis peu, la version francaise est aussi disponnible, notamment en version package RPM (pour redhat, Fedora, Mandriav etc.) , pour Windows... mais pas de packets .deb pour la distribution GNU Linux / Debian.

Voici comment installer la derniere version d'OpenOffice avec les RPMs fournis, grave à Alien (package converter)

Sous Debian, il convient donc d'installer ce dernier via apt:


pcmarty:~/# apt-get install alien


Téléchargez ensuite le OOo_2.0.0_LinuxIntel_install_fr.tar.gz depuis l'un des nombreux mirroirs que vous trouverez ici:
http://fr.openoffice.org/about-downloads.html#fr

Une fois téléchargé:


martinez@pcmarty:~/Desktop$ tar -zxvf OOo_2.0.0_LinuxIntel_install_fr.tar.gz


Rendez-vous dans le repertoire décompacté... dans lequel vous trouverez un dossier RPMS contenant tous les .RPM propres à l'installation.

C'est ici que nous allons nous servir d'alien.
Dans une console, tapez la commande suivante:


alien -d *.rpm


Alien va alors, grâce au "-d", générer les .deb à partir des .rpm du dossier:


openoffice.org-base_2.0.0-4_i386.deb generated
openoffice.org-calc_2.0.0-4_i386.deb generated
openoffice.org-core01_2.0.0-4_i386.deb generated
openoffice.org-core02_2.0.0-4_i386.deb generated
openoffice.org-core03_2.0.0-4_i386.deb generated
openoffice.org-core03u_2.0.0-4_i386.deb generated
openoffice.org-core04_2.0.0-4_i386.deb generated
openoffice.org-core04u_2.0.0-4_i386.deb generated
openoffice.org-core05_2.0.0-4_i386.deb generated
openoffice.org-core05u_2.0.0-4_i386.deb generated
openoffice.org-core06_2.0.0-4_i386.deb generated
openoffice.org-core07_2.0.0-4_i386.deb generated
openoffice.org-core08_2.0.0-4_i386.deb generated
openoffice.org-core09_2.0.0-4_i386.deb generated
openoffice.org-core10_2.0.0-4_i386.deb generated
openoffice.org-draw_2.0.0-4_i386.deb generated
openoffice.org-gnome-integration_2.0.0-4_i386.deb generated
openoffice.org-graphicfilter_2.0.0-4_i386.deb generated
openoffice.org-impress_2.0.0-4_i386.deb generated
openoffice.org-javafilter_2.0.0-4_i386.deb generated
openoffice.org-math_2.0.0-4_i386.deb generated
openoffice.org-pyuno_2.0.0-4_i386.deb generated
openoffice.org-spellcheck_2.0.0-4_i386.deb generated
openoffice.org-testtool_2.0.0-4_i386.deb generated
openoffice.org-writer_2.0.0-4_i386.deb generated
openoffice.org-xsltfilter_2.0.0-4_i386.deb generated


Il ne vous reste plus qu'à installer:


dpkg -i *.deb


Et pour finir, il ne reste plus qu'a faire les liens grace au package contenu dans "desktop-integration":


cd desktop-integration
dpkg -i openoffice.org-debian-menus_2.0.0-3_all.deb

Dépaquetage de la mise à jour de openoffice.org-debian-menus ...
***
* Updating MIME database in /usr/share/mime...
***
Paramétrage de openoffice.org-debian-menus (2.0.0-3) ...
***
* Updating MIME database in /usr/share/mime...
***


Depuis votre compte utlisateur, executer ensuite "openoffice.org-2.0"

Compression et archivage sous linux

11.17.2005

compression, archivage, tar, gz, bz2, zip, bzip2, gzip

On distingue principalement deux types de formats de compression: tar.gz et bz2. Le bz2 est plus performant que le format at.gz et compresse davantage cependant il n'est pas présent sur toutes les distributions.

.TAR.GZ

Les fichiers tar.gz sont d'abord compactés en .tar (sans compression) puis ensuite sont compressés par Gzip.

Pour archiver et compresser:

Syntaxe: tar

Dans les options, on doit mettre c pour créer une archive et non la décompresser, f pour indiquer qu'il s'agit d'un fichier, on peut mettre z pour compresser avec Gzip, et v si on désire avoir la liste des fichiers compressés qui défile.

Le plus souvent, on peut taper:

tar cfvz kfilecoder.tar.gz /root/projects/kfilecoder


Pour extraire une archive:

Syntaxe: tar

Dans les options, on doit mettre x pour extraire l'archive indiquée, f pour indiquer qu'il s'agit d'un fichier, on peut mettre z pour décompresser avec Gzip, et v si on désire avoir la liste des fichiers compressés qui défile.


tar xfvz kfilecoder.tar.gz


.BZ2

Comme pour les archives en .tar.gz, il faut d'abord compacter les fichiers en .tar et ensuite les compresser en .bz2.

Pour décompresser:

Syntaxe: bzip2 -d

Il faut simplement indiquer le nom du fichier d'extension .BZ2 à décompresser.
Le plus souvent:


bzip2 -d kfilecoder.tar.bz2


et ensuite:

tar -xfv kfilecoder.tar


OU alors directement:

tar -jxvf fichier.tar.bz2


.ZIP

Pour compresser:


zip -r nom_fichier.zip dossier_a_compresser/


Pour décompresser


unzip nom_fichier.zip

Utilisation d'alsa pour un nouvel utilisateur

11.15.2005

alsa, ajout, utilisateur, permission, denied, erreur, audio

Si on ajoute un nouvel utilisateur au système, lorsque celui-ci voudra utiliser ALSA pour produire un son, une erreur de type "Permission denied" se produira indiquant l'absence de privilèges pour l'utilisation d'ALSA.

Pour y remédier, il suffit de rajouter l'utilisateur au groupe "Audio" (voir fiche sur la gestion des utilisateurs)

Si un redémarrage du daemon ALSA ne suffit pas, redémarrer le système.

Principe de l'ajout des utilisateurs

gestion, utilisateur, groupe, user, passwd, group, ajout, suppression

L'ajout d'un utilisateur consiste à :


associer un mot de passe à l'utilisateur (ajout d'une entrée dans le fichier /etc/passwd) ;
définir à quel groupe appartient l'utilisateur (ajout d'une entrée dans le fichier /etc/group) ;
créer le répertoire personnel de l'utilisateur ;
créer le fichier de configuration personnel du shell ;

Une entrée (c'est à dire une ligne) du fichier /etc/passwd est de la forme :

Nom :mot de passe :numéro d'utilisateur :numéro de groupe :champs spécial :répertoire personnel :shell de démarrage

Exemple d'entrée du fichier /etc/passwd :


$ cat /etc/passwd | grep philippe
phlippe:x:501:100:Philippe Drouot:/home/philippe:/bin/bash


Une entrée (c'est à dire une ligne) du fichier /etc/group est de la forme :


Nom de groupe : champs spécial : numéro de groupe : membre1 , membre2, etc..

Exemple d'entrée du fichier /etc/group :


$ cat /etc/group | grep 100
users:x:100:


Pour ajouter un utilisateur philippe, vous devez :

1. ajouter l'utilisateur philippe dans le fichier /etc/passwd


2. ajouter éventuellement un nouveau groupe dans /etc/group (si vous souhaitez créer un groupe spécifique pour philippe)


3. créer le répertoire personnel du nouvel utilisateur (home directory), copier les fichiers de configuration du shell et changer les droits du répertoire philippe afin que l'utilisateur philippe devienne propriétaire de son répertoire personnel :


$ mkdir /home/philippe
$ cp /etc/skel/* /home/philippe
$ chown philippe /home/philippe
$ chgrp le_groupe_de_philippe /home/philippe


4. donner un mot de passe à l'utilisateur philippe par la commande :


$ passwd philippe


Ajout d'utilisateur et de groupe avec les commandes useradd et groupadd

Pour faciliter l'ajout d'utilisateurs et de groupe, il existe des commandes spécifiques.

Ajout d'un utilisateur avec la commande useradd :

Syntaxe : useradd nom-utilisateur -g groupe -d répertoire-personnel -m
L'option -m permet de recopier les fichiers de configuration du shell. On peut remplacer le shell courant par un shell spécifique avec l'option -s (par exemple -s /etc/ftponly).


$ useradd philippe -g users -d /home/philippe -m
$ passwd philippe
Changing password for user philippe
New UNIX password :
Retype new UNIX password :
Passwd : all authentification tokens update successfully


Suppression d'un utilisateur avec la commande userdel :


$ userdel -r philippe


L'option -r permet de supprimer le répertoire personnel de l'utilisateur à supprimer.

Ajout d'un groupe avec la commande groupadd :


$ groupadd ftpusers


Suppression d'un groupe avec la commande groupdel :


$ groupdel ftpusers

En-tête fichier Latex pour du code Matlab

11.12.2005

matlab, latex, en-tête

Insérer cette en-tête pour pouvoir afficher du code Matlab;

\documentclass[a4paper]{article}
\usepackage[francais]{babel}
\usepackage{a4wide}
\usepackage{listings}
\usepackage{graphicx}
\usepackage{afterpage}
\usepackage{amsmath,amssymb}
\usepackage[latin1]{inputenc}

\newcommand{\fixme}{fixme}

\date{2005}
\lstset{language=matlab}
\lstset{frame=single}
\lstset{basicstyle=\scriptsize}
\lstset{numbers=right}
\lstset{extendedchars=true}

\title{titre}
\author{auteur}
\begin{document}
\maketitle
\input{autre_fichier}
\end{document}

Commandes avancées pour LATEX

Commandes avancées LATEX

Mots-clé: latex, commandes

Insérer une équation

\begin{eqnarray*}
\begin{array}{rl}
f(x)=x
\end{array}
\end{eqnarray*}

Si on enlève les étoiles, latex référencent chaque ligne d'équations


Quelques commandes inretenables en Latex:
Mettre des références sur une formule


\begin{equation}
\label{eq-suite}g(n)=\textbf{I}
\end{equation}


Faire un appel à cette référence:

~\ref{eq-suite}

On insert cette commande sans espace.

Encadrer une fonction

\begin{displaymath}
\fbox{
$g(n)-g=U^n$
}
\end{displaymath}


Mettre un texte au format code

\begin{lstlisting}
code
\end{lstlisting}


Mettre des figures

\begin{figure}[ht]
\begin{center}
\includegraphics[width=8cm]{Nom_Fichier}
\end{center}
\caption{\label{reference}Titre des références}
\end{figure}


Mettre des figures les unes à coté des autres

\begin{figure}[!h]
\begin{center}
\begin{minipage}{.45\textwidth}
%\begin{tabular}{cc}
\includegraphics[width=1\textwidth]{exo2_1}\caption{$\mu=.5 / max(\sigma_0, \sigma_1)$} \label{cour1}
\end{minipage}
\begin{minipage}{.45\textwidth}
\includegraphics[width=1\textwidth]{exo2_2}\caption{$\mu=1.1 / max(\sigma_0,
\sigma_1)$}\label{cour2}
%\end{tabular}
\end{minipage}

\begin{minipage}{.45\textwidth}
\includegraphics[width=1\textwidth]{exo2_3}\caption{$\mu=1.6 /
max(\sigma_0, \sigma_1)$} \label{cour3}
\end{minipage}
\begin{minipage}{.45\textwidth}
\includegraphics[width=1\textwidth]{exo2_4}\caption{$\mu=1.9 / max(\sigma_0,
\sigma_1)$} \label{cour4}
\end{minipage}
\end{center}
\end{figure}

Mémo rapide sur le C++

Mots-clé: c++, commande, instruction, memo, cpp

Pour sortir un truc:

std::cout << "position: x=" << std::endl


DECLARATION DANS .H
Dans la déclaration du fichier en .h
virtual= méthode d'instance (pas obligatoire)
static=méthode statique
const= méthode ne modifiant pas les variables membres, mettre après le nom de la fonction membres ( virtual int getX() const; )

DECLARATION DANS .CPP
Déclaration dans le CPP:
On sépare le nom de la classe et le nom de la fonction avec :: (il en ait de même pour le nom du namespace)

Pour les instanciations:
Opérateur :: = méthode de classe (à utiliser pour les méthodes statiques)
Opérateur -> = méthode d'instance (à utiliser seulement pour une instance)

INSTANCES
Deux façons de manipuler des instances de classes:
Manipuler des objets:
Déclaration:

NomClasse NomInstance

Acces aux membres:

NomInstance.NomMembre


Manipuler des références vers les objets:
Déclaration:

NomClasse* NomInstance

Accès aux membres:

NomInstance->NomMembres


L'opérateur *. est équivalent à ->

Après chaque instanciation, il ne faut pas oublier de supprimer l'objet en faisant: delete NomDeLObjet.
En écrivant de plus, NomDeLObjet = 0 ou NULL on est sûr de vider l'espace mémoire associé.

STRUCT
struct = class sauf que tous les membres sont publics.

HERITAGES:
Declaration:
class NomClasse: public NomClasseMere
L'heritage multiple est possible en C++.


INLINE:
Ce mot est à utiliser lorsqu'on implémente une fonction dans le .H

CLASSES ABSTRAITES:
Il n'est pas nécessaire de préciser l'abstraction par un mot clé du genre ABSTRACT mais toutes les méthodes doivents être virtuelles pures cad en ajoutant le mot clé VIRTUAL.

TABLEAU
Déclaration d'un tableau d'objets:

TypeARanger NomDuTableau[] = new TypeDuTableau[Taille]

Déclaration d'un tableau de référence:

TypeARanger* NomDuTableau[] = new TypeDuTableau*[Taille]

Attention il faut détruire le tableau en érivant:

delete[] NomDuTableau


CONST
Const signifie que ce qui est suivi est constant.

const char* s1 = "abcd"; // valeur pointee constante
char* const s2 = "abcd"; // pointeur constant (NB: INCORRECT dans ce cas!)
const char* const s3 = "abcd"; // les deux


REFERENCES
Pointeurs qui références des adresses d'objets mais il s'agit de constantes. Une référence pointe toujours vers la même adresse.
Le but de la référence est de permettre de transmettre des arguments de fonction sous forme d'adresses.
Déclarations:

TypeReference& NomReference = *new Constructeur;
Circle& c = *new Circle(50, 200); // #1
c.setX(15); // #2


Lorsqu'on ecrit:

int* p = &i1; // p pointe sur i1. &i1 est l'adresse.
cout << "p=" << *p << "\n"; // il faut une * puisque p est une adresse
int& r2 = i2; // r2 référence i2
cout << "r2=" << r2 << "\n"; // il ne faut pas d' *

int& r1 = *p; // r1 référence *p c'est-a-dire i1
cout << "r1=" << r1 << "\n";

p = &r2; // p référence l'objet pointé par r2 cad. i2
cout << "p=" << *p << "\n";

r1 = r2; // !!!!!
cout << "r1=" << r1 << "\n";
cout << "i1=" << i1 << "\n"; // que constate-t'on ?

Daemon pour vérifier l'état d'un fichier

Mots-clé: daemon, état, fichier, famd, c++

Un daemon sous linux permet de savoir si un fichier a été modifié ou supprimé:
Ce daemon s'appelle FAMD et on peut y avoir accès d'un prog en C ou C++. Tout ceci est expliquer sur les sites:
http://www.enderunix.org/docs/eng/daemon.php
http://oss.sgi.com/projects/fam/faq.html

Des exemples de codes se trouvent sur:
cette page

Patch pour les pilotes OpenGL conernant le kernel 2.6.14

Mots-clé: fglrx, opengl, kernel, i686

Les pilotes OpenGL c'est-à-dire fglrx ne fonctionnent pas pour le noyau i686 2.6.14. La commande dmesg (affichant les logs de démarrage) va donner comme erreur concernant fglrx: fglrx: Unknown symbol verify_area

Un petit patch permet d'arranger ça en indiquant que la vérification est OK. Mettre le code suivant dans un fichier:

--- firegl_public.c 2005-11-06 14:49:15.000000000 +0000
+++ firegl_public.c.new 2005-11-06 14:49:15.000000000 +0000
@@ -1475,7 +1475,7 @@

int ATI_API_CALL __ke_verify_area(int type, const void * addr, unsigned long size)
{
- return verify_area(type, addr, size);
+ return access_ok(type, addr, size) ? 0 : -EFAULT;
}

int ATI_API_CALL __ke_get_pci_device_info(__ke_pci_dev_t* dev, __ke_pci_device_info_t *pinfo)


Il suffit de se mettre dans le dossier du module fglrx et d'appliquer le patch avec les privilèges du super utilisateur:

cd /lib/modules/fglrx/build_mod
patch < /path_to_the_patch


Ensuite, il faut exécuter le fichier: /lib/modules/fglrx/build_mod/make.sh puis le fichier /lib/modules/fglrx/make_install.sh

Il faut redémarrer la machina et un petit lsmod permettra de voir si le patch est bien appliquer.

Commandes principales serveur CVS

Mots-clé: serveur, cvs, commande

Créer un projet
Supposons que vous soyez en train de concevoir un projet nommé « anim »,
dont tous les fichiers sont réunis dans le répertoire
$HOME/programmation/anim.

Tapez :

msoft@BigMsoft ~ $ cd programmation/anim
msoft@BigMsoft ~/programmation/anim $ cvs import anim_project votre_nom version0


Créer un répertoire de travail

msoft@BigMsoft ~ $ mkdir rep-travail
msoft@BigMsoft ~ $ cd rep-travail
msoft@BigMsoft ~/rep-travail $ cvs checkout turing


CVS au quotidient
Mettre à jour son répertoire de travail

msoft@BigMsoft ~/anim $ cvs update turing
msoft@BigMsoft ~/anim $ cvs update fichier1 fichier2 etc
msoft@BigMsoft ~/anim $ cvs update -d ~/programmation/anim


Ajouter un fichier
Dans le cas d'un fichier texte:

msoft@BigMsoft ~/anim $ cvs add fichier1 fichier2 etc

Dans le cas d'un fichier binaire:

msoft@BigMsoft ~/anim $ cvs add -kb fichier1 fichier2 etc

Pour vérifier le statut

msoft@BigMsoft ~/anim $ cvs status fichier


Retirer un fichier

msoft@BigMsoft ~/anim $ cvs remove fichier1 fichier2 etc


Retirer un répertoire
Il n'est pas possible de supprimer un message du serveur. Il faut se connecter directement au serveur.

Partager les modifications

msoft@BigMsoft ~/anim $ cvs commit
msoft@BigMsoft ~/anim $ cvs commit fichier1 fichier2 etc


Fonctionnalités avancées
Historique des modifications

msoft@BigMsoft ~/anim $ cvs log
msoft@BigMsoft ~/anim $ cvs log fichier1 fichier2 etc


Comparer des versions

msoft@BigMsoft ~/anim $ cvs diff -r 1.2 fichier

Ou si on veut comparer deux versions quelconques:

msoft@BigMsoft ~/anim $ cvs diff -r 1.1 -r 1.2 fichier


Revenir sur des modifications

msoft@BigMsoft ~/anim $ cvs update -A fichier
msoft@BigMsoft ~/anim $ rm fichier
msoft@BigMsoft ~/anim $ cvs update -p -r1.1 fichier > fichier
msoft@BigMsoft ~/anim $ cvs commit fichier

Installation serveur SSH sur Windows

Mots-clé: serveur, ssh, windows

(ce texte provient de la base de connaissance du site www.commentcamarche.net)

ETAPE 1 - Installation de Cygwin

1) téléchargez l'installeur Cygwin (setup.exe) de http://www.cygwin.com/ et lancez-le.

1.a) Fenêtre "Choose installation type": Choisissez "Install from internet"

1.b) Fenêtre "Choose Installation Directory": Laissez toutes les valeurs par défaut.

1.c) Fenêtre "Select Local Package directory": Laissez les valeurs par défaut.
(Les fichiers d'installe cygwin seront placés dans un sous-répertoire de setup.exe)

1.d) Fenêtre "Selection connection type": Entrez d'éventuels paramètres de proxy si vous
en utilisez un.

1.e) Fenêtre "Choose Download Site(s)": Choisissez un site de téléchargement
proche de chez vous.
Par exemple, en Belgique, choisissez les serveurs en .be.
En France, choisissez les serveurs en .fr.
Au pire, choisissez des serveurs dans des pays voisins (exemple: .de (Allemagne) pour la France.)

1.f) Fenêtre "Select packages", cliquez sur le bouton "View" pour voir la liste des paquets.
Descendez dans la liste pour trouver "openssh: The OpenSSH server and client programs"
et cliquez sur le mot "Skip" pour sélectionner ce package.
Le mot "Skip" doit alors être remplacé par la version d'openssh (pa exemple "4.2p1-1").

D'autres packages vont automatiquement être sélectionnés.

Cliquez sur "Next": Le téléchargement commence.
(Il va télécharger environ 17 Mo de fichiers.)

1.g) Fenêtre "Create icons": cliquez sur "Finish".

L'installation de Cygwin est terminée.


ETAPE 2 - Configuration du serveur ssh

2.1) Modification de l'environnement:

- faites un clic-droit sur le poste de travail > "Propriétés" > "Avancé"
> "Variables d'environnement" > "Variables système".

- Cliquer sur "Nouveau", et entrer la variable: CYGWIN
valeur: ntsec tty

- Sélectionnez PATH dans la liste, cliquez "Editer" et ajoutez: ;C:\Cygwin\bin
à la fin du chemin.

2.2) Création des groupes et utilisateurs.
Ouvrez la fenêtre Cygwin.

2.2.a) Créez les users et les groupes:
- Users : mkpasswd -l > /etc/passwd
- Groupes: mkgroup -l > /etc/group

Cela va prendre les users et groupes de Windows et les créer dans les fichiers correspondants Cygwin.
Pour utiliser les groupes/users du domaine (au lieu de local), remplacez -l par -d
Pour ajouter un user précis, utilisez -u. Exemple: mkpasswd -u johnny -l > /etc/passwd

2.2.b) Lancez: ssh-host-config -y

Il est possible qu'il demande un mot de passe pour la création d'un user "sshd_server"
(par exemple sous Windows 2003). C'est le user qui sera utilisé pour faire tourner
le service sshd.

Quand il demande "CYGWIN=", entrez: ntsec tty

Cela va créer le service sshd dans Windows.
Il apparaîtra sous le nom "CYGWIN sshd" dans la liste des services.
Il est en principe configuré pour démarrer automatiquement, mais il n'est pas encore démarré.


ETAPE 3 - Lancement du service sshd et test

3.a) Démarrez le service avec la commande: net start sshd
ou: cygrunsrv -S sshd

(Notez que le service démarrera automatiquement au prochain redémarrage de Windows:
Vous n'aurez donc plus à taper cette commande.)

3.b) Testez le service.
Utilisez le client ssh fourni avec cygwin: ssh monlogin@localhost
ou bien Putty (client ssh gratuit): http://www.chiark.greenend.org.uk/~sgtatham/putty/

A la première connexion, le client ssh va probablement vous demander de confirmer la clé.
Ensuite, après l'entrée du mot de passe, vous devez obtenir un shell.

Vous pouvez voir la connexion en tapant: echo $SSH_CONNECTION
(Port 22 = votre serveur ssh)


REMARQUES

Gestion des utilisateurs
Tout utilisateur déclaré dans /etc/passwd pourra se loguer sur le serveur ssh.
Vous pouvez donc limiter la liste des utilisateurs pouvant se connecter sur le serveur ssh en
modifiant le fichier C:\cygwin\etc\passwd
Note: vous devez laisser les users sshd et sshd_server. Le serveur ssh en a besoin.

Accès aux disques Windows
N'oubliez pas que sous le shell Cygwin, vous pouvez accéder à vos disques Windows:
Par exemple, /cygdrive/c pour accéder à C: (et ainsi de suite pour les autres lecteurs.)

Utilisations
En plus du shell, vous avez bien entendu la possibilité d'utiliser votre serveur ssh pour le transfer sécurisé de fichiers (scp/sftp).
Sous Windows, on trouve des clients scp/sftp gratuits:
- pscp/psftp : http://www.chiark.greenend.org.uk/~sgtatham/putty/
- WinSCP : http://winscp.net/

Le serveur SSH peut également tunneller pour vous tout protocole basé sur TCP. (Pour être précis, c'est équivalent à un port-forwarding distant).
Exemple, pour établir un tunnel:
Votre machine -----> client ssh local (port 777) -----> serveur ssh (port 22) ----> pop.free.fr (port 110).

On entrerait:
ssh -L 777:pop.free.fr:110 monLogin@monServeurSsh

Puis il suffit de connecter votre logiciel de mail sur localhost:777 au lieu de pop.free.fr:110 : ssh tunnellera tout cela vers pop.free.fr, port 110.
Vous pourrez donc lire votre courrier sur localhost:777.
Cela peut être utile pour traverser des réseaux non sûrs (par exemple tout ce qu'il y a entre votre machine et le serveur ssh).


Sécurité
Pour compléter cette installation, il faudrait ajuster les droits d'accès aux fichiers du user
utilisé pour lancer le service sshd afin d'améliorer la sécurité.

Pensez à lancer de temps en temps l'installeur Cygwin pour mettre à jour openssh et openssl.
(Arrêtez le service avant de faire cette mise à jour.).
Cela vous permettra de bénéficier des mises à jour de sécurité d'openssh et openssl.

Liens
La rédaction de ce document a été aidée par http://www.cs.princeton.edu/~sudhakar/linux/cache/cygwin-sshd.html (en anglais).

Raccources pour clavier Logitech Cordless LX700

Mots-clé: keycode, clavier, logitech, cordless, touche, multimedia, code, évènement

Avec le noyau i386, les "keycodes" sont renvoyés directement, il n'est pas donc pas nécessaire de configurer quoi que ce soit. Par contre pour le noyau i686, les codes ne sont pas renvoyés pour certaines touches, il faut donc les configurer à la main à chaque démarrage. La fonction xev permet de connaître les "keycodes" et savoir les touches pour lesquelles aucun code n'est renvoyé. En fait même si aucun "keycodes" apparaît, le clavier envoie bien des évènements vers le noyau. Seulement il faut configurer cet évènement pour qu'il puisse renvoyer un "keycode".

Pour voir la configuration des évènements du clavier, on peut utiliser les fonctions (en tant que super user):
/usr/bin/setkeycodes: pour enregistrer un code de renvoi
/usr/bin/getkeycodes: pour avoir les codes qui existent déjà.

Pour configurer tous les évènements, on peut utiliser le code suivant:

setkeycodes e011 216 e075 148 e074 212 6c 105 6e 106
e001 154 6d 206 e004 202 6a 203 6b 219 e014 181
e013 182 e015 188 e055 187 e031 152 e078 167
e02d 168 e02f 162 e02c 192 e025 195 e026 194
e03b 227 e03c 228 e03d 229 e03e 230 e03f 231
e040 232 e041 233 e042 234 e043 235 e044 236
e057 237 e058 238


La fonction xev permettra de vérifier que les codes correspondant aux évènements sont bien envoyés.