Adam Howitt's Blog

Apr 09
2010

Apple is Doing the Right Thing Blocking Flash

I just read Joa Ebert's theoretical conversation parodying the move by Apple to block Flash code-generation tools and thought I'd repost my argument here. The argument is that Apple is being petty or childish by preventing developers from using code generation tools to develop apps.

I think the author and the flash devs who agree are selfishly angry. They think this is a move to block them and make things harder for THEM but it's not about being childish. It's about a track record, mobile development and maintaining the reputation of the app ecosystem.

Track Record.

I (and many of my mac cohorts) have seen Flash spike CPU on brand new hardware with fast processors and 8GB RAM so how will my poor little iPhone perform? Sure there is an argument that enabling flash on the devices reduces the demand for native apps but hybrid apps and jQuery are all options now but the native apps continue to flourish.

Mobile Development.

How big is your SWF? For every flash developer who knows that an optimized lightweight SWF loads faster there are hundreds who build and deploy massive SWF files that take a lot longer to load even on broadband, let alone filtering that through AT&T's "reliable" network. From a user experience if I wander onto a page with a bloated flash movie I risk crashing my device or at least locking up my bandwidth.

Code generation.

I've been a ColdFusion developer for over 10 years and have written code generation apps from scratch but always with the understanding it gets me 80% of the way there even when I'm generating ColdFusion apps! Imagine the idea of trying to write codegen in one language for another?!

It took me over 200 hours of development to release the first version of WalkJogRun Running Routes - and another 200 for each subsequent release. It's just that hard.

If the developers using the generated code don't learn Objective C it puts pressure on the review process. Just to correct the point in the blog post - review time is less than a week and has been for some time with my record turnaround at 3 days recently. Starting with this 80% code developers either never submit because they can't get it working or do submit it and have multiple app rejections because they don't understand why it breaks.

A plethora of CS5 generated apps could therefore put a huge strain on the review resources based on these multiple rejections. Even if an app sneaks through the likelyhood of an app continuing to crash would threaten the reputation of the developer and the app store.

A solution.

I think that if Adobe would be willing to sponsor the addition of a team of Apple Appstore reviewers dedicated to apps built with Adobe's codegen tools the situation would be very different. It's easy for Adobe to say their tools would be perfect but until they pay the salaries of the review team it's hard to accept responsibility for the consequences of their actions.

Jan 19
2010

Run your ass off this year!

After another 200 hour programming marathon spread over 4 months I'm thrilled to announce the release of version 3 of WalkJogRun's iPhone App "WalkJogRun Running Routes".

What does it do?

The most significant change version 2 was the addition of 23 training plans created by Coach Jenny Hadfield of Runners World fame. Once you sign up for a training plan and pick a start date you'll get alerts every morning at 6am (silent so they don't wake you) to tell you how far to run, how fast and give you motivation. Tap the find routes button to find a training route in your neighborhood from the 600,000 routes at WalkJogRun.net

What if I've never run before?

We've got plans for beginners, intermediate and advanced runners including one called "Run your first 5k" designed to take you from the sofa to being able to run a 5k race in 10 weeks. We've also got 10k training plans, half marathon training plans and full marathon training plans.

Gimme the nerdy stuff

The programs themselves are delivered as in-app purchases using the StoreKit framework on the device to process payments and then send receipts to the ColdFusion server to register the subscription and begin delivery of the alerts.

The alerts are delivered as Apple Push Notifications generated by ColdFusion. No mean feat I can tell you using Java in ColdFusion to connect to a streaming data socket to send and receive the bytes and then drop the encoded JSON packets off on your phone. The phone gets the alert, opens the app and takes you to the training session for the day to show you your training tip.

Download a copy of "WalkJogRun Running Routes" before it gets too late!

Dec 31
2009

Affiliate Link Shortening for Profit

Coupon Cabin just launched their latest offering yesterday in the world of affiliate marketing called Dealfer.com so you make commissions on the sales you generate at participating merchants. It's a clever idea and leverages their relationships with affiliate merchants to help you make money.

Why would I need a short URL?

If you're not hip to the URL shortening jive yet it has a couple of benefits. The first is that shorter URLs are easier for people to type in and they fit on business cards, in books or promotional materials nicely. Dealfer.com links become http://dlfr.me/xxx where xxx represents a string of characters used to find your link and expand it when someone clicks. Being so short they also use less characters on a webpage or the most common use in twitter where you're limited to just 140 characters.

