5. A home on the Internet — Ludovic Courtès — Meta-chapter

Introducing Document Programming. Skribilo rules actually. The following graph shows the evolution of the source file size (in bytes):

Source file size vs. time graph
.


  1: ;;; -*- mode: skribe; coding: iso-8859-1; -*-
  2: ;;;
  3: 
  4: (let ((srfi-19 (resolve-module '(srfi srfi-19))))
  5:   ;; This hack keeps Guile from complaining.
  6:   (module-replace! srfi-19 '(current-time)))
  7: 
  8: 
  9: (use-modules (srfi srfi-19) ;; date
 10:              (srfi srfi-13) ;; strings
 11:               (ice-9 optargs)
 12:               (ice-9 popen)
 13:              (ice-9 rdelim)
 14: 
 15:               (skribilo ast)
 16:               (skribilo reader)
 17:               (skribilo engine)
 18:               (skribilo parameters)
 19:               (skribilo biblio)
 20:               (skribilo biblio bibtex)
 21:               (skribilo utils strings)
 22:               (skribilo package web-book)
 23:               (skribilo source lisp))
 24: 
 25: 
 26: (define %skribilo-url   "http://www.nongnu.org/skribilo/")
 27: (define %skribe-url     "http://www-sop.inria.fr/mimosa/fp/Skribe/")
 28: (define %guile-url      "http://www.gnu.org/software/guile/")
 29: (define %scheme-url     "http://schemers.org/")
 30: (define %lout-url       "http://lout.sf.net/")
 31: 
 32: (define %txt2tags-url   "http://txt2tags.sf.net/")
 33: (define %plaindoc-url   "http://mercnet.pt/plaindoc/pd.html")
 34: 
 35: (define skribe-read     (make-reader 'skribe))
 36: 
 37: 
 38: 
 39: ;;;
 40: ;;; Bibliography handling.
 41: ;;;
 42: 
 43: (define %bibliography-themes
 44:   ;; A list of theme-file name pairs.
 45:   (with-input-from-file (search-path (*bib-path*) "bibliography-themes.scm")
 46:          read))
 47: 
 48: (define (read-bibliography file)
 49:   ;; Read a bibliography from `file' and return its list of entries.
 50:   (let ((file (search-path (*bib-path*) file)))
 51:     (format (current-error-port) "reading `~a'...~%" file)
 52:     (with-input-from-file file
 53:       (lambda ()
 54:         (let loop ((entry (skribe-read))
 55:                    (result '()))
 56:           (if (eof-object? entry)
 57:               result
 58:               (loop (skribe-read)
 59:                     (append result (list entry)))))))))
 60: 
 61: (define *bibliography-entry-count* 0)
 62: 
 63: (define (make-bib-tuple theme file table)
 64:   (vector theme file table))
 65: (define (bib-tuple-theme t) (vector-ref t 0))
 66: (define (bib-tuple-file  t) (vector-ref t 1))
 67: (define (bib-tuple-table t) (vector-ref t 2))
 68: 
 69: (define *bibliographies*
 70:   ;; A list of theme+file+table tuples.
 71:   (map (lambda (pair)
 72:           (let* ((theme (car pair))
 73:                  (file  (cdr pair))
 74:                  (table (make-bib-table theme))
 75:                  (entries (read-bibliography file)))
 76:             (set! *bibliography-entry-count*
 77:                   (+ (length entries) *bibliography-entry-count*))
 78:             (apply bibliography
 79:                    `(:bib-table ,table ,@entries))
 80:             (make-bib-tuple theme file table)))
 81:        %bibliography-themes))
 82: 
 83: 
 84: ;;;
 85: ;;; Bibliography customization.
 86: ;;;
 87: 
 88: (define (make-bibtex-file entry)
 89:    ;; Produce a BibTeX file for `entry' and return its name.
 90:    (let ((file (string-append "+bibtex/" (markup-ident entry) ".bib")))
 91:       (with-output-to-file file
 92:          (lambda ()
 93:            (print-as-bibtex-entry entry)))
 94:       file))
 95: 
 96: (define (make-human-readable-bib-entry entry)
 97:    ;; Return a list of strings and markups representing `entry'.
 98:   (define (fixup-url url)
 99:     ((make-string-replace '((#\: "%3A")
100:                             (#\space "%2A")))
101:      url))
102: 
103:    (let* ((title (markup-option entry 'title))
104:            (author (markup-option entry 'author))
105:            (url (markup-option entry 'url))
106:            (institution (markup-option entry 'institution))
107:            (month (markup-option entry 'month))
108:            (year (markup-option entry 'year))
109:            (journal (markup-option entry 'journal))
110:            (book (markup-option entry 'booktitle))
111:            (notes (or (markup-option entry 'notes)
112:                       (markup-option entry 'note)))
113:            (bibtex-file (make-bibtex-file entry)))
114: ;      (format (current-error-port) "make-human-readable-bib-entry")
115:       `(,(bold (if url
116:                     (ref :url url :text title)
117:                     title))
118:          ,@(list " ["
119:                  (ref :url (fixup-url bibtex-file)
120:                     :text (tt (markup-ident entry)))
121:                  "]")
122:          ,(linebreak)
123:          ,(if author author "")
124:          ,@(if institution
125:                `(" (" ,institution ")")
126:                '())
127:          ,@(if book
128:                (list ", " (it book))
129:                '())
130:          ,@(if journal
131:                (list ", appeared in " (it journal))
132:                '())
133:          ,@(if year
134:                (list ", "
135:                      (if month month "")
136:                      (if month " " "")
137:                      year)
138:                '())
139:          ,@(if notes
140:                (begin ; the body of `notes' may contain markup so we need
141:                       ; to evaluate it
142: ;                   (format (current-error-port)
143: ;                           "eval: ~a~%" (markup-body notes))
144:                   (list (p (eval (markup-body notes)
145:                                  (interaction-environment)))))
146:                '()))))
147: 
148: 
149: (define (make-biblio-list-entry entry)
150:    ;; Return an `item' object whose parent is `parent' and
151:    ;; representing `entry'.
152:    (let ((i (item :ident (markup-ident entry)
153:                 (make-human-readable-bib-entry entry))))
154:       i))
155: 
156: 
157: (define (output-bibliography-table table)
158:   (apply itemize
159:          (bib-map (lambda (ident entry)
160:                     (make-biblio-list-entry entry))
161:                   table)))
162: 
163: 
164: (define (!html cmd)
165:    (if (engine-format? "html")
166:        (list (! cmd))
167:        '()))
168: 
169: (define (my-bib-ref ident . args)
170:   (if (not (null? args))
171:       (format (current-error-port)
172:               "WARNING: `my-bib-ref' args ignored ~a~%" args))
173:   (resolve (lambda (n e env)
174:              (ref :ident ident :text (tt ident)))))
175: 
176: ;; <div id="gnulinux-inside" style="position: absolute; top: 0px; right: 0px;">
177: ;;   <a href="http://gnu.org/">
178: ;;     <img src="https://www.gnu.org/graphics/gnu-inside.png"
179: ;;       alt="GNU/Linux Inside!" title="GNU/Linux Inside!" />
180: ;;   </a>
181: ;; </div>
182: 
183: 
184: 
185: ;;;
186: ;;; Bibliography stats
187: ;;;
188: 
189: (define *ploticus* "ploticus")
190: 
191: (define (file-size file)
192:   (let ((file-info (false-if-exception (stat file))))
193:     (if file-info
194:          (stat:size file-info)
195:          #f)))
196: 
197: (define (stats-plot stats file)
198:    ;; Produce a graph for `stats' and store it in `file'.  This relies
199:    ;; on Bigloo's process and date API.  Moreover, Bigloo has a
200:    ;; special notation for "long" numbers such as Epoch dates,
201:    ;; eg. `#e1100795136' instead of simply `1100795136'.
202:    ;; See http://ploticus.sourceforge.net/doc/prefab_chron_ex.html
203:    (let* ((title (cdr (assoc 'title stats)))
204:            (port (open-pipe*  OPEN_WRITE *ploticus*
205:                               "-png" "-o" file
206:                               "-prefab" "chron"
207:                               "data=-" "x=1"  "y=2" ; "delim=tab"
208:                               "datefmt=yyyy/mm/dd" ; "tab=week"
209:                               "unittype=datetime"
210:                               ;; "stubfmt=M"
211:                               "mode=line" ;; "xinc=1 day"
212:                               (string-append "title=" title)
213:                               "omitweekends=yes")))
214:                               ;;:output "ploticus.log")))
215: 
216:       (let* ((data (cdr (assoc 'data stats)))
217:               (script (apply string-append
218:                              (map (lambda (p)
219:                                      (let* ((t (make-time time-utc 0 (car p)))
220:                                             (d (time-utc->date t))
221:                                             (n2s (lambda (n)
222:                                                    (if (< n 10)
223:                                                        (string-append
224:                                                         "0"
225:                                                         (number->string n))
226:                                                        (number->string n)))))
227:                                         (string-append
228:                                          (n2s (date-year d)) "/"
229:                                          (n2s (date-month d)) "/"
230:                                          (n2s (date-day d)) "."
231:                                          (n2s (date-hour d)) ":"
232:                                          (n2s (date-minute d)) ":"
233:                                          (n2s (date-second d))
234:                                          (string #\tab)
235:                                          (n2s (cdr p)) "\n")))
236:                                   data))))
237:           ;;(format (current-error-port) "script: " script)
238:           (display script port)
239: 
240:           ;(process-wait proc)
241: 
242:           (if ;(not (= 0 (process-exit-status proc)))
243:               (not (= 0 (status:exit-val (close-pipe port))))
244:               (skribe-error 'ploticus
245:                             "Ploticus failed" -1))
246:                             ;(process-exit-status proc)))
247:           
248:           (if (or (not (file-exists? file))
249:                   (= 0 (file-size file)))
250:               (skribe-error 'ploticus
251:                             "Ploticus did not create the image"
252:                             file)
253:               (format (current-error-port)
254:                       "ploticus: created `~a' (~a bytes)~%"
255:                       file (file-size file))))))
256: 
257: (define (stats-open file title)
258:    ;; Read stats from `file' and return a stat alist where `data' is
259:    ;; the key to a list of date-value pairs and `title' is the key to a
260:    ;; title string.
261:    (if (file-exists? file)
262:        (with-input-from-file file
263:            (lambda ()
264:               (read)))
265:        `((title . ,title) (data . ()))))
266: 
267: (define (stats-flush stats file)
268:    ;; Write `stats' to `file'.
269:    (with-output-to-file file
270:       (lambda ()
271:           (write stats))))
272: 
273: (define (stats-update stats date number)
274:    ;; Update `stats' with the `date'-`number' pair.
275:    (let* ((alist-delete    ;; a home-made `alist-delete'
276:             (lambda (key alist . rest)
277:                (let ((pred (if (null? rest) eq? (car rest))))
278:                   (filter (lambda (x)
279:                              (if (pair? x)
280:                                  (not (pred (car x) key))
281:                                  #t))
282:                           alist))))
283:            (data (cdr (assoc 'data stats)))
284:            (latest-values (sort data (lambda (p1 p2)
285:                                         (> (car p1) (car p2)))))
286:            (latest-value (if (null? data) #f (car latest-values)))
287:            (next-to-latest-value (if (or (null? data)
288:                                          (null? (cdr data)))
289:                                      #f
290:                                      (cadr latest-values))))
291:       (cond ((and latest-value next-to-latest-value
292:                    (= (cdr latest-value) number)
293:                    (= (cdr next-to-latest-value) number))
294:               ;; special case: the new value is identical to the last
295:               ;; and next-to-last value.
296:               (begin
297:                  ;; We want to (i) avoid growing the database if the
298:                  ;; new value is identical to the last one and
299:                  ;; (ii) make sure the last value correspond to the
300:                  ;; latest snapshot.  So we check here whether the new
301:                  ;; value is identical to _both_ the last value and the
302:                  ;; next-to-last value, and if so, we replace the last
303:                  ;; value by the new value.
304:                  (format (current-error-port)
305:                          "stats-update: two latest values are identical (~a)~%"
306:                          number)
307:                  (cons `(data . ,(cons `(,date . ,number)
308:                                        (filter (lambda (p)
309:                                                   (not
310:                                                    (eq? (car p)
311:                                                         (car
312:                                                          latest-value))))
313:                                                data)))
314:                        (alist-delete 'data stats))))
315:              
316:              (else
317:               ;; normal case: add the new date-number pair to the stats
318:               (cons `(data . ,(cons `(,date . ,number) data))
319:                     (alist-delete 'data stats))))))
320: 
321: 
322: ;;;
323: ;;; Source file size statistics
324: ;;;
325: 
326: (define *source-stats*
327:    (stats-update (stats-open "source-stats.scm" "Source File Size")
328:                   (time-second (current-time))
329:                   (file-size "ludo.skb")))
330: 
331: (stats-flush *source-stats* "source-stats.scm")
332: (stats-plot  *source-stats* "source-stats.png")
333: 
334: 
335: ;;;
336: ;;; GNU Arch fun.
337: ;;;
338: 
339: (define %current-archive "lcourtes@laas.fr--2006-libre")
340: 
341: (define (archive-outline archive)
342:   "Return a pretty outline of GNU Arch archive @var{archive}."
343: 
344:   (define (read-lines pipe)
345:     (let loop ((line (read-line pipe))
346:                (result '()))
347:       (if (eof-object? line)
348:           (reverse! result)
349:           (loop (read-line pipe)
350:                 (cons line result)))))
351: 
352:   (define (highlight-categories lines)
353:     (let loop ((lines lines)
354:                (result '()))
355:       (if (null? lines)
356:           (reverse! result)
357:           (let ((str (ast->string (car lines))))
358:             (loop (cdr lines)
359:                   (if (string-contains str archive)
360:                       result
361:                       (cons (if (string-contains str "--")
362:                                 (list (make-list 10 (~)) (car lines))
363:                                 (bold (car lines)))
364:                             result)))))))
365: 
366:   (define (insert-linebreaks lines)
367:     (append-map (lambda (line)
368:                   (list line (linebreak)))
369:                 lines))
370: 
371:   (let* ((pipe (open-input-pipe (string-append "tla abrowse --branches -A "
372:                                                archive)))
373:          (lines (read-lines pipe))
374:          (result (insert-linebreaks (highlight-categories (map code lines)))))
375:     (if (not (eq? 0 (status:exit-val (close-pipe pipe))))
376:         (bold [failed to get Arch outline!])
377:         result)))
378: 
379: 
380: ;;;
381: ;;; Overall style customization
382: ;;;
383: 
384: (let ((html (find-engine 'html)))
385:    (engine-custom-set! html 'css "ludo.css")
386:    (engine-custom-set! html 'charset "UTF-8"))
387: 
388: (let ((lout (find-engine 'lout)))
389:    (if lout
390:        (begin
391:            (engine-custom-set! lout 'document-type 'doc))))
392: 
393: (define (---) ; emdash
394:   (resolve (lambda (n e env)
395:              (if (engine-format? "html" e)
396:                  (! "&mdash;")
397:                  "-"))))
398: 
399: (define (--) ; endash
400:   (resolve (lambda (n e env)
401:              (if (engine-format? "html" e)
402:                  (! "&ndash;")
403:                  "-"))))
404: 
405: 
406: ;;;
407: ;;; The webpage.
408: ;;;
409: 
410: (document :title [A home on the Internet ,(---) Ludovic Courtès]
411:            :html-title [Ludovic Courtès ,(---) GNU, Libre Software, and more!]
412:               :keywords '("cooperative backup" "collaborative backup"
413:                       "MoSAIC" "GNU Guile"
414:                        "Skribilo" "Skribe" "Lout")
415: 
416:     (itemize
417:        (item [,(ref :ident "soft" :text [free software hacker])])
418:        (item [,(ref :url "http://people.bordeaux.inria.fr/lcourtes/"
419:        :text [research engineer]) at ,(ref :text [Inria] :url
420:        "http://www.inria.fr/en/")])
421:        (item [,(ref :ident "coop-bak" :text [PhD thesis on cooperative
422: backup]), ,(ref :text [LAAS-CNRS] :url "http://www.laas.fr/"),
423: 2004,(--)2007 (,(ref :ident "publications" :text [publications]))])
424:        (item [,(tt [ludo@chbouib.org]) ,(--) ,(tt [ludo@gnu.org]) ,(--)
425: ,(tt [ludovic.courtes@inria.fr])])
426:          (item [,(ref :url
427:          "http://pgp.mit.edu:11371/pks/lookup?search=0x090B11993D9AEBB5&op=index"
428:          :text (tt [3CE4 6455 8A84 FDC6 9DB4  0CFB 090B 1199 3D9A
429:          EBB5]))
430:            (,(ref :url "http://pgp.cs.uu.nl/stats/3D9AEBB5.html" :text [stats]))])
431:           (item [,(ref :url "key-transition-2015-03-02.txt" :text
432:          [transitioning]) away from ,(ref :url
433:           "http://pgp.mit.edu:11371/pks/lookup?search=0x77DD95E2EA52ECF4&op=index"
434:           :text (tt [83C4 F8E5 10A3 3B4C 5BEA  D15D 77DD 95E2 EA52
435:           ECF4]))]))
436: 
437: 
438:    ;; (p [See ,(ref :text "older versions of these pages"
439:    ;;                 :url "http://web.archive.org/web/*/http://www.laas.fr/~lcourtes/").])
440: 
441: 
442:    (ref :url "http://www.fsf.org/fb"
443:          :class "center-bottom"
444:          :text (image "Not f'd---you won't find me on Facebook"
445:                   :width 200
446:                   :url "http://static.fsf.org/nosvn/no-facebook-me.png"))
447: 
448:    ;;;
449:    ;;; Contents.
450:    ;;;
451: 
452:    (chapter :title [PhD Thesis]
453:       :ident "coop-bak"
454: 
455:       (p [My PhD thesis is entitled ``Cooperative Data Backup for Mobile
456: Devices''.  The topic itself stems from the ,(ref :text "MoSAIC project"
457: :url "http://www.laas.fr/mosaic/") (which has nothing to do with an
458: ,(ref :text "ancient web browser"
459:     :url
460:     "http://archive.ncsa.uiuc.edu/SDG/Software/Mosaic/NCSAMosaicHome.html")).
461: The thesis started on October 1,(sup "st"), 2004, and was defended on
462: November 23,(sup [rd]), 2007.  You can download it in from here:]
463:           
464:        (let ((link (lambda (file-name)
465:                      (list (ref :url (string-append "phd/" file-name)
466:                                  :text "PDF")
467:                             ", "
468:                             (ref :url (string-append "phd/" file-name
469:                                                      ".asc")
470:                                  :text "OpenPGP detached signature")))))
471:          (itemize
472:              (item [dissertation in English: ,(link "phd-thesis.pdf");])
473:              (item [extended summary in French: ,(link "phd-thesis.fr.pdf");])
474:              (item [concatenation of both: ,(link "phd-thesis.fr+en.pdf");])
475:              (item [slides of the talk: ,(link "slides.pdf").])
476:              (item [permanent link ,(ref :url
477:              "http://tel.archives-ouvertes.fr/tel-00196822/en/" :text [at
478:              TEL])])
479:              (item [permanent link ,(ref :url
480:              "http://ethesis.inp-toulouse.fr/archive/00000544/" :text [at
481:              INP Toulouse]) (with slightly modified PDF meta-data)])))
482: 
483: [Comments are welcome!])
484: 
485:        (p [Below is a sorted bibliography of papers related to
486: the project's topic with personal comments and summaries.  Featured
487: bibliography themes are:]
488: 
489:          (resolve (lambda (n e env)
490:                    (let ((chapter (ast-chapter n)))
491:                      (apply itemize
492:                       (map (lambda (section)
493:                              (let ((title (markup-option section :title)))
494:                                (item (ref :handle (handle section)
495:                                           :text title))))
496:                            (search-down (lambda (n)
497:                                           (is-markup? n 'section))
498:                                         chapter)))))))
499: 
500: 
501:       ;; Bibliographical sections.
502:       (map (lambda (tuple)
503:                (section :title (bib-tuple-theme tuple)
504:                         :file #t
505:                         :ident (bib-tuple-file tuple)
506:                  (output-bibliography-table (bib-tuple-table tuple))))
507:             *bibliographies*)
508:          
509:       (p [Each paper has a link to an ,(ref :ident "meta-ch" :text
510: "automatically generated") BibTeX entry which might be somewhat broken
511: (please, tell me if this is the case).  ,(ref :url %lout-url :text
512: "Lout") users may use ,(ref :url "http://www.cs.usyd.edu.au/~jeff/rtr.c"
513:          :text [the ,(tt "rtr") bibliography converter]) while ,(ref :url
514: %skribilo-url :text "Skribilo and Skribe") users may of course use ,(tt
515: "skribebibtex").]))
516: 
517: 
518:    (chapter :title [Publications] :ident "publications"
519: 
520:       (p [See ,(ref :url "http://people.bordeaux.inria.fr/lcourtes/"
521: :text [this page]) for more up-to-date info.])
522: 
523:       (section :title [Published Papers]
524:           
525:           (p [An ,(ref :text [automatically maintained list of publications]
526:                   :url
527: "http://dbserver.laas.fr/pls/LAAS/publis.rech_auteur?langage=FR&clef=100462")
528: is available.  Below are the papers I published during my PhD on ,(ref
529: :text [cooperative backup for mobile devices] :ident "coop-bak").
530: 
531: ,(itemize
532:    (item [,(ref :text [Dependability Evaluation of Cooperative Backup
533: Strategies for Mobile Devices] :url
534: "papers/prdc-2007/markov-evaluation.html") (,(ref :text [PDF] :url
535: "papers/prdc-2007/markov-evaluation.pdf")), ,(ref :text (it [Proc. of
536: the Thirteenth IEEE Pacific Rim Dependable Computing]) :url
537: "http://www.deakin.edu.au/conferences/prdc2007/"), September 2007, to
538: appear.])
539: 
540:    (item [,(ref :text [Security Rationale for a Cooperative Backup
541: Service for Mobile Devices] :url "papers/ladc-2007/security.html")
542: (,(ref :text [PDF] :url "papers/ladc-2007/security.pdf")), ,(ref :text
543: (it [Proc. of the Third Latin-American Symposium on Dependable
544: Computing]) :url "http://www.matem.unam.mx/ladc2007/"), September 2007
545: (to appear, ,(ref :text [Springer-Verlag] :url
546: "http://www.springer.com/")).])
547: 
548:    (item [,(ref :text [Storage Tradeoffs in a Collaborative Backup
549: Service for Mobile Devices] :url "papers/edcc-2006/storage.html")
550: (,(ref :text [PDF] :url "papers/edcc-2006/storage.pdf")),
551: ,(ref :text (it [Proc. of the Sixth European Dependable Computing
552: Conference]) :url "http://edcc.dependability.org/"), October 2006.])
553: 
554:    (item [,(ref :text [Sauvegarde coopérative entre pairs pour
555: dispositifs mobiles] :url "papers/ubimob-2005/ubimob2005-paper.html")
556: (,(ref :text [PDF] :url "papers/ubimob-2005/ubimob2005-paper.pdf"),
557: ,(ref :text [PostScript] :url "papers/ubimob-2005/ubimob2005-paper.ps"))
558: , slightly larger
559: version than the one published in the proceedings of the ,(ref :text
560: [UbiMob 2005 Conference] :url "http://ubimob05.imag.fr"), ACM Press (in
561: French).]))]))
562: 
563:       (section :title [Talks]
564: 
565: (itemize
566:    (item [Slides of a ,(ref :text [presentation of ,(it [libre])
567: distributed revision control systems, most notably GNU,(~)Arch] :url
568: "talks/toulibre-drcs-2007/drcs-toulibre-20070110.html"), at ,(ref :text
569: [Toulibre] :url "http://toulibre.org/") (,(ref :text [PDF] :url
570: "talks/toulibre-drcs-2007/drcs-toulibre-20070110.pdf")), January 2007,
571: in French.])
572:    (item [Slides of my ,(ref :text [talk at EDCC-6] :url
573: "talks/edcc-2006/slides.html") (,(ref :text [PDF] :url
574: "talks/edcc-2006/slides.pdf")).])
575:    (item [,(ref :text [Slides of a talk I gave at LAAS]
576:     :url "talks/p2p-backup/mosaic-20041216/state-of-the-art.html")
577: on Dec. 16,(sup [th]), 2004, regarding peer-to-peer and cooperative
578: backup systems (it's in French;
579: ,(ref :text [PDF here]
580:     :url "talks/p2p-backup/mosaic-20041216/state-of-the-art.pdf")).])
581:    (item [Slides of other detailed talks are available
582: ,(ref :text [from MoSAIC's website]
583:     :url "http://www.laas.fr/mosaic/papers.html").])))
584:          
585:       (section :title [Older Documents]
586:           
587:           (itemize
588:              (item [Systèmes tolérant les fautes à base de support
589: d'exécution réflexifs, Capture en ligne de l'état d'applications
590: (,(ref :url "papers/old/laas-dea.pdf" :text [PDF])),
591: ,(ref :text [UTBM] :url "http://www.utbm.fr/") Report, 2003.])
592:              (item [Conception et architecture de systèmes d'exploitation
593: persistants (,(ref :url "papers/old/persistance.pdf" :text [PDF])),
594: ,(ref :text [UTBM] :url "http://www.utbm.fr/") Report, 2003.  This paper
595: discusses implementation techniques of persistent operating systems.])
596:              (item [Unified Parallel C at the George Washington
597: University (,(ref :url "papers/old/upc-gwu.pdf" :text [PDF])),
598: ,(ref :text [UTBM] :url "http://www.utbm.fr/") Report, 2002.]))))
599: 
600: 
601:    (chapter :title [Software]
602:       :ident "soft"
603: 
604:       (p [Below are a few pieces of code available as
605: ,(ref :text [,(emph "Libre") Software]
606:     :url "http://www.gnu.org/philosophy/free-sw.html").  What you are
607: seeing here is probably outdated, though.])
608: 
609:       (section :title [libchop]
610:           
611:           (p [During my ,(ref :ident "coop-bak" :text [PhD]) I developed
612: a data storage framework called ,(ref :url
613: "http://www.nongnu.org/libchop/" :text [libchop]), and on top of it, a
614: prototype cooperative backup application.  The former has since be ,(ref
615: :url "http://www.nongnu.org/libchop/" :text [released]) and is under
616: active development.]))
617: 
618:       (section :title [GNU Guix]
619:           
620:           (p [Doing a lot of ,(ref :url "http://www.gnu.org/" :text
621: [GNU]), ,(ref :url %guile-url :text [Guile]), and ,(ref :url
622: "http://nixos.org/" :text [Nix]) inevitably led to ,(ref :url
623: "http://www.gnu.org/software/guix/" :text [GNU,(~)Guix]),(---)functional
624: package manager for, and distribution of the ,(ref :url
625: "http://www.gnu.org/gnu/manifesto.html" :text [GNU System]).]))
626: 
627:       (section :title [GNU Guile]
628: 
629:           (p [,(ref :text [Scheme] :url %scheme-url) is my
630: programming language of choice and
631: ,(ref :text [GNU Guile] :url %guile-url) is
632: currently my implementation of choice.  It's probably not the best libre
633: implementation of Scheme, but I find it quite friendly, it has one of
634: the coolest module systems, it implements a lot of
635: ,(ref :text [SRFIs] :url "http://srfi.schemers.org/"), and it may be
636: easily embedded in a C application.])
637:           (p [I contributed little thingies for Guile, like
638: ,(ref :text (tt [Guile-Reader])
639:     :url "http://www.nongnu.org/guile-reader/").]))
640:          
641:       (section :title [GNU Guile Networking Packages]
642:           
643:           (p [Networking packages for Guile 1.8 that I wrote:]
644:          
645:          (itemize
646:            (item [,(ref :text [GNU Guile-RPC] :url
647: "http://www.gnu.org/software/guile-rpc/"), an implementation of ,(ref :url
648: "http://tools.ietf.org/html/rfc1831" :text [ONC RPC and XDR]).  Entirely
649: written in Scheme, mostly in a functional style.])
650:            (item [Guile-R6RS-Libs (not really networking, but needed by
651: Guile-RPC): an implementation of the bytevector and (part of) the I/O
652: modules of ,(ref :text [R6RS] :url "http://r6rs.org/").  Get ,(ref :text
653: [version 0.1 here] :url "software/guile/guile-r6rs-libs-0.1.tar.gz") or
654: browse the ,(ref :text [on-line Git repository] :url
655: "http://repo.or.cz/w/guile-r6rs-libs.git").])
656:            (item [Guile-GnuTLS: Guile bindings for ,(ref :text [GnuTLS]
657: :url "http://gnutls.org/")---note: this has been part of GnuTLS starting
658: from GnuTLS 1.7.12.  For historical interest, version 0.1 ,(ref :text
659: [is still available here] :url
660: "software/guile/guile-gnutls-0.1.tar.gz").])
661:           (item [,(ref :text [Guile-Avahi] :url
662: "http://www.nongnu.org/guile-avahi/"): Guile bindings for
663: the ,(ref :text [Avahi] :url "http://avahi.org/") mDNS/,(ref :url
664: "http://dns-sd.org/" :text [DNS-SD]) (zeroconf multicast DNS and service
665: discovery) library.])))
666: 
667:          (p [All these are available in their respective on-line
668: repositories.]))
669: 
670:       (section :title [Skribilo] :ident "skribilo"
671: 
672:           (p [I'm having fun working on ,(ref :text [Skribilo] :url
673: %skribilo-url), a document programming framework for ,(ref :text [Guile]
674: :url %guile-url) released under the GNU GPL.])
675:           (p [Technically, Skribilo is based on the ,(ref :text [Scheme]
676: :url %scheme-url) language.  It provides some sort of a simple ,(emph
677: [markup language]), not unlike HTML, DocBook, LaTeX, or ,(ref :text
678: [Lout] :url %lout-url) (see the ,(ref :text [meta-chapter] :ident
679: "meta-ch") for a demo!).  Alternatively, it also offers a simpler,
680: markup-less, ,(emph [plain text syntax]) that is comparable to that of,
681: e.g., ,(ref :text [txt2tags] :url %txt2tags-url), ,(ref :text [PlainDoc]
682: :url %plaindoc-url), and similar systems.])
683:           (p [Skribilo derives from ,(ref :text [Skribe] :url
684: %skribe-url).  It strives to be more modular and comes with new engines
685: and features.]))
686:       
687:       (section :title [Typesetting with Lout]
688:           
689:           (p [,(ref :url %lout-url :text [Lout]) is a
690: ,(ref :url "http://www.gnu.org/philosophy/free-sw.html" :text [free])
691: document formatting tool, similar in principle to TeX/LaTeX, but much
692: more lightweight, clear, and easy to understand.  Below are pieces of
693: information that might be useful to Lout users.])
694: 
695:           (subsection :title [Margin Kerning]
696:              
697:              (p [Margin kerning is a micro-typographic refinement that
698: is nice to have.  Basically, it consists in protruding small characters
699: located next to a margin ,(emph [outside]) the margin.  This way, the
700: shape of paragraphs looks better to the human eye.  More information may
701: be found in
702: ,(ref :text (it [Micro-typographic Extensions to the TeX Typesetting System])
703:     :url "http://www.pragma-ade.nl/pdftex/thesis.pdf"), by H. T. Thàn.
704: Examples:
705: ,(itemize
706:     (item [a simple example that compares a paragraph rendered with and
707: without margin kerning:
708: ,(ref :url "software/lout/margin-kerning-test.ps" :text [PS]),
709: ,(ref :url "software/lout/margin-kerning-test.pdf" :text [PDF]),
710: ,(ref :url "software/lout/margin-kerning-test.lout" :text [Lout])\;])
711:     (item [a complete document, using the Latin Modern Roman font,
712: ,(ref :url "software/lout/ubimob2005-paper.pdf" :text [with]) and
713: ,(ref :url "software/lout/ubimob2005-paper-nomk.pdf" :text [without])
714: margin kerning\;])
715:     (item [the same document, using the Palatino Roman font,
716: ,(ref :url "software/lout/ubimob2005-paper-pa.pdf" :text [with]) and
717: ,(ref :url "software/lout/ubimob2005-paper-pa-nomk.pdf" :text [without])
718: margin kerning.]))
719: 
720: A patch that augments Lout with margin kerning capabilities is
721: ,(ref :text [available here]
722:     :url "http://lists.planix.com/pipermail/lout-users/2005q3/004026.html")
723: (the original one
724: ,(ref :text [is there]
725:     :url "http://lists.planix.com/pipermail/lout-users/2005q2/004006.html")).])
726:              (p [,(bold [Update]): This feature has been integrated in
727: ,(ref :text [Lout 3.31, dated Aug. 24th 2005]
728:     :url "http://lists.planix.com/pipermail/lout-users/2005q3/004049.html").]))
729: 
730:           (subsection :title [Computer Modern and Latin Modern Fonts]
731:           
732:              (p [Here are useful pointers and pieces of information to use
733: Knuth' beautiful Computer Modern fonts (you know: those
734: ,(ref :text [LaTeX] :url "http://www.latex-project.org") uses by
735: default) in Lout.  Note that these steps are detailed in Valeriy
736: E. Ushakov's ,(ref :text [essay on the use of fonts in Lout]
737:                   :url
738: "http://snark.niif.spb.su/~uwe/lout/essays/1365.fonts.txt")
739: (although the ,(tt "fontdef") thing is deprecated since Lout now uses
740: the ,(tt "@FontDef") symbol for font database entries).
741: The Type1 Computer Modern fonts are provided
742: ,(ref :text [by the AMS]
743:     :url "http://www.ams.org/tex/type1-fonts.html")
744: and are available
745: ,(ref :text [by FTP] :url
746: "ftp://ftp.ams.org/pub/tex/psfonts/cm/cmps-unix.tar.gz").  Original CM
747: fonts do not contain accented characters so you might need to get the
748: ,(ref :text [Latin Modern fonts]
749:     :url "http://www.tex.ac.uk/cgi-bin/texfaq2html?label=uselmfonts")
750: available
751: ,(ref :text [right here]
752:     :url "ftp://cam.ctan.org/tex-archive/fonts/lm.tar.gz").])
753:           (p [Converting to the ASCII Type1 font format (PFA), which is
754: the format understood by
755: ,(ref :text (tt [includeres])
756:     :url "http://www.tardis.ed.ac.uk/~ajcd/psutils/index.html")
757: (see below), can be done
758: as follows, using the ,(tt [t1ascii])
759: program from ,(ref :text (tt [t1utils])
760:                   :url "http://packages.debian.org/unstable/text/t1utils"):
761: ,(code (pre [# Get to the directory where `.pbf' files are
762: $ mkdir ../pfa
763: $ for i in *.pfb \
764:   do t1ascii $i ../pfa/`echo $i | sed -es'/pfb$/pfa/g'` \
765:   && rm $i  \
766:   done]))
767: This will create the PFA files in the ,(tt [../pfa]) directory.
768: Theses file must then be copied in the ,(ref :text [PSUtils] :url
769: "http://www.tardis.ed.ac.uk/~ajcd/psutils/index.html")
770: directory (,(tt [/usr/lib/psutils]) in Debian) so that
771: ,(tt [includeres]) can find
772: them and incorporate them into your PostScript files.])
773:           (p [I once filed several reports to the Debian BTS in
774: order to try to automate the installation of new fonts for Lout.
775: These can be found here: ]
776:          (let* ((bug-url (lambda (num)
777:                              (string-append
778:                             "http://bugs.debian.org/cgi-bin/bugreport.cgi?bug="
779:                             (number->string num))))
780:                 (bug (lambda (num)
781:                        (ref :text (number->string num)
782:                           :url (bug-url num)))))
783:            (list (bug 289997) ", "
784:                  (bug 289999) ", "
785:                  (bug 290001) ".")))
786:           (p [Finally, a bug was fixed in
787: ,(ref :text [Lout 3.31]
788:     :url "http://lists.planix.com/pipermail/lout-users/2005q3/004049.html")
789: that prevented ligatures (`fi', `fl', etc.) to be produced with
790: Latin Modern fonts
791: (,(ref :url "http://lists.planix.com/pipermail/lout-users/2005q1/003892.html"
792:     :text [read here]) for details).])))
793: 
794:       (section :title [Ego+Pego: Portable Checkpointing for C/C++]
795: 
796:           (p [A technical report that deals with the use of
797: computational reflection in order to provide portable checkpointing
798: facilities to compile C/C++ applications:
799: ,(ref :text "PDF" :url "software/ego/laas-dea.pdf").  These ideas have been
800: implemented as two C libraries called ,(it "Ego") (which provides
801: introspection facilities) and ,(it "Pego") (which provides state
802: capture facilities).
803: Whenever it's reachable, you can look at a
804: ,(ref :text "dedicated webpage"
805:     :url "software/ego/").]))
806: 
807:       (section :title [Libre Software Meeting]
808:           
809:           (p [,(ref :text [Thomas Petazzoni]
810:                   :url "http://thomas.enix.org/") and I were volunteers in
811: charge of the
812: ,(ref :text (it [Operating Systems Design and Implementation])
813:     :url "http://libresoftwaremeeting.org/sections/conference/noyau_et_systeme/")
814: topic of the 2005 ,(ref :text (it [Libre Software Meeting])
815:                        :url "http://libresoftwaremeeting.org/").
816: LSM 2005 is now over.  Papers, slides, and audio
817: ,(ref :text [are available online]
818:     :url "http://medias.2005.rencontresmondiales.org/topics/os/").]))
819: 
820:       (section :title [Other] :ident "archive"
821: 
822:           (p [I used to maintain software in my
823: ,(tt (ref :text %current-archive :url "software/arch-2006/"))
824: ,(ref :text "GNU Arch"
825:     :url "http://www.gnu.org/software/gnu-arch/") archive (note: older
826: archives can be found by just changing the year in the last component of
827: the archive URL).  However, I recently switched to ,(ref :url
828: "http://git.or.cz/" :text [Git]) for most of the software I maintain.])))
829: 
830: 
831:    (chapter :title [Thoughts, Opinions, Links]
832: 
833:       (section :title [On Scientific Research]
834:           (p (itemize
835:                 (item [On the use of English as an international
836: communication language, read the
837: ,(ref :url "http://lingvo.org/en/4/908" :text "Resolution of Bilbao")
838:  of the 2004 European Esperanto Congress (also in
839: ,(ref :url "http://lingvo.org/fr/4/908" :text "French") and
840: ,(ref :url "http://lingvo.org/eo/4/908" :text "Esperanto"));
841: learn more about the whole idea of ,(emph "interlingualism")
842: ,(ref :text "here"
843:     :url "http://esperantic.org/interlingualism.htm")
844: and ,(ref :text "there"
845:          :url "http://www.lingvo.info/interlingvismo/").])
846:                 (item [On the ,(emph [dissemination of scientific knowledge]),
847: read the ,(ref :text "Berlin Declaration on Open Access to Knowledge
in the Sciences and Humanities"
848:               :url
849:               "http://www.zim.mpg.de/openaccess-cern/berlindeclaration.html")
850: (available in several languages) which was ,(ref :text "signed by
several national research institutions" :url
851: "http://www.zim.mpg.de/openaccess-berlin/signatories.html") including
852: the French ,(ref :text "CNRS" :url "http://www.cnrs.fr/").
853: ,(ref :url
854: "http://mahery.math.u-psud.fr/~vdhoeven/Misc/publ_libre.html"
855:     :text "This text") (in French) by Joris van der Hoeven depicts the
856: current situation in scientific publishing and insists on why
857: scientific publication should be free.  Here are a few more links:
858: ,(itemize :symbol "-"
859:     (item [Further details about ,(ref :text [what major French research
860: institutions envision in terms of Free access to scientific results]
861: :url "http://www2.cnrs.fr/presse/communique/640.htm")\;])
862:     (item [,(ref :text [HAL] :url "http://hal.ccsd.cnrs.fr/") is the
863: French CNRS and INRIA document archival framework; all articles and
864: documents written in these institutions should eventually be publicly
865: available from there -- provided the copyright holder, e.g. ACM or IEEE,
866: is nice enough to allow this.])
867:     (item [,(ref :text [The INSIT website] :url
868: "http://www.inist.fr/openaccess/") provides information about the
869: liberation of technical and scientific publications in French institutions.])
870:     (item [,(ref :text [The ROMEO website] :url
871: "http://www.sherpa.ac.uk/romeo.php") allows to look at publisher's
872: current copyright and archival policy.])
873:     (item [,(ref :text [Open Archives Initiative] :url
874: "http://www.openarchives.org/") is a consortium which aims at defining a
875: clear archiving and searching protocol.])
876:     (item [,(ref :text "CiteBase" :url "http://citebase.eprints.org") is
877: a citation database à la ,(ref :text "CiteSeer"
878:                               :url "http://citeseer.ist.psu.edu")
879: except that it is based entirely on Free Software, namely
880: ,(ref :text "GNU Eprints" :url "http://eprints.org") and related
881: software.  This effort relates to the
882: ,(ref :text "Budapest Open Access Initiative"
883:     :url "http://www.soros.org/openaccess/") and thus requires
884: research institutions to run
885: ,(ref :text "OAI-compliant archives"
886:     :url "http://www.eprints.org/self-faq/#researcher/authors-do").])
887:     (item [There's also ,(ref :text "NetBib" :url "http://netbib.info/")
888: and ,(ref :text "BibFinder" :url "http://kilimanjaro.eas.asu.edu/"), and
889: of course, ,(ref :text [Scholar Google] :url
890: "http://scholar.google.com").]))])
891: 
892:                 (item [Likewise, you might want to look at the ,(ref
893: :text "position of major French research institutions" :url
894: "http://www.cecill.info/") with respect to ,(ref :text "Software
Freedom"
895:     :url "http://www.gnu.org/philosophy/free-sw.html").]))))
896: 
897:       (section :title [Research in Computer Science & Software Development]
898: 
899:          (itemize
900:                (item [In 2000, in a famous talk entitled ,(ref :text
901: (it [Systems Software Research is Irrelevant]) :url
902: "http://herpolhode.com/rob/"), ,(ref :text [Rob Pike] :url
903: "http://en.wikipedia.org/wiki/Rob_Pike") made a good summary of the current
904: situation:
905: 
906: ,(blockquote [
907: What is Systems Research these days?
908: 
909:      ,(p [Web caches, web servers, file systems, network packet delays,
910: all that stuff. Performance, peripherals, and applications, but
911: not kernels or even user-level applications.])
912:      ,(p [Mostly, though, it's just a lot of measurement; a
913: misinterpretation and misapplication of the scientific method.
914: Too much phenomenology: invention has been replaced by
915: observation. Today we see papers comparing interrupt latency
916: on Linux vs. Windows. They may be interesting, they may
917: even be relevant, but they aren't research.])
918:      ,(p [In a misguided attempt to seem scientific, there's too much
919: measurement: performance minutiae and bad charts.])
920:      ,(p [By contrast, a new language or OS can make the machine feel
921: different, give excitement, novelty. But today that's done by a
922: cool web site or a higher CPU clock rate or some cute little
923: device that should be a computer but isn't.])
924:      ,(p [The ,(emph [art]) is gone.])
925:      ,(p [But art is not science, and that's part of the point. Systems
926: research cannot be just science; there must be engineering,
927: design, and art.])])
928: 
929: This still looks ,(emph [so]) true from what I've observed during my PhD.])
930: 
931:                 (item [,(ref :text (it "Hackers & Painters")
932:                            :url "http://www.paulgraham.com/hp.html"),
933: by Paul Graham, mentions the situation of
934: ,(ref :text "hackers"
935:     :url "http://www.stallman.org/articles/on-hacking.html") working
936: for research institutions.])
937: 
938:                (item [,(ref :text (it "The Rise of ``Worse is Better''") :url
939: "http://www.jwz.org/doc/worse-is-better.html"), by Richard Gabriel, explains
940: a commonly encountered tension between two software design philosophies,
941: namely ``the Right Thing'' and ``Worse is Better''.])
942:          
943:                 (item [``,(ref :text [Trusted] :url
944: "http://en.wikipedia.org/wiki/Trusted_computing")''/,(ref :text
945: [Treacherous] :url "http://www.gnu.org/philosophy/can-you-trust.html")
946: computing and similar techniques represent threats over one's control
947: over ,(emph [their own]) computer.  Read on ,(ref :text [Bruce
948: Schneier's ,(it [Everyone Wants to ``Own'' Your PC])] :url
949: "http://schneier.com/essay-113.html") and ,(ref :text [Marcus
950: Brinkmann's essay] :url
951: "http://lists.gnu.org/archive/html/l4-hurd/2006-05/msg00184.html") on
952: the introduction of OS-level mechanisms that remove authority from
953: users.])))
954: 
955:       (section :title [Miscellaneous]
956: 
957:            (itemize
958:                 (item [On privacy and security:]
959:                    (itemize
960:                       (item [,(ref :text (it [We're Giving Up Privacy and
961: Getting Little in Return]) :url
962: "http://www.schneier.com/essay-115.html"), Bruce Schneier, May 2006.])))
963: 
964:                 (item [Help save the French ,(it [Imprimerie Nationale])
965: and its typographical heritage,
966: ,(ref :url "http://www.garamonpatrimoine.org/petition.html"
967:     :text [sign here])!]))))
968: 
969:    (chapter :title [Meta-chapter] :ident "meta-ch"
970: 
971:       (p [Introducing ,(it "Document Programming").  ,(ref :text
972: "Skribilo" :url %skribilo-url) rules actually.  The following graph shows
973: the evolution of the source file size (in bytes): ,(center (image
974: :url "source-stats.png" "Source file size vs. time graph")).])
975: 
976:       (linebreak)
977: 
978:       (tt (prog
979:               (source :language skribe
980:                  :file "ludo.skb")))))
981: 
982: ;;; Local Variables:
983: ;;; scheme-program-name: "guile"
984: ;;; ispell-local-dictionary: "american"
985: ;;; End:
(made with skribilo)