Welcome to my website! I hope you enjoy your stay.
# yay, programming!
rate = 0.96
potency = 100
month = 1
while potency > 50:
    print(month, potency)
    month += 1
    potency *= rate

print(month, potency, 'discard')

# might as well one-line it™
[None for dct in [{'month':1, 'rate':.96, 'potency':100}]
          for x in iter(lambda: dct['potency']>50, False)
              if (print(dct['month'], dct['potency']),
                  dct.__setitem__('month', dct['month']+1), 
                  dct.__setitem__('potency', dct['potency']*dct['rate']),
                and print(dct['month'], dct['potency'], 'discard')] or None

20240310: I have spent the last eight months writing, editing, proofreading, researching, and formatting an article about artificial intelligence. It's about three times as long as “Format Wars.” I have also spent the last eight months procrastinating, stalling, and fretting about what I got myself into – my original plan was to write some basic thoughts on the general idea, but then I started collecting news articles and forum threads and video discussions and personal experiences and so on that I wanted to discuss and it just... ballooned, you see. But it is complete. The HTML file is exactly 1000 lines. I know that shouldn't matter, but it became important to me when I noticed. Anyway, I'm so glad that I finally completed it. At times, I wasn't sure if I'd be able to see it through. If you choose to check it out, I hope you derive something positive from it.

20230125: I have spent the last five days writing, editing, proofreading, researching, and formatting an article about formats and codecs. I don't mean to alarm you, but it's so long that I included a table of contents. It has five pictures, a few code blocks, and a 202-row table (including the header row), but most of it is just plain old prose. Prose with pop culture references, though! And a lawyer joke! And strategies to drastically reduce your media storage needs via high-quality compression! And a totally rad shark! It's a good article. You should read it. Maybe not in one sitting, unless you have a spare hour or so.

20220901: The JS Sliding Tile Puzzle now handles multiple files. If you drop/choose one at a time it'll work as normal, but with multiple it'll just put them in the text area. To start a file from the text area, highlight it first. If you don't highlight one, it'll randomly choose and highlight one for you. URLs should be separated with a new line.

20220816: The JS Sliding Tile Puzzle now has an empty tile with a bit of texture to it rather than solid black, and I've added buttons to skip forward or backward within a video, looping around if you skip before the beginning or after the end. The size of the skip is automatically calculated based on video length, also now implemented in the Subtitle Creator when you've chosen a skip size that's empty or zero.

20220806: The JS Sliding Tile Puzzle can now load images or videos from a URL! Also note that the API I'm now using for rendering video on the canvas (video.requestVideoFrameCallback) is not yet implemented in Firefox, so only Chromium-based browsers and Safari can handle videos. That API has been around for over a year at this point, so I'm not sure when or even if it'll be added to Firefox. If you really want to do a video puzzle in Firefox, the last version that uses the old API (window.requestAnimationFrame) is available here on GitHub, but it has severe performance issues (it's best to refresh before loading a new video) and lacks the latest features and fixes.

20220419: I created a sliding tile puzzle in Python quite a while ago (find it in the programming page), and I'd lately been wanting more and more to try to implement something similar in JS so it can be used in a browser rather than requiring the Python interpreter and a few extra libraries. I also figured that would be a good platform to add support for actual videos, as HTML5 has a very excellent <video> tag. As it turns out, it also has a widget called a <canvas>, perfect for drawing shapes, text, or even segments from an image... or video! It's optimized well enough that some sites actually choose to display video via a canvas rather than the native video tag, even if they're not doing any special processing. It performs just as well with segments as it does an entire video.

Anyway, here's the rundown on my JS implementation of a Sliding Tile Puzzle.

Similarities between the JS and Python versions:
  • smooth, crisp mouse controls
  • still images
  • selectable grid size
  • can scale down to fit your screen
  • can toggle number labels for each tile