The second big reason for URL shortening is that marketers can track how many clicks a link in a certain place received. For example if you tweet a link using dealfer you'll be able to see how many clicks it got on twitter. Some URL shortening services, like bit.ly, even offer stats so that even if your link get's copied and repurposed anywhere like on someone's blog you'll know about it.

Online marketing is easier to monitor than offline marketing traditionally because when someone types in your home page URL into their browser you have no idea where they saw it or heard it, be it on the side of a bus or on the radio but by using a link shortening service you bring traditional marketing back into the ring. The downside is that you're marketing a link that doesn't look like your home page - dlfr.me - but at least it's memorable "deal for me", with the exception of the string part that follows!

Why not use bit.ly?

True, the links are one character shorter and the stats breakout the referral sources but Dealfer wins out in my mind because if I'm linking to a merchant they support I'll get a commission for a sale vs bit.ly links where I won't. Commissions range up to 15% which could help turn a hobby blog into a paying venture.

How does it work?

Just like every other URL shortening service but you get paid! The first way to use it is that any time you want to shorten a URL just go to Dealfer.com and paste in the URL. If you're not logged in it will ask you to login, create an account or if you just need a short URL you can skip registration and get the short URL.

When you register you give them a PayPal account to receive funds for any commissions you make. Not every link is going to result in commissions but their list of merchants broken out by commission level could inspire you to promote products in the 15% tier! If you link to a merchant not on the list or a site that doesn't monetize you'll get your short URL and can track the number of clicks but the real magic happens when you link to a supported merchant. Chances are if you get 100 clicks to a merchant you'll end up with a sale, especially if it's something your peers would be interested. You can either link to the top level domain name or deep link to a specific product.

Any top tips?

They have a bookmarklet you can drag onto your bookmarks to make it easier to generate links while you shop. Basically if you're on a product page for something you think your friends would like you can hit the bookmarklet and it pops up a window to give you a dealfer link to use when you're done shopping. You don't have to worry about whether it's on the participating merchant list or not - you'll still get a link you can share. If it is, it's a bonus.

I would recommend looking at the merchant list shown by commission percentage to see what to expect from each merchant. Some only offer 1% of a sale and others offer 15%. Familiarize yourself with the sites so you know that if you have a choice between linking to something at site A vs site B (a participating merchant) you don't miss any opportunities.

Lastly, think about where you are sharing your links. If your blog is about Adobe products then linking to Adobe makes perfect sense. Try to put your readers one click away from the purchase instead of just linking to the merchant home page. For example a long blog post about Adobe ColdFusion would deserve a link write down to the ColdFusion product info/purchasing/trial page.

Until the stats are broken out at Dealfer by referrer you can at least create different links for the different places where you wish to use a link to a site. For example in an ad in the newspaper you might use one link and for a twitter promotion another. Even though they both point at the same place you get to see how many people "clicked" each. (The quotes because if they type it in after seeing it offline they are still tracked as a click).

Think about opportunities to promote specific products as you wander around the web. If you're in a forum about the latest nike running shoe and you know one of the featured merchants has a sale on that product or is the cheapest, "dealfer a link" instead of just linking to the store directly and you'll still get commissions on whatever sells. Even on facebook or linked in where people are asking for product recommendations. If it's truly a great product you believe in and a reputable store it will sell and you'll get the credit.

Future developments

I'd like to see this service incorporated into some of the big twitter applications like cotweet.com and Twitterific or Tweet Deck. The advantage for developers is that until the account holder enters their own login for Dealfer into the application, the developers would be credited with commissions generated by links. I shudder to think how many links per day the average twitter app sends!

Another feature I'd like to see is a list of the merchants listed by the highest conversion rates and/or revenue generated per click. This type of breakout could help potential linkers find the stores that, while they may offer excellent commissions, rarely convert visitors into sales. Dodging the dogs could lead to a really profitable linking hobby!

Conclusion

Go create an account at Dealfer.com, grab the bookmarklet or their toolbar and stop before you think about recommending a product next time and "deafer a link" instead.

Oct 06
2009

Find a ColdFusion Framework

Looking to mine my readership for information about ColdFusion Frameworks. I'm working on a site redesign for a high profile, high traffic site and we're looking to select a framework. Which frameworks have you used and what do you like/dislike about them?

We're not going to be using the ORM capabilities so we're really looking for something that adds little page execution time overheads, little memory footprint but something that makes reuse easy, adds a commonsense directory structure and provides some sort of caching.

