[{"data":1,"prerenderedAt":6001},["ShallowReactive",2],{"category-logiciels":3},[4,1708,3277,4277,4399,4483,4744,4779,4918,5053,5711,5869,5970],{"id":5,"title":6,"author":7,"body":8,"category":1673,"categorySlug":1674,"date":1675,"description":1676,"excerpt":1677,"extension":195,"location":1698,"meta":1699,"navigation":217,"path":1700,"published":217,"seo":1701,"slug":1702,"stem":1703,"tags":1704,"timeToRead":289,"__hash__":1707},"posts\u002Fposts\u002FLogiciels\u002F2021-03-02-gridsome-mise-a-jour-du-blog.md","Mise à jour du blog vers gridsome","Ulrich Vandenhekke",{"type":9,"value":10,"toc":1664},"minimark",[11,28,43,46,49,69,72,77,80,83,113,116,120,123,151,154,157,187,190,225,228,293,296,365,369,376,384,387,495,513,581,584,624,631,704,707,766,775,778,845,848,931,934,938,941,944,947,950,960,963,970,1254,1263,1267,1270,1273,1284,1287,1317,1320,1323,1326,1334,1343,1352,1360,1363,1373,1559,1562,1615,1618,1622,1625,1636,1660],[12,13,14,15,20,21,27],"p",{},"J'avais migré en Janvier 2013 mon ",[16,17,19],"a",{"href":18},"\u002Fpages\u002Fmigration-to-pelican","blog vers Pelican"," en venant de\n",[16,22,26],{"href":23,"rel":24},"https:\u002F\u002Ffr.dotclear.org\u002F",[25],"nofollow","Dotclear",". Pelican est un générateur de site statique en Python. J'avais\nalors dû faire l'impasse sur les commentaires mais au bénéfice d'un site performant et avec une\nsurface d'attaque plus faible.",[12,29,30,31,36,37,42],{},"Plus tard, en décembre 2016, j'avais changé le thème pour ",[16,32,35],{"href":33,"rel":34},"https:\u002F\u002Fgithub.com\u002Falexandrevicenzi\u002FFlex",[25],"alexandrevicenzi\u002FFlex",".\nAujoud'hui je vais vous montrer la migration de mon blog vers ",[16,38,41],{"href":39,"rel":40},"https:\u002F\u002Fgridsome.org\u002F",[25],"Gridsome",".",[12,44,45],{},"Je reste sur un générateur de site statique car, j'aime l'idée d'un site à la fois rapide et\nimmuable tant que je ne décide pas de modifier le contenu mon blog. Alors pourquoi changer de Pelican\nvers Gridsome ?",[12,47,48],{},"Gridsome est un générateur de site statique écrit en Javascript. Il a la particularité de pouvoir générer\ndes pages depuis des fichiers au format Markdown mais aussi depuis des CMS Headless, ou de n'importe\nquelles autres API et ce grace à une API commune en GraphQL.",[12,50,51,52,63,64,42],{},"En plus de générer le site statique au format HTML, Gridsome fonctionne comme une SPA",[53,54,55],"sup",{},[16,56,62],{"href":57,"ariaDescribedBy":58,"dataFootnoteRef":60,"id":61},"#user-content-fn-1",[59],"footnote-label","","user-content-fnref-1","1",". Dans une SPA\nles pages sont générées côté client et sont mises à jour lors d'appel API pour récupérer les données. Ainsi\nseul le contenu modifié est rafraichit. Le framework Gridsome se base sur ",[16,65,68],{"href":66,"rel":67},"https:\u002F\u002Ffr.vuejs.org\u002F",[25],"Vue.Js",[12,70,71],{},"Ce qui m'a plus dans Gridsome, c'est l'utilisation de Vue.JS pour générer les pages statiques, mais aussi\nl'utilisation de GraphQL pour requêter le contenu des pages d'une même et unique façon.",[73,74,76],"h2",{"id":75},"alternatives","Alternatives",[12,78,79],{},"Lors de la migration de mon blog, je voulais une technologie basée sur Vue.Js, car c'est un framework que\nj'apprécie. Mais le plus important, c'est que j'avais besoin de changement (pour le plaisir quoi ;)).",[12,81,82],{},"Les générateurs de site statique en Vue.Js sont :",[84,85,86,94,101,108],"ul",{},[87,88,89],"li",{},[16,90,93],{"href":91,"rel":92},"https:\u002F\u002Fvuepress.vuejs.org\u002F",[25],"VuePress",[87,95,96],{},[16,97,100],{"href":98,"rel":99},"https:\u002F\u002Ffr.nuxtjs.org\u002F",[25],"Nuxt.js",[87,102,103],{},[16,104,107],{"href":105,"rel":106},"https:\u002F\u002Fsaber.land\u002F",[25],"Saber",[87,109,110],{},[16,111,41],{"href":39,"rel":112},[25],[12,114,115],{},"Je vous laisse regarder et vous faire votre avis sur les différents framework. J'ai surtout testé VuePress mais\nj'ai changé pour Gridsome quand j'ai vu la simplicité d'implémentation.",[73,117,119],{"id":118},"début-de-limplémentation","Début de l'implémentation",[12,121,122],{},"Je voulais changer de technologie, mais j'aimais bien le thème Pelican que j'utilisais. Je n'avais donc pas\nenvie de le changer. Je me suis imposé également les contraintes suivantes:",[84,124,125,128,139,142,145,148],{},[87,126,127],{},"Je ne voulais pas changer les différents chemins d'accès au site (tant que faire se peut).",[87,129,130,131],{},"Je voulais garder les fonctionnalités suivantes:\n",[84,132,133,136],{},[87,134,135],{},"Sitemap",[87,137,138],{},"Atom",[87,140,141],{},"J'avais des billets écrits en Markdown mais aussi 3 pages que je ne voulais pas réécrire en HTML",[87,143,144],{},"Garder le même thème",[87,146,147],{},"Avoir une page par catégorie et une page avec toutes les catégories",[87,149,150],{},"Avoir une page par tag et une page avec tous les tags",[12,152,153],{},"Je commence donc à initialiser un projet de zéro avec mes différents billets de blog, les pages (contact,\nanciens-projets, et contact) et les fichiers statiques (les images, les zips, ...).",[12,155,156],{},"J'ai du retravailler les différents billets de blog au format Markdown:",[84,158,159,162,180],{},[87,160,161],{},"J'ai dû déplacer les différents attributs du fichier pour les placer dans un frontmatter au format YAML.",[87,163,164,165,169,170,173,174,42,177,179],{},"Les fichiers ont un nom qui porte de l'information. Ainsi, le dossier dans lequel se trouve le fichier\nconstitue le nom de la catégorie, et le nom du fichier porte la date de publication et le ",[166,167,168],"code",{},"slug"," (utilisé\npour le chemin dans l'URL).",[171,172],"br",{},"Par exemple, avec le fichier: ",[166,175,176],{},"Logiciels\u002F2009-02-15_debian-lenny-est-sortie.md",[171,178],{},"Avec le changement de paradigme de Gridsome, j'ai dû intégrer ces différentes informations dans le frontmatter.",[87,181,182,183,186],{},"J'ai également du retravailler les emplacements de fichiers qui étaient préfixés dans Pelican\nde ",[166,184,185],{},"|static|\u002Fpublic\u002F...",". Dans Gridsome, il n'y pas de syntaxe particulière, juste le nom du fichier absolu.",[12,188,189],{},"Avant j'avais:",[191,192,196],"pre",{"className":193,"code":194,"language":195,"meta":60,"style":60},"language-md shiki shiki-themes one-dark-pro","Title: Debian Lenny est sortie\nTags: debian, kde\n\n![Logo](|static|\u002Fpublic\u002FLogiciels\u002Fdebian-lenny-est-sortie\u002Fdebian-logo.png)\n","md",[166,197,198,206,212,219],{"__ignoreMap":60},[199,200,203],"span",{"class":201,"line":202},"line",1,[199,204,205],{},"Title: Debian Lenny est sortie\n",[199,207,209],{"class":201,"line":208},2,[199,210,211],{},"Tags: debian, kde\n",[199,213,215],{"class":201,"line":214},3,[199,216,218],{"emptyLinePlaceholder":217},true,"\n",[199,220,222],{"class":201,"line":221},4,[199,223,224],{},"![Logo](|static|\u002Fpublic\u002FLogiciels\u002Fdebian-lenny-est-sortie\u002Fdebian-logo.png)\n",[12,226,227],{},"et j'ai corrigé cela en",[191,229,231],{"className":193,"code":230,"language":195,"meta":60,"style":60},"---\ntitle: Debian Lenny est sortie\ndate: 2009-02-15\ntags:\n  - debian\n  - kde\npublished: True\ncategory: Logiciels\n---\n\n![Logo](\u002FLogiciels\u002Fdebian-lenny-est-sortie\u002Fdebian-logo.png)\n",[166,232,233,238,243,248,253,259,265,271,277,282,287],{"__ignoreMap":60},[199,234,235],{"class":201,"line":202},[199,236,237],{},"---\n",[199,239,240],{"class":201,"line":208},[199,241,242],{},"title: Debian Lenny est sortie\n",[199,244,245],{"class":201,"line":214},[199,246,247],{},"date: 2009-02-15\n",[199,249,250],{"class":201,"line":221},[199,251,252],{},"tags:\n",[199,254,256],{"class":201,"line":255},5,[199,257,258],{},"  - debian\n",[199,260,262],{"class":201,"line":261},6,[199,263,264],{},"  - kde\n",[199,266,268],{"class":201,"line":267},7,[199,269,270],{},"published: True\n",[199,272,274],{"class":201,"line":273},8,[199,275,276],{},"category: Logiciels\n",[199,278,280],{"class":201,"line":279},9,[199,281,237],{},[199,283,285],{"class":201,"line":284},10,[199,286,218],{"emptyLinePlaceholder":217},[199,288,290],{"class":201,"line":289},11,[199,291,292],{},"![Logo](\u002FLogiciels\u002Fdebian-lenny-est-sortie\u002Fdebian-logo.png)\n",[12,294,295],{},"Afin de pouvoir reprendre mes fichiers au format markdown sans trop de modification, j'ai également installé les\nplugins remark suivants (ce sur quoi Gridsome se base pour transformer le Markdown en HTML) :",[84,297,298,304,338,353,359],{},[87,299,300,303],{},[166,301,302],{},"@gridsome\u002Fremark-prismjs",": pour effectuer une coloration syntaxique.",[87,305,306,309,310],{},[166,307,308],{},"remark-inline-links",": pour pouvoir gérer les liens inclus (qui sont ensuite reportés en bas du fichier)",[191,311,313],{"className":193,"code":312,"language":195,"meta":60,"style":60},"[foo], [foo][], [bar][foo].\n\n![foo], ![foo][], ![bar][foo].\n\n[foo]: http:\u002F\u002Fexample.com \"Example Domain\"\n",[166,314,315,320,324,329,333],{"__ignoreMap":60},[199,316,317],{"class":201,"line":202},[199,318,319],{},"[foo], [foo][], [bar][foo].\n",[199,321,322],{"class":201,"line":208},[199,323,218],{"emptyLinePlaceholder":217},[199,325,326],{"class":201,"line":214},[199,327,328],{},"![foo], ![foo][], ![bar][foo].\n",[199,330,331],{"class":201,"line":221},[199,332,218],{"emptyLinePlaceholder":217},[199,334,335],{"class":201,"line":255},[199,336,337],{},"[foo]: http:\u002F\u002Fexample.com \"Example Domain\"\n",[87,339,340,343,344],{},[166,341,342],{},"remark-attr",": pour pouvoir ajouter des attributs à une image ou à un objet.",[191,345,347],{"className":193,"code":346,"language":195,"meta":60,"style":60},"![alt](img){attrs} \u002F ![alt](img){ height=50 }\n",[166,348,349],{"__ignoreMap":60},[199,350,351],{"class":201,"line":202},[199,352,346],{},[87,354,355,358],{},[166,356,357],{},"remark-toc",": pour pouvoir ajouter un sommaire à certain billet.",[87,360,361,364],{},[166,362,363],{},"remark-footnotes",": pour pouvoir ajouter les footnotes.",[73,366,368],{"id":367},"création-du-thème","Création du thème",[12,370,371,372,375],{},"Le thème Pelican de mon blog est basé sur ",[16,373,35],{"href":33,"rel":374},[25],".\nJ'ai donc créé un thème gridsome en reprenant le style du thème précédent mais en convertissant les templates\nen Vue.Js.",[12,377,378,379,42],{},"J'ai donc créé ce thème que j'ai mis à disposition ici : ",[16,380,383],{"href":381,"rel":382},"https:\u002F\u002Fgithub.com\u002Fphoenix741\u002Fgridsome-flex-markdown-starter",[25],"phoenix741\u002Fgridsome-flex-markdown-starter",[12,385,386],{},"Voici la configuration de gridsome que j'ai implémenté pour reconstruire le thème du blog:",[191,388,392],{"className":389,"code":390,"language":391,"meta":60,"style":60},"language-js shiki shiki-themes one-dark-pro","  plugins: [\n    {\n      use: \"@gridsome\u002Fsource-filesystem\",\n      options: {\n        baseDir: \"content\u002Fposts\",\n        path: \"**\u002F*.md\",\n        typeName: \"Post\",\n        refs: {\n          tags: {\n            typeName: \"Tag\",\n            create: true,\n          },\n          category: {\n            typeName: \"Category\",\n            create: true,\n          },\n        },\n      },\n    },\n","js",[166,393,394,399,404,409,414,419,424,429,434,439,444,449,455,461,467,472,477,483,489],{"__ignoreMap":60},[199,395,396],{"class":201,"line":202},[199,397,398],{},"  plugins: [\n",[199,400,401],{"class":201,"line":208},[199,402,403],{},"    {\n",[199,405,406],{"class":201,"line":214},[199,407,408],{},"      use: \"@gridsome\u002Fsource-filesystem\",\n",[199,410,411],{"class":201,"line":221},[199,412,413],{},"      options: {\n",[199,415,416],{"class":201,"line":255},[199,417,418],{},"        baseDir: \"content\u002Fposts\",\n",[199,420,421],{"class":201,"line":261},[199,422,423],{},"        path: \"**\u002F*.md\",\n",[199,425,426],{"class":201,"line":267},[199,427,428],{},"        typeName: \"Post\",\n",[199,430,431],{"class":201,"line":273},[199,432,433],{},"        refs: {\n",[199,435,436],{"class":201,"line":279},[199,437,438],{},"          tags: {\n",[199,440,441],{"class":201,"line":284},[199,442,443],{},"            typeName: \"Tag\",\n",[199,445,446],{"class":201,"line":289},[199,447,448],{},"            create: true,\n",[199,450,452],{"class":201,"line":451},12,[199,453,454],{},"          },\n",[199,456,458],{"class":201,"line":457},13,[199,459,460],{},"          category: {\n",[199,462,464],{"class":201,"line":463},14,[199,465,466],{},"            typeName: \"Category\",\n",[199,468,470],{"class":201,"line":469},15,[199,471,448],{},[199,473,475],{"class":201,"line":474},16,[199,476,454],{},[199,478,480],{"class":201,"line":479},17,[199,481,482],{},"        },\n",[199,484,486],{"class":201,"line":485},18,[199,487,488],{},"      },\n",[199,490,492],{"class":201,"line":491},19,[199,493,494],{},"    },\n",[12,496,497,498,501,502,505,506,509,510,42],{},"Pour commencer, on utilise le module ",[166,499,500],{},"@gridsome\u002Fsource-filesystem"," pour lire le contenu du dossier\n",[166,503,504],{},"content\u002Fposts\u002F**\u002F*.md",". On définit au plugin comment on créé les ",[166,507,508],{},"Tag"," et les ",[166,511,512],{},"Category",[191,514,516],{"className":389,"code":515,"language":391,"meta":60,"style":60},"    {\n      use: \"@microflash\u002Fgridsome-plugin-feed\",\n      options: {\n        contentTypes: [\"Post\"],\n        rss: {\n          enabled: true,\n          output: \"\u002Ffeed.xml\",\n        },\n        atom: {\n          enabled: true,\n          output: \"\u002Ffeed.atom\",\n        },\n      },\n    },\n",[166,517,518,522,527,531,536,541,546,551,555,560,564,569,573,577],{"__ignoreMap":60},[199,519,520],{"class":201,"line":202},[199,521,403],{},[199,523,524],{"class":201,"line":208},[199,525,526],{},"      use: \"@microflash\u002Fgridsome-plugin-feed\",\n",[199,528,529],{"class":201,"line":214},[199,530,413],{},[199,532,533],{"class":201,"line":221},[199,534,535],{},"        contentTypes: [\"Post\"],\n",[199,537,538],{"class":201,"line":255},[199,539,540],{},"        rss: {\n",[199,542,543],{"class":201,"line":261},[199,544,545],{},"          enabled: true,\n",[199,547,548],{"class":201,"line":267},[199,549,550],{},"          output: \"\u002Ffeed.xml\",\n",[199,552,553],{"class":201,"line":273},[199,554,482],{},[199,556,557],{"class":201,"line":279},[199,558,559],{},"        atom: {\n",[199,561,562],{"class":201,"line":284},[199,563,545],{},[199,565,566],{"class":201,"line":289},[199,567,568],{},"          output: \"\u002Ffeed.atom\",\n",[199,570,571],{"class":201,"line":451},[199,572,482],{},[199,574,575],{"class":201,"line":457},[199,576,488],{},[199,578,579],{"class":201,"line":463},[199,580,494],{},[12,582,583],{},"Ensuite on crée un flux RSS et un flux ATOM avec ces posts, afin que les lecteurs qui utilisent\nencore un lecteur de flux, ou les programmes qui s'abonnent directement à mon site fonctionnent encore.",[191,585,587],{"className":389,"code":586,"language":391,"meta":60,"style":60},"    {\n      use: \"@gridsome\u002Fsource-filesystem\",\n      options: {\n        baseDir: \"content\u002Fpages\",\n        path: \"*.md\",\n        typeName: \"BlogPage\",\n      },\n    },\n",[166,588,589,593,597,601,606,611,616,620],{"__ignoreMap":60},[199,590,591],{"class":201,"line":202},[199,592,403],{},[199,594,595],{"class":201,"line":208},[199,596,408],{},[199,598,599],{"class":201,"line":214},[199,600,413],{},[199,602,603],{"class":201,"line":221},[199,604,605],{},"        baseDir: \"content\u002Fpages\",\n",[199,607,608],{"class":201,"line":255},[199,609,610],{},"        path: \"*.md\",\n",[199,612,613],{"class":201,"line":261},[199,614,615],{},"        typeName: \"BlogPage\",\n",[199,617,618],{"class":201,"line":267},[199,619,488],{},[199,621,622],{"class":201,"line":273},[199,623,494],{},[12,625,626,627,630],{},"On recommence avec les pages du site, que l'on type comme ",[166,628,629],{},"BlogPage",". Ces pages ne seront\npas accessibles via des catégories ou des pages. Il faudra faire des liens directement vers les\npages depuis un menu.",[191,632,634],{"className":389,"code":633,"language":391,"meta":60,"style":60},"    {\n      use: \"@gridsome\u002Fplugin-sitemap\",\n      options: {\n        config: {\n          \"\u002Fpost\u002F*\": {\n            changefreq: \"weekly\",\n            priority: 0.5,\n          },\n          \"\u002Fpage\u002F*\": {\n            changefreq: \"monthly\",\n            priority: 0.7,\n          },\n        },\n      },\n    },\n",[166,635,636,640,645,649,654,659,664,669,673,678,683,688,692,696,700],{"__ignoreMap":60},[199,637,638],{"class":201,"line":202},[199,639,403],{},[199,641,642],{"class":201,"line":208},[199,643,644],{},"      use: \"@gridsome\u002Fplugin-sitemap\",\n",[199,646,647],{"class":201,"line":214},[199,648,413],{},[199,650,651],{"class":201,"line":221},[199,652,653],{},"        config: {\n",[199,655,656],{"class":201,"line":255},[199,657,658],{},"          \"\u002Fpost\u002F*\": {\n",[199,660,661],{"class":201,"line":261},[199,662,663],{},"            changefreq: \"weekly\",\n",[199,665,666],{"class":201,"line":267},[199,667,668],{},"            priority: 0.5,\n",[199,670,671],{"class":201,"line":273},[199,672,454],{},[199,674,675],{"class":201,"line":279},[199,676,677],{},"          \"\u002Fpage\u002F*\": {\n",[199,679,680],{"class":201,"line":284},[199,681,682],{},"            changefreq: \"monthly\",\n",[199,684,685],{"class":201,"line":289},[199,686,687],{},"            priority: 0.7,\n",[199,689,690],{"class":201,"line":451},[199,691,454],{},[199,693,694],{"class":201,"line":457},[199,695,482],{},[199,697,698],{"class":201,"line":463},[199,699,488],{},[199,701,702],{"class":201,"line":469},[199,703,494],{},[12,705,706],{},"Après, on définit un sitemap qui pourra être utilisé par les moteurs de recherches.",[191,708,710],{"className":389,"code":709,"language":391,"meta":60,"style":60},"  ],\n  templates: {\n    Post: (obj) => {\n      return (\n        \"\u002Fpost\u002F\" + obj.fileInfo.name.replace(\u002F^\\d{4}-\\d{2}-\\d{2}[_\\-]\u002F, \"\")\n      );\n    },\n    BlogPage: \"\u002Fpages\u002F:fileInfo__name\",\n    Tag: \"\u002Ftag\u002F:id\",\n    Category: \"\u002Fcategory\u002F:title\",\n  },\n",[166,711,712,717,722,727,732,737,742,746,751,756,761],{"__ignoreMap":60},[199,713,714],{"class":201,"line":202},[199,715,716],{},"  ],\n",[199,718,719],{"class":201,"line":208},[199,720,721],{},"  templates: {\n",[199,723,724],{"class":201,"line":214},[199,725,726],{},"    Post: (obj) => {\n",[199,728,729],{"class":201,"line":221},[199,730,731],{},"      return (\n",[199,733,734],{"class":201,"line":255},[199,735,736],{},"        \"\u002Fpost\u002F\" + obj.fileInfo.name.replace(\u002F^\\d{4}-\\d{2}-\\d{2}[_\\-]\u002F, \"\")\n",[199,738,739],{"class":201,"line":261},[199,740,741],{},"      );\n",[199,743,744],{"class":201,"line":267},[199,745,494],{},[199,747,748],{"class":201,"line":273},[199,749,750],{},"    BlogPage: \"\u002Fpages\u002F:fileInfo__name\",\n",[199,752,753],{"class":201,"line":279},[199,754,755],{},"    Tag: \"\u002Ftag\u002F:id\",\n",[199,757,758],{"class":201,"line":284},[199,759,760],{},"    Category: \"\u002Fcategory\u002F:title\",\n",[199,762,763],{"class":201,"line":289},[199,764,765],{},"  },\n",[12,767,768,769,771,772,774],{},"On définit les différentes chemins d'accès pour nos billets, nos pages, nos ",[166,770,508],{},",\net nos ",[166,773,512],{},". Comme je ne souhaite pas changer les adresses de mes billets sur mon site,\nj'ai défini les adresses sur les mêmes chemins que mon blog sous Pelican.",[12,776,777],{},"Comme les noms des fichiers des billets portent la date et le nom du billet, pour retrouver\nle nom du chemin d'origine, je supprime la date pour la génération du chemin.",[191,779,781],{"className":389,"code":780,"language":391,"meta":60,"style":60},"  transformers: {\n    remark: {\n      plugins: [\n        [\"@gridsome\u002Fremark-prismjs\", { showLineNumbers: true }],\n        \"remark-inline-links\",\n        [\"remark-toc\", { heading: \"sommaire\" }],\n        \"remark-attr\",\n      ],\n      config: {\n        footnotes: true,\n      },\n    },\n  },\n",[166,782,783,788,793,798,803,808,813,818,823,828,833,837,841],{"__ignoreMap":60},[199,784,785],{"class":201,"line":202},[199,786,787],{},"  transformers: {\n",[199,789,790],{"class":201,"line":208},[199,791,792],{},"    remark: {\n",[199,794,795],{"class":201,"line":214},[199,796,797],{},"      plugins: [\n",[199,799,800],{"class":201,"line":221},[199,801,802],{},"        [\"@gridsome\u002Fremark-prismjs\", { showLineNumbers: true }],\n",[199,804,805],{"class":201,"line":255},[199,806,807],{},"        \"remark-inline-links\",\n",[199,809,810],{"class":201,"line":261},[199,811,812],{},"        [\"remark-toc\", { heading: \"sommaire\" }],\n",[199,814,815],{"class":201,"line":267},[199,816,817],{},"        \"remark-attr\",\n",[199,819,820],{"class":201,"line":273},[199,821,822],{},"      ],\n",[199,824,825],{"class":201,"line":279},[199,826,827],{},"      config: {\n",[199,829,830],{"class":201,"line":284},[199,831,832],{},"        footnotes: true,\n",[199,834,835],{"class":201,"line":289},[199,836,488],{},[199,838,839],{"class":201,"line":451},[199,840,494],{},[199,842,843],{"class":201,"line":457},[199,844,765],{},[12,846,847],{},"Enfin, je définis les différents plugins dont j'ai besoin pour que mes différents billets\nfonctionnent correctement.",[191,849,851],{"className":389,"code":850,"language":391,"meta":60,"style":60},"  permalinks: {\n    trailingSlash: \"false\",\n    slugify: {\n      use: \"@sindresorhus\u002Fslugify\",\n      options: {\n        decamelize: false,\n      },\n    },\n  },\n  css: {\n    loaderOptions: {\n      less: {\n        \u002F\u002F options here will be passed to less-loader\n      },\n    },\n  },\n};\n",[166,852,853,858,863,868,873,877,882,886,890,894,899,904,909,914,918,922,926],{"__ignoreMap":60},[199,854,855],{"class":201,"line":202},[199,856,857],{},"  permalinks: {\n",[199,859,860],{"class":201,"line":208},[199,861,862],{},"    trailingSlash: \"false\",\n",[199,864,865],{"class":201,"line":214},[199,866,867],{},"    slugify: {\n",[199,869,870],{"class":201,"line":221},[199,871,872],{},"      use: \"@sindresorhus\u002Fslugify\",\n",[199,874,875],{"class":201,"line":255},[199,876,413],{},[199,878,879],{"class":201,"line":261},[199,880,881],{},"        decamelize: false,\n",[199,883,884],{"class":201,"line":267},[199,885,488],{},[199,887,888],{"class":201,"line":273},[199,889,494],{},[199,891,892],{"class":201,"line":279},[199,893,765],{},[199,895,896],{"class":201,"line":284},[199,897,898],{},"  css: {\n",[199,900,901],{"class":201,"line":289},[199,902,903],{},"    loaderOptions: {\n",[199,905,906],{"class":201,"line":451},[199,907,908],{},"      less: {\n",[199,910,911],{"class":201,"line":457},[199,912,913],{},"        \u002F\u002F options here will be passed to less-loader\n",[199,915,916],{"class":201,"line":463},[199,917,488],{},[199,919,920],{"class":201,"line":469},[199,921,494],{},[199,923,924],{"class":201,"line":474},[199,925,765],{},[199,927,928],{"class":201,"line":479},[199,929,930],{},"};\n",[12,932,933],{},"Je termine par modifier la manière dont Gridsome transforme les adresses, toujours pour\nque les chemins de mon blog ne changent pas.",[73,935,937],{"id":936},"développement-des-pages","Développement des pages",[12,939,940],{},"Viens ensuite l'écriture des différentes pages, composants et layout pour définir notre thème.\nLe plus compliqué, c'est que le résumé (excerpt) fourni par Gridsome supprime le rendu HTML et\nles retours chariots.",[12,942,943],{},"Je voulais que sur la page principale de mon application, je puisse générer un résumé de chaque\nbillet avec le texte et le rendu original du billet.",[12,945,946],{},"Pour cela malheureusement Gridsome ne fournit pas une manière simple de générer un résumé. Je vais\nvous présenter mon implémentation afin d'avoir un résumé au format Markdown.",[12,948,949],{},"Ma première version a été de créer à partir de contenu HTML le résumé dans un composant vue dédié.\nLors de la génération des pages statiques, le résultat était comme attendu. Par contre lors du\nchangement des pages (en mode SPA), le billet intégral du blog est chargé, pour être tronqué dynamiquement. Ce\nqui est long et pas performant quand cela arrive sur 10 billets à la suite. J'ai donc modifié le système pour\ngénérer les pages côté serveur.",[12,951,952,953,956,957,959],{},"Pour cela j'ai donc modifié le fichier ",[166,954,955],{},"gridsome.server.js",". Le problème, c'est que Gridsome ne permet\npas d'appeler un transformer (remark) directement, et ne permet pas de convertir un text en markdown (autrement\nqu'en passant par le plugin ",[166,958,500],{},").",[12,961,962],{},"J'ai donc dû implémenter l'appel à remark (et les différents plugins) directement dans la partie\nserveur manuellement.",[12,964,965,966,969],{},"Une fois le fichier HTML obtenu, j'appelle une librairie dédiée ",[166,967,968],{},"truncatise"," afin de réduire le contenu\nà quelques paragraphes (4).",[191,971,973],{"className":389,"code":972,"language":391,"meta":60,"style":60},"const truncatise = require(\"truncatise\");\n\nconst remark = require(\"remark\");\nconst html = require(\"remark-html\");\n\nconst remarkPrism = require(\"@gridsome\u002Fremark-prismjs\");\nconst remarkInlineLinks = require(\"remark-inline-links\");\nconst remarkToc = require(\"remark-toc\");\nconst remarkAttr = require(\"remark-attr\");\nconst remarkFN = require(\"remark-footnotes\");\n\nmodule.exports = function(api) {\n  api.loadSource(({ addSchemaResolvers }) => {\n    addSchemaResolvers({\n      Post: {\n        excerpt: {\n          type: \"String\",\n          async resolve(obj) {\n            return new Promise((resolve, reject) => {\n              remark()\n                \u002F\u002F Appel des différents plugins utilisé coté config.\n                .use(remarkPrism)\n                .use(remarkInlineLinks)\n                .use(remarkToc, { heading: \"sommaire\" })\n                .use(remarkAttr)\n                .use(remarkFN)\n                \u002F\u002F Génération HTML\n                .use(html)\n                .process(obj.content, function(err, file) {\n                  if (err) {\n                    return reject(err);\n                  }\n\n                  \u002F\u002F On tronque en ne gardant que les 4 premiers paragraphes\n                  resolve(\n                    truncatise(String(file), {\n                      TruncateLength: 4,\n                      TruncateBy: \"paragraphs\",\n                      Strict: false,\n                      StripHTML: false,\n                      Suffix: \" ...\",\n                    })\n                  );\n                });\n            });\n          },\n        },\n      },\n    });\n  });\n};\n",[166,974,975,980,984,989,994,998,1003,1008,1013,1018,1023,1027,1032,1037,1042,1047,1052,1057,1062,1067,1073,1079,1085,1091,1097,1103,1109,1115,1121,1127,1133,1139,1145,1150,1156,1162,1168,1174,1180,1186,1192,1198,1204,1210,1216,1222,1227,1232,1237,1243,1249],{"__ignoreMap":60},[199,976,977],{"class":201,"line":202},[199,978,979],{},"const truncatise = require(\"truncatise\");\n",[199,981,982],{"class":201,"line":208},[199,983,218],{"emptyLinePlaceholder":217},[199,985,986],{"class":201,"line":214},[199,987,988],{},"const remark = require(\"remark\");\n",[199,990,991],{"class":201,"line":221},[199,992,993],{},"const html = require(\"remark-html\");\n",[199,995,996],{"class":201,"line":255},[199,997,218],{"emptyLinePlaceholder":217},[199,999,1000],{"class":201,"line":261},[199,1001,1002],{},"const remarkPrism = require(\"@gridsome\u002Fremark-prismjs\");\n",[199,1004,1005],{"class":201,"line":267},[199,1006,1007],{},"const remarkInlineLinks = require(\"remark-inline-links\");\n",[199,1009,1010],{"class":201,"line":273},[199,1011,1012],{},"const remarkToc = require(\"remark-toc\");\n",[199,1014,1015],{"class":201,"line":279},[199,1016,1017],{},"const remarkAttr = require(\"remark-attr\");\n",[199,1019,1020],{"class":201,"line":284},[199,1021,1022],{},"const remarkFN = require(\"remark-footnotes\");\n",[199,1024,1025],{"class":201,"line":289},[199,1026,218],{"emptyLinePlaceholder":217},[199,1028,1029],{"class":201,"line":451},[199,1030,1031],{},"module.exports = function(api) {\n",[199,1033,1034],{"class":201,"line":457},[199,1035,1036],{},"  api.loadSource(({ addSchemaResolvers }) => {\n",[199,1038,1039],{"class":201,"line":463},[199,1040,1041],{},"    addSchemaResolvers({\n",[199,1043,1044],{"class":201,"line":469},[199,1045,1046],{},"      Post: {\n",[199,1048,1049],{"class":201,"line":474},[199,1050,1051],{},"        excerpt: {\n",[199,1053,1054],{"class":201,"line":479},[199,1055,1056],{},"          type: \"String\",\n",[199,1058,1059],{"class":201,"line":485},[199,1060,1061],{},"          async resolve(obj) {\n",[199,1063,1064],{"class":201,"line":491},[199,1065,1066],{},"            return new Promise((resolve, reject) => {\n",[199,1068,1070],{"class":201,"line":1069},20,[199,1071,1072],{},"              remark()\n",[199,1074,1076],{"class":201,"line":1075},21,[199,1077,1078],{},"                \u002F\u002F Appel des différents plugins utilisé coté config.\n",[199,1080,1082],{"class":201,"line":1081},22,[199,1083,1084],{},"                .use(remarkPrism)\n",[199,1086,1088],{"class":201,"line":1087},23,[199,1089,1090],{},"                .use(remarkInlineLinks)\n",[199,1092,1094],{"class":201,"line":1093},24,[199,1095,1096],{},"                .use(remarkToc, { heading: \"sommaire\" })\n",[199,1098,1100],{"class":201,"line":1099},25,[199,1101,1102],{},"                .use(remarkAttr)\n",[199,1104,1106],{"class":201,"line":1105},26,[199,1107,1108],{},"                .use(remarkFN)\n",[199,1110,1112],{"class":201,"line":1111},27,[199,1113,1114],{},"                \u002F\u002F Génération HTML\n",[199,1116,1118],{"class":201,"line":1117},28,[199,1119,1120],{},"                .use(html)\n",[199,1122,1124],{"class":201,"line":1123},29,[199,1125,1126],{},"                .process(obj.content, function(err, file) {\n",[199,1128,1130],{"class":201,"line":1129},30,[199,1131,1132],{},"                  if (err) {\n",[199,1134,1136],{"class":201,"line":1135},31,[199,1137,1138],{},"                    return reject(err);\n",[199,1140,1142],{"class":201,"line":1141},32,[199,1143,1144],{},"                  }\n",[199,1146,1148],{"class":201,"line":1147},33,[199,1149,218],{"emptyLinePlaceholder":217},[199,1151,1153],{"class":201,"line":1152},34,[199,1154,1155],{},"                  \u002F\u002F On tronque en ne gardant que les 4 premiers paragraphes\n",[199,1157,1159],{"class":201,"line":1158},35,[199,1160,1161],{},"                  resolve(\n",[199,1163,1165],{"class":201,"line":1164},36,[199,1166,1167],{},"                    truncatise(String(file), {\n",[199,1169,1171],{"class":201,"line":1170},37,[199,1172,1173],{},"                      TruncateLength: 4,\n",[199,1175,1177],{"class":201,"line":1176},38,[199,1178,1179],{},"                      TruncateBy: \"paragraphs\",\n",[199,1181,1183],{"class":201,"line":1182},39,[199,1184,1185],{},"                      Strict: false,\n",[199,1187,1189],{"class":201,"line":1188},40,[199,1190,1191],{},"                      StripHTML: false,\n",[199,1193,1195],{"class":201,"line":1194},41,[199,1196,1197],{},"                      Suffix: \" ...\",\n",[199,1199,1201],{"class":201,"line":1200},42,[199,1202,1203],{},"                    })\n",[199,1205,1207],{"class":201,"line":1206},43,[199,1208,1209],{},"                  );\n",[199,1211,1213],{"class":201,"line":1212},44,[199,1214,1215],{},"                });\n",[199,1217,1219],{"class":201,"line":1218},45,[199,1220,1221],{},"            });\n",[199,1223,1225],{"class":201,"line":1224},46,[199,1226,454],{},[199,1228,1230],{"class":201,"line":1229},47,[199,1231,482],{},[199,1233,1235],{"class":201,"line":1234},48,[199,1236,488],{},[199,1238,1240],{"class":201,"line":1239},49,[199,1241,1242],{},"    });\n",[199,1244,1246],{"class":201,"line":1245},50,[199,1247,1248],{},"  });\n",[199,1250,1252],{"class":201,"line":1251},51,[199,1253,930],{},[12,1255,1256,1257,1259,1260,959],{},"C'est ainsi que j'ai converti mon blog vers le framework ",[166,1258,41],{},". Je vous passe tous les\ndétails (vu que le thème est disponible sur Github sur ",[16,1261,383],{"href":381,"rel":1262},[25],[73,1264,1266],{"id":1265},"ajout-dun-système-de-commentaire","Ajout d'un système de commentaire",[12,1268,1269],{},"Ce qu'il manquait sur mon blog précédent c'était un système de commentaires. J'ai donc ajouté\nce système de commentaires à mon blog.",[12,1271,1272],{},"Je ne souhaitais pas ajouter n'importe quel système de commentaires. J'ai donc regardé\nce que je pouvais ajouter sur un site statique. On va retrouver les systèmes de commentaires\nnon libres, et faciles à implémenter (et pas forcément très compatible RGPD).",[84,1274,1275,1278,1281],{},[87,1276,1277],{},"Disqus",[87,1279,1280],{},"Facebook comments",[87,1282,1283],{},"...",[12,1285,1286],{},"De mon coté je me suis dirigé vers les systèmes de commentaires libres:",[84,1288,1289,1296,1303,1310],{},[87,1290,1291],{},[16,1292,1295],{"href":1293,"rel":1294},"https:\u002F\u002Fvssue.js.org\u002F",[25],"Vssue",[87,1297,1298],{},[16,1299,1302],{"href":1300,"rel":1301},"https:\u002F\u002Fgithub.com\u002Fimsun\u002Fgitment",[25],"Gitment",[87,1304,1305],{},[16,1306,1309],{"href":1307,"rel":1308},"https:\u002F\u002Futteranc.es\u002F",[25],"Utterances",[87,1311,1312],{},[16,1313,1316],{"href":1314,"rel":1315},"https:\u002F\u002Fgithub.com\u002Fumputun\u002Fremark42",[25],"Remark42",[12,1318,1319],{},"Remark42 nécessite l'installation d'un programme sur mon serveur. Je l'ai testé mais j'ai été à quelques\nproblème lors de l'intégration avec Gridsome.",[12,1321,1322],{},"Vssue, Gitment et Utterances sont intéressants car ils permettent d'ajouter un système de commentaires\nse basant sur le système de ticketing de Github. Github n'est en lui même pas OpenSource mais les frameworks\nci-dessus le sont.",[12,1324,1325],{},"Je considère que la plupart des personnes lisant mon blog ont un compte Github. Mais n'hésitez pas à commenter\nsi ce n'est pas le cas ;).",[12,1327,1328,1329,42],{},"Vssue était mon système préféré, beau, simple compatible avec Gitea (que j'utilise pour mes sources), Gitlab,\net avec Github également. Mais dû aux limitations de Github et Gitea, il m'était nécessaire de fournir mon\n",[16,1330,1333],{"href":1331,"rel":1332},"https:\u002F\u002Fvssue.js.org\u002Fguide\u002Fgithub.html",[25],"ClientSecret OAuth2",[12,1335,1336,1337,1342],{},"Je n'ai pas apprécié cette idée mais j'ai tout de même voulu tester. Là je me suis rendu compte qu'il\ny avait des problèmes CORS. Le composant passe par ",[16,1338,1341],{"href":1339,"rel":1340},"https:\u002F\u002Fgithub.com\u002FRob--W\u002Fcors-anywhere",[25],"CORS Anywhere"," mais\nce dernier ne peut être utilisé que pour le développement. Ce qui signifie que je dois installer un proxy équivalent\nsur mon serveur. J'ai donc regardé pour autre chose.",[12,1344,1345,1346,1351],{},"J'ai alors testé Utterances. Le problème est que cette librairie n'est pas compatible avec les\napplications de type SPA. On peut voir d'ailleurs quelques commentaires sur le ticket ",[16,1347,1350],{"href":1348,"rel":1349},"https:\u002F\u002Fgithub.com\u002Futterance\u002Futterances\u002Fissues\u002F231",[25],"Github #231","\nde personnes ayant tenté de faire une version du client pour Vue.Js.",[12,1353,1354,1355,959],{},"Je me suis donc inspiré d'un composant Vue.JS écrit par quelqu'un d'autre (dans le 1er commentaire) pour inclure\nce système sur mon site.\nCe composant a dû être légèrement adapté pour fonctionner (je vous invite à regarder\n",[16,1356,1359],{"href":1357,"rel":1358},"https:\u002F\u002Fgithub.com\u002Fphoenix741\u002Fgridsome-flex-markdown-starter\u002Fblob\u002Fmain\u002Fsrc\u002Fcomponents\u002FGithubComponent.vue",[25],"GithubComponent.vue",[12,1361,1362],{},"Comme le plugin utilise directement l'objet window, il ne peut fonctionner avec le mode SSR (Server Side Rendering) de\nVue.Js. J'ai dû donc désactiver le mode commentaires pour le côté SSR (la génération). Ce n'est pas déconnant car\nde toutes façon les commentaires sont gérés sur Github.",[12,1364,1365,1366,1369,1370,42],{},"Voici comment on fait avec Gridsome. On commence par encadrer le bloc qui ne doit pas faire partie de la génération\ncôté serveur (et qui est donc ",[166,1367,1368],{},"Client Only","). Ce bloc contient notre composant ",[166,1371,1372],{},"GithubComponent",[191,1374,1378],{"className":1375,"code":1376,"language":1377,"meta":60,"style":60},"language-html shiki shiki-themes one-dark-pro","\u003Carticle>\n  ...\n  \u003CClientOnly>\n    \u003Cdiv class=\"commentswrap\">\n      \u003Cdiv id=\"comments\">\n        \u003CGithubComponent\n          :title=\"$page.post.title\"\n          :repo=\"$page.metadata.utterances.repo\"\n          :pathname=\"this.$route.path\"\n          :url=\"url\"\n          :issueTerm=\"$page.metadata.utterances.issueTerm\"\n          :label=\"$page.metadata.utterances.label\"\n        >\u003C\u002FGithubComponent>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002FClientOnly>\n\u003C\u002Farticle>\n","html",[166,1379,1380,1393,1398,1408,1429,1446,1454,1464,1474,1484,1494,1504,1514,1523,1532,1541,1550],{"__ignoreMap":60},[199,1381,1382,1386,1390],{"class":201,"line":202},[199,1383,1385],{"class":1384},"sn6KH","\u003C",[199,1387,1389],{"class":1388},"sVyAn","article",[199,1391,1392],{"class":1384},">\n",[199,1394,1395],{"class":201,"line":208},[199,1396,1397],{"class":1384},"  ...\n",[199,1399,1400,1403,1406],{"class":201,"line":214},[199,1401,1402],{"class":1384},"  \u003C",[199,1404,1405],{"class":1388},"ClientOnly",[199,1407,1392],{"class":1384},[199,1409,1410,1413,1416,1420,1423,1427],{"class":201,"line":221},[199,1411,1412],{"class":1384},"    \u003C",[199,1414,1415],{"class":1388},"div",[199,1417,1419],{"class":1418},"sVC51"," class",[199,1421,1422],{"class":1384},"=",[199,1424,1426],{"class":1425},"subq3","\"commentswrap\"",[199,1428,1392],{"class":1384},[199,1430,1431,1434,1436,1439,1441,1444],{"class":201,"line":255},[199,1432,1433],{"class":1384},"      \u003C",[199,1435,1415],{"class":1388},[199,1437,1438],{"class":1418}," id",[199,1440,1422],{"class":1384},[199,1442,1443],{"class":1425},"\"comments\"",[199,1445,1392],{"class":1384},[199,1447,1448,1451],{"class":201,"line":261},[199,1449,1450],{"class":1384},"        \u003C",[199,1452,1453],{"class":1388},"GithubComponent\n",[199,1455,1456,1459,1461],{"class":201,"line":267},[199,1457,1458],{"class":1418},"          :title",[199,1460,1422],{"class":1384},[199,1462,1463],{"class":1425},"\"$page.post.title\"\n",[199,1465,1466,1469,1471],{"class":201,"line":273},[199,1467,1468],{"class":1418},"          :repo",[199,1470,1422],{"class":1384},[199,1472,1473],{"class":1425},"\"$page.metadata.utterances.repo\"\n",[199,1475,1476,1479,1481],{"class":201,"line":279},[199,1477,1478],{"class":1418},"          :pathname",[199,1480,1422],{"class":1384},[199,1482,1483],{"class":1425},"\"this.$route.path\"\n",[199,1485,1486,1489,1491],{"class":201,"line":284},[199,1487,1488],{"class":1418},"          :url",[199,1490,1422],{"class":1384},[199,1492,1493],{"class":1425},"\"url\"\n",[199,1495,1496,1499,1501],{"class":201,"line":289},[199,1497,1498],{"class":1418},"          :issueTerm",[199,1500,1422],{"class":1384},[199,1502,1503],{"class":1425},"\"$page.metadata.utterances.issueTerm\"\n",[199,1505,1506,1509,1511],{"class":201,"line":451},[199,1507,1508],{"class":1418},"          :label",[199,1510,1422],{"class":1384},[199,1512,1513],{"class":1425},"\"$page.metadata.utterances.label\"\n",[199,1515,1516,1519,1521],{"class":201,"line":457},[199,1517,1518],{"class":1384},"        >\u003C\u002F",[199,1520,1372],{"class":1388},[199,1522,1392],{"class":1384},[199,1524,1525,1528,1530],{"class":201,"line":463},[199,1526,1527],{"class":1384},"      \u003C\u002F",[199,1529,1415],{"class":1388},[199,1531,1392],{"class":1384},[199,1533,1534,1537,1539],{"class":201,"line":469},[199,1535,1536],{"class":1384},"    \u003C\u002F",[199,1538,1415],{"class":1388},[199,1540,1392],{"class":1384},[199,1542,1543,1546,1548],{"class":201,"line":474},[199,1544,1545],{"class":1384},"  \u003C\u002F",[199,1547,1405],{"class":1388},[199,1549,1392],{"class":1384},[199,1551,1552,1555,1557],{"class":201,"line":479},[199,1553,1554],{"class":1384},"\u003C\u002F",[199,1556,1389],{"class":1388},[199,1558,1392],{"class":1384},[12,1560,1561],{},"Enfin on charge le composant dynamiquement dans la partie Javascript.",[191,1563,1565],{"className":389,"code":1564,"language":391,"meta":60,"style":60},"export default {\n  components: {\n    PostHeaderTitle,\n    GithubComponent: () =>\n      import(\"..\u002Fcomponents\u002FGithubComponent\")\n        .then((m) => m.default)\n        .catch(),\n  },\n  ...\n}\n",[166,1566,1567,1572,1577,1582,1587,1592,1597,1602,1606,1610],{"__ignoreMap":60},[199,1568,1569],{"class":201,"line":202},[199,1570,1571],{},"export default {\n",[199,1573,1574],{"class":201,"line":208},[199,1575,1576],{},"  components: {\n",[199,1578,1579],{"class":201,"line":214},[199,1580,1581],{},"    PostHeaderTitle,\n",[199,1583,1584],{"class":201,"line":221},[199,1585,1586],{},"    GithubComponent: () =>\n",[199,1588,1589],{"class":201,"line":255},[199,1590,1591],{},"      import(\"..\u002Fcomponents\u002FGithubComponent\")\n",[199,1593,1594],{"class":201,"line":261},[199,1595,1596],{},"        .then((m) => m.default)\n",[199,1598,1599],{"class":201,"line":267},[199,1600,1601],{},"        .catch(),\n",[199,1603,1604],{"class":201,"line":273},[199,1605,765],{},[199,1607,1608],{"class":201,"line":279},[199,1609,1397],{},[199,1611,1612],{"class":201,"line":284},[199,1613,1614],{},"}\n",[12,1616,1617],{},"Ces deux opérations permettent d'exclure cette partie lors de la génération des pages statique, mais de\nl'ajouter dynamiquement après le chargement de la page coté client.",[73,1619,1621],{"id":1620},"conclusion","Conclusion",[12,1623,1624],{},"Voici donc comment j'ai mis en place la version Vue.JS de mon blog. N'hésitez pas à m'envoyer un mail\nou lâcher un commentaire.",[12,1626,1627,1628,1631,1632,42],{},"Vous pouvez retrouver le kit de démarrage que j'ai fait pour mon blog sur github: ",[16,1629,383],{"href":381,"rel":1630},[25],". Vous pouvez également consulter l'intégration d'utterances sur un site\nen vue ici: ",[16,1633,1635],{"href":1357,"rel":1634},[25],"phoenix741\u002Fgridsome-flex-markdown-starter:GithubComponent.vue",[1637,1638,1641,1646],"section",{"className":1639,"dataFootnotes":60},[1640],"footnotes",[73,1642,1645],{"className":1643,"id":59},[1644],"sr-only","Footnotes",[1647,1648,1649],"ol",{},[87,1650,1652,1653],{"id":1651},"user-content-fn-1","Single Page Application ",[16,1654,1659],{"href":1655,"ariaLabel":1656,"className":1657,"dataFootnoteBackref":60},"#user-content-fnref-1","Back to reference 1",[1658],"data-footnote-backref","↩",[1661,1662,1663],"style",{},"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 .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}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}",{"title":60,"searchDepth":208,"depth":208,"links":1665},[1666,1667,1668,1669,1670,1671,1672],{"id":75,"depth":208,"text":76},{"id":118,"depth":208,"text":119},{"id":367,"depth":208,"text":368},{"id":936,"depth":208,"text":937},{"id":1265,"depth":208,"text":1266},{"id":1620,"depth":208,"text":1621},{"id":59,"depth":208,"text":1645},"Logiciels","logiciels","2021-03-02","J'avais migré en Janvier 2013 mon blog vers Pelican en venant de\nDotclear. Pelican est un générateur de site statique en Python. J'avais\nalors dû faire l'impasse sur les commentaires mais au bénéfice d'un site performant et avec une\nsurface d'attaque plus faible.",{"type":9,"value":1678},[1679,1686,1694,1696],[12,1680,14,1681,20,1683,27],{},[16,1682,19],{"href":18},[16,1684,26],{"href":23,"rel":1685},[25],[12,1687,30,1688,36,1691,42],{},[16,1689,35],{"href":33,"rel":1690},[25],[16,1692,41],{"href":39,"rel":1693},[25],[12,1695,45],{},[12,1697,48],{},"Lille, France",{"planet":217},"\u002Fpost\u002Fgridsome-mise-a-jour-du-blog",{"title":6,"description":1676},"gridsome-mise-a-jour-du-blog","posts\u002FLogiciels\u002F2021-03-02-gridsome-mise-a-jour-du-blog",[1705,1706],"dedie","javascript","92imksbvFvyNB9g-BgsuOp-f1qDd_PCUcic_SG3Gf2o",{"id":1709,"title":1710,"author":7,"body":1711,"category":1673,"categorySlug":1674,"date":3248,"description":60,"excerpt":3249,"extension":195,"location":1698,"meta":3267,"navigation":217,"path":3268,"published":217,"seo":3269,"slug":3270,"stem":3271,"tags":3272,"timeToRead":457,"__hash__":3276},"posts\u002Fposts\u002FLogiciels\u002F2014-03-19-monlivretdemesse-fr.md","Mon livret de messe - Site de génération de livrets au format PDF",{"type":9,"value":1712,"toc":3228},[1713,1718,1721,1730,1738,1741,1780,1795,1799,1802,1805,1808,1816,1819,1822,1825,1828,1831,1834,1842,1845,1856,1859,1868,1872,1878,1882,1885,1896,1899,1902,1905,1908,1916,1919,2166,2169,2638,2641,2647,2651,2654,2657,2661,2664,2667,2671,2678,2682,2692,2696,2699,2703,2715,2718,2722,2725,2728,2732,2739,2742,2855,2858,2861,2869,2872,2876,2882,2885,2888,2899,2903,2906,2913,2916,2930,2934,2941,2949,2957,2960,2964,2970,2973,2976,3055,3058,3061,3064,3142,3145,3216,3219,3222,3225],[1714,1715,1717],"h3",{"id":1716},"mon-livret-de-messe-générateur-de-pdf","Mon livret de messe - Générateur de PDF",[12,1719,1720],{},"Bonjour,",[12,1722,1723,1724,1729],{},"Ce petit billet pour vous parler d'un site que j'ai développé pour ma femme et dont l'adresse est\n",[16,1725,1728],{"href":1726,"rel":1727},"http:\u002F\u002Fmonlivretdemesse.fr\u002F",[25],"http:\u002F\u002Fmonlivretdemesse.fr",". Ce projet que je développe depuis\nplusieurs années, a été mis à jours récément. Je profite de cette mise à jours pour vous parler de\nce projet fonctionnellement mais aussi techniquement.",[12,1731,1732,1737],{},[16,1733,1736],{"href":1734,"rel":1735},"http:\u002F\u002Fmonlivretdemessse.fr",[25],"Monlivretdemesse.FR"," est un site permettant aux utilisateurs allant\nse marier de générer leur livret de messe au format PDF afin de l'imprimer directement chez eux.\nLes pages du livret ainsi générées sont alors ordonnées de telle manière qu'il suffit de faire une\nimpression recto\u002Fverso puis de plier les feuilles pour avoir son livret. Je me suis chargé\ndu développement de ce site, pendant que ma femme se charge du contenu (donc le contenu des textes,\ndes images, mais aussi et surtout le thème de chaque produit, leur format).",[12,1739,1740],{},"La nouvelle version sortie le 11 mars 2014 permet également la création d'autres types de produits\nafin de générer des",[84,1742,1743,1750,1763,1770,1777],{},[87,1744,1745],{},[16,1746,1749],{"href":1747,"rel":1748},"http:\u002F\u002Fmonlivretdemesse.fr\u002Ffr\u002Fcategory\u002Fbapteme",[25],"livrets de messe de baptêmes",[87,1751,1752,1757,1758],{},[16,1753,1756],{"href":1754,"rel":1755},"http:\u002F\u002Fmonlivretdemesse.fr\u002Ffr\u002Fcategory\u002Ffaire-part-mariage",[25],"faire-parts de mariage",",\n",[16,1759,1762],{"href":1760,"rel":1761},"http:\u002F\u002Fmonlivretdemesse.fr\u002Ffr\u002Fcategory\u002Ffaire-part-bapteme",[25],"de baptêmes",[87,1764,1765],{},[16,1766,1769],{"href":1767,"rel":1768},"http:\u002F\u002Fmonlivretdemesse.fr\u002Ffr\u002Fcategory\u002Fmenus-mariage",[25],"menus pour la soirée",[87,1771,1772],{},[16,1773,1776],{"href":1774,"rel":1775},"http:\u002F\u002Fmonlivretdemesse.fr\u002Ffr\u002Fcategory\u002Fmarque-places",[25],"des marques places",[87,1778,1779],{},"et bien d'autres...",[12,1781,1782,1783,1788,1789,1794],{},"Le site a été écrit à l'aide du framework Symfony2 et utilise la bibliothèque\n",[16,1784,1787],{"href":1785,"rel":1786},"http:\u002F\u002Fwww.tcpdf.org\u002F",[25],"TCPDF"," afin de générer les fichiers PDF. Les données sont stockées dans une\nbase de données ",[16,1790,1793],{"href":1791,"rel":1792},"http:\u002F\u002Fwww.mongodb.org\u002F",[25],"MongoDB",". Parmi les données on peut compter les données\nproduits, utilisateurs, mais aussi le cache des PDF générés enregistrés en tant que fichier dans\nGridFS (et ceci afin qu'un livret qui n'a pas été modifié ne soit pas re-généré).",[1714,1796,1798],{"id":1797},"symfony2","Symfony2",[12,1800,1801],{},"Symfony 2 est un framework PHP permettant le développement de sites Internet. Il est livré par\ndéfaut avec un ORM: Doctrine qui permet de faire correspondre à une structure de base de données des\nclasses PHP qui seront automatiquement hydratées.",[12,1803,1804],{},"Le développement PHP s'en retrouve presque agréable (je préfère les langages compilés en règle\ngénérale). Le framework est de la même trempe que le Framework Python Django.",[12,1806,1807],{},"Ce dernier m'a d'ailleurs tenté (bien qu'interpreté aussi), mais une lecture rapide de la\ndocumentation m'a donné l'impression d'être un peu moins pratique à utiliser que Symfony2. Peut-être\ncar je ne fais pas de Python.",[12,1809,1810,1811,1815],{},"Pour mon prochain projet j'étudierai l'utilisation de symfony2 vs ruby on rails vs django vs\nnode.js. Mais je ne suis pas sûr qu'au final l'utilisation d'une des technos précédentes m'apporte\nbeaucoup plus par rapport à ce que sait déjà faire un framework comme symfony2. L'avantage d'un tel\nframework réside aussi dans le nombre de ",[1812,1813,1814],"em",{},"bundle"," et de librairie utilisables à l'extérieur.",[12,1817,1818],{},"Par rapport à la distribution de base de symfony2 j'ai remplacé la version Doctrine ORM par Doctrine\nODM. Ce qui me permet de me connecter à une base de données MongoDB.",[1714,1820,1793],{"id":1821},"mongodb",[12,1823,1824],{},"Mon projet d'abord basé sur une base MySQL a été basculé sur une base de données NoSQL nommée\nMongoDB.",[12,1826,1827],{},"La raison n'est pas technique (je n'ai pas besoin de replication, de sharding, ...., pas assez de\nvisiteurs). J'avais juste envie de tester cette base de données sur mon projet. De plus l'aspect\norienté document est agréable au développement.",[12,1829,1830],{},"En effet, au lieu de stocker les informations dans différentes tables et de tenter d'y accéder à\nl'aide de jointure ou de requête multiple, dans on MongoDB on stocke un document dans un format\nbinaire du JSON (le BSON).",[12,1832,1833],{},"Un panier stocké en base pourra avoir la forme :",[191,1835,1840],{"className":1836,"code":1838,"language":1839},[1837],"language-text","{\n  \"_id\": ObjectId(\"......................\"),\n  \"expiration_updated_at\": ISODate(\"2014-03-17T21:00:34.0Z\"),\n  \"lines\": [\n    {\n      \"product\": {\n        \"product\": \"marque-place-baroque-dore\",\n        \"product_name\": \"Marque-place baroque doré\",\n        \"variant\": \"dore-gris\",\n        \"variant_name\": \"Doré\\\u002FGris\",\n        \"amount\": 7.9\n      },\n      \"custom\": ObjectId(\"....................\")\n    }\n  ],\n  \"lines_count\": NumberInt(1)\n}\n","text",[166,1841,1838],{"__ignoreMap":60},[12,1843,1844],{},"On retrouve dans un seul document les informations liées au panier et les informations concernant\nchaque ligne. La dénormalisation n'étant pas un problème, on rappelera alors ici le nom du produit,\net le nombre de lignes que l'on pourrait retrouver autrement mais qui permettra un affichage plus\nrapide de cette manière.",[12,1846,1847,1848,1851,1852,1855],{},"Par exemple, sur la page d'acceuil où on affiche le nombre de produit dans le panier, il nous\nsuffira de requêter ",[1812,1849,1850],{},"lines_count"," sans toucher à l'attribute ",[1812,1853,1854],{},"lines",". Ensuite lors de l'affichage\ndu panier, on récupérera les lignes et les informations du panier en une seule requête et sans\njointure.",[12,1857,1858],{},"Ainsi pour des entités avec forte relation, qu'on ne récupère jamais les unes sans les autres, une\nseule requête permet de récupérer toutes les informations. Par exemple, dans une base relationnelle,\non aura l'habitude de stocker l'entête du panier dans une table, et les lignes dans une autre table.\nAvec Mongo, si je veux récupérer le panier en une requête, je récupère aussi les lignes. Cela\nimplique par contre de ne pouvoir requêter facilement sur les lignes du panier indépendamment de\nleur entête.",[12,1860,1861,1862,1867],{},"Le seul problème que j'ai actuellement avec l'ODM Doctrine est que la mise à jour du panier se fait\nen plusieurs requêtes alors qu'il serait préférable de le faire en une seule pour des questions\nd'atomicité. Ce point fait d'ailleurs l'objet du ticket\n",[16,1863,1866],{"href":1864,"rel":1865},"https:\u002F\u002Fgithub.com\u002Fdoctrine\u002Fmongodb-odm\u002Fissues\u002F437",[25],"437"," du Github du projet.",[1714,1869,1871],{"id":1870},"les-différents-modules-du-site","Les différents modules du site",[12,1873,1874,1875,1877],{},"Dans cette section je vais vous parler rapidement des différents ",[1812,1876,1814],{}," que j'ai créé pour le site.",[73,1879,1881],{"id":1880},"le-cms","Le CMS",[12,1883,1884],{},"Afin de faciliter l'édition des pages de contenu (Mention légales, Documentation, FAQ) sans toucher\nau code. J'ai écrit un mini CMS. Le but est de stocker dans la base de données les différentes pages\ndu projet, ainsi que les images associées aux pages.",[12,1886,1887,1888,1890,1891,1895],{},"Pour cela j'ai un ",[1812,1889,1814],{}," nommé CMS qui utilise la notion d'édition inline de CKEditor. J'ai écris\nmon propre ",[1892,1893,1894],"strong",{},"Explorer de media"," qui permet de récupérer et ajouter dans cette même base des\nfichiers à attacher aux différentes pages.",[12,1897,1898],{},"L'adresse de la page est alors décomposée pour récupérer la clé de la page. Une page dont l'adresse\nsera \u002Fpage\u002Fprout aura comme clé en base \u002Fprout. Pour un utilisateur non administrateur (ou anonyme),\nsi la page est trouvée, elle est affichée telle quelle et si elle n'est pas trouvée, une page 404\nest affichée.",[12,1900,1901],{},"En mode administrateur si la page existe, elle est ouverte en mode édition inline pour CKEditor. Si\nla page n'existe pas, elle est ouverte en mode création et en mode inline avec CKEditor. Il est\nainsi super facile pour un administrateur de créer de nouvelles pages.",[12,1903,1904],{},"La partie media permet d'ajouter dans un GridFS dedié les images, et fichiers attachés.",[12,1906,1907],{},"Le module est du coup assez simple, deux documents",[84,1909,1910,1913],{},[87,1911,1912],{},"Page",[87,1914,1915],{},"Media",[12,1917,1918],{},"Le document Page ressemble à ceci:",[191,1920,1924],{"className":1921,"code":1922,"language":1923,"meta":60,"style":60},"language-php shiki shiki-themes one-dark-pro","\u002F**\n  * Page\n  *\n  * @MongoDB\\Document(collection=\"cms_page\")\n  *\u002F\nclass Page {\n    \u002F**\n      * @var string\n      *\n      * @MongoDB\\Id(strategy=\"CUSTOM\", options={\"class\"=\"\\Shadoware\\CMSBundle\\Generator\\PageSlugGenerator\"})\n      *\u002F\n    private $slug;\n\n    \u002F**\n      * @var string\n      *\n      * @MongoDB\\String\n      *\u002F\n    private $name;\n\n    \u002F**\n      * @var string\n      *\n      * @MongoDB\\String\n      *\u002F\n    private $title;\n\n    \u002F**\n      * @var string\n      *\n      * @MongoDB\\String\n      *\u002F\n    private $content;\n\n    \u002F**\n      * @var string $lang\n      *\n      * @MongoDB\\String\n      *\u002F\n    private $lang;\n}\n","php",[166,1925,1926,1932,1937,1942,1947,1952,1965,1970,1983,1988,1993,1998,2009,2013,2017,2025,2029,2034,2038,2047,2051,2055,2063,2067,2071,2075,2084,2088,2092,2100,2104,2108,2112,2121,2125,2129,2141,2145,2149,2153,2162],{"__ignoreMap":60},[199,1927,1928],{"class":201,"line":202},[199,1929,1931],{"class":1930},"sV9Aq","\u002F**\n",[199,1933,1934],{"class":201,"line":208},[199,1935,1936],{"class":1930},"  * Page\n",[199,1938,1939],{"class":201,"line":214},[199,1940,1941],{"class":1930},"  *\n",[199,1943,1944],{"class":201,"line":221},[199,1945,1946],{"class":1930},"  * @MongoDB\\Document(collection=\"cms_page\")\n",[199,1948,1949],{"class":201,"line":255},[199,1950,1951],{"class":1930},"  *\u002F\n",[199,1953,1954,1958,1962],{"class":201,"line":261},[199,1955,1957],{"class":1956},"seHd6","class",[199,1959,1961],{"class":1960},"sU0A5"," Page",[199,1963,1964],{"class":1384}," {\n",[199,1966,1967],{"class":201,"line":267},[199,1968,1969],{"class":1930},"    \u002F**\n",[199,1971,1972,1975,1979],{"class":201,"line":273},[199,1973,1974],{"class":1930},"      * ",[199,1976,1978],{"class":1977},"shdRp","@var",[199,1980,1982],{"class":1981},"sKU4T"," string\n",[199,1984,1985],{"class":201,"line":279},[199,1986,1987],{"class":1930},"      *\n",[199,1989,1990],{"class":201,"line":284},[199,1991,1992],{"class":1930},"      * @MongoDB\\Id(strategy=\"CUSTOM\", options={\"class\"=\"\\Shadoware\\CMSBundle\\Generator\\PageSlugGenerator\"})\n",[199,1994,1995],{"class":201,"line":289},[199,1996,1997],{"class":1930},"      *\u002F\n",[199,1999,2000,2003,2006],{"class":201,"line":451},[199,2001,2002],{"class":1956},"    private",[199,2004,2005],{"class":1388}," $slug",[199,2007,2008],{"class":1384},";\n",[199,2010,2011],{"class":201,"line":457},[199,2012,218],{"emptyLinePlaceholder":217},[199,2014,2015],{"class":201,"line":463},[199,2016,1969],{"class":1930},[199,2018,2019,2021,2023],{"class":201,"line":469},[199,2020,1974],{"class":1930},[199,2022,1978],{"class":1977},[199,2024,1982],{"class":1981},[199,2026,2027],{"class":201,"line":474},[199,2028,1987],{"class":1930},[199,2030,2031],{"class":201,"line":479},[199,2032,2033],{"class":1930},"      * @MongoDB\\String\n",[199,2035,2036],{"class":201,"line":485},[199,2037,1997],{"class":1930},[199,2039,2040,2042,2045],{"class":201,"line":491},[199,2041,2002],{"class":1956},[199,2043,2044],{"class":1388}," $name",[199,2046,2008],{"class":1384},[199,2048,2049],{"class":201,"line":1069},[199,2050,218],{"emptyLinePlaceholder":217},[199,2052,2053],{"class":201,"line":1075},[199,2054,1969],{"class":1930},[199,2056,2057,2059,2061],{"class":201,"line":1081},[199,2058,1974],{"class":1930},[199,2060,1978],{"class":1977},[199,2062,1982],{"class":1981},[199,2064,2065],{"class":201,"line":1087},[199,2066,1987],{"class":1930},[199,2068,2069],{"class":201,"line":1093},[199,2070,2033],{"class":1930},[199,2072,2073],{"class":201,"line":1099},[199,2074,1997],{"class":1930},[199,2076,2077,2079,2082],{"class":201,"line":1105},[199,2078,2002],{"class":1956},[199,2080,2081],{"class":1388}," $title",[199,2083,2008],{"class":1384},[199,2085,2086],{"class":201,"line":1111},[199,2087,218],{"emptyLinePlaceholder":217},[199,2089,2090],{"class":201,"line":1117},[199,2091,1969],{"class":1930},[199,2093,2094,2096,2098],{"class":201,"line":1123},[199,2095,1974],{"class":1930},[199,2097,1978],{"class":1977},[199,2099,1982],{"class":1981},[199,2101,2102],{"class":201,"line":1129},[199,2103,1987],{"class":1930},[199,2105,2106],{"class":201,"line":1135},[199,2107,2033],{"class":1930},[199,2109,2110],{"class":201,"line":1141},[199,2111,1997],{"class":1930},[199,2113,2114,2116,2119],{"class":201,"line":1147},[199,2115,2002],{"class":1956},[199,2117,2118],{"class":1388}," $content",[199,2120,2008],{"class":1384},[199,2122,2123],{"class":201,"line":1152},[199,2124,218],{"emptyLinePlaceholder":217},[199,2126,2127],{"class":201,"line":1158},[199,2128,1969],{"class":1930},[199,2130,2131,2133,2135,2138],{"class":201,"line":1164},[199,2132,1974],{"class":1930},[199,2134,1978],{"class":1977},[199,2136,2137],{"class":1981}," string",[199,2139,2140],{"class":1930}," $lang\n",[199,2142,2143],{"class":201,"line":1170},[199,2144,1987],{"class":1930},[199,2146,2147],{"class":201,"line":1176},[199,2148,2033],{"class":1930},[199,2150,2151],{"class":201,"line":1182},[199,2152,1997],{"class":1930},[199,2154,2155,2157,2160],{"class":201,"line":1188},[199,2156,2002],{"class":1956},[199,2158,2159],{"class":1388}," $lang",[199,2161,2008],{"class":1384},[199,2163,2164],{"class":201,"line":1194},[199,2165,1614],{"class":1384},[12,2167,2168],{},"Le controlleur est assez simple :",[191,2170,2172],{"className":1921,"code":2171,"language":1923,"meta":60,"style":60},"\u002F**\n  * @Route(\"\u002Fpage\u002F{slug}\", requirements={\"slug\" = \".+\"})\n  * @Template()\n  *\u002F\npublic function indexAction($slug) {\n    $dm = $this->get('doctrine_mongodb')->getManager();\n\n    $page = $dm->getRepository(\"CMSBundle:Page\")->find($slug);\n    if ($page == null) {\n        if ($this->get('security.context')->isGranted('ROLE_ADMIN')) {\n            $page = new Page();\n            $page->setTitle(\"Titre de la page\");\n            $page->setSlug($slug);\n            $page->setName(\"Nom\");\n            $page->setContent(\"Contenue de la page\");\n        } else {\n            throw $this->createNotFoundException(\"Page not found\");\n        }\n    }\n\n    $request = $this->getRequest();\n    if ($request->getMethod() == \"POST\" && $page != null) {\n        $page->setName($request->get('name'));\n        $page->setTitle($request->get('title'));\n        $page->setContent($request->get('content'));\n\n        $dm->persist($page);\n        $dm->flush();\n    }\n\n    return array('page' => $page);\n}\n",[166,2173,2174,2178,2183,2188,2192,2213,2245,2249,2281,2300,2332,2346,2362,2377,2393,2409,2419,2438,2443,2448,2452,2468,2504,2529,2552,2575,2579,2595,2606,2610,2614,2634],{"__ignoreMap":60},[199,2175,2176],{"class":201,"line":202},[199,2177,1931],{"class":1930},[199,2179,2180],{"class":201,"line":208},[199,2181,2182],{"class":1930},"  * @Route(\"\u002Fpage\u002F{slug}\", requirements={\"slug\" = \".+\"})\n",[199,2184,2185],{"class":201,"line":214},[199,2186,2187],{"class":1930},"  * @Template()\n",[199,2189,2190],{"class":201,"line":221},[199,2191,1951],{"class":1930},[199,2193,2194,2197,2200,2204,2207,2210],{"class":201,"line":255},[199,2195,2196],{"class":1956},"public",[199,2198,2199],{"class":1956}," function",[199,2201,2203],{"class":2202},"sVbv2"," indexAction",[199,2205,2206],{"class":1384},"(",[199,2208,2209],{"class":1388},"$slug",[199,2211,2212],{"class":1384},") {\n",[199,2214,2215,2218,2222,2225,2228,2231,2233,2236,2239,2242],{"class":201,"line":261},[199,2216,2217],{"class":1388},"    $dm",[199,2219,2221],{"class":2220},"sjrmR"," =",[199,2223,2224],{"class":1960}," $this",[199,2226,2227],{"class":1384},"->",[199,2229,2230],{"class":2202},"get",[199,2232,2206],{"class":1384},[199,2234,2235],{"class":1425},"'doctrine_mongodb'",[199,2237,2238],{"class":1384},")->",[199,2240,2241],{"class":2202},"getManager",[199,2243,2244],{"class":1384},"();\n",[199,2246,2247],{"class":201,"line":267},[199,2248,218],{"emptyLinePlaceholder":217},[199,2250,2251,2254,2256,2259,2261,2264,2266,2269,2271,2274,2276,2278],{"class":201,"line":273},[199,2252,2253],{"class":1388},"    $page",[199,2255,2221],{"class":2220},[199,2257,2258],{"class":1388}," $dm",[199,2260,2227],{"class":1384},[199,2262,2263],{"class":2202},"getRepository",[199,2265,2206],{"class":1384},[199,2267,2268],{"class":1425},"\"CMSBundle:Page\"",[199,2270,2238],{"class":1384},[199,2272,2273],{"class":2202},"find",[199,2275,2206],{"class":1384},[199,2277,2209],{"class":1388},[199,2279,2280],{"class":1384},");\n",[199,2282,2283,2286,2289,2292,2295,2298],{"class":201,"line":279},[199,2284,2285],{"class":1956},"    if",[199,2287,2288],{"class":1384}," (",[199,2290,2291],{"class":1388},"$page",[199,2293,2294],{"class":2220}," ==",[199,2296,2297],{"class":1418}," null",[199,2299,2212],{"class":1384},[199,2301,2302,2305,2307,2310,2312,2314,2316,2319,2321,2324,2326,2329],{"class":201,"line":284},[199,2303,2304],{"class":1956},"        if",[199,2306,2288],{"class":1384},[199,2308,2309],{"class":1960},"$this",[199,2311,2227],{"class":1384},[199,2313,2230],{"class":2202},[199,2315,2206],{"class":1384},[199,2317,2318],{"class":1425},"'security.context'",[199,2320,2238],{"class":1384},[199,2322,2323],{"class":2202},"isGranted",[199,2325,2206],{"class":1384},[199,2327,2328],{"class":1425},"'ROLE_ADMIN'",[199,2330,2331],{"class":1384},")) {\n",[199,2333,2334,2337,2339,2342,2344],{"class":201,"line":289},[199,2335,2336],{"class":1388},"            $page",[199,2338,2221],{"class":2220},[199,2340,2341],{"class":1956}," new",[199,2343,1961],{"class":1960},[199,2345,2244],{"class":1384},[199,2347,2348,2350,2352,2355,2357,2360],{"class":201,"line":451},[199,2349,2336],{"class":1388},[199,2351,2227],{"class":1384},[199,2353,2354],{"class":2202},"setTitle",[199,2356,2206],{"class":1384},[199,2358,2359],{"class":1425},"\"Titre de la page\"",[199,2361,2280],{"class":1384},[199,2363,2364,2366,2368,2371,2373,2375],{"class":201,"line":457},[199,2365,2336],{"class":1388},[199,2367,2227],{"class":1384},[199,2369,2370],{"class":2202},"setSlug",[199,2372,2206],{"class":1384},[199,2374,2209],{"class":1388},[199,2376,2280],{"class":1384},[199,2378,2379,2381,2383,2386,2388,2391],{"class":201,"line":463},[199,2380,2336],{"class":1388},[199,2382,2227],{"class":1384},[199,2384,2385],{"class":2202},"setName",[199,2387,2206],{"class":1384},[199,2389,2390],{"class":1425},"\"Nom\"",[199,2392,2280],{"class":1384},[199,2394,2395,2397,2399,2402,2404,2407],{"class":201,"line":469},[199,2396,2336],{"class":1388},[199,2398,2227],{"class":1384},[199,2400,2401],{"class":2202},"setContent",[199,2403,2206],{"class":1384},[199,2405,2406],{"class":1425},"\"Contenue de la page\"",[199,2408,2280],{"class":1384},[199,2410,2411,2414,2417],{"class":201,"line":474},[199,2412,2413],{"class":1384},"        } ",[199,2415,2416],{"class":1956},"else",[199,2418,1964],{"class":1384},[199,2420,2421,2424,2426,2428,2431,2433,2436],{"class":201,"line":479},[199,2422,2423],{"class":1956},"            throw",[199,2425,2224],{"class":1960},[199,2427,2227],{"class":1384},[199,2429,2430],{"class":2202},"createNotFoundException",[199,2432,2206],{"class":1384},[199,2434,2435],{"class":1425},"\"Page not found\"",[199,2437,2280],{"class":1384},[199,2439,2440],{"class":201,"line":485},[199,2441,2442],{"class":1384},"        }\n",[199,2444,2445],{"class":201,"line":491},[199,2446,2447],{"class":1384},"    }\n",[199,2449,2450],{"class":201,"line":1069},[199,2451,218],{"emptyLinePlaceholder":217},[199,2453,2454,2457,2459,2461,2463,2466],{"class":201,"line":1075},[199,2455,2456],{"class":1388},"    $request",[199,2458,2221],{"class":2220},[199,2460,2224],{"class":1960},[199,2462,2227],{"class":1384},[199,2464,2465],{"class":2202},"getRequest",[199,2467,2244],{"class":1384},[199,2469,2470,2472,2474,2477,2479,2482,2485,2488,2491,2494,2497,2500,2502],{"class":201,"line":1081},[199,2471,2285],{"class":1956},[199,2473,2288],{"class":1384},[199,2475,2476],{"class":1388},"$request",[199,2478,2227],{"class":1384},[199,2480,2481],{"class":2202},"getMethod",[199,2483,2484],{"class":1384},"() ",[199,2486,2487],{"class":2220},"==",[199,2489,2490],{"class":1425}," \"POST\"",[199,2492,2493],{"class":2220}," &&",[199,2495,2496],{"class":1388}," $page",[199,2498,2499],{"class":2220}," !=",[199,2501,2297],{"class":1418},[199,2503,2212],{"class":1384},[199,2505,2506,2509,2511,2513,2515,2517,2519,2521,2523,2526],{"class":201,"line":1087},[199,2507,2508],{"class":1388},"        $page",[199,2510,2227],{"class":1384},[199,2512,2385],{"class":2202},[199,2514,2206],{"class":1384},[199,2516,2476],{"class":1388},[199,2518,2227],{"class":1384},[199,2520,2230],{"class":2202},[199,2522,2206],{"class":1384},[199,2524,2525],{"class":1425},"'name'",[199,2527,2528],{"class":1384},"));\n",[199,2530,2531,2533,2535,2537,2539,2541,2543,2545,2547,2550],{"class":201,"line":1093},[199,2532,2508],{"class":1388},[199,2534,2227],{"class":1384},[199,2536,2354],{"class":2202},[199,2538,2206],{"class":1384},[199,2540,2476],{"class":1388},[199,2542,2227],{"class":1384},[199,2544,2230],{"class":2202},[199,2546,2206],{"class":1384},[199,2548,2549],{"class":1425},"'title'",[199,2551,2528],{"class":1384},[199,2553,2554,2556,2558,2560,2562,2564,2566,2568,2570,2573],{"class":201,"line":1099},[199,2555,2508],{"class":1388},[199,2557,2227],{"class":1384},[199,2559,2401],{"class":2202},[199,2561,2206],{"class":1384},[199,2563,2476],{"class":1388},[199,2565,2227],{"class":1384},[199,2567,2230],{"class":2202},[199,2569,2206],{"class":1384},[199,2571,2572],{"class":1425},"'content'",[199,2574,2528],{"class":1384},[199,2576,2577],{"class":201,"line":1105},[199,2578,218],{"emptyLinePlaceholder":217},[199,2580,2581,2584,2586,2589,2591,2593],{"class":201,"line":1111},[199,2582,2583],{"class":1388},"        $dm",[199,2585,2227],{"class":1384},[199,2587,2588],{"class":2202},"persist",[199,2590,2206],{"class":1384},[199,2592,2291],{"class":1388},[199,2594,2280],{"class":1384},[199,2596,2597,2599,2601,2604],{"class":201,"line":1117},[199,2598,2583],{"class":1388},[199,2600,2227],{"class":1384},[199,2602,2603],{"class":2202},"flush",[199,2605,2244],{"class":1384},[199,2607,2608],{"class":201,"line":1123},[199,2609,2447],{"class":1384},[199,2611,2612],{"class":201,"line":1129},[199,2613,218],{"emptyLinePlaceholder":217},[199,2615,2616,2619,2622,2624,2627,2630,2632],{"class":201,"line":1135},[199,2617,2618],{"class":1956},"    return",[199,2620,2621],{"class":2220}," array",[199,2623,2206],{"class":1384},[199,2625,2626],{"class":1425},"'page'",[199,2628,2629],{"class":1384}," => ",[199,2631,2291],{"class":1388},[199,2633,2280],{"class":1384},[199,2635,2636],{"class":201,"line":1141},[199,2637,1614],{"class":1384},[12,2639,2640],{},"Et enfin la vue Twig contient les références à CKEditor et l'activation du contenu modifiable inliné\npour les projets. Pour l'instant le module est fortement lié à l'application existante. J'ai dans\nl'espoir d'avoir assez de temps un jour pour externaliser ce module afin de pouvoir le partager à\nplus de monde.",[12,2642,2643,2644,2646],{},"Si vous avez envie d'avoir plus d'information sur ce ",[1812,2645,1814],{}," n'hesitez pas à me contacter et je\nvous réponderez avec joie.",[73,2648,2650],{"id":2649},"les-produits","Les produits",[12,2652,2653],{},"La partie produits et beaucoup plus liée à l'activité du site. Les produits contiennent pour chaque\ncolori, un modèle dans lequel sont définis la position des différentes informations qui seront par\nla suite saisies par l'utilisateur. Ma femme peut ainsi, après avoir préparé son modèle le\npersonnaliser sur le site.",[12,2655,2656],{},"Un document de type produit personnalisé permet ensuite de spécialiser le produit en y ajoutant les\ninformations saisies par l'utilisateur. C'est ce produit final qui est ensuite acheté par\nl'utilisateur.",[73,2658,2660],{"id":2659},"les-paiements","Les paiements",[12,2662,2663],{},"La partie paiement contient la gestion du panier, de la facturation et le lien avec le site Paypal.\nEn effet on utilise l'API de paypal pour effectuer les paiements car nous n'avions pas l'envie de\ngérer pour ce site un système de paiement onéreux et complexe. Paypal prélève un pourcentage de la\ntransaction, et permet le paiement par carte bancaire des utilisateurs anonymes, ce qui nous\nconvient.",[12,2665,2666],{},"Au niveau du panier, certaines informations sont enregistrées, comme le nombre de lignes dans le\npanier, ainsi que le nom du produit et le nom du coloris choisis afin de faciliter le requêtage et\nl'affichage.",[73,2668,2670],{"id":2669},"la-gestion-des-utilisateurs","La gestion des utilisateurs",[12,2672,2673,2674,2677],{},"La gestion des utilisateurs passent par ",[1812,2675,2676],{},"FOS\u002FUserBundle",". Quelques personnalisations ont été\najoutées à ce module afin de correspondre au thème du site et aussi pour ajouter quelques\ninformations.",[73,2679,2681],{"id":2680},"le-site","Le site",[12,2683,2684,2685,2688,2689,2691],{},"Ajoute les ",[1812,2686,2687],{},"CSS"," et ",[1812,2690,1706],{}," personnalisés du site. Le theme a été acheté à une époque sur un\nsite proposant des templates, mais à depuis été customizé et adapté pour notre utilisation.",[73,2693,2695],{"id":2694},"ladmin","L'admin",[12,2697,2698],{},"L'interface d'administration permet à femme et à moi d'accéder aux différents produit, d'en créer de\nnouveau, de les modifiers. L'interface se base sur un thème bootstrape et reste assez simple. Seul\nl'utilisateur avec le role d'administrateur peut accéder à cette page.",[73,2700,2702],{"id":2701},"dans-lavenir","Dans l'avenir",[12,2704,2705,2706,2709,2710,2714],{},"Le découpage actuel ne me plaît pas forcément. En effet, je charge des ",[1812,2707,2708],{},"bundles"," propres à l'admin\nsur le site alors que ces derniers pourraient être chargés uniquement dans le cadre de l'admin et\ninversement. Je pense qu'appliquer une architecture comme celle décrite ici:\n",[16,2711,2712],{"href":2712,"rel":2713},"http:\u002F\u002Fjolicode.com\u002Fblog\u002Fmultiple-applications-with-symfony2",[25],",\npourrait être une bonne idée pour mieux découper l'application.",[12,2716,2717],{},"Dans le même style, la partie CMS actuelle est liée au site, et j'aimerais la découpler du site pour\npouvoir l'utiliser assez facilement dans d'autres projets.",[1714,2719,2721],{"id":2720},"mes-contributions","Mes contributions",[12,2723,2724],{},"Lors du développement de mon projet, j'ai eu besoin de certaines fonctionnalités que je n'ai pas\ntrouvées dans les bundles existants ou qui ne me convenaient pas. Je vous présente ici différents\nprojets que j'ai développé pour pallier à ces manques, sachant que pour l'instant ceux-ci ne sont\npas parfaits et voir même, la documentation peut laisser à désirer (quand aux tests unitaires ils\nsont dans le néant).",[12,2726,2727],{},"Si vous souhaiter aider ou contribuer, n'hésitez pas.",[73,2729,2731],{"id":2730},"collectionbundle","CollectionBundle",[12,2733,2734,2735],{},"Lien: ",[16,2736,2731],{"href":2737,"rel":2738},"http:\u002F\u002Fhg.shadoware.org\u002FSoftware\u002FSymfony2Bundle\u002FCollectionBundle",[25],[12,2740,2741],{},"Dans symfony, il est possible d'ajouter dans un formulaire un type collection pour permettre à un\nutilisateur de saisir une collection de sous-éléments (jointure de type OneToMany):",[191,2743,2745],{"className":1921,"code":2744,"language":1923,"meta":60,"style":60},"$builder->add('emails', 'collection', array(\n    \u002F\u002F chaque item du tableau sera un champ « email »\n    'type'   => 'email',\n    \u002F\u002F ces options sont passées à chaque type « email »\n    'options'  => array(\n        'required'  => false,\n        'attr'      => array('class' => 'email-box')\n    ),\n));\n",[166,2746,2747,2776,2781,2794,2799,2811,2823,2846,2851],{"__ignoreMap":60},[199,2748,2749,2752,2754,2757,2759,2762,2765,2768,2770,2773],{"class":201,"line":202},[199,2750,2751],{"class":1388},"$builder",[199,2753,2227],{"class":1384},[199,2755,2756],{"class":2202},"add",[199,2758,2206],{"class":1384},[199,2760,2761],{"class":1425},"'emails'",[199,2763,2764],{"class":1384},", ",[199,2766,2767],{"class":1425},"'collection'",[199,2769,2764],{"class":1384},[199,2771,2772],{"class":2220},"array",[199,2774,2775],{"class":1384},"(\n",[199,2777,2778],{"class":201,"line":208},[199,2779,2780],{"class":1930},"    \u002F\u002F chaque item du tableau sera un champ « email »\n",[199,2782,2783,2786,2789,2792],{"class":201,"line":214},[199,2784,2785],{"class":1425},"    'type'",[199,2787,2788],{"class":1384},"   => ",[199,2790,2791],{"class":1425},"'email'",[199,2793,1757],{"class":1384},[199,2795,2796],{"class":201,"line":221},[199,2797,2798],{"class":1930},"    \u002F\u002F ces options sont passées à chaque type « email »\n",[199,2800,2801,2804,2807,2809],{"class":201,"line":255},[199,2802,2803],{"class":1425},"    'options'",[199,2805,2806],{"class":1384},"  => ",[199,2808,2772],{"class":2220},[199,2810,2775],{"class":1384},[199,2812,2813,2816,2818,2821],{"class":201,"line":261},[199,2814,2815],{"class":1425},"        'required'",[199,2817,2806],{"class":1384},[199,2819,2820],{"class":1418},"false",[199,2822,1757],{"class":1384},[199,2824,2825,2828,2831,2833,2835,2838,2840,2843],{"class":201,"line":267},[199,2826,2827],{"class":1425},"        'attr'",[199,2829,2830],{"class":1384},"      => ",[199,2832,2772],{"class":2220},[199,2834,2206],{"class":1384},[199,2836,2837],{"class":1425},"'class'",[199,2839,2629],{"class":1384},[199,2841,2842],{"class":1425},"'email-box'",[199,2844,2845],{"class":1384},")\n",[199,2847,2848],{"class":201,"line":273},[199,2849,2850],{"class":1384},"    ),\n",[199,2852,2853],{"class":201,"line":279},[199,2854,2528],{"class":1384},[12,2856,2857],{},"Le problème c'est que dans les formulaires symfony2 il n'est pas possible de gérer des formulaires\ndifférents suivant le sous-type de l'objet (gestion de l'héritage dans l'ORM).",[12,2859,2860],{},"CollectionBundle propose deux nouveaux types :",[84,2862,2863,2866],{},[87,2864,2865],{},"Un type permettant de gérer pour chaque classe fille, un formulaire différent.",[87,2867,2868],{},"Un type permettant de gérer des collections de taille fixe : Exemple toujours 5 éléments, quel\nque soit le nombre d'éléments rééls en base.",[12,2870,2871],{},"Ce bundle est actuellement utilisé uniquement dans la partie admin du site.",[73,2873,2875],{"id":2874},"doctrinemigrationodmbundle","DoctrineMigrationODMBundle",[12,2877,2734,2878],{},[16,2879,2875],{"href":2880,"rel":2881},"http:\u002F\u002Fhg.shadoware.org\u002FSoftware\u002FSymfony2Bundle\u002Fdoctrine-migrations-bundle",[25],[12,2883,2884],{},"Pour l'ORM Doctrine, il existe DoctrineMigrationBundle qui permet de faire des migrations de schéma,\nmais il n'existait pas d'équivalent pour l'ODM gérant MongoDB.",[12,2886,2887],{},"Même si MongoDB est schemaless, et que les données peuvent être migrées à l'execution, je ressens le\nbesoin d'avoir la possiblité d'exécuter des scripts lors des changements de version, pour :",[84,2889,2890,2893,2896],{},[87,2891,2892],{},"ajouter de nouvelles données (nécessaires) dans des tables (car on requête sur ces données).",[87,2894,2895],{},"renommage de collection, suite à gros refactoring.",[87,2897,2898],{},"voir autre",[73,2900,2902],{"id":2901},"fpdi-et-fpdf_tpl","FPDI et FPDF_TPL",[12,2904,2905],{},"Pour la génération des PDF, je génère une première version où chaque page est un élément différent,\npuis je me sers de FPDI pour associer les différentes pages sur une même page (avec la mention\nSPECIMEN ou pas).",[12,2907,2908,2909,2912],{},"Afin d'avoir accès à FPDI je me suis créé les dépôts suivants qui fonctionnent avec ceux de\n",[1812,2910,2911],{},"tecnick.com\u002Ftcpdf"," pour les utilisateurs de TCPDF.",[12,2914,2915],{},"Liens:",[84,2917,2918,2924],{},[87,2919,2920],{},[16,2921,2922],{"href":2922,"rel":2923},"http:\u002F\u002Fhg.shadoware.org\u002FSoftware\u002FSymfony2Bundle\u002Ffpdi",[25],[87,2925,2926],{},[16,2927,2928],{"href":2928,"rel":2929},"http:\u002F\u002Fhg.shadoware.org\u002FSoftware\u002FSymfony2Bundle\u002Ffpdf_tpl",[25],[73,2931,2933],{"id":2932},"imageresizerbundle","ImageResizerBundle",[12,2935,2936,2937],{},"Lien : ",[16,2938,2933],{"href":2939,"rel":2940},"http:\u002F\u002Fhg.shadoware.org\u002FSoftware\u002FSymfony2Bundle\u002FImageResizerBundle",[25],[12,2942,2943,2944,2948],{},"Dérivé de\n",[16,2945,2946],{"href":2946,"rel":2947},"https:\u002F\u002Fgithub.com\u002Fnresni\u002FImageResizerBundle",[25],", ce\nbundle ajoute",[84,2950,2951,2954],{},[87,2952,2953],{},"des caches supplémentaires",[87,2955,2956],{},"fournit une URL sur la valeur du cache directement (et de générer le cache lors de l'appel de la\ncommande twig). Cette dernière permet de cacher un peu l'URL utilisée pour accéder à l'image\nd'origine. On ne peut accéder alors qu'à l'URL finale. Comme les ids des images sont des ObjectId,\nil n'est pas possible de retrouver par le nom l'URL de l'image d'origine.",[12,2958,2959],{},"Cette extension est utilisée par toute l'application pour l'affichage de toutes les miniatures.",[73,2961,2963],{"id":2962},"piwikbundle","PiwikBundle",[12,2965,2936,2966],{},[16,2967,2963],{"href":2968,"rel":2969},"http:\u002F\u002Fhg.shadoware.org\u002FSoftware\u002FSymfony2Bundle\u002FPiwikBundle",[25],[12,2971,2972],{},"Ce plugin a été créé afin de pouvoir ajouter la gestion de Piwik dans Symfony2. Les commandes PIWIK\npeuvent être passées au travers d'un service ou au travers de commandes TWIG. Ce plugin gère\négalement la notion d'e-commerce de PIWIK.",[12,2974,2975],{},"Une fois le plugin installé (via composer), il faut l'activer à l'aide de la configuration suivante:",[191,2977,2981],{"className":2978,"code":2979,"language":2980,"meta":60,"style":60},"language-yaml shiki shiki-themes one-dark-pro","shadoware_piwik:\n  base_url: http:\u002F\u002Fmonpiwik.monsite # URL de base du serveur PIWIK\n  id_site: 1 # N° du site dans PIWIK\n  hidePiwik: false # Indique s'il faut cacher le tracker par un controlleur interne.\n  tokenId: abcedfghijkmn123456789 # Le token id de l'utilisateur (pour le cas où on cache piwik)\n  heartbeat: ~ # Permet de définir quelques attributs activant la fonctionnalité de heatbeat de piwik.\n","yaml",[166,2982,2983,2991,3005,3017,3029,3042],{"__ignoreMap":60},[199,2984,2985,2988],{"class":201,"line":202},[199,2986,2987],{"class":1388},"shadoware_piwik",[199,2989,2990],{"class":1384},":\n",[199,2992,2993,2996,2999,3002],{"class":201,"line":208},[199,2994,2995],{"class":1388},"  base_url",[199,2997,2998],{"class":1384},": ",[199,3000,3001],{"class":1425},"http:\u002F\u002Fmonpiwik.monsite",[199,3003,3004],{"class":1930}," # URL de base du serveur PIWIK\n",[199,3006,3007,3010,3012,3014],{"class":201,"line":214},[199,3008,3009],{"class":1388},"  id_site",[199,3011,2998],{"class":1384},[199,3013,62],{"class":1418},[199,3015,3016],{"class":1930}," # N° du site dans PIWIK\n",[199,3018,3019,3022,3024,3026],{"class":201,"line":221},[199,3020,3021],{"class":1388},"  hidePiwik",[199,3023,2998],{"class":1384},[199,3025,2820],{"class":1418},[199,3027,3028],{"class":1930}," # Indique s'il faut cacher le tracker par un controlleur interne.\n",[199,3030,3031,3034,3036,3039],{"class":201,"line":255},[199,3032,3033],{"class":1388},"  tokenId",[199,3035,2998],{"class":1384},[199,3037,3038],{"class":1425},"abcedfghijkmn123456789",[199,3040,3041],{"class":1930}," # Le token id de l'utilisateur (pour le cas où on cache piwik)\n",[199,3043,3044,3047,3049,3052],{"class":201,"line":261},[199,3045,3046],{"class":1388},"  heartbeat",[199,3048,2998],{"class":1384},[199,3050,3051],{"class":1418},"~",[199,3053,3054],{"class":1930}," # Permet de définir quelques attributs activant la fonctionnalité de heatbeat de piwik.\n",[12,3056,3057],{},"Une fois la configuration faite, le plugin ajoutera juste avant chaque balise  l'appel à\npiwik (en utilisant la méthode asynchrone). Si la page ne contient pas de balise  ou si elle\nconstitue une page de redirection, les informations seront déportées à l'affichage suivant.",[12,3059,3060],{},"Cette dernière fonctionnalité permet par exemple d'ajouter des éléménts au panier e-commerce piwik\nlors des pages de redirection, et de traiter son affichage dès que possible. Cela a par contre comme\nlimitation de ne pas gérer les conflits.",[12,3062,3063],{},"L'utilisation depuis un controlleur se fait grâce à l'utilisation du service:",[191,3065,3067],{"className":1921,"code":3066,"language":1923,"meta":60,"style":60},"$this->container->get('shadoware_piwik.service')->addEcommerceItem($productId, $productName, $category, $amount);\n$this->container->get('shadoware_piwik.service')->trackEcommerceCartUpdate($totalAmount);\n",[166,3068,3069,3114],{"__ignoreMap":60},[199,3070,3071,3073,3075,3078,3080,3082,3084,3087,3089,3092,3094,3097,3099,3102,3104,3107,3109,3112],{"class":201,"line":202},[199,3072,2309],{"class":1960},[199,3074,2227],{"class":1384},[199,3076,3077],{"class":1388},"container",[199,3079,2227],{"class":1384},[199,3081,2230],{"class":2202},[199,3083,2206],{"class":1384},[199,3085,3086],{"class":1425},"'shadoware_piwik.service'",[199,3088,2238],{"class":1384},[199,3090,3091],{"class":2202},"addEcommerceItem",[199,3093,2206],{"class":1384},[199,3095,3096],{"class":1388},"$productId",[199,3098,2764],{"class":1384},[199,3100,3101],{"class":1388},"$productName",[199,3103,2764],{"class":1384},[199,3105,3106],{"class":1388},"$category",[199,3108,2764],{"class":1384},[199,3110,3111],{"class":1388},"$amount",[199,3113,2280],{"class":1384},[199,3115,3116,3118,3120,3122,3124,3126,3128,3130,3132,3135,3137,3140],{"class":201,"line":208},[199,3117,2309],{"class":1960},[199,3119,2227],{"class":1384},[199,3121,3077],{"class":1388},[199,3123,2227],{"class":1384},[199,3125,2230],{"class":2202},[199,3127,2206],{"class":1384},[199,3129,3086],{"class":1425},[199,3131,2238],{"class":1384},[199,3133,3134],{"class":2202},"trackEcommerceCartUpdate",[199,3136,2206],{"class":1384},[199,3138,3139],{"class":1388},"$totalAmount",[199,3141,2280],{"class":1384},[12,3143,3144],{},"L'utilisation depuis une page twig se fait à l'aide des commandes twig. Par exemple dans la page\ntwig de base:",[191,3146,3150],{"className":3147,"code":3148,"language":3149,"meta":60,"style":60},"language-twig shiki shiki-themes one-dark-pro","\u003Ctitle>{{ 'title' | trans }} - {% block title %}{{ 'menu.home' | trans }}{% endblock %}\u003C\u002Ftitle>\n{{ setPiwikPageName(block('title')) }}\n","twig",[166,3151,3152,3202],{"__ignoreMap":60},[199,3153,3154,3156,3159,3162,3164,3167,3170,3173,3176,3179,3182,3185,3187,3189,3192,3195,3198,3200],{"class":201,"line":202},[199,3155,1385],{"class":1384},[199,3157,3158],{"class":1388},"title",[199,3160,3161],{"class":1384},">{{ ",[199,3163,2549],{"class":1425},[199,3165,3166],{"class":1384}," | ",[199,3168,3169],{"class":1388},"trans",[199,3171,3172],{"class":1384}," }} - {% ",[199,3174,3175],{"class":1956},"block",[199,3177,3178],{"class":1388}," title",[199,3180,3181],{"class":1384}," %}{{ ",[199,3183,3184],{"class":1425},"'menu.home'",[199,3186,3166],{"class":1384},[199,3188,3169],{"class":1388},[199,3190,3191],{"class":1384}," }}{% ",[199,3193,3194],{"class":1956},"endblock",[199,3196,3197],{"class":1384}," %}\u003C\u002F",[199,3199,3158],{"class":1388},[199,3201,1392],{"class":1384},[199,3203,3204,3207,3209,3211,3213],{"class":201,"line":208},[199,3205,3206],{"class":1384},"{{ setPiwikPageName(",[199,3208,3175],{"class":2220},[199,3210,2206],{"class":1384},[199,3212,2549],{"class":1425},[199,3214,3215],{"class":1384},")) }}\n",[3217,3218,1621],"h1",{"id":1620},[12,3220,3221],{},"Bon voilà j'espère vous avoir fait découvrir le site ainsi que quelques nouveaux plugins\nintéressant.",[12,3223,3224],{},"A bientôt,",[1661,3226,3227],{},"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}html pre.shiki code .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}html pre.shiki code .shdRp, html code.shiki .shdRp{--shiki-default:#C678DD;--shiki-default-font-style:italic}html pre.shiki code .sKU4T, html code.shiki .sKU4T{--shiki-default:#E5C07B;--shiki-default-font-style:italic}html pre.shiki code .sVyAn, html code.shiki .sVyAn{--shiki-default:#E06C75}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 .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}html pre.shiki code .sjrmR, html code.shiki .sjrmR{--shiki-default:#56B6C2}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html pre.shiki code .sVC51, html code.shiki .sVC51{--shiki-default:#D19A66}",{"title":60,"searchDepth":208,"depth":208,"links":3229},[3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3243,3244,3245,3246,3247],{"id":1716,"depth":214,"text":1717},{"id":1797,"depth":214,"text":1798},{"id":1821,"depth":214,"text":1793},{"id":1870,"depth":214,"text":1871},{"id":1880,"depth":208,"text":1881},{"id":2649,"depth":208,"text":2650},{"id":2659,"depth":208,"text":2660},{"id":2669,"depth":208,"text":2670},{"id":2680,"depth":208,"text":2681},{"id":2694,"depth":208,"text":2695},{"id":2701,"depth":208,"text":2702,"children":3241},[3242],{"id":2720,"depth":214,"text":2721},{"id":2730,"depth":208,"text":2731},{"id":2874,"depth":208,"text":2875},{"id":2901,"depth":208,"text":2902},{"id":2932,"depth":208,"text":2933},{"id":2962,"depth":208,"text":2963},"2014-03-19",{"type":9,"value":3250},[3251,3253,3255,3260,3265],[1714,3252,1717],{"id":1716},[12,3254,1720],{},[12,3256,1723,3257,1729],{},[16,3258,1728],{"href":1726,"rel":3259},[25],[12,3261,3262,1737],{},[16,3263,1736],{"href":1734,"rel":3264},[25],[12,3266,1740],{},{},"\u002Fpost\u002Fmonlivretdemesse-fr",{"title":1710,"description":60},"monlivretdemesse-fr","posts\u002FLogiciels\u002F2014-03-19-monlivretdemesse-fr",[1705,3273,3274,3275],"livrets","mariage","bapteme","CLzxUTrMi7D7_9aacVnIiqCI2iUc0MClvm1Kv0yZXCA",{"id":3278,"title":3279,"author":7,"body":3280,"category":1673,"categorySlug":1674,"date":4259,"description":3284,"excerpt":4260,"extension":195,"location":1698,"meta":4270,"navigation":217,"path":4271,"published":217,"seo":4272,"slug":4273,"stem":4274,"tags":4275,"timeToRead":273,"__hash__":4276},"posts\u002Fposts\u002FLogiciels\u002F2013-01-12-migration-to-pelican.md","Passage du site sous Pelican",{"type":9,"value":3281,"toc":4245},[3282,3285,3288,3291,3294,3298,3301,3304,3307,3310,3313,3316,3327,3330,3347,3350,3354,3357,3360,3363,3367,3370,3373,3377,3387,3394,3397,3400,3404,3411,3418,3422,3431,3434,3467,3470,3473,3490,3493,3496,3500,3503,3513,3516,3625,3628,3688,3691,3796,3813,3817,3824,3827,3846,3852,3858,3862,3865,3872,4029,4032,4035,4041,4045,4048,4051,4054,4057,4102,4112,4116,4119,4143,4153,4223,4226,4242],[12,3283,3284],{},"Bonjour à tous,",[12,3286,3287],{},"Cela fait bien longtemps que je n'ai rien écrit sur ce site. Et pour\ncause, je suis bien occupé 😄.",[12,3289,3290],{},"J'ai quand même pris un peu de temps récemment pour passer entièrement mon\nsite sous Pelican.",[12,3292,3293],{},"C'est mon cadeau de Noël de Geek ;).",[73,3295,3297],{"id":3296},"quest-ce-que-pelican","Qu'est-ce que Pelican ?",[12,3299,3300],{},"Pelican est un gestionnaire de blog statique.",[12,3302,3303],{},"Qu'est-ce que ça veut dire ?",[12,3305,3306],{},"Cela signifie que je vais écrire mes billets avec mon éditeur de texte\npréféré (kwrite), au format Markdown (ou restructuredText), et que je\ngénère mon blog au format HTML avant publication. (De la même manière que\nl'on compilerait un programme).",[12,3308,3309],{},"Le serveur n'a alors besoin de servir que des fichiers statiques, il n'y\na donc pas de surplus de mémoire, ou de délai dû à la nécessité de\ngénérer les pages.",[12,3311,3312],{},"Les pages n'étant pas modifiées tous les jours, il n'y a de toute façon\npas d'intérêt de générer les pages à chaque accès.",[12,3314,3315],{},"Les avantages indéniables sont les suivants :",[84,3317,3318,3321,3324],{},[87,3319,3320],{},"Pas de base de données, pas de page générée à la volée : donc pas de\ntemps de latence. La page est servie dés qu'elle est demandée. De plus\nil existe un plugin permettant de générer les pages au format pré-zippé,\nce qui fait un traitement de moins sur le serveur.",[87,3322,3323],{},"Pas de faille de sécurité dû à un script mal paramétré.",[87,3325,3326],{},"Je peux gérer mes billets sous un gestionnaire de version (exemple\nMercurial).",[12,3328,3329],{},"Par contre les inconvénients sont :",[84,3331,3332,3341,3344],{},[87,3333,3334,3335,3340],{},"Plus de commentaire direct sur le blog (sauf à utiliser des plateformes\ntel que ",[16,3336,3339],{"href":3337,"rel":3338},"http:\u002F\u002Fdisqus.com\u002F",[25],"disqus",")",[87,3342,3343],{},"Je dois installer le générateur de blog sur la\u002Fles machines que je\nsouhaite utiliser pour générer le blog.",[87,3345,3346],{},"Je dois ensuite utiliser SCP pour transférer mon blog.",[12,3348,3349],{},"Pour les deux derniers points, ils sont de mon choix. D'autres installent\nces outils sur le serveur, ils peuvent donc générer leur page directement\nà partir du serveur.",[73,3351,3353],{"id":3352},"les-implications","Les implications",[12,3355,3356],{},"Les conséquences pour ce blog sont donc : plus de commentaire (jusqu'à\nnouvel ordre). Vous pouvez toujours m'envoyer un mail, pour poser une\nquestion, je l'ajouterai manuellement en tant que commentaire.",[12,3358,3359],{},"Je garde tout de même les anciens commentaires, qui peuvent contenir\nparfois quelques informations utiles.",[12,3361,3362],{},"J'ai également profité de ce petit changement pour faire un petit\nnettoyage et j'ai supprimé tous les billets d'humeur, pour ne garder que\nles articles réellement intéressant.",[73,3364,3366],{"id":3365},"comment-sest-déroulé-la-conversion","Comment s'est déroulé la conversion ?",[12,3368,3369],{},"Dans cette partie, je vais décrire le déroulement de la conversion du\nblog.",[12,3371,3372],{},"Cette conversion comprend les articles, les commentaires et le thème.",[1714,3374,3376],{"id":3375},"exportation-des-billets-provenant-de-dotclear","Exportation des billets provenant de dotclear",[12,3378,3379,3380,3382,3383,3386],{},"Il a d'abord fallu exporter les billets depuis le site sous\n",[1812,3381,26],{},". Sous Dotclear, dans la partie administration, il est possible\nd'utiliser le plugin ",[166,3384,3385],{},"Import\u002FExport"," pour exporter le site dans un fichier\ntexte.",[12,3388,3389],{},[3390,3391],"img",{"alt":3392,"src":3393},"Export","\u002FLogiciels\u002Fmigration\u002Fdotclear_export.png",[12,3395,3396],{},"Le fichier texte se présente alors comme un mixte entre un fichier INI et\nun ensemble de fichier CSV. Il contient, les catégories, les articles, et\nles commentaires.",[12,3398,3399],{},"Ce fichier peut alors être utilisé avec l'outil d'import de pelican pour\nrécupérer les différents billets.",[1714,3401,3403],{"id":3402},"création-dun-environnement-pour-pelican","Création d'un environnement pour pelican",[12,3405,3406,3407,3410],{},"La création de l'environnement se fait comme décrit sur le ",[199,3408,3409],{},"site de\npelican",". Je ne vais donc pas le décrire une fois de plus.",[12,3412,3413,3414,3417],{},"Une fois installé, les billets sont à placer dans le dossier ",[166,3415,3416],{},"content",".\nLes fichiers générés par l'import seront donc placés dans ce dossier.",[1714,3419,3421],{"id":3420},"importation-des-billets-au-format-markdown","Importation des billets au format Markdown",[12,3423,3424,3425,3430],{},"L'import est décrit dans la ",[16,3426,3429],{"href":3427,"rel":3428},"http:\u002F\u002Fdocs.getpelican.com\u002Fen\u002Flatest\u002Fimporter.html",[25],"documentation de pelican",". Après différents\ntests, l'import au format Markdown a été celui qui a donné de meilleurs\nrésultats.",[12,3432,3433],{},"Voici donc la commande qui m'a permis de réaliser cet import :",[191,3435,3439],{"className":3436,"code":3437,"language":3438,"meta":60,"style":60},"language-bash shiki shiki-themes one-dark-pro","pelican-import --dotclear -m markdown --dir-cat 2012-12-11-shadoware-backup.txt -o content\n","bash",[166,3440,3441],{"__ignoreMap":60},[199,3442,3443,3446,3449,3452,3455,3458,3461,3464],{"class":201,"line":202},[199,3444,3445],{"class":2202},"pelican-import",[199,3447,3448],{"class":1418}," --dotclear",[199,3450,3451],{"class":1418}," -m",[199,3453,3454],{"class":1425}," markdown",[199,3456,3457],{"class":1418}," --dir-cat",[199,3459,3460],{"class":1425}," 2012-12-11-shadoware-backup.txt",[199,3462,3463],{"class":1418}," -o",[199,3465,3466],{"class":1425}," content\n",[12,3468,3469],{},"Cela m'a généré une liste de 65 fichiers : 1 par billet. Parmi ces\nbillets, j'ai fait le tri, et j'ai supprimé les billets d'humeur. J'ai\najouté également un tag indiquant l'état de draft sur quelques billets qui\nsont en cours d'écriture et que je n'ai pas encore eu le temps de\nterminer et de publier.",[12,3471,3472],{},"Puis j'ai effectué une passe sur chaque billet, pour",[84,3474,3475,3478,3481,3484,3487],{},[87,3476,3477],{},"reprendre les parties de code (coloration syntaxique),",[87,3479,3480],{},"reprendre les tableaux,",[87,3482,3483],{},"reprendre les tags (qui n'ont pas été importés),",[87,3485,3486],{},"corriger les dates (la date était celle de création du poste, et non\ncelle de publication),",[87,3488,3489],{},"modification des catégories.",[12,3491,3492],{},"Sous dotclear, j'avais fait plusieurs niveaux de catégories, alors que\nsous pelican, il n'y a qu'un seul niveau de catégorie. J'ai donc dû mettre\nà plat les différentes catégories.",[12,3494,3495],{},"Pour les tableaux, ces derniers étaient repris directement au format HTML,\nils étaient donc exploitables directement. J'ai préféré refaire les\ntableaux au format Markdown.",[1714,3497,3499],{"id":3498},"ajustement-du-fichier-de-configuration","Ajustement du fichier de configuration",[12,3501,3502],{},"Viennent ensuite les ajustements faits dans le fichier de configuration,\npour que les URL des articles sous dotclear soient les plus proches\npossibles des nouvelles URL.",[12,3504,3505,3506,3509,3510,42],{},"Pour cela, j'ai choisi d'avoir les mêmes adresses que sur le site dotclear\nsuivies de ",[166,3507,3508],{},".html"," ou de ",[166,3511,3512],{},".xml",[12,3514,3515],{},"Dans le fichier, j'ai positionné les variables pelicanconf.py",[191,3517,3521],{"className":3518,"code":3519,"language":3520,"meta":60,"style":60},"language-python shiki shiki-themes one-dark-pro","ARTICLE_URL = 'post\u002F{slug}.html'\nARTICLE_SAVE_AS = 'post\u002F{slug}.html'\nAUTHOR_SAVE_AS = False\n\nFEED_DOMAIN = SITEURL\nFEED_ALL_ATOM = 'feed\u002Fatom.xml'\nCATEGORY_FEED_ATOM = 'feed\u002Fcategory\u002F%s\u002Fatom.xml'\nTAG_FEED_ATOM = 'feed\u002Ftags\u002F%s\u002Fatom.xml'\nTRANSLATION_FEED_ATOM = False\n","python",[166,3522,3523,3539,3552,3562,3566,3576,3586,3602,3616],{"__ignoreMap":60},[199,3524,3525,3528,3530,3533,3536],{"class":201,"line":202},[199,3526,3527],{"class":1418},"ARTICLE_URL",[199,3529,2221],{"class":2220},[199,3531,3532],{"class":1425}," 'post\u002F",[199,3534,3535],{"class":1418},"{slug}",[199,3537,3538],{"class":1425},".html'\n",[199,3540,3541,3544,3546,3548,3550],{"class":201,"line":208},[199,3542,3543],{"class":1418},"ARTICLE_SAVE_AS",[199,3545,2221],{"class":2220},[199,3547,3532],{"class":1425},[199,3549,3535],{"class":1418},[199,3551,3538],{"class":1425},[199,3553,3554,3557,3559],{"class":201,"line":214},[199,3555,3556],{"class":1418},"AUTHOR_SAVE_AS",[199,3558,2221],{"class":2220},[199,3560,3561],{"class":1418}," False\n",[199,3563,3564],{"class":201,"line":221},[199,3565,218],{"emptyLinePlaceholder":217},[199,3567,3568,3571,3573],{"class":201,"line":255},[199,3569,3570],{"class":1418},"FEED_DOMAIN",[199,3572,2221],{"class":2220},[199,3574,3575],{"class":1418}," SITEURL\n",[199,3577,3578,3581,3583],{"class":201,"line":261},[199,3579,3580],{"class":1418},"FEED_ALL_ATOM",[199,3582,2221],{"class":2220},[199,3584,3585],{"class":1425}," 'feed\u002Fatom.xml'\n",[199,3587,3588,3591,3593,3596,3599],{"class":201,"line":267},[199,3589,3590],{"class":1418},"CATEGORY_FEED_ATOM",[199,3592,2221],{"class":2220},[199,3594,3595],{"class":1425}," 'feed\u002Fcategory\u002F",[199,3597,3598],{"class":1418},"%s",[199,3600,3601],{"class":1425},"\u002Fatom.xml'\n",[199,3603,3604,3607,3609,3612,3614],{"class":201,"line":273},[199,3605,3606],{"class":1418},"TAG_FEED_ATOM",[199,3608,2221],{"class":2220},[199,3610,3611],{"class":1425}," 'feed\u002Ftags\u002F",[199,3613,3598],{"class":1418},[199,3615,3601],{"class":1425},[199,3617,3618,3621,3623],{"class":201,"line":279},[199,3619,3620],{"class":1418},"TRANSLATION_FEED_ATOM",[199,3622,2221],{"class":2220},[199,3624,3561],{"class":1418},[12,3626,3627],{},"Dans le fichier, j'ai positionné les variables publishconf.py",[191,3629,3631],{"className":3518,"code":3630,"language":3520,"meta":60,"style":60},"ARTICLE_URL = 'post\u002F{slug}'\nPAGE_URL = 'pages\u002F{slug}'\nCATEGORY_URL = 'category\u002F{slug}'\nTAG_URL = 'tag\u002F{slug}'\n",[166,3632,3633,3646,3660,3674],{"__ignoreMap":60},[199,3634,3635,3637,3639,3641,3643],{"class":201,"line":202},[199,3636,3527],{"class":1418},[199,3638,2221],{"class":2220},[199,3640,3532],{"class":1425},[199,3642,3535],{"class":1418},[199,3644,3645],{"class":1425},"'\n",[199,3647,3648,3651,3653,3656,3658],{"class":201,"line":208},[199,3649,3650],{"class":1418},"PAGE_URL",[199,3652,2221],{"class":2220},[199,3654,3655],{"class":1425}," 'pages\u002F",[199,3657,3535],{"class":1418},[199,3659,3645],{"class":1425},[199,3661,3662,3665,3667,3670,3672],{"class":201,"line":214},[199,3663,3664],{"class":1418},"CATEGORY_URL",[199,3666,2221],{"class":2220},[199,3668,3669],{"class":1425}," 'category\u002F",[199,3671,3535],{"class":1418},[199,3673,3645],{"class":1425},[199,3675,3676,3679,3681,3684,3686],{"class":201,"line":221},[199,3677,3678],{"class":1418},"TAG_URL",[199,3680,2221],{"class":2220},[199,3682,3683],{"class":1425}," 'tag\u002F",[199,3685,3535],{"class":1418},[199,3687,3645],{"class":1425},[12,3689,3690],{},"Du coté de nginx, le serveur d'application, j'ai ajouté les lignes\nsuivantes :",[191,3692,3696],{"className":3693,"code":3694,"language":3695,"meta":60,"style":60},"language-nginx shiki shiki-themes one-dark-pro","rewrite ^\u002Fdotclear\u002Findex.php\u002Fpost\u002F\\d+\u002F\\d+\u002F\\d+\u002F\\d+-(.*)$ \u002Fpost\u002F$1 permanent;\nrewrite ^\u002Fpost\u002F\\d+\u002F\\d+\u002F\\d+\u002F\\d+-(.*)$ \u002Fpost\u002F$1 permanent;\nrewrite ^\u002Fpost\u002F\\d+\u002F\\d+\u002F\\d+\u002F(.*)$ \u002Fpost\u002F$1 permanent;\n\nlocation \u002F {\n    try_files $uri.html $uri.xml $uri $uri\u002F =404;\n}\n","nginx",[166,3697,3698,3716,3731,3746,3750,3758,3792],{"__ignoreMap":60},[199,3699,3700,3703,3706,3709,3711,3714],{"class":201,"line":202},[199,3701,3702],{"class":1956},"rewrite",[199,3704,3705],{"class":1388}," ^\u002Fdotclear\u002Findex.php\u002Fpost\u002F\\d+\u002F\\d+\u002F\\d+\u002F\\d+-(.*)$",[199,3707,3708],{"class":1384}," \u002Fpost\u002F$",[199,3710,62],{"class":1388},[199,3712,3713],{"class":1956}," permanent",[199,3715,2008],{"class":1384},[199,3717,3718,3720,3723,3725,3727,3729],{"class":201,"line":208},[199,3719,3702],{"class":1956},[199,3721,3722],{"class":1388}," ^\u002Fpost\u002F\\d+\u002F\\d+\u002F\\d+\u002F\\d+-(.*)$",[199,3724,3708],{"class":1384},[199,3726,62],{"class":1388},[199,3728,3713],{"class":1956},[199,3730,2008],{"class":1384},[199,3732,3733,3735,3738,3740,3742,3744],{"class":201,"line":214},[199,3734,3702],{"class":1956},[199,3736,3737],{"class":1388}," ^\u002Fpost\u002F\\d+\u002F\\d+\u002F\\d+\u002F(.*)$",[199,3739,3708],{"class":1384},[199,3741,62],{"class":1388},[199,3743,3713],{"class":1956},[199,3745,2008],{"class":1384},[199,3747,3748],{"class":201,"line":221},[199,3749,218],{"emptyLinePlaceholder":217},[199,3751,3752,3755],{"class":201,"line":255},[199,3753,3754],{"class":1956},"location",[199,3756,3757],{"class":1384}," \u002F {\n",[199,3759,3760,3763,3766,3769,3772,3774,3777,3779,3782,3784,3787,3790],{"class":201,"line":261},[199,3761,3762],{"class":1956},"    try_files ",[199,3764,3765],{"class":1384},"$",[199,3767,3768],{"class":1388},"uri",[199,3770,3771],{"class":1384},".html $",[199,3773,3768],{"class":1388},[199,3775,3776],{"class":1384},".xml $",[199,3778,3768],{"class":1388},[199,3780,3781],{"class":1384}," $",[199,3783,3768],{"class":1388},[199,3785,3786],{"class":1384},"\u002F ",[199,3788,3789],{"class":1418},"=404",[199,3791,2008],{"class":1384},[199,3793,3794],{"class":201,"line":267},[199,3795,1614],{"class":1384},[12,3797,3798,3799,3802,3803,3806,3807,3809,3810,3812],{},"Les premières lignes permettent de reprendre les anciennes adresses\n",[166,3800,3801],{},"dotclear",", et la commande ",[166,3804,3805],{},"try_files"," permet de reprendre les adresses\nexistantes et de les compléter par ",[166,3808,3508],{}," et par ",[166,3811,3512],{}," selon le besoin.",[1714,3814,3816],{"id":3815},"modification-du-thème","Modification du thème",[12,3818,3819,3820,3823],{},"Enfin j'ai écrit un nouveau thème dans le dossier ",[166,3821,3822],{},"themes\u002Fshadoware",". Ce\nthème est fait pour coller le plus possible à celui que j'avais sur le\nsite dotclear.",[12,3825,3826],{},"Il génère donc la page de la même manière que dotclear le faisait (à\nquelques différences prés) pour éviter de devoir ré-écrire la feuille de\nstyle CSS.",[12,3828,3829,3830,3835,3836,3839,3840,3843,3844,42],{},"L'écriture du thème n'est en soit pas très compliqué, car ",[16,3831,3834],{"href":3832,"rel":3833},"http:\u002F\u002Fjinja.pocoo.org\u002Fdocs\u002F",[25],"jinja2"," est\nassez simple d'utilisation. Je me suis inspiré des thèmes ",[166,3837,3838],{},"simple"," et\n",[166,3841,3842],{},"notmyidea"," pour écrire le thème, basé sur celui que j'avais sous\n",[166,3845,3801],{},[12,3847,3848,3849,42],{},"Vous pouvez trouver le thème au ",[199,3850,3851],{},"lien suivant",[12,3853,3854],{},[3390,3855],{"alt":3856,"src":3857},"Theme","\u002FLogiciels\u002Fmigration\u002Fsite.png",[1714,3859,3861],{"id":3860},"importation-des-commentaires","Importation des commentaires",[12,3863,3864],{},"Les commentaires existants sur mon blog actuel peuvent parfois contenir\ndes informations complémentaires. Les ignorer lors de la migration est\ntout a fait possible, mais j'ai préféré les récupérer.",[12,3866,3867,3868,3871],{},"Pour cela j'ai installé le ",[199,3869,3870],{},"plugin comments",". Ensuite j'ai modifié le\nthème pour ajouter l'affichage des commentaires :",[191,3873,3875],{"className":1375,"code":3874,"language":1377,"meta":60,"style":60},"{% if article.comments %}\n\u003Cdiv id=\"comments\">\n  \u003Ch3>Commentaires\u003C\u002Fh3>\n  \u003Cdl>\n    {% for comment in article.comments %}\n    \u003Cdt>\n      \u003Ca class=\"comment-number\" href=\"#\">{{ loop.index }}.\u003C\u002Fa>\n      Le {{ comment.date }} par {{ comment.author }}\n    \u003C\u002Fdt>\n    \u003Cdd>\n      \u003Cp>{{ comment.content }}\u003C\u002Fp>\n    \u003C\u002Fdd>\n    {% endfor %}\n  \u003C\u002Fdl>\n\u003C\u002Fdiv>\n{% endif %}\n",[166,3876,3877,3882,3896,3909,3918,3923,3932,3960,3965,3973,3982,3995,4003,4008,4016,4024],{"__ignoreMap":60},[199,3878,3879],{"class":201,"line":202},[199,3880,3881],{"class":1384},"{% if article.comments %}\n",[199,3883,3884,3886,3888,3890,3892,3894],{"class":201,"line":208},[199,3885,1385],{"class":1384},[199,3887,1415],{"class":1388},[199,3889,1438],{"class":1418},[199,3891,1422],{"class":1384},[199,3893,1443],{"class":1425},[199,3895,1392],{"class":1384},[199,3897,3898,3900,3902,3905,3907],{"class":201,"line":214},[199,3899,1402],{"class":1384},[199,3901,1714],{"class":1388},[199,3903,3904],{"class":1384},">Commentaires\u003C\u002F",[199,3906,1714],{"class":1388},[199,3908,1392],{"class":1384},[199,3910,3911,3913,3916],{"class":201,"line":221},[199,3912,1402],{"class":1384},[199,3914,3915],{"class":1388},"dl",[199,3917,1392],{"class":1384},[199,3919,3920],{"class":201,"line":255},[199,3921,3922],{"class":1384},"    {% for comment in article.comments %}\n",[199,3924,3925,3927,3930],{"class":201,"line":261},[199,3926,1412],{"class":1384},[199,3928,3929],{"class":1388},"dt",[199,3931,1392],{"class":1384},[199,3933,3934,3936,3938,3940,3942,3945,3948,3950,3953,3956,3958],{"class":201,"line":267},[199,3935,1433],{"class":1384},[199,3937,16],{"class":1388},[199,3939,1419],{"class":1418},[199,3941,1422],{"class":1384},[199,3943,3944],{"class":1425},"\"comment-number\"",[199,3946,3947],{"class":1418}," href",[199,3949,1422],{"class":1384},[199,3951,3952],{"class":1425},"\"#\"",[199,3954,3955],{"class":1384},">{{ loop.index }}.\u003C\u002F",[199,3957,16],{"class":1388},[199,3959,1392],{"class":1384},[199,3961,3962],{"class":201,"line":273},[199,3963,3964],{"class":1384},"      Le {{ comment.date }} par {{ comment.author }}\n",[199,3966,3967,3969,3971],{"class":201,"line":279},[199,3968,1536],{"class":1384},[199,3970,3929],{"class":1388},[199,3972,1392],{"class":1384},[199,3974,3975,3977,3980],{"class":201,"line":284},[199,3976,1412],{"class":1384},[199,3978,3979],{"class":1388},"dd",[199,3981,1392],{"class":1384},[199,3983,3984,3986,3988,3991,3993],{"class":201,"line":289},[199,3985,1433],{"class":1384},[199,3987,12],{"class":1388},[199,3989,3990],{"class":1384},">{{ comment.content }}\u003C\u002F",[199,3992,12],{"class":1388},[199,3994,1392],{"class":1384},[199,3996,3997,3999,4001],{"class":201,"line":451},[199,3998,1536],{"class":1384},[199,4000,3979],{"class":1388},[199,4002,1392],{"class":1384},[199,4004,4005],{"class":201,"line":457},[199,4006,4007],{"class":1384},"    {% endfor %}\n",[199,4009,4010,4012,4014],{"class":201,"line":463},[199,4011,1545],{"class":1384},[199,4013,3915],{"class":1388},[199,4015,1392],{"class":1384},[199,4017,4018,4020,4022],{"class":201,"line":469},[199,4019,1554],{"class":1384},[199,4021,1415],{"class":1388},[199,4023,1392],{"class":1384},[199,4025,4026],{"class":201,"line":474},[199,4027,4028],{"class":1384},"{% endif %}\n",[12,4030,4031],{},"Cela permet d'afficher les commentaires à l'aide du plugin. Par contre le\nproblème est que les commentaires provenant de dotclear ne sont pas\nimportés.",[12,4033,4034],{},"Du coup j'ai modifié le script d'import, pour en faire un qui importe les\ncommentaires. Il doit être lancé séparément du script d'import\ntraditionnel.",[12,4036,4037,4040],{},[199,4038,4039],{},"Voici donc le script"," permettant de récupérer les commentaires.",[1714,4042,4044],{"id":4043},"gestion-du-tag-planet-libre","Gestion du tag planet libre",[12,4046,4047],{},"Afin de pouvoir publier des articles sur le planet libre, je proposais\njusqu'ici des articles sur le planet libre à l'aide d'un tag de type\nplanet.",[12,4049,4050],{},"L'utilisation d'un tag de type planet permet de filtrer les articles\nque je souhaite mettre sur le planet libre. Par contre avec pelican,\nl'utilisation de ce tag fausse le calcul des billets liés.",[12,4052,4053],{},"Du coup j'ai décidé que la génération du flux ATOM donné au planet sera\ngénérée avec les articles qui posséderont un metatag déposé au début de\nchaque billet. Sous la présence du tag avec la valeur true, le billet est\najouté dans le flux ATOM des planets.",[12,4055,4056],{},"Pour ajouter le tag, il faut donc au début de l'article écrire le texte\nsuivant :",[191,4058,4062],{"className":4059,"code":4060,"language":4061,"meta":60,"style":60},"language-markdown shiki shiki-themes one-dark-pro","Title: Passage du site sous Pelican\nTags: dedie\nPlanet: true\n\nBonjour à tous,\n\nCela fait bien longtemps que je n'ai rien écrit sur ce site. Et pour\ncause, je suis bien occupé 😄.\n","markdown",[166,4063,4064,4069,4074,4079,4083,4088,4092,4097],{"__ignoreMap":60},[199,4065,4066],{"class":201,"line":202},[199,4067,4068],{"class":1384},"Title: Passage du site sous Pelican\n",[199,4070,4071],{"class":201,"line":208},[199,4072,4073],{"class":1384},"Tags: dedie\n",[199,4075,4076],{"class":201,"line":214},[199,4077,4078],{"class":1384},"Planet: true\n",[199,4080,4081],{"class":201,"line":221},[199,4082,218],{"emptyLinePlaceholder":217},[199,4084,4085],{"class":201,"line":255},[199,4086,4087],{"class":1384},"Bonjour à tous,\n",[199,4089,4090],{"class":201,"line":261},[199,4091,218],{"emptyLinePlaceholder":217},[199,4093,4094],{"class":201,"line":267},[199,4095,4096],{"class":1384},"Cela fait bien longtemps que je n'ai rien écrit sur ce site. Et pour\n",[199,4098,4099],{"class":201,"line":273},[199,4100,4101],{"class":1384},"cause, je suis bien occupé 😄.\n",[12,4103,4104,4105,4108,4109,42],{},"Pour ce faire j'ai écrit une extension à pelican qui génére un flux nommé\n",[166,4106,4107],{},"{OUTPUT_PATH}\u002F{TAG_FEED_ATOM}"," (avec %s remplacé par planet). Vous pouvez\ntélécharger l'",[199,4110,4111],{},"extension au lien suivant",[1714,4113,4115],{"id":4114},"création-dune-page-404","Création d'une page 404",[12,4117,4118],{},"Afin d'avoir une belle page 404 si la page n'est pas correctement trouvée\n(par exemple si certaines URLs ne correspondent plus à celle de dotclear),\nj'ai défini au niveau de pelican, la création d'une belle page 404 de la\nmanière suivante :",[191,4120,4122],{"className":3518,"code":4121,"language":3520,"meta":60,"style":60},"TEMPLATE_PAGES = {'error404.html': 'error404.html'}\n",[166,4123,4124],{"__ignoreMap":60},[199,4125,4126,4129,4131,4134,4137,4139,4141],{"class":201,"line":202},[199,4127,4128],{"class":1418},"TEMPLATE_PAGES",[199,4130,2221],{"class":2220},[199,4132,4133],{"class":1384}," {",[199,4135,4136],{"class":1425},"'error404.html'",[199,4138,2998],{"class":1384},[199,4140,4136],{"class":1425},[199,4142,1614],{"class":1384},[12,4144,4145,4146,4148,4149,4152],{},"J'ai alors créé dans le dossier ",[166,4147,3416],{}," le fichier ",[166,4150,4151],{},"error404.html"," avec\nle contenu suivant :",[191,4154,4157],{"className":4155,"code":4156,"language":3834,"meta":60,"style":60},"language-jinja2 shiki shiki-themes one-dark-pro","{% extends \"base.html\" %}\n{% block title %}Page non trouvée{% endblock %}\n{% block piwik_title %}404{% endblock %}\n{% block content %}\n\u003Csection id=\"content\">\n    \u003Cdiv id=\"content-info\">\n        \u003Ch2>Document non trouvé\u003C\u002Fh2>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"content-inner\">\n        \u003Cp>Le document que vous cherchez n'existe pas.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\u003C\u002Fsection>\n{% endblock %}\n",[166,4158,4159,4164,4169,4174,4179,4184,4189,4194,4199,4204,4209,4213,4218],{"__ignoreMap":60},[199,4160,4161],{"class":201,"line":202},[199,4162,4163],{},"{% extends \"base.html\" %}\n",[199,4165,4166],{"class":201,"line":208},[199,4167,4168],{},"{% block title %}Page non trouvée{% endblock %}\n",[199,4170,4171],{"class":201,"line":214},[199,4172,4173],{},"{% block piwik_title %}404{% endblock %}\n",[199,4175,4176],{"class":201,"line":221},[199,4177,4178],{},"{% block content %}\n",[199,4180,4181],{"class":201,"line":255},[199,4182,4183],{},"\u003Csection id=\"content\">\n",[199,4185,4186],{"class":201,"line":261},[199,4187,4188],{},"    \u003Cdiv id=\"content-info\">\n",[199,4190,4191],{"class":201,"line":267},[199,4192,4193],{},"        \u003Ch2>Document non trouvé\u003C\u002Fh2>\n",[199,4195,4196],{"class":201,"line":273},[199,4197,4198],{},"    \u003C\u002Fdiv>\n",[199,4200,4201],{"class":201,"line":279},[199,4202,4203],{},"    \u003Cdiv class=\"content-inner\">\n",[199,4205,4206],{"class":201,"line":284},[199,4207,4208],{},"        \u003Cp>Le document que vous cherchez n'existe pas.\u003C\u002Fp>\n",[199,4210,4211],{"class":201,"line":289},[199,4212,4198],{},[199,4214,4215],{"class":201,"line":451},[199,4216,4217],{},"\u003C\u002Fsection>\n",[199,4219,4220],{"class":201,"line":457},[199,4221,4222],{},"{% endblock %}\n",[12,4224,4225],{},"Enfin, comme j'utilise le serveur nginx pour servir mes pages j'ai ajouté\nla règle (toute simple) suivante pour définir ma page 404 :",[191,4227,4229],{"className":3693,"code":4228,"language":3695,"meta":60,"style":60},"error_page 404 \u002Ferror404.html;\n",[166,4230,4231],{"__ignoreMap":60},[199,4232,4233,4236,4239],{"class":201,"line":202},[199,4234,4235],{"class":1956},"error_page ",[199,4237,4238],{"class":1418},"404",[199,4240,4241],{"class":1384}," \u002Ferror404.html;\n",[1661,4243,4244],{},"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 .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}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 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 .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}",{"title":60,"searchDepth":208,"depth":208,"links":4246},[4247,4248,4249],{"id":3296,"depth":208,"text":3297},{"id":3352,"depth":208,"text":3353},{"id":3365,"depth":208,"text":3366,"children":4250},[4251,4252,4253,4254,4255,4256,4257,4258],{"id":3375,"depth":214,"text":3376},{"id":3402,"depth":214,"text":3403},{"id":3420,"depth":214,"text":3421},{"id":3498,"depth":214,"text":3499},{"id":3815,"depth":214,"text":3816},{"id":3860,"depth":214,"text":3861},{"id":4043,"depth":214,"text":4044},{"id":4114,"depth":214,"text":4115},"2013-01-12",{"type":9,"value":4261},[4262,4264,4266,4268],[12,4263,3284],{},[12,4265,3287],{},[12,4267,3290],{},[12,4269,3293],{},{"planet":217},"\u002Fpost\u002Fmigration-to-pelican",{"title":3279,"description":3284},"migration-to-pelican","posts\u002FLogiciels\u002F2013-01-12-migration-to-pelican",[1705],"RjPEE1XKQzoFIQDsH16W_XStvfsUCDU0KyWZDWKPIXs",{"id":4278,"title":4279,"author":7,"body":4280,"category":1673,"categorySlug":1674,"date":4375,"description":60,"excerpt":4376,"extension":195,"location":1698,"meta":4390,"navigation":217,"path":4391,"published":217,"seo":4392,"slug":4393,"stem":4394,"tags":4395,"timeToRead":208,"__hash__":4398},"posts\u002Fposts\u002FLogiciels\u002F2009-05-23-kmymoney-logiciel-de-compte.md","KMyMoney - Logiciel de compte",{"type":9,"value":4281,"toc":4372},[4282,4288,4291,4297,4300,4306,4315,4321,4324,4330,4337,4340,4346,4349,4355,4358],[12,4283,4284],{},[3390,4285],{"alt":4286,"src":4287},"Logo","\u002FLogiciels\u002Fkmymoney-logiciel-de-compte\u002Flogo.png",[12,4289,4290],{},"Voilà un bon logiciel sur lequel on peut compter (mouarf ! mouarf !\nmouarf !), KMyMoney est un éditeur de compte. Je l'utilise\nquotidiennement, et je décide donc d'en parler un peu, pour que d'autres\npersonnes puissent s'intéresser aussi à ce logiciel.",[12,4292,4293],{},[3390,4294],{"alt":4295,"src":4296},"Summary","\u002FLogiciels\u002Fkmymoney-logiciel-de-compte\u002FSummary.png",[12,4298,4299],{},"KMyMoney est un logiciel de gestion de compte pour particulier. Il vous\npermet de gérer plusieurs de vos comptes en banque, en vous permettant\nde saisir les dépenses et les recettes sur chacun de vos comptes.",[12,4301,4302],{},[3390,4303],{"alt":4304,"src":4305},"Registres","\u002FLogiciels\u002Fkmymoney-logiciel-de-compte\u002FRegistres.png",[12,4307,4308,4309,4314],{},"Vous pouvez également lui indiquer vos échéances (par exemple : forfait\ntéléphone, prêt immobilier",[53,4310,4311],{},[16,4312,62],{"href":57,"ariaDescribedBy":4313,"dataFootnoteRef":60,"id":61},[59],", mais aussi salaire, vos virements\ninternes ou externes, ...) qu'il s'occupera de mettre à jour dans le\nregistre automatiquement ou à votre demande.",[12,4316,4317],{},[3390,4318],{"alt":4319,"src":4320},"Echeancier","\u002FLogiciels\u002Fkmymoney-logiciel-de-compte\u002FEcheancier.png",[12,4322,4323],{},"Après une année d'utilisation, il vous permet également de sortir un\nrapport détaillé sur vos dépenses et vos recettes suivant les catégories\nsaisies pour vos opérations. Cette information peut vous être très utile\npour voir où se trouve le \"trou\" de votre porte monnaie et ainsi\nfaire une rustine. Il vous permet aussi de vous projeter vers l'avenir\net de faire votre budget pour l'année prochaine. KMyMoney vous offre\npour cela, la saisie de votre budget, ainsi que plusieurs rapports\nd'écart, vous permettant ainsi de retrouver facilement où vous avez\nfinalement dépensé plus que le budget prévu, et où vous avez dépensé\nmoins.",[12,4325,4326],{},[3390,4327],{"alt":4328,"src":4329},"Rapport","\u002FLogiciels\u002Fkmymoney-logiciel-de-compte\u002FRapport.png",[12,4331,4332,4333,4336],{},"En plus de vos comptes en banque ",[1812,4334,4335],{},"normaux",", KMyMoney vous permet\négalement de gérer vos comptes titre, et les actions que vous y avez\nmises. Vous pouvez alors facilement suivre la chute vertigineuse de la\nbourse et votre portefeuille fondre littéralement, mais aussi la\nremontée (on espère), des actions d'ici quelques ... siècles.",[12,4338,4339],{},"Enfin pour les paranos, vos comptes peuvent être cryptés à l'aide de\nvotre clé GnuPG automatiquement par KMyMoney :)",[12,4341,4342],{},[3390,4343],{"alt":4344,"src":4345},"Cryptage","\u002FLogiciels\u002Fkmymoney-logiciel-de-compte\u002FCryptage.png",[12,4347,4348],{},"Après cette courte présentation, je vous souhaite bon compte ;)",[4350,4351,4352],"blockquote",{},[12,4353,4354],{},"Pour une vie équilibrée, n'oubliez pas de profiter du soleil, au lieu\nde passer votre temps sur votre ordinateur",[12,4356,4357],{},"... en fonction des différents chiffres que vous allez lui entrer.",[1637,4359,4361,4364],{"className":4360,"dataFootnotes":60},[1640],[73,4362,1645],{"className":4363,"id":59},[1644],[1647,4365,4366],{},[87,4367,4368,4369],{"id":1651},"Il s'occupera d'ailleurs de calculer la durée des échéances, ",[16,4370,1659],{"href":1655,"ariaLabel":1656,"className":4371,"dataFootnoteBackref":60},[1658],{"title":60,"searchDepth":208,"depth":208,"links":4373},[4374],{"id":59,"depth":208,"text":1645},"2009-05-23",{"type":9,"value":4377},[4378,4382,4384,4388],[12,4379,4380],{},[3390,4381],{"alt":4286,"src":4287},[12,4383,4290],{},[12,4385,4386],{},[3390,4387],{"alt":4295,"src":4296},[12,4389,4299],{},{},"\u002Fpost\u002Fkmymoney-logiciel-de-compte",{"title":4279,"description":60},"kmymoney-logiciel-de-compte","posts\u002FLogiciels\u002F2009-05-23-kmymoney-logiciel-de-compte",[4396,4397],"kde","qt","GMoM34deHfpP44yg0dNX_5SNO5lCcgbkTT8_04fCe6c",{"id":4400,"title":4401,"author":7,"body":4402,"category":1673,"categorySlug":1674,"date":4456,"description":4406,"excerpt":4457,"extension":195,"location":1698,"meta":4475,"navigation":217,"path":4476,"published":217,"seo":4477,"slug":4478,"stem":4479,"tags":4480,"timeToRead":208,"__hash__":4482},"posts\u002Fposts\u002FLogiciels\u002F2009-04-11-kde4-devient-instable.md","KDE4 devient instable ...",{"type":9,"value":4403,"toc":4454},[4404,4407,4410,4424,4431,4434,4448,4451],[12,4405,4406],{},"Title: KDE4 devient instable ...\nTags: debian, kde, qt",[12,4408,4409],{},"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.",[12,4411,4412,4413,4416,4417,4420,4421,42],{},"Voilà quelques jours déjà que la distribution ",[1892,4414,4415],{},"Gnu\u002FDebian"," intègre\n",[1892,4418,4419],{},"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 ",[1892,4422,4423],{},"KDE\n4",[12,4425,4426,4427,4430],{},"Malheureusement pour les ",[1812,4428,4429],{},"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.",[12,4432,4433],{},"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.",[12,4435,4436,4440,4444],{},[3390,4437],{"alt":4438,"src":4439},"kaboom1","\u002FLogiciels\u002Fkde4-devient-instable\u002Fkaboom1_s.jpg",[3390,4441],{"alt":4442,"src":4443},"kaboom2","\u002FLogiciels\u002Fkde4-devient-instable\u002Fkaboom2_s.jpg",[3390,4445],{"alt":4446,"src":4447},"kaboom3","\u002FLogiciels\u002Fkde4-devient-instable\u002Fkaboom3_s.jpg",[12,4449,4450],{},"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 ...",[12,4452,4453],{},"Bonne installation,",{"title":60,"searchDepth":208,"depth":208,"links":4455},[],"2009-04-11",{"type":9,"value":4458},[4459,4461,4463,4471],[12,4460,4406],{},[12,4462,4409],{},[12,4464,4412,4465,4416,4467,4420,4469,42],{},[1892,4466,4415],{},[1892,4468,4419],{},[1892,4470,4423],{},[12,4472,4426,4473,4430],{},[1812,4474,4429],{},{},"\u002Fpost\u002Fkde4-devient-instable",{"title":4401,"description":4406},"kde4-devient-instable","posts\u002FLogiciels\u002F2009-04-11-kde4-devient-instable",[4481,4396,4397],"debian","Oj3jqh3sY77Ym6LYJ2tDQUMs5alVjGgGLz0JxRhI7k8",{"id":4484,"title":4485,"author":7,"body":4486,"category":1673,"categorySlug":1674,"date":4685,"description":4686,"excerpt":4687,"extension":195,"location":1698,"meta":4737,"navigation":217,"path":4738,"published":217,"seo":4739,"slug":4740,"stem":4741,"tags":4742,"timeToRead":208,"__hash__":4743},"posts\u002Fposts\u002FLogiciels\u002F2009-03-03-qt-4.5-est-sortie.md","Qt 4.5 est sortie",{"type":9,"value":4487,"toc":4682},[4488,4495,4500,4508,4554,4559,4583,4594,4600,4632,4646,4652],[12,4489,4490,4491,4494],{},"Voilà quelques heures que la dernière version de ",[1812,4492,4493],{},"Qt"," est sortie. Cette\nversion, numéroté 4.5, est essentiellement orienté performance.",[12,4496,4497],{},[3390,4498],{"alt":4286,"src":4499},"\u002FLogiciels\u002Fqt-4.5-est-sortie\u002Flogo_nokia_qt.png",[12,4501,4502,4503],{},"Elle contient entre autre",[53,4504,4505],{},[16,4506,62],{"href":57,"ariaDescribedBy":4507,"dataFootnoteRef":60,"id":61},[59],[84,4509,4510,4525,4531,4537,4540],{},[87,4511,4512,4513,4516,4517,4520,4521,4524],{},"Une mise à jour de ",[1812,4514,4515],{},"QtWebKit"," vers un version de ",[1812,4518,4519],{},"WebKit"," plus\nrécente (avec un nouveau moteur JavaScript plus rapide, la\npossibilité d'ajouter des greffons comme ",[1812,4522,4523],{},"Flash","...). Il est\négalement possible d'utiliser les balises d'HTML 5.",[87,4526,4527,4528,42],{},"Amélioration des performances sur le moteur de rendu ainsi que sur\nle rendu du texte. Une librairie permettant de faire des tests de\nperformance a été incluse : ",[1812,4529,4530],{},"QtBenchLib",[87,4532,4533,4534],{},"Le support de ",[1812,4535,4536],{},"Mac OS X Cocoa",[87,4538,4539],{},"La possibilité de faire des transformations XSLT",[87,4541,4542,4543,4546],{},"Un débuggeur ",[1812,4544,4545],{},"QtScript",[53,4547,4548],{},[16,4549,4553],{"href":4550,"ariaDescribedBy":4551,"dataFootnoteRef":60,"id":4552},"#user-content-fn-2",[59],"user-content-fnref-2","2",[12,4555,4556],{},[3390,4557],{"alt":4493,"src":4558},"\u002FLogiciels\u002Fqt-4.5-est-sortie\u002Fqtscript-debugger-small.png",[84,4560,4561,4568,4571,4580],{},[87,4562,4563,4564,4567],{},"Le support du format ",[1812,4565,4566],{},"OpenDocument"," (ODF version 1.0, ne supportant\nque le texte et les images)",[87,4569,4570],{},"Amélioration du support des proxys",[87,4572,4573,4574,2764,4577],{},"Amélioration de ",[1812,4575,4576],{},"QtDesigner",[1812,4578,4579],{},"QtLinguist",[87,4581,4582],{},"Une meilleur intégration au thème Gtk",[12,4584,4585,4586,4589,4590,4593],{},"Cette nouvelle version apporte également une grande nouveauté\npuisqu'elle est ",[1812,4587,4588],{},"LGPL",". Il est donc désormais possible de faire une\napplication propriétaire à l'aide de cette librairie sans prendre une\nlicence chez ",[1812,4591,4592],{},"Qt Software",". Par contre si une entreprise souhaite un\nsupport pour la librairie, il faudra tout de même acheter une licence.",[12,4595,4596],{},[3390,4597],{"alt":4598,"src":4599},"Téléchargement","\u002FLogiciels\u002Fqt-4.5-est-sortie\u002FScreenShot166.png",[12,4601,4602,4603,4605,4606,4609,4610,4612,4613,4615,4616,4619,4620,4622,4623,2764,4625,4627,4628,4631],{},"La sortie de ",[1812,4604,4493],{}," 4.5 est accompagné de ",[1812,4607,4608],{},"Qt Creator"," 1.0. ",[1812,4611,4608],{},"\nest l'outil dernier né de chez ",[1812,4614,4592],{}," (branche de ",[1812,4617,4618],{},"Nokia",") et est\nun IDE de développement de programme ",[1812,4621,4493],{},". Un paquet est proposé\ncontenant ",[1812,4624,4493],{},[1812,4626,4608],{},", ainsi que ",[1812,4629,4630],{},"MinGW"," et permettant d'avoir\nune installation tout en un d'un poste de développement.",[12,4633,4634,4635,4637,4638,4640,4641,42],{},"Vous pouvez donc aller télécharger la dernière version de ",[1812,4636,4493],{},", ainsi\nque de ",[1812,4639,4608],{}," (attention les serveurs sont surchargés) à cette\n",[16,4642,4645],{"href":4643,"rel":4644},"http:\u002F\u002Fwww.qtsoftware.com\u002Fdownloads",[25],"adresse",[12,4647,4648,4649,4651],{},"Je remercie toute l'équipe de nouvellement ",[1812,4650,4592],{}," de cette\nnouvelle version.",[1637,4653,4655,4658],{"className":4654,"dataFootnotes":60},[1640],[73,4656,1645],{"className":4657,"id":59},[1644],[1647,4659,4660,4671],{},[87,4661,4662,4663,4667,4668],{"id":1651},"pour plus de détail voir ",[16,4664,4665],{"href":4665,"rel":4666},"http:\u002F\u002Fdoc.trolltech.com\u002F4.5\u002Fqt4-5-intro.html",[25]," ",[16,4669,1659],{"href":1655,"ariaLabel":1656,"className":4670,"dataFootnoteBackref":60},[1658],[87,4672,4674,4675,4667,4677],{"id":4673},"user-content-fn-2","L'image du debugger viens du site ",[1812,4676,4592],{},[16,4678,1659],{"href":4679,"ariaLabel":4680,"className":4681,"dataFootnoteBackref":60},"#user-content-fnref-2","Back to reference 2",[1658],{"title":60,"searchDepth":208,"depth":208,"links":4683},[4684],{"id":59,"depth":208,"text":1645},"2009-03-03","Voilà quelques heures que la dernière version de Qt est sortie. Cette\nversion, numéroté 4.5, est essentiellement orienté performance.",{"type":9,"value":4688},[4689,4693,4697,4704,4733],[12,4690,4490,4691,4494],{},[1812,4692,4493],{},[12,4694,4695],{},[3390,4696],{"alt":4286,"src":4499},[12,4698,4502,4699],{},[53,4700,4701],{},[16,4702,62],{"href":57,"ariaDescribedBy":4703,"dataFootnoteRef":60,"id":61},[59],[84,4705,4706,4714,4718,4722,4724],{},[87,4707,4512,4708,4516,4710,4520,4712,4524],{},[1812,4709,4515],{},[1812,4711,4519],{},[1812,4713,4523],{},[87,4715,4527,4716,42],{},[1812,4717,4530],{},[87,4719,4533,4720],{},[1812,4721,4536],{},[87,4723,4539],{},[87,4725,4542,4726,4728],{},[1812,4727,4545],{},[53,4729,4730],{},[16,4731,4553],{"href":4550,"ariaDescribedBy":4732,"dataFootnoteRef":60,"id":4552},[59],[12,4734,4735],{},[3390,4736],{"alt":4493,"src":4558},{},"\u002Fpost\u002Fqt-4.5-est-sortie",{"title":4485,"description":4686},"qt-4.5-est-sortie","posts\u002FLogiciels\u002F2009-03-03-qt-4.5-est-sortie",[4397],"gWjLlhm92HnoKh4gr6rJd2ET4T4kKlZIkeq4_SEDikE",{"id":4745,"title":4746,"author":7,"body":4747,"category":1673,"categorySlug":1674,"date":4770,"description":60,"excerpt":4771,"extension":195,"location":1698,"meta":4772,"navigation":217,"path":4773,"published":217,"seo":4774,"slug":4775,"stem":4776,"tags":4777,"timeToRead":202,"__hash__":4778},"posts\u002Fposts\u002FLogiciels\u002F2009-03-02-le-net-en-france.md","Le net en france ...",{"type":9,"value":4748,"toc":4768},[4749,4754,4757],[4350,4750,4751],{},[12,4752,4753],{},"Devant le ridicule d'un gouvernement qui s'entête à vouloir déconnecter\ndu Net des familles entières sans preuves valables ni procès, la\nQuadrature appelle les citoyens épris de liberté à procéder au\n« black-out » de leurs sites, blogs, profils, avatars, etc. Comme en\nNouvelle-Zélande, seul pays avec la France où la « riposte graduée »\ndevait être imposée par la loi, pour finalement être repoussée : pour\nprotester contre cette loi imbécile et sa « liste blanche » de sites\nautorisés, le Net français doit agir et se draper de noir.",[12,4755,4756],{},"La quadrature du net, Paris, le 25 février",[4758,4759,4760],"center",{},[16,4761,4764],{"href":4762,"title":4763},"http:\u002F\u002Fwww.laquadrature.net\u002FHADOPI","HADOPI - Le Net en France : black-out",[3390,4765],{"src":4766,"border":4767,"alt":4763},"http:\u002F\u002Fmedia.laquadrature.net\u002FQuadrature_black-out_HADOPI_336x280px.gif",0,{"title":60,"searchDepth":208,"depth":208,"links":4769},[],"2009-03-02",null,{},"\u002Fpost\u002Fle-net-en-france",{"title":4746,"description":60},"le-net-en-france","posts\u002FLogiciels\u002F2009-03-02-le-net-en-france",[],"ycX5DqVFF5BYDBrgIjbzqu3gxFtcs6IULHX0C0scofw",{"id":4780,"title":4781,"author":7,"body":4782,"category":1673,"categorySlug":1674,"date":4884,"description":60,"excerpt":4885,"extension":195,"location":1698,"meta":4911,"navigation":217,"path":4912,"published":217,"seo":4913,"slug":4914,"stem":4915,"tags":4916,"timeToRead":214,"__hash__":4917},"posts\u002Fposts\u002FLogiciels\u002F2009-02-20-outil-de-securisation-non-interoperable.md","Outil de sécurisation non intéropérable",{"type":9,"value":4783,"toc":4881},[4784,4790,4804,4811,4816,4821,4828,4835,4840,4843,4852,4857,4860,4867],[12,4785,4786],{},[3390,4787],{"alt":4788,"src":4789},"Piracy","\u002FLogiciels\u002Foutil-de-securisation-non-interoperable\u002FDooFi_Skull.png",[12,4791,4792,4793,4796,4797,4800,4801,42],{},"Alors que l'UMP est accusé de contrefaçon du groupe\n",[199,4794,4795],{},"MGMT",", et est donc accusé du terme de ",[1812,4798,4799],{},"piratage"," selon le mot\nutilisé à mauvais escient, nous avons des nouvelles sur le ",[199,4802,4803],{},"logiciel\nespion du gouvernement",[12,4805,4806,4807,4810],{},"Ce dernier sera non seulement payant mais également non interopérable.\nPour ",[1812,4808,4809],{},"le rapporteur Riester",", l'interopérabilité est un frein au choix\net n'est pas nécessaire :",[4350,4812,4813],{},[12,4814,4815],{},"Je n’y suis pas favorable, a-t-il expliqué avant de poursuivre il\nfaut laisser au consommateur sa totale liberté de choix en fonction de\nson système d’exploitation. L’interopérabilité n’est pas nécessaire pour\nles consommateurs et elle est trop contraignante pour les éditeurs de\nlogiciels",[4350,4817,4818],{},[12,4819,4820],{},"les moyens de sécurisation mis en place ne sauraient être gratuits, à\nl’image des logiciels de contrôle parental, mis à la disposition des\nconsommateurs à titre payant, même si leur prix est modique",[12,4822,4823,4824,4827],{},"En plus de l'abonnement internet et du modem ADSL de l'opérateur, il\nfaudra également donc s'acheter ce logiciel espion, ainsi que le système\nd'exploitation ",[1812,4825,4826],{},"Redmondien"," qui va avec. En effet, aucun éditeur de\nlogiciel ne trouvera un intérêt (monétaire) à développer un tel logiciel\nespion (qui sera, de surcroit, à source fermé) pour un système\nd'exploitation libre.Comment donc pourrions-nous nous défendre, nous\nutilisateurs du logiciel libre, si vis-à-vis de la loi, nous ne pourrons\nnous justifier d'un téléchargement illégal même s'il n'en est pas le\ncas.",[12,4829,4830,4831,4834],{},"Alors que l'on parle de vente lié, ",[1812,4832,4833],{},"M. Henrard"," répond",[4350,4836,4837],{},[12,4838,4839],{},"On crée une incitation et chacun se détermine en fonction de ses\nobligations. Il y a des aléas dont on veut se protéger et si on est un\ntout petit peu rationnel, il est évident qu’on va demander à son FAI\nl’utilisation d’un tel dispositif.",[12,4841,4842],{},"et donc payer ...",[12,4844,4845,4846,4851],{},"Le président de l*'APRIL*",[53,4847,4848],{},[16,4849,62],{"href":57,"ariaDescribedBy":4850,"dataFootnoteRef":60,"id":61},[59]," s'insurge qu'",[4350,4853,4854],{},[12,4855,4856],{},"il reste encore à l'Assemblée nationale des députés qui sont opposés à\nl'interopérabilité, opposés à la libre concurrence, opposés au libre-choix\ndes utilisateurs, et opposés au logiciel libre",[12,4858,4859],{},"Quand au logiciel en lui-même, personne ne connait son fonctionnement :-\nQu'enverra-t-il comme donnée ?- A qui enverra-t-il les données (au FAI ?\nau gens plein de fric (major) ? au marketing ? au gouvernement ? à tout\nces gens ?)- Devras-t-il être sur chaque ordinateur (avec une licence\npar ordinateur à payer) ? Sur le modem ADSL ? Sur un seul des\nordinateurs (et il nous sera alors interdis d'avoir plus d'un ordinateur\npar foyer) ?",[12,4861,4862,4863,4866],{},"La France apparaitra alors surement bientôt (pour 2009) dans les pays\n",[199,4864,4865],{},"ennemis d'Internet",". Vive la république et vive la France.",[1637,4868,4870,4873],{"className":4869,"dataFootnotes":60},[1640],[73,4871,1645],{"className":4872,"id":59},[1644],[1647,4874,4875],{},[87,4876,4877,4878],{"id":1651},"Benoît Sibaud, président de l*'APRIL* ",[16,4879,1659],{"href":1655,"ariaLabel":1656,"className":4880,"dataFootnoteBackref":60},[1658],{"title":60,"searchDepth":208,"depth":208,"links":4882},[4883],{"id":59,"depth":208,"text":1645},"2009-02-20",{"type":9,"value":4886},[4887,4891,4899,4903,4907],[12,4888,4889],{},[3390,4890],{"alt":4788,"src":4789},[12,4892,4792,4893,4796,4895,4800,4897,42],{},[199,4894,4795],{},[1812,4896,4799],{},[199,4898,4803],{},[12,4900,4806,4901,4810],{},[1812,4902,4809],{},[4350,4904,4905],{},[12,4906,4815],{},[4350,4908,4909],{},[12,4910,4820],{},{},"\u002Fpost\u002Foutil-de-securisation-non-interoperable",{"title":4781,"description":60},"outil-de-securisation-non-interoperable","posts\u002FLogiciels\u002F2009-02-20-outil-de-securisation-non-interoperable",[],"M5zgP1THqf4OdrqtbfTEfuNJwbh_q3bfCRf6ItywFSk",{"id":4919,"title":4920,"author":7,"body":4921,"category":1673,"categorySlug":1674,"date":5016,"description":4925,"excerpt":5017,"extension":195,"location":1698,"meta":5046,"navigation":217,"path":5047,"published":217,"seo":5048,"slug":5049,"stem":5050,"tags":5051,"timeToRead":202,"__hash__":5052},"posts\u002Fposts\u002FLogiciels\u002F2009-02-15-debian-lenny-est-sortie.md","Debian Lenny est sortie",{"type":9,"value":4922,"toc":5013},[4923,4926,4948,4953,4962,4981,4987],[12,4924,4925],{},"Bonjours à tous,",[12,4927,4928,4929,4932,4933,4935,4936,4939,4940,4943,42],{},"Voici la grande nouvelle de ce Week-End :Hier, le jour de la ",[1892,4930,4931],{},"St\nValentin",", la distribution stable ",[1892,4934,4415],{}," est passé de ",[1892,4937,4938],{},"Etch","\nà ",[1892,4941,4942],{},"Lenny",[53,4944,4945],{},[16,4946,62],{"href":57,"ariaDescribedBy":4947,"dataFootnoteRef":60,"id":61},[59],[12,4949,4950],{},[3390,4951],{"alt":4286,"src":4952},"\u002FLogiciels\u002Fdebian-lenny-est-sortie\u002Fdebian-logo.png",[12,4954,4955,4956,4958,4959,42],{},"Cela annonce donc non seulement une nouvelle version stable de\n",[1892,4957,4415],{}," (ce qui est loin d'arriver tous les jours) mais aussi le\ndéblocage de ",[1892,4960,4961],{},"sid",[12,4963,4964,4965,4967,4968,4973,4974,4976,4977,4980],{},"Attention lors des prochaines mises à jour, ",[1892,4966,4419],{}," (ainsi que les\ndernières versions de tous les logiciels) arrivera doucement sur votre\nbureau",[53,4969,4970],{},[16,4971,4553],{"href":4550,"ariaDescribedBy":4972,"dataFootnoteRef":60,"id":4552},[59]," si vous êtes en ",[1892,4975,4961],{}," ou en ",[1892,4978,4979],{},"testing",". Cela va de\nmême pour les dernières versions du noyau qui devrait arriver également.",[12,4982,4983,4984,42],{},"La prochaine, future distribution stable (qui apparaîtra sûrement d'ici\n5 ans) sera ",[1892,4985,4986],{},"squeeze",[1637,4988,4990,4993],{"className":4989,"dataFootnotes":60},[1640],[73,4991,1645],{"className":4992,"id":59},[1644],[1647,4994,4995,5004],{},[87,4996,4997,4667,5001],{"id":1651},[16,4998,4999],{"href":4999,"rel":5000},"http:\u002F\u002Fblog.ganneff.de\u002Fblog\u002F2009\u002F02\u002F14\u002Flenny-release.html",[25],[16,5002,1659],{"href":1655,"ariaLabel":1656,"className":5003,"dataFootnoteBackref":60},[1658],[87,5005,5006,4667,5010],{"id":4673},[16,5007,5008],{"href":5008,"rel":5009},"http:\u002F\u002Fpusling.com\u002Fblog\u002F?p=94",[25],[16,5011,1659],{"href":4679,"ariaLabel":4680,"className":5012,"dataFootnoteBackref":60},[1658],{"title":60,"searchDepth":208,"depth":208,"links":5014},[5015],{"id":59,"depth":208,"text":1645},"2009-02-15",{"type":9,"value":5018},[5019,5021,5036,5040],[12,5020,4925],{},[12,5022,4928,5023,4932,5025,4935,5027,4939,5029,5031,42],{},[1892,5024,4931],{},[1892,5026,4415],{},[1892,5028,4938],{},[1892,5030,4942],{},[53,5032,5033],{},[16,5034,62],{"href":57,"ariaDescribedBy":5035,"dataFootnoteRef":60,"id":61},[59],[12,5037,5038],{},[3390,5039],{"alt":4286,"src":4952},[12,5041,4955,5042,4958,5044,42],{},[1892,5043,4415],{},[1892,5045,4961],{},{},"\u002Fpost\u002Fdebian-lenny-est-sortie",{"title":4920,"description":4925},"debian-lenny-est-sortie","posts\u002FLogiciels\u002F2009-02-15-debian-lenny-est-sortie",[4481,4396],"EsfsGGVO7y_WEe21bi9WNtGHTe0ADRHkYFuj9haww40",{"id":5054,"title":5055,"author":7,"body":5056,"category":1673,"categorySlug":1674,"date":5691,"description":5692,"excerpt":5693,"extension":195,"location":1698,"meta":5705,"navigation":217,"path":5706,"published":217,"seo":5707,"slug":5473,"stem":5708,"tags":5709,"timeToRead":221,"__hash__":5710},"posts\u002Fposts\u002FLogiciels\u002F2008-10-22-email2trac.md","Email2Trac",{"type":9,"value":5057,"toc":5684},[5058,5067,5070,5073,5085,5093,5097,5108,5113,5119,5151,5155,5173,5208,5219,5223,5238,5305,5313,5317,5320,5338,5349,5353,5371,5375,5390,5396,5401,5407,5414,5429,5435,5455,5475,5479,5485,5506,5513,5519,5531,5556,5571,5577,5583,5602,5611,5615,5618,5637,5640,5656,5681],[12,5059,5060,5062,5063,5066],{},[1812,5061,5055],{}," est un logiciel permettant de créer un ticket sous ",[1812,5064,5065],{},"Trac","\nen envoyant un mail au système de suivi de ticket.",[12,5068,5069],{},"L'intérêt d'envoyer un mail au système de suivi plutôt que de se\nconnecter sur le site Internet pour faire ses rapports d'anomalie, est\nde faciliter l'accès à de nouvelles personnes.En effet, il est parfois\nplus facile d'envoyer un mail avec son client mail préféré (en\nconsidérant que le logiciel est quasiment toujours ouvert, ce qui doit\nêtre le cas en entreprise) que d'ouvrir le navigateur pour envoyer une\nanomalie de temps en temps (ouvrir le site, se logger, remplir tous les\nchamps, ...).",[12,5071,5072],{},"Ceci peut également être utilisé par un outil de rapport de bug,\nenvoyant un mail automatique (avec confirmation de l'utilisateur) au\ncrash dudit logiciel.",[12,5074,5075,5076,5079,5084],{},"Comme dit précédemment, ",[1812,5077,5078],{},"EMail2Trac",[53,5080,5081],{},[16,5082,62],{"href":57,"ariaDescribedBy":5083,"dataFootnoteRef":60,"id":61},[59]," permet",[84,5086,5087,5090],{},[87,5088,5089],{},"d'ajouter un ticket en envoyant un mail, avec des fichiers attachés",[87,5091,5092],{},"mettre à jour un ticket (en répondant au mail du ticket par exemple)",[1714,5094,5096],{"id":5095},"installation","Installation",[12,5098,5099,5100,5102,5103,5107],{},"Pour installer ",[1812,5101,5055],{},", il faut télécharger le ",[16,5104,5106],{"href":5105},"ftp:\u002F\u002Fftp.sara.nl\u002Fpub\u002Foutgoing\u002Femail2trac.tar.gz","source"," et le\ndécompresser dans un dossier temporaire (ou utilisateur).",[5109,5110,5112],"h4",{"id":5111},"sans-gestionnaire-de-paquet","Sans gestionnaire de paquet",[12,5114,5115,5116],{},"Ensuite la compilation se fait à l'aide des habituelles ",[166,5117,5118],{},"autotools",[191,5120,5122],{"className":3436,"code":5121,"language":3438,"meta":60,"style":60},"configure --prefix=\u002Fusr\u002Flocal --with-mta_user=nobody --with-trac_user=www-data\nmake\nmake install\n",[166,5123,5124,5138,5143],{"__ignoreMap":60},[199,5125,5126,5129,5132,5135],{"class":201,"line":202},[199,5127,5128],{"class":2202},"configure",[199,5130,5131],{"class":1418}," --prefix=\u002Fusr\u002Flocal",[199,5133,5134],{"class":1418}," --with-mta_user=nobody",[199,5136,5137],{"class":1418}," --with-trac_user=www-data\n",[199,5139,5140],{"class":201,"line":208},[199,5141,5142],{"class":2202},"make\n",[199,5144,5145,5148],{"class":201,"line":214},[199,5146,5147],{"class":2202},"make",[199,5149,5150],{"class":1425}," install\n",[5109,5152,5154],{"id":5153},"sous-debian","Sous Debian",[12,5156,5157,5158,2688,5161,5164,5165,5168,5169,5172],{},"Après avoir installé les paquets ",[166,5159,5160],{},"cdbs",[166,5162,5163],{},"autotools-dev",", vous pouvez\nexécuter les commandes suivante en ",[1812,5166,5167],{},"root"," (ou la première à l'aide de\n",[1812,5170,5171],{},"fakeroot",") :",[191,5174,5176],{"className":3436,"code":5175,"language":3438,"meta":60,"style":60},"debian\u002Frules binary\ndpkg -i ..\u002Femail2trac_\u003Cversion>.deb\n",[166,5177,5178,5186],{"__ignoreMap":60},[199,5179,5180,5183],{"class":201,"line":202},[199,5181,5182],{"class":2202},"debian\u002Frules",[199,5184,5185],{"class":1425}," binary\n",[199,5187,5188,5191,5194,5197,5199,5202,5205],{"class":201,"line":208},[199,5189,5190],{"class":2202},"dpkg",[199,5192,5193],{"class":1418}," -i",[199,5195,5196],{"class":1425}," ..\u002Femail2trac_",[199,5198,1385],{"class":1384},[199,5200,5201],{"class":1425},"versio",[199,5203,5204],{"class":1384},"n>",[199,5206,5207],{"class":1425},".deb\n",[12,5209,5210,5211,5214,5215],{},"Pour le gestionnaire de paquets ",[1812,5212,5213],{},"RPM"," vous pouvez visiter la page\n",[16,5216,5217],{"href":5217,"rel":5218},"https:\u002F\u002Fsubtrac.sara.nl\u002Foss\u002Femail2trac\u002Fwiki\u002FEmail2tracInstallation",[25],[1714,5220,5222],{"id":5221},"configuration-de-lapplication","Configuration de l'application",[12,5224,5225,5226,5229,5230,5235,5236,42],{},"La deuxième étape est l'édition du fichier ",[166,5227,5228],{},"\u002Fetc\u002Femail2trac.conf",". Dans\nce fichier les informations à renseigner concerne la gestion du projet\nTrac",[53,5231,5232],{},[16,5233,4553],{"href":4550,"ariaDescribedBy":5234,"dataFootnoteRef":60,"id":4552},[59]," par ",[1812,5237,5055],{},[191,5239,5243],{"className":5240,"code":5241,"language":5242,"meta":60,"style":60},"language-ini shiki shiki-themes one-dark-pro","[DEFAULT]\nproject: \u002Fwww\u002Fsite\u002Ftrac\u002Fprojet1\nspam_level: 5\ndrop_spam: 1\nticket_update: 1\nstrip_signature: 1\n\n[projet2]\nproject: \u002Fwww\u002Fsite\u002Ftrac\u002Fprojet2\nspam_level: 5\ndrop_spam: 1\nticket_update: 1\nstrip_signature: 1\n","ini",[166,5244,5245,5250,5255,5260,5265,5270,5275,5279,5284,5289,5293,5297,5301],{"__ignoreMap":60},[199,5246,5247],{"class":201,"line":202},[199,5248,5249],{"class":2202},"[DEFAULT]\n",[199,5251,5252],{"class":201,"line":208},[199,5253,5254],{"class":1425},"project: \u002Fwww\u002Fsite\u002Ftrac\u002Fprojet1\n",[199,5256,5257],{"class":201,"line":214},[199,5258,5259],{"class":1425},"spam_level: 5\n",[199,5261,5262],{"class":201,"line":221},[199,5263,5264],{"class":1425},"drop_spam: 1\n",[199,5266,5267],{"class":201,"line":255},[199,5268,5269],{"class":1425},"ticket_update: 1\n",[199,5271,5272],{"class":201,"line":261},[199,5273,5274],{"class":1425},"strip_signature: 1\n",[199,5276,5277],{"class":201,"line":267},[199,5278,218],{"emptyLinePlaceholder":217},[199,5280,5281],{"class":201,"line":273},[199,5282,5283],{"class":2202},"[projet2]\n",[199,5285,5286],{"class":201,"line":279},[199,5287,5288],{"class":1425},"project: \u002Fwww\u002Fsite\u002Ftrac\u002Fprojet2\n",[199,5290,5291],{"class":201,"line":284},[199,5292,5259],{"class":1425},[199,5294,5295],{"class":201,"line":289},[199,5296,5264],{"class":1425},[199,5298,5299],{"class":201,"line":451},[199,5300,5269],{"class":1425},[199,5302,5303],{"class":201,"line":457},[199,5304,5274],{"class":1425},[12,5306,5307,5308,42],{},"Les différentes options dépendent de ce que vous souhaitez avoir. Les\ndifférentes possibilités sont à l'adresse ",[16,5309,5312],{"href":5310,"rel":5311},"https:\u002F\u002Fsubtrac.sara.nl\u002Foss\u002Femail2trac\u002Fwiki\u002FEmail2tracConfiguration",[25],"suivante",[5109,5314,5316],{"id":5315},"spam","Spam",[12,5318,5319],{},"La gestion du SPAM se fait à l'aide des 3 lignes :",[191,5321,5323],{"className":5240,"code":5322,"language":5242,"meta":60,"style":60},"spam_level: 5\ndrop_spam: 1\nspam_header: X-Spam-Level\n",[166,5324,5325,5329,5333],{"__ignoreMap":60},[199,5326,5327],{"class":201,"line":202},[199,5328,5259],{"class":1425},[199,5330,5331],{"class":201,"line":208},[199,5332,5264],{"class":1425},[199,5334,5335],{"class":201,"line":214},[199,5336,5337],{"class":1425},"spam_header: X-Spam-Level\n",[12,5339,5340,5341,5344,5345,5348],{},"La ligne ",[166,5342,5343],{},"spam_header"," étant à configurer suivant votre politique de\ngestion des spams (utilisation de ",[1812,5346,5347],{},"SpamAssassin"," ou d'un autre\nutilitaire).",[1714,5350,5352],{"id":5351},"configuration-de-postfix","Configuration de Postfix",[12,5354,5355,5356,5358,5359,5361,5362,5365,5366],{},"Il faut maintenant configurer notre système de messagerie pour intégrer\n",[1812,5357,5055],{},". Nous allons détailler ici la mise en place de ",[1812,5360,5055],{},"\nsous ",[1812,5363,5364],{},"Postfix",". Pour les autres serveurs mails vous pouvez visiter la\npage : ",[16,5367,5370],{"href":5368,"rel":5369},"http:\u002F\u002Fsubtrac.sara.nl\u002Foss\u002Femail2trac\u002Fwiki",[25],"http:\u002F\u002Fsubtrac.sara.nl\u002Foss\u002Femail2trac\u002Fwiki\u002FEmail2tracMta",[5109,5372,5374],{"id":5373},"aliases","Aliases",[12,5376,5377,5378,5381,5382,5385,5386,5389],{},"La première méthode concerne la modification du fichier des ",[1812,5379,5380],{},"alias"," pour\nune configuration standard de ",[1812,5383,5384],{},"postfix",". Nous allons commencer par\nmodifier le fichier ",[166,5387,5388],{},"\u002Fetc\u002Faliases"," en ajoutant la ligne suivante (pour\nle projet 1) :",[191,5391,5394],{"className":5392,"code":5393,"language":1839},[1837],"projet1: |\"\u002Fusr\u002Fbin\u002Frun_email2trac\"\n",[166,5395,5393],{"__ignoreMap":60},[12,5397,5398,5399,5172],{},"Il est également possible de préciser le projet sur lequel il faut\ntravailler (projet définit dans ",[166,5400,5228],{},[191,5402,5405],{"className":5403,"code":5404,"language":1839},[1837],"projet2: |\"\u002Fusr\u002Fbin\u002Frun_email2trac --project=projet2 --ticket_prefix=devel\"\n",[166,5406,5404],{"__ignoreMap":60},[12,5408,5409,5410,5413],{},"Dans le fichier ",[166,5411,5412],{},"\u002Fetc\u002Fpostfix\u002Fmain.cf",", il faut avoir défini\nl'emplacement des alias de la manière suivante :",[191,5415,5417],{"className":5240,"code":5416,"language":5242,"meta":60,"style":60},"alias_maps = hash:\u002Fetc\u002Faliases\n",[166,5418,5419],{"__ignoreMap":60},[199,5420,5421,5424,5426],{"class":201,"line":202},[199,5422,5423],{"class":1956},"alias_maps",[199,5425,2221],{"class":1384},[199,5427,5428],{"class":1425}," hash:\u002Fetc\u002Faliases\n",[12,5430,5431,5432,5434],{},"Les commandes suivantes permettent de mettre à jour le fichier des alias\net demander à ",[1812,5433,5364],{}," de recharger la configuration :",[191,5436,5438],{"className":3436,"code":5437,"language":3438,"meta":60,"style":60},"postaliases \u002Fetc\u002Faliases\npostfix reload\n",[166,5439,5440,5448],{"__ignoreMap":60},[199,5441,5442,5445],{"class":201,"line":202},[199,5443,5444],{"class":2202},"postaliases",[199,5446,5447],{"class":1425}," \u002Fetc\u002Faliases\n",[199,5449,5450,5452],{"class":201,"line":208},[199,5451,5384],{"class":2202},[199,5453,5454],{"class":1425}," reload\n",[12,5456,5457,5458,3839,5464,5470,5471,5474],{},"Une fois ceci terminé, les mails envoyé à ",[1812,5459,5460],{},[16,5461,5463],{"href":5462},"mailto:projet1@domain.org","projet1@domain.org",[1812,5465,5466],{},[16,5467,5469],{"href":5468},"mailto:projet2@domaine.org","projet2@domaine.org"," seront automatiquement redirigés vers ",[1812,5472,5473],{},"email2trac","\nqui s'occupera de créer le ticket dans votre système de suivi.",[5109,5476,5478],{"id":5477},"transport","Transport",[12,5480,5481,5482,5484],{},"Cette configuration concerne les personnes qui ont une configuration\nplus complexe de ",[1812,5483,5384],{}," par exemple en gérant des domaines virtuels.\nIl est alors possible de définir une redirection des tickets pour un\nsous domaine.",[12,5486,5487,5488,5491,5492,5498,5499,5505],{},"Nous avons donc créé le sous-domaine ",[1812,5489,5490],{},"tickets.domaine.org"," et voulons\nque les mails envoyés à ",[1812,5493,5494],{},[16,5495,5497],{"href":5496},"mailto:projet1@tickets.domaine.org","projet1@tickets.domaine.org"," est\n",[1812,5500,5501],{},[16,5502,5504],{"href":5503},"mailto:projet2@tickets.domaine.org","projet2@tickets.domaine.org"," soient redirigés vers email2trac.",[12,5507,5508,5509,5512],{},"Pour cela nous allons créer un fichier ",[166,5510,5511],{},"\u002Fetc\u002Fpostfix\u002Ftransport"," avec les\nlignes ci-dessous :",[191,5514,5517],{"className":5515,"code":5516,"language":1839},[1837],"projet1@tickets.domaine.org  projet1:\nprojet2@tickets.domaine.org  projet2:\n",[166,5518,5516],{"__ignoreMap":60},[12,5520,5521,5522,5524,5525,5527,5528,42],{},"Puis dans le fichier ",[166,5523,5412],{}," nous allons définir que pour\nle sous domaine ",[1812,5526,5490],{},", il faut lire et utiliser le\nfichier des transports. (Attention il ne faut pas ajouter ce\nsous-domaine dans ",[166,5529,5530],{},"mydestination",[191,5532,5534],{"className":5240,"code":5533,"language":5242,"meta":60,"style":60},"relay_domains = tickets.domaine.org\ntransport_maps = hash:\u002Fetc\u002Fpostfix\u002Ftransport\n",[166,5535,5536,5546],{"__ignoreMap":60},[199,5537,5538,5541,5543],{"class":201,"line":202},[199,5539,5540],{"class":1956},"relay_domains",[199,5542,2221],{"class":1384},[199,5544,5545],{"class":1425}," tickets.domaine.org\n",[199,5547,5548,5551,5553],{"class":201,"line":208},[199,5549,5550],{"class":1956},"transport_maps",[199,5552,2221],{"class":1384},[199,5554,5555],{"class":1425}," hash:\u002Fetc\u002Fpostfix\u002Ftransport\n",[12,5557,5558,5559,5562,5563,5566,5567,5570],{},"Ensuite, il nous faut définir dans le fichier ",[166,5560,5561],{},"\u002Fetc\u002Fpostfix\u002Fmaster.cf","\nnotre nouveau mode de transport. Il n'est pas obligé d'utiliser\n",[166,5564,5565],{},"run_email2trac"," qui fait un changement d'utilisateur, car dans le\nfichier ",[166,5568,5569],{},"master.cf"," on peut directement définir l'utilisateur de\ndestination.",[191,5572,5575],{"className":5573,"code":5574,"language":1839},[1837],"projet1      unix  -       n       n       -       -       pipe\n    flags=FR user=www-data argv=\u002Fusr\u002Fbin\u002Femail2trac\n    ${nexthop} ${user}\nprojet2      unix  -       n       n       -       -       pipe\n    flags=FR user=www-data argv=\u002Fusr\u002Fbin\u002Femail2trac\n    ${nexthop} ${user}\\r\n",[166,5576,5574],{"__ignoreMap":60},[12,5578,5579,5580,5582],{},"Enfin il faut redémarrer ",[1812,5581,5384],{}," :",[191,5584,5586],{"className":3436,"code":5585,"language":3438,"meta":60,"style":60},"postmap \u002Fetc\u002Fpostfix\u002Ftransport\npostfix reload\n",[166,5587,5588,5596],{"__ignoreMap":60},[199,5589,5590,5593],{"class":201,"line":202},[199,5591,5592],{"class":2202},"postmap",[199,5594,5595],{"class":1425}," \u002Fetc\u002Fpostfix\u002Ftransport\n",[199,5597,5598,5600],{"class":201,"line":208},[199,5599,5384],{"class":2202},[199,5601,5454],{"class":1425},[12,5603,5604,5605,42],{},"Et voilà vous pouvez envoyer vos mails à\n",[1812,5606,5607],{},[16,5608,5610],{"href":5609},"mailto:projet1@tickets.shadoware.org","projet1@tickets.shadoware.org",[1714,5612,5614],{"id":5613},"tester","Tester",[12,5616,5617],{},"Pour tester il est possible d'envoyer un mail, comme ceci :",[191,5619,5621],{"className":3436,"code":5620,"language":3438,"meta":60,"style":60},"mail projet1@tickets.shadoware.org \u003C ticket.txt\n",[166,5622,5623],{"__ignoreMap":60},[199,5624,5625,5628,5631,5634],{"class":201,"line":202},[199,5626,5627],{"class":2202},"mail",[199,5629,5630],{"class":1425}," projet1@tickets.shadoware.org",[199,5632,5633],{"class":1384}," \u003C ",[199,5635,5636],{"class":1425},"ticket.txt\n",[12,5638,5639],{},"En cas de problème, vous pouvez vérifier que email2trac est bien\nconfiguré avec la commande :",[191,5641,5643],{"className":3436,"code":5642,"language":3438,"meta":60,"style":60},"email2trac --project=projet1 \u003C ticket.txt\n",[166,5644,5645],{"__ignoreMap":60},[199,5646,5647,5649,5652,5654],{"class":201,"line":202},[199,5648,5473],{"class":2202},[199,5650,5651],{"class":1418}," --project=projet1",[199,5653,5633],{"class":1384},[199,5655,5636],{"class":1425},[1637,5657,5659,5662],{"className":5658,"dataFootnotes":60},[1640],[73,5660,1645],{"className":5661,"id":59},[1644],[1647,5663,5664,5672],{},[87,5665,5666,4667,5669],{"id":1651},[16,5667,5370],{"href":5368,"rel":5668},[25],[16,5670,1659],{"href":1655,"ariaLabel":1656,"className":5671,"dataFootnoteBackref":60},[1658],[87,5673,5674,4667,5678],{"id":4673},[16,5675,5676],{"href":5676,"rel":5677},"http:\u002F\u002Ftrac.edgewall.org\u002F",[25],[16,5679,1659],{"href":4679,"ariaLabel":4680,"className":5680,"dataFootnoteBackref":60},[1658],[1661,5682,5683],{},"html pre.shiki code .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}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);}html pre.shiki code .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}html pre.shiki code .seHd6, html code.shiki .seHd6{--shiki-default:#C678DD}",{"title":60,"searchDepth":208,"depth":208,"links":5685},[5686,5687,5688,5689,5690],{"id":5095,"depth":214,"text":5096},{"id":5221,"depth":214,"text":5222},{"id":5351,"depth":214,"text":5352},{"id":5613,"depth":214,"text":5614},{"id":59,"depth":208,"text":1645},"2008-10-22","Email2Trac est un logiciel permettant de créer un ticket sous Trac\nen envoyant un mail au système de suivi de ticket.",{"type":9,"value":5694},[5695,5701,5703],[12,5696,5697,5062,5699,5066],{},[1812,5698,5055],{},[1812,5700,5065],{},[12,5702,5069],{},[12,5704,5072],{},{},"\u002Fpost\u002Femail2trac",{"title":5055,"description":5692},"posts\u002FLogiciels\u002F2008-10-22-email2trac",[4481,1705],"llLWYwDr2WQzswEZDA9vDYeLWcGqHIhabMKl6VUmCmo",{"id":5712,"title":5713,"author":7,"body":5714,"category":1673,"categorySlug":1674,"date":5845,"description":5846,"excerpt":5847,"extension":195,"location":1698,"meta":5862,"navigation":217,"path":5863,"published":217,"seo":5864,"slug":5865,"stem":5866,"tags":5867,"timeToRead":202,"__hash__":5868},"posts\u002Fposts\u002FLogiciels\u002F2008-10-19-nouvelles-fonctionnalites-de-qt-designer-45.md","Nouvelles fonctionnalités de Qt Designer 4.5",{"type":9,"value":5715,"toc":5842},[5716,5732,5735,5741,5747,5750,5756,5759,5801,5807,5810,5815,5818,5824],[12,5717,5718,5719,5726,5727,42],{},"Sur ",[1812,5720,5721,5725],{},[5722,5723,5724],"strike",{},"Trolltech","Nokia Labs Blogs",", Friedelann Kleint nous\nprésente aujourd'hui les nouvelles fonctionnalités de Qt Designer 4.5",[53,5728,5729],{},[16,5730,62],{"href":57,"ariaDescribedBy":5731,"dataFootnoteRef":60,"id":61},[59],[12,5733,5734],{},"Au menu, on peut trouver l'ajout de filtre sur l'éditeur de propriétés\nainsi que sur l'inspecteur d'objet (Ce qui peut permettre de\nsélectionner un composant et d'en modifier les propriétés plus\nrapidement).",[12,5736,5737],{},[3390,5738],{"alt":5739,"src":5740},"objectinspector","\u002FLogiciels\u002Fnouvelles-fonctionnalites-de-qt-designer-45\u002Fobjectinspector.png",[12,5742,5743],{},[3390,5744],{"alt":5745,"src":5746},"propertyeditorfilter","\u002FLogiciels\u002Fnouvelles-fonctionnalites-de-qt-designer-45\u002Fpropertyeditorfilter.png",[12,5748,5749],{},"L'arrangement de la boite à outil est également différent :",[12,5751,5752],{},[3390,5753],{"alt":5754,"src":5755},"widgetbox_iconmode","\u002FLogiciels\u002Fnouvelles-fonctionnalites-de-qt-designer-45\u002Fwidgetbox_iconmode.png",[12,5757,5758],{},"De plus il est maintenant possible de :",[84,5760,5761,5772,5782,5789,5796,5799],{},[87,5762,5763,5764,5767,5768,5771],{},"Sélectionner l'objet ancêtre d'un ",[1812,5765,5766],{},"widget"," en sélectionnant ",[1812,5769,5770],{},"Select\nancestors"," du menu contextuel.",[87,5773,5774,5775,5778,5779,5781],{},"Changer le ",[1812,5776,5777],{},"Layout"," sans casser et reconstruire le ",[1812,5780,5777],{}," de la\nfeuille",[87,5783,5784,5785,5788],{},"Ajouter facilement une nouvelle ligne au layout (L'action ",[1812,5786,5787],{},"Add form\nlayout row"," ouvrant la boite de dialogue ci-dessous)",[87,5790,5791,5792,5795],{},"Créer des Assistants (",[1812,5793,5794],{},"Wizard",") linéaires",[87,5797,5798],{},"Désactiver la traduction de certaine chaîne.",[87,5800,1283],{},[12,5802,5803],{},[3390,5804],{"alt":5805,"src":5806},"formlayout","\u002FLogiciels\u002Fnouvelles-fonctionnalites-de-qt-designer-45\u002Fformlayout.png",[12,5808,5809],{},"Enfin, pour terminer, comme le dit Friedemann",[4350,5811,5812],{},[12,5813,5814],{},"The general focus of the 4.5 release is on stability and performance.",[12,5816,5817],{},"Soit : Le but principal de la version 4.5 est la stabilité et les\nperformances.",[12,5819,5820,5821,42],{},"Pour plus de précision, je vous conseille d'aller voir la page d'origine\net\u002Fou de télécharger la ",[1812,5822,5823],{},"snapshot",[1637,5825,5827,5830],{"className":5826,"dataFootnotes":60},[1640],[73,5828,1645],{"className":5829,"id":59},[1644],[1647,5831,5832],{},[87,5833,5834,5835,4667,5839],{"id":1651},"Référence : ",[16,5836,5837],{"href":5837,"rel":5838},"http:\u002F\u002Flabs.trolltech.com\u002Fblogs\u002F2008\u002F10\u002F16\u002Fnew-features-of-qt-designer-45\u002F",[25],[16,5840,1659],{"href":1655,"ariaLabel":1656,"className":5841,"dataFootnoteBackref":60},[1658],{"title":60,"searchDepth":208,"depth":208,"links":5843},[5844],{"id":59,"depth":208,"text":1645},"2008-10-19","Sur TrolltechNokia Labs Blogs, Friedelann Kleint nous\nprésente aujourd'hui les nouvelles fonctionnalités de Qt Designer 4.51.",{"type":9,"value":5848},[5849,5860],[12,5850,5718,5851,5726,5855,42],{},[1812,5852,5853,5725],{},[5722,5854,5724],{},[53,5856,5857],{},[16,5858,62],{"href":57,"ariaDescribedBy":5859,"dataFootnoteRef":60,"id":61},[59],[12,5861,5734],{},{},"\u002Fpost\u002Fnouvelles-fonctionnalites-de-qt-designer-45",{"title":5713,"description":5846},"nouvelles-fonctionnalites-de-qt-designer-45","posts\u002FLogiciels\u002F2008-10-19-nouvelles-fonctionnalites-de-qt-designer-45",[4397],"nm-5nCtyIY7ytRcB2NS0B1KwbYlYkEMuv_OrrHl_gZI",{"id":5870,"title":5871,"author":7,"body":5872,"category":1673,"categorySlug":1674,"date":5961,"description":5962,"excerpt":4771,"extension":195,"location":1698,"meta":5963,"navigation":217,"path":5964,"published":217,"seo":5965,"slug":5966,"stem":5967,"tags":5968,"timeToRead":202,"__hash__":5969},"posts\u002Fposts\u002FLogiciels\u002F2008-10-06-qt-442-puis-qt-443-sont-sorties.md","QT 4.4.2 puis QT 4.4.3 sont sorties",{"type":9,"value":5873,"toc":5958},[5874,5879,5896,5917,5920,5935],[12,5875,5876,5877,42],{},"En une semaine sont sortie les versions 4.4.2 et 4.4.3 de ",[1812,5878,4493],{},[12,5880,5881,5882,5885,5886,5890,5891,5893,5894,42],{},"La version 4.4.2 corrige de nombreux bugs (dont des fuites mémoires sur\nla partie ",[1812,5883,5884],{},"XmlPatterns","). Vous pouvez trouver la listes des changements\n",[16,5887,5889],{"href":5888},"\u002FLogiciels\u002Fqt-442-puis-qt-443-sont-sorties\u002Fchanges-4.4.2","à cette adresse",", ou dans l'archive ",[1812,5892,4493],{}," se trouvant sur le site\n",[1812,5895,5724],{},[12,5897,5898,5899,5904,5905,5235,5907,5909,5910,5912,5913,959],{},"La version 4.4.3",[53,5900,5901],{},[16,5902,62],{"href":57,"ariaDescribedBy":5903,"dataFootnoteRef":60,"id":61},[59]," modifie chaque entête de fichiers, les icônes,\n... pour refléter l'achat de ",[1812,5906,5724],{},[1812,5908,4618],{},". Par la même\noccasion le site de ",[1812,5911,5724],{}," a été complètement refait\n(",[16,5914,5915],{"href":5915,"rel":5916},"http:\u002F\u002Ftrolltech.com",[25],[12,5918,5919],{},"Donc si vous avez la version 4.4.2, il n'est pas nécessaire de récupérer\nla 4.4.3 (sauf si vous souhaiter absolument la dernière version au nom\nde Nokia), par contre si vous êtes encore à la version 4.4.0 ou 4.4.1,\nil peut être intéressant d'installer la dernière version (suivant les\nfonctionnalités que vous utilisez).",[12,5921,5922,5923,5925,5926,5928,5929,5934],{},"Enfin, la question, sans réponse, est, est-ce que le site de ",[1812,5924,5724],{},"\net de ",[1812,5927,4618],{}," vont fusionner ou vont-il rester séparer",[53,5930,5931],{},[16,5932,4553],{"href":4550,"ariaDescribedBy":5933,"dataFootnoteRef":60,"id":4552},[59]," ?",[1637,5936,5938,5941],{"className":5937,"dataFootnotes":60},[1640],[73,5939,1645],{"className":5940,"id":59},[1644],[1647,5942,5943,5952],{},[87,5944,5945,4667,5949],{"id":1651},[16,5946,5947],{"href":5947,"rel":5948},"http:\u002F\u002Ftrolltech.com\u002Fabout\u002Fnews\u002Fqt-4.4.3-released",[25],[16,5950,1659],{"href":1655,"ariaLabel":1656,"className":5951,"dataFootnoteBackref":60},[1658],[87,5953,5954,5955],{"id":4673},"ce dernier est tout de même plus pratique, je trouve ",[16,5956,1659],{"href":4679,"ariaLabel":4680,"className":5957,"dataFootnoteBackref":60},[1658],{"title":60,"searchDepth":208,"depth":208,"links":5959},[5960],{"id":59,"depth":208,"text":1645},"2008-10-06","En une semaine sont sortie les versions 4.4.2 et 4.4.3 de Qt.",{},"\u002Fpost\u002Fqt-442-puis-qt-443-sont-sorties",{"title":5871,"description":5962},"qt-442-puis-qt-443-sont-sorties","posts\u002FLogiciels\u002F2008-10-06-qt-442-puis-qt-443-sont-sorties",[4397],"TNEywWz-ZtPa5b6pfMVBEL9D98bBfXfM5LASdSKmk7E",{"id":5971,"title":5972,"author":7,"body":5973,"category":1673,"categorySlug":1674,"date":5993,"description":1720,"excerpt":4771,"extension":195,"location":1698,"meta":5994,"navigation":217,"path":5995,"published":217,"seo":5996,"slug":5997,"stem":5998,"tags":5999,"timeToRead":202,"__hash__":6000},"posts\u002Fposts\u002FLogiciels\u002F2008-02-18-mises-a-jour-gnu-debian-recentes.md","Mises à jour Gnu\u002FDebian récentes",{"type":9,"value":5974,"toc":5991},[5975,5977,5980,5988],[12,5976,1720],{},[12,5978,5979],{},"La distribution GNU\u002FDebian propose une nouvelle mise à jour pour sa\nversion etch. Les points importants que je remarque, sont",[84,5981,5982,5985],{},[87,5983,5984],{},"la correction de la faille sur le noyau Linux pour toutes les\nmachines serveurs : Veillez à bien mettre à jour votre noyau car\nmême si vous ne proposez pas de compte aux utilisateurs, l'escalade\nde privilèges peut intervenir dans une faille de sécurité de votre\nsite Internet (cf de l'injection de code).",[87,5986,5987],{},"la mise à jour de KDE, qui désormais permet à Konqueror de charger\nle plugin flash non libre.",[12,5989,5990],{},"Bien sûr, cette mise à jour propose également d'autres corrections de\nBug et mise à jour de sécurité, ainsi que la suppression de certains\npaquets (soit trop miné\u002Fbuggé, soit propriétaire). On peut par ailleurs\nretrouver le plugin flash dans les backports",{"title":60,"searchDepth":208,"depth":208,"links":5992},[],"2008-02-18",{},"\u002Fpost\u002Fmises-a-jour-gnu-debian-recentes",{"title":5972,"description":1720},"mises-a-jour-gnu-debian-recentes","posts\u002FLogiciels\u002F2008-02-18-mises-a-jour-gnu-debian-recentes",[4481],"GM6W6GPMbuROhvLrd5-UfzUhAflxM9pIgnr1TX720ek",1777582402654]