Extended Permissions support in Bamboo (a Facebook Graph API iPhone SDK)

May 31, 2010 at 3:31 pm (Bamboo, Facebook development, iPhone development, Software Engineering) (, , , , , , , , , , )

Today I successfully added support to Bamboo for Facebook’s nefarious new permissions model. This means that, for the very first time, iPhone application developers have real SDK support for Facebook’s new Graph API, without writing very low-level networking code and handling extremely confusing authorization and permissions.

Facebook has been threatening to shut down data access for all apps that do not migrate over to using the new model for some time now. The most recent deadline was June 1, and it has just moved back to June 30.

If your iPhone app publishes to the user’s stream, as is the case for 98% of iPhone apps, your app will break. You need to do something about it NOW, so that you are ready by June 30. And I am here to help you with that.

Enter Bamboo, a Facebook Graph API iPhone SDK.

First, some Facebook permissions details

Facebook’s fundamental permission concept has changed from a simple yes/no, either your app had permission to do everything or nothing, to a much more granular set of very specific abilities. There are currently 5 “publishing” (write) permission types, and a whopping 45 “data” permission types, broken down into personal data (25 types), and friends data (20 types). You can see the full list here.

For iPhone app developers who interface with Facebook, this means that if you do anything besides read the most basic of public data from a user’s profile, you must update your app with support for the new extended permissions.

So, how can Bamboo help me?

In one succinct line: Bamboo aims to meet all your Facebook needs as an iPhone application developer.

Bamboo is an objective-c implementation of the Facebook Graph API, including support for both the new oAuth authorization, and the new extended permissions model. For integration instructions and more technical details, please see the Bamboo github page.

For your convenience, here is a simple example of client code using Bamboo:

	[[FacebookProxy instance] loginAndAuthorizeWithTarget:self 
                                  callback:@selector(finishedAuthorizing)];
	GraphAPI* graph = [[FacebookProxy instance] newGraph];

	GraphObject* me = [graph getObject:@"me"];
	NSString* myName = me.name;
	
	UIImage* myProfileImage = [me largePicture];

	NSArray* thingsILike = [graph getConnections:@"likes" 
                                                       forObject:me.objectID];
	
	// hello world post - update status message to my feed/wall
	NSDictionary* args = [NSDictionary dictionaryWithObjectsAndKeys:
                            @"Hello World, from bamboo!", @"message", nil];
	[self._graph putToObject:me.objectID connectionType:@"feed" args:args];

	// comment on a post
	NSDictionary* args = [NSDictionary dictionaryWithObjectsAndKeys:
                                   @"Bamboo comment test", @"message", nil];
	GraphObject* post_result = [self._graph putToObject:@"post_id" 
                                        connectionType:@"comments" args:args];

	// add a like connection from me to you
	[self._graph likeObject:@"your_id"]

Bamboo is designed to make the transition from using Facebook Connect to using Bamboo as simple, straightforward, and easy as possible. I have reused the login mechanism of Facebook Connect, and reused the same UI look and feel for the new extended permissions dialog, so your users will feel right at home with the new flow. They may not even notice that anything has changed.

The underlying systems are extremely complex, so it’s not possible to hide all of it, but I constantly strive to make the SDK interface as easy to use as possible, and I actively support the library…so if you need something, I’m here to take care of you.

While Bamboo is far from being finished, I hope that you will consider it to service your iPhone Facebook needs. One day, someone like Apple or Facebook may publish an official SDK that makes this project obsolete…but given Facebook’s negligent track record with FBConnect, I’m not holding my breath. And until that day comes, right now, Bamboo is your best option.

Honestly, it’s pretty much your only option.

Thanks
R.

Permalink 1 Comment

Mother’s Day Greetings, iPad app style

May 8, 2010 at 3:24 pm (iPhone development, Uncategorized) (, , , , , , , , )

This year, I have re-energized my long standing partnership with Steve Bjorkman, my fabulous illustrator, who’s greeting cards have been a successful staple in retail stores since the early 80s. His softly hand-drawn, humorous style is very popular to a very wide audience, which we have taken advantage of, and harnessed to create iPhone applications for kids and adults alike.

This past week, we published our first iPad app, a Mother’s Day greeting card-style app very similar in concept to the Create a Valentine app we did last year. If you have an iPad, please go take a look at the app, download it, and use it to tell your mom just how much you appreciate her. Your mom will be impressed by the unique, warm style and subtle beauty, and your neighborhood developer will be grateful of your support.

Additionally, I also created a universal app which will run on both the iPhone and the iPad, but unfortunately it just missed being approved in time. It will hit the store on Monday, so if you forgot Mother’s Day (tsk tsk) and have an iPhone, give it a shot! And next year, it’ll still be there.

About the Greeting Card business in the 2010s…

Over the last 10 years or so, digital media has become a prominent form of greeting-sending that traditionally were always paper based. One of the side-effects of this, for a variety of reasons, is that the general quality of such greetings tend to be relatively poor, the receiver often feels as if the sender did not care quite enough to “send a real card.” You have all experienced it at one time or another, I know you have. It’s a very clear case of meaning being codified in the medium, which is fundamentally difficult to change, but we believe it worth attempting to do so.

This effect is something that Steve and I take very seriously, especially Steve, and one of our main aims with our greetings apps is to allow you to create beautiful, thoughtful greetings that evoke those emotions of feeling cared for, loved, appreciated. The attention to detail in Steve’s illustrations, the fact that they are custom-drawn exclusively for these projects, and the similar appearance to traditional greeting cards, these are all things that make what we offer unique, and not something that just anyone can do. His many years of experience in the professional business really shows through his creations, and I feel lucky, honored even to have the chance to work with him. I hope your experience with his work is as wonderful as mine.

An e-card may never fully substitute for a physical one in many circumstances, but it certainly is a welcome addition, and sometimes, it’s just the right thing.

(On a side note, the Valentine iPhone app turned out to be extremely popular, far exceeding my highest hopes. The 2009 distribution was in the thousands…but the 2010 distribution reached well into the hundreds of thousands. This tells me that, most likely, other people see value and appreciate our unique creative approach. Whatever the reason people like it, it helps to build confidence in what we are doing. Not bad for an app that I built after work one day.)

Thanks
R.

Permalink 1 Comment

iPad Universal app with no nibs

May 5, 2010 at 1:04 am (iPhone development, Software Engineering) (, , , )

I don’t believe in using nib files in my iPhone/iPad projects, not even the magic ones that are generated by the default project templates. So, as I’ve been looking into creating universal apps, I have noticed than no one seems to have published a sample universal project that doesn’t use nibs.

