Web

Last edit

Geändert: 2c2

< &lt;journal "^\d\d\d\d-\d\d-\d\d.*Web"&gt;

stattdessen:

> <journal search tag:web>


Stuff about the world wide web (WWW): Structure, history, weirdness.

2016-03-12 Let’s Encrypt Again

I got an email, telling me my certificates a number of my domains will expire in 19 days and that I should please make sure to renew my certificates before then. Looking back at my old blog post I found the command to run and it worked. Yay!

I’m still a bit concerned about running the tool with sudo.

Tags: RSS RSS

Comments on 2016-03-12 Let’s Encrypt Again

Difference between revision 2 and current revision

Summary: \[\[gravatar:.*\]\]\n? →

Deleted:

< [[gravatar: Alex Schroeder:e33b88db6bc04e1c93db25c702baea28]]


The strange thing is that the mail listed four of my domains, but at the same time I got a message telling me that the certificate for a domain that was not listed had expired. [1] How strange. I checked my spam folder, too. Nothing.

Well, now all the certificates should expire on 2016-06-10 and we’ll see how it goes.

– Alex Schroeder 2016-03-12 10:28 UTC

Add Comment

2016-01-02 Let’s Encrypt

I decided to give Let’s Encrypt a try. I’m still running Debian Wheezy:

alex@kallobombus:~$ lsb_release -a
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux 7.9 (wheezy)
Release:	7.9
Codename:	wheezy

I followed their instructions for letsencrypt-auto:

git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt

And then I picked the Webroot plugin:

./letsencrypt-auto certonly --webroot -w ~/arabisch-lernen.org/ -d arabisch-lernen.org

I had to provide my email address and agree to their terms and conditions and that seemed to work. I added the necessary config parameters myself. The site’s config file was /etc/apache2/sites-available/arabisch-lernen.org and the two important parts are the following two points:

  1. The virtual host on port 80 does nothing but redirect to the secured version
  2. The virtual host on port 443 refers to the files created in /etc/letsencrypt/live/

As I’m using Debian Wheezy this means I’m using Apache/2.2.22 (Debian) mod_ssl/2.2.22 OpenSSL/1.0.1e.

<VirtualHost *:80>
    ServerName arabisch-lernen.org
    ServerAlias www.arabisch-lernen.org
    Redirect permanent / https://arabisch-lernen.org/
</VirtualHost>
<VirtualHost *:443>
    ServerAdmin alex@arabisch-lernen.org
    <Directory />
        Options None
        AllowOverride None
        Order Deny,Allow
        Deny from all
    </Directory>
    ServerName arabisch-lernen.org
    ServerAlias www.arabisch-lernen.org
    DocumentRoot /home/alex/arabisch-lernen.org
    <Directory /home/alex/arabisch-lernen.org>
        Options ExecCGI Includes Indexes MultiViews SymLinksIfOwnerMatch
        AddHandler cgi-script .pl
        AllowOverride All
        Order Allow,Deny
        Allow from all
    </Directory>

    SSLEngine on
    SSLCertificateFile      /etc/letsencrypt/live/arabisch-lernen.org/cert.pem
    SSLCertificateKeyFile   /etc/letsencrypt/live/arabisch-lernen.org/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/arabisch-lernen.org/chain.pem
    SSLVerifyClient None

</VirtualHost>

Todo:

  1. cron job (see forum)
  2. more sites (I’m waiting for their current SSH certificates to expire in the coming years)

For the cron job, it seems that we cannot just run letsencrypt-auto, we need to specify all the stuff we used in previous calls. If we don’t, we’re told: «No installers seem to be present and working on your system; fix that or try running letsencrypt with the “certonly” command.» If we use the certonly command, then we’re asked for domain names…

So, these commands all need to be run because I use a different certificate for every domain:

