Applied Mnemonics

Crash Course: Sequential Mnemonics

There are plenty of books at your wonderful and kind and pretty public library on the subject, even so, I know how hard it is to walk in there without the promise of cold drinks and hot chicks and there's that guy that smells bad and talks to himself and we can't play pool and act like it's The Real World, all mackin' on the dope phatness n stuff... But I digress.

AND SO... I'm going to go ahead and act like I can get any sort of concept across by trying to explain two techniques that are used for memorizing things. These leet skillz just happen to also have the benefit of helping you keep things in tidy sequential order, which just happens to be important for using the system Mnemisis uses. Happinen.

Loci, Locus, Loqui

For the historians among you, it's how the Greeks remembered their speeches.

What you'll need: a location[4] that you know not unlike the back of your hand/other reasonably memorable appendage.

  1. Pull the first item from the list, and begin your visualization of same. By same I mean the item. That we were just talking about. Just now.

  2. Put it in the start point. If you were, for instance, remembering getting up in the morning (and you have a fairly stable routine). You might remember the first object in bed with you. That's right. Let the kinky mnemonics ride!

  3. As you move through your mental landscape (now you see why linearity is important here), place objects that represent what you're trying to remember in the room/hall/closet/bed/way. Back to the example - if you brush your teeth in the morning (and you know you should, if you don't), you could put the next object next to your toothbrush, perhaps. Or in the hallway on the way to the toothbrush. Or in the general direction of A toothbrush. Do you ever brush your teeth? What is that - a whole cigarette butt in there?

  4. Repeat as necessary. Also: Floss.

Crash Course: Creativity for the impovrished

You're probably also wondering what the stink to do with Mnemisis, or what can be done with it, to maybe justify it to yourself.

If you're here for justifying, uhh... You are probably very very lost and should report to a station attendant for directions. I'm not sure why you're here. This is a little off the beaten path, hombre. Let's not even get into: it doesn't[5] run on XP™.

Not that we don't take kindly to strangers, but Mnemisis does take some (not dissatisfactory) effort.

Also-to-note: I've read some pretty wacky stuff involving the major system... If you love baroque mental constructs - DELVE! Just about every other supre-pronto-gigans-memory book is just the major system (possibly as an adjunct to some other methods) and ways to use it.

Crash Course: How to breed a Phoneme_Table file[8]

Before we begin:

  1. The GA will run until a done.file appears in the directory, SO, because you need to create that file, you'll need either:

    1. Another terminal window open.

    2. A sane shell. Defined as: "with job control"

  2. It may take a bit to shut down once you've created the file:

    1. Please be patient.

    2. (I was just having too much fun with sub-points to stop here. DocBook is just a <blink>candy store</blink> of tags. ... Damn!)

Ok, assuming bash, here you go:

Grimes@Sector7G mnemisis$ make lab
(blah blah blah compiling as necessary blah)
Making lab...
Grimes@Sector7G mnemisis/lab$ ./ forever
Breeding begun @ 16:39:12
[1]+  Stopped                 ./ forever
Grimes@Sector7G mnemisis/lab$ touch done.file
Grimes@Sector7G mnemisis/lab$ fg
./ forever
617947G.gene : 476.991  /  44.0966%
496391G.gene : 466.459  /  42.8444%
662657B.gene : 465.559  /  42.8444%
375758G.gene : 432.005  /  40.6082%
(and so on -- hopefully with a little better scores when you try it...)

That's all there is to it. Once you see the scores, the breeding is complete and all the Phoneme tables that have been bred are saved in your lab directory.

Things you should know exist:

The vectorlist file (Lucky us! Another excuse for a screen section)

The length command

Grimes@Sector7G mnemisis$ ./ x
Going auto...
By the power of greyskull, I have the /usr/share/dict/words!
(really insanely long wait)[9]
Your bundle is 'bundle.words'
Have a nice mnemonic!
Grimes@Sector7G mnemisis$ ./ length
<< 1014 / dissatisfactory
<< 1062 / dissatisfaction
>> 1072041275 / disconcertingly
>> 1099213210 / disappointments

