<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2870232110877996964</id><updated>2012-01-30T16:52:25.755-06:00</updated><category term='C#'/><category term='NAT'/><category term='QTMovie'/><category term='NSThread'/><category term='iPhone'/><category term='iTunes'/><category term='AsyncSocket'/><category term='UPnP'/><category term='HTTP Server'/><category term='NAT-PMP'/><category term='STUNT'/><category term='Bonjour'/><category term='Socket Queues'/><category term='OpenSSL'/><category term='XMPP'/><category term='XML'/><category term='TLS'/><category term='MultiThreading'/><category term='Mojo'/><category term='Open Source'/><category term='HTTP'/><title type='text'>Deusty</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Robbie Hanson</name><uri>http://www.blogger.com/profile/13418360199787914411</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>80</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-7634386027288410551</id><published>2011-11-08T19:47:00.000-06:00</published><updated>2011-11-08T19:47:38.833-06:00</updated><title type='text'>Logging &amp; Grand Central Dispatch</title><summary type='text'>Grand Central Dispatch is a marvelous technology. It provides our application with a thread-pool, and various methods to execute code on the threads in that thread pool. And best of all, it automatically manages the thread-pool size based on some very detailed knowledge of what the rest of the system is doing.


However, issuing log statements from a dispatch queue can be confusing. To see what I</summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/7634386027288410551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=7634386027288410551' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/7634386027288410551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/7634386027288410551'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2011/11/logging-grand-central-dispatch.html' title='Logging &amp; Grand Central Dispatch'/><author><name>Robbie Hanson</name><uri>http://www.blogger.com/profile/13418360199787914411</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-5547593549590926163</id><published>2011-06-09T10:28:00.002-05:00</published><updated>2011-06-09T11:53:00.591-05:00</updated><title type='text'>XMPP Framework v3 released</title><summary type='text'>Version 3 of the XMPP Framework was officially released yesterday.XMPP stands for "eXtensible Messaging and Presence Protocol". It is the protocol used by Google Talk and Facebook Chat. It can also be used for many other applications outside the realm of chat. For example, I have seen it used in P2P file transfer applications, home automation software, and even in medical applications.Version 3 </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/5547593549590926163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=5547593549590926163' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/5547593549590926163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/5547593549590926163'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2011/06/xmpp-framework-v3-released.html' title='XMPP Framework v3 released'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-674919888584292885</id><published>2011-06-08T00:50:00.003-05:00</published><updated>2011-06-08T00:58:45.119-05:00</updated><title type='text'>CocoaHTTPServer gets WebDAV support</title><summary type='text'>An open source contribution to the CocoaHTTPServer project has just added WebDAV support!CocoaHTTPServer is a small embeddable http server that you can add to your Mac or iOS application. WebDAV is a technology that allows users to mount web directories with the Finder. Put the two together, and now your users can use the finder to manage files on their iOS app!Special thanks to Pierre-Olivier </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/674919888584292885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=674919888584292885' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/674919888584292885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/674919888584292885'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2011/06/cocoahttpserver-gets-webdav-support.html' title='CocoaHTTPServer gets WebDAV support'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-3031570180022855403</id><published>2011-04-11T17:19:00.004-05:00</published><updated>2011-04-11T19:09:14.112-05:00</updated><title type='text'>Logging to a database</title><summary type='text'>So you're writing a Mac or iOS app and you're contemplating sending your log statements to a database. There are many benefits to doing this, especially when one considers the purpose of the log statements: reading them.Example 1:You're told of some problem your boss had with the application.  When did it happen?  "Yesterday around noonish."  Now if you're using log files then you find yourself </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/3031570180022855403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=3031570180022855403' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/3031570180022855403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/3031570180022855403'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2011/04/logging-to-database.html' title='Logging to a database'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-6641659945335114919</id><published>2011-01-27T15:27:00.004-06:00</published><updated>2011-01-28T21:53:13.509-06:00</updated><title type='text'>Multi-core iOS devices are coming. Are you ready?</title><summary type='text'>I recently gave a presentation at the Tampa iOS Developers Meetup about Grand Central Dispatch (GCD). If you are wondering how your application can take advantage of multi-core CPUs, then you'll likely want to become familiar with GCD.Here's what I talk about in the presentation:Why did Apple create Grand Central Dispatch?The effect of multi-core CPUs on software developers.Why did the Desktop </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/6641659945335114919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=6641659945335114919' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/6641659945335114919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/6641659945335114919'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2011/01/multi-core-ios-devices-are-coming-are.html' title='Multi-core iOS devices are coming. Are you ready?'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-6381165628214312885</id><published>2010-11-23T21:39:00.004-06:00</published><updated>2010-11-24T01:07:20.585-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='AsyncSocket'/><category scheme='http://www.blogger.com/atom/ns#' term='HTTP Server'/><title type='text'>Introducing GCD based CocoaHTTPServer</title><summary type='text'>Last week I released a GCD based version of AsyncSocket. (See previous post). In that post I discussed the benefits of using GCD over a runloop based architecture.GCD stands for Grand Central Dispatch and is Apple's revolutionary approach to multicore computing.While writing GCDAsyncSocket I was amazed at the performance benefits I was seeing. But I was anxious to see how it would perform in a </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/6381165628214312885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=6381165628214312885' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/6381165628214312885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/6381165628214312885'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2010/11/introducing-gcd-based-cocoahttpserver.html' title='Introducing GCD based CocoaHTTPServer'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-883031805646023194</id><published>2010-11-15T16:03:00.004-06:00</published><updated>2010-11-23T21:59:02.559-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='AsyncSocket'/><title type='text'>Introducing GCD based AsyncSocket</title><summary type='text'>I've rewritten AsyncSocket from the ground up using Grand Central Dispatch. It's now thread-safe and up to 400% faster. It makes it trivial to parallelize data processing tasks, and an ideal candidate for writing scalable servers.Apple released Grand Central Dispatch with Mac OS X 10.6. GCD comes with asynchronous socket monitoring utilities that are written on top of the fast and efficient </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/883031805646023194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=883031805646023194' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/883031805646023194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/883031805646023194'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2010/11/introducing-gcd-based-asyncsocket.html' title='Introducing GCD based AsyncSocket'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-5856031773938076437</id><published>2010-09-11T16:13:00.003-05:00</published><updated>2010-09-12T22:16:48.152-05:00</updated><title type='text'>WebSocket Draft 76 Algorithm Example</title><summary type='text'>The latest versions of Google Chrome and Safari have switched to draft 76 of the WebSocket protocol.  Since this version is so drastically different than draft 75, this means it isn't exactly backwards compatible.  In other words, if your server doesn't support d76, then the newest browsers won't work with the cool WebSocket stuff you wrote.This means server/framework developers will need to </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/5856031773938076437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=5856031773938076437' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/5856031773938076437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/5856031773938076437'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2010/09/websocket-draft-76-algorithm-example.html' title='WebSocket Draft 76 Algorithm Example'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-1425884590864540279</id><published>2010-05-31T20:50:00.004-05:00</published><updated>2010-06-02T04:33:09.660-05:00</updated><title type='text'>Introducing Cocoa Lumberjack</title><summary type='text'>Today we are introducing a new open source project: Cocoa LumberjackThis is a revolutionary new logging framework for iPhone and Mac.  Now you might be thinking "logging is boring".But what if I told you that by using the framework you can actually make your application faster because it is an order of magnitude faster than NSLog?What if I told you that the framework could allow you to debug your</summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/1425884590864540279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=1425884590864540279' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/1425884590864540279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/1425884590864540279'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2010/05/introducing-cocoa-lumberjack.html' title='Introducing Cocoa Lumberjack'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-2720436814765020441</id><published>2010-04-22T11:26:00.003-05:00</published><updated>2010-04-22T11:41:26.010-05:00</updated><title type='text'>Adding WebSockets to CocoaHTTPServer</title><summary type='text'>WebSockets are a fantastic new technology that will greatly improve browser based communication.  If you've never heard of WebSockets before you can read about them on Wikipedia or from Google.  The javascript API is documented here and the protocol is documented here.WebSocket support is available now in Chrome, and will be available soon in Firefox and Safari.Want to support this bleeding edge </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/2720436814765020441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=2720436814765020441' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/2720436814765020441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/2720436814765020441'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2010/04/adding-websockets-to-cocoahttpserver.html' title='Adding WebSockets to CocoaHTTPServer'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_lLQ1D-O52Bc/S9B7nwmJooI/AAAAAAAAACI/6Hh7QhZ8Bn8/s72-c/Screen+shot+2010-04-22+at+12.13.56+PM.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-173751074476736038</id><published>2010-04-04T01:30:00.001-05:00</published><updated>2010-04-04T13:18:06.012-05:00</updated><title type='text'>Mojo is now open source</title><summary type='text'>As many of you know, Deusty was forced to stop selling Mojo.  This was due to legal pressure from EMI, who threatened to sue us.  Irregardless of our chance of winning such a legal battle, the cost of trying was approximately a half million dollars.  Needless to say we didn't have that much money.I was saddened by the turn of events.  I thoroughly enjoyed working on Mojo.  It offered a unique set</summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/173751074476736038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=173751074476736038' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/173751074476736038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/173751074476736038'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2010/04/mojo-is-now-open-source.html' title='Mojo is now open source'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-216991883949050767</id><published>2010-02-22T22:27:00.007-06:00</published><updated>2010-02-26T01:20:01.102-06:00</updated><title type='text'>More bugs in NSFetchedResultsController (iPhone OS 3.1 and later)</title><summary type='text'>In my last post I talked about a hideous bug in NSFetchedResultsController that can cause your application to crash.  After tracking down the cause of the problem, I presented a subclass named SafeFetchedResultsController that fixes the problem for you.I've discovered another related bug in NSFetchedResultsController. While this bug doesn't cause your app to crash, it can cause your table cells </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/216991883949050767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=216991883949050767' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/216991883949050767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/216991883949050767'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2010/02/more-bugs-in-nsfetchedresultscontroller.html' title='More bugs in NSFetchedResultsController (iPhone OS 3.1 and later)'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_lLQ1D-O52Bc/S4NoabAQjCI/AAAAAAAAABw/OA1sYSyNBqw/s72-c/ss1.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-5402594439596553606</id><published>2010-02-16T14:13:00.008-06:00</published><updated>2010-02-26T01:20:52.510-06:00</updated><title type='text'>Hideous bug in NSFetchedResultsController (iPhone OS 3.1 and later)</title><summary type='text'>The NSFetchedResultsController class is magical.  If you're using core data, you can create one with only a few lines of code.  Then setup the proper delegate methods, and you get table updates with animation!  How cool is that?!Until it starts crashing randomly, with cryptic error messages that don't make a lot of sense...Wouldn't it be cool if somebody subclassed NSFetchedResultsController, and</summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/5402594439596553606/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=5402594439596553606' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/5402594439596553606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/5402594439596553606'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2010/02/hideous-bug-in-nsfetchedresultscontroll.html' title='Hideous bug in NSFetchedResultsController (iPhone OS 3.1 and later)'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_lLQ1D-O52Bc/S3r_RFNZj3I/AAAAAAAAABg/mTi04LZrmow/s72-c/ss1.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-1224982834364616025</id><published>2010-02-05T11:04:00.003-06:00</published><updated>2010-02-16T14:13:33.339-06:00</updated><title type='text'>PJSIP iPhone Audio Driver</title><summary type='text'>Several months ago a company named Voalte contracted me to write an iPhone audio driver for PJSIP.  (PJSIP is a VoIP framework than can be used in the iPod/iPhone.)Voalte is doing something very interesting.  They are creating an iPhone application for health care.  Essentially, if you walk into a hospital today, you'll see nurses using a variety of technological devices.  They might have voip </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/1224982834364616025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=1224982834364616025' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/1224982834364616025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/1224982834364616025'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2010/02/pjsip-iphone-audio-driver.html' title='PJSIP iPhone Audio Driver'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-1022978913552894019</id><published>2009-12-24T16:09:00.002-06:00</published><updated>2009-12-24T16:24:22.397-06:00</updated><title type='text'>Muliticast Delegates in Cocoa - Part 2</title><summary type='text'>In the past I've talked about Mulitcast Delegates in Cocoa, and how/why they are used in the XMPP framework.  One thing that I didn't mention, however, is that Multicast Delegate methods can also have a return value.  (Whereas notifications obviously cannot.)This may be a little confusing at first. If we have a delegate method such as:- (BOOL)shouldDoSomething;and one delegate replies YES, but </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/1022978913552894019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=1022978913552894019' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/1022978913552894019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/1022978913552894019'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2009/12/muliticast-delegates-in-cocoa-part-2.html' title='Muliticast Delegates in Cocoa - Part 2'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-8679787019280344928</id><published>2009-12-08T21:34:00.008-06:00</published><updated>2009-12-09T14:59:13.027-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AsyncSocket'/><category scheme='http://www.blogger.com/atom/ns#' term='Socket Queues'/><title type='text'>Queued Reads &amp; Writes</title><summary type='text'>Custom network programming has always been a bit tedious.  I'm not referring to the simple stuff like doing a HTTP request.  I'm referring to actually working with a TCP socket, and implementing some protocol.  The protocols themselves are often straight-forward, and easy enough to understand.  But when it comes time to write it, that darn socket keeps getting in the way and complicating your </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/8679787019280344928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=8679787019280344928' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/8679787019280344928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/8679787019280344928'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2009/12/queued-reads-writes.html' title='Queued Reads &amp; Writes'/><author><name>Luke Steffen</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-570943037272251877</id><published>2009-06-12T02:48:00.003-05:00</published><updated>2009-06-12T03:51:21.254-05:00</updated><title type='text'>Filling the pipelines</title><summary type='text'>I was recently reviewing a friend's code after he asked for some help.  He was importing some stuff from an XML file into core data and wanted to know how he could speed it up.  After careful review I told him that I didn't know of any way to significantly speed up the XML parsing, and I also didn't know of any way to make the core data part faster.  But I did know of a way to speed up the </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/570943037272251877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=570943037272251877' title='20 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/570943037272251877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/570943037272251877'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2009/06/filling-pipelines.html' title='Filling the pipelines'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>20</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-5930707837554691037</id><published>2009-04-28T14:39:00.004-05:00</published><updated>2009-04-28T15:10:16.980-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTTP Server'/><title type='text'>Cocoa HTTPServer Improvements</title><summary type='text'>There's a lot of really cool things you can do with the open-source Cocoa HTTP Server.  It's designed to be embedded in your Mac or iPhone application, and allows you to serve up static or dynamic content, as well as accept uploads.  And there's a lot of built-in features that give you a lot of power without having to do a lot of work:Built in support for bonjour broadcastingIPv4 and IPv6 </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/5930707837554691037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=5930707837554691037' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/5930707837554691037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/5930707837554691037'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2009/04/cocoa-httpserver-improvements.html' title='Cocoa HTTPServer Improvements'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-8334206785039282757</id><published>2009-04-28T13:19:00.003-05:00</published><updated>2009-04-28T15:10:47.283-05:00</updated><title type='text'>What network-attached storage means for developers</title><summary type='text'>Network-attached storage (NAS) is getting more and more popular these days.  Its been around for quite some time, but has never been exactly common among your average non-techie computer user.  That's changing quickly.  How easy is it for someone to plug an external hard-drive into an airport extreme or any other similar router?  Not only that, but people can mount FTP, SMB or Amazon S3 drives </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/8334206785039282757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=8334206785039282757' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/8334206785039282757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/8334206785039282757'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2009/04/what-network-attached-storage-means-for.html' title='What network-attached storage means for developers'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-2828107482716731747</id><published>2009-04-23T17:25:00.002-05:00</published><updated>2009-04-23T17:55:26.440-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><title type='text'>Bug in Apple's NSXML</title><summary type='text'>There is a really annoying bug in Apple's NSXML implementation.  I wanted to share this bug because it has recently affected me, as well as a few independent developers who are working with the XMPP Framework.  I imagine it would also be useful knowledge to anyone working extensively with XML in Mac OS X.The bug is in NSXMLElement, in the elementsForName: method.Consider the following XML </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/2828107482716731747/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=2828107482716731747' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/2828107482716731747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/2828107482716731747'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2009/04/bug-in-apples-nsxml.html' title='Bug in Apple&apos;s NSXML'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-269373901558899908</id><published>2009-04-22T22:42:00.004-05:00</published><updated>2009-04-22T23:27:09.960-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSSL'/><title type='text'>Decrypting OpenSSL AES files in C#</title><summary type='text'>Many operating systems are equipped with OpenSSL, making it fairly easy to deal with the otherwise complicated issue of encryption.  Windows doesn't come with OpenSSL, but it does come with good ecryption libraries.  The trick is getting the two to play nicely.In this post I'll demonstrate the following:How to encrypt/decrypt a file via AES using OpenSSL on command lineHow to decrypt in CocoaHow </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/269373901558899908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=269373901558899908' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/269373901558899908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/269373901558899908'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2009/04/decrypting-openssl-aes-files-in-c.html' title='Decrypting OpenSSL AES files in C#'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-3091167093796211092</id><published>2009-01-29T22:02:00.002-06:00</published><updated>2009-01-29T23:49:47.674-06:00</updated><title type='text'>X509 Certificate to NSDictionary</title><summary type='text'>Extracting certificate information from a secure (SSL/TLS) connection is one of those things that should be easy.  At least it is in other languages like C#.  Unfortunately this is not the case in Cocoa.Apple provides a rather confusing API.  For example, say you wanted to get the subject information from the peer's certificate.  (This is the information that says the certificate is for "</summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/3091167093796211092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=3091167093796211092' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/3091167093796211092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/3091167093796211092'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2009/01/x509-certificate-to-nsdictionary.html' title='X509 Certificate to NSDictionary'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-8949001670509582539</id><published>2009-01-29T14:32:00.003-06:00</published><updated>2009-12-14T04:05:11.269-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AsyncSocket'/><title type='text'>AsyncSocket and SSL/TLS</title><summary type='text'>In the past I've talked about a method of securing communication over your socket using SSL/TLS.  We've recently made some improvements that make the process even easier.(TLS is the successor to SSL, and I'll be using the two terms interchangeably.)What was wrong with the old method?Problem #1: Prior to these improvements, one would manually call CFReadStreamSetProperty and </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/8949001670509582539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=8949001670509582539' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/8949001670509582539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/8949001670509582539'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2009/01/asyncsocket-and-ssltls.html' title='AsyncSocket and SSL/TLS'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-6137862532385281001</id><published>2008-12-07T19:09:00.004-06:00</published><updated>2008-12-07T22:40:26.492-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTTP Server'/><title type='text'>HTTP Server - iPhone example</title><summary type='text'>The CocoaHTTPServer project just posted a sample iPhone project that demonstrates  How to incorporate the server code into an iPhone project  How to dynamically create an index page listing files on the phone  How to accept uploaded files, and process multipart form dataThis is all thanks to developer Nonnus who graciously decided to share the code with the development community!You can grab the </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/6137862532385281001/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=6137862532385281001' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/6137862532385281001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/6137862532385281001'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/12/http-server-iphone-example.html' title='HTTP Server - iPhone example'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_lLQ1D-O52Bc/STx15f7YEyI/AAAAAAAAABM/O8u1OsllgoQ/s72-c/Picture+2.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-7084012686195328938</id><published>2008-12-02T05:48:00.004-06:00</published><updated>2008-12-02T06:39:34.974-06:00</updated><title type='text'>Tabs vs Spaces</title><summary type='text'>Somebody recently asked me what my preference was: tabs or spaces.  I was rather taken aback by the question, mostly because it was being posed by an experienced developer.  I was under the impression that all developers learned the answer to this question in college.  I know I did.So which is better - tabs or spaces?  Neither.It was one of the very first things I learned in college - how to </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/7084012686195328938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=7084012686195328938' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/7084012686195328938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/7084012686195328938'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/12/tabs-vs-spaces.html' title='Tabs vs Spaces'/><author><name>Deusty</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_yP4qi-PQRAo/STUqWtWwQOI/AAAAAAAAAAM/L4mtSvYP63M/s72-c/tabsVspaces.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-5670781991190119494</id><published>2008-11-29T23:28:00.004-06:00</published><updated>2008-11-29T23:43:14.593-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AsyncSocket'/><category scheme='http://www.blogger.com/atom/ns#' term='HTTP Server'/><title type='text'>More Multithreading</title><summary type='text'>The AsyncSocket class has always made it rather simple to support multithreading.  If you create a socket, it uses the runloop of the current thread.  And, when accepting incoming connections, there is a delegate method that allows you to choose a different thread/runloop to use for the newly accepted socket.  (Which works well when using a thread pool design)We've recently improved upon this by </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/5670781991190119494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=5670781991190119494' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/5670781991190119494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/5670781991190119494'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/11/more-multithreading.html' title='More Multithreading'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-1648414031046710929</id><published>2008-11-17T12:26:00.004-06:00</published><updated>2009-01-29T14:31:30.000-06:00</updated><title type='text'>Flags</title><summary type='text'>Intuitively, all developers know that you only need one bit to store a BOOL value.  But, depending on your compiler settings, your BOOL's may be taking up 32 bits. This hasn't really bothered many people for years - but with platforms like the iPhone, every byte counts again:enum MoodFlags{    kHappy =  1 &lt;&lt; 0,    kHungry =  1 &lt;&lt; 1,    kTired =  1 &lt;&lt; 2,};Byte mood = 0;- (BOOL)isHappy {    return </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/1648414031046710929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=1648414031046710929' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/1648414031046710929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/1648414031046710929'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/11/flags.html' title='Flags'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-1763766005655508641</id><published>2008-11-13T07:56:00.003-06:00</published><updated>2008-11-29T23:42:54.297-06:00</updated><title type='text'>Multicast Delegates in Cocoa</title><summary type='text'>Delegates are really simple and straightforward in Cocoa.  The client simply registers itself as a delegate:[worker setDelegate:self];And because of the nature of Objective-C, the worker can simply invoke any of it's delegate methods as needed:if([delegate respondsToSelector:@selector(workerDidFinish:)] ){    [delegate workerDidFinish:self];}Things are a bit different in C#. The client registers </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/1763766005655508641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=1763766005655508641' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/1763766005655508641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/1763766005655508641'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/11/multicast-delegates-in-cocoa.html' title='Multicast Delegates in Cocoa'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-7955657667590120629</id><published>2008-10-21T01:39:00.004-05:00</published><updated>2008-10-21T02:08:32.226-05:00</updated><title type='text'>Open Source Ooh La La</title><summary type='text'>Just found out some of our open source projects are listed on ohloh.  It was interesting to see the estimates of how much these projects would cost to write from scratch:CocoaAsyncSocket: $ 317,548CocoaHTTPServer : $  37,711KissXML         : $  23,829XMPPFramework   : $  90,452And speaking of open source software, we've recently created mailing lists for our open source projects to help </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/7955657667590120629/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=7955657667590120629' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/7955657667590120629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/7955657667590120629'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/10/open-source-ooh-la-la.html' title='Open Source Ooh La La'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-3633825962323644332</id><published>2008-10-20T15:34:00.006-05:00</published><updated>2010-05-31T20:49:47.383-05:00</updated><title type='text'>Quick &amp; Easy Debug output in Cocoa</title><summary type='text'>There are big logging packages for Cocoa such as Log4Cocoa.  This post is not about that type of logging.The debug logging I'm often looking for is the type I need while I'm still coding something.  I'm whipping up some big slab of code, and I want to put various NSLog statements in several places.  I may eventually keep some of them if they tell me about errors, or warn me of odd but uncritical </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/3633825962323644332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=3633825962323644332' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/3633825962323644332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/3633825962323644332'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/10/quick-easy-debug-output-in-cocoa.html' title='Quick &amp; Easy Debug output in Cocoa'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-1567362564964295578</id><published>2008-10-15T06:11:00.007-05:00</published><updated>2009-05-04T17:21:09.297-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='AsyncSocket'/><title type='text'>AsyncSocket for UDP</title><summary type='text'>The famous TCP AsyncSocket class is now available in UDP form!  It works almost exactly the same way, but is written specifically for UDP:AsyncUdpSocket is a UDP/IP socket networking library that wraps CFSocket. It offers asynchronous operation, and a native cocoa class complete with delegate support. Here are the key features:Queued non-blocking send/receive operations, with optional timeouts. </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/1567362564964295578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=1567362564964295578' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/1567362564964295578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/1567362564964295578'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/10/asyncsocket-for-udp.html' title='AsyncSocket for UDP'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-6769136267995595256</id><published>2008-09-27T16:57:00.010-05:00</published><updated>2009-05-04T17:28:21.557-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><title type='text'>NSXML on the iPhone</title><summary type='text'>We recently ran into a huge roadblock.  We had created an XMPP framework in Cocoa, and we were hoping it would easily port to the iPhone.  Turns out we were wrong, because Apple decided to make the NSXML classes (NSXMLDocument, NSXMLElement, NSXMLNode, etc) private!  They are supposedly in the private Office framework, however private frameworks can't be used for any intensive purposes.  So there</summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/6769136267995595256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=6769136267995595256' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/6769136267995595256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/6769136267995595256'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/09/nsxml-on-iphone.html' title='NSXML on the iPhone'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-3659921285541840461</id><published>2008-08-17T23:05:00.005-05:00</published><updated>2008-09-29T19:52:00.424-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='XMPP'/><title type='text'>XMPPFramework on iPhone</title><summary type='text'>Several developers have helped recently to make the cocoa xmpp framework compatible with the iPhone.  And I'm happy to announce that the changes have been committed, and the framework is now iPhone ready.Cocoa XMPP Framework Google Code PageThe xcode project in subversion is still a standard desktop project though.  You can get a skeleton iPhone project from here.---UPDATE---Apparently the iPhone</summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/3659921285541840461/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=3659921285541840461' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/3659921285541840461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/3659921285541840461'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/08/xmppframework-on-iphone.html' title='XMPPFramework on iPhone'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-7089956141917538519</id><published>2008-08-15T19:10:00.003-05:00</published><updated>2008-08-15T19:31:03.393-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AsyncSocket'/><category scheme='http://www.blogger.com/atom/ns#' term='HTTP Server'/><title type='text'>Multi-Threaded HTTP Server</title><summary type='text'>I've gotten several requests recently from developers wondering how to add multithreading to AsyncSocket and/or the Cocoa HTTP Server.  So I whipped up a quick version of the cocoa http server that demonstrates how by splitting incoming connections between multiple threads.You can download the MultiThreadedHTTPServer from here.A quick explanation of the code:Anytime AsyncSocket accepts a new </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/7089956141917538519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=7089956141917538519' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/7089956141917538519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/7089956141917538519'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/08/multi-threaded-http-server.html' title='Multi-Threaded HTTP Server'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-4830401225467397830</id><published>2008-08-13T02:30:00.002-05:00</published><updated>2008-08-13T02:47:05.794-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NAT-PMP'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='UPnP'/><title type='text'>PortMapper for Windows Updated</title><summary type='text'>About a month ago I announced an open source port mapper application and framework that allows you to automatically map ports using UPnP and/or NAT-PMP.  It comes with a very easy to use API:event ExternalIPAddressDidChange;event WillStartSearchForRouter;event DidFinishSearchForRouter;event DidStartWork;event DidFinishWork;event DidReceiveUPNPMappingTable;event DidChangeMappingStatus;bool </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/4830401225467397830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=4830401225467397830' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/4830401225467397830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/4830401225467397830'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/08/portmapper-for-windows-updated.html' title='PortMapper for Windows Updated'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-5998095091162566196</id><published>2008-08-13T01:49:00.003-05:00</published><updated>2008-08-13T02:27:12.118-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='AsyncSocket'/><title type='text'>Socket connect timeouts in .Net</title><summary type='text'>Awhile back, I was trying to set a connect timeout for a socket.  It was easiest to write this particular code in a synchronous manner, so I was a bit annoyed when I found there was a SendTimeout and ReceiveTimeout for the .Net Socket class, but no ConnectTimeout.  I thought I was going to have to switch to asynchronous code, until I found a trick:// Connect timeout is in millisecondsint </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/5998095091162566196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=5998095091162566196' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/5998095091162566196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/5998095091162566196'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/08/socket-connect-timeouts-in-net.html' title='Socket connect timeouts in .Net'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-6522361681514284098</id><published>2008-08-08T15:17:00.005-05:00</published><updated>2008-08-08T20:55:11.857-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSSL'/><title type='text'>OpenSSL and RSACryptoServiceProvider</title><summary type='text'>We had a need to interoperate with OpenSSL from within our application recently.  More specifically, we needed to be able to sign some data with OpenSSL on our server (a linux machine), and then verify the data within Mojo.  This was quite easy to do in the Mac version using SSCrypto.  However, accomplishing the same feat on Windows in our C# app proved to be a nightmare.  We eventually got it </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/6522361681514284098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=6522361681514284098' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/6522361681514284098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/6522361681514284098'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/08/openssl-and-rsacryptoserviceprovider.html' title='OpenSSL and RSACryptoServiceProvider'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-4956361989622298851</id><published>2008-08-03T18:26:00.004-05:00</published><updated>2008-08-17T23:06:33.687-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='HTTP Server'/><title type='text'>Cocoa HTTPServer on iPhone</title><summary type='text'>The open source Cocoa HTTP Server has been updated to be compatible with the iPhone.  You can find it at its google code page.</summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/4956361989622298851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=4956361989622298851' title='36 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/4956361989622298851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/4956361989622298851'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/08/cocoa-httpserver-on-iphone.html' title='Cocoa HTTPServer on iPhone'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>36</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-6738600807907116511</id><published>2008-08-03T15:50:00.001-05:00</published><updated>2008-08-03T12:11:09.231-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='AsyncSocket'/><title type='text'>Cocoa AsyncSocket on iPhone</title><summary type='text'>There has been a lot of interest recently regarding using AsyncSocket on the iPhone.  (In other words, I've gotten a lot of email questions about it.)  Just wanted to let everyone know that AsyncSocket works great on the iPhone, and I've received word from several developers that are already using it within their iPhone apps.As a heads up, developers may need to be aware that the iPhone doesn't </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/6738600807907116511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=6738600807907116511' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/6738600807907116511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/6738600807907116511'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/07/asyncsocket-on-iphone.html' title='Cocoa AsyncSocket on iPhone'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-6776162114044979359</id><published>2008-07-28T17:17:00.002-05:00</published><updated>2008-07-28T17:20:27.129-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='AsyncSocket'/><title type='text'>AsyncSocket for Windows on Google Code</title><summary type='text'>Due to popular request, the AsyncSocket for Windows networking library is now a google code project.  This will make it easier for users to submit bugs or patches, report issues, or make feature requests.AsyncSocket for Windows Google Code Project</summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/6776162114044979359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=6776162114044979359' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/6776162114044979359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/6776162114044979359'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/07/asyncsocket-for-windows-on-google-code.html' title='AsyncSocket for Windows on Google Code'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-7491141838303964580</id><published>2008-07-13T22:35:00.009-05:00</published><updated>2008-07-13T23:56:20.442-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NAT-PMP'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='UPnP'/><title type='text'>UPnP and NAT-PMP PortMapper for Windows</title><summary type='text'>If you're looking to add UPnP support and/or NAT-PMP support to your app, Cocoa developers need look no further than TCMPortMapper. This is a wrapper around the excellent MiniUPnP project.  But what if you're a Windows .Net developer?We scoured the web for such a library and found little help. There were expensive commercial solutions, bits of concept code found on forums, and an especially </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/7491141838303964580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=7491141838303964580' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/7491141838303964580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/7491141838303964580'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/07/tcmportmapper-for-windows.html' title='UPnP and NAT-PMP PortMapper for Windows'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_lLQ1D-O52Bc/SHrYhPBbtII/AAAAAAAAAAc/Bzk_KbtyNhk/s72-c/portMap1.jpg' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-3404080647412358460</id><published>2008-07-08T00:12:00.004-05:00</published><updated>2008-07-08T00:19:39.461-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Bonjour'/><title type='text'>Bonjour for .Net on Google Code</title><summary type='text'>We previously announced Bonjour for .Net.  This was an open source project we picked up, and made a lot of changes and improvements to.  In an effort to make Bonjour more prevalent in the Windows and .Net world, we've created a google code page for it.  This will allow anyone to quickly browse the code, and submit bug reports and/or feature requests.Google code pageBrowse the source code</summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/3404080647412358460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=3404080647412358460' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/3404080647412358460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/3404080647412358460'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/07/bonjour-for-net-on-google-code.html' title='Bonjour for .Net on Google Code'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-9138240572384609853</id><published>2008-07-06T15:28:00.003-05:00</published><updated>2008-07-06T16:28:18.723-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Thread madness (and a gottcha)</title><summary type='text'>Programming in C# often involves a lot of threading.  The problem is that developers may not always be aware of the mulithreading!  Asynchronous methods are the prime example.  Pretty much anytime you call a method that starts with "Begin" you're putting work on a background thread, and you may get the callback on that same background thread.  Here's an example:private void StartAsync(){  </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/9138240572384609853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=9138240572384609853' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/9138240572384609853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/9138240572384609853'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/07/thread-madness-and-gottcha.html' title='Thread madness (and a gottcha)'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-1657712266733561981</id><published>2008-06-27T11:59:00.005-05:00</published><updated>2008-07-28T17:17:33.936-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='AsyncSocket'/><title type='text'>AsyncSocket for Windows</title><summary type='text'>I wrote a really long post recently entitled The problem with sockets.  At the very end I slipped in a tiny little remark: "we're releasing under public domain our C# implementation of AsyncSocket".It's pretty much a replica of the Mac version.  So it supports fully asynchronous reads and writes, and transparently supports IPv4, IPv6, and TLS/SSL.  Here's an outline of the public methods and such</summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/1657712266733561981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=1657712266733561981' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/1657712266733561981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/1657712266733561981'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/06/asyncsocket-for-windows.html' title='AsyncSocket for Windows'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-4666539843138336957</id><published>2008-06-08T01:24:00.002-05:00</published><updated>2009-01-30T11:44:41.365-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='AsyncSocket'/><title type='text'>The problem with sockets</title><summary type='text'>Before I start, I should probably spell out a few things first:Most developers never even deal with sockets because they don't need to.  If you're doing something common, like downloading a file from a HTTP server, then you can use one of the provided API classes.  For example, Cocoa has NSURLDownload for this purpose, and C# has the WebClient class.But if you are tasked with implementing a new </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/4666539843138336957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=4666539843138336957' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/4666539843138336957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/4666539843138336957'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/04/problem-with-sockets.html' title='The problem with sockets'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-7250115015432663096</id><published>2008-06-07T11:31:00.003-05:00</published><updated>2008-06-07T12:19:52.086-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AsyncSocket'/><title type='text'>Continuing AsyncSocket improvements</title><summary type='text'>Been spending a lot of time lately making sure AsyncSocket runs perfectly with IPv6.  There's been many related bug fixes.  But a big stumbling block recently was the discovery of link-local IPv6 addresses.  I discussed them thoroughly in the Bonjour and IPv6 post.  But basically, they're IPv6 addresses that are only valid over a particular link.  (E.g. only valid over wifi, but not the regular </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/7250115015432663096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=7250115015432663096' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/7250115015432663096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/7250115015432663096'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/06/continuing-asyncsocket-improvements.html' title='Continuing AsyncSocket improvements'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-103340060726244028</id><published>2008-06-04T17:38:00.003-05:00</published><updated>2008-06-04T19:06:26.594-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Bonjour'/><title type='text'>Bonjour and IPv6</title><summary type='text'>When you resolve a service using Bonjour, you get an array of addresses.  There are many sites out there explaining that the array may contain IPv6 addresses, and they usually go on to explain how to filter these out.  But what if you actually support IPv6 and you want to use it?Well then you may want to convert that NSData object thingy to a readable address. You may run into problems here, </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/103340060726244028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=103340060726244028' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/103340060726244028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/103340060726244028'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/06/bonjour-and-ipv6.html' title='Bonjour and IPv6'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-6386542173564215818</id><published>2008-05-29T23:10:00.003-05:00</published><updated>2008-05-29T23:19:49.412-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AsyncSocket'/><title type='text'>AsyncSocket Updates</title><summary type='text'>With the latest Leopard update (10.5.3) the getaddrinfo function changed!  We were effectively using this:getaddrinfo("localhost", ...)which used to get us two addresses (IPv4 loopback and IPv6 loopback).  But with the latest update, it just gets us an error!This is obviously no good.  So we fixed the problem.  And it just so happens that this was in AsyncSocket, and we also found two other small</summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/6386542173564215818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=6386542173564215818' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/6386542173564215818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/6386542173564215818'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/05/asyncsocket-updates_29.html' title='AsyncSocket Updates'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-5279301288210151487</id><published>2008-05-19T22:42:00.002-05:00</published><updated>2008-05-20T00:57:34.883-05:00</updated><title type='text'>Casting, Subclassing, and the isa field</title><summary type='text'>I was recently updating the xmpp framework, and I ran into a bit of a dilemma.  Within the xmpp framework there are 3 types of elements: IQ, Presence and Message.  I wanted to extend NSXMLElement to have custom subclasses for each type of element.  The subclasses didn't have any variables of their own.  Each just added convenient methods for accessing common information.  But here's the catch: I </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/5279301288210151487/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=5279301288210151487' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/5279301288210151487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/5279301288210151487'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/05/casting-subclassing-and-isa-field.html' title='Casting, Subclassing, and the isa field'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-4418391865077493210</id><published>2008-05-19T22:28:00.004-05:00</published><updated>2008-05-19T22:41:31.655-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XMPP'/><title type='text'>XMPPFramework Updates</title><summary type='text'>I have previously written about moving Towards an Open Source XMPP Framework for Cocoa.  With that first framework release I had a big todo list.  Today, I shortened that list.Changes to XMPPFramework:Added lightweight wrapper classes for IQ, Presence, and Message elements.- These extend NSXMLElement.Added XMPPClient class- Lightweight wrapper around XMPPStream.- Full roster managment.- Allows </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/4418391865077493210/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=4418391865077493210' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/4418391865077493210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/4418391865077493210'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/05/xmppframework-updates.html' title='XMPPFramework Updates'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-1121585862635729403</id><published>2008-05-01T11:48:00.003-05:00</published><updated>2008-05-02T01:14:32.524-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AsyncSocket'/><title type='text'>AsyncSocket Updates</title><summary type='text'>We've made a few improvements to AsyncSocket.  Thanks to those who posted or emailed us bug reports.  Since we can see that there are several users out there who use this library, we've created a google code project for it.  This will make it easier for users to submit bugs or patches, report issues, or make feature requests.You can find it here:http://code.google.com/p/cocoaasyncsocket/Read more</summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/1121585862635729403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=1121585862635729403' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/1121585862635729403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/1121585862635729403'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/05/asyncsocket-updates.html' title='AsyncSocket Updates'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-3088910293482110668</id><published>2008-03-31T20:48:00.006-05:00</published><updated>2009-03-29T02:16:49.940-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Bonjour'/><title type='text'>Bonjour for .Net</title><summary type='text'>In implementing Mojo for Windows, one of our first tasks was to get Bonjour working.  We looked for a good solution to this problem for months with no answer.  And then, one fine day in July, we discovered this:http://craz.net/programs/ZeroconfNetServices/A most generous soul named David Hammerton had created a "wrapper around Apple's mDNS Windows library (dnssd.dll) which provides two .NET </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/3088910293482110668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=3088910293482110668' title='45 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/3088910293482110668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/3088910293482110668'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/03/bonjour-for-net.html' title='Bonjour for .Net'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>45</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-8932109248965861595</id><published>2008-03-13T02:11:00.002-05:00</published><updated>2008-03-13T02:15:07.942-05:00</updated><title type='text'>Google Code</title><summary type='text'>We've recently posted 2 of our open source projects up on Google Code:XMPPFramework: http://code.google.com/p/xmppframework/CocoaHTTPServer: http://code.google.com/p/cocoahttpserver/This makes it easier to quickly look over the code without having to download the project.  It also gives us a nice Wiki for the project, and issue tracking for those that use our code.We'll be posting more code up on</summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/8932109248965861595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=8932109248965861595' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/8932109248965861595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/8932109248965861595'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/03/google-code.html' title='Google Code'/><author><name>Deusty</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-4333998429688574701</id><published>2008-02-26T18:04:00.005-06:00</published><updated>2011-03-17T23:23:12.989-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XMPP'/><title type='text'>Towards an Open Source XMPP Framework for Cocoa</title><summary type='text'>A long time ago I promised I'd release our XMPP implementation.  I'm making good on that promise today.  Read on for details.XMPP ("Extensible Messaging and Presence Protocol" aka Jabber) is a popular protocol which is very useful in a variety of situations and programs.  It's a lot more than just instant messaging!  For example, the presence notifications alone could be useful to help clients </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/4333998429688574701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=4333998429688574701' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/4333998429688574701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/4333998429688574701'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/02/towards-open-source-xmpp-framework-for.html' title='Towards an Open Source XMPP Framework for Cocoa'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-6936063322138209341</id><published>2008-02-25T17:10:00.007-06:00</published><updated>2008-02-25T17:27:27.710-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AsyncSocket'/><title type='text'>AsyncSocket 4.3.4</title><summary type='text'>We have been using the AsyncSocket library EXTENSIVELY here at deusty.  We use it as the basis for our Open Source Embedded HTTP Server, and we also use it within our XMPP client, and within our STUNT (TCP NAT Traversal) code.Over time, we've grown to love this little class, but that's not to say we didn't run into a few bugs.  We've squashed a few, added a few features, and many comments.  We're</summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/6936063322138209341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=6936063322138209341' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/6936063322138209341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/6936063322138209341'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/02/asyncsocket-434.html' title='AsyncSocket 4.3.4'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-8959330799218121437</id><published>2008-02-25T15:57:00.004-06:00</published><updated>2008-02-25T16:26:25.923-06:00</updated><title type='text'>Workaround for Workaround</title><summary type='text'>Sometimes there are tiny little bugs in the API's that occasionally creep up in odd situations.  These bugs generally only affect about a dozen people...ever.  This is for the other 11 of you:CFHTTPAuthenticationCreateFromResponse has a known bug.  Basically if you create an empty response with CFHTTPMessageCreateEmpty, and then fill it with CFHTTPMessageAppendBytes, then attempting to create a </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/8959330799218121437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=8959330799218121437' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/8959330799218121437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/8959330799218121437'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2008/02/workaround-for-workaround.html' title='Workaround for Workaround'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-5234299733540828505</id><published>2007-11-24T14:10:00.002-06:00</published><updated>2008-02-15T13:30:05.408-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TLS'/><category scheme='http://www.blogger.com/atom/ns#' term='HTTP'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='HTTP Server'/><title type='text'>HTTP Server - SSL/TLS Encryption</title><summary type='text'>We've already introduced our open source embedded HTTP server. (See Post)We also showed how to extend the server to add suppport for password protection. (See Post)Today we're going to show how to enable SSL/TLS encryption of traffic over the server.Note: If you're not completely familiar with HTTPS and/or TLS encryption, check out wikipedia (1, 2) or other good sources for more information.The </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/5234299733540828505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=5234299733540828505' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/5234299733540828505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/5234299733540828505'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2007/11/http-server-ssltls-encryption.html' title='HTTP Server - SSL/TLS Encryption'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-4528357861328829254</id><published>2007-11-11T23:56:00.001-06:00</published><updated>2008-02-15T13:28:30.033-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTTP'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='HTTP Server'/><title type='text'>Updated open source embedded http server</title><summary type='text'>We released a small update today for our Cocoa open source embedded http server.  If you've never heard about it before, we introduced it here, and discussed using password protection here.An overview of the changes:- fixes a few bugs when using IPv6 over a local network- fixes small memory leak (1 string) when using password protection- removed some unnecessary code in HTTPAuthenticationRequest-</summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/4528357861328829254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=4528357861328829254' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/4528357861328829254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/4528357861328829254'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2007/11/updated-open-source-embedded-http.html' title='Updated open source embedded http server'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-168575891152766411</id><published>2007-11-04T18:46:00.000-06:00</published><updated>2007-11-04T19:37:51.329-06:00</updated><title type='text'>Migrating your app to Leopard</title><summary type='text'>There are some great new API's in Leopard.  But what if you have an existing user base in Tiger?  And what if you're using Sparkle to provide updates for your users?  How do you migrate to a Leopard only app?  The question I pose here is not "should I migrate to Leopard only code" but "after I migrate to Leopard only code, how do I distribute my app to existing users - only some of who have </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/168575891152766411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=168575891152766411' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/168575891152766411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/168575891152766411'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2007/11/migrating-your-app-to-leopard.html' title='Migrating your app to Leopard'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-8234548878901277253</id><published>2007-09-17T15:37:00.001-05:00</published><updated>2009-12-14T04:04:04.853-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NAT'/><category scheme='http://www.blogger.com/atom/ns#' term='STUNT'/><title type='text'>STUNT &amp; out-of-band channels</title><summary type='text'>In the "NAT Traversal: Primer" article, I mentioned briefly that two parties send messages back and forth over an "out-of-band" channel in order to negotiate the connection.  I'd like to talk a little bit more about this "out-of-band" channel now, and the solution we chose.The reason an out-of-band channel is needed is obvious.  TCP NAT traversal can be challenging, and getting it done requires a</summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/8234548878901277253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=8234548878901277253' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/8234548878901277253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/8234548878901277253'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2007/09/stunt-out-of-band-channels.html' title='STUNT &amp; out-of-band channels'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-6672237856738483131</id><published>2007-09-03T04:21:00.000-05:00</published><updated>2007-09-03T04:31:57.796-05:00</updated><title type='text'>embedded NUL in CFString literal</title><summary type='text'>I was working with XMPP, and implementing plain SASL.  In doing so I needed to use the nul '\0' character as a separator like so:[NSString stringWithFormat:@"\0%@\0%@", username, password]It worked just fine, but the compiler kept giving me a warning about embedded NUL characters in my string.  Since it's generally a good idea to make sure you compile cleanly, I went looking for a way to disable </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/6672237856738483131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=6672237856738483131' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/6672237856738483131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/6672237856738483131'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2007/09/embedded-nul-in-cfstring-literal.html' title='embedded NUL in CFString literal'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-2941804138376947945</id><published>2007-09-03T01:28:00.000-05:00</published><updated>2007-09-03T04:13:50.650-05:00</updated><title type='text'>Example please...</title><summary type='text'>I've been working hard recently on a native Cocoa XMPP library.  (If you don't know what xmpp is, you can read the wikipedia article.  It's the protocol behind jabber and google talk.)  One of the difficulties I ran into was implementing SASL digest authentication.  The XMPP RFC gives an example, but doesn't tell you how it created the proper response.  After some googling, I stumbled upon the </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/2941804138376947945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=2941804138376947945' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/2941804138376947945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/2941804138376947945'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2007/09/example-please.html' title='Example please...'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-3951282664727208079</id><published>2007-07-25T22:09:00.001-05:00</published><updated>2007-08-18T11:50:20.574-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NAT'/><category scheme='http://www.blogger.com/atom/ns#' term='STUNT'/><title type='text'>NAT Traversal: Port Prediction (Part 2 of 2)</title><summary type='text'>So then how does port prediction work?Well it's fairly simple, but it involves some low level networking to do it.  All one has to do is connect to an external server, and have the server report back the IP address and port number that the communication came from.  For example, a website like this.  (Open this link in a new tab, and refresh it a couple times.  Depending on your router you may </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/3951282664727208079/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=3951282664727208079' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/3951282664727208079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/3951282664727208079'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2007/07/nat-traversal-port-prediction-part-2-of.html' title='NAT Traversal: Port Prediction (Part 2 of 2)'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-8954864823217467777</id><published>2007-07-25T19:06:00.001-05:00</published><updated>2009-01-10T17:35:58.527-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NAT'/><category scheme='http://www.blogger.com/atom/ns#' term='STUNT'/><title type='text'>NAT Traversal: Port Prediction (Part 1 of 2)</title><summary type='text'>In the last post we mentioned "port prediction" and hinted at it's importance to successfull NAT traversal.  In this post we'll outline what it is, why it's important, and how it works.First let's look at what happens when your average computer, sitting behind a home WiFi router, connects to a webserver over the Internet.  The connection originates with the computer (on local address A) on an </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/8954864823217467777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=8954864823217467777' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/8954864823217467777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/8954864823217467777'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2007/07/nat-traversal-port-prediction-part-1-of.html' title='NAT Traversal: Port Prediction (Part 1 of 2)'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-1346003752409046093</id><published>2007-07-25T02:47:00.001-05:00</published><updated>2009-01-10T17:33:24.411-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NAT'/><category scheme='http://www.blogger.com/atom/ns#' term='STUNT'/><title type='text'>NAT Traversal: Primer</title><summary type='text'>Earlier I introduced NAT traversal, and provided several links to better understand the problem, and the solution.  For those interested, I will now give a brief overview of how STUNT is implemented.The image below gives a nice diagram to the protocol (click for full size version):AE = Active Endpoint (think of this, for now, as the computer that initiates the connection)PE = Passive EndpointThe </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/1346003752409046093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=1346003752409046093' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/1346003752409046093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/1346003752409046093'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2007/07/nat-traversal-primer.html' title='NAT Traversal: Primer'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_lLQ1D-O52Bc/RqcVKotnScI/AAAAAAAAAAU/ClISuMccXQs/s72-c/stunt.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-1927600608287456761</id><published>2007-07-25T02:46:00.002-05:00</published><updated>2009-01-10T17:31:28.137-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NAT'/><category scheme='http://www.blogger.com/atom/ns#' term='STUNT'/><title type='text'>NAT Traversal: Introduction</title><summary type='text'>With the release of Mojo 2 users can connect directly to each other over the internet without any previous router configuration.  This may sound like a simple act, but it's not.  Allow me to explain:Most internet users today connect to the internet through a router.  Routers allow multiple computers to share the same internet connection.  And in order for multiple computers to share the same </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/1927600608287456761/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=1927600608287456761' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/1927600608287456761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/1927600608287456761'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2007/07/nat-traversal-introduction_25.html' title='NAT Traversal: Introduction'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-2852768931159248962</id><published>2007-07-16T02:31:00.001-05:00</published><updated>2009-05-04T17:21:45.367-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><title type='text'>Gzip compression/decompression</title><summary type='text'>A long time ago I grabbed some code from CocoaDev to allow zlib compression/decompression of NSData.  But a couple months ago I went looking for similar code to allow gzip compression/decompression.  At the time I didn't find any, and found myself wading through the zlib documentation and header files until I came up with a solution.  I've recently noticed that someone else on CocoaDev has also </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/2852768931159248962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=2852768931159248962' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/2852768931159248962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/2852768931159248962'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2007/07/gzip-compressiondecompression.html' title='Gzip compression/decompression'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-4472674564112796898</id><published>2007-07-11T17:36:00.001-05:00</published><updated>2008-02-15T13:28:51.181-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTTP'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='HTTP Server'/><title type='text'>HTTP Server - Password protection</title><summary type='text'>Earlier we introduced an open source embedded HTTP server.  The framework comes with some very simple sample code to run it.  This post will show how to extend the server to add suppport for password protection.Say we want to specifically protect the "private" directory.  We simply subclass the HTTPConnection class, and replace the "isPasswordProtected" and "passwordForUser" methods as follows:@</summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/4472674564112796898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=4472674564112796898' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/4472674564112796898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/4472674564112796898'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2007/07/http-server-password-protection.html' title='HTTP Server - Password protection'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-4153730002272135793</id><published>2007-07-11T15:33:00.001-05:00</published><updated>2008-02-15T13:29:33.587-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TLS'/><category scheme='http://www.blogger.com/atom/ns#' term='HTTP'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='HTTP Server'/><title type='text'>Open Source HTTP Embedded Server</title><summary type='text'>Sometimes Cocoa developers need an HTTP server in their code.  Perhaps they're writing a file-sharing app, or maybe they want to allow website links to communicate with built-in software similar to iTMS links.  Obviously the built-in apache server is not an option.  Thus the need for a small, lightweight, embedded HTTP server.  This is what we needed for Mojo and we found a few available </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/4153730002272135793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=4153730002272135793' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/4153730002272135793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/4153730002272135793'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2007/07/open-source-http-embedded-server.html' title='Open Source HTTP Embedded Server'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-5267866663905252702</id><published>2007-03-20T23:19:00.000-05:00</published><updated>2007-03-21T00:39:52.460-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TLS'/><category scheme='http://www.blogger.com/atom/ns#' term='AsyncSocket'/><title type='text'>Secure Connections &amp; Chunked Transfer Encoding</title><summary type='text'>I previously wrote about using the AsyncSocket class.  This class is especially helpful for performing custom networking, and I also detailed how it may be used for statefull downloading, or even HTTP pipelining.  This post will be an extension of the previous post.  If you haven't already read the previous post, you can do so here.First, we'll cover how to add support for secure connections </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/5267866663905252702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=5267866663905252702' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/5267866663905252702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/5267866663905252702'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2007/03/secure-connections-chunked-transfer.html' title='Secure Connections &amp; Chunked Transfer Encoding'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-922871701665006649</id><published>2007-02-25T07:53:00.000-06:00</published><updated>2007-07-25T04:42:58.639-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QTMovie'/><title type='text'>QTMovie Tips</title><summary type='text'>Thanks to the QTKit, playing songs in Cocoa has become rather trivial.  But there are a few methods that are less than trivial, and other methods that Apple simply left out.One common thing a developer may want to know: is the song playing?  You would imagine there would be a "isPlaying" method that returns a BOOL, but unfortunately there's not.  Instead, use the rate, and write your own method </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/922871701665006649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=922871701665006649' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/922871701665006649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/922871701665006649'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2007/02/qtmovie-tips.html' title='QTMovie Tips'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-2086225936977374427</id><published>2007-01-11T05:34:00.000-06:00</published><updated>2007-07-25T04:46:57.312-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mojo'/><category scheme='http://www.blogger.com/atom/ns#' term='iTunes'/><title type='text'>Mojo Public Beta Released</title><summary type='text'>The folks here at Deusty have been working on something pretty cool for quite some time now.  And we've been keeping it secret...until now.Have you ever been on a network with several computers that you would like to get music from, but have struggled in doing so?  You'd like to download the music to your computer straight from iTunes, but that isn't an option.  So you're forced to explore other </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/2086225936977374427/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=2086225936977374427' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/2086225936977374427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/2086225936977374427'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2007/01/maestro-public-beta-released.html' title='Mojo Public Beta Released'/><author><name>Deusty</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-5882420643429670182</id><published>2007-01-11T01:55:00.000-06:00</published><updated>2007-01-11T05:21:08.651-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSSL'/><title type='text'>Using OpenSSL in Cocoa</title><summary type='text'>There are a LOT of uses for encryption within applications today.  But security isn't exactly easy, and rolling your own security is generally a horrible idea.  (Like coming up with your own cipher scheme for example... probably not bulletproof)  So if you want encryption technologies, it's a good idea to use the industry standard OpenSSL.  This is extremely easy to do using the SSCrypto </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/5882420643429670182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=5882420643429670182' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/5882420643429670182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/5882420643429670182'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2007/01/using-openssl-in-cocoa.html' title='Using OpenSSL in Cocoa'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-2277662991276996231</id><published>2006-12-12T19:47:00.001-06:00</published><updated>2009-05-04T17:22:54.653-05:00</updated><title type='text'>alloc, init, and placeholders</title><summary type='text'>In my recent post, dictionaryWithData, somebody thought there was a memory leak in my code.  In this particular instance, he/she was incorrect, but the general idea was absolutely correct, and I thank them for their diligence.  This gave me the idea that I should make a quick post about placeholders.You use code like this all the time: [[MyObject alloc] init];But what does this do?  Obviously, </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/2277662991276996231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=2277662991276996231' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/2277662991276996231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/2277662991276996231'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2006/12/alloc-init-and-placeholders.html' title='alloc, init, and placeholders'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-5535924696629025062</id><published>2006-12-09T13:14:00.001-06:00</published><updated>2009-05-04T17:20:43.410-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTTP'/><category scheme='http://www.blogger.com/atom/ns#' term='AsyncSocket'/><title type='text'>Statefull Downloading</title><summary type='text'>If you want to download a single file from a remote server using Cocoa, and save it to disk, it's extremely easy using NSURLDownload.  There is also the NSURLConnection class that you can use.  However, what if you wanted to download multiple files from a single host?  The easiest way to do this is to simply use multiple NSURLDownloads. The only problem with this approach is that NSURLDownload </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/5535924696629025062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=5535924696629025062' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/5535924696629025062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/5535924696629025062'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2006/12/statefull-downloading.html' title='Statefull Downloading'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-2886426730077867484</id><published>2006-11-30T18:36:00.001-06:00</published><updated>2009-05-04T17:19:51.292-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MultiThreading'/><title type='text'>Multi Multi Threading</title><summary type='text'>A little bit ago Deusty wrote a post called "easy threading in cocoa" where he showed how easy it was to invoke a method on the primary thread.  But what if you wanted to invoke a method on a different thread, which isn't the main thread?  Well you can do it, but it's a little more complicated. The trick is to use Distributed Objects.Let's say that we're in thread 2, and we want to fork off a new</summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/2886426730077867484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=2886426730077867484' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/2886426730077867484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/2886426730077867484'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2006/11/multi-multi-threading.html' title='Multi Multi Threading'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-4119125697695715811</id><published>2006-11-26T04:26:00.001-06:00</published><updated>2009-05-04T17:23:40.207-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTTP'/><title type='text'>Sending HTTP GET and POST from Cocoa</title><summary type='text'>Ever wanted to send a form to a webpage from within Cocoa.  Here's how.GET forms are the easiest to do.  You just tack on your variables to the end of the URL, like this:http://www.nowhere.com/sendFormHere.php?key1=val1&amp;key2=val2Then you could use your standard NSURLDownload to fetch the file.A POST form is pretty much the same thing, except you need to specify that you are sending a POST, and </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/4119125697695715811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=4119125697695715811' title='29 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/4119125697695715811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/4119125697695715811'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2006/11/sending-http-get-and-post-from-cocoa.html' title='Sending HTTP GET and POST from Cocoa'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>29</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-4743417896955324549</id><published>2006-11-26T04:03:00.001-06:00</published><updated>2009-05-04T17:26:08.813-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MultiThreading'/><title type='text'>NSAppleScript is slow...</title><summary type='text'>Within the documentation for NSAppleScript is the following:You should access NSAppleScript only from the main thread.This would normally be OK, except for the fact that NSAppleScript can be slow.  It only provides an executeAndReturnError: method, which means that if you invoke this method, your application will stall until your AppleScript has completely finished.  So imagine running a script </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/4743417896955324549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=4743417896955324549' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/4743417896955324549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/4743417896955324549'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2006/11/nsapplescript-is-slow.html' title='NSAppleScript is slow...'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-7896930325017587863</id><published>2006-11-26T03:50:00.000-06:00</published><updated>2006-11-26T04:02:50.644-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NSThread'/><title type='text'>Easy threading in Cocoa</title><summary type='text'>Given it's relative ease of use, you have no excuse for not doing a little multi-threading in Cocoa when you get the chance.  Imagine a GUI application that performs some big task that generally bogs down the interface.  Simply perform the operation in a background thread.  Like this.-(void)awakeFromNib{    [NSThread detachNewThreadSelector:@selector(bgThread:) toTarget:self withObject:nil];}- (</summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/7896930325017587863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=7896930325017587863' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/7896930325017587863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/7896930325017587863'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2006/11/easy-threading-in-cocoa.html' title='Easy threading in Cocoa'/><author><name>Deusty</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2870232110877996964.post-6125127997753917426</id><published>2006-11-26T02:01:00.001-06:00</published><updated>2009-05-04T17:24:51.468-05:00</updated><title type='text'>dictionaryWithData</title><summary type='text'>I recently needed to create an NSDictionary from a plist file.  Normally this is extremely easy using simply[NSDictionary dictionaryWithContentsOfFile:@"/path/to/file"]However, the plist file was not on the disk, it was sent over the internet, and is sitting in an NSData instance.  So I wondered, do I really have to write out the data to disk, just so that I can turn around and read it back into </summary><link rel='replies' type='application/atom+xml' href='http://deusty.blogspot.com/feeds/6125127997753917426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2870232110877996964&amp;postID=6125127997753917426' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/6125127997753917426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2870232110877996964/posts/default/6125127997753917426'/><link rel='alternate' type='text/html' href='http://deusty.blogspot.com/2006/11/dictionarywithdata.html' title='dictionaryWithData'/><author><name>Robbie Hanson</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry></feed>
