Saturday, April 11, 2009

Carriage Returns

Recently, I stumbled upon (literally) an article written by Chad W. L. Whitacre discussing a use for the infamously useless carriage return. Any programmer who has worked with direct input to/from file buffers has probably encountered a character that accompanies the newline character on some file systems. The usual sequence NTFS uses to terminate a line and move the internal pointer to the beginning of the next line is \n\r, where \n writes a null line terminator at the current position (effectively moving the pointer to the next line), and \r writes a carriage return.

If you stop to think about it, it makes sense. When you begin a new line, you want to make sure the internal pointer is writing to a fresh, blank line. So, first you move to the next line (via a newline character), then erase everything on the current line (via a carriage return). Beyond file input, Chad found that the carriage return could be used to erase data on the current line of a system buffer as well! In his article, he talks about using this technique in a TTY shell to make an updating progress bar. I thought I would take it a step further and see if it was implementable in a Java command line program. Sure enough, it works! The following is a basic program that uses a progress bar that updates as the program runs:

import java.io.*;

class progressbar
{
public static void main(String[] args)
{
System.out.println("Running a really long loop...");

// How many times the loop should run
int runcount = 500;

// Prepare the progress meter
System.out.print("[0/" + runcount + "]");

for (int i = 0; i < runcount; i++)
{
// Code that takes longer than a millisecond to execute goes here

// Update the progress meter
System.out.print("\r[" + (i+1) + "/" + runcount + "]");
}

System.out.println("\rdone!");
}
}


Now no one has an excuse to not have progress displays in their programs! :)

Monday, March 09, 2009

TF2 Oopsies

Lately, Ive been doing SourceMod plugin development for everything from infinite ammo/uber to new gameplay modes for use in BZG and other TF2 servers. This morning I was testing my newest gameplay plugin called Hot Potato. It was the first real vigorous test I had run with the plugin, and dramatically failed in flames of game crashes. I managed to capture a (laggy) piece of the carnage and post it on YouTube. Check it out. As the video description states, the plugin crashed at least four people, spawned 200+ entities within 10 seconds, and made 2244 function calls within 60 seconds.

I guess this serves as proof that pros are still prone to screw up. :p

Monday, February 16, 2009

The Brazen Guard

The Brazen Guard (BZG) is this awesome online community I have been a member of since May 25, 2008. Currently, we operate two Team Fortress 2 servers and one Gmod server. We play strictly noncompetitive, although we do have a small group dedicated to clanwars and scrimmages.

Around January 24, 2009, I was given RCON administrative access and a place in the leadership of the clan. Since then, BZG has undergone some great changes thanks to a revitalization of the community. Something we do regularly is hold these things we call Event Nights. Every Friday and Saturday, we lock one of our TF2 servers and only allow BZG members in. Then, we play the game using our own little minigame ideas. Its absolutely insanely fun. Everyone has a great time and the brotherly bond we all share becomes stronger.

The whole purpose to this post is to inform everyone about BZGs own Youtube channel, The BZG Authority, where I will be posting video highlights of our scrimmages, Event Nights, and other madness. You can find more information about the servers and the clan at http://www.clantoolz.com/brazenguard. We are by no means an exclusive community, but if you would like to join, you have to play with us on our servers a couple times so we can be sure youre serious about becoming part of the family.

Anyone who has TF2 or Gmod, come on and play with us! Otherwise, enjoy the videos and be sure to rate/comment!

Wednesday, January 07, 2009

We're Back!

BlakeNet is back online. This year marks the chance for a lot of new stuff on BlakeNet. The largest news is that I plan to start seeking sponsorship and analyzing development costs to upgrade the server, get some video equipment, and turn BlakeNet into the comedy video site it was invisioned to be. Dont expect to see these changes happen over night, but if all goes well, we might have an awesome new project on our hands! :)

Tuesday, December 23, 2008

BlakeNet Down

BlakeNet will be down for a while. Our new computer just came in, which caused me to have to move equipment around and use the wireless device used to connect my server to make our second computer able to communicate wirelessly. Once I get back from Christmas vacation, I will start looking for a new wireless card so that I can get my equipment back online.

Merry Christmas. :]

Monday, December 22, 2008

Switching To Linux

So, I got fed up with Vista recently. Well, if you know me, you know I have always hated Windows. Unfortunately, it often appears to be a necessity for certain situations. Gaming, MSN, school, hobbies, etc. However, as any seasoned Linux user would tell you, these lines of difference are becoming thinner and thinner all the time.

I have been using Ubuntu for BlakeNet ever since its conception, and I am no stranger to the environment. But, personally, Id just hate to convert my Vista laptop to Ubuntu and then not be able to do everything, and I mean EVERYTHING, that I used to be able to do. My plan of action? Well, I got annoyed at Vistas auto-backup mechanism, so I turned it off a while back and set up backups to my server. The 10 gig backup partition on my laptop has since been lonely without any data to store. I have decided to finally put it to good use. While I wont be uninstalling Vista due to the eminent possibility of headache, I will be installing Ubuntu on the backup partition, putting some apps on it, and using it as often as I can.

