𒐳 / ༳ == ( ⑽ – 𐹭 ) * ( 𒐲 / 𐅉 ), of course

I just got brian d. foy’s Learning Perl 6 from the library. It’s a pretty good book, though it’ll take a good few readings for some of Perl 6’s features to stick.

Since Perl 6 is built using Unicode from the ground up, it does two rather wonderful things when dealing with numbers:

  1. regular expressions match numerals beyond 0–9: ٤ is as much four as 4
  2. numeric constants can (pretty much) be expressed in terms of Unicode values in your Perl 6 source code. Assigning π to a variable does what you think it does. Dividing by ¼ is the same as multiplying by, well, ٤.

So herewith a table (probably incomplete, and very unlikely to render properly for you) of Unicode glyphs accepted by Perl 6 as numeric values:

Value Glyphs
-0.5 ༳
0 0 ٠ ۰ ߀ ० ০ ੦ ૦ ୦ ௦ ౦ ౸ ೦ ൦ ๐ ໐ ༠ ၀ ႐ ០ ៰ ᠐ ᥆ ᧐ ᪀ ᪐ ᭐ ᮰ ᱀ ᱐ ⁰ ₀ ↉ ⓪ ⓿ 〇 ꘠ ꛯ ꣐ ꤀ ꧐ ꩐ ꯰ 0 𐆊 𐒠 𑁦 𑃰 𑄶 𑇐 𑛀 𝟎 𝟘 𝟢 𝟬 𝟶 🄀 🄁
0.0625 ৴ ୵ ꠳
0.1 â…’
0.111111 â…‘
0.125 ৵ ୶ ⅛ ꠴ 𒑟
0.142857 ⅐
0.166667 â…™ ð’‘¡
0.1875 ৶ ୷ ꠵
0.2 â…•
0.25 ¼ ৷ ୲ ൳ ꠰ 𐅀 𐹼 𒑠 𒑢
0.333333 ⅓ 𐹽 𒑚 𒑝
0.375 ⅜
0.4 â…–
0.5 ½ ୳ ൴ ༪ ⳽ ꠱ 𐅁 𐅵 𐅶 𐹻
0.6 â…—
0.625 ⅝
0.666667 ⅔ 𐅷 𐹾 𒑛 𒑞
0.75 ¾ ৸ ୴ ൵ ꠲ 𐅸
0.8 â…˜
0.833333 ⅚ 𒑜
0.875 â…ž
1 1 ¹ ١ ۱ ߁ १ ১ ੧ ૧ ୧ ௧ ౧ ౹ ౼ ೧ ൧ ๑ ໑ ༡ ၁ ႑ ፩ ១ ៱ ᠑ ᥇ ᧑ ᧚ ᪁ ᪑ ᭑ ᮱ ᱁ ᱑ ₁ ⅟ Ⅰ ⅰ ① ⑴ ⒈ ⓵ ❶ ➀ ➊ 〡 ㆒ ㈠ ㊀ ꘡ ꛦ ꣑ ꤁ ꧑ ꩑ ꯱ 1 𐄇 𐅂 𐅘 𐅙 𐅚 𐌠 𐏑 𐒡 𐡘 𐤖 𐩀 𐩽 𐭘 𐭸 𐹠 𑁒 𑁧 𑃱 𑄷 𑇑 𑛁 𒐕 𒐞 𒐬 𒐴 𒑏 𒑘 𝍠 𝟏 𝟙 𝟣 𝟭 𝟷 🄂
1.5 ༫
2 2 ² ٢ ۲ ߂ २ ২ ੨ ૨ ୨ ௨ ౨ ౺ ౽ ೨ ൨ ๒ ໒ ༢ ၂ ႒ ፪ ២ ៲ ᠒ ᥈ ᧒ ᪂ ᪒ ᭒ ᮲ ᱂ ᱒ ₂ Ⅱ ⅱ ② ⑵ ⒉ ⓶ ❷ ➁ ➋ 〢 ㆓ ㈡ ㊁ ꘢ ꛧ ꣒ ꤂ ꧒ ꩒ ꯲ 2 𐄈 𐅛 𐅜 𐅝 𐅞 𐏒 𐒢 𐡙 𐤚 𐩁 𐭙 𐭹 𐹡 𑁓 𑁨 𑃲 𑄸 𑇒 𑛂 𒐀 𒐖 𒐟 𒐣 𒐭 𒐵 𒑊 𒑐 𒑖 𒑙 𝍡 𝟐 𝟚 𝟤 𝟮 𝟸 🄃
2.5 ༬
3 3 ³ ٣ ۳ ߃ ३ ৩ ੩ ૩ ୩ ௩ ౩ ౻ ౾ ೩ ൩ ๓ ໓ ༣ ၃ ႓ ፫ ៣ ៳ ᠓ ᥉ ᧓ ᪃ ᪓ ᭓ ᮳ ᱃ ᱓ ₃ Ⅲ ⅲ ③ ⑶ ⒊ ⓷ ❸ ➂ ➌ 〣 ㆔ ㈢ ㊂ ꘣ ꛨ ꣓ ꤃ ꧓ ꩓ ꯳ 3 𐄉 𐒣 𐡚 𐤛 𐩂 𐭚 𐭺 𐹢 𑁔 𑁩 𑃳 𑄹 𑇓 𑛃 𒐁 𒐈 𒐗 𒐠 𒐤 𒐥 𒐮 𒐯 𒐶 𒐷 𒐺 𒐻 𒑋 𒑑 𒑗 𝍢 𝟑 𝟛 𝟥 𝟯 𝟹 🄄
3.141592653589793 π
3.5 ༭
4 4 ٤ ۴ ߄ ४ ৪ ੪ ૪ ୪ ௪ ౪ ೪ ൪ ๔ ໔ ༤ ၄ ႔ ፬ ៤ ៴ ᠔ ᥊ ᧔ ᪄ ᪔ ᭔ ᮴ ᱄ ᱔ ⁴ ₄ Ⅳ ⅳ ④ ⑷ ⒋ ⓸ ❹ ➃ ➍ 〤 ㆕ ㈣ ㊃ ꘤ ꛩ ꣔ ꤄ ꧔ ꩔ ꯴ 4 𐄊 𐒤 𐩃 𐭛 𐭻 𐹣 𑁕 𑁪 𑃴 𑄺 𑇔 𑛄 𒐂 𒐉 𒐏 𒐘 𒐡 𒐦 𒐰 𒐸 𒐼 𒐽 𒐾 𒐿 𒑌 𒑒 𒑓 𝍣 𝟒 𝟜 𝟦 𝟰 𝟺 🄅
4.5 ༮
5 5 ٥ ۵ ߅ ५ ৫ ੫ ૫ ୫ ௫ ౫ ೫ ൫ ๕ ໕ ༥ ၅ ႕ ፭ ៥ ៵ ᠕ ᥋ ᧕ ᪅ ᪕ ᭕ ᮵ ᱅ ᱕ ⁵ ₅ Ⅴ ⅴ ⑤ ⑸ ⒌ ⓹ ❺ ➄ ➎ 〥 ㈤ ㊄ ꘥ ꛪ ꣕ ꤅ ꧕ ꩕ ꯵ 5 𐄋 𐅃 𐅈 𐅏 𐅟 𐅳 𐌡 𐒥 𐹤 𑁖 𑁫 𑃵 𑄻 𑇕 𑛅 𒐃 𒐊 𒐐 𒐙 𒐢 𒐧 𒐱 𒐹 𒑍 𒑔 𒑕 𝍤 𝟓 𝟝 𝟧 𝟱 𝟻 🄆
5.5 ༯
6 6 ٦ ۶ ߆ ६ ৬ ੬ ૬ ୬ ௬ ౬ ೬ ൬ ๖ ໖ ༦ ၆ ႖ ፮ ៦ ៶ ᠖ ᥌ ᧖ ᪆ ᪖ ᭖ ᮶ ᱆ ᱖ ⁶ ₆ Ⅵ ⅵ ↅ ⑥ ⑹ ⒍ ⓺ ❻ ➅ ➏ 〦 ㈥ ㊅ ꘦ ꛫ ꣖ ꤆ ꧖ ꩖ ꯶ 6 𐄌 𐒦 𐹥 𑁗 𑁬 𑃶 𑄼 𑇖 𑛆 𒐄 𒐋 𒐑 𒐚 𒐨 𒑀 𒑎 𝍥 𝟔 𝟞 𝟨 𝟲 𝟼 🄇
6.5 ༰
7 7 ٧ ۷ ߇ ७ ৭ ੭ ૭ ୭ ௭ ౭ ೭ ൭ ๗ ໗ ༧ ၇ ႗ ፯ ៧ ៷ ᠗ ᥍ ᧗ ᪇ ᪗ ᭗ ᮷ ᱇ ᱗ ⁷ ₇ Ⅶ ⅶ ⑦ ⑺ ⒎ ⓻ ❼ ➆ ➐ 〧 ㈦ ㊆ ꘧ ꛬ ꣗ ꤇ ꧗ ꩗ ꯷ 7 𐄍 𐒧 𐹦 𑁘 𑁭 𑃷 𑄽 𑇗 𑛇 𒐅 𒐌 𒐒 𒐛 𒐩 𒑁 𒑂 𒑃 𝍦 𝟕 𝟟 𝟩 𝟳 𝟽 🄈
7.5 ༱
8 8 ٨ ۸ ߈ ८ ৮ ੮ ૮ ୮ ௮ ౮ ೮ ൮ ๘ ໘ ༨ ၈ ႘ ፰ ៨ ៸ ᠘ ᥎ ᧘ ᪈ ᪘ ᭘ ᮸ ᱈ ᱘ ⁸ ₈ Ⅷ ⅷ ⑧ ⑻ ⒏ ⓼ ❽ ➇ ➑ 〨 ㈧ ㊇ ꘨ ꛭ ꣘ ꤈ ꧘ ꩘ ꯸ 8 𐄎 𐒨 𐹧 𑁙 𑁮 𑃸 𑄾 𑇘 𑛈 𒐆 𒐍 𒐓 𒐜 𒐪 𒑄 𒑅 𝍧 𝟖 𝟠 𝟪 𝟴 𝟾 🄉
8.5 ༲
9 9 ٩ ۹ ߉ ९ ৯ ੯ ૯ ୯ ௯ ౯ ೯ ൯ ๙ ໙ ༩ ၉ ႙ ፱ ៩ ៹ ᠙ ᥏ ᧙ ᪉ ᪙ ᭙ ᮹ ᱉ ᱙ ⁹ ₉ Ⅸ ⅸ ⑨ ⑼ ⒐ ⓽ ❾ ➈ ➒ 〩 ㈨ ㊈ ꘩ ꛮ ꣙ ꤉ ꧙ ꩙ ꯹ 9 𐄏 𐒩 𐹨 𑁚 𑁯 𑃹 𑄿 𑇙 𑛉 𒐇 𒐎 𒐔 𒐝 𒐫 𒑆 𒑇 𒑈 𒑉 𝍨 𝟗 𝟡 𝟫 𝟵 𝟿 🄊
10 ௰ ൰ ፲ Ⅹ ⅹ ⑩ ⑽ ⒑ ⓾ ❿ ➉ ➓ 〸 ㈩ ㉈ ㊉ 𐄐 𐅉 𐅐 𐅗 𐅠 𐅡 𐅢 𐅣 𐅤 𐌢 𐏓 𐡛 𐤗 𐩄 𐭜 𐭼 𐹩 𑁛 𝍩
11 Ⅺ ⅺ ⑪ ⑾ ⒒ ⓫
12 Ⅻ ⅻ ⑫ ⑿ ⒓ ⓬
13 ⑬ ⒀ ⒔ ⓭
14 ⑭ ⒁ ⒕ ⓮
15 ⑮ ⒂ ⒖ ⓯
16 ৹ ⑯ ⒃ ⒗ ⓰
17 ᛮ ⑰ ⒄ ⒘ ⓱
18 ᛯ ⑱ ⒅ ⒙ ⓲
19 ᛰ ⑲ ⒆ ⒚ ⓳
20 ፳ ⑳ ⒇ ⒛ ⓴ 〹 ㉉ 𐄑 𐏔 𐡜 𐤘 𐩅 𐭝 𐭽 𐹪 𑁜 𝍪
21 ㉑
22 ㉒
23 ㉓
24 ㉔
25 ㉕
26 ㉖
27 ㉗
28 ㉘
29 ㉙
30 ፴ 〺 ㉊ ㉚ 𐄒 𐅥 𐹫 𑁝 𝍫
31 ㉛
32 ㉜
33 ㉝
34 ㉞
35 ㉟
36 ㊱
37 ㊲
38 ㊳
39 ㊴
40 ፵ ㉋ ㊵ 𐄓 𐹬 𑁞 𝍬
41 ㊶
42 ㊷
43 ㊸
44 ㊹
45 ㊺
46 ㊻
47 ㊼
48 ㊽
49 ㊾
50 ፶ Ⅼ ⅼ ↆ ㉌ ㊿ 𐄔 𐅄 𐅊 𐅑 𐅦 𐅧 𐅨 𐅩 𐅴 𐌣 𐩾 𐹭 𑁟 𝍭
60 ፷ ㉍ 𐄕 𐹮 𑁠 𝍮
70 ፸ ㉎ 𐄖 𐹯 𑁡 𝍯
80 ፹ ㉏ 𐄗 𐹰 𑁢 𝍰
90 ፺ 𐄘 𐍁 𐹱 𑁣 𝍱
100 ௱ ൱ ፻ Ⅽ ⅽ 𐄙 𐅋 𐅒 𐅪 𐏕 𐡝 𐤙 𐩆 𐭞 𐭾 𐹲 𑁤
200 𐄚 𐹳
300 𐄛 𐅫 𐹴
400 𐄜 𐹵
500 Ⅾ ⅾ 𐄝 𐅅 𐅌 𐅓 𐅬 𐅭 𐅮 𐅯 𐅰 𐹶
600 𐄞 𐹷
700 𐄟 𐹸
800 𐄠 𐹹
900 𐄡 𐍊 𐹺
1000 ௲ ൲ Ⅿ ⅿ ↀ 𐄢 𐅍 𐅔 𐅱 𐡞 𐩇 𐭟 𐭿 𑁥
2000 𐄣
3000 𐄤
4000 𐄥
5000 ↁ 𐄦 𐅆 𐅎 𐅲
6000 𐄧
7000 𐄨
8000 𐄩
9000 𐄪
10000 ፼ ↂ 𐄫 𐅕 𐡟
20000 𐄬
30000 𐄭
40000 𐄮
50000 ↇ 𐄯 𐅇 𐅖
60000 𐄰
70000 𐄱
80000 𐄲
90000 𐄳
100000 ↈ
216000 𒐲
432000 𒐳
Inf ∞

