Repository with sources and generator of https://larlet.fr/david/ https://larlet.fr/david/
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

index.html 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  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` element
  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,initial-scale=1">
  11. <!-- Required to make a valid HTML5 document. -->
  12. <title>
  13. Dune
  14. — David Larlet</title>
  15. <script>
  16. function toggleTheme(themeName) {
  17. document.documentElement.classList.toggle(
  18. 'forced-dark',
  19. themeName === 'dark'
  20. )
  21. document.documentElement.classList.toggle(
  22. 'forced-light',
  23. themeName === 'light'
  24. )
  25. }
  26. const selectedTheme = localStorage.getItem('theme')
  27. if (selectedTheme !== 'undefined') {
  28. toggleTheme(selectedTheme)
  29. }
  30. </script>
  31. <!-- Documented, feel free to shoot an email. -->
  32. <link rel="stylesheet" href="/static/david/css/style_2024-03-09.css">
  33. <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
  34. <link rel="preload"
  35. href="/static/david/css/fonts/century_supra_ot_a_regular.woff2"
  36. as="font"
  37. type="font/woff2"
  38. media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)"
  39. crossorigin>
  40. <link rel="preload"
  41. href="/static/david/css/fonts/century_supra_ot_a_bold.woff2"
  42. as="font"
  43. type="font/woff2"
  44. media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)"
  45. crossorigin>
  46. <link rel="preload"
  47. href="/static/david/css/fonts/century_supra_ot_a_italic.woff2"
  48. as="font"
  49. type="font/woff2"
  50. media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)"
  51. crossorigin>
  52. <link rel="preload"
  53. href="/static/david/css/fonts/century_supra_ot_b_regular.woff2"
  54. as="font"
  55. type="font/woff2"
  56. media="(prefers-color-scheme: dark)"
  57. crossorigin>
  58. <link rel="preload"
  59. href="/static/david/css/fonts/century_supra_ot_b_bold.woff2"
  60. as="font"
  61. type="font/woff2"
  62. media="(prefers-color-scheme: dark)"
  63. crossorigin>
  64. <link rel="preload"
  65. href="/static/david/css/fonts/century_supra_ot_b_italic.woff2"
  66. as="font"
  67. type="font/woff2"
  68. media="(prefers-color-scheme: dark)"
  69. crossorigin>
  70. <meta name="description" content="Je crois bien n’être allé que 3 fois dans une salle de cinéma ces 10 dernières années. Et puis l’occasion s’est présentée, sans prévenir, aujourd’hui. J’avais quelques retenues sur la première partie mais j’attendais quand même avec impatience la suite. Et j’avais réussi à ne pas trop regarder les bandes annonces, ni les critiques.">
  71. <!-- That good ol' feed, subscribe :). -->
  72. <link rel="alternate"
  73. type="application/atom+xml"
  74. title="Feed"
  75. href="/david/log/">
  76. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  77. <link rel="apple-touch-icon"
  78. sizes="180x180"
  79. href="/static/david/icons2/apple-touch-icon.png">
  80. <link rel="icon"
  81. type="image/png"
  82. sizes="32x32"
  83. href="/static/david/icons2/favicon-32x32.png">
  84. <link rel="icon"
  85. type="image/png"
  86. sizes="16x16"
  87. href="/static/david/icons2/favicon-16x16.png">
  88. <link rel="manifest" href="/static/david/icons2/site.webmanifest">
  89. <link rel="mask-icon"
  90. href="/static/david/icons2/safari-pinned-tab.svg"
  91. color="#07486c">
  92. <link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
  93. <meta name="msapplication-TileColor" content="#f7f7f7">
  94. <meta name="msapplication-config"
  95. content="/static/david/icons2/browserconfig.xml">
  96. <meta name="theme-color"
  97. content="#f7f7f7"
  98. media="(prefers-color-scheme: light)">
  99. <meta name="theme-color"
  100. content="#272727"
  101. media="(prefers-color-scheme: dark)">
  102. <!-- Is that even respected? Retrospectively? What a shAItshow…
  103. https://neil-clarke.com/block-the-bots-that-feed-ai-models-by-scraping-your-website/ -->
  104. <meta name="robots" content="noai, noimageai">
  105. <style type="text/css">
  106. .tippy-content {
  107. min-width: 280px;
  108. padding: .5rem;
  109. font-size: calc(var(--fluid-0) * 0.8);
  110. font-family: var(--labor-font);
  111. letter-spacing: initial;
  112. text-align: left;
  113. }
  114. .tippy-content h3 {
  115. margin-top: 0;
  116. }
  117. .tippy-content h3 img {
  118. max-width: 2rem;
  119. max-height: 2rem;
  120. display: inline-block;
  121. }
  122. .tippy-content .tippy-links {
  123. display: flex;
  124. justify-content: space-around;
  125. }
  126. .tippy-content a {
  127. padding: .4rem;
  128. color: #F06048;
  129. }
  130. </style>
  131. <body data-instant-intensity="viewport-all">
  132. <article>
  133. <header>
  134. <hgroup>
  135. <h1>Dune</h1>
  136. <p>Le <time datetime="2024-03-10">10 mars 2024</time></p>
  137. </hgroup>
  138. </header>
  139. <nav>
  140. <p>
  141. <a rel="prev"
  142. href="/david/2024/03/09/"
  143. title="Publication précédente : Marque">← Précédent</a> •
  144. <a href="/david/" title="Aller à l’accueil" rel="up">Accueil</a>
  145. <a href="/david/recherche/"
  146. title="Aller à la page de recherche"
  147. rel="search" data-no-instant>Recherche</a>
  148. • <a rel="next"
  149. href="/david/2024/03/11/"
  150. title="Publication suivante : LoginWall">Suivant →</a>
  151. </p>
  152. </nav>
  153. <p>Je crois bien n’être allé que 3&nbsp;fois dans une salle de cinéma ces 10&nbsp;dernières années. Et puis l’occasion s’est présentée, sans prévenir, aujourd’hui. J’avais <a href="/david/2021/10/18/">quelques retenues sur la première partie</a> mais j’attendais quand même avec impatience la suite. Et j’avais réussi à ne pas trop regarder les bandes annonces, ni les&nbsp;critiques.</p>
  154. <p><em>Note&nbsp;: ça va forcément divulgâcher un peu dans la&nbsp;suite.</em></p>
  155. <p>L’adaptation est bonne, le défi était de taille et —&nbsp;en dépit des quelques ajustements qui piquent un peu le <em>fan</em> que je suis (surtout vers la fin&#8239;!)&nbsp;— la scénarisation est cohérente. Ce qui n’était pas une mince affaire car encore une fois la temporalité n’est pas évidente et rendre l’évolution des personnages visible avec tout ce qui est censé se passer dans leur tête requiert des redéfinitions et des&nbsp;raccourcis.</p>
  156. <p>Mon erreur a probablement été de choisir de l’IMAX alors que c’était Hans “<a data-link-domain="20k.org" href="https://www.20k.org/episodes/boojstrikesback">booj</a>” Zimmer aux platines. Autant dire que le siège a vibré la moitié du film&#8239;! Au-delà de la bande originale, le son a vraiment été travaillé mais je crois que c’était un peu trop pour mes vieilles oreilles plus vraiment adaptées à de tels volumes. Il y a des moments où j’ai même trouvé que ça altérait la compréhension des dialogues… j’avais un peu l’impression de me noyer dans la volonté im·mer·sive alors que l’on est en plein désert. Je doute de retourner dans une salle de si&nbsp;tôt.</p>
  157. <p>Tout ce qui tourne autour des vers est bien fait, j’avais toujours eu du mal à me faire ma propre représentation des tailles et interactions à la lecture et là ça me semble être respecté / réaliste. Idem pour les <em>Sietchs</em>, c’est fidèle à la projection mentale que je pouvais m’en faire, même si l’on n’en voit pas grand chose au final. J’ai particulièrement apprécié le choix de faire une <em>Chani</em> forte qui est davantage consciente des enjeux et des répercutions. La jalousie aurait mérité d’être plus subtile, la différence entre la femme (politique) de Paul et sa compagne (amoureuse) est vraiment explicite dans le&nbsp;livre.</p>
  158. <p>Paul Muad’dib perd un peu trop d’eau à mon goût au cours de nombreuses scènes. Il était probablement plus difficile de transmettre des émotions&nbsp;sèches&nbsp;(?).</p>
  159. <p>Pour finir sur une note positive, l’image bien sûr. C’est à la limite du trop <em>et</em> c’est magnifique au niveau des différents tableaux qui s’enchaînent avec leurs propres couleurs, cinématiques et points de vues. On sent le travail de recherche sans qu’il ne devienne complètement distrayant. J’y serai d’autant plus attentif lors d’un second visionnage, chez moi, en choisissant le volume&nbsp;sonore.</p>
  160. <p>Je ne vois pas comment est-ce qu’il ne pourrait pas y avoir une troisième partie. À voir comment / si ça raccroche les wagons des livres. J’aurais presque envie que ça explore sa propre branche. <em>Dune&nbsp;multi·vers·e&#8239;!</em></p>
  161. <nav>
  162. <p>
  163. <a href="/david/2024/adaptation/"
  164. title="Liste de tous les articles 2024 associés à cette étiquette"
  165. rel="tag">#adaptation</a>
  166. <a href="/david/2024/cinema/"
  167. title="Liste de tous les articles 2024 associés à cette étiquette"
  168. rel="tag">#cinéma</a>
  169. <a href="/david/2024/lecture/"
  170. title="Liste de tous les articles 2024 associés à cette étiquette"
  171. rel="tag">#lecture</a>
  172. <a href="/david/2024/#tags" title="Liste de toutes les étiquettes 2024">tous ?</a>
  173. </p>
  174. </nav>
  175. <nav>
  176. <p>
  177. <a rel="prev"
  178. href="/david/2024/03/09/"
  179. title="Publication précédente : Marque">← Précédent</a> •
  180. <a href="/david/2024/" title="Liste des publications récentes">↑ En 2024</a>
  181. • <a rel="next"
  182. href="/david/2024/03/11/"
  183. title="Publication suivante : LoginWall">Suivant →</a>
  184. </p>
  185. </nav>
  186. <form action="/david/recherche/" method="get">
  187. <fieldset>
  188. <legend>Recherche</legend>
  189. <label for="input-search">Termes de votre recherche :</label>
  190. <input id="input-search" type="search" name="s" aria-describedby="indexation-infos" required>
  191. <input type="submit" value="Chercher">
  192. <p id="indexation-infos">
  193. <small>
  194. Seuls les contenus de ces 8 dernières années sont indexés.
  195. </small>
  196. </p>
  197. </fieldset>
  198. </form>
  199. <aside>
  200. <theme-toggle></theme-toggle>
  201. </aside>
  202. </article>
  203. <hr>
  204. <footer>
  205. <p>
  206. <a href="/david/" title="Aller à l’accueil">Accueil</a>
  207. <a href="/david/log/" title="Accès au flux RSS">Suivre</a>
  208. <a href="http://larlet.com"
  209. title="Go to my English profile"
  210. data-instant>Pro</a>
  211. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">Email</a>
  212. <abbr title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340">Légal</abbr>
  213. </p>
  214. <template id="theme-selector">
  215. <form>
  216. <style type="text/css">
  217. fieldset div {
  218. text-align: center;
  219. }
  220. </style>
  221. <fieldset>
  222. <legend>Thème</legend>
  223. <div>
  224. <label>
  225. <input type="radio" value="auto" name="chosen-color-scheme" checked>
  226. Auto
  227. </label>
  228. <label>
  229. <input type="radio" value="dark" name="chosen-color-scheme">
  230. Foncé
  231. </label>
  232. <label>
  233. <input type="radio" value="light" name="chosen-color-scheme">
  234. Clair
  235. </label>
  236. </div>
  237. </fieldset>
  238. </form>
  239. </template>
  240. </footer>
  241. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  242. <script>
  243. class ThemeToggle extends HTMLElement {
  244. constructor() {
  245. super()
  246. const themeSelectorTemplate = document.querySelector('#theme-selector')
  247. const form = themeSelectorTemplate.content.firstElementChild
  248. this.attachShadow({ mode: 'open' })
  249. this.shadowRoot.appendChild(form.cloneNode(true))
  250. }
  251. connectedCallback() {
  252. const form = this.shadowRoot.querySelector('form')
  253. form.addEventListener('change', (e) => {
  254. const chosenColorScheme = e.target.value
  255. localStorage.setItem('theme', chosenColorScheme)
  256. toggleTheme(chosenColorScheme)
  257. })
  258. const selectedTheme = localStorage.getItem('theme')
  259. if (selectedTheme && selectedTheme !== 'undefined') {
  260. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  261. }
  262. }
  263. }
  264. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  265. window.addEventListener('load', () => {
  266. let colorsLayer = undefined
  267. let hasDarkRules = false
  268. for (const styleSheet of Array.from(document.styleSheets)) {
  269. let mediaRules = []
  270. for (const layerRule of styleSheet.cssRules) {
  271. if (!(layerRule instanceof CSSLayerBlockRule)) {
  272. continue
  273. }
  274. if (layerRule.name === 'colors') {
  275. colorsLayer = layerRule
  276. }
  277. for (const cssRule of layerRule.cssRules) {
  278. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  279. continue
  280. }
  281. // WARNING: Safari does not have/supports `conditionText`.
  282. if (cssRule.conditionText) {
  283. if (cssRule.conditionText !== prefersColorSchemeDark) {
  284. continue
  285. }
  286. } else {
  287. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  288. continue
  289. }
  290. }
  291. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  292. }
  293. }
  294. // WARNING: do not try to insert a Rule to a styleSheet you are
  295. // currently iterating on, otherwise the browser will be stuck
  296. // in a infinite loop…
  297. for (const mediaRule of mediaRules) {
  298. // Safari requires the `0` second parameter (even if default).
  299. colorsLayer.insertRule(mediaRule.cssText, 0)
  300. hasDarkRules = true
  301. }
  302. }
  303. if (hasDarkRules) {
  304. if ('customElements' in window && !customElements.get('theme-toggle')) {
  305. customElements.define('theme-toggle', ThemeToggle)
  306. }
  307. }
  308. })
  309. </script>
  310. <script src="/static/david/js/popper-2.11.8.min.js"></script>
  311. <script src="/static/david/js/tippy-bundle-6.3.7.umd.min.js"></script>
  312. <script>
  313. tippy('[data-tippy]', {
  314. content(reference) {
  315. reference.addEventListener('click', (e) => e.preventDefault())
  316. return `
  317. <h3 lang="fr">
  318. <img src="${reference.dataset.favicon}" loading="lazy">
  319. <a href="${reference.dataset.source}"
  320. >Article sur ${reference.dataset.domain}</a></h3>
  321. <p lang="${reference.hreflang}"><em>${reference.dataset.description}</em></p>
  322. <div class="tippy-links" lang="fr">
  323. <a href="${reference.href}">Archive au ${reference.dataset.date}</a>
  324. </div>
  325. `
  326. },
  327. allowHTML: true,
  328. interactive: true,
  329. delay: [150, 700],
  330. hideOnClick: false
  331. })
  332. </script>
  333. <script type="module">
  334. import { annotate } from '/static/david/js/rough-notation-0.5.1.esm.min.js'
  335. const markObserver = new IntersectionObserver((entries, observer) => {
  336. const computedStyle = getComputedStyle(document.documentElement)
  337. const markBackground = computedStyle.getPropertyValue('--mark-background')
  338. for (const entry of entries) {
  339. if (entry.intersectionRatio === 0) continue
  340. const markElement = entry.target
  341. markElement.style.backgroundColor = 'inherit'
  342. const annotation = annotate(
  343. markElement, {
  344. type: 'highlight',
  345. multiline: true,
  346. color: markBackground,
  347. // animate: !window.matchMedia('(prefers-reduced-motion: reduce)').matches
  348. animate: false
  349. }
  350. )
  351. annotation.show()
  352. observer.unobserve(markElement)
  353. }
  354. }, {threshold: 1.0})
  355. for (const markElement of document.querySelectorAll('mark')) {
  356. markObserver.observe(markElement)
  357. }
  358. </script>
  359. </body>
  360. </html>