Python only:
  • selectable color for empty tile
  • handles GIF animations, but results can be hit or miss
  • can toggle the image on and off
  • keyboard controls, including the option to invert them if they feel backwards
  • can specify a directory to get a random image from it
  • can specify a URL to get a file from the web
JS only:
  • handles any video that works with HTML5 video
  • GIFs will only show the first frame, because showing an animated GIF on an HTML5 canvas is at about the same stage of development as animating a GIF in Python Tkinter, as in, I'm not doing that again just for another hit-or-miss result... fortunately, turning a GIF into a video is much better than vice versa
  • works on mobile! just touch and swipe!
I think it's pretty neat and I hope you enjoy it.

20220324: The Shopping List can now split an item into multiple items, useful when importing a list from another source like a text message. Just hit the button to interact and then the button that says "Split this..." (alternate function of the "Update URL" button). It splits on newline by default, but you can specify a custom substring to split on by highlighting it in your item before hitting the split button.

20220212: The Shopping List now has mouseover tooltips for the various buttons after the UI update made it a little less straightfoward, and I've implemented those UI updates for add/remove/move into the Subtitle Creator. While I was doing that, I had some more ideas, so you can now drag and drop a file into the video frame (or onto the chooser button), and you can play audio files there as well if you want the customizable seek and loop functionality. The media playback rate is now also adjustable, 0-16x.

I've also written another small article, this time about non-profit organizations and their real and perceived roles in a society.

20220128: I have been using the Shopping List lately, and came up with some improvements: more features, less interface!
  • The export button has been replaced with a much simpler function. Instead of copying the assembled URL to the clipboard, or producing a link for iOS, it just navigates there.
  • To move an item, click its ">" button followed by the one at its target location.
  • Clicking ">" and then the same button again (appearing as "...") will remove that item if the text field is empty.
  • If it's not empty, that toggles a line through the item instead.
  • Click "Add item" to add an item to the end of the list. If you've used one of the ">" buttons beforehand, it'll be inserted there instead.
  • To the left of each ">" is a color picker. Check off items, mark groups, whatever you like. Colors and strikethrough even persist through export/import! Take a look at an exported URL and you'll see that each item starts with its strikethrough state, the period, then hex color, then underscore for readability, e.g. 0.ffff00_tomatoes means "tomatoes" with a yellow square and not crossed out.

20220118: Metric time doesn't mean silly phrases like "80 past 2 on April 47th" as you may have been led to believe. It measures the duration from one point in time to another, just like meters measure the linear distance from one point in space to another. This makes it impractical for everyday human use in tracking our planet's rotation (time of day) and orbit (time of year), but computers tell time in this exact way: start with a single fixed point in time, add a duration, and it'll do the math to give you a date and time you can make sense of.

20211223: Say what you mean! If you're thinking of Christmas, say Merry Christmas, not "Happy Holidays." I'd rather hear an honest assumption that the listener is Christian (which will usually be accurate but can easily be corrected if necessary and desired) than dishonest virtue-signaling.

20211115: Please enjoy "Rich Web, Poor Web," an article about how some web browsers provide a "reader" feature that reformats overloaded modern websites into much simpler pages. I've also updated my earlier articles to work better with such readers and use dark styling.

20211020: Disney and copyright make poor bedfellows, and I will explain why in great detail.

20200820: Sometimes I have to write things on paper. I got pens. I'm using the pens. I remembered that there are some cursive letters that I've never liked. I redesigned them. I animated the forms with a technique wherein you create a path (with e.g. GIMP), export the path to an SVG, animate a dashed line on the SVG's path, make each dash the length of the path, and then tell the dash to start one path-length behind.

20190629: Have you been looking for a convenient way to create and share a shopping list? The Shopping List allows you to add, remove, and rearrange items, and you can share your list as a link.

