[{"data":1,"prerenderedAt":3249},["ShallowReactive",2],{"post-debian-etch-cle-usb":3,"related-debian-etch-cle-usb":1180},{"id":4,"title":5,"author":6,"body":7,"category":1119,"categorySlug":1120,"date":1121,"description":1122,"excerpt":1123,"extension":1169,"location":1170,"meta":1171,"navigation":1172,"path":1173,"published":1172,"seo":1174,"slug":1175,"stem":1176,"tags":1177,"timeToRead":513,"__hash__":1179},"posts\u002Fposts\u002FSysAdmin\u002F2007-08-04-debian-etch-cle-usb.md","Debian etch - Clé USB","Ulrich Vandenhekke",{"type":8,"value":9,"toc":1111},"minimark",[10,19,35,38,69,79,94,99,104,111,156,160,174,180,196,200,204,207,223,245,258,266,269,358,362,371,586,590,597,612,616,619,624,631,637,660,671,677,695,699,714,720,727,731,737,743,749,753,766,806,823,827,871,885,891,895,898,952,956,971,989,999,1005,1011,1017,1021,1037,1043,1047,1050,1056,1107],[11,12,13,14,18],"p",{},"Il peut être parfois utile de se déplacer ici et là avec une\ndistribution Linux ",[15,16,17],"em",{},"clé en main"," sans se trimbaler toujours avec un\nordinateur portable ou un CD.",[11,20,21,22,34],{},"La clé USB devient alors très utile atteignant aujourd'hui des tailles\nde l'ordre de 2G pour pas trop cher",[23,24,25],"sup",{},[26,27,33],"a",{"href":28,"ariaDescribedBy":29,"dataFootnoteRef":31,"id":32},"#user-content-fn-1",[30],"footnote-label","","user-content-fnref-1","1",". De petite taille, elle\npeut être utilisée dans des endroits ayant des ordinateurs avec un\nsystème d'exploitation propriétaire (ou un autre système libre, ou même\npas sans système) mais permettant de démarrer sur un périphérique\nexterne (une clé USB par exemple).",[11,36,37],{},"L'utilité peut-être variable :",[39,40,41,45,60,63,66],"ul",{},[42,43,44],"li",{},"Surfer avec une plus grande tranquillité",[42,46,47,48,52,53,52,56,59],{},"Utiliser ses logiciels favoris ( ",[49,50,51],"code",{},"Amarok",", ",[49,54,55],{},"KMyMoney",[49,57,58],{},"KDevelop",",\n... )",[42,61,62],{},"Utiliser une interface graphique, bien sûr, meilleure.",[42,64,65],{},"Utiliser dans un système embarqué.",[42,67,68],{},"Tester les ordinateurs portables dans les magasins",[11,70,71,72,78],{},"J'ai trouvé différents sites, tel que ",[26,73,77],{"href":74,"rel":75},"http:\u002F\u002Fwww.breizh-ardente.fr\u002Fdotclear\u002Findex.php?2006\u002F12\u002F03\u002F57-usbuntu-ou-comment-installer-ubuntu-sur-un-disque-clef-usb-en-mode-persistant",[76],"nofollow","Ubuntu en mode persistant","\npermettant d'installer une distribution Ubuntu sur une clé USB ou un\ndisque dur USB.L'inconvénient de cette méthode est qu'il n'est pas\npossible d'installer uniquement ce que l'on souhaite partant\nobligatoirement d'une base LiveCD.",[11,80,81,82,87,88,93],{},"Ensuite j'ai trouvé d'autres sites, tels que ",[26,83,86],{"href":84,"rel":85},"http:\u002F\u002Fferaga.com\u002Fnode\u002F25",[76],"Howto Install a Debian\nGNU\u002FLinux system onto a USB flash thumb drive"," et ",[26,89,92],{"href":90,"rel":91},"http:\u002F\u002Fwww.debian-administration.org\u002Farticles\u002F179",[76],"Installing Debian\nonto USB flash media with everything encrypted."," dont je me suis\ninspiré pour écrire ce tutoriel.",[95,96,98],"h3",{"id":97},"préparation-de-la-clé","Préparation de la clé",[100,101,103],"h4",{"id":102},"modules","Modules",[11,105,106,107,110],{},"Afin de pouvoir accéder à la clé USB, il faut bien évidemment avoir\nchargé sur sa machine ",[15,108,109],{},"Gnu\u002FLinux"," les modules adéquates :",[112,113,117],"pre",{"className":114,"code":115,"language":116,"meta":31,"style":31},"language-bash shiki shiki-themes one-dark-pro","modprobe ehci_hcd\nmodprobe ohci_hcd\nmodprobe usbhid\nmodprobe usb_storage\n","bash",[49,118,119,132,140,148],{"__ignoreMap":31},[120,121,124,128],"span",{"class":122,"line":123},"line",1,[120,125,127],{"class":126},"sVbv2","modprobe",[120,129,131],{"class":130},"subq3"," ehci_hcd\n",[120,133,135,137],{"class":122,"line":134},2,[120,136,127],{"class":126},[120,138,139],{"class":130}," ohci_hcd\n",[120,141,143,145],{"class":122,"line":142},3,[120,144,127],{"class":126},[120,146,147],{"class":130}," usbhid\n",[120,149,151,153],{"class":122,"line":150},4,[120,152,127],{"class":126},[120,154,155],{"class":130}," usb_storage\n",[100,157,159],{"id":158},"logiciels","Logiciels",[11,161,162,163,166,167,170,171],{},"Nous allons considérer que nous sommes sur un système à base de\n",[15,164,165],{},"Gnu\u002FDebian"," (",[15,168,169],{},"Ubuntu"," devrait pouvoir faire l'affaire). Si vous avez un\nautre système, il vous faut trouver un moyen d'installer le programme\n",[49,172,173],{},"debootstrap",[11,175,176,177,179],{},"Sur un système ",[15,178,165],{},", il vous suffit de taper la commande, si le\nprogramme n'est pas déjà installé :",[112,181,183],{"className":114,"code":182,"language":116,"meta":31,"style":31},"aptitude install debootstrap\n",[49,184,185],{"__ignoreMap":31},[120,186,187,190,193],{"class":122,"line":123},[120,188,189],{"class":126},"aptitude",[120,191,192],{"class":130}," install",[120,194,195],{"class":130}," debootstrap\n",[95,197,199],{"id":198},"installation-du-système-de-base","Installation du système de base",[100,201,203],{"id":202},"partitionnement-de-la-clé-usb","Partitionnement de la clé USB",[11,205,206],{},"En premier lieu il faut effectuer le partitionnement de la clé USB.\nSelon sa taille et aussi de la quantité de logiciel que vous voulez\ninstaller il faudra prévoir plus ou moins de place.",[11,208,209,210,52,213,52,216,52,219,222],{},"Pour le partitionnement vous pouvez utiliser votre utilitaire favori\n(",[49,211,212],{},"parted",[49,214,215],{},"qtparted",[49,217,218],{},"fdisk",[49,220,221],{},"cfdisk",", ...). Le partitionnement que\nj'ai effectué pour ma propre clé est le suivant :",[224,225,226,233,239],"ol",{},[42,227,228,229],{},"50Mo pour la partition ",[230,231,232],"strong",{},"\u002Fboot",[42,234,235,236],{},"1,5Go pour la partition ",[230,237,238],{},"\u002F",[42,240,241,242],{},"le reste pour la partition ",[230,243,244],{},"\u002Fhome",[11,246,247,248,250,251,253,254,257],{},"La partition ",[230,249,244],{}," a été séparée afin de pouvoir mettre la partie\n",[230,252,238],{}," de la clé USB en ",[15,255,256],{},"lecture seule"," (étape que je n'ai pas encore\neffectuée).",[112,259,264],{"className":260,"code":262,"language":263},[261],"language-text","Disk \u002Fdev\u002Fusb\u002Fk2g: 2024 MB, 2024275968 bytes\n63 heads, 62 sectors\u002Ftrack, 1012 cylinders\nUnits = cylinders of 3906 * 512 = 1999872 bytes\n\n        Device Boot      Start         End      Blocks   Id  System\n\u002Fdev\u002Fsda1                   1          26       50747   83  Linux\n\u002Fdev\u002Fsda2                  27         827     1564353   83  Linux\n\u002Fdev\u002Fsda3                 828        1012      361305   83  Linux\n","text",[49,265,262],{"__ignoreMap":31},[11,267,268],{},"Une fois les partitions créées vous pouvez les formater pour les\nutiliser.",[112,270,272],{"className":114,"code":271,"language":116,"meta":31,"style":31},"mke2fs \u002Fdev\u002Fsda1 -L live-boot\nmke2fs \u002Fdev\u002Fsda2 -L live-root\nmke2fs \u002Fdev\u002Fsda3 -L live-home\nmount \u002Fdev\u002Fsda2 \u002Fmnt\nmkdir \u002Fmnt\u002Fboot\nmkdir \u002Fmnt\u002Fhome\nmount \u002Fdev\u002Fsda1 \u002Fmnt\u002Fboot\nmount \u002Fdev\u002Fsda3 \u002Fmnt\u002Fhome\n",[49,273,274,289,301,313,323,332,340,349],{"__ignoreMap":31},[120,275,276,279,282,286],{"class":122,"line":123},[120,277,278],{"class":126},"mke2fs",[120,280,281],{"class":130}," \u002Fdev\u002Fsda1",[120,283,285],{"class":284},"sVC51"," -L",[120,287,288],{"class":130}," live-boot\n",[120,290,291,293,296,298],{"class":122,"line":134},[120,292,278],{"class":126},[120,294,295],{"class":130}," \u002Fdev\u002Fsda2",[120,297,285],{"class":284},[120,299,300],{"class":130}," live-root\n",[120,302,303,305,308,310],{"class":122,"line":142},[120,304,278],{"class":126},[120,306,307],{"class":130}," \u002Fdev\u002Fsda3",[120,309,285],{"class":284},[120,311,312],{"class":130}," live-home\n",[120,314,315,318,320],{"class":122,"line":150},[120,316,317],{"class":126},"mount",[120,319,295],{"class":130},[120,321,322],{"class":130}," \u002Fmnt\n",[120,324,326,329],{"class":122,"line":325},5,[120,327,328],{"class":126},"mkdir",[120,330,331],{"class":130}," \u002Fmnt\u002Fboot\n",[120,333,335,337],{"class":122,"line":334},6,[120,336,328],{"class":126},[120,338,339],{"class":130}," \u002Fmnt\u002Fhome\n",[120,341,343,345,347],{"class":122,"line":342},7,[120,344,317],{"class":126},[120,346,281],{"class":130},[120,348,331],{"class":130},[120,350,352,354,356],{"class":122,"line":351},8,[120,353,317],{"class":126},[120,355,307],{"class":130},[120,357,339],{"class":130},[100,359,361],{"id":360},"installation-à-laide-de-debootstrap","Installation à l'aide de debootstrap",[11,363,364,365,367,368,370],{},"Une fois les partitions montées on peut installer le système\n",[15,366,165],{}," sur la clé USB en utilisant l'utilitaire ",[49,369,173],{}," :",[112,372,374],{"className":114,"code":373,"language":116,"meta":31,"style":31},"> debootstrap --arch i386 etch \u002Fmnt\u002F ftp:\u002F\u002Fftp2.fr.debian.org\u002Fdebian\u002F\nI: Retrieving Release\nI: Retrieving Packages\nI: Validating Packages\nI:  Resolving dependencies of required packages...\nI: Resolving dependencies of base packages...\nI: Found additional base dependencies: libdb4.2 libgnutls12 libreadline5\n    libsigc++-2.0-0c2a openbsd-inetd readline-common\nI: Checking component main on http:\u002F\u002Fftp.debian.org\u002Fdebian...\nI: Retrieving adduser\n...\nI: Configuring gnupg...\nI: Configuring sysklogd...\nI: Configuring klogd...\nI: Configuring netbase...\nI: Configuring openbsd-inetd...\nI: Base system installed successfully.\n",[49,375,376,382,393,402,411,430,446,470,481,501,511,518,529,539,549,559,569],{"__ignoreMap":31},[120,377,378],{"class":122,"line":123},[120,379,381],{"class":380},"sn6KH","> debootstrap --arch i386 etch \u002Fmnt\u002F ftp:\u002F\u002Fftp2.fr.debian.org\u002Fdebian\u002F\n",[120,383,384,387,390],{"class":122,"line":134},[120,385,386],{"class":126},"I:",[120,388,389],{"class":130}," Retrieving",[120,391,392],{"class":130}," Release\n",[120,394,395,397,399],{"class":122,"line":142},[120,396,386],{"class":126},[120,398,389],{"class":130},[120,400,401],{"class":130}," Packages\n",[120,403,404,406,409],{"class":122,"line":150},[120,405,386],{"class":126},[120,407,408],{"class":130}," Validating",[120,410,401],{"class":130},[120,412,413,415,418,421,424,427],{"class":122,"line":325},[120,414,386],{"class":126},[120,416,417],{"class":130},"  Resolving",[120,419,420],{"class":130}," dependencies",[120,422,423],{"class":130}," of",[120,425,426],{"class":130}," required",[120,428,429],{"class":130}," packages...\n",[120,431,432,434,437,439,441,444],{"class":122,"line":334},[120,433,386],{"class":126},[120,435,436],{"class":130}," Resolving",[120,438,420],{"class":130},[120,440,423],{"class":130},[120,442,443],{"class":130}," base",[120,445,429],{"class":130},[120,447,448,450,453,456,458,461,464,467],{"class":122,"line":342},[120,449,386],{"class":126},[120,451,452],{"class":130}," Found",[120,454,455],{"class":130}," additional",[120,457,443],{"class":130},[120,459,460],{"class":130}," dependencies:",[120,462,463],{"class":130}," libdb4.2",[120,465,466],{"class":130}," libgnutls12",[120,468,469],{"class":130}," libreadline5\n",[120,471,472,475,478],{"class":122,"line":351},[120,473,474],{"class":126},"    libsigc++-2.0-0c2a",[120,476,477],{"class":130}," openbsd-inetd",[120,479,480],{"class":130}," readline-common\n",[120,482,484,486,489,492,495,498],{"class":122,"line":483},9,[120,485,386],{"class":126},[120,487,488],{"class":130}," Checking",[120,490,491],{"class":130}," component",[120,493,494],{"class":130}," main",[120,496,497],{"class":130}," on",[120,499,500],{"class":130}," http:\u002F\u002Fftp.debian.org\u002Fdebian...\n",[120,502,504,506,508],{"class":122,"line":503},10,[120,505,386],{"class":126},[120,507,389],{"class":130},[120,509,510],{"class":130}," adduser\n",[120,512,514],{"class":122,"line":513},11,[120,515,517],{"class":516},"sjrmR","...\n",[120,519,521,523,526],{"class":122,"line":520},12,[120,522,386],{"class":126},[120,524,525],{"class":130}," Configuring",[120,527,528],{"class":130}," gnupg...\n",[120,530,532,534,536],{"class":122,"line":531},13,[120,533,386],{"class":126},[120,535,525],{"class":130},[120,537,538],{"class":130}," sysklogd...\n",[120,540,542,544,546],{"class":122,"line":541},14,[120,543,386],{"class":126},[120,545,525],{"class":130},[120,547,548],{"class":130}," klogd...\n",[120,550,552,554,556],{"class":122,"line":551},15,[120,553,386],{"class":126},[120,555,525],{"class":130},[120,557,558],{"class":130}," netbase...\n",[120,560,562,564,566],{"class":122,"line":561},16,[120,563,386],{"class":126},[120,565,525],{"class":130},[120,567,568],{"class":130}," openbsd-inetd...\n",[120,570,572,574,577,580,583],{"class":122,"line":571},17,[120,573,386],{"class":126},[120,575,576],{"class":130}," Base",[120,578,579],{"class":130}," system",[120,581,582],{"class":130}," installed",[120,584,585],{"class":130}," successfully.\n",[100,587,589],{"id":588},"dans-un-chroot","Dans un Chroot",[11,591,592,593,596],{},"Les opérations suivantes sont à faire sur l'environnement de\ndestination, il faut donc utiliser la commande ",[49,594,595],{},"chroot"," pour s'y placer.",[112,598,600],{"className":114,"code":599,"language":116,"meta":31,"style":31},"chroot \u002Fmnt '\u002Fbin\u002Fbash -i'\n",[49,601,602],{"__ignoreMap":31},[120,603,604,606,609],{"class":122,"line":123},[120,605,595],{"class":126},[120,607,608],{"class":130}," \u002Fmnt",[120,610,611],{"class":130}," '\u002Fbin\u002Fbash -i'\n",[100,613,615],{"id":614},"noyaux","Noyaux",[11,617,618],{},"Une fois le système de base installé, il faut le configurer et y ajouter\nde quoi démarrer la clé USB.",[620,621,623],"h5",{"id":622},"ajustement-et-systèmes-de-fichiers-etcfstab","Ajustement et systèmes de fichiers : \u002Fetc\u002Ffstab",[11,625,626,627,630],{},"Cela dépend de votre configuration, et du partitionnement que vous avez\nfait. Si vous avez fait le même partitionnement que moi vous devriez\navoir un ",[230,628,629],{},"fstab"," ressemblant à celui là :",[112,632,635],{"className":633,"code":634,"language":263},[261],"#\u002Fetc\u002Ffstab: static file system informations.\n#\nLABEL=live-root    \u002F           ext2    defaults,errors=remount-ro,noatime  0   1\nLABEL=live-boot    \u002Fboot           ext2    defaults,noatime,ro         0   2\nLABEL=live-home    \u002Fhome           ext2    defaults,noatime            0   2\nproc       \u002Fproc           proc    defaults                0   0\n#tmpfs     \u002Fetc\u002Fnetwork\u002Frun    tmpfs   defaults,noatime            0   0\ntmpfs      \u002Ftmp            tmpfs   defaults,noatime            0   0\ntmpfs      \u002Fvar\u002Flock       tmpfs   defaults,noatime            0   0\ntmpfs      \u002Fvar\u002Flog        tmpfs   defaults,noatime            0   0\ntmpfs      \u002Fvar\u002Frun        tmpfs   defaults,noatime            0   0\ntmpfs      \u002Fvar\u002Ftmp        tmpfs   defaults,noatime            0   0\n",[49,636,634],{"__ignoreMap":31},[11,638,639,640,643,644,646,647,655,656,659],{},"J'utilise le label de la partition au lieu d'utiliser le ",[15,641,642],{},"block device",".\nL'utilisation du ",[15,645,642],{}," peut gêner si la clé USB n'est pas\ntoujours détectée dans le même ordre",[23,648,649],{},[26,650,654],{"href":651,"ariaDescribedBy":652,"dataFootnoteRef":31,"id":653},"#user-content-fn-2",[30],"user-content-fnref-2","2",".Les dossiers temporaires\nsont tous reportés dans un système de fichier virtuel (en mémoire) à\nl'aide de ",[49,657,658],{},"tmpfs",".",[11,661,662,663,666,667,670],{},"Une fois le fichier ",[230,664,665],{},"\u002Fetc\u002Ffstab"," configuré, il ne reste plus qu'à\nmonter les partitions. Pour monter les partitions un simple ",[49,668,669],{},"mount -a","\nle fait. Il est aussi possible de monter les partitions une à une.",[11,672,673,370],{},[674,675,676],"ins",{},"Il est possible que la commande suivante faite hors du chroot\npuisse résoudre certain problème si l'application utilise udev,\n...",[112,678,680],{"className":114,"code":679,"language":116,"meta":31,"style":31},"mount --bind \u002Fdev\u002F \u002Fmnt\u002Fdev\u002F\n",[49,681,682],{"__ignoreMap":31},[120,683,684,686,689,692],{"class":122,"line":123},[120,685,317],{"class":126},[120,687,688],{"class":284}," --bind",[120,690,691],{"class":130}," \u002Fdev\u002F",[120,693,694],{"class":130}," \u002Fmnt\u002Fdev\u002F\n",[620,696,698],{"id":697},"le-réseau-etchostname-etchosts","Le réseau : \u002Fetc\u002Fhostname \u002Fetc\u002Fhosts",[11,700,701,702,705,706,709,710,713],{},"Le fichier ",[230,703,704],{},"\u002Fetc\u002Fhosts"," doit contenir une ligne indiquant l'adresse du\n",[15,707,708],{},"loopback"," et le nom de la machine. Ceci afin que ",[15,711,712],{},"KDE"," par exemple\npuisse démarrer :",[112,715,718],{"className":716,"code":717,"language":263},[261],"127.0.0.1       localhost.localdomain   localhost  liveding\n",[49,719,717],{"__ignoreMap":31},[11,721,722,723,726],{},"Dans le fichier ",[230,724,725],{},"\u002Fetc\u002Fhostname"," il faut également mettre le nom de la\nmachine.",[620,728,730],{"id":729},"apt-etcaptsourceslist","Apt : \u002Fetc\u002Fapt\u002Fsources.list",[11,732,701,733,736],{},[230,734,735],{},"sources.list"," contient les lignes par défaut suivantes :",[112,738,741],{"className":739,"code":740,"language":263},[261],"# etch\ndeb ftp:\u002F\u002Fftp2.fr.debian.org\u002Fdebian\u002F etch main contrib non-free\ndeb-src ftp:\u002F\u002Fftp2.fr.debian.org\u002Fdebian\u002F etch main contrib\ndeb http:\u002F\u002Fsecurity.debian.org\u002F etch\u002Fupdates main\ndeb-src http:\u002F\u002Fsecurity.debian.org\u002F etch\u002Fupdates main\n\n# etch unofficial\ndeb http:\u002F\u002Fftp.debian-unofficial.org\u002Fdebian etch main contrib non-free restricted\n",[49,742,740],{"__ignoreMap":31},[11,744,745,746,748],{},"Ces lignes permettent de télécharger les paquets par défaut de\n",[15,747,165],{}," ainsi que les paquets de sécurité, et les paquets non\nofficiels permettant d'activer certaine fonctionnalité.",[620,750,752],{"id":751},"initrd-etckernel-imgconf","Initrd : \u002Fetc\u002Fkernel-img.conf",[11,754,722,755,758,759,761,762,765],{},[230,756,757],{},"\u002Fetc\u002Fkernel-img.conf"," on enregistre les informations\nsuivantes (afin que ",[15,760,165],{}," crée un fichier ",[49,763,764],{},"initrd"," lors de\nl'installation du noyau) :",[112,767,771],{"className":768,"code":769,"language":770,"meta":31,"style":31},"language-ini shiki shiki-themes one-dark-pro","# Kernel Image management overrides\n# See kernel-img.conf(5) for details\ndo_symlinks = Yes\ndo_initrd = yes\n","ini",[49,772,773,779,784,796],{"__ignoreMap":31},[120,774,775],{"class":122,"line":123},[120,776,778],{"class":777},"sV9Aq","# Kernel Image management overrides\n",[120,780,781],{"class":122,"line":134},[120,782,783],{"class":777},"# See kernel-img.conf(5) for details\n",[120,785,786,790,793],{"class":122,"line":142},[120,787,789],{"class":788},"seHd6","do_symlinks",[120,791,792],{"class":380}," =",[120,794,795],{"class":130}," Yes\n",[120,797,798,801,803],{"class":122,"line":150},[120,799,800],{"class":788},"do_initrd",[120,802,792],{"class":380},[120,804,805],{"class":130}," yes\n",[11,807,701,808,810,811,819,820,822],{},[49,809,764],{}," permet de charger les modules nécessaires",[23,812,813],{},[26,814,818],{"href":815,"ariaDescribedBy":816,"dataFootnoteRef":31,"id":817},"#user-content-fn-3",[30],"user-content-fnref-3","3","\nau démarrage de ",[15,821,109],{}," sur une clé USB.",[620,824,826],{"id":825},"installation-de-paquet","Installation de paquet",[112,828,830],{"className":114,"code":829,"language":116,"meta":31,"style":31},"aptitude install initrd-tools linux-image-2.6.16-1-686\naptitude install grub\naptitude install localepurge\naptitude clean# localepurge\n",[49,831,832,844,853,862],{"__ignoreMap":31},[120,833,834,836,838,841],{"class":122,"line":123},[120,835,189],{"class":126},[120,837,192],{"class":130},[120,839,840],{"class":130}," initrd-tools",[120,842,843],{"class":130}," linux-image-2.6.16-1-686\n",[120,845,846,848,850],{"class":122,"line":134},[120,847,189],{"class":126},[120,849,192],{"class":130},[120,851,852],{"class":130}," grub\n",[120,854,855,857,859],{"class":122,"line":142},[120,856,189],{"class":126},[120,858,192],{"class":130},[120,860,861],{"class":130}," localepurge\n",[120,863,864,866,869],{"class":122,"line":150},[120,865,189],{"class":126},[120,867,868],{"class":130}," clean#",[120,870,861],{"class":130},[11,872,873,874,876,877,880,881,884],{},"On installe une image du noyau, ainsi que les outils pour générer\nl'image ",[49,875,764],{},". On installe également ",[49,878,879],{},"grub"," qui servira à démarrer\nsur la clé USB. Le paquet ",[49,882,883],{},"localepurge"," permet quant à lui de nettoyer\nles locales qui prennent un peu trop de place sur la clé USB.\nGénéralement je ne conserve que les locales françaises et anglaises.",[11,886,887,888,890],{},"Il est aussi possible d'installer quelques paquets comme un serveur\ngraphique, même voir ",[15,889,712],{},", ou encore des outils d'administration. On\npeut aussi installer des outils qui pourront permettre de réparer une\nmachine.",[620,892,894],{"id":893},"quelques-ajustements","Quelques ajustements",[11,896,897],{},"Afin de ne pas écrire trop souvent sur la clé USB, on remplace quelques\nfichiers.",[112,899,901],{"className":114,"code":900,"language":116,"meta":31,"style":31},"rm -f \u002Fetc\u002Fblkid.tab*\nln -s \u002Fdev\u002Fnull \u002Fetc\u002Fblkid.tab\nrm -f \u002Fetc\u002Fmtab\nln -s \u002Fproc\u002Fmounts \u002Fetc\u002Fmtab\n",[49,902,903,918,932,941],{"__ignoreMap":31},[120,904,905,908,911,914],{"class":122,"line":123},[120,906,907],{"class":126},"rm",[120,909,910],{"class":284}," -f",[120,912,913],{"class":130}," \u002Fetc\u002Fblkid.tab",[120,915,917],{"class":916},"sU0A5","*\n",[120,919,920,923,926,929],{"class":122,"line":134},[120,921,922],{"class":126},"ln",[120,924,925],{"class":284}," -s",[120,927,928],{"class":130}," \u002Fdev\u002Fnull",[120,930,931],{"class":130}," \u002Fetc\u002Fblkid.tab\n",[120,933,934,936,938],{"class":122,"line":142},[120,935,907],{"class":126},[120,937,910],{"class":284},[120,939,940],{"class":130}," \u002Fetc\u002Fmtab\n",[120,942,943,945,947,950],{"class":122,"line":150},[120,944,922],{"class":126},[120,946,925],{"class":284},[120,948,949],{"class":130}," \u002Fproc\u002Fmounts",[120,951,940],{"class":130},[95,953,955],{"id":954},"configuration-de-grub","Configuration de grub",[11,957,958,959,961,962,964,965,967,968,370],{},"Afin que la machine puisse démarrer il faut installer ",[49,960,879],{}," sur le\nsecteur de démarrage de la clé USB.Pour cela, on peut quitter le\n",[49,963,595],{},". Pour installer ",[49,966,879],{}," on peut utiliser ",[49,969,970],{},"grub-install",[112,972,974],{"className":114,"code":973,"language":116,"meta":31,"style":31},"grub-install recheck root-directory=\u002Fmnt\u002F \u002Fdev\u002Fsda\n",[49,975,976],{"__ignoreMap":31},[120,977,978,980,983,986],{"class":122,"line":123},[120,979,970],{"class":126},[120,981,982],{"class":130}," recheck",[120,984,985],{"class":130}," root-directory=\u002Fmnt\u002F",[120,987,988],{"class":130}," \u002Fdev\u002Fsda\n",[11,990,991,992,994,995,998],{},"Normalement cela devrait fonctionner ;) mais il est possible, si cela ne\nmarche pas d'essayer de l'installer à l'aide de la commande ",[49,993,879],{},"\ndirectement (attention le ",[15,996,997],{},"hd1"," est à adapter selon votre\nconfiguration) :",[112,1000,1003],{"className":1001,"code":1002,"language":263},[261],"# grub\ngrub> root (hd1,0)\ngrub> setup (hd1)\n",[49,1004,1002],{"__ignoreMap":31},[11,1006,1007,1008],{},"Il faut également renseigner le fichier ",[230,1009,1010],{},"\u002Fmnt\u002Fboot\u002Fgrub\u002Fmenu.lst",[112,1012,1015],{"className":1013,"code":1014,"language":263},[261],"# menu.lst - See: grub(8), info grub, update-grub(8)\n#            grub-install(8), grub-floppy(8),\n#            grub-md5-crypt, \u002Fusr\u002Fshare\u002Fdoc\u002Fgrub\n#            and \u002Fusr\u002Fshare\u002Fdoc\u002Fgrub-doc\u002F.\n\n## default num\n# Set the default entry to the entry number NUM. Numbering starts from 0, and\n# the entry number 0 is the default if the command is not used.\n#\n# You can specify 'saved' instead of a number. In this case, the default entry\n# is the entry saved with the command 'savedefault'.\n# WARNING: If you are using dmraid do not change this entry to 'saved' or your\n# array will desync and will not let you boot your system.\ndefault        0\n\n## timeout sec\n# Set a timeout, in SEC seconds, before automatically booting the default entry\n# (normally the first entry defined).\ntimeout        5\n\n# Pretty colours\ncolor cyan\u002Fblue white\u002Fblue\n\n## password '--md5' passwd\n# If used in the first section of a menu file, disable all interactive editing\n# control (menu entry editor and command-line)  and entries protected by the\n# command 'lock'\n# e.g. password topsecret\n#      password --md5 $1$gLhU0\u002F$aW78kHK1QfV3P2b2znUoe\u002F\n# password topsecret\n\n#\n# examples\n#\n# title        Windows 95\u002F98\u002FNT\u002F2000\n# root     (hd0,0)\n# makeactive\n# chainloader  +1\n#\n# title        Linux\n# root     (hd0,1)\n# kernel   \u002Fvmlinuz root=\u002Fdev\u002Fhda2 ro\n#\n\n#\n# Put static boot stanzas before and\u002For after AUTOMAGIC KERNEL LIST\n\n### BEGIN AUTOMAGIC KERNELS LIST\n## lines between the AUTOMAGIC KERNELS LIST markers will be modified\n## by the debian update-grub script except for the default options below\n\n## DO NOT UNCOMMENT THEM, Just edit them to your needs\n\n## ## Start Default Options ##\n## default kernel options\n## default kernel options for automagic boot options\n## If you want special options for specific kernels use kopt_x_y_z\n## where x.y.z is kernel version. Minor versions can be omitted.\n## e.g. kopt=root=\u002Fdev\u002Fhda1 ro\n##      kopt_2_6_8=root=\u002Fdev\u002Fhdc1 ro\n##      kopt_2_6_8_2_686=root=\u002Fdev\u002Fhdc2 ro\n# kopt=root=LABEL=live-root rootdelay=5 ro quiet\n\n## default grub root device\n## e.g. groot=(hd0,0)\n# groot=(hd0,0)\n\n## should update-grub create alternative automagic boot options\n## e.g. alternative=true\n##      alternative=false\n# alternative=true\n\n## should update-grub lock alternative automagic boot options\n## e.g. lockalternative=true\n##      lockalternative=false\n# lockalternative=false\n\n## additional options to use with the default boot option, but not with the\n## alternatives\n## e.g. defoptions=vga=791 resume=\u002Fdev\u002Fhda5\n# defoptions=vga=791\n\n## should update-grub lock old automagic boot options\n## e.g. lockold=false\n##      lockold=true\n# lockold=false\n\n## Xen hypervisor options to use with the default Xen boot option\n# xenhopt=\n\n## Xen Linux kernel options to use with the default Xen boot option\n# xenkopt=console=tty0\n\n## altoption boot targets option\n## multiple altoptions lines are allowed\n## e.g. altoptions=(extra menu suffix) extra boot options\n##      altoptions=(single-user) single\n# altoptions=(single-user mode) single\n\n## controls how many kernels should be put into the menu.lst\n## only counts the first occurence of a kernel, not the\n## alternative kernel options\n## e.g. howmany=all\n##      howmany=7\n# howmany=all\n\n## should update-grub create memtest86 boot option\n## e.g. memtest86=true\n##      memtest86=false\n# memtest86=true\n\n## should update-grub adjust the value of the default booted system\n## can be true or false\n# updatedefaultentry=false\n\n## ## End Default Options ##\n\ntitle      Debian GNU\u002FLinux, kernel 2.6.18-4-686\nroot       (hd0,0)\nkernel     \u002Fvmlinuz-2.6.18-4-686 root=LABEL=live-root rootdelay=5 ro quiet vga=791\ninitrd     \u002Finitrd.img-2.6.18-4-686\nsavedefault\n\ntitle      Debian GNU\u002FLinux, kernel 2.6.18-4-686 (single-user mode)\nroot       (hd0,0)\nkernel     \u002Fvmlinuz-2.6.18-4-686 root=LABEL=live-root rootdelay=5 ro quiet single\ninitrd     \u002Finitrd.img-2.6.18-4-686\nsavedefault\n\n### END DEBIAN AUTOMAGIC KERNELS LIST\n",[49,1016,1014],{"__ignoreMap":31},[95,1018,1020],{"id":1019},"ajout-dun-utilisateur","Ajout d'un utilisateur",[11,1022,1023,1024,1032,1033,1036],{},"Enfin il ne faut pas oublier d'installer un compte\nutilisateur",[23,1025,1026],{},[26,1027,1031],{"href":1028,"ariaDescribedBy":1029,"dataFootnoteRef":31,"id":1030},"#user-content-fn-4",[30],"user-content-fnref-4","4",", ainsi que changer le mot de passe ",[15,1034,1035],{},"root"," à l'aide\ndes commandes :",[112,1038,1041],{"className":1039,"code":1040,"language":263},[261],"chroot \u002Fmnt\npasswd\nadduser toto\n",[49,1042,1040],{"__ignoreMap":31},[95,1044,1046],{"id":1045},"redémarrage-et-test","Redémarrage et test",[11,1048,1049],{},"Il ne reste plus qu'à démonter toutes les partitions et redémarrer la\nmachine.",[112,1051,1054],{"className":1052,"code":1053,"language":263},[261],"umount -a\nexit\nreboot\n",[49,1055,1053],{"__ignoreMap":31},[1057,1058,1061,1067],"section",{"className":1059,"dataFootnotes":31},[1060],"footnotes",[1062,1063,1066],"h2",{"className":1064,"id":30},[1065],"sr-only","Footnotes",[224,1068,1069,1080,1089,1098],{},[42,1070,1072,1073],{"id":1071},"user-content-fn-1","J'ai par ailleurs acheté récemment une clé USB de 2Go à cet effet pour à peine 15 euros ",[26,1074,1079],{"href":1075,"ariaLabel":1076,"className":1077,"dataFootnoteBackref":31},"#user-content-fnref-1","Back to reference 1",[1078],"data-footnote-backref","↩",[42,1081,1083,1084],{"id":1082},"user-content-fn-2","Ce qui peut arriver quand on change de machine par exemple. ",[26,1085,1079],{"href":1086,"ariaLabel":1087,"className":1088,"dataFootnoteBackref":31},"#user-content-fnref-2","Back to reference 2",[1078],[42,1090,1092,1093],{"id":1091},"user-content-fn-3","i.e les modules USB, ... ",[26,1094,1079],{"href":1095,"ariaLabel":1096,"className":1097,"dataFootnoteBackref":31},"#user-content-fnref-3","Back to reference 3",[1078],[42,1099,1101,1102],{"id":1100},"user-content-fn-4","Il ne faudrait pas travailler en administrateur, hein ! ",[26,1103,1079],{"href":1104,"ariaLabel":1105,"className":1106,"dataFootnoteBackref":31},"#user-content-fnref-4","Back to reference 4",[1078],[1108,1109,1110],"style",{},"html pre.shiki code .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sVC51, html code.shiki .sVC51{--shiki-default:#D19A66}html pre.shiki code .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}html pre.shiki code .sjrmR, html code.shiki .sjrmR{--shiki-default:#56B6C2}html pre.shiki code .sV9Aq, html code.shiki .sV9Aq{--shiki-default:#7F848E;--shiki-default-font-style:italic}html pre.shiki code .seHd6, html code.shiki .seHd6{--shiki-default:#C678DD}html pre.shiki code .sU0A5, html code.shiki .sU0A5{--shiki-default:#E5C07B}",{"title":31,"searchDepth":134,"depth":134,"links":1112},[1113,1114,1115,1116,1117,1118],{"id":97,"depth":142,"text":98},{"id":198,"depth":142,"text":199},{"id":954,"depth":142,"text":955},{"id":1019,"depth":142,"text":1020},{"id":1045,"depth":142,"text":1046},{"id":30,"depth":134,"text":1066},"SysAdmin","sysadmin","2007-08-04","Il peut être parfois utile de se déplacer ici et là avec une\ndistribution Linux clé en main sans se trimbaler toujours avec un\nordinateur portable ou un CD.",{"type":8,"value":1124},[1125,1129,1136,1138,1156,1161],[11,1126,13,1127,18],{},[15,1128,17],{},[11,1130,21,1131,34],{},[23,1132,1133],{},[26,1134,33],{"href":28,"ariaDescribedBy":1135,"dataFootnoteRef":31,"id":32},[30],[11,1137,37],{},[39,1139,1140,1142,1150,1152,1154],{},[42,1141,44],{},[42,1143,47,1144,52,1146,52,1148,59],{},[49,1145,51],{},[49,1147,55],{},[49,1149,58],{},[42,1151,62],{},[42,1153,65],{},[42,1155,68],{},[11,1157,71,1158,78],{},[26,1159,77],{"href":74,"rel":1160},[76],[11,1162,81,1163,87,1166,93],{},[26,1164,86],{"href":84,"rel":1165},[76],[26,1167,92],{"href":90,"rel":1168},[76],"md","Lille, France",{},true,"\u002Fpost\u002Fdebian-etch-cle-usb",{"title":5,"description":1122},"debian-etch-cle-usb","posts\u002FSysAdmin\u002F2007-08-04-debian-etch-cle-usb",[1178],"debian","P1wXAJpGAtElk0Xu1quXBbbh85GWI8n-HVkQxXWB6m0",[1181,2716,2799],{"id":1182,"title":1183,"author":6,"body":1184,"category":2682,"categorySlug":2683,"date":2684,"description":31,"excerpt":2685,"extension":1169,"location":1170,"meta":2706,"navigation":1172,"path":2707,"published":1172,"seo":2708,"slug":2709,"stem":2710,"tags":2711,"timeToRead":520,"__hash__":2715},"posts\u002Fposts\u002FProgrammation\u002F2016-12-10-findsimilarity.md","FindSimilarity - Trouver les différences entre plusieurs vidéos",{"type":8,"value":1185,"toc":2670},[1186,1190,1193,1196,1199,1202,1207,1214,1218,1221,1224,1254,1257,1307,1311,1314,1328,1334,1342,1345,1354,1357,1360,1363,1784,1788,1791,1800,1803,1806,1832,1835,1959,1962,1968,1983,1986,1989,2539,2549,2553,2556,2560,2563,2566,2573,2576,2580,2586,2596,2599,2616,2633,2637,2640,2646,2649,2655,2660,2664,2667],[95,1187,1189],{"id":1188},"introduction","Introduction",[11,1191,1192],{},"Bonjour,",[11,1194,1195],{},"Je souhaite vous présenter une petite expérience que je viens d'écrire.",[11,1197,1198],{},"Cela fait plusieurs années que je souhaitais m'amuser sur la librairie OpenCV mais sans jamais en avoir eu l'utilité. J'ai profité d'avoir un peu de temps libre, pour écrire un petit\nprogramme dont le but est de comparer un ensemble de vidéos.",[11,1200,1201],{},"Le but est ensuite de dire si dans cet ensemble de vidéos, deux vidéos sont identiques, ou se ressemblent, ou sont trop éloignées.",[11,1203,1204],{},[15,1205,1206],{},"J'ai souhaité faire cette expérience par amusement, je n'ai donc pas passé beaucoup de temps sur la qualité du code écrit. Ce dernier aurait pu être mieux découpé, posséder des\ncommentaires, des tests unitaires, ... . Si vous voulez utiliser ce code pour un véritable usage production, n'hésitez pas à améliorer celui ci.",[11,1208,1209,1210,659],{},"Vous pouvez trouver le code source de cette expérience à l'adresse suivante : ",[26,1211,1212],{"href":1212,"rel":1213},"https:\u002F\u002Fgogs.shadoware.org\u002FShadowareOrg\u002Ffind-similarity",[76],[95,1215,1217],{"id":1216},"le-jeux-de-données","Le jeux de données",[11,1219,1220],{},"J'ai pris plusieurs films en DVD que je possède. Possédant un NAS, et une chromecast, j'encode ces DVD au format vidéo et je les y dépose. Malheureusement la qualité est dégradée\npar rapport au DVD.",[11,1222,1223],{},"Pour constituer le jeu de données, je prends ces films encodés, que je dépose dans un dossier. Je copie certains d'entre eux telquel",[112,1225,1227],{"className":114,"code":1226,"language":116,"meta":31,"style":31},"mkdir example\ncd example\ncp ..\u002Ffilm1.avi film1_copy.avi\n",[49,1228,1229,1236,1243],{"__ignoreMap":31},[120,1230,1231,1233],{"class":122,"line":123},[120,1232,328],{"class":126},[120,1234,1235],{"class":130}," example\n",[120,1237,1238,1241],{"class":122,"line":134},[120,1239,1240],{"class":516},"cd",[120,1242,1235],{"class":130},[120,1244,1245,1248,1251],{"class":122,"line":142},[120,1246,1247],{"class":126},"cp",[120,1249,1250],{"class":130}," ..\u002Ffilm1.avi",[120,1252,1253],{"class":130}," film1_copy.avi\n",[11,1255,1256],{},"J'encode certains de ces films avec une résolution différente :",[112,1258,1260],{"className":114,"code":1259,"language":116,"meta":31,"style":31},"avconv -i film2.m4v  -preset veryslow -s 320x240 film2.320x240.m4v\navconv -i film2.m4v  -preset veryslow -s 640x480 film2.640x480.m4v\n",[49,1261,1262,1287],{"__ignoreMap":31},[120,1263,1264,1267,1270,1273,1276,1279,1281,1284],{"class":122,"line":123},[120,1265,1266],{"class":126},"avconv",[120,1268,1269],{"class":284}," -i",[120,1271,1272],{"class":130}," film2.m4v",[120,1274,1275],{"class":284},"  -preset",[120,1277,1278],{"class":130}," veryslow",[120,1280,925],{"class":284},[120,1282,1283],{"class":130}," 320x240",[120,1285,1286],{"class":130}," film2.320x240.m4v\n",[120,1288,1289,1291,1293,1295,1297,1299,1301,1304],{"class":122,"line":134},[120,1290,1266],{"class":126},[120,1292,1269],{"class":284},[120,1294,1272],{"class":130},[120,1296,1275],{"class":284},[120,1298,1278],{"class":130},[120,1300,925],{"class":284},[120,1302,1303],{"class":130}," 640x480",[120,1305,1306],{"class":130}," film2.640x480.m4v\n",[95,1308,1310],{"id":1309},"comment-fonctionne-la-comparaison","Comment fonctionne la comparaison",[11,1312,1313],{},"Avant de parler de la comparaison, parlons des fichiers que nous allons comparer. Le programme va se constituer une liste des fichiers à comparer et pour chaque fichier va lire\nles informations suivantes :",[39,1315,1316,1319,1322,1325],{},[42,1317,1318],{},"la durée du film",[42,1320,1321],{},"la largeur",[42,1323,1324],{},"la hauteur",[42,1326,1327],{},"une miniature du film (utilisée pour comparer à l'oeil les vidéos)",[11,1329,1330,1331,659],{},"Ensuite, une fois les méta-données récupérées, le programe se constitue une liste de paires de fichiers à comparer en sélectionnant les fichiers qui ont une durée identique à +\u002F- 5\nsecondes. Ce paramètre est modifiable au niveau de la constante ",[49,1332,1333],{},"DELTA_SEC",[11,1335,1336,1337,659],{},"Enfin vient la comparaison pour laquelle je me suis simplement basé sur les exemples du site OpenCV que vous pouvez trouver dans la rubrique\n",[26,1338,1341],{"href":1339,"rel":1340},"http:\u002F\u002Fdocs.opencv.org\u002F2.4\u002Fdoc\u002Ftutorials\u002Fhighgui\u002Fvideo-input-psnr-ssim\u002Fvideo-input-psnr-ssim.html",[76],"Video Input with OpenCV and similarity measurement",[11,1343,1344],{},"J'ai utilisé l'algorithme PSNR (Peak signal-to-noise ratio) pour déterminer si les deux images de la vidéos sont plutôt proches ou éloignées. Cet algorithme calcul la distorsion\nentre deux images. Il est principalement utilisé pour quantifier la performance réalisée par un encodeur lors de la compression d'une vidéo. Une valeur entre 30 et 50 signifie que\nles images sont relativement proches. Plus la valeur est haute, et plus la qualité d'image est conservée entre les deux images. Si la valeur est inférieure à 30 on peut estimer qu'il\ny a une forte chance pour que les images soit différentes.",[11,1346,1347,1348,1353],{},"Vous pouvez retrouver les formules utilisées par le calcul sur le site d'OpenCV ou sur la page ",[26,1349,1352],{"href":1350,"rel":1351},"https:\u002F\u002Ffr.wikipedia.org\u002Fwiki\u002FPeak_Signal_to_Noise_Ratio",[76],"Wikipedia",". Est-ce que ce\ncalcul est le meilleur pour trouver les images similaires ? Je ne sais pas. Si vous avez d'autres propositions, on peut les tester.",[11,1355,1356],{},"Sur une vidéo on a une multitude d'images (sur un film d'une heure et demie à 25 images secondes, nous en avons 135 000), on pourrait comparer chaque image de la vidéo pour se faire\nune moyenne, de mon coté j'ai préféré comparer une image au milieu de la vidéo afin de parcourir plus vite les vidéos.",[11,1358,1359],{},"De la même manière pour m'abstraire de la taille de la vidéo qui peut avoir été modififée, je redimensionne, à tort ou à raison, les deux images à une taille identique\n(arbitrairement: 160x120).",[11,1361,1362],{},"Je vous présente donc ci-dessous l'algorithme que vous pouvez retrouver sur le site d'OpenCV. J'ai légèrement modifié l'algorithme pour redimensionner les images ainsi que pour\nretourner une valeur de PSNR infiniment grande quand deux vidéos sont identiques.",[112,1364,1368],{"className":1365,"code":1366,"language":1367,"meta":31,"style":31},"language-cpp shiki shiki-themes one-dark-pro","double getPSNR(const cv::Mat& F1, const cv::Mat& F2) {\n    cv::Mat I1, I2;\n\n    cv::resize(F1, I1, cv::Size(160, 120));\n    cv::resize(F2, I2, cv::Size(160, 120));\n\n    cv::Mat s1;\n    cv::absdiff(I1, I2, s1);   \u002F\u002F |I1 - I2|\n    s1.convertTo(s1, CV_32F);  \u002F\u002F cannot make a square on 8 bits\n    s1 = s1.mul(s1);           \u002F\u002F |I1 - I2|^2\n\n    cv::Scalar s = sum(s1);    \u002F\u002F sum elements per channel\n\n    double sse = s.val[0] + s.val[1] + s.val[2]; \u002F\u002F sum channels\n\n    if( sse \u003C= 1e-10) {        \u002F\u002F for small values return zero\n        return std::numeric_limits\u003Cdouble>::infinity();\n    } else {\n        double mse  = sse \u002F (double)(I1.channels() * I1.total());\n        double psnr = 10.0 * log10((255 * 255) \u002F mse);\n        return psnr;\n    }\n","cpp",[49,1369,1370,1413,1418,1423,1450,1471,1475,1480,1493,1509,1531,1535,1550,1554,1615,1619,1648,1673,1685,1732,1770,1778],{"__ignoreMap":31},[120,1371,1372,1375,1378,1381,1384,1387,1390,1393,1397,1399,1401,1403,1405,1407,1410],{"class":122,"line":123},[120,1373,1374],{"class":788},"double",[120,1376,1377],{"class":126}," getPSNR",[120,1379,1380],{"class":380},"(",[120,1382,1383],{"class":788},"const",[120,1385,1386],{"class":380}," cv::",[120,1388,1389],{"class":916},"Mat",[120,1391,1392],{"class":788},"&",[120,1394,1396],{"class":1395},"s_ZVi"," F1",[120,1398,52],{"class":380},[120,1400,1383],{"class":788},[120,1402,1386],{"class":380},[120,1404,1389],{"class":916},[120,1406,1392],{"class":788},[120,1408,1409],{"class":1395}," F2",[120,1411,1412],{"class":380},") {\n",[120,1414,1415],{"class":122,"line":134},[120,1416,1417],{"class":380},"    cv::Mat I1, I2;\n",[120,1419,1420],{"class":122,"line":142},[120,1421,1422],{"emptyLinePlaceholder":1172},"\n",[120,1424,1425,1428,1431,1434,1437,1439,1442,1444,1447],{"class":122,"line":150},[120,1426,1427],{"class":380},"    cv::",[120,1429,1430],{"class":126},"resize",[120,1432,1433],{"class":380},"(F1, I1, cv::",[120,1435,1436],{"class":126},"Size",[120,1438,1380],{"class":380},[120,1440,1441],{"class":284},"160",[120,1443,52],{"class":380},[120,1445,1446],{"class":284},"120",[120,1448,1449],{"class":380},"));\n",[120,1451,1452,1454,1456,1459,1461,1463,1465,1467,1469],{"class":122,"line":325},[120,1453,1427],{"class":380},[120,1455,1430],{"class":126},[120,1457,1458],{"class":380},"(F2, I2, cv::",[120,1460,1436],{"class":126},[120,1462,1380],{"class":380},[120,1464,1441],{"class":284},[120,1466,52],{"class":380},[120,1468,1446],{"class":284},[120,1470,1449],{"class":380},[120,1472,1473],{"class":122,"line":334},[120,1474,1422],{"emptyLinePlaceholder":1172},[120,1476,1477],{"class":122,"line":342},[120,1478,1479],{"class":380},"    cv::Mat s1;\n",[120,1481,1482,1484,1487,1490],{"class":122,"line":351},[120,1483,1427],{"class":380},[120,1485,1486],{"class":126},"absdiff",[120,1488,1489],{"class":380},"(I1, I2, s1);",[120,1491,1492],{"class":777},"   \u002F\u002F |I1 - I2|\n",[120,1494,1495,1498,1500,1503,1506],{"class":122,"line":483},[120,1496,1497],{"class":916},"    s1",[120,1499,659],{"class":380},[120,1501,1502],{"class":126},"convertTo",[120,1504,1505],{"class":380},"(s1, CV_32F);",[120,1507,1508],{"class":777},"  \u002F\u002F cannot make a square on 8 bits\n",[120,1510,1511,1514,1517,1520,1522,1525,1528],{"class":122,"line":503},[120,1512,1513],{"class":380},"    s1 ",[120,1515,1516],{"class":788},"=",[120,1518,1519],{"class":916}," s1",[120,1521,659],{"class":380},[120,1523,1524],{"class":126},"mul",[120,1526,1527],{"class":380},"(s1);",[120,1529,1530],{"class":777},"           \u002F\u002F |I1 - I2|^2\n",[120,1532,1533],{"class":122,"line":513},[120,1534,1422],{"emptyLinePlaceholder":1172},[120,1536,1537,1540,1542,1545,1547],{"class":122,"line":520},[120,1538,1539],{"class":380},"    cv::Scalar s ",[120,1541,1516],{"class":788},[120,1543,1544],{"class":126}," sum",[120,1546,1527],{"class":380},[120,1548,1549],{"class":777},"    \u002F\u002F sum elements per channel\n",[120,1551,1552],{"class":122,"line":531},[120,1553,1422],{"emptyLinePlaceholder":1172},[120,1555,1556,1559,1562,1564,1567,1569,1573,1576,1579,1582,1585,1587,1589,1591,1593,1595,1597,1599,1601,1603,1605,1607,1609,1612],{"class":122,"line":541},[120,1557,1558],{"class":788},"    double",[120,1560,1561],{"class":380}," sse ",[120,1563,1516],{"class":788},[120,1565,1566],{"class":916}," s",[120,1568,659],{"class":380},[120,1570,1572],{"class":1571},"sVyAn","val",[120,1574,1575],{"class":380},"[",[120,1577,1578],{"class":284},"0",[120,1580,1581],{"class":380},"] ",[120,1583,1584],{"class":788},"+",[120,1586,1566],{"class":916},[120,1588,659],{"class":380},[120,1590,1572],{"class":1571},[120,1592,1575],{"class":380},[120,1594,33],{"class":284},[120,1596,1581],{"class":380},[120,1598,1584],{"class":788},[120,1600,1566],{"class":916},[120,1602,659],{"class":380},[120,1604,1572],{"class":1571},[120,1606,1575],{"class":380},[120,1608,654],{"class":284},[120,1610,1611],{"class":380},"];",[120,1613,1614],{"class":777}," \u002F\u002F sum channels\n",[120,1616,1617],{"class":122,"line":551},[120,1618,1422],{"emptyLinePlaceholder":1172},[120,1620,1621,1624,1627,1630,1633,1636,1639,1642,1645],{"class":122,"line":561},[120,1622,1623],{"class":788},"    if",[120,1625,1626],{"class":380},"( sse ",[120,1628,1629],{"class":788},"\u003C=",[120,1631,1632],{"class":284}," 1",[120,1634,1635],{"class":1571},"e",[120,1637,1638],{"class":380},"-",[120,1640,1641],{"class":284},"10",[120,1643,1644],{"class":380},") {",[120,1646,1647],{"class":777},"        \u002F\u002F for small values return zero\n",[120,1649,1650,1653,1656,1659,1662,1664,1667,1670],{"class":122,"line":571},[120,1651,1652],{"class":788},"        return",[120,1654,1655],{"class":380}," std::",[120,1657,1658],{"class":916},"numeric_limits",[120,1660,1661],{"class":380},"\u003C",[120,1663,1374],{"class":788},[120,1665,1666],{"class":380},">::",[120,1668,1669],{"class":126},"infinity",[120,1671,1672],{"class":380},"();\n",[120,1674,1676,1679,1682],{"class":122,"line":1675},18,[120,1677,1678],{"class":380},"    } ",[120,1680,1681],{"class":788},"else",[120,1683,1684],{"class":380}," {\n",[120,1686,1688,1691,1694,1696,1698,1700,1702,1704,1707,1710,1712,1715,1718,1721,1724,1726,1729],{"class":122,"line":1687},19,[120,1689,1690],{"class":788},"        double",[120,1692,1693],{"class":380}," mse  ",[120,1695,1516],{"class":788},[120,1697,1561],{"class":380},[120,1699,238],{"class":788},[120,1701,166],{"class":380},[120,1703,1374],{"class":788},[120,1705,1706],{"class":380},")(",[120,1708,1709],{"class":916},"I1",[120,1711,659],{"class":380},[120,1713,1714],{"class":126},"channels",[120,1716,1717],{"class":380},"() ",[120,1719,1720],{"class":788},"*",[120,1722,1723],{"class":916}," I1",[120,1725,659],{"class":380},[120,1727,1728],{"class":126},"total",[120,1730,1731],{"class":380},"());\n",[120,1733,1735,1737,1740,1742,1745,1748,1751,1754,1757,1759,1762,1765,1767],{"class":122,"line":1734},20,[120,1736,1690],{"class":788},[120,1738,1739],{"class":380}," psnr ",[120,1741,1516],{"class":788},[120,1743,1744],{"class":284}," 10.0",[120,1746,1747],{"class":788}," *",[120,1749,1750],{"class":126}," log10",[120,1752,1753],{"class":380},"((",[120,1755,1756],{"class":284},"255",[120,1758,1747],{"class":788},[120,1760,1761],{"class":284}," 255",[120,1763,1764],{"class":380},") ",[120,1766,238],{"class":788},[120,1768,1769],{"class":380}," mse);\n",[120,1771,1773,1775],{"class":122,"line":1772},21,[120,1774,1652],{"class":788},[120,1776,1777],{"class":380}," psnr;\n",[120,1779,1781],{"class":122,"line":1780},22,[120,1782,1783],{"class":380},"    }\n",[95,1785,1787],{"id":1786},"optimisation","Optimisation",[11,1789,1790],{},"La raison qui fait que je voulais m'amuser avec OpenCV c'est qu'il permet de faire ces calculs à l'aide du GPU au lieu du CPU.",[11,1792,1793,1794,1799],{},"L'utilisation du GPU permet d'améliorer la vitesse de calcul pour tout ce qui est traitement d'image, ce pour quoi un GPU est prévu pour. Pour plus d'informations sur\nl'utilisation du GPU dans OpenCV peut être trouvé sur la page ",[26,1795,1798],{"href":1796,"rel":1797},"http:\u002F\u002Fopencv.org\u002Fplatforms\u002Fcuda.html",[76],"CUDA"," d'OpenCV.",[11,1801,1802],{},"Le problème est que sur la version de Debian jessie que j'utilise, OpenCV n'est pas compilé avec CUDA, et ne permet donc pas d'utiliser le GPU. J'ai donc dû compiler ma propre\nversion d'OpenCV.",[11,1804,1805],{},"Pour cela la première étape consiste à récupérer le code source et à se positionner sur la branche que l'on souhaite compiler. Pour ma part je préfère compiler sur la branche 2.4,\nplus proche de la version de Debian.",[112,1807,1809],{"className":114,"code":1808,"language":116,"meta":31,"style":31},"git clone https:\u002F\u002Fgithub.com\u002Fopencv\u002Fopencv.git\ngit checkout 2.4\n",[49,1810,1811,1822],{"__ignoreMap":31},[120,1812,1813,1816,1819],{"class":122,"line":123},[120,1814,1815],{"class":126},"git",[120,1817,1818],{"class":130}," clone",[120,1820,1821],{"class":130}," https:\u002F\u002Fgithub.com\u002Fopencv\u002Fopencv.git\n",[120,1823,1824,1826,1829],{"class":122,"line":134},[120,1825,1815],{"class":126},[120,1827,1828],{"class":130}," checkout",[120,1830,1831],{"class":284}," 2.4\n",[11,1833,1834],{},"Viens ensuite la compilation :",[112,1836,1838],{"className":114,"code":1837,"language":116,"meta":31,"style":31},"mkdir build\ncd build\ncmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=\u002Fhome\u002Fphoenix\u002Fusr\u002Flocal  -DENABLE_SSE=ON -DENABLE_SSE2=ON -DENABLE_SSE3=ON -DWITH_TBB=ON -DWITH_1394=ON -DWITH_V4L=ON -DWITH_OPENGL=ON  -DWITH_GTK=ON -DWITH_JASPER=ON -DWITH_JPEG=ON -DWITH_PNG=ON -DWITH_TIFF=ON  -DWITH_OPENEXR=ON -DWITH_PVAPI=ON   -DWITH_EIGEN=ON -DCMAKE_SKIP_RPATH=ON -D WITH_CUDA=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1 -DWITH_IPP=ON -D CUDA_GENERATION=Auto -D WITH_FFMPEG=ON  ..\u002F\n",[49,1839,1840,1847,1853],{"__ignoreMap":31},[120,1841,1842,1844],{"class":122,"line":123},[120,1843,328],{"class":126},[120,1845,1846],{"class":130}," build\n",[120,1848,1849,1851],{"class":122,"line":134},[120,1850,1240],{"class":516},[120,1852,1846],{"class":130},[120,1854,1855,1858,1861,1864,1866,1869,1872,1875,1878,1881,1884,1887,1890,1893,1896,1899,1902,1905,1908,1911,1914,1917,1919,1922,1924,1927,1929,1931,1934,1936,1938,1941,1943,1946,1948,1951,1953,1956],{"class":122,"line":142},[120,1856,1857],{"class":126},"cmake",[120,1859,1860],{"class":284}," -D",[120,1862,1863],{"class":130}," CMAKE_BUILD_TYPE=RELEASE",[120,1865,1860],{"class":284},[120,1867,1868],{"class":130}," CMAKE_INSTALL_PREFIX=\u002Fhome\u002Fphoenix\u002Fusr\u002Flocal",[120,1870,1871],{"class":284},"  -DENABLE_SSE=ON",[120,1873,1874],{"class":284}," -DENABLE_SSE2=ON",[120,1876,1877],{"class":284}," -DENABLE_SSE3=ON",[120,1879,1880],{"class":284}," -DWITH_TBB=ON",[120,1882,1883],{"class":284}," -DWITH_1394=ON",[120,1885,1886],{"class":284}," -DWITH_V4L=ON",[120,1888,1889],{"class":284}," -DWITH_OPENGL=ON",[120,1891,1892],{"class":284},"  -DWITH_GTK=ON",[120,1894,1895],{"class":284}," -DWITH_JASPER=ON",[120,1897,1898],{"class":284}," -DWITH_JPEG=ON",[120,1900,1901],{"class":284}," -DWITH_PNG=ON",[120,1903,1904],{"class":284}," -DWITH_TIFF=ON",[120,1906,1907],{"class":284},"  -DWITH_OPENEXR=ON",[120,1909,1910],{"class":284}," -DWITH_PVAPI=ON",[120,1912,1913],{"class":284},"   -DWITH_EIGEN=ON",[120,1915,1916],{"class":284}," -DCMAKE_SKIP_RPATH=ON",[120,1918,1860],{"class":284},[120,1920,1921],{"class":130}," WITH_CUDA=ON",[120,1923,1860],{"class":284},[120,1925,1926],{"class":130}," ENABLE_FAST_MATH=",[120,1928,33],{"class":284},[120,1930,1860],{"class":284},[120,1932,1933],{"class":130}," CUDA_FAST_MATH=",[120,1935,33],{"class":284},[120,1937,1860],{"class":284},[120,1939,1940],{"class":130}," WITH_CUBLAS=",[120,1942,33],{"class":284},[120,1944,1945],{"class":284}," -DWITH_IPP=ON",[120,1947,1860],{"class":284},[120,1949,1950],{"class":130}," CUDA_GENERATION=Auto",[120,1952,1860],{"class":284},[120,1954,1955],{"class":130}," WITH_FFMPEG=ON",[120,1957,1958],{"class":130},"  ..\u002F\n",[11,1960,1961],{},"J'active lors de la compilation le maximum d'optimisation dont CUDA. J'active également FFMPEG sans lequel le nombre de fichier reconnu baisse énormément sur ma machine. Après\navoir lancé cmake j'obtiens le résultat suivant :",[112,1963,1966],{"className":1964,"code":1965,"language":263},[261],"-- General configuration for OpenCV 2.4.13.1 =====================================\n--   Version control:               2.4.13.1-48-gac118ae\n--\n--   Platform:\n--     Host:                        Linux 3.16.0-4-amd64 x86_64\n--     CMake:                       3.6.2\n--     CMake generator:             Unix Makefiles\n--     CMake build tool:            \u002Fusr\u002Fbin\u002Fmake\n--     Configuration:               RELEASE\n--\n--   C\u002FC++:\n--     Built as dynamic libs?:      YES\n--     C++ Compiler:                \u002Fusr\u002Fbin\u002Fc++  (ver 4.9.2)\n--     C++ flags (Release):         -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -Wno-array-bounds -Wno-aggressive-loop-optimizations -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffast-math -msse -msse2 -msse3 -ffunction-sections -O3 -DNDEBUG  -DNDEBUG\n--     C++ flags (Debug):           -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -Wno-array-bounds -Wno-aggressive-loop-optimizations -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffast-math -msse -msse2 -msse3 -ffunction-sections -g  -O0 -DDEBUG -D_DEBUG\n--     C Compiler:                  \u002Fusr\u002Fbin\u002Fcc\n--     C flags (Release):           -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wno-narrowing -Wno-comment -Wno-array-bounds -Wno-aggressive-loop-optimizations -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffast-math -msse -msse2 -msse3 -ffunction-sections -O3 -DNDEBUG  -DNDEBUG\n--     C flags (Debug):             -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wno-narrowing -Wno-comment -Wno-array-bounds -Wno-aggressive-loop-optimizations -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffast-math -msse -msse2 -msse3 -ffunction-sections -g  -O0 -DDEBUG -D_DEBUG\n--     Linker flags (Release):\n--     Linker flags (Debug):\n--     ccache:                      NO\n--     Precompiled headers:         YES\n--\n--   OpenCV modules:\n--     To be built:                 core flann imgproc highgui features2d calib3d ml video legacy objdetect photo gpu ocl nonfree contrib java python stitching superres ts videostab\n--     Disabled:                    world\n--     Disabled by dependency:      -\n--     Unavailable:                 androidcamera dynamicuda viz\n--\n--   GUI:\n--     QT:                          NO\n--     GTK+ 2.x:                    YES (ver 2.24.25)\n--     GThread :                    YES (ver 2.42.1)\n--     GtkGlExt:                    NO\n--     OpenGL support:              NO\n--     VTK support:                 NO\n--\n--   Media I\u002FO:\n--     ZLib:                        \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002Flibz.so (ver 1.2.8)\n--     JPEG:                        \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002Flibjpeg.so (ver )\n--     PNG:                         \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002Flibpng.so (ver 1.2.50)\n--     TIFF:                        \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002Flibtiff.so (ver 42 - 4.0.3)\n--     JPEG 2000:                   \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002Flibjasper.so (ver 1.900.1)\n--     OpenEXR:                     \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002FlibImath.so \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002FlibIlmImf.so \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002FlibIex.so \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002FlibHalf.so \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002FlibIlmThread.so (ver 1.6.1)\n--\n--   Video I\u002FO:\n--     DC1394 1.x:                  NO\n--     DC1394 2.x:                  YES (ver 2.2.3)\n--     FFMPEG:                      YES\n--       codec:                     YES (ver 56.1.0)\n--       format:                    YES (ver 56.1.0)\n--       util:                      YES (ver 54.3.0)\n--       swscale:                   YES (ver 3.0.0)\n--       resample:                  YES (ver 2.1.0)\n--       gentoo-style:              YES\n--     GStreamer:                   NO\n--     OpenNI:                      NO\n--     OpenNI PrimeSensor Modules:  NO\n--     PvAPI:                       NO\n--     GigEVisionSDK:               NO\n--     UniCap:                      NO\n--     UniCap ucil:                 NO\n--     V4L\u002FV4L2:                    NO\u002FYES\n--     XIMEA:                       NO\n--     Xine:                        NO\n--\n--   Other third-party libraries:\n--     Use IPP:                     IPP not found\n--     Use Eigen:                   NO\n--     Use TBB:                     NO\n--     Use OpenMP:                  NO\n--     Use GCD                      NO\n--     Use Concurrency              NO\n--     Use C=:                      NO\n--     Use Cuda:                    YES (ver 7.5)\n--     Use OpenCL:                  YES\n--\n--   NVIDIA CUDA\n--     Use CUFFT:                   YES\n--     Use CUBLAS:                  YES\n--     USE NVCUVID:                 NO\n--     NVIDIA GPU arch:             21\n--     NVIDIA PTX archs:\n--     Use fast math:               YES\n--     Tiny gpu module:             NO\n--\n--   OpenCL:\n--     Version:                     dynamic\n--     Include path:                \u002Fhome\u002Fphoenix\u002FDeveloppement\u002FExternalSoftware\u002Fopencv\u002F3rdparty\u002Finclude\u002Fopencl\u002F1.2\n--     Use AMD FFT:                 NO\n--     Use AMD BLAS:                NO\n--\n--   Python:\n--     Interpreter:                 \u002Fusr\u002Fbin\u002Fpython2 (ver 2.7.10)\n--     Libraries:                   \u002Fusr\u002Flib\u002Fx86_64-linux-gnu\u002Flibpython2.7.so (ver 2.7.10rc1)\n--     numpy:                       \u002Fusr\u002Flib\u002Fpython2.7\u002Fdist-packages\u002Fnumpy\u002Fcore\u002Finclude (ver 1.8.2)\n--     packages path:               lib\u002Fpython2.7\u002Fdist-packages\n--\n--   Java:\n--     ant:                         \u002Fusr\u002Fbin\u002Fant (ver 1.9.4)\n--     JNI:                         \u002Fusr\u002Flib\u002Fjvm\u002Fjava-7-openjdk-amd64\u002Finclude \u002Fusr\u002Flib\u002Fjvm\u002Fjava-7-openjdk-amd64\u002Finclude \u002Fusr\u002Flib\u002Fjvm\u002Fjava-7-openjdk-amd64\u002Finclude\n--     Java tests:                  YES\n--\n--   Documentation:\n--     Build Documentation:         NO\n--     Sphinx:                      NO\n--     PdfLaTeX compiler:           \u002Fusr\u002Fbin\u002Fpdflatex\n--     Doxygen:                     YES (\u002Fusr\u002Fbin\u002Fdoxygen)\n--\n--   Tests and samples:\n--     Tests:                       YES\n--     Performance tests:           YES\n--     C\u002FC++ Examples:              NO\n--\n--   Install path:                  \u002Fhome\u002Fphoenix\u002Fusr\u002Flocal\n--\n--   cvconfig.h is in:              \u002Fhome\u002Fphoenix\u002FDeveloppement\u002FExternalSoftware\u002Fopencv\u002Fbuild\n-- -----------------------------------------------------------------\n",[49,1967,1965],{"__ignoreMap":31},[11,1969,1970,1971,1974,1975,1978,1979,1982],{},"Pour que la compilation se déroule sans problème, il vous faudra installer certains paquets sur votre distribution. Sur Debian Jessie, j'ai installé ",[49,1972,1973],{},"nvidia-cuda-toolkit"," en\nversion ",[49,1976,1977],{},"7.5.18-4~bpo8+1",". Comme vous pouvez les voir c'est une version qui provient du repository de backports. La version ",[49,1980,1981],{},"6.0.37-5"," ne me permettait pas d'activer CUDA. J'ai\ndonc du monter l'ensemble du driver propriétaire sur mon poste de développement.",[11,1984,1985],{},"Rasssurez-vous, si vous ne voulez pas utiliser les backports ou ne pas utiliser de driver propriétaire, vous pouvez tester le programme dans sa version CPU. :)",[11,1987,1988],{},"Voici comment le code a été ré-écrit pour utiliser le GPU à la place du CPU:",[112,1990,1992],{"className":1365,"code":1991,"language":1367,"meta":31,"style":31},"struct BufferPSNR {                                    \u002F\u002F Optimized GPU versions\n    \u002F\u002F Data allocations are very expensive on GPU. Use a buffer to solve: allocate once reuse later.\n    cv::gpu::GpuMat gF1, gF2, gI1, gI2, gs, t1,t2;\n\n    cv::gpu::GpuMat buf;\n};\n\ndouble getPSNR_GPU_optimized(const cv::Mat& F1, const cv::Mat& F2, BufferPSNR& b) {\n    b.gF1.upload(F1);\n    b.gF2.upload(F2);\n\n    cv::gpu::resize(b.gF1, b.gI1, cv::Size(160, 120));\n    cv::gpu::resize(b.gF2, b.gI2, cv::Size(160, 120));\n\n    b.gI1.convertTo(b.t1, CV_32F);\n    b.gI2.convertTo(b.t2, CV_32F);\n\n    cv::gpu::absdiff(b.t1.reshape(1), b.t2.reshape(1), b.gs);\n    cv::gpu::multiply(b.gs, b.gs, b.gs);\n\n    double sse = cv::gpu::sum(b.gs, b.buf)[0];\n\n    if( sse \u003C= 1e-10) \u002F\u002F for small values return zero\n        return std::numeric_limits\u003Cdouble>::infinity();\n    else {\n        double mse = sse \u002F(double)(F1.channels() * F1.total());\n        double psnr = 10.0*log10((255*255)\u002Fmse);\n        return psnr;\n    }\n}\n",[49,1993,1994,2008,2013,2018,2022,2027,2032,2036,2079,2097,2113,2117,2162,2203,2207,2231,2254,2258,2314,2351,2355,2397,2401,2424,2443,2451,2490,2521,2528,2533],{"__ignoreMap":31},[120,1995,1996,1999,2002,2005],{"class":122,"line":123},[120,1997,1998],{"class":788},"struct",[120,2000,2001],{"class":916}," BufferPSNR",[120,2003,2004],{"class":380}," {",[120,2006,2007],{"class":777},"                                    \u002F\u002F Optimized GPU versions\n",[120,2009,2010],{"class":122,"line":134},[120,2011,2012],{"class":777},"    \u002F\u002F Data allocations are very expensive on GPU. Use a buffer to solve: allocate once reuse later.\n",[120,2014,2015],{"class":122,"line":142},[120,2016,2017],{"class":380},"    cv::gpu::GpuMat gF1, gF2, gI1, gI2, gs, t1,t2;\n",[120,2019,2020],{"class":122,"line":150},[120,2021,1422],{"emptyLinePlaceholder":1172},[120,2023,2024],{"class":122,"line":325},[120,2025,2026],{"class":380},"    cv::gpu::GpuMat buf;\n",[120,2028,2029],{"class":122,"line":334},[120,2030,2031],{"class":380},"};\n",[120,2033,2034],{"class":122,"line":342},[120,2035,1422],{"emptyLinePlaceholder":1172},[120,2037,2038,2040,2043,2045,2047,2049,2051,2053,2055,2057,2059,2061,2063,2065,2067,2069,2072,2074,2077],{"class":122,"line":351},[120,2039,1374],{"class":788},[120,2041,2042],{"class":126}," getPSNR_GPU_optimized",[120,2044,1380],{"class":380},[120,2046,1383],{"class":788},[120,2048,1386],{"class":380},[120,2050,1389],{"class":916},[120,2052,1392],{"class":788},[120,2054,1396],{"class":1395},[120,2056,52],{"class":380},[120,2058,1383],{"class":788},[120,2060,1386],{"class":380},[120,2062,1389],{"class":916},[120,2064,1392],{"class":788},[120,2066,1409],{"class":1395},[120,2068,52],{"class":380},[120,2070,2071],{"class":916},"BufferPSNR",[120,2073,1392],{"class":788},[120,2075,2076],{"class":1395}," b",[120,2078,1412],{"class":380},[120,2080,2081,2084,2086,2089,2091,2094],{"class":122,"line":483},[120,2082,2083],{"class":916},"    b",[120,2085,659],{"class":380},[120,2087,2088],{"class":916},"gF1",[120,2090,659],{"class":380},[120,2092,2093],{"class":126},"upload",[120,2095,2096],{"class":380},"(F1);\n",[120,2098,2099,2101,2103,2106,2108,2110],{"class":122,"line":503},[120,2100,2083],{"class":916},[120,2102,659],{"class":380},[120,2104,2105],{"class":916},"gF2",[120,2107,659],{"class":380},[120,2109,2093],{"class":126},[120,2111,2112],{"class":380},"(F2);\n",[120,2114,2115],{"class":122,"line":513},[120,2116,1422],{"emptyLinePlaceholder":1172},[120,2118,2119,2121,2124,2127,2129,2131,2134,2136,2138,2140,2142,2144,2147,2150,2152,2154,2156,2158,2160],{"class":122,"line":520},[120,2120,1427],{"class":380},[120,2122,2123],{"class":916},"gpu",[120,2125,2126],{"class":380},"::",[120,2128,1430],{"class":126},[120,2130,1380],{"class":380},[120,2132,2133],{"class":916},"b",[120,2135,659],{"class":380},[120,2137,2088],{"class":1571},[120,2139,52],{"class":380},[120,2141,2133],{"class":916},[120,2143,659],{"class":380},[120,2145,2146],{"class":1571},"gI1",[120,2148,2149],{"class":380},", cv::",[120,2151,1436],{"class":126},[120,2153,1380],{"class":380},[120,2155,1441],{"class":284},[120,2157,52],{"class":380},[120,2159,1446],{"class":284},[120,2161,1449],{"class":380},[120,2163,2164,2166,2168,2170,2172,2174,2176,2178,2180,2182,2184,2186,2189,2191,2193,2195,2197,2199,2201],{"class":122,"line":531},[120,2165,1427],{"class":380},[120,2167,2123],{"class":916},[120,2169,2126],{"class":380},[120,2171,1430],{"class":126},[120,2173,1380],{"class":380},[120,2175,2133],{"class":916},[120,2177,659],{"class":380},[120,2179,2105],{"class":1571},[120,2181,52],{"class":380},[120,2183,2133],{"class":916},[120,2185,659],{"class":380},[120,2187,2188],{"class":1571},"gI2",[120,2190,2149],{"class":380},[120,2192,1436],{"class":126},[120,2194,1380],{"class":380},[120,2196,1441],{"class":284},[120,2198,52],{"class":380},[120,2200,1446],{"class":284},[120,2202,1449],{"class":380},[120,2204,2205],{"class":122,"line":541},[120,2206,1422],{"emptyLinePlaceholder":1172},[120,2208,2209,2211,2213,2215,2217,2219,2221,2223,2225,2228],{"class":122,"line":551},[120,2210,2083],{"class":916},[120,2212,659],{"class":380},[120,2214,2146],{"class":916},[120,2216,659],{"class":380},[120,2218,1502],{"class":126},[120,2220,1380],{"class":380},[120,2222,2133],{"class":916},[120,2224,659],{"class":380},[120,2226,2227],{"class":1571},"t1",[120,2229,2230],{"class":380},", CV_32F);\n",[120,2232,2233,2235,2237,2239,2241,2243,2245,2247,2249,2252],{"class":122,"line":561},[120,2234,2083],{"class":916},[120,2236,659],{"class":380},[120,2238,2188],{"class":916},[120,2240,659],{"class":380},[120,2242,1502],{"class":126},[120,2244,1380],{"class":380},[120,2246,2133],{"class":916},[120,2248,659],{"class":380},[120,2250,2251],{"class":1571},"t2",[120,2253,2230],{"class":380},[120,2255,2256],{"class":122,"line":571},[120,2257,1422],{"emptyLinePlaceholder":1172},[120,2259,2260,2262,2264,2266,2268,2270,2272,2274,2276,2278,2281,2283,2285,2288,2290,2292,2294,2296,2298,2300,2302,2304,2306,2308,2311],{"class":122,"line":1675},[120,2261,1427],{"class":380},[120,2263,2123],{"class":916},[120,2265,2126],{"class":380},[120,2267,1486],{"class":126},[120,2269,1380],{"class":380},[120,2271,2133],{"class":916},[120,2273,659],{"class":380},[120,2275,2227],{"class":916},[120,2277,659],{"class":380},[120,2279,2280],{"class":126},"reshape",[120,2282,1380],{"class":380},[120,2284,33],{"class":284},[120,2286,2287],{"class":380},"), ",[120,2289,2133],{"class":916},[120,2291,659],{"class":380},[120,2293,2251],{"class":916},[120,2295,659],{"class":380},[120,2297,2280],{"class":126},[120,2299,1380],{"class":380},[120,2301,33],{"class":284},[120,2303,2287],{"class":380},[120,2305,2133],{"class":916},[120,2307,659],{"class":380},[120,2309,2310],{"class":1571},"gs",[120,2312,2313],{"class":380},");\n",[120,2315,2316,2318,2320,2322,2325,2327,2329,2331,2333,2335,2337,2339,2341,2343,2345,2347,2349],{"class":122,"line":1687},[120,2317,1427],{"class":380},[120,2319,2123],{"class":916},[120,2321,2126],{"class":380},[120,2323,2324],{"class":126},"multiply",[120,2326,1380],{"class":380},[120,2328,2133],{"class":916},[120,2330,659],{"class":380},[120,2332,2310],{"class":1571},[120,2334,52],{"class":380},[120,2336,2133],{"class":916},[120,2338,659],{"class":380},[120,2340,2310],{"class":1571},[120,2342,52],{"class":380},[120,2344,2133],{"class":916},[120,2346,659],{"class":380},[120,2348,2310],{"class":1571},[120,2350,2313],{"class":380},[120,2352,2353],{"class":122,"line":1734},[120,2354,1422],{"emptyLinePlaceholder":1172},[120,2356,2357,2359,2361,2363,2365,2367,2369,2372,2374,2376,2378,2380,2382,2384,2386,2389,2392,2394],{"class":122,"line":1772},[120,2358,1558],{"class":788},[120,2360,1561],{"class":380},[120,2362,1516],{"class":788},[120,2364,1386],{"class":380},[120,2366,2123],{"class":916},[120,2368,2126],{"class":380},[120,2370,2371],{"class":126},"sum",[120,2373,1380],{"class":380},[120,2375,2133],{"class":916},[120,2377,659],{"class":380},[120,2379,2310],{"class":1571},[120,2381,52],{"class":380},[120,2383,2133],{"class":916},[120,2385,659],{"class":380},[120,2387,2388],{"class":1571},"buf",[120,2390,2391],{"class":380},")[",[120,2393,1578],{"class":284},[120,2395,2396],{"class":380},"];\n",[120,2398,2399],{"class":122,"line":1780},[120,2400,1422],{"emptyLinePlaceholder":1172},[120,2402,2404,2406,2408,2410,2412,2414,2416,2418,2421],{"class":122,"line":2403},23,[120,2405,1623],{"class":788},[120,2407,1626],{"class":380},[120,2409,1629],{"class":788},[120,2411,1632],{"class":284},[120,2413,1635],{"class":1571},[120,2415,1638],{"class":380},[120,2417,1641],{"class":284},[120,2419,2420],{"class":380},")",[120,2422,2423],{"class":777}," \u002F\u002F for small values return zero\n",[120,2425,2427,2429,2431,2433,2435,2437,2439,2441],{"class":122,"line":2426},24,[120,2428,1652],{"class":788},[120,2430,1655],{"class":380},[120,2432,1658],{"class":916},[120,2434,1661],{"class":380},[120,2436,1374],{"class":788},[120,2438,1666],{"class":380},[120,2440,1669],{"class":126},[120,2442,1672],{"class":380},[120,2444,2446,2449],{"class":122,"line":2445},25,[120,2447,2448],{"class":788},"    else",[120,2450,1684],{"class":380},[120,2452,2454,2456,2459,2461,2463,2465,2467,2469,2471,2474,2476,2478,2480,2482,2484,2486,2488],{"class":122,"line":2453},26,[120,2455,1690],{"class":788},[120,2457,2458],{"class":380}," mse ",[120,2460,1516],{"class":788},[120,2462,1561],{"class":380},[120,2464,238],{"class":788},[120,2466,1380],{"class":380},[120,2468,1374],{"class":788},[120,2470,1706],{"class":380},[120,2472,2473],{"class":916},"F1",[120,2475,659],{"class":380},[120,2477,1714],{"class":126},[120,2479,1717],{"class":380},[120,2481,1720],{"class":788},[120,2483,1396],{"class":916},[120,2485,659],{"class":380},[120,2487,1728],{"class":126},[120,2489,1731],{"class":380},[120,2491,2493,2495,2497,2499,2501,2503,2506,2508,2510,2512,2514,2516,2518],{"class":122,"line":2492},27,[120,2494,1690],{"class":788},[120,2496,1739],{"class":380},[120,2498,1516],{"class":788},[120,2500,1744],{"class":284},[120,2502,1720],{"class":788},[120,2504,2505],{"class":126},"log10",[120,2507,1753],{"class":380},[120,2509,1756],{"class":284},[120,2511,1720],{"class":788},[120,2513,1756],{"class":284},[120,2515,2420],{"class":380},[120,2517,238],{"class":788},[120,2519,2520],{"class":380},"mse);\n",[120,2522,2524,2526],{"class":122,"line":2523},28,[120,2525,1652],{"class":788},[120,2527,1777],{"class":380},[120,2529,2531],{"class":122,"line":2530},29,[120,2532,1783],{"class":380},[120,2534,2536],{"class":122,"line":2535},30,[120,2537,2538],{"class":380},"}\n",[11,2540,2541,2542,2544,2545,2548],{},"L'utilisation de la structure ",[49,2543,2071],{}," permet de ne pas perdre de performance lors de l'initialisation relativement lourde des objets ",[49,2546,2547],{},"GpuMat",". Sans cela, l'utilisation du Gpu\nserait moins performant que la version Cpu.",[95,2550,2552],{"id":2551},"lexpérience","L'expérience",[11,2554,2555],{},"Maintenant place à l'expérience. Nous allons lancer notre programme sur notre jeu d'essai comprenant les vidéos issue des DVD, ainsi que les vidéos recompressées pour l'expérience.\nSi l'expérence se déroule bien l'algorithme devrait nous detecter les fichiers dupliqués, ainsi que les fichiers recompressés.",[1062,2557,2559],{"id":2558},"lancement-et-selection-des-dossiers","Lancement et selection des dossiers",[11,2561,2562],{},"La première étape est la sélection des dossiers que l'on souhaite comparer. Le programme ira lire récursivement l'ensemble des dossiers pour y trouver l'ensemble des fichiers\nvidéos.",[11,2564,2565],{},"La sélection d'un projet provient de mon envie de départ de pouvoir enregistrer l'avancement du projet au fur et à mesure. Cette étape n'a pas été réalisée mais l'existance du mode\nprojet existe toujours.",[11,2567,2568],{},[2569,2570],"img",{"alt":2571,"src":2572},"Selection du projet","\u002FProgrammation\u002Ffind-similarity\u002Ffind-similarity-1.png",[11,2574,2575],{},"Une fois le dossier projet choisi, il faut sélectionner la liste des dossiers contenant les vidéos et lancer le programme ...",[1062,2577,2579],{"id":2578},"comparaison-des-vidéos","Comparaison des vidéos",[11,2581,2582,2583,659],{},"Dans cette étape le programme compare l'ensemble des vidéos présentes dans les dossiers. L'ensemble du processus tourne dans des threads afin de ne pas figer l'IHM, grâce à l'API\n",[49,2584,2585],{},"QtConcurrent",[11,2587,2588,2592],{},[2569,2589],{"alt":2590,"src":2591},"Recherche","\u002FProgrammation\u002Ffind-similarity\u002Ffind-similarity-2.png",[2569,2593],{"alt":2594,"src":2595},"Recherche encore","\u002FProgrammation\u002Ffind-similarity\u002Ffind-similarity-3.png",[11,2597,2598],{},"Les étapes de la recherche sont donc :",[39,2600,2601,2604,2607,2610,2613],{},[42,2602,2603],{},"Constitution de la liste des fichiers",[42,2605,2606],{},"Récupération des méta-données",[42,2608,2609],{},"Création de la liste des paires de fichiers (en filtrant sur la durée)",[42,2611,2612],{},"Calcul du PSNR pour chaque paire de fichiers",[42,2614,2615],{},"Filtrage pour ne garder que les paires de fichiers dont le PSNR est supérieur à 30 db.",[11,2617,2618,2619,2621,2622,2624,2625,2628,2629,2632],{},"Lors de mon développement je me suis basé sur l'API ",[49,2620,2585],{}," pour faire les différentes étapes. Faisant beaucoup de développement NodeJS ces derniers temps je suis habitué à\nl'utilisation des promesses et de leur enchainement pour faire des processus complexes. J'ai trouvé dommage de ne pas retrouver la même chose dans l'API ",[49,2623,2585],{},". Pour\nreproduire un équivalent, lorsqu'un ",[49,2626,2627],{},"QFuture","se termine, le signal émis par ",[49,2630,2631],{},"QFutureWatcher"," est récupérer par un SLOT du moteur qui s'occupe de lancer l'étape suivante.",[1062,2634,2636],{"id":2635},"la-page-de-résultat","La page de résultat",[11,2638,2639],{},"La page de résultat liste les vidéos considérées identiques suite à l'étude d'une des images. Un coup d'oeil visuel permet alors de se faire un avis sur la question, et de\nsupprimer la vidéo que l'on souhaite.",[11,2641,2642],{},[2569,2643],{"alt":2644,"src":2645},"Résultat 1","\u002FProgrammation\u002Ffind-similarity\u002Ffind-similarity-4.png",[11,2647,2648],{},"Comme on peut le voir le programme retrouve les vidéos dont l'image est identique, ainsi que les films qui ont été redimensionnés sans trop de soucis.\nLe problème se situe alors au niveau du bruit qui est généré. Plusieurs films sont considérés comme proches alors que complètement différents. Pour régler ce problème, comparer\nplusieurs images d'une même vidéo à des timestamps différents pourrait peut-être régler le problème.",[11,2650,2651],{},[2569,2652],{"alt":2653,"src":2654},"Résultat 2","\u002FProgrammation\u002Ffind-similarity\u002Ffind-similarity-5.png",[11,2656,2657],{},[230,2658,2659],{},"Je vous conseille de vérifier manuellement la qualité et la similarité de chaque vidéo manuellement avant toute suppression.",[95,2661,2663],{"id":2662},"conclusion","Conclusion",[11,2665,2666],{},"En conclusion, j'ai trouvé l'expérience intéressante, et maintenant qu'elle est terminée, je vais pouvoir en tenter une autre ;). Est-ce que le programme continuera d'évoluer ?\nPourquoi pas ? Cela dépendera des PR (Pull Request) et des demandes faites par les utilisateurs, ainsi que du temps que j'ai envie de passer dessus.",[1108,2668,2669],{},"html pre.shiki code .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html pre.shiki code .sjrmR, html code.shiki .sjrmR{--shiki-default:#56B6C2}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sVC51, html code.shiki .sVC51{--shiki-default:#D19A66}html pre.shiki code .seHd6, html code.shiki .seHd6{--shiki-default:#C678DD}html pre.shiki code .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}html pre.shiki code .sU0A5, html code.shiki .sU0A5{--shiki-default:#E5C07B}html pre.shiki code .s_ZVi, html code.shiki .s_ZVi{--shiki-default:#E06C75;--shiki-default-font-style:italic}html pre.shiki code .sV9Aq, html code.shiki .sV9Aq{--shiki-default:#7F848E;--shiki-default-font-style:italic}html pre.shiki code .sVyAn, html code.shiki .sVyAn{--shiki-default:#E06C75}",{"title":31,"searchDepth":134,"depth":134,"links":2671},[2672,2673,2674,2675,2676,2677,2678,2679],{"id":1188,"depth":142,"text":1189},{"id":1216,"depth":142,"text":1217},{"id":1309,"depth":142,"text":1310},{"id":1786,"depth":142,"text":1787},{"id":2551,"depth":142,"text":2552},{"id":2558,"depth":134,"text":2559},{"id":2578,"depth":134,"text":2579},{"id":2635,"depth":134,"text":2636,"children":2680},[2681],{"id":2662,"depth":142,"text":2663},"Programmation","programmation","2016-12-10",{"type":8,"value":2686},[2687,2689,2691,2693,2695,2697,2701],[95,2688,1189],{"id":1188},[11,2690,1192],{},[11,2692,1195],{},[11,2694,1198],{},[11,2696,1201],{},[11,2698,2699],{},[15,2700,1206],{},[11,2702,1209,2703,659],{},[26,2704,1212],{"href":1212,"rel":2705},[76],{"planet":1172},"\u002Fpost\u002Ffindsimilarity",{"title":1183,"description":31},"findsimilarity","posts\u002FProgrammation\u002F2016-12-10-findsimilarity",[2712,2713,2714,1178],"qt","opencv","video","LR-Ko6CoDmyd4rJj7msRVs_pkiaov-yO2_RYmY_C6cE",{"id":2717,"title":2718,"author":6,"body":2719,"category":159,"categorySlug":158,"date":2772,"description":2723,"excerpt":2773,"extension":1169,"location":1170,"meta":2791,"navigation":1172,"path":2792,"published":1172,"seo":2793,"slug":2794,"stem":2795,"tags":2796,"timeToRead":134,"__hash__":2798},"posts\u002Fposts\u002FLogiciels\u002F2009-04-11-kde4-devient-instable.md","KDE4 devient instable ...",{"type":8,"value":2720,"toc":2770},[2721,2724,2727,2740,2747,2750,2764,2767],[11,2722,2723],{},"Title: KDE4 devient instable ...\nTags: debian, kde, qt",[11,2725,2726],{},"Titre trolleur, cela ne veux pas dire que KDE 4 est moins stable\nqu'avant mais qu'il a passé une étape supplémentaire chez Debian.",[11,2728,2729,2730,2732,2733,2736,2737,659],{},"Voilà quelques jours déjà que la distribution ",[230,2731,165],{}," intègre\n",[230,2734,2735],{},"KDE 4"," dans sa version instable. C'est une grande nouvelle car cela\nva permettre à toute les personnes se trouvant en instable et n'ayant\npas touchées à la branche expérimental de Debian de pouvoir tester ",[230,2738,2739],{},"KDE\n4",[11,2741,2742,2743,2746],{},"Malheureusement pour les ",[15,2744,2745],{},"traumatisé de KDE 4",", l'intégration de ce\ndernier remplace KDE 3.5 et ne viens pas se positionner en parallèle. Il\nme semble pourtant que lors du passage de KDE 2 à KDE 3, il était\npossible d'avoir les deux bureaux en même temps sur sa machine et de\nswitcher de l'un à l'autre sans difficulté. Cela signifie donc peut-être\naussi la perte d'utilisateur pour KDE sous Gnu\u002FDebian au profit d'un\nautre environnement de bureau.",[11,2748,2749],{},"Afin d'effectuer la migration en douceur, Gnu\u002FDebian propose un\nassistant de migration de KDE du nom de Kaboom. Cet assistant, démarrer\nlors de la première connexion de l'utilisateur et vous propose alors de\nsauvegarder votre ancien dossier de configuration KDE 3 et de migrer le\ndossier .kde vers la version 4.",[11,2751,2752,2756,2760],{},[2569,2753],{"alt":2754,"src":2755},"kaboom1","\u002FLogiciels\u002Fkde4-devient-instable\u002Fkaboom1_s.jpg",[2569,2757],{"alt":2758,"src":2759},"kaboom2","\u002FLogiciels\u002Fkde4-devient-instable\u002Fkaboom2_s.jpg",[2569,2761],{"alt":2762,"src":2763},"kaboom3","\u002FLogiciels\u002Fkde4-devient-instable\u002Fkaboom3_s.jpg",[11,2765,2766],{},"Je viens donc de passer à KDE 4 et m'émerveille des nouvelles\nfonctionnalités de KWin (cube, placement des fenêtres) que je n'avais\npas avant, car n'avait jamais installé Compiz ...",[11,2768,2769],{},"Bonne installation,",{"title":31,"searchDepth":134,"depth":134,"links":2771},[],"2009-04-11",{"type":8,"value":2774},[2775,2777,2779,2787],[11,2776,2723],{},[11,2778,2726],{},[11,2780,2729,2781,2732,2783,2736,2785,659],{},[230,2782,165],{},[230,2784,2735],{},[230,2786,2739],{},[11,2788,2742,2789,2746],{},[15,2790,2745],{},{},"\u002Fpost\u002Fkde4-devient-instable",{"title":2718,"description":2723},"kde4-devient-instable","posts\u002FLogiciels\u002F2009-04-11-kde4-devient-instable",[1178,2797,2712],"kde","Oj3jqh3sY77Ym6LYJ2tDQUMs5alVjGgGLz0JxRhI7k8",{"id":2800,"title":2801,"author":6,"body":2802,"category":2815,"categorySlug":3222,"date":3223,"description":31,"excerpt":3224,"extension":1169,"location":1170,"meta":3240,"navigation":1172,"path":3241,"published":1172,"seo":3242,"slug":3243,"stem":3244,"tags":3245,"timeToRead":150,"__hash__":3248},"posts\u002Fposts\u002FXINX\u002F2009-03-06-xinx-0.8.0.0.md","XINX 0.8.0.0",{"type":8,"value":2803,"toc":3215},[2804,2810,2816,2824,2827,2835,2838,2841,2845,2856,2863,2866,2871,2877,2894,2898,2904,2907,2910,2914,2919,2927,3113,3123,3127,3130,3138,3142,3146,3158,3161,3165,3168,3174,3177,3206,3212],[11,2805,2806],{},[2569,2807],{"alt":2808,"src":2809},"Editeur","\u002FXINX\u002Fxinx-0.8.0.0\u002Fediteur_de_texte.png",[11,2811,2812,2813,659],{},"J'ai le plaisir de vous annoncer la sortie de la nouvelle version de\n",[230,2814,2815],{},"XINX",[11,2817,2818,2820,2821,659],{},[230,2819,2815],{}," est un éditeur de projet web basé sur les technologies XSL,\nHTML, CSS, JavaScript. Il possède un mode projet permettant de dériver\nles projets à la manière des consultants GCE de l'entreprise ",[15,2822,2823],{},"Generix\nGroup",[11,2825,2826],{},"Cette dernière version a mis beaucoup de temps pour sortir et est moins\ncomplète que celle que je souhaitais faire à l'origine. Cela viens de\nplusieurs raison :",[39,2828,2829,2832],{},[42,2830,2831],{},"de gros changement interne",[42,2833,2834],{},"moins de temps le soir et le week-end.",[11,2836,2837],{},"La prochaine version 0.8.1 contiendra les développements que je n'ai pu\nmettre dans cette version. N'hésitez pas à faire un retour sur les\nproblèmes que vous rencontrez pour que ces derniers soit également\ncorriger pour la prochaine version.",[11,2839,2840],{},"Nous allons détailler ci-dessous les différentes amélioration incluse\ndans cette version.",[95,2842,2844],{"id":2843},"qcodeedit-le-nouvel-éditeur","QCodeEdit - Le nouvel éditeur",[11,2846,2847,2848,2851,2852,2855],{},"L'éditeur de texte de cette version a complètement été remplacé. On est\npassé de QTextEdit (",[15,2849,2850],{},"éditeur de texte de Qt Software",") à QCodeEdit\n(",[15,2853,2854],{},"Développé par Luc Bruant aka fullmetalcoder","). Heureusement que les\nAPIs de ces deux éditeurs sont très similaire ce qui a permis\nd'effectuer les changements assez rapidement (quelques mois au lieu de\nquelques années ;) ).",[11,2857,2858,2859,2862],{},"Je tiens également à remercier ",[15,2860,2861],{},"fullmetalcoder"," de sa réactivité sur le\ndéveloppement de QCodeEdit.",[11,2864,2865],{},"Les nouveautés qu'apportent ce nouvel éditeur par rapport à QTextEdit\nsont :",[39,2867,2868],{},[42,2869,2870],{},"le folding",[11,2872,2873],{},[2569,2874],{"alt":2875,"src":2876},"Mark","\u002FXINX\u002Fxinx-0.8.0.0\u002Fmarqueur.png",[39,2878,2879,2882,2888,2891],{},[42,2880,2881],{},"les couleurs de fond sur les marque pages et les erreurs (pour une\nplus grande clarté).",[42,2883,2884,2885,2420],{},"un chargement plus rapide des fichiers (exemple :\n",[49,2886,2887],{},"configuration.xml",[42,2889,2890],{},"pourvoir faire des sélections verticales (à l'aide de Ctrl+Shift)\ncomme le font certain éditeurs",[42,2892,2893],{},"afficher les correspondances de parenthèses",[95,2895,2897],{"id":2896},"test-du-xpath","Test du XPATH",[11,2899,2900],{},[2569,2901],{"alt":2902,"src":2903},"X-Quey","\u002FXINX\u002Fxinx-0.8.0.0\u002Fxpath.png",[11,2905,2906],{},"Cette boite de dialogue permet d'exécuter un X-PATH (ou une requête\nXQuery) sur un fichier de présentation. Cela permet de tester rapidement\nles X-PATH compliqué avant de lancer la page sous le navigateur.",[11,2908,2909],{},"Il est possible de saisir des X-PATH relativement à un X-PATH\nsélectionné dans le flux de présentation ou de manière absolu.",[95,2911,2913],{"id":2912},"script-automatique","Script automatique",[11,2915,2916,2918],{},[230,2917,2815],{}," permet également d'appeler un script lors de la sauvegarde d'un\nfichier. Pour cela un nouvel objet permettant de modifier le contenue de\nl'éditeur plus facilement a été créé.Comme exemple à la sauvegarde de\nscript ont été mis à jours :",[39,2920,2921,2924],{},[42,2922,2923],{},"La mise à jours des key('url-param','') par des X-PATH",[42,2925,2926],{},"La mise à jours du nom du fichier dans les feuilles de styles.",[112,2928,2932],{"className":2929,"code":2930,"language":2931,"meta":31,"style":31},"language-javascript shiki shiki-themes one-dark-pro","obj.beforeSave = function() {\n  this.run();\n};\n\nobj.run = function() {\n  var search = new DocumentSearch(textEdit);\n\n  search.options.regExp = true;\n  search.searchText = \"key\\\\('url-param', '(.*)'\\\\)\";\n  search.replaceText =\n    \"\u002Flayout_data\u002Fapplication_data\u002Ftemporaire\u002Fparam[@name='\\\\1']\";\n\n  while (search.next()) {}\n};\n","javascript",[49,2933,2934,2952,2964,2968,2972,2986,3009,3013,3036,3063,3075,3087,3091,3109],{"__ignoreMap":31},[120,2935,2936,2939,2941,2944,2946,2949],{"class":122,"line":123},[120,2937,2938],{"class":916},"obj",[120,2940,659],{"class":380},[120,2942,2943],{"class":126},"beforeSave",[120,2945,792],{"class":516},[120,2947,2948],{"class":788}," function",[120,2950,2951],{"class":380},"() {\n",[120,2953,2954,2957,2959,2962],{"class":122,"line":134},[120,2955,2956],{"class":916},"  this",[120,2958,659],{"class":380},[120,2960,2961],{"class":126},"run",[120,2963,1672],{"class":380},[120,2965,2966],{"class":122,"line":142},[120,2967,2031],{"class":380},[120,2969,2970],{"class":122,"line":150},[120,2971,1422],{"emptyLinePlaceholder":1172},[120,2973,2974,2976,2978,2980,2982,2984],{"class":122,"line":325},[120,2975,2938],{"class":916},[120,2977,659],{"class":380},[120,2979,2961],{"class":126},[120,2981,792],{"class":516},[120,2983,2948],{"class":788},[120,2985,2951],{"class":380},[120,2987,2988,2991,2994,2996,2999,3002,3004,3007],{"class":122,"line":334},[120,2989,2990],{"class":788},"  var",[120,2992,2993],{"class":1571}," search",[120,2995,792],{"class":516},[120,2997,2998],{"class":788}," new",[120,3000,3001],{"class":126}," DocumentSearch",[120,3003,1380],{"class":380},[120,3005,3006],{"class":1571},"textEdit",[120,3008,2313],{"class":380},[120,3010,3011],{"class":122,"line":342},[120,3012,1422],{"emptyLinePlaceholder":1172},[120,3014,3015,3018,3020,3023,3025,3028,3030,3033],{"class":122,"line":351},[120,3016,3017],{"class":916},"  search",[120,3019,659],{"class":380},[120,3021,3022],{"class":916},"options",[120,3024,659],{"class":380},[120,3026,3027],{"class":1571},"regExp",[120,3029,792],{"class":516},[120,3031,3032],{"class":284}," true",[120,3034,3035],{"class":380},";\n",[120,3037,3038,3040,3042,3045,3047,3050,3053,3056,3058,3061],{"class":122,"line":483},[120,3039,3017],{"class":916},[120,3041,659],{"class":380},[120,3043,3044],{"class":1571},"searchText",[120,3046,792],{"class":516},[120,3048,3049],{"class":130}," \"key",[120,3051,3052],{"class":516},"\\\\",[120,3054,3055],{"class":130},"('url-param', '(.*)'",[120,3057,3052],{"class":516},[120,3059,3060],{"class":130},")\"",[120,3062,3035],{"class":380},[120,3064,3065,3067,3069,3072],{"class":122,"line":503},[120,3066,3017],{"class":916},[120,3068,659],{"class":380},[120,3070,3071],{"class":1571},"replaceText",[120,3073,3074],{"class":516}," =\n",[120,3076,3077,3080,3082,3085],{"class":122,"line":513},[120,3078,3079],{"class":130},"    \"\u002Flayout_data\u002Fapplication_data\u002Ftemporaire\u002Fparam[@name='",[120,3081,3052],{"class":516},[120,3083,3084],{"class":130},"1']\"",[120,3086,3035],{"class":380},[120,3088,3089],{"class":122,"line":520},[120,3090,1422],{"emptyLinePlaceholder":1172},[120,3092,3093,3096,3098,3101,3103,3106],{"class":122,"line":531},[120,3094,3095],{"class":788},"  while",[120,3097,166],{"class":380},[120,3099,3100],{"class":916},"search",[120,3102,659],{"class":380},[120,3104,3105],{"class":126},"next",[120,3107,3108],{"class":380},"()) {}\n",[120,3110,3111],{"class":122,"line":541},[120,3112,2031],{"class":380},[11,3114,3115,3116,3118,3119,3122],{},"La nouveauté se trouve dans l'ajout de quatre nouvelle méthodes. La\nméthode utilisé ici est ",[49,3117,2943],{}," et permet de faire des\nmodifications au texte avant sauvegarde. Tout comme ",[49,3120,3121],{},"afterSave"," permet\nd'effectuer des modifications au texte après sauvegarde. Nous avons\négalement deux méthodes beforeLoad et afterLoad pour les opérations à\nfaire lors de la lecture.",[95,3124,3126],{"id":3125},"autres-nouveautés","Autres nouveautés",[11,3128,3129],{},"Bien sur cet version apporte aussi d'autres nouveautés comme :",[39,3131,3132,3135],{},[42,3133,3134],{},"la fermeture automatique de balise",[42,3136,3137],{},"des nouvelles options, ...",[95,3139,3141],{"id":3140},"installation","Installation",[100,3143,3145],{"id":3144},"sous-mswindows","Sous Ms\u002FWindows",[11,3147,3148,3149,3151,3152,3157],{},"Pour installer la dernière version de ",[230,3150,2815],{}," vous pouvez télécharger\nle ",[26,3153,3156],{"href":3154,"rel":3155},"http:\u002F\u002Fxinx.shadoware.org\u002Fdownloads\u002F40",[76],"programme d'installation"," et le lancer. Il remplacera\nautomatiquement l'ancienne version.",[11,3159,3160],{},"Si vous avez des fichiers de données modifiés (template, script, ...)\npensez à les sauvegarder.",[100,3162,3164],{"id":3163},"sous-gnulinux","Sous Gnu\u002FLinux",[11,3166,3167],{},"Sous Debian, vous pouvez ajouter le dépôt dans le fichier\n\u002Fetc\u002Fapt\u002Fsources.list. Ainsi vous serez automatiquement prévenu des\nmises à jours éventuelle.",[112,3169,3172],{"className":3170,"code":3171,"language":263},[261],"deb http:\u002F\u002Fapt.shadoware.org\u002F sid main\n",[49,3173,3171],{"__ignoreMap":31},[11,3175,3176],{},"puis dans une console :",[112,3178,3180],{"className":114,"code":3179,"language":116,"meta":31,"style":31},"sudo apt-cache search xinx\nsudo aptitude install xinx\n",[49,3181,3182,3195],{"__ignoreMap":31},[120,3183,3184,3187,3190,3192],{"class":122,"line":123},[120,3185,3186],{"class":126},"sudo",[120,3188,3189],{"class":130}," apt-cache",[120,3191,2993],{"class":130},[120,3193,3194],{"class":130}," xinx\n",[120,3196,3197,3199,3202,3204],{"class":122,"line":134},[120,3198,3186],{"class":126},[120,3200,3201],{"class":130}," aptitude",[120,3203,192],{"class":130},[120,3205,3194],{"class":130},[11,3207,3208,3209,3211],{},"Pour les autres distributions ou pour les machines MacOS vous pouvez\ncompiler ",[230,3210,2815],{}," à partir des sources.",[1108,3213,3214],{},"html pre.shiki code .sU0A5, html code.shiki .sU0A5{--shiki-default:#E5C07B}html pre.shiki code .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}html pre.shiki code .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}html pre.shiki code .sjrmR, html code.shiki .sjrmR{--shiki-default:#56B6C2}html pre.shiki code .seHd6, html code.shiki .seHd6{--shiki-default:#C678DD}html pre.shiki code .sVyAn, html code.shiki .sVyAn{--shiki-default:#E06C75}html pre.shiki code .sVC51, html code.shiki .sVC51{--shiki-default:#D19A66}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":31,"searchDepth":134,"depth":134,"links":3216},[3217,3218,3219,3220,3221],{"id":2843,"depth":142,"text":2844},{"id":2896,"depth":142,"text":2897},{"id":2912,"depth":142,"text":2913},{"id":3125,"depth":142,"text":3126},{"id":3140,"depth":142,"text":3141},"xinx","2009-03-06",{"type":8,"value":3225},[3226,3230,3234],[11,3227,3228],{},[2569,3229],{"alt":2808,"src":2809},[11,3231,2812,3232,659],{},[230,3233,2815],{},[11,3235,3236,2820,3238,659],{},[230,3237,2815],{},[15,3239,2823],{},{},"\u002Fpost\u002Fxinx-0.8.0.0",{"title":2801,"description":31},"xinx-0.8.0.0","posts\u002FXINX\u002F2009-03-06-xinx-0.8.0.0",[1178,3222,3246,2712,3247],"generix-group","xml","2LVP73RxAuNHiNwoDLW7n9zx61WC1hKRo8CPZUCY5rk",1777849592195]