Player/Stage, MacPorts, and iPhone

Today I worked on setting up Player/Stage on my Macbook Pro with Leopard 10.5.6 and I ran into a few issues. I was using Macports 1.710 and I was attempting to install player-stage-player (2.03 2.1.2) and player-stage-stage (2.03 2.1.1) following a short guide at http://bentham.k2.t.u-tokyo.ac.jp/notebook/?p=247

If it's your first time using macports it can take a long time. I waited 2+ hours to download/build/install dependencies

I used the command:

$ sudo port install playerstage-player playerstage-stage

However it errored out at the end with the message:

$ sudo port install playerstage-player playerstage-stage
--->  Building playerstage-player
Error: Target org.macports.build returned: shell command " cd "/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_science_playerstage-player/work/player-2.0.4" && make all " returned error 2
Command output: building '_playerc' extension
swigging playerc.i to playerc_wrap.c
swig -python -o playerc_wrap.c playerc.i
playerc.i:44: Warning(124): Specifying the language name in %typemap is deprecated - use #ifdef SWIG instead.
playerc.i:82: Warning(124): Specifying the language name in %typemap is deprecated - use #ifdef SWIG instead.
playerc.i:121: Warning(124): Specifying the language name in %typemap is deprecated - use #ifdef SWIG instead.
playerc.i:127: Warning(124): Specifying the language name in %typemap is deprecated - use #ifdef SWIG instead.
gcc -fno-strict-aliasing -Wno-long-double -no-cpp-precomp -mno-fused-madd -fno-common -dynamic -DNDEBUG -g -Os -Wall -Wstrict-prototypes -DMACOSX -I/usr/include/ffi -DENABLE_DTRACE -arch i386 -arch ppc -pipe -I./../.. -I../../../.. -I/System/Library/Frameworks/Python.framework/Versions/2.5/include/python2.5 -c playerc_wrap.c -o build/temp.macosx-10.5-i386-2.5/playerc_wrap.o
playerc_wrap.c: In function '_wrap_playerc_mclient_client_set':
playerc_wrap.c:40301: warning: assignment from incompatible pointer type
playerc_wrap.c: In function '_wrap_playerc_mclient_addclient':
playerc_wrap.c:40504: warning: passing argument 2 of 'playerc_mclient_addclient' from incompatible pointer type
playerc_wrap.c: In function '_wrap_playerc_mclient_client_set':
playerc_wrap.c:40301: warning: assignment from incompatible pointer type
playerc_wrap.c: In function '_wrap_playerc_mclient_addclient':
playerc_wrap.c:40504: warning: passing argument 2 of 'playerc_mclient_addclient' from incompatible pointer type
gcc -Wl,-F. -bundle -undefined dynamic_lookup -arch i386 -arch ppc build/temp.macosx-10.5-i386-2.5/playerc_wrap.o -L./../../.libs -L../../../../libplayerxdr/.libs -L../../../../libplayercore/.libs -L../../../../libplayerjpeg/.libs -lplayerxdr -lplayerc -lplayerjpeg -ljpeg -lplayererror -o build/lib.macosx-10.5-i386-2.5/_playerc.so
ld: library not found for -ljpeg
collect2: ld returned 1 exit status
ld: library not found for -ljpeg
collect2: ld returned 1 exit status
lipo: can't open input file: /var/tmp//ccI9TvVp.out
(No such file or directory)
error: command 'gcc' failed with exit status 1
make[6]: *** [pythonbuild] Error 1
make[5]: *** [all] Error 2
make[4]: *** [all-recursive] Error 1
make[3]: *** [all-recursive] Error 1
make[2]: *** [all-recursive] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

Error: Status 1 encountered during processing.

