|
Introducing Document Programming. Skribilo rules actually. The following graph shows
the evolution of the source file size (in bytes): 
. 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: (! "—")
397: "-"))))
398:
399: (define (--) ; endash
400: (resolve (lambda (n e env)
401: (if (engine-format? "html" e)
402: (! "–")
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:
|