Home Page
Archive > Posts > 2008 > August
Search:

End of Posting Spree
Yay, 32 posts in 31 days! :-D
I’m now going to be seriously cutting back on the posting schedule and making it a bit more erratic as keeping up with writing this amount of content was way too hard for me x.x; .
Client Side Security Fallacies
Never rely solely on information you receive from untrusted sources

One of the most laughable aspects of client/server* systems is client side based security access restrictions. What I mean by this is when credentials and actions are not checked and restricted on the server side of the equation, only on the client side, which can ALWAYS be bypassed.


To briefly explain why it is basically insane to trust a client computer; ANY multimedia, software, data, etc that has touched a person’s computer is essentially now their property. Once something has been on or through a person’s computer, the user can make copies, modify it, and do whatever the heck they want with it. This is how the digital world works. There are ways to help stop copying and modification, like hashes and encryption, but most of the ways in which things are implemented nowadays are quite fallible. There may be, for example, safeguards in place to only allow a user to use a piece of software on one certain computer or for a certain amount of time (DRM [Digital Rights Management]), but these methods are ALWAYS bypassable. The only true security comes by not letting information which people aren’t supposed to have access to cross through their computer, and keeping track of all verifiable factual information on secure servers. A long time ago at an IGDA [International Game Developers Association] meeting (I only ever went to the one unfortunately :-\), I learned an interesting truth that hadn’t occurred to me before from the lecturer. That is, that companies that make games and other software [usually] know it will sooner or later be pirated/cracked**. The true intention of software DRM is to make it hard enough to crack to discourage the crackers into giving up, and to make it take long enough so that hopefully people stop waiting for a free copy and go ahead and buy it. By the time a piece of software is cracked (if it takes as long as they hope), the companies know the majority of the remainder of the people usually wouldn’t have bought it anyways. Now I’m done with the basic explanation of client side insecurities, back to the real reason for this post.


While it is actually proper to program safeguards into client side software, you can never rely on it for true security. Security measures should always be duplicated in both client and server software. There are two reasons off the top of my head for implementing security access restrictions into the client side of software. The first is to help remove strain on servers. There is no point in asking a server if something is valid when the client can immediately confirm that it isn’t. The second reason is for speed. It’s MUCH quicker if a client can detect a problem and instantly inform the user than having to wait for a server to answer, though this time is usually imperceptible to the user, it can really add up.

So I thought I’d give a couple of examples of this to help you understand more where I’m coming from. This is a very big problem in the software industry. I find exploitable instances of this kind of thing on a very regular basis. However, I generally don’t take advantage of such holes, and try to inform the companies/programmers if they’ll listen. The term for this is white hat hacking, as opposed to black hat.


First, a very basic example. Let’s say you have a folder on your website “/PersonalPictures” that you wanted to restrict access to with a password. The proper way to do it would be to restrict access to the whole folder and all files in it on the server side, requiring a password be sent to the server to view the contents of each file. This is normally done through Apache httpd (the most utilized web server software) with an “.htaccess” file and the mod_auth (authentication) module. The improper way to do it would be a page that forwarded to the “hidden” section with a JavaScript script like the following.

if(prompt('Please enter the password')=='SecretPassword')
	document.location.href='/PersonalPictures';

The problem with this code is two fold (besides the fact it pops up a request window :-) ). First, the password is exposed in plain text to the user. Fortunately, passwords are usually not as easy to find as this, but I have found passwords in web pages and Flash code before with some digging (yes, Flash files (and Java!) are 100% decompilable to their original source code, sans comments). The second problem is that once the person goes to the URL “/PersonalPictures”, they can get back there and to all files inside it without the password, and also give it freely to others (no need to mention the fact that the URL is written in plain text here, as it’s the same as with the password). This specific problem with JavaScript was much more prevalent in the old day when people ran their web pages through free hosting sites like Geocities (now owned and operated by Yahoo) which didn’t allow for proper password protection.

This kind of problem is still around on the web, though it morphed with the times into a new form. Many server side scripts I have found across the Internet assume their client side web pages can take care of security and ignore the necessary checks in the server scripts. For example, very recently I was on a website that only allowed me to add a few items to a list. The way it was done is that there was a form with a textbox that you submitted every time you wanted to add an entry to the list. After submitting, the page was reloaded with the updated list. After you added the maximum allowed number of items to the list, when the page refreshed, the form to add more was gone. This is incredibly easy to bypass however. The normal way to do this would be to just send the modified packets directly to the server with whatever information you want in it. The easier method would be to make your own form submission page and just submit to the proper URL all you want. The Firebug extension for Firefox however makes this kind of thing INCREDIBLY easy. All that needs to be done is to add an attribute to the form to send the requests to a new window “<form action=... method=... target=_blank>”, so the form is never erased/overwritten and you can keep sending requests all you want. Using Firebug, you can also edit the values of hidden input boxes for this kind of thing.

AJAX (Asynchronous JavaScript and XML - A tool used in web programming to send and receive data from a server without having to refresh a page) has often been lampooned as insecure for this kind of reason. In reality, the medium itself is not insecure at all; it’s just how people use it.


As a matter of fact, the majority of my best and most fun Ragnarok hacking was done with these methods. I just monitored the packets that came in and out of the system, reverse engineered how they were all structured, then made modifications and resent them myself to see what I could do. With this, I was able to do things like (These should be most of the exploits; listed in descending order of usefulness & severity):

  • Duplicate items
  • Crash the server (It was never fixed AFAIK, but I stopped playing 5+ years ago. I just put that it was fixed on my site so people wouldn’t look for it ^_^; )
  • Warp to any map from any warp location (warp locations are only supposed to link to 1 other map)
  • Spoof your name during chats (so you could pretend someone else was saying something - Ender’s game, anyone? ^_^)
  • Use certain skills of other classes (I have up pictures of my swordsman using merchant skills to house a selling shop)
  • Add skills points to an item on your skill tree that is not yet available (and use it immediately)
  • Warp back to save point without dying
  • Talk to NPCs on a map from any location on that map, and sometimes from other maps (great for selling items when in a dungeon)
  • Attack with weapons much quicker than was supposed to be allowed
  • Use certain skills on creatures from any location on a map no matter how far they are
  • Equip any item in any spot (so you could equip body armor on your head slot and get much more free armor defense points)
  • Run commands on your party/guild and in chat rooms as if you were the leader/admin
  • Rollback a characters stat’s to when you logged on that session (part of the dupe hack)
  • Bypass text repetition, length, and curse filters
  • Find out user account names

The original list is here; it should contain most of what I found. I took it down very soon after putting it up (replacement here) because I didn’t want to explicitly screw the game over with people finding out about these hacks (I had a lot of bad encounters with the company that ran the game, they refused to acknowledge or fix existing bugs when I reported them). There were so many things the server didn’t check just because the client wasn’t allowed to do them naturally.


Here are some very old news stories I saved up for when I wrote about this subject:


Just because you don’t give someone a way to do something doesn’t mean they won’t find a way.



*A server is a computer you connect to and a client is the connecting computer. So all you people connecting to this website are clients connecting to my web server.
**“Cracked” usually means to make a piece of software usable when it is not supposed to be, bypassing the DRM
Linux Runlevels
“Safe Mode” for Linux

I am still, very unfortunately, looking into the problem I talked about way back here :-( [not a lot, but it still persists]. This time I decided to try and boot the OS into a “Safe Mode” with nothing running that could hinder performance tests (like hundreds of HTTP and MySQL sessions). Fortunately, my friend whom is a Linux server admin for a tech firm was able to point me in the right direction after researching the topic was proving frustratingly fruitless.


Linux has “runlevels” it can run at, which are listed in “/etc/inittab” as follows:

# Default runlevel. The runlevels used by RHS are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)

So I needed to get into “Single user mode” to run the tests, which could be done two ways. Before I tell you how though, it is important to note that if you are trying to do something like this remotely, normal SSH/Telnet will not be accessible, so you will need either physical access to the computer, or something like a serial console connection, which can be routed through networks.

So the two ways are:
  • Through the “init” command. Running “init #” at the console, where # is the runlevel number, will bring you into that runlevel. However, this might not kill all currently unneeded running processes when going to a lower level, but it should get the majority of them, I believe.
  • Append “s” (for single user mode) to the grub configuration file (/boot/grub/grub.conf on my system) at the end of the line starting with “kernel”, then reboot. I am told appending a runlevel number may also work.
SpamSoap
Info on a spam filtering solution

I was long ago pointed to SpamSoap by a friend who helped lead the IT department of a rather large and prestigious law firm. It seems to be an excellent spam filtering solution, but can get to be rather expensive as it is a pay per month per mailbox program, kind of (you pay in groups, like 1-5, 6-10, ..., 201-250, etc). I wouldn’t mind too much trying out the filtering with Google’s domain email program, but Google has marked multiple legitimate emails as spam in my Gmail account in the past, and I don’t trust their cloud computing approach too much with my data.

I originally set up a SpamSoap account 2 to 3 years ago for a single client, and have more recently been setting it up for myself, family, and some other clients. The client that has been using it for that time has been very happy with it, and the only reason I didn’t start using it for myself and others at that time was because it marked a legitimate email as spam for me, and diagnosing why didn’t get very far with their tech support. I have however done a lot more research into their system recently, asking their staff lots and lots of questions to understand the system more, and believe I know why it was caught as spam. Unfortunately, their documentation is horrible and their site doesn’t really go into details at all, so information on how it all works and how to set some things up is not easy to come by. The problem, in my case, is that where the email arrives from to the SpamSoap servers is considered. Servers that SpamSoap receives a lot of spam from are marked as more likely to be sending spam, so unfortunately, forwarding emails from another address to an address on a domain filtered by SpamSoap is a bad idea, as then the whole server that manages the domain that is forwarding is marked as sending a spam message. However, this is only one of many spam determining metrics used, and, of course, it takes many spam messages to make a difference for a server, but if you are forwarding from an address that receives a lot, bad things happen :-). Anyways, here’s some of the information I gathered on how their system works, and other important tidbits, if anyone is interested in using them.


The way SpamSoap works is you pay for “user accounts”. Each user account has 1 white/black list associated with it (which isn’t technically needed, but helps things along), 1 quarantine area, and receives (if they choose too) daily quarantine reports to their master address. Each user account can have email aliases tied to it, but due to the quarantine area it’s important to separate users. Pricing is based upon number of user accounts in tiers, like 1-5=$15/month, 6-10=$25/month, 11-20=$42/month, and so on.

The actual filtering is done by setting MX records for the domains to be filtered to SpamSoap, and SpamSoap actually just sets up a proxy connection between the sending server and your server for delivery. If a message is detected as spam during this process, the delivery attempt is canceled.

There are 2 types of incoming spam that can be filtered different ways by the system; high scoring (100% likelihood) spam, and medium scoring (>90% or something like that, an exact number is not obtainable) spam. With either of these you can choose to either: Tag the message with “[SPAM]” in the header, quarantine the message, deny delivery, or let it through. There are also filtering rules and actions you can set up on based other criteria, like: viruses, content (profanity, racial insensitivity, sexual overtones, etc), click protection, and attachments.

Domain grouping with aliases is a slightly more complicated topic. You can have as many domains as you want, and it does not affect pricing; only the number of user accounts does (or if you choose other options, listed here).

Basically, first, you have master domains. A master domain can have multiple alias domains tied to it. All email addresses with the first section as the same are aliases of each other in this setup. For example, if domain1.com is a master, and domain2.com is an alias, then me@domain1.com and me@domain2.com are email aliases of each other no matter what. If you wanted to alias “myself” with that same user, then those 2 plus me@domain1.com and me@domain2.com would all be the same user. In this setup, if you wanted me@domain1.com and me@domain2.com as separate users, you would have to split up the domains to not be aliased (in a group). You cannot however alias emails across domains that are not aliased, so for example, if both domain1.com and domain2.com were master domains, you could not alias me@domain1.com and myself@domain2.com. These configuration issues really only tend to be problems with generic names like “info@” and “admin@”, for example, a problem would creep up if me@domain1.com wanted to alias myself@domain2.com but info@domain1.com and info@domain2.com needed to be separate user accounts. If this happened, domain1.com and domain2.com would have to both be their own master domains and myself&me would have to be separate user accounts and the white/black lists would need to be duplicated, and 2 quarantine reports would come in.


I would personally recommend for all normal user inboxes to have high likelihood spam denied, medium likelihood spam as quarantined, and anything with a virus as denied with a return notification. Also, anyone that wanted to not be filtered on a domain that runs through SpamSoap would need to be on one user account as aliases with the no filtering option set. The same goes for users who do not need a quarantine (freeloaders ^_^; ), in which one user account could be set up for basic filtering w/o quarantine and lists.

