Profile
Schneelocke
User: schnee
Name: Schneelocke
Calendar
Back Desember 2014
123456
78910111213
14151617181920
21222324252627
28293031
Lynx
Notes
Ceci n'est pas une note. c.c
Page summary
Schneelocke's journal
Fifty shades of Schnee
schnee
Share

Welcome back my friends
To the show that never ends!
We're so glad you could attend
Come inside, come inside!

— Emerson, Lake & Palmer, Karn Evil 9 (1st Impression, Part II)

Hi there!

If you're reading this, you're probably just looking at my journal, perhaps even thinking about adding me as an LJ-friend; or alternatively, perhaps I just added you as an LJ-friend, and you're curious about me now. In either case, I I'd like to use this opportunity to say a few things.

Trevor: You're skating the edge.
Æon: I
am the edge.

— Æon Flux

First of all, I tend to write freely about topics everything that matters to me; more distanced, "professional" entries may directly be followed by more personal ones (and vice versa), and I will, generally, openly write about all sorts of things, including philosophy, sexuality, politics and more. Some of my entries will be friends-only, others will be publicly viewable, too, and unlike other people, I don't use <lj-cut /> tags or specific "topic filters" (i.e., custom friends groups dedicated to specific topics) to shield people from things they may not want to see.

Well, as long as it's text, that is; I will cut images that aren't safe for work etc. (at least if I remember, which I might not always do!), since I wouldn't want for people to get in trouble if their boss happens to be shoulder-surfing at work. Text, though, is a different issue, and if you'll get into trouble for reading about certain topics at work, you probably shouldn't be checking your friends page at work to begin with.

He said, "I am told that when men hear its voice, it stays in their ears, they cannot be rid of it. It has many different voices: some happy, but others sad. It roars like a baboon, murmurs like a child, drums like the blazing arms of one thousand drummers, rustles like water in a glass, sings like a lover and laments like a priest."

— Mike Oldfield, Amarok (liner notes)