~/src/letsencrypt/letsencrypt-auto certonly --webroot -w ~/alexschroeder.ch/    -d alexschroeder.ch    -d www.alexschroeder.ch
~/src/letsencrypt/letsencrypt-auto certonly --webroot -w ~/arabisch-lernen.org/ -d arabisch-lernen.org -d www.arabisch-lernen.org
~/src/letsencrypt/letsencrypt-auto certonly --webroot -w ~/campaignwiki.org/    -d campaignwiki.org    -d www.campaignwiki.org
~/src/letsencrypt/letsencrypt-auto certonly --webroot -w ~/communitywiki.org/   -d communitywiki.org   -d www.communitywiki.org
~/src/letsencrypt/letsencrypt-auto certonly --webroot -w ~/korero.org/          -d korero.org          -d www.korero.org
~/src/letsencrypt/letsencrypt-auto certonly --webroot -w ~/oddmuse.org/         -d oddmuse.org         -d www.oddmuse.org
~/src/letsencrypt/letsencrypt-auto certonly --webroot -w ~/orientalisch.info/   -d orientalisch.info   -d www.orientalisch.info
sudo service apache2 graceful

And, elsewhere:

/home/nicferrier/src/letsencrypt/letsencrypt-auto certonly --webroot -w /home/nicferrier/emacswiki.org/ -d www.emacswiki.org

Ignoring SNIMissingWarning on this Ubuntu 14.04.1 LTS…

Also, calling letsencrypt-auto requires root privileges. Yikes!

Tags: RSS RSS

Comments on 2016-01-02 Let’s Encrypt

Last edit

