I created a rudimentary mod kit for the game Battle Brothers that allows editing the encrypted scripts (.cnut files) within the game. Since almost the entire game is implemented in script, this allows tremendous flexibility for modding.
Converting repeating decimal numbers into proper fractions
Last night while lying in bed, I was thinking about how to convert repeating decimal numbers into proper fractions. For instance 4/7 = 0.571428. But if you see 0.571428, how can you turn it back into 4/7? (Remember, 0.571428 = 0.571428571428...)
Unicode sucks, and its implementation in .NET is even worse. Back before Unicode existed, and in its early days, I had a lot of hope for it, but in a lot of ways modern Unicode is even worse than the multi-byte character sets that came before it.
I'm always bothered by the use of non-square fonts to depict square geometry, such as in a roguelike or a similar game such as Dwarf Fortress, so I created two square fonts for the venerable code page 437, in 10x10 and 12x12 sizes with a Roman (serif) style.
One night while in bed I was struck by an idea for a more efficient flood-fill algorithm, and unlike many of my bed-based ideas this one still worked in the morning. It's optimized for speed and a shallow recursion depth, and it doesn't require any heap-based memory allocation. It will always fill a rectangle without any recursion, and can fill any convex shape and many concave shapes without recursion as well depending on the initial point. It is much faster than the scanline method (commonly considered state-of-the-art) in the case where testing whether a pixel should be filled is a fast operation and either somewhat slower or somewhat faster in the case where testing a pixel is a slow operation (depending on the particular scanline method implementation).
One task when implementing a roguelike is to figure out how to compute the region of the dungeon that's visible to the player or another monster. There are many existing algorithms, but they all have flaws, so I set out to develop a new algorithm that is fast, exact, and aesthetically pleasing to me. Although I didn't create a perfect algorithm, I still think my algorithm is an improvement over the others.
How to get IBMGraphics-style NetHack graphics in GNU/Linux
For people used to playing NetHack on DOS/Windows and therefore used to the IBMGraphics feature, it can be a bit jarring to use the DECGraphics (low ASCII only) style, which doesn't distinguish between many dungeon features. Simply adding OPTIONS=IBMGraphics to ~/.nethackrc usually produces garbled output and there seems to be no reliable way to get IBMGraphics working. So here's another way to get IBM-like graphics.
The AI War devs have said that they have only a couple hours per week to work on community-requested features. Because of that, a day or two ago I decided to create a mod to implement some requested features from their Mantis bug tracker. I started by implementing the features that I personally requested, but I think some of these will be useful for everyone. I also did a bit of bug-fixing.
While creating mods for Sid Meier's Pirates!, I found it very frustrating to try to make substantial changes to the game's executable using IDA Pro because the built-in assembler is very limited and can only assemble one instruction at a time, and if you make a mistake you may have to type the whole program again from scratch! Furthermore, the free hex editors for Windows tend to be buggy, and typing machine code into a hex editor is error-prone. So I created a basic assembly IDE to help me write mods and patch executables.
I played Sid Meier's Pirates! (the 2004 remake) for the first time this week, and it was a really fun game, but
unfortunately it was too easy. The game helpfully autosaves every time you enter a town or start a
battle – basically any time something bad can happen – so by reloading your game you can avoid all the consequences of
mistakes and retry difficult parts until you succeed rather than having to be careful to avoid unnecessary risk.
This also renders various special items useless. For instance, if you never go to jail you have no
need to invest in lock picks or holy relics, and if you never mess up
too badly on the dance floor you have no need for fancy dance shoes. If you never lose battles, you
have no need to acquire and upgrade multiple ships (unless you're a trader) or to get tools to help you get rescued if you're marooned. I don't have the willpower to resist loading my game if I screw up, so I really wanted an Iron Man mode. Since the game doesn't
provide one, I decided to mod the game.
A couple years ago I needed to serve some data over WebDAV in order to interface with Office, which
can edit documents on a WebDAV server. I looked around for a free WebDAV server that I could use or
extend, but as usual none fit the bill. Of the free WebDAV servers, most could serve only files on
disk whereas I needed to serve dynamic data; most presented data as read-only whereas I needed
clients to be able to lock and edit it; and most were rudimentary, buggy, and highly noncompliant
with the standard. Only two servers claimed to have most of the features I wanted, but they were
proprietary and expensive, and they probably weren't as good in reality as their advertising made
them seem. So I set out to design and build my own WebDAV server.
I was interviewed by George London for his A* programming interview series, whose aim is to find and interview the best programmers in the world by running a graph search on the world's social network. I don't count myself among the best, but I was selected as a node in the search. Here's the interview.
Somebody recently asked me to help him decompile Capitalism 2, so I thought I'd put together a small video tutorial series, since all the other tutorials I've seen have worked with trivial toy programs that don't pose the same challenges as decompiling a real application. It demonstrates the basics of decompilation and reverse engineering using IDA Pro.
I like the game Capitalism 2, but it has some annoying bugs. I like to run companies that are vertically integrated, where I own the production all the way down the supply line to the raw resource extraction. If I recall correctly, one bug has to do with cotton, or perhaps textiles, which are made from cotton. It's difficult to profitably produce your own textiles because cotton is just too expensive. There are even worse problems with citric acid and wheat germ oil, which are very expensive to produce. Today I was motivated to reverse engineer the game enough to fix these problems. In the process, I created a mod kit that allows editing many parts of the game.
Creating High-Performance Locks and Lock-free Code (for .NET)
In this post, I describe how to create exclusive and shared locks that are faster and in some cases more reliable than the locks built into the .NET framework (particularly the Monitor and ReaderWriterLockSlim classes). I also help quantify when you should and should not replace exclusive locks with shared locks and briefly describe some schemes for performing thread-safe reads and writes without any locks at all.
Victim-blaming occurs when a victim is held partially or wholly responsible for a crime or abuse against them. (Typical examples include blaming the creator of a cartoon criticising Islam for the violent reaction of Muslims and blaming a rape victim for encouraging her own rape.) Much has been said about whether this is or is not fallacious in general, but I think it's also important to make a careful consideration of different types of responsibility when determining whether somebody is blaming a victim in a specific case.
For a while I was playing the game Dangerous Waters by Sonalysts. It's a naval simulation game, and perhaps the most advanced of its kind, but it also has a number of annoying bugs and bits of bad coding. I tried to reverse engineer the game in hopes of eventually patching the executable to fix some of the bugs. I never got that far, but here's what I found.
Probably the most influential idea proposed by the philosopher John Rawls is that we can derive the rules for an equitable society by considering how people would want their society to be run if they were placed behind a veil of ignorance, whereby they wouldn't know if they would be born rich or poor, able or crippled, talented or mediocre. From this "original position", Rawls argued, people would naturally choose a social structure that provides the most support for the least advantaged, out of each person's fear of being born into a disadvantaged position, thereby deriving equity from self-interest. But I don't think the conclusion follows.
Locks and Software Transactional Memory (STM) in .NET
Locks are the most common synchronization technique in multithreaded programming, but they have fundamental flaws that prevent them from being the best choice in many cases, especially when the object being locked is exposed in a public API. It's time to take a more serious look at using transactions for multithreaded programming as embodied in the concept of software transactional memory (STM).
Imagine you're building a robot that has to meet up, for purposes friendly or nefarious, with a target robot that is moving. Your robot has few sensors. It has a dead reckoning system, so it can track its own movement relative to a starting position, and it can sometimes detect the direction to the other robot, but not the distance. So at time t=0, say, the target is at a relative bearing of 90 degrees (i.e. to the right). At time t=3, it's at 87 degrees. Etc. Is it possible to compute the target's exact position, course, and speed based on such sparse information? In fact it is, and that's the idea behind target motion analysis (TMA).
Permuting Integers and Creating Bijective Functions using Block Ciphers
The other day I was thinking about how to implement a general-purpose Bloom filter for .NET. Bloom filters are based on hashing. All .NET objects support the ability to get a hash code, but the problem is that Bloom filters require multiple hash functions, and it would be unfriendly to require users to create their own set of type-specific hash functions just to use the Bloom filter...
how the SQL Server hierarchyid data type works (kind of)
Yesterday, I stumbled across the SQL Server hierarchyid data type. It stores the position of an object within a tree. I was intrigued because I’ve developed similar mechanisms for efficiently querying hierarchical data, and I wanted to see how it compares.
Before he died, my maternal grandfather lived in a large and beautiful home, which he built by hand. The home featured in a dream I had this morning, and the dream managed to corrupt my memory of the real home.
I went to have blood drawn and it was my worst medical experience ever. The incompetence that permeates most fields is acceptable because it doesn't directly harm me, much, but when people are entrusted with my body, I really want them to know what they're doing!
I've previously described the pernicious campaign of lies and deception used to pass Proposition 8, and closed by saying that it would be right, as well as in accord with the country's legal principles, for it to be overturned. And now it has been!
I started getting back into electronics recently. My eventual goal is to create a robotic team mascot for my team at work. My first, humble part of that project was to create a charger for the robot's batteries. After weeks of waiting for parts to arrive, being too busy to work on it, and accidentally destroying it, I just finished it today. Yippee!
Proposition 8, titled "Eliminates Right of Same-Sex Couples to Marry", was recently passed in California. I didn't hear about it until it had already happened. In a recent conversation, a Christian brought it up and seemed happy about the outcome. Some of the things he said seemed rather unlikely though, and I doubted. Afterward, I began some research. That's when I realized the full extent of the disgustingly sordid campaign to pass Proposition 8.
Here are a bunch of programming problems that I gathered from the internet, and my solutions to them. I'm posting them so smart people can give me better ideas and new problems to solve, and to prove to myself that I can do them. I'm sure some of my solutions are non-optimal or even wrong. They were all written without the aid of a development environment, so I'm not even sure that they all work. Feel free to correct me.
Perhaps Christianity is a polytheistic religion. I've often thought that there seem to be two gods of which Christians speak.
The first is the all-powerful, all-knowing creator of the universe who designed you and your life in every detail before you were born, down to the last hair on your head. This is the judgmental god who will decide whether to allow you into paradise, or to send you to burn and scream and cry forever in eternal agony. This is also the terrible god who, many times, ordered the slaughter of entire towns and nations, except for the women, whom He commanded to be saved for the men (does that mean raped?) instead of killed. I guess that's His idea of mercy.
The second is the kind and gentle — but slightly doddering and impotent — (grand)father figure. This god didn't create the universe, and is terribly saddened by the way things are. He loves everyone and wants nothing more than for them to be saved, and especially doesn't want anyone to go to that awful Hell place, but it's all beyond His direct control. He was even betrayed by His own angels. This is the god to whom prayers are issued, and He tries his best. He can sometimes cure a cold or arrange for somebody to find the new car they've spent months searching for, but He's never quite figured out how to regrow a missing arm or leg, or help out with a surgery...
A while ago, the backspace key on my laptop keyboard stopped working. If this had been a regular keyboard, I would have just taken it apart and cleaned or fixed whatever was the problem. But things are never so simple with laptops...
A couple months ago, when I was writing some code to implement a text editor, I was thinking about how I should design the data structure to map a character offset to a line number and column, and vice versa. I ended up designing what might be a novel data structure.
Before about 2006, I recommended Breyer's ice cream to everyone as "the best", at least as far as what was available in the average US market. It was made with simple ingredients, and had the best texture of any ice cream available. Unlike some "ice creams" that are so far from the real thing that they won't even melt, Breyer's melted in the mouth most delightfully. And it tasted great, too. Now I recommend that people don't buy Breyer's ice cream.
As much as I dislike advertising, I couldn't help but be impressed by this advertisement from the 80s. It's called "Dancing in Paris". The skill of the drivers is incredible, and the choreography and camera work are good too.
When I study math, AI, algorithms, baking, or any other discipline, it gives me pleasure to increase my own understanding, and I'm often struck with awe at how much humans understand, and how quickly our understanding is increasing. But even as I appreciate the comforts and the avenues of learning provided by our civilization, in the back of my mind lingers a great disappointment and frustration with it, and a knowledge of the near mathematical certainty of its proximate collapse.
I've started going through the book Foundations of Higher Mathematics: Exploration and Proof (Fendel and Resek, 1990) again. It's a great math book, probably the best I've seen, because of its fresh approach — with a focus on personal exploration rather than endless problem solving. I'm posting the results of my first few explorations, primarily in hopes that somebody smarter than me will post a message providing new insights or pointing out places where I'm mistaken.
I recently left Microsoft to take a break from working and to study baking and mathematics. I'm getting pretty good at baking, at least. My breads are tastier and much healthier than anything I can buy at the nearest bakery. I'm baking about 2-3 loaves per week, all made with 100% whole grains, and yeast and bacteria that I've harvested locally. Here are a few of them...
I've heard from numerous sources that America is by far the most dangerous country for bicyclists. I'm starting to believe it. In the past 10 months, I've been almost hit by cars 11 times, and I've actually been hit by a car once. And I don't even ride my bike all that much! In almost every case, the drivers were talking on their cell phones, and given that those same people were all blowing through stop signs or other points where they were supposed to yield without seeming to notice, I think it's fair to say that cell phone usage while driving is correlated with reduced ability. And if I continue to get hit by a car at least once per year, it will almost certainly be the death of me.
There's something curious about Disney's Aladdin. You may not have noticed it, but although everyone is supposed to be Arabic, the "good guys" have American accents and white skin (in most scenes), while the bad guys have foreign (Arabic?) accents and brown skin. Somebody had to make this decision consciously. It might have been a result of social programming, or more insidiously, an attempt to impose it.
A while ago, a half-full tube of toothpaste was confiscated from me at the airport by some burly TSA jarheads. The tube held 6.4 ounces of toothpaste when full, so I guess it may have been above the 3 ounce limit when slightly less than half full.
So I figured I'd keep a tube of toothpaste that was well within the limit for use the next time I flew. When a tube got down to about 10% full, I set it aside rather than finishing it. But it was confiscated too! The guy pointed to the "6.4 ounces" on it and said it was too much. I noted that it was almost empty and so was in fact far below the 3 ounce limit. Then he seemed to get mad, and said that it doesn't matter how much is actually in there because they just go by what's printed on the label.
I was surprised to see my name printed on a t-shirt being given out by the Free Software Foundation. It seems I'm part of the "DRM Elimination Crew". I guess that's just the group of people who sent large donations. They sent me a copy of the t-shirt, too. It'll be fun to wear this anti-Vista shirt around Microsoft. :-) It's also be good to just get another shirt. Then I can continue to say that I've never shopped for clothes in my life! (Except that one time when my whole wardrobe was stolen.) It seems that random people send me clothes at about the same rate that I wear them out...
I found a video made by Microsoft in the 90s, featuring Bill Gates as the Doom marine! There's even a Bill head at the bottom. If you notice, Bill's playing with cheat codes. What a lamer! I just love it though -- "Don't interrupt me." Haha!
It's really too bad that Microsoft no longer has the guts to make cool stuff like this. All those lawyers ruined the company.
I learned that this video wasn't Bill's idea. Rather, the creator of DirectX, Alex St. John, asked him to do it for a Halloween gaming event, which featured a Doom tournament for all the top gamers in the US, a bunch of games, and a get-together for all the industry's game developers, to mark the release of DirectX 1.0. Bill thought it would be funny, but the PR guys tried vigorously to prevent it from being shot or shown, even going so far as to confiscate the tapes, but somehow Alex got the tape and made it happen. Unfortunately, the quality of the video I've got is pretty low. Supposedly, Bill was making all kinds of funny faces in the headshot at the bottom. Sadly, Microsoft doesn't host events like that anymore.
(P.S. "Who do you want to execute today?" is a play on Microsoft's late 90s slogan "Where do you want to go today?")
Nothing big here. I just wanted to announce that I'm releasing Jappy, the Japanese dictionary and study program I started about a year ago and never finished, but which is still pretty good. I planned to release it when I implemented all the features I wanted, but since it seems that may never happen, I'm putting it up here as-is.
So I've been trying to learn to draw so that I can make video game art. I even bought myself a neato 6x8" Wacom Intuos3 drawing pad, although it hasn't arrived yet. While looking at reviews of the pad, I stumbled across a review of a product called ArtRage. It's a paint simulator. While there are many paint programs (like Photoshop) with tons of features, none of them really try to simulate the physics of paint. But ArtRage does a really good job at it. They have a free version (with a limited number of tools), but the full version only costs $20! What a deal!
So I tried making some paintings. [UPDATE: Pictures moved to the art page]
You may or may not have heard the furor of the day about something Bush said recently. It's ironic that, of all I've ever heard him say, the only thing I've really agreed with is the thing that everyone, Democrat and Republican alike, is fiercely condemning.
English has, for a long time, been plagued by inconsistent and ambiguous transcriptions of spoken words into written words. Everyone complains about this problem, including me, and I've finally decided to do something about it. So I've developed a new system for writing English.
I've been thinking about the legal status of abortion. It seems that the argument most people have is trying to decide at which point the child becomes human, or becomes alive. Supporters argue that the fetus isn't alive, or at least, isn't human, so it can be killed. Detractors argue that it's human from conception and so must be protected.
I happen to feel that it's alive and human from conception, and from that point has as much of a soul as anybody else. But I also think killing it can be beneficial for everyone, and so should be legal and moral. And not only that, it seems that logically, the Christian church (the main opponent to abortion in my mind) should support abortion as well.
Well, I recently moved (back in September, actually), and it was quite an experience. My new roommate turned out to be less cleanly that I'd hoped, and it extended beyond his bedroom. We seemed to be polarized on the issue of when, how, and occasionally if things should get cleaned, so I had to do something about it. But as he was a friend of mine, I'd have felt bad to kick him out...
I remember when I was young, there was a drive at various establishments (like Blockbuster) to let the police create a profile of children to purportedly aid the police in finding them should they ever turn up missing. When I was grew older, I realized that this was merely a scheme to create a fingerprint database of much of America's (or at least San Diego's) youth.
In this article, Jo Wilding reports first-hand on atrocities perpetrated by US troops in Fallujah. There is no cease fire. This article in the Guardian, regarding the US' heavy-handed tactics, and this call for help which expands upon about how the US is slaughtering people trying to escape the violence, underscore the seriousness of the human-rights violations and the irony of our so-called peace-keeping operations there.
George Bush brushes off all questions with the same answer: "Saddam is evil. We're good. Iraq is a much better place with us there." And when Bush says, in a speech referring to Fallujah, "I know what we’re doing in Iraq is right," I can't help but doubt his judgement as a whole. Bush seems proud to admit that he neither watches the news nor reads newspapers, preferring to get all his knowledge of the outside world from a hand-picked group of advisors. I wonder if he does this so he can claim innocence through ignorance for the effects of his actions on others.
In a press conference in Baghdad Easter morning, when asked about images of scores of women and children and hundreds of unarmed men, young and old (basically anyone that went out of their house, even to get food or water), shot by US snipers in Fallujah, Brigadier General Mark Kimmitt declared that people should just "change the channel" (to a Bush-sanctioned news source, no doubt). The US forces' blatant disregard for human life makes me feel ashamed to be considered an American citizen.
Well, I finally made an update to the Japanese page. I added sections for kanji and grammar/words/phrases that should be updated periodically in a blog-like style. I'd like to add one of each per day, but given that it takes 3-4 hours, I'm not sure how often I'll realistically be able to do that. :-(
Keyboards are terribly inefficient input devices. Somebody go design me a brain/computer interface.
Capitalism and Socialism in Japan and the United States
While I'm generally a staunch supporter of capitalism, opposing socialism where it rears its ugly head, I have to say that I think Japan is an example of socialism done well, though they're certainly far from being what I'd call a socialist country. And that admittedly, the United States is increasingly an example of socialism AND capitalism done poorly.
It's true. The government says so. In fact, that's why you can't get a real trial. To quote: "You have been cited for a violation, not a crime... Since this is not a crime, you do not have the right to jury trial."
If it's not a crime, then what is it? Oh, a "violation". A violation of what? The law, right? Is that not the very definition of a crime?! Does not the seventh amendment to the US Constitution say:
In suits at common law, where the value in controversy shall exceed twenty dollars, the right of trial by jury shall be preserved, and no fact tried by a jury, shall be otherwise reexamined in any court of the United States, than according to the rules of the common law.
This whole thing smacks of semantic gymnastics to make it impossible to get a trial by one's peers, as that would make their revenue-collecting machine much less efficient. They even try to discourage you from fighting tickets you didn't deserve. However, they make it extremely easy to just pay the fine.
Upon further research, it turns out that this is called the "infraction" system, or the system of "civil sanctions". The government's rationale (which I don't agree with) is that since you cannot be incarcerated as punishment for an "infraction", they're allowed to deny you the constitutionally-guaranteed protection of the jury trial, and they presume guilt, so you have to prove your own innocence. But since you can still go to jail for not paying the fine, say, there's nothing to stop them from slapping you with an unpayable fine and then just taking you to jail when you can't pay it. Or when you don't pay because you were actually innocent.
Trepia is a cool idea. It's an IM client that finds other people and sorts them by their proximity to you. It's a great idea, but the client sucks, and it's not open source. So, I decided to take some time to reverse engineer the protocol in hopes that somebody will write a better Trepia client. Full details inside!
If you discover anything else, please post the additional information in a comment.
Every time I make use of the openness of open source, I come to appreciate it more. It's far more flexible than closed-source applications, and lends itself to diagnosis and customization. The other day, I upgraded PHP from 4.3.1 to 4.3.2 to fix some security problems. After that for some reason, whenever I hit a page written in PHP, it would return an error. Since this was something that changed just recently, Google was completely useless. Were it not for the source being available, I'd have been stuck... forced to redo the way PHP is used on my site or to downgrade back to 4.3.1. However, I simply grepped the source code for the error message and found out why it was occurring. With that knowledge in mind, I decided it'd be simpler to just edit the PHP source code and recompile than to redo the way my site uses PHP. A simple fix for a simple problem. If PHP was developed as a closed-source app, I'd have been out of luck for weeks, if not forever (or at least until I redid the pages on my site).
[They've since fixed the problem and I've gone back to using the official sources.]
Most of my old code was lost due to a poor backup. Projects of mine have been abandoned because of poor backups. So these days, I'm a backup evangelist. I hear about a lot of crappy backup plans, but if you run a unix-like operating system, there's just no excuse for that. And if you don't run a unix-like operating system, why not?
Some of the fanciest (and often most expensive) backup systems are snapshot-style backup systems. Essentially, snapshots of the file system are taken at certain intervals, and each snapshot is a complete backup of the entire file structure at the time the backup was taken. It appears and works just like a regular file system, so you can operate on it with all the file manipulation tools you're used to. There's no grepping through tar files, going through incremental backup tapes, special archiver programs, or any of that. Often, snapshots are taken several times throughout the day. Although each snapshot operates as a complete copy of the file structure, the space taken up by each snapshot is quite small. But you can make nifty snapshot backups of your own with just three UNIX commands! Take a look at Mike Rubel's article about snapshot-style backups with rsync. I've been using a similar system for about a year now, and it really is the best.
Next to the building in which I work is a group of small houses housing fat, angry women. One of them said the most intriguing thing, once. She was waddling down the driveway, yelling at somebody, when I heard her scream at the top of her lungs, "Why don't you say something with substance??! Like the F-word!!!". I later found out that the entire area next to us is designated as housing for convicted female felons.
I was recently thinking about my upcoming trip to Japan, specifically how I could avoid paying thousands of dollars in hotel fees. I asked a friend from Japan, and she mentioned "capsule hotels". Upon inquiring further, I found out that a "room" consists of racks of drawers, three high. And you sleep in the drawers. And there are other people sleeping in the other drawers. Creepy.
If you don't believe me, here's a picture. Apparently this is a higher-class one because the drawers are only stacked two-high (and so are taller). And you get in and out of these drawers by yourself. It's like the dead awakening. Like zombies coming home to the morgue after a night of brain-eating.
Christ. If I can't find an alternative (like a host family), that's where I'll be sleeping. *shudder*
I still can't get the image of that zombie morgue out of my head.
[UPDATE: I did sleep in a capsule hotel. Although I was told that I'd have to sleep in a drawer, it turned out it turned out that they were more like cells in a beehive. They didn't open and close -- you just crawled in. That didn't make it much better, though.]
Well, I've finally coded up an RSS feed. Somebody told me it'd be a pain in the ass to implement, but it only took about 15 minutes. Yippee. Actually, I feel the desire to add useful content now that I have an RSS feed, but don't worry. I'm sure that'll pass soon.
I decided to finally do something about Google not indexing this area of the site. By changing "cgi-bin" to "dynamic" and ".cgi" to ".html", I'm hoping bots will be more likely to come in here. They should at least get the diary home page now, I think.
If anybody has knowledge about this kind of thing and is willing to share it, feel free. I'd appreciate it.
I went skiing this past weekend. The bedding arrangements were such that four guys (myself included) had to sleep in the loft. Some of the guys I was travelling with went up to check out the "room". From what I heard, we were supposedly provided with an alarm clock, two single beds (for four guys?!)... and a jar of KY jelly. Among other things, I thought "Is this some kind of sick joke??". When I went up to look, I saw the alarm clock and two single beds, but no KY jelly, thankfully. I was still in shock/anger over the bed situation, though.
I later found out that there were mini mattress-on-a-rack beds underneath the single beds. Oh well, it was an inexpensive trip, even though it lasted four days. I guess they had to cut corners somewhere.
I've read about how the subconscious mind can't distinguish fantasy from reality, which is why when you're dreaming something completely ridiculous, it makes perfect sense at the time. I recently had an interesting experience regarding this.
Today I was talking with a friend, Jim, and he had an awesome idea. I think it's just too good to go unimplemented. The basic premise is that anybody can, via mobile devices connected to the internet, leave "notes" that are tied to certain geographic locations. People that visit the location can read the notes others have left.
Today, I was emailed a copy of the EULA I'm supposed to include in the piece of software I'm developing. I read it over, and it's the kind of thing I would never want to agree to, let alone impose upon other people.