20190524: Have you ever watched a video? Have you ever turned on subtitles or captioning for such? Have you ever wanted to do so but they're unavailable? Have you ever wanted to assemble that subtitle file on your own? If you answered "yes" to that last question, color me surprised! But my answer is the same, so I wrote a program (HTML/JS/CSS) to help do that. The Subtitle Creator allows you to load a video, retrieve start and end times during playback, and create new cues. You can also edit or remove cues as well as import or export your subtitles (in WebVTT format). It doesn't involve uploading anything, and all you have to download is the page itself. It implements a subset of the WebVTT standard, limited to non-overlapping cues with no comments, styling, etc. (you can modify your subtitles afterward if you like, of course).

20181223: My dad is a colored-pencil artist, and suggested that I write a tool that allows the user to select an image, select a pixel or rectangle on the image, and get a suggestion of which pencils to layer to create that color. The Pencil Finder does just that, recommending a mix of up to three colors mixed in increments of 10%, as well as the color's complement. The tool draws from a selection of 132 Prismacolor pencils.

20181012: The full HTML escaper can now also escape only the unsafe characters in a selection. I've also changed the styling a bit.

20181011: I wrote a full HTML escaper that escapes each character (all but linefeeds, not just unsafe ones like ">") into their respective HTML character entity. There's a button to escape the whole input text and copy it into the clipboard, a button to escape only the highlighted text and replace it in-place in the text area, and a button to unescape and replace highlighted text. The initial version of this app was prototyped in Python, with print(*(''.join(f'&#{ord(c)};' for c in line.rstrip('\n')) for line in __import__('fileinput').input()), sep='\n'), and I would call it from PowerShell 6.1 Core with the ClipboardText module installed so that I could grab text from the clipboard, pipe it to the script, and pipe it back to the clipboard. The JS version will not add an extra linefeed at the end, which is convenient, but the major difference is that the Python version is just using ord, which only reliably handles ASCII. JS's String.charCodeAt, on the other hand, is actually intended for finding the character code for any character, including things way up in Unicode. It'll even handle Zalgo text!

Now, why did I create this, you ask? Well, the League of Legends Boards accept posts by taking the text from an input box, parsing it with an unholy mix of sanitized HTML and limited markdown, escaping unsafe characters, and posting that. When displayed, the escaped entities are unescaped by the browser, so it looks right. However, quoting someone's post copies theirs into yours, escapes included. When you submit your post, all of it is escaped, including the quoted segment, so that text is escaped a second time, disregarding the fact that quoted text was already escaped when it was posted the first time. This results in the characters that make up a character code being escaped. When it's finally rendered by a browser, it's unescaped, but only once rather than recursively until it stops changing, so you end up seeing character entities in quoted text. And if someone ever copies that into a post, or it gets requoted, you'll see an escape of an escape of an escape of an... it's bad.

And this makes it worse! Instead of only screwing up unsafe characters, this screws up everything, which means that the initial post looks okay, but quoting it reveals a block of character codes. This is my idea of fun.

The major shortcoming is that messages become much longer, since each character comprises at least four characters (ampersand, hash symbol, one to five digits, semicolon), so you can run into character limits very quickly. Still, it's pretty good. Enjoy!

20180924: I wrote a slideshow with HTML, CSS, and JS, offering a variety of animations selectable with hotkeys or query strings.

20180609: I have decided that plucking is the default on the DVIICE. Now < turns on sustain through consecutive notes (the old default), while > goes back to plucking.

20180531: The DVIICE now allows "plucking" behavior, giving the start of a note just enough character to differentiate between sustain and repeated plays. Press < (shift-,) to start plucking and > (shift-.) to go back to sustaining. This works with playback in the text area as well.

You can now also indicate a rest with the underscore (_) instead of only with a space.

20180527: When working with the text area of the DVIICE, if you highlight some text before pressing "Play!" it will now limit playback to your selection.

20180526: The DVIICE now allows tempo changes during playback from the text area by writing the new BPM after a colon, surrounded by parentheses, e.g. (:120)bnm(:180)bnm. It will still start playback at the BPM in the text box above the "Play!" button (default 120).