Summary: The traditional way to do it would be to try it. :P But clearly, running the installation instructions say you need to run "git clone something" then having git is a precondition. Therefore: {{{ alex@kallobombus:~$ sudo apt-get install git password for alex: Reading package lists… Done Building…

Deleted:

< Ben


Hi Alex

Do I need to git installed doing this?

– Ben 2016-04-28 17:17 UTC


Maybe? If you’re running a new operating system, your package manager might know how to install everything. If you are running Debian Wheezy, then you do need it. See the Getting Started page.

– Alex Schroeder 2016-04-28 22:09 UTC


Well thanks, but my question was about, if I would need to install git first (and which version, backport or normal) on wheezy to “git clone” the letsencrypt package. No one really says this clearly enough for me… :)

– Ben 2016-04-29 13:33 UTC


The traditional way to do it would be to try it. :P But clearly, running the installation instructions say you need to run “git clone something” then having git is a precondition. Therefore:

alex@kallobombus:~$ sudo apt-get install git
[sudo] password for alex: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
git is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
alex@kallobombus:~$ git --version
git version 1.7.10.4

– Alex Schroeder 2016-04-30 18:32 UTC

Add Comment

2015-10-14 CSS Changes

I changed the fonts used for this website. I liked Noticia Text by JM Solé but loading it from the web was making the site slow on my old phone. It would load the page with invisible text and then add the font with a noticeable delay. Too bad the phone’s browser cache is too limited.

So now it is, in order: Palatino Linotype, Book Antiqua, or Palatino.

Here’s to faster loading times! 🍷

Tags: RSS

Comments on 2015-10-14 CSS Changes

Difference between revision 2 and current revision

Summary: \[\[gravatar:.*\]\]\n? →

Deleted:

< [[gravatar: AlexSchroeder:e33b88db6bc04e1c93db25c702baea28]]


I experienced a similar problem with this website. The text was indeed invisible initially, but then it flashed 2 or 3 times before fully loading. Now it is much better!

– AlexDaniel 2015-10-15 18:47 UTC


Sadly, webfonts rely on big browser caches… Then again, how else would they work?

– AlexSchroeder 2015-10-15 20:31 UTC

Add Comment

2015-07-16 Do Not Upgrade To Debian Jessie If You Are On A VM

Well… I think I lost about 12h on all my wikis. I thought: “Upgrade from Debian Wheezy to Jessie? No Problem!” I never saw a big huge blinking warning saying that you shouldn’t do it if you’re a guest on a virtual machine. But systemd replaces sysvinit, which requires a newer kernel, which the host doesn’t have! Everything works until you reboot. At which point the network doesn’t come back up. You can’t switch from systemd to sysvinit because downloading the packages doesn’t work anymore. You can’t scp the deb files to your server because all you have is a serial console. On your end, it looks like ssh. And yet, whatever I tried wouldn’t work. Because networking doesn’t work on the host.

And that’s when I discovered some flaws in my backup. What a disappointment. How exactly was Perl installed? Why doesn’t the backup contain the Apache config files for those sites that had SSL added to them?

Kallobombus. I thought I had documented it all. Not so. :(

Todo items for tomorrow:

  1. check other sites
  2. check cron jobs
  3. check backup job
  4. improve backup
  5. check development environment

Tags: RSS RSS

Comments on 2015-07-16 Do Not Upgrade To Debian Jessie If You Are On A VM

Difference between revision 3 and current revision

Summary: \[\[gravatar:.*\]\]\n? →

Deleted:

< [[gravatar: Alex Schroeder:e33b88db6bc04e1c93db25c702baea28]]


awww! :(

AlexDaniel 2015-07-16 01:14 UTC


I think all the permissions are back where they should be. The campaignwiki.org cron job is running. Monit and Munin are basically up but their configuration is borked. That is to say, they are monitoring some things I haven’t installed because I never kept track of the packages I actually installed.

– Alex Schroeder 2015-07-16 12:26 UTC

Add Comment

2015-06-14 Go Oddmuse

Sometimes I wonder whether I should move Oddmuse away from Perl 5 to something else. Something I would like to learn. An opportunity to redo everything, from scratch. Not many people are using Oddmuse, so I might as well write something else, for myself.

I recently read Writing Web Applications for Go, where they develop a simple wiki. I wondered about storing the data in a git repository. I found git2go. Hm…

Tags: RSS RSS RSS

Comments on 2015-06-14 Go Oddmuse

Difference between revision 14 and current revision

Summary: \[\[gravatar:.*\]\]\n? →

Deleted:

< [[gravatar: Alex Schroeder:e33b88db6bc04e1c93db25c702baea28]]

Deleted:

< [[gravatar: Alex Schroeder:e33b88db6bc04e1c93db25c702baea28]]

Deleted:

< [[gravatar: Alex Schroeder:e33b88db6bc04e1c93db25c702baea28]]


Perl 6 is an obvious candidate. And yes, they did not just change print ‘x’ to print(’x’) like they did in Python, it is a completely new language that you have to learn.

Speaking of Go, there is a great video called Perl 6 for Mere Mortals, and here is a direct link to a part of it which is somehow :) related to Go. That’s not a meaningful comparison, but it should give you the idea. You can also watch that video from the beginning, it is very interesting if you have not investigated into Perl 6 yet.

Now, if we think about all of the languages out there, what are the actual features that are required for Oddmuse?

Well, since Oddmuse is all about parsing the wiki text, you need some tools for parsing. Perl 5 has regexes (um, okay), Perl 6 has grammars (exactly what we need!), and Go has something as well (like this, which is, again, verbose as hell), but I’m not an expert. You can also use libs, but having a built-in support is probably advantageous.

Somehow I can’t really think of any other criteria, everything else probably exists in every other language out there. You might also say “performance” but the only website suffering from that is probably emacswiki, and it all depends on your actual goals – for example, better execution time can be achieved by using concurrency, which does not really lead to better CPU time. Concurrency in Perl 6 – yes (but maybe just a bit flaky at the moment), performance in Perl 6 – well, not now, but the potential is there (i.e. gradual typing).

In other words: what is the motivation? “Just to learn” is not going to get you anywhere, not even make you learn something (learning to find reasons for doing stuff (i.e. causation) is part of the learning, doing stuff purposelessly is harmful to the thinking process).

AlexDaniel 2015-06-14 14:05 UTC


Perhaps Go just makes me want to delve into the low level stuff. I like the post about Handwritten Parsers & Lexers in Go. :)

I keep thinking about all the design decisions. Filenames are pagenames. Namespaces are subdirectories. Can we switch to “git first”? No more log files. We no longer need keep files. How would modules work? Would you simply recompile the wiki? Dynamic linking? Would I want to use a templating architecture? People seem to like that. Was “printing as we go” a good decision? Perhaps it no longer matters much.

I need to think about extensibility of Cajun, the Wiki Creole lexer and parser.

– Alex Schroeder


These are very good questions. Maybe you should write down these ideas on Oddmuse: Revolutionary Changes.

  • “git first” – Yea, but… This would effectively break the goal of having one script file that just works (and I think that this is more important than having no recent changes and keep files logic in the core).
  • “How would modules work? Would you simply recompile the wiki?” – this would effectively throw away all of the nice things like Module Updater or Module Bisect (or at least make them much harder to implement). It will also break the potential of a few other ideas that keep floating in my head. In other words, “simply recompile the wiki” is not that simple.
  • “Would I want to use a templating architecture? People seem to like that.” Yea, but… It seems like if we switch to Perl6 then the core will collapse into a small piece of code with all of the irrelevant stuff separated into grammars or other classes, or maybe just tiny subroutines. Which brings us to the next point…
  • “Was “printing as we go” a good decision? Perhaps it no longer matters much.” – Good decision, but it really depends on your understanding of “as we go”. For example, what if we parse the wiki text first, before printing anything except the header? Then, once we start processing the parsed text, we can print stuff as we go. That’s exactly how it will work in perl6 (at least, that’s the easiest way) – first you slam the wiki text into your grammar and wait for it to be processed (oh by the way, while this is happening you can actually do other stuff asynchronously, like start reading the tag index or whatever). Then, when your wikitext is parsed, you can start deciding what to print now. And this is so much better than what we have now. Want to print table of contents? Just take the required information from the match object, no need for dirty hacks. In other words, in perl6 it is very easy to have parsing and actions separately, which is beneficial in many ways. But at the same time, once you start processing the actions you can start printing as you go (which makes sense, what if there is some complex search stuff included on the page, you’d probably want to see at least half of the page while this is going).

AlexDaniel 2015-06-16 00:22 UTC


And yeah, if you are seriously thinking about Go, what if we make a comparison table with Perl6 and Go, and the relevant language features? Both of the languages have some interesting stuff to offer, for example Perl6 to JS and Go to JS. And there are definitely some winning points for Go, especially associated with execution time and maturity.

AlexDaniel 2015-06-16 00:31 UTC


Hehe, I think you and Oddmuse: Revolutionary Changes is what started this all! I looked at Oddmuse as a “mission accomplished” project. With the migration of Emacs Wiki I’ve realized that a big site might want to serve its own pages without running a web server. I tried to understand PSGI/Plack in order to have Perl run Oddmuse like a web application. When I saw the wiki tutorial for Go, and how I got a web server up and running in no time, and how easy it was to include some basic markup, I was thrilled! Sure, the code doesn’t have a lot of features. But it beats the SmallestWiki candidates. :)

You arguments in favor of some of the core architecture decisions made for Oddmuse are good – and your hopes for Perl 6 and improved parsing are infectious! I’m very much looking forward to Perl 6.

– Alex Schroeder 2015-06-16 06:02 UTC


It’s also cool to look at the TinyWiki source code again and rediscover why I rewrote the Usemod Wiki style search and replace code with the extensible state machine code we have right now.

– Alex Schroeder 2015-06-16 08:00 UTC

Add Comment

2015-05-31 Redirection

Redirection good. Broken links bad. Cool URIs don't change.

Web Decay Graph. “This is a very sad graph.” – Tim Bray

Tags: RSS

Comments on 2015-05-31 Redirection

Last edit

No diff available.

Add Comment

2015-05-20 logjam

Guide to Deploying Diffie-Hellman for TLS.

OK, so apparently I need to look my site’s setup again. I hate these sysadmin problems. I would love to not worry about security issues, trusting my GNU/Linux distro to simply do the right thing. But it can’t upgrade my sites SSL setup. Currently the architecture does no allow that. Each site has config files, each site has its own certificates.

I should probably automate this in some way.

Tags: RSS

Comments on 2015-05-20 logjam

Difference between revision 4 and current revision

Summary: \[\[gravatar:.*\]\]\n? →

Deleted:

< [[gravatar: Alex Schroeder:e33b88db6bc04e1c93db25c702baea28]]


Hm, probably this https://letsencrypt.org/ ?

You’d have to wait for it though.

AlexDaniel 2015-05-20 21:23 UTC


Here’s how to secure your browser, in German:

  1. in Firefox, visit about:config
  2. search for .dhe
  3. disable them all

For Chrome, the solution is more involved and requires you to visit this page in order to find the spec of the cyphers you want to disable and to start Chrome with the --cipher-suite-blacklist parameter in order to blacklist the cyphers you provide.

– Alex Schroeder 2015-05-21 05:38 UTC

Add Comment

2015-04-02 Other People

Today I saw two posts on Google+ I found interesting. In the first, Rob said that he would like to finance a zine in order to get all the news but not “the Internet”. I said that back when we all just had websites and used ftp to post new stuff the Internet was a peaceful place! :)