So the title of this post really is accepted as a valid Perl 6 expression in the REPL:

$ perl6
To exit type 'exit' or '^D'
> 𒐳 / ༳ == ( ⑽ - 𐹭 ) * ( 𒐲 / 𐅉 )
True

What does it evaluate to? Well:

  • 𒐳 ‘CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN’ represents 432000
  • ༳ ‘TIBETAN DIGIT HALF ZERO’ represents -½
  • ⑽ ‘PARENTHESIZED NUMBER TEN’ represents 10
  • 𐹭 ‘RUMI NUMBER FIFTY’ represents 50
  • 𒐲 ‘CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH’ represents 216000
  • 𐅉 ‘GREEK ACROPHONIC ATTIC TEN TALENTS’ represents 10.

Definitely into just because you can doesn’t mean you should territory, and a feature to make the Pythonistas reach for the Zantac again, poor dears.

The Modern Hectographer

Way back, if you wanted more than one copy of something you’d written there was no print button. If you wanted copies, each one required a bit of work. Before copiers and printers there were duplicators where you could type or draw onto special membranes that either transferred ink to a printing sheet (Banda or Ditto brand machines) or made holes in a screen to allow ink through (Gestetner or Mimeograph brands). Risograph machines are modern digital ink duplicators still in use and active development today.