I thought I would take this opportunity to provide such a project, so that anyone who wants to create a universal iPad/iPhone app with no nibs, has a clean template to start from that is already setup with all boilerplate work in place.

The project is a part of my rcloudlib repo on github, I encourage you to take a look at it, I keep it very lightweight and include items I find that need in almost every project I work on. The most recent version of the app template will always be in the rcloudlib/samples/rcuniversaltemplate directory, and will be expanded in the future. If you want a direct download of the .zip of the super-clean version that will never change, use this link instead.

The project complies and runs, in both iPhone and iPad mode. You can run both iPad/iPhone in the simulator, using the steps described here.

If you have any comments, recommendations, fixes, or anything else…I’d love to hear them.

Thanks
R.

Permalink 1 Comment

R.Cloud Software in the news!

September 11, 2009 at 11:48 am (Business, iPhone development, R.Cloud Software iPhone Applications)

We’ve received a few really nice write-ups for our recent release of Digit Defenders. Here are some of the posts:

You can find all the most recent press coverage of R.Cloud Software on our press page: www.rcloudsoftware.com/press.

Thanks
R.

Permalink 1 Comment

R.Cloud Software Labor Day iPhone app Sale!

September 4, 2009 at 1:04 pm (Business, iPhone development, R.Cloud Software iPhone Applications) (, , , , , , , , , )

This weekend only, R.Cloud Software is having a Labor Day back-to-school sale of our most popular iPhone apps for kids and family. Just reduced in price are:

Create A Cartoon Face$1.99 Now 0.99!
Digit Defenders$2.99 Now 1.99!
iLOLZ$1.99 Now 0.99!

Enjoy the sale, it will last this weekend only so get them while they are cheap!

Have a great Labor Day weekend, enjoy some quality time with your family and friends.

Cheers
R.

Permalink Leave a Comment

iLOLZ v1.1 is released!

August 28, 2009 at 9:00 pm (iPhone development) (, , , , , , , , )

Apple just approved v1.1 of my lolcats maker iLOLZ! I have waited to do any PR about it until now, because previously it was missing landscape support. Now with that, and the new clear-annotations button (frequently requested) the app is ready for showtime!

iLOLZ website: http://www.rcloudsoftware.com/ilolz

Inky

iLOLZ UI

Permalink Leave a Comment

New updates of my first iPhone apps, Create a Cartoon Face and Create a Valentine

August 24, 2009 at 9:44 am (Business, iPhone development) (, , , , , , )

I have brought my original iPhone apps up to date, and incorporated some of the best 3.0 OS features. Most notably, now there is direct email embedded into both apps, so instead of having to save your creations as photos, then close the app, open photos, and email from there…now you can email straight from the app. Also I’ve added Flurry, so I can better understand how people are using the apps, and optimize future updates.

App Links:
Create A Cartoon Face
Create A Valentine

I hope you enjoy the new features, and if you want any new features…let me know!

Thanks
R.

Permalink Leave a Comment

malloc_error_break, double free, iPhone 3.0…maybe you fucked up NSTimer?

June 29, 2009 at 11:13 am (iPhone development, Software Engineering) (, , , , , , , , )

Yesterday, while working on a client project that had been rejected from the app store, I was doing some initial diagnostics and came across this wondrously useless error message in the console:

malloc: *** error for object 0x529d20: double free
*** set a breakpoint in malloc_error_break to debug

Apparently, when doing the quick cert-signing and testing previously, we hadn’t looked at the console on all of the versions…because this particular error is only a warning on the iPhone OS 2.2.1, and a crashing error on 3.0.  Don’t have any idea why the difference across versions, but it’s there.  So when we ran this on an iPod Touch 2.2.1, it seemed to execute fine, you had to be looking at the console, without being alerted by the debugger…tricky little bitch.

Now, I know what a double free is, but I have no idea where to find malloc_error_break…and Google doesn’t fucking help much, it’s just a bunch of people posting build errors on forums, with no useful responses.  I’m hoping this post will make it up the list, and you will potentially find something useful here, instead of just a cry for help.

So…faced with an easily recurring error, I was pretty confident I could knock it out in short order.  The malloc_error_break message was sort of helpful, but not enough.  I could set breakpoints, and never quite nail down the error…I could break before it, and after it (on 2.2.1)…but not on it.

The useful piece of information in that error message is twofold…one, the double free indication.  And two, more importantly, the memory address of the object. That is how I found the source of the error.  I couldn’t find malloc_error_break, but I could guess which objects might be getting double-freed by looking at the code.  It turned out, the original engineers had written this code to stop an NSTimer:

- (void) stopTimer
{
  if (ptrTimer)
  {
    [ptrTimer invalidate];
    [ptrTimer release];
    ptrTimer = nil;
  }
}

this code, is wrong.  The release in the middle is extraneous, and is what was causing the double-free.  The invalidate call is all you need to stop the timer, the setting to nil is nice for sanity.  I looked at the memory addresses of the two initial NSTimers set during app load, and noted them at the breakpoint right before the crash.  And bam, one of the addresses showed up in the error message as the object that had been double-freed.

So, that was it.  There happened to be about 7 different timers floating around the app, all mistakenly stopped in the above way, so the app was absolutely going to crash, no matter what you did.  Commenting out the release was all it took for me…and just over an hour later, I had the app all ready for submission to the app store.  We sent it in this morning, hopefully it should be done by friday.

Thanks
R.

Permalink 4 Comments

Using custom fonts in iPhone applications

June 13, 2009 at 11:58 am (iPhone development, Software Engineering) (, , , , , )

As any iPhone developer knows, the fonts included on the iPhone can be a bit…limiting.  Sure, they are fine for business and utility applications, but for games and other design-heavy apps, the built-in fonts really don’t get the job done, with MarkerFelt being maybe the only usable, stylistic font.

I worked on typography for just about a decade at Adobe, on such applications as Photoshop, Illustrator, and Flash…so good typographic options are near and dear to my heart.  It pains me to see the limitations that iPhone developers operate with.

What is almost more painful, is the complete lack of a coherent solution from the community.  I spent some time looking around, and found a grand total of 2 solutions, neither of which is complete…but both are usable to some extent.

  1. EasyGlyph – this is a windows only .NET program to create a spritemap out of a font, plus objective-c code to support using the spritemap in your iPhone application.  This solution is good enough for some users, mainly game developers who don’t mind the inherent limitations, and just need some nicely styled text in small amounts.  You are basically just blitting images instead of text, so you are unable to do anything that is not pre-rendered into the images.  Personally, I don’t like this approach, but it would be rude of me not to include it here, as many of you may find that this is just what you need.  It works very well for very simple needs.
  2. A very nice and responsible blogger UIHacker posted this post, which is as far as I can tell, the only fully working solution that anyone had the confidence to post.  It is a very nice packaging up of what is really the best solution right now, which is to operate at the CG* level (CGFont, CGContext, etc).  If you are going to really dive in and use a custom font, this is the way to go.

