Repository with sources and generator of https://larlet.fr/david/ https://larlet.fr/david/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.html 37KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852
  1. <!doctype html><!-- This is a valid HTML5 document. -->
  2. <!-- Screen readers, SEO, extensions and so on. -->
  3. <html lang=fr>
  4. <!-- Has to be within the first 1024 bytes, hence before the <title>
  5. See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
  6. <meta charset=utf-8>
  7. <!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
  8. <!-- The viewport meta is quite crowded and we are responsible for that.
  9. See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
  10. <meta name=viewport content="width=device-width,minimum-scale=1,initial-scale=1,shrink-to-fit=no">
  11. <!-- Required to make a valid HTML5 document. -->
  12. <title>Opendata et liens cassés — David Larlet</title>
  13. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  14. <link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons/apple-touch-icon.png">
  15. <link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons/favicon-32x32.png">
  16. <link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons/favicon-16x16.png">
  17. <link rel="manifest" href="/manifest.json">
  18. <link rel="mask-icon" href="/static/david/icons/safari-pinned-tab.svg" color="#5bbad5">
  19. <link rel="shortcut icon" href="/static/david/icons/favicon.ico">
  20. <meta name="apple-mobile-web-app-title" content="David Larlet">
  21. <meta name="application-name" content="David Larlet">
  22. <meta name="msapplication-TileColor" content="#da532c">
  23. <meta name="msapplication-config" content="/static/david/icons/browserconfig.xml">
  24. <meta name="theme-color" content="#f0f0ea">
  25. <!-- That good ol' feed, subscribe :p. -->
  26. <link rel=alternate type="application/atom+xml" title=Feed href="/david/log/">
  27. <!-- Canonical URL for SEO purposes -->
  28. <link rel="canonical" href="https://larlet.fr/david/blog/2016/opendata-liens-casses/">
  29. <!-- SEO/Semantic metadata -->
  30. <meta name="description" content="Le Web est un mandala sur lequel on souffle en continu." />
  31. <meta name="twitter:description" property="og:description" itemprop="description" content="Le Web est un mandala sur lequel on souffle en continu." />
  32. <meta name="twitter:title" property="og:title" itemprop="name" content="Opendata et liens cassés" />
  33. <meta name="twitter:card" content="summary" />
  34. <meta name="twitter:creator" content="@davidbgk" />
  35. <meta name="twitter:url" property="og:url" content="https://larlet.fr/david/blog/2016/opendata-liens-casses/" />
  36. <meta property="og:type" content="article" />
  37. <meta property="og:site_name" content="David Larlet (@davidbgk)" />
  38. <meta name="twitter:image" property="og:image" itemprop="image" content="https://larlet.fr/static/david/blog/2016/opendata-liens-casses.jpg" />
  39. <style>
  40. /* http://meyerweb.com/eric/tools/css/reset/ */
  41. html, body, div, span,
  42. h1, h2, h3, h4, h5, h6, p, blockquote, pre,
  43. a, abbr, address, big, cite, code,
  44. del, dfn, em, img, ins,
  45. small, strike, strong, tt, var,
  46. dl, dt, dd, ol, ul, li,
  47. fieldset, form, label, legend,
  48. table, caption, tbody, tfoot, thead, tr, th, td,
  49. article, aside, canvas, details, embed,
  50. figure, figcaption, footer, header, hgroup,
  51. menu, nav, output, ruby, section, summary,
  52. time, mark, audio, video {
  53. margin: 0;
  54. padding: 0;
  55. border: 0;
  56. font-size: 100%;
  57. font: inherit;
  58. vertical-align: baseline;
  59. }
  60. /* HTML5 display-role reset for older browsers */
  61. article, aside, details, figcaption, figure,
  62. footer, header, hgroup, menu, nav, section { display: block; }
  63. body { line-height: 1; }
  64. blockquote, q { quotes: none; }
  65. blockquote:before, blockquote:after,
  66. q:before, q:after {
  67. content: '';
  68. content: none;
  69. }
  70. table {
  71. border-collapse: collapse;
  72. border-spacing: 0;
  73. }
  74. /* http://practicaltypography.com/equity.html */
  75. /* https://calendar.perfplanet.com/2016/no-font-face-bulletproof-syntax/ */
  76. /* https://www.filamentgroup.com/lab/js-web-fonts.html */
  77. @font-face {
  78. font-family: 'EquityTextB';
  79. src: url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff2') format('woff2'),
  80. url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff') format('woff');
  81. font-weight: 300;
  82. font-style: normal;
  83. font-display: swap;
  84. }
  85. @font-face {
  86. font-family: 'EquityTextB';
  87. src: url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff2') format('woff2'),
  88. url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff') format('woff');
  89. font-weight: 300;
  90. font-style: italic;
  91. font-display: swap;
  92. }
  93. @font-face {
  94. font-family: 'EquityTextB';
  95. src: url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff2') format('woff2'),
  96. url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff') format('woff');
  97. font-weight: 700;
  98. font-style: normal;
  99. font-display: swap;
  100. }
  101. @font-face {
  102. font-family: 'ConcourseT3';
  103. src: url('/static/david/css/fonts/concourse_t3_regular-webfont-20190806.woff2') format('woff2'),
  104. url('/static/david/css/fonts/concourse_t3_regular-webfont-20190806.woff') format('woff');
  105. font-weight: 300;
  106. font-style: normal;
  107. font-display: swap;
  108. }
  109. /* http://practice.typekit.com/lesson/caring-about-opentype-features/ */
  110. body {
  111. /* http://www.cssfontstack.com/ Palatino 99% Win 86% Mac */
  112. font-family: "EquityTextB", Palatino, serif;
  113. background-color: #f0f0ea;
  114. color: #07486c;
  115. font-kerning: normal;
  116. -moz-osx-font-smoothing: grayscale;
  117. -webkit-font-smoothing: subpixel-antialiased;
  118. text-rendering: optimizeLegibility;
  119. font-variant-ligatures: common-ligatures contextual;
  120. font-feature-settings: "kern", "liga", "clig", "calt";
  121. }
  122. pre, code, kbd, samp, var, tt {
  123. font-family: 'TriplicateT4c', monospace;
  124. }
  125. em {
  126. font-style: italic;
  127. color: #323a45;
  128. }
  129. strong {
  130. font-weight: bold;
  131. color: black;
  132. }
  133. nav {
  134. background-color: #323a45;
  135. color: #f0f0ea;
  136. display: flex;
  137. justify-content: space-around;
  138. padding: 1rem .5rem;
  139. }
  140. nav:last-child {
  141. border-bottom: 1vh solid #2d7474;
  142. }
  143. nav a {
  144. color: #f0f0ea;
  145. }
  146. nav abbr {
  147. border-bottom: 1px dotted white;
  148. }
  149. h1 {
  150. border-top: 1vh solid #2d7474;
  151. border-bottom: .2vh dotted #2d7474;
  152. background-color: #e3e1e1;
  153. color: #323a45;
  154. text-align: center;
  155. padding: 5rem 0 4rem 0;
  156. width: 100%;
  157. font-family: 'ConcourseT3';
  158. display: flex;
  159. flex-direction: column;
  160. }
  161. h1.single {
  162. padding-bottom: 10rem;
  163. }
  164. h1 span {
  165. position: absolute;
  166. top: 1vh;
  167. left: 20%;
  168. line-height: 0;
  169. }
  170. h1 span a {
  171. line-height: 1.7;
  172. padding: 1rem 1.2rem .6rem 1.2rem;
  173. border-radius: 0 0 6% 6%;
  174. background: #2d7474;
  175. font-size: 1.3rem;
  176. color: white;
  177. text-decoration: none;
  178. }
  179. h2 {
  180. margin: 4rem 0 1rem;
  181. border-top: .2vh solid #2d7474;
  182. padding-top: 1vh;
  183. }
  184. h3 {
  185. text-align: center;
  186. margin: 3rem 0 .75em;
  187. }
  188. hr {
  189. height: .4rem;
  190. width: .4rem;
  191. border-radius: .4rem;
  192. background: #07486c;
  193. margin: 2.5rem auto;
  194. }
  195. time {
  196. display: bloc;
  197. margin-left: 0 !important;
  198. }
  199. ul, ol {
  200. margin: 2rem;
  201. }
  202. ul {
  203. list-style-type: square;
  204. }
  205. a {
  206. text-decoration-skip-ink: auto;
  207. text-decoration-thickness: 0.05em;
  208. text-underline-offset: 0.09em;
  209. }
  210. article {
  211. max-width: 50rem;
  212. display: flex;
  213. flex-direction: column;
  214. margin: 2rem auto;
  215. }
  216. article.single {
  217. border-top: .2vh dotted #2d7474;
  218. margin: -6rem auto 1rem auto;
  219. background: #f0f0ea;
  220. padding: 2rem;
  221. }
  222. article p:last-child {
  223. margin-bottom: 1rem;
  224. }
  225. p {
  226. padding: 0 .5rem;
  227. margin-left: 3rem;
  228. }
  229. p + p,
  230. figure + p {
  231. margin-top: 2rem;
  232. }
  233. blockquote {
  234. background-color: #e3e1e1;
  235. border-left: .5vw solid #2d7474;
  236. display: flex;
  237. flex-direction: column;
  238. align-items: center;
  239. padding: 1rem;
  240. margin: 1.5rem;
  241. }
  242. blockquote cite {
  243. font-style: italic;
  244. }
  245. blockquote p {
  246. margin-left: 0;
  247. }
  248. figure {
  249. border-top: .2vh solid #2d7474;
  250. background-color: #e3e1e1;
  251. text-align: center;
  252. padding: 1.5rem 0;
  253. margin: 1rem 0 0;
  254. font-size: 1.5rem;
  255. width: 100%;
  256. }
  257. figure img {
  258. max-width: 250px;
  259. max-height: 250px;
  260. border: .5vw solid #323a45;
  261. padding: 1px;
  262. }
  263. figcaption {
  264. padding: 1rem;
  265. line-height: 1.4;
  266. }
  267. aside {
  268. display: flex;
  269. flex-direction: column;
  270. background-color: #e3e1e1;
  271. padding: 1rem 0;
  272. border-bottom: .2vh solid #07486c;
  273. }
  274. aside p {
  275. max-width: 50rem;
  276. margin: 0 auto;
  277. }
  278. /* https://fvsch.com/code/css-locks/ */
  279. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  280. font-size: 1rem;
  281. line-height: calc( 1.5em + 0.2 * 1rem );
  282. }
  283. h1 {
  284. font-size: 1.9rem;
  285. line-height: calc( 1.2em + 0.2 * 1rem );
  286. }
  287. h2 {
  288. font-size: 1.6rem;
  289. line-height: calc( 1.3em + 0.2 * 1rem );
  290. }
  291. h3 {
  292. font-size: 1.35rem;
  293. line-height: calc( 1.4em + 0.2 * 1rem );
  294. }
  295. @media (min-width: 20em) {
  296. /* The (100vw - 20rem) / (50 - 20) part
  297. resolves to 0-1rem, depending on the
  298. viewport width (between 20em and 50em). */
  299. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  300. font-size: calc( 1rem + .6 * (100vw - 20rem) / (50 - 20) );
  301. line-height: calc( 1.5em + 0.2 * (100vw - 50rem) / (20 - 50) );
  302. margin-left: 0;
  303. }
  304. h1 {
  305. font-size: calc( 1.9rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  306. line-height: calc( 1.2em + 0.2 * (100vw - 50rem) / (20 - 50) );
  307. }
  308. h2 {
  309. font-size: calc( 1.5rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  310. line-height: calc( 1.3em + 0.2 * (100vw - 50rem) / (20 - 50) );
  311. }
  312. h3 {
  313. font-size: calc( 1.35rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  314. line-height: calc( 1.4em + 0.2 * (100vw - 50rem) / (20 - 50) );
  315. }
  316. }
  317. @media (min-width: 50em) {
  318. /* The right part of the addition *must* be a
  319. rem value. In this example we *could* change
  320. the whole declaration to font-size:2.5rem,
  321. but if our baseline value was not expressed
  322. in rem we would have to use calc. */
  323. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  324. font-size: calc( 1rem + .6 * 1rem );
  325. line-height: 1.5em;
  326. }
  327. p, li, pre, details {
  328. margin-left: 3rem;
  329. }
  330. h1 {
  331. font-size: calc( 1.9rem + 1.5 * 1rem );
  332. line-height: 1.2em;
  333. }
  334. h2 {
  335. font-size: calc( 1.5rem + 1.5 * 1rem );
  336. line-height: 1.3em;
  337. }
  338. h3 {
  339. font-size: calc( 1.35rem + 1.5 * 1rem );
  340. line-height: 1.4em;
  341. }
  342. figure img {
  343. max-width: 500px;
  344. max-height: 500px;
  345. }
  346. }
  347. figure.unsquared {
  348. margin-bottom: 1.5rem;
  349. }
  350. figure.unsquared img {
  351. height: inherit;
  352. }
  353. @media print {
  354. body { font-size: 100%; }
  355. a:after { content: " (" attr(href) ")"; }
  356. a, a:link, a:visited, a:after {
  357. text-decoration: underline;
  358. text-shadow: none !important;
  359. background-image: none !important;
  360. background: white;
  361. color: black;
  362. }
  363. abbr[title] { border-bottom: 0; }
  364. abbr[title]:after { content: " (" attr(title) ")"; }
  365. img { page-break-inside: avoid; }
  366. @page { margin: 2cm .5cm; }
  367. h1, h2, h3 { page-break-after: avoid; }
  368. p3 { orphans: 3; widows: 3; }
  369. img {
  370. max-width: 250px !important;
  371. max-height: 250px !important;
  372. }
  373. nav, aside { display: none; }
  374. }
  375. ul.with_columns {
  376. column-count: 1;
  377. }
  378. @media (min-width: 20em) {
  379. ul.with_columns {
  380. column-count: 2;
  381. }
  382. }
  383. @media (min-width: 50em) {
  384. ul.with_columns {
  385. column-count: 3;
  386. }
  387. }
  388. ul.with_two_columns {
  389. column-count: 1;
  390. }
  391. @media (min-width: 20em) {
  392. ul.with_two_columns {
  393. column-count: 1;
  394. }
  395. }
  396. @media (min-width: 50em) {
  397. ul.with_two_columns {
  398. column-count: 2;
  399. }
  400. }
  401. .gallery {
  402. display: flex;
  403. flex-wrap: wrap;
  404. justify-content: space-around;
  405. }
  406. .gallery figure img {
  407. margin-left: 1rem;
  408. margin-right: 1rem;
  409. }
  410. .gallery figure figcaption {
  411. font-family: 'ConcourseT3'
  412. }
  413. footer {
  414. font-family: 'ConcourseT3';
  415. display: flex;
  416. flex-direction: column;
  417. border-top: 3px solid white;
  418. padding: 4rem 0;
  419. background-color: #07486c;
  420. color: white;
  421. }
  422. footer > * {
  423. max-width: 50rem;
  424. margin: 0 auto;
  425. }
  426. footer a {
  427. color: #f1c40f;
  428. }
  429. footer .avatar {
  430. width: 200px;
  431. height: 200px;
  432. border-radius: 50%;
  433. float: left;
  434. -webkit-shape-outside: circle();
  435. shape-outside: circle();
  436. margin-right: 2rem;
  437. padding: 2px 5px 5px 2px;
  438. background: white;
  439. border-left: 1px solid #f1c40f;
  440. border-top: 1px solid #f1c40f;
  441. border-right: 5px solid #f1c40f;
  442. border-bottom: 5px solid #f1c40f;
  443. }
  444. </style>
  445. <h1 class="single">
  446. <span><a id="jumper" href="#jumpto" title="Un peu perdu ?">?</a></span>
  447. Opendata et liens cassés
  448. <time>Publié le 26 février 2016</time>
  449. </h1>
  450. <article class="single">
  451. <p><em>Ceci est un résumé de mon intervention à <a href="https://confoo.ca">Confoo</a>.</em></p>
  452. <blockquote>
  453. <p>The quantity and variety of information we now produce has outpaced our ability to preserve it for the future. Librarians are the only ones who are making sure that our collective memory is preserved. And they, along with small teams of digital historians elsewhere, are still trying to understand the scope of myriad challenges involved in modern preservation. If today’s born-digital news stories are not automatically put into library storehouses, these stories are unlikely to survive in an accessible way.</p>
  454. <p><cite><em><a href="http://www.theatlantic.com/technology/archive/2015/11/the-irony-of-writing-about-digital-preservation/416184/">The Irony of Writing About Digital Preservation</a></em> (<a href="/david/cache/b74e15baff22ce27ad96166f56bdff36/">cache</a>)</cite></p>
  455. </blockquote>
  456. <p><strong>Le Web est un mandala sur lequel on souffle en continu.</strong> Nous serons potentiellement tous jugés pour crime contre le Web à force de participer à des <a href="/david/biologeek/archives/20091202-discussions-sur-les-applications-web-libres/">datacides</a> en cassant volontairement des liens. Que faire individuellement et collectivement pour en prendre conscience et inverser la tendance ?</p>
  457. <h2>Obsolescence numérique</h2>
  458. <blockquote>
  459. <p>In addition to improving the usability of the temporal web and helping to ensure the preservation of collective cultural heritage, designing for archivability will also tend to optimize your website for access by other crawlers, boost website performance, enhance usability for contemporary users, and improve the likelihood that you’ll be able to refer to and/or recover historical versions of your own web content.</p>
  460. <p><cite><em><a href="https://library.stanford.edu/projects/web-archiving/archivability">Stanford University Libraries</a></em> (<a href="/david/cache/5aa82a2b410df7ea8a2debd82d0502c4/">cache</a>)</cite></p>
  461. </blockquote>
  462. <p>Je ne vais pas reprendre les arguments <a href="/david/blog/2014/un-web-omni-present/">déjà détaillés par ailleurs</a>, la question n’est plus de savoir si vos données vont être hackées et/ou perdues mais quand. Est-ce qu’il s’agira d’un accident ? D’une attaque frontale ? D’un manque de soin apporté aux données ? D’une décision stratégico-économique ? D’une revente ?</p>
  463. <p>Quelle qu’en soit la raison, il faut apprendre à vivre avec.</p>
  464. <h2>Cacher le Web</h2>
  465. <blockquote>
  466. <p>The ability to follow links down and around and through an idea, landing hours later on some random Wikipedia page about fungi you cannot recall how you discovered, is one of the great modes of the web. It is, I’ll go so far to propose, one of the great modes of human thinking. </p>
  467. <p><cite><em><a href="http://aworkinglibrary.com/writing/follow-the-links/">Follow the links</a></em> (<a href="/david/cache/cbbb6529f7412868ba45d5e8b32323a5/">cache</a>)</cite></p>
  468. </blockquote>
  469. <p>Il existe <a href="http://archive.is/">des outils permettant</a> de <a href="https://archive.org/web/">cacher une page web</a>, et même d’y accéder avec <a href="http://oldweb.today/">un navigateur de l’époque</a> ou <a href="http://timetravel.mementoweb.org/">d’y voyager</a>. Cela fait maintenant <a href="/david/stream/2015/01/05/">plus d’un an</a> que je mets en cache les articles qui sont liés sur cet espace les considérant comme importants pour la réflexion qu’ils initient. Il est depuis possible d’installer <a href="http://amberlink.org/">un plugin Wordpress/Drupal</a> qui semble faire la même chose.</p>
  470. <p>La question des <a href="http://aworkinglibrary.com/writing/hypertext-for-all/">productions non textuelles</a> (<a href="/david/cache/ebd8dc34d8feec38a2810883d6741189/">cache</a>) reste de mise et nécessiterait d’augmenter la taille du cache de plusieurs ordres de grandeurs. Celle <a href="http://wolfslittlestore.be/2012/11/archivability-of-the-web/">du design</a> (<a href="/david/cache/76bd309dac6c1ddcb4dc3ee097a1bcb5/">cache</a>) également et pose une vraie contrainte technique quand aux moteurs de rendus qui évoluent.</p>
  471. <p>Que se passerait-il si cela devenait une pratique courante ? À quel point les <a href="/david/stream/2015/11/24/">service workers</a> vont-ils permettre d’automatiser cela ? <strong>Cacher une page non pas pour un rendu hors-ligne mais pour un rendu pérenne et/ou versionné.</strong></p>
  472. <p><em>Je me demande par exemple si l’intégration de <a href="https://github.com/kpdecker/jsdiff">jsdiff</a> permettrait d’afficher les évolutions du <a href="/david/lexique/">lexique</a> de manière personnalisée à partir de la version précédemment mise en cache.</em></p>
  473. <h2>Informer et éduquer</h2>
  474. <blockquote>
  475. <p>The aim of this project is to provide a way to check HTTP resources: hunting 404s, updating redirections and so on.</p>
  476. <p>For instance, given a website that stores a list of external resources (html, images or documents), this product allows the owner to send its URLs in bulk and retrieve information for each URL fetched in background (status code and useful headers for now). This way he can be informed of dead links or outdated resources and acts accordingly.</p>
  477. <p><cite><em><a href="https://github.com/davidbgk/croquemort">Croquemort</a></em></cite></p>
  478. </blockquote>
  479. <p>Je travaille sur <a href="https://www.data.gouv.fr/fr/">data.gouv.fr</a> depuis un an. La stratégie de la dernière version était de référencer plus que de dupliquer les données déjà hébergées par ailleurs. Nous manquions cruellement de visibilité sur la disponibilité de ces ressources distantes et nous avons décidé de développer un outil qui nous permette d’avoir des métriques à ce sujet. Ces données nous permettent d’avertir les producteurs en cas d’indisponibilité, d’informer les visiteurs de la non-disponibilité d’une ressource de manière quasi-synchrone et d’avoir un tableau de bord avec un score par producteur.</p>
  480. <p>Croquemort va <a href="/david/blog/2015/croquer-liens/">croquer les orteils des liens</a> à intervalles réguliers pour s’assurer qu’ils retournent toujours un <em>status code</em> pertinent. Il ne s’agit pas de culpabiliser ou de blamer les producteurs mais de les sensibiliser et de les responsabiliser pour avoir une discussion sur les origines de ces indisponibilités et trouver une solution ensemble.</p>
  481. <h2>5 ♥ de l’Opendata</h2>
  482. <p>Après les <a href="http://5stardata.info/en/">5 ★ de Tim Berners-Lee</a>, qui ont <a href="https://www.w3.org/DesignIssues/LinkedData.html">bientôt 6 ans</a> (<a href="/david/cache/8df6b7af9ac944275a13f0d0e97ad7d7/">cache</a>), il est temps de passer aux 5 ♥ plus contemporains (merci Twitter). Voici mes modestes propositions à challenger :</p>
  483. <ul>
  484. <li><strong>★ données disponibles (PDF) → ♥ pour longtemps</strong> : il ne s’agit plus de rendre uniquement les données disponibles à un instant t mais d’assurer une disponibilité dans le temps et le cas échéant les redirections appropriées.</li>
  485. <li><strong>★★ données structurées (XLS) → ♥♥ et (ré)utilisées</strong> : plus que leur structuration, c’est <a href="https://github.com/Quartz/bad-data-guide">la garantie</a> qu’elles sont déjà (ré)utilisées en interne qui leur donne de la valeur.</li>
  486. <li><strong>★★★ données non-propriétaires (CSV) → ♥♥♥ et documentées</strong> : si le format permet de <em>parser</em> plus rapidement les données, leur documentation permet de les comprendre plus rapidement et donc de les (ré)utiliser.</li>
  487. <li><strong>★★★★ données avec URI (RDF) → ♥♥♥♥ et redondantes</strong> : le fait d’introduire des URI donne une grande responsabilité aux producteurs, un cache décentralisant doit être mis en place pour assurer la continuité de <em>liaison</em>.</li>
  488. <li><strong>★★★★★ données avec liens (LOD) → ♥♥♥♥♥ et versionnées</strong> : les relations évoluent dans le temps et il faut penser le graphe des données en 3D dès son initiation, les <a href="https://www.mercurial-scm.org/">outils</a> <a href="http://git-scm.com/">techniques</a> existent pour avoir une traçabilité et un historique des modifications.</li>
  489. </ul>
  490. <p>Avec cette itération des recommandations, l’accent est mis sur la qualité des données plus que leur quantité. Trop de portails Opendata exposent des données inutilisables. <strong>L’objectif de l’Opendata n’est pas de publier des données mais de <a href="/david/blog/2013/opendata-citoyennete/">créer des synergies</a> entre les citoyens, les administrations et les entreprises.</strong></p>
  491. <h2>Date de péremption</h2>
  492. <blockquote>
  493. <p>“Les traces que les utilisateurs laissent derrière eux sont radioactives, elles continuent à pouvoir avoir un effet négatif jusque des années plus tard.” La plupart des données échappent à tout contrôle sérieux. “Elles sont échangées, modifiées, revendues. Mais surtout, comme les déchets nucléaires, elles restent.”</p>
  494. <p><cite><em><a href="http://www.internetactu.net/2015/10/20/faut-il-une-date-de-peremption-pour-les-donnees/">Faut-il une date de péremption pour les données ?</a></em> (<a href="/david/cache/8f33334066da6322f51118b15e39e482/">cache</a>)</cite></p>
  495. </blockquote>
  496. <p>D’un autre côté, il y a des données que l’on voudrait oublier et qui persistent, à notre insu. Comment introduire les notions de version et de temporalité dans les liens ? Cette question reste ouverte à ce jour et je ne connais pas d’initiative pour proposer un standard sur le sujet. Les <a href="/david/stream/2015/10/21/">journaux évoluent</a> et vont devoir se poser ces questions s’ils vont <a href="/david/blog/2014/avenir-liberation/">vers de la co-construction</a>.</p>
  497. <h2>Parfaitement cassé</h2>
  498. <blockquote>
  499. <p>In closing, there’s a great book called <em>Small Pieces, Loosely Joined</em>. It’s about the web, and it’s about how the web is, by David Weinberger, who wrote this phrase, “the web is perfectly broken,” which I think is an interesting phrase, “perfectly broken,” because it’s messy deliberately. It’s not meant to be simple or easy; uniform and centralize. It’s supposed to be hacked together, distributed, customized, and remixed. It’s supposed to be human.</p>
  500. <p><cite><em><a href="https://medium.com/civic-technology/rethinking-data-portals-30b66f00585d">Let’s Move Beyond Open Data Portals</a></em> (<a href="/david/cache/75c259bed30f5a31bf42e01f5d11fe6a/">cache</a>)</cite></p>
  501. </blockquote>
  502. <p>Son impermanence est peut-être aussi ce qui fait la beauté du Web au même titre que l’éphémérité de la vie. Une donnée est là et du jour au lendemain elle traverse la rue et son lien est rompu. C’est fini et il fallait l’apprécier alors qu’elle était encore disponible. La bonne nouvelle c’est que le clonage de données est (presque) gratuit si l’on sait s’y prendre à l’avance ;-).</p>
  503. <h2>Résilience</h2>
  504. <blockquote>
  505. <p>Can the web <em>now</em> be a proper archive? No. You can’t have a permanent access (stable URLs) to the data released (by WikiLeaks). Once you have piece of human knowledge, how do you keep it? How do you share it?</p>
  506. <p><cite>Julian Assange, <a href="/david/blog/2015/enmi/">Entretiens du Nouveau Monde Industriel</a></cite></p>
  507. </blockquote>
  508. <p>Avoir une connexion permanente et rapide n’est pas suffisamment contraignante pour que l’on innove dans ce domaine. La résilience du réseau sera peut-être à trouver du côté des innovation issues de la contrainte dans le pays qui <a href="http://www.lowtechmagazine.com/2015/10/how-to-build-a-low-tech-internet.html">ne disposent pas de connexions permanentes</a> (<a href="/david/cache/d629418c0d8fcf72c54e0a3c27d29ea6/">cache</a>). Dans ces contextes, la mise en cache est beaucoup plus agressive et le réseau davantage distribué. Il serait tellement intéressant que la solution émerge de ces pratiques là…</p>
  509. <h2>Et la suite ?</h2>
  510. <blockquote>
  511. <p>But while HTTP has achieved many things, it’s usefulness as a foundation for the distribution and persistence of the sum of human knowledge isn’t just showing some cracks, it’s crumbling to pieces right in front of us. The way HTTP distributes content is <strong>fundamentally flawed</strong>, and no amount of performance tuneups or forcing broken CA SSL or whatever are going to fix that. HTTP/2 is a welcome improvement, but it’s a conservative update to a technology that’s beginning to show its age. To have a better future for the web, we need more than a spiced up version of HTTP, we need a new foundation. And per the governance model of cyberspace, that means we need a new protocol. IPFS, I’m strongly hoping, becomes that new protocol. </p>
  512. <p><cite><em><a href="https://blog.neocities.org/its-time-for-the-permanent-web.html">HTTP is obsolete. It’s time for the distributed, permanent web</a></em> (<a href="/david/cache/3faaf2e57b062c8f0c8dd1fcb47faa58/">cache</a>)</cite></p>
  513. </blockquote>
  514. <p><a href="https://ipfs.io/">IPFS</a> (InterPlanetary File System) est une solution possible, la question étant toujours de savoir si ça passe à l’échelle en terme de performance et de bande passante pour avoir des contenus récents et/ou mis à jour. Je ne sais pas non plus quelle pourrait être la démarche d’adoption d’un tel protocole quand on voit l’inertie qu’il peut y avoir pour IPv6 par exemple…</p>
  515. <p><strong>La solution sera probablement multiple. Expérimentez, documentez et échangez. Apprenez. Recommencez.</strong> Même de petites expériences insignifiantes peuvent avoir le pouvoir d’actionner de nouvelles idées chez d’autres personnes. C’est aussi cela la force du Web. </p>
  516. <p><em>Il y avait une vingtaine de personnes durant la session et voici <a href="/static/david/blog/opendata-liens-casses-retours.pdf">les retours</a> proposés par Confoo dans l’heure qui suit (!) par email.</em></p>
  517. </article>
  518. <figure class="image" property="schema:image">
  519. <img src="/static/david/blog/2016/opendata-liens-casses.jpg" alt="" />
  520. </figure>
  521. <nav id="jumpto">
  522. <p>
  523. <a rel=prev href="/david/blog/2016/minimalisme-esthetique/">← Minimalisme et esthétique</a> | <a href="/david/blog/" title="Retour à la liste des expériences">↑</a> | <a rel=next href="/david/blog/2016/javascript-reduit/">JavaScript réduit →</a>
  524. </p>
  525. </nav>
  526. <footer>
  527. <div>
  528. <img src="/static/david/david-larlet-avatar.jpg" loading="lazy" class="avatar" width="200" height="200">
  529. <p>
  530. Bonjour/Hi!
  531. Je suis <a href="/david/" title="Profil public">David&nbsp;Larlet</a>, je vis actuellement à Montréal et j’alimente cet espace depuis 15 ans. <br>
  532. Si tu as apprécié cette lecture, n’hésite pas à poursuivre ton exploration. Par exemple via les <a href="/david/blog/" title="Expériences bienveillantes">réflexions bimestrielles</a>, la <a href="/david/stream/2019/" title="Pensées (dés)articulées">veille hebdomadaire</a> ou en t’abonnant au <a href="/david/log/" title="S’abonner aux publications via RSS">flux RSS</a> (<a href="/david/blog/2019/flux-rss/" title="Tiens c’est quoi un flux RSS ?">so 2005</a>).
  533. </p>
  534. <p>
  535. Je m’intéresse à la place que je peux avoir dans ce monde. En tant qu’humain, en tant que membre d’une famille et en tant qu’associé d’une coopérative. De temps en temps, je fais aussi des <a href="https://github.com/davidbgk" title="Principalement sur Github mais aussi ailleurs">trucs techniques</a>. Et encore plus rarement, <a href="/david/talks/" title="En ce moment je laisse plutôt la place aux autres">j’en parle</a>.
  536. </p>
  537. <p>
  538. Les dernières publications hebdomadaires sont :
  539. </p>
  540. <ul class="with_columns">
  541. <li>
  542. <a href="/david/stream/2019/12/31/">Merci</a>
  543. </li>
  544. <li>
  545. <a href="/david/stream/2019/12/27/">Intemporels</a>
  546. </li>
  547. <li>
  548. <a href="/david/stream/2019/12/24/">Outils</a>
  549. </li>
  550. <li>
  551. <a href="/david/stream/2019/12/17/">Origines</a>
  552. </li>
  553. <li>
  554. <a href="/david/stream/2019/12/10/">Publier</a>
  555. </li>
  556. <li>
  557. <a href="/david/stream/2019/12/03/">En forêt</a>
  558. </li>
  559. <li>
  560. <a href="/david/stream/2019/11/26/">Ecocentric</a>
  561. </li>
  562. <li>
  563. <a href="/david/stream/2019/11/19/">Se livrer</a>
  564. </li>
  565. <li>
  566. <a href="/david/stream/2019/11/12/">Dépendances</a>
  567. </li>
  568. <li>
  569. <a href="/david/stream/2019/11/05/">Positif</a>
  570. </li>
  571. <li>
  572. <a href="/david/stream/2019/10/29/">Dettes</a>
  573. </li>
  574. <li>
  575. <a href="/david/stream/2019/10/22/">Privilèges</a>
  576. </li>
  577. <li>
  578. <a href="/david/stream/2019/10/15/">Discrétion</a>
  579. </li>
  580. <li>
  581. <a href="/david/stream/2019/10/08/">Désespérance</a>
  582. </li>
  583. <li>
  584. <a href="/david/stream/2019/10/01/">Présent</a>
  585. </li>
  586. <li>
  587. <a href="/david/stream/2019/09/24/">Manifester</a>
  588. </li>
  589. <li>
  590. <a href="/david/stream/2019/09/17/">Arpenter</a>
  591. </li>
  592. <li>
  593. <a href="/david/stream/2019/09/10/">Nostalgie</a>
  594. </li>
  595. <li>
  596. <a href="/david/stream/2019/09/03/">Déconstruire</a>
  597. </li>
  598. <li>
  599. <a href="/david/stream/2019/08/27/">Documenter</a>
  600. </li>
  601. <li>
  602. <a href="/david/stream/2019/08/20/">Frustration</a>
  603. </li>
  604. <li>
  605. <a href="/david/stream/2019/08/13/">Holisme</a>
  606. </li>
  607. <li>
  608. <a href="/david/stream/2019/08/06/">1%</a>
  609. </li>
  610. <li>
  611. <a href="/david/stream/2019/07/30/">Exemplarité</a>
  612. </li>
  613. <li>
  614. <a href="/david/stream/2019/07/23/">Timelines</a>
  615. </li>
  616. <li>
  617. <a href="/david/stream/2019/07/16/">Écoute</a>
  618. </li>
  619. <li>
  620. <a href="/david/stream/2019/07/02/">Anxiété</a>
  621. </li>
  622. <li>
  623. <a href="/david/stream/2019/06/21/">À lier</a>
  624. </li>
  625. <li>
  626. <a href="/david/stream/2019/06/14/">Pauvreté</a>
  627. </li>
  628. <li>
  629. <a href="/david/stream/2019/06/07/">Amateur</a>
  630. </li>
  631. <li>
  632. <a href="/david/stream/2019/05/31/">Pollution</a>
  633. </li>
  634. <li>
  635. <a href="/david/stream/2019/05/24/">Apaisement</a>
  636. </li>
  637. <li>
  638. <a href="/david/stream/2019/05/10/">Folie</a>
  639. </li>
  640. <li>
  641. <a href="/david/stream/2019/05/03/">Sympathie</a>
  642. </li>
  643. <li>
  644. <a href="/david/stream/2019/04/12/">Péremption</a>
  645. </li>
  646. <li>
  647. <a href="/david/stream/2019/04/05/">Définitions</a>
  648. </li>
  649. <li>
  650. <a href="/david/stream/2019/03/29/">Acceptation</a>
  651. </li>
  652. <li>
  653. <a href="/david/stream/2019/03/22/">Dissonance</a>
  654. </li>
  655. <li>
  656. <a href="/david/stream/2019/03/15/">Reconnaissance</a>
  657. </li>
  658. <li>
  659. <a href="/david/stream/2019/03/08/">Lecture</a>
  660. </li>
  661. <li>
  662. <a href="/david/stream/2019/03/01/">Journaux</a>
  663. </li>
  664. <li>
  665. <a href="/david/stream/2019/02/22/">Écriture</a>
  666. </li>
  667. <li>
  668. <a href="/david/stream/2019/02/15/">Kyriarchie</a>
  669. </li>
  670. <li>
  671. <a href="/david/stream/2019/02/08/">Mots-serrures</a>
  672. </li>
  673. <li>
  674. <a href="/david/stream/2019/02/01/">Sans voie</a>
  675. </li>
  676. <li>
  677. <a href="/david/stream/2019/01/25/">Auto-diagnostic</a>
  678. </li>
  679. <li>
  680. <a href="/david/stream/2019/01/18/">Agilité</a>
  681. </li>
  682. <li>
  683. <a href="/david/stream/2019/01/11/">Métaphores</a>
  684. </li>
  685. <li>
  686. <a href="/david/stream/2019/01/04/">Balbutiements</a>
  687. </li>
  688. </ul>
  689. <p>
  690. Voici quelques articles choisis :
  691. <a href="/david/blog/2019/faire-equipe/" title="Accéder à l’article complet">Faire équipe</a>,
  692. <a href="/david/blog/2018/bivouac-automnal/" title="Accéder à l’article complet">Bivouac automnal</a>,
  693. <a href="/david/blog/2018/commodite-effondrement/" title="Accéder à l’article complet">Commodité et effondrement</a>,
  694. <a href="/david/blog/2017/donnees-communs/" title="Accéder à l’article complet">Des données aux communs</a>,
  695. <a href="/david/blog/2016/accompagner-enfant/" title="Accéder à l’article complet">Accompagner un enfant</a>,
  696. <a href="/david/blog/2016/senior-developer/" title="Accéder à l’article complet">Senior developer</a>,
  697. <a href="/david/blog/2016/illusion-sociale/" title="Accéder à l’article complet">L’illusion sociale</a>,
  698. <a href="/david/blog/2016/instantane-scopyleft/" title="Accéder à l’article complet">Instantané Scopyleft</a>,
  699. <a href="/david/blog/2016/enseigner-web/" title="Accéder à l’article complet">Enseigner le Web</a>,
  700. <a href="/david/blog/2016/simplicite-defaut/" title="Accéder à l’article complet">Simplicité par défaut</a>,
  701. <a href="/david/blog/2016/minimalisme-esthetique/" title="Accéder à l’article complet">Minimalisme et esthétique</a>,
  702. <a href="/david/blog/2014/un-web-omni-present/" title="Accéder à l’article complet">Un web omni-présent</a>,
  703. <a href="/david/blog/2014/manifeste-developpeur/" title="Accéder à l’article complet">Manifeste de développeur</a>,
  704. <a href="/david/blog/2013/confort-convivialite/" title="Accéder à l’article complet">Confort et convivialité</a>,
  705. <a href="/david/blog/2013/testament-numerique/" title="Accéder à l’article complet">Testament numérique</a>,
  706. et <a href="/david/blog/" title="Accéder aux archives">bien d’autres…</a>
  707. </p>
  708. <p>
  709. On peut <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">échanger par courriel</a>. Si éventuellement tu souhaites que l’on travaille ensemble, tu devrais commencer par consulter le <a href="http://larlet.com">profil dédié à mon activité professionnelle</a> et/ou contacter directement <a href="http://scopyleft.fr/">scopyleft</a>, la <abbr title="Société coopérative et participative">SCOP</abbr> dont je fais partie depuis six ans. Je recommande au préalable de lire <a href="/david/blog/2018/cout-site/" title="Attention ce qui va suivre peut vous choquer">combien coûte un site</a> et pourquoi je suis plutôt favorable à une <a href="/david/pro/devis/" title="Discutons-en !">non-demande de devis</a>.
  710. </p>
  711. <p>
  712. Je ne traque pas ta navigation mais mon
  713. <abbr title="Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33.184162340">hébergeur</abbr>
  714. conserve des logs d’accès.
  715. </p>
  716. </div>
  717. </footer>
  718. <script type="text/javascript">
  719. ;(_ => {
  720. const jumper = document.getElementById('jumper')
  721. jumper.addEventListener('click', e => {
  722. e.preventDefault()
  723. const anchor = e.target.getAttribute('href')
  724. const targetEl = document.getElementById(anchor.substring(1))
  725. targetEl.scrollIntoView({behavior: 'smooth'})
  726. })
  727. })()
  728. </script>
  729. <script>
  730. /* Service workers */
  731. if (navigator.serviceWorker) {
  732. window.addEventListener('load', function () {
  733. var selector = 'a[href^="/david/cache/"], a[rel=prev], a[rel=next]'
  734. function sendLinks (selector) {
  735. var links = [].slice.call(document.querySelectorAll(selector)).map(function (link) {
  736. return link.getAttribute('href')
  737. })
  738. links.push(location.pathname) // Put the current page in cache too.
  739. navigator.serviceWorker.controller.postMessage({ links: links })
  740. }
  741. navigator.serviceWorker.getRegistration()
  742. .then(function (registration) {
  743. if (!registration || !navigator.serviceWorker.controller) {
  744. return navigator.serviceWorker.register('/serviceworker.js')
  745. .then(navigator.serviceWorker.ready)
  746. .then(function () {
  747. console.log('[ServiceWorker] Ready to go!')
  748. })
  749. .catch(console.error.bind(console))
  750. } else {
  751. console.log('[ServiceWorker] Send links via registration')
  752. sendLinks(selector)
  753. }
  754. })
  755. navigator.serviceWorker.addEventListener('controllerchange', function () {
  756. console.log('[ServiceWorker] Send links via controller change')
  757. sendLinks(selector)
  758. })
  759. navigator.serviceWorker.addEventListener('message', function (event) {
  760. var link = document.querySelector('a[href="' + event.data.link + '"]')
  761. if (event.data.status && link) {
  762. link.style.backgroundColor = '#2d7474'
  763. link.style.color = '#f0f0ea'
  764. link.setAttribute('title', 'En cache pour consultation sans connexion')
  765. }
  766. })
  767. })
  768. } else {
  769. console.warn('[ServiceWorker] No cache for old browsers.')
  770. }
  771. </script>