Sep 19
2009

Working with Dates and Date offsets in iPhone Development

It's been a slow iPhone development week partly because I'm in the peak week of my marathon training but the main reason is that the work I did was pretty frustrating so it put me off doing more until today.

When is a date not a date?

When it's a datetime, silly. Working with dates in iPhone means you work with the misleading named class NSDate which not only stores a date and a time but the timezone data too. That little caveat aside I can dive into my issue dujour.

I'm building a UITableView where the groups are the week numbers and the cells are the days within those weeks calculated from a start date for the whole table. So if the start date is Monday September 21st 2009, the first section header is "week 1" and the first cell is Monday September 21st 2009.

The week section is easy to calculate:

NSUInteger section = [indexPath section];
NSUInteger row = [indexPath row];
NSUInteger currentWeek = section+1;

Next up is the calculation for the first cell. It should be easy right? The first cell of week 1 represents 0 weeks after the start date for the tableview and 0 days after the start, so our formula for dayOffset:

NSUInteger dayOffset = (section-1)*7+rows;

So day 1 of week 1 has a dayOffset of 0, day 1 of week 2 has a dayOffset of 7 etc. All that remains is to add the dayOffset to my startDate and I've got the date for the cell.

The challenge isn't finishing - starting is the hardest part

Working with an NSDate object my first instinct was to look at the NSDate class and find a function to add a set number of days to a date and found that there is only the function addTimeInterval:
- (id)addTimeInterval:(NSTimeInterval)seconds;
That's seconds for those of you who missed the nuance. So it appears I have to turn my dayOffsets into seconds before I can add them to a start date. Fine.
NSUInteger secondsOffset = dayOffset*24*60*60;

First a quick side-bar. As I mentioned earlier, I'm passing in a date, not a date time so I set my date formatter object to parse MM/dd/yy dates (where MM is 2 digit month vs mm which is 2 digit minutes).

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"MM/dd/yy"];
NSDate *frDate = [df dateFromString:[tableSourceFile objectForKey:@"startDate"]];
NSLog(@"%@",[frDate description]);
The NSLog confirms that my date "09/21/09" has now become "2009-09-21 00:00:00 -0500". This seems like a reasonable summary, I guess :-)

I added my dayOffset to my date:

NSDate *cellDate = [frDate addTimeInterval:secondsOffset];
and then as I drag down through my UITableView I see it all unfold perfectly. Wait. Everything is fine but on Sunday November 1st 2009 instead of ticking over in Week 7 Day 1 to Monday November 2nd 2009 I get Sunday November 1st 2009 again. WTF?

I'm a little embarrassed at the hour and a half of bashing my head against this, double checking my start date, my logic, my days to seconds calculations, NSLogging out every variable involved to the log. It seems the first November 1st is "2009-11-01 00:00:00 -0500" and the second is "2009-11-01 23:00:00 -0600". A timezone switch? I plead late night development insanity on this but eagle-eyed wide-awake super-designer Jeff spots that it's not a change in timezone but the change in daylight savings time.

So turning days into seconds becomes nuts if you cross DST boundaries. To workaround this I have the bright idea to pass in noon as part of my start date because if the date shifts by 1 hour either way it still remains the same day:

NSDateFormatter *df = [[NSDateFormatter alloc] init];
//Change dateformatter to look for time
[df setDateFormat:@"MM/dd/yy HH:mm"];
NSDate *frDate = [df dateFromString:[tableSourceFile objectForKey:@"startDate"]];
//Correctly writes out "2009-09-21 12:00:00 -0500"
NSLog(@"%@",[frDate description]);
//Now do the addition:
NSDate *cellDate = [frDate addTimeInterval:secondsOffset];

I've created... a monster!

It works! By setting the time as noon I've got it working but I have a nagging feeling I'm missing something obviously simpler. It's close to midnight so I wrap up and leave for the night kicking myself for missing the obvious.

The next morning I pull up the docs and start digging around again looking in forums for date manipulations. I'm not sure of the exact path to enlightenment but I find the "Date and Time Programming Guide for Cocoa" and, more importantly, the section "Calendrical Calculations".

It *appears* that by using NSDateComponents to build an offset and NSCalendar to specify a basis for the calculations I can add the offset in days to a date based on the gregorian calendar. Since I'm adding days not seconds I wonder if this will avoid the issue I jammed thru.

Pressure creates diamonds