What I have done, is taken the code that UIHacker posted, and expanded on it…to fit my needs.  Everyone’s needs will differ, but some things are very common.  I will post probably the #1 request I saw, which is how to center text.

  1. To begin, get the CustomFontBase.[hm] from the link above.
  2. in the drawRect() method, look for the line that draws the glyphs, it should look like
    CGContextShowGlyphsAtPoint( context, 0, 0 + fontSize * .25, 
                          glyphs, length );
  3. The second parameter is the x offset, which is what we are interested in.  Replace this call, with the following code:
    if ( isCentered )
    {
    CGContextSetTextDrawingMode( context, kCGTextInvisible );
    
    // draw the glyphs to get the width
    // hack the y-point to make sure it's not cut off below font baseline
    // - this creates a perfect vertical fit
    CGContextShowGlyphsAtPoint( context, 0, 0 + fontSize * .25,
                                                    glyphs, length ); 
    
    // get width of text for autosizing the frame later (perhaps)
    CGPoint textEnd = CGContextGetTextPosition( context );
    float adjustment = ( self.frame.size.width - textEnd.x ) / 2.0f;
    
    if ( isOutlined )
    {
    CGContextSetTextDrawingMode( context, kCGTextFillStroke );
    }
    else
    {
    CGContextSetTextDrawingMode(context, kCGTextFill);
    }
    
    // draw the glyphs for real
    // hack the y-point to make sure it's not cut off below font baseline
    // - this creates a perfect vertical fit
    CGContextShowGlyphsAtPoint( context, adjustment, 0 + fontSize * .25,
                                                    glyphs, length );
    }
    else
    {
    // draw the glyphs
    // hack the y-point to make sure it's not cut off below font baseline
    // - this creates a perfect vertical fit
    CGContextShowGlyphsAtPoint( context, 0, 0 + fontSize * .25,
                                                    glyphs, length );
    }
  4. You will also need to add a member “isCentered” to support both centered and non-centered drawing.  Also, the “isOutlined” section is optional, but I thought I’d include it since it was something else I added.  UIHacker included support for Glow, and I similarly added support for outlined text.  The color of the outline is controlled by the stroke color, which you can set like this:
    if ( isOutlined )
    {
    CGContextSetStrokeColorWithColor( context,
                                       outlineColor.CGColor );
    }

While this is still very limiting, only single-line text is currently supported…it is a very good start, and is very easily extendable to as much functionality as you are willing to code up.  Type engines are no easy task, but I think as long as the community continutes to share and build off each other’s success, we can make good progress.

I am considering putting together a more fully featured version of this and sharing it, if there is sufficient interest in the same features.  For now, I think this is a good enough starting point, that anyone can make good use of it in any iPhone app.

Permalink 3 Comments

Spellwars Screenshots, June 10

June 11, 2009 at 11:09 am (iPhone development, spellwars, Uncategorized) (, , , , , , , )

Spellwars development has been banging along, but none so much as the visual development. My designers and artists are just fantastic, though I am always looking for more Spell Artists. If you think you might be interested, please don’t hesitate to contact me (click the contact tab in the top right of the page for direct contact info).

I thought I’d give an update and include some screenshots, showing off some of the more recent work.

I hope you like what you see. There is so much more to come, I can’t wait to get this out to everyone who is waiting and wanting to play.

Thanks
R.

Permalink 3 Comments

NSIndexPath for iPhone SDK: .row and .section

May 4, 2009 at 1:01 pm (iPhone development) (, , , , , , )

God, I really love/hate it when Apple, or any other framework & API developer, does shit like this.

Love it, because they do exactly what I want them to, they modify an old existing API with an arcane interface (NSIndexPath in this case) to provide convenient, direct access to what we really need as developers (in this case, the row and section of the UITableView).

Hate it, because they don’t document the new API in a reasonable way. Yes, it turns out that there is at least documentation in this case, but it wasn’t accessible in XCode, the way everything else is…I had to google the problem, and find someone else’s nice reference to the NSIndexPath UIKit Additions documentation. Now that I know it is there, I go back to XCode, and yup, I can find it. And it’s not totally un-obvious, but it’s just that one extra click away for me to have missed it the first time.

The API I’m very happy to have just learned about here, is 2 new accessors added to NSIndexPath by the iPhone SDK, .row and .section, which provide convenient access to the relevant information about a multi-section UITableView. If you do any development on the iPhone, you will at some point very quickly want to use a UITableView, and likely a multi-section variety. The plain one works fine for many cases, but sometimes a multi-section table provides a better or more natural organization.

The normal API for NSIndexPath is really lame, it’s basically an array of numbers, which are themselves indices into a tree of nested arrays. You can read all about it on your own time in XCode, have a blast. The row/section API, makes all the sense in the world, and it’s great to have it.

But please, oh god please, API and framework developers across the lands, make your documentation just as orthogonal as your API (or preferably, even more orthogonal). A poorly documented API is sometimes worse than no API at all (take, well, any API that Microsoft has written since the original win32 api. MFC will suffice. Had microsoft never bothered to release that abomination, no one would have been under the false impression that they could actually *use* the API to do something useful or efficiently, and would have just stuck to the ugly, but reliable, for windows anyway, win32 api) Apple’s API documentation is historically pretty questionable, and their API implementations are also similarly pretty questionable. As much as I love application development compared to web development, comparing the NS* API, on which most of the iPhone SDK is based, to something like Rails…the degree to which the iPhone API falls short is just sad. A part of me deep inside cries whenever I think about it.

But still, at the end of the day, I love to write iPhone applications, and I hope that business continues to allow me to fill my time with client work for iPhone apps. If you or anyone you know needs iPhone work, http://www.rcloudconsulting.com ftw.*

Thanks
R.

*ftw = for the win, meaning if you want the best iPhone developer in the world, that’s where you find him. Any resemblance to the author is strictly intentional.

Permalink Leave a Comment

What it means to be a “Senior” professional

May 1, 2009 at 3:09 pm (Business, Software Engineering) (, , , , , , , )

In the professional world of engineering, there are certain words and labels that are commonly used, and uncommonly defined or understood. In software engineering, “Module” is probably the most amorphous, ill-defined, appropriate-for-almost-anything term we commonly throw around. VP of Engineering is another one, or Director of Engineering. What exactly does it mean to have that title, and what do those people do, especially in an environment like, say, a company of less than 5 people?

