Sunday, March 30, 2008
After spending some time with the iPhone SDK, I've discovered that it is designed in a very Apple sort of way.  Duh.  The SDK is geared around using specific interface tools they give you.  In my case I was trying to find a video buffer I could just write to.  This sort of coding behavior has become frowned upon lately and for good reason.  Writing to video buffers outside of a sandbox is what brought us exploitable code, viruses, and crashing software.  This has given rise to the likes of managed code, .NET, Cocoa, take your pick of sandboxed safe coding environments.  The iPhone SDK is no different.  You can programatically create image objects (UIView) at instantiation time, after which they are read only.  There are all sorts of ways, actually one very striaght forward way of animating them, moving them, and intercepting clicks on them.  However if you have  a graphics engine that generates a game state essentially by bit-blt-ing to a video buffer, it looks like the only possibility for doing this is going to be through OpenGL/ES which doesn't work on the simulator.  So if I want to take this project any further I'm going to need to buy an iPhone.... drat.

Code | iPhone
Sunday, March 30, 2008 12:41:33 PM (Central Standard Time, UTC-06:00)
 Friday, March 28, 2008

Eureka!  Well it's not that much of a victory, but on a new platform, and one with a super shiny screen it's fun to see your code work.  So far developing for the iPhone is remarkably easy.  There are lots of framework objects and samples to get you started with simple applications.  The first thing I wanted to do was use the screen to interpret finger swipes.  You would think this would be built in, and according to the documentation, it is.  However I couldn't get it to work in the emulator.  Here is the sample code Apple provided to intercept swipes.

// Handles the continuation of a touch.
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{  
    // Enumerates through all touch objects
    for (UITouch *touch in touches){
        if (touch.info & UITouchInfoSwipedDown) {
            touchInfoText.text = @"Swipe down";
        } else if (touch.info & UITouchInfoSwipedUp) {
            touchInfoText.text = @"Swipe up";
        } else if (touch.info & UITouchInfoSwipedRight) {
            touchInfoText.text = @"Swipe right";
        } else if (touch.info & UITouchInfoSwipedLeft) {
            touchInfoText.text = @"Swipe left";
        } 
        // Send to the dispatch method, which will make sure the appropriate subview is acted upon
        [self dispatchTouchEvent:[touch view] toPosition:[touch locationInView:self]];
    }
}

touchesMoved is a call back that gets executed while your finger is still moving across the screen.  Checking the .info member variable against an enumerated bit mask should do the trick.  In my simulator I could never get these events to fire while dragging across the screen, so I rolled my own.  It's pretty straight forward, but it works and I get all of the expected outputs on my cool little app.

#pragma mark -
#pragma mark === Touch handling  ===
#pragma mark
 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    _labelDirection.text = @"";
 
    // Save the position
    for (UITouch *touch in touches) {
        // Send to the dispatch method, which will make sure the appropriate subview is acted upon
        [self dispatchFirstTouchAtPoint:[touch locationInView:self] forEvent:nil];
    }
}
 
// Saves the first position for reference when the user lets go.
-(void) dispatchFirstTouchAtPoint:(CGPoint)touchPoint forEvent:(UIEvent *)event
{
    _myTouchPoint = touchPoint;
}
 
// Handles the continuation of a touch.
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{  
    for (UITouch *touch in touches) {
        // Send to the dispatch method, which will make sure the appropriate subview is acted upon
        [self dispatchTouchEndEvent:[touch view] toPosition:[touch locationInView:self]];
    }
}
 
#define MIN_SWIPE_DISTANCE 10
 
// Diffs the start and end points of the swipe to determine direction
-(void) dispatchTouchEndEvent:(UIView *)theView toPosition:(CGPoint)position
{   
    CGFloat xDelta = position.x - _myTouchPoint.x;
    CGFloat yDelta = position.y - _myTouchPoint.y;
 
    // We only want to see large strokes
    if(abs(xDelta) > MIN_SWIPE_DISTANCE || abs(yDelta) > MIN_SWIPE_DISTANCE)
    {
        // See which way the stroke went
        if(abs(xDelta) > abs(yDelta)) {
            if(xDelta > 0) {
                _labelDirection.text = @"Right";
            }
            else {
                _labelDirection.text = @"Left";        
            }
        }
        else
        {
            if(yDelta > 0) {
                _labelDirection.text = @"Down";
            }
            else {
                _labelDirection.text = @"Up";
            }
        }
    }
    // Short distances are considered clicks
    else
    {
        _labelDirection.text = @"Click";    
    }
}

touchesBegan and touchesEnded are also call backs that get executed when you think they would, when your finger touches and then leaves the screen.  I use a little subtraction and the magic of absolute value to determine the drag direction.  Small drags are considered clicks.  Now I'm ready to plug any code into my directions.  This doesn't use the delta or the accelerometer that are available, but for my purposes I just need a direction at this point.