One of the predecessors of duplicators was the hectograph. In the 19th century they still knew their Greek and yet were totally okay with hype, the hectograph was named after the extremely, um, aspirational idea that you could pull a hundred (εκατό = hundred, in modern Greek) copies from one master. Once you’ve made a few hectograph copies, you’ll be more wondering what the heck they were thinking: you might get a few tens of legible copies if you’re extremely careful.

Some hectographic copies, all pulled from the one jelly sheet impression

A hectograph copier is basically a sheet of jelly that soaks up certain kinds of ink from a master copy, then oozes the copies back onto paper pressed onto its surface. The ink slowly diffuses down through the thickness of the jelly, allowing different copies to be made with the same plate a day or so later.

Getting the right ink is a little tricky these days. Tattoo artists use hectograph ink to make stencils, so I got a small bottle of ink ($15) from Studio One (940 Queen St. East, Toronto). You can also use hecto/indelible pencils, but the National Tattoo brand one I got from Studio One barely transfers at all.

Making a copier in a kitchen is easy. There are several recipes online (University of Iowa Library and W0IS‘s being two: if you follow The New Standard Formulary historic ones, remember that white glue now is quite different from the hoof-and-hide renderings they used then). My recipe is a bit of a blend of all of these:

  • 28 g Gelatin
    (powdered, unflavoured; in North America, it’s sold under the Knox brand in little boxes containing 4× 7 g sachets)
  • 175 ml Glycerin
    (from the pharmacy, possibly sold in the skin care section; about ¾ cup)
  • 75 g Sugar
    (regular white sugar, about â…“ cup)
  • 350 ml Water
    (1½ cups)