I didn't have time until this morning to test my theory so I sat down and plugged at it earlier.
//Create my dateformatter object
NSDateFormatter *df = [[NSDateFormatter alloc] init];
//Change dateformatter back to date only
[df setDateFormat:@"MM/dd/yy"];
NSDate *frDate = [df dateFromString:[tableSourceFile objectForKey:@"startDate"]];
//NSLog confirms my date"2009-09-21 00:00:00 -0500"
NSLog(@"%@",[frDate description]);
//Create an offset object
NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
//Pass in our offset in days
[offsetComponents setDay:(section*7)+row];
//Select a calendar for the calculations
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
//With the gregorian calendar add my offset object to the start date
NSDate *cellDate = [gregorian dateByAddingComponents:offsetComponents toDate:frDate options:0];
//Release the offset and the calendar
[offsetComponents release];
[gregorian release];
Week 1 Day looks fine and dandy "2009-09-21 00:00:00 -0500", what about the mysterious DST cutover on Week 6 day 7? "2009-11-01 00:00:00 -0500" and then Week 7 Day 1: "2009-11-02 00:00:00 -0600". It behaves the way I expected so when I output my date to the UITableViewCell textLabel I get the day and can ignore the time:
//Display 3 character day of week, 2 digit day and 3 character month e.g. Mon, 21 Sep
[df setDateFormat:@"EEE, dd MMM"];
cell.textLabel.text = [edf stringFromDate:today];
Voila. 3 hours of development time to add a number of days to a date because my first instinct was such a wild goose chase. I've emailed the iPhone docs team to let them know that it would be great to add the link to the section on "Calendar Calculations" to the addTimeInterval method detail since, IMHO, it's the first place a new iPhone/cocoa developer would think to look.

I hope this helps someone else dodge the bullet and let me know if there are typos/errors/omissions in the code since typing in anger like this rarely reproduces perfect code! Have a great weekend.

Sep 08
2009

Testing iPhone StoreKit purchases

I spent a significant amount of time troubleshooting the iPhone StoreKit framework for our WalkJogRun iPhone app this weekend. I finally discovered that the documentation was slightly misleading after discovering a post on the Apple developer forums.

I had followed the StoreKit developer guide for testing which instructs you to 1. Create an account in iTunes Connect 2. Go to the Store Settings app and sign out 3. Sign in as your test account 4. Go to your app and test the purchase process

The problem comes at step 3 when you sign in. You are typically (but not consistently) told that the login has never been used in the App Store before so you'll need to review your details, which begins an account mini-interview to pick a country and enter credit card details. If you go anywhere near this process, you'll not be able to use the account when you go to your app and finally login with a series of different alerts, mainly "Your Password has Changed" or confirm your billing info.

The solution, I discovered from an Apple forum post by "Kuga", is NOT to sign in once you logout of your real account - instead just go straight to your app after you sign out in the Store Settings and use the in-app login.

Note that if you ran into the "your password has changed" error you'll find that it's damn near impossible (I couldn't work it out) how to turn an account you completed an interview for back into an account you can use for testing.

Country Specific Testing Notes

Instead of hard coding pricing into your app, if you've followed the store kit programming guide you'll pull the pricing and descriptions from iTunes Connect but initially pricing is shown in the country you were using before you logged out in the store settings.

Ben Gottlieb, author of the awesome Crosswords and Satchel iphone apps, gave me a great tip at the last NSCoder night here in Chicago for in app purchase accounts - if you use gmail you can create "throwaway aliases" to use when creating users, since each email account you use must be a unique email address that has never been used for testing and not an existing apple id. So, for example, if your email address was aardvark@gmail.com you can create fake aliases with the "+ syntax" so I would create a test user "aardvark+itcUS@gmail.com" for a US iTunes Connect test user account. The +itcUS gets ignored by Google and the email related to that account still goes into gmail for the aardvark@gmail.com account. It saves you creating a ton of email accounts for testing.

If you've created a test user for the same country as your regular account you'll have no trouble finalizing your purchase. If you've chosen a store in another country for your test user you'll be told initially that your account is only valid for that country store and you're unable to finish your purchase. This is a good thing!

Close your application and go to the store settings and you should see that you are actually logged in with that new test account for a different country. Close the store settings and reopen your app. At the point where pricing info is shown you should now see it localized to the test user country and you can complete the purchase in that language. Just be aware that the dialogs will all be in your target language so before you test the Japan store you might want to memorize the order of the buttons :-)