My all-time favorite though, is “Senior Engineer.” Commonly “Senior Software Engineer,” occasionally “Software Architect” (which is a completely different job, but I’ve seen the two used interchangeably by many people), and there is a long list of other variants. The main purpose of these seems usually to be to stroke the ego of the person who is the descriptor of the title, but aside from that, the title’s main purpose is usually to distinguishing them from the ill-fated “Junior Engineer” title or status.

On occasions across my career, I’ve pondered these titles…and often wondered what exactly was it that made someone worthy of one title or the other. It was clear to me long ago that many unworthy people held the title of Senior Engineer, so either everyone else knew something I didn’t know, or my standards and evaluation method was different than those commonly held in the industry.

What really does it mean to be a Senior Software Engineer?

Recently certain events have caused me to reconsider this question. Recent events set one, a good friend of mine, someone who is without any question or debate in my mind, a very, very senior software engineer, was repeatedly turned down by multiple software companies, for failing technical interviews. And when I say undebatably senior, I mean Caltech graduate, IQ 3 to 4 standard deviations above the norm at the very least, 15-20 years of very solid experience, and a well-rounded programming god. You may even know his name. In one instance, the technology in question that was his downfall was CSS.

C.S.fucking.S. The technology that, unless you are going to be a browser UI wizard who just focuses on layout and design, has essentially no logic to it, you just look up the features you want or need at any given time on the web like a dictionary or encyclopedia. And he wasn’t interviewing for a front-end job, he was going for a server-side position. CSS was totally irrelevant to his job, and in my book, is basically irrelevant to just about any engineering job. You look up what you need, when you need it, then forget it. You don’t waste brain-space on CSS, it’s just not that kind of information.

Recent events set two, another engineer I know has similarly been judged to be “too junior” by another handful of software companies. His particular situation was slightly different, he was actually in multiple jobs, and then sometimes politely, sometimes impolitely shown the door…but basically, both he and the previous engineer’s situation look pretty identical in nature. This friend of mine has slightly lower credentials than said engineer above, but not significantly different. I can’t help but feel bad for the both of them.

So I ask myself, how could not just someone, but multiple someones, look at the same engineers as I do, and evaluate them completely differently? There are lots of subjective issues involved in all of these types of situations, but the thing that gets me is that it was never those subjective issues that were the cause of the evaluation…it was the hard facts, the objectively measurable metrics that were used to disqualify the engineers in question in every case. Yes, I know that it’s very common to take a subjective dislike, and mask it with an objective window-dressing to make a lay-off look fair…but I honestly believe that wasn’t what was going on. What I think was happening, is that the standards by which the engineers were being evaluated were totally different than what I use. And I think it was due to the relative seniority of the people who were making the evaluations, in large part if not in full.

What exactly do I mean by that? I’ll start my explanation, by referencing Paul Fusel’s book “Class,” which is a piercingly honest and brutal whirlwind of premises, arguments, but mostly observations about the social mechanisms of modern-day America. The basic premise, is that social status in America is, whether you like it or not, a class-based system, and one’s understanding of what “Class” is, is heavily influenced by the level of one’s status in the system. So, for instance, following Paul’s narrative, lower-class people tend to think that money and “showy” things are a measure of class (think of what the term ghetto-fab really means); middle-class people tend to deny that class exists at all, but when pushed they show a strong belief that class is a factor of one’s profession, education, and knowledge (all things that can be acquired); while upper-class people know that class is something that one can not change, it is something you are either born with or you are not…it is a factor of blood a family. Your family is a family of class, or it is not…kind of like medieval royalty. One very interesting observation that Paul Fusel makes, is that upper class people, especially the very top of the upper class, tend to look a lot like lower class people, especially the lowest of the very low. Uneducataed (why get an education, when you are born into the Rockafeller family? It’s certainly not going to help at your upper-class society parties), uncouth (no need to follow social standards, because you are basically above them), and generally unaware of what’s going on in the world (why keep up with events, you already have everything you would ever want or need). It’s not that upper class people are bad people, it’s that they don’t have any external motivation, because they are born with all their means of survival met…so everything in life can be seen as optional.

Now…take that metaphor, and do a quick translation, of “class” into “professionalism”, and class status (middle and upper) into professional titles (junior and senior) and you start to get a decent idea of what I think is going on in the professional software engineering world. When you have junior engineers (middle-class people) interviewing, working-with, and evaluating senior engineers (upper-class people), they find that the senior engineer in some way does not measure up to their standards (of professionalism, which are all things that can be gained, learned), they come to the believe that the person is junior, and that they are in fact senior – it says so on their business card, and they are better than this other fool who was supposed to be senior, so it seems like a reasonable assumption…and god does it feel good to feel superior to another human being (engineers really love this, I don’t know why, it’s in the DNA though). It’s not a difficult mistake to make, but it starts to explain, at least in a metaphorical way (which is how we humans tend to make meaning), how my view of these things can be so different than the people I find myself around.

Metaphors aside, to me, what does it mean to be a senior software engineer? What is it that sets those people apart from their junior bretheren? First of all, it’s not technical knowledge. Or more specifically, not strictly a matter of memorized technical knowledge or ability. For me, it’s a matter of breadth of awareness, and the flexibility to be able to be effective in any area, any environment, any situation, any company, any codebase, any language, any product…in short, any job. It’s the ability to do whatever needs to be done, be that writing code, testing code, designing product specs, setting up servers, maintaining client relationships, balancing work and life, presenting oneself appropriately, acting appropriately…whatever it is, I expect a senior engineer to be able to adjust and manage through, while I would not expect a junior engineer to be able to handle the same wide variety of situations. I would not expect a senior engineer to know any specific language, but I would expect him to be able to program in any language or technology stack necessary to do whatever job needed to be done.

What I expect out of a junior engineer, is productive, technical competence in a small range of areas. This for instance, might be someone who can write solid C++ windows code, for shrink-wrap applications. It could be someone who knows Oracle databases inside and out, someone who is a browser UI wizard, guru, ninja, or whatever other absurd noun your marketing people would like to apply to us next, or it could be a server engineer, who can spin out PHP or Ruby code for days on end with no sustenance except Jolt cola and a 5 pound bag of gummy bears.

