Flat Earth Catalogue


hard-won Chrome sync knowledge
Meta-meta-update: Now things again don't work the way I said they did. I'm pretty sure Google's hardward has learned of good and evil, and chosen the latter.

Meta-update: now things again work the way I said they did when I wrote this an hour ago. Eye. Roll.

Update: now nothing works the way it did when I wrote this half an hour ago. I dunno. As long as my two machines aren't turning each other's extensions on and off, I'm happy.

Enabling/disabling a Chrome extension syncs or not depending whether you have "sync settings" on, not whether you have "sync extensions" on. Syncing extensions just literally means having them available or not.

Meanwhile, even if you have "sync settings" on, settings for syncing do not sync; they are per-machine.

Hard-won non-administrator, Sierra Mac, on a Windows fileshare, Chrome user knowledge

Chrome hangs while quitting: Kill the hung processes. Restart Chrome. Sign out of it. Open and close a couple times as the default user. Now will signing back in work? Let's see.

Sierra no longer believes in the right-click workaround to shut down "Are you sure you want to open it?": defaults write com.apple.LaunchServices LSQuarantine -bool false and log out and in again.

"Keep in Dock" doesn't work: delete, rename, or move ~/Library/Preference/com.apple.dock.plist and restart. Congratulations, you have a shiny new default dock full of crapware! Now fix all the crap! Also, try putting program in Dock by dragging the actual app icon into it, rather than by starting it and right-clicking your way to "Keep in Dock".

Centrally managed password changes, leaving Apple-specific keychains behind: Applications/Utilities/Keychain\ Access.app and select "login" from the list of keychains. Edit>>"Change Password for Keychain 'login'" and fill out the old and new passwords.