20180525: The DVIICE now has new tunings for the guitar: baritone perfect fourth, baritone perfect fifth, and baritone major third.

20180523: If you enjoy my work (like the DVIICE, my YouTube channel, or my GitHub projects, to name a few examples), you can now donate to me via PayPal. I've only linked it where it won't interfere with normal use of the site's content and apps, it's totally optional, and it'll show me that I have actual visitors here rather than just crawlers, robots, and spiders. :)

20180522: I added a pitch wheel to the DVIICE, between the instruments and the staff. It only works for desktop mode. Click and hold to set a starting point, then drag up and down to bend. Release to stop bending and let notes snap back to their original pitches. Any notes played with the keyboard or played back from the text area will be affected, whether they begin before you click the pitch wheel or afterward.

20180522: Someone asked about playing chords on the DVIICE, so now it is possible to play multiple notes at once with the keyboard, and create chords in the text area for playback. See the help for details. There's a simple notation for basic chords, and a more complex notation if you want to get fancy.

I think it's important to take a step back and remember what the DVIICE is and isn't for. It's a tool to compare notes across instruments. It's not an instrument per se, and it's not music composition software. If you want to play an instrument, you'd be better served with physical hardware like a synthesizer. If you want to compose music, you'd be better served with something like MuseScore. Instruments and MuseScore have many wonderful features, and the DVIICE is meant to complement them, not duplicate them.

20180518: Well, that didn't last long. The sweep button is gone, and instead you can just click and drag naturally without dragging images around, because I figured out how to suppress browsers' default drag-and-drop behavior.

20180518: If you click the "Sweep" button near the version button on the DVIICE, notes will play as soon as you mouse over them rather than waiting for a click.

20180515: The DVIICE has been updated with new back-end code that allows it to work outside of an Apache-capable server. This opens it up to hosting on more basic servers, and it can even run locally, with all features! It used to load instruments by retrieving the corresponding file, reading its contents, parsing those contents as HTML, and inserting that into the page. Now the instruments are stored as strings in a script, and I can simply access them directly. It's like going from Python code of num = int(open('data.txt').read()) to from data import num. Much easier, and not something I would've thought of when I first started writing the original DVIICE back in 2013, before I'd actually learned programming. Anyway, it works the same as before, only now it's available as a zip file for local use. Enjoy!

I also added the ability to select sine, triangle, square, or sawtooth waves with Q, W, E, and R, and set vibrato levels with "`" (off) through 5 (strong). Because.



Yes. I changed it.

It's been about ten years since I last updated this site's look and organization. I realized that all the categories in the navigation bar pointed to things I haven't updated in years, while all the relatively recent stuff was buried in this "News" area. No more! I not only made relevant content more accessible (I didn't delete the legacy pages; your bookmarks won't break), I also updated the code behind the navigation bar. It no longer consists of huge blocks of JavaScript that swap out hand-made images of text - it's pure CSS. Along with the change a few days ago moving to the details HTML tag for collapsible sections, this site gets along without JavaScript except on pages like the clock or the DVIICE.

20180506: The clock had a slight problem on mobile: if the device locked (screen off), the function that announced the time couldn't fire, and there's no way to break through that barrier. However, if the device locks while that function is in progress, it's allowed to complete. My solution was to abandon setInterval (which is the obvious and correct solution for a clock or timer) and set up a wrapper function that calls the primary updating function in a loop, with a one-second sleep. Devices may block functions from starting, but they won't block functions from continuing, so this "foot in the door" lets us hang on to the necessary permissions. So now that works.

I also changed the notes from C/F/D/G to C4/E4/G4/C5 (C5/E5/G5/C6 on mobile), for better clarity on which digit is playing.

20180503: Two updates again! First, the clock now lets you click/tap anywhere on the page if you're on a mobile device, so you don't have to tap the text and have the browser try to highlight it. The mobile version also plays an octave higher (from C5 instead of C4), which is easier for small speakers.