I expect almost complete technical competence out of a junior engineer…and I think this is where I get mixed up with people. I believe that my description of a junior engineer, is what most people would label as a senior engineer. And my description of a senior engineer, is what most people…don’t know what to do with. They certainly don’t call them senior engineers. They seem to have 2 alternatives, from what I’ve observed of those around me: 1) become an entrepreneur, and start your own company, 2) ignore much of what you know and can do, and do the menial, repetitive job of being a feature developer…because that is what is available most of the time. Occasionally, there is a position for a real, senior engineer in an existing company…but it’s increidibly rare. Most of the time, if you take a job with a company, no matter what the title, you are going to be a feature developer. That’s just what needs to be done most of the time. And to be honest, coming from someone who’s done it for years, good god it gets boring after a while.

I remember exactly the date, or really range of dates, when I became a senior engineer by my own standards. I had held the title for some number of years previous to that, but it was just a misplaced title, as most of them are. It was 2006. That year, I worked on close to a dozen different technology stacks, from top to bottom, OS to language to framework to APIs to machines. I was pushed, hard, from my comfort zone, by the necessity of a project with a very small number of people with a large vision in a big company, where it is very difficult to make waves and stand out. I went from being someone who was incredibly talented and competent at writing C++ application code, to someone who could write any kind of code, in any environment, any language. It all became the same. There was something very zen-like about it. All of the differences just started to melt away, when I realized that all programming jobs were essentially the same. You get a language, a device, a language, a framework, and an API, or some number of each of the above, and you write the same 6-10 types of code blocks.

There are quite a lot of counter-arguments, many of them very valid, but I’m not here to write a philosophy paper and defend my thesis. I did enough of that back in the day (god bless the Philosophy department at Cal Poly for putting up with me, may they reset in peace), what I hope you might take away from this…is to ask yourself, what does it mean to me to be a Senior Software Engineer, and how can I make sure I don’t make the mistake of pursuing the wrong career goals, or misinterpreting someone else’s behavior. Maybe you will pause for a moment and question your own ideas, to see if they stand up to even your own probing. Maybe I’m way off target for you…but maybe, I’m dead on, and I’ve hit on something that you knew all along, but couldn’t quite articulate.

One way or another, I hope I made you think.

Thanks
R.

Permalink 3 Comments

Spellwars update: and new Screenshots!

April 29, 2009 at 9:31 am (iPhone development, spellwars) (, , , , , , )

Well, it’s been a long time since I’ve posted here, I’ve been quite busy. But with a lull today, I thought I’d give an update on spellwars, since the forums are still private…and if you are following the game from the outside, you might be wondering what’s going on.

I’ll tell you what’s going on: a hell of a lot! The most obvious changes are visual, the UI has had a complete overhaul, which is probably 30-40% finished, by my lead UI designer Ryan Sumo. He’s been working hard and producing very high quality work, I can’t say enough about how great he is to work with, and how much I love what he produces. There are still some very obvious things not done yet, but they are on “the list.”

Jeffrey Lai has produced some absolutely incredible Spell artwork for Spellwars, I am so proud to have him as our marquee artist. I am still looking for more artists to draw spell art, so if you are interested, please contact me.

Arron Hirst over at RzFLY is working away on a new app icon, and a set of tab icons.

Rudi Cilibrasi has implemented a server, so our multi-player version has officially gotten off the ground (though we still plan to ship a single-player version first). He has also just jumped ship from the windoz desktop experience and ordered a macbook + iPhone, so it looks like I will finally have a partner to pitch in a little bit with some of the iPhone code. Rudi’s programming abilities surpass those of just about everyone I’ve ever known, perhaps mine, so having his support and involvement means a lot.

In terms of gameplay, things are gelling quite nicely. The basic concept hasn’t changed, spells are played out on a 280×280 gameboard, they have attack and defense, and special abilities that are all resolved in a priority stack, so spells with a higher speed resolve first, moving down the list to the slowest spells. Every feature I’ve added that affects combat has been meant to add to the strategic element, while keeping the game still simple and quick. Everything is very visual, so while there is a slight bit of a learning curve, it’s not more than a few minutes before you can learn everything there is to know.

And now, what I know you all want…screenshots!

All things considered, I couldn’t be happier with how Spellwars is coming along. I wish I could move it faster…but I wish for a lot of things, and Spellwars will be ready when it is ready. Hopefully, soon.

If you are interested in getting involved, contact me, there is room for people to contribute at almost all levels. From art, game concepts, playtesting, coding, feedback, and everything in between, if you have the interest, I’ve got room for you. The Spellwars ning group is by invite only, but I am happy to invite anyone who is interested in contributing.

Thanks
R.

Permalink Leave a Comment

R.Code: iPhone SDK tutorials

March 12, 2009 at 1:31 pm (iPhone development) (, , )

I just started writing a new column about programming with the iPhone SDK. It’s called R.Code, and is hosted over at www.tenfingersclub.com, a community site for iPhone game developers and the people who play their games. The first article is incredibly introductory, but it turns out that a lot of people still don’t even know how to get started working on an iPhone application, and still need those same questions answered. So, I thought I’d start my column with a how-to-get-started series of a couple articles, and then I’d jump into the good stuff afterwards.

If you are an iPhone developer, I hope you will follow the column and learn something useful. Please send any and all feedback my way, especially ideas for future articles.

Thanks
R.

Permalink Leave a Comment

Enjoyable vs Competitive Gaming

March 6, 2009 at 7:17 pm (iPhone development) (, , , , , , )

After having just spent a couple hours reads through various game theory web sites and blogs, and almost all of sirlin.net, I’m feeling inspired to write about my approach to developing Spellwars. I want to communicate what kind of gaming experience I am aiming to create, and I’ll start by discussing what the possibilities are.

Types of Gaming

From a certain point of view, one that I happen to share, all gaming (and in particular, all multi-player gaming) can be divided into two categories: enjoyable gaming, and competitive gaming.

Let me clarify a couple things about this statement right off that bat. First, the statement describes the act of playing a game, not the game itself. Certain games naturally lend themselves well to one category or the other, some games easily cover both…and of course quite a lot of games are neither. A few examples of games that are typically played for enjoyment might be World of Warcraft, Diablo II, and any of the myriad of the iPhone mafia games. Yes, there is a degree of PvP competition in all these games, but the driving force of the player engagement and experience is not primarily one of strategic competitiveness.

Second, I am not stating that the two are mutually exclusive. The same game might be played both competitively and for enjoyment, even by the same person at the exact same time, but typically a game is played much differently when it is played competitively than when played primarily for fun.

Types of Games

To explain, lets flip the lens, and look at the games, not the playing.

Consider, for example, Magic:The Gathering…which has an extremely strong following of both casual players, and competitive players. A competitive match is so fundamentally different than a casual, fun game of Magic that the two experiences barely resemble each other. But, it is important that the game supports both types of playing, and does so very well. A competitive game is not necessarily any better or worse than a casual game. The game of Magic can be enjoyed in both capacities, they are just different types of experiences.