You’ll need a flat tray, larger that the paper you want to use. Dollar store baking trays are ideal. I used a slightly-too-small toaster oven tray, which seemed like a good idea at the time.

  1. Stir gelatin and sugar into the water and leave it to soak for a few hours. It should form a translucent gel
  2. Heat the glycerin in a double boiler until the boiler water is just simmering
  3. Add the gelatin/sugar solution and stir gently until the boiler water resumes simmering. Keep heating for a few minutes until the solution turns clear
    (The liquid doesn’t have to boil, just get hot enough for the gelatin to melt. Avoiding bubbles is worthwhile, as gelatin foam is not what we’re looking for here)
  4. Carefully pour the hot liquid into your tray, avoiding forming bubbles if at all possible
    (Bubbles can be shepherded off to the edge of the plate with the tip of a scrap of paper before the liquid sets)
  5. Allow the tray to cool and set. This may take several hours at room temperature. The solid jelly hardly changes in appearance from the liquid form
surface of a freshly-cooled jelly plate: extremely clear with a faint texture

Now draw your master. Hectographic ink is loaded with dye, so a little goes a long way. It’s also not a modern non-blotting ink, so you need to be more sparing with it than I was.

The unused master sheet, drawn in hecto ink (purplish black), copying pencil (grey) with guidelines from a plotter pen (red)

Stick the master face down onto the jelly sheet and leave it there for about a minute. I used a brayer to press the ink onto the surface. When you lift the master off the surface, you’ll end up with a slightly ruined master —

The used master sheet: probably too blurred to be usable again. Next time I’ll be more careful not to blot. (Colour balance made it yellow, btw; it’s the same sheet as before)

— and a crisp, reversed image in the jelly plate. I hope yours will be less blot-ridden than mine:

Image transferred onto jelly. Note blots (dammit!) and complete lack of visibility from hecto/copying pencil. Red lines from plotter pen are clear, though they didn’t end up transferring through to the paper copies

Now lay your copy paper onto the jelly sheet for a few seconds. Again, I used a brayer.

First copy, on mulberry paper

The copies come out remarkably dry, but should still be allowed to dry off for a while: this is a wet copy process, after all. The copier is reusable indefinitely, and should be very lightly dampened before use.

This is after use (6-7 copies), a light misting of water and a wipe down with a damp sponge.
This is the same plate, roughly 12 hours after use. The ink has blurred and diffused more deeply into the surface. It was possible to pull a very faint and impossibly blurry copy from this, but it’s pretty close to being ready to reuse

This process is kind-of on the edge of practicality, but is not without its charms. It might be worth looking at:

  1. alternative jellies, such as arrowroot or hypromellose. Gelatin is hydrolyzed animal collagen, and this may create ethical issues for some users. Some glycerin is also from animal sources, but less so than in the past.
  2. other ink/dye sources, including inkjet ink, certain water-soluble colouring pencils and other indelible/copying pencils. I have some vintage — possibly old enough to be quite toxic — copying pencils on the way to me via ebay which may work better.
  3. making 3d printed stamps to transfer to the jelly plate. Since the plate doesn’t need to accept a perfectly flat impression, a relief design might work better than a 3d printed direct stamp.

(aside: I’d previously tried to make a copying pad from several layers of damp kitchen towel to transfer a drawing made with Stabilo All water-soluble pencils. As you can imagine, the ink quickly diffused along the cellulose fibres, making this process at best a very qualified success …

A copy attempt made with damp paper towels. The less said about this, the better

)

In the very unlikely event that you want to repair a broken handset socket on a Princess telephone …

It seems that Princess telephones — like the one I have — were notorious for having their connectors break. The connectors are made of brittle thermoset resin, and sit just where they’d hit the ground if you dropped the phone. This is definitely what happened here:

Very broken 616p modular handset connector. Pins are (l to r): Black, Green, White, Red

For the handset, you want a 616P connector. If your wall connector has gone too, you’ll need the 623P connector for that. These are fairly readily available on eBay.

These instructions really only apply to the 2702BMG model of the Princess phone. There are many variants, and the 2702BMG was one of the last Princess models made.

  1. Remove the upper body by unscrewing the two screws at each end of the base

    Undo the screws at left and right to remove the case
  2. Remove the body, and remove the keypad. This is held in by two screws, one on each side of the keypad
  3. If your phone’s anything like mine, untwist the wires inside to get the line and handset connectors separated
  4. Unhook the old connectors from the terminals, and attach the new connectors as shown:

    Handset wiring: Green → S, White & Red → R, Black → T
  5. Slot the handset modular connector into its space in the phone chassis
  6. Replace the keypad
  7. Re-route the wires so they don’t get pinched or block the handset hook, then re-attach the plastic body with the two screws.

 

You say ‘homage’, I say ripoff: cakeordeathsite’s What a Life!

