Prediction II: Taxes

Relevant Article: More Than Half of Tax Returns E-Filed

The prediction:

By 2010, the federal government will require all income tax returns to be E-Filed.

Those who supposedly cannot afford to E-File have many options available to them to do this for free via the federal government’s easier-extortion system know as Free File.

Currently, every single American citizen has Internet access via public libraries, so that counter-argument is invalid.

The massive amount of paperwork and paper-pushers (and the healthcare for those paper-pushers) involved in processing a tax return will simply grow too expensive for the federal government to continue to allow paper submissions.

They will champion their new plan as a technological advance.

They will state that eliminating paper returns has an enormously beneficial impact on our environment.

It will happen. Mark my words.

New Pope

Man, this guy is a photoshop goldmine. I think we should rename pope photoshops as “poposhops.” There are going to be lots of these… ;)

I have about 5 great ideas for the next poposhop. I’ve only completed one.

Pictured below is the newly…uh…crowned?… pope, Pope Benedict XVI.

His name in real life is “Ratzinger.” Tell me, who is the first person you think of when you hear a last name like Ratzinger?

That’s right, our new pope:

New Pope Ratzenberger

John Ratzenberger!!

Rebate Center Update #5

Well, time for another update, although I am yet to receive a single comment about this exciting script. That’s OK, I guess– the users of the rebate center will probably get a kick out of reading the development blog once the site has been opened.

Development on the rebate center has slowed down a bit, not because I have run out of things to do, but because I have hit a wall.

This seems to be a regular feature for me when coding a big project. I imagine that other developers experience similar stumbling block.

When I write code, it is as close to a visual art as I get. I can’t draw. I can’t paint. I can’t do any of that. So when I write code, I try to make it the most beautiful, most efficient piece of work that I possibly can. Unfortunately, that sometimes leads to a slow development process.

Before I get into the stumbling block, I’ll talk about one success I have had. I added a feature that I didn’t plan, but was clearly necessary.

When you add a rebate to the system, there is some basic information you must provide. In the interest of keeping the form from being an overgrown monster, I built form fields for the absolute-minimum information I need to run the system.

That is all fine and good, but not always practical for a user. Let’s say a user tracked down the corporate directory for a company that has stiffed them on a rebate. As it was, the user would create a general note for the rebate with the included information. Then, when they want to retrieve that information, they would have to go back into the rebate, and search through their notes to find the information the entered.

Now, users can add “custom fields” to their rebates. The fields appear directly below the rebate summary, so they are very easy to find very quickly. To add a field, a user simply clicks “Add More Information” for a specific rebate, and then provides a field “title” and a field “value” for their custom information. The system allows users to add as many custom fields as they would like.

And now the stumbling block: Statistics.

These statistics are giving me the toughest time. It seems it is incredibly difficult to build real-time statistics without either a lot of processing via php, or a lot of reading via mysql.

The statistics I’m trying to build are simple. Members will be able to see where they rank compared to other members in four categories:

* Success Rank: The percentage of a user’s rebates that were successfully completed.
* Total Value Rank: The cumulative value of all rebate checks a user has received.
* Average Value Rank: The average value of all rebate checks a user has received.
* On-time Rank: The percentage of a user’s rebates that were received on-time.

Users can view a site-wide list of rankings (everyone on the site), can view just their statistics (from their rebate center homepage), and can use a dynamically-generated signature image that lists their ranking in all four categories.

I’ve thought and thought and thought about how to pull these stats, and can’t come up with anything good. I’ve settled to using a method that seems to be a problem waiting to happen, but there is not much I can do for right now. Once the system is underway and I have better sample data for testing, I will have to rewrite the statistic functions.

For now, I read every single rebate in the system with one huge SELECT query. I then step through the rows, and build an array that looks like this:

    [6 ](member id) => Array
            [past_due_rebates] => 3
            [open_past_due_rebates] => 1
            [closed_rebates] => 2
            [successful_rebates] => 2
            [total_cash_received] => 128

From there, I loop through the array, and create four new arrays of the actual statistics. Perform an arsort() on each of the arrays, and I end up with a nicely formatted array like this one:

success_rank ARSORT: PrintArray
    [6] => 0.666666666667
    [5] => 0.25
    [4] => 0
    [2] => 0

This allows me to access any of the statistical arrays whenever I need them. I can pull a specific element of an array, or I can pull a specific user’s position within the array.

I’ll take these four arrays, put them into one big multi-dimensional array, serialize it, and stuff it into a cache table I’ve created in the database.