Second, Version 3 of the DVIICE now allows playback! Enter a BPM in the box to the right of the "notes" area (the default is 120 BPM), and click "Play!". Use a space for rests.

20180503: Yes, two updates in one push. The stylesheet I started using back in 2015 just so happens to be bad at actually loading pages. It sometimes tried to add a fade effect to transition to a new page, and sometimes it would either require a refresh on the new page or simply fail with an error. Well, after first changing everything to work with some pure HTML5/JS/CSS code I found, I kept looking and apparently there's now HTML that literally does exactly what I want with nothing but a details tag and a summary tag. So now we're back to the old look, just tidied up a bit.

20180502: Remember when I made a clock a few weeks ago? A clean, simple, uncluttered clock? Well, I cluttered it. The clutter is in the source code, though, and it doesn't load the audio unless you use it, so that's something. Anyway, if you use it the same way as you did the old version, there's no difference. However, you can now click/tap the time, and you'll get a dialog box asking how often you want to hear the time. If you provide a positive integer, it'll beep out the time immediately and then again when the minute is a multiple of n:
  1. First digit of hour, C4 for 0 and F4 for 1
  2. Second digit of hour, C4 for 0 and F4 for 1
  3. First digit of minute, D4 for 0 and G4 for 1
  4. Second digit of minute, D4 for 0 and G4 for 1
So 14:05 would be F FCC D GDG.

Note that the original version is now preserved at tigerhawkt3.com/time.html while the new version has replaced the old version at tigerhawkt3.com/time/index.html.

20180412: It's surprisingly hard to find a good, simple clock these days. time.gov is the standard, of course, with time zones, delay correction, a daylight map, and so on. However, the actual clock widget is very small, and they disable the dynamic update on days where the time changes to ease the server load. So I made my own. And then I made another, and another. First I made one in Python with tkinter, because I like Python and tkinter. That seemed like overkill, so I tried PowerShell - it works fine, but styling is quite difficult in PowerShell and my solution for a large display was Windows Magnifier... not ideal. Then I thought maybe HTML5/JS/CSS would work, and it turns out that it does.

I briefly toyed with centering the display vertically, but that doesn't play well with Chrome for Android's address bar. The window size doesn't take the address bar into account, so content that fits in the window without any scrolling can be hidden under the address bar and the address bar can't be collapsed because that only happens when you scroll down. Android isn't even capable of opening local HTML files in Chrome, and Chrome for Android doesn't have a "view source" option, so that was kind of a pain as well. I don't really like the mobile environment.

Anyway, the HTML version is a simple clock with no applets, ads, or distractions. It works on any device with a modern browser. Note that it gets the time from your device rather than from an online timekeeping service.

20171028: I needed a stopwatch today. When you Google "stopwatch," Google gives you a page with a stopwatch widget. But it still shows the regular search results, which are full of Flash stopwatches. I was sure that was unnecessary, as a stopwatch is just a timer with a couple buttons and a single dynamic element.

Five hours later, I have a Stopwatch that not only lets you run a single timer like normal people want to do, but also allows you to split a session into segments (a "lap timer"), soft-reset completed sessions into a table, keep track of totals and split times, and keep the buttons in sight at the top while also auto-scrolling to the latest split. Press "start/stop" to make the timer run or pause, press "split/reset" while running to split, press "split/reset" while stopped to save the current session and start a new one, and press "split/reset" again before starting the next session to completely reset it.

20170627: Guess what! Something in JS's string replace or parseInt API changed in the last few months, so the HTML/JS STO loot parser was giving wrong results. Instead of replacing all the commas and parsing the result to an integer like "1,000,000" to "1000000" to 1000000, it was parsing "1,000,000" to "1000,000" to 1000. Which is, of course, dreadfully wrong. Fortunately, I double-checked the results for digital rust when I ran it for the first time in a few months, and noticed the discrepancy! It's not paranoia if it actually happens. :) Anyway, I fixed it. If you've been using it between release and this date, rerun it.