So via mefi I find this: What A Life! | cakeordeathsite.

I love it when people discover this book. It’s been a minor obsession of mine for nearly 30 years. I first put it on the web in March 2000 and updated it to then-current web standards in 2003: What a Life!: an autobiography. Over the years I’ve received a bunch of interesting notes from fans and even a couple from relatives of the authors. I marked it up the old, hard way: by scanning pages then re-keying the text. OCR wasn’t that great back in the day.

So I get kind of irked that this cakeordeath fella lifts my pictures and markup wholesale. Shame he didn’t understand how to copy CSS, ‘cos his formatting comes out worse than mine:

cakeordeath’s rendering, viewed 2018-04-01 18:22:34
my rendering, viewed 2018-04-01 18:23:20

Crack open View Source on his https://cakeordeathsite.wordpress.com/2017/10/20/what-a-life/ and f’rinstance my Chapter 1, http://scruss.com/wal/chapter1.html:

mine:

<div>
<p><span class="smallcaps">I</span> was born very near the end of the
year. <img src="Images/wal009a.jpg" width="112" height="104"
alt="calendar showing 29 December" class="right" /></p> 
</div>

<p>The grange where I was born was situated in a secluded corner of
the Chiltern Hills. Rumour had it that Queen Elizabeth had slept
there.</p>

<div class="centre"><img src="Images/wal009b.jpg" width="160"
height="232" alt="doll's house" /></div>

cakeordeath’s:

<div>
<p><span class="smallcaps">I</span>&nbsp;was born very near the end of the year.<img class="right" src="https://i1.wp.com/scruss.com/wal/Images/wal009a.jpg" alt="calendar showing 29 December" width="112" height="104"></p>
</div>
<p>The grange where I was born was situated in a secluded corner of the Chiltern Hills. Rumour had it that Queen Elizabeth had slept there.</p>
<div class="centre"><img src="https://i2.wp.com/scruss.com/wal/Images/wal009b.jpg" alt="doll's house" width="160" height="232"></div>

I mean, come on … including my domain and image path scruss.com/wal in his image urls? Otherwise, it’s whitespace difference. I dunno, these kids today: lift anything without credit, so they would. Seems this dude is a semi-popular blogger, and I’d be vastly annoyed if he were getting ad revenue for this, while I did this for fun and it’s cost me to host it all these years.

There’s a further uncredited lift from Chris Mullen’s oldweb classic, Visual Telling of Stories. cakeordeath’s banner page scan is straight out of Chris’s Collage Pioneers: E.V.Lucas and George Morrow, What a Life! 1911 with the same file name. Was there credit? Was there shite …

short sci-fi: “Mission: Survival”, by Curt Fischer – from Boy’s Life magazine, August 1988

Mission: Survival

by Curt Fischer
Illustrated by Alex Gnidziejko
from Boy’s Life, August 1988

mission survival illo by alex gnidziejko

“We need a shibboleth!”

“A what?” said Tim Donaldson, the mining foreman of Xerxes 8, a mineral-rich planet on the far side of the Milky Way.

“A Shibboleth,” repeated Harvey Wheeler. “A way to determine the identity of the enemy sooner than we do now.”

Donaldson and the rest of the group stared at him blankly. The old man, Freiberg, leaned forward on his cane, as if to speak, but then he sat back quietly. The 20 others, like Donaldson, mostly uneducated miners, began to look at the floor, not wishing to show their ignorance.

Only 13-year-old Bobby Hall, whose parents had left him with Wheeler while they visited his ill grandmother on Sagis, had the courage to ask: “How does a Shibboleth work? What’s it look like?”

Wheeler, the planet’s Intelligence Technician, smiled. He had often felt useless since coming to this planet. The mining colony put high value on muscles, not brains. Now he had a chance to show his strength. ‘A Shibboleth isn’t a physical thing,” Wheeler said, “It’s a word, a password.”

“So what kind of password?” Bobby asked. “A secret one?” “Secret passwords don’t work,” groaned Donaldson as he paced the cramped underground chamber where the final human survivors of Xerxes 8 had gathered. “You know the Ardon robotoids can tune in on all our conversations and radio communications. Our ‘secret password’ wouldn’t stay secret for 10 seconds!”

“Just a minute, Donaldson,” the elderly Freiberg spoke up. “If I remember my Bible stories correctly, a shibboleth is not that kind of password.”

“That’s right,” said Wheeler. “The term comes from the Bible, and a shibboleth isn’t secret. It just can’t be pronounced or understood by the enemy.”

Bobby beamed with curiosity. “So what’s the Bible story. Mr. Freiberg?”

Freiberg looked at Wheeler and then about the room. Everyone listened intently, knowing that the story could decide whether they lived or died.

“Well,” Freiberg began, “in the early days of the kingdom of Israel, back on Earth, a battle occurred between two tribes. But it was hard for the tribes to tell each other apart, because they looked, dressed and talked alike. Then one tribe discovered that it could identify the enemy by asking each captured member to say a certain word. You see, because a distinct sound was missing in the speech of the one tribe, its people couldn’t say certain words, like … like … shibboleth. They instead said ‘sibboleth.’”

“So you think this will work with the robotoids?” spat Donaldson. “Nonsense! The robotoids slip in among us and replace us. Like those tribes, we can’t tell them apart from us, Why? Because of their programming. They can mimic us perfectly. They could even be among us right now.”

Freiberg, the mining company’s bookkeeper, shook his finger disapprovingly. “Look, Donaldson, they haven’t beaten us until our reason gives way to fear.”

Donaldson made a vocal noise of disdain and folded his arms angrily.

“Freiberg’s right,” Wheeler said. “The robotoids can slip in and replace any of us, but as long as one of us is still human, we must struggle to survive.”

