Mastodon

Mastodon is a federated micro-blogging service. “Federated” means that there are many servers, each with their own rules, unlike Facebook, Google+ or Twitter. “Micro-blogging” means that you can post status updates up to 500 characters long.

I wrote mastodon-backup so that people can download their own toots, favorites and media attachments.

I also wrote bitlbee-mastodon. This plugin allows Bitblee to communicate with Mastodon instances. Bitlbee is an IRC server connecting to various other text messaging services. You run Bitlbee and connect to it using an IRC client, then configure Bitblee to connect to other services, such as a Mastodon instance where you already have an account. The benefit is that you can now use any IRC client you want to connect to Mastodon.

If you’re new, I recommend this post: How to Mastodon.

2018-04-13 Social Media Goals

More Mastodon thoughts...

Initial tests with automatic anti-lurker measures: of my 513 followers 289 haven’t mentioned me in the last 12 weeks (same number if considering all the mentions, ever). That would be a strangely big list of people to block, if that was my strategy to block bots and spyware. But isn’t interaction what I’m here for? I feel like radio blocking listeners who never call in. Or should I feel like hanging up the phone when the other side never says a word? That’s creepy, too.

The social sniffer is what I’m concerned about. I guess I just want to make that harder. Then again, sniffers can just slurp the public timeline and get all the data, right... 😭

On Google+ and Facebook, I blocked all the accounts that looked like spammers and leeches to me. They had to have something, anything on their profile to indicate that they were interested in communicating with me, or a common interest. Just a signal. Anything.

I guess one other thing I could try is unfollow anybody who isn’t following me? I realize that such a mass unfollow and blocking tool is not for everybody but I keep wondering what kind of social media I’d actually want to see and I keep thinking I want to connect with people, and have conversations. If we’re not having conversations, perhaps we should just read each other’s blogs. Or perhaps I’m demonstrating to myself how conflicted I am about the entire notion of social media.

I just imagine sitting in a room full of people. I sometimes say a thing. Some people wink. Some people wave. Some people say something back. And some just sit there and listen. They’re eyes looking at me, at the people reacting, back at me. They never blink. It’s creepy as hell. What are they doing in the same room as I am. I want to invite them into the conversation but I don’t need them just sitting there, listening in.

Clearly some people have something to say to a lot of followers. They act like multiplicators. They can have a beneficial effect, like teachers. People learn by following them. Or they can be influencers, adsters, fakesters, propagandists, sniffers, marketeers, profilers, secret service, all sorts of unsavoury jobs. But if you follow somebody like you follow a blogger, clearly an intentional one-way communication, then that’s cool. But I think that’s not what I want.

Maybe I want a slow moving, asynchronous chat room.

I’ll think about this some more, for sure. I think writing the code and looking at what it would actually do, seeing those ratios, perhaps that’ll help me make up my mind. What is it that I want from Mastodon?

Tags:

Comments on 2018-04-13 Social Media Goals

I think the shear amount of stuff that one can read is so big, that it’s really difficult to stop for a moment and talk back, instead of moving to your next favourite corner of the Internet. As for me, I often don’t know what to say!

I like Twitter for the ease of interaction. I like blogs for solid bodies of communication, with links, history, pictures... I don’t love G+, but all the interesting folks are there!

– Enzo 2018-04-17 16:17 UTC


Yeah, the big exodus from Blogs to G+ still hurts! 😅

– Alex Schroeder 2018-04-18 13:56 UTC

Add Comment

2018-01-31 Mastodon CSS

Here’s an interesting fix to the Mastodon CSS: “now the columns in the Mastodon web UI don’t scroll independently anymore, and it’s a huge improvement for keyboard-control.”

@-moz-document domain(icosahedron.website) {
    .column:nth-of-type(2) { width: 600px !important; }
    .columns-area { x-overflow: none !important; }
}

Thread:

I have no idea how I did this, but I was poking around in the inspector and deleted a CSS rule, and now the columns in the Mastodon web UI don't scroll independently anymore, and it's a *huge* improvement for keyboard-control. (The focus model for multi-columns with independent scrolling is a huge headache I could never figure out satisfactorily.)