Verifying Receipts

I threw a simple alert in my "provide content" function to give a visual confirmation initially:

- (void) provideContent:(NSString *)productId {
    /* This is where I download the product based on the product Id to store on their phone */
    UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Purchase complete" message:@"Thanks for buying, sucka" delegate:self cancelButtonTitle:@"Done" otherButtonTitles:nil];
    [av show];
    [av release];
}

This is where I'll pull down the actual content if my purchase was successful. Since you should have your server validate receipts before delivering content you need to send the encoded receipt data over http. This piece isn't well documented but a great post on StackOverflow from JDAndrea provides the code necessary to pass the signed receipt by URL to your own server, in that case a PHP box. Since I'm a ColdFusion developer I wrote the following snippet to handle the work:


<cfset stcReceiptSend = structNew() />
<cfset stcReceiptSend["receipt-data"] = url.receipt />
<cfset receipt = serializeJSON(stcReceiptSend)>
<cfhttp method="POST" url="https://sandbox.itunes.apple.com/verifyReceipt">
    <cfhttpparam value="#receipt#" type="XML" />
</cfhttp>
<cftry>
<cfset result = deserializeJSON(cfhttp.filecontent)>
<cfmail from="mytestemail@example.com" to="mytestemail@example.com" subject="iPhone in-app Receipt Verification" type="html">
<cfdump var="#result#">
</cfmail>
<cfif result.status eq "0">
<cfcontent reset="yes"><cfoutput>0</cfoutput>
<cfelse>
<cfcontent reset="yes"><cfoutput>1</cfoutput>
</cfif>
<cfcatch>
<cfcontent reset="yes"><cfoutput>1</cfoutput>
</cfcatch>
</cftry>
It's very simple and just turns the encoded receipt data from your app into a serialized JSON packet which is posted to the itunes sandbox. Note for production releases you'll need to change that url to be the real itunes URL. If the result is a 0 you have a valid itunes transaction and I send an email dumping out the transaction keys to my email for reference before returning a 0 (success) to the code in my iPhone app. Anything other than a 0 in the result.status means something isn't right and you should pass back something other than a 0 to the iPhone app so you don't deliver the content they "unlocked".

That's it for my StoreKit testing summary - hope it helps remove some obstacles I encountered along the way. If you're looking for tips on this stuff I strongly recommend three sites which have proven critical to my forward motion: iPhoneSDK, Apple Discussions and StackOverflow. The iPhone Reference Library is a fourth but that *should* go without saying. I've found it particular useful searching for exact classnames to find the detailed API overview of properties and methods I need.

Sep 04
2009

iPhone Development and an AppStore Wishlist

I've been doing A LOT of iPhone development since Feb 14th of this year and I'm happy to report our iPhone app has been selling well. Much better than the first release which, well, I have to admit, had a beta feel to it. The latest release is far more solid and it's pretty telling in the great reviews we've been getting.

Now that I finally feel like I understand the majority of what I've been doing I'm happy to break the seal on my experiences as a CF developer learning Objective C and playing in Apple's world.

Being crotchety for today though I feel like I have to start with some gripes and a wishlist for the appstore.

Gripes

This morning I woke up to an email from Apple to tell me it's time to renew my Apple Developer subscription fee for iPhone development. It's just $100 I hear you say but since May 5th when our app hit the store, Apple has had it's cut of our revenue as we agreed to the tune of around $2500. Surely they could add a provision that says, if you generate over a certain dollar value we'll waive the renewal fee as thanks for the easy money.

Wishlist for the Appstore

Referral summaries

I'm a nerd and I hate spending money if I can't see the value of my investment. I've submitted feature requests a few times with a few bumps to the iTunes Connect folk to see if they can add some rudimentary analytics.

I do analytics for a living, helping my clients understand if they are getting value for every dollar they spend on marketing. For example if I run an ad in Google AdWords that costs me 10 cents and my app revenue per unit is $2, I have to convert 1 in 20 visitors (5%) to break even and if my conversion rate is better, I'm in the money. Same with facebook ads and any other kind of marketing medium.

The problem with the appstore from a vendor perspective is that although I can send people to the appstore, I only get a raw number once a day of how many sales I made in each country.

The first step for me is for apple to introduce referral URL variables. Instead of just:

http://itunes.com/apps/walkjogrunroutes
I'd like to add a URL variable to track each ad I use:
http://itunes.com/apps/walkjogrunroutes?rf=adwords1234
where adwords1234 represents a code I created to track a specific AdWords ad.