Code | iPhone
Friday, March 28, 2008 6:15:18 PM (Central Standard Time, UTC-06:00)
 Wednesday, March 26, 2008
So I am trying my hand at writing code on the Mac for the first time ever.  My wife (an artist, and therefore Mac owner) has been kind enough to lend me her laptop so that I might install Xcode and the iPhone SDK upon it.  Laden with this new power, I now dive into documentation and the Xcode development environment.

I've only been at it for a single day, but so far I am a fish out of water.  I find the tools to be very lacking compared to Visual Studio.  I do realize this is likely to my lack of understanding of the tools, but there isn't intelli-sense  for the Xcode SDK.  This feature for the .NET envoironment is a huge time saver.  I'm sure there is a coca equivelant, but I have yet to find it.  I don't know all the shortcuts yet so it's taking me a lot longer to write code.  The largest obstacle of course is the fact that everything is based on BSD which I haven't used since college.  The other side of the fence is a fascinating and difficult place to navigate.  All of those shinny candy buttons compell me to forge on!

I am currently trying to port some file IO code written by my friend Jacob Repp to do the same thing in OS X.  Jacob is an excellent engineer and most of his code is already entirely portable, so by the end of this I'm hoping to have a how to guide for writing OS X equivelant file IO.  Surprisingly I couldn't find much on porting in this direction on the web.  There's plenty in each column, but not much for going between them.

I just found this in the Xcode development guide.  This highlights the context in which Apple does software development.  Notice that revenue stream is not in this list.

  • What do you expect to be the user’s motivation for using the application?
  • What do you intend to be the user’s experience while using the application?
  • What is the goal or focus of your application?
  • How does your application organize and display the information people care about? Is there a natural organization associated with the main task of the application?

These are all afterthoughts in most development cycles.  The business objective is usually much higher up, which is important as you need money to pay developers.  However these human questions will lead to software that is simply more enjoyable to use.

Code | Mac
Wednesday, March 26, 2008 10:04:57 PM (Central Standard Time, UTC-06:00)
 Sunday, March 23, 2008

I am an avid reader of Foreign Policy, and there is an awakening article in the March|April issue titled Iraq's 100 - Year Mortgage.  Healthcare is the leading category on our checks in the United States for a lot of reasons which I won't go into here.  It's no surprise that heath care costs for Veterans are a contributing portion of that pie.  Currently the US spends approximately $280 Billion per year funding the Iraq war.  I'm not here to judge whether that expense is justified or not.  There are good reasons on both sides of the argument for that expense.  The long term cost however goes unnoticed by most I believe.

According to Linda J. Bilmes research, medical technology has allowed the wounded to killed (US troops only) in Iraq to achieve a 7:1 ratio, up from 2:1 in WWII, and 2.6 in Vietnam.  More surviving troops is a great thing.  The cost associated with their long term medical care is something that is not often considered.  The medical costs for the 1991 invasion in terms of all the care that veterans of that war will expend is sighted as five times more than the cost of moving the gear, pulling the triggers, and moving it back.  Iraq, like most American military actions after WWII will end for lack of money.  Congress will run out of patience and money eventually.  As soon as there is a politician giving America a choice between war and lower healthcare costs, and those affected by such healthcare outnumber those that don't, that candidate will win.  It may already be happening now.  November will tell.

Regan era economists after the cold war came to the conclusion that 'deficits don't matter.'  As a means to an end of the Cold War, maybe they didn't.  However we are going to be in for a deficit that's even worse than the one Regan created.  So maybe they don't matter up to a point that we haven't reached yet.  I do not know what that point is.  Ultimately the US will get the rest of the world, well actually nations that lend money to the US, to pay for the Iraq war for us.  This is some consolation for the credit bill that is due to our future.  Seeing has how the Federal Reserve has been lowering rates to ease panic on Wall Street, it has chosen one of two poor routes to travel.  In this case it has chosen inflation over slowing economic growth, even though we may end up with both.  Inflation will continue to weaken the dollar and the US will pay back it's debts over the coming decades, but at a nice discount since the dollars it will pay them back in are up to 50% weaker than the ones it borrowed;  thank you China!  I used to argue that the Fed should suck it up and stick or even raise rates to save the dollar and hold inflation at bay as an amateur economist.  If this were one big game of Civilization IV, I'd do what they are doing now.  It's national self interest, everyone is doing it.

Sunday, March 23, 2008 4:32:30 PM (Central Standard Time, UTC-06:00)
 Friday, March 21, 2008

