Méthode B/Introduction
Selon J.R. Abrial, auteur de B, B est :
"B est une méthode pour spécifier, concevoir et coder des systèmes logiciels" (J.R. Abrial in The B Book, page XV)

Méthode B/B classique
Ce qui a été dit en introduction concerne le "B classique". Le "B événementiel" conserve tous les concepts du "B classique". Mais au lieu de spécification des opérations d'une machine, on spécifie des événements, un événement étant modélisé par une opération gardée. Un événement, contrairement à une opération, n'est pas appelé.

Guide d'utilisation de l'IRC/Fabriquer un bot IRC

On nomme "Bot IRC" un programme destiné à interagir avec les autres utilisateurs présents sur un canal IRC, et cela de façon automatique. Il est vu par les autres utilisateurs comme un utilisateur normal.
Les tâches pouvant être accomplies automatiquement sont multiples : filtrage de certains mots pour éviter les insultes ou affichage d'un message de bienvenue aux utilisateurs venant de se connecter. Le bot étant programmable, les possibilités sont multiples et ne dépendent que des intentions du créateur.
Les bots IRC peuvent être programmés dans un grand nombre de langage puisque IRC est basé sur un protocole. Il est toujours possible de construire et d'envoyer des sockets manuellement, opération que presque tous les langages peuvent effectuer. Cependant, certains sont mieux adaptés et présentent des librairies spécifiques permettant de faciliter grandement la conception. De plus, certains logiciels IRC comme Xchat permettent la programmation très simple de bots grâce à l'installation de plug-ins.
Requêtes basiques avec IRC.
Liste de toutes les commandes, voir la RFC : http://abcdrfc.free.fr/rfc-vf/rfc1459.html (en français)
Exemple d'utilisation basique avec Telnet : 
Vous pouvez taper les commandes suivantes dans une console supportant Telnet (remplacer irc_server par le nom ou l'adresse du serveur sur lequel vous souhaitez vous connecter par exemple 195.50.191.14)
 telnet <irc_serveur> <port (6664 a 6667 généralement)>
 --> Affichage d'informations de connexion
 NICK <votre_surnom>
 USER <nom_utilisateur> <nom_serveur> <nom_serveur> <vrai_nom>
 --> Affichage d'information sur le serveur et ses règles
 JOIN #<canal>
Vous êtes maintenant connecté sur le serveur et avez rejoint un canal
Pour de l'aide, taper HelpServ suivit du nom de la commande
Programmation d'un bot avec Python grâce à la bibliothèque IRClib.
import irclib
network = 'irc.freenode.net'
port = 6667
channel = '#irclib'
nick = 'PyTest'
name = 'Python Test'
irc = irclib.IRC()
server = irc.server()
server.connect (network, port, nick, ircname = name)
server.join (channel)
irc.process_forever()

Programmation C sharp/Exécution distante

Une application .NET peut être un service distant et peut s'exécuter comme :
Serveur Remoting.
À l'aide de la librairie codice_1 à placer dans l'application servante et cliente, celles-ci peuvent partager une classe par Marshaling suivant un canal Http, Ipc ou Tcp.
Le remoting utilise les échanges RPC.
Dans cette solution :
L'interface partagée.
Une interface IOperations comprenant un prototype d'addition.
namespace IRemoteMath
 public interface IOperations
 int Addition(int a, int b);
Le serveur.
Le serveur est l'application qui distribue ses services. Pour qu'elle déserve à distance, il lui faut :
Implémenter IOperations.
La classe à servir doit faire partie du service distributeur ici RemoteServer
namespace RemoteServer
 public class RemoteOperations : MarshalByRefObject, IRemoteMath.IOperations
 // l'objet aura une durée de vie illimitée
 public override object InitializeLifetimeService()
 return null;

// cette méthode sera servie
 public int Addition(int a, int b)
 Console.WriteLine(String.Format("> Addition() : a={0}, b={1}", a, b));
 return a + b;
MarshalByRefObject signifie que RemoteOperations fera l'objet d'un marshaling.
Configurer RemoteMain.
Pour écouter les appels, le serveur doit créer un canal d'écoute sur un port et enregistrer le service à distribuer.
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
namespace RemoteServer
 class RemoteMain
 [STAThread]
 static void Main(string[] args)
 try
 // Création du canal sur le port 1050
 TcpChannel channel = new TcpChannel(1050);
 // Enregistrement du canal
 ChannelServices.RegisterChannel(channel);
 // Distribution de l'objet en mode singleton
 RemotingConfiguration.RegisterWellKnownServiceType(
 typeof(RemoteOperations),
 "RemoteOperations",
 WellKnownObjectMode.Singleton);
 Console.WriteLine("Serveur démarré");
 Console.ReadLine();
 catch
 Console.WriteLine("Erreur au démarrage");
 Console.ReadLine();
Le client.
Le client appelle les services. Pour qu'elle soit servie, il lui faut :
using System;
using System.Text;
// Remoting
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
namespace RemoteClient
 class RemoteTestClient
 // préparation de l'objet distribué
 private IRemoteMath.IOperations remoteOperation;
 public RemoteTestClient()
 try
 // init channel - facultatif
 // TcpChannel channel = new TcpChannel();
 // ChannelServices.RegisterChannel(channel);
 // init IOperations < RemoteServer.RemoteOperations
 this.remoteOperation = (IRemoteMath.IOperations)Activator.GetObject(
 typeof(IRemoteMath.IOperations),
 "tcp://localhost:1050/RemoteOperations");
 catch { 
 Console.WriteLine("Erreur de connexion"); 
 public void RemoteAddition(int a, int b)
 try
 if (this.remoteOperation != null)
 Console.WriteLine("Résultat : " + this.remoteOperation.Addition(a, b).ToString());
 catch 
 Console.WriteLine("Erreur à l'appel");
 [STAThread]
 static void Main()
 RemoteTestClient Client = new RemoteTestClient();
 Client.RemoteAddition(15, 20);
 System.Threading.Thread.Sleep(5000);
Application.
Le résultat du client devrait être :
Le message du serveur devrait être :