Because of the no forwarding problem as stated above, all domains would need to be pushed through SpamSoap with emails that needed filtered, and then they could be forwarded afterwards to the appropriate inbox from your own servers. So, in other words, domains that go through SpamSoap cannot be forwarded TO and filtered unless the domains that are forwarding to it are also set up with SpamSoap. The consequences of such are higher likelihood of anything being forwarded being counted as spam and that server being marked as a potential spammer.


SpamSoap also has separate reseller and partner programs for people that forward them business, but they would only be useful if one sent a lot of business their way, generating SpamSoap lots of revenue.


I hope that all made sense, it wasn’t easy to write out x.x; .

WinampRC
When the broad solution won’t cut it, get specific

I wrote earlier about my new entertainment center and how evil it has been. Unfortunately, things have only been getting worse. After trying to play music on it while torrenting or doing other things, I found out it can pretty much only do 1 task at a time, and barely, so I’ve decided to make it now only act as a music station and occasionally watch video through it when the video doesn’t require too much power. I even found an old 256MB stick of PC2700 RAM to put in it (yay for finding random antiquated computer parts around the house!), which did not help, as expected. This regrettably means I will have to keep my current home server at its job, which is a major power hog, and way too powerful for what it does, but ah well.

When listening to music I have the obvious need to easily pause playback, and the occasional need to skip songs I don’t feel like listening to ATM. I would normally use the multiple remote desktop hack for this, but the computer just can’t handle 2 XP sessions going at once. For this reason, Synergy (a great way to do KVM through software) would normally be the perfect fallback solution, except I’d rather not have to use my TV (which is the computer’s primary video output) just to control music on the surround sound system. That, and I’d rather not have to use the TV at all for the computer, because, as written before, I have to go through 5 minutes of hoops to get video working right on it. So the solution was to find a remote way to control Winamp, the only music player I’ve used since around ’98 :-).

After some searching, I found WinampRC, and it fits the remote control solution perfectly, especially as it is super lightweight! The only real problem I have with it is that its playlist editor is rather underdeveloped, and it’s hard to add music, especially in batches. Another minor problem is that there are no global keyboard shortcuts :-(, but I can fix this later with other software through macros. All in all though, I’m very happy with it :-).


[Edit on 2008-09-03 @ 7:34am]

Unfortunately, one other semi-major problem has crept up with the program, and it will be a hard one, if not impossible, to diagnose. Sometimes a few seconds after switching over to a new song, it automatically skips to the next song on the list. I can only assume this is because it has improperly measured audio playback times and thinks the previous song finished after it already did. This isn’t as bad as it could be though, and is only occasional, so I won’t be looking for another solution just yet.


[Edit on 2008-09-06 @ 4:30pm]

Ok, just using a normal keyboard, with a PS/2 extension cord, hooked up to the computer to issue shortcuts ~.~ . At least I don’t have to keep the TV on still.

parseInt in JavaScript
Know your libraries!!!

A very important part of programming languages is the standard library that comes with them. PHP has one of the strongest base standard libraries I’ve ever seen. It’s also great to always be able to just throw out any function call in a script and not need look up the library file that you need to include! Perl has one of the largest official library sets (not included by standard) that I know if, but I find it a pain always having to remember which libraries I have to include for all the different functions I need. Though this is probably just because I don’t use Perl that much, as I have most of the C standard include libraries memorized, heh.

To properly use any function from any library, it is important to know exactly how it is supposed to work and any idiosyncrasies. You can never know EXACTLY how a function works unless you have the source for it, but you can pretty much always guess the gist of the internals. This is one of the reasons I have always enjoyed writing my own Personal Libraries, besides that fact that I find it fun getting down in the nitty gritty of things. Not knowing the inner workings of a function is not really a problem when programming, as this is the whole point of encapsulation, and documentation is usually sufficient enough.

I ran into a problem with the parseInt (sister of parseFloat) JavaScript function a long ways back however (this topic has been written down for years to talk about). JavaScript is kind of special in that it is a language that you just kind of jump into and assume you can quickly pick up everything, as there is very very little to its base library. One would assume that the “parseInt” function would just turn anything given to it into an integer, so “parseInt('123')” would return “123” and “parseInt(1.4)” would return “1”, as expected. The gotcha comes in if you pass a 0 before an integral number in a string, in which case it assumes the number is in octal (base 8 math). I found this out by accident when parsing time strings, where minutes are always 2 digits with leading 0s. When “parseInt('09')” is called, it returns “0” because 9 is not a part of base 8 math. Oops! parseInt stops at the first character it identifies that is not part of the base it is currently parsing in. Incidentally parseInt will also parse hex[adecimal] (base 16) strings, as per standard C syntax, for example, “parseInt('0x10')” returns “16”. I would have just said standard hex syntax, but not all languages represent hex in that manner, for example, Visual Basic requires &H before a hex number instead, like “&H10” represents “16”.

Microsoft IIS Bug
Bad Programming: Only using file extensions as an indicator

According to a Microsoft KB article titled “Virtual directory names with executable extensions are not used correctly”, using a virtual folder ending in an executable extension (like .com, .exe, .dll, or .sh) under the web server for IIS [Microsoft’s Internet information services server suite] makes the contents inside the folder unviewable. This behavior itself is kind of silly, as you’d assume a web server would always check to see if something was a file or folder first.

Unfortunately, this doesn’t apply to just virtual folders, but all folders under an IIS web server, as I found out a few years ago when I backed up a site that I knew would be taken down very soon (ironically, because the company [SysInternals] was being taken over by Microsoft) and mirrored it on my Home Server, which runs IIS.

The solution I used was to add a character (in my case an underscore “_”) to the end of all the directory names ending in “.com” and then doing a global regular expression replace through all files in the mirror to replace any occurrences of these directories.


Search For: “(DOMAIN1|DOMAIN2|DOMAIN3)([\\/])
Replace With: “$1_/$2

I still plan on getting up some site mirrors of places that no longer exist and such for the miscellaneous section one of these days...

Custom Fonts in Web Browsers
Solutions for a strict medium

A very important part of the design world is fonts, but it is an unfortunately annoying part of web browser land. There are very few fonts that come by default with OSs and even less default ones that match each other across all OSs, so your website won’t look the same across all platforms unless you use the right combinations. It’s much pretty guaranteed that if you want anything even remotely special in terms of a font somewhere on your website, you will be out of luck to match it across all platforms.

The commonplace solution for this is, of course, creating images for whenever you need special fonts displayed. While this is the most elegant solution, it is only appropriate for special circumstances, and not normal site content, as image file sizes can get ridiculous, and you lose plain text advantages like searchability and search engine recognition. Another solution is to request the user to download the font, like here. While this is a valid solution, the vast majority of users would not download the font because, mostly, they don’t care enough, and secondly, people generally know not to go download unfamiliar files on the internet when they don’t have to, for security reasons.

This has actually been a problem for me recently as I realized some of the default fonts I use for my site, which have always come with Windows, do not have default equivalents that come with most Linux distributions, as I had assumed. That’s a topic for a different day though.


So I had a customer recently request the ability to dynamically display some text in a certain font, so I told him there are 2 solutions. The first would be to use JavaScript to load translucent PNG images, the second would be to embed a Flash applet, as Flash can store font files internally for use. So here are instructions and examples of both:


JavaScript + PNG Translucency (alpha blending) Method
There are 2 ways to create the PNG translucency in Photoshop; one easier but less effective way that doesn’t maintain quality, and a slightly more complex path with better results.
  • To start off for both paths, a screenshot (ALT+PRINT SCREEN to take only the current window) will need to be taken of the font rendered in black against a white background. This can be done in your favorite word processor as long as it properly renders with translucency, or (for Windows) by just going to the font file in “c:\windows\fonts” and opening it, which uses “fontview.exe”.
  • After you have the screenshot, open a new file in Photoshop (File > New OR CTRL+N) and paste the screenshot into a new layer (Edit > Paste OR CTRL+V)
  • Delete the background layer, which requires the layer window is open (Window > Layers OR F7 to toggle its display). Right click the text portion “Background” of the background layer, and choose “Delete Layer”.
  • Select the region that contains your font’s alphabet (M for selection tool) and crop it (Image > Crop).
  • You might want to zoom in at this point for easier viewing (CTRL++ for in, CTRL+- for out).
  • The easy way from there:
    • Deselect the area (Select > Deselect OR CTRL+D).
    • Select the Magic Wand tool (W), set Tolerance to 0, check Anti-Aliased, and uncheck Contiguous
    • Select a pure white pixel and then delete the selection (DELETE)
    • You now have a translucent image that you can save and use, but the translucency isn’t that of the original font, as that is not how the magic wand tool works.
    Example using “Aeolus True Type Font” (Set against a green background via HTML for example sake)
    Translucent Aeolus True Type Font Easy Method
  • The better way:
    • Add a mask to your current layer (Layer > Add Layer Mask > Reveal All)
    • Go to the channels window (Window > Channels to toggle its display, it should be in the same window as Layers, in a separate tab) and select either the red, green, or blue layer. It doesn’t matter which as they should all hold the exact same values (grayscale [white-black colors] have the same red, green, and blue values), so red channel (CTRL+1) is fine.
    • Copy the channel (CTRL+C) (the entire workspace should still be selected after the crop)
    • Select the mask channel (CTRL+\), and you also need to make it visible (toggle the little eyeball icon besides it)
    • Paste into the mask channel (CTRL+V), invert it (Image > Adjustments > Invert OR CTRL+I), and then make it invisible again (untoggle little eyeball icon besides it)
    • Reselect the RGB contents (CTRL+~) and flood fill it with black [or your color of choice]: Paint Bucket Tool (G), 255 tolerance, no antialias
    • You now have a translucent image of the font that you can save and use that has the original font quality. You can test it by adding a white layer below it.
    Example using “Aeolus True Type Font” (Set against a green background via HTML for example sake)
    Translucent Aeolus True Type Font Good Method
From there the image file can be split up into individual images called “a.png”, “b.png”, etc, and a simple JavaScript string could be used to convert a string to display the picture text like “'MyString'.replace(/(.)/g, '<img src="$1.png">')”.
Example (this is produced by JavaScript):

Internet Explorer 6 also has the added problem of not allowing translucent images, so a hack is needed for this. Basically, an element (like a blank image) needs to have its filter style set like the following (JavaScript DirectX hack...)
style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='IMAGELOCATION', sizingMethod='scale')";


Flash Method
While this method is much quicker to complete and easier to pull off than the previous method, it is also more prone to problems and browser incompatibility. Flash and JavaScript never got along well enough in my book. Anywho, here’s the process. (Source file here)
  • In a new Flash document (v5.0+), create a text box with the following properties:
    • Type: “Dynamic Text”
    • var: MyText
    • Font: YOURFONTCHOICE
    • Embed (button): Select the set of characters the dynamic text box might display. The less glyphs you select, the smaller the output file will be. I included all alpha-numeric+punctuation in the below example (24.3KB).
  • That’s all you need for the Flash file, so all that’s left now is the JavaScript. The following function will set the text for you inside the movie. Also, you should set the embed (for normal browsers) and object (for IE) tags as different “id”s. The wmode is an important parameter here too, in that it makes the background invisible and the Flash applet more a part of the web page (not a “separate window”).
    <object width="300" height="40" id="CustomFontIE" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000">
    	<param name="movie" value="OtherContent/CustomFonts/CustomFont.swf">
    	<param wmode="transparent">
    	<embed src="OtherContent/CustomFonts/CustomFont.swf" wmode="transparent" width="300" height="40" id="CustomFont" type="application/x-shockwave-flash">
    </object>
    <script type="text/javascript">
    	var IsIE=(navigator.appName.indexOf('Microsoft')!=-1);
    	function SetFlashText(NewText) { document.getElementById('CustomFont'+(IsIE ? 'IE' : '')).SetVariable('MyText', NewText); }
    </script>
    		
Example: (Set against a green background via HTML for example sake)
Enter text here:
Flash applet:



Core Dump Files
Not all OSs crash in the same way :-)

If you ever find a file named “core.#” when running Linux, where # is replaced by a number, it means something crashed at some point. Most of the time, you will probably just want to delete the file, but sometimes you may wonder what crashed. To do this, you use gdb (The GNU debugger), a very power tool, to analyze the core dump file.

gdb --core=COREFILENAME

