The premise of the device is to decompose water into hydrogen and oxygen (through the process of electrolysis) which are then burned in the combustion chamber—along with gasoline vapor—and converted back into water in the exhaust. I am sure that it can work this way; I've done similar things myself on a small scale (it makes a nice white explosion!). However, what is the point of doing this? To improve gas mileage? That is what the ads are trying to convince people.
Why doesn't it actually improve gas mileage? It's basic physics and chemistry. First, it's physics because energy can neither be destroyed nor created; it can only be converted. Second, it's chemistry because electrolysis is, after all, a chemical process. The energy released when hydrogen and oxygen recombine chemically into water (ie, when they "burn") is the same as the energy that was put into separating them in the first place. However, the efficiency of the electrolysis in the real world is less than 100% (some typical figures are between 50% and 70%), meaning the rest of the energy is lost as heat. Additionally, this energy from the battery needs to be replenished, and how do you think that happens? The engine, powered by the burning fuel, powers an electrical alternator that charges the battery. So you actually get less energy out of the "HHO gas", as the ads call it, than you put into it.
It's sad, though, that many people are gullible enough to fall for the ridiculous claims and buy into this snake oil.
American Idol allows for an unlimited number of votes (or so I've heard), so whenever I vote for Brooke I would hang up as soon as I hear the recorded message, "Thanks for voting for contestant number ___", promptly hit redial, and repeat. (Imagine doing this with an old-style rotary telephone. Eek! You could get only about 1 or 2 votes in per minute.) This process quickly gets tedious, so I figured, "why not make my computer do this instead?" After all, computers are designed to do tedious jobs for us! So I wrote a shell script to do the dirty work for me using a telephone modem. It runs on Unix and Unix-like systems (because Windows is stupid and doesn't make its devices accessible as files in the file system, such as under the /dev directory). American Idol may or may not statistically analyze incoming calls to detect automated dialers like mine, so I inserted random timing before hanging up and before dialing again. Hopefully they won't read this entry and filter out my dialer using this information. :)
This script takes between 10 and 12 seconds per call, so on average it can make about 5.45 votes per minute, or about 327 votes per hour. American Idol's phone lines are open for (at least) two hours after the show, so you could get in 654 votes in that time!
Without further ado, here's the script: vote-for-brooke.sh. In the description you'll see more detailed requirements to run the script. Hit Ctrl-C to kill the script; it'll clean itself up on exit. Hint: before you leave the script running unattended, make sure you hear (on the modem's speaker) the recorded message thanking you for voting.
Don't wait! Act now! Operators are standing by! Vote for Brooke!
Everything seemed to work fine until I played with the new install and started updating it. At this point, the proverbial you-know-what hit the fan. Programs were dying for no apparent reason, and the package update manager (yum) and package manager (rpm) occasionally barfed out with segfaults and even illegal instruction errors! Then the kernel panicked. I rebooted and noticed an option in the Live CD's boot menu to verify the CD before booting from it. I did that and it reported that the second "fragment" (out of 20 fragments) was bad. I thought that could've been the problem, so I burned a new CD. Afterwards I thought more about it, so I decided to run another option on the CD's boot menu: Memory Test. I ran that and immediately it reported bad RAM. Oh great. After a few trials with and without each stick and in different slot positions (to rule out the possibility of a bad motherboard), I determined that the 512MB stick was the bad guy. That means I was back down to 256MB. Fortunately I had a spare 256MB stick, so I tested that memory (just to be safe), and it all worked well. I updated the system, and there appears to be no problems now.
This morning I told my wife about the bad stick of RAM, and she informed me that her parents had had some strange problems with the computer but that didn't know what was wrong. I guess I just figured it out.
In the last month I've been adding a lot of the support code for the file system, mostly taking code from UNIX V6 and V7 and re-writing it for Punix. I've been adding this and other low-level driver code (including a new and improved virtual terminal driver!) without testing each time. In fact, until last night it wouldn't completely link because it had some unresolved symbols.
Last night I resolved the symbols (either by implementing the missing functions or by commenting out each reference to them) and linked it all together. Then I ran it in TiEmu to test it. I could step through it instruction-by-instruction, but at one point it tries to write to an illegal address and goes to the "address error" exception. At this point I discovered that the vector table containing the "address error" and other vectors is partially corrupted! See http://p094.ezboard.com/ftichessteamhqfr
Last, I'd like to mention that someone has volunteered to help work on some of the missing components, so hopefully this means development will pick up pace.
- Where:ASU, polytechnic campus
- Listening to:Led Zeppelin on the Sansa e280 I got for Christmas! (running Rockbox, of course)
Of course I wouldn't steal a car—that is theft. Copyright infringement, on the other hand, is not theft. Even the Supreme Court in the Dowling v. United States case stated, "(copyright infringement) does not easily equate with theft, conversion, or fraud... The infringer invades a statutorily defined province guaranteed to the copyright holder alone. But he does not assume physical control over copyright; nor does he wholly deprive its owner of its use.". Wrongfully taking possession of a CD or DVD is theft, but it's not copyright infringement. The two are very distinct.
Besides, copyright infringement is not even analogous to stealing a car: one is in which something is copied and redistributed to others; and the other is in which a car is taken, depriving the owner of its use. Being on the receiving end of such activity (such as by buying a DVD or CD off the street or by downloading content from the Internet) also is not similar to stealing a car; the owner of the content, again, is not wholly deprived of its use. Bear in mind that this latter act is not even illegal in the US, contrary to what the MAFIAA (an amalgamation of the RIAA and MPAA) want you to believe.
One way this analogy would be more accurate is if the property (the car) is duplicated or cloned and then given away or sold. This, in itself, is not illegal now, because there is no need for such a law on physical objects; creating a duplicate of a vehicle takes an appreciable amount of time, energy, and material (parts). There is little benefit in trying to curb someone from making a replica of a vehicle because of these costs. The vast majority of the value of the vehicle is not in its design (the "content") but in the actual matter that comprises it and in its utility (I will skirt the possible issues of patents on the car's design for now). However, copyrighted material is intangible and must be contained in some tangible matter such as on a hard disk drive or on a CD-ROM. A CD-ROM is just a plastic and metal disc with little value in itself; it has limited utility. The data contained thereon is given artificial value—its value in a truly free market would approach zero because its supply is virtually infinite—and the "owner" of this content is given a limited monopoly over the content in the form of Copyright law. If producing a physical vehicle likewise became almost effortless and its materials cost virtually nothing, then the real value of the vehicle would shift to its design, and it could be used in analogies with copyright infringement. It's not, so it can't. The intent of Copyright law, by the way, is not to reward the owner for creating works. Its real intent is "to promote the progress of science and useful arts" (from the US Constitution), and the copyright-granted limited monopoly is merely a means to this end.
One last thought: if, as many people still believe, that the point of copyright is to make the owner money (contrary to the US Constitution and even to rational thought), then sharing of music on the Internet is, in general, a good thing. According to several studies on the matter, CD sales have not dropped but have actually increased as a result of on-line music sharing. This is probably simple to explain: consumers get exposed to the music of more bands that they would not otherwise know about and then want to buy the CD containing more of it. If on-line music sharing really does increase CD sales, then it is a good thing and should be encouraged. Those people's arguments that it should be stopped because it causes the artists to somehow "lose" money therefore don't hold any water, if you are to believe that a monetary reward is the end (rather than the means) of copyright. One may argue in the opposite direction as well: that, although music sharing may cause a monetary loss to the artists (unlikely) in the short term, it promotes the progress of science and useful arts better than the alternatives (like the "conventional" methods of distribution). I do believe that in many cases copyright law actually hinders, rather than promotes, the progress of science and useful arts (take the DMCA as an obvious example). I won't go into any of these arguments in depth. Suffice it to say that I believe that copyright law deserves an overhaul so it recognizes the current and future economics of authorship and of redistribution in order for it to work again as it was intended.
In no way do I encourage nor promote the infringement of copyrights (except if it's only in violation of the DMCA, which is just a silly and downright childish law that prohibits making a tool (or even simply informing someone how to make a tool) that could be used to circumvent an effective copy protection mechanism, just as a hammer could be used to smash in someone's head, the only difference being that manufacturing hammers is not illegal, nor is informing someone how to make a hammer; note that "circumventing an effective copy protection mechanism" is required to do such legitimate acts as simply viewing a movie encumbered with copy protection (eg, CSS or AACS)), nor do I regularly infringe copyrights myself; I can count on one hand the number of times I may have done so in one way or another, such as when I sold a CD of Slackware Linux but didn't supply the source code CD along with it (oops). Although copyright infringement is not theft, it is still illegal. The MAFIAA really needs to stop spreading blatant lies about the law and their rights, though. And the people, the "consumers", need to understand their rights too. We've been raped in the you-know-where by the MAFIAA for too long.
I admit this post is not very cohesive, but I may refine it over time. My original idea for this entry was to whine about the MPAA's use of those annoying advertisements on DVD's, but it has since expanded dramatically to include the bigger issues of copyright.
- Listening to:a song I downloaded
The SETLOCAL command will set the ERRORLEVEL value if given
an argument. It will be zero if one of the two valid arguments
is given and one otherwise. You can use this in batch scripts
to determine if the extensions are available, using the following
technique:
VERIFY OTHER 2>nul
SETLOCAL ENABLEEXTENSIONS
IF ERRORLEVEL 1 echo Unable to enable extensions
This works because on old versions of CMD.EXE, SETLOCAL does NOT
set the ERRORLEVEL value. The VERIFY command with a bad argument
initializes the ERRORLEVEL value to a non-zero value.Wow. Talk about a kludge. For one thing, there should not be a need for a "SETLOCAL" command in the first place. The environment should be local to a process already. This is how a Real operating system works. Second, this "technique" relies on an undocumented or unintentional feature of the "SETLOCAL" command in previous versions of cmd.exe.
This technique would be bad enough if it were a third party supplying it, but this is in Microsoft's own documentation!
See my server's status for daily updates.
Two days ago I downloaded a live CD ISO of Fedora 8 to install on my wife's new laptop (new to her, not actually new). I got the live CD image and not the install image because a) the install ISO is for a DVD, and I don't have a DVD burner installed at the moment, and b) I wanted to try it out before installing. I booted it up and played with it a bit to see if it would be suitable for the laptop etc. Then I installed it, which went pretty smoothly.
Then yesterday morning I wanted to install Fedora over CentOS on my desktop computer. I first had to backup my old hard drive contents (the installer on the live CD required me to format it, argh!), so I tarred and gzipped it all up into a large 24GB tarball on the Windows partition on another hard disc. The thing that surprised me is that Fedora could actually write to a drive formatted in NTFS! (NTFS is a set of filesystems most commonly used now by Windows.) Before this summer, it was difficult to configure Linux or other Unixes to write to NTFS, and even then it was only experimental. But I didn't have any problems getting it to work in Fedora. Sweet.
After tarring up all 32GB of files (which took probably a few hours at least while I was at work), I booted up the live CD and installed the monster. Then I copied back some of my files and system settings—hosts file, fstab, etc.—from the tarball, which is a beast to extract files from, to say the least.
Here are some things I like about Fedora over CentOS (this may be unfair, as I used a slightly older version of CentOS):
| Feature | Comment |
|---|---|
| Can write to NTFS | CentOS couldn't even read from NTFS, at least without a kernel compile (which I never tried to do). |
| Has the latest versions of software | For example, it has Gimp 2.4 vs 2.0 in CentOS. CentOS is intended to be very stable and secure, so this isn't too surprising. |
| Can play MP3's and similar files out-of-the-box (or close to it) | A lot of software in CentOS has some of their capabilities excised, including the ability to decode MP3 files, for probably legal reasons (patents et al). |
| Has more software out-of-the-box | Well, I had to run yum to get much of it, but I didn't have to add as many repositories (e.g., rpmforge) for yum to find the software. |
| Has better default settings | This is subjective, but I like the defaults in Fedora better than in CentOS. |
| Is more easily reconfigurable | In CentOS, I couldn't even find out how to change my mouse cursors! |
Overall impression of Fedora 8: wow! Linux on the desktop is getting a lot better all the time.
- Feeling:
chipper
Computer World article
It seems that the Nigerian government has more testicular fortitude than the US government at the moment.
Mandriva 1, Microsoft 0.

