Zonet ZEW1605A linux driversThe ubuntu ndiswrapper tutorial was very helpful. I did need to blacklist the rtl8180 module.
I just finished reading about simulated annealing, and I think I understand now why it's much more generally applicable than simple random restart hill climbing. In the latter you pick a random point in the solution space, consider all the neighboring points, move to the best one, repeat until you're better than your neighbors. Then repeat the whole process, remembering your best places so far, until you decide to stop. People always talk about the problem with this as "getting stuck in local minima" (with the "down is good" analogy of "gradient descent" instead of the "local maxima" that the "up is good' analogy of "hill climbing" would give) but I didn't really understand. I think now I do.
Consider trying to find the lowest point in a parking lot. The lot is pretty smooth, and pretty consistent, so you could put a soccer ball in the middle and see where it stopped. But what if you chose a ball bearing? The parking lot is smooth on a soccer ball scale, but not on a ball bearing scale. So the bearing gets caught in a low bit (local minimum) while the soccer ball rolls all the way down (global minimum).
In simulated annealing, we use a ball bearing but shake the parking lot so it has a decent chance of getting out of these little pockets and making it's way all the bottom of the lot. So that we don't keep bouncing around for ever, we start off shaking the lot a large amount, and over time decrease our shaking exponentially until we're not shaking at all.
Because simulated annealing decreases the amount of shaking over a very wide range (lots to almost none) it's suitable for all sorts of terrain, from ditches to dents. Hill climbing only works if the terrain is close to smooth.
What would happen if we tried a search system closer to the one with the soccer ball? The soccer ball represents a large portion of the solution space, and at each time step it moves from one set of adjacent points to a new set, under the condition that the highest of the new set of points be lower than the highest of the current set of points. Once could imagine "simulated soccer ball rolling" where one starts off with a giant ball and then makes it smaller over time until one has a ball bearing making tiny adjustments. The biggest problem with this that I see is that rolling a soccer ball requires testing a prohibitively large number of points. Imagine how many points would need to be tested to roll a ball 1/16 the size of the earth over the earth's surface. Worse, there are lots of solutions this search misses because it is strongly biased towards solutions that lie in large flattish regions. Our giant ball rolling over arizona would likely miss the grand canyon.
This diversion with ball rolling aside, I think the part about simulated annealing that really made sense to me is: exponentially decreasing willingness to make things worse is a good fit for a huge range of possible solution spaces.
<a name="2009-10-29"></a><h3>Thursday October 29 2009:</h3>
<div class="pt">
<h3></h3>
</div>
I'd been typing this in by hand, but today I decided to automate
this. It turns out emacs supports the unix date syntax,
so my dates become something like "%Y-%m-%d" and "%A
%B %d %Y:". Very handy. The rest is just inserting characters:
(defun start-news-entry ()
(interactive)
(insert (format-time-string
" <a name=\"%Y-%m-%d\"></a><h3>%A %B %d %Y:</h3>"))
(newline)
(insert " <div class=\"pt\">") (newline) (newline)
(insert " <h3></h3>") (newline) (newline) (newline)
(insert " </div>") (newline))
So now I can just do "M-x start-news-entry" and not delay my
urgent news-thoughts with mindless formatting. Yay.
The rope is to suspend milk crates so they are below the level of the axles and give a nice low center of gravity. I'm considering using bungee cords instead for some suspension, but I need to think about how to be sure they won't stretch enough to touch the ground. I still need to paint the frame and add brackets to attach bungee cords to for holding the load.![]()
The frame is made from 2 and a bit 8 foot 2x4s and is 28.5 inches by 34 inches. Glued and screwed together. Asymetrical because the wheels have different widths. The wheels are the oddball 28 inch (635mm) 700B westwood roadster wheels that came with my flying pigeon. For dropouts I used galvanized steel "mending brackets" from home depot with the dropout slot cut with a drill press and hack saw.
I made two different hitches, one for my bike and one for julia's. For both the hitch itself is a QI250 quick dissconnect ball joint. I patterned the hitch after the bikes-at-work trailer hitch design. On julia's bike I used U-bolts to attach it to the frame:![]()
On my bike I used radiator clamps because the tubing on my frame was bigger than the U-bolts I had and it needed to clear the coaster brake reaction arm:![]()
![]()
Several parts of the trailer are stronger and heavier than they need to be (hitch L-bracket, 2x4s for the frame, big wheels). The towbar arm and hitch ball may be smaller than they should be. Not sure.![]()
if (obj != NULL)
work_with(obj->attr);
else
pester_user("obj can't be null!");
In languages that run in an interpreter, such as Python or Java,
it's possible for the interpreter to make sure you're not doing
anything illegal and raise an exception if you do. In C, trying
to dereference a null pointer is undefined; code may do
absolutely anything afterwards. In Python and Java, though, you
get an AttributeError and NullPointerException instead. This is
because when you write a.b there is low level code that
always runs and checks that a is not null for you. Very
handy. This means I can write a python version as:
try:
work_with(obj.attr)
except AttributeError:
pester_user("obj can't be null!")
The general idea that you should do something, then deal with the
fallout if it fails, gets called "Easier to Ask Forgiveness than
Permission".
There are three reasons, however, why I tend to find it frustrating. One is that to make it work properly I need to know exactly which exception will be thrown if the command fails. So the python statement a[i] will throw an IndexError if a is a list or a KeyError if it is a dictionary. So I need to look or I need to remember. Ugh. Why make me do that? Can this be avoided?
My second issue is that it can hide errors. What if a is an instance of a class I've written that implements __getitem__ to support a[i] syntax, and has an bug in it's implementation that manifests as an IndexError? My code won't see that IndexError as exceptional, but instead just thinks "ok, a is empty".
My third issue is that it's ugly and verbose. I like to write in the 'permission getting' way with:
if key in a:
work_with(a[key])
else
pester_user("key not in a")
while the 'forgiveness requesting' way feels much worse:
try:
work_with(a[key])
except KeyError:
pester_user("key not in a")
(Note that this brings up another issue with basing programming
on exceptions: if either a[key] or work_with
might throw a KeyError, I can't separate them cleanly.)
This is not actually a very good reason to dislike the second example, as it is no more verbose than the first one. Both are four lines, similar number of characters. They differ in that the first case requires me to know the proper check while the second case requires me to know the proper exception to catch. This shouldn't be import either. Do I just need to get used to the way try/except looks?
I'm not sure I can fix the third (it's ugly!) issue, but I think the first two might be fixable. They come from not being able to accurately indicate what I would like to catch. If I see someone write:
try:
work_with(a[key])
except KeyError:
pass
I see that what they intend is very likely "work with
a[key] if it exists". Is there a way we could tell
python that? Something like:
try:
work_with(<a[key] : bad_indexing>)
except bad_indexing:
pass
then distinguishing errors raised by work_with from those
raised by the lookup is clean:
try:
<work_with(<a[key] : bad_indexing>) : work_with_error>
except bad_indexing:
pass
except work_with_error:
pester_user("work with error")
Still not too happy about this, though. Need to think more.
The building is remarkably like SpringStep, a relatively new dance space in Medford where the thursday night contra dance met briefly before spending most of the past few years at Scout House in Concord. Both spaces are very orange, but it's not just the similarity in color. The youth center was designed by Cambridge Seven Associates while springstep was designed by Andrew Cohen Architects. So I don't know how they came to be so similar.
Both are a good bit too modern for my liking.
Mathematics has access to a potentially infinite alphabet (c.g x', x'', x''', ...), but, in practice, only a small finite fragment of it is usable. One reason is that a human being's ability to distinguish between symbols is very much more limited than his ability to conceive of new ones: another reason is the bad habit of freezing letters. Some ols-fashioned analysts would speak of "xyz-space", meaning, I think, 3-dimensional Euclidian space, plus the convention that a point of that space shall always be denoted by "(x,y,z)". This is bad: it "freezes" x, and y, and z, i.e., prohibits their use in another context, and, at the same time, it make it impossible (or, in any case, inconsistent) to use, say, "(a,b,c)" when "(x,y,z)" has been temporarily exhausted. Modern versions of the custom exist, and are no better. Example: matrices with "property L" -- a frozen and unsuggestive designation.The concept of "almost frozen" symbols started being interesting to me once I learned to program. I thought: this is neat; the mathematicians are putting type information in the variable names. Sort of like BASIC (where A is a number, $A is a string, ...). I really like that I can pretty much count on 'n' being a natural number because it makes expressions much easier to read. Someone can just write write "let m = 3n" and without any messy type declarations ("where n is any natural number") I can see that m is divisible by 3. Hamos objects to this thing I'd always thought of as a neat way that mathematical communication was efficient, calling it "frigid rigidity". yikes.There are other awkward and unhelpful ways to use letters: "CW complexes" and "CCR groups" are examples. A related curiosity occurs in Lefschetz. There, x^p_i is a chain of demension p with index i, wheras x^i_p is a co-chain of dimension p wiith index i. Question: what is x^2_3?
As history progresses, more and more symbols get frozen. The standard examples are e, i, pi, and, of course, 0, 1, 2, 3, .... (Who would dare write "Let 6 be a group."?) A few other letters are almost frozen: many readers would feel offended if "n" were used for a complex number, lowercase epsilon for a positive integer, and "z" for a topological space. (A mathematician's nightmare is a sequence n sub lowercase epsilon that tends to zero as epsilon becomes infinite.)
Moral: do not increase the rigid frigidity. Think about the alphabet. It's a nuisance, but it's worth it. To save time and trouble later, think about the alphabet for an hour now; then start writing.
The main part of "almost frozen" symbols that I like is that they make notation more consistent between writers. If everyone uses f to name an abstract function, then it's easier to interpret f in new writing, but fstarts to freeze to that meaning. The reason hamos does not want us to "increase this rigid frigidity" is that "in practice, only a small finite fragment of [the infinite alphabet] is usable." I see this as a tradeoff between running out of symbols and consistency between authors. As long as we're willing to reclaim previously frozen symbols when the fall out of use (which his "xyz-space" example suggests we are) we shouldn't have to worry about running out of symbols.
Did you know that Congo has anywhere from 64 - 80 percent of the world's reserve of coltan, a natural resource that is central to the operation of our cell phones? As we benefit from coltan nearly 6 million Congolese have died in the deadliest conflict since World War Two as a result of the scramble for coltan and other minerals key to the functioning of modern technology. Join us in solidarity with the Congolese people and fast from your phone for an hourSo first, there are some problems I have with this message. It implies that our cell phones are possible only because of exploitation of the congo's coltan (after all, they apparently have most of it). But this is misleading. We care about coltan (called columbo-tantalite elsewhere) because one can extract tantalum from it. The tantalum in cell phones and other sources mostly does not come from the congo. Instead, it's mostly austrailian. With official 2006 figures for the congo showing the congolese fraction at .7%. Even if we were to assume that all tantalum mined in africa was in fact mined illegally in the congo and smuggled out to other countries to be reported in their production figures, the same figures show we would get only 15% of global production.
What is more frustrating, they don't source their "64 - 80 percent" figure, and looking on line I can't see anything about the fraction of coltan reserves in various places. The only place I can find, another usgs.gov report, just says "N/A" under reserves in the congo. I should ask them.
Update 10/22/2009: I asked them about this, and they got back to me:I checked the GAO link and it does say 64%. No indication how the GAO got the number. I've emailed them to ask for details. I also emailed the BBC to ask about their 80% number.
- BBC "Congo's Coltan Rush"
- Niobium Institute - they removed the info from their site about two years ago. We printed it out before they removed it. They claimed that 80 percent of the coltan in the world is found in African and 80 percent of that is found in the Congo
- 2008 US Government Accountability Office GAO Report on the Congo which states 64 percent.
I looked through old versions of the tanb site on the wayback machine. No luck finding the 80% of 80% figure there.
Update 10/27/2009: The GAO got back to me about the 64% reserves figure in report GAO-08-562T:The source for the information you referenced is from "Under-Mining Peace -- Tin: The Explosive Trade in Cassiterite in Eastern DRC," a report by Global Witness, June 2005.This is apparently available online. On page 13 of this document there is the line:Although Australia is currently the largest producet of coltan, it is estimated that Africa possesses 80% of the world's reserves, with 80% of this believed to be in DRC.and the words "64% of the world's known coltan reserves occur in the DRC" are set off in bold type. There is no citation for this estimate.
Is the Second Congo War really "a result of the scramble for coltan and other minerals key to the functioning of modern technology"? This I find somewhat believable, but it does contrast pretty strongly with descriptions elsewhere that have minerals serving as funding sources for the war but not causes.
The real problem I have with this, though, is that it is crazy to expect individual end users of a material to be aware of its effect on the world. People use so many different substances that they can't know where they all came from. More importantly, if I were to avoid all tainted sources (spend more to buy certified australian tantalum, free range eggs, sweatshop-free clothing, ...) that would have a huge cost in both my time and my money. It would be hard to find out what was ok and what wasn't and then actually buying this stuff would be more expensive. The more I spend on this stuff, the less I can give to oxfam. So while I see value in raising awareness of how bad things are globally, raising awareness of specific things like tantalum in cell phones that might come from the congo seems like a waste.
There are two options for trading off quality: you can show smaller frames or fewer frames. It looks like people have done both. These are both technically "Narrow Band Television", but generally the former gets this name and the latter is called "Slow Scan Television". Narrow band is how television started, with very small pictures at full speed. SSTV is more recent, being used by ham radio operators to send primarily still pictures. Both of these are within reach of a sound card and can be done.
For hooking a computer up to a modern but analogue television, SSTV would definitely not work for several reasons. The biggest is that the phosphor on the tv needs to be refreshed very often, and at several seconds a frame the top half of the screen would be long dark by the time the bottom half was drawn. It also seems that while the NTSC format does say the TV needs to sync up to the video input signal, that's mostly for fine correction. Sending the sync signals at a speed 1/150th or so of what was expected by the TV designers is unlikely to work.
Narrow band TV is also not likely to work, but has a greater chance of working. If we can send the syncs proprly, we ought to be able to get it to jump back to the top of the screen after only sending 15 lines or so. This would let us draw a small image, though it would be way stretched. The problem, I think, is that we would need to send the sync signals with greater resolution than we can manage with a sound card.
5.3.4:This is very handy, but is also limited. In python 3.0, PEP 3132 added some related syntax:
If the syntax *expression appears in the function call, expression must evaluate to a sequence. Elements from this sequence are treated as if they were additional positional arguments; if there are positional arguments x1,..., xN, and expression evaluates to a sequence y1, ..., yM, this is equivalent to a call with M+N positional arguments x1, ..., xN, y1, ..., yM
7.6:
If the * is present [in the function definition argument list], it is initialized to a tuple receiving any excess positional parameters, defaulting to the empty tuple
first, *rest = seqThis is again, handy but limited. This star syntax only works in these two cases: functions (star-args) and assignment targets. There are logical extensions that make a lot of sense to me, though. If one can do:
a, *b, c = range(5)
first, *rest = seqthen I want to be able to do:
seq = first, *restWhile the following is ambiguous and so clearly needs to be illegal:
first, *some, *rest = seqthis is not ambiguous:
seq = first, *some, *restWhile we're at it, lets make the following legal:
foo(first, *some, *rest)All these changes together would make for a very consistent and powerful interpretation of * as 'expand this sequence here'.
Looking for historical detail, I find:
The first mention of temperament is found in 1496 in the treatise Practica musica by the Italian theorist Franchino Gafori, who stated that organists flatten fifths by a small, indefinite amount. This practice was formalised in what is called the mesotonic or meantone (also written mean-tone) scale. It was always particularly favoured by organists and explains why organ music from the period the early sixteenth to the nineteenth century was written in a relatively small number of keys, those that this scale favoured. Arnolt Schlick's Spiegel der Orgelmacher und Organisten (1511) described both the practice of and formulae for mean-tone tuning which makes it clear that it was already in use. Pietro Aron produced a more thorough analysis in Toscanello in Musica (1523), which sufficed for all practical purposes. The earliest complete description was published by Francisco de Salinas in De Musica libri septem (1577).Based on C, the method relied on using the first five notes from the circle of fifths from C, namely C, G, D, A, E and setting a pure third between C-E by narrowing the fifths by a small amount - from a ratio of (3:2) to a ratio of (2.99:2). D, the note between C and E was set so that the ratio between D and C was identical to that between E and D, so placing D in the mean position between C and E, hence the scale's name. What happened after this to complete the chromatic scale introduced a number of variants which only the more studious of our readers are likely to pursue. Suffice it to point out that the results generally work well in the keys C, G, D, F and B flat but outside these serious problems arise and composers writing for this system avoided keys more distant from C. -- www.dolmetsch.com/musictheory27.htm#mean
The same source claims a few paragraphs later that "in England, it was not until 1842 that the first organ, that of St. Nicholas in Newcastle-upon-Tyne, was tuned to equal temperament."
I wouldn't say this is resolved yet, but I do think that our choice for the pitch 'C' is probably because that pitch is what you get from a 12" (or 2', 4', 8', 16', ...) pipe.
I didn't find anyone online talking about how they had run their fridge's coils outside to get better airflow and reduce the temperature gradient. This would be especially efficient in the winter, but even in the summer the increased ventilation would help. The downside is that the fridge then is not moveable without detatching and moving tubing. But for houses or apartments where people were not expected tobe moving their fridges much, it could make a lot of sense. A simpler system could involve running heat conductive metal outside or even putting an open tube (with a valve that closed when it was too warm out, and a filter and grate to keep bugs and animals out) straight into the back of the fridge. Hmm.
Putting access to a fridge on the top does appear to have some acceptance already. This makes lots of sense, but it takes up more space. See this chest fridge (pdf) for an example. It uses about 1/10th the electricity of a new conventional fridge (~30KWh/ year instead of ~400). So how to make it take less space? One option would be to revise the fridge to be a pair of under the counter appliances, on the model of a dishwasher. (A pair because each one would then be half the size of a normal fridge.) They would slide out (The front, sides, and bottom would all slide out, as opposed to a dishwasher design where the door folds down and the racks slide out) with a second slidy bit like the upper rack on a dishwasher. The engineering question, then would be how to support the fridge and its contents when it was slid out.
Update 9/8: Thinking more about this, why not design each under-counter component like a dresser? Each drawer would pull out separately and keep cold air from falling out. You would need to design the drawers carfully so opening the bottom drawer didn't let all the cold from the top out. Something like:
This led me to look for "refrigerator drawers". And apparently these exist, but they're really crummy. Consumer reports says:
But you'll pay dearly for those limited benefits. The tested models cost an average of $2,500 (prices range from $1,800 to $3,200) for what we measured as only about 4 cubic feet of usable fridge capacity (none of the models has a freezer). What's more, while fridge drawers cost little to run (about $32 to $42 a year), they're far less energy-efficient than any type of full-sized refrigerator in our Ratings.Looking at the pictures, they're designed to be stylish, but not to keep cold air in. For example in the picture below, the sides don't go all the way up:
It also looks like at least some models have open bottoms:
There are expensive commercial ones that don't, though, so this should be fixable:
Another problem with the drawer models out there appears to be size. A traditional fridge appears to have a volume of around 14 cubic feet, where some of that is the freezer. Models I'm seeing for drawer fridges don't appear to give more that 10 to 12 cubic feet for a side by side pair. So you lose two cubic feet.
| front gear | rear gear | gear inches |
|---|---|---|
| 1 | 1 | 18.6 |
| 1 | 2 | 25.5 |
| 1 | 3 | 34.6 |
| 2 | 1 | 44.6 |
| 2 | 2 | 61.1 |
| 2 | 3 | 83.1 |
For reference, my current gearing is based on approximately 28 inch wheels (622mm rims, largeish tires), a 48 tooth front cog, a 22 tooth rear cog, and a SRAM T3 hub that offers 1st, 2nd, and 3rd at 73%, 100%, and 176%.
The other difference would be the words I know vs the words on wikipedia: (our version is from memory, so it might not be right, but I think it is)
"Popular version" from WP "Rhyming version" from WP Our version Thirteen are the temperaments of god Thirteen are the attributes of hashem Thirteen are the attributes of divinity Twelve are the tribes of israel Eleven are the stars of joseph's dream Ten are the commandments Nine are the months of the pregnant Nine are the months til the baby's born Nine are the festivals Eight are the days of the circumcision Eight are the days til the brit milah Eight are the lights of chanhukah Seven are the days of the week Seven are the days of the week (ooh-ah) Seven are the days of the week Six are the books of the Mishnah Six are the days of creation Five are the books of the torah Four are the matriarchs Four are the mothers Three are the patriarchs Three are the fathers Two are the tables of the covenant Two are the tablets that moshe brought Two are the tables of the covenant (and) One is our god, in heaven and on earth One is hashem, one is hashem, one is hashem! In the heaven and the earth One is our god, in the heavens and the earth
From email_bounce_handler@bounce.convio.net Fri Aug 14 15:42:23 2009
Subject: EFFector 22.23: Locational Privacy -- Who Knows Where You Are, And Wh
Folder: /var/mail/jeff
From nfbvdqanlkuv@c-24-20-39-38.hsd1.wa.comcast.net Fri Aug 14 15:50:36 2009
Subject: Medications that you need.
Folder: probably-spam 2012
From john.smith@example.com Fri Aug 14 16:12:01 2009
Subject: sorry I missed you.
Folder: /var/mail/jeff 1498
From bootsk@lovesaju.com Fri Aug 14 16:29:24 2009
Subject: If you want to change your style, start with a watch.
Folder: probably-spam 2906
From actionlad@bellsouth.net Fri Aug 14 16:29:44 2009
Subject: Save some funk for Sunday
Folder: probably-spam 1510
All I need to do is pretty this up, strip out the probably-spam
entires, and display it as it comes in. So a little python
program, clean_pmlog.py, and
a tail -f and we're set:
email_bounce_handler@ ... EFFector 22.23: Locational Privacy -- Who Knows Where You Are, And Wh
john.smith@example.com sorry I missed you.
I alias wmail to 'tail -f ~/procmail/pmlog | python
~/clean_pmlog.py' and leave it running. Now I hope I can get
away from compulsively running my statmbx program to see if I've
gotten new mail.
Update: After starting to use this, I've realized that the
from address it has is the envelope sender. Which is usually the
same as the sender, unless there's a mailing list involved. So
this is less useful for mailing lists than it could be, especially
when there's lots of traffic on one list and it all has the same
subject. But I run statmbx a lot less now.
Them first section, however, is a mess. Keen angrily derides any system where the information is not provided by paid experts, generally without properly understanding what he is criticizing. His biggest error a misunderstanding of the roles of search and aggregation. This confusion pervades the book, turning ostensibly good things like additional information becoming available online into harms. He rails loudly against google as a parasite [1] and claims any aggregation system not backed by experts narrows our access to information [2] . Then he goes on to complain that with all this amateur content we won't have any way to find what's worth reading. He observes that "the more self-created content that gets dumped on the Internet, the harder it becomes to distinguish the good from the bad" [3]. He asks if "we really need to wade through the tidal wave of amateurish work of authors who have never been professionally selected for publication?" [4] No, each person need not wade through all of it. No, it's not one person's job alone to distinguish the good from the bad. The problem that keen identifies, that the more information there is on the internet the harder it is to make sense of it and determine what is worth reading, is solvable. Blogs, search, and aggregation all solve pieces of the problem, yet keen dismisses blogs as narcissistic, search as parasitic, and aggregation as narrowing.
In the opinion of this non-expert reviewer, keen misses the point.
[1] "Google is a parasite; it creates no content of its own. Its sole accomplishment is having figured out an algorithm that links preexisting content to other content on the internet ... In terms of value creation there's nothing apart from its links." -- p135
[2] "These sites track the reading habits of their community and make recommendations based on the aggregated preferences of the entire community. But such a method cannot be relied on to keep us informed. When our individual intentions are left to the wisdom of the crowd, our access to information becomes narrowed, and as a result, our view of the world and our perception of truth becomes dangerously distorted." -- p94
[3] p31
[4] p56
So I gave in, and use a laptop despite my continued hatred of debugging wireless problems. But I'm not writing this just to admit I had misjudged laptops. I'm writing this because I just installed eeebuntu on the computer and made a bunch of customizations. It's like a new computer. So, changes from the factory xandros install:
Now I just need to figure out how to shrink the firefox status bar.
I also started thinking about what Sameer does with history: all commands typed go both into a full history file somewhere and a .local_history file in the current directory. The local_history idea I don't like, as it clutters things up a lot, but a full history that's more robust than the shell history would be nice. So I added the lines below to my prompt function in bash:
echo "$(date +%Y-%m-%d--%H-%M-%S) $(hostname) $PWD $(history | tail -n 1)" >> ~/.full_historyI think this should work, but it's possible that with appending from multiple places at once it will get clobbered at some point.
I also thought about what commands do I run:
$ cat combined-history | awk '{print $2}' | susrn | head
619 ls
516 find
413 cat
304 python
275 cd
216 svn
215 rm
199 more
130 for
122 svc
Alternately, taking into account all the compound commands I run
by looking at the commands following pipe and semicolon in
addition to line starters:
$ cat combined-history | sed s/'[;|]'/'\nNNN '/g | awk '{print $2}'| susrn | head -n 12
881 grep
620 ls
544 do
536 done
535 sed
524 find
501 python
465 cat
412 while
315 head
283 cd
291 more
(combined-history is the result of running history in each
shell)
Notes:
fname_0006.v0_word 2 fname_0007.v0_word 12 fname_0001.v0_word 15 fname_0002.v0_word 23 fname_0003.v0_word 5 fname_0003.v0_word 7 fname_0005.v0_word 8 fname_0006.v0_word 9 fname_0007.v0_word 11 fname_0005.v0_word 24Imagine further that you want to sort it. Unfortunately, I can't get gnu sort to let me specify which fields are numeric and which now. That is, I can do:
$ cat file.txt | sort fname_0001.v0_word 15 fname_0002.v0_word 23 fname_0003.v0_word 5 fname_0003.v0_word 7 fname_0005.v0_word 24 fname_0005.v0_word 8 fname_0006.v0_word 2 fname_0006.v0_word 9 fname_0007.v0_word 11 fname_0007.v0_word 12Or I can do:
$ cat file.txt | sort -n fname_0001.v0_word 15 fname_0002.v0_word 23 fname_0003.v0_word 5 fname_0003.v0_word 7 fname_0005.v0_word 24 fname_0005.v0_word 8 fname_0006.v0_word 2 fname_0006.v0_word 9 fname_0007.v0_word 11 fname_0007.v0_word 12Or I can do:
$ cat file.txt | sort -n -k1,1 -k2,2 fname_0006.v0_word 2 fname_0003.v0_word 5 fname_0003.v0_word 7 fname_0005.v0_word 8 fname_0006.v0_word 9 fname_0007.v0_word 11 fname_0007.v0_word 12 fname_0001.v0_word 15 fname_0002.v0_word 23 fname_0005.v0_word 24You might think this would work:
$ cat file.txt | sort -k1,1 -kn2,2 fname_0006.v0_word 2 fname_0003.v0_word 5 fname_0003.v0_word 7 fname_0005.v0_word 8 fname_0006.v0_word 9 fname_0007.v0_word 11 fname_0007.v0_word 12 fname_0001.v0_word 15 fname_0002.v0_word 23 fname_0005.v0_word 24But nothing seems to make it do the right thing. So I abandoned sort for python:
$ cat simple_sorter.py
import fileinput
def tidy(x):
try:
return int(x)
except ValueError:
return x
line_bits = []
for line in fileinput.input():
line_bits.append([tidy(field) for field in line.split()])
for bits in sorted(line_bits):
print " ".join(str(bit) for bit in bits)
$ cat tmp.txt | python simple_sorter.py
fname_0001.v0_word 15
fname_0002.v0_word 23
fname_0003.v0_word 5
fname_0003.v0_word 7
fname_0005.v0_word 8
fname_0005.v0_word 24
fname_0006.v0_word 2
fname_0006.v0_word 9
fname_0007.v0_word 11
fname_0007.v0_word 12
Instead of a cable in a housing, one can use a tube of liquid in a hydraulic system:
For the rear brake, it is possible to have rear pressure on the pedals act as a brake. This can either be direct, as in a fixed gear bike, or via a drum and freewheels as in a normal coaster brake:
Then you have the most common internationally, the rod brake. This is used primarily on roadsters and is a very reparable design. It's lever actuated and then either directly pulls up on the pad (front) or pulls through a series of linkages first (rear):
An alternative to the standard rod brake is the style used on swiss army bikes where the rod pushes the brake pad down on the top of the tire instead of up on the rim. It needs a different lever design than the normal rod brake beacuse it's moving the rod in the opposite direction:
Finally, there may only be one bike like this, but Sheldon Brown had a road bike set up with a toe strap taking the role of a cable on a caliper brake:
Last week I played a good bit of guillotine with my cousins, and was thinking some about how in many games the art and story are both a lot of the fun and pretty disconnected from the actual gameplay. One could port a lot of games to a different setting, really. So why not do this with jaguar?
One would need to come up with a good setting. One in which it made sense to have both a visible enemy and a secret enemy. Maybe three humans, an evil computer, and a player who is secretly a robot? Or maybe a mafia setting, where there's three mob figures, the chief of police, and an undercover agent?
Once you have the setting, there are four more bits to port: what the cards mean, what suits are, the bidding phase, and the play. These will of course depend on the setting. Cards could of course represent people, perhaps ones that one was convincing, hiring, or killing. They could also represent places, animals, or powerful objects. Maybe they could represent a mix of these, with high points being one class, low points being another, and trash being a third. You'd need to be able to have four of each thing. The things need to be able to be put together in a group of five such that one of them wins some how. Suits could be something like the colors in magic, representing different power sources, but they could also be districts.
One interesting idea for a setting might be history. Choosing trump would be choosing which time period was dominant. Then leading a suit would be choosing which time period the activity was currently happening, with out of suit play being sensibly ignored and trump meaning pulling people to the trump time period. Not totally sure how this would work.
More thinking needed.
The standard response to something that looks like this is to denounce it as 'derailing' or 'silencing'. The problem is, while a dismissal like that is a good response to the third motivation and an ok response to the second, it removes the first without consideration. Making a position off limits like this limits the discussion unnecessarily.
[ There are other things that also get called "derailing", such as a response of "but I have friends who are X" to "your comment indicates prejudice against X people", and I'm not trying to talk about these here. That sort of "derailing" is dealt with in detail in Derailing For Dummies. Most of these are clearly not useful things to be doing. ]
For an example of how the use of this term can be problematic, look at the discussion of derailing for dummies over at the f-word. The original article calls it "derailing" when women who choose to act in a traditionally female manner are told they're not making a true choice because of internalized sexism. Then a commenter calls it "derailing" when feminists are described as objecting to women acting in a traditionally female manner. By applying the term to argument instead of manner it becomes just an insult.
~/.inputrc:
set blink-matching-paren on
At each intersection, all traffic turns. This means you can't move between places by getting on the street you want and just following it. Instead, to travel paths parallel to the streets you need to weave:![]()
Note that if you want to go diagonal to the streets, as blue does above, this is similar to now. Travel distance between any pair of points is H + V + |H - V|. That is, horizontal distance, plus vertical distance, plus the difference between the two. The extreme cases are the red and blue paths above. In the red case, V = 0, so travel distance is 2H. In the blue case, H = V, so |H - V| = 0 and travel distance is H + V![]()
I don't know how well this would work in practice, but I think it would be pretty good. You substitute constant speed for stop and go, which should minimize both agravating waiting time and inneficient acceleration. You do have a lot of merging, as in the case where each street has two travel lanes you have people going different ways wanting to switch lanes:
Unlike other rotary systems, this does not fail when different directions have hugely different amounts of traffic. Travel consists of moving straight, turning with the road, and merging. In none of these does an unequal traffix flow mess up the system.![]()
Another concern is that this would be tricky for bicycles or pedestrians. I think this works ok for bikes, in that they ought to be able to complete the merges safely, but this would need to be seen in practice. As for pedestrians, we could continue to use the current walk lights, though keeping lights just for that purpose seems silly. Maybe a pure crosswalk system would work? I should ask a traffic engineer.
:: happy ::
And the usage:
cbr@heron ~ $ python concoldiff.py text_A text_B This is an unchanged line This is an unchanged line This is a line with a speleing error This is a line with a spelling error This line was deleted Whitespace shows up where critical Whitespace shows up where critical But it's not shown when not But it's not ugly when not And here I go, adding a line
usage: icdiff.py [options] left_file right_file
options:
-h, --help show this help message and exit
--cols=COLS specify the width of the screen. Autodetection is Linux
only
--context print only differences with some context
--numlines=NUMLINES how many lines of context to print; only meaningful
with --context
--line-numbers generate output with line numbers
--show-all-spaces color all non-matching whitespace instead of just
whitespace that is critical for understanding
--print-headers label the left and right sides with their file names
Improved Color diff: icdiff.py
if x.startswith("foo") for all x in a_list:
...
if is_verb(leaf) for some leaf in a_tree:
...
I usually end up coding these a bunch of different ways, the
shortest of which are:
if False not in [x.startswith("foo") for x in a_list]:
...
if True in [is_verb(leaf) for leaf in a_tree]:
...
But these don't short circut and are ugly. Sometimes I'll write
little funtions but I don't like that either. Currently the
syntax if [expr] for ... doesn't mean anything, so this
should be possible. I wonder if it would be worth writing a PEP.
Update 3/6/2009: George Dahl writes that python already does this. I should be writing those examples as:
if all(x.startswith("foo") for x in a_list):
...
if any(is_verb(leaf) for leaf in a_tree):
...
These examples use generator
expressions instead of list comprehensions. And builtins
any and all. Especially as one can use any
function, not just any or all, this is a much
nicer syntax than what I wanted. It doesn't read as fluidly as
english, but then again it doesn't deal with these two specific
case as special cases of the if statement. So I'm quite happy.
The only other real downside is also I think the reason I didn't end up with this when fiddling around at the python prompt: you need somewhat non-intuitive parens. I'm pretty sure when I was trying to see if there was a way to do what I wanted I did:
>>> x for x in range(7)
File "<stdin>", line 1
x for x in range(7)
^
SyntaxError: invalid syntax
And then moved on. As a human I don't see an obvious reason why I
can't enter the obvious thing. Is there something else a statement
beginning with "x for " could mean?
Basic Idea: Five players end up through a bidding process divided into two teams: the jaguar and their friend against the other three. While everyone knows who the jaguar is, their friend remains secret until choosing to reveal themself. Cards have point values totaling 120, and if the jaguar and friend get more than half they win the hand.
Set Up and Card Values: Take an italian deck of cards or a normal deck with the 10s, 9s, and 8s removed. A dealer deals out five hands, which will come to eight cards each. Which player is the dealer progresses around the circle each hand. The cards are ordered "A, 3, K, Q, J, 7, 6, 5, 4, 2" and are worth points as:
Number Value A 11 "big points" 3 10 K 4 "small points" Q 3 J 2 <=7 0 "junk"
Bidding: The dealer begins with either bidding or passing, as does each player in turn around the circle repeatedly until some bid has not been topped. Once you have passed you may not bid again that hand. Bidding begins with the highest card, the 3, and proceeds down from there. No suits are involved in the bidding. Once bidding is complete, the winner of the bidding is the jaguar. The jaguar names a suit to be trump and the player with the card of the winning value in the named suit is the friend. Note that if the jaguar names a card in their own hand, the jaguar and the friend are the same player. Scoring is slightly different in this case, as you will see below.
Play: Play consists of eight tricks. A trick is a card being led, then each player in turn around the circle plays any of their cards. Bridge, hearts, and spades players should forget those games' rules about following suit. The winner of the trick is the player with the highest played trump card, or if no trump were played the highest card in the led suit. Example: clubs are trump. Player A leads the 6 of diamonds. Players B, C, and D play the 3, 4, and 5 of diamonds respectively. Player E plays the 2 of clubs. Because clubs are trump, player E would win the trick. If clubs were not trump, player B would win the trick. (Remember that 3s are high). Winning a trick means that that player gets the cards contained (which one cares about only for their point values) and leads for the next trick.
Scoring: By the end of the game, all cards have been played and so it is known to all who is the friend and who is not. The point sum for the friend and the jaguar is then compared to the point sum for the other three players, and the winner is the group with more points. The jaguar and friend lose ties. Points are awarded: 2 to the jaguar, one to everyone else. If you win your points are positive, if you lose your points are negative. So on a jaguar victory, the jaguar gets +2, the friend gets +1, the other three each get -1. In the rare case of the jaguar and the friend being the same player, the jaguar gets 4 points while the other four players each get 1. Note that this game is completely zero sum, so players will generally keep running totals across hands. Among well matched players, people will often keep these totals across games with different players.
Table Talk: During the game, table talk is allowed, encouraged, and essential. The jaguar gives instructions to their friend, whoever they may be, often starting with "please don't reveal who you are until I tell you to." The other four all claim not to be the friend and tell each other what to do, arguing about how best to divide points to defeat the jaguar. New players can often learn the game by just playing with four experienced ones and being told what to do without any out-of-game rule explanation. People will probably lie to each other, and this is not prohibited. Lying about the rules, though, is metagaming and is prohibited.
Given that we are always constructing models of problems and nearly always must begin before our understanding is total, times when we must repurpose our code are unavoidable. Then this presents a metric for evaluating a programming style or language: repurposeability. That is, when one writes code in this fashion and finds out that one was solving the wrong problem, how much work is needed to repurpose it to solve the problem one should have been solving all along?
Repurposability is the driving force behind many aspects of good coding style. The avoidance of duplicate code, for example. Say you need to send some debugging output to a file instead of standard output. In java you might have a gui program with hundreds of calls to "System.out.writeln()" that really should be calls to some debug function. So this is a programming style issue. It is also a programming language issue, though. In common lisp one might deal with this problem with a statement equivalent to "in the code called from here, substitute this object for System.out". Similarly in java, you might have hundreds of reads and writes to the object attribute "Foo.bar". The standard arguments for java tell you to make them be to "Foo.setBar()" and "Foo.getBar()" instead, so "if you later change your mind you don't have to change all those references to "Foo.bar". The advice is so to maximize repurposeability. But in python one would solve the same problem by using Foo.bar all along and taking advantage of the ability to wrap it in getters and seters later if needed.
I need to think more about what is needed for repurposeability, but it certainly sounds like a useful metric.
Bash is REPL based. As I build things up in bash that are quite complex I'm always testing as I go. I'll cat a bunch of files, pipe to something else, and if I get anything wrong I notice almost right away. This is very powerful because
Bash puts arguments first. I start with the files I want to work with (cat logs/tuesday/*) then pipe to grep to filter out the ones I don't want, then maybe pipe to wc. All along the way, I can print out what I have so far. And I can think about the data before the next processing step. Some things break this pattern, for example "for x in $(big long expression)" or "diff <(determine A) <(determine B)" but the former can be replaced with "big long expression | while read x" as long as it's not spaces you want to split on. And the latter necessarily takes two input streams, so you have to accept some loss of linearity.
This is not to say I think bash is ideal. The way it deals with unset variables (evaulating to the empty string) is pretty annoying. And always having to worry about special characters doing crazy things is also frustrating. And the things I write are rarely easy for even me to read looking back on them after a while. But it's definitely fast to write.
Lisp shares the first property with bash, but in the other it's nearly the opposite. The analog of "cat | grep | wc" is "(wc (grep (cat)))". Most languages are niether all one way or all the other. They can go "wc(grep(cat))" or "a = cat(); b = grep(a); c = wc(b)" and most programmers use some of both.
Thinking about how easy it would be to write inverted lisp with a reversing macro interpreting everything (not that I actually think this is better -- the top down style of lisp with more thinking ahead is probably good for me) brought me on to the other idea: it might not actually be good for languages to be as extensible by the individual programmer as lisp is. Paul Graham writes that a language annoyance that a java or python programmer would have to wait for a language fix for a lisp programmer can generally just fix themself. Take generics in java or, better, with in python. It's really nice. Instead of having to remember to close things or release locks even in complex error situations, they're dealt with when the block ends. But it wasn't in python for a long time and had to be centrally added. In lisp anyone could write with and not have to wait. This sounds good.
Except that in the lisp case only that person benefits; any one who didn't think to write with doesn't get to use it. In python it became available to everyone. Because smart people who want to have an extended version of the language can't just do it themselves easily, they suggest it as a feature and everyone gets it. Maybe this isn't ideal, but it improves the core language much faster. Looking at arc, I think almost all of it could be implemented entirely as macros and functions in common lisp. And many of the good ideas probably have been implemented in lisp by many people over and over. But without the pressure of users frustrated by the limits of the language, lisp didn't get centralized improvement.
fix_path.c:
#include
#include
extern char** environ;
int starts_with(char* haystack, char* needle)
{
return !strncmp(haystack, needle, strlen(needle));
}
int fail()
{
printf("\\w");
return 1;
}
/* sometimes there are characters before /home/ that can be completely ignored */
int fix_home(char* in_path)
{
if (starts_with(in_path, "/internal/reference/home/"))
return sizeof("/internal/reference") - 1;
if (starts_with(in_path, "/nfs/another/internal/reference/home/"))
return sizeof("/nfs/another/internal/reference/home") - 1;
return 0;
}
int main(int argc, char** argv)
{
char in_path_arr[2048];
char out_path[2048];
char cur_env_name[2048];
char best_env_name[2048];
int best_env_index = -1;
int best_env_name_match_amt = 0;
int index_of_equals;
char* cur_env_value;
int e_idx, idx_c;
char* cur_e;
char* in_path;
if (!getcwd(in_path_arr, sizeof(in_path_arr)))
return fail();
in_path = in_path_arr + fix_home(in_path_arr);
for(e_idx = 0; cur_e = environ[e_idx] ; e_idx++)
{
for(idx_c = 0 ;
cur_e[idx_c] &&
cur_e[idx_c] != '=' &&
idx_c < sizeof(cur_env_name)-1;
idx_c++)
cur_env_name[idx_c] = cur_e[idx_c];
cur_env_name[idx_c] = 0;
if (cur_e[idx_c] != '=')
continue;
else
index_of_equals = idx_c;
cur_env_value = cur_e + index_of_equals + 1;
if (cur_env_value[0] == '/' &&
strlen(cur_env_value) > best_env_name_match_amt &&
starts_with(in_path, cur_env_value) &&
strcmp("PWD", cur_env_name) &&
strcmp("OLDPWD", cur_env_name) &&
strcmp("HOME", cur_env_name))
{
strncpy(best_env_name, cur_env_name, sizeof(best_env_name));
best_env_name[sizeof(best_env_name)-1] = 0;
best_env_index = e_idx;
best_env_name_match_amt = strlen(cur_env_value);
}
}
if (!best_env_name_match_amt ||
!(strlen(best_env_name)+1
On a completely different subject, I've started using the InvertColors Firefox addon, and it makes pages look a lot nicer.
These let me do things like:alias grey-grep="GREP_COLOR='1;30' grep --color=always" alias red-grep="GREP_COLOR='1;31' grep --color=always" alias green-grep="GREP_COLOR='1;32' grep --color=always" alias yellow-grep="GREP_COLOR='1;33' grep --color=always" alias blue-grep="GREP_COLOR='1;34' grep --color=always" alias magenta-grep="GREP_COLOR='1;35' grep --color=always" alias cyan-grep="GREP_COLOR='1;36' grep --color=always" alias white-grep="GREP_COLOR='1;37' grep --color=always"
user@host /path/to/cwd $ echo hello there | blue_grep ll | yellow_grep ereThe primary use for me is when I want to look for something and don't really know what it is yet. Often this will include wanting to find things that are near each other, but I'm not sure how near. The color helps immensely with visual grepping.
hello there
The main downside to this method is that I have to specify the color. What I really want to have is something where multiple calls to color grep in the same pipe automagically use different colors. Maybe have
Edit 6/1/2009: This is minor, but I think this makes more sense with "salary" instead of "income". It's a small absolute difference, but it means it's easier for other people to pay me to do small jobs as I don't discount the money to the same extent (money - taxes - 50% combines to a pretty large discounting).
Over the thanksgiving break, though, I had an idea. The board is 19x19, so there's room -- with some left over -- for four 9x9 boards. If you play 9x9 Go in quadruplicate, then you can see the toroidal adjacencies and play sort of normally. It's a little annoying to have to place four pieces for every move, but you get really fast at it.
The strategey changes, though, are pretty hard to think about. I'm definitely not yet used to a world without edges.
We played a lot of the Train Game, and I tried a 'rush' strategy where I ignored all route tickets and just went for the six train fifteen point routes that would use up my trains really fast. I also took routes when it would make someone else take a costly detour. The goal was to finish the game when lots of people would have routes unfinished and couting against them. It worked, and everyone was mad at me. A bit disruptive.
I finished up the light for my bike. I ordered a Cree XR-E (R2 bin, WH tint, about 115 lumens ar 350mA) from Cutter along with a 10 degree / 40 degree elliptical lens with holder at 90% efficiency. I'm running it off my new Sturmey Archer X-FDD hub dynamo (6V at 3W). I put the LED in the place of the incandescent bulb in the chrome bullet headlight that came with my bike. Pictures:
That copper mass under the light? Heatsinking. The light is only about 15% efficient, so the rest of the 3W is heat. Unlike a bulb, that makes the led unhappy. So I have the LED mounted on an aluminium star, that soldered to 12 gauge copper wire, that running through a notch cut in the bottom of the light enclosure and soldered to a beautifully twisted copper marvel (rats nest) to maximize heat transfer with the air.![]()
Some thoughts on the process of wheel replacement. Taking off the wheel was harder than it should have been because I didn't remember that non-derailleur bikes use master link chains. So I tried to move the hub towards the pedals enough to get the chain off, and I succeeded, but it was harder than it needed to be. In removing the wheel I had to remove part of the chain guard as well. I think if I'd remembered about the master link I would not have needed to, but as it was I did. That was annoying.
One interesting thing about the bike is that the fork ends are not drop outs but instead rear facing. Sort of annoying, but not really a problem. Maybe makes it more reliable?
The hub is a SRAM Spectro T3, which looks like it's a pretty good one. It has three speeds (186% range from messing with the sheldon brown gear calculator) and a coaster brake. The people I got it from included a traditional style sturmey archer shifter and cable which were ideal. Which is good, as the standard SRAM shifter for the T3 is a handlebar twist one which wouldn't have fit my bike at all. One thing I like a lot about the shifter is that it is unlabeled and shiny. The old ones with red lettering were ok, but I really like things that don't actually need labels to be blank. The gears seem like they're placed well, but we'll see tomorrow when I try them.
| Gear | Gain fractions | Percentages |
|---|---|---|
| 1 | 0.734 | -22.6% |
| 2 | 1.000 | direct drive |
| 3 | 1.362 | +36.2% |
My new bike:
The bike is a flying pigeon PA-02 2D, a roadster based for the most part, aside from the double top bar, on the Raleigh Tourist DL-1. I ordered it through a reseller in Texas.![]()
![]()
Some statistics:
Now I need to look into finding a new rear wheel, or rebuilding the current one. It definitely needs some sort of brake that is not a rim brake on a steel wheel, and it would be nice to have some gears. So I'm thinking of putting on a Shimano Nexus 3 speed coaster brake hub. Or maybe some used hub. I'm not having too much luck finding bike shops that deal with 28 inch wheels, but the Dutch Bicycle Company in Somerville says they carry them. When I emailed they wrote back to say they had 28 inch stainless steel wheels with stainless steel spokes and a SRAM torpedo 3 speed hub with a coaster brake, which was exactly what I was looking for. I'm probably going to go over there tomorrow or friday after work.
I should also get some bungee cables for attaching things like bike wheels to my rear rack.
I did end up writing a C program to do the path fixing; it makes
a big difference when the system is under load.
Then I have to change my bashrc a little bit from before:
fix_path.c:
#include <unistd.h>
#include <stdlib.h>
extern char** environ;
int starts_with(char* haystack, char* needle)
{
return !strncmp(haystack, needle, strlen(needle));
}
int fail()
{
printf("\\w");
return 1;
}
int main(int argc, char** argv)
{
char in_path[2048];
char out_path[2048];
char cur_env_name[2048];
char best_env_name[2048];
int best_env_index = -1;
int best_env_name_match_amt = 0;
int index_of_equals;
char* cur_env_value;
int e_idx, idx_c;
char* cur_e;
if (!getcwd(in_path, sizeof(in_path)))
return fail();
for(e_idx = 0; cur_e = environ[e_idx] ; e_idx++)
{
for(idx_c = 0 ;
cur_e[idx_c] &&
cur_e[idx_c] != '=' &&
idx_c < sizeof(cur_env_name)-1;
idx_c++)
cur_env_name[idx_c] = cur_e[idx_c];
cur_env_name[idx_c] = 0;
if (cur_e[idx_c] != '=')
continue;
else
index_of_equals = idx_c;
cur_env_value = cur_e + index_of_equals + 1;
if (cur_env_value[0] == '/' &&
strlen(cur_env_value) > best_env_name_match_amt &&
starts_with(in_path, cur_env_value) &&
strcmp("PWD", cur_env_name) &&
strcmp("OLDPWD", cur_env_name) &&
strcmp("HOME", cur_env_name))
{
strncpy(best_env_name, cur_env_name, sizeof(best_env_name));
best_env_name[sizeof(best_env_name)-1] = 0;
best_env_index = e_idx;
best_env_name_match_amt = strlen(cur_env_value);
}
}
if (!best_env_name_match_amt ||
!(strlen(best_env_name)+1 < best_env_name_match_amt))
{
int off = 0;
if (starts_with(in_path, "/home/jkaufman"))
off = sizeof("/home/jkaufman");
else if (starts_with(in_path, "/home/"))
off = sizeof("/home/");
if (off)
printf("~%s", in_path + off - 1);
else
printf("%sS", in_path);
}
else
printf("$%s%s", best_env_name, in_path +
best_env_name_match_amt);
return 0;
}
PS1="${PS1}$(fix_path)"And now it's all spiffy fast.
UPDATE 2009-07-20: The line above actually has an untrusted code excecutions vulnerability. If the user can be tricked into navigating to a directory with something like $(foo) or `foo` in the name, then the foo program will be excecuted. This is quite bad. The problem is that the shell evaluates the PS1 variable before display. So we need to change that line to:
PS1="${PS1}\$(fix_path)"And we postpone evaluation to when the prompt is displayed, instead of evaluating it both when PS1 is set and then again when it is displayed.
Working several hours a day on the command line now, I've gotten interested in what I can do with the command prompt itself. For a long time, my command prompt looked like:
user@host /path/to/cwd $This was quite serviceable, though when deep into a directory hierarchy (especially one laid out by a windows user) /path/to/cwd might be more like a three line monster.
Fixing this, though, isn't too hard. I've made several environment variables already that correspond to common places I want to go to. Because cd $FOO_SRC is way nicer than cd ~/code/current/foo/foo-1.2.4-rcA/src/. So why not make the command prompt know about this? So we could do:
user@host ~ $ cd $FOO_SRCSo I write a little python program, fix_prompt.py:
user@host $FOO_SRC $
import sys
import os
# if it happens to match but it really short, ignore it as
# its probably not what we want
IGNORE_LENGTH=10
# these variables contain paths that would make little
# sense to abbreviate to (except HOME, where we just want
# to deal with it nicer)
IGNORE_VARS=["PWD", "HOME", "OLDPWD"]
# in order to still show home as ~ and /home/user as ~user
# we need to have some special logic. If you wanted a dir
# /foobar to show up as the dir %, then you could add an
# entry for that here.
SPECIAL_REPLACEMENTS=[["/home/" + os.environ["USER"], "~"],
["/home/", "~"]]
# we want to sort a pair of lists by the lengths of their
# first elements, so we need a comparator function
def longest_a_first_comp(x,y):
return len(y[0])-len(x[0])
in_path = sys.argv[1] if sys.argv[1:] else ""
# get all the environment variables, reversed in mapping so
# we can do reverse variable expansion. Or is it
# variable condension? variable condensation?
env = [[v,k] for k,v in os.environ.items()]
# sort them by length. This is so if we have:
# $FOO_SRC="/home/user/src/foo"
# $SRCS="/home/user/src"
# we will take the longer one. I think this is always what
# a user wants.
env.sort(longest_a_first_comp)
for r in env:
# the substitution only happens if it would shorten the path
if in_path.startswith(r[0]) \
and r[1] not in IGNORE_VARS\
and len(r[0]) > IGNORE_LENGTH\
and len(r[1]) < len(r[0]):
# prefix with a dollar sign so it looks like an
# environment variable. The dollar sign needs to
# be escaped, and it's escape needs to be escaped.
print "\\$" + in_path.replace(r[0], r[1], 1)
sys.exit(0)
for r in SPECIAL_REPLACEMENTS:
if in_path.startswith(r[0]):
print in_path.replace(r[0], r[1], 1)
sys.exit(0)
# if we didn't do any condensations, yield the original path
print in_path
Then I tell bash to call it, in ~/.bashrc:
PS1="\u@\h \w $ "
promptFunc()
{
PS1="${COLOR_GREEN_BOLD}\u@\h"
PS1="${PS1}${COLOR_BLUE_BOLD}"
PS1="${PS1}$(python ~/bin/fix_path.py $(pwd)) $"
}
if [ $(whoami) == "myusername" ]
then
PROMPT_COMMAND=promptFunc
else
# so if someone does an "su" at my terminal its really obvious
unset PROMPT_COMMAND
fi
Someday I may be on a slow machine that can't run python snappily
like I want. Then I'll rewrite in C. Shouldn't be too bad.
One thing that surprises me about this is that I've not been able to find anyone else doing it online. Maybe I'm not calling it the right thing. "Path shortening"? "Path condensing"? The closest I found was some people putting in elipsies in the middle of things. It's sort of a reverse expansion of an environment variable.
Now if only "shopt -s cdable_vars" would let me do tab completion on them.
I've been biking to work now every day for nearly three weeks, and have some thoughts on bikes. These thoughts are directed both towards problems with my current setup and a potential replacement.
I've been riding a (I think) late 70s/early 80s (79-83 by checkers and decals) silver 10 speed steel Peugeot racing bike. It has drop handlebars, is quite light, and looks something like this:
The bike is very nice on dry days, but in bad weather the completely slick tires scare me. The front shifter cable is fraying, and the back one is poorly adjusted. Both fixable. I tend to use only two gears -- 52:14 (high) and 52:32 (low) -- and occasionally one in between (maybe 52:22). These are with the front shifter only ever on the biggest sprocket and using the full range of the rear shifter. I could probably be ok on a bike with a higher lowest gear; my commute is pretty flat.![]()
One option would be to completely redo this bike. I don't like racing handlebars much, I don't like the shifting system (I like hub internal a lot better), the brakes need work, the tires aren't too great. There's no chain guard at all. Another is to buy a used bike. There are a lot of old 3-speeds that are close to what I want. Comfortable high handlebars, hub internal gearing. They'd still need good brakes and tires, and they might well have no chain guard. A third option would be to buy a new one. I've been looking into this, though, and have found few ones like what I want. The bikes below look ok:
What I like about these bikes:![]()
Back in Medford. Lots of moving things, unpacking, Julia painting, getting library card... I start at BBN on the 15th. One thing I was thinking about with Jonah (potwasher) while washing dishes at Pinewoods was that it would be good if you could easily tell the temperature of a pot by looking at it. Surely there are heat sensitive chemicals, changing color as they heat up. So why not put this on the outside of a pot? Then the potwasher knows when a hot pot has been put on his dirty rack. And the cooks know if somehting out of the dishwasher has yet cooled to touchable temperature. If it works well, you could even use it in the cooking itself -- is the skillet hot enough? See what color it is.
Been at Pinewoods for a while now. Pretty well settled in. Doing a decent amount of playing music, less dancing than I'd thought, lots of fun. Doing the Papa Stour longsword dance with a class, enjoying it a lot. (Especially "over your neighbors sword at waist height").
A while ago I was talking with some people (at Swat?) about an idea for genetically engineered parasites that would live inside people and let them eat excessively without actually eating too much. I forgot about it, then today came across the following ad:
Sanitized tapeworms, eh?![]()
May Day was awesome. Dancing with Points of Etiquette and Renegade Morris. Songs. Maypole in the evening with Folkdance. (And arguing with Paury Flowers about the large scale event (worthstock this year) forgetting to reserve a rain location and kicking our contra dance out of upper tarble... not so awesome) Thinking that Renegade has managed to take in six completely new dancers (me, becky, becka, finlay, maureen, laura kb) and in six six-kilosecond practices learn six dances (not that I can really do nutting girl) is pretty cool.
Eric and Beth announced they're engaged at dinner today. Which got me thinking about the phrase "ring by spring". Sometimes, "ring by spring or your money back". People don't say it often at swat, though I've heard it some. The idea being that girls should be engaged by the end of the year. Which year, though? I think this varies interestingly. At swat it seems to be senior year. There was a phoenix column a year or two ago where a senior was pretty clearly using it like that. And laurie has used it that way. At messiah, however, it allegedly is sophomore year. And a current BYU student says there it's freshman year. More research is called for.
Decent amount of stuff happening lately, including a surprise engagement contra dance for me and Julia on Tuesday. It was a lot of fun and we were both completely surprised. We have fun, though devious, friends.
I was thinking some about tallies. David Chudziki is visiting and brought with him a new game: Jaguar. It's an Italian trick taking game, quite bridge like. There are all sorts of cool things about it, but one interesting thing is the scoring. The score is set up so it's completely zero sum. In the normal situation the Jaguar and the friend are going against the three other players. If the Jaguar side wins, the Jaguar gets 2, their friend gets 1, the other three get -1. If it goes the other way the Jaguar gets -2, the friend gets -1, the other three get 1. In a tie everyone gets 0. If the Jaguar and the friend are one and the same, the Jaguar gets + or - 4 and the other people get - or + 1.
This is a game in which your score goes up and down by small amounts. If it only ever went up, a classical tally system (vertical line for one, two lines for two, a lower left to upper right slash for five, repeat on a new block) would be great. Tallies give fast write performance and pretty good read performance, but do not support subtraction. So how do we add subtraction?
Consider these tally marks:
The pattern is simple. We add horizontal and upper left to lower right slashes. These added marks are negative. So (a) is 3, (b) is 0, (c) is 4, (d) is -3, (e) is -4. Negation (if we needed it) would be a quarter rotation. And its completely backward compatible with traditional tallies.![]()
Chudziki and friends had been keeping score in arabic numerals and scribbling out each number to write the next. That's a lot slower because the actions involved are more complex. You need to perform addition and subtraction in your head. No fun. You get slightly faster read times, but I don't think that's worth it. Because of the typically small adjustment size, I believe these tallies are also much more space efficient.
Julia and I were talking about college essays and I decided to look back at mine and see what I wrote. I remembered writing about NEFFA but didn't really remember what I had said. One line in particular jumped out at me, though. I'm talking about how nice it is to have so many dancing cousins, and I write:
when we go into the main halls to contra-dance, we have enough people that each of us can have a partner and no one has to dance with the sketchy old-folks who make up a large fraction of the population.I wrote that, really? I would definitely not say something like that now. Maybe I'm more part of the dancing community than I was then. This was before I'd ever asked some to dance who I wasn't dating or the cousin of. But still. It's also funny how many different people read that essay and didn't comment on that line.
And the weekend of iron dancing ends. Five nights with all the contras and squares. Mmm.
Thursday Concord Latter Day Lizards 3hr Friday Greenfield Kenny, Siegel, Lea 4hr Saturday Greenfield Clew Bay, Latter Day Lizards 5hr Sunday Brattleboro Tidal Wave, Latter Day Lizards, Crowfoot 11hr Monday Nelson 2.5hr
Height is a major component in this. Being taller increases the risk of roll-over dramatically and also makes the van less aerodynamic. Part of why large passenger vans are built the way they are is that they were designed to hold cargo and not people. Why not make vehicle in a wagon configuration instead? You put three or four rows of seating in and put doors on each row. If you keep the width of a van you can have each of the rows hold four people, though the front should probably hold three (don't want to crowd the driver). This gives 11 and 15 passenger options. Alternatively the vehicle could be narrower and hold only three across, seating 9 or 12 people. People also might want individual seats for the front, especially for the three-across version, which cuts 1 of each of these numbers.
Having doors on each row helps in several ways. This comes from no longer needing an aisle to reach the rear seats. This allows weight to be distributed more evenly (fully loaded 15 passenger vans have around 50% of the weight on the left rear tire, causing increased wear and dangerous handling), faster loading and unloading, and greater capacity.
Greater capacity per row also lets the wagon be shorter, an 11 person wagon needing three rows to a 12 person van's four and a wagon-15 needing four to a van-15's five. Each row in a wagon takes up a little more space because the people are lower and a little less upright, but not that much more.
With all the suits about 15 passenger vans rolling over, there are probably a lot of schools, churches, colleges, and community groups that are nervous about their vans and perhaps thinking about replacing them.
Saturday we went to bethlehem again. It was one of their blue moon dances where they have an experienced dance, then a potluck, then a normal dance. The band was atlantic crossing; they were really good. When I heard them play at CVFF I wasn't that impressed with them, but then they were competing with the great bear trio and lots of crazy french canadian bands. But saturday they were really good.
The caller was Janine Smith, who was ok, but did several things that annoyed me. She wanted to do demonstrations for anything at all strange, especially during the experienced dance. She called all balances as "and balance now". She often called early. The worst was probably the way she called Hull's Victory. She told us to do the right and left through "the traditional way they do up in New England, with no hands" which sounds reasonable on its surface; in most of new england (unlike bethlehem) there is no initial pull-by-right in the right and left through, it's just a pass through (followed by a courtesy turn). The caller really meant no-hands, though; she did a demonstration and instead of a courtesy turn/cast/twirl she had people doing a half gypsy. A dance having a "pass through across, gypsy neighbor left halfway" does not bother me. Claiming it's the traditional way to dance a right and left through, that it's the way it's done in new england, and that the resulting dance is hull's victory, though, that does bother me.
Update 2/15/2009: Jim Saxe rights to say:In the early 1980s, I spent two summers in the Boston area. At that time, Hull's Victory and other dances with R< from proper formation were a much more frequent part of the repertoire than they are today in many communities. It actually was fairly common, especially on hot summer evenings, for dancers to do the turn-as-a-couple action without touching. I wouldn't describe it as a left-shoulder half gypsy, though. We'd be side by side--one dancer's right shoulder near the other's left--with our bodies pointing in the same direction, just as if we had near arms around each other's backs, but not actually using the arms. You can see this styling used by some (but not all) of the dancers in this video:So I was too harsh. Reading back over that initial paragraph I seem a little picky and mean. The picky is me noticing details more in activities once I start trying to really understand them -- in this case starting to call. But the mean isn't excusable.
http://www.youtube.com/watch?v=CfdoDCQqUZUAs for the issue of how to do the figure, the looking-in-the-eyes bit still sticks in my head as non-traditional -- I think I'd heard lots of older dancers saying that was pretty new (70's) to contra. But the main part of my complaint is wrong.
Still, had a good time, both during the dance and singing on the way home. On the way there, though, someone rear-ended us and we had to deal with that for about half an hour. The car in front of us stopped suddenly, I braked hard, stopped just short of them. Car in back couldn't stop in time. It was a slow collision, maybe 10mph, but their car did not do very well. It slid under the van's bumper and crushed a corner. The van did quite well in the encounter; with its big steel bumper it just got paint flecks.
We followed the procedures taped to the passenger side of the van, including calling public safety and getting insurance information. But the general van-coordinator incompetence demonstrated itself again. On the (faded) sheet it said to call the van coordinator at number N1 and if he wasn't there to try the cell at N2. This sheet turned out to be more than two years old. Lorpu Jones, last year's coordinator, had only crossed out the male pronouns and written in female pronouns (well, someone else might have done it). Leaving N1 and N2 alone and out of date. Paul Agyiri, this year's one, hadn't even done that much. So I ended up leaving a message on some random student's voicemail (they reassign phone numbers every year) and calling the van coordinator from three years ago on his cell phone. Adding to this annoyance the police were very slow. They showed up right away, talked to us, were nice. But when they took our licenses to run checks and file an accident report we were waiting a good 20 minutes. Probably a slow computer system. Not their fault, but meant we missed a good 45 minutes of the dance. Oh well.
Yesterday we went to the bethlehem contra. Much fun. The band was the Brazen Hussies and the caller was Tori Barone (who has called at Swarthmore twice I think). The music was very good, but a lot of what made the night fun were silly things.
The dance before the break I convinced people to play 'the game' (I don't know if there is another name for it. This name is not very helpful). People who want to play be consecutive twos so they move through the dance together, then people can switch with any person who's playing. This dance had a 'ladies aleman right 1.5' which was very good for gents switching around. We also started near the top of the set but not right at the top, so that for a lot of the dance we were dancing with other people who were playing and could switch with anyone in the hands-four. Whee.
The dance after the break Tori and Bob Isaacs called a dance together. Well, more like in opposition. There were two sets and each of them walked through and called a different dance. The dances were chosen to have offset balances, so one line balanced, then the other. We were supposed to try and balance louder than the other line. It was confusing at first, especially when they called right at the same time. The most confusing thing for me, really, was remembering that the dance ended with a ladies chain. See, both dances had ladies chains at the end, and when I heard the caller for the other line calling ladies chain I knew that we had any figure except a ladies chain. Really fun once people had the dance, though. I think the dances were something like:
Me and my partner did the B1 with a balance instead of a dosido, maximizing balances and noise.
Tori's Line Bobs Line A1 (4) Inside hand balance Neighbor (4) Ladies to the center (4) Twirl to swap (4) Balance wave (4) Inside hand balance Partner (4) Ladies out, men in (4) Twirl to swap (4) Balance wave A2 (4) Inside hand balance Neighbor ? (4) Twirl to swap (8) Gents aleman 1.5 B1 (16) Dosido and Swing Partner ? B2 (8) Long Lines (8) Right and Left Through (8) Ladies Chain (8) Ladies Chain
The last dance I danced tandem with Victor and Chris, which was fun, though a 'ladies dosido 1.5' requires extremely precise pivoting to complete on time. While we were out at the top we noticed that kloveco was sitting out, so we danced as the four of us, tandem pairs. At one point we got confused to where to go and we ended up divided 3-1 instead of 2-2. And then tried to dosido. Didn't go so well. Other dancers didn't seem to mind, though I don't think I'd seen anyone dance tandem at bethlehem before.
People were generally very playful.
Last monday (3/12) I was at the scout house in concord and bob isaacs called a dance ending (B2) as follows:
Giving standard lengths for the actions you'd have something like:
The problem with this timing, though, is you don't make it through the hey in time for the balance and swing. Heys are hard to do exactly on time, and because this was a hey to the next you needed more time to do an extra pass.
One fix is to realize that the petronella really is two beats of spinning followed by two beats of clapping, wiggling, stamping or standing there. And that people could skip out on those second two beats and go straight into the aleman, leaving plenty of time:
The caller (bob) did not say this is how people were to dance it, but said instead something like "if you don't stop to clap after the petronella you'll have momentum to make it through the hey in time for the balance". When I talked to him at the break he claimed that the petronella still took four counts and that people should be able to do the hey in time if they had momentum, as it was three passes in six counts. Thinking about this more I really don't see how one could retain the momentum of the spin into the aleman while pausing between them for two counts. I also think that when I danced this I was going immediately into the aleman out of the spin. But bob tends to know what he's talking about.
If this dance really does have a two count petronella turn, I'm not sure what to make of it. Dances that have swings after petronellas, like cure for the claps and my good morning mr sanders are more fun if you cut the petronella short and spin into the swing. This feels different to me, though, perhaps because it forces you to go into the aleman immediately if you don't want to be rushed while spinning into swings is just better flow and more swing.
At the folksing last weekend we sang the filk "old time religion", and filking has been in my head quite a bit lately. I stumbled across SWIL's filk page and found a nice filk of "Both Sides Now": The Physicist's Lament.
Flurry in a week!
I've been thinking about instruments a lot lately and have two projects I want to work on at some point.
I might have to settle for a recorderharpa.
Bob McQuillen played for the Scout House dance on thursday. He was good and fun to dance to. The dance was very good and in the dance before the break the energy felt just right for a VFW balance. We were coming around to the partner balance and just before I was going to shout "balance" someone else did. Which was awesome; people were together and enjoying the dance the same way I was. At the break, though, Bob called us up to the edge of the stage "get on up here you youngsters! I want a word with you." I thought he was going to chew us out for stamping so loudly over his excellent piano playing, but instead "you might be able to tell I've been around for a while, but I've never seen anything so cool as that damn balance." Much fun.
VFW balance: Taking the same amount of time as a standard balance (four counts) people stamp with both feet (well apart) and tap their heels together in the air as "stamp stamp stamp tap stamp", though the timing is more like (counting eight pieces) "s-ss-ts-". I think I first saw it in 2003 at the VFW, but I'm not really sure; I wasn't dancing often yet.
Rum and Onions XXVII was fun. Not Boston or Asheville, though. Looking forward to NOMAD.
Thinking about different formations in which to start a contra dance in relation to my Ling thesis. What about a proper ocean wave? Or, worse, a proper beckett? It would be tricky to get people back to a proper beckett with symmetrical calls (I think a right hand high, left hand low would do it) but it would be worth it to see peoples faces in response to:
Now take hands four and don't cross over. This is a proper dance. Now take your hands four and circle one place to the right so you're on the same side as your partner. Men are across from men, women across from women. That's right, this is a proper Beckett...
Back from LEAF. Loads of fun. Trip overview:
Wednesday Baltimore Dance Thursday Warren Wilson OFB Friday LEAF Saturday LEAF Sunday Glen Echo
And computing numbers:
miles: 1312 gallons: 39.52 mpg: 33.2
Just got back from Glen Echo. Much fun, though way too far to drive to a dance regularly. The athletics department is so nice; we asked for a van for Saturday, they gave us the keys on Friday, and then when the Pterodactyl Hunt was moved from Friday to Saturday they said they were fine with us taking the van out both days. The student van coordinator would have fined us $25 for a late reservation and then not given us a van. Or something of the sort.
Glen Echo then. The general format of the dance was about the same as most dances I've been to; contra for an hour and a half, a waltz, the break, a hambo at the end of the break, another hour of contra, an ending waltz. The main structural difference was that the break consisted of a large number of short waltzes played by a piano player who was not in the band. This meant that there was more room to waltz and people who liked waltzing could keep doing so. Seems like a good idea.
The hall itself was vary large, perhaps the size of the NEFFA main hall, though not nearly as full. This meant there was lots of room to spread out, and also lots of room for lines to wiggle all over the place. There was also a gap in the center of the room most of the time where there would have been a center set, with three lines on either side. Perhaps an attempt to avoid center set syndrome?
The dance style was overall pretty similar to most other places. The promenade style was western/shoulder and they always used hands on right and left throughs. On petronella walkthroughs there was almost no clapping, though during the dance there was some. Maybe half the people clapping? Like in the Boston area, the better dancers tended not to clap and to do something else instead, generally some sort of in place wiggle. There was not much footnoisyness; both long lines and balances were pretty quiet.
The band was the Nettles, and while they were great to listen to and most of the time worked very well for dancing they seemed not to have much practice with playing for dances. They would do some things that really didn't fit what the dancers were doing, playing syncopated stuff or going quiet when people needed to be all together for something. They also tried to end one dance by fading out, which didn't work very well, partly because by the time it was clear they weren't going to get louder again we were into the A2 with new neighbors.
Laurie was nice and let us crash at her house. And we drove back the next morning. Quite fun overall.
| tolls | $18 |
| gas | $52.47 |
| milage | $126.4 |
But these include some of the costs of driving Laurie to guitar and some of the elverson costs. Gas we got at 7/8 full, drove down to 1/4, filled up to 9/8 (yes, the meter shows that). Bringing it back from 9/8 to 7/8 was the work of the Elverson trip. So we used 5/8 but put in 7/8. So only $37.14 was used going to Glen Echo.
Now we need to factor in dropping off Laurie. That took us 28.2 miles off the route, there and back, for 56.4 total. That brings the mileage charge due to the Glen Echo trip down to $103.84. And assuming that 22% of the trip used 22% of the gas the Glen Echo gas was only $28.97. So we now have revised costs:
| costs | Glen Echo | Dropping off Laurie |
|---|---|---|
| tolls | $18 | $0 |
| gas | $28.97 | $8.17 |
| mileage | $103.84 | $22.56 |
| totals | $144.81 | $30.73 |
This was a little while ago but I didn't remember to write about it then. At the last thursday dance I was at in Concord (8/17) they called a dance with a variant of the Petronella turn. Each person, with only their neighbor (on the side of the set) repeatedly balances and spins one place to the right. So the hands four goes from a square to a line to a square to a line. Instead of doing the last of the turns, the balance was followed by a box-the-gnat and half a hey. The figure was not introduced as a kind of petronella.
Usually there is scattered and unsynchronized clapping after spins during the walk through. This time there was no clapping. I took this to mean people didn't take it to be a petronella turn, and instead were thinking of it differently somehow.
During the first few times through the dance, there was no clapping at all. Then, perhaps four times through, there started to be some clapping. The clapping built over the next few times, to a point about half of what you usually get on petronellas. Then it seemed to deminish some as more people started swinging their neighbor instead of doing the balance and turn (the dance had no neighbor swing).
Anyways, it was very interesting to be watching.
Part way back to Swarthmore. Going to the Dawn Dance seems more and more likely. Claire also wants to go, and her parents have a van which I think we can take. We'd probably go up for the whole weekend. I hope it works out; it would be fun and I'd like to see people.
I am perhaps a very foolish person. After the dance last night (very good dance, excellent energetic music, lots of good dancers, good caller, even if she did call most of the same dances she called two weeks ago on monday) we went out to the all night stop and shop to buy root beer float fixings. We didn't mostly end up with root beer floats (I ended up getting a chocolate croissant and splitting a bag of raspberries) but it was still fun.
Afterwards Dave had a CD of contra music and felt like calling, so we (eight of us) danced in the parking lot for a while. We've been dancing in parking lots more and more lately. It's fun.
Dave left a little before others were ready to go, so I ended up going home with Jill and her friend Maura. We played cards, music and talked for a few hours. What we didn't realize was that if you get back to the house at 2:00 and hang around for three hours the sun comes up. So the sun snuck up on us, Maura freaked out and fell asleep, and Jill and I walked to a nearby hill to watch the sunrise. Very cold feet (flip flops in the cold dew) but the world was looking very pretty out.
Jill gave me a ride to the train when we got back, which turned out to be an express train faster than driving into Boston. After a five minute layover and a muffin I was out on the 8:05 Lowell to West Medford. And much sleep.
Back from CVFF this time. Much fun. Similar to Falconridge, but different. The atmosphere was much more relaxed and felt less like a fair. At FRidge there were two sets of food: expensive not-very-good greasy fair-style food, and expensive health food I didn't like. Here there was cheap ethnic food, somewhat NEFFA-style, served out of several tents. None of the large trucks that unfold into takeout fast food places.
The dancing was fun, though not quite as good as at FRidge. Great Bear Trio was excellent, and I bought their CD. The floor was loud and very slippery -- and not muddy, due to the lack of rain.
I had been planning on camping, but the camping area turned out to be way far from the festival area. Zoe's family let me sleep on their motel-room rug. Not having to deal with the orange tent was just as well. And riding with them in the car consisted of much singing -- and kazooing -- along to old folksongs.
Fun weekend.
Back from the Falconridge Folk Festival. I had a great, though wet and often sleepless, time. A large but incomplete Swarthmore contingent came up for Saturday, and David German successfully surprised them by appearing magically from Huston. I also met some new people, some on the dance floor, some after they randomly appeared in our tents. But the fire.
The fire was not the most fun thing about the festival. Not fun at all. Saturday night as we were getting ready for bed, there were shouts and what sounded like fireworks. Looking across the tenting field the sky just glowed orange. People called 911 and they tried to bring a fire-truck up the muddy hillside. This ended up taking a very long time, in which the van (late 80s econoline 150) which had been burning was reduced to a charred metal exoskeleton. Someone who sounded like they were in charge told us we needed to evacuate the hill (as we later found out, because the fumes from the burnt were highly toxic). We ended up walking our bedding down to the dance tent where we slept the night. Or our piece of the night. Maybe 4:00 to 7:15. Not really enough.
Medford. Home. Quite nice. Sitting at the computer typing on a Model M is really quite relaxing. Even if the keys are mislabled. Contra tonight. Pictures from Italy after Suzie gets home and unpacks the camera in her bag.
Update: pictures here
Been in Cortona almost a week now. Enjoying it. Lots of music, gaming, and good food. Pictures to come after return to the States. Perhaps more later, though I wrote something long yesterday and it died, so perhaps not. Off to get gelato.
Just back from the contra dance in Concord NH. Neat place. It was in a community center in a place that really felt a lot like Snicker's Gap by Bluemont. Center of stores in a rural area, wooden buildings, low porches out front. The dance itself was both a really good dance and a really bad dance. But I had a good time. It was small, with several new people and the music was amazing; Nat Hewitt on fiddle with Finn Hewitt on keyboard. The caller, however, was not really so amazing and kept messing things up. Oh well.
What really struck me most was the dance composition, though. There were two squares and I think four proper dances. There were at least four dances with no neighbor swing, two of which had no swings at all. English-feeling figures seemed to be considered the more basic sort; in the second dance -- which was done like a teaching dance -- there were figure-eights, hand casts, and waist casts. Soon after was a dance with contra corners. And people were more comfortable with the contra corners than more modernish things like `box the gnat'. People also did not do swing-style twirls (such as the one going into a swing or after a circle left) or expect them. I guess that the classification `modern urban contra' for dances like the Springstep/VFW isn't that far off.
Addendum 7/21: They also took ladies chain to be by default all the way over and all the way back, with the definition I'm used to being called a 'half ladies chain'. They also once called half a hey for four which while I reasonable call is never once I'd heard before. Half a hey is faster and contra has not had heys for three for so long that there's no confusion. I do wonder what would happen if the caller called "first man, both women, hey for three". Probably confusion, too much to even be solved with a walk through. And unhappiness on the part of the left out man.
Verizon appears to be not entirely made up of idiots. In fact, I really only have evidence for one, the intial tech I talked to on the phone. When I called back I got someone who was reasonable and logged the call. The lineman they eventually sent out the next day was quite competent. The telephone wiring in this area is generally messy, because you don't have to be very careful with how you wire for ordinary telephone. But not so with DSL. Anyways, they did a pair change and we've now got a newer DSL-capable line. And we've got DSL on it. Whee faster internet!
Verizon is a bunch of idiots. Or perhaps it has just a few idiots, selectively placed around the company so as to be optimally annoying. Verizon was supposed to be setting up DSL for our phone line, and the original `service ready date' was thursday at 6:00. Today at 10:00 I received an automated message from Verizon saying that the line was ready and I could set up the modem. At this point I am quite happy.
I excitedly set up the modem, but no luck. The modem worked properly as a NAT box, but no internet connectivity. The green DSL light just sat there blinking. I moved the modem down to the basement where the demarc is, disconnected everything else from line one and had the modem be the only thing there. Still no luck.
Feeling somewhat frustrated, I called Verizon tech support. They had me power cycle the modem and reset it to factory settings, but I had already tried both of those. They then told me that while they would normally escalate the problem to the repair team, because it was before the official service ready date they wouldn't, and I should just wait.
This wouldn't be that bad, if it was not exactly what happened a year and a half ago. We went through the same process, and after a week or so they decided that the house was too far away to get DSL. My dad called back recently to see if things had changed, and they said they'd upgraded their systems since then and all of Medford was covered. But I think it's likely the same thing is wrong as before.
Finally got around to calculating mpg for the trip to NEFFA:
| vechicle | gas cost | gas price | gallons | miles | mpg |
|---|---|---|---|---|---|
| rented van | $129 | $2.95 | 43.7 | 718 | 16.4 |
| Allison's car | $81 | $2.95 | 27.2 | 670 | 24.8 |
Note that miles_van > miles_car because we didn't take the car to NEFFA on Saturday. Also, multiplying by vehicle capacity we get 197 miles-people/gallon for the van and 124 mp/g for the car. So the van does pretty well per person. You could have only 8 people in the van and still come out ahead.
Finally got my act together and released a bugfixed PlayGUI: 0-1-4. Much happyness.
Fun day yesterday. Went to the Irish Connections Festival in Canton. An outdoor festival, and in the rain. Not really ideal. My shoes got progressively more soaked as the day went on, until my feet felt like they were simultaneously freezing from the cold and rotting from the damp. General badness. Near the end, though, I thought to look for a bathroom with a hot-air hand drier to use on the shoes and socks. That was amazing; like putting on clothes right out of the dryer.
Yup; warm dry socks was the most important aspect of the festival. There were other fun things too, though. Scrambled Six performed near the beginning; Rosie's last time with the group. There was an 'introductory Irish set dancing event' which turned out to be Kerry Sets. Basically polka in square dance formation. We'd learned them a while ago at NEFFA and our set was eight contra dancers. Much fun.
Later on Crooked Still played. They were excellent, and also quite entertaining to watch. We had front row seats. When they finished, though, there didn't seem to be much happening at the festival for a while so we went off to Concord to catch the second half of the 'alternative music' dance. Lots of fun. And singing tonight.
Medford. Nice place. Been back three weeks now. Lots of dancing, music, reading. At the end of last summer I read Dune and liked it very much. I've started on the other books in that series and am through to the fifth book. They are not quite as impressive as the first was, but I'm enjoying them nonetheless.
I've been playing a decent amount of music lately, mostly guitar and piano. I've also been trying to play the fiddle some, and while I enjoy it I find it very frustrating. It should not frustrate me that I am unable to pick up the instrument and immediately play perfectly, but somehow it does. It would be nice to have a pure lead instrument that I could play; lead on the guitar hurts my wrists and lead on the piano or accordion always feels like it's lacking a bass. Playing in tune and bowing are the hardest parts, which I guess makes a lot of sense coming from a guitar background.
In line with my general goal of getting more practice at playing contra guitar I played in the open band at MIT in mid May. It was much fun, and I think I will try and sit in with Apple Crisp when they play the MIT dance in mid June (soonish!).
As for dancing, I've been dancing nearly every Monday, Thursday, Friday, and Saturday since I got back. Fun, really. And there was the dawn dance a week ago. Going to contras since has them they all seeming so short. But still fun; I have to worry less at a normal dance about conserving energy.
Dancing there went well, with Stillington not being too interesting, but Helmsley II going well. The double triangle lock of Helmsley went perfectly. There was also maypole dancing, but that was very silly, being much more of a race than anything else. The students didn't seem to care about the pattern or even keeping the ribbons taut, making a jumbled mess. When the seniors got bored they just left their ribbons in a heap at the bottom of the pole and declared victory. I know that it is a race, but they should have a restriction that you need to do it properly. I suspect that a long time ago it was done right, and then slowly progressed to more and more or a race. But right now it's laughable.
Dancing at Belmont Plateau was also fun, though far too early. As at Bryn Mawr, the Kingsessing Morris Men and the Germantown Country Dancers (Longsword and Garland) also danced. It was a very pretty morning, with no rain or even many clouds. The sun came up as requested and we danced for a little while after to make sure it stayed up.
Just before we started Helmsley, though, a sinister force appeared on the scene. A large blue tractor, apparently sent there to mow the park, started across the field. As it got closer it got noisier, being somewhat unpleasant. Moving across the field, between where we were and where cars were parked, it was almost between the television crew that was recording the festivities and their van, when people realized that there were cables. And that mowers are not nice to cables. The newspeople turned around and started running towards the tractors, waving wildly. It ended up stopping just short of the cables. Unfortunately, while this was happening we tried to start our dance. More accurately, our musician tried to start the dance, and the first dancer in line, Alex George, started off. Being distracted by the tractor and commotion, I didn't move. People poked me, though, and I went on and joined the dance. The dance itself went very well.
Pictures of both May Days are still being collected, as of now, but will be up in the pictures section when they are ready. Will Quale already has some up.
We also needed a van for the next day, and Lorpu was helpful with that, though letting us know a little earlier would have been nice. That went fine, except it seems the gas gauge is broken, or somehow messed up. We drove a total of 46 miles, and the gauge went from one-fourth to one-eighth full. After dropping people off, though, I went to fill it up. I put $10 (3.2 gal) in, and the gauge stayed at one-eighth. I put in another $10, and another, and it still did not move. Most of the way through the fourth $10, the pump reported that the van's tank was full. The gauge still read well under one-quarter. Sounds broken to me.
The problem is, the election committee does not have the power to do this. The constitution states, in Article II, that,
1.6 Election FraudAnd then a bit later that,1.6.1 Upon reasonable evidence of elections fraud, SC has the power to void a contested election if two thirds of all members present vote to do so.1.6.2 Any student may protest any specific election result by registering a complaint in writing with a member of the Elections Committee within 24 hours of the announcement of election results. This protest shall be heard in a meeting of the whole Council.1.6.3 If SC finds that an election was fraudulent to the extent that the determination of the winner was probably affected, the election shall be voided.1.6.4 If SC finds that a requirement of this Constitution was violated in an election, the election shall be voided.
2.3 Special elections shall be held in the event of election fraud, seat vacancy, or failure of any candidate to achieve a plurality. ...It appears that it is Student Council that must void the election, and they have not done so. Even then, they would have to find that not only had the candidate committed ballot fraud but also that the "determination of the winner was probably affected". Without this the initial election results should stand, unvoided.
Much fun at NEFFA. Lots of people. There were 12 of us down from Swat and staying in Medford, resulting in 26 people in the house Saturday night. Driving wasn't as bad as I expected, though it would be nice for the future to have additional van certified people. I danced a decent amount more than in the past, and played in the festival orchestra with Laurie. I still want to try and have there be some ML Breakfast Room contras next year, and I think Laurie and I would be able to play well enough. Allison needs to learn to call.
Finances also worked out ok. The ending amounts were:
| expense | van | car | total |
|---|---|---|---|
| tolls | $26.20 | $26.80 | $53.00 |
| gas | $129.00 | $80.50 | $209.50 |
| rental | $138.00 | $0.00 | $138.00 |
| totals | $293.20 | 107.3 | $400.60 |
This works out to $31 per person who went, or $27 per person who told me they were coming. For full cars, if we're renting, it looks like the van is the most efficient. With 12 people it would come to $24 apiece. That's not bad. And I think David German would take a turn driving next year.
Also, housing has happened. Me and David German have the big room of the Quint, Alex George and Chris Green have the small room, and Julia has the single. Laurie is across the hall in a barn double, while above us David Chudziki and Lucas, and Katie and Allison have the two two-room doubles. Other people have gotten rooms in ML too. So nice to have all that stress over with, even though it was mostly other people's stress.
Halfway through three weeks of amazing busyness and contra. Last weekend I flew up to Boston with Claire for three nights, with a dance each night. Friday was the experienced dance at the Scout House, Saturday we went to Greenfield, and Sunday was the joint Suzie, Ricky, Barbara, Jon 50th birthday potluck and contra thingy, again at the Scout House. The first two nights Nat Hewitt played, and was excellent. Much funness. The only real downside was missing family weekend and the crum regatta, but oh well.
This weekend, among such other fun things as interviewing for the SBC van coordinator position and beautiful weather, was the Swarthmore contra dance. The turnout was excellent, including Claire and Lee. The band and caller were good, and people improved noticibly over the course of the night. We started off with some people who'd never danced and others unfamiliar, and finished with a no-walkthrough dance. Yay!
Next weekend is NEFFA, and it looks like they'll be a decent sized Swat contingent, 13 or so. I'm much looking forward to it. And the weekend after the Points of Etiquette(Swarthmore Longsword) dance twice for May Day. First at Bryn Mawr on Sunday at the reasonable hour of 9:00, then the next day on Belmont Plateau at the most unreasonable 5:30. Ugh. But longsword tends to be fun, and Helmsley II is being quite pretty. Then the year ends and I'm in Boston for the summer.
Stuff this summer:
Chris Green has been trying to make the ML breakfast room corner into a lounge, with couches and funness. In his quest for spiffiness, he bought a sectional couch from GoodWill. Not wanting to carry it all the way back (ugh; effort) I brought along a bike, duct tape, and a two-by-four, and had a much easier time of it. The ML Shuttle driver, Todd, was apparently amused and took a picture.
Near the beginning of the semester, when Vince moved to California and left lots of techish stuff in the ML lounge, I found a camera. Specifically, a Kensington 67014 usb webcam. It looks to be about 1999ish, being a late '90s, early '00s shade of beige. It works, though I usually have to restart the display program a few times before the image is clear. It looks decent. See some dice.
I'm trying to think of a nice project for it, perhaps facial recognition and fishbowl attendance monitoring. It doesn't work with the video manipulating code I wrote in cs25, though I could probably mess with the gqcam source.
I've been back in Medford for almost a week now, and things have started to be very relaxed. Perhaps a bit too much so. Lots of time reading, playing guitar, and messing with computer stuff. The experienced contra on Friday was much fun, and because I'm back for the weekend of the 9th, I'm going to be at the next one. And then NEFFA is two weeks later, with the Swarthmore contra in between. And ideally people will want to go to the April 1st Elverson dance as well. Lots of dancing.
Walking into the Fishbowl lounge, we see students bent over computers and forms. Freshmen and Juniors laugh, Sophomores growl, and the word "major" is heavy on the air. It has become February, a time when sophomores must reflect on their future and realize that they will not be forever Swarthmore students.
There are many approaches to this strange and disheartening news, ranging from obsession to apathy, and students are well distributed over the spectrum. As the Monday deadline approaches, however, the prospect of another year of sophomore-level housing pulls more and more students to the obsessive end. And there is an awful lot to obsess about.
Obsession, even temporary, does have its uses, and now I sit with a completed sophomore paper and forms filled out. I plan now to do an honors major in CS with preparations in natural language and visual information systems, and an honors minor and course major in Ling. Selecting courses is a really fun puzzle. Taking them is fun too, but sometimes less so.
The folkdance trip to the Elverson contra went well. We had thirteen people and did succeed in getting a van. The Elverson contra had more young people than the Glenside one, but fewer experienced dancers. Bringing 13 college students also shifted the age distribution.
There should be more contra in the future, but I'm not all that sure how often they can happen without people getting overcontrad and stopping attending. At the very least we should go to the next Elverson one we can, which is the first of April. But I would like it if we could go to one sooner.
Dancing, and reading about midwestern squares with tractors made us curious about the possibility of using an SBC concept grant to host a vehicular Square dance at Swat. The draft proposal is here.
PlayGUI is now ported over to MPD and is sitting here. It needs a better name. And playlist support.
Back in August, when I was thinking of how to get a program that allows several people to remotely control a central music server, a friend recommended "mpd". Not remembering correctly I looked up mplayerd, which has since dropped off the net. It didn't do what I wanted and wasn't reliable, so I wrote my own. I talked to him again over break, and found that he was really recommending mpd. I went off to have a look at mpd and it does seem a better program, especially server-side. It does everything PlayMusicD does and more. The clients though, are not quite as impressive as the server. I think I may rewrite PlayGUI to be a mpd client. The language they're using is not that different from the one I wrote PlayGUI to use, and the ways in which it is different seem to be better. So perhaps this weekend PlayGUI will be reincarnated as somejavampcpun.
Back at swat after a nice vacation of tennesee, family, contra, and reading. I finally put together the pictures overview page that I had been meaning to write. Most of them even have mouseover descriptions. Much fun.
Exams are starting, so instead I programmed a helper to keep track of what you know about the stacks in Titan Whee!
Wink finally happened again, Sunday night. Katie was there, taking pictures. She put them up on facebook but I've snarfed them and so they re-appear.
I finally got around to putting some updating into PlayGui. The result being version 0.0.5. There are updates to both the client and server, the most important being a server change to unbreak next and previous and the addition of a "Random N" button to queue up N random songs from the current search results.
This sunday was Allison's birthday, and we gave a her a surprise birthday dinner party. Where "we" means mostly people other than me. Anyways, it was much fun.
Some general thoughts about user interfaces and usability, modified from a post I made on Slashdot in the interest of not having to explain views all over again:
Macs are nice. Macs are pretty. Macs are intuitive, easy to learn, and allow you to configure things without learning much about them. All good for some people. The question is, which people? Perhaps the casual home user who just wants a computer to check email and browse the web? For anyone who uses a computer a decent amount, it is worth the effort to learn some unintuitive but powerful programs. LaTeX with emacs would be a good example, in that you do need to go read some manuals, but once you start using them it becomes so much faster and they are so much more adaptable than standard GUI word processors. I use my computer every day. I rely on it for most of my work. As such, the initial experience and the amount of work that goes into learning how to use it effectively are very minor concerns compared to the benefit of being able to work faster, more efficiently, and with less UI sillyness. That OS X is intuitive and pretty is pleasant, but no real help in getting my work done.This applies equally to Windows, really, with the exception that I think Apple does a better job at creating this sort of interface than Microsoft. There are Linux distributions, such as Linspire that also do this. But I think they all miss the idea that computer use should be about getting work done quickly and conveniently, and that the initial capabilities of a person who has not really learned the system are not all that important.
Computer-human interface is not yet anywhere near perfected. We have at least two powerful and mature systems in the GUI and terminal, and both remain severely limited. Programmers focus on making GUIs look pretty and not on using the extra interface flexibility to better communicate information. Terminal-based programs have very little flexibility in their display, yet they are often much faster than GUI programs at getting information accross.
Halloween in ML went pretty well. Lots of fun costumes, pictures of which are here. I spent most of the night upstairs reading The Ordinary Princess out loud in Blair's room and then playing Carcassone with Allison and Alex.
I put up my rulesets for Diplomacy.
Anyone want to play a {T-1, P-1}-0.1.0 game?
Finally got around to putting up some pictures. Pictures of the fishbowl are here. David has some pictures from the tea party here.
I wrote a little plugin for Gaim to make away messages easier. See here.
Summer is over, I'm back at Swat, and I've finished the first usable version of PlayMusic, a client/server music playing program.
I just got back from a week in Marion with my cousins and family. Marion is on Buzzards Bay off Cape Cod in Massachusetts. It was quite fun, not too buggy yet. Lots of bikes, ocean, puzzles and games.
People like Ricochet Robot. It has a nice feel, sort of like Set, where people can come and go, finding paths as they want. Similar to a puzzle as well. It would also be a nice game to implement as a computer programming exercise, in Commonwealth's CSII class, for example.
Been home for a little while now. I was playing Can't Stop, a board game, and I was wondering what the probabilities were for it. I wrote a little program and the results are here.
Things are winding down; classes are just about over. I'll probably
be working quite a bit during the next few weeks, what with no
classes and all, but that should be fun. I've been working on a
plugin for Gaim that
allows Gaim to interface with the traditional Unix write
console messaging system. See my gaim-write subpage.
Justin Herring now has his photo album back. He emailed me a while ago wanting it back, having found my site through a search for his name. it was a little confusing, as I didn't really have any way to verify that the gmail account actually had a connection to him. I asked him to describe parts of the book, but he didn't remember it that well and so did about as well as a careful guesser would have. I told him I would send it, and then waited for a while, figuring that if he was just some prankster who happened upon the site then he wouldn't follow up. He did follow up though, and so I shipped it. I'm not sure how I feel about lying to him. I wanted to be sure that I did not send his album to someone else, but I also didn't want to make it too hard on him if it really was him.
Housing is set for me now. Lucas, David German, and I will be rooming in the fishbowl in ML. Should be fun. Housing is not set for Katie or Allison. They would like to live in ML but as it is a lottery it is hard to know how it will work. I'm quite happy I blocked.
I got an accordion! It's a Scandalli piano-accordion from the 40s, fullsize, with two stops. I'm very happy with it. I had been playing the accordion Davy lent to Rosie during winter break, and it made me remember how much i used to play the piano. So I decided to get one. I bought it on eBay, which was pretty uneventful, except that it arrived on the 26th, but I never got the package slip, so it languished in the mailroom until the 2nd. When I first opened it, it looked like it was in pretty bad condition, because almost half the bass keys were stuck on. I opened it up (which was fun; it's from the 40s and it has a really interesting mix factory made metalwork (to put on the right notes for the chords) and careful woodwork) and there were five or six keys that were slightly out of position so they were stuck under the housing. Freeing them freed their partners, and they all came out. There are a two keys that need oiling but I'll get to them.
Back home to Medford. It's nice being back and it's snowing. Snow is nice.
To get back I took the chinatown bus from Philly to NY and then from NY to Boston. It is a very good deal ($10 + $15), and is actually more confortable than a car, as you get a lot more space (if no one takes the seat next to you).
Anyone heard of Lords of the Rhymes? As in Hobbit Rap? George Dahl got their documentary, and as geekiness goes, it's near complete. Unless you mind profanity (it is rap, you know) I strongly reccomend you hear their songs.
The Mary Lyon Halloween party was on Saturday. Costumes are always fun. Allison and Katie went as Love and Lust respectively. Lucas was supposed to be a pimp, but I don't think he was flashy enough. I prefer gangster. Pimp, however, goes a bit better with Love and Lust, though. And I was a member of Sargent Pepper's Lonely Heart's Club Band. Jolly good fun.
Actually, the party itself wasn't really much fun at all, so Katie, Allison, Lucas and I spent four or so hours talking to Michael (and reading Hope for the Flowers). I got tired and left at around 1:30 (the first one). By the time the others wanted to leave (2:30) the police had started arresting people for underage drinking if they were walking back and the Party Associates were requiring that everyone take the shuttle back. Lucas, Katie, and Allison were most definitely not drunk (all three religious, Allison a Mormon) but they ended up having to wait another hour for room on a shuttle. But I got to sleep and that's all that counts.
P'TERODOACTYL HUNT!!
The P'Terodactyl Hunt is a grand SWIL tradition in the spit of swords, sorcery and second grade. The basic premise is, run around with foam swords hitting each other. There is a bit of a plot in that we (the hunters) are ostensibly trying to kill enough monsters (with a bounty on each head) to buy a p'terodactyl-hunting license and bring that endangered breed one step closer to extinction.
Standard attire was a trashbag; white for hunters, black for monsters, and a foam sword. No real rules except that hits only count within the trashbag area, and when you die, you have to go to an inconvenient place to respawn. Much fun ensued.
There was a dorm-storage sale last week, and we got a lot of interesting things. The best was probably the mouse for a Lisa or 128k Macintosh. One thing Katie and Sheen found was a photo album. It was rather sad, however, as the album began with a (strongly reccommended reading) loving letter from the previous owner's sister. She called him Justin, and a picture of the times at a swim meet part-way through gave us the idea that his last name was Herring. Justin Herring. We set off to track him down.
We used the amazing facilities of google to find that Justin Herring, class of 1997, had a rather illustrious Swarthmore career. He was on the swim team, setting third and fourth place records in the 200 and 100 meter butterfly in his sophomore year, and helping get first place in the 200 and 400 medly relays his junior year.
Justin Herring was also a very political person around campus, gaining notoriety in both the Swarthmore Conservative Union and the Amos J. Peaslee Debate Society. In the former he took opportunities to participate in on-campus political debates against the Swarthmore College Democrats while in the latter he took the battle to the enemy, fighting for the Swarthmore name at UMBC and Wesleyan, and winning awards while doing so.
So what we have here in Mr. Herring is clearly a dedicated swimmer, a mature conservative member of the Swarthmore community. Yet he leaves behind a photo album that his younger sister clearly poured her love into before he left for college. What sort of conflicted man must he be?
Note to Justin Herring: if you want your photo album, please email the address at the bottom of the page.
update: Justing Herring has contacted me and wants his album back. It looks like (uninterestingly) he simply forgot his album, with no intent to slight his sister. We're sorting out shipping.
In closing, Katie demands that I put up this picture of Allison.
So some of you may have heard something about us suspending Sheen from the third floor window of Parish. Well, it is our considered opinion that these rumors are not only false but malicious, and have devoted an entire page for their disproof.
While some people (Allison) may view this layout as a bit dull 6~ and unimaginative, I view it as exceedingly standards compliant. How many sites do you know that render exactly the same in Firefox, Safari, IE, and Lynx. Of course the images I link to are difficult to view within Lynx, but AA can display them just fine.