On the other hand, there are a certain group of games are pretty much meaningless if not played competitively. Consider for example, Texas Hold’em poker. If you aren’t playing for money, even if it’s fake, there is really nothing interesting at all about playing. The entire draw of the game is all in the competition, the reading other players, calculating the relative values of cards, and the probabilities of outcomes. Chess and Go are two other games, that while they can be played “for fun,” they loose their essential quality and meaning when done so. For the sake of easy reference, I will call this type of game a “pure competitive game.”

The last group, included just for the sake of completeness, are those games that really don’t lend themselves well to any sort of meaningful competitive playing. Some games are just not designed to be played competitively (consider the bulk of World of Warcraft outside of the minimal PvP aspect), but the fact is that most multi-player games do aspire to competitive play. That’s usually the point of making the game multi-player.

Typically, the single major feature that any game in this category lacks is balance. A balanced game is what allows for two players to engage in a competitive battle that is fun and interesting for both sides. When one side is too powerful, there is no competition, there is just domination. It turns out, for those of you not actively engaged in game theory or game design, that creating a well balanced game is incredibly difficult. Add the other real world game requirements, that a game also be fun and engaging, and it’s not too hard to see why most games fall short.

Now, I am no game theory purist. I am interested in creating a game that is, at it’s core, an enjoyable experience. I do happen to believe however, that a well balanced game that can be played competitively adds an element of depth that provides a level of fun and enjoyment that can not be attained by games which ignore the element of balance. I believe that games which support both a casual, fun experience, as well as a deep, balanced, competitive experience offer the best of both worlds, and are the very best type of game.

And that is exactly what I am gunning for with Spellwars.

I do not want to create a pure competitive game, of the type where the game is only competitive, and not fun for the game itself. These pure competitive games tend to actually be played out as merely meta-games, without much of an interesting game left when you are done meta-gaming.

What the hell do I mean by that?

Consider what playing pure competitive games at the highest level actually consists of. I’ve done this with M:TG, and I’ve spent enough time researching game theory and AI that I know the same applies to Go, Chess, and yes even competitive RoShamBo. Basically, the actual mechanics of playing the game become secondary to analyzing the meta-game, that is studying the competitive strategies that other players might possibly use, and then constructing your strategy, be it your deck, your chess opening, or your programmed AI, based on your analysis of the competitive landscape. The actual playing out of the game, once it comes time to play a match, becomes a distant second to the work put in at the meta-gaming level.

For the RoShamBo example, the game itself is so trivial and boring that no one actually plays it. But is it a game that is played competitively? Apparently so. And can you actually apply strategy to it? Yep, you can. Check out this program, Iocaine Powder, which slaughtered the competition in that initial RoShamBo competition. Coming across this really drove home two main points to me:

1. Competitive gaming has nothing to do with gaming, it is all about meta-gaming
2. I want Spellwars to be a fun game, as well as a fun competitive game (i.e. meta-game). But primarily, I want it to be fun to play.

I’m here to create a game, and if it results in an interesting meta-game, hot damn. I am paying very specific attention to the game design to make sure it is balanced and has the ability to support competitive play. I want to encourage people to collect spells and construct spellbooks that can win them a tournament (yes I plan to run tournaments). But I think it’s more important, first and foremost, that the game be engaging and fun on its own.

To me, this means that I will put effort and resources into developing the parts of the game that have nothing to do with the competitive part of the game. These are areas like creating beautiful art, developing storylines and characters, creating rare and limited editions of spells, making strong and powerful items and spells that are fun to find and use. (I personally feel that enabling personal expression through the game is the most important feature for Spellwars, but more on that in a future post.)

So in summary, today I learned that I want to create a game that allows for competitive play, but not at the cost of enjoyable play.

I’d love to hear what you think, these are the types of topics that can drive game designers crazy. For me, it’s what inspires me to keep going…to make that game, the one that does it all better than any other game has done it before. And for the iPhone, right now there’s no competition to speak of. I want to set the standard.

Thanks
R.

Permalink 3 Comments

My life as an independent developer

March 2, 2009 at 10:35 pm (iPhone development) (, , , , )

For today’s blog post, I am going to point to a post I wrote earlier today for another blog titled My indie life: R.Cloud Software. In it, I describe what it’s like to be an independent developer, and I include pictures of me and where I work. It also has some nice discussions of Spellwars that I haven’t really posted anywhere else as of yet, so if you are following the progress of my game, I encourage you to give it a read.

I wrote the article for a brand new site called tenfingersclub. They are building a community where indie game developers can connect with gamers who appreciate and support indie games. As an independent game developer myself, I can appreciate the goal of the site…I think it’s a great concept, and I hope it does well. Indie developers of any type are at an inherent disadvantage when it comes to gaining exposure, so any extra chance, any tools or communities that help give indie developers exposure is a worthy effort in my book.

Thanks
R.

Permalink Leave a Comment

Observer pattern in Objective-C: NSNotificationCenter

February 27, 2009 at 12:59 pm (iPhone development) (, , , )

I want to take a moment and thank the thoughtful developers at Apple (technically NextStep probably, but whatever) for the wonderfully simple, and elegantly powerful NSNotificationCenter. I won’t bother going over the API, there’s already many great blog posts on that (my favorite is here), but I wanted to raise awareness of it, and talk about how I’m using it in Spellwars…as well as discuss the potential pitfalls of abusing an event-based architecture.

The basic premise of the Broadcaster/Observer pattern is to decouple components, so that events can be fired and handled without everyone having to know about everyone else. This allows, for example, pieces of the UI (in my case, information labels that display stats of the selected spell) to update when a Spell is selected by the user, but the Spell objects don’t have to have explicit links back to the UI components. They just fire off their event (SpellSelected) and the UI controllers can listen for that event, then update the labels. It makes for a very clean implementation when done correctly.

When I finally got around to refactoring my super-hacky direct method invokations for this particular use case, I was able to remove 80% of the related code, and remove 90% of the complexity. Requiring back-pointers all over the code was making me nauseous. I was just about to implement my own solution when I came across several blog posts referring to said NSNotificationCenter, and once I saw the super-simple 3 method API I knew it was exactly the way to go. Nuff said.

Now, I will warn against going too far down the Broadcaster/Observer path, commonly called an Event-driven architecture, because I’ve seen it abused to the point of making code completely incoherent and impossible to understand or debug. Events are a natural way to pass information between unrelated objects, but between related objects, just invoke the methods directly. It more precisely expresses your intention as a code designer, and it also more precisely executes your intention.

