vendredi 27 novembre 2009

Entre QT et Cocoa : QTableWidget vs. NSTableView

Aujourd'hui, je vous propose un petit comparatif pas très équitable. Je dit cela car mon expérience en QT4 est largement inférieur à celle que j'ai en Cocoa.
Cependant, je préfère largement Cocoa sur la gestion de l'affichage des données dans un tableau.
Les différences :
- Cocoa utilise un objet qui est "passif" (se contente de répondre à des demandes) alors que QT4 oblige le développeur à remplir le tableau à la main !
- En QT4, il y a une différence entre la ligne active et la ligne sélectionné, je vois pas pourquoi !
- En QT4, si on souhaite bloquer la sélection à une simple ligne cela implique une sélection obligatoire
- En QT4, vous sélectionnez une cellule pas une ligne !
- En QT4, la ligne sélectionné peu vous poser des problèmes quand vous souhaitez rafraîchir le contenu de la table.
- Lors de l'ajout d'une ligne il faut créer soit même la ligne et ajouter les objets pour chaque cellule.
- Par contre, en QT4 la table est bien plus souple et plus configurable. Mais à quel prix !
- En Cocoa, le changement de sélection renvoie un message au delegate, en QT4 la selection d'une cellule appelle une fonction.

Il y a de forte chance que j'utilise mal les QTableWidget. Mais je trouve aussi que c'est un peu le basard dans la façon de faire. Il y a un peu de MVC et du "fait tout toi même" !

Un souhait de cadeau : Cocoa en multi-plateforme ! Apple ?

mercredi 25 novembre 2009

Créer un cluster Apache 2

Aujourd'hui je vais vous montrer comment faire pour mettre en place un cluster de 3 machines virtuelles avec Apache. Chacune des machines dispose de la même configuration logiciel. Je me concentrerais plus sur la configuration des machines.

La première chose à faire est de déterminer les adresses ip des 4 serveurs.
Serveur hôte : 192.168.0.2
Cluster 1 Server 1 : 192.168.0.3
Cluster 1 Server 2 : 192.168.0.4
Cluster 1 Server 3 : 192.168.0.5

Dans ce post, je suppose que vous savez configurer et créer une machine virtuel sur virtualBox, que vous savez installer une debian, utiliser SSH, utiliser pico et connaissez les commandes de base pour la navigation dans les fichiers sur Linux.

Quelques précisions sur la configuration et le système utilisé :
- La distribution Linux utilisé est une Debian Lenny (5.0.2).
- Le dossier DocumentRoot des 3 machines du cluster est stocké sur le serveur hôte. L'accès ce fait par NFS.
- Le dossier de stockage contient les sous dossiers suivants : wData qui contient les pages web; wLog qui contient les fichiers log Apache ; wSession contient les fichiers de sessions PHP et wConf qui contient une sauvegarde des fichiers de configuration.
- La configuration Réseau des machine virtuel est en mode "pont".
- Lors de l'installation du système nous utilisons tout le disque dans une seule partition (disque de 4Go).
- Les éléments installés avec le système sont "Serveur Web" et "Système de base".
- Après l'installation, la première chose à faire est d'installer "openssh-server" et "php5-mysql" pour permettre l'accès au serveur en SSH et activer le support de MySQL dans PHP5.

La machine hôte est un serveur fonctionnant sur Mac Os X Server (10.5). Nous disposons d'une partition nommé Data dans laquelle ont stock toutes les données. Dans cette partition nous allons créer un dossier "wVirtual" qui sera partagé via NFS. Ce dossier contiendra les données pour les serveurs apaches des machines virtuelles. Dans ce dossier nous allons créer "wCluster1" qui contiendra les données pour les 3 machines du cluster. Puis l'arborescence telle que décrit plus bas.
Pour effectuer le partage NFS du dossier wVirtual, il faut utiliser l'utilitaire "Server Admin".
Dans les options du partages, choisissez :
- (Cocher) Exporter cet élément et son contenu vers "Liste de clients"
- Dans la liste ajouter toutes les adresses IP des postes ayant besoins d'y accéder. Dans notre cas, la liste se limite au 3 serveurs du cluster.
- Mappage : de Root à Root
- Sécurité mnimal : Quelconque (Any)
- Décocher "lecture seule"
- Cocher "Autoriser le montage des sous-répertoires"
- Valider et sortir.
Dans le terminal nous allons créer un fichier de configuration apache pour qu'il gère le cluster.
Nous créons le fichier avec la commande : sudo pico /etc/apache2/sites/0003_192.168.0.2_80_cluster.exemple.com.conf
Voici le contenue du fichier :

