<?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>Homo technologicus&#039; asylum</title>
	<atom:link href="http://fayerplay.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://fayerplay.com</link>
	<description>Your code may be elegant, by mine f***ing works</description>
	<lastBuildDate>Wed, 01 Feb 2012 18:38:21 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Let&#8217;s get personal</title>
		<link>http://fayerplay.com/2012/02/lets-get-personal/</link>
		<comments>http://fayerplay.com/2012/02/lets-get-personal/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 15:41:37 +0000</pubDate>
		<dc:creator>Leon Fayer</dc:creator>
				<category><![CDATA[$work]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[marketing]]></category>

		<guid isPermaLink="false">http://fayerplay.com/?p=338</guid>
		<description><![CDATA[
Last week, I was doing some research about my upcoming trip to Tanzania.  I was browsing the web, looking for good deals on trip packages, reading feedback and comments from people who went on a similar trip, checking prerequisites (shots, visas)&#8211;basically general research anyone would do when going on a trip to a place [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://stkarnick.com/culture/wp-content/uploads/2010/08/Minority-Report-screenshot-300x126.png"></p>
<p>Last week, I was doing some research about my upcoming trip to Tanzania.  I was browsing the web, looking for good deals on trip packages, reading feedback and comments from people who went on a similar trip, checking prerequisites (shots, visas)&#8211;basically general research anyone would do when going on a trip to a place where they&#8217;ve never been, or looking to buy a new product and trying to choose from the selections. Later that week I was checking my Gmail account, and, what do you know? The news ticker above the email showed me: NYT Travel &#8211; <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3RyYXZlbC5ueXRpbWVzLmNvbS8yMDEyLzAxLzI5L3RyYXZlbC9tYWZpYS1pc2xhbmQtYS1zZXJlbmUtaXNsZS1mb3Itbm93LW9mZi10YW56YW5pYS5odG1sP3BhcnRuZXI9cnNzJiMwMzg7ZW1jPXJzcw==" target=_blank>Next Stop: Off Tanzania, Serene Mafia Island</a>.  Obviously the article was targeted specifically to me, based upon my research over the few previous days, and it did provide me with some new information. But, is it a valuable service that companies provide, or an invasion of privacy&#8211;an abuse of the collected data that was never meant to be public?<br />
<span id="more-338"></span></p>
<p>Over the past few years, the issue of online privacy has become more acutel. With the emergence of social web and data services, such as geolocation of web users, more and more information about the user is transparently available for web pages and applications. And, as always, the companies that can directly utilize the data available (and frankly those who benefit from it the most) are marketing and advertising companies. Personalized ads have become a common occurrence, and that scares some users. People believe that anonymity is a core benefit of Internet, and behavioral advertisement violates the privacy that users are expecting.</p>
<p>Personally, I don&#8217;t fully understand people who cling to the idea of anonymity online for a couple of reasons. First, it sounds a little naive to argue against, for example, having your location available to the ad services when anyone can find out a ridiculous amount of &#8220;public&#8221; information about any given person. Nowdays anyone, with a few clicks of the mouse, can find out where you live and work, what you eat, who is in your immediate and extended family, how much you paid for your house, and much, much more. In perspective, disclosing your current location doesn&#8217;t sound like a big deal by comparison. Secondly, people don&#8217;t correlate the same actions on- and off-line because, even still, they view the Internet as completely anonymous channel, often with no repercussions for their actions. However, online marketing is not much different from it&#8217;s ancestral, offline counterpart. You are being targeted for advertisement daily, based upon your &#8220;personal&#8221; information. When you are walking down the street, the shoe shiner will not ask you if you need his services if you&#8217;re wearing tennis shoes or flip flops. You are being targeted, based upon what you wear. New Chinese restaurant staff may not leave their menu at your door handle if you live outside of a 10 mile radius from the restaurant. You are being targeted, based upon where you live. If you are a male and walking through the mall, the staff will not ask you to try a new perfume. You are being targeted, based upon your gender. There are many more examples of daily targeting, based upon profile or behavior, yet those instances are tolerated much better than similar advertisements presented online. </p>
<p>Perhaps the issue lies in the fact that online data collection goes far beyond what can be derived from the information available outside of it. The Internet allows users to seamlessly switch between different activities in single browser. Average users spend more and more time on the Internet watching movies, doing research, shopping, reading news and much more. Below is a breakdown for an average U.S. user, condensed into one hour.</p>
<p><img src="http://blog.nielsen.com/nielsenwire/wp-content/uploads/2010/08/us-time-spent-online-new1.png" height=467 width=467></p>
<p>All the activities listed provide valuable data points that can be correlated into a &#8220;user profile,&#8221; and if analyzed properly, allowing very accurate assumptions about the products and services that will interest that particular user.  Amazon can be considered a pioneer in creating their related products section, which enjoys a very high conversion rate, based upon users’ past purchasing and browsing history.  Facebook&#8217;s targeted advertisements analyze user preferences, likes and comments to promote products and services to match that user&#8217;s interests. And although these services provide valuable offerings, some people argue that online advertising is unnecessary, and ads diminish the value of the content or service that companies provide, because they distract from, or are irrelevant to, the main content.</p>
<p>Internet advertising has to exist in order for companies to provide free quality content. This is an axiom. In order for the advertisement to be effective and attract customers, it must be relevant. In order for marketing to be relevant, appropriate messaging must be communicated to the target audience. And, in order to assemble an appropriate message, a company must know the audience being targeted. </p>
<p>There are two types of targeted advertisements that have been adopted on the web: contextual and behavioral. Contextual ads market products based upon the content that is being presented to the user. For example, if a visitor is looking at user-submitted images on National Geographic <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL25nbS5uYXRpb25hbGdlb2dyYXBoaWMuY29tL215c2hvdC8=">My Shot</a>, presenting an ad for Nikon camera would probably yield a higher clickthrough rate than a generic &#8220;You have been selected to win an iPod&#8221; ad, that so many people have come to hate, as this approach assumes that people viewing the content on this particular page would be uniformly interested in a random product.  Contextual ads target a particular <i>group</i> of people with a common interest, and bank on the similarities within the target group. Behavioral ads are targeted by using the historical data collected while the user views multiple pieces of content. Companies that employ behavioral advertisements collect data from various sources and preferences of a user&#8211;on average several hundred times a month&#8211;and use that information to tailor the offering to an <i>individual</i> user viewing the content. This is where users concern about privacy violation comes in.</p>
<p>There is no question that available information can be abused.  On the other hand, users may not want some of their Internet activity associated with their profile. They may look for advice for their real-life problems or diseases without wanting to expose themselves, or having that information being associated with their profile (which may contain unique information identifying them). At the end of the day, the issue comes down to the  mission, values and reputation of the company running the campaigns. A company collecting  data and using it to provide a better user experience for its users, is much different from a company purchasing profile data from other places and using it  to exploit or trick users.  &#8220;Find [something] in [your city], [state]” is the most common example of deceiving people into registering for questionable services. Unfortunately, there is no silver bullet for the problem. The Internet went through the same process when companies began to require an email address in order to register for, well, pretty much anything online. Volumes of spam increased exponentially, and it took years for ESPs to devise sound, anti-spam solutions. However, it required users also to make a responsible decision about which services were reputable enough, and to provide their personal information. Behavior targeting, if proven successful, will have to go through a similar trial-and-error process before it matures.  We can only hope that the cycle will be quicker, as companies and users alike are more educated regarding online operations than they were 10 years ago.</p>
<p>So the marketing expansion can&#8217;t (and based upon marketing survey responses, shouldn&#8217;t) be stopped. However, with all the data available for consumption, there are steps that must be taken to maintain a necessary privacy level for concerned consumers, and a lot of major companies are taking steps toward implementing those policies. AOL, for example, lets users opt out of some targeted advertisements; Google lets users edit the search histories that are linked to their profiles; Microsoft says it does not link any of its visitors’ behavior to their user names, even if those people are registered; and Mozilla released a proposed <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ZpcnN0cGVyc29uY29va2llLndvcmRwcmVzcy5jb20vMjAxMS8wMS8yMy9tb3JlLWNob2ljZS1hbmQtY29udHJvbC1vdmVyLW9ubGluZS10cmFja2luZy8=">&#8220;Do Not Track&#8221; header</a> to provide users with a deeper understanding of, and control over, the flow of personal information online.</p>
<p>The bottom line is: The Internet is evolving, expanding and becoming it&#8217;s own ecosystem, and behavioral marketing on the Internet is here to stay. With the rapid emergence of the mobile web, we are quickly moving toward &#8220;futuristic&#8221; advertisement, a la the movie, &#8220;Minority Report&#8221;, where sale offers will be customized for individual users walking into the store, based upon their preferences and taste data collected online. If you are happy to receive relevant advertising that may even give you new, useful information, be happy. If you fall on the other side of the privacy coin and you don’t want your surfing habits tracked, you can employ available tools and methods  to restrict the the outgoing information.</p>
 <img src="http://fayerplay.com/wp-content/plugins/feed-statistics.php?view=1&post_id=338" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://fayerplay.com/2012/02/lets-get-personal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>In search of unknown</title>
		<link>http://fayerplay.com/2011/09/in-search-of-unknown/</link>
		<comments>http://fayerplay.com/2011/09/in-search-of-unknown/#comments</comments>
		<pubDate>Thu, 08 Sep 2011 15:33:21 +0000</pubDate>
		<dc:creator>Leon Fayer</dc:creator>
				<category><![CDATA[$work]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[case study]]></category>
		<category><![CDATA[monitoring]]></category>
		<category><![CDATA[trending]]></category>
		<category><![CDATA[troubleshooting]]></category>

		<guid isPermaLink="false">http://fayerplay.com/?p=291</guid>
		<description><![CDATA[I’ve talked at length about the importance of business process monitoring alongside of system monitoring, but in discussions I found that sometimes an overview and simple examples are not enough to convince people about the benefits of this approach. Business owners think they don’t need to know anything about the operational performance of their systems [...]]]></description>
			<content:encoded><![CDATA[<p>I’ve talked at length about the importance of <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ZheWVycGxheS5jb20vMjAwOS8xMS90by1jYXRjaC1hLWJ1Zy8=">business process monitoring alongside of system monitoring</a>, but in discussions I found that sometimes an overview and simple examples are not enough to convince people about the benefits of this approach. Business owners think they don’t need to know anything about the operational performance of their systems as long as they have their numbers, and engineers often don&#8217;t feel they need invest time into understanding the business they are supporting in detail, finding examples shown too “common sense.&#8221;<br />
<span id="more-291"></span><br />
One question we ask our engineers during an interview at <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL29tbml0aS5jb20=">work</a>, is to describe the process of how they would go about troubleshooting a hypothetical issue, given only the minimum information. We often hear from our clients things like, “our website is slow” and “something’s wrong with registration” with no additional information, and in order to figure out the potential issue we need to review the whole system at a glance. For large applications, with a myriad of moving and interweaving components, this is not an easy task. This is one of the reasons we are <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL29tbml0aS5jb20vY2FyZWVycw==">looking for best of the best</a>. But if you are monitoring all of those components, in a lot of cases, the task can be simplified.</p>
<p>So let’s examine a real problem. A large e-commerce company called and said that they are seeing less money coming in from web transactions. They have a pretty complex system with a lot of different revenue generation points, so this observation shed very little light on the root cause of the problem. Luckily, both systems and business processes were being monitored with <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NpcmNvbnVzLmNvbQ==">Circonus</a>, so the data was available to review.</p>
<p>As any engineer knows &#8211; step one of troubleshooting the problem is to confirm the problem, so looking at the revenue trends seemed like a good starting point.</p>
<p style="text-align: center;"><a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ZheWVycGxheS5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMTEvMDkvUGljdHVyZS00LnBuZw=="><img src="http://fayerplay.com/wp-content/uploads/2011/09/Picture-4.png" alt="" title="Revenue trend" width="467" height="184" class="alignnone size-full wp-image-292" /></a></p>
<p>The graph clearly shows that, starting around April 30th, the trend looked abnormal in comparison to the previous few weeks. So it seemed like there was an actual problem, and potentially, the issue could lie in payment processor itself or somewhere in the system, preventing certain users from making a purchase. So let’s overlay the traffic trends, collected from <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2dvb2dsZS5jb20vYW5hbHl0aWNz">Google Analytics</a>, against revenue graph and see if there are any common trends. </p>
<p><a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ZheWVycGxheS5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMTEvMDkvUGljdHVyZS01LnBuZw=="><img src="http://fayerplay.com/wp-content/uploads/2011/09/Picture-5.png" alt="" title="Revenue v Traffic trend" width="467" height="184" class="aligncenter size-full wp-image-294" /></a>    </p>
<p>Even though the traffic showed a clear drop at the same time as revenue, the ratio remained the same, allowing us to exclude payment processor and other application logic from the equation (for now).</p>
<p><b>Note:</b> This is the first potential breaking point in the process. It is very tempting to look at the ratios, attribute revenue decrease to traffic decrease, and stop the investigation. 99% of the time, unfortunately, nothing “just” happens, so on we go.</p>
<p>Now for the next step – what would be a logical cause for a drop in overall traffic to the site? Response time is probably the first thought that should come to mind. So let’s look at what the HTTP checks collected. </p>
<p><a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ZheWVycGxheS5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMTEvMDkvUGljdHVyZS02LnBuZw=="><img src="http://fayerplay.com/wp-content/uploads/2011/09/Picture-6.png" alt="" title="HTTP response time" width="467" height="184" class="aligncenter size-full wp-image-296" /></a></p>
<p>Load times didn’t seem to be deviating from the norm, but the HTTP response metric doesn’t provide full visibility into the load times for a dynamic application, so let’s check the health of the database and CPU usage on the server(s), to validate that the underlying platform is not the bottleneck. There are numerous metrics to monitor database and system health that should be, and in this case, are collected, but when researching the root cause of the elusive problem, diving deep into a specific component can waste time early in the process. </p>
<p><a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ZheWVycGxheS5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMTEvMDkvUGljdHVyZS04LnBuZw=="><img src="http://fayerplay.com/wp-content/uploads/2011/09/Picture-8.png" alt="" title="CPU usage and database health" width="467" height="184" class="aligncenter size-full wp-image-298" /></a></p>
<p>Both of the metrics appear well within norm, so at first glance, it seems like the problem is not a systems issue.</p>
<p><b>Note:</b> This is the second point of the investigation where the process can break down. A lot of technical folks will either report that there is no confirmation to the problem reported; the reported problem is just an anomaly because the system monitors don’t exhibit any issues. This is exactly why understanding of the business by the technology team is vital.</p>
<p>With that said, what would be the next logical process to validate? It is not uncommon for an e-commerce site to see a drop in purchases if they either stop promoting or if their marketing campaign is ineffective: traffic to the site slows down, subsequently decreasing the number of transactions. This company, in particular, sends out tens of millions of emails a day which bring in new users, and subsequently, new conversions. So let’s take a look at the email deliverability and bounce rates collected from the company’s MTAs. </p>
<p><a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ZheWVycGxheS5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMTEvMDkvUGljdHVyZS05LnBuZw=="><img src="http://fayerplay.com/wp-content/uploads/2011/09/Picture-9.png" alt="" title="Bounces" width="467" height="184" class="aligncenter size-full wp-image-302" /></a></p>
<p>Bingo! The bounce rates sky rocketed at the same time as the drop in traffic and revenue stream occurred. Upon closer investigation, it appeared that one of the major ESPs accidentally blocked the delivery domain, and the emails did not go through to the recipients. The issue was resolved (after some discussions with the ESP) and the trends returned back to the expected level.</p>
<p>Keep in mind, if email deliverability was not the issue – there are multiple other metrics that were on a list to be verified, both system (operational and development alike) and business. The amazing part of all of this is that I was able to view the whole system at a glance in just <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cHM6Ly9jaXJjb251cy5jb20vc2hhcmVkL2dyYXBocy9iODA4Yzk0Zi1iYjk1LTRkZWUtZGRjZi05NDMzMjBjNDY1MWUvSDBkT1pi">one graph</a>. Granted, stacking everything on one graph is probably not the most optimal every day approach, but it is very useful in a certain cases when the direct overlay correlation is needed. For everything else – a real-time dashboard that displays all the vital points of the business at any given moment is a must-have for anyone responsible for business and/or system health. </p>
<p><a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ZheWVycGxheS5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMTEvMDkvUGljdHVyZS0xMi5wbmc="><img src="http://fayerplay.com/wp-content/uploads/2011/09/Picture-12.png" alt="" title="Dashboard" width="467" height="300" class="aligncenter size-full wp-image-303" /></a></p>
<p>Everyone responsible for the success of a business, regardless of the role, needs an ability to see the status of the whole business at a glance at any given point. System engineers don’t need to know all the ins and out of marketing, but they should be aware of the overall organizational goals, and should be able to spot irregularities in the business trends. Similarly, CEOs don’t need to know how systems work in the background, but should be able to correlate high email bounce rates (if it’s critical to the business) to a decrease in purchases.</p>
<p>The point of all of this is that <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ZheWVycGxheS5jb20vMjAwOS8xMS90by1jYXRjaC1hLWJ1Zy8=">everything should be monitored</a>, and to suggest some tools and methods that can enable users in all roles&#8211;within any organization&#8211;to ensure the success of the business. Get ‘em, learn &#8216;em, use &#8216;em! You will thank me later.</p>
 <img src="http://fayerplay.com/wp-content/plugins/feed-statistics.php?view=1&post_id=291" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://fayerplay.com/2011/09/in-search-of-unknown/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Discussing business online</title>
		<link>http://fayerplay.com/2011/06/discussing-business-online/</link>
		<comments>http://fayerplay.com/2011/06/discussing-business-online/#comments</comments>
		<pubDate>Mon, 20 Jun 2011 20:26:18 +0000</pubDate>
		<dc:creator>Leon Fayer</dc:creator>
				<category><![CDATA[$work]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[radio]]></category>
		<category><![CDATA[talks]]></category>

		<guid isPermaLink="false">http://fayerplay.com/?p=248</guid>
		<description><![CDATA[I recently was invited to join RSS Ray during his weekly radio program &#8220;Online Marketing with RSS Ray&#8221; broadcasted on WS Radio, to discuss the challenges in creating and operating business online.   We covered a lot of great topics that would be relevant to anyone trying to either build or improve their web [...]]]></description>
			<content:encoded><![CDATA[<p>I recently was invited to join <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Jzc3JheS5jb20=">RSS Ray</a> during his weekly radio program &#8220;Online Marketing with RSS Ray&#8221; broadcasted on <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3dzcmFkaW8uY29t">WS Radio</a>, to discuss the challenges in creating and operating business online.   We covered a lot of great topics that would be relevant to anyone trying to either build or improve their web presence, starting from pointers on what to look for when selecting a vendor, to scalability and security considerations, and all the way to the tips on choosing <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ZheWVycGxheS5jb20vMjAxMS8wNS9hbmF0b215LW9mLWJ1c2luZXNzLWRyaXZlbi1jbXMv">the right CMS for your business</a>.  You can listen to the two-part podcast below.<br />
<span id="more-248"></span></p>
<p>
<b> Designing Great Websites That Sell (Part 1)</b></p>
<div style="background: black; width:300px;">
<audio controls="controls"><br />
<source  src="/audio/RSSRay-6:15-p1.mp3" /><br />
<source  src="/audio/RSSRay-6:15-p1.ogg" /><br />
<a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=L2F1ZGlvL1JTU1JheS02OjE1LXAxLm1wMw==">Listen to Part I</a><br />
</audio>
</div>
<p>
<b> Designing Great Websites That Sell (Part 2)</b></p>
<div style="background: black; width:300px">
<audio controls="controls"><br />
<source src="/audio/RSSRay-6:15-p2.ogg" /><br />
<source src="/audio/RSSRay-6:15-p2.mp3" /><br />
<a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=L2F1ZGlvL1JTU1JheS02OjE1LXAyLm1wMw==">Listen to Part II</a><br />
</audio>
</div>
 <img src="http://fayerplay.com/wp-content/plugins/feed-statistics.php?view=1&post_id=248" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://fayerplay.com/2011/06/discussing-business-online/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Anatomy of business driven CMS</title>
		<link>http://fayerplay.com/2011/05/anatomy-of-business-driven-cms/</link>
		<comments>http://fayerplay.com/2011/05/anatomy-of-business-driven-cms/#comments</comments>
		<pubDate>Thu, 19 May 2011 18:42:28 +0000</pubDate>
		<dc:creator>Leon Fayer</dc:creator>
				<category><![CDATA[$work]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[cms]]></category>

		<guid isPermaLink="false">http://fayerplay.com/?p=213</guid>
		<description><![CDATA[Content Management Systems (CMS) have become one of the most powerful internet-related products.  What once was a gadget for web developers and technology geeks is now a must-have tool for various business units.  Because of the pace at which the world of internet technology changes, and the high demand for up-to-date content availability, [...]]]></description>
			<content:encoded><![CDATA[<p>Content Management Systems (CMS) have become one of the most powerful internet-related products.  What once was a gadget for web developers and technology geeks is now a must-have tool for various business units.  Because of the pace at which the world of internet technology changes, and the high demand for up-to-date content availability,  there are thousands of products (commercial and open source alike) that offer a myriad of features to the companies in need of a solution to publish their content.   </p>
<p>Unfortunately, over the past decade, the term &#8220;CMS&#8221; has become a buzz word, a commodity if you will.  Everything web-related (short of social media, and that&#8217;s changing nowdays as well) has been rolled into those three characters.  Originally (loosely) defined as &#8220;web application to create, edit, store and publish online content&#8221;, CMS has transformed into a much larger beast, covering e-commerce inventory management, SEO tool, workflow creator, and much much more.  There are a lot (and I mean A LOT) of &#8220;How to choose CMS&#8221; articles out there, all composed from different perspectives, starting from a designer usability stand and ending with a CFO financial point of view.  <em>This article is not one of them</em>.  The goal here is to separate the term &#8220;CMS&#8221; into two very distinct components, and analyze the impact and/or the importance of each in a context of selecting a system to support your business.<br />
<span id="more-213"></span><br />
There are two primary functions that people should be looking at when evaluating CMS, which I will refer to as &#8220;the engine&#8221; and &#8220;the workflow&#8221;.   The best analogy to define the separation could be drawn from looking into the world of video games.  In 1998 Epic Games developed a <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VbnJlYWxfRW5naW5l">game engine</a> that powered their newly released game <em>Unreal</em>.  Since then &#8211; dozens of very different games, from a number of developers and publishers, were built on top of that engine; games that have nothing in common on a surface (really, who would compare Adventure Pinball and Tom Clancy&#8217;s Rainbow Six game?)   All those games have completely different types of gameplay, different target audiences, but they all share a common engine under the hood to accomplish those very different goals.  The same can (and should) be applied to the Content Management Systems.</p>
<h3 id="work_title">The engine</h3>
<p>Even with all the new bells and whistle in the current systems, the main purpose of the CMS is still to publish and serve the content.  With that said &#8211; publishing content is easy.  Publishing and serving the <em>right</em> type of content <em>consistently</em> is a bit more challenging, but this problem has been solved (with varying success) in all of the CMS products out there.  Ultimately, the selection comes down to two simple questions: &#8220;will the product run in my infrustructure?&#8221; and &#8220;will the product perform well based on my current traffic, and scale with my business?&#8221;    </p>
<p>Having said that &#8211; in no way, shape, or form, I want to downplay the importance of selecting the underlining CMS engine.  Too often I see VPs of Technology and CIOs put a cart before the horse and start comparing <i>products</i> instead of evaluation the compatibility of them with business needs and the architecture in place.   A couple of things to consider when selecting the engine, in no particular order:</p>
<p><strong>Scalability</strong> &#8211; will the engine be able handle current and future traffic patterns?<br />
<strong>Integration methods</strong> &#8211; what protocols does the engine offer for integration for both user-facing applications, as well as &#8220;the workflow&#8221;?<br />
<strong>Technology stack</strong> &#8211; will the technology that engine is built on fit within the current architecture, and will it match the skill set of the staff?<br />
<strong> Extensibility</strong> &#8211; how would the engine integrate with third-party business applications and support business-specific data models?<br />
<strong>Content delivery</strong> &#8211; will the engine match the content delivery strategy of the business? (multichannel publishing, content availability, etc)</p>
<p>Although there is still a level of research required to identify the engine that would serve business needs the best, the availability of products makes the decision nothing but time consuming.  After all &#8211; <i>the engine</i> is just a tool to support your business on the web.</p>
<h3 id="work_title">The workflow</h4>
<p>The workflow, however, <i>is</i> you business.   And that&#8217;s where the available products usually fall very short of the mark, no matter how much they push the &#8220;flexibility&#8221; and &#8220;usability&#8221; pitch. </p>
<p> There are a lot of articles and product briefs (primarily from the designer standpoint) preaching the importance of having an intuitive interface, to give users full creative control over the content.  And although I don&#8217;t want to downplay the importance of the usability of the web-based systems (in fact, it&#8217;s one of the more important aspects of the process implementation), the differentiators preached are mainly irrelevant to the business needs.  Listing a WYSIWYG editor as one of the primary selling points in evaluating of the system for your business is ridiculous.  It&#8217;s 2011, and there is a usability level of any web based system that&#8217;s expected out of any product.  However, no matter how intuitive and usable the interface and the flow may be in the off-the-shelf product, chances are, unless you&#8217;re in media publishing business (articles, images, videos, etc) it will not match the flow that&#8217;s intuitive for <i>your</i> business.</p>
<p>Every business has a unique model/approach/flow, and that flow needs to be represented by the CMS.  One of the pitfalls of any CMS product out there (thought no fault of the product, but rather the conceptual design) is that it is catered to serve a specific types of content.  The creators of the products try to accommodate every need, but, as with any attempt to please everyone, unsuccessfully.  There are two reasons for the failure.  </p>
<h4> Catering to everyone means catering noone </h4>
<p>Every CMS, no matter how flexible it is (or is claimed to be) can&#8217;t foreseeably cover every use case, even for a single type of business.  If it was possible &#8211; we&#8217;d have one and only all-purpose CMS used by everyone.  Therefore, the authors of the product try to either specialize on a niche business model (i.e. blogging, product store, etc) and/or try to cover the use-cases that they feel are most significant to generic business flows.  There are obvious problems with that approach.</p>
<p>A classic argument for build vs buy &#8211; generic flow is just that &#8211; generic.  Which means there is going to be a certain level of modification of the core product in order to get your business needs accommodated, which would vary based on complexity of the features you need.  But let&#8217;s leave alone this argument for a minute, and not go into the maintenance cost, skilled staff needs, upgrade paths, etc.  that are covered in lengths in other articles.  Let&#8217;s assume that you managed to find a product with an exact feature set that&#8217;s perfect for your business.  One thing that most people don&#8217;t consider is the product road map.  As I mentioned, the feature set of the product is the vision of the creator(s), Product Manager, or CEO, depending on the product.  That vision may not include the features <i>you</i> need in the next release, either because of the change in product direction, lack of demand, or many other reasons that drive any business.  As an example,  Firefox 4.0 removed RSS feed icon from the address bar, because it was only used by a small percentage of users.  Logical business decision, why support the feature that&#8217;s not in high demand.  However, what happens if you&#8217;re in that small group of users who used the RSS icon religiously?  Now, we are talking about <i>individuals</i> here.  Now consider the effect on the <i>business</i> if the core feature, that was a reason for CMS selection,and that&#8217;s a driving force behind your business, is discontinued.</p>
<h4>Lack of subject matter expertise</h4>
<p>So why is it so hard to find an off-the-shelf CMS product that fits your business?  The short answer is actually pretty simple &#8211; creators and developers of the products don&#8217;t know your business.  Internet is very young, and the demands for the online businesses change daily.  The original concept behind the content management was to allow easy creation and publishing of the content that was predominant on web 10 years ago.  The internet has changed.  It&#8217;s no longer a medium for wiki-style information; the content nowdays is dynamic, personalized, and more importantly, it&#8217;s not uniform.  Whereas before internet could&#8217;ve been viewed as a single purposed business vertical, like newspaper or magazine industry, it is now an ever-growing tool for running your business in a different channel, and as such, it has to comply to individual requirements of the business needs &#8211; in the same fashion as the businesses operate offline.  Noone in a right state of mind, when opening a restaurant, would buy retail store cash register software for the bar.  Even though both run on cash registers to ring our purchases, <i>the process</i> is very, very different between the two.  And everyone knows it.  And yet, people are buying into &#8220;one size fit all&#8221; CMS.  So why wouldn&#8217;t people apply the same philosophy for the online businesses?  Why would anyone think CMS product built specifically to create and publish <i>media</i> content would be good to back live sports scoreboard site?!  Content type, methods for publishing, workflow, and even data model do not resemble the use cases of the available products.  So why do people still try to push a square peg through a round hole?  </p>
<p>Again, the Internet is young.  And so is the concept of web content management.  Right now, the products available are created, designed, and built by web generalists, who are very web-savvy, but lack knowledge of any industry specific standards.  You can see the trends are shifting just a little recently, with the emergence of e-commerce specific CMS products, like Magento, designed specifically to manage the content of online stores.  I envision that in the near future we&#8217;ll see a surge of industry vertical specific CMS products (finance, sports, travel, etc) lead by the experts in the field.  This would provide a much-needed steam of products that would enable business to successfully operate online.  Until then &#8211; unless your business overlaps close with the media angle of the available CMS &#8211; consider building a tool that&#8217;s right for <strong><i>your</i></strong> business.</p>
 <img src="http://fayerplay.com/wp-content/plugins/feed-statistics.php?view=1&post_id=213" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://fayerplay.com/2011/05/anatomy-of-business-driven-cms/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Just do it</title>
		<link>http://fayerplay.com/2011/03/just-do-it/</link>
		<comments>http://fayerplay.com/2011/03/just-do-it/#comments</comments>
		<pubDate>Wed, 09 Mar 2011 15:29:05 +0000</pubDate>
		<dc:creator>Leon Fayer</dc:creator>
				<category><![CDATA[$work]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[rant]]></category>

		<guid isPermaLink="false">http://fayerplay.com/?p=79</guid>
		<description><![CDATA[I often get criticized for my mantra towards the development approach.  Your code may be elegant, by mine f***ing works.  In response, I hear statements ranging anywhere from &#8220;You don&#8217;t understand best practices&#8221; to &#8220;You hate testing!&#8221;  In an effort to avoid repeating myself on regular basis, I decided to write down [...]]]></description>
			<content:encoded><![CDATA[<p>I often get criticized for my mantra towards the development approach.  <em>Your code may be elegant, by mine f***ing works</em>.  In response, I hear statements ranging anywhere from &#8220;You don&#8217;t understand best practices&#8221; to &#8220;You hate testing!&#8221;  In an effort to avoid repeating myself on regular basis, I decided to write down my point of view on the topic.  Adhere to it or not &#8211; your choice.<br />
<span id="more-79"></span></p>
<p>First of all, let me make a blanket statement here: the sentence &#8220;the project is late &#8211; but [it looks better/it is easier to maintain/the code is cleaner]&#8221; (pick any that apply) is inherently flawed.  If the project is late &#8211; it&#8217;s not done.  Period.  There is no way to justify being late by using code quality/elegance as an argument. If the client needs a Christmas promotion, and you deliver a best product in a history of promotions on December 29th &#8211; it&#8217;s worthless. </p>
<p>Now, let&#8217;s address the &#8220;best practices&#8221; argument.   I will keep using this phrase in quotes because the standards vary across the board, despite some common misconceptions, short of the most common Best Practices 101 that every programmer should have imprinted in their brain before the first &#8220;Hello World&#8221; is written.  With that said, &#8220;best practices&#8221;, however you define it, should be a natural coding standard for any decent developer.  If you need to bake more time into the project time-line to make your code comply &#8211; you are, at best, new to the programming scene.  To trivialize the example, any seasoned programmer should instinctively know not to call the variables <code>$a</code>, <code>$b</code>, <code>$c</code>, etc., and properly indents the code lines.  Granted, there are more advanced &#8220;best practices&#8221; standards that one might argue, but the point stands.  And to expand on it, a veteran programmer knows when and, most importantly, <i>how</i> to cut corners, if needed, to meet the deadline.  Which brings me to my next point &#8211; over-engineering.</p>
<p>I understand the desire to build the best, most flexible and robust system for every project worked on.  I do.  But I also understand the usual business constraints of every project: time and money.  Most projects have a definite deadline and/or a specific budget that need to be met and, often times, building something grand is not feasible within either.  This is where the developer needs to make a conscious decision to limit the creativity to meet the goals.  There is no excuse to spend a week to setup a &#8220;proper&#8221; caching layer for the database queries operating on a 20-row table, that are only used from the administrative panel by three publishers.  Understand the use-cases.  And as cool as it may be to build a flexible and expendable XHR framework to support variable simultaneous requests; you don&#8217;t need to invest into it if the only feature that will be using it, is an update to a visitors counter on one page.  Understand the scope.  I cannot stress it enough &#8211; a good developer is not the one who knows how to build the most advanced system, a good developer is the one who knows when <i>not to</i> build that system.</p>
<p>In the world of software development, time to market is the driving force of the business.   In a world of internet application development it&#8217;s even more apparent because of the dynamics of the web.  The simplest solution is <i>not</i> often the best solution.  It is <i>always</i> the best solution.</p>
<p>Perhaps the best analogy of my philosophy on the topic was made by my <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL29tbml0aS5jb20vaXMvY2lwcmlhbi10dXR1">co-worker</a>, when he heard my rant for the N-th time, by using a <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QYXJrb3Vy">parkour</a>  reference.  Assuming the goal of the competition is to get to the roof of the high-rise &#8211; some people will jump from balcony to balcony to get to the end, some will climb fire ladders, some will form a human pyramid.  Me?  I would take an elevator.  </p>
 <img src="http://fayerplay.com/wp-content/plugins/feed-statistics.php?view=1&post_id=79" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://fayerplay.com/2011/03/just-do-it/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>One query show</title>
		<link>http://fayerplay.com/2011/02/one-query-show/</link>
		<comments>http://fayerplay.com/2011/02/one-query-show/#comments</comments>
		<pubDate>Thu, 03 Feb 2011 20:34:00 +0000</pubDate>
		<dc:creator>Leon Fayer</dc:creator>
				<category><![CDATA[$work]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[fail]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[rant]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[tips & tricks]]></category>

		<guid isPermaLink="false">http://fayerplay.com/?p=141</guid>
		<description><![CDATA[At $work we specialize in performance audits on systems of every size, from start-up sites hacked together overnight, to a ginormous applications built by world-recognized brand companies.  I&#8217;ve seen a lot of interesting (and sometimes very unique) performance issues in every level of the stack: code (front-end and back-end), architecture, databases, (sometimes all of [...]]]></description>
			<content:encoded><![CDATA[<p>At <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL29tbml0aS5jb20=">$work</a> we specialize in performance audits on systems of every size, from start-up sites hacked together overnight, to a ginormous applications built by world-recognized brand companies.  I&#8217;ve seen a lot of interesting (and sometimes very unique) performance issues in every level of the stack: code (front-end and back-end), architecture, databases, (sometimes all of the above), but there is one particular, very &#8220;Performance 101&#8243;, issue that I see all the time.  And frankly &#8211; it bugs the hell out of me.   In fact, the problem is so common sense that writing about it seems a little embarrassing, yet the frequency of seeing the same issue is proving otherwise.<br />
<span id="more-141"></span><br />
Consider the page that displays a list of items with some properties.  Now consider this code.  See anything wrong with it?</p>
<pre class="prettyprint">
# select a list of items
$sth = $dbh->prepare("select id from items where ....");
$sth->execute();
foreach ($hreh = $sth->fetchtow_hashref()) {
  # create an array of item objects with all the properties
  push @items, Module::Item->new($href->{id});
}

foreach (@items) {
  # render item list
  print "ID: ".$_->id."\n";
  print "Properties: ".join(",",@{$_->properties})."\n";
  ....
}
</pre>
<p>If you didn&#8217;t spot the problem right away &#8211; I may have to borrow <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2xldGhhcmd5Lm9yZy9+amVzdXMvd3JpdGVzL3RoZW8tc2Vla3MtYXNwaXJpbmctc3lzdGVtcy1hZG1pbmlzdHJhdG9y">Theo&#8217;s stick</a> and come over for a visit.  </p>
<p>It&#8217;s the classic n+1 problem.  The application is hitting a database to get the properties n(number of items) times, plus the hit from the initial query to get a list of items.  Why?!  There is absolutely no reason to do that.  Ever. Yet, I see the same issue over and over again in variety of applications, running on different systems, written in different languages.  Granted, one of the biggest offenders are the apps using a framework or an ORM (example above actually assumes Module::Item to know how to retrieve all the object data needed, including going to the database to get it).  Maybe the excuse is that the developer doesn&#8217;t know what happens under the hood of ORM, although if you don&#8217;t know the benefits and limitations of a tool &#8211; you shouldn&#8217;t be using it.  But I&#8217;ve also seen an alarming number of applications not using an ORM that have the same issue, and it&#8217;s even more obvious since you yourself are defining all the actions.</p>
<pre class="prettyprint">
# select a list of items
$sth = $dbh->prepare("select id from items where ...");
$sth->execute();
foreach ($hreh = $sth->fetchtow_hashref()) {
  # create an array of items with all the properties
  $sth_properties = $dbh->prepare("select * from item_properties
                                   where item_id = ?");
  $sth_properties->execute($href->{id});
  $item->{properties} = $sth_properties->fetchrow_arrayref();
  $item->{id} = $href->{id};
  push @items, $item;
}

foreach (@items) {
  # render item list
  print "ID: ".$_->{id}."\n";
  print "Properties: ".join(",",@{$_->{properties}})."\n";
  ....
}
</pre>
<p>If nothing else &#8211; having a <code>$dbh->prepare("SELECT ....")</code> and <code>$sth->execute</code> inside a loop should raise a whole lot of red flags right away (this approach has more than one issue, but let&#8217;s concentrate on the problem at hand).  There are different variations of the extent of, or lack of, ORM usage (as example, instead of initial SELECT you may use something like <code>Module::Item->get_all</code>) but it doesn&#8217;t change the sequence of logic, and subsequently, the performance. </p>
<p>I hope by this point of my rant everyone realized the &#8220;right&#8221; way of coding this bit of functionality, but just in case &#8211; here&#8217;s a code that produces exactly the same result with only 1 database query.</p>
<pre class="prettyprint">
# select a list of items WITH properties
$sth = $dbh->prepare("select p.* from items i, item_properties p
                              where i.id = p.id
                              and i. .....");
$sth->execute();
foreach ($hreh = $sth->fetchtow_hashref()) {
  # create an array of item objects with all the properties
  # without going back to the database
  push @items, bless $href, 'Module::Item';
}

foreach (@items) {
  # render item list
  print "ID: ".$_->id."\n";
  print "Properties: ".join(",",@{$_->properties})."\n";
  ....
}
</pre>
<p>So pretty please, with sugar on top, don&#8217;t create performance problems where there should be none! </p>
 <img src="http://fayerplay.com/wp-content/plugins/feed-statistics.php?view=1&post_id=141" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://fayerplay.com/2011/02/one-query-show/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Breaking social dependency</title>
		<link>http://fayerplay.com/2011/01/breaking-social-dependency/</link>
		<comments>http://fayerplay.com/2011/01/breaking-social-dependency/#comments</comments>
		<pubDate>Tue, 18 Jan 2011 21:04:47 +0000</pubDate>
		<dc:creator>Leon Fayer</dc:creator>
				<category><![CDATA[$work]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[case study]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[social media]]></category>
		<category><![CDATA[tips & tricks]]></category>

		<guid isPermaLink="false">http://fayerplay.com/?p=89</guid>
		<description><![CDATA[&#8220;OMG, Facebook is DOWN!!!&#8221;  was the cry of the millions when Facebook was unavailable for about 3 hours because of the network issues.  Given the nature of Facebook service, the downtime did not have any long lasting effects on it&#8217;s user base.  In fact, some say that the productivity significantly increased during [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" src="http://fayerplay.com/wp-content/uploads/2010/09/twitter-fail.jpg" alt="Twitter Fail Log" />&#8220;OMG, Facebook is DOWN!!!&#8221;  was the cry of the millions when <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ZhY2Vib29rLmNvbQ==">Facebook</a> was unavailable for about 3 hours because of the network issues.  Given the nature of Facebook service, the downtime did not have any long lasting effects on it&#8217;s user base.  In fact, some say that the productivity significantly increased during the 3 hour window without access to Facebook.   Bottom line is &#8211; the unavailability of the social networking service doesn&#8217;t negatively impact the users (ego and reputation of the service aside).  Question is: does it also hold true for the companies leveraging Facebook, or other social networks like Twitter, Flickr, FourSquare, etc., in their daily operations?</p>
<p><span id="more-89"></span></p>
<p>In this day and age, more and more companies operating online businesses try to break into the social media realm by leveraging existing services to increase visibility and loyalty of the brand, to bring more people to the sites, and consequently, increase the conversions, whether it&#8217;s visits, purchases, or participation.  I&#8217;ve seen many incarnations of social networking implementations, from the basic simplified authentication with Facebook Connect augmenting regular process (for ease of registration/login) to full blown applications relying heavily on multiple features available from the services&#8217; APIs.  Now, personally, I am all for having the services available, and used strategically throughout the applications.  It provides a tremendous benefit not only in brand familiarity and content, but also in cost saving, considering you&#8217;re leveraging years of someone else&#8217;s work for your gain.  Consider Flickr.  The storage, CDN, and REST APIs to present the assets are all developed and tested for you; all you need to do is to integrate the functionality within the content of your site.  The same services are available to everyone, and it&#8217;s a business decision which features would be beneficial to the company&#8217;s strategy.  The implementation of the features, however, varies significantly.</p>
<p>One of the major risks when implementing a third party service is the reliance on the availability of that third party service.  The service that you have no control over.  And no matter how large or successful the service that you&#8217;re using is &#8211; it will go down at one point or another.  Just look at the intro image with a log from my <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3R3aXR0ZXIuY29t">Twitter</a> client.  Now, imagine what happens during the downtime if your site heavily relies on Twitter API.</p>
<p>On a side note, I talked at length before about the <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ZheWVycGxheS5jb20vMjAwOS8xMS90by1jYXRjaC1hLWJ1Zy8=">need for application monitors</a> to assist both development and operations teams with monitoring the health of the <em>application</em>, because a lot of times just monitoring <em>system</em> health is not enough.  To offer a piece of advice, a good metric to track against your system and application performance is a commit log.  It allows you to correlate you version control commits and deployments to irregularities in trending patterns.  It also lets you identify the problematic piece of code when something goes wrong.  But I digress.</p>
<p>So let&#8217;s examine a situation.  A large online media company decided to switch to Facebook Connect as an exclusive authentication method for their site.  (To prevent the discussion about the viability of this choice, let me just note that there was a business reason for choosing this route.) This is where the fun starts. The graph below represents HTTP load time for the pages on the site at every stage of the process.  Even without the captions on the graph (given the tone of this post), everyone should be able to pin-point the exact time when the changeset went live, and the load time of the pages tripled.   The project owners were notified, but since the load times were extremely low to begin with (thank you caching) the load speed was deemed acceptable, and the changes remained in production.  Time passed.  And then some more.  And then the dark day came &#8211; the day when Facebook went down.  And the page load times on the media site tripled again, for a very brief period of time (while Facebook servers were just lagging), and then dropped to 0, i.e. &#8220;users are unable to see the site&#8221;.  Just like that &#8211; Facebook&#8217;s problem became the company&#8217;s problem.</p>
<p style="text-align: center;"><img class="size-full wp-image-103 aligncenter" title="facebook-connect" src="http://fayerplay.com/wp-content/uploads/2010/09/facebook-connect.jpg" alt="Facebook Connect Implementation" width="467" height="184" /></p>
<p>Upon closer code investigation the problem was identified and solved quickly, also reducing the page load time to it&#8217;s original threshold as a byproduct of the change, but it shows how dependent your site can become on a third party service availability if the features are not implemented correctly.</p>
<p>So how can these issues be avoided?  There are a few common sense rules, that for some reason often get ignored during the development, which should help with the integration of external services without effecting your site&#8217;s performance.</p>
<p><strong>1. Only connect to a third-party service where needed.</strong> Don&#8217;t try to connect to Facebook on every page load to validate that user is still the user you displayed the previous page to.  Cache the results locally.<br />
<br />
<strong>2. Don&#8217;t make connections to a third-party service in the critical path of the page load.</strong> Don&#8217;t load Google Analytics as a first thing on your page, you will delay the display of the content that actually matters.   Make the connections after your content is loaded, or better yet &#8211; connect asynchronously.<br />
<br />
<strong>3. Trap time-outs and errors.</strong> You do it with your database connections, why would you treat external connections differently?<br />
<br />
<strong>4. Create a fallback plan.</strong>  You have no control over external services, but you do have the control over the content presented to your users.   If  Flickr feed is the essential feature of your site &#8211; store the displayed history locally, so you can fall back to the latest available content in case Flickr is unavailable.  Remember, sometimes stale content is better then no content at all.</p>
<p>To make a blanket statement &#8212; don’t jump to using social media features without identifying a need for them, use them to support your primary business model.   At the end of the day, when integrating any third party service, you are trying to leverage the benefits of the available functionality to enhance the experience for your own users, not to inherit the services’ availability problems.   Integrate smartly, not blindly. </p>
 <img src="http://fayerplay.com/wp-content/plugins/feed-statistics.php?view=1&post_id=89" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://fayerplay.com/2011/01/breaking-social-dependency/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Print override</title>
		<link>http://fayerplay.com/2010/02/print-override/</link>
		<comments>http://fayerplay.com/2010/02/print-override/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 06:50:35 +0000</pubDate>
		<dc:creator>Leon Fayer</dc:creator>
				<category><![CDATA[$work]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tips & tricks]]></category>

		<guid isPermaLink="false">http://fayerplay.com/?p=45</guid>
		<description><![CDATA[I came across this problem when I decided to integrate Growl notification support for my Perl script.  Instead of using a standard custom log() function, I wanted to override the print function to pipe the output to the media of my liking.  Unfortunately, print is a reserved keyword in Perl which cannot be [...]]]></description>
			<content:encoded><![CDATA[<p>I came across this problem when I decided to integrate <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2dyb3dsLmluZm8v" target=\"_blank\">Growl</a> notification support for my Perl script.  Instead of using a standard custom <code>log()</code> function, I wanted to override the <code>print</code> function to pipe the output to the media of my liking.  Unfortunately, <code>print</code> is a reserved keyword in Perl which cannot be overridden.  Fortunately, it&#8217;s Perl &#8211; so there is no such thing as impossible.<br />
<span id="more-45"></span><br />
I wrote the OmniLogger module, to allow the script to automatically pipe <code>STDOUT</code> and/or <code>STDERR</code> to any media of  choice.  It&#8217;s short, very light-weight, and can be used as is, or sub-classed, for any number of different outputs (files, Growl, databases, etc).</p>
<ol>OmniLogger</ol>
<pre class="prettyprint">
package OmniLogger;
use Symbol;

sub import {
  my $self = shift;
  foreach (@_) {
    if ($_ eq 'stdout') {
      *STDOUT = $self->new;
    } elsif ($_ eq 'stderr') {
      *STDERR = $self->new;
    }
  }
  $self->init(@_);
}

sub new {
  my $self = shift;
  my $sym = gensym;
  tie *$sym, $self;
  bless $sym, $self;
}

sub TIEHANDLE { bless {}, shift }

sub PRINT { shift->log(shift)}

sub init { return; }

sub log { return; }

sub DESTROY { return; }

1;
</pre>
<p>That&#8217;s it.  <code>log()</code> function is for implementing logging mechanics, and <code>init()</code> and <code>DESTROY()</code> are for methods that require constructor/destructor actions.</p>
<p>Let&#8217;s assume, for the example sake, that the goal is to print &#8220;Hello World!&#8221; to the file.  First, let&#8217;s subclass Logger as Logger::File and define the output.</p>
<ol>OmniLogger::File</ol>
<pre class="prettyprint">
package OmniLogger::File;
use base 'OmniLogger';
use Filehandle;

my $_fh;

sub init {
    my $self = shift;
    $_fh = FileHandle->new("/var/tmp/logger.log","a+");
}

sub log {
    my $self = shift;
    my $msg = shift;
    if (defined $_fh) {
        $_fh->printf("%s","$msg\n");
    }
}

sub DESTROY { $_fh->close; }

1;
</pre>
<p>And now, let&#8217;s use it.  The module allows two types of usage: standard function call and the full override of outputs. </p>
<ol>Standard call</ol>
<pre class="prettyprint">
#!/usr/bin/perl
use OmniLogger::File;

my $logger = OmniLogger::File->new;
$logger->log("Hello World!");
</pre>
<ol>Global Override</ol>
<pre class="prettyprint">
#!/usr/bin/perl
use OmniLogger::File  <strong>qw(stdout)</strong>;

print "Hello World!";
</pre>
<p>Both examples will yield the same result.  The major difference is that every print call in the script in the second example will be printed to the file.   This allows to avoid those long annoying debugging <code>print FILEHANDLE</code> lines in the code and just use oh-so-familiar <code>print</code>.</p>
<p>In addition, override of <code>STDERR</code> is also allowed, in case logging all the errors in the script is a goal.</p>
<pre class="prettyprint">
#!/usr/bin/perl
use OmniLogger::File  <strong>qw(stderr)</strong>;

die "Goodbye Cruel World!";
</pre>
<p><strong>Disclaimer</strong>:  This trick will not work within frameworks, like <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2xhYnMub21uaXRpLmNvbS90cmFjL211bmdv">Mungo</a>, that already override <code>print</code>.</p>
 <img src="http://fayerplay.com/wp-content/plugins/feed-statistics.php?view=1&post_id=45" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://fayerplay.com/2010/02/print-override/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sexifying 2010</title>
		<link>http://fayerplay.com/2010/01/sexifying-2010/</link>
		<comments>http://fayerplay.com/2010/01/sexifying-2010/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 19:05:27 +0000</pubDate>
		<dc:creator>Leon Fayer</dc:creator>
				<category><![CDATA[$work]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[fonts]]></category>

		<guid isPermaLink="false">http://fayerplay.com/?p=12</guid>
		<description><![CDATA[To start the year off right, I thought I’d talk about something fun for everyone.  For quite some time now OmniTI and Clearleft have been working on Fontdeck, a web service delivering real fonts to your website.  As we are fast-approaching open beta, I decided to talk a bit about the service, as [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ZvbnRkZWNrLmNvbQ=="><img class="alignleft" title="Fontdeck" src="http://25.media.tumblr.com/avatar_4cccedc5d279_128.png" alt="Fontdeck" width="128" height="128" /></a>To start the year off right, I thought I’d talk about something fun for everyone.  For quite some time now <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL29tbml0aS5jb20v">OmniTI</a> and <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NsZWFybGVmdC5jb20v">Clearleft</a> have been working on <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ZvbnRkZWNrLmNvbS8=">Fontdeck</a>, a web service delivering real fonts to your website.  As we are fast-approaching open beta, I decided to talk a bit about the service, as well as to showcase some of the fonts.  And just because I am in that kind of mood, the rest of the post will be modeled based on the late night infomercial that everyone love to hate.<span id="more-12"></span></p>
<h3>Are you tired of the same boring web fonts?</h3>
<p>Look at any website.  Look closely.  Now go to another website.  Rinse and repeat.  Again.  What you see is a same set of fonts used over and over across vast majority of the websites.  <span style="font-family: Arial;">Arial</span>, <span style="font-family: Helvetica;">Helvetica</span>, <span style="font-family: Times New Roman;">Times New Roman</span>.  Not much of a variation there, is it?  Didn&#8217;t you wish that your website could do something different?  Well, now you can!  <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ZvbnRkZWNrLmNvbQ==">Fontdeck</a> offers fonts for your website that, up until now, you were only able to use offline!</p>
<h3>But what about all the websites that use cool fonts for their logos?</h3>
<p>What an excellent question!  There are websites that try to mimic unique fonts on the web by creating text images in Photoshop or using Flash to display the fonts.  Those techniques are nothing but hacks in order to circumvent inadequacies of the browsers.  By using any of the media techniques those sites are limiting their flexibility to manipulate fonts (scaling, as example), increasing production time (making new images), or having to deal with SEO and accessibility issues (Flash).</p>
<h3>So how does Fontdeck solve these problems?</h3>
<p><a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ZvbnRkZWNrLmNvbQ==">Fontdeck</a> is using CSS @font-face technique to provide a true text to the user that can be scaled, translated and searched.  No JavaScript?  No Flash?  No problem!</p>
<h3>I don&#8217;t know, It sounds complicated&#8230;</h3>
<p>It&#8217;s not!  It takes minutes to add the needed fonts to your web site!  Of course, you could spend much more time browsing for that perfect font that would represent a picture of your cat.</p>
<h2 style="font-family: 'John Doe Regular', 'American Typewriter', monospace; font-size: 1.8em;">BUT WAIT, THERE IS MORE!</h2>
<p>Actually, no, there isn&#8217;t.  I just wanted to show off yet another font.  Sign up for <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ZvbnRkZWNrLmNvbQ==">Fontdeck</a> news and check out the fonts used for this blog.</p>
<p>And to finish off this rant, let me quote <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL29tbml0aS5jb20vaXMvdGhlby1zY2hsb3NzbmFnbGU=" target=\"_blank\">Theo Schlossnagle</a>, for those of you who are interested in the technology magic behind the service.</p>
<blockquote><p>Fontdeck is powered by our friends: Apache, PostgreSQL, OpenSolaris, a bit of Linux here and there, a sprinkling of both asymmetric and symmetric cryptography and an ancient dialect of computer-speak called Perl.</p></blockquote>
 <img src="http://fayerplay.com/wp-content/plugins/feed-statistics.php?view=1&post_id=12" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://fayerplay.com/2010/01/sexifying-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>To catch a bug</title>
		<link>http://fayerplay.com/2009/11/to-catch-a-bug/</link>
		<comments>http://fayerplay.com/2009/11/to-catch-a-bug/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 17:28:31 +0000</pubDate>
		<dc:creator>Leon Fayer</dc:creator>
				<category><![CDATA[$work]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[monitoring]]></category>
		<category><![CDATA[rant]]></category>
		<category><![CDATA[trending]]></category>

		<guid isPermaLink="false">http://fayerplay.com/?p=8</guid>
		<description><![CDATA[

Mistakes happen.  People who make a claim that they can produce bug free product are lying either to you or to themselves.  And it is debatable what’s worse.  Anyone who worked in the tech industry for a few years has a couple of horror stories up their sleeves about THE mistake.  Some of those stories [...]]]></description>
			<content:encoded><![CDATA[<div>
<div>
<p>Mistakes happen.  People who make a claim that they can produce bug free product are lying either to you or to themselves.  And it is debatable what’s worse.  Anyone who worked in the tech industry for a few years has a couple of horror stories up their sleeves about THE mistake.  Some of those stories are amusing, in retrospect of course, some are pretty disturbing, but all of them clearly demonstrate one point – there is no perfection.   As the systems today become more and more complex it is virtually impossible to avoid all the mistakes and implement a bug-free solution.  So once you accept it as an axiom, the accent shifts from the question “How to avoid all mistakes?” to “How to minimize the impact of a mistake?”<span id="more-8"></span></p>
<h3>Defining “done”</h3>
<p>There are a couple of common misconceptions in a development world, that could potentially be costly to the companies.  One of them is a developer’s belief that the work is “done” when it is deployed to production.  While it is true from the sign-off and acceptance perspective, it is of very little comfort to company when they realize that the brand new holiday campaign that launched last week (tested and approved), is not actually collecting order information on “Black Friday”.   Or, taking a well known example, Y2K bug breaks applications developed years before the year 2000.  Bottom line is – the solution needs to be working not only today or tomorrow, but months and years from now.  And by marrying this goal with a previously derived axiom that no solution is 100% bug-free we have a pretty interesting challenge on our hands.  Which brings back  the question of how to timely identify and mitigate the impact of a mistake.</p>
<h3>The answer</h3>
<p>If you expected revelations of all the world secrets and conspiracies after the long preamble – you’re in the <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy50cnVlY29uc3BpcmFjaWVzLmNvbS8=" target=\"_blank\">wrong place</a>.  The answer is simple.  Monitoring.  Anyone who is running a website in this day and age employs some monitoring strategy to make sure the site is up and running.   Most of these people firmly believe that the monitors in place is sufficient to run their business successfully.  And most of them are wrong.</p>
<h3>Flaws in “traditional” monitoring</h3>
<p>Complexity of the web applications today has gone far and beyond the capabilities of the “traditional” monitoring.  Keeping tabs on uptime and responses of your site will not paint a full picture of the application performance and, consequentially, will let the the problems slip through the cracks.  <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3R3aXR0ZXIuY29tLw==" target=\"_blank\">Twitter</a> serves over 20 million unique visitors a day … and is legendary for it’s downtime.  Now, traditional HTTP checks would notify operations team if the site is to become unavailable immediately.   But what happens is the site is, seemingly, up and running.  HTTP checks return 200 code from target page checks and the browsing trends are above threshold.  Everything is up and running, users are happy, the operations team can go out for a few beers.  Right?  Wrong!  One of the more recent problems with Twitter was lost tweet data.  The site was up and available for browsing, the API accepted post requests and returned success codes, but the post never registered with Twitter.  From the standpoint of basic checks the site was operational, but not from the standpoint of frustrated users.  Now, in all fairness, because of viral popularity and non-sensitive data, Twitter’s constant issues do not significantly effect the bottom line for the company, unlike most companies, who would be paying for the business downtime either in hard dollars, opportunity cost, or both.   In order to minimize these costs, the companies need to identify and implement specific business rules that would provide a sound base for measuring the availability and success of the service offered.</p>
<h3>Business rules for developers</h3>
<p>Which brings us back to the developer’s perspective.  Establishing business rules does not only establish the base for business success, but can also establish the success criteria for the job being “done” after the launch.  If the project involves site registration (beta sign-up pages, membership sites, etc), a viable business check would be to make sure the hourly number of registrations does not drop below the set threshold.  If you’re working on an e-commerce solution, credit card transaction success v failure ratio would be a good measurement to be certain that the process works as expected.   Note, that business checks do not conflict with system checks.  They can (and should) be used in conjunction with each other.</p>
<h3>Who to blame?</h3>
<p>There is a clear line of responsibility between system administrators and developers, which is often blurred, leading to either an effective teamwork or cross-department finger pointing.  Often times operations have no knowledge about the application-specific functionality or how the systems changes would effect the application.  System administrators are responsible for <em>system</em> health.  Developers are responsible for <em>application <strong> </strong></em> health.   Following the above example, if your web server is offline – the application will not be accepting any registrations.  But bringing the server back online does not guarantee successful application resumption.  If there are no monitors validating application behavior – there are no problems. From the stand point of operations team – everything is up and running.  From the stand point of the business owner – not so much.</p>
<h3>To wrap up …</h3>
<p>Development of business and functionality monitors should be a part of any project scope.  Period.  The application may be elegant, may be extensible, may be <em>near-</em>perfect, but if that “<em>near” </em>rears it’s ugly head without anyone noticing and acting in a timely fashion – no redeeming quality of the application can negate that.  There is a variety of <a href="http://fayerplay.com/wp-content/plugins/feed-statistics.php?url=aHR0cHM6Ly9sYWJzLm9tbml0aS5jb20vdHJhYy9yZXNtb24=" target=\"_blank\">tools</a> to help the developers to get the job done and be compliant with company’s monitoring guidelines.  Get them, learn them, use them.</p>
</div>
</div>
 <img src="http://fayerplay.com/wp-content/plugins/feed-statistics.php?view=1&post_id=8" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://fayerplay.com/2009/11/to-catch-a-bug/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