At a startup I worked with over a year ago that shall remained unnamed, they were using Flex to build several web applications. Flex has a very well developed Event architecture, made even better by the Cairngorm micro-architecture. The problem with the product that the company was developing, is that they used Events for everything, absolutely everything. There were basically no direct method invocations on any objects, even when you naturally had the target object already in scope, and it was a child or some other natural relationship. This meant that every time flow control has to pass from one object to another, it required a listener to be added, an event to be defined, said event to be fired, and said listener to then be removed after. If that flow didn’t look obviously wrong to anyone else in the company, there’s nothing I could say to help them. It was such an absurd abomination I just didn’t even know where to begin.

I pretty much decided to begin by finding a new job.

Anyway, there was this one bug where some previous employee of the company had left a big nasty ball of mud with some problem in it, and because of the number of events fired, and the ability for multiple objects to respond to any event, it was just impractical to figure out what was going on, much less track down the problem.

Lesson: Just because you can, it doesn’t mean you should. Like all engineering tools, apply with discretion.

Permalink 2 Comments

First Screenshots of project “Spellwars”

February 24, 2009 at 3:05 pm (iPhone development, spellwars) (, , , )

That’s right, I’ve got some pretty pictures. They’re actually not all that pretty, graphic designer I am not, but they get the point across. I am hoping to generate some interest in the community out there (that means you), if the project looks interesting to you drop me a line: I’m looking for people to work with me.

So lets get to the game. A basic description of what I have right now, is a simple 2-player spell combat game. The game resolves on a board, not unlike battleship, on which players take turns playing spells from their hand, not unlike Magic: The Gathering. A battle starts off looking like this:

Getting ready to start a duel

Seriously, do forgive the lack of design. Anyway, once you tap start, combat begins and you are presented with the spells in your hand, and you then choose one to play:

Choosing a Spell

After you choose your spell, it is placed in the middle of the board. You can then drag your spells around anywhere on the board, before you decide to continue. Once you’ve placed your spells where you want them, tap Turn, and the combat engine will resolve the turn.

Turn 2

It should be noted, the goal of a battle is to reduced your opponent’s HP to 0, by dealing damage through your spells. Each player starts with a certain number of HP, based on other things in the game that have yet to be fully implemented, so for today we’ll say both players get, oh, 50 HP. Sounds good.

Spells interact based on their location on the board, and their area of effect, visualized by the colored circle around the icon. Some spells have a large area, some are smaller…the value of each is different, depending on what your are trying to accomplish with a given spell. Typically a spell will be either serving in attack, defense, or support…potentially all of the above.

Each turn, the spells on the board resolve on a stack, with individual spell speed determining the order of spell resolution. There is no “your turn” or “other person’s turn,” it all happens at once. If 2 spells overlap, the active spell does damage to the “defending” spell, if the spell’s defense is reduced to 0 it is destroyed.

Resolved Combat

Spells in your hand are pulled from your active set, currently called a Book. Think of the deck concept in any CCG, same thing. Each turn, you draw a single spell. Each turn, you can play a single spell. Combat continues until one person runs out of HP. I am tailoring the gameplay so a single game can be played in no more than a minute, probably something like 30 seconds for a single duel vs the CPU. I figure that is about the amount of attention span most iPhone users have, most of the time. The app starts up in about 2 seconds, so you can easily play a game or 3 while waiting in line at starbucks.

Where do the spells come from? Basically, the rest of the game. Which is really the bulk of the game. I’m working on that part next. I envision a multiplayer world, somewhat like lootwars, but with unique places to visit and custom challenges…my version of instanced dungeons vis-a-vis World of Warcraft or Diablo II. My vision is that a big part of the fun of the game is in hunting down and finding rare and unique spells to build up your collection, and to have fun and powerful spells to duel with. You can bet there will be hard to find spells, spell sets, spell combines, limited editions, etc. I know that balancing the supply of items in an economy like this becomes of paramount importance, it’s at the top of my list for things to design very, very carefully. Digital economy, here I come.

On Motivations and Background

I started this project because I found a real void in the iPhone game world of solid multi-player games with deep, compelling game mechanics. Lootwars is by far the most well-designed MMO-ish game I’ve played, but it leaves me feeling so un-fulfilled, wanting so much more. I’ve been gaming for 20 years, and what first pulled my interest was the Rolemaster/MERP games in the mid 80s. Those games had such deep game mechanics that I almost never was able to get past just working through all the tables and numbers…and I loved it! The few game sessions we had as kids were fun, and I knew that one day a computer game implementation of something like that could make for an incredibly compelling engagement. I’m starting to feel the tips of that now.

Later, in the mid 90s, I again got sucked into a simlar game with similarly deep mechanics, Magic: The Gathering. From playing in small towns, to bigger tournaments with large prizes, to the million dollar Pro Tour, I spent enough time playing Magic to gain a real deep respect for the engagement power of a delicately balanced game. The guys at WotC work very hard to make sure Magic stays fun and balanced, even with the influx of hundreds of cards and dozens of new game mechanics a year.

These are what inspire me, and what drive me to create this game. The iPhone deserves it’s own game for gamers, by gamers. I want to make something that is appealing to a broad base of people, there’s no sense in catering solely to hardcore players, but that also has a deep set of interactions and fun things to do, that you can spend as much or as little time as you want, and still find more of the game to explore. I know it’s not easy, but I’m up for the challenge. And I’m looking for others who are like-minded. I can’t do this alone, it’ll take both partners and a supportive community. If you want to play a part, you know where to find me.

Thanks
R.

Permalink 5 Comments

Staying Grounded

February 21, 2009 at 10:30 pm (Business, iPhone development)

So, having just poured all the juice from my claypot chicken dinner right into the keyboard of my macbook, I’m left with about a 50% functioning keyboard, and at least a good 12 hours, probably more like 6 days or so, where I’m not going to get much iPhone programming done. I thought I’d write about something more broad than iPhone SDK implementation details tonight. I’m going to talk about business, specifically my business.

My company, R.Cloud LLC, is just about 2 months old right now and business is good. I will take this opportunity to note that yes, I am available for new clients right now, if you are interested please get in touch with me. iPhone development hasn’t significantly changed since the iTunes store opened, it’s still a wild, wild world without much to grasp onto. You have to stay grounded in your own confidence, or else you will end up getting swept away in the maelstrom of data that spews out of the iTunes store. Top 10 lists. App review blogs. 4000 people a day on craigslist looking to “share the revenue” with you, if you will just choose them out of the infinite pool of ideas. (if you don’t understand why it doesn’t work, start with this article, and if that isn’t enough just keep randomly clicking on links off that page until you figure it out or get bored) There’s a shitstorm of directions to look, it’s worse than daytrading currency futures.