I wonder about browser extension that hides all the comments, everywhere. I think those are the source of all grief. Yes, it’s sad! I know of the Herp Derp extension for YouTube. I’m sure there are others!

In another post, people were discussing how we react to provocative posts by others. What if they disabled comments? Are we happy because it saves us from wasting our energy? Are we incensed because the medium implies that we’ll only post what we’re also willing to discuss? That’s certainly how I feel! For myself, this is my daily Google+ challenge: not to post any political stuff. For if I did, I wouldn’t want to read the counterpoints. I still feel the need to rant, though! What to do? Because I also hate posts where I cannot comment, I don’t want to post and disable comments. My solution is to keep the political stuff on Twitter. There, I retweet a lot. Or I’ll write a few well chosen words, add a link and post it. If I’m interested in reading the opinions of others, I can follow them on Twitter and read the stuff they link to. Perfect! I remember people saying that 140 characters was not enough. But now I’m seeing that on G+, having more characters doesn’t improve the experience of politics and religion.

Tags: RSS

Comments on 2015-04-02 Other People

Last edit

No diff available.

Add Comment

2015-01-20 Caching

I’m trying to figure out how to use mod_cache. The following in my VirtualHost section doesn’t seem to make a difference. The wiki is still getting invoked.

    CacheEnable mem /wiki/feed/full/RPG
    MCacheSize        100000000
    MCacheMaxObjectSize 1000000
    