Second of all, concerning friending me: feel free to. There is no need to ask if it's OK to do so; everyone's welcome to, as well as to post comments etc. (as long as they're genuine: spammers etc. will not be tolerated, but that goes without saying, anyway). I may add you back if your journal looks interesting or if I know you, too, but this isn't automatic. If you do want me to add you back, engaging me and talking to me is probably the best way to go about it.

Please don't ask about being added back if I didn't do so on my own, either, unless I already know you well and you want to be able to read my non-public entries.

If I already friended you but you don't know who I am and haven't been in contact with me before, that most likely means I became aware of your journal somehow, took a look, and decided I wanted to keep up with what you're writing — "I find your ideas intriguing and wish to subscribe to your newsletter", as it were. I don't expect you to friend me back or otherwise take an interest in me, but if you do — all the better.

If what it is to be furry you still don't comprehend
Then consider this advice, my curious friend
If you're willing to respect that which you don't understand
Then come take my paw and I'll take your hand.

— from "Furry", by Croc O'Dile of TigerMUCK with help from Tony DeMatio, June 1995

Regarding commenting, BTW, I'm always happy to receive comments. However, things like "lol" are not proper punctuation, and correct spelling and grammar would be nice as well. And of course, I expect people to not be insulting or rude, but that, again, should go without saying.

That's about all I can think of for now. If you have any questions, feel free to ask.

Tags:

schnee
Share
Firefox 34 came out recently. And if you dislike the "Improved Search Bar" with its one-off search engine suggestions that it introduced, then change browser.search.showOneOffButtons to false in about:config, and they'll be gone.

(The whole thing isn't a bad idea as such, and appears to have been smart enough to import some of my bookmarklets as search engines, but I prefer to keep them separate; bookmarklets are what they are, the search field is another thing entirely.)

Tags: ,

schnee
Share

Season 3 of MLP:FiM in a nutshell:


Image: Painbowcrash @ DA
Be sure to view the original size on DA!

Yup, that's exactly how I remember it!

Tags: ,

schnee
Share

New entries for the list of Words That Don't Exist But Should™:

didymogamous /ˈdɪdɪməˌɡəməs/, /ˈdɪdɪmoʊˌɡəməs/ adj
duogamous with partners that are twins.
didymogamy /ˈdɪdɪməˌɡəmi/, /ˈdɪdɪmoʊˌɡəmi/ n
The state of being in a didymogamous relationship.

And just for the sake of completion:

duogamy /ˈdu.oʊˌɡəmi/, /ˈdju.oʊˌɡəmi/ n
The state of being in a duogamous relationship.

Any more?

Tags: , , ,

schnee
Share

Note: click here to view this entry the way it appeared on Nightmare Night.

Nightmare Night

What a fright

Doors are open

Do what's right

Someone's gonna get scared tonight!

(Image credits: gregan811 @ DA, blueysketches @ DA, macgreen @ DA, ziom05 @ DA. Thank you!)

Tags: , , ,

schnee
Share

Some new words for your delight, from the list of Words That Don't Exist But Should™:

duogamous /ˈdu.oʊˌɡəməs/, /ˈdju.oʊˌɡəməs/ adj
Polygamous with two partners.
quarryette /ˌkwɒriˈɛt/ n
A small quarry.
pickpocketeer /ˌpɪkpɒkɪtˈɪɹ/ n
Someone who pickpockets; a pickpocket.

The first one I've seen in use on the Internet; the second one is due to moth_wingthane; and the third one popped into the head of yours truly.

Tags: , , ,

schnee
Share

Good idea: helping a friend redesign his parcel on SL. Bad idea: staying up until past 4am to do so. Bad idea, part 2: the next day, deciding to not set your alarm clock because for some infathmomable reason you think you won't need it. (The result, of course, being that you end up oversleeping by several hours. Not that there was anything I needed to do that I missed, but still.)

Anyhow — here's a picture of how the whole parcel looked after we bulldozed it:


(Click for larger — 1920x1033 PNG, 2891 KiB)

And here's what what (part of) it looks like now that I've put up some new decorations:


(Click for larger — 1920x1033 PNG, 3334 KiB)

Decorations were mostly purchased from Katrina Kristan's OLD WORLD and Nadine Reverie's 3D TREES, BTW. I recommend both stores; their stuff's very nice, although I wish the trees from the latter were copy/mod rather than trans/mod.

As for the rest of the parcel — it's pretty much just trees, undergrowth, forest plants, leaves, ferns, the occasional mushroom, rocks, logs and so on: everything that you'd find in a forest, basically. If you want to see it, come visit. :)

And if you want to see what the parcel looked like before, check out my 365 Days of SL, and pay attention to screenshots from FP Enigma.

Location: FP Enigma (9, 113, 23) (Koyaanisqatsi)

Tags: ,

schnee
Share

🐺 And you thought blink tags were bad. 🐺

Tags: ,

schnee
Share

So, you'd like to use custom fonts in your Livejournal. How do you do that?

Web typography has a long history, but in this day and age, you'll want to use CSS, specifically the CSS3 Fonts module. You'll need two things:

  1. A file containing the font, in a format that browsers can consume: TTF, OTF, WOFF or SVG.
  2. A @font-face declaration somewhere in your journal's stylesheet.

For the first, upload the font file somewhere (make sure it's legal for you to use this way, BTW). Scrapbook unfortunately does not accept font files, so you'll have to use your own hosting.

For the second, edit your journal style's custom CSS to include a declaration along the lines of the following:

@font-face {
  font-family: example;
  src: url(http://example.com/fonts/example.woff) format("woff");
}

You may need a paid/permanent account on LJ for this, BTW; if you cannot include custom CSS in your style this way, you're hosed.

You will now find that your font still isn't working: it's not actually showing up. Why is that? The answer is cross-origin resource sharing (CORS); you'll have to instruct your webserver to include a header indicating that your journal is allowed to make use of this font.

For sites running on Apache, you can add the following to a .htaccess file:

AddType application/x-font-ttf .ttf

<FilesMatch "\.(ttf|otf|woff)$">
<IfModule mod_headers.c>
SetEnvIf Origin "^http(s)?://(example|www\.)?(livejournal\.com)$" origin_is=$0 
Header always set Access-Control-Allow-Origin %{origin_is}e env=origin_is
</IfModule>
</FilesMatch>

(This is partially based on advice found on Stackoverflow, BTW.) You could also unconditionally set the Access-Control-Allow-Origin header to * to allow any site to use these fonts, of course.

Once all this is done and in place, you should be all set: you can now apply fonts to your heart's content, either by including further rules in your custom CSS to style specific elements, or by directly applying the new font, e.g. by writing "<span style="font-face: example">...</span>" or so.

EDIT, 2014-10-31: You may think that you can get around CORS restrictions by using a data URI for your new @font-face's src, BTW, but Livejournal considers those suspect and will not serve any of your custom CSS at all if you include them.

Tags: , , ,

schnee
Share
My Little Pony: Friendship is Magic is four years old as of today: the first episode, Friendship is Magic, Part 1 originally aired on the 10th of October 2010.

Here's to many more years!

Tags: ,

schnee
Share

The 2013 Underhanded C Contest has wrapped up. Be sure to read up on the challenge before checking out the results so you know what it was about; alternatively here's an executive summary:

There were over 40 submissions this last year, which was a lot to judge (especially since some submitters do not provide any hints about their bugs!) It also resulted in a lot of really great hacks, too many to simply list as a few runners up. This summary is considerably longer than in previous years.

As you will remember (click the "THIS YEAR" tab if you don’t,) the object of the 2013 Underhanded C contest was to write a function to compute the DERPCON — Degrees of Edge-Reachable Personal CONnection — between two users in a social network. Essentially the programming task is to find the shortest distance between two users in a friendship graph.

The malicious goal is to write the code so that it mistakenly outputs a low DERPCON value from your account to others, granting you unwarranted access to people who have not "friended" you. Extra points were awarded for asymmetric bugs, meaning that DERPCON(you,me)==1 while DERPCON(me,you)>1; for bugs that can be triggered without insider access to the database; bugs that are relatively platform-independent; bugs that are spiteful or humorous; and of course bugs that are very well hidden, since the name of the game is creating an error that passes visual inspection of source.

It's all worth reading, especially if you're a C programmer (which I'm not). To me personally, this particular bit stood out, BTW:

[...] Mr Leurent’s submission also uses a bad hash that can output INT_MIN with the right username, but this is exploited differently. The hash is as follows:

#define HASHSIZE 151       // 151 is a prime number

…

// FNV hash: http://www.isthe.com/chongo/tech/comp/fnv/index.html
int hash (user *x) {
  int h = x->user_ID;
  for (char *p = x->name; *p; p++) {
    h = 16777619 * (h^*p); // FNV prime
  }

  // Reduce safely in [0..HASHSIZE-1]
  h = abs(h) % HASHSIZE;
  // Extra sanity check
  if (h < 0 || h >= HASHSIZE)
    h = 0;
  return h;
}

Note the use of a legit hash function, at first. But if h comes out as INT_MIN, then taking abs(h)%HASHSIZE results in -2. This is hidden rather well by the extra sanity check to double-ensure that the hash is in range. How does the -2 get past that final sanity check? Because the compiler removes that check as redundant, since h is already an absolute value modulo HASHSIZE. Ha!

This, in a nutshell, is why we'll never have programs without security holes as long as C is around: compiler programmers aren't just allowed to cheat by the spec, they're doing it on purpose, for the sake of performance, so long as they can claim that they stick to the letter of the law even while violating its spirit. And that's where the letter of the law isn't already "you may do whatever you want".

Worse yet, compiler programmers will take mutually incompatible positions at the same time, positions that, while each following the letter of the law when viewed in isolation, are nonetheless inconsistent with each other, thus inevitably leading to disastrous results in the real world.

The above is a great example. abs(INT_MIN) is undefined; apparently it's customary to have it be a negative number. (An absolute value, negative? Just let that sink in for a moment.) Modulo arithmetic preserves the sign, so h in the above code can in fact be negative. Yet in the next step the same compiler programmers that just said "we'll make h be negative, since the C standard allows us to do this" also say, in essence, "it's an absolute value, it cannot possibly be negative", and use that as a justification for removing the check that safeguards against their own shenanigans — all under the guise of "optimization".

And THAT is really why C cannot possibly be made secure. It's not just unspecified behavior; it's the fact that compiler programmers are actively working to make code insecure.

(Note: I'm saying "compiler programmers" rather than "compilers" on purpose, BTW, since I want to make it absolutely clear that these are all intentional choices made by human beings, rather than a program just so happening to act in a certain unfortunate way.)

Tags: , ,

schnee
Share

365 days of SL, just for fun 18:


(Click for larger — 1920x1033 PNG, 2563 KiB)

Well, guess what. While hanging out in the CNDG sims recently, I found a jet ski. And because this here pony likes rough rides, I hopped right on:


1920x1033 PNG, 3005 KiB
800x430 JPEG, 98 KiB

1920x1033 PNG, 1236 KiB
800x430 JPEG, 52 KiB

1920x1033 PNG, 1252 KiB
800x430 JPEG, 33 KiB

1920x1033 PNG, 1218 KiB
800x430 JPEG, 50 KiB

1920x1033 PNG, 1890 KiB
800x430 JPEG, 64 KiB

1920x1033 PNG, 1997 KiB
800x430 JPEG, 76 KiB

1920x1033 PNG, 1743 KiB
800x430 JPEG, 70 KiB

1920x1033 PNG, 2168 KiB
800x430 JPEG, 72 KiB

1920x1033 PNG, 1681 KiB
800x430 JPEG, 61 KiB

1920x1033 PNG, 2386 KiB
800x430 JPEG, 75 KiB

1920x1033 PNG, 2826 KiB
800x430 JPEG, 92 KiB

1920x1033 PNG, 1281 KiB
800x430 JPEG, 49 KiB

1920x1033 PNG, 2317 KiB
800x430 JPEG, 71 KiB

1920x1033 PNG, 2333 KiB
800x430 JPEG, 76 KiB

1920x1033 PNG, 1770 KiB
800x430 JPEG, 66 KiB

1920x1033 PNG, 2208 KiB
800x430 JPEG, 79 KiB

1920x1033 PNG, 1969 KiB
800x430 JPEG, 66 KiB

1920x1033 PNG, 2801 KiB
800x430 JPEG, 102 KiB

1920x1033 PNG, 1567 KiB
800x430 JPEG, 66 KiB

1920x1033 PNG, 1917 KiB
800x430 JPEG, 71 KiB

1920x1033 PNG, 1799 KiB
800x430 JPEG, 63 KiB

1920x1033 PNG, 834 KiB
800x430 JPEG, 36 KiB

As you can probably tell, I had a ton of fun. And it turns out Zero by Smashing Pumpkins is a great soundtrack for jet ski rides:

So save your prayers
For when you're really gonna need 'em
Throw out your cares and fly
WANNA GO FOR A RIDE?

Location: CNDG Business Center (247, 205, 21)

Tags: ,

schnee
Share

Looks like LJ is actually trying to recruit new users again (and not just in Russia and other Eastern-European countries). Here Here is a new video ad they put out recently:

I like this one. Playing up LJ's strengths is a good idea, and it DOES indeed have many strengths, especially compared to other social media sites. So I'm definitely happy to see them getting the word out, and I hope that this'll lead to a increase of users and activity on the site again.

Tags: , ,

schnee
Share

Interesting:

September 21, 2014 Announcement

The NetHack Development Team feels it is necessary to publicly address an issue that has surfaced in the last week.

Recently a NetHack source distribution has appeared, claiming to be NetHack 3.5 or 3.5.0 or 3.4.4.

This claim is partially correct. This is our code. However it was not released by us or with our authorization. This code is not ready for release: it is unfinished, unpolished, and almost certainly very buggy. It has not been play-tested for balance or functionality. It is best considered a partial and unfinished rough draft. We will not be supporting this code, nor will we be releasing binaries or bugfixes for it. It will not be available through our website.

Due to this incident and to prevent confusion, we will not now nor in the future release anything with a version number of 3.4.4, 3.5, or 3.5.0.

We thank those of you who play and develop both NetHack and its many variants for your support and encouragement at this time and over the many years NetHack and its progeny have and continue to evolve.

What amazes me most about this is the implication that the official branch of Nethack is still being developed, and that a new release may still happen (the last one's from 2003).

Mind you, I'm not blaming the DevTeam for the long period of development. I'm not even necessarily blaming them for the closed nature of said development, with no access to prereleases and nightly builds, source repos, bug trackers and more. I am unhappy about the culture of non-communication where there's no mailing lists for interested parties, no IRC channels, no way to get involved or help out, and so on.

That said, though, Nethack is a great game, and I sure hope to see a new official release soon.

Tags: ,

schnee
Share
So, Scotland voted "No" on independence. Not unexpected, and I think most of my (non-Scottish) friends in the UK are breathing a collective sigh of relief now: whatever secession may have meant for Scotland, there was agreement that it could not have boded well for the rest of the union, especially those parts that aren't London.

At 44.7% "Yes" vs. 55.3% "No", the outcome was less close than I thought it might be, too, but despite that and despite it being against independence, I think it's anything but a reaffirmation of the status quo. If almost half the people in part of your nation think that they'd be better off seceding, you'd better ask yourself why.

What really surprised me the most was the voter turnout. 84.59% seems high at first glance, but think about what it really means — roughly one in 6-7 voters didn't care about independence of their own country enough to be assed to go and make a mark. I cannot understand how anyone could fail to vote in such a historic referendum.

Tags: ,

schnee
Share
Well, that didn't take so long; I actually finished the Journal of the Two Sisters today, so I might as well write about it.

Unlike The Elements of Harmony, which it shares its overall design with, this is an in-universe book, written from an in-universe perspective. You won't find anything about the show here; you'll find material from the show, presented in written form. In fact, the book itself is intended to be a real-life edition of the journal that Luna and Celestia kept on the show and that the Mane Six continued writing in throughout S4.

All that I knew, and expected, and indeed looked forward to.

Truth to be told, though, the book's not as good as I'd hoped. It's not a bad book, certainly not, but it's very clearly aimed at children, and this affects both its content and style. The first half of the book, the part written from Celestia's and Luna's perspective, is where this is the most prominent. The sisters are younger and understandably less experienced; yet by their own admission they're also still older than most non-alicorns, so I was dismayed that they often sounded like modern-day teenagers rather than Equestrian princesses. And the adventures they embarked on and the issues they faced lack the depth that has made the show so refreshing; doubly annoying given that already MLP:FiM has already proven that "for children" does not have to mean this.

This isn't to say this part was all bad; there were some interesting origin stories, including the creation of the castle in the Everfree, the first time ponies meet zebras, and more. Star Swirl figured prominently as Celestia's and Luna's tutor as well.

The second half of the book, where the Mane Six write about their own adventures, is a bit better — I chalked this up to it having the show itself to prop it up, the episodes of S4 dictating (in rough terms) what they'd be writing about, and the ponies' characters already having been firmly established. That said, it still didn't quite reach the quality of the show itself.

And that's surprising, really, given that the book is actually written by Amy Keating Rogers, who's also a writer on the show and has quite a few episodes under her proverbial belt, from S1E3 to S4E21. I can only imagine that the higher-ups at Hasbro wanted to have a "childish" book, but why? The huge success that MLP:FiM has seen is due to it not just appealing to kids, after all. And would the kids have minded if the book was a little more like the series it's based on? I don't think so.

Either way, if you've not got this book yet... I'm not recommending against it, but I'm also not recommending for it. Again, it's not a bad book, but neither is it a must-have.

Tags: , ,

schnee
Share
Quick heads-up: the EF 20 schedule is finally online.

Tags:

schnee
Share

From the list of Words That Don't Exist But Should™:

bien·a·pro·pos /ˌbjɛ̃.æp.ɹəˈpoʊ/ adv
Appropriate, fit, suitable.

There's malapropos, after all, so why not bienapropos as well?

Also, two more, because why not:

alpacino /ˌælpəˈtʃiːnoʊ/ or /ˌælpæˈtʃiːnoʊ/ n
A male baby alpaca.
alpacina /ˌælpəˈtʃiːnə/ or /ˌælpæˈtʃiːnə/ n
A female baby alpaca.

In reality, a baby alpaca is actually called a cria, regardless of sex. (Hat tip to huskyteer!)

Tags: , , , ,

schnee
Share

According to Wikipedia, taikyoku shogi is the largest (known) variant of shogi, the game sometimes called Japanese chess; it is played on a 36x36 board, with each player initially possessing 402 pieces of 209 types that can move in a total of 253 distinct ways.

Pieces can be promoted in this game, and when looking at the table that Wikipedia helpfully provides, I noticed that there are chains of promotions — conceptually, if not in the game itself (a piece can only be promoted once, naturally, just like in chess or checkers).

Nonetheless, my curiosity was piqued. What does the promotion graph look like?

I ended up copying and pasting the table from Wikipedia into a text file (from the rendered article, not its source!), and turned it into a DOT file with a short Perl script:

#!/usr/bin/perl

use strict;
use warnings;
use feature qw/say/;

say "digraph taikyokushogi {";

while(<>) {
    chomp;

    my @F = split/\t/, lc;
    $F[0] =~ s/^\*//;

    $F[$_] = join " ", map { ucfirst } split " ", $F[$_] for(0,3);

    say qq/    "$F[0]"/, ($F[3] ne "—") ? qq/ -> "$F[3]"/ : "";
}

say "}";

After manually fixing the two Mountain Eagles and Howling Dogs that Wikipedia unhelpfully combined into one in the table, I then fed the resulting file to Graphviz (specifically dot) to get a rendered graph:

$ perl taikyokushogi.pl taikyokushogi.txt >taikyokushogi.dot
$ joe taikyokushogi.dot
$ dot -Tpng taikyokushogi.dot -o taikyokushogi.png
$ 

It's fairly disconnected, as expected, but there's a few slightly larger components; here's a particularly neat one:

The largest "promotion chain" is that of the Pawn, BTW, whose hypothetical career path'd take him from Gold General to Rook to Dragon King to Soaring Eagle and finally Great Eagle. (Again, keep in mind that this cannot happen in the game.)

The full graph is available here (27630x539 PNG, 433 KiB), if you're curious. Other Graphviz engines (e.g. neato) will produce different files, but I thought dot's looked the best. All files can be found here.

The whole thing's just a bit of fun, of course. But I gotta say, it's nice to have tools available to do this sort of thing — and to know how to wield them.

Tags: , , ,

schnee
Share

Fun with Perl: enumerating error messages:

#!/usr/bin/perl

use strict;
use warnings;

for(0..65535) {
    eval { die $! = $_ };
    next if $@ =~ m/(?:^$_|Unknown Error)/;
    $@ =~ s/ at $0 line \d+\.//;
    print "$_: $@"
}

On e.g. Cygwin this produces:

Cut for lengthCollapse )

It'd be interesting to do this for a bunch of OSes and compare the results.

Tags: , ,

schnee
Share

More fun with wordlists[1] and vowels. My friend – the same who'd previously given me ideas – wondered about words with a high (absolute) number of occurrences of the same vowel, even in the presence of others; words like "indivisibility", he said. Well, let's look into that:

#!/usr/bin/perl

use strict;
use warnings;
use feature qw/say/;
use List::Util qw/max sum/;

my %words = ();

while(<>) {
    chomp;
    my %vcount = ();

    foreach my $vowel ("a", "e", "i", "o", "u", "y") {
        $vcount{$vowel} =()= m/($vowel)/g;
    };

    my $bestvowel_count  = max map { $vcount{$_} } keys %vcount;
    my $totalvowel_count = sum map { $vcount{$_} } keys %vcount;
    my @bestvowels = grep { $vcount{$_} == $bestvowel_count } keys %vcount;

    $words{$_} = {
        'bestvowel_count' => $bestvowel_count,
        'bestvowels_count' => $bestvowel_count * scalar @bestvowels,
        'totalvowel_count' => $totalvowel_count,
        'bestvowels' => \@bestvowels,
    }
}

foreach my $difference (0..8) {
    my @candidates =
        sort { $words{$b}->{'bestvowel_count'} <=> $words{$a}->{'bestvowel_count'} }
        grep { ($words{$_}->{'totalvowel_count'} - $words{$_}->{'bestvowel_count'}) == $difference }
        keys %words;

    my $bestvowel_count = $words{$candidates[0]}->{'bestvowel_count'};
    my @hits = grep { $words{$_}->{'bestvowel_count'} == $bestvowel_count } @candidates;

    say "$difference: best vowel count=", $bestvowel_count;
    say "$difference: (", scalar @hits, ") ",
        (@hits < 15)
        ? join ", ", @hits
        : ""
    ;

    if(@hits >= 15) {
        my $length = 0;
        my @prevhits;
        while(@hits != 0) {
            $length++;
            @prevhits = @hits;
            @hits = grep { length >= $length } @hits;
        }

        say "$difference (min=", ($length - 1), "): (", scalar @prevhits, ") ",
            (@prevhits < 15)
            ? join ", ", @prevhits
            : ""
        ;
    }
}

This script took a bit more effort than the previous ones, but the results were enlightening. Here they are (linebreaks were added manually for readability):

0: best vowel count=5
0: (11) beekeepers, reemergence, freewheelers, defenselessness, libidinizing, 
        effervescence, enfeeblements, beekeeper, enfeeblement, abracadabra, representee
1: best vowel count=6
1: (2) indivisibility, divisibilities
2: best vowel count=5
2: (21)
2 (min=16): (4) photocomposition, antimilitaristic, distensibilities, indiscrimination
3: best vowel count=5
3: (22)
3 (min=20): (1) overapprehensiveness
4: best vowel count=5
4: (8) individualization, antiinstitutionalist, inconceivabilities, antiparliamentarians, 
       antiinstitutionalists, antiparliamentarian, radiosensitivities, anitinstitutionalism
5: best vowel count=5
5: (3) institutionalization, microminiaturization, microminiaturizations
6: best vowel count=5
6: (1) antidisestablishmentarianism
7: best vowel count=3
7: (3) counterrevolutionary, antirevolutionaries, neurophysiologically
8: best vowel count=3
8: (1) counterrevolutionaries

A difference (i.e. "extra vowel" count) of zero yields the same words that were already found in the first of these posts: words with only one vowel, such as "effervescence" or "libidinizing". The rest are new, though there's several words there we've already encountered in other contexts, often due to their length (and keep in mind that this script is biased towards longer words).

The overall best word is "indivisibility" (as predicted), but intriguingly, there's also "divisibilities". For higher differences, the count goes down as there aren't many words with at least that many vowels overall (a smaller pool to choose from). At the top end (or bottom end, depending on how you look at it), "counterrevolutionaries" has many vowels that are very evenly spread.

Said friend also wondered about one more thing: what is the longest string of consecutive vowels in any word on this list? We'll whip up a script to find out:

#!/usr/bin/perl

use strict;
use warnings;
use feature qw/say/;
use List::Util qw/max/;

my %words = ();

while(<>) {
    chomp;

    my @vowelclusters = sort { length($b) <=> length($a) } m/([aeiouy]+)/g;
    my $longest = length $vowelclusters[0] // 0;
    my @longestclusters = grep { length($_) == $longest } @vowelclusters;

    $words{$_} = {
        'length' => $longest,
        'clusters' => \@longestclusters,
    }
}

my $longest = max map { $words{$_}->{'length'} } keys %words;
foreach (sort { $a cmp $b } grep { $words{$_}->{'length'} == $longest } keys %words) {
    say "$_: ", join ", ", @{ $words{$_}->{'clusters'} };
}

It turns out that the best you can do is five vowels in a row; the list has six words managing that feat. Want to guess? Here's the solutions: click to reveal!Collapse ). The last one is perhaps debatable; I'm not sure if the first "u" should be counted as a vowel.

And if you're wondering what half of these mean... spoilers, naturally!Collapse )

Two more words I could think that would also qualify: "phooeying" and "phooeyed", if they existed. Since "tsktsking" is on the list, I'd argue that these are perfectly cromulent as well.

Finally, if want to play around with this stuff yourself, I've put up all the code and data from these posts for your convenience. If you'd like me to do more "research", let me know; otherwise this will likely have been the last of these posts for now.

Thank you, and good night!

  1. As usual, I found some more typos on the list as well: "mechanotheraputically" and "livlihood".

Tags: , , , ,

schnee
Share

With vowel patterns having been looked at in the previous two posts, I decided to turn my attention to the vowel-to-letter ratios of words. A new script was quickly produced:

#!/usr/bin/perl

use strict;
use warnings;
use feature qw/say/;

#my %freq = ();
my %ratios = ();

while(<>) {
    chomp;
    (my $vowels = $_) =~ s/[^aeiouy]//g;

    my $ratio = (length $vowels) / (length $_);
    push @{ $ratios{$ratio} }, {
        "word" => $_,
        "vowels" => $vowels,
        "length" => length $_,
        "vlength" => length $vowels,
    };
}

foreach (sort keys %ratios) {
    my @candidates = map { $_->{'word'} } @{ $ratios{$_} };
    say "$_: (", scalar @candidates, ")";

    my $length = 0;
    my @prevcandidates;
    while(@candidates != 0) {
        $length++;
        @prevcandidates = @candidates;
        @candidates = grep { length >= $length } @candidates;
    }

    say "$_ (min=", ($length - 1), "): (", scalar @prevcandidates, ") ",
        (@prevcandidates < 15)
        ? join ", ", @prevcandidates
        : ""
    ;
}

This provided some interesting insights. All in all, there were 66 different vowel-to-letter ratios (in this wordlist[1]); disregarding several all-consonant abbreviations, the lowest vowel-to-letter ratio is 1/9, and there are two words with that ratio. Wanna guess? They both contain nine letters and one vowel: click for the solution!Collapse ).

Many other ratios contain far too many words to list, so I limited the script's output to the longest ones in each class. There are precisely two words with twelve letters and two vowels, click to reveal!Collapse ); two words with fourteen letters and three vowels, click to reveal!Collapse ); and two with twenty-three letters and nine vowels, click to reveal!Collapse ). The latter appears again in slightly altered form if you go back to twenty-two letters and nine vowels, but there's a second word with the same stats, too, a new one: click to reveal both!Collapse ).

And sometimes, there's just a single hit: for instance, the script found precisely one word with nineteen letters and ten vowels, click to reveal!Collapse ), and one with fifteen letters and nine vowels, click to reveal!Collapse ).

My friend who's been providing ideas for further probing then inquired about the longest word in English with the fewest vowels. If you allow no vowels at all, the best hit is a five-letter abbreviation, click to reveal!Collapse ). Otherwise, we'll have to cook up a new script to look into the matter:

#!/usr/bin/perl

use strict;
use warnings;
use feature qw/say/;

my %lengths = ();

while(<>) {
    chomp;
    (my $vowels = $_) =~ s/[^aeiouy]//g;

    my $ratio = (length $vowels) / (length $_);
    push @{ $lengths{length $_} }, {
        "word" => $_,
        "vowels" => $vowels,
        "vlength" => length $vowels,
        "ratio" => $ratio,
    };
}

my @lengths = sort { $a <=> $b } keys %lengths;
foreach(@lengths) {
    my @sorted = sort { $a->{'ratio'} <=> $b->{'ratio'} } @{ $lengths{$_} };
    my $bestratio = $sorted[0]->{'ratio'};
    my @hits = map { $_->{'word'} } grep { $_->{'ratio'} == $bestratio } @{ $lengths{$_} };

    say "$_: best ratio=$bestratio, vowels=", $sorted[0]->{'vlength'};
    say "$_: (", scalar @hits, ") ",
        (@hits < 15)
        ? join ", ", @hits
        : ""
    ;
}

There is no single answer here, as the number of vowels will go up as the words' lengths go up; it's a judgement call whether you consider a longer word with more vowels a better hit or not. As such, I think it's justified to post the script's full output (no guessing games, sorry; also, note that some linebreaks have been added manually to improve readability):

1: best ratio=1, vowels=1
1: (1) a
2: best ratio=0, vowels=0
2: (58)
3: best ratio=0, vowels=0
3: (47)
4: best ratio=0, vowels=0
4: (12) bdrm, bldg, blvd, cmdg, ctrl, dbms, kwhr, mktg, psst, rcpt, tbsp, tnpk
5: best ratio=0, vowels=0
5: (1) hdqrs
6: best ratio=0.166666666666667, vowels=1
6: (573)
7: best ratio=0.142857142857143, vowels=1
7: (71)
8: best ratio=0.125, vowels=1
8: (12) borschts, pschents, schlepps, schlocks, schmaltz, schmucks, schnapps, 
        schticks, sprights, strength, tsktsked, twelfths
9: best ratio=0.111111111111111, vowels=1
9: (2) strengths, tsktsking
10: best ratio=0.2, vowels=2
10: (217)
11: best ratio=0.181818181818182, vowels=2
11: (33)
12: best ratio=0.166666666666667, vowels=2
12: (2) latchstrings, spendthrifts
13: best ratio=0.230769230769231, vowels=3
13: (47)
14: best ratio=0.214285714285714, vowels=3
14: (2) forthrightness, thriftlessness
15: best ratio=0.266666666666667, vowels=4
15: (21)
16: best ratio=0.25, vowels=4
16: (2) shortsightedness, spendthriftiness
17: best ratio=0.294117647058824, vowels=5
17: (10) anthropomorphisms, crystallographers, disfranchisements, misunderstandings, 
         postconvalescents, prepossessingness, straightforwardly, transcendentalism, 
         transcendentalist, transcendentalizm
18: best ratio=0.277777777777778, vowels=5
18: (1) transcendentalists
19: best ratio=0.263157894736842, vowels=5
19: (1) straightforwardness
20: best ratio=0.35, vowels=7
20: (1) incomprehensibleness
21: best ratio=0.380952380952381, vowels=8
21: (3) antienvironmentalists, electroencephalograms, electroencephalograph
22: best ratio=0.363636363636364, vowels=8
22: (1) electroencephalographs
23: best ratio=0.391304347826087, vowels=9
23: (2) disestablismentarianism, electroencephalographic
25: best ratio=0.4, vowels=10
25: (1) antidisestablishmentarian
28: best ratio=0.392857142857143, vowels=11
28: (1) antidisestablishmentarianism

An interesting observation, BTW: with the exception of length one and one vowel, the number of vowels is decreasing monotonically as word length goes down.

With the above script in place, it's only natural to ask about the highest vowel-to-letter ratios as well. This only requires changing a single line:

...
    my @sorted = sort { $b->{'ratio'} <=> $a->{'ratio'} } @{ $lengths{$_} };
...

Again, I'll just share the full results (as before, some linebreaks were added manually for the sake of readability):

1: best ratio=1, vowels=1
1: (1) a
2: best ratio=1, vowels=2
2: (5) ai, ay, ie, ii, ye
3: best ratio=1, vowels=3
3: (9) aye, eau, eye, iii, iou, oui, yay, yea, you
4: best ratio=1, vowels=4
4: (1) ieee
5: best ratio=0.8, vowels=4
5: (26)
6: best ratio=0.666666666666667, vowels=4
6: (277)
7: best ratio=0.714285714285714, vowels=5
7: (33)
8: best ratio=0.75, vowels=6
8: (2) aureolae, eyepiece
9: best ratio=0.666666666666667, vowels=6
9: (17)
10: best ratio=0.6, vowels=6
10: (118)
11: best ratio=0.636363636363636, vowels=7
11: (8) aerobiology, audaciously, audiologies, audiovisual, auxiliaries, beauteously, 
        bourgeoisie, louisianian
12: best ratio=0.666666666666667, vowels=8
12: (1) onomatopoeia
13: best ratio=0.538461538461538, vowels=7
13: (202)
14: best ratio=0.571428571428571, vowels=8
14: (24)
15: best ratio=0.6, vowels=9
15: (1) autoinoculation
16: best ratio=0.5625, vowels=9
16: (7) autoimmunization, autointoxication, automanipulation, automanipulative, 
        editorialization, onomatopoeically, sociosexualities
17: best ratio=0.529411764705882, vowels=9
17: (6) antirevolutionary, bureaucratization, editorializations, individualization, 
        onomatopoetically, semiautomatically
18: best ratio=0.5, vowels=9
18: (9) autobiographically, inconceivabilities, influenceabilities, neurophysiological, 
        nonauthoritatively, overgeneralization, overspecialization, radiosensitivities, 
        subminiaturization
19: best ratio=0.526315789473684, vowels=10
19: (1) antirevolutionaries
20: best ratio=0.5, vowels=10
20: (5) counterrevolutionary, institutionalization, internationalization, 
        microminiaturization, neurophysiologically
21: best ratio=0.476190476190476, vowels=10
21: (2) internationalizations, microminiaturizations
22: best ratio=0.5, vowels=11
22: (1) counterrevolutionaries
23: best ratio=0.391304347826087, vowels=9
23: (2) disestablismentarianism, electroencephalographic
25: best ratio=0.4, vowels=10
25: (1) antidisestablishmentarian
28: best ratio=0.392857142857143, vowels=11
28: (1) antidisestablishmentarianism

The result for length 28, 25, 23 are the same as before; there's very few English words that long. The number of vowels is not decreasing monotonically with word length this time; there's two "humps", from 23/9 to 22/11 and from 13/7 to 12/8.

Outside of that, some beautiful vowel-heavy words words are found: "aureolae", "eyepiece" and "onomatopoeia". And I also couldn't help but think that "Audaciously Louisianian" would be a good title for someone's autobiography. :)

  1. BTW, I also spotted two further errors int he word list: "unpredictabilness", "transcendentalizm". I wouldn't be surprised if there's more still.

Tags: , , , ,

schnee
Share

Let's have some more fun with computational linguistics. A friend mentioned the "oioioi" vowel pattern; there's no words matching that, but why not generalize to arbitrary vowels, and repeats for that matter?

foreach my $repeat (1..5) {
    foreach my $vowel1 ("a", "e", "i", "o", "u", "y") {
        foreach my $vowel2 ("a", "e", "i", "o", "u", "y") {
            next if $vowel1 eq $vowel2;

            my $pattern = ($vowel1 . $vowel2) x $repeat;
            foreach (grep { $_ =~ m/^$pattern$/ } keys %freq) {
                say "$_: ", $freq{$_}->{'count'};
                say "$_: ", join ", ", @{ $freq{$_}->{'words'} } if $freq{$_}->{'count'} < 15;
            }
        }
    }
}

There are no words matching patterns with a repeat of four or five, but for two repeats, we get rich results. "ieie" (233 words) is the most common one, followed by "aeae" (217) and "aiai" (111); the least common one that exists at all, meanwhile, is "uaua", with just a single word to its credit, click to reveal!Collapse ).

For three repeats, there's fewer hits: two for "aiaiai", three for "ieieie", and, amazingly enough, one for "oeoeoe". Want to take a guess? Go on, I'll wait; when you're done, be sure to check the solutions: click to reveal!Collapse ).

Those vowel patterns look unbalanced, though, so let's add an extra copy of the first vowel at the end: same code as above, but the pattern's constructed this way:

            my $pattern = (($vowel1 . $vowel2) x $repeat) . $vowel1;

This finds several vowel patterns of length 5, among them an interesting "mirrored" pair with one hit each, "eoeoe" and "oeoeoe"; the words are "eoeoe"Collapse ) and "oeoeo"Collapse ). The word that started it all, "mystifyingly", is also duly identified.