<virtualhost>
ServerName cluster.exemple.com
ServerAdmin admin@exemple.com
DirectoryIndex "index.html" "index.php"
CustomLog '|/usr/sbin/rotatelogs "/var/log/apache2/access_log_app2" 604800 60' "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""
ErrorLog '|/usr/sbin/rotatelogs "/var/log/apache2/error_log_app2" 604800 60'
<IfModule mod_proxy_balancer.c>
ProxyRequests off
<proxy *>
Order deny,allow
Allow from all
</proxy>

<proxy "balancer://cluster1">
ProxySet lbmethod=byrequests
BalancerMember http://192.168.0.3/
BalancerMember http://192.168.0.4/
BalancerMember http://192.168.0.5/
</proxy>
ProxyPass / balancer://cluster1/
ProxyPassReverse / balancer://cluster1/
</ifmodule>
</virtualhost>


Sur chacune des machines du cluster :
ouvrez une session en tant que "root" (via SSH ou en console) :
- puis éditez le fichier "interfaces" : pico /etc/network/interfaces
- sur la ligne : "iface eth0 inet dhcp", changer "dhcp" en "static"
- en dessous ajoutez les lignes : "address", "netmask" et "gateway"
pour la première machine cela donne :
iface eth0 inet static
address 192.168.0.3
netmask 255.255.255.0
gateway 192.168.0.1

- Une fois modifié sortir en enregistrant
- Puis rebooter la machine
- Après le reboot, ouvrez une session en tant que root
- Créer le dossier de montage pour le partage NFS : mkdir /mnt/wData
- Changer les droits d'accès : chmod 777 /mnt/wData
- Éditer le fichier "fstab" : pico /etc/fstab
- Ajouter une ligne : 192.168.0.2:/Volumes/Data/wVirtual/wCluster1 /mnt/wData nfs defaults 0 0
- Enregistrer en sortant du fichier puis faite : mount -a
cela aura pour effet de monter les partitions non monté (tel que le partage)
- Maintenant il faut modifier la configuration d'Apache 2 pour aller chercher les documents au bon endroit. Pour cela : pico /etc/apache2/sites-enabled/000-default
- Changer les lignes : "DocumentRoot /var/www/" en "DocumentRoot /mnt/wData/wData/"
- et "<directory /var/www/>" en "<directory /mnt/wData/wData/>"
- et "ErrorLog /var/log/apache2/error.log" en "ErrorLog /mnt/wData/wLog/error-cl1s1.log" le s1 de la fin signifiant serveur 1.
- et "CustomLog /var/log/apache2/access.log combined" en "CustomLog /mnt/wData/wLog/access-cl1s3.log combined"
- Sortir en enregistrant
- Maintenant il faut indiquer à PHP le nouveau lieu de stockage des fichiers de session.
- Éditer le fichier php.ini : pico /etc/php5/apache2/php.ini
- Ajouter ceci en dessous de la ligne d'exemple : "session.save_path = /mnt/wData/wSession"
- Sortir en enregistrant les modifications
- La configuration est terminé il faut maintenant que le serveur la prenne en compte.
- Un petit test pour eviter les catastrophes : apache2ctl -t
- Il doit répondre "Syntax OK". Si ce n'est pas le cas, vérifier la modification du fichier 000-default
- si c'est OK, exécuter : apache2ctl graceful
Le serveur redémarre en n'indiquant rien.

Petit test dans un navigateur en se rendant sur la page : 192.168.0.3 puis les autres serveurs.
Puis le tests final est d'accéder au domaine configurer : http://cluster.exemple.com

Comme à l'accoutumée, j'attends vos réactions !