My setup will consist of Ubuntu Intrepid Ibex with Compiz (I looooove the shiny 3D cube desktop thingy!) and some apps to take the place of my Vista ones. Im not going to list off Vista programs and their Linux counter-parts. There are enough of those sorts of lists on the Internet, including the official one. My biggest questions were "will my games run?" and "will all of my favorite MSN features be available in the replacement messenger?" The first answer is, of course, yes with the help of the Windows emulation layer called Wine. But, I was worried about performance hits. From what Ive heard, the experience can differ, but most people say the performance is surprisingly similar (if not better!). I will have to update when the transfer is complete. The second question is due to my previous experience with Pidgin, the Linux Swiss-Army messenger that allows you to communicate on multiple protocols including MSN, ICQ, Yahoo, AIM, and more. Once, I had logged into MSN using it and found that it was an incredibly dry messenger with most of the features that made me fall in love with MSN gone. After doing some Googling, though, I found out that there are plugins that add those features back, including Messenger Plus! features! Needless to say, I was sold. I will be setting up for the next couple days, and will post my experience after its all done.

Friday, November 28, 2008

Update: Random Staffer

Hey, peeps! I hope everyone had a good Gobble-Gobble-fest yesterday! Anyways, on to business.

Random Staffer is coming along nicely. However, I ran into something I really didnt like yesterday. In order to handle events on a form element (say, a button or menu item click), you need to use an ActionListener. There are two ways to do this effectively. The first, and seemingly most popular, method is to declare your class as extending the ActionListener class. This means you can point to this class as your listener, then add the ActionPerformed method to your class definition. This presents an issue of redundancy. For example, if you have some buttons and your class set up in the above fashion, you would need to add the action to take when the buttons are clicked separate from the button instantiations and set-up. This creates a readability nightmare, where if you want to know what happens when you click Button1, you would have to track it down in the ActionPerformed method further in the code.

The second method is to take advantage of Java's ability to change non-static method definitions at run-time. This means you can create a new instance of an ActonListener, and set the ActionPerformed method for that specific instance. This is great because you have resolved the redundancy and readability issues by including everything for the respective button in as little as two lines. However, this comes with the price of a new class file being generated for each time you do this, quickly changing a two-file project into a 20-file project. This happens because Java needs to create a completely new definition of the ActionListener class since the original has been changed.

Apparently, the desired effect is to have low-to-no redundancy, while eliminating the need for multiple class files. My proposal was to take advantage of Java's Class and Method classes. These provide your program with the ability to take in references to methods in other classes and call them dynamically. The problem I didnt forsee was that this only works on public and protected methods, which means every method that needs to be called when a button is pressed now has the potential to be called from the dangerous outside world. So, now its back to the drawing board.

Friday, October 17, 2008

BlakeNet Status Update

The BlakeNet status to the right has been updated to fix the loadtime and caching issues. JavaScript is required to see the active status.

Thursday, October 16, 2008

Random Staffer Reopened

The old bane of my existence has been sitting on my todo list for a while now. The other day, I felt the urge to do something productive. Whats more productive than sleeping all day, you ask? Working on Random Staffer. As anyone who is a follower of my work knows, this program was a thorn in my side from day 1. It was originally built in Visual Basic .NET and the printing aspect was handled by Java. I decided this time around, I would rewrite the whole thing from the ground up completely in Java. Expect milestones to be posted as I go, along with maybe some source code and working pre-releases/finals. No ETC as of yet.

Wednesday, October 15, 2008

Battle Poverty One Webpage At A Time

As a part of Blog Action Day 08, Im going to discuss how you can fight poverty. Since this blog more or less targets web designers, I figure Ill list some sites that offer buttons, badges, banners, and the like that when clicked or bought send money to charitable organizations.

MakeHope Button Store - The official button of Blog Action Day 08. Buy one for your site, and youll be aiding the movement.
Make Poverty History - A collection of free banners for your site.
Poverty USA - In case your visitors live under a rock, add these banners to spread the word.
End Child Poverty - In the words of the now defunct BannersAgainstPoverty, "Be the change you wish to see."

These are just four of the most popular sites. There are countless others to choose from.

Web designers, today we are called upon to do our part in the eradication of this world-wide pandemic. With the economies toppling, prices skyrocketing, and unemployment rates at all-time highs, it is up to each and every one of us to do the right thing. We owe it to not only those afflicted by poverty, but also ourselves, as human beings, to do all that we can to improve the quality of life for everyone -- A world for the people, by the people, for everyone's benefit.