Archive for Site

On My Header Image

In what is probably the biggest visual change since I first created this theme back in ’05 — yes, it’s that old! — on June 2, 2011 I replaced the header image with a picture I took a month prior in the Keukenhof.

The opportunity presented itself to experiment slightly with decent JPEG compression, rather than simply depending on GIMP’s output, which unfortunately is virtually guaranteed to be suboptimal. Since all I did was crop and resize, I used PNG as my working format. I might’ve been able to use jpegcrop and jpegtran, but since I was going to re-encode in a lossy manner afterward that would have been nothing but needless extra effort.

First I tried cjpeg, which doesn’t support a lot of input filetypes, so I had to save a copy as BMP.

cjpeg -quality 80 -optimize -progressive -dct float -outfile test80.jpg head.bmp

Then I discovered that imagemagick can do the exact same thing, optimized by default and everything. It also uses libjpeg under the hood, so the resulting image is exactly the same.

convert -quality 80 -interlace plane head.png test80.jpg

That results in JPEGs that are about as small as they can get without enabling options that might not be readily supported by all viewers. I wrote a (very) simple shell script to aid with a quick overview of size versus quality.

#!/bin/bash
#jpegs.sh
filename=$1
extension=${filename##*.}
filename=${filename%.*}
convert -quality 30 -interlace plane $1 ${filename}30.jpg
convert -quality 40 -interlace plane $1 ${filename}40.jpg
convert -quality 50 -interlace plane $1 ${filename}50.jpg
convert -quality 60 -interlace plane $1 ${filename}60.jpg
convert -quality 70 -interlace plane $1 ${filename}70.jpg
convert -quality 80 -interlace plane $1 ${filename}80.jpg

My rationale is that any quality under 30 is most likely too ugly and anything over 80 will result in a file size that’s too large for my intended purpose of using lower quality — but not low quality — images on the Internet.

I also decided it was time to get rid of my half-hearted concessions to Internet Exporer. This in no way inhibits readability of the content.

Comments

Behind the Scenes

Half a year ago’s post, about why we decided to buy a washing machine two years ago, was actually written back in September or October of 2009. I didn’t post it at the time because it made me aware I had no table styling. I then proceeded to make a testcase for table styling, which I presumably finished before October 2009 was over.

Sadly for the post, however, I then forgot about it till last year, when I found my table styles testcase during my switch from NTFS to ext4. This had the side-effect that I started incorporating various stylesheet upgrades I’d written over the past two or three years, giving you a different default width and fancy schmancy transition effects today — or actually already back in May 2011 because that’s how long it took me to actually publish this. I really do need to stop putting things in drafts for potential revision without ever picking them up again.

Comments

New URI

After nearly five years of being hosted at a subdomain of Lowter, this blog is now hosted on my own server. I would like to extend my gratitude to Ethan for hosting me all those years.

Comments

Intelligent Alien Life Does Exist, Otherwise They Would Have Contacted Us

This post is recycled, and was originally published on my former weblog on Saturday 2005-02-26 at 18:08:45. I tweaked some grammar and spelling here and there, but I resisted the urge to rewrite this entry almost entirely. I did not, however, refrain from commenting on myself. Sensitive souls beware: I added some brand new explicit content.


This is the only signature I had which really liked. [I guess I must really, really like it, for I still use it.] It looks like a quote from someone famous at first sight [(of course famous by no means implies not stupid)], or just a good old expression (you know, like “an apple a day keeps the doctor away”), but it is entirely a product of my brain. [Whoopee.] I don’t find that so very surprising all by itself; in what may be a form of narcissism, I say things I consider quotable quite often. [Saying quotable things sure is narcissistic. What's that? You meant I consider things I say quotable quite often, did you? Very well then, carry on. On a very related matter, I'm not so sure if stupid jokes like You've got the first pickle (when offering a few pickles) as a play on first pick is all that quotable, though.] But still, this particular “quote of my mind” has a sort of uniqueness over it. [Oh boy. If that means it's the magnum opus of my brain, I'm fucked.]

You should also know something about my browsing behavior to understand a bit about what happened when the quote came to me. I seldom browse with less than four pages open. [Even at the time that was a lie and you know it. I bet you rarely managed to browse with less than 10.] I basically just open what I find interesting and then read what I have opened one by one, or close it quickly if I see it is not what I expected it to be. [Most people, on the other hand, close pages they don't want to see as slowly as possible.] I also start writing a reply to something, to interrupt it by going to some other page, after which I will continue writing the reply. [You were also doing that while writing this post, weren't you?]

The situation where the general idea came into my mind was like this. I was filling in profile information on some site (I don’t remember which one, but it doesn’t matter) and I came to the signature part. I could use the quote which I made up with my Chicken avatar (“The chicken and the egg came at the same time”), but I wanted something new. [I'm sure that everybody knows what your Chicken avatar looks like.] Something catchy. So I decided to go to another site. Meanwhile, I could think about my signature.

It was quite a strange site I visited. A UFO related site, where they argued that UFOs actually were some kind of new technology from the Third Reich, whose descendants still resided on Antarctica. Utter nonsense and therefore enjoyable. [The perfect way to judge whether something is enjoyable.] But then suddenly this thought came into my mind, because of the combination between World War II and UFOs. [Suddenly, I wanted to kill myself.] Why haven’t aliens contacted us? If they’ve observed us they must have noticed the bloodbaths of Alexander, the expansion and fall of the Roman empire, the Conquistadors, Napoleon, and most important, World War II. So yes, obviously alien life is intelligent; if they weren’t, they would have contacted us. Intelligent alien life does exist, otherwise they would have contacted us. [Amazing!]

And there it was. The perfect signature. I had exactly the kind of bad quote I wanted my signature to be. I still like it. [I guess I can live with it for a while longer. Perhaps I should update it. Space dinosaurs do exist, otherwise they would not be extinct on earth.]

Comments

Taking Sidenotes to 2010

Five years ago there were lots of posts dealing with people’s visions of the least-bad method to include sidenotes — or footnotes — to HTML, and like any self-respecting HTML-geek I created my own take on the matter. As might be expected from five year old writings it is now outdated, and I’m glad it is. It means the cruft can be retired, and media queries can be used to their full glory — except in IE8, that is.

The script I wrote to supply non-Opera browsers with faux-media-query functionality assumes that any browser not Opera should have the script applied to it, because at the time Opera 7+ was the only browser that supported media queries. I knew this wasn’t exactly the proper way to write scripts, but it was meant to be updated to use some more intelligent detection at some point. As such things go, however, it never was. In my defense, the worst the script did was duplicate some functionality that was already provided by media queries, so I rather doubt anybody noticed any adverse effects. Heck, they might have noticed positive effects, since as I wrote at the time, “For now, it might even be the best solution to apply the Javascript to Opera as well, because Opera does not reapply media queries on resize yet (and it does fire the onresize event as every browser does).” For good measure I’m also including the script as I used it on my website since 2006. It has this nifty little added feature that it doesn’t actually do anything if there are no sidenotes present, which is something media queries cannot do. I think I considered writing a more intelligent check based on style features that would be set by the media query back in early ’06, but I can’t recall why I never did. For those interested in hacking the old script, the way I set it up it should be possible to determine whether media queries are supported very easily by combining a test for at least medium width with the marginRight style property on the sidenotes. If set, media queries are working; if not, go ahead and do some scripting magic.

Now, on to the updated sidenotes. I abandoned absolute positioning in favor of going completely for float. I believe I wanted to do this originally, but there were too many float bugs in all kinds of browsers to make it viable (that means everything not Presto or KHTML). Since these appear to be fixed, there is no reason not to take full advantage of floats, which most important means using clear so that sidenotes will not overlap. Previously I had to seriously consider the placement and frequency of sidenotes. Now I can just add them whenever I want. I still think my original reasoning is quite valid, however, which means I don’t think sidenotes should be inserted lightly or contain overly long texts.

Let’s start out. How do we markup a sidenote? Well, as HTML contains no way whatsoever to markup a foot- or sidenote, the logical choice is small. Why small? Well, it means that the content of small is less important. A footnote should not be a footnote at all if it’s as important, or more important than the text itself, right? Thus, the markup of the sidenote is as follows:

<small class="sidenote">A sidenote</small>

This is still what I use, but ASIDE would be more appropriate in HTML 5.

The sidenote as I created it is meant to be put at the end of a sentence, inside a paragraph. Therefore it would be displayed at its original position in the text if author CSS was disabled, or read at its intended location on screenreaders. If it wouldn’t be put as a separate sentence, it would look strange if not displayed the intended way. The sidenote is placed inside the paragraph with the other text, for if it would require multiple paragraphs, should it be a sidenote?

Were Sidenotes Always Compatible With Any Element?

You could always apply the sidenote class to any element, such as P or DIV.

There is one issue I didn’t take into account five years ago. For example, including two paragraphs or so of background information on a country or city in a sidenote would be an appropriate use of sidenotes since it’s not really a part of the text. My original stance (although not explicitly written) was that this should be solved with hyperlinks, but I have somewhat revised this stance. The markup would then become something like:

<div class="sidenote">
	<h3>Were Sidenotes Always Compatible With Any Element?</h3>
	<p>You could always apply the <code>sidenote</code> class to any element, such as <code>P</code> or <code>DIV</code>.</p>
</div>

Or in HTML 5:

<aside>
	<h3>Were Sidenotes Always Compatible With Any Element?</h3>
	<p>You could always apply the <code>sidenote</code> class to any element, such as <code>P</code> or <code>DIV</code>.</p>
</aside>

The main sidenote CSS is still very similar to what it was in 2005.

.sidenote {
	background: #efd;
	display: block;
	float: right;
	clear: right;
	width: 200px;
	border: 1px solid #eee;
	border-right: 0;
	margin: 2px;
	margin-right: -20px;
	padding: 3px;
	text-indent: 0;
	cursor: help;
}
.sidenote:before { content: '\2190' ' '; }
.sidenote:hover {
	background: #ff0;
}
/* enable usage of code in sidenotes without the layout breaking  */
.sidenote code {
	white-space: normal;
}

There are a few minor differences, but other than the addition of the .sidenote code line nothing worth mentioning. Only a few weeks ago I noticed that adding a line of code to a sidenote somewhat broke my layout because it stretched beyond the viewport. A few more global ways to accomplish normal white space in sidenotes come to mind (such as !important in the main class or .sidenote *), but from what I understand using such methods increases parsing time, if only ever so slightly.

The media queries performing the sidenote magic were significantly slimmed down, and a low-resolution in-line display was added:

@media all and (max-width: 350px) {
	.sidenote {
		display: inline;
		float: none;
		border: 0;
		margin: 0;
	}
	.sidenote:before {content:"";}
}
@media all and (min-width: 750px) {
	#wrapper{margin-right:207px}
	.sidenote {
		border-right:1px;
		margin: 0;
		margin-right:-228px;
	}
}
@media all and (min-width: 980px) {
	#wrapper{margin-right:auto}
}

#wrapper is just in there to keep IE from embarrassing itself; if I were creating my blog’s design today I’d just go with body. Switching completely to float makes it possible to keep the overrides to a minimum, but that’s not the important change here. I switched to simple media queries for two reasons.

  1. It’s much easier to maintain and change. No more duplication.
  2. I don’t think most media types are as relevant anymore as I did back then. Specifically, in regard to such things as handheld devices what I want to do is offer different layouts based on screen size, not on whether they consider themselves to be handheld, screen, or some other fancy media type. Safari on the iPhone considers itself a big browser, for instance, but should it really get the “big” layout? None of this is especially relevant for my sidenotes, but it does reflect my opinion on it. Additionally, specifically overriding for certain media types rather than being specifically inclusive makes sure that no one is left out. In other words, this is future-safe. If the media type magazine ever emerges (they already did a magazine with an eInk cover, didn’t they?), my media query is ready for it now. And for those who care about such things, it also avoids an IE bug or two.

That’s it. My sidenotes are ready for the nearby future. They’re so 2010. Feel free to use or expand on my ideas, but please add a link back to me somewhere if you do.

Comments

Updates on Twitter

I don’t care much for Twitter. The maximum message length of 140 characters is extremely limiting and, unless you resort to chatspeak, it’s hard to say anything meaningful in such a limited space. If you do resort to chatspeak, it won’t look meaningful even if it is. Catch 22! I imagine the best way to say something meaningful is to link to a blog post offering more explanation, or maybe I’m just prejudiced against chatspeak. Regardless, since most people comment on blog posts using Twitter, and everybody and their grandparents is using it, I figured I should look into a way to utilize it in a more meaningful way than logging in about once a year.

microblog-purple offers convenient integration into Pidgin, which I already use for chatting. It’s easy to install on Ubuntu using sudo apt-get install pidgin-mbpurple, but you may want to consider using PPA for both Pidgin and microblog-purple. Note that the microblog-purple from PPA is named pidgin-microblog, so if you already installed pidgin-mbpurple you’ll have to remove that first. That’s what it is, after all: a chat service with a 140-character limit — most chat services offer at least 500 characters or so. At least it has better offline and history support than most. You also need to enable the plugin named Twitgin so you get a character count on the window where you communicate with Twitter.

Since, like I said, almost everybody uses it, I figured it might also be a good idea to announce new blog posts on Twitter automatically. I searched around a bit in the forest of Twitter plugins and WP to Twitter sounds like it best meets my needs. This post is a test of the plugin, and it announces my partial submission to the crowd — not submission in the sense of Islam, but submission in the sense of realism.

Comments

Quick, Unsecured Backup Over FTP

I wanted something that I could easily set as a cron job, and
the following works quite decently. For some reason the same construct does not seem to work with sftp, so if you’ve got any kind of sensitive data you probably shouldn’t use this.

wget -r ftp://user:pass@domain[/folder]

Comments

Violence in Games

This post is recycled, and was originally published on WatchZine on Wednesday 2004-03-03 at 14:00:00 UTC. I tweaked some grammar and spelling here and there, but I resisted the urge to rewrite this entry almost entirelyand rewrote fairly large portions of the text to make it flow somewhat better. To exemplify the relationship with the original text, I made extensive use of DEL and INS elements. I did not, however, refrain from commenting on myself. Sensitive souls beware: I added some brand new explicit content.


“Halt” clearly the voice of a German soldier sounds.Halt! shouts the voice of a German soldier. After a well aimed shot in the head of the soldier‘s head, the player starts going tosearching for his next victim. A zombie appears. The player getstakes out a flamethrower, and some seconds after thatlater the zombie is somediminished to a pile of burning meat. Then, a group of German soldiers came togetherassembles [or gathers] and is (coordinated) attackingattacks the player in a coordinated fashion. Two of them are killed by the rocket launcher, the; pieces of bodies are flying aroundbody pieces go flying about. This is a scene from Return to Castle Wolfenstein. Some people say this is bad for the minds of growing children,: that it will make them criminals, or even terrorists. Nonsense? [It's a reasonable introduction, but the end is rather weak. This is at least somewhat intentional, however, since in Dutch (high school?) argumentative essay writing the thesis statement is to be avoided until the conclusion. I always thought this was quite silly, and my present-day familiarity with American-style writing only reinforces this opinion.]

These days, games becomeare becoming more and more realistic. That makes them more violent. [Now that's nonsense. It makes them appear more violent. Besides, I thought you were arguing against this point of view?] Ten years ago, in Wolfenstein 3D (the mother of all shooters, and still a game which is forbidden in a lot of countries [Like where? I don't know of any countries other than Germany, and that was for Nazi symbolism, not for violence.]), the German soldiers died in big red pixels. [See? It was much more violent in those days. You don't see those bad-ass blood splatters anymore these days.] No matter where you shot it, the body turned with you. Now, that doesn’t exist anymore. Every character is build fromconsists of at least three to four thousand polygons. Shoot something from behind: it falls realistically; you can do bad things to the body and walks around it. Would this be bad? No, you just need to keep in mind that it’s a game. At young age, parents should tell their children what’s fake and what’s real. Children are able to ‘goimmerse themselves into a game very good,well; that doesn’t matter, as long as their parents/ or friends keep them in the real world. Besides, every game has a parental lock option, which allows parents to reduce the amount of gore. [While I agree with the general gist of this paragraph, the point isn't made as well as it could have been, and some poorly phrased examples detract from the strength of the argument. Kids are aware of the differences between fiction and reality as well as adults, but parental locks aren't exactly a convincing argument in support of this, and are almost a red herring to the real issue. No matter how realistic games look and sound, they really aren't any different from watching a movie or reading a book. Governments are messing up the world and are trying to get history books rewritten so that they only point out the positive aspects in history—or have already succeeded, like in America—. Games are a non-issue and if there are people who cannot distinguish between games and reality, we should be glad that they're doing their vicious deeds in games.]

Then it’s possible to putSome people point a finger toat the shootings in the U.S. Why? Some people sayIt is alleged that theythe shooters did it because they played so-called bloody games like Duke Nukem and Quake (I think they aren’t bloody at all [I think you're fucking wrong.]). The way they went through the school looked like they were finishing level after level in a game. Also, here in the Netherlands something like that happened,: a boy killed a girl, because he ‘got stressed by a game’. Okay, you can get stressed if you die again, but to kill your neighbor girl… That has nothing to do with the game, h. He would also have done that without the game; someone like that would also have done that if his lock refused to work. Indeed, those people we should protect, but not against games, just against themselves! [A good point is certainly made, but I'd have to check the Dutch original to see if the point was so poorly made, or if I lost something in the translation. Probably a bit of both.]

Of course you have the eleventh of september9/11 [Of course, who wouldn't think of 9/11 when discussing violent games.]: some reporters said that the idea came from a game. Their action even was successful: some games, like Red Alert 2 (which has a scene with the destruction of NY – one of the coolest levels in the game [If it had been Chicago, I would have been up in arms. Go Wolves!]) and Flight Simulator 2002 were taken from the stores (or not released yet in the case of FS – hey, in a simulation you should be able to chrash!), o. Of course you take it from stores out of respect for the victims, but the terrorists surely haven’t gotdidn’t get their idea to chrus thecrash into the WTC from a game. [That may or may not be true—if they got inspiration from anything it would have been a movie—, but it's really a red herring to the real issue.]

It becomes time that people will see that gaming is pure fun. Making sure games don’t contain violence and aggression takes a lot of time, which can much bettercould be used to do something about the real causes of violence and terror instead, and to help psychicologically violateddisturbed kids. [Like these guys?]

Frenzie (15 Februariy 2002) [This is positively ancient!]

Comments

Add Show or Hide Deleted Text Button

For an upcoming post, I used the DEL element quite extensively. I figured that, while potentially interesting, it would help readability to be able to temporarily remove them from display, so I wrote this little script. Incidentally, it was the first time in about three years—meaning the first time since I finished the layout and scripts when I started this blog—that I added any new scripts, or even edited the file containing them. While I am probably far from the most suitable person for this job, I decided to write a little tutorial, explaining what I used and why I used it.

I’ll start by dropping a major bomb. Here is the script.

// Checks if there is deleted text in post entries. Adds a Show or hide deleted text button if there is.
// Copyright © Frans de jonge 2009. Licensed under a Creative Commons Atrribution 2.0 license.
function AddShowHideDeletedTextButton() {
	var postEntries = document.getElementsByClassName('postentry');
	var postEntry = postEntries[0];
	if ( postEntries.length == 1 && postEntry.getElementsByTagName('del').length > 0 ) {
		var hideText = 'Hide deleted text', showText = 'Show deleted text';
		var button = document.createElement('input');
		button.setAttribute('type', 'button');
		button.setAttribute('value', hideText);
		button.addEventListener('click',
		function () {
			var e = postEntry.getElementsByTagName('del');
			for ( var i = 0; i<e.length; i++ ) {
				if (e[i].style.display == 'none') {
					e[i].style.display = 'inline';
					this.setAttribute('value', hideText);
				}
				else {
					e[i].style.display = 'none';
					this.setAttribute('value', showText);
				}
			}
		}
		,false);
		postEntry.insertBefore(button,postEntry.firstChild);
	}
}

I’m going to assume that you have at least a basic understanding of functions and variables, but may not be completely aware of DOM methods and how to use them. A very valuable resource is the Mozilla Developer Center, or MDC. It provides information on much more than just JavaScript and the DOM, but while I find the CSS and even HTML specifications fairly easy to get around in, the DOM specifications, with their language neutral, very extensive descriptions are quite hard in comparison. They are exactly the way they ought to be, but this makes it somewhat hard to find relevant information about actual usage and how to use it. That’s where the MDC comes in. It typically comes with a clear, concise summary at the top of the page, and if you don’t understand that, it usually comes with more extensive code samples as well.

	var postEntries = document.getElementsByClassName('postentry');
	var postEntry = postEntries[0];
	if ( postEntries.length == 1 && postEntry.getElementsByTagName('del').length > 0 ) {

DOM methods used:

In my blog, I have marked up all of the contents of my posts with a DIV element, with, as you might have guessed, a class postentry. This particular bit of code is meant to make sure that we are on the individual page of the post (i.e. not in some kind of overview) and that there are actually deleted elements around. Adding a button on an overview page would result in all kinds of problems—if you add only one it may not be anywhere near where it is needed, so you’d have to add multiple buttons, check if the post where it will be added has deleted elements, etc.—which are easy to avoid by keeping it restricted to one post.

		var button = document.createElement('input');
		button.setAttribute('type', 'button');
		button.setAttribute('value', hideText);

DOM methods used:

Here we see the proper way to create an element through the DOM. First we create an element, in this case input, and then we set a few attributes to the values we want. Note that I defined hideText earlier, with the value Hide deleted text.

		button.addEventListener('click',
		function () {
			var e = postEntry.getElementsByTagName('del');
			for ( var i = 0; i<e.length; i++ ) {
				if (e[i].style.display == 'none') {
					e[i].style.display = 'inline';
					this.setAttribute('value', hideText);
				}
				else {
					e[i].style.display = 'none';
					this.setAttribute('value', showText);
				}
			}

DOM methods used:

Here we definitely have one of the more interesting parts of the code. Had I written this script about 8 years ago, I would have used something like var button = '<input type="button" value='+hideText+'>' and consequently added an eventListener like button.onclick = someFunction;, where someFunction would be separately defined. I am using the proper DOM method instead. This may cause problems in IE, for which there are fixes available, but since this blog is strictly personal I decided not to care about that. Notice how I did not define the function separately, but included it as an anonymous function. Since the function is not intended to be used anywhere else, it’s easier, and, ideally, it will be completely removed from memory if the button were to be removed.

The element.style property allows you to access and change style properties on an element. As the MDC says, It is generally better to use the style property than to use elt.setAttribute('style', '...'), since use of the style property will not overwrite other CSS properties that may be specified in the style attribute. I may not be defining any other styles on DEL elements yet, but this way the script won’t break my site if I do add some more style to it in the future, or if someone else wishes to adapt it for use on their own page.

		postEntry.insertBefore(button,postEntry.firstChild);

DOM methods used:

To finish it off, we’ve got the insertBefore construct. It inserts a node as a child of the node to which it is applied, before a specified other child of this parent node. When I first came across it a few years ago, I thought it was somewhat confusing at first. It should be noted that node means much more than element, but in these specific examples it shouldn’t matter, so I didn’t go into it. If you wish to learn more, I recommend you try the MDC or a search engine.

In conclusion, I hope this helped someone out there a bit. I thought it was interesting to reminisce about how I would have written this script if it were 2003.

Comments

IPA Fonts on the Web

Nowadays, the most obvious way to blend all kinds of UTF-8 characters in nicely with all the other text on your page might be Webfonts, but I think there are definitely valid reasons not to utilize those to achieve consistent display of IPA characters on a page. This post will focus on a very simple method which ensures that IPA will look decent across a variety of operating systems and browsers. The issue is nothing but aesthetics; however, the importance should not be underestimated as the following screenshot will demonstrate.

ipa-font-test
You can try the results of this yourself, but what it will look like depends on the fonts you have installed.

What I used to achieve the cohesive look of the IPA characters is this simple line of CSS.

.IPA{ font-family: "DejaVu Sans", "Lucida Grande", "Lucida Sans Unicode" }

It’s an easy concept. Slap class="IPA" on some element—I used SPAN—and it will automatically display in one of these fonts, ensuring that no characters look out of place. DejaVu Sans is a font I like a lot; It comes pre-installed on most Linux installations, and is freely available for everybody else. Lucida Grande is a font with the sufficient characters that comes with Mac OS X, and Lucida Sans Unicode is a font that, as the name implies, is very similar to Lucida Grande. It is available in Windows 98 and up.

References

“DejaVu Sans.” Wikipedia: The Free Encyclopedia. 12 Dec 2009 <http://en.wikipedia.org/w/index.php?title=DejaVu_fonts&oldid=329693253>.
“Lucida Grande.” Wikipedia: The Free Encyclopedia. 12 Dec 2009 <http://en.wikipedia.org/w/index.php?title=Lucida_Grande&oldid=314108882>.
“Lucida Sans Unicode.” Wikipedia: The Free Encyclopedia. 12 Dec 2009 <http://en.wikipedia.org/w/index.php?title=Lucida_Sans_Unicode&oldid=324714228>.

Comments

Older Entries »