log likelihood ratio explained in Perl
sub llr { # could be optimized to save storage, at cost of readability
  my ($both, $one, $other, $all) = @_;
  # complete a crosstab w/ marginals
  my $one_not_other = $one - $both;
  my $other_not_one = $other - $both;
  my $not_one = $all - $one;
  my $not_other = $all - $other;
  my $neither = ($all + $both) - ($one + $other);
  # expected counts, from marginals, assuming independence
  my $exp_both = ($one * $other) / $all;
  my $exp_one_not_other = ($one * $not_other) / $all;
  my $exp_other_not_one = ($other * $not_one) / $all;
  my $exp_neither = ($not_one * $not_other) / $all;
  # score the difference from independence
  return 2 * (
    $both * log($both/$exp_both) +
    $one_not_other * log($one_not_other/$exp_one_not_other) +
    $other_not_one * log($other_not_one/$exp_other_not_one) +
    $neither * log($neither/$exp_neither)
} # counts ($both, $one, $other, $all) -> log-likelihood ratio

Depending on your data, it's possible for expected values to be zero, which blows up when you try and divide by them. To be exact, you'll have problems if $one == 0 or $other == 0 or $one == $all or $other == $all. A rather ugly fix is to increment all the numerators and denominators before dividing. Maybe you could add some epsilon earlier on, instead.



Accusations against 鲁炜, till recently Director of the Cyberspace Administration of China




We didn't start the fire
It was always burning since the world's been turning

We didn't start the fire
No we didn't light it, but we tried to fight it

A crude conversion, without proper word spacing:

yǐ quán móu sè, yáng fèng yīn wéi, móu qǔ lì yì, shòu huì fàn zuì,
dà gǎo tè quán, háo wú dǎng xìng, gōng qì sī yòng;

sì yì wàng wéi, mù wú guī jǔ, yǐ quán móu sī, wéi fǎn jì lǜ,
qī piàn zhōng yāng, gè gè jiē wú, qíng jié yán zhòng.

wàng yì zhōng yāng, bù zé shǒu duàn, yě xīn péng zhàng, xiàng xiàng wéi fǎn,
pǐn xíng è liè, zhuān héng bá hù, xìng zhì è liè, shōu shòu cái wù;

lā bāng jié pài, nì míng wū gào, shōu qián liǎn cái, zuò fēng cū bào,
gān rǎo xún shì, háo wú lián chǐ, duì dǎng bù zhōng, lǐ xiǎng quē shī.



Hard-won knowledge for printing from Ubuntu
sudo /etc/init.d/cups restart

Otherwise you won't be able to do anything.


Hard-won knowledge for convenient SSH
So I can't ssh straight into my department anymore. I have to go through a jump server the college operates, so they can 2-factor authenticate me. Annnd then I have to go through the department's gateway, since the machines inside don't have domain names.

Here's how I've made that less a pain in the butt. It requires ~/.ssh/config, ssh-agent (called in ~/.profile), ssh-add, one invocation of ssh-keygen, and an invocation or two of ssh-copy-id.

1. Set up the config file. Give each host a handy short name, specify the hostname if it has one, give it the User parameter if your username there is different. This way you can just say "ssh shortname" And give a ProxyCommand parameter for anything that has to be proxied through another machine: ProxyCommand ssh -A -W %h:%p

2. To your .profile add: eval `ssh-agent -s` # or -c if you run a C shell or similar. Also, to start the agent for your current login, issue that very eval command. The agent remembers identities you have and uses them for authentication.

3. If you haven't already (check .ssh/ for a .pub file containing your public key), make a keypair with ssh-keygen. This keypair will prove to the hosts that you're you.

4. ssh-add in order to give that identity to the agent. It will hold it for some configurable length of time. You'll need to type the passphrase to unlock the identity if that lifetime expires.

5. ssh-copy-id # for each host you want passwordless login to. The -A switch in the ProxyCommand tells the proxy to forward authentication requests from said host back towards you.

So now I type "ssh my-lab-group-server" with great satisfaction. The config file takes care of imposing the right username and proxying my way in, the authentication forwarding and my ssh-agent prevent password prompts on department machines, it almost entirely Just Works.

The one thing I'm missing is that I can't do passwordless login to the original college jump server. They only allow that if your second factor is Duo Push on a smartphone, which I don't do. So I do have to type a password there, for now. But once I'm past that, all the department machines know and respect my keypair, so as long as the agent has it loaded I face no further rigmarole.

OK, the one other thing is I have to do this from within my crouton chroot, since the ChromeOS CLI facilities are ... let's say deficient. But I'm starting to just have crouton open all the time anyway, for the same reason.


Hard-won R knowledge for Inter-Rater Reliability / Inter-Annotator Agreement
I have each item on a row, and then I merge my raters with one column per rater, like any sensible person would do, but of course R's irr library doesn't like that. Eyeroll.

Importing the file as a character matrix: test_matrix <- as.matrix(read.table("Documents/IRR-trial-run.txt", sep="\t", colClasses="character", na.strings = "", row.names="V1")) IRR package: > library(irr)
Error: ...
# employ profanity
> install.packages('irr')
# answer some questions
> library(irr)

> kripp.alpha(t(test_matrix), method="nominal")
# Note the t() that transposes the matrix. Our ever-logical friend R expects each rater to have their own row, and each item to have its own column. Because of course it does.


Learn to Open Master Locks.
Master brand combination locks are widespread and not great. Here's a program to practice the mental math involved in cracking them. Use this information for good, not evil.


use strict; use warnings;

# generate a Master-type combination
my $first = int rand 40;
my $third = ($first + 4 * int rand 10) % 40; # congruent to first mod 4
my $second = ($third + 2 + 4 * int (1 + rand 8)) % 40; # congruent to first+2 mod 4, not equal to third +- 2

# front disc is serrated so third number can't be found just by tensing shackle and turning dial
my $true_gap = $third % 10;
my $false_gap = ($third + 1 + int rand 9); # non-identical digit

# give discoverable clues
print "\n", 
  "back disc rubs at ", ($first + 34) % 40, ".5\n",
  "front disc catches at ", join(' and ', sort {$a <=> $b} ($true_gap, $false_gap)), 

# candidate thirds
my %thirds = map {$_ => 1} 
  grep {
    ($_ % 10 == $true_gap or $_ % 10 == $false_gap) and 
    $_ % 4 == $first % 4
unless (exists $thirds{$third}) {print "     this program is broken     \n\n"; exit 1}

# user silently calculates first number
# user calculates candidate thirds

while (scalar keys %thirds) {
  print "enter candidate for third number: ";
  my $cand = 0 + <STDIN>;
  if ($cand % 10 != $true_gap and $cand % 10 != $false_gap) {
    print "not congruent to a gap\n"; next
  if ($cand % 4 != $first % 4) {
    print "not congruent to first number\n"; next
  delete $thirds{$cand};
  print "accepted\n";

# user tries each candidate on the lock, under tension
print "\nthat's all of them. $third has the most play\n\n";

# user must try up to eight possible second numbers
print "you have eight guesses. enter each combo with whitespace between numbers";
for (1..8) {
  print "$_. ";
  $_ = <STDIN>;
  /(\d\d?)\s+(\d\d?)\s+(\d\d?)/ or next; # perl-haters, there's your line noise
  if ($1 == $first and $2 == $second and $3 == $third) {
    print "\nsuccess!\n\n";
    exit 0

# how to fail
print "\nsorry, you're out of time. the combination was $first $second $third.\n\n";



Installing Factor
In Ubuntu Trusty Tahr, these are the machinations whereby I got the Factor X11 listener (better known as a REPL) running:

Download, gunzip, and untar the binary package. tar -x by itself apparently just sits around, you have to tell it tar -xf because telling it that you want to extract files does not carry the implication that you want to extract them from somewhere.

At this point ./factor chokes to death:

./factor: error while loading shared libraries: libgtkglext-x11-1.9.so.0: cannot open shared opject file: No such file or directory

To fix that, [if you have not updated your apt-get databases in a while, start with sudo apt-get update, and then] sudo apt-get install libgtkglext1

Now you can have a different problem. Now the error is

Cannot resolve C library function
Library: DLL" /usr/lib/libgtk-x11-2.0.so.0"
Symbol: gtk_init
DlError: none
See http://concatenative.org/wiki/view/Factor/Requirements
(U) Quotation: [ c-to-factor -> ]
    Word: c-to-factor
(U) Quotation: [ [ catchstack* push ] dip call -> catchstack* pop* ]
(O) Word: command-line-startup
(O) Method: M\ gtk-ui-backend (with-ui)
(U) Quotation: [
       OBJ-CURRENT-THREAD special-object error-thread set-global
       current-continuation -> error-continuation set-global
       [original-error set-global ] [ rethrow ] bi

As you can see from the stack trace, we're now failing during the execution of actual Factor code. Exciting!

The Internet suggests that this might be fixed by installing gtkglext-devel (a package which turns out not to exist).

The Internet then suggests that it can be fixed from the command-line listener. Here IN: scratchpad represents the listener's prompt.

./factor -run=listener
IN: scratchpad "gtk.ffi" reload
IN: scratchpad save

Now, by the way, you will probably want to exit the listener, which is done by executing the command

IN: scratchpad return

Now your attempts to run ./factor will barf out a different error, in that the symbol that cannot be resolved is gtk_gl_init instead of gtk_init. Everything else is the same.

At this point I thought it a good idea to try and visit the Requirements page that was mentioned earlier. Cleverly, the main Factor website and the "Getting started" page do not see fit to link it. But now the secret is out. The requirements page lists a whole bunch of prerequisites:

sudo apt-get --yes install libc6-dev libpango1.0-dev libx11-dev xorg-dev libgtk2.0-dev gtk2-engines-pixbuf libgtkglext1-dev wget git git-doc rlwrap gcc g++ make

Also a helpful "Note that if you are using a proprietary OpenGL driver, you should probably leave out the libgl1-mesa-dev package in the list." A moment's rereading will reveal that there is no libgl1-mesa-dev package in said list. You should probably also leave out the all-the-other-packages-real-or-imaginary-that-are-not-in-the-list package in the list.
At any rate, once I'd installed those, or at any rate the ones that I don't already have, calling factor without an argument finally did bring up the X11 listener. 
For my next adventure, I'll find out whether that listener genuinely works, or if it's just good enough to load. But for today I've converted a reasonable amount of enthusiasm for Factor into an unreasonable amount of eye-rolling, so I'll knock off here.



Installing Lingua::Wordnet
Eight years later: My views on same-sex marriage, and on judicial remedies, have changed.

But anyway, I'm here to talk about the Perl module Lingua::Wordnet. I am installing this in a local::lib and a good thing too, because my sysadmin would not put up with this much nonsense.

After unpacking it, you have to go into the scripts directory and run convert_db.pl in order to turn the WordNet data files into Berkeley DB files. If you intend to put your DB somewhere other than the default, which if you're not the sysadmin you do, you have to create that dir first.

Now you can make.

Next, Wordnet.pm hard-codes the location of the DB, so you'll have to change that.

Now you can make test. And fail the tests.

Next, the tests hard-code a DB offset for a synset, which is correct as of WordNet 2.0, 12 years ago, but is not correct for, say, WordNet 3.1 (in which it's 00472688%n OBVIOUSLY). So you'll want to stick a line into the early reaches of t/01.t that will look up the synset "baseball","n",1 and die printing its offset. Then you'll have to edit that into 01.t and 02.t.

Next, in 01.t, test 5, the familiarity of 'boy','n' is now 3, and 02.t seems to be crashing during test 6. Maybe.

I'm now searching through 02.t for what goes wrong by the sophisticated process of dying at various points in it. Note: Don't use Ingy's XXX function on any large objects like synsets, wordnet handles, etc. It's awfully slow to die.

Annnd, the statement producing spectacularly unhelpful error messages was $synset2 = $wn->lookup_synset('human','n',2);

Why is that? Because 'human/n' now stops at one synset. Crap on a cracker.

AHHHH! All the tests pass now! That only took 90 minutes of groveling. Now we can make test. Let's try make install and see what new horrors await.

... no new horrors. make clean for good measure. Annnd the module runs!


Same-Sex Marriage and Creeping Totalitarianism

Same-Sex Marriage and Creeping Totalitarianism
Nathan Ellis Rasmussen
27 October 2008

Recent public debate over legal same-sex marriage has largely centered upon its effects on individuals. Just as important, I believe, are matters that have been discussed only secondarily, matters of the relationship between society and State. Specifically, I believe that the steps necessary to institute legal same-sex marriage represent an unusual and worrisome expansion of the State's claims to authority and status.

Defining Totalitarianism

The word totalitarian conjures up specters from the last century—images of leader worship and revolutionary violence, of prison camps and secret police. But these are the incidents of totalitarianism, not its essence. Their different forms rise from a common root: A philosophical stand in which the State is pre-eminent, in which it may exert whatsoever power it will, in which its claim upon the bodies and minds of its subjects may not be excelled. That is the common heritage of Fascists and Bolsheviks; that is totalitarianism.

What, then, do I mean by creeping totalitarianism? Simply this: the extension of State power to new domains, the reduction of competing authorities, or the consolidation of State power that had been dispersed. Creeping totalitarianism is a stepwise, slow, even covert movement toward the position of control described above, a quiet and gradual betrayal of liberty. I believe that as many as three such extensions are threatened by the same-sex marriage laws currently being debated: While instituting same-sex marriage, the State must co-opt its competition and promote legal positivism, and it may also diminish democracy.

Co-opting the Competition

Statehood is not a new invention; human society has included organized states for thousands of years. But the natural family is older yet. It is “the natural and fundamental group unit of society” (Universal Declaration of Human Rights 16.3), and its popularity was in no way reduced by the invention of the State. Family environment has a profound, lifelong effect on a person’s values and worldview, creating loyalties and priorities stronger than any the State can induce. Indeed, as G. K. Chesterton observed, “it is the only check on the State that is bound to renew itself as eternally as the State, and more naturally” (Collected Works 4:256, cited by Carlson, in Wardle, Lynn D., ed. (2008). What's the Harm?: Does legalizing same-sex marriage really harm individuals, families, or society? Lanham, Maryland: University Press of America).

Both the Bolsheviks and the National Socialists appear to have understood this well. In the former case, steps were taken to socialize nearly all aspects of domestic life, from child care to laundry, as a step toward the entire abolition of family. In the latter, apart from the sterilization and murder of those whose procreation was deemed unworthy, plans were drawn up for government management of others, and propaganda emphasized that bearing children was public business, a service to the State. Both schemes envisioned a family unable to challenge the supremacy of the State.

It is therefore with a wary eye that I look upon any legislation that purports to subordinate the family to the State. In claiming the power to redefine family, and especially in equating the natural family to an arrangement that cannot “renew itself […] more naturally than the State” (ibid.), the State appears to have moved against the most ancient check on its power.

One might argue that legislation rejecting same-sex marriage likewise asserts State power over the family. That it does. But we have recognized for centuries a general power of the State to regulate marriages of the customary sort, and that power is not extended merely by an explicit legal description of the marriages so regulated.

Promoting Legal Positivism

Previously, of course these marriages were not described by law; they were described by tradition or religion, and presupposed by law. This is entirely unexceptional in history; in addition to these authorities, custom, nature, reason, and others have taken a part in creating legal concepts as diverse as nation-states, warfare, treaty, property, and arrest. Courts have humbly and realistically acknowledged this, in appeals to "community standards" and in other ways. But in order to create a novel form of marriage, the State must exalt law in defiance of these other authorities and declare that marriage is its sole creation. Such a declaration tends toward the notion that law is the sole source of legal concepts, that a legal concept is only to be accepted as it is created by some positive provision of law, and that authority makes a law valid, independent of any connection to exterior factors such as ethics or reason. This notion is called legal positivism.

Legal positivism is ridiculous upon examination. No positive provision licensed the proclamation of the Bear Flag Republic, the war that took the American Southwest from Mexico, or the Constitution that allowed Congress to create the State of California. That State exists by custom and tradition; it exists because we say it does, and we act as though it does. But the flaws of legal positivism do not stop at ridiculousness.

Legal positivism disrupts a balance of power. Legislating same-sex marriage will cause conflict with dissenting religious organizations, because it exalts law over religion; it will chill any thoughtful discussion of family structure in a public venue such as a school, because it exalts law over reasoning; and it will have unforeseen effects on the psychology of children raised where received tradition, generally observed custom (for same-sex marriage has never been widespread even where legal), and their own most likely natural inclination say that two marriages differ, but the State proclaims otherwise. Such legislation may create chaos in law, as where Massachusetts asserts that marriage is defined by its laws, and then in fact has no law defining it; and further chaos in the significance and teleology of the very institution it claims to define, as where two straight Toronto men got married for tax purposes, with intent to divorce upon engagement to women.

Most dangerous is the message implicit in legal positivism. If the State can legislate same-sex marriage despite these other authorities, law itself becomes the standard of rightness. No authority can resolve the chaos created above, for no authority has traction upon the law to impeach or critique it. Law can be arbitrary, and there is no 'should' except what is: A thing is right because it is legal, rather than being legal because it is right. If we previously saw the State attempting to control its organizational rival, this is a broader move against its moral rivals, and a dangerous assertion of ownership over the minds of the populace.

Diminishing Democracy

Were all of this the democratic action of the society, acting through the State, it would still be unwise, but it might not be worth protest. But this has not necessarily been the case. Consider the recent experience of California: Proposition 22, a statute explicitly confining marriage to mixed-sex couples, was adopted by initiative in 2000. At that time, 14.7 million people were registered to vote there. Turnout in the election stood at 54%, and the measure passed with 61% voting in favor (an unusually large margin for a vote), i.e., with 4.8 million thinking citizens backing it. In 2008 it was overturned by four of the seven justices of the California Supreme Court. Certainly the disproportion smacks of Judge-knows-best paternalism and the denial of popular sovereignty; but more alarming still is the constitutional effect of the ruling, which subtly defies the separation of powers.

The Constitution of California presumes that marriage is heterosexual, a point conceded by the majority of the Court. Justice Baxter, in a partially dissenting opinion, summarizes the reasoning that led the Court to overturn that presumption: "The majority relies heavily on the Legislature’s adoption of progressive civil rights protections for gays and lesbians to find a constitutional right to same-sex marriage. In effect, the majority gives the Legislature indirectly power that body does not directly possess to amend the Constitution and repeal an initiative statute" (In re Marriage Cases, California Supreme Court, S147999, Concurring and Dissenting Opinion by Baxter, J., p. 1). The Constitution of California does not permit the Legislature to repeal an initiative, but the Court here contends that it has had the same effect, not only legally but with constitutional force, through other statutes it has passed.

I believe the Court would not permit the Legislature to amend the Constitution by majority vote, or rather would not construe the Legislature as having done so, in another case where such amendment went against its own inclinations. Rather it would enforce the constitutional prohibitions strictly. But when legislative powers depend not on the Constitution but on the inclinations of seven judicial officials, it looks very much like a small, relatively unaccountable elite has assumed the power to alter any law and is using the legislative body to give the changes the scent of democracy. Such situations are sadly familiar to readers of history. The chief difference here is that the legislative rubber-stamp has been inferred from prior actions, seized as it were, rather than given explicitly in the present.

Baxter continues: "History confirms the importance of the judiciary’s constitutional role as a check against majoritarian abuse. Still, courts must use caution when exercising the potentially transformative authority to articulate constitutional rights. […] Judicial restraint is particularly appropriate where, as here, the claimed constitutional entitlement is of recent conception and challenges the most fundamental assumption about a basic social institution" (ibid., p. 7). And nowhere is such restraint more warranted than where the citizens, fount of sovereignty, have intervened firsthand, where the Constitution prohibits a more-accountable branch of government from undoing their intervention, and where the alternative to restraint explicitly elevates that branch of government from its constitutionally subordinate position. The true rulers of California have taken back the issue of marriage from their delegates in government, and a judicious judiciary must leave it in their hands: "If there is to be a further sea change in the social and legal understanding of marriage itself, that evolution should occur by […] democratic means." (ibid., p. 1).

The people of California, incensed by the Court's usurpation, have placed the wording of Proposition 22 in a constitutional amendment, this year's Proposition 8. It represents their last good chance to peacefully assert the sovereignty of the citizen over the officers of government, to remind them that they are the instruments of society and not its masters. Thereafter they will have recourse only to that terrible right and duty spoken of in the Declaration of Independence: "When a long Train of Abuses and Usurpations, pursuing invariably the same Object, evinces a Design to reduce them under absolute Despotism, it is their Right, it is their Duty, to throw off such Government, and to provide new Guards for their future Security." I pray such a revolution will never be necessary; but, should it come, I trust in the victory of freedom.


On a personal note, I have lived in former one-party states: Twelve months on Taiwan, when one-party rule by the KMT (1950-1986) had been history for twenty years, and twenty-five months in Ukraine, when memories of the Soviet Union (1922-1991) were half that age. Meeting the people of these lands and hearing their histories has left me with a great wariness, healthy I believe, toward the expansion of government power, either over other institutions or over the minds of the populace, against or in avoidance of a reasoned, democratic mandate. Unfortunately, in our day, would-be tyrants from both ends of the political spectrum push for exactly that. Threats may come equally from an executive who asserts that human rights, civil liberties, and international good faith somehow compromise national strength, or from a judiciary aggrandizing the power it holds, the tool it wields, and the organization that serves it. Let us be discerning of all, skeptical toward either, and resolute in defending our democracy by ballot, boycott, or any other appropriate means, for eternal vigilance remains the price of liberty. It is not too high a price to pay.


Thanks to Emily Dyer, for inviting me to write an essay on same-sex marriage; to David Nance, for sparking my thoughts with a comparison to the Equal Rights Amendment; to Jenny Heintz, for reading a draft; and to Kristin Aten, for drawing Baxter's opinion to my attention. I owe much of the argument about legal positivism to FitzGibbon, in Wardle 2008. I am also indebted to W. H. Auden for "There is no such thing as the State/And no one exists alone" ("September 1, 1939").


Copyright 2008 Nathan Ellis Rasmussen. This essay may be copied and distributed in its entirety (including this copyright notice) but may not be sold. Treaty, statute, and case law may grant you other rights, such as the right of parody or the right to quote excerpts in scholarly work, which this copyright does not remove. The authoritative text of this essay can be found at http://flat-earth.blogspot.com/2008_10_26_archive.html

Labels: , , , , , , ,



Copyright Is Hard.
Not entailing therefore "let's go thieving." (The thing that entails "let's go thieving" is when it becomes generally easier to download a crooked copy than to use a legal one because of the so-called copy protection, a thing that seems to be approaching rapidly thanks to the middlemen's exceedingly strenuous efforts. But I digress.) But copyright is tricky; we've changed the rules so many times, in so many ways, with so many reasons, for so many campaign contributions. Only way to keep track of it all is with a chart.




A Game of Ontological Romance. The theme of Illumination is that the universe is made of belief, and what players believe (within a mutable symbolic Foundation) is what is. Now in playtesting, meant to be the LSD of RPGs.


Alton Brown on Beans
This episode on beans contains much science and wisdom that I need to absorb. My own attempts at cooking beans have been lackluster, and with this I can understand why. That said, transcribing all the little jumps, cuts, visuals, and everything, all the time, is pretty annoying. It reminds me why I divorced TV in the first place. But even so, this is good stuff. If I still watched TV, if I even had a TV set, I would watch Alton.




3D Computer-Aided Modeling in Sugar
I know exactly who I would send this awesome link to, except he was killed by lightning a couple weeks ago, so I'll post it here, instead. Josh Reed, if they have Internet access where you are, and if you read my blog, check out these guys who built a 3D modeler that prints shapes with hot air in sugar!

Powered by Blogger


(K) 2002-present. All rights reversed, except as noted.

Hard-won technical knowledge, old rants, and broken links from 10 years ago. I should not have to explain this in the 21st century, but no, I do not actually believe the world is flat.