[ad# Link Banner]

So I searched around the MacPorts website and I came across the ticket #18891, which basically said to run the following command to change the version of python being used from 3.0 to 2.5.

$ sudo port install python_select && sudo python_select python25
Skipping org.macports.activate (python_select +darwin_9) since this
port is already active
--->  Cleaning python_select
Selecting version "python25" for python

Following that command I was able to finish installing Player/Stage via MacPorts by using the orginal port command.

$ sudo port install playerstage-player playerstage-stage
--->  Building playerstage-player
--->  Staging playerstage-player into destroot
--->  Installing playerstage-player @2.0.4_2
--->  Activating playerstage-player @2.0.4_2
--->  Cleaning playerstage-player
--->  Fetching playerstage-stage
--->  Attempting to fetch stage-2.0.3.tar.bz2 from
http://voxel.dl.sourceforge.net/playerstage
--->  Verifying checksum(s) for playerstage-stage
--->  Extracting playerstage-stage
--->  Configuring playerstage-stage
--->  Building playerstage-stage
--->  Staging playerstage-stage into destroot
--->  Installing playerstage-stage @2.0.3_0
--->  Activating playerstage-stage @2.0.3_0
--->  Cleaning playerstage-stage

I tried to use player stage from MacPorts.

$ player /opt/local/var/macports/software/playerstage-stage\
/*/opt/local/share/stage/worlds/simple.cfg

And I received the error:

rr: unable to open color database /usr/X11R6/lib/X11/rgb.txt
 : No such file or directory (stage.c stg_lookup_color)

Following the advice from http://bentham.k2.t.u-tokyo.ac.jp/notebook/?cat=5 I added the following link.

$ sudo ln -s /usr/X11/share/X11/rgb.txt /usr/X11R6/lib/X11/rgb.txt

Now I am able to create a player server and connect with a client with the commands:

$ player /opt/local/var/macports/software/playerstage-stage\
/*/opt/local/share/stage/worlds/simple.cfg

/opt/local/var/macports/software/playerstage-player\
/*/opt/local/share/player/examples/libplayerc++/laserobstacleavoid

With the ability to run player/stage I will post again on my progress as I use an iPhone to run the Player client, rather than my Macbook Pro.

[caption id="attachment_209" align="alignleft" width="443" caption="Player client running on iPhone with Player/Stage."]Player client running on iPhone with Player/Stage.[/caption]

[ad#Large Box]

Sorting Object Pointers in C++

Today I was working on my computer animation project using C++, Boost, STL, and OpenGL. I ran into a few hitches related to pointers and the STL (Standard Template Library) and I decided to blog about it. Problem: You can't override the default operator<  for the pointer type, so you have to make a class/structure that defines an operator() function, which is the function pointer. Any attempt to create a operator< (const Frame *lhs, const Frame *rhs) will be ignored. You might find yourself wondering why objects are being sorted by memory address (pointer address), rather than your defined method. Here's an excerpt from my code. (Thanks to CopySourceAsHTML)

// Frame.h

/** A compare class used for Frame pointers.*/

class FrameComparer {

public:

bool operator() ( const Frame *lhs, const Frame *rhs) {

return (*lhs).getTime() < (*rhs).getTime();

}

};

...

//FrameViewer.cpp

/** Adds frames to be viewed at a later time */

void FrameViewer::addFrames(std::vector<Frame *> frames) {

// Append the new frames to current frames

_frames.insert(_frames.end(), frames.begin(), frames.end());

// Sort

std::sort(_frames.begin(), _frames.end(), FrameComparer());

}

Summary:

I had a STL vector full of pointer objects, but the only way I was comparing was by pointer address until I created the FrameComparer class. With the class and an compare object defined I'm able to override the sort methods comparison behavior. This way will correctly sort the Frame objects by time value, rather than pointer address.

References:

Function pointers

[ad#Large Box]

XNA 3.0 Content Pipeline

I spent all day researching the XNA Content Pipeline in XNA 3.0. The MSDN documentation is a little sparse/dense on how things work together; so I pulled together some resources that I found helpful when trying to understand it.

There's 4 main components in the Content Pipeline: Importers, Processors, Writers, and Readers. Read the 2nd point to understand how they work together or go through the tutorial in my 1st point to get your hands dirty. The 3rd point is another tutorial to help you understand creating a new game asset from start to finish.

1. Nick Gravelyn wrote a brief tutorial on using XML to describe content. (Update: 11/9/10 Nick's links don't work) It uses the default Content Processor and Importer from XNA for XML and then it creates custom Readers and Writers.

I followed along and got stuck on the project Reference part. There are two sets of references, one for the code and the other for the Content sub-folder in an XNA project. I didn't realize it until I looked very closely at my project. Since I overlooked the Content references I got the following error while trying to build the CrateSprite XML asset.

Building CrateSprite.xml -> C:\Documents and Settings\Paul Solt\My Documents\Visual Studio 2008\Projects\XMLProject\XMLProject\bin\x86\Release\Content\CrateSprite.xnb Content\CrateSprite.xml(3,10): error : There was an error while deserializing intermediate XML. Cannot find type "XmlContentSampleShared.Sprite".

[ad#Large Box]

The problem is that the reference to the SpriteContentWriter.cs and the Sprite.cs classes are missing (They are in separate projects). To fix it all you need to do is to include the project containing the Writer, which has a reference to the shared project containing the Sprite class. My Content build process just didn't know how to process the CrateSprite.xml file. Here's a picture of the projects and the highlighted references (Right click and add Reference -> Projects).

[caption id="attachment_67" align="aligncenter" width="494" caption="Visual Studio 2008"]Visual Studio 2008[/caption]

2. Shawn Hargreaves also recently posted about the basics of the Content Pipeline here. He pulls apart the different steps involved so that you can understand the entire content pipeline using colors. (Shawn Hargreaves is the expert on XNA)

[ad#Link Banner]

He describes why the Content Readers and Writers are separated. Writers help create the .xnb (XNA Binary) format, while readers read in the compiled .xnb format that is packaged with an XNA game. A distributed game doesn't need the Content Writers, so you can separate that functionality into a separate project, while keeping the Content Readers associated with the Game project that gets distributed.

3. Another tutorial I looked into is from Ziggy. He creates a custom game asset (bounding box) and the associated Content Processor, Importer, Reader, and Writer. This tutorial helps drill in the fact that you're creating new content and having XNA interpret it and build it into an asset that your game can load. Very powerful stuff.

I incountered a few differences in the tutorial, since it was written using XNA 1.0, but overall you shouldn't have too many issues following it. (There is a converted XNA 2.0 project for the tutorial if you get stuck)

Update: Here's another useful blog post from Eli Tayrien with a collection of links for the XNA Content Pipeline.

[ad#Large Box]

Gears of War 2 != 9/10

I recently acquired Gears of War 2 as an early Christmas present and had the opportunity to play it in cooperative mode with my roommate. It didn't quite live up to my expectations and it failed to fix some of the game play mechanics that I hated from the first Gears of War (GOW) game. I'm not sure how it was given a 9/10 on Gamespot.com's website, but I certainly do not agree with them. Here's my breakdown on the single player/coop experience.

Gameplay: 6/10

The game play works well for "paintball" style combat. The combat is the most enjoyable part of the game.

However in tight corners it breaks down and can be very confusing and hard to manage. Most of the time I found my character diving for cover on the wall when I wanted to run away, because the control scheme uses only the "A" button for running and crouching/covering. This lack of control in close combat lead to a lot of deaths that could have been avoided. GOW relies on cover as game play mechanic, but once your in close quarters there's no solid game play mechanic other than the glorified chainsaw. (Which makes you invincible for the animation sequence) The camera moves around a lot and it can be very hard to focus on an enemy. (-1)

[ad#Large Box]

It's nice to have the game scripted, but it doesn't provide enough "quick escapes." I repeatedly fought the same boss monsters over and over and each time we had to watch the same scripted sequence. I couldn't pass through it and had to listen and watch the same dialog time after time. This "scriptedness" is one of my pet peeves in video games. There always should be a quick way out of any dramatic sequence to get back into the game. To help explain I'll provide an example. My roommate and I spent 2+ hours trying to defeat a water monster. The only way to kill it was to "kill it from the inside," which involved throwing a grenade into it's secondary mouth while you were standing in the first mouth (There was a theme of killing things from the inside throughout the game). Killing the monster was similar to shooting a proton torpedo into the Death Star, but you don't have as much control and the mouth moves side to side. (-2)

The other problem that plague the game are the vehicle levels, where you have to shoot things and try to stay alive. I didn't like them in the first game and they're not any better in the new one. As the player I feel very removed from the vehicle and I have to fight the game mechanics/level to do what I want. There's no cover system or any tactical aspect to the vehicle levels other than kill or be killed. (Give me a warthog from Halo) (-1)

My biggest beef with the GOW series is that they take mechanics that are used in other games (e.g. driving) and try to incorporate them into their game. The concept is cool, but when it comes to implementation they don't have it nailed down. I would rather have development time spent on improving the tactical combat system, than to introduce new gameplay concepts that aren't as well rounded.

Graphics: 7/10

I want to give it a 10, but there were a bunch of things that really bothered me.

1. The tank engine flame is the worst flame I've ever seen. (Impulse's flames look better) They did not fit the style or the quality of the GOW2 textures/animations. (-1)

2. On the rig/truck level when I was pushed off the side by flying reavers, I saw trees and foliage that looked out of place. (Don't show low resolution textures/low polygon models when everything else in the game is gorgeous) The game camera should never look at it up close, it's background art. It's like a red apple in an green apple basket. You're eyes will just become attracted to it because it looks different and it'll ruin the moment. (-1)

3. There is noticeable lag on loading textures, bump-mapping, and all the other texture goodies. Don't show the rendered scene if it's not ready yet. That's why loading screens are used. Though I do give them props for making the load transition less abrupt and more pleasing on the eye.

4. There is an ABUSE of blur effects to provide depth of field and "realistic" gases. At one point we were in the intestines, (inside another monster) and the entire screen is blurred beyond recognition. I couldn't make anything out and it actually made both of us nauseous because our eyes couldn't focus on the screen. Blur != Fog/Gas. When used right it can make a scene pretty, because it can help hide low detail and exagerate fast moving objects (race car game). (-1)

[ad#Link Banner]

Music/Sound: 9/10

There's a lot of great music and sound effects. Compared to some of Halo's epic soundtracks, GOW2 has a lot of room for improvement

Controls: 5/10

Sometimes the controls are nice, but most of the time they are very difficult to use. I feel like I'm indirectly controlling my character and I have to fight the level to do what I want. It's not fluid, and it's not nearly as precise as Halo's movement controls. The controls feel dumbed down just to make the game more difficult to play.

1. When aiming I found myself overcompensating around an enemies head/body. It just doesn't have the sensitivity that I can get in Halo, or in any PC shooter. (-2)

2. The other big issue I had was changing weapons using the directional pad. Most of the time it wouldn't change. A directional pad is not a good input device to switch weapons (use real buttons). The pad would normally get caught on the wrong weapon even when I was pointing in the weapon's "direction." Feels like bad code. (-2)

3. The menus are difficult to use when I tried to get my roommate into the game. I really give Bungie props for doing it right with Halo. Halo is much more user friendly when you try to do things, such as adding a teammate to the game. (-1)

Story: 5/10

Too much hype on a story for the first game, and then nothing improved with the second game. I swear I could tell a better story than the people making this game. From the start of either game I don't feel like I accomplished anything. The COG's (good guys) aren't any better off by the end; so what's the point? All the objectives were dumb and just jumped around. I don't know how to describe it, but it just feels fundamentally flawed. It's a two/four man army taking on the world. (But then so was Halo...) A story should be something that I can try to believe, not something I'm just forced into.

The only character I enjoyed was Cole, aka the Cole Train. He's got real personality and it doesn't feel fake.

Overall (Not including multiplayer): 6.4/10

While at parts the game was enjoyable, it was filled with far too many frustrating areas to give it anything higher. I wanted too love the game, but a combination of poor controls, abused game play mechanics, and a weak story left it in the dirt.

Horde Mode: 8/10 One semi-redeeming feature was the ability to play "Horde," which lets you fight onslaughts of enemies using the combat system. Its one of the features I really wanted back with the original game since it focuses on the combat system. Horde glorifies that aspect and really helps you enjoy the game.

It's downsides are that enemies spawn randomly, rather than appearing from grubholes. And it can get frustratingly hard as you go up in levels with only two people. Close quarters combat becomes almost sudden death.

Last thought:

I don't heavily recommend buying the game. You're better off borrowing it from a friend, since it's not worth $60.

[ad#Large Box]

Macbook Pro + Windows + Dual Monitors = Painful

I didn't think it would be so hard to just get my taskbar and icons on a second monitor using Windows on my Macbook Pro. It doesn't seem like a whole lot of people run Windows on the Mac, so there isn't a whole lot of resources if you get stuck. It takes a lot of digging to find the real answers. Turns out the display drivers from NVIDIA/Apple for Windows don't support making an external monitor as a primary monitor. It only gives the option of making the laptop display primary. This limitation is very painful and kept me up for hours/days searching for registry hacks, hacked drivers, and more. Here's what I found that didn't work and what did:

Registry hack: Fail = True;

The Apple nVidia driver INF file is missing 2 registry entries for using external display as primary in a dual display setup. The keys you need are:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video{C0FF928A-9E27-40AE-845F-E0D8A8E03216}\0000 "DualViewAllow2ndViewAsPrimary"=dword:00000001 "DualViewMobile"=dword:00000002

Do not import these lines directly. Do them manually via REGEDIT. The hardware ID (C0FF928A-9E27-40AE-845F-E0D8A8E03216) is different in every system, so put the keys in the correct video hardware key in your system.

[ad#Large Box]

Turns out Windows didn't like the registry hack and I couldn't get anything up on the display, even though I was able to get the primary display option on my external monitor with the hack. I also had to guess which hardware ID to use, since there were 5 hardware key options. I tried the logical one with a lot of registry entries for display modes/settings under the 0000 folder.

Updated Supported Drivers: Fail = True; Again I began searching for something else, but there's not a whole lot of information on this topic. I contemplated installing a different set of drivers for Windows, but the one I found referenced from Apples discussion page was older than the current driver I have now. There was a recent update for Boot Camp to 2.1 this summer which looks like it included new NVIDIA drivers.

Updated Un-supported Drivers: Fail = True; Not having a real solution from Apple I looked into the drivers from http://www.laptopvideo2go.com/ however I found a few posts that said it didn't help or wasn't performing as well. I'm doing game development (XNA) on my laptop and I don't want to ruin a working system or introduce incompatibilities; so stability is very important for me at the moment. I decided to try and avoid non-standard drivers and look for another alternative.

nView Desktop Manager: Success = True; nView Desktop Manager Here is the solution that I had been looking for; it was something I found last year, but forgot about since I didn't have dual monitors. To enable it you'll need to go to 'Control Panel' -> 'NVIDIA nView Desktop Manager' -> click 'Enable'. Now you should see the nView Properties option when you right click on your desktop and you've just opened a whole can of worms for customizing your desktop.

[ad#Link Banner]

  • You can move your Taskbar/icons to your second display by the 'Tools' tab and 'Move to Display' button.
  • Set multiple desktop backgrounds using the 'Desktops' tab and the Properties button. There's a check box to 'Allow different backgrounds per display'
  • Hotkeys to perform various tasks related to windows management
  • Profiles to save/load settings when switching between a dual monitor/single display setup.
  • Transparency effects on window drags and more...

Edit: As much as I'd like this solution to work all the time; it still has bugs. Dialogs on different applications appear on the laptop display and the software can sometimes be glitchy for the development work I'm doing. WinForms development with Visual Studio 2005 Express seems to bug it out the most and causes Icons to flicker. I'm not sure if that flicker is because of the dual monitor setup or from WinForm editing in VS 2005.

[ad#Large Box]

PAX 10

Wow. I just got back from the PAX 10 competition sponsored by Penny Arcade (penny-arcade.com). It's a competition for the top 10 games developed by independent game developers. I worked on Impulse with a group of students from RIT and my brother. It's a physics based game around movement. You use magnetism and impulse forces to get around the level. It was a 10 week project, so it's still missing some of the game elements to make it into a full game, but it's a great prototype.

We're now working on it to get it to a point where it will be able to be distributed.

For the game I worked on the particle effects to give the player a sense of what's happening and to make it look pretty. I'm looking to revamp the system now that I have time to design and structure it for more complex, yet pretty effects. I'm also working on a level editor to make level creation a whole lot less painful.

Life Changing Event

My life has changed thanks to Joe. Suddenly my tab key is more useful on my Macbook. I can now tab through my dialog option buttons. There's an obscure setting in the System Preferences > Keyboard and Mouse > Keyboard Shortcuts > Full Keyboard Access (set to All Controls). Or you can press ctrl-F7.

This makes so many things much easier to do with out having to constantly use the mouse to move to a button and click.

Love it!

A Goal, Yet So Much More.

What would you do if you had a goal that you could almost reach, but not quite. It's something that sits in front of you like a carrot on a stick. What steps would you take to reach it and how committed are you till the end?

This one goal has been a dream of mine, but I haven't achieved it; I'm just not strong enough. Since my freshmen year of college I've worked at it, yet never succeeded.

Now you might be wondering what that goal is, and I'll tell you. There are some things that I have a passion for in life, and it's goals like this one that really drive me. I can't explain it entirely, but I set my sights on it and I really give it my all. It's this same mentality that I want to carry into other areas in my life. And I do, but it's something I need to actively work at.

Brilliant people inspire me to set goals and to reach them. Recently I've adopted Steve Wozniak as my first hero. I really didn't know anything about him at the beginning of the quarter beyond being involved with Apple. I've never really had a hero or anyone that I really looked up to in life. After seeing him talk and reading his book, iWoz, I'm compelled to push myself. It's just amazing to get inside his head to see what he was thinking. He had the drive and the skills to go places. I want to be like him, while still being Paul Solt.

RIT's a challenging place and I've learned a lot. I've learned about leadership, time management, fitness, and communication. I've had amazing opportunities and I've had the chance to meet some very intelligent people. What I do with these skills and the connections will take me places; maybe some day I'll be able to inspire others like Steve Wozniak has done for me. It's important to give back to others, that's why I do a lot of what I do. I help people program computers, lift weights, fix things, cook, and the list goes on. It just comes natural. I have talent and I try to share it with the people I care about.

My problem is that it's sometimes hard to see where I'm going when I'm so busy at RIT. It really takes the end of the quarter to give me a shock and actually think about something bigger than projects and tests. Why am I doing what I'm doing? The reason is simple. I do it because I enjoy it. By becoming a better person and by striving for excellence I leave a path behind me. I'm not sure how pronounced that path is, but I know it has effected some people along the way. By making a difference in other peoples lives I reach goals that I didn't know I had.

When it comes down to the wire, whether it's academics or just a goal. I know I'll reach it and that's why I push myself. To do the impossible and to succeed makes the impossible possible. There wouldn't have been a Mission Impossible II if Ethan Hunt had failed. While I'm not ready for everything that's thrown at me, I'm ready to get ready. To push my limits and overcome barriers.

My goal is simple, yet so hard. 100 push-ups in 2 minutes. You might ask yourself "that's it?" And to that I'd reply "yes." It's been 4 years and I still haven't been able to do it. It's a commitment that many people aren't willing to make. It takes time, it takes discipline, and most importantly it takes motivation.

This brings back a memory from freshmen year when I was considering the Marines. After PT on a Saturday morning, the Sergeant talked to me in his office. He brought out cards with words on them like "Money", "Education", "Leadership", "Fitness", "Honor", "Courage", "Commitment", and many others. He asked me to pick out a few words and to tell him why they were important to me and how they would affect me in the Marines. At the time I wasn't quite sure, so I picked out a few and talked about them. I feel like I had to lie about my reasons. There was a drive I had that couldn't be expressed with these keywords and I felt like I didn't fit in. He told me that the Marines would allow me to accomplish those keywords, yet I've done that and more at RIT.

Maybe it's deeper than just reaching a goal, because once you get to the goal it's over. I might reach the goal this month, or I might reach it next year. I'm driving to reach it and it's the drive that is what I'm looking for. Picking a goal sets the mentality and it's something I need to do more often. It's a physical drive, but it's also a mental drive. I'm at 80 right now and it's a new quarter. I'm ready to learn new things and to do things that I've never done before.

Form. Not Weight.

So it might surprise you that I enjoy going to the gym to lift weights. It's a little "hobby" of mine ever since playing JV Lacrosse in high school. I'm not sure what clicked, but ever since lacrosse I've never been the same with my physical fitness. I really enjoyed pushing myself to the limit. Now I don't consider myself a complete expert, but I really hate it when I see people doing things with weights that they shouldn't be doing. So many times I see people using more weight than they can handle and it just bothers me. I want to tell them they're doing it wrong, but there's just so many people and I don't want to rub them the wrong way.

1. I didn't start with the biggest weights, I worked my way up to them. It's the same for anybody; you take baby steps towards the heavier weights. Arnold didn't get big right away, it took a lot of hard work. I think that's the fact that many people fail to understand. Many people think that doing a lot of weight will make them get bigger or stronger, but they fail to do the exercise properly. It's not easy to get big and it does take time, but if you're dedicated and you do it right you will see results. I promise.

2. Get someone to go with you who has a clue at what they're doing. It's important to have good form on a lot of free weight exercises or you can pull a muscle or tear something that's not meant to be torn. I see so many people throwing their bodies around to get that last rep with weight that even I'm not comfortable lifting with good form. Slow and smooth movements are will give you better results and your at a lower risk of hurting yourself.

3. It's a common misconception that you need to feel sore after a workout for it to be good. You don't have to tear every fiber in your muscles to increase strength or endurance. So don't kill yourself out there with boat loads of weight. As you continue to exercise it's normal to not feel the soreness as much as when you first started.

4. Stay away from the protein and dietary supplements. They're not worth the risks and they really don't have benefits. I've done quite a bit of research in this area and my mother is a nutritionist. Stick to a healthy diet that follows the food pyramid and you'll have more than enough protein in your body. My Pyramid You only need 0.8 grams of protein per pound if you're a normal person, or up to 1.2 grams per pound if you're very athletic. So that's a range of 50-120 grams if your a male at 155 pounds. Your body doesn't process more than that. And just because something says it's herbal or natural doesn't mean it's good for you. Since when does being natural equate to being good? Poison from a spider is natural, yet it will kill you if you decide to take it as a dietary supplement.

5. Don't go exercising every day, your body needs rest. Make sure you take time to let your body recover between work outs. You're not going to get bigger if you keep tearing all the muscle in your body every day of the week. So take at least 2 days off a week at a minimum.

6. There is no such thing as spot fat reduction. You can do all the ab workouts in the world, but that's not going to give you the abs you want if you have some fat on your stomach. You need to do cardio exercise to reduce your bodies fat if you want to see anything.

7. Try push ups. They're one of the best exercises that only require about 6 feet of floor space and they're easy to do.

8. If you start something stick with it, you'll feel a lot better about yourself. Trust me, I do!

Hopefully that'll send you in the right direction. Everyone needs to be active; even the computer programmers.

Cell Phones are a Disappointment

Cell phones continue to disappoint me. I've had my Verizon Wireless cell phone for the past two years. It's been alright and I was excited to upgrade to something smaller, slimmer, and faster, yet I found myself wanting more. Why do I get so little out of the phone and the phone service? A few weeks ago I received my new phone the KRZR after doing a bit of research and reading some positive reviews. It looked nice and it was much slimmer than my Motorola E815, but it lacked so many of the features that I had expected. Maybe my term features isn't the best way to describe it. My biggest disappointment is the user interface and the way I interact with the phone; I consider the interface to be the single most important feature to any phone.

However, no phone has on the box: easy to use or great interface, because it's not something they use to sell the phone. Instead what's used to sell the phone are technology sound bits like "blue-tooth", "1.3 Mega pixel Camera", etc. I'm not sure where the problem lies, but I'm starting to think that it's Verizon which is ruining my phone experience. The new interface that they've developed for the KRZR and just about every other new Verizon phone I've seen is terrible. I feel like I've taken 10 steps backwards from my old phone. I'm going to list my complaints and discuss them below:

1. All I see is red. Why do I have to look at the red bars on the top and bottom of every screen? I should be able to remove them or to change them, yet I can't find any such option. These bars help create an ugly interface.

2. "Ok". So that's about the only option I get on almost every menu screen. What happened to "Back", "Cancel", "Yes", "No", or "Menu"? "Ok" doesn't answer every question that I have when I'm using the phones numerous options, many options are just assumed to be known to the user which is a terrible design. You literally have to play guess and check to see what a button does. I even went as far as reading some of the manual to find options, but I found that these were not discussed (Yes I do read manuals).

3. There is no ability to silence the phone when the flip cover is closed. The side buttons that Motorola provides are completely useless. Woah. I'm sorry but the lack of such a feature is a huge hit to the phone. I'm on the go all the time between different meetings, classes, and presentations. I need a phone that allows me to quickly change the sound options. And what happen to my option to vibrate and then ring?

4. Themes aren't themes, they're color gradients in the menus. I was able to change the way the buttons and menus looked on my old phone, but the new phone provided no such option. Hire a graphic designer to create a set of buttons and menus to make a phone visually pleasing.

5. Backup Assistant? While the concept is a great idea, it really misses the mark. I have all my contacts in groups on my old phone and when I went to move them over everyone landed in one huge group. That's not very helpful and now I have to go back in and regroup everyone. I have over 217 contacts, that's not something that can be done in 30 seconds. When I went back to my old phone (Switched the ESM associated with my Verizon account) Backup Assistant can't sync up anymore. Apparently it wasn't robust enough to handle situations in which a user switches to a new phone, adds a contact, switches back to a previous phone, adds more contacts, and then tries to backup the contact list. I now get an error that prevents me from doing anything useful (like backing up my contacts).

I'm turned off from purchasing a new phone from Verizon almost completely. I signed up for a 2 year agreement and paid $50 for the KRZR and it's not worth either of those payments. I've switched back to my old phone and I'm sending the new phone back and switching back to my old contract. I have no incentive to stay with Verizon beyond the "IN minutes" which helps when I'm calling family or friends with Verizon phones. Instead I'd like to look at future options. The iPhone is probably the only phone on the market that has my attention. I found a good discussion from Bruce Tognazzini at iPhone Interface

Beyond that I'm looking into what Google is beginning to offer, which warrants it's own discussion. Google has just released the Andriod Mobile Phone Operating System SDK It's a software development kit for programmers to develop their own applications for smart phones. With Google's help and it's current bid for the 700MHz spectrum I think we'll begin to see phones that are actually worth the money and the features that they advertise. The promise for the system is it's openness in allowing anyone to customize the different parts of the interface or applications. You could rewrite the way in which the phone makes a call if you didn't feel like Google did a good job.

Hopefully some day I can own a phone that I'm actually proud of using.

Wow

Each week's gone by so fast. I've done a lot this quarter, but I'd wish it'd slow down. Hopefully I'll have more time to write some blogs once this quarter ends. Right now I simply don't have time. I'm playing catchup with classes, work, extracurriculars, and job applications for a summer coop. Currently I'm looking into Apple, NVIDIA, Vicarious Visions, Microsoft, and Google.

We'll see how things go.

Orientation 2007!!!

Orientation was a blast. I had the best and loudest group V-19! It was great to meet everyone and I look forward to hanging out into the future. RIT's keeping it real with classes starting on Labor day. I honestly forget holidays when I'm at school because we just don't celebrate them with days off. My classes are looking good and I know a lot of people in them, so it's good to see some friendly faces.

End of the Spring Quarter

Wow, these past few weeks have been flying by. This coming week is week 10 and then I have three finals on Saturday because RIT decided to start finals on Saturday for spring to avoid conflicts the graduation ceremonies. I have two papers to write, one on photon mapping and caustics for computer graphics II and one on DNA profiling for Truth and Consequences. I still have one more programming project to finish to demonstrate photon mapping. This weeks' going to be real busy and I hope I can finish everything and still have time to get to the gym. Check out my website with all the awesome pictures at Paul's RIT website

Spring Quarter

Wow, it's already week 2 of spring quarter and I've got a heavy load. Here's a link to my main RIT web page that I updated with current course work. RIT Webpage So far I have links for two of the classes I'm taking with graphical pictures, code, and possibly even some executable files. Work on the game project is being delayed because of all the course work, and I'm also working on a separate game project for the Game Developers Club, so I'm pulled in a lot of different programming directions.

Ultimate Frisbee starts next week and I'm also working on filling out my application packet for the Student Government GCCIS Senator position, so that could be interesting in the next few weeks.

Build One

Here's the first build using a new design. I'm rewriting most of the game from an object oriented approach to break it into more manageable pieces. The original code base was growing over 1200 lines. Currently all I've implemented here is better mouse interaction with the turret and improved handling of the projectiles as they're firing from the turret.

Mouse click/drag - rotates turret Space bar - shoots a projectile

One of the problems I was having was that I had failed to initialize all the variables in the projectile class. It caused a lot of erratic behavior. Always remember to initialize all variables, or you're going to be stuck with the current value from a previous program in memory.

Here's the Build1, all the files need to be unzipped to the same location.

Done Another Busy Quarter

Every quarter here at RIT is jam packed with things to do. Thankfully I finished winter quarter with a 4.0. Cryptography was enjoyable, but hard until I got a grasp on the different algorithms. Going to the theory tutoring center was the only thing that saved me in the class. Thankfully Joe was able to explain the concepts at a basic level.

My second class Spanish was easy. It was still a review from what I learned in high school in addition to the subjunctive tense. I'm going to have to practice during the spring/summer since I won't be taking the next class in sequence until the fall of next year.

My favorite class was Computer Graphics. I initially started developing a basic graphics library on the Game Boy Advance platform which could draw lines, anti-aliased lines, circles, polygons, filled polygons, clipped polygons, and the Mandelbrot fractal. The second part of the course dove into 2D/3D graphics in OpenGL using GLUT as a window/event handler. (I created a tutorial for setting up GLUT in Eclipse on Windows here) For the 3D project I created a "turret simulation," which you can find here: Turret Simulation It's not perfect by any means, but it gives you basic control over the turret. It allows you to shoot multiple projectiles, record, playback, watch a chase camera view, and play with the lighting, textures, and materials of the scene. I only had a weekend to really put it together, so I’m amazed at what I was able to do under that time crunch.

With that said, for "Spring Break" I'm currently working on taking a lot of the concepts from that simulation and I'm building the “Turret Game.” I'm rewriting everything from an object oriented approach in C++, since the simulation was written procedurally. I should have it finished in the next few days and I’ll be posting again once that is finished.

And now you all think I’m crazy because I’m programming over Spring Break, don’t lose hope. I’ve also started running and lifting again so I’m getting pumped for Ultimate Frisbee this spring!

Computer Science BS/MS switch and the dawn of a new club

I now have two big things that I'm doing in addition to everything else. First, I'm planning on switching over to the Computer Science BS/MS program. So I'll get a Masters in Computer Science with one additional year of college, putting me at 2010. For the MS degree, I plan on doing a cluster in computer graphics. It's been a topic that has always intrigued me, but it wasn't until this year that I was really able to dig into it with my Computer Graphics I course. Next quarter I'll be taking my first graduate course, Computer Graphics II, which means I'll have extra work to do, but it should be good since it's interesting material. I'm also looking to start a Computer Science Club/Organization here at RIT. Currently, nothing exists. To get things rolling, I've been talking with the chair of the CS department and with many friends in computer science who are all very interested. I want it to be a place were CS majors can meet each other through different social events, as well as a place to give student input directly to the department. Along side organizing I am trying to design some CS T-shirts/sweatshirts to sell to students who are proud to be a Computer Science major. In the next few weeks I'll be setting up a meeting to get student feedback and to see if anyone is willing to work on the executive board. I'm already VP of another club, so I would need people willing to help out.