I’ll be writing a stats_read() function and a stats_write() function to serialize and stuff the array, and take in and reformat the array into a usable format.

I’ll run the script that rebuilds the stats with a CRON job, and will hopefully keep CPU usage under control as a result.

It shouldn’t be long before I finish the stats section. Then, I just have to perform a complete rewrite on all of the code to make sure it is as efficient as possible, register a domain, and we’re set for a beta launch.

I can’t wait!

Rebate Center Update #3

Here is the latest progress:


This is the screen you see when you click the “View Notes” icon on any rebate. It allows you to add a note (four big buttons at the top), and review previous notes (legend/table display).

Tomorrow I’ll finish off the “add note” form, which is more complex than just a simple form. It shows previous notes for reference, and a summary of the rebate as well.

I’ll actually be writing a generic “rebate info” template/function tomorrow that can be used throughout the module. It will make it nice and easy to remain consistant with the display.

Rebate Center Update

Alright, I’m making some major progress on what is tentatively called the “rebate center.” The project is progressing quickly, and should be done in beta form in about a week. It’s going to be a great resource for anyone who sends out a lot of rebates like I do.

Screenshot 1.
This is the main screen that the user sees when they first enter their rebate center. This is achieved by clicking a link at the top that says “Rebate Center” (clever, I know).

For right now, only the top two sections contain live data. I haven’t quite worked out how I’m going to do the overall stats yet, but I will figure something out. The site-wide stats are important, I think, because it gives a sense of competition for the users. I think I am even going to make dynamic signature graphics that members can use that shows their rank on the site.

Screenshot 2.
This is the screen that the user will see when they choose “Add Rebate” from the top navigation tabs. It is a pretty basic form, and I have got most of the validation worked out. Of course, I do not have any fancy javascript validation, so if javascript is your thing and you would like to help me out, drop me a note.

I am trying to keep the form as unobtrusive as possible. At no point in time do I require people to put in their own personal information. I am not interested in knowing exactly who they are or exactly where they live. I want information on a need-to-know basis, and try to require only what is necessary to perform the functions of the system. People know their own phone numbers and addresses, and if they don’t, they can always make use the built-in note system to… uhh… make a note.

Screenshot 3.
This is the Open Rebates Summary that the user sees after they click “Open Rebates.” Please don’t mind the border on the table. Keep in mind, this is the development version, and as such the graphics are nowhere-near final. They are just whatever I whip together on the fly as I work.

There are three graphics on the screen. The notepad takes you to the summary page for the notes system. Clicking the stack of cash says, “Wohoo! I’ve got my rebate. Close this rebate out.” Likewise, the red stop sign says, “Man, this crappy company screwed me out of my rebate money. Close this rebate because I give up.”

If a user doesn’t close their rebate after a certain amount of time, it will automatically be marked as “failed.” I am not sure how much time should pass, though. My initial though was 120 days, but now I’m considering that a rebate is considered a loss and automatically closed when twice the expected period passes. For example, if the rebate form says your check will arrive in six to eight weeks, we would double the highest number, and automatically close your rebate as “failed” after sixteen weeks.

The user can, of course, reopen the rebate if they end up receiving it. When the nightly recount and rebuild occurs, however, it will be re-closed and failed.

Screenshot 4.
This is the Closed Rebate Summary screen, reached by clicking “Closed Rebates.” It provides a summary of rebates categorized as successful or failed. There is an icon that will take the user to the notebook page for that specific rebate, and the funky-looking red and green curvy-arrow-thing is the Reopen button– one click and the rebate is reopened.
Screenshot 5.
This is the Notebook summary page, accessed by clicking “Notebook” at the top. It provides a summary of notes on all open and active rebates in the system.

Clicking on the title row in the top table will take you to the detailed notes page for that specific rebate. Clicking on the title of the note, however, will bounce you down to the bottom of the page so you can read the note then and there without another pageload.

Notes are divided into four different categories: General, Email, Phone, and Mail. The idea is that you can mark each note with the subject matter. If you email the company and want to make a record of it, make an email note. If you called them, make a phone note. If you just want to record the secret phone number of the CEO of the company that you uncovered by digging through newsgroup archives, make a general note. If you resubmitted your rebate through the mail, make a mail note. I think you get the idea.

Screenshot 6.
This is the “Add Note” feature, reached by clicking the icon that corresponds to the type of note the user would like to create (this page is not function with live data, and hasn’t been shown). This feature currently works, although the note summary that it feeds the user is not live data, nor are the previous notes that are listed below. It will be working soon, though.

Adding a note is meant to be fast and easy, and they system is coming along nicely.