But wait, there's more! The script also finds two "aeaea", click to reveal!Collapse ), twelve "aiaia", click to reveal!Collapse ), three "eueue", click to reveal!Collapse ), eight "iaiai", click to reveal!Collapse ), two "ieiei", click to reveal!Collapse ), one "ioioi", click to reveal!Collapse ), and two "oaoao", click to reveal!Collapse ). Finally, there's 35 "eaeae" and 16 "eieie" — too numerous to list, but armed with wordlist and script, you can easily find them yourself. Whew!

What about patterns where one vowel is repeated several times, sandwiched between one copy each of a different vowel?

foreach my $repeat (1..9) {
...
            my $pattern = $vowel1 . ($vowel2 x $repeat) . $vowel1;

Turns out that the longest such occuring pattern is "eiiiie", with a whooping seven hits: click to reveal!Collapse ).

The opposite also works, of course: what about patterns where a single copy of one vowel is sandwiched between chains of the same repeating vowel?

            my $pattern = ($vowel1 x $repeat) . $vowel2 . ($vowel1 x $repeat);

This time, the largest repeat for which there are hits is two, but there's several beautiful ones, such as "anathemata", "malayalam" (a palindrome, to boot!) and "whencesoever". You can even construct book titles this way: I'm sure that "The Bereavement of the Senegalese Benefactresses" would find both critical and popular acclaim, and its sequel, "The Reenlargement of the Delegatee's Desperateness" would no doubt be a bestseller as well.