You may be asking yourself, why would anyone be going from a Mac back to a PC.  I mean that's going back into the big market share.  Maybe it's for the artists who gave up, but not many are doing it.  I could not find a tool that would import an Entourage .rge file into Microsoft Outlook 2007.  I found some tools to read .rge files on a mac.  Oh and you can transfer your contacts via a tab delimited text file.  What about e-mail?  Oh you can copy it to the file system and loose all you formatting.  I guess this just goes to show that the market for users converting their e-mail from Entourage to Outlook is small which means Macs must be catching up.  Or it means that no one uses Entourage, which seems more likely since Macs are so yahoo and gmail friendly.

Why am I moving machines around anyway?  Well I'm going to embark on some XCode programming.  I've never written anything for the Mac before, but it's shiny brushed aluminum surface calls to me.  And in actuality, I really just want to make an iPhone app.  The AppStore Mr. Jobs is talking about launching just sounds so simple, so elegant, so mac.  It opens in June which is plenty of time to put together a workable app.

Code | Mac
Friday, March 21, 2008 1:25:28 PM (Central Standard Time, UTC-06:00)
 Thursday, March 20, 2008

Well as it turns out brute strength can work, but it breaks a lot of things along the way.  With your objective in hand you can stand triumphantly over the ruins of your development team.  Now, will those now hardened veterans be willing to fight the same way for the next release?

I've been doing software development for close to ten years now and have seen several development, management, and operating styles.  They all met with some measure of success and some measure of failure.  Agile is the new guy in town and he's winning a lot of friends.  Last week I spent three days at Jeffery Palermo's Agile Boot Camp offered by Headspring Systems.  I've actually been part of three teams that made the transition from waterfall to SCRUM (another agile management method).  So I wasn't sure if I was going to learn anything new.  However after talking with Jeffery about the class and hearing how it was run, I thought it would be worth the expense.  Seeing as how I currently do not have a day job, it beats playing WoW all day.

I'm glad I took the class.  A recurring theme began to emerge that I've also noticed in discussions at the Agile Austin and ADNUG (Agile Developers Network Users Group) meetings.  It's all about scale.  My previous experiences with agile development have all been with Enterprise level software.  I can already feel my nose rising as I type the word 'Enterprise.'  Oh it just makes me feel so superior.  What it really means is that Enterprise software probably tends to have a lot more process wrapped around it than something built for a smaller client.  Many of the tools and techniques you will learn in Jerry's class will apply to your projects regardless of scale, but they really shine in an environment where you have a focused customer with a direct need and a small user base (<1000 users).  Jeff's class is about efficiency.  Do exactly what the customer wants with the least amount of effort in a way that is highly sustainable, portable, and automated.  This is what I came to learn!

Being an ex-Microsoft man, I know Microsoft tools and process really well.  And as far as corporations go, Microsoft does a good job of using enough process to reduce chaos, but not so much to prevent work from getting done.  Your mileage may very if you are a Microsoftie.  The company has tens of thousands of employees and many hundred groups, of which I have been a part of about three.  This was my experience there.

That aside, Jeff's agile methodology offered a lot of new approaches that didn't fit in my previous world view which is what I want out of training.  The class isn't workbook based either.  You will develop a dynamic project, have design meetings, argue over how to build it, how to test it, and how to deploy it.  You will learn a cool set of tools that he uses to accomplish these goals.  They're not *the* set to use, but they are a good set that works.   $2350 is a mortgage payment, a new laptop, or a pretty nice vacation.  That being said I will certainly earn more than that out of applying the lessons learned in his class. 

ROI > 1 .. Do

Thursday, March 20, 2008 3:10:53 PM (Central Standard Time, UTC-06:00)
 Wednesday, March 19, 2008

I have been recently inspired by Derick Baily to resume blogging.  He's got a lot of great ideas, and I've learned some things from his blog.  This got me thinking how I could make a similar contribution.  I used to be of the mindset that the world was too big to change of influence, and I was merely an observer to watch this incredible oddity called Earth go by.  As an observer, it's not really my job to add anything, simply to watch and wonder.

A little over a year ago, I came to the revelation that one person has a lot of influence and can make a noticable difference in the lives of others.  Even as an observer of other people that do this, until recently it did not occur to me to do so.  Having met with success with my employer, finding a great relationship, and buying a house I found myself asking, "Now what?"  The answer I've found for me has been to make a contribution to others.  It's the most rewarding experience I've found and hopefully this blog can achieve that in the same way Derick's did for me.

Wednesday, March 19, 2008 6:05:34 PM (Central Standard Time, UTC-06:00)
 Wednesday, July 20, 2005

Be sure to visit all the options under "Configuration" in the Admin Menu Bar above. There are 16 themes to choose from, and you can also create your own.

 

Wednesday, July 20, 2005 1:00:00 AM (Central Standard Time, UTC-06:00)