So the trick is to select the "columns-area" div and disable the "overflow-x: auto" rule; boom. Nicer scrolling for all!

The main thing I like about this is that it makes expanded column width more usable as well:

@-moz-document domain(icosahedron.website) {
.column:nth-of-type(2) { width: 600px !important; }
.columns-area { x-overflow: none !important; }
}

The default Mastodon column width of ~25 characters is just Bad, and I'm glad it's within my power to fix it myself.

Tags:

Add Comment

2018-01-20 Mastodon Archive 0.0.5

I made a new Mastodon Archive release.

Changes from 0.0.4 to 0.0.5:

  • use a User-Agent of Mastodon-Archive/0.0 when downloading media files
  • warn if toot expiration is going to take a long time due to rate limiting
  • report on favourites
  • report default to a 12 week time window with an option to change it
  • report default to top 10 tags with an option to change it
  • add an option to include boosted toots in your hashtag report
  • when providing all as your user, then the subcommand will run for every archive in the current directory

Tags:

Add Comment

2018-01-13 No Google Plus

A while ago I discovered Mastodon and loved it. I didn’t worry too much about being tracked. Everything and everybody was new. Posts were shorter. And I basically switched. I’m no longer a big Google+ poster.

I had joined Google+ because of all the other RPG people. The Old School Renaissance (OSR) folks had all collectively moved their talking from blogs to Google+, I felt. But in recent months I have often felt that many posts on Google+ were about politics, and they were getting me down. The orange pumpkin US president also didn’t help (Trump, in case I come back to this blog post many years later and have forgotten who it was). I wanted to read about politics but it was getting me down. I wanted to read about role-laying games but that was getting me down, too!

It’s hard to explain. Some posts were too long. Huge! Others were just linkspam, sometimes nothing but a link, or sometimes a very short sentence or two, plus a link, sometimes posted in multiple Google Communities. Even though that didn’t affect me much, it still made me a little angry. It’s stupid, I know.

Mastodon has a 500 character limit and no markup. Those limitations are stupid, too. But strangely, I feel more comfortable in this environment. And I noticed something else: I am quite comfortable posting about code and programming, something I had mostly kept out of my Google+.

Perhaps that’s because the RPG instance I am on, dice.camp, isn’t too interesting as far as the OSR goes. And so I did not post too much over there.

I thought the change would be hard. But it turns out it isn’t.

Tags:

Add Comment

2017-12-15 Including Mastodon Comments

Steve Ivy suggested pulling in replies to a Mastodon status referring to a blog post, and suggested using the regular API for it, because displaying a status and its context doesn’t require authorization. Interesting idea!

But then again: Am I no longer going to expire these toots?

shower thought: wondering if I could automate posting links to my blog posts on mastodon, then pull in replies and boosts via *javascript* (like masto-discus)

Tags:

Add Comment

2017-11-29 What to do with Mastodon

On Dice Camp, Meguey Baker asked:

A follow up question: what are we doing now that we’re here? Let us gather for a purpose beyond “talk about stuff and things!” What gives us meaning, individually and collectively? There is a massive massive massive flood of “content” in the world; we are super saturated with it. Lots of us make it. Im not saying anyone stop, I’m saying what could we make together if we had a plan?

I think instances which are small and focused on a project could exist for a distributed team. But that sounds a lot like work. But that’s one thing that people could do: work.

I know a thing I don’t want to do: promoting, and reading promotions. I am saturated with content, and products.

But there are models for the things in between: book reading clubs (not buying books); social clubs (talking about thing but aiming at an improvement of self and society along some axis).

Personally, I’m mostly interested in what differentiates a salon in Paris a few decades ago from a public space. Curation of members, curation of topics, invitation of guests, these are the obvious outer limits. But there must have been expectation management as well. What did members hope to gain through their membership? Entertainment? Advancement? How much bowing was expected? How much free labor? I understand so little about this.

Also related: Royal Society of London for Improving Natural Knowledge. Could this be a Society for Improving the Art of Role-Playing Games? All games? Pushing envelopes? Feedback sessions? Criticism? I don’t want to deny the negative aspects of all these ideas (thinking of criticism and self-criticism in communist countries), but these limitations will need buy-in from a starting pool of people.