The same friend to whom "oioioi" was due also suggested investigating vowel patterns of the form "123123". As easily done as said:

foreach my $vowel1 ("a", "e", "i", "o", "u", "y") {
    foreach my $vowel2 ("a", "e", "i", "o", "u", "y") {
        foreach my $vowel3 ("a", "e", "i", "o", "u", "y") {
            next if $vowel1 eq $vowel2;
            next if $vowel2 eq $vowel3;
            next if $vowel3 eq $vowel1;

            foreach (grep { $_ =~ m/^$vowel1$vowel2$vowel3$vowel1$vowel2$vowel3$/ } keys %freq) {
                say "$_: ", $freq{$_}->{'count'};
                say "$_: ", join ", ", @{ $freq{$_}->{'words'} } if $freq{$_}->{'count'} < 15;
            }
        }
    }
}

There are surprisingly many patterns of this form that have hits, although it's almost invariably just one, maybe two words. This time, an article in a medical journal suggests itself: "The Bounteousness of Inappreciable Tonsillectomies: a Critical Review of Clinical Practice". Coming soon to a Lancet near you!

Patterns of the form "123321" are a natural next step. But instead of The Lancet, this time you get the Medical Enquirer: "Newsflash! Doctors return to age-old cure! Cardiological Immunoglobulin Rehabilitated! Also in this issue: Exhilarative Retinoscopies! Unpropitious Nonintervention!"