20170605: Version 3 of the DVIICE now supports logging for keyboard input! Just click the text box before playing notes, and there you have it. Click outside the text box if you don't want played notes to show up there.

20170509: Version 3 of the DVIICE now supports keyboard input! Play natural notes and sharps in a range of two octaves, selected with ZXCASD. For more, see the Help.

20170105: I wrote a log parser with many loot analysis methods for Star Trek Online in Python last year. I recently rewrote it into a streamlined version and a further-streamlined version in both Python and Julia, as well as a JavaScript version of the more-streamlined algorithm. GitHub links: If you want a full version with a powerful analysis engine, use the original parser. It allows you to show daily totals, daily cumulative totals, lockbox wins, Dabo results, and more, with any item or category of items you like. If you want a simpler version, use the JavaScript version, as all you have to do is click the link and select your files. It will give you daily totals for Contraband, Dilithium, Dilithium Ore, and Energy Credits. I chose that analysis and those items because those are the figures I'm interested in tracking. If you need more flexibility, use the original version written in Python.

20160429: I've been streaming on YouTube every day now for over a month. I alternate "Let's Play" days and "Let's Code" days. You'll see me either playing a video game for PC, Sega Genesis, or Nintendo 64, or writing a bit of Python code. You can check out my channel here.

20151213: Are Ebooks and Emulators valuable new technologies, or phonies to be scorned? This article is about twice as long as Why Windows?, but it has pictures.

20150917: Chess 11! It uses a new chess notation module I wrote. It's a useful module in its own right: it supports pipes and redirection from your favorite command shell, and can export to space-aligned or tab-delimited output. You'll find it in the Chess 11 source files.

Chess 11 has the following new features/fixes:

  • There is a new pane to the right of the game board that shows a list of the current game's moves, in ICCF notation.
  • You can underpromote a pawn to any piece (queen, rook, bishop, knight) instead of the game automatically forcing a queen promotion.
  • Instead of only being able to load a list of moves in the game's internal notation (which was pretty close to ICCF notation), you can now import a list of moves in ICCF notation, and it will be converted and loaded automatically.
  • Similarly, you can now export a list of moves in ICCF notation.
  • You can export a tab-delimited chart of the current game's moves in a variety of notations. You can't import this whole thing back into the game, but you can isolate the ICCF column and import that.
  • Bug fix: you can no longer move for the AI by stepping back to its turn.
  • Bug fix: castling moves are highlighted properly during navigation.
Get the source, the 32-bit Windows version, or the 64-bit Windows version.

20150605: New look for this page. I wanted to put the older news items into a collapsible widget, and the ready-made stylesheet I found on w3schools looked like this. Not-quite-black text, off-white background, and sans serif fonts. I think it looks fine. Either way, I don't plan to apply this stylesheet to any other pages.

20150425: Chess 10 is here! New features include the following:
  • Volume control
  • Time control
  • Background image selection
  • Background animation color selection
  • Grid line color selection
  • Developer console (use with caution)
Get the source, the 32-bit Windows version, or the 64-bit Windows version.

20150228: Why do I prefer Windows? The answer is a few screens long. You should get a snack.

20150222: There are several new things here that I have neglected to put in this news area. Sorry.

First, what's the smallest floating-point number your device can handle before it rounds to zero? Find out with the Smallest Float page.

Next, there is a schedule for the Winter Wonderland events that occur in Star Trek Online during the winter event. It won't be too useful right now, but just wait until December rolls around.

There is a map of the server room maze in the Star Trek Online episode "Dust to Dust." There is a special bridge officer you can find in that maze, but it's in a random dead end, so you'll just have to have a look around.

I learned Python last year. It's a straightforward language to learn, and a great language to do things in. One of the things I have made so far is a program to help plan half-square quilting patterns (my sister quilts). It is available as source and as a frozen package that runs on 32-bit Windows PCs without needing a Python installation. There's also an earlier version 1 (source or frozen), but you don't want that. Still, it's there, because data. After starting it up, you'll find instructions at the bottom of the window.