(This RSS file is about 99k.)

The wiki is logging these requests to a file and I’m requesting the URL from the command-line using curl. Hm, must investigate later.

Tried adding this:

    CacheEnable mem /wiki/feed/full/
    MCacheMaxStreamingBuffer 1000000

No effect.

Tried replacing it with:

    CacheEnable disk /wiki/feed/full/RPG

No effect.

Giving up. Damn you, mod_cache.

Tags: RSS RSS

Comments on 2015-01-20 Caching

Last edit

No diff available.

Add Comment

2014-11-13 Chrome and this Wiki

I’ve been using Chrome for a day now and this wiki doesn’t look as good as it does using Firefox, on Windows.

  1. The emoji at the bottom are mostly unsupported.
  2. The bold text (“fix typos” and “updates by email”) is fuzzy at the bottom.
  3. The anti-aliasing doesn’t look good (c, e, r, etc.) at the default size (Ctrl 0).

Something about the fonts is not making me happy.

Googling… Stackoverflow has something about webfonts, anti-aliasing, and a note that 37 will fix this. I guess I hadn’t used Chrome in a long time. Let’s see whether an update fixes this.

Restarting… I am not impressed. 😟

Adding Symbola to the site and to the CSS.

Fiddling some more. Increased the font size. Getting rid of Arial Narrow or whatever it was for header and footer. Getting rid of bold for the moment and replacing it with small caps. WTF am I doing!?

Unhappy… Noticia Text by JM Solé? Should I use the webfonts from the Google network or serve from my own server? More traces being left behind…

Built sfnt2woff to convert ttf files to woff. The files are significantly smaller, now. Using Noticia Text and Symbola by George Douros (for the smileys). Everything seems to work on Chrome. Now anti-aliasing for the header and footer looks a bit crummy on Firefox (Windows). Wow. Such pain.

At home… Things look pretty good on Firefox (OSX). Oh well. I think this is going to be the new look for a while.

Hop on the time machine!

  1. 2011
  2. 2012
  3. 2013
  4. 2014

Tags: RSS

Comments on 2014-11-13 Chrome and this Wiki

Difference between revision 22 and current revision

Summary: \[\[gravatar:.*\]\]\n? →

Deleted:

< [[gravatar: Alex Schroeder:e33b88db6bc04e1c93db25c702baea28]]

Deleted:

< [[gravatar: Alex Schroeder:e33b88db6bc04e1c93db25c702baea28]]

Deleted:

< [[gravatar: AlexSchroeder:e33b88db6bc04e1c93db25c702baea28]]

Deleted:

< [[gravatar: AlexSchroeder:ada3e5c46103f5506044c704b7a86908]]