In the same vein, what about patterns of the form "1234321"? There's just two, "auioiua" (two hits) and uoieiou (one hit). Guess if you'd like; here's the solutions: "auioiua"Collapse ); "uoieiou"Collapse ). Adding yet another vowel and looking for "123454321" patterns produces no results, though, alas, and neither are there any hits for "12341234".

Got any interesting ideas for what to look for? Share 'em and I'll be happy to investigate!

Tags: , , , ,

schnee
Share

A few days ago, I came across the word "mystifyingly", and couldn't help but notice how unusual its vowels were: a total of five, alternating between "y" and "i", with no others present.

I wondered if there were any others with the same vowel pattern (as I'd like to call it), so when I remembered again tonight, I grabbed a wordlist[1], slapped together a quick Perl script and checked[2]. The result? Nope, "mystifyingly" is the only one.

#!/usr/bin/perl

use strict;
use warnings;
use feature qw/say/;

my %freq = ();

while(<>) {
    chomp;
    (my $vowels = $_) =~ s/[^aeiouy]//g;
    $freq{$vowels}->{'count'}++;
    push @{ $freq{$vowels}->{'words'} }, $_;
}

say join ", ", @{ $freq{'yiyiy'}->{'words'} };

But of course the fun doesn't stop there. Want to know the least/most common vowel patterns?

my $min_length = 1;
foreach (sort { $freq{$a}->{'count'} <=> $freq{$b}->{'count'} } grep { length($_) >= $min_length} keys %freq) {
    say "$_: ", $freq{$_}->{'count'};
}

It turns out that the most common vowel pattern is "ae" (3313 hits), followed by "ie" (2710), "oe" (2044) and "ue" (1714). Interestingly, "ai" is ever so slightly more common than "ee" (1608 vs. 1602); the most common three-vowel pattern is "aie" (1572), while the most common four-vowel pattern is "eaie" (477). For five, it's "eiaio" (80), and after that you get "eaiaio" (45), "eaiiaio" (12), "eeoeeaoa" (4)", "aiiiuioai" (3), "ioiiauiaio" (2), and finally "aiieaieaiai" and "oueeouioaie" (1 each).

Do you want to guess what those last two words are? One is (comparatively) easy to guess, the other's more difficult.

Gave it some thought? Cool! The easy one is click to revealCollapse ), of course, an old pal as far as quirky words are concerned. The other one turns out to be click to revealCollapse ) — that's a new one!

