From 1c73d8d09e2a4ec6a01d5a1decc7e23ad87df129 Mon Sep 17 00:00:00 2001 From: Mark Pilgrim Date: Sat, 18 Jul 2009 01:31:21 -0400 Subject: [PATCH] about fiddling --- about.html | 2 +- colophon.html | 89 ++++++++++++++++++ ....org_media_files_johnny_automatic_5261.png | Bin 0 -> 22715 bytes iterators-and-generators.html | 56 ----------- 4 files changed, 90 insertions(+), 57 deletions(-) create mode 100644 colophon.html create mode 100644 i/openclipart.org_media_files_johnny_automatic_5261.png diff --git a/about.html b/about.html index 870f9bd..685dcaf 100755 --- a/about.html +++ b/about.html @@ -25,5 +25,5 @@ abbr{font-variant:none;text-transform:none;letter-spacing:0}

Corrections and feedback to mark@diveintomark.org -

© 2001–9 Mark Pilgrim +

© 2001–9 Mark Pilgrim diff --git a/colophon.html b/colophon.html new file mode 100644 index 0000000..e2f1cff --- /dev/null +++ b/colophon.html @@ -0,0 +1,89 @@ + + + + +Colophon - Dive into Python 3 + + + + + + +

  
+

You are here: Home Dive Into Python 3 +

Colophon

+
+

Je n’ai fait celle-ci plus longue que parce que je n’ai pas eu le loisir de la faire plus courte.
(I would have written a shorter letter, but I did not have the time.)
Blaise Pascal +

+

  +

Diving In

+

This book, like all books, was a labor of love. Oh sure, I got paid the medium-sized bucks for it, but nobody writes technical books for the money. And since this book is available on the web as well as on paper, I spent a lot of time fiddling with webby stuff when I should have been writing. + +

[typewriter] + +

The online edition loads as efficiently as possible. Efficiency never happens by accident; I spent many hours making it so. Perhaps too many hours. Yes, almost certainly too many hours. Never underestimate the depths to which a procrastinating writer will sink. + +

I won’t bore you with all the details. Wait, yes — I will bore you with all the details. But here’s the short version. + +

    +
  1. HTML is minimized, then served compressed. +
  2. Scripts and stylesheets are minimized by YUI Compressor (and also served compressed). +
  3. Scripts are combined to reduce HTTP requests. +
  4. Stylesheets are combined and inlined to reduce HTTP requests. +
  5. Unused CSS selectors and properties are removed on a page-by-page basis with a little help from pyquery. +
  6. HTTP caching and other server-side options are optimized based on advice from YSlow and Page Speed. +
  7. Pages use Unicode characters in place of images wherever possible. +
  8. Images are optimized with OptiPNG. +
  9. The entire book was lovingly hand-authored in HTML 5 to avoid markup cruft. +
+ +

⁂ + +

Typography

+ +

vertical rhythm, best available ampersand, curly quotes/apostrophes, other stuff from webtypography.net + +

⁂ + +

Graphics

+ +

Unicode, callouts, font-family issues on Windows + +

⁂ + +

Performance

+ +

"Dive Into History 2009 edition", minimizing CSS + JS + HTML, inline CSS, optimizing images + +

⁂ + +

Fun stuff

+ +

Quotes, constrained writing(?), PapayaWhip + +

⁂ + +

Further Reading

+ + + +

© 2001–9 Mark Pilgrim + + + diff --git a/i/openclipart.org_media_files_johnny_automatic_5261.png b/i/openclipart.org_media_files_johnny_automatic_5261.png new file mode 100644 index 0000000000000000000000000000000000000000..495f6ed781e4ca6c34b0e2f616208820a91c4dce GIT binary patch literal 22715 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 -

But since you’re here, I’d like to talk about some of the small stuff I sweated while writing this book. - -

The online edition loads as quickly as it does because -

    -
  1. HTML is compressed. -
  2. Scripts and stylesheets are minimized by YUI Compressor. -
  3. Scripts are combined to reduce HTTP requests. -
  4. Stylesheets are combined and inlined to reduce HTTP requests. -
  5. Unused CSS selectors and properties are removed on a page-by-page basis with pyquery. -
  6. HTTP caching and other server-side options are optimized based on advice from YSlow and Page Speed. -
  7. The text uses Unicode characters in place of graphics wherever possible. -
  8. The entire book was lovingly hand-authored in HTML 5 to avoid markup cruft. -
- - -

© 2001–9 Mark Pilgrim