“But, Mr. Wheeler,” said Bobby, “Mr. Donaldson is right in a way too, The robotoids are programmed to be perfect. There aren’t any words in any language that they can’t say.”

Neither Wheeler nor Freiberg spoke.

“Absolutely,” Donaldson added darkly. “They know every language, every tone, every word. They even pick up slang quickly—”

“And their ability to communicate with their fellow robotoids means we can only catch ’em once,” Wheeler said sadly. “Even if we made up a word or mispronounced one, we’d only catch ’em once.”

“They have no flaws. It’s hopeless,” grumbled Donaldson.

A miner stood so quickly that his chair fell over.

“Look,” he said excitedly. “l know nothing you’re talking about! I’m not real smart. But I’m scared!”

“Me too,” cried a man behind him. “I don’t want to die! But I’ve worked with robotoids and know that they won’t give up!”

“That’s it,” Freiberg exclaimed. “They do have a flaw. Think about it. They’ve been programmed to avoid being trapped by unsolvable puzzles. But to do exactly that, they’re also been programmed to never give up in other areas—like linguistics.”

“Right,” Wheeler said brightly. Then his enthusiasm died. “But how does that help us? That’s why slang words and made-up words won’t fool them. They just add to their memory banks, searching them until the problem is solved.”

“Mr. Freiberg,” Bobby said, “what kind of unsolvable puzzle did you mean?”

“Oh, things like asking a robotoids math or philosophy questions that have no answers,” Freiberg explained. “Ask a human for the last digit of pi, and he’ll admit he can’t find it because it’s somewhere in infinity.”

“Years ago,” he continued, turning to the miners, “our soldiers could uncover a robotoid with such a question, literally make smoke come out its ears as the circuits burned up searching for the answers. Then they were reprogrammed to accept failure, so today a robotoid will laugh off such a challenge.”

Wheeler brightened. “But, as you said, they still won’t accept failure in certain areas, like language. So… we could try some other branch of linguistics, like… spelling! We can feed ’em words that have silent letters.”

“Like ‘pneumonia’ or ‘sarsaparilla’?” Bobby asked.

“As Mr. Wheeler said,” Freiberg answered, “each would work only once. We need something to make a robotoid’s ‘brain’ go into a closed loop. Something that would force it to search for an answer until it actually burned up its circuits.”

“What nonsense,” Donaldson snorted.

“How about a rhyme?” Bobby suggested.

Wheeler and Freiberg smiled.

“No, Bobby,” said Wheeler, “I’m afraid a rhyme would be a bit too simple. A robotoid would come up with countless rhymes for every word that …”

“But what if the word doesn’t have a perfect rhyme?” Bobby persisted.

Freiberg said: “What do you mean, Bobby?”

“What a bunch of hopeless fools!” Donaldson shouted. “We’re on the verge of extinction. The robotoids are picking us off one by one. They’re closing in every minute. We’re cut off from everyone else in the galaxy, and we sit here dreaming about a magic word, listening to a child.”

Freiberg inhaled deeply. “Mr. Donaldson, first of all, we are neither fools nor hopeless. We are alive, and we are thinking. That’s two advantages we have over the robotoids. It’s also the key to survival. Secondly, Bobby is in as much danger as the rest of us. That fact gives him certain rights.”

Donaldson mumbled something and moved away, but most of the miners nodded, agreeing with Freiberg.

Freiberg turned to Bobby. “What word doesn’t have a perfect rhyme?”

“Well,” Bobby began, “I’m not sure about other languages, but I remember learning that in English there’s no word that rhymes with ‘orange.’”

Wheeler rubbed his chin. “‘Orange’ as a shibboleth?” He looked at Freiberg. “Can you think of a rhyme with ‘orange’?”

“None that I can think of,” Freiberg said. “Nothing perfect anyway.”

“Can you think of one, Donaldson?” Wheeler asked, turning to face the mining foreman.

But Donaldson didn’t answer. He stood strangely erect, staring straight ahead.

Smoke was coming out of his ears.

— via Ask MetaFilter.

Circuit Playground Express Chord Guitar

Hey! This doesn’t work any more, as CircuitPython changed and I haven’t found a way to update it with the new interpreter.

Since there are seven touch pads on a Circuit Playground Express, that’s enough for traditional 3-chord (â… , â…£, â…¤) songs in the keys of C, D and G. That leaves one pad extra for a â…¥min chord for so you can play Neutral Milk Hotel songs in G, of course.

CircuitPython source and samples: cpx-chord_guitar.zip. Alternatively, on github: v1.0 from scruss/cpx_chord_guitar

The code is really simple: poll the seven touch pads on the CPX, and if one of them is touched, play a sample and pause for a short time:

# Circuit Playground Express Chord Guitar
# scruss - 2017-12

# these libraries should be installed by default in CircuitPython
import touchio
import board
import time
import neopixel
import digitalio
import audioio

# touch pins, anticlockwise from battery connector
touch_pins= [
    touchio.TouchIn(board.A1),
    touchio.TouchIn(board.A2),
    touchio.TouchIn(board.A3),
    touchio.TouchIn(board.A4),
    touchio.TouchIn(board.A5),
    touchio.TouchIn(board.A6),
    touchio.TouchIn(board.A7)
]

# 16 kHz 16-bit mono audio files, in same order as pins
chord_files = [
    "chord-C.wav",
    "chord-D.wav",
    "chord-E.wav",
    "chord-Em.wav",
    "chord-F.wav",
    "chord-G.wav",
    "chord-A.wav"
]

# nearest pixels to touch pads
chord_pixels = [ 6, 8, 9, 0, 1, 3, 4 ]