That’s all I have for now… stay tuned for more updates!

Rebate Center – My New Project

Well, I’ve got myself a new project. I am building a web application that helps people keep track of rebates they submit.

I originally started building this out of necessity– I send a lot of rebates, and have to maintain mass amounts of paperwork in order to keep them all straight. It got to be too much trouble, and I decided I needed a better way to track them.

Sure, I could setup a simple spreadsheet and keep track of them just fine, but that is not my style. I need to do it much bigger and much better than a simple little spreadsheet.

I need reminders. I need statistics. I need someone to take my hand and walk me through the process of completing my rebates. I need a webapp.

So, I started the coding on this yesterday. Let me give you a little bit of background on my coding and my coding skills.

I first started coding PHP in July of 2002 as we prepared for the launch of America’s Debate. I had several years worth of basic HTML experience, and PHP was a natural progression for me.

It started simple, with my first hack as simple as taking an IP address (from the online list), and making it a link to the Arin WhoIs search. It was really simple.

I eventually built my skills to the point where AD runs a heavily modified version of IPB. Granted, the core functionality remains the same, but the creature comforts we have at America’s Debate as a staff and as a membership blow the doors off many other web forums.

As Invision versions progressed, so did my PHP skills. I went from making simple hacks to making nearly full-blown webapps. One example of which I am most proud is the America’s Debate Resources Directory. That took me several months to develop, and, in my opinion, blows the doors off the Invison Top Site List.

The InvisionTSL is a good script (judging from a user experience, I haven’t seen the code), but it just isn’t meant for a directory. Sure, it can be used as one, but that is not the original intent of the developer. Why anyone would waste their time coding a top site list, I haven’t a clue. But they did, so I made my own.

The InvisionTSL also seems to be a bit bulky. It takes 7 queries to complete a pageload, quite a bit considering the base Invision Power Board index.php takes only 4 queries. My Resource Directory script doesn’t add a single query to the pageload– it’s all cached. And, even when extra queries are required, they are ultra-optimized (the best I can) and run very, very fast.

The next most proud accomplishment I have made is the API/CMS that we use at AD. I basically made my own API/CMS (Application Programming Interface/Content Management System) to get data out of the forum backend and into the website’s front end. It is a very robust script that takes very little overhead to run. Every detail of the non-forum pages at AD is run through a permission filter, and every page is custom-built for the user based on those permissions. It’s a pretty damn slick setup if you ask me.

So, my PHP abilities have greatly increased. From modifying a simple string of text into a link to development of a full-blown resource script and API/CMS, I would say I have learned a bit, and improved a great deal.

So now, The Rebate Center.

I haven’t decided what to name it yet, nor do I really have any good idead for the name. I have only been able to find one other site doing what I plan on doing, and they have a decent domain:

Fortunately for me, just having a decent domain doesn’t make you the best at what you do. Their software is horrible. Their design is infantile. Their site is obtrusive. Their motives are not clear. That is why their site seems to be failing.

I, on the other hand, have an Internet history. People know who I am because of AD, and if they don’t, they can easily find out. They know I’m not necessarily in it for the money, although I wouldn’t turn it down, either. They know that I’m not about to send SPAM to my users, nor am I going to sell their information to the highest bidder.

People know me from my blog (well, at least one or two do). They know I am just a regular person, not a corporation looking to score fast money on the backs of unsuspecting visitors. And they know I am “The Deal King.”

I think my service will be a bit more trustworthy and dependable than the other rebate tracking site.

So, without further delay, I present to you several screenshots of my development work in progress:

Rebate Center Home Add Rebate Open Rebates Closed Rebates

Feel free to post any questions or comments, domain name suggestions, or random thoughts. I am going to try to document my progress here in this post. :)

Edit Sep. 11, 2006: Too… Much… Spam…. Comments closed. Sorry.

New Google Products

Quench your thirst for knowledge.

At Google our mission is to organize the world’s information and make it useful and accessible to our users. But any piece of information’s usefulness derives, to a depressing degree, from the cognitive ability of the user who’s using it. That’s why we’re pleased to announce Google Gulp (BETA)™ with Auto-Drink™ (LIMITED RELEASE), a line of “smart drinks” designed to maximize your surfing efficiency by making you more intelligent, and less thirsty.

Google Gulp

Another, likely not made by Google….

Maximise your Comfort

Maximise your comfort and user experience with UnderGoos. Our staff aren’t shy, even Sergey’s been trying out both the mens and ladies ranges. Google has spotted a chance to bring our unique innovation to yet another underserved market.


