Hello, world.
This is a little place where I stash some of the various Web projects and graphic images that I've hacked up over the years. It's also my sandbox for experimenting with different designs, DHTML effects, SEO techniques, and CSS media formats for the printer and mobile device. Naturally, Bitmess will be in a dynamic state of flux (i.e., a bit messy). Contrary to the pun you just suffered through, the term "Bitmess" was originally coined by joining the computer bit with mess, as in the mess you have on your desk.
Feel free to peruse the site and make use of anything that you find useful, though credit or a link back to this site would be appreciated. Questions, comments, flames, and suggestions are always welcomed. You can contact me at tom@tohodo.com.
Enjoy!
Tom
Projects
Many more to dust off...
Browser Extensions
Chrome
- Autofill
An extension for Google Chrome that automatically fills in forms when a Web page is loaded. In the process of upgrading my classroom to Linux, I had to find something to replace my Mr. Diễn Đàn form filler tool, which required Microsoft Windows. I couldn't find anything equivalent for Linux, so I developed my own solution that exists inside the browser (Chrome or Chromium), which makes it platform agnostic. This extension makes use of HTML5's localStorage for persistent storage. Year: 2010
Firefox
- Autofill
An add-on for Mozilla Firefox that automatically fills in forms when a Web page is loaded. Since some of my students still prefer Firefox, I ported my Chrome extension over so that they now have a choice. Year: 2010
HTML/CSS
- Raffle Ticket Picker
I created this raffle simulator on short notice for a non-profit charity event in Vietnam. The organizers wanted to broadcast the raffle on a large projected screen so that the audience can follow along. Year: 2010
- This or That
A casual game to end your spats and bring about World Peace! You can even play it to find your soulmate. No, really. Ignore the inside joke at the end to submit your CC and SS numbers—it's a dummy form and I'm not trying to phish. This was a concept for a social gaming site that unfortunately never got the time it deserved to flesh out (in hindsight). It had a community aspect, a simple interface, random color scheme on page load, and even fonts that scale with the window. Year: 2005
- Cosine [launch]
This graphing calculator was my entry for the 2002 5k contest, an early Web design competition conceived by Stewart Butterfield to see what could be created using HTML + CSS + JavaScript or Flash in a mere five kilobytes. The original idea behind this was that "the rigid constraints of designing for the web are what force us to get truly creative." Cosine wasn't exactly finished as submitted—it was missing the "calculator" part and trace/solve functions—but it went on to achieve a rating beyond my expectations. The "launch entry" link on the Internet Archive page is broken; Cosine can be viewed by clicking on the "launch" link above. Year: 2002
- 14-Step Diet Plan
I've always been a bandwidth conservation nut, so in this spirit I drafted a Web weight loss program that got published in some e-zine back in the day. It helped me shave off at least a few KBs every page. Note that this was written over a decade ago in the age of dial-up, so some of the tips may not be relevant today. Year: 1999
JavaScript
- Interactive search prototype
A fully interactive parametric search prototype driven entirely by a JavaScript data object. Year: 2012
- Keywords Permutator
This is a tool I created for the SEO team to permutate keywords for Google AdWords. Year: 2011
- Product filtering demo
This is a demonstration of using JavaScript objects to create a filter that can be used in an online catalog or shopping guide to help customers find products that match their selected criteria. Year: 2008
- Change layout demo
A proof of concept that I made for the change layout feature in the My Yodlee account aggregation webapp. Year: 2001
Flash
- TORC Dashboard (Flex 2, ActionScript 3)
A Flash application that helps visualize Traffic, Orders, Revenue, and Conversion metrics to more easily spot trends so that one can "torque" website parameters to try to improve said metrics. Well, that’s the idea anyway. Year: 2006
- Cursors.as (ActionScript 3)
This is a cursors package for a Flex application. I wanted a Mickey Mouse hand pointer for my TORC Dashboard app, so I had to extend the CursorManager class that came with the Flex SDK. You can now add as many custom cursors as you want to your Flex application! Year: 2006
PHP
- drupal.tohodo.com
This is my Drupal playground. I'm currently working on a custom Zen theme on my local server; it will be uploaded when time permits. This site uses the Vietnamese Language Pack and the following add-on modules: Global Redirect, Menu Block, and Porter-Stemmer. Many new modules such as semantic URLs and a shopping cart will be added in the near future as I experiment with Drupal. Year: 2009
- Paperigital, Inc.
I helped a friend start up this click-and-mortar company that was supposed to revolutionize the way people manage snail mail like the way Netflix did with movie rentals. I built the website in PHP, my friend programmed the client software in C#, and we even opened a physical office. Our startup almost took off until my friend landed a gig at McKinsey and moved to Shanghai. Well, at least you can say this is one dotcom that never bombed. Year: 2004
Perl
- Monochrome Theme (Ode)
A lightweight, XHTML 1.1 compliant minisite developed using the Ode Web publishing platform. I'm always a sucker for efficient designs, so I was naturally attracted to the refreshing simplicity of Ode when I tried my hand at making a theme. This probably belongs in the HTML/CSS category, but I did hack some Perl code to extend a couple addins. Year: 2010
- Dialogue Box (Template Toolkit)
A UI module I wrote that served as the cornerstone of the front-end for a start-up's Web app. Man, looking back at the code it screams "spaghetti"! Whatever happened to the separation of presentation and logic, huh? Year: 2000
Visual Basic
- VBA
- VBScript
InfoPath
- How to calculate business days
This is a date range validation routine that supports business days. It uses minimal code and CPU cycles as compared to other methods. For those coming from an Excel background, this is similar to the NETWORKDAYS() function that comes with the Analysis ToolPak. InfoPath 2003 would be _that_ much more powerful if it supports only half of Excel's built-in functions. Year: 2008
- Date range validation using less code
I've read more than one article about date range validation that relied on too much code for my taste, so I wrote simpler validation code that basically mimics how Excel calculates date ranges. Year: 2008
SQL
Shell Scripting
Unix
- fhtml (Bourne shell - sh)
This script was used to format and clean up HTML code with the help of Tidy and a sprinkle of Perl magic. "Foobar" was used wherever applicable to protect privacy and security. Year: 2006
- notify (Bourne shell - sh)
This script was used to notify developers when deployment jobs fail, which annoyingly was quite often thanks to the memory leaks of the Java application. Maybe it's just me, but I never had a good experience with Java served from a browser, with two exceptions being the Spinchat online chat applet and the Prophet JavaCharts applet. "Foobar" was used wherever applicable to protect privacy and security. Year: 2006
- build (Bourne shell - sh)
A CVS build script I wrote for a Fortune 100 company. Some directory and host names were changed to "foobar" for security, though I'd be surprised if they're using the same version control system and build scripts today. Year: 2003
- Bourne-Again shell (bash)
- C shell (csh)
- cobranch (TENEX C shell - tcsh)
This small script was used to create a new Perforce client. Any directory or host name deemed a security risk was changed to "foobar". Year: 2001
Windows
- Mr. Diễn Đàn (AutoHotkey)
I created this form filler tool to help my disabled students do their work moderating forums (diễn đàn is Vietnamese for forum). Most of them have limited use of one or both of their hands, so less typing equals increased productivity. This is the forefather of Autofill. Year: 2010
- HTML Aide (AutoHotkey)
This is a little utility that assists in writing HTML code and some JavaScript. I originally wrote it for our copy writer. Year: 2007
- AutoIt
DOS
- 7zip.bat (Batch)
I needed a quick way to convert all of my compressed archives from Zip to 7z format. Since I was too lazy to extract Zip archive, add files to 7z archive, and delete the Zip archive and extracted files thousands of times manually, this batch script was the result. Year: 2010
- sync.bat (Batch)
Who needs a dedicated backup/sync software solution when you have xcopy built into every PC since the MS-DOS days. Ultimate power and flexibility. For even more ultimate goodness, you can use robocopy instead of xcopy if you have the Windows Resource Kit, Windows Vista, or Windows Server 2008. "Foobar" was used wherever applicable to protect privacy and security. Year: 2008
Graphics
- The Gadgeteer logos (vector graphics)
Here are some logo designs I did for Julie Strietelmeier's the-gadgeteer.com website. The splines that make up the sprockets in "G" were created in Xara Webster, which I believe was the only Web graphics app that could do vector drawing at the time (way before Fireworks). Year: 1999
- GameSpot T-shirt (3D modeling)
This art was designed to be silkscreened on a black tee. The space tank object in the viewscope was rendered in bCAD, a freeware DOS 3-D animation studio, and placed in a generic desert scene. All the masking and motion blur stuff were done in PSP because I didn't have access to Photoshop. Year: 1997
- Osteoporosis (2D animation)
I did this animation entirely in Autodesk Animator Pro to demonstrate osteoporosis in a high school physiology class. The teacher was so impressed she said I could skip lab assignments for the rest of the year and she would still give me an A ^^. Year: 1993
- Emblems (e-doodling)
OK, so I threw this on as a joke. I sketched these emblems of my initials TD, THD, and Tom D. on my HP OmniGo 120, one of the first PDAs, and the very first one with Graffiti character recognition. Interfacing with a touchscreen was all so new, all so exciting back then. One of the emblems went on to inspire the favicon you see on this site. Year: 1997
Tom's RSS Stream
The Trading Game
I've been playing the Trading Game, what I call investing in the stock market, since 1994 with my first purchase of 100 shares of MSFT. Shortly after I experienced my first 2:1 stock split, and I've been hooked ever since. I'm reluctant to tell colleagues that I actively trade because inevitably some of them will come ask me for investment advice. At first I was more than willing to throw out stock picks left and right—and some have profitted handsomely during the tech boom—but after a few busts I quickly realized that it was a bad idea. I hate to see my friends lose money on account of me. So there you have it: please don't email me for stock picks or investment advice. I don't claim to be an expert, my philosophy and methodology may not suit your taste or risk level, and what worked for me in the past or present may not work for you in the future.
With that said, here are the general guidelines that I try to stick to after years of experimentation:
- Treat the Trading Game as just that—a game, and not your boyfriend or girlfriend. This means leaving your emotions at the broker's login page. Once you let your emotions get in the way, you are already on your way to losing the game because you can't live with emotions, which includes regret (see second point), and be a successful trader at the same time. A trick that works for me is to think of money ($$$) as just numbers (###) like hit points in an RPG game. If that's not your cup of tea, then try to see your balance as Monopoly money. The point is you have to find a way to detach yourself emotionally from your money, because if you get scared or nervous about losing $10K in a day, then this game may not be for you.
- Have a solid game plan and stick to it at all costs. For example, a golden rule of trading is that you should focus your energy on consistently minimizing your losses and maximizing your gains. Well, one of the most common mistakes a rookie trader makes is that they are overwhelmed with regret when a position drops from positive to negative, and they hold in hopes of gaining back the loss instead of selling to minimize the loss. Before you know it the stock is sliding into oblivion and the rookie trader is left holding a bag of bricks. This leads to the next rule...
- Have sound money management. Before even thinking about making a trade, decide what percentage of your account balance you are willing to risk with that trade. Borrowing a page from Forex trading, you should always have a stop-loss (SL) and take-profit (TP) target price in mind to cut your losses or reap your profits while you're still ahead. If your broker allows you to set trailing stops, all the better. Why is it so important to minimize your losses? Most rookie traders do not realize that if youre down 20%, then you need to go up 25% just to break even. If you are not disciplined in managing your money, your entire account can be wiped in a matter of months, especially if you trade on margin, which leads to the next rule...
- Don't get too greedy! You may not be greedy now, but that will likely change when you start playing the Trading Game. This is something I still struggle with. Don't waste your energy (and money) on trying to make double- or triple-digit gains every time by using leverage. Remember that margin is a double-edged sword: you can win a gazillion as well as lose a gazillion in one trade. There are more times than I'd like to admit where I've ended up losing more money by holding on to a position for too long in the hopes that it would continue to climb. Set a target exit price for yourself, and as soon as you reach that target, sell right away or you'll have second thoughts and the greed will start to creep in. Again, this ties back to the previous rule.
- Trade often. "Practice makes perfect" holds true in the Trading Game as well. One good way to turn yourself into a lubricated trading machine is to actively trade year in, year out, in different types of securities: stocks, ETFs, mutual funds, bonds, treasury bills (T-bills), options, futures, currencies, etc. You will undoubtedly make many mistakes along the way as part of your learning experience, but don't look back and wallow on the what-if's; look forward and see how your can apply the lessons you've learned to improve on your strategies. If you let one bad trade stop you from actively trading (i.e., out of the market for even a couple months), then you'll be missing out on potentially huge future gains that would more than make up for the losses.
- Trade big. You should try to save up enough so that you have six figures to trade with. For example, if you invest $1000, then you'll need a 10% upswing to make $100 ROI, whereas if you invest $100K then you'll need just a 0.1% upswing to get the same return. Of course you can also lose big, so the theory is that by the time you have saved up enough to trade six figures, you will have settled on a strategy that gives you positive ROIs more than 50% of the time. By lowering the required percentage gain, you have more flexibility in the types of strategies that can be deployed.
These are just the most fundamental basics that don't touch on due diligence (DD), which is the sweat that you owe yourself by doing both fundamental and technical analysis on each stock or currency you plan to trade. There are so many nuances in trading styles that it would be an exhaustive undertaking to even summarize my own evolving strategies. However, as time permits this is where I'll be posting some of my investment exploits.
The Trading Game is infinitely complicated, and yet so simple. Just like how there are many ways to play a video game, there are many ways to play the stock market. Everybody's got their own approach, so you just have to find something that works for you. There is one crucial difference between the stock market and video games though, and I'll make it very clear: you cannot win the stock market game (or else we would all be millionaires). There are no GameShark codes, hacks, power-ups, or maps to help you win this game. Once you put aside the delusion that you can beat the stock market, you can begin concentrating on how to become damn good at playing it.
Other Stuff
Coming soon...
What the heck is a Bitmess?
This was the beginning of a draft of a project that I was toying with in 2005 to create a "flexible online database," as the title still states. The project began as a solution to a problem that was vexing me at the time: how to quickly catalog my modest CD collection (1000+ discs) and be able to access this information on the Internet. I had ambitious plans to build a Web application that would allow me to insert a CD and then have a database record automatically added using content extracted from freedb.org. I was an early member of Intuit's QuickBase when they still had the free personal accounts, but it didn't and wouldn't offer support for local CDDB database imports.
The project grew into a platform for a generic database where anybody could store any data online, similar to what Google eventually came out with, but with more flexible import/export capabilities (e.g., fully customizable template-driven schema). I had already decided on my tools (PHP + PostgreSQL) and even had the perfect tagline: "Store your mess online." And then I ran out of time. My day job got in the way, other side projects got in the way, life got in the way, blah blah blah. So now I've kept the skeleton as a reminder of the past as I look forward to the future. Who knows, maybe I'll drag this project out from the closet and do something with it someday. About that title—I've decided to keep it because, in another sense, this is my online database of widgets and knick-knacks. Consider this as me moving into my garage.
Revisions
- 2.2 - Updated code to allow Back button navigation
- 2.1 - Fixed toggleBox bug in IE6 and Firefox for Linux
- 2.0 - Added Google Analytics event tracking
- 1.9 - Fixed RSS Stream negative theme
- 1.8 - Added RSS Stream
- 1.7 - Fixed Projects submenu loading bug
- 1.6 - Added printer-friendly CSS
- 1.5 - Added password recovery
- 1.4 - Fixed IE7+ bugs
- 1.3 - Added frogger
- 1.2 - Added effects
- 1.1 - Added spotlight box
- 1.0 - Initial release
Coded in Notepad2. Scripts and CSS compressed using Ajax Minifier and CSS Compressor, respectively. No frameworks are used.
Tested in Chrome 3+, Firefox 2+, and IE 6+ on Windows XP SP3; and in Chromium 5+ and Firefox 3+ on Linux. YMMV in other browsers or on other operating systems.