length is a microstroke... Forgive me while I digress[10], but I was educating myself on Baysian filters when something must have sunk in... and I thought: "How might statistics help me out?" - or - "What, besides sounding out each translation, points me in the direction of a wrong answer?" - and - "Where did I put that pesky sandwich? Mmm... Fresh Pesky."

"Well!" I screamed to myself, scaring the cat - "I look for translations that are longer or shorter than they should be, for one! I should turn the music down! The music inside my head! Which makes me do things! Things which they must never find out about!" It was a glimmering moment of insight, until I remembered that I had left my sandwich on the wood stove, at which point it turned to a feeling that I cannot describe.

Of course, Baysian filtering would be overkill here, and also I really don't want to look like an ass that puts any old buzzword into his programs. So I did a little graphing...and it looks like there is a bit of a relation[11] between the number of characters going into a hand-checked translation table and the number of characters that should come out. That is, words with three letters, when translated correctly, usually have a translation of zero to three digits.[12]

So, back to the task at hand: interpreting the output of length. Right.

What you're seeing is a SNIP of a much longer ream of information. First on each line is the greater/less than, which indicates which side of the normal the translation has fallen off of, and then some information on who and what, which should be self-explanatory.

Note that the translation for "disconcertingly", above, is actually correct. This is an example of why the results from length need to be treated with some skepticism. I attempted to tune it so that it wouldn't be too obnoxious, but you can just think of it as "slipshod yet eerily nostalgic", if you like.[13]

So how do we use this information so that we can breed more flexible and correct Phoneme.rc files, and also to be mean and kick them in the metaphorical crutch over and over and laughing, oh, we laughed so hard didn't we Jim? Do you think mother will ever come home?[14]

Okay. Stay focussed... We'll see how in a moment.

The wrong command

Grimes@Sector7G mnemisis$ ./ wrong
asian          02       != 62
ambrosia       3940     != 3946
eurasian       402      != 462
aphasia        80       != 86
Grimes@Sector7G mnemisis$ grep -i sia /usr/share/assjack/words | less[15][16]
grep: /usr/share/assjack/words: No such file or directory
Grimes@Sector7G mnemisis$ ^assjack^dict
(and so on)
Grimes@Sector7G mnemisis$ alias fup="^assjack^dict"[17]

wrong is quick and fun for the whole family! You don't need to wait geologial amounts of time for a bundle file to get built, among other endearing features. As you can see (somewhere amongst all the footnotes), you'll need to do some extrapolating here, too.

In the example, we've honed in on the marginally obvious "sia" sequence as being one of many sources of our translational pain. Checking the dictionary gives us new words that we could then in turn add to the vectorlist. But why?

Well, the more things to test against in the vectorlist, the better. If we go organic, we'd say that we're "training" the Phoneme.rc files on how to answer. Which should mean that a bit of hard work on our part making percentage points go down, will be rewarded by us sitting on our ass[18] watching percentage points automagically go up.

So, fire up your fave text editor and add some more lines to the GENE-erator/vectorlist (such as "aphasia 86" and "ambrosial 39465", for instance). Then, just give a make vectors, which will sort it and make sure there aren't any dupe entries. Run ./ forever for awhile, and you're innem.

Trace mode

Grimes@Sector7G mnemisis$ make traceable
(like you have no idea what 'make' looks like...)
Grimes@Sector7G mnemisis$ ./ n test
test            st==0t          te0t
te0t            t==)1 t         )1 te0)1 t
Grimes@Sector7G mnemisis$ ./ n "Be seeing you."[19]
be              b==se9          se9e
seeing          n==*2           seei*2g
seei*2g         se==0           0ei*2g
0ei*2g          g==7            0ei*27
Grimes@Sector7G mnemisis$ make
Grimes@Sector7G mnemisis$ cd .. ; rm -rf mnemisis[20]
Grimes@Sector7G mnemisis$ lynx[21]