There's many other unique vowel patterns, of course, not just "yiyiy" or "oueeouioaie". What's the shortest one? We'll find out:

foreach (sort { length($b) <=> length($a) } grep { $freq{$_}->{'count'} == 1 } keys %freq) {
    say "$_: ", join ", ", @{ $freq{$_}->{'words'} };
}

Turns out that there's three patterns of three vowels that are only found in one word each: "uyu", "eyy" and "yyy". Additionally, there's a false hit ("yuo") where the "y" represents a consonant sound. Want to guess what these are? Here are the answers: "yuo" (the false hit) is click to revealCollapse ); "uyu" is click to revealCollapse ), "eyy" is click to revealCollapse ), and "yyy" is click to revealCollapse ). Whew, that last one was tough!

Interestingly, the latter two are also the two shortest English words (in this wordlist!) having a unique vowel pattern.

And "yyy" is curious in another way as well, since it only contains one distinct vowel. Let's generate all patterns of that sort and see how many words matching each there are:

foreach my $num (1..5) {
    foreach (grep { $_ =~ m/^(?:a{$num}|e{$num}|i{$num}|o{$num}|u{$num}|y{$num})$/ } keys %freq) {
        say "$_: ", $freq{$_}->{'count'};
        say "$_: ", join ", ", @{ $freq{$_}->{'words'} } if $freq{$_}->{'count'} < 15;
    }
}