One thing that I have always enjoyed on G+ and blogs was posts that succinctly summarized an event, mostly during a session, or the setup of a one-shot, and discussed how they handled or solved it. This also extends to comments on other people’s activities (i.e. back to criticism). In the office, I’d talk about describing best practices and building a community of practice, but essentially, I think it needs some sort of scaffolding and we might as well call it a salon.

Thinking more about building a “community of practice”. What would that entail? I’d expect one consequence to be that we talk more about the things we do rather than about the things we make. So, while we are running games, playing games, designing games, writing games, we notice things and talk about them, instead of advertising the finished products we made. It’s less about the things we make but about the making of these things. (He says, trying to sound smart, haha.)

Tags:

Add Comment

2017-11-20 No Twitter

Yeah, you’ve seen all the Mastodon posts on this blog so you know I’m using Mastodon and not Twitter. Here’s a blogpost by Jason Lefkowitz talking about the affordances of Twitter: I kind of hate Twitter.

I might not delete my account just yet, but I don’t think I’ll be posting or reading much on Twitter any time soon.

Update – talking points:

Mastodon has...

  • better moderation ✔
  • no ads ✔
  • no magic reordering of your timeline ✔
  • distributed nature ✔
  • is free software ✔
  • 500 char limit ✔

And that’s why you can find me there: @kensanata.

Tags:

Add Comment

2017-11-18 Mastodon Backup

Too long, didn’t read: check out mastodon-backup.

OK, it seems that Weapon vs. AC is going to close down and that Dice Camp is the “new” RPG instance. I wanted a backup of all my toots. Mark Damon Hughes has written Mastotool which does that using screen scraping. MastoUserScrape by BobC does the same thing but doesn’t download all your media.

One thing to note, though, is that scraping your user page (https://octodon.social/@kensanata and the like) means that you’re not seeing any replies!

I wanted to export all my toots, including replies, but based on the Atom feed. I got pretty far, I think, but I noticed that the chain of atom pages simply ends after a while:

~/src/mastotool $ ./Mastotool.py --backup https://octodon.social/@kensanata --save kensanata@octodonsocial.atom
Downloading https://octodon.social/@kensanata...
Downloading https://octodon.social/users/kensanata.atom...
Downloading https://octodon.social/users/kensanata.atom?max_id=242067...
Downloading https://octodon.social/users/kensanata.atom?max_id=238093...
Downloading https://octodon.social/users/kensanata.atom?max_id=235430...
Downloading https://octodon.social/users/kensanata.atom?max_id=230812...
Downloading https://octodon.social/users/kensanata.atom?max_id=228327...
Done

Why doesn’t the last one have a next link? I raised an issue on GitHub and apparently that’s a bug.

I wrote a new tool, mastodon-backup:

$ ./mastodon-backup.py kensanata@octodon.social
Get user info
Get statuses
We have 1276 statuses

This was the correct number of statuses a few minutes ago! As always, OAuth took a few extra cycles to get right, but I think the Mastodon.py library does everything I need.

Current state of mastodon-backup: it will log in and download all your statuses into a JSON file. Documentation of the format: see Toot dicts in the docs for Mastodon.py. The documentation says:

Unless otherwise specified, all data is returned as python dictionaries, matching the JSON format used by the API. Dates returned by the API are in ISO 8601 format and are parsed into python datetime objects. [1]

This is great. Documentation of the JSON format used by the API is available from the Mastodon documentation.

My goal is to write a transformer that will just turn the JSON file into a HTML file. Alternatively, if you already have such a tool, please contribute? :)

Some time later: OK, got text and HTML export. Mission accomplished!

Some time later: OK, got media backup, but only for the toots I authored myself, not for boosts, and some issues with the progress bar, and I want the HTML export to use images from the media backup instead of hitting the instance with hundreds of image source links.

Some time later: I think I’m done?

Tags:

Comments on 2017-11-18 Mastodon Backup

On Windows, I used Cygwin to install python3 and python3-pip to get started but I get and error:

...
ModuleNotFoundError: No module named 'pip._vendor.requests'

So I switched and used easy_install.

easy_install-3.6 Mastodon.py
easy_install-3.6 html2text