# set up neopixel access
pixels = neopixel.NeoPixel(board.NEOPIXEL, 10, brightness=.2)
pixels.fill((0, 0, 0))
pixels.show()

# set up speaker output
speaker_enable = digitalio.DigitalInOut(board.SPEAKER_ENABLE)
speaker_enable.switch_to_output(value=True)

# poll touch pins
while True:
    for i in range(len(touch_pins)):
        # if a pin is touched
        if touch_pins[i].value:
            # set nearest pixel
            pixels[chord_pixels[i]] = (0, 0x10, 0)
            pixels.show()
            # open and play corresponding file
            f=open(chord_files[i], "rb")
            a = audioio.AudioOut(board.A0, f)
            a.play()
            # blank nearest pixel
            pixels[chord_pixels[i]] = (0, 0, 0)
            pixels.show()
            # short delay to let chord sound
            # might want to try this a little shorter for faster play
            time.sleep(0.2)

This is roughly how I synthesized the samples, but I made them quieter (the MEMS speaker on the CPX went all buzzy at full volume, and not in a good way) and added a bit of reverb. Here’s the sox command from the modified script:

sox -n -r 16000 -b 16 "chord-${chord}.wav" synth 1 pl "$first" pl "$third" pl "$fifth" delay 0 .05 .1 remix - fade p 0 1 0.5 norm -5 reverb

Really, you do want to take a look at shortening the delay between the samples: you want it long enough for all of the notes of the chord to sound, but short enough that you can play faster songs. I came up with something that worked for me, kinda, and quickly; it’s worth fixing if you have the time.

Circuit Playground Express Remote-Controlled Fart Machine

I’m not proud of this, but I made it so you won’t have to:

Craig at Elmwood Electronics very kindly gave me an ADABOX 006. It’s based around Adafruit’s Circuit Playground Express which just happens to feature a small built-in speaker, IR remote control and the ability to play back audio samples. You see where this is going, don’t you?

If you must make this, the code and samples are here: circuit_playground_express-ir_remote_fartbox_unfortunately.zip. You’ll also need to install the Adafruit CircuitPython IRRemote package into the lib/ folder of your Circuit Playground Express. Point the remote at the board, and it’s left arrow to fart, right arrow to chuckle.

The package includes CC0-licensed samples downloaded from Freesound.

MQTT Talk tonight

I’m talking at the Raspberry Pi Toronto Meetup tonight, and if all goes well, the Net-Connected Cowbell will make an appearance:

My slides: MQTT.odp

Links:

Soltec HM-102S: unboxing a 30 year old multimeter

Graham Green had a stall at Make Change yesterday. Graham’s the former manager of Active Surplus, the much-missed Toronto surplus emporium. He had some military-surplus multimeters that hadn’t seen daylight since I was in school. That’s a while back: this (unfortunately) was #1 the week I left school. So I bought one of Graham’s meters just to see what was inside …

Neatly packed in mil-spec cardboard with a date code of 7/86. There’s a fair chance that Papa Don’t Preach was on the radio somewhere when this was sealed …

Inside the box, the meter’s sealed in a pouch. Mil-spec doesn’t allow anything to rattle about, after all. Unlike some surplus stuff, this looks 99.999% mouse-piss free

Under the meter was this battery pouch, which exhibited the qualities of both “crunchy” and “squishy”. Neither of these are things I look for in a battery, so these weren’t going in the meter

Battery pack dated January 1986. This isn’t going to be good.

Daylight — for the first time in 31 years! On first glance, everything looks okay, but three decades of phenolic off-gassing was much in evidence — pew!

Despite the hermetic seal, the elastic band had rotted to dry pasta consistency. Note expired band ichor on the manual cover

The test leads are still bright, shiny and very pliable. I suspect they might be silicone-encased, as PVC of this age has a habit of turning brittle (ask me about my late lamented Konix Navigators)

The meter. unpacked. A clear (if small) dial, complete with mirror scale to reduce parallax error in reading. Hidden under the frosted cover is a small “Made in Korea” mark

Handy-dandy fold-out carrying handle that also doubles as a stand

Inside the case, ancient tooling marks. The plastic is thick and seems fairly robust. The captive mounting screw was a nice touch

A very analogue meter. Lots and lots of 1% tolerance resistors on the main board, plus a great big thumbwheel potentiometer for zero adjustment. The foam battery pad up top was as good as new

Up and running: no auto-off battery saving mode here! The test lead jacks didn’t have the shrouding we’d expect these days, so you won’t be able to use newer probes without modifying them

Things I Don’t Miss from Analogue Meters, #1: setting the 0 Ω point. Expect fiddliness and drift.

The test subjects: a 3.6 V Li/SOCl₂ ½-AA NVRAM battery (new: tests at 3.68 V on an Agilent U1242B meter), a 7.5 kΩ ± 5% resistor (tests at 7.52 kΩ) and a 39 kΩ ± 10% resistor (tests at 41.3kΩ)

Battery test: the Soltec reports 3.8 V, or within 5% of expected. This is where I really miss auto ranging

Not so good is the 7.5 kΩ resistor: the Soltec reads just under 6 kΩ. Blame faulty zero setting from me, as it really is fiddly and I just set this up quickly.

The 39 kΩ resistor (which is really more like 41 kΩ) indicated 34 kΩ on the Soltec. Again, my dodgy zero set is most likely to blame, but reading this little log scale isn’t the easiest

Would I recommend the Soltec as a general purpose meter? Not really. There are more capable multimeters available for about the same price, and you don’t need to go as far as the unbelievably expensive Agilent DMM I use (or even the strictly ornamental analogue ex-Forces Bach-Simpson 635 multimeter that graces/clutters my workbench). It would need a video to show where analogue meters excel: in showing changing values and getting a rough idea of the limits. It would make a great battery tester, or — if coupled with a micro-controller with PWM or DAC ouput — part of a demo rig. If nothing else, it’s a great way to learn how to appreciate modern test gear and all it does for us.