Hell, even one step before that could be a simple examination of the referral URL so they can segment sales by referring site.

If I know how many clicks I paid for in my Google AdWords campaign and how many sales those clicks generated each day, I have my conversion rate. Presently nothing exists like this.

AppStore conversion rates

This is tied to the previous point but the AppStore is a big black box of mystery. I send people in but have no idea how many times my app page gets viewed per day, how many people went direct to the app, vs searching vs category browsing.

Did they find the app on their iPhone and do those types of visitors convert more readily than computer based browsers? What type of search terms result in the majority of my sales? How many times does a visitor review the app before they buy?

Does anyone else reading this do any iPhone (native) development and have any other ideas for how the AppStore can be improved?

Ugly MySQL tools for Mac AKA I hate Navicat

Seriously. Why should I be handicapped for trying to write SQL on a mac client? I've tried Navicat and hate it with a passion. For an OS that prides itself on pretty interfaces the tools for working with databases I've seen are all really ugly. MySQLYog for PC ain't no oil painting either but it embodies the important pieces of a SQL tool. Here's what I want - if anyone has any tips on tools, paid or free - I don't care:

1. Connection and object browser on the left. Drill down into tables to see column names, indexes, foreign keys, triggers. Navicat inconveniently makes you right click on the table name to view any of these details. When I'm writing a query I don't want to have to open a new tab to show an ugly list of table columns I can't refer to while I'm writing code without switching tabs.

2. SQL Editor windows with a split results pane that doesn't vanish if I edit one piece of a query. Navicat hides the SQL results if you change a query. Seeing sample data as I work on a query REALLY helps, especially since Navicat won't simultaneously show column specs (ref earlier point).

3. Edit stored procedure or views like I just wrote them. In every other SQL client I've used I right click a view or stored procedure to see the SQL stored in the database, preferably formatted. Navicat presents views as one long string of unformatted text and for stored procedures it offers an edit window for the inner section of the procedure but hides the implicit create statement and/or drop statement.

4. Right click ANY object to see a SQL script representing the object.

Is this too much to ask? I've tried running SQLyog in a VM but hate hogging so much memory to run a SQL client, not to mention the fact I routinely have issues authenticating my VM and host machine simultaneously on Starbucks' wi-fi.

Sep 03
2009

Patch the box and upgrade CF8 JRE for stability

When I signed up for a VPS pre-installed with CF8 Enterprise I made the assumption it would be patched for me. Hmph. After a month and a bit of tolerating instability I finally nailed the problem.

[More]

Aug 11
2009

CF8 Server Monitoring alerts oddity

Has anyone used CF8 Server monitoring and seen negative values in the app scope in terms of memory size? I'm getting some peculiar alerts ever few days related to my site adamhowitt.com and don't know where to start. My google foo is weak so I thought I'd throw it out to the crowd.

The server hosts a few sites of mine including this blog and after seeing it hang every now and then I decided to start monitoring alerts (since it's an enterprise box). The alerts that are triggering are that the JVM Memory exceeds 450 MB and the server starts to slow down. When I look at the snapshot it produces and sends me everything looks normal except:

Application Scope Memory Used - -22033448 bytes
[Application Name : Memory Used]
   adamhowitt_site : -22600792 bytes
      [Variable Type : Variable Name : Size]
      CFC : ham : 113168 bytes
      STRUCT : stcservice : 8976 bytes
      STRUCT : stcresource : 6584 bytes
      ARRAY : restypesorted : 448 bytes
      STRUCT : stcresourcetypes : 216 bytes
      STRUCT : stcservicemap : 176 bytes
      68FB39AB-1CBF-0773-47DEBE569016FA50 : strresources : 112 bytes
      68FA822E-1CBF-0773-47CA40FAA0CD3F5A : strportfolio : 112 bytes
      68FABC5A-1CBF-0773-47FF8F2DE5691EB2 : strservices : 112 bytes
      C:\xxx\xxxx\xxx\xx\ : hamroot : 112 bytes

The part that concerns me is the -22,033,448 bytes (or -22 MB) of app scope memory. It's consistently this app and I've looked over my code without success.

I realize the topic narrows my potential audience down to a few people that use alerts but I'd love to work this out. It seems like the continued growth of the JVM memory used on the box is directly tied to this app and the incorrect memory report. Is it a leak? Any help GREATLY appreciated!

More Entries