What keeps me grounded? My partner for one. I know without having a partner, I’d be screwed. Even if Steve, my business partner and artist, is at least as much of a lost-in-the-clouds kind of guy as I am, having another person to keep you focused and honest is priceless. I wish I had more partners, people who live locally, to work closely with on a daily basis. As much as I may work well with my existing partner, he lives in LA and I live in San Francisco…and that arrangement just doesn’t work out for me too well. Not enough throwing ideas around the room.

I can’t stress this enough, even just when talking to myself. Get a damn partner. A mentor is fine even. But at least one other human being (to whom you are not married) to work with. Please stop developing in a void, no matter how good you think your ideas are.

I know that as my apps progress, especially the game I’m working on, I’m going to want to bring in more resources. There’s only so much any one person can do, and I’m starting to reach that limit. I am familiar with the start-up world, but being on the other side of the fence really changes your perspective. This is the first time it’s my idea, my baby, don’t fuck it up you tools. Will I manage to find the right magical mix of people, personalities, skills, and money? Will I figure out how to really leverage my own abilities and channel what I want through the people I choose to work with? Or will I find myself burning through sweat and money, and end up having to do everything myself anyway?

We’ll see.

I’m confident.

R.

Permalink Leave a Comment

Collision detection between circles

February 19, 2009 at 9:21 pm (iPhone development, Uncategorized) (, , , , )

Collision detection can be a little difficult with complex paths like arbitrary bezier objects.  But when the two objects are circles?  piece of cake! Find the center of each circle, then compare the distance between them. If that is less than the sum of the two radii, they collide.

The calculation is from high school geometry, and yes most of you have forgotten it. As apparently, did I. You probably recognize this:

x^2 + y^2 = z^2

and you might even remember what it applies to. When programming on the iPhone, we have x and y in coordinates from the UIView. When making the comparison between the above mentioned distance between points and radii, it’s easier to compare the squares of the respective z values, so we don’t have to compute 2 unnecessary and expensive square roots.

So anyway, I implement said solution, and go about my business. Over the next week or so, I notice that my collision detection is a little bit inaccurate. Not a lot, but a little. One night I decide I’m going to get it pixel perfect, since I should be able to pretty easily.

A few hours later, I give up and call in my wife. You see, she actually does this kind of math all day, every day. Well, not all day every day, but on a regular basis, every week. She’s a structural engineer, and they have to do calcs to make sure your house doesn’t fall over because of an over-imaginative and under-detail-oriented architect.

It turns out, I made a small…tiny mistake in how I formed the final equation. Rather than squaring the sum of the two radii, I squared each one separately, then added them together. That is:

I wrote:

rad_1^2 + rad_2^2

correct:

(rad_1 + rad_2)^2

Very easy to do in code, so watch out for it. It’s a nasty little bug to track down, because the inaccuracy changes based on the size of the circles…which varies in my app.

The final code I ended up with is below:

-(bool)collisionDetect:(DragView*)otherView
{
CGRect m_frame = [self frame];
CGRect o_frame = [otherView frame];

float m_rad = m_frame.size.width / 2;
float o_rad = o_frame.size.width / 2;

CGPoint m_center = m_frame.origin;
m_center.x += m_rad;
m_center.y += m_rad;

CGPoint o_center = o_frame.origin;
o_center.x += o_rad;
o_center.y += o_rad;

CGPoint dt;
dt.x = m_center.x – o_center.x;
dt.y = m_center.y – o_center.y;

float x_sq = dt.x * dt.x;
float y_sq = dt.y * dt.y;

// this is wrong, I screwed up the original calculation
//float mrad_sq = m_rad * m_rad;
//float orad_sq = o_rad * o_rad;

float rad_sq = (o_rad + m_rad) * (o_rad + m_rad);

return (rad_sq) > (x_sq + y_sq);
}

R.

Permalink 1 Comment

iPhone SDK: The price of logging

February 18, 2009 at 5:48 am (iPhone development) (, , , , , )

While working on a few run-throughs of my currently in-development iPhone game, I came across a performance issue.  When I started playing, the game was pretty zippy…but with each turn it would continue to get slower.  And not just a little slower, a lot slower.  At first a turn might take .2 seconds or so, but by turn 6 or 7 it was up to around 4 seconds to process a turn.  What was going on?  Why am I bothering to share this with the world?

It turns out that the logging was updating a UITextView for each NSLog call, so that a player could tap on a tab and see all the results of the computer resolving all the spells.  Once there is more than one or two spells in play, a single turn could contain maybe 25-30 logging calls.  Each call would copy the whole text out of the UITextView control, append a line to it, then set the text value.  This became incredibly cpu intensive, and was slowing down the app way more than I would have ever imagined.  The instrument panel showed me everything.

system load with unbuffered logging

I was really horrified at how long a single UITextView.text = @”really long multiline multiparagraph log-like string” line can take.  It seems to me that one of the most common use cases is to append text to a control, so being forced to copy the text out, append to it, then copy it back in is really slow and painful.  Is there not a better way?  really?  It’s 2009, do I need to write this kind of control buffering myself?  Apparently, yes.

And it’s worth noting, this only became apparent while running and debugging the app on a device.  The performance issue never really showed up in the simulator, and even once I identified it, the simulator was useless even with the instrument panel.  As much as I love the simulator, and I really do, for performance work don’t waste your time.

So, the solution?  I went with the simple and obvious: create a buffered log.  I only update the LogView when I commit the buffer, while the NSLog calls still go to the console immediately.  Works like a champ!

system load with buffered logging

R.

Permalink Leave a Comment

Creating a multiplayer iPhone game

February 15, 2009 at 11:00 pm (iPhone development) (, , )

I’ve been recently working on a new iPhone game, something to fill the void that is lacking in multi-player, collectible creature/card/spell/something, that semi-mmo feel you get from mixing Magic:The Gathering with Lootwars, Diablo II, World of Warcraft, an iPhone, and 20 years of gaming. It all starts to come out in a big heaping pile of…something, lots of great ideas and no focus. I’ve always felt my job as an engineer was to “fight entropy,” a phrase my old co-worker Matt came up with over a decade ago, and it sure fits…especially when working on a new project. I’ve got so much personal history in the gaming world, how could the ideas *not* come out all at once?

It’s coming along well, and a public beta will be available shortly I hope. I’ll be posting screenshots and game mechanics along the way.

R.

Permalink Leave a Comment