Pope pope pope pope, Pope pope pope pope

Dead Pope Sketch

The cast:

John Cleese
Michael Palin

The sketch:

A customer enters a pet shop.

Mr. Praline: ‘Ello, I wish to register a complaint.

(The owner does not respond.)

Mr. Praline: ‘Ello, Miss?

Owner: What do you mean “miss”?

Mr. Praline: I’m sorry, I have a cold. I wish to make a complaint!

Owner: We’re closin’ for lunch.

Mr. Praline: Never mind that, my lad. I wish to complain about this pope that I purchased not half an hour ago from this very boutique.

Owner: Oh yes, the, uh, the Polish Grey…What’s,uh…What’s wrong with it?

Mr. Praline: I’ll tell you what’s wrong with it, my lad. ‘E’s dead, that’s what’s wrong with it!

Owner: No, no, ‘e’s uh,…he’s resting.

Mr. Praline: Look, matey, I know a dead pope when I see one, and I’m looking at one right now.

Owner: No no he’s not dead, he’s, he’s restin’! Remarkable pope, the Polish Grey, idn’it, ay? Beautiful Pallium!

Mr. Praline: The Pallium don’t enter into it. He’s stone dead.

Owner: Nononono, no, no! ‘E’s resting!

Mr. Praline: All right then, if he’s restin’, I’ll wake him up! (shouting at the pope) ‘Ello, Mister Popey Paul! I’ve got a lovely fresh communion wafer for you if you

(owner hits the pope)

Owner: There, he moved!

Mr. Praline: No, he didn’t, that was you hitting the cage!

Owner: I never!!

Mr. Praline: Yes, you did!

Owner: I never, never did anything…

Mr. Praline: (yelling and hitting the cage repeatedly) ‘ELLO POPEY!!!!! Testing! Testing! Testing! Testing! This is your nine o’clock alarm call!

(Takes pope out of the cage and thumps his head on the counter. Throws him up in the air and watches him plummet to the floor.)

Mr. Praline: Now that’s what I call a dead pope.

Owner: No, no…..No, ‘e’s stunned!

Mr. Praline: STUNNED?!?

Owner: Yeah! You stunned him, just as he was wakin’ up! Polish Greys stun easily, major.

Mr. Praline: Um…now look…now look, mate, I’ve definitely ‘ad enough of this. That pope is definitely deceased, and when I purchased him not ‘alf an hour
ago, you assured me that his total lack of movement was due to it bein’ tired and shagged out following a prolonged mass.

Owner: Well, he’s…he’s, ah…probably pining for the fjords.

Mr. Praline: PININ’ for the FJORDS?!?!?!? What kind of talk is that?, look, why did he fall flat on his back the moment I got ‘im home?

Owner: The Polish Grey prefers keepin’ on it’s back! Remarkable pope, id’nit, squire? Lovely Pallium!

Mr. Praline: Look, I took the liberty of examining that pope when I got it home, and I discovered the only reason that it had been sitting in the popemobile in the
first place was that it had been NAILED there.


Owner: Well, o’course he was nailed there! If I hadn’t nailed that pope down, he would have nuzzled up to those bars, bent ‘em apart with its godly strength, and
VOOM! Feeweeweewee!

Mr. Praline: “VOOM”?!? Mate, this pope wouldn’t “voom” if you put four million volts through it! ‘E’s bleedin’ demised!

Owner: No no! ‘E’s pining!

Mr. Praline: ‘E’s not pinin’! ‘E’s passed on! This pope is no more! He has ceased to be! ‘E’s expired and gone to meet ‘is maker! ‘E’s a stiff! Bereft of life, ‘e
rests in peace! If you hadn’t nailed ‘im to the popemobile ‘e’d be pushing up the daisies! ‘Is metabolic processes are now ‘istory! ‘E’s off the twig! ‘E’s kicked the
bucket, ‘e’s shuffled off ‘is mortal coil, run down the curtain and joined the bleedin’ choir invisibile!! THIS IS AN EX-POPE!!


Owner: Well, I’d better replace it, then. (he takes a quick peek behind the counter) Sorry squire, I’ve had a look ’round the back of the shop, and uh,
we’re right out of popes.

Mr. Praline: I see. I see, I get the picture.

Owner: I got a slug.


Mr. Praline: Pray, does it talk?

Owner: Nnnnot really.


Owner: N-no, I guess not. (gets ashamed, looks at his feet)

Mr. Praline: Well.


Owner: (quietly) D’you…. d’you want to come back to my place?

Mr. Praline: (looks around) Yeah, all right, sure.

/still going to hell