I’m probably going to regret this, but here’s a scan of the Soltec HM-102s manual:

PDF link under image. I say I regret doing this, ‘cos every cheapo ebay seller of these things is now likely to download this and splat their own horrid watermarks over it, making the file huge and ugly. But the market’s gonna market, and I wouldn’t want to make a free manual inaccessible with DRM. By contrast, my watermark’s quite tasteful and doesn’t interfere with readability in any way …

Postscript: you think I’d just throw away that expired battery pack without peeking inside? If so, allow me to call you Wrongo McWrongison of that erroneous ilk! The ‘Hipower Super’ cells weren’t looking so super: the leaked electrolyte had dried into a gritty, stinky layer. I couldn’t even find the terminals on the 9 V battery to try and test it, so grotty was the corrosion. Amazingly, the slightly-less-nasty AA cell at the front tested at 1.52 V, almost as good as it could have been in the mid-80s. Doesn’t mean it’s not going in the HHW bin with the others, though.

Teensy USB Keypad

in which I finally learn about Fritzing’s wire alignment facility …

I’ve had a couple of Teensy boards for a while, but a misunderstanding that they needed a load of of extra software installed (they need one thing, and it’s easy) had kept me away. They’ve got really impressive specs, and they’re especially easy to turn into USB devices like keyboards.

Super-heavy CEECO keypad

Here’s a little demo that turns a phone keypad — in my case, a ridiculously solid CEECO solid metal keypad designed for institutional use — into a simple USB keyboard. Plug it into any machine (including a Raspberry Pi) and it will be identified as a keyboard. No drivers are required.

The code is based on the standard Arduino Keypad library basic demo. That code was meant for a different keypad, so I eventually found a configuration that worked in the Sparkfun 12 button keypad datasheet. Rather than printing characters to the serial port, I used calls to Teensy’s USB Keyboard library instead.

The pinout is (from left to right, key side up):

  1. do not connect
  2. Column 2
  3. Row 1
  4. Column 1
  5. Row 4
  6. Column 3
  7. Row 3
  8. Row 2
  9. n/c

There’s no reason why this wouldn’t work with those very cheap 4×4 button matrix keypads for Arduino too with only minor modifications. Those keypads use 8 data lines, and they’re arranged (I think) as rows 1-4 on pins 1-4 and columns 1-4 are pins 5-8. columns 4-1 then rows 1-4 from the top of the pin connector down:

The Teensy USB keyboard isn’t limited to sending single characters: a single button press could trigger sending a whole string. I haven’t yet thought out any major uses for this (except “Crypto!”, which is my usual idea when I have no idea what I’m doing), but you might have better plans.

Update, 2020-04: These keypads don’t have diodes on every key to prevent key ghosting if you press multiple keys. Despite what the Arduino Playground Keypad section might tell you, you can’t do useful multi-key/rollover detection with them.

Important research: was the Eudora “New Mail” chime from Ren & Stimpy’s “LOG”?

Inspired (obliquely) by this Metafilter post, I set out to answer a burning question.

LOG chime

This occurs from second 36 to second 38 of this video:

The chime when extracted without further processing, sounds like this:

(direct link: Original-Log-Commercial_The-Ren-and-Stimpy-Show.wav)

Eudora chime

I found a copy of Eudora Mail 1.44 for Windows (bundled up in an archive quaintly called “internet.zip”) here. The EUDOR144.EXE file is itself a Zip archive, and contains several files. The important one is WEUDORA.EXE (722,944 bytes; SHA256 checksum a35f2ef1e95242228381d9340fff0995f4935223f88a38b9200717107252dfb9).

This is a Windows 16 “New Executable” (NE) file, and I used panzi/mediaextract to scan and extract the RIFF/WAV data:

(direct link: WEUDORA.EXE_000a8200.wav)

They sure sound similar. But are they … the same?

Comparison

I made sure that both samples were set to the same rate, and I applied simple amplification in Audacity so that they both had a peak volume of -3 dB. Aligning the tracks as best I could, I got this:

Log audio on top, Eudora chime underneath

The Eudora sample is very slightly slower than the Log one. It might have been that the Eudora authors sampled the chimes from an analogue video tape. The match is remarkable, however, as they play together with only very slight phasing effects:

(direct link: Log_vs_Eudora-log_left-Eudora_right.wav)

Conclusion

Yes, the Eudora Mail “New Mail” chime did come from Ren & Stimpy after all.

BASIC on the 6502 badge

As if it weren’t nerdy enough, the 6502 40th Anniversary Computer Badge runs Lee Davison’s EhBASIC. There are 1024 whole bytes free for your programs, so it’s not exactly spacious. It’s got useful floating point support, though:

Yup, that’s the second most boring BASIC example program, after the quadratic root finder.

100 REM HERON ROOTS
110 EP=0.0001
120 INPUT "X";X
130 N=1:RN=X/2
140 PRINT"COUNT","ROOT","DELTA":PRINT"======","======","======"
150 DE=ABS(RN*RN-X)
160 PRINT N,RN,DE
170 RN=(RN+X/RN)/2
180 N=N+1
190 IF DE>EP THEN GOTO 150

Update: Josh got my badge working again (it wasn’t, for $reasons …) and I re-ran this code. If you try the code for X=100000 and larger, it won’t converge. You might want to add:

185 IF N>25 THEN PRINT "EPSILON TOO LARGE, EXITING":END

so that the loop will exit after 25 times. Alternatively, make the value of EP depend upon the size of X. Aren’t numerical analysis and floating point foibles fun?