– Alex 2017-11-20 10:29 UTC

Add Comment

2017-11-16 How to Mastodon

Ever wondered what social media is for? Mastodon is a microblogging platform, like Twitter. What you do is post microscopic blog posts: little text messages, possibly containing links to more text and maybe some images for you to look at. And you “follow” other people in order to read their little messages. It’s quick, it’s not a lot of work, the river of news just flows past and you dip in and out as you please. But how do you get started?

Here’s what you do:

Pick an instance. An instance is your server. If you use Twitter, Facebook or Google+, everybody is on the same instance and thus the same rules apply to everybody. Mastodon instances are like the other websites, everybody has their own site and makes their own rules. Thus, you want to pick an instance where the admins share your opinions on free speech and its limits. The Instance Directory has a wizard that helps you choose.

Every instance has a local timeline. If you visit an instance without having an account, you’ll see a preview of their local timeline (”A look inside...”). It’s a good idea to pick an instance with a topic that you are also interested in. Tabletop games, science fiction, cyberpunk, cooperatives, heavy metal, programming, art—perhaps there is an instance for you. There, you’ll quickly find like minded people to follow.

Then again, once you have a bunch of people to follow, the local timeline decreases in importance. Still, it’s nice to have an account on an instance that matches your interests.

How do you know what an instance is about? You can skip the instance directory wizard and check out the list of instances directly. Each instance has a little blurb that might help you choose.

The advanced list has more information about status, uptime, version installed, and so on, and that might give you an idea of how conscientious the admins are.

Create an account. This is easy: email address, password, confirmation email, perhaps install an app for your phone and all that. You know how this works.

Edit your profile.

  1. Pick a display name.
  2. Write a short bio using hashtags.
  3. Upload a profile picture (”Avatar”).

Hashtags are important so that similar minded people can find each other. Mastodon only supports searching for usernames and hashtags!

Write an introduction. Write a post (a “toot”) and use the hashtag #introduction. Say who you are and what you’re interested in, and use more hashtags. Here’s my introduction for the dice.camp instance, for example:

#introduction I run #osr games using my own hose rule document but it all started with Labyrinth Lord which I knew long before I knew B/X. Sadly, my Indie Game Night is no longer a thing but I still love Lady Blackbird, all the #pbta hacks on my drive, and so much more. But in the three campaigns I run, it’s all OSR right now.

Post this introduction, then use the dot menu (⋯) to “Pin to profile”. Your introduction will now be the first thing people see when they visit your profile. Here’s my profile. After a while you are of course free to pin a different post to your profile. I recommend you start with your introduction, however.

Start interacting. Click on the icon with the little group of people on it and start reading the local timeline. If you like something, make it a favorite by clicking on the star (☆). If you have something to say, reply by clicking on the arrow (↰). If you want to spread something, boost it by clicking the two arrows (🗘).

Be aware of how these three actions come across:

  • Marking something as a favorite does not start a conversation. People will smile and nod and read something else. Some people like to use this as a friendly conversation end: I like what you said and have nothing more to add. Others like to use this as a bookmark. How you use it is up to you.
  • A reply is cool. If you want interact with people, this is important. Write something and avoid the temptation to just mark something as a favorite. I recommend clicking on a toot you’re going to reply to and checking the existing answers (scroll to the bottom in the third column). You don’t want to repeat something other people have already said, right?
  • A boost is nice for artists and creators, but be aware that Mastodon doesn’t deduplicate boosts. That is, if somebody is following a bunch of people and four of them boost a toot, then they will see the boosted toot four times in their timeline. Consider not boosting a toot that you have seen a few times in your timeline already. Also know that a boost ads no personal touch. People will follow you if they can get a sense of the real you, and that requires posting your own toots.

Follow people. Click on the profile pictures of the people you might want to follow and check whether you like what they have recently written. If you do, follow them by clicking on the person plus (👤➕). If you changed your mind, click on the person cancellation (👤🗙).

If you followed a person and the icon turned into an hourglass (⌛) this means that they protected their account and have to authorize you. Be patient.