Here we turn on trace, which puts a view of what's going on inside the Phoneme.rc file. Every time a line from the Phoneme.rc actually runs on the input (the regular expression on that line matches), then a short status line is printed to STDERR. On the left is the line's old state, then the regex that matched, and finally the result of the match. Comprende vu?

Note that on "Be seeing you.", each word is handed to the translator in turn, rather than in a single line. Also, capital letters are lowercased, and all non-digits are stripped out. This is not shown (though it should be assumed (correctly (I warned you there'd be nested parens!)) at the beginning and end of processing, respectively, forthwith, heretofore, unbeknownst, etc...).

This is more of just a fun thing to look at, than something that I'd expect you to actually extrapolate anything from. If anyone finds a use for it, let me know.

I find it amusing to see how it seems to only just get things translated correctly. Like the line "t==1 t" -- could easily lead to ballooning insanity if there were another line involving a "t" later on[22]. So I'm easily amused. That doesn't make me any less troubled and deep, nope.

Note also that the final make returns you to normal operation. Please note that I will never test what happens if you try breeding things or running the GUI with the trace on. I don't care. You've been warned. I'd rather spend my time elsewhere, trying to get things to work in a sane manner, thanks. You and your crazy uses for things. You should be ashamed.

Also, running x with trace on is... Exciting! Like reading raw Venona intercepts!

ZWPAs (Zero Width Positive (Look-[Ahead|Behind]) Assertions -- Duh!)

Yes, as well as extended POSIX Regular Expressions in your Phoneme.rc file, you also have the kinda nifty ZWPA frankensteined in in an unorthodox and inelegant way. Like staples and syrup. But what the hell are they and why would I use them when I could be all tore up and crying in bed? Let's watch!

Let us begin some the example of for you, to having as by the translating from the language of the Non-Occidental Peoples -- Today Yum Yum Tasty Blast 180 Thousand Percent!! Oi!:

Closer inspection of "ci" reveals that it can't be hardcoded as six, seven, or zero[23] without hilarious results. So, do we have to do a whole bunch of special cases? Maybe we can come up with a more general RegEx... Well, how about putting "cin==7" in the Phoneme file above "ci==6"? Bonk! Now "cinema" will come up as "723". Oh, the pain! In fact, this is the pain of the 9000 Chambers of Special Cases in English Alone Not To Mention Words Of Saxon Origin. At this point, the stronger of you may need a moment to cry, begging forgiveness for a language that seems to have evolved while under the influence of some really good blunts. I'll wait. To our left, French, and the most horrifying of test vectors: "bourgeoisie"! Fear the madness of the silent R soft G-ness of it! Get out! The test vectors are coming from inside your very language! The horror! Dogs and cats living together!

What are we to do? Do we scrap the whole project and move in with an intelligent, low-maintainance girlfriend? (snaps fingers) Over here! Ahem... No - the answer, gentlemen, is: We impliment - The ZWPA! (comfy chair theme) They are well suited for this application, and eagerly await your reply - they're willing to relocate!

And now for a totally rigged demo. Let's turn on trace mode and see what the ZWPA "ci<[mn]>==0" does...

Grimes@Sector7G mnemisis$ make traceable
make[1]: Entering directory `/mnemisis/Cpp'
(blah blah blah you're not really reading this, are you?)
make[1]: Leaving directory `/mnemisis/Cpp'
Grimes@Sector7G mnemisis$ ./ n cinema
cinema          ci<[mn]>==0             0nema
0nema           n==2            02ema
02ema           m==3            02e3a
Grimes@Sector7G mnemisis$ ./ n decimal
decimal         ci<[mn]>==0             de0mal
de0mal          m==3            de03al
de03al          d==1            1e03al
1e03al          l==5            1e03a5

Using angle brackets as the delimiter, the line "ci<[mn]>==0" is our ZWPA. Plain-English-ified, that means "ci followed by m or n but leave behind the m or n if you find a match, ya hear?". As you can see in the lines above, the translation did just that.

If you're hacking your own Phoneme.rc file, this is a wicked cool thing to have, as it helps in sewing up those damn special cases that inevitably come up and attempt to strangle you. Maybe "wicked cool" isn't quite the right turn of phrase...

With this, we should get a bit better result. And we do. To an extent. But for purposes of this rigged demo, we'll say that we increased the correctness of the Phoneme.rc file by 150 to 297 percent! That's some improvement!!

The done.file

Used to safely shut down a forever run. Allows it to save state and close all friendly-like. Which is good, if you're into that sort of thing. The only way to fly if you want to keep your lab directory from getting hosed. Well, you'd probably lose some work. Hosed is maybe too strong. But I love saying it. Hosed hosed hosed. And "Smoked". There's another good one.

Crash Course: Setting your defaults

If you use Mnemisis daily, or have it start when you start X, you may want to set some defaults. Also, if your system has a grep workalike that Mnemisis is not familiar with (Mnemisis tries to locate one when you ./configure it, but isn't the quickest bulb in the bucket for non-Unix setups), you'll need to jimmy an rc file into working order.

To begin with, let's get a skeleton rc file that we can hack on.

Grimes@Sector7G mnemisis$ ./ dumprc
Verbosity = 1
Belligerence = 0
Borken = 0.2
BundleFile = bundle.words
Capitals = 1
DictionaryFile = /usr/share/dict/words
DoneFile = done.file
GeneDir = GENE-erator
Greps = {'grep.exe': ['grep.exe ^SEARCH\\  BUNDLE', 'grep.exe ^SEARCH\\  BUNDLE | grep.exe -v [A-Z]'], 'grep': ['grep ^SEARCH\\  BUNDLE', 'grep ^SEARCH\\  BUNDLE | grep -v [A-Z]']}
LabDir = lab
Length = 0.5
MaxGeneSize = 3000
MutationRate = 10
NumberOfMogs = 3
OffBy = 0.3
PhonemeFile = Phoneme_Table
Population = 20
RestartRate = 10
VectorFile = GENE-erator/vectorlist

You can either copy and paste that mess into a file, or just redirect the output with ./ dumprc >> someRCfilename. If you'd like to have this default run automagically on each startup, go ahead and name it Defaults, otherwise, you'll need to specify the defaults file with the -c filename switch.



You know, alebench. A bench in or before an alehouse. C'mon. I heard you say it yesterday


We're talking about George Miller's "rule".

We are not (I think) talking about the Dr. George Miller that directed Mad Max Beyond Thunderdome (No colon in there - which is odd. I would have put one in there. After all, Max is the protagonist - as far as that goes. Well, maybe Tina Turner's hair is supposed to be the protagonist.).

And now, a quick callback:

Master-Blaster: Who run Thunderdome?!

Aunty Entity: Master-Blaster!

Master-Blaster: Say louder!

Aunty Entity: Master-Blaster!

Master-Blaster: Master-Blaster run thunderdome!

Aunty Entity: Master-Blaster runs thunderdome!

It just crackles, eh? Ahh, for fun.


What, you don't know this one, either? Maybe you should go back to that scrabble game with a helmet on. It means: Travelling haphazardly.


Preferably a path, somewhere linear... You don't want to wander into the wrong area of your memory, do you?


AFAIK - there's probably some traitor-ware that you give a general outline of what you think the program does and it writes up the patent and bills your CCN while converting it into a DRM-positive format that's only runnable on custom hardware that catches fire if you try to do anything unexpected with it. Oh wait, that's Flamedisk™. Real men burn to Magnesium! Hey, the new Thermite system 2.0 drives are out! Order now! (Trampling of innocents (sheeple)) ...Profit!


Though it's still a national holiday falling on the...? BEEP Oop! I'm sorry. Would you like to double your wager in round two, the round of the silly hats and too-tight pants?


Speaking of: Does anyone really understand Cockney rhyming slang? Could this be the one-way function that people with enough math degrees to choke a paper shredder, the kind of people that you would be ashamed to even say the word "clever" around - in reference to yourself, be searching for?

Can I stop adding confusing run-on sentences to this revision of the manual this evening? no. And much much, muchmuch more.


While reading the volumes of documentation out there, I realize that I just don't get it if there's no example code, so there's going to be a lot of it here. Just a caveat. You may also experience a few footnotes.


Recent timing measurements on the Imperial™ Mnemisis build on a Duron gave the underwhelming result of ~6 minutes. Which isn't so bad, considering that it used to take ~15". But I know how it is.


As if, viz these footnotes, you're not used to it.


Which - if I could figure out how to work MathML, would go right here.

Instead, suffer me this lame text-only version:

x : Characters in

y : Digits out

1.8x+4.5 < y < 1.8x-4.5

Forgive me that that's probably not standard notation for what I'm trying to express (Think of the havoc I'd wreak if I could get MathML to work (*shudder*)). I'm only lately a fan of math.


Yes, I realize that should read "zero to nine digits", the function I whipped up really clumsily fits the data - hopefully someone else with mad math skills will be able to get something that fits a little better. My case is really broken for small values of x, and gets progressively less broken for nominal values. It should at least spot really egregious cases.


Did you do it? Good, I knew you could. You're a very good imaginer, and you're the only imaginer in the whole world like you. Let's see what Mr. Trolley has to say about that. Oh, sweet mercy! The drapes! Get an extinguisher! Oh, the humanity!


Reverie. From the French for "Was that you?"


WarningWARNING: No longer rated G

With the frivolous use of the word "assjack", we at the MPAA have had to rate this manual PG. Please, buy a Beauty & the Beast™ brand wholesum treat to compensate for your utter lack of moral fibre.


Nope, I never get tired of typing. Love it. Great sport. Oh, who am I kidding!? After wearing down my hands, I had to move to typing with my face. I'm a powerful mess. Please, someone send a care package of some moleskin. Anything.


Here's a two-cent tip! Include this alias line in your .bashrc file so that every time you mistype "dict" you can quickly recover! Until next time! Three - Two - One - Contact!


Plural: "Assi"


"I just thought that was so dangerously witty, I couldn't help but footnote it!" -- Number 41


Here's another two-cent tip! Another way to enlargen your drive space: get another drive and use it like a sock puppet to shame your current drive into better performance! Or, you can simply fashion a terabyte RAID by pounding strips of zinc into a potato! We'll show you how, next time, on The A-Team.

If you have a problem, and no one else can help...


WarningWARNING: No longer rated PG

With the mention of, and now the wanton linking of same, we at the MPAA have now given this manual a rating of PG-13, and would like to ask you to please donate, as it is stealing food off of the plate of Adam Sandler. Thank you.


For example - if I add two lines of "t==tt" in the middle of the Phoneme.rc file and call it da_bom, here's what pops out:

Grimes@Sector7G mnemisis$ ./ n -p da_bom test
test            t==tt           ttestt
ttestt          t==tt           ttttestttt
ttttestttt              st==0t          tttte0tttt
tttte0tttt              t==)1 t         )1 t)1 t)1 t)1 te0)1 t)1 t)1 t)1 t

I had to be a bit strategic about placing the lines, as I found that putting them at the beginning or end of the file didn't give an incorrect result. The table actually (if I may be sensational and journalistically irresponsible for a moment...) compensated for the doubled "t"s with the line "t{2,}==t" toward the top of the file, and near the bottom would drop excess "t"s by not translating them. Wonderful! I believe the real-science-person's term for this is "resilience", which is what we get in exchange for small file size. It's tied into mutation somehow or other. There are better books on the topic out there.


That's "Zed", for the Clive Andersons among you.