<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>The Archer Group</title>
	<atom:link href="http://www.archer-group.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.archer-group.com</link>
	<description>Setting Ideas Free</description>
	<lastBuildDate>Thu, 11 Mar 2010 20:07:24 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Security for the Cloud</title>
		<link>http://www.archer-group.com/development/security-for-the-cloud</link>
		<comments>http://www.archer-group.com/development/security-for-the-cloud#comments</comments>
		<pubDate>Thu, 11 Mar 2010 20:04:17 +0000</pubDate>
		<dc:creator>Dennis Egen</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.archer-group.com/?p=1148</guid>
		<description><![CDATA[Board rooms and server rooms across the country are struggling with the question &#8220;How do I ensure security in the cloud?&#8221; An increasingly common scenario: The business wants to add new functionality and tech has found a way to provide that functionality at a fraction of the cost by utilizing a service offered in the [...]]]></description>
			<content:encoded><![CDATA[<p>Board rooms and server rooms across the country are struggling with the question &#8220;How do I ensure security in the cloud?&#8221; An increasingly common scenario: The business wants to add new functionality and tech has found a way to provide that functionality at a fraction of the cost by utilizing a service offered in the &#8216;cloud&#8217;. What&#8217;s a compliance officer to do? The answer may lie in the latest attempt to bring order to this frontier:</p>
<blockquote><p><a href="cloudcomputing.sys-con.com/node/1304657" target="_blank">Trusted Cloud Initiative Kicks Off </a>— Novell and the year-old non-profit Cloud Security Alliance (CSA) have announced a vendor-neutral Trusted Cloud Initiative to develop a consensus-based identity management reference model and third-party certification criteria for cloud providers. They say a trusted standard should alleviate the concerns about security, governance and control of their data and IT assets that organizations considering adopting cloud-based computing may have. It was Novell’s idea and Novell has identity management interests. The certification criteria, seal and roadmap will be defined by CSA members, which represent a cross-section of stakeholders, end-user organizations, cloud service, SaaS and technology providers and include Novell, of course, Microsoft, Dell, Rackspace, Qualys, HP, Intel, Cisco, McAfee, ISACA, DMTF and Symantec, as well as individual representatives from Global 2000 organizations and the world’s governments.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.archer-group.com/development/security-for-the-cloud/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SXSW Advice Good for All of Us</title>
		<link>http://www.archer-group.com/social-marketing/sxsw-advice-good-for-all-of-us</link>
		<comments>http://www.archer-group.com/social-marketing/sxsw-advice-good-for-all-of-us#comments</comments>
		<pubDate>Thu, 11 Mar 2010 19:36:14 +0000</pubDate>
		<dc:creator>Lee Mikles</dc:creator>
				<category><![CDATA[Social Marketing]]></category>

		<guid isPermaLink="false">http://www.archer-group.com/?p=1143</guid>
		<description><![CDATA[I’m joining thousands of others for a weekend of music, learning and fun.
Message to SXSW &#8211; Please be gentle &#8211; It’s my first time.
In addition to trying to figure out what to pack so I look cool but am not cold, I’m reading all the guides from those who have gone before me. The overriding [...]]]></description>
			<content:encoded><![CDATA[<div>I’m joining thousands of others for a weekend of music, learning and fun.</div>
<div>Message to SXSW &#8211; Please be gentle &#8211; It’s my first time.</div>
<div>In addition to trying to figure out what to pack so I look cool but am not cold, I’m reading all the guides from those who have gone before me. The overriding theme, you will meet tons of neat people, enjoy it.</div>
<div>I’m also updating all the needed apps on my iPhone, charging the battery booster and linking my twitter account with cool services that will tell you if your friends are attending the same conferences. Social Media is perfect for SXSW, but SXSW was all about connections before the rise of Social Media.</div>
<div>If anything, SXSW proved as a guidepost for the requirements of being successful in Social Media, as outlined in Ian Schafer’s DigitalNext Blog “<a href="http://adage.com/digitalnext/article?article_id=142740">10 Ways to Not Be a Jerk at SXSW</a>.” Marketers looking to succeed in social marketing need to follow many of the same rules.</div>
<div>Some examples:</div>
<div>“Don&#8217;t post every Foursquare/Gowalla/Hotpotato check-in/update to Facebook and/or Twitter.” &#8211; Marketers need to make sure that they aren’t over commenting to their ‘fans’ and followers, or risk losing them forever.</div>
<div>“You&#8217;re not a celebrity. You may be internet-famous, but the people at SXSW Film are famous-famous. When worlds collide, remember which one you are.” When you attempt to insert your brand into your consumer’s conversations, don’t act like they should automatically be listening to you. You need to earn their trust and loyalty over time, by showing them value, one tweet at a time.</div>
<div>and my favorite</div>
<div>“Do not bring up UT basketball while you&#8217;re down there this year.” Marketers need to listen first and tailor the conversations as a result. Pre-packaged rah rah advertising material will fall flat. People want to know you are listening.</div>
<p>Reading Ian’s post is good for all of us, whether we are going to SXSW or not. Now I’ve got to go unpack all of my shorts and cowboy boots <img src='http://www.archer-group.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.archer-group.com/social-marketing/sxsw-advice-good-for-all-of-us/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>It&#8217;s Not All About You</title>
		<link>http://www.archer-group.com/strategy/its-not-all-about-you</link>
		<comments>http://www.archer-group.com/strategy/its-not-all-about-you#comments</comments>
		<pubDate>Thu, 11 Mar 2010 17:41:48 +0000</pubDate>
		<dc:creator>Patrick Callahan</dc:creator>
				<category><![CDATA[Social Marketing]]></category>
		<category><![CDATA[Strategy]]></category>

		<guid isPermaLink="false">http://www.archer-group.com/?p=1140</guid>
		<description><![CDATA[I&#8217;m excited about heading to SxSW this weekend &#8211; and I know I am probably on a few people&#8217;s (namely my wife&#8217;s) hate list for doing so. This will be my first one &#8211; and already I feel that I am overwhelmed. I&#8217;ve been turning to Twitter, Facebook, Foursquare, and a bunch of places to [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m excited about heading to <a href="http://www.sxsw.com/">SxSW</a> this weekend &#8211; and I know I am probably on a few people&#8217;s (namely my wife&#8217;s) hate list for doing so. This will be my first one &#8211; and already I feel that I am overwhelmed. I&#8217;ve been turning to Twitter, Facebook, Foursquare, and a bunch of places to get some advice on what to see, how to act, and how the rest of my colleagues can get something out of this event as well.</p>
<p>Some of the best advice just landed in my in-box a few minutes ago from AdAge which I thought was not only good for SxSW &#8211; but for businesses using social in general &#8211; &#8220;<a href="http://adage.com/digitalnext/article?article_id=142740">10 Ways to Not Be a Jerk at SXSW</a>&#8220;. One of the recommendations:</p>
<p style="text-align: left">&#8220;<em>Don&#8217;t post every Foursquare/Gowalla/Hotpotato check-in/update to Facebook and/or Twitter. Normally, it&#8217;s marginally useful. But no one not at SXSW cares if you&#8217;re in Conference Room 9ABCD, Ballroom D or Exhibit Hall 1. Use the app to follow people and see where they&#8217;re at. Don&#8217;t give your family, friends, and co-workers another reason to digitally silence you. That &#8220;which Jonas Brother are you&#8221; quiz you just sent all of them on Facebook is reason enough.&#8221;</em></p>
<p>Great advice not only for the conference &#8211; but for those venturing out into the social world with their business or organization. It follows the principle &#8220;Forget &#8220;marketing to&#8221; — &#8220;interacting with&#8221; is the new black. We are moving from a ‘marketing to’ (or clubbing consumers over the head senselessly in 30-second intervals) approach, to a conversational, ‘interacting with’ approach. In the old days, you might win over consumers based on the strength of your marketing message. But, this is no longer the case. Traditional marketing isn’t going away—no advertising outlet has disappeared, from AM radio to TV. However, consumers are now wanting and expecting to participate in the conversation.</p>
<p>When I get into an &#8211; umhh..discussion&#8230; with my dad about Social Marketing &#8211; he is always starts out by asking &#8220;Why would I want to tweet about walking up the stairs? Who cares?&#8221;. My response is always the same &#8211; &#8220;You woudn&#8217;t, and No One&#8221;. Perhaps he should ask &#8220;Why would I want to engage in a conversation with someone?&#8221; Now that would be a good start.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.archer-group.com/strategy/its-not-all-about-you/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Businesses move from “Tell me about your trip” to “Tell the world about your trip”</title>
		<link>http://www.archer-group.com/strategy/businesses-move-from-%e2%80%9ctell-me-about-your-trip%e2%80%9d-to-%e2%80%9ctell-the-world-about-your-trip%e2%80%9d</link>
		<comments>http://www.archer-group.com/strategy/businesses-move-from-%e2%80%9ctell-me-about-your-trip%e2%80%9d-to-%e2%80%9ctell-the-world-about-your-trip%e2%80%9d#comments</comments>
		<pubDate>Tue, 02 Mar 2010 15:26:14 +0000</pubDate>
		<dc:creator>Lee Mikles</dc:creator>
				<category><![CDATA[Social Marketing]]></category>
		<category><![CDATA[Strategy]]></category>

		<guid isPermaLink="false">http://www.archer-group.com/?p=1136</guid>
		<description><![CDATA[I recently left my snowy surroundings for a trip to sunny Mexico for a long awaited vacation. The trip was fantastic, and thanks to reading a ton of reviews on Trip Advisor and other travel sites, we knew what to ask for and what to watch out for, if anything.
Authentic reviews from previous guests played [...]]]></description>
			<content:encoded><![CDATA[<p>I recently left my snowy surroundings for a trip to sunny Mexico for a long awaited vacation. The trip was fantastic, and thanks to reading a ton of reviews on Trip Advisor and other travel sites, we knew what to ask for and what to watch out for, if anything.</p>
<p>Authentic reviews from previous guests played a major factor in our location choice, leaving the resort’s websites to almost an afterthought. We wanted to see pictures of real rooms with real families taken with real cameras, not glossy, photoshopped versions with models and fisheye lenses to make the room appear bigger than it was.</p>
<p>Throughout the trip, the resort did a great job of measuring customer satisfaction. In our one week there, we were given no less then three short surveys about different aspects of the resort. And they appeared to be listening. After answering ‘not that we can recall’ to ‘Did the chef come out to talk with you during dinner?’, the chef was very visible every night thereafter. Coincidence, maybe? But the resort seemed very interested in making sure we got the right experience.</p>
<p>But is asking those questions enough these days?</p>
<p>This reminded me of another recent trip to Punta Cana. At the conclusion of that trip, we  went around to say our goodbyes and thank yous to the helpful staff. One woman, in her best english, thanked us, and started writing down a web address. She proceeded to hand us a piece of paper and asked us to post our comments online, since that is how her management company reviews her. What URL did she write: www.TripAdivsor.com.</p>
<p>On almost every receipt these days is a request to answer an online survey about your experience. Imagine if instead they asked you to post publicly about your experience?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.archer-group.com/strategy/businesses-move-from-%e2%80%9ctell-me-about-your-trip%e2%80%9d-to-%e2%80%9ctell-the-world-about-your-trip%e2%80%9d/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Man Behind The Wawa Tunes</title>
		<link>http://www.archer-group.com/projects/the-man-behind-the-wawa-tunes</link>
		<comments>http://www.archer-group.com/projects/the-man-behind-the-wawa-tunes#comments</comments>
		<pubDate>Wed, 24 Feb 2010 16:37:40 +0000</pubDate>
		<dc:creator>David Wallin</dc:creator>
				<category><![CDATA[Projects]]></category>

		<guid isPermaLink="false">http://www.archer-group.com/?p=1125</guid>
		<description><![CDATA[Philadelphia Weekly has a great write up on song writer Parry Gripp, who we hooked up with Wawa back in 2008 to do songs for Hoagiefest. We felt Parry was a great fit since he loves to write hilarious songs about food products and great deals. Originally the songs were meant to be background music [...]]]></description>
			<content:encoded><![CDATA[<p>Philadelphia Weekly has a <a href="http://www.philadelphiaweekly.com/music/The-Wawa-Jingle-Guy.html">great write up</a> on song writer Parry Gripp, who we hooked up with Wawa back in 2008 to do songs for Hoagiefest. We felt Parry was a great fit since he loves to write hilarious songs about food products and great deals. Originally the songs were meant to be background music on the website and something fun users could download. Wawa ended up liking the songs so much that they decided to use them on the radio They also asked Parry to do a bunch more the next year for Hoagiefest 2k9. Now you can hardly turn on the TV without hearing a Parry authored tune.</p>
<p>Sound on the web is often something that gets ignored or added as an afterthought. These songs are a great example of how well-done music can be more than just background music. They actually became a key part of the campaign. Parry created songs that embodied the 60&#8217;s feel for the campaign. They were funny, well produced and darn catchy too. Truly something that you wouldn&#8217;t mind sticking on your MP3 player. And kid friendly:</p>
<p><object width="320" height="265"><param name="movie" value="http://www.youtube.com/v/4gEVQR-WfaM&#038;hl=en_US&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/4gEVQR-WfaM&#038;hl=en_US&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="320" height="265"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.archer-group.com/projects/the-man-behind-the-wawa-tunes/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Future Was Then: Micropayments Again</title>
		<link>http://www.archer-group.com/technology/the-future-was-then-micropayments-again</link>
		<comments>http://www.archer-group.com/technology/the-future-was-then-micropayments-again#comments</comments>
		<pubDate>Wed, 24 Feb 2010 15:30:08 +0000</pubDate>
		<dc:creator>Ben Levin</dc:creator>
				<category><![CDATA[Strategy]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.archer-group.com/?p=1120</guid>
		<description><![CDATA[For the 10th time in 2 decades, Wired is harping about "The Future of Money." But if micropayments make so much sense to so many people, why haven't they worked? There are three things standing in the way: Friction, Ubiquity and Fraud. Can anyone surmount them?]]></description>
			<content:encoded><![CDATA[<p>As Facebook begins to rollout a PayPal-driven micropayment system, and various other vendors attempt yet another land-grab on the &#8220;future of money&#8221;, I thought it&#8217;d be helpful to review some of the issues surrounding micropayments.</p>
<p>On the one hand, there are the <a href="http://www.shirky.com/writings/fame_vs_fortune.html">very significant usability issues</a> that must be addressed, but <a href="http://benjablog.com/?p=210">there are various approaches to that</a>.</p>
<p>And while there is some speculation that increasing regulation of the credit card industry, or economizing by consumers hit hard in this recession, will drive people to adopt more micropayment schemes, I think the issues are somewhat more subtle than that.</p>
<p>And I don&#8217;t think credit card companies need to worry.</p>
<p>Until Facebook buys a bank.</p>
<p>Micropayments have a long history of falling flat (the earliest I remember was &#8220;Virtual Coin&#8221;, and I think that was back in 1995.) If you do a Google search for &#8220;Wired future of money&#8221;, there are maybe a dozen articles stretching back close to 20 years. So there have been a lot of attempts, and they run into all the same issues.</p>
<p>Essentially, the problem is this: it takes money to move money.</p>
<p>Granted, that&#8217;s not because the technology is expensive, or that costs scale up with volume: moving $1 between two banks costs about the same as moving $1 billion. The &#8220;problem&#8221; is that there are so many intermediaries who want a cut, albeit small ones.</p>
<p>Any micropayment scheme needs to deal effectively with three challenges:</p>
<ol>
<li> It needs to be low friction (friction defined as the difficulty of moving money from one place to another)</li>
<li> It needs to be ubiquitous (everyone needs to accept it)</li>
<li>It needs to handle fraud effectively</li>
</ol>
<h3>Friction</h3>
<p>There are basically two types of friction in payment systems: ease of use, and transfer costs. Rendering payment (me giving you money) needs to be as simple as possible. That&#8217;s a usability problem, and not very difficult to solve (you need to follow some standard conventions for handling sign-in/authentication, communicating the value of what you are purchasing, and communicating the end of the transaction (the receipt.)</p>
<p>Transfer costs are more difficult: Visa/Mastercard want 3% of every transaction, plus a base fee &#8211; and it&#8217;s this base fee that kills every micropayment platform. If V/MC wants $0.25 per transaction, you&#8217;re not going to do any transactions valued at less than a few dollars. And <em>true</em> micropayments would be dealing in transactions of less than a <em>penny</em> (i.e., 1/10th of a cent to read an article on the WSJ. 1 cent to print it, etc.)</p>
<p>Bank interchange fees come into play there too (that&#8217;s the fee one bank charges another to send money electronically.) Again, these fees are small, but significant to a sub-$1 transaction.</p>
<p>As soon as you try to move lots of small transactions between two banking institutions, you&#8217;re dead in the water. The embedded costs are too high (and the players have no incentive to make them lower. Remember: the cost is not a function of the transaction size, but transaction volume, and the banks prefer it that way.)  So if moving small amounts money between banks is too expensive, what do you do? You try to create your own ecosystem.</p>
<h3>Ubiquity</h3>
<p>What do PayPal, EZPass and SecondLife all have in common?</p>
<p>They are all semi-closed payment ecosystems.</p>
<p>Each one works basically the same way: you deposit &#8220;real&#8221; money from a &#8220;real&#8221; bank into a payment account with the vendor, and you&#8217;re given credits. Sometimes these credits are called &#8220;dollars&#8221;,  and sometimes they are called &#8220;Lindens.&#8221; But they all have the same basic characteristic: they can be exchanged readily, and at a near-zero transaction cost, between any two members of the ecosystem.</p>
<p>Moving money from one account to another at any of these &#8220;banks&#8221; is simply a matter of making a ledger entry. It&#8217;s instantaneous, and involves no other outside intermediary. The intermediary only comes back into play when you try to move money out of the ecosystem, back into the banking system. Notice that PayPal doesn&#8217;t charge the payer to fund a transaction from a credit card or bank account, but *does* charge the recipient. PayPal bakes these &#8220;external&#8221; costs into their internal system transactions, because this opens up their ecosystem to be used by non-members. I don&#8217;t need to have a PayPal account to pay someone with PayPal.  Sadly, however, baking in this external cost makes micropayments impossible. PayPal&#8217;s micropayments fee is 1.9% +$0.05. If I sell a digital good for $0.10, my profit margin (assuming 0 production costs) is only 30%. In the world of digital goods, that&#8217;s shameful.</p>
<p>However, once an ecosystem is ubiquitous enough (oh, say, 500 million to 1 billion users), the ratio of internal-only transactions way outstrips I/O transations (with users outside the ecosystem), and the ecosystem manager can afford to remove the external processing charges from these internal transactions.</p>
<p>Why does this matter? Because no one buys eggs from their bank. Eventually you want your money *out* of the ecosystem, so that you can go use it somewhere that the ecosystem doesn&#8217;t reach. (And forget the argument about &#8220;just putting it on a PayPal debit card&#8221;, and going grocery shopping. That debit card lives in Visa/Mastercard&#8217;s ecosystem, not PayPal&#8217;s.)</p>
<p>So, let&#8217;s assume that you&#8217;ve got a billion users in your system, and they&#8217;re all charging up spending accounts with external funds (for which the funding institutions &#8211; the banks &#8211; charge a small fee, which you decide to eat), and exchanging Credits with each other in 1/10th of a penny increments. And you take 1.5% of each transaction as your fee (that&#8217;s 1/2 what any other merchant card processor charges, and you don&#8217;t even charge a per-transaction flat fee, so hardly anyone notices), and so on every transaction you&#8217;re making  of a penny. Chump change, right?</p>
<p>1 Billion Users * 100 transactions/day * $0.001/transaction * 1.5% =  <strong>$548 million/year in fees</strong>.</p>
<p>Yeah, I think that might be worth exploring. And that&#8217;s assuming that these users spend an average of $0.10/day online within this ecosystem.</p>
<p>OK, you&#8217;ve got $100,000,000/day sloshing around in your ecosystem, which your users have deposited with you, what&#8217;s the problem? They are not going to let you hold on to their &#8220;real&#8221; money for free, so you have to pay interest on those deposits.</p>
<p>And now you are a bank. And that brings with it a host of complications, but it also gets you direct access to the global banking system, which is important if you want to do things like enable cross-border transactions, EFT transfers to other banks, etc. And there&#8217;s lower costs to doing those things, which you pass on to your users.</p>
<h3>Fraud</h3>
<p>I won&#8217;t go into it here in too much detail, except to state this: Visa/Mastercard exist for a host of reasons, and one of the big ones is fraud detection and reduction. Recently I read that about  7 cents of every $100 in credit card transactions is fraudulent, which in the above example means that about $25MM/year is fraudulent. And consider, Visa/Mastercard&#8217;s stats are from an ecosystem where many transactions are done face-to-face, with signature verification, mailing addresses, etc. In the above example ecosystem, there&#8217;s much less in the way of identity verification, so the risk for fraud is higher.</p>
<p>It&#8217;s far from clear whether or not there exist any emerging micropayment ecosystems which will meet these challenges. But I think Facebook at least stands a chance of getting there, because it has three things:</p>
<ul>
<li>Low friction: paying another user in Facebook can be a single button click, or even a wall post: &#8220;Ben pays 1 credit to Patrick&#8221;</li>
<li>High ubiquity: 300MM users and growing, many internationally.</li>
<li>Good leg up on fraud detection: Facebook knows an awful lot more about your identity than even Visa/Mastercard, and given good pattern matching can probably figure out quickly if you&#8217;re setting up a profile as a front.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.archer-group.com/technology/the-future-was-then-micropayments-again/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mimicking Cocoa&#8217;s NSNotificationCenter in Actionscript 3</title>
		<link>http://www.archer-group.com/development/mimicking-cocoas-nsnotificationcenter-in-actionscript-3</link>
		<comments>http://www.archer-group.com/development/mimicking-cocoas-nsnotificationcenter-in-actionscript-3#comments</comments>
		<pubDate>Tue, 23 Feb 2010 21:13:36 +0000</pubDate>
		<dc:creator>Steve High</dc:creator>
				<category><![CDATA[Behind the Scenes]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Objective C]]></category>

		<guid isPermaLink="false">http://www.archer-group.com/?p=1092</guid>
		<description><![CDATA[I&#8217;ve been semi-covertly developing an Adobe AIR app that interfaces with Harvest.  At Archer, we use Harvest pretty extensively.
Like most software platforms, Harvest offers a public (RESTful) API that tinkerers can tap into at will.  This allows for the independent creation of client-side widgets of all shapes and sizes, and generally aids the longevity of [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been semi-covertly developing an Adobe AIR app that interfaces with <a href="http://www.getharvest.com/" target="_blank">Harvest</a>.  At Archer, we use Harvest pretty extensively.</p>
<p>Like most software platforms, Harvest offers a public (RESTful) API that tinkerers can tap into at will.  This allows for the independent creation of client-side widgets of all shapes and sizes, and generally aids the longevity of the service-driven app.  This Harvest client will essentially be &#8216;Harvest on steroids&#8217;, because I will be adding some additional functionality that I find lacking with the web component&#8230;functionality you can only really get with a rich app that can be broken out of the browser and run in the background like a good little daemon.</p>
<p>To do this, I decided that AIR will be the platform of choice for a few compelling reasons:</p>
<ol>
<li>I wanted to learn the platform, including the ins and outs of AS3 and FlashBuilder (still in Beta, but will eventually replace FlexBuilder)</li>
<li>I like AIR&#8217;s portability across platforms</li>
<li>I didnt want to write this in Java</li>
</ol>
<p>I&#8217;ve spent the better part of the last two years developing for the iPhone.  For those out there that don&#8217;t know, native iPhone apps are generally written in Objective-C (Cocoa), which is kind of a hybrid of ANSI-C and SmallTalk.  For most developers in the &#8216;traditional&#8217; world of OOP (C-family of languages), Cocoa can be confusing at first.  The very concepts we were taught in our Comp Sci classes are altered slightly with Cocoa.  It is probably analogous to a Spaniard hearing Portuguese for the first time.  Everything looks familiar&#8230;but it&#8217;s different.  That&#8217;s Cocoa.</p>
<p>Of all the things Cocoa offers, I think the NSNotificationCenter (from the Foundation framework) is definitely one of the best.  It saves developers the frustration of writing low-level event handlers for everything that needs to use them.  In Cocoa, the NSNotificationCenter lives as a Singleton (sharedNotificationCenter), although you could spawn another one if you really need it.</p>
<p>I guess the biggest convenience that NSNotificationCenter provides in Cocoa development is the global messaging registry.  Using it allows you to essentially create informal contracts between various objects in your code.  These contracts are completely arbitrary as they are defined by you, the developer.</p>
<p>In my brief experience with Actionscript 3, Ive had to do a lot of things that call for asynchronous operations, both for performance as well as user experience.  Traditionally in AS3, you would create a subclass of EventDispatcher to handle such events.  To the EventDispatcher, you can add event listeners like so:</p>
<div style="color: #100;background-color: #f9f9f9;border: 1px solid silver;margin: 0 0 1.5em -9em;overflow: auto">

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #339966; font-weight: bold;">function</span> mousedOver<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">MouseEvent</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span> <span style="color: #000000;">&#123;</span>
 <span style="color: #009900;">//  do something to indicate the mouseover event</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #339966; font-weight: bold;">function</span> mousedOut<span style="color: #000000;">&#40;</span>myevent<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">MouseEvent</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span> <span style="color: #000000;">&#123;</span>
 <span style="color: #009900;">// do something to indicate the mouse out event</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
myDispatcher.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">MouseEvent</span>.<span style="color: #004993;">MOUSE_OVER</span>, mousedOver<span style="color: #000000;">&#41;</span>;
myDispatcher.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">MouseEvent</span>.<span style="color: #004993;">MOUSE_OUT</span>, mousedOut<span style="color: #000000;">&#41;</span>;</pre></td></tr></table></div>

</div>
<p>This is all well and good.  For a quick and dirty script, this is probably the optimal solution.  However, there are some limitations to this implementation.  First of all, the <em>myDispatcher</em> object must be able to handle <em>MouseEvent</em> events.  This enforces a tight coupling of the events to be captured and the objects that need to handle them.  Again, for smaller applications, this is generally fine.  For larger applications, the effort to manage these event dispatches grows quickly.</p>
<p>In Cocoa, UI-level objects have a similar mechanism for event handling by declaring and binding selectors, either programmatically or by creating IBOutlets in Interface Builder.  Another event handling strategy in Cocoa is the use of Key-Value Observing (KVO), which instructs an object to spy on a property of another object.  Then there&#8217;s the NSNotificationCenter.</p>
<p>In layman&#8217;s terms, the NSNotificationCenter acts as a switchboard.  A listener object tells the switchboard &#8216;<em>hey, I would like you to tell me when you intercept the message XYZ</em>&#8216;.  A variation of this message that&#8217;s important here is &#8216;<em>hey, I would like you to tell me when you intercept the message XYZ, but only when object A is the sender</em>&#8216;.  Unlike AS3&#8217;s EventDispatcher, the listener object does not need to be &#8216;hardwired&#8217; to listen for a specific event type.  In AS3 event handling, an object that doesn&#8217;t know how to handle MouseEvent events wont do anything if they receive them. What&#8217;s more, even if the listener object could intercept MouseEvent events, it has no say who the sender could be.  The runtime in AIR/Flash dictates when messages are received.  A NotificationCenter grants the developer that cherished 30,000-foot view of the state of at least one aspect of their code.  If adopted globally, the NotificationCenter will be the <strong>only</strong> object receiving and delegating messages.  The receiver doesn&#8217;t necessarily need to know who the sender was.</p>
<p>Luckily, AS3 provides some key objects and functionality that make the implementation of a true NotificationCenter very straightforward.  The first object is the good ol&#8217; Dictionary.  The Dictionary, again in layman&#8217;s terms, is a means to make objects point to other objects.  These objects can be anything in AS3, including functions.  This is one of Actionscript&#8217;s major strengths, in my opinion.  The other AS3 goodie that makes a NotificationCenter possible is the ability to treat functions as objects.  Languages that do not do this tend to require the developer to perform some code gymnastics using reflection &#8211; a costly mess in even the most robust implementations.  The last piece that makes the NotificationCenter possible is the rest operator (&#8230;).  This allows for the passing around of arbitrary data.</p>
<p>And now to the implementation</p>
<div style="color: #100;background-color: #f9f9f9;border: 1px solid silver;margin: 0 0 1.5em -9em;overflow: auto">

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #9900cc; font-weight: bold;">package</span> com.archergroup.util
<span style="color: #000000;">&#123;</span>
    <span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.utils</span>.<span style="color: #004993;">Dictionary</span>;
&nbsp;
    <span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #9900cc; font-weight: bold;">class</span> NotificationCenter
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0033ff; font-weight: bold;">private</span> static <span style="color: #6699cc; font-weight: bold;">var</span> _weakKeys<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Boolean</span> = <span style="color: #0033ff; font-weight: bold;">true</span>;
        <span style="color: #0033ff; font-weight: bold;">private</span> static <span style="color: #6699cc; font-weight: bold;">var</span> _instance<span style="color: #000000; font-weight: bold;">:</span>NotificationCenter = <span style="color: #0033ff; font-weight: bold;">null</span>;
        <span style="color: #0033ff; font-weight: bold;">private</span> static <span style="color: #6699cc; font-weight: bold;">var</span> _oneandonly<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Boolean</span> = <span style="color: #0033ff; font-weight: bold;">true</span>;
&nbsp;
        <span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">var</span> _objectObservers<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Dictionary</span> = <span style="color: #0033ff; font-weight: bold;">null</span>;
        <span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">var</span> _eventObservers<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Dictionary</span> = <span style="color: #0033ff; font-weight: bold;">null</span>;
&nbsp;
 <span style="color: #3f5fbf;">/**
 * Constructor
 * Blows up if not called by the public static method
 */</span>
    <span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #339966; font-weight: bold;">function</span> NotificationCenter<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>_oneandonly<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
            <span style="color: #0033ff; font-weight: bold;">throw</span> <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Error</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;The NotificationCenter must be called as a Singleton.  Use getInstance() instead.&quot;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #000000;">&#125;</span> <span style="color: #0033ff; font-weight: bold;">else</span> <span style="color: #000000;">&#123;</span>
            _objectObservers = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Dictionary</span><span style="color: #000000;">&#40;</span>_weakKeys<span style="color: #000000;">&#41;</span>;
            _eventObservers = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Dictionary</span><span style="color: #000000;">&#40;</span>_weakKeys<span style="color: #000000;">&#41;</span>;
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
 <span style="color: #3f5fbf;">/**
 * Singleton creation and fetch method
 */</span>
    <span style="color: #0033ff; font-weight: bold;">public</span> static <span style="color: #339966; font-weight: bold;">function</span> getInstance<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span>NotificationCenter
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #0033ff; font-weight: bold;">null</span> == _instance<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
            _oneandonly = <span style="color: #0033ff; font-weight: bold;">false</span>;
            _instance = <span style="color: #0033ff; font-weight: bold;">new</span> NotificationCenter<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
            _oneandonly = <span style="color: #0033ff; font-weight: bold;">true</span>;
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0033ff; font-weight: bold;">return</span> _instance;
    <span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

</div>
<p>This is just the setup and enforcement of the Singleton pattern.  AS3 doesn&#8217;t allow private constructors, so a little sleight-of-hand is necessary.  I am creating two internal Dictionaries &#8211; one for general notifications where the listener registers to receive the event no matter who sends it, and one messages specific to the notifier.</p>
<div style="color: #100;background-color: #f9f9f9;border: 1px solid silver;margin: 0 0 1.5em -9em;overflow: auto">

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #3f5fbf;">/**
 * Registers an object as an observer for an event.  If the notifier param is not set, the observer will listen for
 * all notifications of event.  If the notifier is set, the observer will only listen for event from the notifier
 *
 * @param String event            The notification to be observed
 * @param Object observer        The object listening for event
 * @param Function callback        The function invoked by the observer when the notification fires
 * @param Object notifier        The specific object that is being observed for event &lt;OPTIONAL&gt;
 */</span>
<span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #339966; font-weight: bold;">function</span> addObserverForEvent<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span>, observer<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Object</span>, callback<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Function</span>, notifier<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Object</span> = <span style="color: #0033ff; font-weight: bold;">null</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #000000; font-weight: bold;">!</span>notifier<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
        <span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #000000; font-weight: bold;">!</span>_eventObservers<span style="color: #000000;">&#91;</span>event<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
            _eventObservers<span style="color: #000000;">&#91;</span>event<span style="color: #000000;">&#93;</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Dictionary</span><span style="color: #000000;">&#40;</span>_weakKeys<span style="color: #000000;">&#41;</span>;
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #6699cc; font-weight: bold;">var</span> _eObserverDict<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Dictionary</span> = _eventObservers<span style="color: #000000;">&#91;</span>event<span style="color: #000000;">&#93;</span> <span style="color: #0033ff; font-weight: bold;">as</span> <span style="color: #004993;">Dictionary</span>;
        _eObserverDict<span style="color: #000000;">&#91;</span>observer<span style="color: #000000;">&#93;</span> = callback;
    <span style="color: #000000;">&#125;</span> <span style="color: #0033ff; font-weight: bold;">else</span> <span style="color: #000000;">&#123;</span>
        <span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #000000; font-weight: bold;">!</span>_objectObservers<span style="color: #000000;">&#91;</span>notifier<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
            _objectObservers<span style="color: #000000;">&#91;</span>notifier<span style="color: #000000;">&#93;</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Dictionary</span><span style="color: #000000;">&#40;</span>_weakKeys<span style="color: #000000;">&#41;</span>;
        <span style="color: #000000;">&#125;</span>
        <span style="color: #6699cc; font-weight: bold;">var</span> _oObserverDict<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Dictionary</span> = _objectObservers<span style="color: #000000;">&#91;</span>notifier<span style="color: #000000;">&#93;</span> <span style="color: #0033ff; font-weight: bold;">as</span> <span style="color: #004993;">Dictionary</span>;
        <span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #000000; font-weight: bold;">!</span>_oObserverDict<span style="color: #000000;">&#91;</span>event<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
            _oObserverDict<span style="color: #000000;">&#91;</span>event<span style="color: #000000;">&#93;</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Dictionary</span><span style="color: #000000;">&#40;</span>_weakKeys<span style="color: #000000;">&#41;</span>;
        <span style="color: #000000;">&#125;</span>
        <span style="color: #6699cc; font-weight: bold;">var</span> _oEventObserverDict<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Dictionary</span> = _oObserverDict<span style="color: #000000;">&#91;</span>event<span style="color: #000000;">&#93;</span> <span style="color: #0033ff; font-weight: bold;">as</span> <span style="color: #004993;">Dictionary</span>;
        _oEventObserverDict<span style="color: #000000;">&#91;</span>observer<span style="color: #000000;">&#93;</span> = callback;
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
 <span style="color: #3f5fbf;">/**
 * Removes an object as an observer for an event.  If the notifier param is set, this will only remove
 * the object as an observer for event fired by the notifier
 *
 * @param String event            The notification to be ignored
 * @param Object observer        The object that will be ignoring the event
 * @param Object notifier        The specific object that is being ignored for event &lt;OPTIONAL&gt;
 */</span>
<span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #339966; font-weight: bold;">function</span> removeObserverForEvent<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span>, observer<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Object</span>, notifier<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Object</span> = <span style="color: #0033ff; font-weight: bold;">null</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #000000; font-weight: bold;">!</span>notifier<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
        <span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>_eventObservers<span style="color: #000000;">&#91;</span>event<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
            <span style="color: #6699cc; font-weight: bold;">var</span> _eObserverDict<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Dictionary</span> = _eventObservers<span style="color: #000000;">&#91;</span>event<span style="color: #000000;">&#93;</span> <span style="color: #0033ff; font-weight: bold;">as</span> <span style="color: #004993;">Dictionary</span>;
            <span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>_eObserverDict<span style="color: #000000;">&#91;</span>observer<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
                <span style="color: #0033ff; font-weight: bold;">delete</span> _eObserverDict<span style="color: #000000;">&#91;</span>observer<span style="color: #000000;">&#93;</span>;
            <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span> <span style="color: #0033ff; font-weight: bold;">else</span> <span style="color: #000000;">&#123;</span>
        <span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>_objectObservers<span style="color: #000000;">&#91;</span>notifier<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
            <span style="color: #6699cc; font-weight: bold;">var</span> _oObserverDict<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Dictionary</span> = _objectObservers<span style="color: #000000;">&#91;</span>notifier<span style="color: #000000;">&#93;</span> <span style="color: #0033ff; font-weight: bold;">as</span> <span style="color: #004993;">Dictionary</span>;
            <span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>_oObserverDict<span style="color: #000000;">&#91;</span>event<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
                <span style="color: #6699cc; font-weight: bold;">var</span> _oEventObserverDict<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Dictionary</span> = _oObserverDict<span style="color: #000000;">&#91;</span>event<span style="color: #000000;">&#93;</span> <span style="color: #0033ff; font-weight: bold;">as</span> <span style="color: #004993;">Dictionary</span>;
                <span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>_oEventObserverDict<span style="color: #000000;">&#91;</span>observer<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
                    <span style="color: #0033ff; font-weight: bold;">delete</span> _oEventObserverDict<span style="color: #000000;">&#91;</span>observer<span style="color: #000000;">&#93;</span>;
                <span style="color: #000000;">&#125;</span>
            <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

</div>
<p>The above snippet contains the methods that enable you to tell the NotificationCenter to start (or stop) listening for messages.  In both cases, I&#8217;m doing a simple test for nullness before I go ahead and add or remove the relationship.  In the case of the _<em>objectObservers</em> Dictionary, the notifiers become the reference keys, whereas the event names are the reference keys in _<em>eventObservers</em>.  Each key in _<em>objectObservers</em> contains 1..n Dictionaries, one for each event being observed for this specific key.  Those dictionaries in turn use the observer as the key and the callback function as the key&#8217;s value.</p>
<div style="color: #100;background-color: #f9f9f9;border: 1px solid silver;margin: 0 0 1.5em -9em;overflow: auto">

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #3f5fbf;">/**
  * Broadcasts a notification to all listeners.  A notifier is required, but any object
  * generically registered as an observer for event will also be notified.  The observers
  * that are explicitly listening for event from the notifier will be notified FIRST.
  *
  * @param String event			The notification being broadcast
  * @param Object notifier		The object doing the broadcasting
  * @param Array args			Any additional parameters used for the broadcast
  */</span>
<span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #339966; font-weight: bold;">function</span> postNotificationName<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span>, notifier<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Object</span>, ... args<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #009900;">//	notify object observers first</span>
	<span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>_objectObservers<span style="color: #000000;">&#91;</span>notifier<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
		<span style="color: #6699cc; font-weight: bold;">var</span> _oObserverDict<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Dictionary</span> = _objectObservers<span style="color: #000000;">&#91;</span>notifier<span style="color: #000000;">&#93;</span> <span style="color: #0033ff; font-weight: bold;">as</span> <span style="color: #004993;">Dictionary</span>;
		<span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>_oObserverDict<span style="color: #000000;">&#91;</span>event<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
			<span style="color: #6699cc; font-weight: bold;">var</span> _oEventObserverDict<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Dictionary</span> = _oObserverDict<span style="color: #000000;">&#91;</span>event<span style="color: #000000;">&#93;</span> <span style="color: #0033ff; font-weight: bold;">as</span> <span style="color: #004993;">Dictionary</span>;
			<span style="color: #0033ff; font-weight: bold;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #6699cc; font-weight: bold;">var</span> o_observer<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Object</span> <span style="color: #0033ff; font-weight: bold;">in</span> _oEventObserverDict<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
				<span style="color: #6699cc; font-weight: bold;">var</span> callback<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Function</span> = _oEventObserverDict<span style="color: #000000;">&#91;</span>o_observer<span style="color: #000000;">&#93;</span> <span style="color: #0033ff; font-weight: bold;">as</span> <span style="color: #004993;">Function</span>;
				callback.<span style="color: #004993;">apply</span><span style="color: #000000;">&#40;</span>o_observer, args<span style="color: #000000;">&#41;</span>;
			<span style="color: #000000;">&#125;</span>
		<span style="color: #000000;">&#125;</span>
	<span style="color: #000000;">&#125;</span>
&nbsp;
	<span style="color: #009900;">//	notify event observers next</span>
	<span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>_eventObservers<span style="color: #000000;">&#91;</span>event<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
		<span style="color: #6699cc; font-weight: bold;">var</span> _eObserverDict<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Dictionary</span> = _eventObservers<span style="color: #000000;">&#91;</span>event<span style="color: #000000;">&#93;</span> <span style="color: #0033ff; font-weight: bold;">as</span> <span style="color: #004993;">Dictionary</span>;
		<span style="color: #0033ff; font-weight: bold;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #6699cc; font-weight: bold;">var</span> ev_observer<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Object</span> <span style="color: #0033ff; font-weight: bold;">in</span> _eObserverDict<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
			<span style="color: #6699cc; font-weight: bold;">var</span> callback<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Function</span> = _eObserverDict<span style="color: #000000;">&#91;</span>ev_observer<span style="color: #000000;">&#93;</span> <span style="color: #0033ff; font-weight: bold;">as</span> <span style="color: #004993;">Function</span>;
			callback.<span style="color: #004993;">apply</span><span style="color: #000000;">&#40;</span>ev_observer, args<span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span>
	<span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

</div>
<p>The notifications are sent with optional arguments (the rest operator) from the caller.  By default, I am notifying object observers before anyone else, but this is arbitrary.  If the notifier is a key in _objectObservers, and the event is a key in the subsequent sub-Dictionary, then call all functions stored within.  If you have the _weak_keys static variable set to false, you will avoid any null pointer exceptions.  This is an advantage over the NSNotificationCenter in Cocoa, where you must remove objects from the notification queue when you deallocate them.</p>
<p>And now a brief usage example:</p>
<div style="color: #100;background-color: #f9f9f9;border: 1px solid silver;margin: 0 0 1.5em -9em;overflow: auto">

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #339966; font-weight: bold;">function</span> whoami<span style="color: #000000;">&#40;</span>... args<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
<span style="color: #000000;">&#123;</span>
        <span style="color: #6699cc; font-weight: bold;">var</span> notifier<span style="color: #000000; font-weight: bold;">:</span>NotificationCenter = NotificationCenter.getInstance<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
        notifier.addObserverForEvent<span style="color: #000000;">&#40;</span>HarvestAPI.SERVICE_RESPONSE_AUTHENTICATE, <span style="color: #0033ff; font-weight: bold;">this</span>, _handleServiceAuthenticate<span style="color: #000000;">&#41;</span>;
	<span style="color: #6699cc; font-weight: bold;">var</span> tts<span style="color: #000000; font-weight: bold;">:</span>TimeTrackerService = <span style="color: #0033ff; font-weight: bold;">new</span> TimeTrackerService<span style="color: #000000;">&#40;</span><span style="color: #0033ff; font-weight: bold;">this</span><span style="color: #000000;">&#41;</span>;
	tts.whoAmI<span style="color: #000000;">&#40;</span>args<span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #009900;">//    ...</span>
<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> _handleServiceAuthenticate<span style="color: #000000;">&#40;</span>... args<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #6699cc; font-weight: bold;">var</span> notifier<span style="color: #000000; font-weight: bold;">:</span>NotificationCenter = NotificationCenter.getInstance<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
	notifier.removeObserverForEvent<span style="color: #000000;">&#40;</span>HarvestAPI.SERVICE_RESPONSE_AUTHENTICATE, <span style="color: #0033ff; font-weight: bold;">this</span><span style="color: #000000;">&#41;</span>;
&nbsp;
	<span style="color: #009900;">//	the variable args should consist of at most one element, an instance of User</span>
	<span style="color: #6699cc; font-weight: bold;">var</span> arr<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Array</span> = args <span style="color: #0033ff; font-weight: bold;">as</span> <span style="color: #004993;">Array</span>;
	<span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #0033ff; font-weight: bold;">null</span> <span style="color: #000000; font-weight: bold;">!</span>= arr <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> arr.<span style="color: #004993;">length</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight:bold;">0</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
		<span style="color: #6699cc; font-weight: bold;">var</span> user<span style="color: #000000; font-weight: bold;">:</span>User = arr<span style="color: #000000;">&#91;</span><span style="color: #000000; font-weight:bold;">0</span><span style="color: #000000;">&#93;</span> <span style="color: #0033ff; font-weight: bold;">as</span> User;
		<span style="color: #6699cc; font-weight: bold;">var</span> prefs<span style="color: #000000; font-weight: bold;">:</span>Userprefs = Userprefs.getInstance<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
		prefs.saveWithUser<span style="color: #000000;">&#40;</span>user<span style="color: #000000;">&#41;</span>;
	<span style="color: #000000;">&#125;</span>
&nbsp;
	<span style="color: #009900;">//	the user has properly authenticated.</span>
	notifier.postNotificationName<span style="color: #000000;">&#40;</span>HarvestAPI.CONTROLLER_AUTHENTICATION_OK, <span style="color: #0033ff; font-weight: bold;">this</span>, args<span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

</div>
<p>This is an actual excerpt from the Harvest app.  I am basically calling an authentication service in the Harvest API.  On line 4 above, I tell the NotificationCenter to start listening for <em>HarvestAPI.SERVICE_RESPONSE_AUTHENTICATE</em> from anyone who broadcasts it, and then handle the notification with _<em>handleServiceAuthenticate</em>.  Since this is a network call, everything must obviously be asynchronous.  You&#8217;ll notice that in _<em>handleServiceAuthenticate</em>, an object is expected.  If there is an incoming object, it will always be nested in an Array.  This particular code then triggers another notification to a controller in an MVC hierarchy.</p>
<p>I&#8217;ve been coding against this NotificationCenter for a little while now, and I am really starting to appreciate it.  I&#8217;m beginning to really enjoy Actionscript 3.  The language has definitely grown up.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.archer-group.com/development/mimicking-cocoas-nsnotificationcenter-in-actionscript-3/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Social Analytics and ROI</title>
		<link>http://www.archer-group.com/strategy/social-analytics-and-roi</link>
		<comments>http://www.archer-group.com/strategy/social-analytics-and-roi#comments</comments>
		<pubDate>Mon, 22 Feb 2010 21:03:37 +0000</pubDate>
		<dc:creator>Patrick Callahan</dc:creator>
				<category><![CDATA[Social Marketing]]></category>
		<category><![CDATA[Strategy]]></category>

		<guid isPermaLink="false">http://www.archer-group.com/?p=1093</guid>
		<description><![CDATA[In “Competing on Analytics”, (Winter 2009 Harvard Business Review), author Thomas Davenport encourages the readers to become an “Analytics Competitor” or someone who “&#8230;use(s) sophisticated data collection technology and analysis to wring every last drop of value from all your business processes”. Analytics Competitors, Davenport concludes,”&#8230;seize the lead in their fields”.
Many organizations today are now [...]]]></description>
			<content:encoded><![CDATA[<p>In “Competing on Analytics”, (Winter 2009 Harvard Business Review), author Thomas Davenport encourages the readers to become an “Analytics Competitor” or someone who “&#8230;use(s) sophisticated data collection technology and analysis to wring every last drop of value from all your business processes”. Analytics Competitors, Davenport concludes,”&#8230;seize the lead in their fields”.</p>
<p>Many organizations today are now trying to evaluate their social marketing results by asking themselves “How can we determine the value of our social marketing efforts through analytics?” With social being so relatively new &#8211; there’s not a true industry standard to help in their analysis &#8211; but there are a few approaches which they should consider.</p>
<p>When conducting an analysis, or even when calculating ROI, rather than concentrating on how certain metrics from traditional marketing don’t work with social, consider instead rethinking ROI from the ground up. Take into consideration the qualitative and quantitative benefits and the impact to other areas of the organization. If done, organizations begin to see that ROI for social marketing isn’t just a theoretical exercise, like trying to develop cold fusion. There are real across-the-board benefits to be found.</p>
<p>Utpal M. Dholakia and Emily Durham recently conducted a study on local bakery and cafe chain in Texas adding social to their mix in advertising. They concluded that customers spent the same amount of money per visit, increased their number of visits, and generated “more positive word of mouth than nonfans”, “reported significantly greater emotional attachment”, would choose the coffee shop over their competitors “whenever possible” (see “One Cafe’ Chain’s Facebook Experiment”, the Harvard Business Review, March 2010).</p>
<p>A review of the quantitative analytics, consider the measurable analysis: number of Fans, number of mentions, increase in traffic to specified, time of brand exposure, increase in sales, or other measures that the organization tracks on a regular basis.  When reviewing the qualitative analytics, consider the more emotional elements &#8211; such as number of positive or negative mentions, brand awareness and brand feeling, referrals from fans (which are always more emotionally beneficial to the brand), emotional attachment, or other not-so-quantifiable measures which have just as much a quantifiable impact on the brand.</p>
<p>Here are a couple resources (that have their own links) to review when conducting your analysis and determining your measure and approach for ROI and analysis:</p>
<p>- <a href="http://www.youtube.com/watch?v=ypmfs3z8esI&amp;feature=player_embedded">Video on Social Media ROI</a></p>
<p>- <a href="http://mashable.com/2009/10/27/social-media-roi/">Mashable &#8211; How to measure ROI</a></p>
<p>- <a href="http://www.slideshare.net/thebrandbuilder/olivier-blanchard-basics-of-social-media-roi">Olivier Blanchard Basics Of Social Media Roi</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.archer-group.com/strategy/social-analytics-and-roi/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Five Areas of Social Marketing Motivation</title>
		<link>http://www.archer-group.com/strategy/five-areas-of-social-marketing-motivation</link>
		<comments>http://www.archer-group.com/strategy/five-areas-of-social-marketing-motivation#comments</comments>
		<pubDate>Wed, 17 Feb 2010 19:58:29 +0000</pubDate>
		<dc:creator>Lee Mikles</dc:creator>
				<category><![CDATA[Social Marketing]]></category>
		<category><![CDATA[Strategy]]></category>

		<guid isPermaLink="false">http://www.archer-group.com/?p=1085</guid>
		<description><![CDATA[When brands attempt to engage consumers via social marketing, it is important that the people responsible for building the social marketing strategy keep in mind what motivates consumers to want to &#8216;engage the brand&#8217;
People all want to be something, and as a brand you’ve got to give them the opportunity to be who they want [...]]]></description>
			<content:encoded><![CDATA[<p>When brands attempt to engage consumers via social marketing, it is important that the people responsible for building the social marketing strategy keep in mind what motivates consumers to want to &#8216;engage the brand&#8217;</p>
<p>People all want to be something, and as a brand you’ve got to give them the opportunity to be who they want to be.</p>
<p>1.  Be the Comedian</p>
<p>We all may not be as funny as Larry David (or even Larry the Cable Guy), but that doesn’t mean a part of us doesn’t want to be the one on stage making people laugh. Create opportunities for people to be funny via cool content, and they’ll be compelled send that message out to others.</p>
<p>2.  Be the Philanthropist</p>
<p>People may be motivated by self-interest, but that doesn’t mean they’re selfish. Altruism is a powerful motivator, as evidenced by the number of people using Facebook to show their support for the issues they care about. If your brand takes part in a cause, it’s a great way to start up conversations with people who care about the same things.</p>
<p>3.  Be the Expert.</p>
<p>Everyone likes being recognized as an expert on something, whether it’s knowing all about Edward Cullen’s vampire family in Twilight, or being history savvy enough to know which portly U.S. head of state once got stuck in a bathtub. A quiz is a great way for a brand tap into that desire to appear smart, and give people a chance to show off their brains.</p>
<p>4.  Be the Maven</p>
<p>Malcolm Gladwell talks about mavens in his book The Tipping Point, those trendsetters and early adopters who just have to be on the cutting edge of a social trend. These mavens like to share with others their latest purchase or music on their iPod. If you can create a motivation with a subliminal message of &#8216;be the first to share this with others&#8217;,  Mavens will take the bait and spread the word.</p>
<p>5.  Be Recognized</p>
<p>&#8216;Norm&#8217; from the SitCom Cheers recieved a warm &#8216;Norm!&#8217; from the bar every time he entered. This recognition is appealing to all of us and is why we return to places where &#8216;everyone knows our name&#8217;. The same is true in the social marketing world. If you show your consumers you know them, they will want to return and participate further. Foursquare and GoWalla provide the platform to perform this type of recognition.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.archer-group.com/strategy/five-areas-of-social-marketing-motivation/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I&#8217;m finally sold on the iPad</title>
		<link>http://www.archer-group.com/strategy/im-finally-sold-on-the-ipad</link>
		<comments>http://www.archer-group.com/strategy/im-finally-sold-on-the-ipad#comments</comments>
		<pubDate>Wed, 17 Feb 2010 19:03:26 +0000</pubDate>
		<dc:creator>Todd Miller</dc:creator>
				<category><![CDATA[Strategy]]></category>

		<guid isPermaLink="false">http://www.archer-group.com/?p=1080</guid>
		<description><![CDATA[You can definitely make fun of me, but I’m not a “book” guy. I read about 10 books a year and I don’t always finish all of them. But, I subscribe to about 20 magazines and read them cover to cover every month. Wired has a great web site, but I skim online. Its not [...]]]></description>
			<content:encoded><![CDATA[<p>You can definitely make fun of me, but I’m not a “book” guy. I read about 10 books a year and I don’t always finish all of them. But, I subscribe to about 20 magazines and read them cover to cover every month. Wired has a great web site, but I skim online. Its not the paper / print experience I love. I also hate when I want to refer back to the article and can’t find the old issue or can only find an excerpt online.</p>
<p>Check it out. This actually got me excited for the iPad:<br />
<a href="http://tinyurl.com/yhxmup6">http://tinyurl.com/yhxmup6</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.archer-group.com/strategy/im-finally-sold-on-the-ipad/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