Near the very bottom of the blob of outputted text after running this command, you should see a line that says “Core was generated by `...'.”. This tells you the command line of what crashed. To exit gdb, enter “quit”. You can also use gdb to find out what actually happened and troubleshoot/debug the problem, but that’s a very long and complex topic.


Recently, I started seeing hundreds of core dump files taking up gigabytes of space showing up in “/usr/local/cpanel/whostmgr/docroot/” on multiple of our web servers. According to several online sources, it seems cPanel (web hosting made easy!) likes to dump many, if not all, of its programs' core files into this directory. In our case, it has been “dnsadmin” doing the crashing. We’ve been having some pretty major DNS problems lately, this kind on the name server level, so I may have to rebuild our DNS cluster in the next few days. Joy.

Comparing Log File
Slow news day...

So for reasons I’m not going to go into, today I had to compare some log files. I was tempted to write the code in C, just because I miss it so much these days x.x;, but laziness won out, especially as there weren’t that many log files and they weren’t that large, so I wrote it in PHP.

Nothing else to this post except the working code which took me about 5 minutes to type out... The function goes through one directory and all of its subdirectories and checks all files against the same path in a second directory. If the file doesn’t exist in the second directory or its contents doesn’t match the first file up to the first file’s length, a message is outputted.


//Start the log run against 2 root directories
TestLogs("/DIR1", "/DIR2");

function TestLogs($RootDir1, $RootDir2, $CurDir="")
{
	//Iterate through the first directory
	$Dir1=opendir("$RootDir1$CurDir");
	$SubDirs=Array(); //Holds subdirectories
	while($File=readdir($Dir1))
		if($File=="." || $File=="..") //Skip . and ..
			continue;
		else if(is_dir("$RootDir1$CurDir/$File")) //Do not try to compare directory entries
			$SubDirs[]=$File; //Remember subdirectories
		else if(!file_exists("$RootDir2$CurDir/$File"))
			print "File '$CurDir/$File' does not exist in second directory.<br>";
		else if(file_get_contents("$RootDir1$CurDir/$File")!=substr(file_get_contents("$RootDir2$CurDir/$File"),0,filesize("$RootDir1$CurDir/$File"))) //Both files exist, so compare them - if first file does not equal second file up to the same length, output error
			print "'$CurDir/$File' does not match.<br>";
	
	//Run subdirectories recursively after current directories' file-run so directories do not get split up
	foreach($SubDirs as $NewDir)
		TestLogs($RootDir1, $RootDir2, "$CurDir/$NewDir");
}
Regular Expression Examples
Finding multiple domain’s name servers

Today I thought I’d give a demonstration on the use of regular expressions [reference page here]. Regular expressions are basically a simplified scripting language for finding and replacing complex text strings, and are implemented into much of today’s software which involve a lot of text editing. They are a fabulously handy tool for computer users and are especially useful for programmers. I believe RegExps actually originally gained their notoriety through the Perl programming language. I also recently heard that it is definite that the new version of C++ (C++0x) will have native library support for regular expressions, yay!

Since I posted yesterday on DNS stuff, and have the examples from it handy, I figured I’d use those :-).


Let’s say you had a group of .com domains and wanted to find out their name servers (I’ve had to do this when switching to new name servers to make sure all the domains we did not control at the registrar level had their name servers set to the new ones). For this example, we will use the following domains “castledragmire.com”, “riaboy.com”, “NonExistantDomainA.com”, and “dakusan.com”.

  • First, we’d need to have the list of the domains, for this example, one domain per line is used.
    castledragmire.com
    riaboy.com
    NonExistantDomainA.com
    dakusan.com
  • Next, we need to turn them into a bash (Linux) script to grab all the information we need.
    Replace: “^(.*)$
    With: “echo '!?$1?!'; host -t ns $1 a.gtld-servers.net | grep ' name server ';”
    Sample output: (The !? ?! stuff are markers for easier viewing and parsing)
    echo '!?castledragmire.com?!'; host -t ns castledragmire.com a.gtld-servers.net | grep ' name server ';
    echo '!?riaboy.com?!'; host -t ns riaboy.com a.gtld-servers.net | grep ' name server ';
    echo '!?NonExistantDomainA.com?!'; host -t ns NonExistantDomainA.com a.gtld-servers.net | grep ' name server ';
    echo '!?dakusan.com?!'; host -t ns dakusan.com a.gtld-servers.net | grep ' name server ';
  • Next, we run the script, and it would output the following:
    !?castledragmire.com?!
    castledragmire.com name server ns3.deltaarc.com.
    castledragmire.com name server ns4.deltaarc.com.
    !?riaboy.com?!
    riaboy.com name server ns3.deltaarc.com.
    riaboy.com name server ns4.deltaarc.com.
    !?NonExistantDomainA.com?!
    !?dakusan.com?!
    dakusan.com name server ns3.deltaarc.com.
    dakusan.com name server ns4.deltaarc.com.
  • Next, we would keep running the following regular expression until no more replacements are found.
    This would combine all domains with multiple name servers onto one line with name servers separated by spaces.
    Replace: “(.*?) name server (.*)\n\1 name server (.*)
    With: “$1 name server $2 $3
    It would output the following:
    !?castledragmire.com?!
    castledragmire.com name server ns3.deltaarc.com. ns4.deltaarc.com.
    !?riaboy.com?!
    riaboy.com name server ns3.deltaarc.com. ns4.deltaarc.com.
    !?NonExistantDomainA.com?!
    !?dakusan.com?!
    dakusan.com name server ns3.deltaarc.com. ns4.deltaarc.com.
  • The final regular expression would turn the output into a single line per domain, followed by its domain servers. The current extra line before the list of name servers is to help spot any domains that did not provide us with name servers.
    Replace: “!\?(.*?)\?!\n\1 name server (.*)
    With: “#$1 \t $2
    Which would output the final following data:
    #castledragmire.com ns3.deltaarc.com. ns4.deltaarc.com.
    #riaboy.com ns3.deltaarc.com. ns4.deltaarc.com.
    !?NonExistantDomainA.com?!
    #dakusan.com ns3.deltaarc.com. ns4.deltaarc.com.
    This data could be directly pasted into Excel, which would put the first column as domains and second column as name servers).
Diagnosing DNS Problems
Digging until you find the root

Yesterday I wrote a bit about the DNS system being rather fussy, so I thought today I’d go a bit more into how DNS works, and some good tools for problem solving in this area.


First, some technical background on the subject is required.
  • A network is simply a group of computers hooked together to communicate with each other. In the old days, all networking was done through physical wires (called the medium), but nowadays much of it is done through wireless connections. Wired networking is still required for the fastest communications, and is especially important for major backbones (the super highly utilized lines that connect networks together across the world).
  • A LAN is a local network of all computers connected together in one physical location, whether it be a single room, a building, or a city. Technically, a LAN doesn’t have to be localized in one area, but it is preferred, and we will just assume it is so for arguments sake :-).
  • A WAN is a Wide (Area) Network that connects multiple LANs together. This is what the Internet is.
  • The way one computer finds another computer on a network is through its IP Address [hereby referred to as IPs in this post only]. There are other protocols, but this (TCP/IP) is by far the most widely utilized and is the true backbone of the Internet. IPs are like a house’s address (123 Fake Street, Theoretical City, Made Up Country). To explain it in a very simplified manner (this isn’t even remotely accurate, as networking is a complicated topic, but this is a good generalization), IPs have 4 sections of numbers ranging from 0-255 (1 byte). For example, 67.45.32.28 is a (class 4) IP. Each number in that address is a broader location, so the “28” is like a street address, “32” is the street, “45” is the city, and “67” is the country. When you send a packet from your computer, it goes to your local (street) router which then passes it to the city router and so on until it reaches its destination. If you are in the same city as the final destination of the packet, then it wouldn’t have to go to the country level.
  • The final important part of networking (for this post) is the domain system (DNS) itself. A domain is a label for an IP Address, like calling “1600 Pennsylvania Avenue” as “The White House”. As an example, “www.castledragmire.com” just maps to my web server at “209.85.115.128” (this is the current IP, it will change if the site is ever moved to a new server).

Next is a brief lesson on how DNS itself works:
  • The root DNS servers (a.root-servers.net through m.root-servers.net) point to the servers that hold top-level-domain information (.com, .org., .net, .jp, etc)
    Examples of these servers are as follows:
    auns1.audns.net.au
    bizE.GTLD.biz
    caCA04.CIRA.ca
    cnA.DNS.cn
    com&netA.GTLD-SERVERS.NET
    deZ.NIC.de
    euU.NIC.eu
    infoB9.INFO.AFILIAS-NST.ORG
    orgTLD1.ULTRADNS.NET
    tvC5.NSTLD.COM
  • Next, these root name servers (like A.GTLD-SERVERS.NET through M.GTLD-SERVERS.NET for .com) hold two main pieces of information for ALL domains under their top-level-domain jurisdiction:
    • The registrar where the domain was registered
    • The name server(s) that are responsible for the domain
    Only registrars can talk to these root servers, so you have to go through the registrar to change the name server information.
  • The final lowest rung in the DNS hierarchy is name servers. Name servers hold all the actual addressing information for a domain and can be run by anyone. The 2 most important (or maybe relevant is a better word...) types of DNS records are:
    • A: There should be many of these, each pointing a domain or subdomain (castledragmire.com, www.castledragmire.com, info.castledragmire.com, ...) to a specific IP address (version 4)
    • SOA: Start of Authority - There is only one of these records per domain, and it specifies authoritative information including the primary name server, the domain administrator’s email, the domain serial number, and several timeout values relating to refreshing domain information.

Now that we have all the basics down, on to the actual reason for this post. It’s really a nuisance trying to explain to people why their domain isn’t working, or is pointing to the wrong place. So here’s why it happens!

Back in the old days, it often took days for DNS propagation to happen after you made changes at your registrar or elsewhere, but fortunately, this problem is of the past. The reason for this is that ISPs and/or routers cached domain lookups and only refreshed them according to the metrics in the SOA record mentioned above, as they were supposed to. This was done for network speed reasons, as I believe older OSs might not have cached domains (wild speculation), and ISPs didn’t want to look up the address for a domain every time it was requested. Now, though, I rarely see caching on any level except at the local computer; not only on the OS level, but even some programs cache domains, like FireFox.

So the answer for when a person is getting the wrong address for a domain, and you know it is set correctly, is usually to just reboot. Clearing the DNS cache works too (for the OS level), but explaining how to do that is harder than saying “just reboot” ^_^;.

To clear the DNS cache in XP, enter the following into your “run” menu or in the command prompt: “ipconfig /flushdns”. This does not ALWAYS work, but it should work.


If your domain is still resolving to the wrong address when you ping it after your DNS cache is cleared, the next step is to see what name servers are being used for the information. You can do a whois on your domain to get the information directly form the registrar who controls the domain, but be careful where you do this as you never know what people are doing with the information. For a quick and secure whois, you can use “whois” from your linux command line, which I have patched through to a web script here. This script gives both normal and extended information, FYI.

Whois just tells you the name servers that you SHOULD be contacting, it doesn’t mean these are the ones you are asking, as the root DNS servers may not have updated the information yet. This is where our command line programs come into play.

In XP, you can use “nslookup -query=hinfo DOMAINNAME” and “nslookup -query=soa DOMAINNAME” to get a domain’s name servers, and then “nslookup NAMESERVER DOMAINNAME” to get the IP the name server points too. For example: (Important information in the following examples are bolded and in white)

C:\>nslookup -query=hinfo castledragmire.com
Server:  dns-redirect-lb-01.texas.rr.com
Address:  24.93.41.127

castledragmire.com
        primary name server = ns3.deltaarc.com
        responsible mail addr = admins.deltaarc.net
        serial  = 2007022713
        refresh = 14400 (4 hours)
        retry   = 7200 (2 hours)
        expire  = 3600000 (41 days 16 hours)
        default TTL = 86400 (1 day)

C:\>nslookup -query=soa castledragmire.com
Server:  dns-redirect-lb-01.texas.rr.com
Address:  24.93.41.127

Non-authoritative answer:
castledragmire.com
        primary name server = ns3.deltaarc.com
        responsible mail addr = admins.deltaarc.net
        serial  = 2007022713
        refresh = 14400 (4 hours)
        retry   = 7200 (2 hours)
        expire  = 3600000 (41 days 16 hours)
        default TTL = 86400 (1 day)

castledragmire.com      nameserver = ns4.deltaarc.com
castledragmire.com      nameserver = ns3.deltaarc.com
ns3.deltaarc.com        internet address = 216.127.92.71

C:\>nslookup ns3.deltaarc.com castledragmire.com
Server:  ev1s-209-85-115-128.theplanet.com
Address:  209.85.115.128

Name:    ns3.deltaarc.com
Address:  216.127.92.71

Nslookup is also available in Linux, but Linux has a better tool for this, as nslookup itself doesn’t always seem to give the correct answers, for some reason. So I recommend you use dig if you have it or Linux available to you. So with dig, we just start at the root name servers and work our way up to the SOA name server to get the real information of where the domain is resolving to and why.

root@www [~]# dig @a.root-servers.net castledragmire.com

; <<>> DiG 9.2.4 <<>> @a.root-servers.net castledragmire.com
; (2 servers found)
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5587
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 13, ADDITIONAL: 14

;; QUESTION SECTION:
;castledragmire.com.            IN      A

;; AUTHORITY SECTION:
com.                    172800  IN      NS      H.GTLD-SERVERS.NET.
com.                    172800  IN      NS      I.GTLD-SERVERS.NET.
com.                    172800  IN      NS      J.GTLD-SERVERS.NET.
com.                    172800  IN      NS      K.GTLD-SERVERS.NET.
com.                    172800  IN      NS      L.GTLD-SERVERS.NET.
com.                    172800  IN      NS      M.GTLD-SERVERS.NET.
com.                    172800  IN      NS      A.GTLD-SERVERS.NET.
com.                    172800  IN      NS      B.GTLD-SERVERS.NET.
com.                    172800  IN      NS      C.GTLD-SERVERS.NET.
com.                    172800  IN      NS      D.GTLD-SERVERS.NET.
com.                    172800  IN      NS      E.GTLD-SERVERS.NET.
com.                    172800  IN      NS      F.GTLD-SERVERS.NET.
com.                    172800  IN      NS      G.GTLD-SERVERS.NET.

;; ADDITIONAL SECTION:
A.GTLD-SERVERS.NET.     172800  IN      A       192.5.6.30
A.GTLD-SERVERS.NET.     172800  IN      AAAA    2001:503:a83e::2:30
B.GTLD-SERVERS.NET.     172800  IN      A       192.33.14.30
B.GTLD-SERVERS.NET.     172800  IN      AAAA    2001:503:231d::2:30
C.GTLD-SERVERS.NET.     172800  IN      A       192.26.92.30
D.GTLD-SERVERS.NET.     172800  IN      A       192.31.80.30
E.GTLD-SERVERS.NET.     172800  IN      A       192.12.94.30
F.GTLD-SERVERS.NET.     172800  IN      A       192.35.51.30
G.GTLD-SERVERS.NET.     172800  IN      A       192.42.93.30
H.GTLD-SERVERS.NET.     172800  IN      A       192.54.112.30
I.GTLD-SERVERS.NET.     172800  IN      A       192.43.172.30
J.GTLD-SERVERS.NET.     172800  IN      A       192.48.79.30
K.GTLD-SERVERS.NET.     172800  IN      A       192.52.178.30
L.GTLD-SERVERS.NET.     172800  IN      A       192.41.162.30

;; Query time: 240 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Sat Aug 23 04:15:28 2008
;; MSG SIZE  rcvd: 508

root@www [~]# dig @a.gtld-servers.net castledragmire.com

; <<>> DiG 9.2.4 <<>> @a.gtld-servers.net castledragmire.com
; (2 servers found)
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35586
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 2

;; QUESTION SECTION:
;castledragmire.com.            IN      A

;; AUTHORITY SECTION:
castledragmire.com.     172800  IN      NS      ns3.deltaarc.com.
castledragmire.com.     172800  IN      NS      ns4.deltaarc.com.

;; ADDITIONAL SECTION:
ns3.deltaarc.com.       172800  IN      A       216.127.92.71
ns4.deltaarc.com.       172800  IN      A       209.85.115.181

;; Query time: 58 msec
;; SERVER: 192.5.6.30#53(192.5.6.30)
;; WHEN: Sat Aug 23 04:15:42 2008
;; MSG SIZE  rcvd: 113

root@www [~]# dig @ns3.deltaarc.com castledragmire.com

; <<>> DiG 9.2.4 <<>> @ns3.deltaarc.com castledragmire.com
; (1 server found)
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26198
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 0

;; QUESTION SECTION:
;castledragmire.com.            IN      A

;; ANSWER SECTION:
castledragmire.com.     14400   IN      A       209.85.115.128

;; AUTHORITY SECTION:
castledragmire.com.     14400   IN      NS      ns4.deltaarc.com.
castledragmire.com.     14400   IN      NS      ns3.deltaarc.com.

;; Query time: 1 msec
;; SERVER: 216.127.92.71#53(216.127.92.71)
;; WHEN: Sat Aug 23 04:15:52 2008
;; MSG SIZE  rcvd: 97

Linux also has the “host” command, but I prefer and recommend “dig”.


And that’s how you diagnose DNS problems! :-). For reference, two common DNS configuration problems are not having your SOA and NS records properly set for the domain on your name server.


I also went ahead and added dig to the “Useful Bash commands and scripts” post.

Windows Hosts File
When DNS decides to be finicky

Another of my favorite XP hacks is modifying domain addresses through XP’s Hosts file. You can remap where a domain points on your local computer by adding an IP address followed by a domain in the “c:\windows\system32\drivers\etc\hosts” file.

Domain names are locally controlled, looked up, and cached on your computer at the OS level, so there are simple hacks like this for other OSs too.

I often utilize this solution as a server admin who controls a lot of domains (Over 100, and I control most of them at the registrar level too ^_^). The domain system itself across the web is incredibly fastidious and prone to problems if not perfectly configured, so this hack is a wonderful time saver and diagnostic tool until things resolve and work properly.

Computers are Evil
Setting up new computers can be quite the hassle

The new home server for the new entertainment center I recently set up has made itself out to be quite a nuisance. I am unsure as to whether I will keep using it or not, but fortunately, I have not yet taken down my old home server, as I wanted to do some break in testing on the new one first.

Setting up new computers is almost always a pain in the ass, what with installing and configuring all the software from scratch (which always includes a format and new OS), and making sure all the hardware works properly and finding drivers for it (sometimes when you don’t even have the proper information on what that hardware is). But sometimes, computers can go above and beyond the normal setup nuances and annoyances and be downright evil. I have long proclaimed to people that computers have personalities and minds of their own and they decide when and where they want to be accommodating or uncooperative. Besides all the normal computer setup problems (including not knowing what the hardware was and having to figure that out), this one also had a few more doozies.

The first big problem started with the fact that I wanted to use this computer for video output, and it does not have an AGP slot. As I contemplated in the previous post on this topic, I went ahead and bought a PCI Geforce 5200 for $27.79 including shipping. The card did not fit properly in the new case, so I had to unscrew a few things, which were fortunately designed for just that reason. Then the big problem came up in that video outputted from the s-video port on the card showed up on the TV at a 50% over zoom, so I couldn’t see half the screen. I couldn’t test the monitor output port either because it is DVI, and I have no DVI monitors, alas. After 2 or 3 hours of tinkering with it and throwing everything plus the kitchen sink at the problem, including trying a different s-video cable, I finally stumbled on the solution and got it working, yay. That is... until after I rebooted and it wasn’t working again x.x;. Another 20 or so more minutes of tinkering got it fixed again, and I was able to quickly hone down on a procedure to fix the problem on the next reboot, optimizing it with each successive reboot over the next few days. The procedure is as follows: (The TV over s-video starts as the primary monitor, and I have a second monitor connected to the VGA port to the onboard graphics card)

  • Open “Display Properties” [Right click Desktop > Properties] > Settings
  • Attach second monitor so I can see what I’m doing
  • Open NVidia Control Panel
  • Rotate screen to 90 degrees. It only wants to rotate the screen at 1024x768, which is too high a resolution for the TV, so it kicks the resolution down to 640x480 while rotating
  • Keep setting the screen to no rotation (0 degrees) until the scaling is correct [usually twice]. The NVidia control panel doesn’t want to allow going back to normal rotation now due to the 1024x768 required resolution thing, and will keep the setting set as 90 degrees, so the process can easily be repeated until it works.
  • Now that the screen is at the correct scale (at 640x480), all that’s left is to get the rotation back to normal. To do this, immediately after accepting the rotation process in the NVidia Control Panel, it has to be closed out (alt+f4) so that it saves the rotation setting at 0 degrees but doesn’t try to set it back after all the resolution changes.
  • Raise the resolution back to 800x600
  • Detach secondary monitor now that it is no longer needed

The screen still unfortunately has about 100-200 “pixels” (monitors don’t have pixels, technically) on the top and bottom of the screen that are unused, but eh, NBD. At least this graphics card lets me properly pan and scan (zoom/scale and move) the s-video output around unlike my Geforce4 Ti 4600! The next problem with the video card is that some video outputted from it is just too slow. Though most content is watchable, the choppiness makes it unbearable. The problem with this might just be that the PCI bus doesn’t have the required throughput, which is why most video cards are used over AGP (or nowadays PCI express).

There are even two more final problems with it, one a possible deal killer, the other rather insignificant. The unimportant problem is that XP refuses to install updates. I believe this to be a problem with SP3. The final problem is that the computer seems to randomly compltely freeze up every now and then for no particular reason, requiring a reboot. This has happened 2 or 3 times so far, so I’m waiting to see how often it happens, if anymore. I know it’s not overheating as I currently have the case open; and I see no blown capacitors... hmmmm...



<frustration>Computers!</frustration>
Games to relax
Quickie timekillers

Whenever I need to take a break from working to help clear my mind, there are a few types of “repetitive” or short games I enjoy to play.

One of these is Freecell, a solitaire game that comes with XP, and also came with some versions of Windows 98. I really enjoy it because it is a game of pure reason, with no random chance. You know where all the cards are from the beginning and every game is winnable (theoretically at least... I’ve heard there are 2 combinations of the million possibilities in the Windows version that are unwinnable). When I was playing it a lot, I used to easily be able to win dozens of games in a row in under 2 minutes per game. My goal for this game for a long time has been to win 100 games straight without a loss. I have so far clocked in at ~80 as a record IIRC. Always with the stupid mistakes!

Another fun game I discovered in a computer blow-off class my senior year of high school was Icy Tower. I just picked it back up a few weeks ago, and it’s horribly addicting! I really like it because it’s about 90% skill and 10% randomness. Games that require quick reflexes and sharp hand eye coordination have always been one of my favorite genres, and Icy Tower is full of this. I’ve often found myself while playing the game wishing I could come up with a good idea like it, as programming something of its nature would be incredibly fun. I recently made a high score that I was pretty proud of until I noticed the world high score boards for the game, which are pretty insane (I am linking to a thread instead of the official high score board because the latter is badly programmed and incredibly slow). I can’t help but think a lot of those people cheated... but anywho, the game allows you to save replays of your games, and the file for my high score game is here, and I included a video of it below (more for demonstration of the game ^_^; ). Videos will be uploaded as soon as I get my video card replacement for my laptop, due in later this month, as my current one is failing, but you might as well download the game and play it some, and could watch the better rendered replay there anyways... not that anyone has any reason too watch it, but still XD.


Icy Tower Game in Fast Forward
VIDEO TO COME SOON

Icy Tower Game at Normal Speed
VIDEO TO COME SOON

Now back to work!!! ...
Ancient Software
a.k.a. Video Game Nostalgia Part 2

Oh, the memories of the good old days of gaming! When video games were far and few between, and could be made by one to a handful of people. Yesterday’s post [Video Game Nostalgia] touched on some old games I played when I was but a lad. I decided for today I’d drag out a lot of the old stuff, see what I still had for curiosity sake, and take a picture :-).

All of the software packages are DOS applications (except the Windows upgrades, obviously, and Visual Basic), most everything says for the “IBM/TANDY” :-).

On a silly side note, I had the bad habit of calling PCs (Personal Computers) “IBM Compatibles” (as opposed to Apples) until like 1998, heh.


Ancient Software
From left to right, top to bottom:
Some more really old software I found that I didn’t worry about taking pictures of:

And, Yes, I know I’m a packrat. I inherited it from my Dad :-).

Video Game Nostalgia
And Metal Gear Solid Problems

So a comic [Gunnerkrigg Court] that I enjoy and read daily [updates MWF] recently referenced Metal Gear Solid, which finally made me decide to play through the series.

For reference, whenever I bring up games from here on out, it’s usually to talk about encountered problems, which I will usually provide fixes for, or technical aspects of the game. I’m not qualified, or funny enough, to want to review games; and that is not the purpose of my postings here.


The first thing I wanted to mention is a fix for a graphical problem. As the game is rather “old” (released in 2000 for Windows), it can be incompatible with modern systems. One of the options it uses in hardware mode is 8-bit textures, which is no longer supported, though for the life of me I can’t see why a hack could be made in the video card drivers for this problem. Because of this, the game only allows you to run in software mode. After a lot of digging and searching, in which every place said the same thing (it’s not fixable), I finally found a hacked executable [Metal Gear Solid v1.0 [ENGLISH] No-CD/WinXP+Vista+GeForce+ATi Fixed EXE] made by a kind sole to fix the problem.

Another problem which really frustrated me was a “puzzle” in the game referring to looking for information on the “back of the CD case”. I had just received an “optical disk” in the game, however, it appeared to be a floppy disk and no matter what I did I couldn’t find the required information with the item. I figured it must have been a bug and finally gave in and looked it up online. It turns out they meant the actual CD case the game came in had a number [radio frequency] written on the back of it - “140.15”. I can only assume they did this as a means of “copy protection” to frustrate anyone who didn’t actually buy the game. Unfortunately, I acquired the game without a CD case so I was frustrated by this myself.


This kind of system reminded me of the very old days of gaming in which some games asked you to input a certain word from a certain paragraph on a certain page of the manual to enter the game, or asked questions with answers found in the manual. One of the games I had that did the former was Teenage Mutant Ninja Turtles [1989] for DOS. I have fond memories of playing this and a (monochrome? [green and black :-) ] IIRC?) version of Muppet Adventure: Chaos at the Carnival [1989] (Dear Thor! heh) [also a DOS game] as they were, IIRC, two of my first video games, though I got many others around that time. Both games had later released NES ports too.

My real favorite childhood games however, which are still both cult classics, were Doom, which got me into the design aspect of making games, and most importantly, ZZT, which is what really got me started on programming in 1991 at the age of 5. I still have the original floppy disks for ZZT too :-). ZZT was more scripting than programming though, and I didn’t start real programming until I got into QBasic in 1993. I might release some of my creations for these games one of these days for nostalgic sake ^_^;. I also remember thoroughly enjoying Star Trek: 25th Anniversary for DOS in 1992 :-). I was a nerd even as a kid! ^_^; This game also had copy protection I had forgotten about. As Wikipedia tells:

The game had a copy-protection system in that the player was forced to consult the game’s manual in order to find out which star system they were supposed to warp to on the navigation map. Warping to the wrong system would send them into either the Klingon or Romulan neutral zones, and initiate an extremely difficult battle that often ends with the destruction of the Enterprise.


[Edit 8/16/2008 @ 10:05pm] Pictures of some of this stuff can be found in tomorrow’s post, “Ancient Software”.
Language Optimization Techniques
A few tricks up the programmers sleeve

I’m gonna cheat today since it is really late, as I spent a good amount of time organizing the 3D Engines update which pushed me a bit behind, and I’m also exhausted. Instead of writing some more content, I’m just linking to the “Utilized Optimization Techniques” section of the 3D Engines project, which I put up today.

It describes 4 programming speed optimization tricks: Local variable assignment, precalculating index lookups, pointer transversing/addition, and loop unrolling. This project post also goes into some differences between the used languages [Flash, C++, and Java], especially when dealing with speed.

Multiple Windows XP Sessions
Making XP act like Windows Server

All of the Windows lines of OSs from XP through Windows Server 2003 (or 2005 or 2007?) are, to my knowledge and IMO, basically the exact same thing, with just some minor tweaks and extra software for the more expensive versions. My version of XP Professional even comes with IIS (Internet Information Services - Microsoft’s web/ftp/mail server suite). One of my favorite XP hacks adds on a desperately needed functionality found only in Windows Server editions, which is allowing multiple user sessions on a machine at once. This basically means allowing multiple people to log onto a machine at the same time through Remote Desktop (Microsoft’s internal Windows VNC client). I find the most useful function by far of this is the “Remote Control” feature, which allows a second logged in user to see exactly what is on the screen of another session, and if permissions are given, to take control of it. This is perfect for those people whom you often have to trouble shoot computer problems for, eliminating the need for a trip to their location or 3rd party software to view their computer.

This hack requires a few registry modifications, a group policy modification, and a DLL replacement. The DLL replacement was provided by Microsoft in early versions of XP SP2 when they were tinkering with allowing this feature in XP. I found the information for all this here a number of years ago and it has provided itself invaluable since. Unfortunately, this does not work on XP Home edition, just XP Professional. I tried adapting it once and wasted a lot of time :-\. The following is the text from where I got this hack.

Concurrent Remote Desktop Sessions in Windows XP SP2

I mentioned before that Windows XP does not allow concurrent sessions for its Remote Desktop feature. What this means is that if a user is logged on at the local console, a remote user has to kick him off (and ironically, this can be done even without his permission) before starting work on the box. This is irritating and removes much of the productivity that Remote Desktop brings to Windows. Read on to learn how to remove that limitation in Windows XP SP2

A much touted feature in SP2 (Service Pack 2) since then removed was the ability to do just this, have a user logged on locally while another connects to the terminal remotely. Microsoft however removed the feature in the final build. The reason probably is that the EULA (End User License Agreement) allows only a single user to use a computer at a time. This is (IMHO) a silly reason to curtail Remote Desktop’s functionality, so we’ll have a workaround.

Microsoft did try out the feature in earlier builds of Service Pack 2 and it is this that we’re going to exploit here. We’re going to replace termsrv.dll (The Terminal Server) with one from an earlier build (2055).

To get Concurrent Sessions in Remote Desktop working, follow the steps below exactly:

  1. Download the termsrv.zip file and extract it somewhere.
  2. Reboot into Safe Mode. This is necessary to remove Windows File Protection. [Dakusan: I use unlocker for this, which I install on all my machines as it always proves itself useful, and then usually have to do a “shutdown -a” from command line when XP notices the DLL changed.]
  3. Copy the termsrv.dll in the zip to %windir%\System32 and %windir%\ServicePackFiles\i386. If the second folder doesn’t exist, don’t copy it there. Delete termsrv.dll from the dllcache folder: %windir%\system32\dllcache
  4. Merge the contents of Concurrent Sessions SP2.reg file into the registry. [Dakusan: Just run the .reg file and tell XP to allow the action.]
  5. Make sure Fast User Switching is turned on. Go Control Panel -> User Accounts -> Change the way users log on or off and turn on Fast User Switching.
  6. Open up the Group Policy Editor: Start Menu > Run > ‘gpedit.msc’. Navigate to Computer Configuration > Administrative Templates > Windows Components > Terminal Services. Enable ‘Limit Number of Connections’ and set the number of connections to 3 (or more). This enables you to have more than one person remotely logged on.
  7. Now reboot back into normal Windows and try out whether Concurrent Sessions in Remote Desktop works. It should!

If anything goes wrong, the termsrv_sp2.dll is the original file you replaced. Just rename it to termsrv.dll, reboot into safe mode and copy it back.

The termsrv.dl_ file is provided in the zip is for you slipstreamers out there. Just replace that file with the corresponding file in the Windows installation disks.



I have included an old copy of the above web page, from when I first started distributing this, with the information in the hack’s zip file I provide.

If you want to Remote Control another session, I think the user needs to be part of the “Administrators” group, and don’t forget to add any users that you want to be able to remotely log on to the “Remote Desktop Users” group.

This is all actually part of an “Enhanced Windows XP Install” document I made years ago that I never ended up releasing because I hadn’t finished cleaning it up. :-\ One of these days I’ll get it up here. Some of the information pertaining to this hack from that document is as follows:

  • Any computer techy out there that has tried to troubleshoot over the phone knows how much of a problem/pain in the anatomy it is, and for this reason, I install this hack which makes it painless to automatically connect to a users computer through remote desktop, which can then be remotely viewed or controlled via their displayed console session.
  • I often use this hack myself when I am running computers without keyboards/mice, like my entertainment computer. For a permanent solution for something like this though, I recommend a KM (Keyboard/Mouse) solution like synergy, which allows manipulating one computer via a keyboard and mouse on another.
  • Your user account password must also not be blank. Blank passwords often cause problems with remote services.
  • The security risk for this is a port is opened for someone to connect to like telnet or SSH on Unix, which is a minimal risk unless someone has your username+password.
  • You have to have a second username to log into, which can be done under Control Panel > User Accounts, or Control panel > Administrative Tools > Computer Management > System Tools > Local users and Groups.
  • If you want the second user to be able to log in remotely, make sure to add them under Control Panel > System > Remote > Select Remote users, and also check “allow users to connect remotely to this computer”.
  • You also need to know the IP address of the user’s computer you want to connect to, and unfortunately, they are not always static. If you run into this, you may want to use a DDNS service like mine.
  • You may also run into the unfortunate circumstance of NAT/Firewalled networks, which is beyond the scope of this document. Long story short, you need to open up port 3389 in the firewall and forward it through the router/NAT (this is the port for both remote desktop and remote assistance).
  • You may also want to change the port number to something else so a port scanner will not pick it up. To connect to a different port, on the client computer, in remote desktop, you connect to COMPUTERIP:PORT like www.mycomputer.com:5050.
    • Registry Key: HKLM\System\CurrentControlSet\Control\TerminalServer\WinStations\RDP-Tcp\PortNumber - Set as your new port number
    • This requires a reboot to work.
    • Make sure you don’t provide a port that’s already used on the computer, and you probably shouldn’t make it a standard port either [21 [ftp], 25 [smtp], 80 [http], etc])
  • You can also log into their current console session by going to the task manager (ctrl+shift+esc in full screen, or right click taskbar and go to “task manager”) > Users > Right click username > Remote control
    • This will ask the user at the computer if they want to accept this. To have it NOT ask them, do the following:
      • Start > Run > gpedit.msc [enter] > computer configuration > administrative templates > windows components > terminal services
      • Double click the option “Sets rules for remote control of terminal services user sessions”
      • Enable it, and for the “Options” setting, set “Full control without users permission”
  • If the ability for you to access a client’s computer without their immediate permission or knowledge is too “dangerous” for their taste, you may suggest/use Remote Assistance, which is more troublesome, but much more “secure” sounding.
Mudslinging Campaigns
Politics is a dirty business after all

I really really really really really really really really really really hate politics. I try to completely ignore that scene when possible as most politicians are just brown nosing liars who would disown their own mother if they thought it could help them. The thing I hate most about politics though is the attempt to discredit opponents. Sniping and mudslinging is such a cheap, low, and pointless practice, but it always seems to inevitably come to it. One instance of this is the crimes against humanity Bush has committed are so much more atrocious that it is inconceivable to me that Bill Clinton came so much closer to impeachment just because he wanted to hide his dirty sex life, which isn’t really anyone but his families business anyways. The Republican Party just happens to be really good at being loud, obnoxious, and forceful over any issue they can bring up, it seems to me.

One recent example of this that occurred to me was when a good friend of mine who is incredibly left wing recently sent me some “Bush is a dirty old man” news articles. While I am as much of a Bush hater as the next democrat, and would have liked to have just agreed with her, I had to voice the flaw in the logic of the articles premise and say that it was a pretty silly thing to be paying attention to.

Another example of this came through again today in an email. I received this morning from another very good friend of mine, who is strongly republican and thinks if Obama is elected our economy will basically crash and all hell will break loose. It is as follows:

http://www.snopes.com/politics/obama/airplane.asp


WHAT A DISGRACE!!!  AND HE IS ALL AMERICAN????




http://www.msplinks.com/MDFodHRwOi8vczE4Ny5waG90b2J1Y2tldC5jb20vYWxidW1zL3gxNjYvRFVTSEtFV0lDSC9EQVgtMi8/YWN0aW9uPXZpZXcmY3VycmVudD1PYmFtYV9BZ2Fpbi5qcGc=
Obama The Patriot - Removes American Flag From His Plane

The Patriot Room
Posted on
Tuesday, July 22, 2008 8:11:07 AM by Bill Dupray

Barack Obama recently finished a $500,000 total overhaul of his 757. And
 as part of the new design, he decided to remove the American flag from the tail...

What American running for President of the United States would remove the symbol of his country? And worse, he replaced the flag with it with a symbol of himself... Obama is such a 
despicable human being.

http://www.msplinks.com/MDFodHRwOi8vdGlueXBpYy5jb20=

Please forward this if you're not ashamed of our country and our flag & ifthink this is a disgrace. 
http://www.msplinks.com/MDFodHRwOi8vczE4Ny5waG90b2J1Y2tldC5jb20vYWxidW1zL3gxNjYvRFVTSEtFV0lDSC9EQVgtMi8/YWN0aW9uPXZpZXcmY3VycmVudD1PYmFtYS0xLmpwZw==
If you do not forward this to everyone you know nothing will happen.  If Obama is elected president of the United States we are in trouble.  If you think the Liberals can lead our country just look what Pelosi and Reid have accomplished for us.

God Bless America

http://www.snopes.com/politics/obama/airplane.asp



         In God We Trust


My first thought was to check Snopes, which I quickly noticed was already provided for me, how thoughtful!!!
So after reading it, I replied to him via email:
From the (snopes) article linked to by the email you sent me:
The replacement of North American’s commercial markings included the removal of two stylized U.S. flag images which are used in the airline’s logo (a registered trademark of that company). The North American flag/logo on the forward portion of the fuselage was removed and the one on the tail was replaced with the Obama "O" campaign logo, while traditional depictions of the U.S. flag adjacent to the plane’s registration numbers remain.

However, I was just looking at the new design of McCain’s “Straight Talk Express” bus, and all its large American flags are gone now, as is the American flag theme while it was (Rudys?) bus. And while I can’t find enough good pictures to confirm the small details on the new design, it looks like it has removed ALL of its American flags.

You want to forward these updates to your buddies? :-p

And FYI, I know it sounds hypocritical including the McCain comment in there; I was trying to be ironic ^_^; .

I also just noticed from the Snopes article that McCain’s plane seems to lack any U.S. flags, and oddly, Bush's campaign plane kept the trademarked flag on the tail.

Also, on a side note, while I was searching through Flickr for images of the “Straight Talk Express” (after Google Image failed me somewhat), for some reason it brought me to this picture, which I thought was too adorable to pass up putting here ^_^; .
Jail to the Chief
New Entertainment Center
Missed a day of posting :'(

Doh, I wanted to try posting at least once a day all month and I missed out yesterday because I was just too busy with other stuff, alas.

I had lots of work, mostly house work, to catch up on, culminating in transporting and setting up a new entertainment system, wee. I had to wire the darn thing twice because the first setup really didn’t work well and would have been damaging to the cords; and it takes like an hour each time to do the wiring. Grrrr, oh well.

I originally had all my entertainment stuff set up in my living room, as I assumed that I was going to have guests and would want to watch stuff out there with them on the couch. This has unfortunately turned out to not be the case in this apartment, and I usually only end up going to the living room couch mainly to snuggle with my cat, as she will only get close to me on the couch for some reason, while I have the TV on in the background while I work. Now I can have stuff running in the background whenever I want from my room, and can use the surround sound speakers to play my music, as I am getting tired of my crappy (though better than many) laptop speakers, and headphones are more cumbersome than not.

I bought the new parts of my entertainment system from some [married] friends who finished moving yesterday to a one bedroom in downtown Austin that couldn’t even remotely hold all their stuff, so they were desperately trying to get rid of a lot of it in a hurry. I got a 32" CRT TV [$50], the black shelving unit w/ glass enclosure [$50], and an older computer (512MB of RAM, 780mhz CPU, 80GB hard drive) [$20] to use as a new Home Server. All of these were at about 20% of cost, yay :-).

I really needed the new TV, as my current 32" TV is badly scratched up from being dropped on cement a few years back. I am leaving the old TV hooked up to my current Home Server, which I will now be using as just a multimedia station for that TV and a place for extra backup hard drives. I wanted the “new” computer as a new Home Server, as the current one uses way too much power for what it’s being used for, and is too loud to keep in my room. I’ll be just turning it on when I need it now instead; backing up and watching videos that require too much CPU power that the new computer won’t be able to handle.

The new computer is quite tiny and has no AGP slots, just 2 PCI32 slots. I am therefore looking into getting a $25 (w/ shipping) e-GeForce 5200 PCI card for tv-out. I hope it fits in the small case, because if not, I will just have to leave the case cover off.


Click for full size (I love my new camera ^_^ )
Entertainment System
Blade Laws
No matter how much you want to be Hiro Protagonist

Speaking of swords, though I know most people would probably not agree with me, it’s always irked me that it is legal to carry around guns, but not swords. I guess swords would be a bit harder to conceal, so maybe that’s why, and not that I necessarily would ever carry one around, but still :-(. Guns produce one type of fear, but seeing a 3+ foot long blade that could easily hack off a limb produces a completely different kind of respect, heh. Even knifes are subject to scrutiny, as any blade, by different state laws, are only legal to carry around if less than a certain length, usually under half a foot. Though it is very hard to find these laws and everyone says something different on them, there are consequences for trying to push it.

I have a friend who was once transporting a sword home after buying it, and by unlucky coincidence was pulled over for whatever reason, and he allowed the cops to search his vehicle. He was given a hefty fine and a misdemeanor for having the sword. More unfortunately, this ruined his future prospects for going into the intelligence sector for our government, as you can’t have any blotches on your record, and a misdemeanor is considered bad enough.

It is of course perfectly legal to have one in your car if transporting it [home] right after buying it. So make that your story if you ever find yourself in this unlikely circumstance, whether it is true or not :-). My friend lamented to me he wishes he knew this at that time.

Then again, there is a complete double standard on this subject, as anyone, I believe of any age, can walk out of Walmart with a 22" machete! Like this time in college... when a friend of mine got one... and oh Thor, the poor watermelons!

Skuld Kitty
Pets are the best!!!

Because I’m a super nerd, I thought I’d post pictures of my adorable kitty =^.^= . Her name is Skuld and I adopted her from a store on May the 11th of 2005 when she was 6 weeks old, so I just assume she shares my birthday, March the 28th :-).

She’s a tiny bit psychotic, but I love her to death none the less ^_^. She’s most recently become much more sociable, and she has always especially loved energetic playing; mostly wrestling with my hands and feet, and games of tag.

She has survived living with me at 5 locations so far with 5 moves!!! (Garland, North Dallas, Parent’s House [near-death appendix burst put me here for a while], Canada [1 month stay x.x; but the 26+ hour non stop drives there and back with Skuld were torturous]), Parent’s House [very very short stay], Austin). She’s been a very good sport about it, and I think she loves the Austin place the most so far.

Mouse over the thumbnails for larger copies. (Video clips to be uploaded soon.)

Adoption 1 (2005-05-11) Adoption 2 (2005-05-11) Adoption 3 (2005-05-11)
(2005-05-11) These are all pictures of Skuld on the night I adopted her.
Adoption 4 (2005-05-11) The Box (2005-06-01) Where did Jamie go (2005-07-06)
(2005-05-11) Exploring on adoption night! (2005-06-01) Skuld is a few weeks older here, lounging in a box, as she has always loved to do. (2005-07-06) Skuld was much more daring in her youth and loved climbing onto very high things. She even went to the top of the TV on these shelves a few times which almost touched the ceiling. She is playing hide and seek with a friend of mine, Jamie, here.
Sleeping (2005-07-28) Stretching out (2006-02-16) Sleeping at the office (2006-02-21)
(2005-07-28) Just curled up on some blankets sleeping. (2006-02-16) Stretching out in crazy positions as usual. (2006-02-21) I often took Skuld to the Qrush office for the 6 or so months we had it, as she got very lonely at home and there weren’t many of us at the office. She’s sleeping on some office supplies here.
Grooming (2006-04-13) Stretching at Brads (2007-07-15) Someones watching her (2007-07-15)
(2006-04-13) Grooming herself in her favorite fluffy box bed. (2007-07-15) During the stay at my parents house, I did weekend Dungeons & Dragon games at a friend’s (Brad’s) house in North Dallas (a 30-40 minute drive away) once a month, and the cat demanded to come along. She’s just lounging here. (2007-07-15) Taken a minute or so after the last one, she noticed me taking her picture.
Eating at Brads (2007-07-15) Trip to Canada (2007-08-24) Just chilling (2008-08-02)
(2007-07-15) Eating later that day at Brad’s. (2007-08-24) Sleeping on the >24 hour trip back from Canada in a cat cube my mother bought for her. (2008-08-02) Taken about a week ago as I was testing out my new camera right before needing to use it at Angel Sword. She’s just chillin next to me in bed.
Olympic High Jumper (2005-10-18) What I have to come home to (2007-11-24)
(2005-10-18) Olympic High Jumper (Video) - My dad took this video of me playing with my cat. My mother is the one in the background. (2007-11-24) What I have to come home to (Video) - I was away from my place for about a week and my cat does not easily forgive. She meowed at me for hours on end like this.
Wedding Completed, Yay
Weddings (when participating in) are so much work...

It is now 4:44pm MST (5:44 CST, which is the time zone my website runs on) and I’m currently sitting in the Salt Lake City [Utah] Airport (SLC) with children crying all around me and businessman talking loudly on their cells... people, wee. Thank Thor for headphones + music :-).

Unfortunately, this airport, like most other airports AFAIK, does not provide free public WiFi (Wireless Internet) (examples off the top of my head are Dallas Fort/Worth [DFW] and Austin [AUS]). Phoenix (PHX) did provide free WiFi though, which was really nice. It was (and is, as I am flying there in a few hours for a layover) probably one of the nicest airports I have been to in a while. It even had lots of rows of comfy seats with small 1/.5 ft or so tables between them that had 2 electrical plugs on them, which was all very nicely designed and ergonomic too. Anywho, without access to the internet, I am stuck in 2D land (Snow Crash reference ^_^; ) and am withdrawn from the outside world.

You may notice however that this post is dated while I should be offline. Most of my work and entries for my site are done/posted on my laptop which runs a local web server, and then I move over batches of changes at once when I am finished. I will probably stop this practice once my website is more complete, but at the moment, it works better, and assures I have local backups. This is why, if anyone noticed, why 4 days of posts suddenly showed up yesterday :-). I’ve been on the move lately so I hadn’t had time to do a data transfer.

ANYWAYS, Luis’ wedding was really nice, though a ton of work. As one of the groomsmen I was trying to help out with stuff all day, which all the groomsmen were helping lots too. The bridesmaids had it super easy! I was on my feet almost all day in a heavy suit running around taking pictures, videos, and fixing things, but it was worth it. I’m so happy for Luis, and glad everything went so well ^_^.

Unfortunately, I was not allowed to be there for the actual marriage part (called a Sealing) as it was a Mormon/LDS (Church of Latter Day Saints) ceremony, which takes place in one of their temples, which is sacred and only practicing Mormon adults who have been confirmed are allowed in. Oh well ^_^;. There were probably 50 or so people in the temple to witness the ceremony and 5-10 people waiting outside with me. There were a couple hundred people that showed up for the reception though; the hall was one large mass of people!

There’s not many pictures I want to share publicly here from the event (this is not the place for their personal pictures :-) ), but I do have a couple; especially some I had taken of me in the suit I wore all day, as it’ll probably be a long time before anyone sees me in a formal suit again! ^_^; ... though it is nice to feel respectable sometimes and dress like that.

The weekend was well worth the expensive flight up here (and the suit), as myself and everyone had tons of fun and I got to meet a lot of great new people, and see a lot of old friends I haven’t had the opportunity to hang with for a while. It seems everyone is moving into opposite directions around the country :-\ ... or all the Mormons are just conglomerating in the LDS capitol of the world (Salt Lake City), but we won’t talk about that ^_^;.


The Happy Couple The Groom and I Me Dollar Dancing with the Bride
The Happy Couple The Groom and I Me Dollar Dancing with the Bride
Me (Jeffrey Riaboy)
Me (Jeffrey Riaboy)
An Agnostics Perspective
A lesson in logic
An Agnostics Perspective A lesson in logic Tags: Religion, Eragon, Books There’s a specific dialog that goes on in Eldest, the second book of the Inheritance Cycle (Eragon), about religion that I thought worded my general beliefs on the subject, though in a fantasy setting, quite well. I have included this verbatim below, which basically describes how agnostics reason. I particularly like the last paragraph, which basically says how non god-fairing people can be, from a certain perspective, in a way, on a higher moral ground due to basing their actions on what is right because they want to help others, as opposed to fearing divine retribution. FYI, this doesn’t really contain any spoilers for the books. The following text is copyrighted by the author, Christopher Paolini.

Nine days later, Eragon presented himself to Oromis1 and said, “Master, it struck me last night that neither you nor the hundreds of elven scrolls I’ve read have mentioned your religion. What do elves believe?”


A long sigh was Oromis’s first answer. Then: “We believe that the world behaves according to certain inviolable rules and that, by persistent effort, we can discover those rules and use them to predict events when circumstances repeat.”


Eragon blinked. That did not tell him what he wanted to know. “But who, or what, do you worship?”


“Nothing.”


“You worship the concept of nothing?”


“No, Eragon. We do not worship at all.”


The thought was so alien, it took Eragon several moments to grasp what Oromis meant. The villagers of Carvahall2 lacked a single overriding doctrine, but they did share a collection of superstitions and rituals, most of which concerned warding off bad luck. During the course of his training, it had dawned upon Eragon that many of the phenomena that the villagers attributed to supernatural sources were in fact natural processes, such as when he learned in his meditations that maggots hatched from fly eggs instead of spontaneously arising from the dirt, as he had thought before. Nor did it make sense for him to put out an offering of food to keep sprites from turning the milk sour when he knew that sour milk was actually caused by a proliferation of tiny organisms in the liquid. Still, Eragon remained convinced that otherworldly forces influenced the world in mysterious ways, a belief that his exposure to the dwarves’ religion3 had bolstered. He said, “Where do you think the world came from, then, if it wasn’t created by the gods?”


“Which gods, Eragon?”


“Your gods, the dwarf gods, our gods... someone must have created it.”


Oromis raised an eyebrow. “I would not necessarily agree with you. But be as that may, I cannot prove that gods do not exist. Nor can I prove that the world and everything in it was not created by an entity or entities in the distant past. But I can tell you that in the millennia we elves have studied nature, we have never witnessed an instance where the rules that govern the world have been broken. That is, we have never seen a miracle. Many events have defied our ability to explain, but we are convinced that we failed because we are still woefully ignorant about the universe and not because a deity altered the workings of nature.”


“A god wouldn’t have to alter nature to accomplish his will,” asserted Eragon. “He could do it within the system that already exists.... He could use magic to affect events.”


Oromis smiled. “Very true. But ask yourself this, Eragon: If gods exist, have they been good custodians of Alagaësia2? Death, sickness, poverty, tyranny, and countless other miseries stalk the land. If this is the handiwork of divine beings, then they are to be rebelled against and overthrown, not given obeisance, obedience, and reverence.”


“The dwarves believe3—”


“Exactly! The dwarves believe. When it comes to certain matters, they rely upon faith rather than reason. They have even been known to ignore proven facts that contradict their dogma.”


“Like what?” demanded Eragon.


“Dwarf priests use coral as proof that stone is alive and can grow, which also corroborates their story that Helzvog3 formed the race of dwarves out of granite. But we elves discovered that coral is actually an exoskeleton secreted by minuscule animals that live inside the coral. Any magician can sense the animals if he opens his mind. We explained this to the dwarves, but they refused to listen, saying that the life we felt resides in every kind of stone, although their priests are the only ones who are supposed to be able to detect the life in landlocked stones.”


For a long time, Eragon stared out the window, turning Oromis’s words over in his mind. “You don’t believe in an afterlife, then.”


“From what Glaedr said, you already knew that.”


“And you don’t put stock in gods.”


“We give credence only to that which we can prove exists. Since we cannot find evidence that gods, miracles, and other supernatural things are real, we do not trouble ourselves about them. If that were to change, if Helzvog were to reveal himself to us, then we would accept the new information and revise our position.”


“It seems a cold world without something... more.”


“On the contrary,” said Oromis, “it is a better world. A place where we are responsible for our own actions, where we can be kind to one another because we want to and because it is the right thing to do instead of being frightened into behaving by the threat of divine punishment. I won’t tell you what to believe, Eragon. It is far better to be taught to think critically and then be allowed to make your own decisions than to have someone else’s notions thrust upon you. You asked after our religion, and I have answered you true. Make of it what you will.”


1: Eragon is the protagonist of the book who is currently being tutored in magic by Oromis, an elf. The elves are an enlightened species that view the world as scientists.
2: Carvahall is the farming village Eragon grew up in, in the world of Alagaësia.
3: The dwarves have a typical polytheistic religion. In their case, they believe that they were created from stone by their god, Helzvog, and that coral, by growing, is proof that stone is alive.
Windows 98 for VMWare

I recently had to install Windows 98 through VMWare for some quick tests, and there were a few minor problems after the install that needed to be resolved. I thought I’d share them here if anyone ever needed them.

  • First, VMWare Tools needs to be installed to get video and some other drivers working.
  • Second, Windows 98 was really before the time when network cards were used to connect to the internet, as broadband technology was rare and modems were the commonplace solution, so it doesn’t make this process easy. To connect through your VMWARE bridge or NAT to the Internet (to use IE - FireFox [newer versions of?] doesn’t work on Windows 98), the following must be done through the MSN Connection Wizard (this is mostly from memory).
    • Open "Connect to the internet" from the desktop
    • Click Next
    • Select Modem Manually [next]
    • Select any of the normal modems in the list on the right, like a generic 56,000 modem [OK]
    • Click Next
    • Click lan/manual
    • Connect using my local area network (LAN) [next]
    • Click Next
    • "No" to email [next]
    • Click Finish
  • Lastly, the default sound driver does not work, so you need to do the following [Information found here by googling]
    • Install the Create Lab’s drivers for the PCI sound card
    • Add the following lines to your VMWare config (vmx) file
      • pciSound.DAC1InterruptsPerSec = 0
      • pciSound.DAC2InterruptsPerSec = 0
    • Optionally, for a better midi waveset, download Creative Lab’s 8mb GM/GS Waveset [version 5] and select it for use in the device’s properties by:
      • Right click my computer
      • Select properties
      • Select the Device Manager tab
      • Find the area for sound and go to “SB PCI(WDM)”
      • Go to the second tab
      • Change the Midi Synthesizer Waveset to the downloaded eapci8m.ecw
When your electronics know more than you
Sometimes technology knows best

I really love my GPS (Magellan Maestro 3100) system that I received last Christmas as a present from my mother. I use it whenever navigating to new places I have never been before and it is always pretty darn accurate.

So it worked as usual without a hitch, calculating the best route flawlessly, on my way to Angel Sword last Saturday. On the way back, however, it sent me back on a different route which ended up making the 50 minutes trip take 10-20 minutes longer due to sticking me on backwater highway roads with only 1 lane, and getting stuck behind old geezers going below the speed limit. This had made me really mad at the time, and rather confused as to why it chose a different "fastest" route back; that is until I got to my destination and found out there was heavy construction on the highway going northbound (my way back) that had delayed one of my friends for 4 hours on his trip into Austin :-O. Glad I ended up following its directions after all and not going with my gut and taking the same route I took down there!

My fatal mistake was assuming the GPS calculated the routes itself instead of asking a central server elsewhere with traffic information. Now I know better!

New Harry Potter Canon Stuff
Nothing that interesting... but still...
I’ve been rereading one of the many Harry Potter books again, as usual when wanting to relax, for the millionth time through the series. I thought I’d check around and see if there was anything new, and apparently there are a few new things I didn’t know about.


The Tales of Beedle the Bard has a mass release coming on December 4th.


According to a note on JK Rowling’s website (Wizard of the Month Archive), quoted verbatim:
(1980 - )
The Boy Who Lived, only known survivor of the Avada Kedavra curse and conqueror of Lord Voldemort, also known as Tom Riddle. Harry Potter joined the reshuffled Auror Department under Kingsley Shacklebolt at age 17, rising to become Head of said department in 2007.


And finally, an 800 word "Harry Potter Prequel" by JKR written for some charity book by WaterStone, or something like that. I found the text for it here, and it is quoted below.

The speeding motorcycle took the sharp corner so fast in the darkness that both policemen in the pursuing car shouted ‘whoa!’ Sergeant Fisher slammed his large foot on the brake, thinking that the boy who was riding pillion was sure to be flung under his wheels; however, the motorbike made the turn without unseating either of its riders, and with a wink of its red tail light, vanished up the narrow side street.

‘We’ve got ‘em now!” cried PC Anderson excitedly. ‘That’s a dead end!”

Leaning hard on the steering wheel and crashing his gears, Fisher scraped half the paint off the flank of the car as he forced it up the alleyway in pursuit.

There in the headlights sat their quarry, stationary at last after a quarter of an hour’s chase. The two riders were trapped between a towering brick wall and the police car, which was now crashing towards them like some growling, luminous-eyed predator.

There was so little space between the car doors and the walls of the alley that Fisher and Anderson had difficulty extricating themselves from the vehicle. It injured their dignity to have to inch, crab-like, towards the miscreants. Fisher dragged his generous belly along the wall, tearing buttons off his shirt as he went, and finally snapping off the wing mirror with his backside.

‘Get off the bike!’ he bellowed at the smirking youths, who sat basking in the flashing blue light as though enjoying it.

They did as they were told. Finally pulling free from the broken wind mirror, Fisher glared at them. They seemed to be in their late teens. The one who had been driving had long black hair; his insolent good looks reminded Fisher unpleasantly of his daughter’s guitar-playing, layabout boyfriend. The second boy also had black hair, though his was short and stuck up in all directions; he wore glasses and a broad grin. Both were dressed in T-shirts emblazoned with a large golden bird; the emblem, no doubt, of some deafening, tuneless rock band.

‘No helmets!’ Fisher yelled, pointing from one uncovered head to the other. ‘Exceeding the speed limit by - by a considerable amount!’ (In fact, the speed registered had been greater than Fisher was prepared to accept that any motorcycle could travel.) ‘Failing to stop for the police!’

‘We’d have loved to stop for a chat,’ said the boy in glasses, ‘only we were trying -’

‘Don’t get smart - you two are in a heap of trouble!’ snarled Anderson. ‘Names!’

‘Names?’ repeated the long-haired driver. ‘Er - well, let’s see. There’s Wilberforce… Bathsheba… Elvendork…’

‘And what’s nice about that one is, you can use it for a boy or a girl,’ said the boy in glasses.

‘Oh, OUR names, did you mean?’ asked the first, as Anderson spluttered with rage. ‘You should’ve said! This here is James Potter, and I’m Sirius Black!’

‘Things’ll be seriously black for you in a minute, you cheeky little -’

But neither James nor Sirius was paying attention. They were suddenly as alert as gundogs, staring past Fisher and Anderson, over the roof of the police car, at the dark mouth of the alley. Then, with identical fluid movements, they reached into their back pockets.

For the space of a heartbeat both policemen imagined guns gleaming at them, but a second later they saw that the motorcyclists had drawn nothing more than -

‘Drumsticks?’ jeered Anderson. ‘Right pair of jokers, aren’t you? Right, we’re arresting you on a charge of -’

But Anderson never got to name the charge. James and Sirius had shouted something incomprehensible, and the beams from the headlights had moved.

The policemen wheeled around, then staggered backwards. Three men were flying - actually FLYING - up the alley on broomsticks - and at the same moment, the police car was rearing up on its back wheels.

Fisher’s knees bucked; he sat down hard; Anderson tripped over Fisher’s legs and fell on top of him, as FLUMP - BANG - CRUNCH - they heard the men on brooms slam into the upended car and fall, apparently insensible, to the ground, while broken bits of broomstick clattered down around them.

The motorbike had roared into life again. His mouth hanging open, Fisher mustered the strength to look back at the two teenagers.

‘Thanks very much!’ called Sirius over the throb of the engine. ‘We owe you one!’

‘Yeah, nice meeting you!’ said James. ‘And don’t forget: Elvendork! It’s unisex!’

There was an earth-shattering crash, and Fisher and Anderson threw their arms around each other in fright; their car had just fallen back to the ground. Now it was the motorcycle’s turn to rear. Before the policemen’s disbelieving eyes, it took off into the air: James and Sirius zoomed away into the night sky, their tail light twinkling behind them like a vanishing ruby.


On a slightly off-topic non-official tangent, I really love this picture! Wish I knew who the artist was, especially to give credit here. :-\
Harry Potter Studying Stylized
Angel Sword
“Swords are Cool!” Internet Anonymous

So I went to an open house at Angel Sword yesterday, which produces the world’s best swords. I first fell in love with their work when I saw them well over 10 years ago at Scarborough Fair Renaissance Festival in Dallas, and have schemed owning one since, which is not easy as their lowest series cost about $2,000. Of course, I could get smaller (and legal) blades from them like knives, but that’s just not the same or as fun ^_^; .


Their lowest line of swords, the Bright Knight series, holds at least the top two world records in ability from international competitions. I asked why they haven’t submitted their upper series lines (Angel Swords, Avatar series, etc) and the basic reply was “You don’t show your queens and kings if you can win with your jacks” :-). The master sword smith who started and still does most all of the work on the swords is Daniel Watson, whom has been working on swords for well over 30 years. The reason his swords are the best is that he uses combinations of ultra-tech with old tech to produce the best results. He has over 14 patents on processes and technology to produce the swords that he has been creating and refining over his lifetime that make no one able (easily) to catch up to his quality of work. The ultra-tech stuff includes cryogenics with quick freezing using liquid nitrogen and super heating, electromagnetic manipulating machines, metallurgy, and good old fashion hammer techniques, including cold forging, which most sword smiths apparently ignore.


I unfortunately had to miss a wedding of a friend of my sister’s up in Dallas for this, but I thought this more important/pressing as they only have these open houses every few [2-3] years, and I have reason to believe this may be the last one. It was supposed to start off at 9am. I got there 20 or so minutes early, well before anyone else, so I got some one on one time with Mr. Watson and another of his employees, Wolf (his real name ^_^). So I checked out his large stock of swords in the show room for the first hour or two while everyone else was arriving, and we all chatted and had general fun. There are so many beautiful swords and blades of every style, size, and make; pure works of art!

After that we went up to the forge and he did a demo with running commentary of reworking a knife, sharpening and fixing it up using types of buffers. That demonstration and everything else from the whole day was all quite fascinating. During this we also got a good list of accidents that have occurred in the shop, it was quite gruesome!!! :-D. After that we went back to the display room and had some more discussion.

Next was practical sword use ^_^. We all either borrowed swords or those who already owned ones used them, and we went out to their large front yard area (they are out in the country) and Daniel went over how to properly make cuts with a sword; proper torque and body movements to get the most out of a swing and such. Then each person that showed up (we had 10-15 people) got one wet tatami mat to practice on, which depending on your aim, one could get 5 to 10 solid cuts with. A single tatami mat, which is what most of us used, is about similar to cutting someone through the neck and a shoulder, while a double tatami mat, which they only had 1 made, is about equivalent to a solid cut through someone’s midsection. It was really fun ^_^.

We then broke for lunch with a lot more chatting about swords and many other interesting topics. The final part of the structured day was a voted upon sword creation process that we wanted to hear about. How he made his Avatar swords and the difference between the lines easily won out, as he had never released the information to anyone before (besides perhaps his apprentices and significant others). The reason he was now willing to tell us all about it was his final batch of patents on the processes went through very recently so it was safe to give it out. One of the guests video taped the whole talk, and I’m hoping to get my hands on a copy of it to post here with his permission later. He told me he wanted to edit it a bit first and show it to Mr. Watson before he did anything with it or released it anywhere. The main gist is that the lower lines just used the electromagnetic manipulation and other ultra-tech to achieve their chemical bonding properties so they can be cut to have much smaller angles on the edges without being too brittle, while the higher lines in addition have the hard work muscle and sweat forging and pounding put into them.

I think he ended his talk a little early to hit the 4pm mark when everything was supposed to end. A few people left then but I stayed around for over an hour to keep talking with the other participants. Everyone was really great and from many different walks of life and experiences all brought together by a common interest. After a few more people left, Mr. Watson brought out many of his whiskeys to let us try out. That’s the business he’s trying to break into and away from swords BTW, making whiskeys and rums and some other types of alcohol. I think I heard him mention to someone that some of the alcohols he was giving us were going for over $125 a shot!

I then left around 5pm, even though I wanted to stay longer, because I had another previous engagement I had promised to make... and then when I got there it didn’t even happen and I was quite perturbed about this, as they could have told me it wasn’t going to happen and I could have stayed at Angel Sword longer, but ah well.


I will probably be getting one of their blades very soon, as I just found out you can trade in their blades at no markdown to help get more expensive blades. So I can get a $2,000 one that I like and then have that around while I work up to a $6000 blade I really like ^_^. They also have a guarantee against breakage, chips, or damage, which is really hard to do anyways, so they can be used all you want without worry. He even showed us a sword that had been shot due to an accidental misfire of a .22 gun from the room above the show room. The sheath it was in clearly showed where the bullet went through, but there wasn’t even a ding or a scratch on the sword! The only remaining evidence was some copper that came off the bullet and etched into the metal a bit :-).


And here are all the pictures with captions that I took for the day! :-D Mouse over the thumbnails for larger copies. (Video clips to be uploaded soon.)

Show Room - Northeast corner
Show Room - NorthEast Corner 1 Show Room - NorthEast Corner 2 Show Room - NorthEast Corner 3
A large assortment of different kinds of swords. Slightly left of the first picture, in the upper right corner are the few wakizashis on display. Directly above the first picture.
Show Room - NorthEast Corner 4The left side of the last picture. These two were BEAUTIFUL.
Show Room - Southeast corner
Show Room - SouthEast Corner 1 Show Room - SouthEast Corner 2
More assortments of swords. There were still a lot of areas in the show room I didn't even get pictures of. The right side of the last picture.
Show Room - West side - Katanas and Knives
Show Room - West side 1 Show Room - West side 2 Show Room - West side 3
This whole wall was mostly katanas, with knives and other smaller blades in the glass display cases below them. Most of these swords were worth ~$3,500 a piece. Directly to the right of the last picture. Zoomed in from the last picture. The katana with the black and red hilt is the one I plan on getting soon, hopefully!
The Forge - Buffers and Sharpeners
Forge - Buffers 1 Forge - Buffers 2 Forge - Buffers Video
Dan was showing us here how he sharpens and fixes blades with the buffers. A zoomed out (and underexposed?) view of the buffer area. To the left is a larger belt buffer for larger blades. 3 short video clips spliced together of Mr. Watson working on a blade.
Forge - Cavalier CastingThis is the sign in the 2nd picture directly above. I believe they take it to shows as a decoration.
The Forge - The Kiln
Forge - Kiln 1 Forge - Kiln 2 Forge - Metal sheets
A normal heating kiln with tons of different types of hammers, tongs, and tools. A different angle of the first picture. This ones a little hard to see... it's a little better in my original large resolution copy. This is a shelf directly to the left of the kiln that contains racks of different types of metal sheets including (from top to bottom) steel?, brass, and copper.
The Forge - Mr. Watson hammering
Forge - Hammering 1 Forge - Hammering 2
Hammering on a piece of steel while describing the process of creating the different series of blades. Hopefully I can get a copy of the video someone took of this later.
The Forge - Electromagnetic Machine
Forge - Electromagnetic Machine 1 Forge - Electromagnetic Machine 2 Forge - Electromagnetic Machine 3
All 3 of these are pretty blurry, but this is the electromagnetic machine used to rearrange the molecules of the steel and do micro hammering.
The Forge - The (High Pressure?) Furnace
Forge - Furnace 1 Forge - Furnace 2
This is the furnace. I believe it to be super high pressure, but I know it heats steel to over, IIRC 1400 Fahrenheit. A picture taken from the same spot as above, but shifted slightly to the left. The LOUD and powerful mechanical hammer is in the way.
The Forge - Liquid Nitrogen tanks for cryogenics
Forge - Liquid Nitrogen 1 Forge - Liquid Nitrogen 2
A close up of a liquid nitrogen tank. All 4 (or were there 5...?) tanks sitting next to each other.
The Forge - Unfinished blades
Forge - Unfinished Blades 1 Forge - Unfinished Blades 2
Blades that are being worked on. Mr. Watson is standing on the left side of the picture. He is currently standing right in front of the liquid nitrogen tanks from above.
The Forge - Other areas
Forge - Workbench Forge - Other
A workbench. This is directly to the right of the kiln, shown above. Another area of the forge with lots of other workstations and tools.
In the Yard - Group Photos
Yard - Group 1 Yard - Group 2
This was taken while we were waiting for Mr. Watson to come out and start demonstrating. This one has most of the group that was there. The guy on the left side in the red shirt is Ingrid's husband. Lucky guy :-).
In the Yard - Mr. Watson teaching and demonstrating
Yard - Daniel 1 Yard - Daniel 2 Yard - Daniel 3
Yard - Daniel 4 Yard - Daniel 5 Yard - Daniel 6
Using Angel (yes that's his real name... I think) as a dummy :-)
Yard - Daniel 7 Yard - Daniel 8 Yard - Daniel 9
Another "volunteer" 0:-)
Yard - Daniel 10 Yard - Daniel 11
In the Yard - Wolf cutting (video)
Yard - Wolf cut videoWolf (real name) is one of Mr. Watson's employees. He did some of the first cuts, for demonstration purposes.
In the Yard - Angel cutting
Yard - Angel 1 Yard - Angel 2 Yard - Angel 3
Angel (yes that's his real name... I think) cutting. He seemed quite good. Probably the second most experienced guest there (maybe?), after Kendall.
In the Yard - Kendall cutting (videos)
Yard - Kendall video 1 Yard - Kendall video 2 Yard - Kendall video 3
Kendall cutting up his tatami mat. He is apparently quite adept with swords... has won some past sword competitions and is a martial arts instructor and such.
In the Yard - Ingrid cutting
Yard - Ingrid 1 Yard - Ingrid 2 Yard - Ingrid video
Girls like swords too!!! heh. You may have seen Ingrid in a few other pictures (see Group #1) with her (5 month?) old boy that she brought along. Her husband was there too, they are both great people. Video...
In the Office - Mythbusters Barrel
Office - Myth Busters BarrelThe final picture I took. This is the .30 caliber steel barrel used in Myth Busters that they kind of cut through in an episode.
Dakusan v0.5a
Everyone’s gotta start somewhere
This is a picture of me receiving my first real programming language, Visual Basic 4.0, for Chanukah [a Jewish holiday, like Christmas in terms of gifts] in 1995 [I’m the one holding it, age 11, 5th grade]. I had been using QBasic before that. I just thought the picture was too cute to pass up ^_^. The person next to me, Luis Merino, was my best friend during elementary and middle school, and is the reason why I just found this picture. I’m flying up for his wedding in Salt Lake City, in which I will be a groomsman, this coming Tuesday :-).
Visual Basic for 12th Chanukah
LinkedIn Policies Part 2
Tech Support Hell

Continued from Part 1. Once again, I received another notification of a friend joining from an email I gave to the LinkedIn system. I contacted LinkedIn before writing the previous post on the topic with the following message:

For reference, your privacy policy states the following
Information about your Contacts
In order to invite others to connect with you directly in LinkedIn, you will enter their names and email addresses. This information will be used by LinkedIn to send your invitation including a message that you write. The names and email addresses of people that you invite will be used only to send your invitation and reminders.
I decided to search for accounts through your "Address Book Contacts" function, and manually entered my email contacts. I only used this function to find existing users, and not invite new ones. I expected the information to be immediately deleted from your servers, as it had no more use for the contacts I gave, but I found out today they were still there when one of said addresses was used to sign up a new account and LinkedIn informed me of such. While this is a nice feature, it would have been appropriate to allow the user to opt out of having LinkedIn keep the emails for further use, and downright shady that the user is not informed at all that given email addresses are kept by LinkedIn on your servers.
And this is the non-auto-generated response I received back 2 days later:
Dear Jeffrey
We are aware of the issue you are currently experiencing and we are working diligently to resolve the issue. We appreciate your patience while this issue is being resolved.

I thought it obvious from this reply that they did not take what I said into consideration, and a high probability that they didn’t really even read it. I mentioned in the last post this exact thing happened to my friend who was trying to communicate with LinkedIn about a problem he was having with errors with their site code. This kind of thing is typical from large corporations that receive a large amount of communications and do not have the staff to handle it. I consider this practice almost as bad as out-sourced tech support (usually India), another pet peeve of mine, as communication is often hard and the tech support agents often don’t know what they are talking about... at least very much more so than when with other first-tier tech support channels provided in-country ^_^; . I went ahead and contacted eTrust a few days ago in hopes that I get a more personal response from them.

Ready to get back to work
Reliving the good days of Final Fantasy

I got back from a couple day trip to Dallas last night. Man do I hate that drive, especially when it’s raining so hard you can barely see 6 feet in front of you, which seems to happen almost every time any of my friends or family make that drive (from Dallas to Austin or vice versa).

I just now beat Final Fantasy 4 DS too, yay. I was thoroughly happy with the remake they did of the game this time around, of which it had only one or two trifle annoyances of no real consequence, which is surprising for me as I always seem to find heavy fault in everything remade that I held dear as a child. The new game plus feature, as far as I can see, is pretty worthless though, as all it leaves you with is the augments, which I didn’t even use anyways. The cut scenes were all excellent, especially the opening credits pre-rendered cinematics, which I have included below. Now all I really have to wait for is the Chrono Trigger remake they are doing for the DS!!! :-D

I also finished the Eragon books again over the weekend, so with all of that sidetracking stuff out of the way I will be getting back to regularly posting stuff here as promised.



Final Fantasy IV DS Opening High Quality
Stolen from YouTube, owned by SquareSoft


Final Fantasy IV DS Characters Art
Owned by SquareSoft, Image from GamesPress
Final Fantasy IV DS Characters Art