SOAP Client for OSX
SOAP Client is a really handy tool when working with SOAP APIs on OSX. It was originally available for download at ditchnet.org. However, the version available there doesn't work properly in newer versions of OSX (Snow Leopard and up, I think). It was open sourced awhile back, but I haven't been able to find a binary of it hosted anywhere, so I've built it and put the .app binary on GitHub. [Read More]Developing Native iOS Apps with the Force.com Mobile SDK
This is a link to the session I did with Josh Birk at CloudStock 2012 in San Francisco. Native iPhone and iPad applications offer a rich user experience and flexible design options that make them a compelling choice of many developers. The Mobile SDK provides a framework for rapidly developing native iOS apps that integrate securely with the Force.com API. This session will show you how to get started with the Mobile SDK and will highlight tips and tricks and some best practices for developing native iOS applications learned during the development of the 'Salesforce for iPad' application. [Read More]Application Development with Android
This is a link to my Dreamforce 2011 session on Application Development with Android. Mobile application development sure is a hot topic these days, and the Android platform is gaining fast, especially with new tablet formats. Every mobile app needs a robust, secure, and capable database. So this coding session will walk you through creating an application on the Android platform by leveraging the power of Database.com. We'll give you all the details you need to begin participating in the hottest segment of cloud development. [Read More]Moving the Cloud - HTML5 and CSS3 on Node.js
Moving the Cloud is an experiment in using HTML5 and CSS3 technologies and Node.js. It was also an experiment on using Node.js on the Cedar stack in Heroku, but that didn't quite work out as expected (more on that later). It's also an Easter egg on the Model Metrics Homepage. Click on the animated 1s and 0s down in the bottom left corner of the screen to get to it.And... if you want, fork the source over on GitHub. The readme.md file there gives some information on how to get it set up.
I was asked to put together a temporary (it'll probably be around for a few months) artsy installation piece for the Art of Code section on modelmetrics.com. Going into the project, I wanted to do a social media visualization because, well, I think they're cool. Some of my favorite examples are Twistori.com and Vizeddit - they visualize Twitter and Reddit respectively.
Moving the Cloud uses Node.js to pull tweets containing some keywords like "Cloud", "Salesforce", "Social", "Mobile", or "Model Metrics" from the Twitter Streaming API and stream them to clients using websockets. They move across the screen right to left, sort of like a cloud - GET IT? (nudge nudge wink wink)? [Read More]
Private Cloudwashing - No Innovation? Duh...
David Linthicum's June 2012 post over at InfoWorldmakes an interesting argument that "innovation is in scarce supply" in cloud computing. He mentions that companies are either just copying what Amazon is doing with Amazon Web Services (Rackspace, I guess) or rebranding the same old virtualization offerings in an attempt at "private cloudwashing" - just polishing the turd of existing private virtualization offerings. I love the "private cloudwashing" term, but how surprising is it that he hasn't found innovation in that space? "Hey guys! I've looked all over the desert, and I just can't find any water!" [Read More]Painless Mobile App Development Webinar
Gartner predicts that by 2015, mobile app projects will outnumber PC app projects 4-to-1. Learn how to quickly build and efficiently maintain native mobile apps that scale on-demand by powering them with cloud technology. We presented this webinar June 2012 on "Painless Mobile App Development" [Read More]Fluid Mobile HTML5 Design and Development
In the world of print publication, laying out a design starts with a canvas that has a known height and width. If an agency is putting together an advertisement for a magazine, and they know that they are (hypothetically) designing for a page that is 8 inches wide and 10 inches high, assuming a standard 300 dpi, a designer can start off by creating a 2400×3000 pixel canvas. That designer can then move on to laying out the advertisement with pixel-perfect accuracy knowing full well that the magazine stands very little chance of changing size or shape after it has been printed. If an image or a block of text needs to be moved to the left by 2 pixels, it is as simple as moving that element over 2 pixels. The world of mobile development isn't quite that cut and dry. [Read More]Codesign: Re-Signing an IPA between Apple accounts
Since much of the iOS development work we do is for clients who are developing apps to distribute internally with an In House Mobile Provisioning Profile using their Enterprise Distribution Certificates, and not all of them want to share those files outside of their organization, we frequently need a way to send them the IPA file built with our own Apple account, and have them re-sign it to use their own. This process can also be used, for instance, to test the final App Store Distribution build before sending it to iTunes Connect by resigning a copy of it from an App Store Distribution profile to an Ad Hoc one or to update an .ipa file from an In House profile with a certificate that is about to expire (they expire every year) to a new one without having to rebuild the app from the source. [Read More]Developer's First Look at Windows 8 Metro
With all the recent buzz around Windows 8 RT for ARM and the Metro interface, I wanted to do a bit of a first-look at developing for the Windows 8 Metro interface. To get started, I thought I'd take a look at getting the Windows 8 Consumer Preview installed on an actual tablet, so I picked up this Acer Iconica Tab, which comes with Windows 7 preinstalled. Getting Windows 8 installed on it wasn't too hard... You'll need to burn the Windows 8 .iso file to a DVD, and then plug in an external DVD drive. You'll then need to enter BIOS setup to alter the boot order so that it finds the USB DVD drive: [Read More]Storing Data Offline with Salesforce Mobile SDK SmartStore
Say you're writing a "hybrid" mobile app for iOS and Android using PhoneGap ("Callback" or "Cordova") and you want to store data locally. Your choices are kind of limited. You could, for instance, use WebSQL, which has been implemented in WebKit for a while now and is available on both iOS and Android devices. If you clicked that link, though, you'll probably notice the big scary warning that WebSQL has been deprecated... [Read More]Using XMLHttpRequest2 in iOS 5 or Android OS 3 to download binary files using HTML5/Phonegap
One of the things added to Safari and UIWebView in iOS5 is support for XMLHttpRequest 2, which according to W3C adds new features "such as cross-origin requests, progress events, and the handling of byte streams for both sending and receiving". As part of the last bit of that, it's now possible to set the responseType to arraybuffer, which is "used to represent a generic, fixed-length binary data buffer". More info here. This is useful if you want to download binary such as image or audio data from a remote location, and potentially manipulate it before presenting it to the user. [Read More]oAuth 2.0 for Salesforce.com
At this point in time, we've implemented the oAuth 2.0 User-Agent flow and the Refresh Token flow for iOS, Android, and Flex/AS3. I figure that makes us as much an expert at doing this as anybody, so I thought I'd take a moment to describe some of the details. First off, the reason you want to use oAuth 2.0 when developing apps for mobile devices... no token. We've been developing mobile apps for Salesforce.com for the last 4 or so years, and the need to provide a username, password, and token has always been a pain point. Since it's a 24 character alpha-numeric string, this was especially problematic back before iPhones had copy/paste functionality ("is that a l, an I or a 1?"). With oAuth 2.0, you can finally get rid of having to worry about the token. [Read More]Setting Up and Using DiffDog for Salesforce.com Deployment Validation
There are a few different ways to deploy metadata from org to org with Salesforce.com. The three main options are to use Eclipse, to use Ant (the "Force.com Migration Tool"), or to use Change Sets. The first two are completely manual to set up (although Ant, obviously, is able to be run over and over again). Change Sets have a lot of promise, because they do handy things like searching for dependencies, but as of this writing, they are still prone to missing important bits, especially with profiles, so you can't rely on them to produce a perfect deploy from one org to another. Consequently, it's important to be able to quickly validate that a deployment was successful, and that everything that you meant to deploy from one org to another actually did get deployed. [Read More]The day the cloud stood still. Lessons learned roundup...
The well-publisized outage of EBS on multiple availability zones in the US-EAST-1 Region of AWS last week kicked off some excellent blog posts from companies who, through robust architectural choices, managed to weather the storm quite well. It lasted five days, it's been called the worst cloud computing disaster ever, and Amazon's communications strategy didn't exactly shine, but it has presented an opportunity to learn from the companies that are hosting their sites on the AWS cloud better than many of their peers. [Read More]It's Not Broken. You're Just Doing It Wrong.
Okay, so the title is a bit harsh. I was intrigued by the rather excellent post over at the blog Il y a du thé renversé au bord de la table, [Rant] Web development is just broken. Yoric makes the argument that web developers are forced to deal with too many "nightmares" that have very little to do with programming. First you have to decide on a programming language. Should you use PHP, C#, Java, Ruby, Perl, or Python? Then you have to choose a web server and OS. Windows/IIS or *nix and Apache? OSX? BSD? Solaris? If you go with Linux, which distro do you choose? Is it worth it to pay for Red Hat, or will Fedora do? What about Ubuntu? Then you have to choose a DBMS, of course. Do you want Oracle? Well, can you afford Oracle? Then there's MySQL, SQLServer, or PostgreSQL. Or maybe one of the NoSQL databases like MongoDB, CouchDB, or Cassandra. And then you probably want to choose a server-side framework. Rails? Spring? Zend? And a client-side framework, of course, so you don't have to worry too much about all the differences between the JS engines in each different browser. JQuery? Prototype? Scriptaculous? [Read More]iOS Enterprise MDM Configuration Capabilities
Thought I'd put together an easy to reference list of the various things that can be configured by an enterprise Mobile Device Management administrator for iOS: [Read More]Some Thoughts on Gamification
There seems to be a lot of industry buzz lately around the concept of "gamification", and the idea is basically one of applying game mechanics to the world of business to motivate employees or customers. Bunchball has done a really nice job with their Gamification 101 white paper of illustrating how gamification can work in a variety of circumstances, and why you should be using it in your business. It's a good read, and a good place to get started learning the concepts. Some examples of gamification that they give are frequent flyer programs, where customers earn points and "level up" to different statuses over time, and Starbucks' use of the Foursquare to check in and win "trophies or badges". Another good resource is the Gamification Encyclopedia at Gamification.org. [Read More]Cloud to Cloud: Using AWS Simple Email Service from Force.com
Amazon released a really interesting service not too long ago called Simple Email Service (SES). It allows you to send individual or bulk emails without having to rely on your own mail servers. This is important because sending (legitimate) mass emails while staying off spam blacklists like Spamhaus is no simple task, and you don't want all of your company emails to start being blocked by ISPs that subscribe to those blacklists. If you have all of your customer data in Salesforce.com, you'll be able to email some of them with Salesforce's standard email capabilities, but they have pretty strict governor limits (1,000 emails per SFDC License) when it comes to sending external emails, so mass emailing is often not a possibility without a third-party provider. [Read More]Importing a Flex 3 AIR project into Flash Builder 4
I had some issues over the weekend trying to import an Flex Builder 3 AIR project into Flash Builder 4. This post gives a good description of how it is supposed to work, and I assume that it does work for Flex web projects, but it didn't work for me with an AIR project. Every time I imported the AIR project, Flash Builder 4 interpreted it as a Flex Web project, so of course it didn't actually build. I was migrating from an OSX Flex Builder 3 to a Windows Flash Builder 4, so that may also have been an issue, I'm not sure. [Read More]OSX Firefox Flex/Flash redraw bug workaround
There's a known redraw bug in the OSX version of the Firefox Flash Player plugin that's pretty irritating. If you do something that causes too many redraw events to get called in quick succession, Flash will fail to redraw the screen properly, and you end up with a mish-mash of phantom objects on the screen. This happens most commonly with older versions of SWFAddress, but can also happen if you have a canvas with a scrollbar on it, and you scroll up and down rapidly. [Read More]Setting up automated testing in Flex SDK 3.3.0
Automated testing tools like FlexMonkey, RIATest, and QTP in Flex require you to add a few .swc files from Adobe to the compiler arguments in order to run. This is easy enough to set up in the project settings, but if you try to do this in version 3.3.0 of the Flex SDK, the first thing that you'll notice is that these three files are not included in the 3.3.0 SDK distribution. [Read More]Force.com Flex Toolkit AIRConnection updates
We've been working more and more with Adobe AIR and Salesforce.com recently, and as such we've been putting the AIRConnection class through its paces, fixing bugs and adding functionality along the way. Here are a few of the modifications we've made, and why. [Read More]Clang! Powerful Memory Profiling for the iPhone
I'll start by saying that Clang is a must-have tool for every iPhone developer. It's easy to use, and it does a fantastic job of profiling the memory usage of your apps. The iPhone is a powerful hand-held device, but the memory constraints are tight enough that they can cause serious problems with application performance. With 128 MB of memory on board, other applications running in the background, and a virtual memory model that does not include swap space, it's easy to run out of memory and crash an app. [Read More]iPhone Programming: Adding a Contact to the iPhone Address Book
Adding a contact to the iPhone's address book isn't horribly complicated, but it's not the most straightforward process in the world, either, because the documentation leaves a bit to be desired. There is an Address Book Programming Guide published by Apple, but at 28 pages, it feels a bit bloated when you're just trying to quickly figure out a simple process like this, and somewhat ironically, the "Creating a New Person" section is less than a page, and doesn't go into much detail. The XCode documentation is helpful, but it still takes some effort to put all the pieces together, so this is basically just a walk-through of the process of creating a new contact, and adding some common fields to it. [Read More]Lessons for the Beginning iPhone Developer
Getting started with iPhone development can be an intense process. If you're not coming from the world of OSX development, you're probably more familiar with the myriad languages that look more like C++ than Smalltalk, and you have a lot of new syntactical things to learn, with square-brackets in abundance. It can be easy to focus completely on learning the syntax of Objective-C, and forget that the iPhone is a device with more severe limits on resources than computers, and that you will ultimately have to get your app approved by Apple before you can distribute it, so you need to follow their guidelines to the letter. [Read More]Installing a Whole-House Powered Humidifier without a Sail Switch
I recently purchased and installed a Honeywell HE360A Whole House Powered Humidifier along with the Installation Kit which comes with pretty much everything you need to install the humidifier. The installation kit is handy, and comes with a very helpful DVD, but at over $60, it is also kind of pricey. After taking one look at the sail switch, which accounts for most of the cost of the installation kit, I knew there must be a better way to do the installation. [Read More]Eclipse IDE Irritations
Eclipse is a great free IDE, but it has some persistent annoyances that bug the hell out of me... [Read More]Review: Zoom H4 Digital Audio Recorder
I bought an H4 shortly after they came out. Overall, the H4 is a nice budget portable recorder that is small enough to carry with you anywhere. The sound is better than I expected for the money. It does have some problems, though: [Read More]Android: Custom Spinners
This tutorial shows how to replace the default Spinner graphics in a Google Android application. [Read More]Android: Custom Buttons
Buttons in Android have three states: normal, focused, and pressed. Each of these states has its own 9.png file, stored in android.jar, and you can easily use your own graphics if you decide you don't like the default Android Orange. I love orange a much as the next guy...probably more, but come on, it just doesn't go with everything. If you want to have a custom UI, you're going to want to figure out how to get rid of the orange highlights. So, here's how to do it. [Read More]Android: Common Tasks
This is a list of things that are easy to do in Google Android, but are sometimes not entirely obvious. [Read More]MP3 Encoding, 16 bit , 24 bit, or 32 bit?
I've had a number of people tell me that it's best to feed an MP3 encoder--like LAME--24 or 32 bit audio files (i.e. don't dither down to 16 bit first). The rationale behind this is that it "allows the encoder to have the most accurate picture of the audio signal so that it can generate the best MP3 data". The problem is that when you're encoding the file, you have no idea what bit rate the decoder or audio interface might support. [Read More]Flash: A better sortOn() function
The Array.sortOn() function in ActionScript 2 and ActionScript 3 has a bug in it that causes you to be unable to use it to sort on Object properties that use a Getter function rather than a native property...Getting around this isn't too hard, you just have to make your own sortOn prototype. [Read More]Rendering Isometric Tiles in Blender 3D
Isometric projection is a method of efficiently faking a third-person overhead-camera 3D plane within a 2D plane. Since squares are drawn compressed with 90° angles drawn at 120° or 60° depending on the corner, and all of the lines representing each dimension are parallel, it's possible to use 2D sprite-based tiling and animation in a game that looks 3D-ish without having to do any actual 3D calculations. The drawback is that objects in the game do not appear to get smaller or larger as they move closer or farther away. This can lead to idiosyncrasies of the sort exploited in the works of M. C. Escher. [Read More]PHP: Replace "Smart Quotes" and other high-bit characters
Simple PHP function to replace all of the high-bit characters that cause problems, especially with RSS feeds and XML parsing. [Read More]Actionscript 3: Extra Timer Callback Parameters
I've seen this request mentioned in a fair number of forums: people want to be able to pass their own parameters to Timer callback function. Seems logical. You're calling a function, so of course you want to be able to pass in parameters. The problem is that, unlike the old setInterval method, there isn't any obvious way to pass in parameters to either the Timer class or the TimerEvent class. In Actionscript 2.0, you could use setInterval, which has optional extra parameters specified in the constructor. [Read More]OSC between Max/MSP and SC3
This is a quick and dirty tutorial that shows exactly how to communicate between Max/MSP and SuperCollider 3 with Open Sound Control (OSC). This could be useful for a number of things. If you want to use SC3, but would like to be able to do video processing with Jitter, for instance. Or, if you want to write a patch in SC3, but design an interface for it in Max. [Read More]SC3: Flash and OSC
Example files for connecting Flash and OSC together for use with SuperCollider 3. [Read More]SC3 Tank Reverb (JMC)
Excellent sounding reverb, courtesy JMC [Read More]Search SC3 Code Script
This is a simple perl script which can be run to search through the text of the Supercollider 3 Help files, or through your own collection of Supercollider .rtf files, looking for a specified character string. This is helpful, say if you'd like to know which Help files deal with, say, "EnvGen", or "SynthDef". It's also helpful if you want to find that bit of code that you wrote 6 months ago that had something to do with a "reverb" unit, or something like that. [Read More]JPEG to WAV Converter
Here's a little program which will convert an image in JPEG form into an audio file. [Read More]SC3 808 Kick Drum
An 808-style kick drum for SuperCollider 3. [Read More]SC3 Markov Chain
An Example markov chain SynthDef [Read More]SC3 Pulse Train
One possible way to implement a pulse-train in SuperCollider 3. [Read More]Roland XP-80 Device XML for Cubase SX3
This is a Cubase XML set up file for a Roland XP-80. It just contains patch names, none of the editing palettes or anything like that. Also, the User bank has the names of my patches, so you'll have to change those to fit your User bank patches. Still, it also contains the patch names for the other 4 banks, so it's better than nothing. [Read More]







