Thomas Annan (1829–1887) était un photographe écossais connu avoir été le premier à enregistrer les pitoyables conditions de logement des habitants de Glasgow. Il était l'un des sept enfants d'un fileur de lin, John Annan.
Après avoir appris la lithogravure à Cupar il déménagea pour Glasgow où, après avoir acquis les droits d'utilisation du procédé de photogravure inventé par William Henry Fox Talbot, il devint photographe commercial en 1855 et installa en 1857 un studio photographique dans "Sauchiehall Street". Il s'intéressa d'abord à la reproduction d'œuvres d'art, à la photographie d'architecture et au portrait. La même année, il voyagea dans toute l'Écosse, dans une roulotte qu'il utilisait comme chambre noire. En 1859, il ouvrit un studio de portraits dans "Hope Street", à Glasgow. Pour reproduire une toile de son ami le peintre et calotypiste David Octavius Hill, il fabriqua un appareil spécial muni d'un objectif Dallmeyer. Associé avec son frère Robert, il acheta les droits d'exploitation du procédé au charbon breveté par Joseph Wilson Swan. Le studio porta d'ailleurs le nom de "T. et R. Annan".
En 1866, Thomas Annan est engagé par le "Glasgow Improvement Trust" pour photographier les taudis de la ville. L'ensemble des photographies qu'il produit alors, intitulé "Old Closes and Streets of Glasgow", constitue un documentaire social de grande valeur et qui lui valut une certaine prospérité.
Le fils de Thomas Annan, James Craig Annan (1864-1946), continua l’œuvre de son père. Le travail de la famille est conservé dans la "Annan Fine Art Gallery", installée dans "Woodlands Road" à l'ouest de Glasgow.

Débutez dans IRC/Autres clients/IRC « camping »

Vous pouvez continuer à utiliser IRC sur d'autres supports que votre ordinateur.
IRC sur iPod Touch/iPhone.
Si vous possédez un iPod Touch ou un iPhone, vous pouvez installer un client IRC comme Colloquy (payant) ou LimeIRC (payant lui aussi).
IRC par navigateur web.
Si vous êtes sur un ordinateur public ou que vous n'avez pas de client IRC sous la main, vous pouvez utiliser votre navigateur pour vous connecter sur différents réseaux :
IRC sur Android.
Android est un système d'exploitation en partie Open Source pour smartphones, PDA et terminaux mobiles. Le client fIRC, conçu par Laurence Muller, peut être installé sur cet OS.

Débutez dans IRC/Autres clients
Nous vous avons présenté IRC en utilisant Pidgin, cependant, d'autres clients existent. En voici une liste non-exhaustive.
__NOEDITSECTION__

Implémentation d'algorithmes classiques/Algorithmes de tri/Tri à bulles

Principe.
Le tri à bulles ou tri par propagation est un algorithme de tri qui consiste à faire remonter progressivement les plus grands éléments d'un tableau, comme les bulles d'air remontent à la surface d'un liquide.
Version Caml récursive.
let rec bulle l = match l with
 | [a] -> [a]
 | s::(t::q) -> if s<t then s::(bulle (t::q))
 else t::(bulle (s::q));;
let rec tri_bulle l =
 if bulle l = l then l else tri_bulle (bulle l) ;;
C.
Version la plus simple.
 * et aux macros true et false.*/
void tri_a_bulle(int t[], int const n) 
 /* Booléen marquant l'arrêt du tri si le tableau est ordonné */
 int en_desordre = 1; 
 /* Boucle de répétition du tri et le test qui
 arrête le tri dès que le tableau est ordonné(en_desordre=false) */
 while (en_desordre)
 /* Supposons le tableau ordonné */
 en_desordre = 0;
 /* Vérification des éléments des places j et j+1 */
 for (int j = 0; j < n-1; j++)
 /* Si les 2 éléments sont mal triés */
 if(t[j] > t[j+1])
 /* Inversion des 2 éléments */
 int tmp = t[j+1];
 t[j+1] = t[j];
 t[j] = tmp;
 /* Le tableau n'est toujours pas trié */
 en_desordre = 1;
Version optimisée évitant de parcourir la fin du tableau déjà triée.
 * et aux macros true et false.
void tri_a_bulle(int *t, int const size) 
 bool en_desordre = true;
 for (int i = 0; i < size && en_desordre; ++i)
 en_desordre = false;
 for (int j = 1; j < size - i; ++j)
 if (t[j-1] > t[j])
 int temp = t[j-1];
 t[j-1] = t[j];
 t[j] = temp;
 en_desordre = true;