vendredi 23 octobre 2009

Créer une fenêtre d'attente efficace en Objective-C

Avant de rentrer dans la façon de faire, voyons déjà le pourquoi.
Certain utilisateur sont déjà abituer a voir une fenêtre d'attente pendant l'ouverture du logiciel. Le premier logiciel qui me viens a l'esprit (et qui utilise ce genre de fenêtre) est Photoshop.
Maintenant, voyons les critères pour justifier l'utilisation de ce genre de fenêtre.
Il faut que je logiciel mette un certain temps à ce lancer (plusieurs secondes), que la fenêtre puisse s'ouvrir le plus tôt possible (pour donner une impression de réactivité élevé du logiciel) et enfin qu'elle disparaisse dès que le logiciel est près à l'utilisation.

Maintenant, entrons dans le vif du sujet et voyons comment s'y prendre en Objective-C. Cette méthode expliquée ici n'utilise pas de fichier NIB pour la fenêtre car jugé trop long à charger. Nous allons donc la créer à la main (dans le code). Cependant, nous ne somme pas devin et les coordonées et tailles des objets ne vons pas sortir comme ça. Pour cela nous utiliserons Interface Builder pour modéliser visuellement le résultat et ainsi obtenir les informations manquantes.

Tout logiciel dispose d'une class principale qui sera chargé en premier. En général elle se nomme AppController.

Dans le fichier d'entête '.h' nous alons ajouter une variable d'instance:
NSWindow * startscreen;

Maintenant, dans le fichier '.m' nous allons ajouter le code de création de la fenêtre dans la méthode -(id) init. C'est la première à être appelée après alloc.
NSRect frameWindow=NSMakeRect(10.,50.,560.,350.); //définition de la taille de la fenêtre
startscreen=[[NSWindow alloc] initWithContentRect:frameWindow
styleMask:NSBorderlessWindowMask
backing:NSBackingStoreBuffered
defer:NO
screen:[NSScreen mainScreen]];//création de la fenêtre
//paramétrage de la fenêtre. Elle affiche une image.
[startscreen setBackgroundColor:[NSColor windowBackgroundColor]];
[startscreen setHasShadow:YES];
NSImage * image=[NSImage imageNamed:@"monimage.png"];
NSImageView * iv=[[NSImageView alloc] initWithFrame:NSMakeRect(0.,0.,560.,350.)];
[iv setImage:image];


[[startscreen contentView] addSubview:iv];
[startscreen center]; //centrage de la fenêtre
[startscreen makeKeyAndOrderFront:self];//affichage de la fenêtre
//enregistrement au notification center que je souhaite être averti de la fin du lancement de l'application
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidFinishLaunching:) name:NSApplicationDidFinishLaunchingNotification object:nil];

Puis dans sous la méthode init, nous ajoutons la fonction lié à l'événement de fin de chargement de l'application:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification{
[startscreen close];
}


Et voilà! En quelques lignes de code vous disposez d'une magnifique fenêtre d'attente sans barre de titre, centré et composé uniquement de l'image. A vous de l'agrémenter à votre grès.

mardi 13 octobre 2009

Comment activer TimeMachine sur un NAS

Pour permettre à Time Machine de sauvegarder via le réseau sur autre chose que les Time Capsule d'Apple, il suffit d'exécuter une petite ligne de commande. Attention toute fois, cela n'est pas supporté par Apple !

Source : http://www.engadget.com/2007/11/10/how-to-enable-time-machine-on-unsupported-volumes/

lundi 12 octobre 2009

Mactonique IDE 0.3.9 + Bug

Pour ceux qui ne l'aurait pas remarqué la version 0.3.9 de Mactronique IDE est disponible depuis quelques temps. cependant un bug plutôt gênant a été découvert dans cette version.
Après avoir crée un nouveau fichier, mieux vaut l'enregistrer, le fermer pour le réouvrir. Car en dehors de cette manipulation tout le contenu du fichier sera efface lors de l'enregistrement.
Ce bug était déjà présent dans une version ultérieur mais avait été corrigé. J'espère pouvoir trouver une solution à ce problème rapidement.