This is a color wheel (more like a color hexagon) I created which contains all 216 of the "Web-safe" colors.
If you already know how computers handle colors, you can skip this paragraph. Each color is made up of three components: red, green, and blue. Different amounts of each component gives a different color; for example, 100% red/100% green/0% blue gives yellow (just look closely at your computer monitor or a TV set to see how this works). Computer graphics these days typically use 8 bits (one byte) to store the value of each component, so one color or pixel requires 24 bits of storage. This is 24-bit color. Eight bits allows for 256 combinations, so each component could have one of 256 different values. Other color depths, such as 32-bit color, use different numbers of bits to store the red, green, and blue component values. (Some times, display drivers use 32 bits to store 24 bits of color information, either for performance reasons—32 bits is "friendlier" to memory accesses and processor manipulation than 24 bits—or to store extra information in the remaining 8 bits, such as an alpha channel.)
For a long time, most PC's could display only up to 8-bit color; that is, they could display only 256 colors on the screen at one time. This usually caused photographic images to display poorly, with large areas of one color instead of smooth gradients as they should have; otherwise photographs would have to be dithered. Of those 256 colors, only 216 were generally consistent across platforms (Mac, X11, SGI, Windows, etc.). The number 216 is not arbitrary: it is the largest perfect cube less than or equal to 256. It is 6×6×6. This means that each color component can have one of only 6 different values (0 through 5). These values, expanded to the range 0..255, are 0, 51, 102, 153, 204, and 255. They are also 00, 33, 66, 99, CC, and FF, respectively, in hexadecimal (conveniently, they are rounder numbers in hexadecimal). Any other color not exactly representable by one of those 216 colors would have to be displayed approximately as one of those colors. Since the same palette of colors is more-or-less guaranteed to exist on most platforms that would visit a Web site, it was chosen as the least-common-denominator palette, and was called "Web safe". The colors were called "Web-safe colors".
Today, these color limitations generally no longer apply. According to Browser News, only about 0.4% of page accesses on the Web are viewed in 8-bit color; 9% are in 16-bit and 90% are in 24-bit color. Even so, this palette is still good (I believe) for creating new color schemes for sites. In fact, I restrict my color schemes to these 216 colors even on new sites, as it somewhat simplifies the selection of colors (instead of deciding between, say, #C4524A and #C75049, which are visually indistinguishable).
In the color wheel above, I arranged the colors by hue, saturation, and value. Hue is the angle, with red being 0°. Saturation is the distance from the center, with the center having 0% saturation and the edges having 100% saturation. Values are shown within each circle or "blob", with the lightest color having the highest value. Notice that color blobs approaching the center have larger ranges of values than blobs nearer the edges. This is because lower-saturation colors can have a wider range of value; in other words, more "grayish" colors can approach black or white more closely than vivid colors can (there is no "vivid" black or "vivid" white, and especially no "vivid" gray).

This image is a cross-section of the color wheel (across the hues red and cyan) with the different values "exploded" for each amount of saturation. It illustrates the relationship between saturation and the range of value.
On the other hand, the reduced saturation also reduces the resolution of hues those colors can have. The first ring from the center has only 6 hues, each of which has 5 different values. Contrast this with the outer ring, which has 30 hues, each of which has only 1 value.
That is all for now. Later, I may put up more diagrams in this post to illustrate these concepts more clearly.
I'm reading the Unix Programmer's Manual, First Edition (from way back in 1971!), and I just came across some funny text in the man page for form(I):
DIAGNOSTICS "settup error" when the appropriate files cannot be
located or created.
BUGS "settup" is misspelled.
Those two sections appear just like that in the manual. I kid you not.I took a panoramic picture from each side of the USS Arizona memorial (both the north-east and south-east sides). You can see the Google Map showing the USS Arizona memorial. Here they are:

North-east side

South-west side
For the last few days, I've been writing a C program to parse and render this model. The parser is fairly simple, handling only the grammar that is present in the model file (if I get other files in the same format that use more of the language, I may extend it). The renderer (which is Z-buffer–based) is similarly simple, as it doesn't even handle textures yet. I'm trying to support textures using the u and v texture coordinates returned by the line-triangle intersection routine. It also does not support specular reflection nor translucency. Translucency, at least, will require a different rendering method. I'm not prepared to implement those quite yet.
Anywho, the following image is a rendering of the model showing the current state of my renderer. The parts that are white should actually be textured, but for now they are white (duh). The parts that are not white are not textured in the model file and have their face color attribute set.
![]() (1000x1000) |
![]() (4000x4000) |
In the larger image, you can see the finer details in parts like the rotor hubs, chain gun, and tail gear. The model is fairly detailed and, I believe, quite accurate too.
As a side note, this little adventure illustrates the importance of textual file formats over binary formats (see chapter 5 in The Art of Unix Programming for more on this). Had the model file been binary (as the aforementioned 3D Studio files), I would have little chance at writing a parser to parse it without documentation. As it is text, I can simply read the text file in any text editor and decipher the format. One thing that makes a binary format difficult to parse is that I don't know what format the data is in. Is it 32-bit, 64-bit, or 80-bit floating point? Is it even floating point at all? How many numbers are defined for each point (3 for x, y, and z; or 5 for an additional u and v)?
Granted, I found some documentation for this textual format, but it mainly helped me to understand some finer points about the format that were not apparent from the file itself; I could manage to write a mostly working parser even without documentation. Even if a binary format had documentation, the simple tasks a parser needs to do (such as reading number data) would have to be carefully written and debugged. As I developed my renderer first, I extracted vertex data from the file by hand to just draw each vertex (that is, no polygons). Then I extracted vertex data and polygon data when my renderer could finally draw polygons. This would have been exceedingly difficult with a binary model file.
Update (2007-10-29): I finally figured out how to calculate texture coordinates correctly. Even without very realistic lighting, it looks a lot better textured than not textured. Here are textured versions of the model:
![]() (1000x1000) |
![]() (4000x4000) |
Update (2007-10-30): I made the texture anti-aliased. The way I did it is mathematically not completely correct; the anti-aliasing (bilinear filtering, to be exact) occurs in texture space, rather than in "camera" or screen space. If I wanted the texture to look the best it could (which I don't need), I'd use anisotropic filtering (which I don't know how to do yet). The result of bilinear filtering is that at small rendered sizes, there are still some texels that are not represented in the rendered image (so thin lines tend to become dashed), but it still looks a little better than without anti-aliasing. At larger rendered sizes (when a rendered pixel is as small as or smaller than a texel), the texturing looks smoother and significantly better. See for yourself:
![]() (1000x1000) |
![]() (4000x4000) |
PS. I am writing all of this program (except for one module) from scratch, and I am not using any type of graphics API (e.g., OpenGL, DirectX (shudder), etc.) to draw the graphics. I wrote the parser and almost all of the image-rendering code. The only code I did not write is one routine that calculates whether a line intersects a triangle and (if it does) returns where on the triangle the line intersects it.
Before this little pet project, I hadn't written any "real" 3D software. The closest I got to "real" 3D was drawing single triangles in space. The several years I've spent many hours reading and studying how to write software to draw 3D graphics (lighting/shading, texturing, MIP mapping, etc.), but I never got around to doing it. Now that I have, I get it. I also now understand some of the problems (which I had previously only read about) involved in rendering 3D graphics and how to solve them. This is the way to really learn something in-depth.
Some people seem to be confused about the history and reasons behind polygamy in The Church of Jesus Christ of Latter-day Saints. With regards to the fact that some members in the early days of the Church (including Joseph Smith, Jr., and Brigham Young) having multiple wives, here is a question from public affairs and answer from Elder Oaks, a member of the Quorum of the Twelve Apostles of the Church (emphasis mine):
PUBLIC AFFAIRS: The emphasis that has been placed in this conversation on traditional marriage between a man and a woman has been consistent throughout. Do you see any irony in the fact that the Church is so publicly outspoken on this issue, when in the minds of so many people in the United States and around the world the Church is known for once supporting a very untraditional marriage arrangement — that is, polygamy?
ELDER OAKS: I see irony in that if one views it without the belief that we affirm in divine revelation. The 19th century Mormons, including some of my ancestors, were not eager to practice plural marriage. They followed the example of Brigham Young, who expressed his profound negative feelings when he first had this principle revealed to him. The Mormons of the 19th century who practiced plural marriage, male and female, did so because they felt it was a duty put upon them by God.
When that duty was lifted, they were directed to conform to the law of the land, which forbad polygamy and which had been held constitutional. When they were told to refrain from plural marriage, there were probably some who were unhappy, but I think the majority were greatly relieved and glad to get back into the mainstream of western civilization, which had been marriage between a man and a woman. In short, if you start with the assumption of continuing revelation, on which this Church is founded, then you can understand that there is no irony in this. But if you don’t start with that assumption, you see a profound irony.
The Church believes in continuing divine revelation. The Lord commanded some of the 19th century members to practice plural marriage, which they did faithfully. When they were instructed to end that duty, they did so gladly. This is one of many instances when God has commanded His children to do something without them fully understanding why they are asked to do it; but when they faithfully did what they are asked, they are blessed and the burden is then lifted from them shortly after (The Official Declaration which ended the practice of polygamy in the Church was published in 1890).
Today, God has given us different commands, but they too are to test us and for our benefit (I know of at least one scripture that succinctly and more eloquently says the same thing I'm trying to say, but I can't remember the reference right now).
By the way, the "some who were unhappy" with the abandonment of polygamy includes the founder of the Fundamentalist Church of Jesus Christ of Latter Day Saints, of which Warren Jeffs is the current leader or "prophet". This church has nothing to do with the LDS church.
Homos already have the exact same rights as heteros: A gay male has as much right to marry a female as a straight male does. A lesbian female also has as much right to marry a male as a straight female does. As we all should know, marriage is between one man and one woman. This is how it should be.
LGBT have equal rights as normal people. I don't understand why they have their panties in such a knot.
Anywho, that's all. I just wanted to promote my site.