Another thing I have made so far - or, I should say, something I make - is a chess game. It is currently on version 9, and I'm working on version 10. I'm keeping old versions available, but I very highly recommend getting the latest one to avoid bugs (not to mention all the cool new features I keep adding).

Chess 5 with piece icons
Chess 5, source only
Chess 6, source
Chess 8, frozen
Chess 8, source
Chess 9, old frozen release
Chess 9, source
Chess 9, win32
Chess 9, win64

Those last three are all the latest version, until I'm done with version 10.

20140616: The DVIICE V3 now has the ukulele in various tunings.

20140327: The DVIICE V3 now has Powerbender harps in a full range of 14 keys, from Low F to High G. I have also added natural minor harp tunings, from Abm to Gm.

20140305: Version 3 of the DVIICE is now available. Switch between Chrome/Safari and Compatibility modes on the fly, with the click of a button. Assign instruments to instrument zones with a unified menu.

20140101: The DVIICE now loads instruments and their images in a single click. Added Powerbender tuning (just C for now) to Instrument 1.

20131215: The DVIICE now has alternate guitar tunings, including open tunings, all fourths, DADGAD, and more.

20130903: I have updated the DVIICE with new functionality and better coding. You can now select from a variety of instruments/keys for Instrument 1, Instrument 2, and Instrument 3. Remember to use the "Display (X)" button if you're choosing an instrument with a different layout. There is a Chrome/Safari version, and a compatibility version. Many thanks to "Old Pedant" at www.codingforums.com for his patience and generosity with giving me a new highlighting methodology and helping troubleshoot and debug the whole thing.

20130822: I have created the Digital Virtual Instantaneous Instrument Comparator and Emulator, or DVIICE, a tool that allows users to compare note positions between a 10-hole diatonic harmonica, a six-string guitar, a piano, and a musical scale. Mouse over a note to display all enharmonic (equivalent) notes, and click a note to play it (uses an equal-tempered scale). The Chrome/Safari version (using the Web Audio API) allows you to hold the button down for a continuous note, while the compatibility version (using HTML5 - works on modern browsers) produces fixed tones of one beat (half a second) in length.

Want to change a guitar tab into a harmonica tab? Use the DVIICE to quickly translate each fret on the guitar to the proper hole (with any required overblows or bends) on the harmonica. Want to create sheet music out of your harmonica ditty? Tell the DVIICE how it goes on the harmonica, and it will show you where each note belongs.

You can find links for each version in the "Music" section, accessed via the eponymous button on the navigation bar. Save it for offline use by downloading and extracting this zip file.

20120912: I'm now posting replays of my League of Legends matches.

20120428: Added a large batch of rage comics. Now at 58 comics.

20110814: I made a gallery for my rage comics (mirror).

20110814: I wrote a review for the Fenix TK35 and posted it on 4sevens.com. I didn't take any pictures for it, so I'm just going to link to it instead of making my own page for it. Here it is.

20110808: Did you know that I have a Career? True story.

20100823: WoW-related: GraphCalc scripts for warrior/bear rage generation as of patch 3.3.5.

20080422: The short film "Look, But Don't Lick" is up.

20080316: I gave Paul his birthday present, and he liked it! Video here. I've also added a little video that's funny for you but annoying for me.

20080314: Happy 21st birthday, Paul! There's a video of Paul's newly modded flashlight build, a fully dimmable Maglite.

20080306: The Welcome Mat has been updated! The new version can be found here.

20080222: If you'd like your banner ad near the top of this page, please contact me.

20080217: I've added a new clip to the videos page. Enjoy!

20080206: If you want to view my videos but don't want to stream it in a Flash player, you can download the .avi versions and view them easily at your convenience. Just go to the http://tigerhawkt3.com/videos directory.

20080206: I'm going to start providing updates about the site. It'll include new features, content, and so on.