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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898
  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>Intemporels — 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/stream/2019/12/27/">
  29. <style>
  30. /* http://meyerweb.com/eric/tools/css/reset/ */
  31. html, body, div, span,
  32. h1, h2, h3, h4, h5, h6, p, blockquote, pre,
  33. a, abbr, address, big, cite, code,
  34. del, dfn, em, img, ins,
  35. small, strike, strong, tt, var,
  36. dl, dt, dd, ol, ul, li,
  37. fieldset, form, label, legend,
  38. table, caption, tbody, tfoot, thead, tr, th, td,
  39. article, aside, canvas, details, embed,
  40. figure, figcaption, footer, header, hgroup,
  41. menu, nav, output, ruby, section, summary,
  42. time, mark, audio, video {
  43. margin: 0;
  44. padding: 0;
  45. border: 0;
  46. font-size: 100%;
  47. font: inherit;
  48. vertical-align: baseline;
  49. }
  50. /* HTML5 display-role reset for older browsers */
  51. article, aside, details, figcaption, figure,
  52. footer, header, hgroup, menu, nav, section { display: block; }
  53. body { line-height: 1; }
  54. blockquote, q { quotes: none; }
  55. blockquote:before, blockquote:after,
  56. q:before, q:after {
  57. content: '';
  58. content: none;
  59. }
  60. table {
  61. border-collapse: collapse;
  62. border-spacing: 0;
  63. }
  64. /* http://practicaltypography.com/equity.html */
  65. /* https://calendar.perfplanet.com/2016/no-font-face-bulletproof-syntax/ */
  66. /* https://www.filamentgroup.com/lab/js-web-fonts.html */
  67. @font-face {
  68. font-family: 'EquityTextB';
  69. src: url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff2') format('woff2'),
  70. url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff') format('woff');
  71. font-weight: 300;
  72. font-style: normal;
  73. font-display: swap;
  74. }
  75. @font-face {
  76. font-family: 'EquityTextB';
  77. src: url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff2') format('woff2'),
  78. url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff') format('woff');
  79. font-weight: 300;
  80. font-style: italic;
  81. font-display: swap;
  82. }
  83. @font-face {
  84. font-family: 'EquityTextB';
  85. src: url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff2') format('woff2'),
  86. url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff') format('woff');
  87. font-weight: 700;
  88. font-style: normal;
  89. font-display: swap;
  90. }
  91. @font-face {
  92. font-family: 'ConcourseT3';
  93. src: url('/static/david/css/fonts/concourse_t3_regular-webfont-20190806.woff2') format('woff2'),
  94. url('/static/david/css/fonts/concourse_t3_regular-webfont-20190806.woff') format('woff');
  95. font-weight: 300;
  96. font-style: normal;
  97. font-display: swap;
  98. }
  99. /* http://practice.typekit.com/lesson/caring-about-opentype-features/ */
  100. body {
  101. /* http://www.cssfontstack.com/ Palatino 99% Win 86% Mac */
  102. font-family: "EquityTextB", Palatino, serif;
  103. background-color: #f0f0ea;
  104. color: #07486c;
  105. font-kerning: normal;
  106. -moz-osx-font-smoothing: grayscale;
  107. -webkit-font-smoothing: subpixel-antialiased;
  108. text-rendering: optimizeLegibility;
  109. font-variant-ligatures: common-ligatures contextual;
  110. font-feature-settings: "kern", "liga", "clig", "calt";
  111. }
  112. pre, code, kbd, samp, var, tt {
  113. font-family: 'TriplicateT4c', monospace;
  114. }
  115. em {
  116. font-style: italic;
  117. color: #323a45;
  118. }
  119. strong {
  120. font-weight: bold;
  121. color: black;
  122. }
  123. nav {
  124. background-color: #323a45;
  125. color: #f0f0ea;
  126. display: flex;
  127. justify-content: space-around;
  128. padding: 1rem .5rem;
  129. }
  130. nav:last-child {
  131. border-bottom: 1vh solid #2d7474;
  132. }
  133. nav a {
  134. color: #f0f0ea;
  135. }
  136. nav abbr {
  137. border-bottom: 1px dotted white;
  138. }
  139. h1 {
  140. border-top: 1vh solid #2d7474;
  141. border-bottom: .2vh dotted #2d7474;
  142. background-color: #e3e1e1;
  143. color: #323a45;
  144. text-align: center;
  145. padding: 5rem 0 4rem 0;
  146. width: 100%;
  147. font-family: 'ConcourseT3';
  148. display: flex;
  149. flex-direction: column;
  150. }
  151. h1.single {
  152. padding-bottom: 10rem;
  153. }
  154. h1 span {
  155. position: absolute;
  156. top: 1vh;
  157. left: 20%;
  158. line-height: 0;
  159. }
  160. h1 span a {
  161. line-height: 1.7;
  162. padding: 1rem 1.2rem .6rem 1.2rem;
  163. border-radius: 0 0 6% 6%;
  164. background: #2d7474;
  165. font-size: 1.3rem;
  166. color: white;
  167. text-decoration: none;
  168. }
  169. h2 {
  170. margin: 4rem 0 1rem;
  171. border-top: .2vh solid #2d7474;
  172. padding-top: 1vh;
  173. }
  174. h3 {
  175. text-align: center;
  176. margin: 3rem 0 .75em;
  177. }
  178. hr {
  179. height: .4rem;
  180. width: .4rem;
  181. border-radius: .4rem;
  182. background: #07486c;
  183. margin: 2.5rem auto;
  184. }
  185. time {
  186. display: bloc;
  187. margin-left: 0 !important;
  188. }
  189. ul, ol {
  190. margin: 2rem;
  191. }
  192. ul {
  193. list-style-type: square;
  194. }
  195. a {
  196. text-decoration-skip-ink: auto;
  197. text-decoration-thickness: 0.05em;
  198. text-underline-offset: 0.09em;
  199. }
  200. article {
  201. max-width: 50rem;
  202. display: flex;
  203. flex-direction: column;
  204. margin: 2rem auto;
  205. }
  206. article.single {
  207. border-top: .2vh dotted #2d7474;
  208. margin: -6rem auto 1rem auto;
  209. background: #f0f0ea;
  210. padding: 2rem;
  211. }
  212. article p:last-child {
  213. margin-bottom: 1rem;
  214. }
  215. p {
  216. padding: 0 .5rem;
  217. margin-left: 3rem;
  218. }
  219. p + p,
  220. figure + p {
  221. margin-top: 2rem;
  222. }
  223. blockquote {
  224. background-color: #e3e1e1;
  225. border-left: .5vw solid #2d7474;
  226. display: flex;
  227. flex-direction: column;
  228. align-items: center;
  229. padding: 1rem;
  230. margin: 1.5rem;
  231. }
  232. blockquote cite {
  233. font-style: italic;
  234. }
  235. blockquote p {
  236. margin-left: 0;
  237. }
  238. figure {
  239. border-top: .2vh solid #2d7474;
  240. background-color: #e3e1e1;
  241. text-align: center;
  242. padding: 1.5rem 0;
  243. margin: 1rem 0 0;
  244. font-size: 1.5rem;
  245. width: 100%;
  246. }
  247. figure img {
  248. max-width: 250px;
  249. max-height: 250px;
  250. border: .5vw solid #323a45;
  251. padding: 1px;
  252. }
  253. figcaption {
  254. padding: 1rem;
  255. line-height: 1.4;
  256. }
  257. aside {
  258. display: flex;
  259. flex-direction: column;
  260. background-color: #e3e1e1;
  261. padding: 1rem 0;
  262. border-bottom: .2vh solid #07486c;
  263. }
  264. aside p {
  265. max-width: 50rem;
  266. margin: 0 auto;
  267. }
  268. /* https://fvsch.com/code/css-locks/ */
  269. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  270. font-size: 1rem;
  271. line-height: calc( 1.5em + 0.2 * 1rem );
  272. }
  273. h1 {
  274. font-size: 1.9rem;
  275. line-height: calc( 1.2em + 0.2 * 1rem );
  276. }
  277. h2 {
  278. font-size: 1.6rem;
  279. line-height: calc( 1.3em + 0.2 * 1rem );
  280. }
  281. h3 {
  282. font-size: 1.35rem;
  283. line-height: calc( 1.4em + 0.2 * 1rem );
  284. }
  285. @media (min-width: 20em) {
  286. /* The (100vw - 20rem) / (50 - 20) part
  287. resolves to 0-1rem, depending on the
  288. viewport width (between 20em and 50em). */
  289. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  290. font-size: calc( 1rem + .6 * (100vw - 20rem) / (50 - 20) );
  291. line-height: calc( 1.5em + 0.2 * (100vw - 50rem) / (20 - 50) );
  292. margin-left: 0;
  293. }
  294. h1 {
  295. font-size: calc( 1.9rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  296. line-height: calc( 1.2em + 0.2 * (100vw - 50rem) / (20 - 50) );
  297. }
  298. h2 {
  299. font-size: calc( 1.5rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  300. line-height: calc( 1.3em + 0.2 * (100vw - 50rem) / (20 - 50) );
  301. }
  302. h3 {
  303. font-size: calc( 1.35rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  304. line-height: calc( 1.4em + 0.2 * (100vw - 50rem) / (20 - 50) );
  305. }
  306. }
  307. @media (min-width: 50em) {
  308. /* The right part of the addition *must* be a
  309. rem value. In this example we *could* change
  310. the whole declaration to font-size:2.5rem,
  311. but if our baseline value was not expressed
  312. in rem we would have to use calc. */
  313. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  314. font-size: calc( 1rem + .6 * 1rem );
  315. line-height: 1.5em;
  316. }
  317. p, li, pre, details {
  318. margin-left: 3rem;
  319. }
  320. h1 {
  321. font-size: calc( 1.9rem + 1.5 * 1rem );
  322. line-height: 1.2em;
  323. }
  324. h2 {
  325. font-size: calc( 1.5rem + 1.5 * 1rem );
  326. line-height: 1.3em;
  327. }
  328. h3 {
  329. font-size: calc( 1.35rem + 1.5 * 1rem );
  330. line-height: 1.4em;
  331. }
  332. figure img {
  333. max-width: 500px;
  334. max-height: 500px;
  335. }
  336. }
  337. figure.unsquared {
  338. margin-bottom: 1.5rem;
  339. }
  340. figure.unsquared img {
  341. height: inherit;
  342. }
  343. @media print {
  344. body { font-size: 100%; }
  345. a:after { content: " (" attr(href) ")"; }
  346. a, a:link, a:visited, a:after {
  347. text-decoration: underline;
  348. text-shadow: none !important;
  349. background-image: none !important;
  350. background: white;
  351. color: black;
  352. }
  353. abbr[title] { border-bottom: 0; }
  354. abbr[title]:after { content: " (" attr(title) ")"; }
  355. img { page-break-inside: avoid; }
  356. @page { margin: 2cm .5cm; }
  357. h1, h2, h3 { page-break-after: avoid; }
  358. p3 { orphans: 3; widows: 3; }
  359. img {
  360. max-width: 250px !important;
  361. max-height: 250px !important;
  362. }
  363. nav, aside { display: none; }
  364. }
  365. ul.with_columns {
  366. column-count: 1;
  367. }
  368. @media (min-width: 20em) {
  369. ul.with_columns {
  370. column-count: 2;
  371. }
  372. }
  373. @media (min-width: 50em) {
  374. ul.with_columns {
  375. column-count: 3;
  376. }
  377. }
  378. ul.with_two_columns {
  379. column-count: 1;
  380. }
  381. @media (min-width: 20em) {
  382. ul.with_two_columns {
  383. column-count: 1;
  384. }
  385. }
  386. @media (min-width: 50em) {
  387. ul.with_two_columns {
  388. column-count: 2;
  389. }
  390. }
  391. .gallery {
  392. display: flex;
  393. flex-wrap: wrap;
  394. justify-content: space-around;
  395. }
  396. .gallery figure img {
  397. margin-left: 1rem;
  398. margin-right: 1rem;
  399. }
  400. .gallery figure figcaption {
  401. font-family: 'ConcourseT3'
  402. }
  403. footer {
  404. font-family: 'ConcourseT3';
  405. display: flex;
  406. flex-direction: column;
  407. border-top: 3px solid white;
  408. padding: 4rem 0;
  409. background-color: #07486c;
  410. color: white;
  411. }
  412. footer > * {
  413. max-width: 50rem;
  414. margin: 0 auto;
  415. }
  416. footer a {
  417. color: #f1c40f;
  418. }
  419. footer .avatar {
  420. width: 200px;
  421. height: 200px;
  422. border-radius: 50%;
  423. float: left;
  424. -webkit-shape-outside: circle();
  425. shape-outside: circle();
  426. margin-right: 2rem;
  427. padding: 2px 5px 5px 2px;
  428. background: white;
  429. border-left: 1px solid #f1c40f;
  430. border-top: 1px solid #f1c40f;
  431. border-right: 5px solid #f1c40f;
  432. border-bottom: 5px solid #f1c40f;
  433. }
  434. </style>
  435. <h1 class="single">
  436. <span><a id="jumper" href="#jumpto" title="Un peu perdu ?">?</a></span>
  437. Intemporels
  438. <time>Publié le 27 décembre</time>
  439. </h1>
  440. <article class="single">
  441. <p><em>Une liste d’articles qui ne prennent pas trop de rides. J’aime beaucoup ce qu’a fait <a href="https://wdrl.info/evergreen/">Anselm Hannemann</a> alors voici un espace que je vais mettre à jour au gré de mes lectures. Ça me permettra aussi de lier des références mises en cache dans le futur. L’ordre n’est pas significatif.</em></p>
  442. <p>Bonne lecture !</p>
  443. <hr />
  444. <p><a name="humans" href="#humans">⚓︎</a></p>
  445. <blockquote>
  446. <p>User experience design has led us to use a certain vocabulary: Instead of seeing human beings with goals and attitudes, we see users. We use words like subscribers, subs, visitors, spenders, whales or even just “traffic” or “installs” to refer to them. We assign a role to them. UX design dehumanizes people.</p>
  447. <p><cite><em><a href="https://johannesippen.com/2019/humans-not-users/">Humans, not Users</a></em> (<a href="/david/cache/85dd627b08fa417c198d95acfc8e6aa0/">cache</a>)</cite></p>
  448. </blockquote>
  449. <hr />
  450. <p><a name="empathy" href="#empathy">⚓︎</a></p>
  451. <blockquote>
  452. <p>In UX, empathy enables us to understand not only our users’ immediate frustrations, but also their hopes, fears, abilities, limitations, reasoning, and goals. It allows us to dig deep into our understanding of the user and create solutions that will not only solve a need, but effectively improve our users’ lives by removing unnecessary pain or friction. Instead of just designing an accessible website, practicing empathy is using a screen reader, blindfolded, in order to complete a task on your own website.</p>
  453. <p><cite><em><a href="https://www.nngroup.com/articles/sympathy-vs-empathy-ux/">Sympathy vs. Empathy in UX</a></em> (<a href="/david/cache/eae184de757f4384212d32a1273772cd/">cache</a>)</cite></p>
  454. </blockquote>
  455. <hr />
  456. <p><a name="noreply" href="#noreply">⚓︎</a></p>
  457. <blockquote>
  458. <p>You want your customers to be talking to you. You want them sharing ideas and experiences with you. Instead of a no-reply, set it to your support email address. Make sure someone will see any replies that a customer sends. Sure, you’re going to get lots of auto-responders. That’s why your email app has filter and rules you can set up.</p>
  459. <p><cite><em><a href="https://m.signalvnoise.com/no-reply-addresses/">No Reply Addresses</a></em> (<a href="/david/cache/0b96c949ec0089286a634baa9684318c/">cache</a>)</cite></p>
  460. </blockquote>
  461. <hr />
  462. <p><a name="ethics" href="#ethics">⚓︎</a></p>
  463. <blockquote>
  464. <p>In everyday language, the word “ethics” is used as a synonym for morals. And in everyday discussions that is just fine. Morals sounds old fashioned, conservative, unscientific. We say “ethics” even though, strictly speaking, we mean morals. When it comes to discussing the “ethics” or the morality of our industry, we need to understand our basic moral beliefs.</p>
  465. <p><cite><em><a href="https://ia.net/topics/ethics-and-ethics">“Ethics” and Ethics</a></em> (<a href="/david/cache/c7620deb7c5227e16a8e5c5207f8e28b/">cache</a>)</cite></p>
  466. </blockquote>
  467. <hr />
  468. <p><a name="privacy" href="#privacy">⚓︎</a></p>
  469. <blockquote>
  470. <p>This is, by the way, the dirty secret of the machine learning movement: almost everything produced by ML could have been produced, more cheaply, using a very dumb heuristic you coded up by hand, because mostly the ML is trained by feeding it examples of what humans did while following a very dumb heuristic. There’s no magic here.</p>
  471. <p><cite><em><a href="https://apenwarr.ca/log/20190201">Forget privacy: you’re terrible at targeting anyway</a></em> (<a href="/david/cache/abe583967cb53a01298d4b073cb406ad/">cache</a>)</cite></p>
  472. </blockquote>
  473. <hr />
  474. <p><a name="noms" href="#noms">⚓︎</a></p>
  475. <blockquote>
  476. <p>Les personnes chargées de créer des formulaires, des bases de données ou des ontologies ignorent souvent la façon dont les noms changent d’un pays à l’autre. Elles conçoivent leurs formulaires et leurs bases de données sans se rendre compte de l’effort demandé pour un utilisateur étranger. Cet article vous présentera d’abord les différents styles utilisés pour un nom de personne, puis détaillera quelques incidences possibles pour les gérer au mieux sur le Web.</p>
  477. <p><cite><em><a href="https://www.w3.org/International/questions/qa-personal-names">Noms de personnes à travers le monde</a></em> (<a href="/david/cache/c893cbc0aedae4e797a69270c50b5c25/">cache</a>)</cite></p>
  478. </blockquote>
  479. <p><a href="https://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/">Voir aussi</a> (<a href="/david/cache/61fb6db44e7173cd9318753c955f7dda/">cache</a>).</p>
  480. <hr />
  481. <p><a name="opensource" href="#opensource">⚓︎</a></p>
  482. <blockquote>
  483. <p>Communities prior to the advent of coinage didn’t seek to settle their trades on the spot, at least not within those communities. They relied on much more egalitarian long-running concepts of reciprocity. Forms much closer to the communist slogans of “from each according to his ability, to each according to his needs” than the quid pro quo paradigm we all take for granted in today’s market-based societies.</p>
  484. <p><cite><em><a href="https://m.signalvnoise.com/open-source-beyond-the-market/">Open source beyond the market</a></em> (<a href="/david/cache/b97a637aaaabbf5b82b172fe781dc7f6/">cache</a>)</cite></p>
  485. </blockquote>
  486. <hr />
  487. <p><a name="search" href="#search">⚓︎</a></p>
  488. <blockquote>
  489. <p>Search is a deceptively complex field, where competence is hard-won through training, practice, and experience. The list stands at a total of 105 falsehoods. I couldn’t mash up the ole 99-problems meme with this to cull 6 unworthy items, because they are all worthy.</p>
  490. <p><cite><em><a href="https://opensourceconnections.com/blog/2019/05/29/falsehoods-programmers-believe-about-search/">Falsehoods Programmers Believe About Search</a></em> (<a href="/david/cache/626468d153ec2e83731dbbd7133af224/">cache</a>)</cite></p>
  491. </blockquote>
  492. <hr />
  493. <p><a name="assets" href="#assets">⚓︎</a></p>
  494. <blockquote>
  495. <p>There really is very little reason to leave your static assets on anyone else’s infrastructure. The perceived benefits are often a myth, and even if they weren’t, the trade-offs simply aren’t worth it. Loading assets from multiple origins is demonstrably slower. Take ten minutes over the next few days to audit your projects, and fetch any off-site static assets under your own control.</p>
  496. <p><cite><em><a href="https://csswizardry.com/2019/05/self-host-your-static-assets/">Self-Host Your Static Assets</a></em> (<a href="/david/cache/6f8793385f7b1ea2511bf614b5287397/">cache</a>)</cite></p>
  497. </blockquote>
  498. <hr />
  499. <p><a name="projector" href="#projector">⚓︎</a></p>
  500. <blockquote>
  501. <p>The Projector Test is my favorite “gut check” manual UI test, and I encourage you to use it early, often, and especially when ironing out final visual specs. It doesn’t substitute for testing out a functional version of your site in a variety of environments — browsers, form factors, screen resolutions, operating systems, screen orientations, screen readers, etc. — but it’s a good place to start. Embrace your conference room’s projector and challenge yourself to make your designs look stellar on even the fuzziest, most washed-out of screens.</p>
  502. <p><cite><em><a href="https://medium.com/salesforce-ux/projectors-dont-lie-b85ef628b04">Projectors don’t lie.</a></em> (<a href="/david/cache/ffe10a872d4fd33d7fc24b4cb38528db/">cache</a>)</cite></p>
  503. </blockquote>
  504. <hr />
  505. <p><a name="performance" href="#performance">⚓︎</a></p>
  506. <blockquote>
  507. <p>You know what’s better than perceived performance? Actual performance. Avoid techniques that merely provide a mirage of speed.</p>
  508. <p>Instead, declutter and optimise the foundations of your design system which will result in less weight, less complexity, less distraction, less hassle and ultimately, less bull shit.</p>
  509. <p><cite><em><a href="https://adamsilver.io/articles/designing-for-actual-performance/">Designing for actual performance</a></em> (<a href="/david/cache/4f3420365156f407064711f8cc0f45d6/">cache</a>)</cite></p>
  510. </blockquote>
  511. <hr />
  512. <p><a name="plaintext" href="#plaintext">⚓︎</a></p>
  513. <blockquote>
  514. <p>Ultimately, in email, less is more.</p>
  515. <p>This can be a tough pill for marketers to swallow (myself included) because we’re naturally driven to be creative. But data repeatedly shows plain-text email wins, so it’s up to us to decide whether or not we want to make the switch. </p>
  516. <p><cite><em><a href="https://blog.hubspot.com/marketing/plain-text-vs-html-emails-data">Plain Text vs. HTML Emails: Which Is Better?</a></em> (<a href="/david/cache/f46d27e60634cd0c0769fd59c28250d6/">cache</a>)</cite></p>
  517. </blockquote>
  518. <hr />
  519. <p><a name="feature-flags" href="#feature-flags">⚓︎</a></p>
  520. <blockquote>
  521. <p>You want to avoid branching for this work if at all possible, based on previous painful experiences of merging long-lived branches in the past. Instead, you decide that the entire team will continue to work on trunk, but the developers working on the Spline Reticulation improvements will use a Feature Toggle to prevent their work from impacting the rest of the team or destabilizing the codebase.</p>
  522. <p><cite><em><a href="https://martinfowler.com/articles/feature-toggles.html">Feature Toggles (aka Feature Flags)</a></em> (<a href="/david/cache/7c569b2880bd3ed844e039a322b9731d/">cache</a>)</cite></p>
  523. </blockquote>
  524. <hr />
  525. <p><a name="timezones" href="#timezones">⚓︎</a></p>
  526. <blockquote>
  527. <p>Always measure and store time in UTC. If you need to record where the time was taken, store that separately. Do not store the local time + timezone information!</p>
  528. <p><cite><em><a href="http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/">“Eppur si muove!” – Dealing with Timezones in Python</a></em> (<a href="/david/cache/3caf29e374bca01d6b9cab9a618ee830/">cache</a>)</cite></p>
  529. </blockquote>
  530. <hr />
  531. <p><a name="do-nothing" href="#do-nothing">⚓︎</a></p>
  532. <blockquote>
  533. <p>This script doesn’t actually do any of the steps of the procedure. That’s why it’s called a do-nothing script. It feeds the user a step at a time and waits for them to complete each step manually.</p>
  534. <p>At first glance, it might not be obvious that this script provides value. Maybe it looks like all we’ve done is make the instructions harder to read. But the value of a do-nothing script is immense</p>
  535. <p><cite><em><a href="https://blog.danslimmon.com/2019/07/15/do-nothing-scripting-the-key-to-gradual-automation/">Do-nothing scripting: the key to gradual automation</a></em> (<a href="/david/cache/00a288de97e8a854d5fdfe03ba2bcf72/">cache</a>)</cite></p>
  536. </blockquote>
  537. <hr />
  538. <p><a name="intuitive-ux" href="#intuitive-ux">⚓︎</a></p>
  539. <blockquote>
  540. <p>When I started as a professional UX designer, I was shocked how many times my clients would hand me the initial wireframes (or the living, breathing, in-browser MVP) and there’d be completely obvious UX mistakes all over them. I’m not talking about things you need hours of research and A/B testing to discover. I’m talking, like, dead simple mistakes.</p>
  541. <p><cite><em><a href="https://learnui.design/blog/4-rules-intuitive-ux.html">4 Rules for Intuitive UX</a></em> (<a href="/david/cache/f599501674792192b83b5bbc2d7e5324/">cache</a>)</cite></p>
  542. </blockquote>
  543. <hr />
  544. <p><a name="form-design" href="#form-design">⚓︎</a></p>
  545. <blockquote>
  546. <p>So, if I was designing a new form, I’d want to know how to avoid the common issues. And to use my time to solve newer and perhaps more difficult problems.</p>
  547. <p>Seriously, who wants to spend time solving something that’s already been solved?</p>
  548. <p><cite><em><a href="https://adamsilver.io/articles/form-design-from-zero-to-hero-all-in-one-blog-post/">Form design: from zero to hero all in one blog post</a></em> (<a href="/david/cache/ea6f3644381c108795010c0ae6aee332/">cache</a>)</cite></p>
  549. </blockquote>
  550. <hr />
  551. <p><a name="passwords" href="#passwords">⚓︎</a></p>
  552. <blockquote>
  553. <p>Vous voulez que votre mot de passe résiste à un voisin malveillant prêt à mettre plus de 10 € sur la table ? Prévoyez au moins 10 carac­tères.</p>
  554. <p>Et là, seconde magie : Si vous mettez 10 carac­tères on se moque de savoir si vous y avez mis des chiffres ou symboles. La longueur a bien plus d’im­por­tance que l’éven­tail de carac­tères utilisé.</p>
  555. <p><cite><em><a href="https://n.survol.fr/n/developpeurs-vous-devriez-avoir-honte-regles-de-mots-de-passe">Développeurs, vous devriez avoir honte</a></em> (<a href="/david/cache/f77e84e4666177057f83bf901b4c5b68/">cache</a>)</cite></p>
  556. </blockquote>
  557. <hr />
  558. <p><a name="burnt-pizza" href="#burnt-pizza">⚓︎</a></p>
  559. <blockquote>
  560. <p>Say you’re trying to test whether people like pizza. If you serve them burnt pizza, you’re not getting feedback on whether they like pizza. You only know that they don’t like burnt pizza. Similarly, when you’re only relying on the MVP, the fastest and cheapest functional prototype, you risk not actually testing your product, but rather a poor or flawed version of it.</p>
  561. <p><cite><em><a href="https://firstround.com/review/dont-serve-burnt-pizza-and-other-lessons-in-building-minimum-lovable-products/">Don’t Serve Burnt Pizza (And Other Lessons in Building Minimum Lovable Products)</a></em> (<a href="/david/cache/2ba49645e8cd27503661e03a73bbac37/">cache</a>)</cite></p>
  562. </blockquote>
  563. <hr />
  564. <p><a name="advertising" href="#advertising">⚓︎</a></p>
  565. <blockquote>
  566. <p>In 2018 $273bn was spent on digital ads globally. We delve into the world of clicks, banners and keywords to find out if any of it is real. What do we really know about the effectiveness of digital advertising?</p>
  567. <p><cite><em><a href="https://thecorrespondent.com/100/the-new-dot-com-bubble-is-here-its-called-online-advertising/13228924500-22d5fd24">The new dot com bubble is here: it’s called online advertising</a></em> (<a href="/david/cache/9ecfef782dcd4d2a31f763e7b98c4c13/">cache</a>)</cite></p>
  568. </blockquote>
  569. <hr />
  570. <p><em>Est-ce qu’il y aurait des publications de cet espace que vous mettriez dans une telle liste ? Je fais ma propre liste en pied de page et je serais curieux de savoir si elle diffère de la vôtre :-).</em></p>
  571. </article>
  572. <nav id="jumpto">
  573. <p>
  574. <a rel=prev href="/david/stream/2019/12/24/">← Outils</a> | <a href="/david/stream/2019/" title="Retour à la liste complète">↑ Liste complète</a> | <a rel=next href="/david/stream/2019/12/31/">Merci →</a>
  575. </p>
  576. </nav>
  577. <footer>
  578. <div>
  579. <img src="/static/david/david-larlet-avatar.jpg" loading="lazy" class="avatar" width="200" height="200">
  580. <p>
  581. Bonjour/Hi!
  582. 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>
  583. 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>).
  584. </p>
  585. <p>
  586. 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>.
  587. </p>
  588. <p>
  589. Les dernières publications hebdomadaires sont :
  590. </p>
  591. <ul class="with_columns">
  592. <li>
  593. <a href="/david/stream/2019/12/31/">Merci</a>
  594. </li>
  595. <li>
  596. <a href="/david/stream/2019/12/27/">Intemporels</a>
  597. </li>
  598. <li>
  599. <a href="/david/stream/2019/12/24/">Outils</a>
  600. </li>
  601. <li>
  602. <a href="/david/stream/2019/12/17/">Origines</a>
  603. </li>
  604. <li>
  605. <a href="/david/stream/2019/12/10/">Publier</a>
  606. </li>
  607. <li>
  608. <a href="/david/stream/2019/12/03/">En forêt</a>
  609. </li>
  610. <li>
  611. <a href="/david/stream/2019/11/26/">Ecocentric</a>
  612. </li>
  613. <li>
  614. <a href="/david/stream/2019/11/19/">Se livrer</a>
  615. </li>
  616. <li>
  617. <a href="/david/stream/2019/11/12/">Dépendances</a>
  618. </li>
  619. <li>
  620. <a href="/david/stream/2019/11/05/">Positif</a>
  621. </li>
  622. <li>
  623. <a href="/david/stream/2019/10/29/">Dettes</a>
  624. </li>
  625. <li>
  626. <a href="/david/stream/2019/10/22/">Privilèges</a>
  627. </li>
  628. <li>
  629. <a href="/david/stream/2019/10/15/">Discrétion</a>
  630. </li>
  631. <li>
  632. <a href="/david/stream/2019/10/08/">Désespérance</a>
  633. </li>
  634. <li>
  635. <a href="/david/stream/2019/10/01/">Présent</a>
  636. </li>
  637. <li>
  638. <a href="/david/stream/2019/09/24/">Manifester</a>
  639. </li>
  640. <li>
  641. <a href="/david/stream/2019/09/17/">Arpenter</a>
  642. </li>
  643. <li>
  644. <a href="/david/stream/2019/09/10/">Nostalgie</a>
  645. </li>
  646. <li>
  647. <a href="/david/stream/2019/09/03/">Déconstruire</a>
  648. </li>
  649. <li>
  650. <a href="/david/stream/2019/08/27/">Documenter</a>
  651. </li>
  652. <li>
  653. <a href="/david/stream/2019/08/20/">Frustration</a>
  654. </li>
  655. <li>
  656. <a href="/david/stream/2019/08/13/">Holisme</a>
  657. </li>
  658. <li>
  659. <a href="/david/stream/2019/08/06/">1%</a>
  660. </li>
  661. <li>
  662. <a href="/david/stream/2019/07/30/">Exemplarité</a>
  663. </li>
  664. <li>
  665. <a href="/david/stream/2019/07/23/">Timelines</a>
  666. </li>
  667. <li>
  668. <a href="/david/stream/2019/07/16/">Écoute</a>
  669. </li>
  670. <li>
  671. <a href="/david/stream/2019/07/02/">Anxiété</a>
  672. </li>
  673. <li>
  674. <a href="/david/stream/2019/06/21/">À lier</a>
  675. </li>
  676. <li>
  677. <a href="/david/stream/2019/06/14/">Pauvreté</a>
  678. </li>
  679. <li>
  680. <a href="/david/stream/2019/06/07/">Amateur</a>
  681. </li>
  682. <li>
  683. <a href="/david/stream/2019/05/31/">Pollution</a>
  684. </li>
  685. <li>
  686. <a href="/david/stream/2019/05/24/">Apaisement</a>
  687. </li>
  688. <li>
  689. <a href="/david/stream/2019/05/10/">Folie</a>
  690. </li>
  691. <li>
  692. <a href="/david/stream/2019/05/03/">Sympathie</a>
  693. </li>
  694. <li>
  695. <a href="/david/stream/2019/04/12/">Péremption</a>
  696. </li>
  697. <li>
  698. <a href="/david/stream/2019/04/05/">Définitions</a>
  699. </li>
  700. <li>
  701. <a href="/david/stream/2019/03/29/">Acceptation</a>
  702. </li>
  703. <li>
  704. <a href="/david/stream/2019/03/22/">Dissonance</a>
  705. </li>
  706. <li>
  707. <a href="/david/stream/2019/03/15/">Reconnaissance</a>
  708. </li>
  709. <li>
  710. <a href="/david/stream/2019/03/08/">Lecture</a>
  711. </li>
  712. <li>
  713. <a href="/david/stream/2019/03/01/">Journaux</a>
  714. </li>
  715. <li>
  716. <a href="/david/stream/2019/02/22/">Écriture</a>
  717. </li>
  718. <li>
  719. <a href="/david/stream/2019/02/15/">Kyriarchie</a>
  720. </li>
  721. <li>
  722. <a href="/david/stream/2019/02/08/">Mots-serrures</a>
  723. </li>
  724. <li>
  725. <a href="/david/stream/2019/02/01/">Sans voie</a>
  726. </li>
  727. <li>
  728. <a href="/david/stream/2019/01/25/">Auto-diagnostic</a>
  729. </li>
  730. <li>
  731. <a href="/david/stream/2019/01/18/">Agilité</a>
  732. </li>
  733. <li>
  734. <a href="/david/stream/2019/01/11/">Métaphores</a>
  735. </li>
  736. <li>
  737. <a href="/david/stream/2019/01/04/">Balbutiements</a>
  738. </li>
  739. </ul>
  740. <p>
  741. Voici quelques articles choisis :
  742. <a href="/david/blog/2019/faire-equipe/" title="Accéder à l’article complet">Faire équipe</a>,
  743. <a href="/david/blog/2018/bivouac-automnal/" title="Accéder à l’article complet">Bivouac automnal</a>,
  744. <a href="/david/blog/2018/commodite-effondrement/" title="Accéder à l’article complet">Commodité et effondrement</a>,
  745. <a href="/david/blog/2017/donnees-communs/" title="Accéder à l’article complet">Des données aux communs</a>,
  746. <a href="/david/blog/2016/accompagner-enfant/" title="Accéder à l’article complet">Accompagner un enfant</a>,
  747. <a href="/david/blog/2016/senior-developer/" title="Accéder à l’article complet">Senior developer</a>,
  748. <a href="/david/blog/2016/illusion-sociale/" title="Accéder à l’article complet">L’illusion sociale</a>,
  749. <a href="/david/blog/2016/instantane-scopyleft/" title="Accéder à l’article complet">Instantané Scopyleft</a>,
  750. <a href="/david/blog/2016/enseigner-web/" title="Accéder à l’article complet">Enseigner le Web</a>,
  751. <a href="/david/blog/2016/simplicite-defaut/" title="Accéder à l’article complet">Simplicité par défaut</a>,
  752. <a href="/david/blog/2016/minimalisme-esthetique/" title="Accéder à l’article complet">Minimalisme et esthétique</a>,
  753. <a href="/david/blog/2014/un-web-omni-present/" title="Accéder à l’article complet">Un web omni-présent</a>,
  754. <a href="/david/blog/2014/manifeste-developpeur/" title="Accéder à l’article complet">Manifeste de développeur</a>,
  755. <a href="/david/blog/2013/confort-convivialite/" title="Accéder à l’article complet">Confort et convivialité</a>,
  756. <a href="/david/blog/2013/testament-numerique/" title="Accéder à l’article complet">Testament numérique</a>,
  757. et <a href="/david/blog/" title="Accéder aux archives">bien d’autres…</a>
  758. </p>
  759. <p>
  760. 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>.
  761. </p>
  762. <p>
  763. Je ne traque pas ta navigation mais mon
  764. <abbr title="Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33.184162340">hébergeur</abbr>
  765. conserve des logs d’accès.
  766. </p>
  767. </div>
  768. </footer>
  769. <script type="text/javascript">
  770. ;(_ => {
  771. const jumper = document.getElementById('jumper')
  772. jumper.addEventListener('click', e => {
  773. e.preventDefault()
  774. const anchor = e.target.getAttribute('href')
  775. const targetEl = document.getElementById(anchor.substring(1))
  776. targetEl.scrollIntoView({behavior: 'smooth'})
  777. })
  778. })()
  779. </script>
  780. <script>
  781. /* Service workers */
  782. if (navigator.serviceWorker) {
  783. window.addEventListener('load', function () {
  784. var selector = 'a[href^="/david/cache/"], a[rel=prev], a[rel=next]'
  785. function sendLinks (selector) {
  786. var links = [].slice.call(document.querySelectorAll(selector)).map(function (link) {
  787. return link.getAttribute('href')
  788. })
  789. links.push(location.pathname) // Put the current page in cache too.
  790. navigator.serviceWorker.controller.postMessage({ links: links })
  791. }
  792. navigator.serviceWorker.getRegistration()
  793. .then(function (registration) {
  794. if (!registration || !navigator.serviceWorker.controller) {
  795. return navigator.serviceWorker.register('/serviceworker.js')
  796. .then(navigator.serviceWorker.ready)
  797. .then(function () {
  798. console.log('[ServiceWorker] Ready to go!')
  799. })
  800. .catch(console.error.bind(console))
  801. } else {
  802. console.log('[ServiceWorker] Send links via registration')
  803. sendLinks(selector)
  804. }
  805. })
  806. navigator.serviceWorker.addEventListener('controllerchange', function () {
  807. console.log('[ServiceWorker] Send links via controller change')
  808. sendLinks(selector)
  809. })
  810. navigator.serviceWorker.addEventListener('message', function (event) {
  811. var link = document.querySelector('a[href="' + event.data.link + '"]')
  812. if (event.data.status && link) {
  813. link.style.backgroundColor = '#2d7474'
  814. link.style.color = '#f0f0ea'
  815. link.setAttribute('title', 'En cache pour consultation sans connexion')
  816. }
  817. })
  818. })
  819. } else {
  820. console.warn('[ServiceWorker] No cache for old browsers.')
  821. }
  822. </script>