This reveals that, among other things, there are 12 words on this list with a "yy" vowel pattern, and 11 with a "uuu" pattern; what's more, there are two with a "uuuu" pattern, one "aaaaa", nine "eeeee", and, amazingly, one "iiiii". Want to play the guessing game again?

Here's the solutions: 12 "yy"Collapse ); 11 "uuu"Collapse ); 2 "uuuu"Collapse ); 1 "aaaaa"Collapse ), 9 "eeeee"Collapse ); 1 "iiiii"Collapse ).

Isn't that fascinating?

Finally, it turns out that there are two English words (again, on this list!) that have all the vowels in order, each precisely once ("aeiouy"). One of these two words is guessable; the other — well, I'd not bet on it, but if you want to try anyway, be my guest. Or just check the solutions: the easier oneCollapse ), and the fiendish oneCollapse ).

Alas, there are no word that have all the vowels backwards ("yuoiea"), though there is one word with a "uoiea" pattern: all the vowels backwards, each precisely once, except for "y". Want to guess again? It's this oneCollapse ). If you have any other ideas for interesting patterns to look for, let me know.

Thank you, and good night!

  1. Note that this is a file with DOS line endings, so you should probably run it through dos2unix(1) or so first. Note also that the word "gland" appears to have an extra trailing carriage return. And note finally that the list is, of course, incomplete: to give just two example, the words "freewheeler" and "coriolis" are missing (even though the former's plural is on the list).
  2. Take the script's output with a grain of salt, of course: it treats "y" as a vowel unconditionally, which is not always the correct approach.

Tags: , , , ,

schnee
Share

365 days of SL, just for fun 23 — SL11B part 6:


(Click for larger — 1920x1033 PNG, 2960 KiB)


(Click for larger — 1920x1033 PNG, 2313 KiB)


(Click for larger — 1920x1033 PNG, 2522 KiB)


(Click for larger — 1920x1033 PNG, 1821 KiB)


(Click for larger — 1920x1033 PNG, 1776 KiB)


(Click for larger — 1920x1033 PNG, 1407 KiB)

And this, I'm afraid, is the end of my SL11B pictures. (I do have a bunch more screenshots I might be persuaded to upload en bloc in case anyone's really interested.) Hope you enjoyed them, and see y'all at SL12B next year!

(And remind me to actually finish posting my SL10B screenshots some time, too. :P)

Tags: