<?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>MKBlog &#187; Products</title>
	<atom:link href="http://blog.mugunthkumar.com/category/products/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.mugunthkumar.com</link>
	<description>iPhone, iPad, Windows Phone Development and Usability Guidelines</description>
	<lastBuildDate>Mon, 30 Jan 2012 02:54:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>iOS Framework: Introducing MKNetworkKit</title>
		<link>http://blog.mugunthkumar.com/products/ios-framework-introducing-mknetworkkit/</link>
		<comments>http://blog.mugunthkumar.com/products/ios-framework-introducing-mknetworkkit/#comments</comments>
		<pubDate>Tue, 29 Nov 2011 11:22:49 +0000</pubDate>
		<dc:creator>Mugunth Kumar</dc:creator>
				<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[Products]]></category>
		<category><![CDATA[arc]]></category>
		<category><![CDATA[blocks]]></category>
		<category><![CDATA[ios5]]></category>
		<category><![CDATA[mknetworkkit]]></category>
		<category><![CDATA[networking]]></category>
		<category><![CDATA[restful]]></category>

		<guid isPermaLink="false">http://blog.mugunthkumar.com/?p=1319</guid>
		<description><![CDATA[How awesome would it be if a networking framework automatically takes care of caching responses for you? How awesome would it be if a networking framework automatically remembers your operations when your client is offline? You favorite a tweet or mark a feed as read when you are offline and the Networking Framework performs all [...]
Related posts:<ol>
<li><a href='http://blog.mugunthkumar.com/coding/ios-tutorial-advanced-networking-with-mknetworkkit/' rel='bookmark' title='iOS Tutorial: Advanced Networking with MKNetworkKit'>iOS Tutorial: Advanced Networking with MKNetworkKit</a> <small>Couple of weeks ago, I wrote a clean, fast networking...</small></li>
<li><a href='http://blog.mugunthkumar.com/products/introducing-my-book-ios-5-programming-pushing-the-limits/' rel='bookmark' title='Introducing my book: iOS 5 Programming Pushing the Limits'>Introducing my book: iOS 5 Programming Pushing the Limits</a> <small>iOS 5 Programming Pushing the Limits Developing Extraordinary Mobile Apps...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p></p><p>How awesome would it be if a networking framework automatically takes care of caching responses for you? </p>
<p>How awesome would it be if a  networking framework automatically remembers your operations when your client is offline? </p>
<p>You favorite a tweet or mark a feed as read when you are offline and the Networking Framework performs all these operations when the device comes back online, all with no extra coding effort from you. Introducing MKNetworkKit.</p>
<h2>What is MKNetworkKit?</h2>
<p><strong>MKNetworkKit</strong> is a networking framework written in Objective-C that is seamless, block based, ARC ready and easy to use.<br />
MKNetworkKit is inspired by the other two popular networking frameworks, ASIHTTPRequest and AFNetworking. Marrying the feature set from both, MKNetworkKit throws in a bunch of new features. In addition to this, MKNetworkKit mandates you to write slightly more code than the other frameworks at the expense of code clarity. With MKNetworkKit, it&#8217;s hard to write ugly networking code.</p>
<h2>Features</h2>
<h4>Super light-weight</h4>
<p>The complete kit is just 2 major classes and some category methods. This means, adopting MKNetworkKit should be super easy.</p>
<h4>Single Shared Queue for your entire application.</h4>
<p>Apps that depend heavily on Internet connectivity should optimize the number of concurrent network operations. Unfortunately, there is no networking framework that does this correctly. Let me give you an example of what can go wrong if you don&#8217;t optimize/control the number of concurrent network operations in your app.</p>
<p>Let&#8217;s assume that you are uploading a bunch of photos (think <a href="http://www.color.com/">Color</a> or <a href="http://batch.com/">Batch</a>) to your server. Most mobile networks (3G) don&#8217;t allow more than two concurrent HTTP connections from a given IP address. That is, from your device, you cannot open more than two concurrent HTTP connections on a 3G network. Edge is even worse. You can&#8217;t, in most cases, open more than one connection. This limit is considerably high (six) on a traditional home broadband (Wifi). However, since your iDevice is not always connected to Wifi, you should be prepared for throttled/restricted network connectivity. On any normal case, the iDevice is mostly connected to a 3G network, which means, you are restricted to upload only two photos in parallel. Now, it is not the slow upload speed that hurts. The real problem arises when you open a view that loads thumbnails of photos (say on a different view) while this uploading operations are running in the background. When you don&#8217;t properly control the queue size across the app, your thumbnail loading operations will just timeout which is not really the right way to do it. The right way to do this is to prioritize your thumbnail loading operation or wait till the upload is complete and the load thumbnails. This requires you to have a single queue across the entire app. MKNetworkKit ensures this automatically by using a single shared queue for every instance of it. While MKNetworkKit is not a singleton by itself, the shared queue is.</p>
<h4>Showing the Network Activity Indicator correctly</h4>
<p>While there are many third party classes that uses &#8220;incrementing&#8221; and &#8220;decrementing&#8221; the number of network calls and using that to show the network activity indicator, MKNetworkKit backs on the single shared queue principle and shows the activity indicator automatically when there is an operation running in the shared queue by observing (KVO) the operationCount property. As a developer, you normally don&#8217;t have to worry about setting the network activity indicator manually, ever again.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">    <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>object <span style="color: #002200;">==</span> _sharedNetworkQueue <span style="color: #002200;">&amp;&amp;</span> <span style="color: #002200;">&#91;</span>keyPath isEqualToString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;operationCount&quot;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
        <span style="color: #002200;">&#91;</span>UIApplication sharedApplication<span style="color: #002200;">&#93;</span>.networkActivityIndicatorVisible <span style="color: #002200;">=</span> 
        <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>_sharedNetworkQueue.operations count<span style="color: #002200;">&#93;</span> &gt; <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span>;        
    <span style="color: #002200;">&#125;</span></pre></div></div>

<h4>Auto queue sizing</h4>
<p>Continuing the previous discussion, I told that most mobile networks don&#8217;t allow more than two concurrent connections. So your queue size should be set to two, when the current network connectivity is 3G. MKNetworkKit automatically handles this for you. When the network drops to 3G/EDGE/GPRS, it changes the number of concurrent operations that can be performed to 2. This is automatically changed back to 6 when the device connects back to a Wifi network. With this technique in place, you will see a huge performance benefit when you are loading thumbnails (or multiple similar small requests) for a photo library from a remote server over 3G.</p>
<h4>Auto caching</h4>
<p>MKNetworkKit can automatically cache all your &#8220;GET&#8221; requests. When you make the same request again, MKNetworkKit calls your completion handler with the cached version of the response (if it&#8217;s available) almost immediately. It also makes a call to the remote server again. After the server data is fetched, your completion handler is called again with the new response data. This means, you don&#8217;t have to handle caching manually on your side. All you need to do is call one method,</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>MKNetworkEngine sharedEngine<span style="color: #002200;">&#93;</span> useCache<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>Optionally, you can override methods in your MKNetworkEngine subclass to customize your cache directory and in-memory cache cost.</p>
<h4>Operation freezing</h4>
<p>With MKNetworkKit, you have the ability to freeze your network operations. When you freeze an operation, in case of network connectivity losses, they will be serialized automatically and performed once the device comes back online. Think of &#8220;drafts&#8221; in your twitter client.</p>
<p>When you post a tweet, mark that network call as freezable and MKNetworkKit automatically takes care of freezing and restoring these requests for you! So the tweets get sent later without you writing a single line of additional code. You can use this for other operations like favoring a tweet or sharing a post from your Google reader client, adding a link to Instapaper and similar operations.</p>
<h4>Performs exactly one operation for similar requests</h4>
<p>When you load thumbnails (for a twitter stream), you might end up creating a new request for every avatar image. But in reality, you only need as many requests as there are unique URLs. With MKNetworkKit, every GET request you queue gets executed exactly once. MKNetworkKit is intelligent enough not to cache &#8220;POST&#8221; http requests.</p>
<h4>Image Caching</h4>
<p>MKNetworkKit can be seamlessly used for caching thumbnail images. By overriding a few methods, you can set how many images should be held in the in-memory cache and where in the Caches directory it should be saved. Overriding these methods are completely optional.</p>
<h4>Performance</h4>
<p>One word. SPEED. MKNetworkKit caching is seamless. It works like NSCache, except that, when there is a memory warning, the in-memory cache is written to the Caches directory.</p>
<h4>Full support for Objective-C ARC</h4>
<p>You normally choose a new networking framework for new projects. MKNetworkKit is not meant for replacing your existing framework (though you can, it&#8217;s quite a tedious job). On new projects, you will almost and always want to enable ARC and as on date of writing this, MKNetworkKit is probably the only networking framework that is fully ARC ready. ARC based memory management is usually an order of magnitude faster than non-ARC based memory management code.</p>
<h2>How to use</h2>
<p>Ok, Enough self-praises. Let us now see how to use the framework.</p>
<h3>Adding the MKNetworkKit</h3>
<ol>
<li>Drag the MKNetworkKit directory to your project.
<li>Add the CFNetwork.Framework, SystemConfiguration.framework and Security.framework.
<li>Include MKNetworkKit.h to your PCH file
<li>Delete NSAlert+MKNetworkKitAdditions.h file if you are building for iOS.
<li>Delete UIAlertView+MKNetworkKitAdditions.h file if you are building for Mac.
</ol>
<p>You are done. Just 5 core files and there you go. A powerful networking kit.</p>
<h3>Classes in MKNetworkKit</h3>
<ol>
<li>MKNetworkOperation
<li>MKNetworkEngine
<li>Miscellaneous helper classes (Apple&#8217;s Reachability) and categories
</ol>
<p>I believe in simplicity. Apple has done the heavy lifting of writing the actual networking code. What a third-party networking framework should provide is an elegant queue based networking with optional caching. I believe that, any third party framework should have under 10 classes (whether it&#8217;s networking or UIKit replacement or whatever). More than that is a bloat. Three 20 library is an example of bloat and so is ShareKit. May be it&#8217;s good. But it still huge and bloated. ASIHttpRequest or AFNetworking are lean and lightweight, unlike RESTKit. JSONKit is lightweight unlike TouchJSON (or any of the TouchCode libraries). May be it&#8217;s just me, but I just can&#8217;t take it when more than a third of source code lines in my app comes from a third party library. </p>
<p>The problem with a huge framework is the difficulty in understanding the internal working and the ability to customize it to suit your needs (in case you need to). My frameworks (MKStoreKit for adding In App Purchases to your app) have always been super easy to use and I believe MKNetworkKit would also be the same. For using MKNetworkKit, all you need to know are the methods exposed by the two classes MKNetworkOperation and MKNetworkEngine. MKNetworkOperation is similar to the ASIHttpRequest class. It is a subclass of NSOperation and it wraps your request and response classes. You create a MKNetworkOperation for every network operation you need in your application.</p>
<p>MKNetworkEngine is a pseudo-singleton class that manages the network queue in your application. It&#8217;s a pseudo-singleton, in the sense, for simple requests, you should use MKNetworkEngine methods directly. For more powerful customization, you should subclass it. Every MKNetworkEngine subclass has its own Reachability object that notifies it of server reachability notifications. You should consider creating a subclass of MKNetworkEngine for every unique REST server you use. It&#8217;s pseudo-singleton in the sense, every single request in any of it&#8217;s subclass goes through one and only one single queue.</p>
<p>You can retain instances of your MKNetworkEngine in your application delegate just like CoreData managedObjectContext class. When you use MKNetworkKit, you create an MKNetworkEngine sub class to logically group your network calls. That is, all Yahoo related methods go under one single class and all Facebook related methods into another class. We will now look at three different examples of using this framework.</p>
<h3>Example 1:</h3>
<p>Let&#8217;s now create a &#8220;YahooEngine&#8221; that pulls currency exchange rates from Yahoo finance.</p>
<p><strong>Step 1:</strong> Create a YahooEngine class as a subclass of MKNetworkEngine. MKNetworkEngine init method takes hostname and custom headers (if any). The custom headers is optional and can be nil. If you are writing your own REST server (unlike this case), you might consider adding client app version and other misc data like client identifier.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">    <span style="color: #400080;">NSMutableDictionary</span> <span style="color: #002200;">*</span>headerFields <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableDictionary</span> dictionary<span style="color: #002200;">&#93;</span>; 
    <span style="color: #002200;">&#91;</span>headerFields setValue<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;iOS&quot;</span> forKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;x-client-identifier&quot;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
    self.engine <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>YahooEngine alloc<span style="color: #002200;">&#93;</span> initWithHostName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;download.finance.yahoo.com&quot;</span> 
                       customHeaderFields<span style="color: #002200;">:</span>headerFields<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>Note that, while yahoo doesn&#8217;t mandate you to send x-client-identifier in the header, the sample code shown above sends this just to illustrate this feature. </p>
<p>Since the complete code is ARC, it&#8217;s up to you as a developer to own (strong reference) the Engine instance.</p>
<p>When you create a MKNetworkEngine subclass, Reachability implementation is done automatically for you. That&#8217;s when your server goes down or due to some unforeseen circumstances, the hostname is not reachable, your requests will automatically be queued/frozen. For more information about freezing your operations, read the section Freezing Operations later in the page.</p>
<p><strong>Step 2:</strong> Designing the Engine class (Separation of concerns)</p>
<p>Let&#8217;s now start write the methods in Yahoo Engine to fetch exchange rates. The engine methods will be called from your view controller. A good design practice is to ensure that your engine class doesn&#8217;t expose URL/HTTPHeaders to the calling class. Your view should not &#8220;know&#8221; about URL endpoints or the parameters needed. This means, parameters to methods in your Yahoo Engine should be the currencies and the number of currency units. The return value of this method could be a double value that is the exchange rate factor and may be the timestamp of the time it was fetched. Since operations are not performed synchronously, you should return these values on blocks. An example of this would be,</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>MKNetworkOperation<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> currencyRateFor<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> sourceCurrency 
                   	    inCurrency<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> targetCurrency 
			  onCompletion<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>CurrencyResponseBlock<span style="color: #002200;">&#41;</span> completion
        	               onError<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>ErrorBlock<span style="color: #002200;">&#41;</span> error;</pre></div></div>

<p>MKNetworkEngine, the parent class defines three types of block methods as below.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">typedef</span> <span style="color: #a61390;">void</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">^</span>ProgressBlock<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">double</span> progress<span style="color: #002200;">&#41;</span>;
<span style="color: #a61390;">typedef</span> <span style="color: #a61390;">void</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">^</span>ResponseBlock<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#40;</span>MKNetworkOperation<span style="color: #002200;">*</span> operation<span style="color: #002200;">&#41;</span>;
<span style="color: #a61390;">typedef</span> <span style="color: #a61390;">void</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">^</span>ErrorBlock<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSError</span><span style="color: #002200;">*</span> error<span style="color: #002200;">&#41;</span>;</pre></div></div>

<p>In our YahooEngine, we are using a new kind of block, <em>CurrencyResponseBlock</em> that returns the exchange rate. The definition looks like this.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">typedef</span> <span style="color: #a61390;">void</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">^</span>CurrencyResponseBlock<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">double</span> rate<span style="color: #002200;">&#41;</span>;</pre></div></div>

<p>In any normal application, you should be defining your own block methods similar to this <em>CurrencyResponseBlock</em> for sending data back to the view controllers.</p>
<p><strong>Step 3:</strong> Processing the data<br />
Data processing, that is converting the data you fetch from your server, whether it&#8217;s JSON or XML or binary plists, should be done in your Engine. Again, relieve your controllers of doing this task. Your engine should send back data only in proper model objects or arrays of model objects (in case of lists). Convert your JSON/XML to models in the engine. Again, to ensure proper separation of concerns, your view controller should not &#8220;know&#8221; about the &#8220;keys&#8221; for accessing individual elements in your JSON.</p>
<p>That concludes the design of your Engine. Most networking framework doesn&#8217;t force you to follow this separation of concerns. We do, because we care for you <img src='http://blog.mugunthkumar.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Step 4:</strong> Method implementation<br />
We will now discuss the implementation details of the method that calculates your currency exchange.</p>
<p>Getting currency information from Yahoo, is as simple as making a GET request.<br />
I wrote a macro to format this URL for a given currency pair.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#define YAHOO_URL(__C1__, __C2__) [NSString stringWithFormat:@&quot;d/quotes.csv?e=.csv&amp;f=sl1d1t1&amp;s=%@%@=X&quot;, __C1__, __C2__]</span></pre></div></div>

<p>Methods you write in your engine class should do the following in order.</p>
<ol>
<li> Prepare your URL from the parameters.
<li> Create a MKNetworkOperation object for the request.
<li> Set your method parameters.
<li> Add completion and error handlers to the operation (The completion handler is the place to process your responses and convert them to Models.)
<li> Optionally, add progress handlers to the operation. (Or do this on the view controller)
<li> If your operation is file download, set a download stream (normally a file) to it. This is again optional.
<li> When the operation completes, process the result and invoke the block method to return this data to the calling method.
</ol>
<p>This is illustrated in the following code</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">        MKNetworkOperation <span style="color: #002200;">*</span>op <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>self operationWithPath<span style="color: #002200;">:</span>YAHOO_URL<span style="color: #002200;">&#40;</span>sourceCurrency, targetCurrency<span style="color: #002200;">&#41;</span> 
                                                  params<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span> 
                                             httpMethod<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;GET&quot;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #002200;">&#91;</span>op onCompletion<span style="color: #002200;">:^</span><span style="color: #002200;">&#40;</span>MKNetworkOperation <span style="color: #002200;">*</span>completedOperation<span style="color: #002200;">&#41;</span>
     <span style="color: #002200;">&#123;</span>
         DLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%@&quot;</span>, <span style="color: #002200;">&#91;</span>completedOperation responseString<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
		 <span style="color: #11740a; font-style: italic;">// do your processing here</span>
         completionBlock<span style="color: #002200;">&#40;</span>5.0f<span style="color: #002200;">&#41;</span>;
&nbsp;
     <span style="color: #002200;">&#125;</span>onError<span style="color: #002200;">:^</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSError</span><span style="color: #002200;">*</span> error<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
         errorBlock<span style="color: #002200;">&#40;</span>error<span style="color: #002200;">&#41;</span>;
     <span style="color: #002200;">&#125;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #002200;">&#91;</span>self enqueueOperation<span style="color: #002200;">:</span>op<span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #a61390;">return</span> op;</pre></div></div>

<p>The above code formats the URL and creates a MKNetworkOperation. After setting the completion and error handlers it queues the operation by calling the super class&#8217;s enqueueOperation method and returns a reference to it. Your view controller should own this operation and cancel it when the view is popped out of the view controller hierarchy. So if you call the engine method in, say viewDidAppear, cancel the operation in viewWillDisappear. Canceling the operation will free up the queue for performing other operations in the subsequent view (Remember, only two operations can be performed in parallel on a mobile network. Canceling your operations when they are no longer needed goes a long way in ensuring performance and speed of your app).</p>
<p>You view controller can also (optionally) add progress handlers and update the user interface. This is illustrated below.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">    <span style="color: #002200;">&#91;</span>self.uploadOperation onUploadProgressChanged<span style="color: #002200;">:^</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">double</span> progress<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
        DLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%.2f&quot;</span>, progress<span style="color: #002200;">*</span><span style="color: #2400d9;">100.0</span><span style="color: #002200;">&#41;</span>;
        self.uploadProgessBar.progress <span style="color: #002200;">=</span> progress;
    <span style="color: #002200;">&#125;</span><span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>MKNetworkEngine also has convenience methods to create a operation with just a URL. So the first line of code can also be written as</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">        MKNetworkOperation <span style="color: #002200;">*</span>op <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>self operationWithPath<span style="color: #002200;">:</span>YAHOO_URL<span style="color: #002200;">&#40;</span>sourceCurrency, targetCurrency<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>Do note here that request URLs are automatically prefixed with the hostname you provided while initializing your engine class.</p>
<p>Creating a POST, DELETE or PUT method is as easy as changing the httpMethod parameter. MKNetworkEngine has more convenience methods like this. Read the header file for more.</p>
<h3>Example 2:</h3>
<p> Uploading an image to a server (TwitPic for instance).<br />
Now let us go through an example of how to upload an image to a server. Uploading an image obviously requires the operation to be encoded as a multi-part form data. MKNetworkKit follows a pattern similar to ASIHttpRequest.<br />
You call a method addFile:forKey: in MKNetworkOperation to &#8220;attach&#8221; a file as a multi-part form data to your request. It&#8217;s that easy.<br />
MKNetworkOperation also has a convenience method to add a image from a NSData pointer. That&#8217;s you can call addData:forKey: method to upload a image to your server directly from NSData pointer. (Think of uploading a picture from camera directly).</p>
<h3>Example 3:</h3>
<p> Downloading files to a local directory (Caching)<br />
Downloading a file from a remote server and saving it to a location on users&#8217; iPhone is super easy with MKNetworkKit.<br />
Just set the outputStream of MKNetworkOperation and you are set.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">&nbsp;
<span style="color: #002200;">&#91;</span>operation setDownloadStream<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSOutputStream</span> 
	outputStreamToFileAtPath<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;/Users/mugunth/Desktop/DownloadedFile.pdf&quot;</span> 
			  append<span style="color: #002200;">:</span><span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>You can set multiple output streams to a single operation to save the same file to multiple locations (Say one to your cache directory and one to your working directory)</p>
<h3>Example 4:</h3>
<p> Image Thumbnail caching<br />
For downloading images, you might probably need to provide an absolute URL rather than a path. MKNetworkEngine has a convenience method for this. Just call operationWithURLString:params:httpMethod: to create a network operation with an absolute URL.<br />
MKNetworkEngine is intelligent. It coalesces multiple GET calls to the same URL into one and notifies all the blocks when that one operation completes. This drastically improves the speed of fetching your image URLs for populating thumbnails.</p>
<p>Subclass MKNetworkEngine and override image cache directory and cache cost. If you don&#8217;t want to customize these two, you can directly call MKNetworkEngine methods to download images for you. I would actually recommend you to do that.</p>
<h3>Caching operations</h3>
<p>MKNetworkKit caches all requests by default. All you need to do is to turn on caching for your Engine. When a GET request is performed, if the response was previously cached, your completion handler is called with the cached response almost immediately. To know whether the response is cached, use the isCachedResponse method. This is illustrated below.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">    <span style="color: #002200;">&#91;</span>op onCompletion<span style="color: #002200;">:^</span><span style="color: #002200;">&#40;</span>MKNetworkOperation <span style="color: #002200;">*</span>completedOperation<span style="color: #002200;">&#41;</span>
     <span style="color: #002200;">&#123;</span>
         <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>completedOperation isCachedResponse<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
             DLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Data from cache&quot;</span><span style="color: #002200;">&#41;</span>;
         <span style="color: #002200;">&#125;</span>
         <span style="color: #a61390;">else</span> <span style="color: #002200;">&#123;</span>
             DLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Data from server&quot;</span><span style="color: #002200;">&#41;</span>;
         <span style="color: #002200;">&#125;</span>
&nbsp;
         DLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%@&quot;</span>, <span style="color: #002200;">&#91;</span>completedOperation responseString<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
     <span style="color: #002200;">&#125;</span>onError<span style="color: #002200;">:^</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSError</span><span style="color: #002200;">*</span> error<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
&nbsp;
         errorBlock<span style="color: #002200;">&#40;</span>error<span style="color: #002200;">&#41;</span>;
     <span style="color: #002200;">&#125;</span><span style="color: #002200;">&#93;</span>;</pre></div></div>

<h3>Freezing operations</h3>
<p>Arguably, the most interesting feature of MKNetworkKit is built in ability to freeze operations. All you need to do is set your operation as freezable. Almost zero effort!</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">&#91;</span>op setFreezable<span style="color: #002200;">:</span><span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>Freezable operations are automatically serialized when the network goes down and executed when connectivity is restored. Think of having the ability to favorite a tweet while you are offline and the operation is performed when you are online later.<br />
Frozen operations are also persisted to disk when the app enters background. They will be automatically performed when the app is resumes later.</p>
<h3>Convenience methods in MKNetworkOperation</h3>
<p>MKNetworkOperation exposes convenience methods like the following to get the format your response data. </p>
<ol>
<li>responseData
<li>responseString
<li>responseJSON (Only on iOS 5)
<li>responseImage
<li>responseXML
<li>error
</ol>
<p>They come handy when accessing the response after your network operation completes. When the format is wrong, these methods return nil. For example, trying to access responseImage when the actual response is a HTML response will return nil. The only method that is guaranteed to return the correct, expected response is responseData. Use the other methods if you are sure of the response type.</p>
<h3>Convenience macros</h3>
<p>The macros, DLog and ALog were stolen unabashedly from Stackoverflow and I couldn&#8217;t again find the source. If you wrote that, let me know.</p>
<h3>A note on GCD</h3>
<p>I purposefully didn&#8217;t use GCD because, network operations need to be stopped and prioritized at will. GCD, while more efficient that NSOperationQueue cannot do this. I would recommend not to use GCD based queues for your network operations.</p>
<h2>Documentation</h2>
<p>The header files are commented and I&#8217;m trying out headerdoc from Apple. Meanwhile, you can use/play around (read: Fork) with the code.</p>
<h2>Source Code</h2>
<p>The source code for MKNetworkKit along with a demo application is available on Github.<br />
<a href="http://github.com/mugunthkumar/mknetworkkit">MKNetworkKit on Github</a></p>
<h2>Feature requests</h2>
<p>Please don&#8217;t email me feature requests. The best way is to <a href="http://github.com/mugunthkumar/mknetworkkit/issues">create an issue on Github</a>.</p>
<h2>Licensing</h2>
<p>MKNetworkKit is licensed under <strong>MIT License</strong></p>
<p>All of my source code can be used free of charge in your app, provided you add the copyright notices to your app. A little mention on one of your most obscure &#8220;about&#8221; page will do. </p>
<p>Attribution free licensing available upon request. Contact me at <a href="mailto:mknetworkkit@mk.sg"> mknetworkkit@mk.sg </a></p>
<p>&#8211;<br />
Mugunth</p>
<p><map name='google_ad_map_1319_8b86e81420c6776e'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/1319?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_1319_8b86e81420c6776e' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=1319&amp;url= http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fios-framework-introducing-mknetworkkit%2F' /></p><p><a href ="http://twitter.com/mugunthkumar">Follow me </a> on Twitter</p><p>&copy;2012 <a href="http://blog.mugunthkumar.com">MKBlog</a>. All Rights Reserved.</p>.<h4 id="tweetandlike-heading"></h4><ul id="tweetandlike-buttons"><li><a href="http://twitter.com/share" data-title="iOS+Framework%3A+Introducing+MKNetworkKit" data-count="horizontal" data-text="iOS Framework: Introducing MKNetworkKit" data-url="http://blog.mugunthkumar.com/products/ios-framework-introducing-mknetworkkit/" data-lang="eng" data-via="@mugunthkumar" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></li><li><g:plusone size= "medium" href= "http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fios-framework-introducing-mknetworkkit%2F"></g:plusone></li><li><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fios-framework-introducing-mknetworkkit%2F&layout=button_count&show_faces=true&action=like&font=segoe ui&colorscheme=light&width=350&scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:350px; height:25px;" allowTransparency="true" ></iframe></li></ul>
<p>Related posts:<ol>
<li><a href='http://blog.mugunthkumar.com/coding/ios-tutorial-advanced-networking-with-mknetworkkit/' rel='bookmark' title='iOS Tutorial: Advanced Networking with MKNetworkKit'>iOS Tutorial: Advanced Networking with MKNetworkKit</a> <small>Couple of weeks ago, I wrote a clean, fast networking...</small></li>
<li><a href='http://blog.mugunthkumar.com/products/introducing-my-book-ios-5-programming-pushing-the-limits/' rel='bookmark' title='Introducing my book: iOS 5 Programming Pushing the Limits'>Introducing my book: iOS 5 Programming Pushing the Limits</a> <small>iOS 5 Programming Pushing the Limits Developing Extraordinary Mobile Apps...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.mugunthkumar.com/products/ios-framework-introducing-mknetworkkit/feed/</wfw:commentRss>
		<slash:comments>50</slash:comments>
		</item>
		<item>
		<title>Introducing my book: iOS 5 Programming Pushing the Limits</title>
		<link>http://blog.mugunthkumar.com/products/introducing-my-book-ios-5-programming-pushing-the-limits/</link>
		<comments>http://blog.mugunthkumar.com/products/introducing-my-book-ios-5-programming-pushing-the-limits/#comments</comments>
		<pubDate>Fri, 21 Oct 2011 03:25:02 +0000</pubDate>
		<dc:creator>Mugunth Kumar</dc:creator>
				<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[Products]]></category>
		<category><![CDATA[announcements]]></category>
		<category><![CDATA[book]]></category>
		<category><![CDATA[ios5]]></category>

		<guid isPermaLink="false">http://blog.mugunthkumar.com/?p=1245</guid>
		<description><![CDATA[iOS 5 Programming Pushing the Limits Developing Extraordinary Mobile Apps for Apple iPhone, iPad, and iPod Touch I&#8217;m pleased to announce that I&#8217;ve completed my book on advanced iOS 5 programming. The book will be published by Wiley later this year and is available for pre-order from amazon. I co-authored this book with Rob Napier [...]
Related posts:<ol>
<li><a href='http://blog.mugunthkumar.com/products/ios-framework-introducing-mknetworkkit/' rel='bookmark' title='iOS Framework: Introducing MKNetworkKit'>iOS Framework: Introducing MKNetworkKit</a> <small>How awesome would it be if a networking framework automatically...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p></p><div id="attachment_1274" class="wp-caption alignleft" style="width: 248px"><a href="http://blog.mugunthkumar.com/wp-content/uploads/iOS-5-Programming-.png"><img class="size-medium wp-image-1274" title="iOS 5 Programming" src="http://blog.mugunthkumar.com/wp-content/uploads/iOS-5-Programming--238x300.png" alt="Book cover" width="238" height="300" /></a><p class="wp-caption-text">iOS 5 Programming: Pushing the Limits</p></div>
<p><strong>iOS 5 Programming Pushing the Limits</strong><br />
Developing Extraordinary Mobile Apps for Apple iPhone, iPad, and iPod Touch</p>
<p>I&#8217;m pleased to announce that I&#8217;ve completed my book on advanced iOS 5 programming.<br />
The book will be <a href="http://www.wiley.com/WileyCDA/WileyTitle/productCd-1119961327.html">published by Wiley</a> later this year and is available for <a href="http://www.amazon.com/iOS-Programming-Pushing-Limits-Extraordinary/dp/1119961327/">pre-order from amazon</a>.</p>
<p>I co-authored this book with <a href="http://robnapier.net/blog/">Rob Napier</a> and we started working on this around 6 months ago. Bulk of the book was written focussing on iOS 5 after the WWDC 2011.</p>
<h2>Target Audience</h2>
<p><strong>This is not an introductory book</strong> and it focusses on advanced topics on iOS 5 programming and delves deep into the core Objective-C. It&#8217;s primary audience is iOS developers who have hands-on experience writing iOS apps and want to take their apps to the next level. If you’re ready to move beyond the basics, to learn the best practices and the secrets that the authors have learned from practical experience writing real applications, then this is the book for you.</p>
<p><strong>This book also is not just a list of recipes or tutorials.</strong> There’s plenty of sample code here, but the focus is on learning how to design, code, and maintain great iOS apps. <strong>A lot of this book is about why rather than just how.</strong> You’ll learn about as much about design patterns and writing reusable code as about syntax and new frameworks.</p>
<h2>Organization of the book</h2>
<p>The book is organized into four major sections from the basics to the most advanced topics. This book separates the everyday from the special-purpose, helping you pick the right solution to each problem. You’ll learn why each framework exists, how the frameworks relate to each other, and when to choose one over another. Then you’ll learn how to make the most of each framework for solving its type of problem. The following is the comprehensive table of contents of the book.</p>
<h3>Part I: What’s New</h3>
<p>If you’re familiar with iOS 4, then this section quickly introduces you to the new features of iOS 5.</p>
<p>*        <strong>Chapter 1: The Brand New Stuff</strong> — iOS adds a lot of new features, and here you get a quick overview of what’s available.</p>
<p>*        <strong>Chapter 2: Getting Comfortable with Xcode 4</strong> — Apple recently redesigned the Xcode interface, and it can take some getting used to. This chapter shows you how to get the most out of it.</p>
<h3>Part II: Getting the Most Out of Every-Day Tools</h3>
<p>As an iOS developer, you’ve encountered a wide variety of common tools, from notifications to table views to animation layers. But are you using these tools to their full potential? In this part, you learn the best practices in Cocoa development from seasoned developers.</p>
<p>*        <strong>Chapter 3: Everyday Objective-C</strong> — If you’re ready to move to the next level in Objective-C, this chapter introduces you to the tools experienced developers use every day to improve application design, maintainability, and reusability.</p>
<p>*        <strong>Chapter 4: Hold On Loosely: Cocoa Design Patterns</strong> — Cocoa relies on a number of common and consistent design patterns. You learn what they are so you can solve problems the same way Apple does.</p>
<p>*        <strong>Chapter 5: Getting Table Views Right</strong> — Table views are perhaps the most complex and commonly used UI element in iOS. They are simple and elegant in design, but confusing to developers who don’t understand how they work. You learn how to use them correctly and to solve some special problems like infinite scrolling.</p>
<p>*        <strong>Chapter 6: Better Drawing</strong> — Custom drawing is intimidating to many new developers, but it’s a key part of building beautiful and fast user interfaces. You’ll discover the available drawing options from UIKit to Core Graphics, and how to optimize them to look their best while keeping them fast.</p>
<p>*        <strong>Chapter 7: Layers Like an Onion: Core Animation</strong> — iOS devices have incredible facilities for animation. With a powerful GPU and the highly optimized Core Animation, you can build engaging, exciting, and intuitive interfaces. In this chapter, you go beyond the basics and learn the secrets of animation.</p>
<p>*        <strong>Chapter 8: Tackling Those Pesky Errors</strong> — You try to write perfect code, but sometimes things go wrong. How your application reacts to the unexpected is what separates decent apps from extraordinary apps. You’ll learn the common patterns for error handling, how to log, and how to make your code more resilient against the unexpected.</p>
<h3>Part III: The Right Tool for the Job</h3>
<p>There are tools that are part of nearly every application, and there are tools that you only need from time to time. In this section, you learn about those tools and techniques that are a little more specialized.</p>
<p>*        <strong>Chapter 9: Controlling Multitasking</strong> — Multitasking is an important part of many applications, and you learn how to do multiple things at once while your application is running and when your application is in the background.</p>
<p>*        <strong>Chapter 10: REST for the Weary</strong> — REST-based services are a mainstay of modern applications, and you learn how to best implement them in iOS.</p>
<p>*        <strong>Chapter 11: Batten the Hatches with Security Services</strong> — User security and privacy are paramount today, and you learn how to protect your application and user data from attackers with the keychain, certificates, and encryption.</p>
<p>*        <strong>Chapter 12: Running on Multiple iPlatforms and iDevices</strong> — The iOS landscape gets more complex every year, with iPod Touch, iPhone, iPad, Apple TV, and a steady stream of new editions. It’s not enough just to write once, run everywhere. You need your applications to be their <em>best </em>everywhere. You’ll learn how to adapt your apps to the hardware and get the most out of every platform.</p>
<p>*        <strong>Chapter 13: Internationalization and Localization</strong> — While you may want to focus on a single market today, there are small things you can do to ease the transition to a global market tomorrow. Save money and headaches later, without interrupting today’s development.</p>
<p>*        <strong>Chapter 14: Selling Past the Sale with In App Purchases</strong> — In App Purchases are still an untapped market for many developers. Users like the add-on content, and developers love the extra revenue. You learn the best ways to make this important feature a reality in your application.</p>
<h3>Part IV: Pushing the Limits</h3>
<p>This section is what this book is all about. You’ve learned the basics. You’ve learned the everyday. Now push the limits with the most advanced tools available. You learn the ins and outs of deep iOS.</p>
<p>*        <strong>Chapter 15: Cocoa’s Biggest Trick: Key-Value Observing</strong> — Many of Apple’s most powerful frameworks rely on KVO for their performance and flexibility. You learn how to leverage the flexibility and speed of KVO, as well as the trick that makes it so transparent.</p>
<p>*        <strong>Chapter 16: Think Different: Blocks and Functional Programming</strong> — Many developers are still absorbing the addition of blocks to Objective-C. They’re valuable for interacting with Apple frameworks, but they also open new ways of thinking about your program. Embrace a new style, and maximize its benefits in your next project.</p>
<p>*        <strong>Chapter 17: Going Offline</strong> — Network programming is hard, but even harder is providing a seamless offline experience. Learn how to best cache your data and integrate it into your network engine.</p>
<p>*        <strong>Chapter 18: Fancy Text Layout</strong> — From UIKit to Core Text, iOS is full of ways to display text. There’s no perfect solution for displaying rich text in iOS, so it’s important to learn the trade-offs so you can choose the right solution and use it correctly.</p>
<p>*        <strong>Chapter 19: Building a (Core) Foundation</strong> — When you want the most powerful frameworks available on iOS, you’re going to want the Core frameworks like Core Graphics, Core Animation, and Core Text. All of these rely on Core Foundation. In this chapter you learn how to work Core Foundation data types so you can leverage everything iOS has to offer.</p>
<p>*        <strong>Chapter 20: Deep Objective-C</strong> — When you’re ready to pull back the curtain on how Objective-C really works, this is the chapter for you. You learn how to use the Objective-C runtime directly to dynamically modify classes and methods. You also learn how Objective-C method calls are dispatched to C function calls, and how you can take control of the system to extend your programs in incredible ways.</p>
<p>This is the book you have been waiting for. So don&#8217;t just wait. <a href="http://www.amazon.com/iOS-Programming-Pushing-Limits-Extraordinary/dp/1119961327/">Order your copy today</a>.</p>
<p>&#8211;<br />
Mugunth</p>
<p><map name='google_ad_map_1245_8b86e81420c6776e'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/1245?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_1245_8b86e81420c6776e' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=1245&amp;url= http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fintroducing-my-book-ios-5-programming-pushing-the-limits%2F' /></p><p><a href ="http://twitter.com/mugunthkumar">Follow me </a> on Twitter</p><p>&copy;2012 <a href="http://blog.mugunthkumar.com">MKBlog</a>. All Rights Reserved.</p>.<h4 id="tweetandlike-heading"></h4><ul id="tweetandlike-buttons"><li><a href="http://twitter.com/share" data-title="Introducing+my+book%3A+iOS+5+Programming+Pushing+the+Limits" data-count="horizontal" data-text="Introducing my book: iOS 5 Programming Pushing the Limits" data-url="http://blog.mugunthkumar.com/products/introducing-my-book-ios-5-programming-pushing-the-limits/" data-lang="eng" data-via="@mugunthkumar" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></li><li><g:plusone size= "medium" href= "http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fintroducing-my-book-ios-5-programming-pushing-the-limits%2F"></g:plusone></li><li><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fintroducing-my-book-ios-5-programming-pushing-the-limits%2F&layout=button_count&show_faces=true&action=like&font=segoe ui&colorscheme=light&width=350&scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:350px; height:25px;" allowTransparency="true" ></iframe></li></ul>
<p>Related posts:<ol>
<li><a href='http://blog.mugunthkumar.com/products/ios-framework-introducing-mknetworkkit/' rel='bookmark' title='iOS Framework: Introducing MKNetworkKit'>iOS Framework: Introducing MKNetworkKit</a> <small>How awesome would it be if a networking framework automatically...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.mugunthkumar.com/products/introducing-my-book-ios-5-programming-pushing-the-limits/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Beta Testers wanted for Mac app ReadyForKing</title>
		<link>http://blog.mugunthkumar.com/products/beta-testers-wanted-for-mac-app-readyforking/</link>
		<comments>http://blog.mugunthkumar.com/products/beta-testers-wanted-for-mac-app-readyforking/#comments</comments>
		<pubDate>Wed, 13 Jul 2011 04:10:43 +0000</pubDate>
		<dc:creator>Mugunth Kumar</dc:creator>
				<category><![CDATA[Products]]></category>
		<category><![CDATA[announcements]]></category>
		<category><![CDATA[mac app]]></category>

		<guid isPermaLink="false">http://blog.mugunthkumar.com/?p=1198</guid>
		<description><![CDATA[RoaringApps did a great job collating app compatibility with Lion. ReadyForKing takes it to the next level. It scans your computer and checks RoaringApps.com for compatibility. The initial beta now scans your /Applications directory recursively and lists executable applications it finds. After enumerating, it checks them for compatibility, all automatically. You just have to launch [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p></p><p><a href="http://blog.mugunthkumar.com/wp-content/uploads/ReadyForKing.png"><img class="size-medium wp-image-1204 alignleft" title="ReadyForKing" src="http://blog.mugunthkumar.com/wp-content/uploads/ReadyForKing-300x300.png" alt="" width="300" height="300" /></a><br />
<a href=" http://roaringapps.com/">RoaringApps</a> did a great job collating app compatibility with Lion. ReadyForKing takes it to the next level. It scans your computer and checks RoaringApps.com for compatibility.</p>
<p>The initial beta now scans your /Applications directory recursively and lists executable applications it finds. After enumerating, it checks them for compatibility, all automatically. You just have to launch the app and sit tight.</p>
<p>The current release is a beta, and might have minor issues with showing correct icons and it lists all .app bundles (whether or not they are applications). The UI and the logo is developer designed. So don&#8217;t expect polish there.</p>
<p>I&#8217;m intending to make two more beta releases before releasing it officially. the official release will also be free of cost from here and will probably coincide with release of Lion. If you are willing to help me, please grab your copy of ReadyForKing from here.</p>
<p><del><strong>Release 1: ReadyForKing.zip</strong></del></p>
<p>&nbsp;</p>
<p><strong>Release 2: <a href="http://mugunthkumar.com/files/ReadyForKing/App.0.9.zip">ReadyForKing.zip</a></strong></p>
<p>Run it on your Mac and let me know if it detects your applications properly. I&#8217;m open for suggestions, bugs and anything that would improve the product.</p>
<p><strong>Update:</strong></p>
<p>Version 0.9 is has some nice updates including a beautiful icon by <a href="http://twitter.com/samuelmenezes">@</a><a href="http://twitter.com/samuelmenezes">samuelmenezes</a></p>
<p>&nbsp;</p>
<p>Get it here.</p>
<p><strong>Release 2: <a href="http://mugunthkumar.com/files/ReadyForKing/App.0.9.zip">ReadyForKing.zip</a></strong><br />
PS: If you already had the previous version, you will get it automatically through Sparkle&#8217;s auto update.</p>
<p>Thanks</p>
<p>&#8211;<br />
Mugunth</p>
<p><map name='google_ad_map_1198_8b86e81420c6776e'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/1198?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_1198_8b86e81420c6776e' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=1198&amp;url= http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fbeta-testers-wanted-for-mac-app-readyforking%2F' /></p><p><a href ="http://twitter.com/mugunthkumar">Follow me </a> on Twitter</p><p>&copy;2012 <a href="http://blog.mugunthkumar.com">MKBlog</a>. All Rights Reserved.</p>.<h4 id="tweetandlike-heading"></h4><ul id="tweetandlike-buttons"><li><a href="http://twitter.com/share" data-title="Beta+Testers+wanted+for+Mac+app+ReadyForKing" data-count="horizontal" data-text="Beta Testers wanted for Mac app ReadyForKing" data-url="http://blog.mugunthkumar.com/products/beta-testers-wanted-for-mac-app-readyforking/" data-lang="eng" data-via="@mugunthkumar" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></li><li><g:plusone size= "medium" href= "http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fbeta-testers-wanted-for-mac-app-readyforking%2F"></g:plusone></li><li><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fbeta-testers-wanted-for-mac-app-readyforking%2F&layout=button_count&show_faces=true&action=like&font=segoe ui&colorscheme=light&width=350&scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:350px; height:25px;" allowTransparency="true" ></iframe></li></ul>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.mugunthkumar.com/products/beta-testers-wanted-for-mac-app-readyforking/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mac App: iKLOC</title>
		<link>http://blog.mugunthkumar.com/products/mac-app-ikloc/</link>
		<comments>http://blog.mugunthkumar.com/products/mac-app-ikloc/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 00:54:56 +0000</pubDate>
		<dc:creator>Mugunth Kumar</dc:creator>
				<category><![CDATA[Products]]></category>
		<category><![CDATA[apps]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://blog.mugunthkumar.com/?p=1112</guid>
		<description><![CDATA[This is my second mac app, iKLOC (iTunes link) is available on Mac App Store! This time it was just a 4 day waiting time! What is iKLOC? iKLOC is a quick little tool count the number of lines of source code in your iOS or Mac app.  Just like my other app, iConify, the [...]
Related posts:<ol>
<li><a href='http://blog.mugunthkumar.com/products/mac-app-iconify/' rel='bookmark' title='Mac App: iConify'>Mac App: iConify</a> <small>My first mac app, iConify is available on Mac App...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p></p><p><a href="http://blog.mugunthkumar.com/wp-content/uploads/iKLOC.png"></a><a href="http://blog.mugunthkumar.com/wp-content/uploads/Icon.png"><img class="size-full wp-image-1113 alignleft" title="iKLOC" src="http://blog.mugunthkumar.com/wp-content/uploads/Icon.png" alt="" width="256" height="256" /></a><br />
This is my second mac app, <a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=431595342&amp;mt=12">iKLOC (iTunes link)</a> is available on Mac App Store! This time it was just a 4 day waiting time!</p>
<h2>What is iKLOC?</h2>
<p>iKLOC is a quick little tool count the number of lines of source code in your iOS or Mac app.  Just like my other app, iConify, the speciality of iKLOC is that, it just works. Launch the app, open your .XCodeProj file and boom, it counts your lines.</p>
<h2>How is it different from traditional command line counting like WC/GREP?</h2>
<p>The command line counters give you a very approximate results since they cannot exclude comments in your files. For example, the ASIHTTP Frameworks&#8217; ASIHTTPRequest.m file has ~4000 lines of code and 350 lines of comments. ~8% of your code size. Most of your short header file have approximately &lt;50 lines of code have a ~20 line comment/copyright notice which also gets counted as code. Using iKLOC, you will exactly know how many source code lines and <strong>how many comment lines</strong> are there in your app.</p>
<p>Second important feature of iKLOC is that it can auto <strong>export NSLocalizedString macros</strong> from your project and create the Localizable.Strings file which you can send it to the translators. All it takes is one click!</p>
<p>Another important feature is that, you can selectively ignore files by unchecking them. Total counts are updated immediately. For example, when you count using</p>
<p><span style="font-size: 20px; font-weight: bold;">Myths behind KLOC</span></p>
<p>While the quote by Bill Gates</p>
<blockquote><p>Measuring progress by lines of code is like measuring aircraft building progress by weight</p></blockquote>
<p>stands true for Software, KLOC counting goes wrong only when you try to compare projects across domains. For example a 2000 line kernel code or a routing algorithm is more complicated and more tricky to write than a 20,000 line iOS app. But when you compare software of similar nature like, two iOS apps, KLOC gives you a pretty good estimate of how big a software/complex a software is. If you are a iOS software development company, you can use this valuable tool to compare the project sizes and will allow you to make a more educated guess on the cost estimates the next time.</p>
<p><span style="font-size: 20px; font-weight: bold;">Software</span></p>
<p>The app is available exclusively from the Mac App Store.</p>
<p><a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=431595342&amp;mt=12"><img title="Mac_App_Store_Badge" src="http://blog.mugunthkumar.com/wp-content/uploads/Mac_App_Store_Badge.png" alt="" width="300" height="150" /></a></p>
<div>Do leave your feedback!</div>
<div>&#8211;</div>
<div>Mugunth</div>
<p><map name='google_ad_map_1112_8b86e81420c6776e'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/1112?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_1112_8b86e81420c6776e' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=1112&amp;url= http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fmac-app-ikloc%2F' /></p><p><a href ="http://twitter.com/mugunthkumar">Follow me </a> on Twitter</p><p>&copy;2012 <a href="http://blog.mugunthkumar.com">MKBlog</a>. All Rights Reserved.</p>.<h4 id="tweetandlike-heading"></h4><ul id="tweetandlike-buttons"><li><a href="http://twitter.com/share" data-title="Mac+App%3A+iKLOC" data-count="horizontal" data-text="Mac App: iKLOC" data-url="http://blog.mugunthkumar.com/products/mac-app-ikloc/" data-lang="eng" data-via="@mugunthkumar" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></li><li><g:plusone size= "medium" href= "http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fmac-app-ikloc%2F"></g:plusone></li><li><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fmac-app-ikloc%2F&layout=button_count&show_faces=true&action=like&font=segoe ui&colorscheme=light&width=350&scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:350px; height:25px;" allowTransparency="true" ></iframe></li></ul>
<p>Related posts:<ol>
<li><a href='http://blog.mugunthkumar.com/products/mac-app-iconify/' rel='bookmark' title='Mac App: iConify'>Mac App: iConify</a> <small>My first mac app, iConify is available on Mac App...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.mugunthkumar.com/products/mac-app-ikloc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mac App: iConify</title>
		<link>http://blog.mugunthkumar.com/products/mac-app-iconify/</link>
		<comments>http://blog.mugunthkumar.com/products/mac-app-iconify/#comments</comments>
		<pubDate>Sat, 05 Feb 2011 11:21:47 +0000</pubDate>
		<dc:creator>Mugunth Kumar</dc:creator>
				<category><![CDATA[Products]]></category>
		<category><![CDATA[apps]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://blog.mugunthkumar.com/?p=1026</guid>
		<description><![CDATA[My first mac app, iConify is available on Mac App Store! After 17 days on radio silence from Apple, they approved it today. What is iConify? iConify is a quick little tool to resize icons for your iOS app. The beauty of iConify is that, there are no configuration options, tweaks whatsoever. Launch the app, drag [...]
Related posts:<ol>
<li><a href='http://blog.mugunthkumar.com/products/mac-app-ikloc/' rel='bookmark' title='Mac App: iKLOC'>Mac App: iKLOC</a> <small>This is my second mac app, iKLOC (iTunes link) is...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p></p><p><a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=416289784&amp;mt=12"></a><a href="http://blog.mugunthkumar.com/wp-content/uploads/Iconify.png"><img class="alignleft size-medium wp-image-1028" style="margin: 10px; border: 1px solid black;" title="Iconify" src="http://blog.mugunthkumar.com/wp-content/uploads/Iconify-300x300.png" alt="" width="210" height="210" /></a>My first mac app, iConify is available on Mac App Store! After 17 days on radio silence from Apple, they approved it today.</p>
<h2>What is iConify?</h2>
<p>iConify is a quick little tool to resize icons for your iOS app.  The beauty of iConify is that, there are no configuration options, tweaks whatsoever.  Launch the app, drag an icon into it, Boom, a resized and properly named file appears inside the iConify folder.</p>
<h2>How is it different from competing apps?</h2>
<p>While there are plenty of icon resizing apps, they aren&#8217;t just as smart or as iConify. iConify is smart in the sense, it tries to detect icon files from other assets and generate files accordingly. iConify also auto names the generated files from your source file.</p>
<h2>Pro feature</h2>
<p>Since iConify supports drag and drop, you don&#8217;t even have to save or export a file to generate icons. Just drag a proxy icon from whichever app you use, photoshop or pixelmator into iConify. No questions asked, your icons/assets are generated. This means, when you are working on Photoshop, you don&#8217;t even have to bring iConify to focus. Drag the proxy icon onto iConify and continue working on your graphic stuff. It&#8217;s that simple.</p>
<h2>How to video</h2>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/buG6MPLzVA8?hl=en&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/buG6MPLzVA8?hl=en&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<h2></h2>
<h2></h2>
<h2>Software</h2>
<p>The app is available exclusively from the Mac App Store.</p>
<p><a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=416289784&amp;mt=12"><img title="Mac_App_Store_Badge" src="http://blog.mugunthkumar.com/wp-content/uploads/Mac_App_Store_Badge.png" alt="" width="300" height="150" /></a></p>
<div>Do leave your feedback!</div>
<div>&#8211;</div>
<div>Mugunth</div>
<p><map name='google_ad_map_1026_8b86e81420c6776e'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/1026?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_1026_8b86e81420c6776e' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=1026&amp;url= http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fmac-app-iconify%2F' /></p><p><a href ="http://twitter.com/mugunthkumar">Follow me </a> on Twitter</p><p>&copy;2012 <a href="http://blog.mugunthkumar.com">MKBlog</a>. All Rights Reserved.</p>.<h4 id="tweetandlike-heading"></h4><ul id="tweetandlike-buttons"><li><a href="http://twitter.com/share" data-title="Mac+App%3A+iConify" data-count="horizontal" data-text="Mac App: iConify" data-url="http://blog.mugunthkumar.com/products/mac-app-iconify/" data-lang="eng" data-via="@mugunthkumar" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></li><li><g:plusone size= "medium" href= "http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fmac-app-iconify%2F"></g:plusone></li><li><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fmac-app-iconify%2F&layout=button_count&show_faces=true&action=like&font=segoe ui&colorscheme=light&width=350&scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:350px; height:25px;" allowTransparency="true" ></iframe></li></ul>
<p>Related posts:<ol>
<li><a href='http://blog.mugunthkumar.com/products/mac-app-ikloc/' rel='bookmark' title='Mac App: iKLOC'>Mac App: iKLOC</a> <small>This is my second mac app, iKLOC (iTunes link) is...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.mugunthkumar.com/products/mac-app-iconify/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Introducing MKSync &#8211; iPhone App for Syncplicity</title>
		<link>http://blog.mugunthkumar.com/products/introducing-mksync-iphone-app-for-syncplicity/</link>
		<comments>http://blog.mugunthkumar.com/products/introducing-mksync-iphone-app-for-syncplicity/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 15:56:06 +0000</pubDate>
		<dc:creator>Mugunth Kumar</dc:creator>
				<category><![CDATA[Products]]></category>
		<category><![CDATA[cloud storage]]></category>
		<category><![CDATA[iPhone Apps]]></category>
		<category><![CDATA[syncplicity]]></category>

		<guid isPermaLink="false">http://blog.mugunthkumar.com/?p=467</guid>
		<description><![CDATA[For the past 2 or 3 months, I&#8217;ve been busy developing a product, which I&#8217;m announcing now. It&#8217;s called as MKSync and it&#8217;s a iPhone client for Syncplicity. The product is in its early release phase and I intend to  submit it to AppStore by this month end. Currently I&#8217;m looking for beta testers. I&#8217;m [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p></p><p>For the past 2 or 3 months, I&#8217;ve been busy developing a product, which I&#8217;m announcing now. It&#8217;s called as <a href="http://mugunthkumar.com/iphone/mksync"><strong><em>MKSync</em></strong></a> and it&#8217;s a iPhone client for <a href="http://syncplicity.com">Syncplicity</a>.</p>
<p>The product is in its early release phase and I intend to  submit it to AppStore by this month end.  <span style="text-decoration: line-through;">Currently I&#8217;m looking for beta testers. I&#8217;m looking for around 10-20 beta testers. As and when needs arise, I might increase the limit. I would prefer people who will be interested in testing the app&#8217;s second and third versions as well.</span></p>
<p>As of version 1, the most important features include, sharing files via email and the ability to browse and view downloaded files on iPhone without an active Internet connection. These features are illustrated in the screencast below.</p>
<p><object width="660" height="525"><param name="movie" value="http://www.youtube.com/v/8VIlzjEz9YM&#038;hl=en&#038;fs=1&#038;rel=0&#038;color1=0x234900&#038;color2=0x4e9e00&#038;hd=1&#038;border=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/8VIlzjEz9YM&#038;hl=en&#038;fs=1&#038;rel=0&#038;color1=0x234900&#038;color2=0x4e9e00&#038;hd=1&#038;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="660" height="525"></embed></object></p>
<p><del datetime="2009-10-19T07:26:23+00:00">If you prefer a direct download of the screencast, click here<br />
<a href="https://my.syncplicity.com/share/kn3xqer1hn/Syncplicity_Screencast.zip">https://my.syncplicity.com/share/kn3xqer1hn/Syncplicity_Screencast.zip</a> &#8212; Removed direct download. This screencast is too old.</del></p>
<p>If you are interested in beta testing, drop me a mail @ feedback@mugunthkumar.com with your UDIDs.</p>
<p>You can send me your UDID using <a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=285691333&amp;mt=8">Erica Sadun&#8217;s UDID Generator</a>. (iTunes Link)</p>
<p>For more information go to the Syncplicity forum here. (You need a Syncplicity account for accessing the forums)<br />
<a href="https://my.syncplicity.com/Forums/default.aspx?g=posts&amp;t=2793">https://my.syncplicity.com/Forums/default.aspx?g=posts&amp;t=2793</a></p>
<p>For updates on this product, You can follow us on twitter <a href="http://twitter.com/mksync" target="_blank">@mksync</a>.</p>
<p><strong>Update: 21st September 2009: Closed for private beta. Follow us for product release updates.</strong><br />
<strong>Update: 19th October 2009: Product submitted to Apple. Follow us for product release updates.</strong><br />
<strong>Update: 7th November 2009: Product approved by Apple. No rejections whatsoever! Visit the product page for <a href="http://mugunthkumar.com/iphone/mksync">MKSync</a> here.</strong><br />
Thanks,<br />
Mugunth</p>
<hr />
<h6>For those who don&#8217;t know, what is Syncplicity, please read it&#8217;s <a href="http://en.wikipedia.org/wiki/Syncplicity">wikipedia entry</a>. It&#8217;s a cloud based, online backup and sync service, that works seamlessly behind the scenes to synchronize your data across computers simultaneously backing up to the cloud. Long gone are the days when you carried a USB drive around to keep your data in Sync. Apart from just syncing PCs, it can sync your google docs documents with your PC, keep your facebook albums in sync with your photos and much more&#8230;</h6>
<p><map name='google_ad_map_467_8b86e81420c6776e'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/467?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_467_8b86e81420c6776e' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=467&amp;url= http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fintroducing-mksync-iphone-app-for-syncplicity%2F' /></p><p><a href ="http://twitter.com/mugunthkumar">Follow me </a> on Twitter</p><p>&copy;2012 <a href="http://blog.mugunthkumar.com">MKBlog</a>. All Rights Reserved.</p>.<h4 id="tweetandlike-heading"></h4><ul id="tweetandlike-buttons"><li><a href="http://twitter.com/share" data-title="Introducing+MKSync+%26%238211%3B+iPhone+App+for+Syncplicity" data-count="horizontal" data-text="Introducing MKSync &#8211; iPhone App for Syncplicity" data-url="http://blog.mugunthkumar.com/products/introducing-mksync-iphone-app-for-syncplicity/" data-lang="eng" data-via="@mugunthkumar" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></li><li><g:plusone size= "medium" href= "http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fintroducing-mksync-iphone-app-for-syncplicity%2F"></g:plusone></li><li><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fintroducing-mksync-iphone-app-for-syncplicity%2F&layout=button_count&show_faces=true&action=like&font=segoe ui&colorscheme=light&width=350&scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:350px; height:25px;" allowTransparency="true" ></iframe></li></ul>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.mugunthkumar.com/products/introducing-mksync-iphone-app-for-syncplicity/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>SingTel BBoM iPhone App (SG BBOM)</title>
		<link>http://blog.mugunthkumar.com/products/singtel-bbom-iphone-app/</link>
		<comments>http://blog.mugunthkumar.com/products/singtel-bbom-iphone-app/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 03:30:58 +0000</pubDate>
		<dc:creator>Mugunth Kumar</dc:creator>
				<category><![CDATA[Products]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[iPhone Apps]]></category>
		<category><![CDATA[SingTel]]></category>

		<guid isPermaLink="false">http://blog.mugunthkumar.com/?p=233</guid>
		<description><![CDATA[SG BBoM iPhone App is designed specifically for use with SingTel mobile broadband plans. The rationale behind this development is, SingTel doesn&#8217;t send you an SMS or alery when your mobile broadband data charges over shoot the free limit. Overshooting the free limit even by a 100MB could cost your dearly. According to SingTel Excess [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p></p><p>SG BBoM iPhone App is designed specifically for use with SingTel mobile broadband plans. The rationale behind this development is, SingTel doesn&#8217;t send you an SMS or alery when your mobile broadband data charges over shoot the free limit. Overshooting the free limit even by a 100MB could cost your dearly.</p>
<p>According to SingTel</p>
<p>Excess usage will be charged at $0.01/2KB. Which means, a megabyte of data, (1024KB) will cost you about 5$.</p>
<p>To give you a analogy, a newyork times webpage will be around 500KB. Browse 10 such pages, you end up paying your soul to $ingTel.</p>
<p>SingTel already provides a web interface to check your data usage</p>
<p>http://home.singtel.com/bbmobile/datausage.asp</p>
<p>But because it&#8217;s not a light weight page, many of us don&#8217;t bother to check our data usage everyday.</p>
<p>Now here comes a handy little app to check your Broadband Usage on the Go on your iPhone.</p>
<p>Checkout more about this app on it&#8217;s page. <a href="http://mugunthkumar.com/iphone/sg-bbom">SG BBOM</a>.</p>
<p><del datetime="2009-08-04T17:36:34+00:00">Note: This app is still under review by Apple. Will update this blog once it&#8217;s done.</del></p>
<p>Update: 5th August 2009: Apple has approved this app&#8230; Click here for the app. <a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=323628585&#038;mt=8">SingTel BBOM (iTunes Link)</a></p>
<p><map name='google_ad_map_233_8b86e81420c6776e'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/233?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_233_8b86e81420c6776e' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=233&amp;url= http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fsingtel-bbom-iphone-app%2F' /></p><p><a href ="http://twitter.com/mugunthkumar">Follow me </a> on Twitter</p><p>&copy;2012 <a href="http://blog.mugunthkumar.com">MKBlog</a>. All Rights Reserved.</p>.<h4 id="tweetandlike-heading"></h4><ul id="tweetandlike-buttons"><li><a href="http://twitter.com/share" data-title="SingTel+BBoM+iPhone+App+%28SG+BBOM%29" data-count="horizontal" data-text="SingTel BBoM iPhone App (SG BBOM)" data-url="http://blog.mugunthkumar.com/products/singtel-bbom-iphone-app/" data-lang="eng" data-via="@mugunthkumar" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></li><li><g:plusone size= "medium" href= "http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fsingtel-bbom-iphone-app%2F"></g:plusone></li><li><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fsingtel-bbom-iphone-app%2F&layout=button_count&show_faces=true&action=like&font=segoe ui&colorscheme=light&width=350&scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:350px; height:25px;" allowTransparency="true" ></iframe></li></ul>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.mugunthkumar.com/products/singtel-bbom-iphone-app/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Download Wallpapers from Bing</title>
		<link>http://blog.mugunthkumar.com/products/download-wallpapers-from-bing/</link>
		<comments>http://blog.mugunthkumar.com/products/download-wallpapers-from-bing/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 08:55:48 +0000</pubDate>
		<dc:creator>Mugunth Kumar</dc:creator>
				<category><![CDATA[Products]]></category>
		<category><![CDATA[bingdownloader]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[wallpapers]]></category>

		<guid isPermaLink="false">http://mugunthkumar.wordpress.com/?p=191</guid>
		<description><![CDATA[Download everyday images/wallpapers from Bing.com
No related posts.]]></description>
			<content:encoded><![CDATA[<p></p><p>Ah&#8230; Bing&#8230; Wonderful product from Microsoft IMO.</p>
<p>I always wanted to save the wallpapers/images that appears on the front page of Bing.com to my local PC. But visiting the site everytime and saving it was cumbersome.</p>
<p>So I thought of writing my own C# utility that could do that job for me.</p>
<p>The utility is just 10KB (yeah Kilo Byte) is open source, free from any kind of obligations. But if you use it in your app, I would be happy if you could attribute me though attribution is not mandatory.</p>
<p>Here is a link to the codeplex hosted project.</p>
<p>Bing Downloader -<a href="http://bing.codeplex.com/">http://bing.codeplex.com/</a></p>
<p>&#8211;</p>
<p>Mugunth</p>
<p><map name='google_ad_map_191_8b86e81420c6776e'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/191?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_191_8b86e81420c6776e' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=191&amp;url= http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fdownload-wallpapers-from-bing%2F' /></p><p><a href ="http://twitter.com/mugunthkumar">Follow me </a> on Twitter</p><p>&copy;2012 <a href="http://blog.mugunthkumar.com">MKBlog</a>. All Rights Reserved.</p>.<h4 id="tweetandlike-heading"></h4><ul id="tweetandlike-buttons"><li><a href="http://twitter.com/share" data-title="Download+Wallpapers+from+Bing" data-count="horizontal" data-text="Download Wallpapers from Bing" data-url="http://blog.mugunthkumar.com/products/download-wallpapers-from-bing/" data-lang="eng" data-via="@mugunthkumar" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></li><li><g:plusone size= "medium" href= "http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fdownload-wallpapers-from-bing%2F"></g:plusone></li><li><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fdownload-wallpapers-from-bing%2F&layout=button_count&show_faces=true&action=like&font=segoe ui&colorscheme=light&width=350&scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:350px; height:25px;" allowTransparency="true" ></iframe></li></ul>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.mugunthkumar.com/products/download-wallpapers-from-bing/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>StationAlarm SG is on sale&#8230;</title>
		<link>http://blog.mugunthkumar.com/products/stationalarm-sg-is-on-sale/</link>
		<comments>http://blog.mugunthkumar.com/products/stationalarm-sg-is-on-sale/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 11:09:23 +0000</pubDate>
		<dc:creator>Mugunth Kumar</dc:creator>
				<category><![CDATA[Products]]></category>
		<category><![CDATA[iPhone Apps]]></category>

		<guid isPermaLink="false">http://mugunthkumar.wordpress.com/?p=159</guid>
		<description><![CDATA[Finally&#8230; After two rejections I made it to the App Store. StationAlarm SG is an app that helps you drift to sleep in Singapore MRTs. Just set your start and end stations and you are good to go&#8230; Click on the above link to go to the product page. &#8211; Mugunth Follow me on Twitter&#169;2012 [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p></p><p>Finally&#8230;</p>
<p>After two rejections I made it to the App Store.</p>
<p><a title="StationAlarm SG" href="http://stationalarm.mugunthkumar.com/" target="_blank">StationAlarm SG</a> is an app that helps you drift to sleep in Singapore MRTs. Just set your start and end stations and you are good to go&#8230;</p>
<p>Click on the above link to go to the product page.</p>
<p>&#8211;</p>
<p>Mugunth</p>
<p><map name='google_ad_map_159_8b86e81420c6776e'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/159?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_159_8b86e81420c6776e' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=159&amp;url= http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fstationalarm-sg-is-on-sale%2F' /></p><p><a href ="http://twitter.com/mugunthkumar">Follow me </a> on Twitter</p><p>&copy;2012 <a href="http://blog.mugunthkumar.com">MKBlog</a>. All Rights Reserved.</p>.<h4 id="tweetandlike-heading"></h4><ul id="tweetandlike-buttons"><li><a href="http://twitter.com/share" data-title="StationAlarm+SG+is+on+sale%26%238230%3B" data-count="horizontal" data-text="StationAlarm SG is on sale&#8230;" data-url="http://blog.mugunthkumar.com/products/stationalarm-sg-is-on-sale/" data-lang="eng" data-via="@mugunthkumar" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></li><li><g:plusone size= "medium" href= "http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fstationalarm-sg-is-on-sale%2F"></g:plusone></li><li><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fstationalarm-sg-is-on-sale%2F&layout=button_count&show_faces=true&action=like&font=segoe ui&colorscheme=light&width=350&scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:350px; height:25px;" allowTransparency="true" ></iframe></li></ul>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.mugunthkumar.com/products/stationalarm-sg-is-on-sale/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>StationAlarm SG</title>
		<link>http://blog.mugunthkumar.com/products/stationalarm-sg/</link>
		<comments>http://blog.mugunthkumar.com/products/stationalarm-sg/#comments</comments>
		<pubDate>Sun, 10 May 2009 07:43:00 +0000</pubDate>
		<dc:creator>Mugunth Kumar</dc:creator>
				<category><![CDATA[Products]]></category>

		<guid isPermaLink="false">http://mugunthkumar.wordpress.com/2009/05/10/stationalarm-sg/</guid>
		<description><![CDATA[StationAlarm is an intelligent alarm system that is designed to let you sleep in the MRT without fearing to wake up at the right stations. All you have to do is to set your current station and the destination station. Your route is automatically computed and StationAlarm rings an alarm to wake up at the [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p></p><p><a href="http://mugunthkumar.wordpress.com/iphone-apps/stationalarm-sg/">StationAlarm</a> is an intelligent alarm system that is designed to let you sleep in the MRT without fearing to wake up at the right stations.</p>
<p>All you have to do is to set your current station and the destination station. Your route is automatically computed and StationAlarm rings an alarm to wake up at the right station(s).</p>
<p>Right station(s) means, if there is a interchange, where you have to change trains, StationAlarm can automatically wake you up at the right time for alighting.</p>
<p>For example, when you travel daily from Woodlands to Pioneer, StationAlarm will automatically wake you up at Jurong East and then at Pioneer. It&#8217;s especially helpful when you travel across the length of breadth of the island.</p>
<p>continue at source&#8230; <a title="StationAlarm SG" href="http://mugunthkumar.wordpress.com/iphone-apps/stationalarm-sg/">StationAlarm SG</a></p>
<p>&#8211;</p>
<p>Mugunth</p>
<p><map name='google_ad_map_135_8b86e81420c6776e'>
<area shape='rect' href='http://imageads.googleadservices.com/pagead/imgclick/135?pos=0' coords='1,2,367,28' />
<area shape='rect' href='http://services.google.com/feedback/abg' coords='384,10,453,23'/></map>
<img usemap='#google_ad_map_135_8b86e81420c6776e' border='0' src='http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=135&amp;url= http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fstationalarm-sg%2F' /></p><p><a href ="http://twitter.com/mugunthkumar">Follow me </a> on Twitter</p><p>&copy;2012 <a href="http://blog.mugunthkumar.com">MKBlog</a>. All Rights Reserved.</p>.<h4 id="tweetandlike-heading"></h4><ul id="tweetandlike-buttons"><li><a href="http://twitter.com/share" data-title="StationAlarm+SG" data-count="horizontal" data-text="StationAlarm SG" data-url="http://blog.mugunthkumar.com/products/stationalarm-sg/" data-lang="eng" data-via="@mugunthkumar" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></li><li><g:plusone size= "medium" href= "http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fstationalarm-sg%2F"></g:plusone></li><li><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.mugunthkumar.com%2Fproducts%2Fstationalarm-sg%2F&layout=button_count&show_faces=true&action=like&font=segoe ui&colorscheme=light&width=350&scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:350px; height:25px;" allowTransparency="true" ></iframe></li></ul>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.mugunthkumar.com/products/stationalarm-sg/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced

Served from: blog.mugunthkumar.com @ 2012-02-04 14:20:58 -->