Deleted:

< [[gravatar: AlexSchroeder:ada3e5c46103f5506044c704b7a86908]]

Deleted:

< [[gravatar: AlexSchroeder:ada3e5c46103f5506044c704b7a86908]]


Iceweasel on Linux, gotobar looks awful after your recent changes (wrapping):

http://files.progarm.org/2014-11-14-164928_993x71_scrot.png

And I’ve always had this:

http://files.progarm.org/2014-11-14-165014_1149x107_scrot.png

AlexDaniel 2014-11-14 14:56 UTC


The gotobar looks OK? Perhaps it was pure chance that it didn’t wrap with the previous font size (and using a narrow font). I wonder why you’re not getting more emojis. I though Symbola had them all covered. Oh well.

– Alex Schroeder 2014-11-14 16:08 UTC


No, it is distracting. If you change the width of the input fields to 8ex then it will not wrap. Alternatively you can make “Search” and “Matching Pages” text smaller. But please, stop this line wrapping thing. Maybe I could live with it if “Matching pages” thing was under “Search”, but having input fields on the left and on the right just bugs me.

AlexDaniel 2014-11-14 22:06 UTC


OK, second attempt: keeping search and matching pages together.

– Alex Schroeder 2014-11-15 07:35 UTC


I don’t like the result on my phone. Argh.

AlexSchroeder 2014-11-15 12:59 UTC


Alright, that’s better!

But maybe you should increase line spacing a little bit? So that search field does not get so much into gotobar buttons. That would be perfect!

http://files.progarm.org/2014-11-16-035159_618x66_scrot.png

AlexDaniel 2014-11-16 01:58 UTC


I’m not sure whether d0cdd4 was supposed to fix smileys, but they are still not showing up.

AlexDaniel 2015-01-19 00:40 UTC


Hm, they are showing up on my system…

https://i.imgur.com/WNWVG8Y.png

You linked to a change of an Oddmuse CSS, but this site uses the same solution, I think. Specifying the Symbola font as the fallback.

– Alex Schroeder 2015-01-19 10:07 UTC


It seems like Symbola font is not being loaded at all. Weird.

AlexDaniel 2015-01-19 12:06 UTC


Hm, but you can access the font via its URL? https://alexschroeder.ch/fonts/Symbola.ttf

– Alex Schroeder 2015-01-19 13:23 UTC


Sure.

Does it work for you in firefox? I mean, can you see Symbola font being loaded in the Network tab in the developer tools? (with ctrl+f5)

AlexDaniel 2015-01-20 02:27 UTC


No, because I have installed it locally. I can see all the characters on my iPhone 4, however. That must mean it manages to download the font, right?

AlexSchroeder 2015-01-20 11:27 UTC


Hm. Deleted the font, used Chrome, and now I see how it no longer works. D’oh! I see, however, that Symbola.woff is being downloaded, with a Status 200. The response header looks OK as well.

HTTP/1.1 200 OK
Date: Tue, 20 Jan 2015 11:31:14 GMT
Server: Apache
Last-Modified: Thu, 13 Nov 2014 09:37:03 GMT
Accept-Ranges: bytes
Content-Length: 18608
Cache-Control: max-age=3600
Expires: Tue, 20 Jan 2015 12:31:14 GMT
Keep-Alive: timeout=5, max=98
Connection: Keep-Alive
Content-Type: application/x-font-woff

– Alex Schroeder 2015-01-20 11:33 UTC


The font is still not installed locally. Trying Firefox. I see that the font is not downloaded – but the characters display correctly with the sole exception of 🐋. WTF.

AlexSchroeder 2015-01-20 11:35 UTC


In addition to that, Firefox seems not to be using the Noticia Text font. I don’t know what’s going wrong today but something’s wrong.

AlexSchroeder 2015-01-20 11:43 UTC


I think I will remove all those emoji from the footer and just install smiles.pl – those should always work! :)

– Alex Schroeder 2015-01-20 12:06 UTC

Add Comment

More...

Comments


Please make sure you contribute only your own work, or work licensed under the GNU Free Documentation License. See Info for text formatting rules. You can edit the comment page if you need to fix typos. You can subscribe to new comments by email without leaving a comment.

To save this page you must answer this question:

Please say HELLO.