C++.
Version optimisée évitant de parcourir la fin du tableau déjà triée.
void tri_a_bulle(int *t, int const size) 
 bool en_desordre = true;
 for (int i = 0; i < size && en_desordre; ++i)
 en_desordre = false;
 for (int j = 1; j < size - i; ++j)
 if (t[j-1] > t[j])
 std::swap(t[j], t[j-1]);
 en_desordre = true;
Cobol.
Inclut la saisie du tableau et le tri.
 identification division.
 program-id. tribulle.
 environment division.
 data division.
 working-storage section.
 01 tableau-nombres-info.
 05 tabentiers pic 999 occurs 100 times.
 77 maxval pic 99 value 5.
 77 repete pic 999.
 77 i pic 999.
 77 j pic 999.
 77 temp pic 999.
 77 desordre pic 9 value 1.
 procedure division.
 * saisie des valeurs
 perform saisie varying i from 1 by 1
 until i greater than maxval
 * affichage des valeurs non triées
 perform affiche varying i from 1 by 1
 until i greater than maxval
 accept temp
 * tri du tableau
 PERFORM boucle
 VARYING i FROM 1 BY 1
 UNTIL (i GREATER THAN maxval) or (desordre equal 0)
 AFTER j from 1 by 1 UNTIL (j GREATER THAN maxval - i).
 * affichage des valeurs triées
 perform affiche varying i from 1 by 1
 until i greater than maxval
 accept temp
 stop run.
 saisie.
 display "Entrez nombre " i ": "
 accept tabentiers (i).
 affiche.
 display "nombre " i ": " tabentiers (i).
 boucle.
 if tabentiers (j) GREATER THAN tabentiers (j + 1)
 move tabentiers (j) to temp
 move tabentiers (j + 1) to tabentiers (j)
 move temp to tabentiers (j + 1)
 move 1 to desordre.
Java ou C#.
Tri de tableau.
public static void triBulle(int[] tableau)
 int longueur=tableau.Length;
 boolean permut;
 do
 // hypothèse : le tableau est trié
 permut=false;
 for (int i=0 ; i<longueur-1 ; i++)
 // Teste si 2 éléments successifs sont dans le bon ordre ou non
 if (tableau[i] > tableau[i+1])
 // s'ils ne le sont pas on échange leurs positions
 //la méthode echanger doit être implémenté
 echanger(tableau,i,i+1);
 permut=true;
 while(permut);
Tri de vector.
En Java, marche aussi sous J2ME sans structure do+while ou tableau, avec un Vector de My_obj :
public Vector tri_bulle (Vector vec)
 int limit = vec.size();
 boolean permutation = true;
 My_Obj obj_one; 
 My_Obj obj_two; 
 while (permutation)
 permutation = false;
 for (int i=0 ; i<limit-1 ; i++)
 obj_one = (My_obj)vec.elementAt(i);
 obj_two = (My_obj)vec.elementAt(i+1);
 if (obj_one.get_COMPARE_VALUE() > obj_two.get_COMPARE_VALUE())
 vec.setElementAt(obj_one, i+1);
 vec.setElementAt(obj_two, i);
 permutation = true;
 return vec;
Pascal.
Version optimisée évitant de parcourir la fin du tableau déjà triée.
const MAX = 100; (* MAX = 100 est donné en exemple seulement *)
type tab = array [1..MAX] of integer;
procedure TriBulle(n: integer ; var t: tab);
var i,tmp: integer;permut:boolean;
begin (* On a choisi le sens croissant pour trier le tableau *)
 repeat
 permut:=false;
 for i:=1 to (n-1) do
 begin
 if(t[i] > t[i+1]) then
 begin
 tmp := t[i];
 t[i] := t[i + 1];
 t[i+1] := tmp;
 permut:=true;
 end;
 end;
 n:=n-1;
 until(non (permut)) or (n=1);
end;
PHP.
function bubble_sort($array)
 $i = count($array);
 if ($i <= 0) return false;
 do
 $ok = false;
 for($j=$i-1; $j!=0; $j--)
 if ($array[$j] < $array[$j-1])
 $tmp = $array[$j];
 $array[$j] = $array[$j-1];
 $array[$j-1] = $tmp;
 $ok = true;
 while($ok);
 return $array;
Python.
def bubble_sort(data):
 n = len(data)
 swapped_elements = True
 while swapped_elements:
 swapped_elements = False
 for j in range(0, n-1):
 if data[j] > data[j+1]:
 swapped_elements = True
 data[j],data[j+1] = data[j+1],data[j]
 return data

Photographie/Fabricants/Nikon/Appareils argentiques Nikon/Nikon F2

Photographie/Fabricants/Nikon/Appareils argentiques Nikon/Nikkormat EL

Photographie/Fabricants/Rollei/Rollei Rolleiflex SL 35

Photographie/Fabricants/KMZ/KMZ Zenit E
Implémentation d'algorithmes classiques/Algorithmes de tri/Tri fusion