How do you find more interesting people to follow? Look to see who your favorite folks are following. You can find them via the profiles of the people you are following. If you’re on Dice Camp, for example, you can visit my profile and check out my follows. You’ll get a neat list of 100 people or more and you can just click on that follow button (👤➕). An even more aggressive strategy would be to look at the list of people following the administrator (no. 1), since new accounts will automatically follow no. 1. Thus, it’s a list of nearly everybody.

Keep following people: You need to keep finding more people to follow in an interest based network since people will be dropping out all the time. Your relatives and friends from school don’t disappear as quickly on Facebook, nor do journalists and news outlets disappear on Twitter, but in the more interesting and interest-based communities, that’s simply how it is. You need to replenish the pool and keep finding and following more people. They’re everywhere.

If you are confused by toots, remember that clicking on one gives you all the ancestors (the chain of replies from the original posting to the toot your looking at) and all the descendants (all the replies to the toot you are looking at). Note that if you want to see all the replies to the original toot, you now have to scroll all the way to the top and click on the first toot.

Multiple accounts, do you need this? Some people have multiple accounts. I do. I like to keep my gaming separate from everything else. There’s one account for gaming and history, and there’s another account for programming, politics, environmentalism, social media, photography, and everything else. That’s because I think that the overlap between these two big subject areas is small. Mastodon has no way of sorting your followers into groups, no way of sending a messages to a certain group, no way of reading messages from a certain group. The solution is to create a separate account for each subject area.

Many people think this is unnecessary and they are interested in the whole picture of people they are following. :)

Keyboard shortcuts. No worries. You don’t need to know about these. Some people like to use them, however. And since it took me a while to discover them, here’s a list.

  • r to reply
  • m to mention author
  • f to favourite
  • b to boost
  • enter to open status
  • up to move up in the list
  • down to move down in the list
  • 1-9 to focus a status in one of the columns
  • n to focus the compose textarea
  • alt+n to start a brand new toot
  • backspace to navigate back
  • s to focus search
  • esc to un-focus compose textarea/search
  • ? to display this legend

And there’s an undocumented keyboard shortcut 「g」 to go to places:

  • g b goes to blocked users
  • g f goes to your favourites
  • g h goes home (shows twice)
  • g l goes to the local timeline
  • g m goes to muted users
  • g n goes to notificattions
  • g o opens the current toot
  • g p goes to pinned toots
  • g r opens a reply
  • g s goes to getting started
  • g t to your federated timeline
  • g u goes to your profile

More links:

Explaining the columns of the Mastodon user interface
Image by Adam K

Tags:

Comments on 2017-11-16 How to Mastodon

Resources for Mastodon Newbies.

– Alex 2017-12-20 21:44 UTC


A brief introduction to Mastodon

– Alex 2018-01-08 18:00 UTC

Add Comment

2017-10-22 Mastodon and Bitlbee

OK, so you want to test the Mastodon implementation for Bitlbee like I do after a long break?

Well, let’s say you did a ./configure --debug=1 --asan=1 --msn=0 --jabber=0 --oscar=0 --twitter=0 && make in your directory and stuff crashes immediately. You want to debug. How does that work on macOS?

You try using gdb, and use the BITLBEE_DEBUG environment variable to have HTTP headers printed as you go:

alex@Megabombus:~/src/bitlbee (kensanata/develop %=)$ BITLBEE_DEBUG=1 gdb --args ~/src/bitlbee/bitlbee -D -n -F -v -d /Users/alex/.bitlbee -c /Users/alex/.bitlbee/bitlbee.conf
GNU gdb (GDB) 8.0.1
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin16.7.0".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from /Users/alex/src/bitlbee/bitlbee...done.
.gdbinit:1: Error in sourced command file:
Disabling randomization of debuggee's virtual address space is unsupported on
this platform.
(gdb) run
Starting program: /Users/alex/Source/bitlbee/bitlbee 
Unable to find Mach task port for process-id 43768: (os/kern) failure (0x5).
 (please check gdb is codesigned - see taskgated(8))

OK, so the randomisation error is due to a line in .gdbinit and you can ignore it. You may also delete the file.

If you have used plugins such as bitlbee-facebook or bitlbee-discord, now would be a good time to delete them from /usr/local/lib/bitlbee until your issues are resolved.

You can’t ignore the part about codesigning, though. Luckily, the answer is simple:

alex@Megabombus:~/src/bitlbee (kensanata/develop %=)$ ls -l /usr/local/bin/gdb
lrwxr-xr-x 1 alex admin 27 Oct 22 09:46 /usr/local/bin/gdb -> ../Cellar/gdb/8.0.1/bin/gdb
alex@Megabombus:~/src/bitlbee (kensanata/develop %=)$ codesign -fs gdb-cert /usr/local/bin/gdb
alex@Megabombus:~/src/bitlbee (kensanata/develop %=)$ codesign -fs gdb-cert /usr/local/bin/../Cellar/gdb/8.0.1/bin/gdb
/usr/local/bin/../Cellar/gdb/8.0.1/bin/gdb: replacing existing signature

You will have to provide your username and password, twice.

Now, when you issue the run command, you will have to provide your username and password, again, but now it works:

(gdb) run
Starting program: Starting program: /Users/alex/Source/bitlbee/bitlbee -D -n -F -v -d /Users/alex/.bitlbee -c /Users/alex/.bitlbee/bitlbee.conf
[New Thread 0x1403 of process 43950]
warning: unhandled dyld version (15)
Warning: Warning: Couldn't write PID to `/var/run/bitlbee.pid'

You should now be able to connect to your local server (in my case, megabombus.local) using an IRC client.

And you’ll probably get an error like the following:

ASAN:DEADLYSIGNAL
=================================================================
==48642==ERROR: AddressSanitizer: SEGV on unknown address 0x00000000b8f0 (pc 0x0001000ccf00 bp 0x7fff5fbfdaf0 sp 0x7fff5fbfda50 T0)
==48642==The signal is caused by a READ memory access.
    #0 0x1000cceff in mastodon_http_timeline (bitlbee:x86_64+0x1000cceff)
    #1 0x1000c2fc9 in mastodon_http_hashtag_timeline (bitlbee:x86_64+0x1000c2fc9)
    #2 0x100078b80 in http_incoming_data (bitlbee:x86_64+0x100078b80)
    #3 0x100074587 in gaim_io_invoke (bitlbee:x86_64+0x100074587)
    #4 0x100251e63 in g_main_context_dispatch (libglib-2.0.0.dylib:x86_64+0x2ce63)
    #5 0x100252161 in g_main_context_iterate (libglib-2.0.0.dylib:x86_64+0x2d161)
    #6 0x1002523b6 in g_main_loop_run (libglib-2.0.0.dylib:x86_64+0x2d3b6)
    #7 0x1000742af in b_main_run (bitlbee:x86_64+0x1000742af)
    #8 0x100069e7f in main unix.c:182
    #9 0x7fffe946e234 in start (libdyld.dylib:x86_64+0x5234)

And now you know where to look. Well, more or less. You need to convert that address to a line number:

(gdb) info line *0x1000cceff
Line 1054 of "mastodon_lib.c" starts at address 0x1000ccebc <mastodon_http_timeline+28>
   and ends at 0x1000ccf07 <mastodon_http_timeline+103>.

Strangely enough, setting a breakpoint does not help. Hit C-c to break, b mastodon_http_timeline to set a breakpoint, c to continue, and try again – and you run into the same error without reaching a GDB prompt. This also happens if you run without ASAN. I’m not sure what the problem is, but in this situation you’re basically back to print statements and the like. Uagh!

Oh, and Mastodon 2.0 changed all their ids from integers to string in their API and so everything is broken.

Tags:

Comments on 2017-10-22 Mastodon and Bitlbee

Also, I’m working on my branch, kensanata/develop. I have the remote upstream configured. So when I’m done and I have committed, I fetch from upstream, rebase onto upstream/develop, and force push that.

Later, when I’m ready to upgrade my Pull Request, I switch to my master branch. And then what? To be answered. :)

– Alex 2017-10-23 05:17 UTC


Looks like my PR is not going to get merged. It’s a big chunk of code and tricky to review thoroughly, unfortunately. :(

– Alex 2017-10-23 14:53 UTC


Then again, based on the example of bitlbee-discord it was easy to turn my code into a plugin: bitlbee-mastodon!

– Alex 2017-10-24 06:55 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.