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

<channel>
	<title>OSX Internals</title>
	<atom:link href="http://osxinternals.com.ar/feed/" rel="self" type="application/rss+xml" />
	<link>http://osxinternals.com.ar</link>
	<description>Just another OSX news aggregator...</description>
	<lastBuildDate>Mon, 08 Jun 2009 23:10:50 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>WWDC Live: First reactions from attendees post-keynote</title>
		<link>http://osxinternals.com.ar/2009/06/08/wwdc-live-first-reactions-from-attendees-post-keynote/</link>
		<comments>http://osxinternals.com.ar/2009/06/08/wwdc-live-first-reactions-from-attendees-post-keynote/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 23:10:41 +0000</pubDate>
		<dc:creator>freedomcoder</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[iTunes]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Safari]]></category>
		<category><![CDATA[WWDC]]></category>

		<guid isPermaLink="false">http://osxinternals.com.ar/?p=84</guid>
		<description><![CDATA[
Filed under: Analysis / Opinion, Video, WWDC
 
 It&#8217;s the first of what should be many videos coming to you straight from San Francisco: Two Apple developers, three opinions! At least that&#8217;s the way it seemed coming out of the keynote this afternoon at WWDC. We caught up with several attendees and asked them for [...]]]></description>
			<content:encoded><![CDATA[<p>
<p>Filed under: <a href="http://www.tuaw.com/category/analysisopinion/" rel="tag">Analysis / Opinion</a>, <a href="http://www.tuaw.com/category/video/" rel="tag">Video</a>, <a href="http://www.tuaw.com/category/wwdc/" rel="tag">WWDC</a></p>
<p><embed width="500" height="320" src="http://blip.tv/play/g7BsgYf5VoSUSw%2Em4v" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true"></embed> </p>
<p> It&#8217;s the first of what should be many videos coming to you straight from San Francisco: Two Apple developers, three opinions! At least that&#8217;s the way it seemed coming out of the keynote this afternoon at <a href="http://www.tuaw.com/tag/WWDC/">WWDC</a>. We caught up with several attendees and asked them for their thoughts. One of our favorites: &#8220;All I wanted was voice dialing, I&#8217;ve wanted it for the last two years&#8230; and then they do it, and it&#8217;s just so much better than you expect it to be.&#8221;</p>
<p><a href="http://blip.tv/file/2216398?filename=TUAW-KeynoteAfterthoughts921.m4v">iPhone-friendly m4v file is here.</a>
<p style="padding:5px;clear:both;"><a href="http://www.tuaw.com">TUAW</a><a href="http://www.tuaw.com/2009/06/08/wwdc-live-first-reactions-from-attendees-post-keynote/">WWDC Live: First reactions from attendees post-keynote</a> originally appeared on <a href="http://www.tuaw.com">The Unofficial Apple Weblog (TUAW)</a> on Mon, 08 Jun 2009 17:45:00 EST.  Please see our <a href="http://www.weblogsinc.com/feed-terms/">terms for use of feeds</a>.<br style="clear:both;"></p>
<h6 style="clear: both; padding: 8px 0 0 0; height: 2px; font-size: 1px; border: 0; margin: 0; padding: 0;"></h6>
<p><a href=http://blip.tv/file/2216398/>Read</a>&nbsp;|&nbsp;<a href="http://www.tuaw.com/2009/06/08/wwdc-live-first-reactions-from-attendees-post-keynote/" rel="bookmark" title="Permanent link to this entry">Permalink</a>&nbsp;|&nbsp;<a href="http://www.tuaw.com/forward/19061361/" title="Send this entry to a friend via email">Email this</a>&nbsp;|&nbsp;<a href="http://www.tuaw.com/2009/06/08/wwdc-live-first-reactions-from-attendees-post-keynote/#comments" title="View reader comments on this entry">Comments</a></p>
<p>(Via <a href="http://www.tuaw.com">The Unofficial Apple Weblog (TUAW)</a>.) Original Link: <a href="http://www.tuaw.com/2009/06/08/wwdc-live-first-reactions-from-attendees-post-keynote/#comments">WWDC Live: First reactions from attendees post-keynote</a></p>
<p>[ad] </p>
]]></content:encoded>
			<wfw:commentRss>http://osxinternals.com.ar/2009/06/08/wwdc-live-first-reactions-from-attendees-post-keynote/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apple&#8217;s WWDC Mystery Coding Project Revealed</title>
		<link>http://osxinternals.com.ar/2009/05/11/apples-wwdc-mystery-coding-project-revealed/</link>
		<comments>http://osxinternals.com.ar/2009/05/11/apples-wwdc-mystery-coding-project-revealed/#comments</comments>
		<pubDate>Mon, 11 May 2009 14:56:59 +0000</pubDate>
		<dc:creator>freedomcoder</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[core plot]]></category>
		<category><![CDATA[framework]]></category>

		<guid isPermaLink="false">http://osxinternals.com.ar/?p=82</guid>
		<description><![CDATA[&#8220;
Author: Drew McCormack
For those of you who have been wondering about what Apple&#8217;s mystery WWDC Science Coding Project will be, I am now able to spill the beans. I&#8217;m sure some have already connected the dots, but for those who haven&#8217;t figured it out yet, Apple&#8217;s WWDC code-a-thon is centered around the new open source [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;
<p><span class="inline inline-right"><img src="http://www.macresearch.org/files/images/CorePlot.preview.png" alt="" title=""  class="image image-preview" width="200" height="200" /></span><b>Author:</b> Drew McCormack</p>
<p>For those of you who have been wondering about what Apple&#8217;s mystery <a href="http://developer.apple.com/wwdc/sciencemedicine/">WWDC Science Coding Project</a> will be, I am now able to spill the beans. I&#8217;m sure some have already connected the dots, but for those who haven&#8217;t figured it out yet, Apple&#8217;s WWDC code-a-thon is centered around the new open source <a href="http://code.google.com/p/core-plot/">Core Plot framework</a>. </p>
<p>The Core Plot project began back in January after a <a href="http://feedproxy.google.com/creating-standard-mac-os-x-plotting-framework">post</a> I made here on MacResearch as a &#8216;call to arms&#8217; to build a decent open source plotting alternative for Apple systems. There are some options already available, such as <a href="http://developer.snowmintcs.com/frameworks/sm2dgraphview/">SM2DGraphView</a> and my own <a href="http://sourceforge.net/projects/narrative">Narrative framework</a>, but these are getting long in the tooth and are reasonably basic. There is also the very capable <a href="http://www.visualdatatools.com/phpBB2/viewtopic.php?t=140">DataGraph framework</a>, which is a commercial offering, but one drawback of all of these solutions is that they were developed before the iPhone, and do not support what has become a very important platform for developers.</p>
<p><a href="http://www.macresearch.org/apples-wwdc-mystery-coding-project-revealed">read more</a></p>
<p>&#8220;</p>
<p>(Via <a href="http://www.macresearch.org">MacResearch &#8211; Online Community and Resource for Mac OS X in Science</a>.) Original Link: <a href="http://www.macresearch.org/apples-wwdc-mystery-coding-project-revealed#comments">Apple&#8217;s WWDC Mystery Coding Project Revealed</a></p>
 <script type="text/javascript"><!--
google_ad_client = "pub-7949681675937032";
/* 468x60, created 3/6/09 */
google_ad_slot = "0874687580";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
]]></content:encoded>
			<wfw:commentRss>http://osxinternals.com.ar/2009/05/11/apples-wwdc-mystery-coding-project-revealed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Core Data and Plug-ins</title>
		<link>http://osxinternals.com.ar/2009/05/04/core-data-and-plug-ins/</link>
		<comments>http://osxinternals.com.ar/2009/05/04/core-data-and-plug-ins/#comments</comments>
		<pubDate>Mon, 04 May 2009 12:24:29 +0000</pubDate>
		<dc:creator>freedomcoder</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[How-to]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Core Data]]></category>
		<category><![CDATA[Plug-ins]]></category>
		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">http://osxinternals.com.ar/?p=80</guid>
		<description><![CDATA[&#8220;
Thanks to the ability to have configurations in a Core Data Managed Object Model and being able to save data to multiple Persistent Stores, it is possible to have a Core Data Model that is constructed from not only an internal model, but from the models of all the plug-ins that are loaded into the [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;
<p>Thanks to the ability to have configurations in a Core Data Managed Object Model and being able to save data to multiple Persistent Stores, it is possible to have a Core Data Model that is constructed from not only an internal model, but from the models of all the plug-ins that are loaded into the application.  </p>
<p>In this example we are going to build a basic application with the following requirements:</p>
<ul>
<li>A plug-in framework</li>
<li>Plug-ins can extend the managed object model of the application</li>
<li>Removal of a plug-in should not corrupt the persistent store.</li>
</ul>
<p><span id="more-512"></span></p>
<h2 id="the_concept">The Concept</h2>
<p>Core Data allows a NSManagedObjectModel to be constructed from multiple ‘sub’ models.  Therefore we can load up all of our plug-ins and ask them for their NSManagedObjectModel references.  Using those plus the models included with the application we can build a composite model.</p>
<p>However this would still save into a single file which would then become fragile if a plug-in disappeared.  Instead we will use Core Data Configurations.  By declaring a configuration for each model, we can specify a different file on disk for each configuration and thereby be able to split the persistent store by model on disk.  If a plug-in disappears, the configuration is not loaded and its corresponding persistent store is not loaded and therefore the integrity of the persistent store stays intact.</p>
<h2 id="the_plug_in_framework">The Plug-in Framework</h2>
<p>In this example we are not going to explore Plug-in design in too much depth.  That subject has been covered elsewhere.  Our plug-in for this design is going to use a framework to host the shared code and both the application and the bundles will link to it and import from it.</p>
<p>Our framework is going to consist of a header file that defines the protocol that the plug-ins must implement to be loaded.  The header is as follows:</p>
<div class="wp_syntax">
<div class="code">
<pre class="objc objc" style="font-family:monospace;"><span style="color: #a61390;">@protocol</span> ZSPlugin <span style="color: #002200;">&#038;</span>lt;NSObject<span style="color: #002200;">&#038;</span>gt;
'
<span style="color: #002200;">-</span> <span style="color: #002200;">(</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">)</span>name;
<span style="color: #002200;">-</span> <span style="color: #002200;">(</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">)</span>modelConfigurationName;
<span style="color: #002200;">-</span> <span style="color: #002200;">(</span><span style="color: #400080;">NSManagedObjectModel</span><span style="color: #002200;">*</span><span style="color: #002200;">)</span>managedObjectModel;
'
<span style="color: #a61390;">@end</span></pre>
</div>
</div>
<h2 id="the_example_plug_in">The Example Plug-in</h2>
<p>To test this we need to include at least one plug-in.  That plug-in will consist of a principal class along with a data model.  The plug-in does not need to stand up a Core Data stack because its model will be included in the primary application’s Core Data stack.  Therefore we just need to implement the methods in the protocol.</p>
<h3 id="_name">-name</h3>
<p>The name method in this example just returns a string.</p>
<div class="wp_syntax">
<div class="code">
<pre class="objc objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">(</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">)</span>name;
<span style="color: #002200;">{</span>
  <span style="color: #a61390;">return</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">'Example Plugin v1.0'</span>;
<span style="color: #002200;">}</span></pre>
</div>
</div>
<h3 id="_modelconfigurationname">-modelConfigurationName</h3>
<p>Like the name method above, the <code>-modelConfigurationName</code> method only returns a string.  In a more robust solution we would check in the plug-in manager to confirm that this name is unique and does not conflict with the configuration of the base application.</p>
<div class="wp_syntax">
<div class="code">
<pre class="objc objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">(</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">)</span>modelConfigurationName;
<span style="color: #002200;">{</span>
  <span style="color: #a61390;">return</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">'ExamplePlugin'</span>;
<span style="color: #002200;">}</span></pre>
</div>
</div>
<h3 id="_managedobjectmodel">-managedObjectModel</h3>
<p>The final method that we declare in the protocol returns the NSManagedObjectModel for the plug-in.  This method does a simple load from the plug-ins bundle.</p>
<div class="wp_syntax">
<div class="code">
<pre class="objc objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">(</span><span style="color: #400080;">NSManagedObjectModel</span><span style="color: #002200;">*</span><span style="color: #002200;">)</span>managedObjectModel;
<span style="color: #002200;">{</span>
  <span style="color: #a61390;">if</span> <span style="color: #002200;">(</span>managedObjectModel<span style="color: #002200;">)</span> <span style="color: #a61390;">return</span> managedObjectModel;
'
  <span style="color: #400080;">NSBundle</span> <span style="color: #002200;">*</span>myBundle <span style="color: #002200;">=</span> <span style="color: #002200;">[</span><span style="color: #400080;">NSBundle</span> bundleForClass<span style="color: #002200;">:</span><span style="color: #002200;">[</span>self class<span style="color: #002200;">]</span><span style="color: #002200;">]</span>;
  <span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span>bundles <span style="color: #002200;">=</span> <span style="color: #002200;">[</span><span style="color: #400080;">NSArray</span> arrayWithObject<span style="color: #002200;">:</span>myBundle<span style="color: #002200;">]</span>;
  managedObjectModel <span style="color: #002200;">=</span> <span style="color: #002200;">[</span><span style="color: #002200;">[</span><span style="color: #400080;">NSManagedObjectModel</span> mergedModelFromBundles<span style="color: #002200;">:</span>bundles<span style="color: #002200;">]</span> retain<span style="color: #002200;">]</span>;
  <span style="color: #a61390;">return</span> managedObjectModel;
<span style="color: #002200;">}</span></pre>
</div>
</div>
<p>The one interesting part of this code is that we need to get a reference to the NSBundle for the plug-in from its principal class.  This is because the call [NSBundle mainBundle] will return the application’s bundle instead.  </p>
<h2 id="the_plug_in_manager">The Plug-in Manager</h2>
<p>The plug-in manager loads all of the available plug-ins on launch.  In this example we do not allow dynamic plug-in loading.</p>
<div class="wp_syntax">
<div class="code">
<pre class="objc objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &lt;ZSPlugin/ZSPlugin.h&gt;</span>
'
<span style="color: #a61390;">@interface</span> ZSPluginManager <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span>
<span style="color: #002200;">{</span>
  <span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span>loadedPlugins;
<span style="color: #002200;">}</span>
'
<span style="color: #a61390;">@property</span> <span style="color: #002200;">(</span>retain<span style="color: #002200;">)</span> <span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span>loadedPlugins;
'
<span style="color: #002200;">+</span> <span style="color: #002200;">(</span><span style="color: #a61390;">id</span><span style="color: #002200;">)</span>shared;
'
<span style="color: #002200;">-</span> <span style="color: #002200;">(</span><span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span><span style="color: #002200;">)</span>pluginModels;
<span style="color: #002200;">-</span> <span style="color: #002200;">(</span><span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span><span style="color: #002200;">)</span>modelConfigurations;
<span style="color: #002200;">-</span> <span style="color: #002200;">(</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">)</span>applicationSupportFolder;
'
<span style="color: #a61390;">@end</span></pre>
</div>
</div>
<h3 id="_init"><code>-init</code></h3>
<p>The plug-in manager is a singleton that initializes itself and loads all of the existing plug-ins upon first request.</p>
<div class="wp_syntax">
<div class="code">
<pre class="objc objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">(</span><span style="color: #a61390;">id</span><span style="color: #002200;">)</span>init
<span style="color: #002200;">{</span>
  <span style="color: #a61390;">if</span> <span style="color: #002200;">(</span><span style="color: #002200;">!</span><span style="color: #002200;">(</span>self <span style="color: #002200;">=</span> <span style="color: #002200;">[</span>super init<span style="color: #002200;">]</span><span style="color: #002200;">)</span><span style="color: #002200;">)</span> <span style="color: #a61390;">return</span> <span style="color: #a61390;">nil</span>;
'
  <span style="color: #11740a; font-style: italic;">//Find the plugins</span>
  <span style="color: #400080;">NSFileManager</span> <span style="color: #002200;">*</span>fileManager <span style="color: #002200;">=</span> <span style="color: #002200;">[</span><span style="color: #400080;">NSFileManager</span> defaultManager<span style="color: #002200;">]</span>;
  <span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span>plugins <span style="color: #002200;">=</span> <span style="color: #002200;">[</span>fileManager directoryContentsAtPath<span style="color: #002200;">:</span><span style="color: #002200;">[</span>self applicationSupportFolder<span style="color: #002200;">]</span><span style="color: #002200;">]</span>;
'
  <span style="color: #a61390;">if</span> <span style="color: #002200;">(</span><span style="color: #002200;">!</span><span style="color: #002200;">[</span>plugins count<span style="color: #002200;">]</span><span style="color: #002200;">)</span> <span style="color: #002200;">{</span>
    NSLog<span style="color: #002200;">(</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">'%@:%s No plugins found'</span>, <span style="color: #002200;">[</span>self class<span style="color: #002200;">]</span>, _cmd<span style="color: #002200;">)</span>;
    <span style="color: #a61390;">return</span> self;
  <span style="color: #002200;">}</span>
'
  <span style="color: #11740a; font-style: italic;">//Load all of the plugins</span>
  <span style="color: #400080;">NSMutableArray</span> <span style="color: #002200;">*</span>loadArray <span style="color: #002200;">=</span> <span style="color: #002200;">[</span><span style="color: #400080;">NSMutableArray</span> array<span style="color: #002200;">]</span>;
  <span style="color: #a61390;">for</span> <span style="color: #002200;">(</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>pluginPath <span style="color: #a61390;">in</span> plugins<span style="color: #002200;">)</span> <span style="color: #002200;">{</span>
    <span style="color: #a61390;">if</span> <span style="color: #002200;">(</span><span style="color: #002200;">!</span><span style="color: #002200;">[</span>pluginPath hasSuffix<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">'.bundle'</span><span style="color: #002200;">]</span><span style="color: #002200;">)</span> <span style="color: #a61390;">continue</span>;
    <span style="color: #400080;">NSBundle</span> <span style="color: #002200;">*</span>pluginBundle <span style="color: #002200;">=</span> <span style="color: #002200;">[</span><span style="color: #400080;">NSBundle</span> bundleWithPath<span style="color: #002200;">:</span>pluginPath<span style="color: #002200;">]</span>;
    <span style="color: #a61390;">Class</span> principalClass <span style="color: #002200;">=</span> <span style="color: #002200;">[</span>pluginBundle principalClass<span style="color: #002200;">]</span>;
    <span style="color: #a61390;">if</span> <span style="color: #002200;">(</span><span style="color: #002200;">!</span><span style="color: #002200;">[</span>principalClass conformsToProtocol<span style="color: #002200;">:</span><span style="color: #a61390;">@protocol</span><span style="color: #002200;">(</span>ZSPlugin<span style="color: #002200;">)</span><span style="color: #002200;">]</span><span style="color: #002200;">)</span> <span style="color: #002200;">{</span>
      NSLog<span style="color: #002200;">(</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">'Invalid plug-in, does not conform to the ZSPlugin Protocol: %@'</span>, pluginPath<span style="color: #002200;">)</span>;
      <span style="color: #a61390;">continue</span>;
    <span style="color: #002200;">}</span>
    id<span style="color: #002200;">&#038;</span>lt;ZSPlugin<span style="color: #002200;">&#038;</span>gt; plugin <span style="color: #002200;">=</span> <span style="color: #002200;">[</span><span style="color: #002200;">[</span>principalClass alloc<span style="color: #002200;">]</span> init<span style="color: #002200;">]</span>;
    <span style="color: #002200;">[</span>loadArray addObject<span style="color: #002200;">:</span>plugin<span style="color: #002200;">]</span>;
    NSLog<span style="color: #002200;">(</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">'Plug-in Loaded: %@'</span>, <span style="color: #002200;">[</span>plugin name<span style="color: #002200;">]</span><span style="color: #002200;">)</span>;
    <span style="color: #002200;">[</span>plugin release<span style="color: #002200;">]</span>, plugin <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;
  <span style="color: #002200;">}</span>
  <span style="color: #002200;">[</span>self setLoadedPlugins<span style="color: #002200;">:</span>loadArray<span style="color: #002200;">]</span>;
'
  <span style="color: #a61390;">return</span> self;
<span style="color: #002200;">}</span></pre>
</div>
</div>
<p>In the <code>-init</code> method we first find all of the files in the Application Support directory.  If there are no files then we quickly return self.  If there are files then we start looping over them.  On each iteration we check to see if the file is a plug-in and if it is not we skip to the next loop.  If it is then we look-up its principal class and confirm that it conforms to the ZSPlugin protocol.  If it does not we warn the developer and skip to the next loop.</p>
<p>Once we pass all of the integrity checks we then call alloc and init on the plug-in and add it to the array of loaded plug-ins.</p>
<h3 id="_pluginmodels"><code>-pluginModels</code></h3>
<p>To help the main application initialize we have a couple of helper methods in the plug-in manager.  The first is a method that returns all of the plug-in models.</p>
<div class="wp_syntax">
<div class="code">
<pre class="objc objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">(</span><span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span><span style="color: #002200;">)</span>pluginModels;
<span style="color: #002200;">{</span>
  <span style="color: #400080;">NSMutableArray</span> <span style="color: #002200;">*</span>array <span style="color: #002200;">=</span> <span style="color: #002200;">[</span><span style="color: #400080;">NSMutableArray</span> array<span style="color: #002200;">]</span>;
  <span style="color: #a61390;">for</span> <span style="color: #002200;">(</span>id<span style="color: #002200;">&#038;</span>lt;ZSPlugin<span style="color: #002200;">&#038;</span>gt; plugin <span style="color: #a61390;">in</span> <span style="color: #002200;">[</span>self loadedPlugins<span style="color: #002200;">]</span><span style="color: #002200;">)</span> <span style="color: #002200;">{</span>
    <span style="color: #002200;">[</span>array addObject<span style="color: #002200;">:</span><span style="color: #002200;">[</span>plugin managedObjectModel<span style="color: #002200;">]</span><span style="color: #002200;">]</span>;
  <span style="color: #002200;">}</span>
  <span style="color: #a61390;">return</span> array;
<span style="color: #002200;">}</span></pre>
</div>
</div>
<h3 id="_modelconfigurations"><code>-modelConfigurations</code></h3>
<p>The second helper method returns an <code>NSArray</code> of the configuration names used by the plug-ins.  These names will be used both to load the configurations and to decide on the persistent store’s file name.</p>
<div class="wp_syntax">
<div class="code">
<pre class="objc objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">(</span><span style="color: #400080;">NSArray</span><span style="color: #002200;">*</span><span style="color: #002200;">)</span>modelConfigurations;
<span style="color: #002200;">{</span>
  <span style="color: #400080;">NSMutableArray</span> <span style="color: #002200;">*</span>array <span style="color: #002200;">=</span> <span style="color: #002200;">[</span><span style="color: #400080;">NSMutableArray</span> array<span style="color: #002200;">]</span>;
  <span style="color: #a61390;">for</span> <span style="color: #002200;">(</span>id<span style="color: #002200;">&#038;</span>lt;ZSPlugin<span style="color: #002200;">&#038;</span>gt; plugin <span style="color: #a61390;">in</span> <span style="color: #002200;">[</span>self loadedPlugins<span style="color: #002200;">]</span><span style="color: #002200;">)</span> <span style="color: #002200;">{</span>
    <span style="color: #002200;">[</span>array addObject<span style="color: #002200;">:</span><span style="color: #002200;">[</span>plugin modelConfigurationName<span style="color: #002200;">]</span><span style="color: #002200;">]</span>;
  <span style="color: #002200;">}</span>
  <span style="color: #a61390;">return</span> array;
<span style="color: #002200;">}</span></pre>
</div>
</div>
<h2 id="the_primary_application">The Primary Application</h2>
<p>With our quick walkthrough of the plug-in structure complete we need to review the changes to the application itself.  All of the changes are limited to the Core Data methods.</p>
<h3 id="_managedobjectmodel"><code>-managedObjectModel</code></h3>
<p>The first change we need to make is how we load the <code>NSManagedObjectModel</code>.  Normally we would just call <code>[NSManagedObjectModel mergedModelFromBundles:nil]</code> and be done.  However we want to load not only the models within the application itself but also merge with all of the models in the plug-ins.  Therefore a couple of extra steps are required.</p>
<div class="wp_syntax">
<div class="code">
<pre class="objc objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">(</span><span style="color: #400080;">NSManagedObjectModel</span><span style="color: #002200;">*</span><span style="color: #002200;">)</span>managedObjectModel
<span style="color: #002200;">{</span>
  <span style="color: #a61390;">if</span> <span style="color: #002200;">(</span>managedObjectModel<span style="color: #002200;">)</span> <span style="color: #a61390;">return</span> managedObjectModel;
'
  <span style="color: #400080;">NSMutableArray</span> <span style="color: #002200;">*</span>models <span style="color: #002200;">=</span> <span style="color: #002200;">[</span><span style="color: #400080;">NSMutableArray</span> array<span style="color: #002200;">]</span>;
  <span style="color: #002200;">[</span>models addObject<span style="color: #002200;">:</span><span style="color: #002200;">[</span><span style="color: #400080;">NSManagedObjectModel</span> mergedModelFromBundles<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">]</span><span style="color: #002200;">]</span>;
  <span style="color: #002200;">[</span>models addObjectsFromArray<span style="color: #002200;">:</span><span style="color: #002200;">[</span><span style="color: #002200;">[</span>ZSPluginManager shared<span style="color: #002200;">]</span> pluginModels<span style="color: #002200;">]</span><span style="color: #002200;">]</span>;
'
  managedObjectModel <span style="color: #002200;">=</span> <span style="color: #002200;">[</span><span style="color: #002200;">[</span><span style="color: #400080;">NSManagedObjectModel</span> modelByMergingModels<span style="color: #002200;">:</span>models<span style="color: #002200;">]</span> retain<span style="color: #002200;">]</span>;
  <span style="color: #a61390;">return</span> managedObjectModel;
<span style="color: #002200;">}</span></pre>
</div>
</div>
<p>In this method we start with the <code>NSManagedObjectModel</code> from the Application itself and add it to a <code>NSMutableArray</code>.  We then request an array of all the models from the plug-ins via the <code>ZSPluginManager</code> and add those models to the <code>NSMutableArray</code>.  Once we have all of the models together we call <code>+modelByMergingModels:</code> and merge all of the models into one super model.  We retain that model and return it to the caller.</p>
<h3 id="_persistentstorecoordinator"><code>-persistentStoreCoordinator</code></h3>
<p>The second and last change we need to make to the Core Data stack is the way that we handle the <code>NSPersistentStoreCoordinator</code>.  </p>
<div class="wp_syntax">
<div class="code">
<pre class="objc objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">(</span><span style="color: #400080;">NSPersistentStoreCoordinator</span><span style="color: #002200;">*</span><span style="color: #002200;">)</span>persistentStoreCoordinator
<span style="color: #002200;">{</span>
  <span style="color: #a61390;">if</span> <span style="color: #002200;">(</span>persistentStoreCoordinator<span style="color: #002200;">)</span> <span style="color: #a61390;">return</span> persistentStoreCoordinator;
'
  <span style="color: #400080;">NSFileManager</span> <span style="color: #002200;">*</span>fileManager;
  <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>applicationSupportFolder <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;
  <span style="color: #400080;">NSURL</span> <span style="color: #002200;">*</span>url <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;
  <span style="color: #400080;">NSError</span> <span style="color: #002200;">*</span>error <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;
  <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>filePath <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;
'
  fileManager <span style="color: #002200;">=</span> <span style="color: #002200;">[</span><span style="color: #400080;">NSFileManager</span> defaultManager<span style="color: #002200;">]</span>;
  applicationSupportFolder <span style="color: #002200;">=</span> <span style="color: #002200;">[</span><span style="color: #002200;">[</span>ZSPluginManager shared<span style="color: #002200;">]</span> applicationSupportFolder<span style="color: #002200;">]</span>;
  <span style="color: #a61390;">if</span> <span style="color: #002200;">(</span><span style="color: #002200;">!</span><span style="color: #002200;">[</span>fileManager fileExistsAtPath<span style="color: #002200;">:</span>applicationSupportFolder isDirectory<span style="color: #002200;">:</span><span style="color: #a61390;">NULL</span><span style="color: #002200;">]</span> <span style="color: #002200;">)</span> <span style="color: #002200;">{</span>
    <span style="color: #a61390;">if</span> <span style="color: #002200;">(</span><span style="color: #002200;">!</span><span style="color: #002200;">[</span>fileManager createDirectoryAtPath<span style="color: #002200;">:</span>applicationSupportFolder attributes<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">]</span><span style="color: #002200;">)</span> <span style="color: #002200;">{</span>
      NSLog<span style="color: #002200;">(</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">'%@:%s Failed to create app support directory'</span>, <span style="color: #002200;">[</span>self class<span style="color: #002200;">]</span>, _cmd<span style="color: #002200;">)</span>;
      <span style="color: #a61390;">return</span> <span style="color: #a61390;">nil</span>;
    <span style="color: #002200;">}</span>
  <span style="color: #002200;">}</span>
'
  <span style="color: #400080;">NSManagedObjectModel</span> <span style="color: #002200;">*</span>mom <span style="color: #002200;">=</span> <span style="color: #002200;">[</span>self managedObjectModel<span style="color: #002200;">]</span>;
  <span style="color: #a61390;">if</span> <span style="color: #002200;">(</span><span style="color: #002200;">!</span>mom<span style="color: #002200;">)</span> <span style="color: #a61390;">return</span> <span style="color: #a61390;">nil</span>;
  <span style="color: #400080;">NSPersistentStoreCoordinator</span> <span style="color: #002200;">*</span>psc <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;
  psc <span style="color: #002200;">=</span> <span style="color: #002200;">[</span><span style="color: #002200;">[</span><span style="color: #400080;">NSPersistentStoreCoordinator</span> alloc<span style="color: #002200;">]</span> initWithManagedObjectModel<span style="color: #002200;">:</span>mom<span style="color: #002200;">]</span>;
'
  <span style="color: #400080;">NSMutableArray</span> <span style="color: #002200;">*</span>configArray <span style="color: #002200;">=</span> <span style="color: #002200;">[</span><span style="color: #400080;">NSMutableArray</span> array<span style="color: #002200;">]</span>;
  <span style="color: #002200;">[</span>configArray addObject<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">'Core'</span><span style="color: #002200;">]</span>;
  <span style="color: #002200;">[</span>configArray addObjectsFromArray<span style="color: #002200;">:</span><span style="color: #002200;">[</span><span style="color: #002200;">[</span>ZSPluginManager shared<span style="color: #002200;">]</span> modelConfigurations<span style="color: #002200;">]</span><span style="color: #002200;">]</span>;
'
  <span style="color: #a61390;">for</span> <span style="color: #002200;">(</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span>configName <span style="color: #a61390;">in</span> <span style="color: #002200;">[</span><span style="color: #002200;">[</span>ZSPluginManager shared<span style="color: #002200;">]</span> loadedPlugins<span style="color: #002200;">]</span><span style="color: #002200;">)</span> <span style="color: #002200;">{</span>
    filePath <span style="color: #002200;">=</span> <span style="color: #002200;">[</span>configName stringByAppendingPathExtension<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">'sqlite'</span><span style="color: #002200;">]</span>;
    filePath <span style="color: #002200;">=</span> <span style="color: #002200;">[</span>applicationSupportFolder stringByAppendingPathComponent<span style="color: #002200;">:</span>filePath<span style="color: #002200;">]</span>;
    url <span style="color: #002200;">=</span> <span style="color: #002200;">[</span><span style="color: #400080;">NSURL</span> fileURLWithPath<span style="color: #002200;">:</span>filePath<span style="color: #002200;">]</span>;
    <span style="color: #a61390;">if</span> <span style="color: #002200;">(</span><span style="color: #002200;">!</span><span style="color: #002200;">[</span>psc addPersistentStoreWithType<span style="color: #002200;">:</span>NSSQLiteStoreType
                           configuration<span style="color: #002200;">:</span>configName
                                     URL<span style="color: #002200;">:</span>url
                                 options<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span>
                                   error<span style="color: #002200;">:&#038;</span>amp;error<span style="color: #002200;">]</span><span style="color: #002200;">)</span> <span style="color: #002200;">{</span>
'
      <span style="color: #002200;">[</span><span style="color: #002200;">[</span><span style="color: #400080;">NSApplication</span> sharedApplication<span style="color: #002200;">]</span> presentError<span style="color: #002200;">:</span>error<span style="color: #002200;">]</span>;
      <span style="color: #002200;">[</span>psc release<span style="color: #002200;">]</span>, psc <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;
      <span style="color: #a61390;">return</span> <span style="color: #a61390;">nil</span>;
    <span style="color: #002200;">}</span>
  <span style="color: #002200;">}</span>
'
  persistentStoreCoordinator <span style="color: #002200;">=</span> psc;
  <span style="color: #a61390;">return</span> persistentStoreCoordinator;
<span style="color: #002200;">}</span></pre>
</div>
</div>
<p>The first half of the method is almost straight out of the template.  However once we have the application support directory created and the raw NSPersistentStoreCoordinator initialized it is time to deviate.</p>
<p>The first then we do is construct a <code>NSMutableArray</code> and add our application model’s configuration name to it.  In this example I called it ‘Core’.  With the array initialized we then grab all of the configuration names from the plug-ins via the <code>ZSPluginManager</code> and add them to the array.</p>
<p>With the array fully populated it is time to iterate over it.  Within each iteration we do the following:</p>
<ol>
<li>
<p>We construct a file path for the configuration using the application support folder and the configuration name.  We add a ‘sqlite’ extension to it although in a production system you should use an application specific extension.</p>
</li>
<li>
<p>We then add the newly constructed file path to the <code>NSPersistentStoreCoordinator</code> re-using the configuration name and checking for failure.  If we fail we present an error and abort.</p>
</li>
</ol>
<h2 id="conclusion">Conclusion</h2>
<p>That is all there is to it!  Core Data takes over from there and automatically saves the correct objects into the correct store files for us.  If a plug-in goes away we don’t load its model and we don’t reference it’s store so integrity remains.</p>
<p>In the included example application I have also built a UI which lists the entities that are available in the model.  If you run it straight from the zip file you will see the following UI:</p>
<p><img src="http://img.skitch.com/20090504-xp4ck1t9w42kw2cj5t6xsjus25.png"/></p>
<p>However, if after building the application, you copy the example plugin into your ~/Library/Application Support/CDPlugins directory and run the application again you will see the following.</p>
<p><img src="http://img.skitch.com/20090504-g17d82yxc2sf9k7mia448cx7rn.png"/></p>
<p>Which shows that not only is the plug-in loaded but that it’s entity (Widget) has been included in the Core Data stack.  This can even be extended to create widgets and then remove the plug-in to confirm that integrity is maintained.</p>
<p><a href='http://zds.s3.amazonaws.com/CDPlugins.zip'><img src="http://www.cimgf.com/wp-content/uploads/2008/03/xcode.png" alt="xcode.png" border="0" width="64"/><br />Layer Rotate Demo Project</a>
</p>
<p>&#8220;</p>
<p>(Via <a href="http://www.cimgf.com">Cocoa Is My Girlfriend</a>.) Original Link: <a href="http://www.cimgf.com/2009/05/03/core-data-and-plug-ins/#comments">Core Data and Plug-ins</a></p>
 <script type="text/javascript"><!--
google_ad_client = "pub-7949681675937032";
/* 468x60, created 3/6/09 */
google_ad_slot = "0874687580";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
]]></content:encoded>
			<wfw:commentRss>http://osxinternals.com.ar/2009/05/04/core-data-and-plug-ins/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CocoaHeads Thu Apr 23: Wil Shipley on iPhone</title>
		<link>http://osxinternals.com.ar/2009/04/21/cocoaheads-thu-apr-23-wil-shipley-on-iphone/</link>
		<comments>http://osxinternals.com.ar/2009/04/21/cocoaheads-thu-apr-23-wil-shipley-on-iphone/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 13:43:06 +0000</pubDate>
		<dc:creator>freedomcoder</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://osxinternals.com.ar/?p=78</guid>
		<description><![CDATA[&#8220;The next CocoaHeads Silicon Valley meeting is this Thursday, April 23 at 7pm. Our featured speaker is Wil Shipley of Delicious Monster, who will share what he&#8217;s learned while writing his first iPhone app. I&#8217;m told this is the first time the app will be shown to the general public, so you may get to [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;The next CocoaHeads Silicon Valley meeting is this Thursday, April 23 at 7pm. Our featured speaker is <a href="http://www.wilshipley.com/blog/">Wil Shipley</a> of <a href="http://www.delicious-monster.com/">Delicious Monster</a>, who will share what he&#8217;s learned while writing his first iPhone app. I&#8217;m told this is the first time the app will be shown to the general public, so you may get to see something special&#8230;&#8221;</p>
<p>(Via <a href="http://theocacao.com/">Theobroma Cacao</a>.) Original Link: <a href="http://theocacao.com/document.page/604">CocoaHeads Thu Apr 23: Wil Shipley on iPhone</a></p>
 <script type="text/javascript"><!--
google_ad_client = "pub-7949681675937032";
/* 468x60, created 3/6/09 */
google_ad_slot = "0874687580";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
]]></content:encoded>
			<wfw:commentRss>http://osxinternals.com.ar/2009/04/21/cocoaheads-thu-apr-23-wil-shipley-on-iphone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Protocols for Life Scientists Available on the iPhone App Store</title>
		<link>http://osxinternals.com.ar/2009/04/13/protocols-for-life-scientists-available-on-the-iphone-app-store/</link>
		<comments>http://osxinternals.com.ar/2009/04/13/protocols-for-life-scientists-available-on-the-iphone-app-store/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 01:49:21 +0000</pubDate>
		<dc:creator>freedomcoder</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Science]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://osxinternals.com.ar/?p=76</guid>
		<description><![CDATA[Protocols for Life Scientists Available on the iPhone App Store: &#8220;
Life Scientists can now access protocols at the bench on their iPhone™ or iPod® Touch using the Promega Protocols and Applications Guide (P&#038;A Guide).
read more
&#8220;
(Via MacResearch &#8211; Online Community and Resource for Mac OS X in Science.)
 



]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.macresearch.org/protocols-life-scientists-available-iphone-app-store#comments">Protocols for Life Scientists Available on the iPhone App Store</a>: &#8220;
<p>Life Scientists can now access protocols at the bench on their iPhone™ or iPod® Touch using the Promega Protocols and Applications Guide (P&#038;A Guide).</p>
<p><a href="http://www.macresearch.org/protocols-life-scientists-available-iphone-app-store">read more</a></p>
<p>&#8220;</p>
<p>(Via <a href="http://www.macresearch.org">MacResearch &#8211; Online Community and Resource for Mac OS X in Science</a>.)</p>
 <script type="text/javascript"><!--
google_ad_client = "pub-7949681675937032";
/* 468x60, created 3/6/09 */
google_ad_slot = "0874687580";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
]]></content:encoded>
			<wfw:commentRss>http://osxinternals.com.ar/2009/04/13/protocols-for-life-scientists-available-on-the-iphone-app-store/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unofficial Preview of Google Chrome for OS X Available For Download [Chrome]</title>
		<link>http://osxinternals.com.ar/2009/04/07/unofficial-preview-of-google-chrome-for-os-x-available-for-download-chrome/</link>
		<comments>http://osxinternals.com.ar/2009/04/07/unofficial-preview-of-google-chrome-for-os-x-available-for-download-chrome/#comments</comments>
		<pubDate>Tue, 07 Apr 2009 15:11:56 +0000</pubDate>
		<dc:creator>freedomcoder</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Browser]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://osxinternals.com.ar/?p=74</guid>
		<description><![CDATA[Without plugin support (read: Flash), a preference screen, or any semblance of stability, this super-early, unsanctioned build of Chrome for OS X is by no means ready for daily use. It&#8217;s good to see that it works, though&#8212;and now we know that the planned fall beta is at least plausible. [Manu-J via TUAW]
 



  [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://cache.gawker.com/assets/images/gizmodo/2009/04/chromeosx.jpg" width="807" height="504" style="display:block;float:none;" />Without plugin support (read: Flash), a preference screen, or any semblance of stability, <a href="http://www.tuaw.com/2009/04/07/google-chrome-run-natively-most-of-it-anyway/">this super-early, unsanctioned build</a> of Chrome for OS X is by no means ready for daily use. It&#8217;s good to see that it <em>works</em>, though&mdash;and now we know that the planned <a href="http://i.gizmodo.com/5190213/google-chrome-for-mac-public-beta-probably-coming-by-fall">fall beta</a> is at least plausible. [<a href="http://www.manu-j.com/blog/google-chrome-on-mac-os-x-first-impressions/226/">Manu-J</a> via <a href="http://www.tuaw.com/2009/04/07/google-chrome-run-natively-most-of-it-anyway/">TUAW</a>]</p>
<p> <br clear="both" style="clear: both;"/><br />
<br clear="both" style="clear: both;"/><br />
<a href="http://www.pheedo.com/click.phdo?s=cbccaa409079905be71d128fd13041c3&#038;p=1"><img alt="" style="border: 0;" border="0" src="http://www.pheedo.com/img.phdo?s=cbccaa409079905be71d128fd13041c3&#038;p=1"/></a>
<div class="feedflare">
<a href="http://feeds.gawker.com/~ff/gizmodo/full?a=gaoYuO_tMro:3dywtSkxsc4:H0mrP-F8Qgo"><img src="http://feeds2.feedburner.com/~ff/gizmodo/full?d=H0mrP-F8Qgo" border="0"></img></a> <a href="http://feeds.gawker.com/~ff/gizmodo/full?a=gaoYuO_tMro:3dywtSkxsc4:yIl2AUoC8zA"><img src="http://feeds2.feedburner.com/~ff/gizmodo/full?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.gawker.com/~ff/gizmodo/full?a=gaoYuO_tMro:3dywtSkxsc4:D7DqB2pKExk"><img src="http://feeds2.feedburner.com/~ff/gizmodo/full?i=gaoYuO_tMro:3dywtSkxsc4:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.gawker.com/~ff/gizmodo/full?a=gaoYuO_tMro:3dywtSkxsc4:V_sGLiPBpWU"><img src="http://feeds2.feedburner.com/~ff/gizmodo/full?i=gaoYuO_tMro:3dywtSkxsc4:V_sGLiPBpWU" border="0"></img></a>
</div>
<p><img src="http://feeds2.feedburner.com/~r/gizmodo/full/~4/gaoYuO_tMro" height="1" width="1"/></p>
<p>(Via <a href="http://gizmodo.com">Gizmodo</a>.) Original Link: <a href="http://feeds.gawker.com/~r/gizmodo/full/~3/gaoYuO_tMro/unofficial-preview-of-google-chrome-for-os-x-available-for-download">Unofficial Preview of Google Chrome for OS X Available For Download [Chrome]</a></p>
 <script type="text/javascript"><!--
google_ad_client = "pub-7949681675937032";
/* 468x60, created 3/6/09 */
google_ad_slot = "0874687580";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
]]></content:encoded>
			<wfw:commentRss>http://osxinternals.com.ar/2009/04/07/unofficial-preview-of-google-chrome-for-os-x-available-for-download-chrome/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Learn How to Build iPhone Apps from Stanford University [IPhone Apps]</title>
		<link>http://osxinternals.com.ar/2009/04/02/learn-how-to-build-iphone-apps-from-stanford-university-iphone-apps/</link>
		<comments>http://osxinternals.com.ar/2009/04/02/learn-how-to-build-iphone-apps-from-stanford-university-iphone-apps/#comments</comments>
		<pubDate>Fri, 03 Apr 2009 00:51:01 +0000</pubDate>
		<dc:creator>freedomcoder</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[How-to]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[iTunes]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[learning]]></category>
		<category><![CDATA[Stanford]]></category>

		<guid isPermaLink="false">http://osxinternals.com.ar/?p=70</guid>
		<description><![CDATA[Learn How to Build iPhone Apps from Stanford University [IPhone Apps]: &#8220;
If you&#8217;ve ever hand an idea for an iPhone application but you&#8217;ve never known how to begin creating it, Stanford will be offering how-to-build-iphone-apps computer science courses via free video podcasts through iTunes U. Later this week, you&#8217;ll be able to get a Stanford-level [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://feeds.gawker.com/~r/gizmodo/full/~3/prvOgyuHqIE/learn-how-to-build-iphone-apps-from-stanford-university">Learn How to Build iPhone Apps from Stanford University [IPhone Apps]</a>: &#8220;
<p><img src="http://cache.gawker.com/assets/images/gizmodo/2009/04/stanford-itunes.jpg" width="263" height="211" />If you&#8217;ve ever hand an idea for an <a class="autolink" title="Click here to read more posts tagged IPHONE APPLICATION" title="Click here to read more posts tagged IPHONE APPLICATION" href="http://gizmodo.com/tag/iphone-application/">iPhone application</a> but you&#8217;ve never known <a class="autolink" title="Click here to read more posts tagged HOW TO" title="Click here to read more posts tagged HOW TO" href="http://gizmodo.com/tag/how-to/">how to</a> begin creating it, Stanford will be offering how-to-build-iphone-apps computer science courses via free video podcasts through <a href="http://itunes.stanford.edu/">iTunes U</a>. Later this week, you&#8217;ll be able to get a Stanford-level education without the stress of <strike>having to apply to the prestigious school and especially without having to pay tuition</strike> being a huge dbag. <i>[Ed. note: Ed went to Cal.]</i> [<a href="http://www.techcrunch.com/2009/04/02/stanford-course-on-how-to-build-iphone-apps-will-soon-be-available-on-the-iphone/">TechCrunch</a>]</p>
<p> <br clear="both" style="clear: both;"/><br />
<br clear="both" style="clear: both;"/><br />
<a href="http://www.pheedo.com/click.phdo?s=db603db945d48d4786846219723b0428&#038;p=1"><img alt="" style="border: 0;" border="0" src="http://www.pheedo.com/img.phdo?s=db603db945d48d4786846219723b0428&#038;p=1"/></a>
<div class="feedflare">
<a href="http://feeds.gawker.com/~ff/gizmodo/full?a=prvOgyuHqIE:dTskxKuiITo:H0mrP-F8Qgo"><img src="http://feeds2.feedburner.com/~ff/gizmodo/full?d=H0mrP-F8Qgo" border="0"></img></a> <a href="http://feeds.gawker.com/~ff/gizmodo/full?a=prvOgyuHqIE:dTskxKuiITo:yIl2AUoC8zA"><img src="http://feeds2.feedburner.com/~ff/gizmodo/full?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.gawker.com/~ff/gizmodo/full?a=prvOgyuHqIE:dTskxKuiITo:D7DqB2pKExk"><img src="http://feeds2.feedburner.com/~ff/gizmodo/full?i=prvOgyuHqIE:dTskxKuiITo:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.gawker.com/~ff/gizmodo/full?a=prvOgyuHqIE:dTskxKuiITo:V_sGLiPBpWU"><img src="http://feeds2.feedburner.com/~ff/gizmodo/full?i=prvOgyuHqIE:dTskxKuiITo:V_sGLiPBpWU" border="0"></img></a>
</div>
<p><img src="http://feeds2.feedburner.com/~r/gizmodo/full/~4/prvOgyuHqIE" height="1" width="1"/>&#8220;</p>
<p>(Via <a href="http://gizmodo.com">Gizmodo</a>.)</p>
 <script type="text/javascript"><!--
google_ad_client = "pub-7949681675937032";
/* 468x60, created 3/6/09 */
google_ad_slot = "0874687580";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
]]></content:encoded>
			<wfw:commentRss>http://osxinternals.com.ar/2009/04/02/learn-how-to-build-iphone-apps-from-stanford-university-iphone-apps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apple Seeds Second iPhone 3.0 Beta to Developers</title>
		<link>http://osxinternals.com.ar/2009/03/31/apple-seeds-second-iphone-30-beta-to-developers/</link>
		<comments>http://osxinternals.com.ar/2009/03/31/apple-seeds-second-iphone-30-beta-to-developers/#comments</comments>
		<pubDate>Wed, 01 Apr 2009 00:39:52 +0000</pubDate>
		<dc:creator>freedomcoder</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[How-to]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://osxinternals.com.ar/?p=66</guid>
		<description><![CDATA[Apple Seeds Second iPhone 3.0 Beta to Developers: &#8220;
After only two weeks from its initial release, Apple has released a second beta version of their iPhone 3.0 operating system.  The new seed is available only to registered iPhone developers.  The iPhone 3.0 beta was first introduced earlier t&#8230;&#8221;
(Via MacRumors : Mac News and [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.macrumors.com/2009/03/31/apple-seeds-second-iphone-3-0-beta-to-developers/">Apple Seeds Second iPhone 3.0 Beta to Developers</a>: &#8220;<br />
After only two weeks from its initial release, Apple has released a second beta version of their iPhone 3.0 operating system.  The new seed is available only to registered iPhone developers.  The iPhone 3.0 beta was first introduced earlier t&#8230;&#8221;</p>
<p>(Via <a href="http://www.macrumors.com">MacRumors : Mac News and Rumors</a>.)</p>
 <script type="text/javascript"><!--
google_ad_client = "pub-7949681675937032";
/* 468x60, created 3/6/09 */
google_ad_slot = "0874687580";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
]]></content:encoded>
			<wfw:commentRss>http://osxinternals.com.ar/2009/03/31/apple-seeds-second-iphone-30-beta-to-developers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone Dev 101: Creating Xcode projects, brief Xcode UI overview</title>
		<link>http://osxinternals.com.ar/2009/03/31/iphone-dev-101-creating-xcode-projects-brief-xcode-ui-overview/</link>
		<comments>http://osxinternals.com.ar/2009/03/31/iphone-dev-101-creating-xcode-projects-brief-xcode-ui-overview/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 15:19:17 +0000</pubDate>
		<dc:creator>freedomcoder</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[How-to]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">http://osxinternals.com.ar/?p=64</guid>
		<description><![CDATA[Filed under: Features, How-tos, Developer, iPhone, iPod touch

In our last iPhone Dev 101, a continuing series on iPhone development, we talked about resources that you can use while you are coding with Cocoa. In this dev post, I&#8217;m going to walk you through Xcode and creating your first project.
First we need to open Xcode, so [...]]]></description>
			<content:encoded><![CDATA[<p>Filed under: <a href="http://www.tuaw.com/category/features/" rel="tag">Features</a>, <a href="http://www.tuaw.com/category/how-tos/" rel="tag">How-tos</a>, <a href="http://www.tuaw.com/category/developer/" rel="tag">Developer</a>, <a href="http://www.tuaw.com/category/iphone/" rel="tag">iPhone</a>, <a href="http://www.tuaw.com/category/ipod-touch/" rel="tag">iPod touch</a></p>
<div style="text-align: center;"><img width="425" vspace="8" hspace="8" height="295" border="0" src="http://www.blogcdn.com/www.tuaw.com/media/2009/03/xcode-project-demo-for-iphone-dev-101-2.jpg" alt="" /></div>
<p>In our last <a href="http://www.tuaw.com/tag/iPhone+Dev+101/">iPhone Dev 101</a>, a continuing series on iPhone development, we talked about <a href="http://www.tuaw.com/2009/03/25/iphone-dev-101-useful-cocoa-development-resources/">resources that you can use</a> while you are coding with Cocoa. In this dev post, I&#8217;m going to walk you through Xcode and creating your first project.</p>
<p>First we need to open Xcode, so once you have the <a href="http://www.tuaw.com/2009/01/25/iphone-dev-101-downloading-and-install-the-iphone-sdk/">SDK installed</a>, you&#8217;ll need to open /Developer/Applications/ and look for Xcode.app. This is Apple&#8217;s <a href="http://en.wikipedia.org/wiki/Integrated_development_environment">IDE</a> (Integrated Development Environment) that allows you to code, debug, test, and build all of your iPhone and Mac applications. When you open this application, nothing specially really happens, although you might see the welcome center &#8212; if you see this, you can choose to disable it at startup by using the check box at the bottom. </p>
<p>To create a new project, select File &gt; New Project. In the resulting window select iPhone OS Application &gt; View-based Application, and click &#8220;Choose.&#8221; You will then need to specify a save name and location for the resulting files that will combine to create your application. In the resulting Xcode window, you should note that most of the work is already done for you!</p>
<p>At this point you have a fully functional application. Try it out: click the &#8220;build and go&#8221; button at the top of the window and wait while the app is compiled and opens in the iPhone Simulator. The app definitely doesn&#8217;t do much, but still, it&#8217;s a running application you made without writing any code. </p>
<p><span style="font-style: italic;">Continue reading to learn more about Xcode, and get a brief UI overview. </span>
<p><a href="http://www.tuaw.com/2009/03/31/iphone-dev-101-creating-xcode-projects-brief-xcode-ui-overview/" rel="bookmark">Continue reading <em>iPhone Dev 101: Creating Xcode projects, brief Xcode UI overview</em></a></p>
<p style="padding:5px;clear:both;"><a href="http://www.tuaw.com">TUAW</a><a href="http://www.tuaw.com/2009/03/31/iphone-dev-101-creating-xcode-projects-brief-xcode-ui-overview/">iPhone Dev 101: Creating Xcode projects, brief Xcode UI overview</a> originally appeared on <a href="http://www.tuaw.com">The Unofficial Apple Weblog (TUAW)</a> on Tue, 31 Mar 2009 09:30:00 EST.  Please see our <a href="http://www.weblogsinc.com/feed-terms/">terms for use of feeds</a>.<br style="clear:both;"></p>
<h6 style="clear: both; padding: 8px 0 0 0; height: 2px; font-size: 1px; border: 0; margin: 0; padding: 0;"></h6>
<p><a href=http://www.tuaw.com/tag/iPhone+Dev+101/>Read</a>&nbsp;|&nbsp;<a href="http://www.tuaw.com/2009/03/31/iphone-dev-101-creating-xcode-projects-brief-xcode-ui-overview/" rel="bookmark" title="Permanent link to this entry">Permalink</a>&nbsp;|&nbsp;<a href="http://www.tuaw.com/forward/1503046/" title="Send this entry to a friend via email">Email this</a>&nbsp;|&nbsp;<a href="http://www.tuaw.com/2009/03/31/iphone-dev-101-creating-xcode-projects-brief-xcode-ui-overview/#comments" title="View reader comments on this entry">Comments</a></p>
<p>(Via <a href="http://www.tuaw.com">The Unofficial Apple Weblog (TUAW)</a>.) Original Link: <a href="http://www.tuaw.com/2009/03/31/iphone-dev-101-creating-xcode-projects-brief-xcode-ui-overview/#comments">iPhone Dev 101: Creating Xcode projects, brief Xcode UI overview</a></p>
 <script type="text/javascript"><!--
google_ad_client = "pub-7949681675937032";
/* 468x60, created 3/6/09 */
google_ad_slot = "0874687580";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
]]></content:encoded>
			<wfw:commentRss>http://osxinternals.com.ar/2009/03/31/iphone-dev-101-creating-xcode-projects-brief-xcode-ui-overview/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mac Automation: Integrating Spotlight searches with your workflows</title>
		<link>http://osxinternals.com.ar/2009/03/30/mac-automation-integrating-spotlight-searches-with-your-workflows/</link>
		<comments>http://osxinternals.com.ar/2009/03/30/mac-automation-integrating-spotlight-searches-with-your-workflows/#comments</comments>
		<pubDate>Mon, 30 Mar 2009 16:17:52 +0000</pubDate>
		<dc:creator>freedomcoder</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[spotlight]]></category>

		<guid isPermaLink="false">http://osxinternals.com.ar/?p=62</guid>
		<description><![CDATA[Filed under: Features, How-tos, AppleScript
We&#8217;ve discussed some pretty neat uses for Automator workflows in the past, but did you know you can easily integrate Spotlight searches into your automation workflows? Well, you can, and it might be easier than you think. In this Mac Automation post, I&#8217;m going to show you how you can integrate [...]]]></description>
			<content:encoded><![CDATA[<p>Filed under: <a href="http://www.tuaw.com/category/features/" rel="tag">Features</a>, <a href="http://www.tuaw.com/category/how-tos/" rel="tag">How-tos</a>, <a href="http://www.tuaw.com/category/applescript/" rel="tag">AppleScript</a></p>
<p><img width="125" vspace="8" hspace="8" height="121" border="0" align="right" alt="" src="http://www.blogcdn.com/www.tuaw.com/media/2007/09/atautomator091207.jpg" />We&#8217;ve discussed some pretty neat uses for <a href="http://www.tuaw.com/tag/Mac+Automation/">Automator workflows</a> in the past, but did you know you can easily integrate Spotlight searches into your automation workflows? Well, you can, and it might be easier than you think. In this Mac Automation post, I&#8217;m going to show you how you can integrate it into a workflow that will burn the resulting files to a CD or DVD. </p>
<p><span style="font-weight: bold;">Creating the workflow</span><br />To create this simple workflow, you&#8217;ll need to use two actions. Find the &#8220;Spotlight&#8221; action and drag it to your workflow section; then, find the &#8220;Burn a Disc&#8221; action and drag it below the newly added Spotlight action. That&#8217;s it; your workflow is now completed, but we need to tweak the actions. </p>
<p><span style="font-weight: bold;">Using the workflow</span><br />To test the workflow, you can enter a search term in the Spotlight action, and a Disc name in the Burn a Disc action. Insert a rewritable disc, or a regular CD/DVD, and click the &#8220;Run&#8221; button in the upper right corner of the Automator window. Automator will then go to work finding all of the search terms that matched files, then will then burn all found items to the disc. This could take a while to burn, depending on the resulting files. </p>
<p>Remember that all of the Spotlight tricks, such as exclusion, denoting kind, etc. are still available even though you&#8217;re using the Automator action.
<p><a href="http://www.tuaw.com/2009/03/30/mac-automation-integrating-spotlight-searches-with-your-workflo/" rel="bookmark">Continue reading <em>Mac Automation: Integrating Spotlight searches with your workflows</em></a></p>
<p style="padding:5px;clear:both;"><a href="http://www.tuaw.com">TUAW</a><a href="http://www.tuaw.com/2009/03/30/mac-automation-integrating-spotlight-searches-with-your-workflo/">Mac Automation: Integrating Spotlight searches with your workflows</a> originally appeared on <a href="http://www.tuaw.com">The Unofficial Apple Weblog (TUAW)</a> on Mon, 30 Mar 2009 10:00:00 EST.  Please see our <a href="http://www.weblogsinc.com/feed-terms/">terms for use of feeds</a>.<br style="clear:both;"></p>
<h6 style="clear: both; padding: 8px 0 0 0; height: 2px; font-size: 1px; border: 0; margin: 0; padding: 0;"></h6>
<p><a href=http://tuaw.com/tag/MacAutomation>Read</a>&nbsp;|&nbsp;<a href="http://www.tuaw.com/2009/03/30/mac-automation-integrating-spotlight-searches-with-your-workflo/" rel="bookmark" title="Permanent link to this entry">Permalink</a>&nbsp;|&nbsp;<a href="http://www.tuaw.com/forward/1501692/" title="Send this entry to a friend via email">Email this</a>&nbsp;|&nbsp;<a href="http://www.tuaw.com/2009/03/30/mac-automation-integrating-spotlight-searches-with-your-workflo/#comments" title="View reader comments on this entry">Comments</a></p>
<p>(Via <a href="http://www.tuaw.com">The Unofficial Apple Weblog (TUAW)</a>.) Original Link: <a href="http://www.tuaw.com/2009/03/30/mac-automation-integrating-spotlight-searches-with-your-workflo/#comments">Mac Automation: Integrating Spotlight searches with your workflows</a></p>
 <script type="text/javascript"><!--
google_ad_client = "pub-7949681675937032";
/* 468x60, created 3/6/09 */
google_ad_slot = "0874687580";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
]]></content:encoded>
			<wfw:commentRss>http://osxinternals.com.ar/2009/03/30/mac-automation-integrating-spotlight-searches-with-your-workflows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

