Dashing Falcon2011-09-23T19:16:43-05:00http://www.dashingfalcon.com/Kevin A. MitchellApple and in-app content sales2011-02-16T21:35:00-06:00http://www.dashingfalcon.com/blog/2011/2/16/apple-and-in-app-content-sales<p>@gruber <a href="http://twitter.com/gruber/status/37704905384792064">asked</a>,</p>
<blockquote><p>Why are so many people surprised that Apple wants 30 percent of all money generated by iOS apps?</p></blockquote>
<p>I'm not as shocked at that as the applicability to the media reading apps.</p>
<p>Apple's <a href="http://www.apple.com/pr/library/2011/02/15appstore.html">position</a> makes at least some sense to me in an application that <em>is</em>, on the iPad, <em>Glossy National Magazine</em>. Having an in-app subscription method makes some kind of sense, can protect the consumer, and may ultimately drive more business to the publisher. And in this case, the user is dealing with a publisher.</p>
<p>What bothers me is that the In-App purchase and 30% cut <a href="http://www.computerworld.com/s/article/9209580/Apple_s_new_App_Store_rules_affect_Amazon_s_Kindle?taxonomyId=12">may apply to apps like the Kindle reader</a>. This is an app that really just gives me access to a media library I populated, often those purchases being made outside of an Apple product. Amazon's not a publisher, but a retailer/distributor.</p>
<p>The difference is in the verb. Some apps <em>are</em> the magazine/newspaper, and some apps just read media. Perhaps the line could reasonably be drawn there.</p>
<p>And it really raises a lot of questions:</p>
<p>Is Apple ready to handle an app that has 600,000 items available for purchase?</p>
<p>Do books sold through IAP have to follow Apple content guidelines? If not every book is available in IAP, does <em>that</em> violate the guidelines?</p>
<p>Is 30% appropriate in situations where Apple has done little but collect the money?</p>
<p>What about other media-reading apps like <a href="http://itunes.apple.com/us/app/stanza/id284956128?mt=8">Stanza</a>? I can buy any number of ePub books unencumbered by DRM and put them on my iPad. What's the difference between using a web browser and iTunes to put a book in my iPad, and Amazon just downloading a book? Is it the DRM?</p>
<p>It concerns me because I love my iPad, the freedom it gives me, and the wide variety of media it plays. It's my <a href="http://itunes.apple.com/us/app/netflix/id363590051?mt=8">portable</a> <a href="http://itunes.apple.com/us/app/hulu-plus/id376510438?mt=8">TV</a>, my <a href="http://itunes.apple.com/us/app/kindle/id302584613?mt=8">book</a>, my <a href="http://itunes.apple.com/us/app/flipboard/id358801284?mt=8">magazine</a>, my <a href="http://itunes.apple.com/us/app/pandora-radio/id284035177?mt=8">music</a> <a href="http://itunes.apple.com/us/app/sirius-xm-premium-online/id317951436?mt=8">player</a>, and my surfboard for the 'net. It would be disappointing to have the utility of the tablet diminished for me because some players would have to leave the market.</p>
<p>The rest of the story will probably play out by June 30, the date <a href="http://digitaldaily.allthingsd.com/20110215/june-30-deadline-for-apple-subscriptions/">Apple has reportedly set for compliance</a>.</p>
Losing my religion: a journey from Emacs to Vim2010-10-23T22:41:00-05:00http://www.dashingfalcon.com/blog/2010/10/23/losing-my-religion-a-journey-from-emacs-to-vim<p>Slides from a Blitz Talk I gave at <a href="http://www.secondconf.com/">SecondConf</a>.</p>
<p>I used to be quite the evangelist for Emacs…but I made a transition to
Vim. I talked about some of the reasons and some of my journey for five
minutes.</p>
<!--more-->
<p>Links from the talk:</p>
<ul>
<li><a href="http://vim.org">http://vim.org</a></li>
<li>Tons of scripts: <a href="http://www.vim.org/scripts/">http://www.vim.org/scripts/</a></li>
<li>MacVim: <a href="http://github.com/b4winckler/macvim">http://github.com/b4winckler/macvim</a></li>
<li>Tim Pope’s scripts: <a href="http://github.com/tpope">http://github.com/tpope</a></li>
<li>Vim Scripts project: <a href="http://vim-scripts.org/index.html">http://vim-scripts.org/index.html</a></li>
<li>Vimmit! <a href="http://vim.reddit.com">http://vim.reddit.com</a></li>
</ul>
<p><a href="http://www.dashingfalcon.com/storage/documents/Losing%20my%20Religion.pdf">Slides for Losing my Religion</a></p>
And now for something completely different...PyObjC talk at C42009-09-27T13:13:00-05:00http://www.dashingfalcon.com/blog/2009/9/27/and-now-for-something-completely-differentpyobjc-talk-at-c4<p>PyObjC combines Cocoa, the greatest set of programming frameworks ever, with the flexibility and power of Python.</p>
<p>These are the slides, with notes, from a Blitz Talk I gave at <a href="http://rentzsch.com/c4/threeOpen">C4[3]</a>.</p>
<p> <a href="http://www.dashingfalcon.com/storage/documents/PyObjC-C4-Notes.pdf">PyObjC Notes (PDF)</a></p>
Indie developer toolkit2009-09-07T15:19:00-05:00http://www.dashingfalcon.com/blog/2009/9/7/indie-developer-toolkit<p>I’m at the <a href="http://rentzsch.com/c4">C4</a> conference, and one of the questions asked of the
panel was what they used for email, hosting, version control, and the
like. The panel had good answers.</p>
<p>Here’s what I’m using.</p>
<!--more-->
<p><strong>Business name</strong>—Be cool. Get one. Even if you don’t incorporate (which
is probably a good idea; I’ll blog about that when I do it), you sound
like you <em>are</em> somebody. One of the biggest highs for me was going to
Cook County Clerk’s office to register the name.</p>
<p><img src="http://www.dashingfalcon.com/images/dash_rgb.gif" alt="Logo" style="float: right"/>
<strong>Logo</strong>—Find a logo designer online, and spend a few bucks. Look for somebody
that’s done work that appeals to your tastes. I used <a href="http://www.logobee.com/">LogoBee</a> to design the
Dashing Falcon logo. $249 got me six designs within the first week and several
updates and tweaks. Turnaround on tweak requests was fast.</p>
<p><strong>Business cards</strong>–I designed my own in Illustrator from the logo files
I got from LogoBee. Saved them as a PDF and had them printed by
<a href="http://www.overnightprints.com/">Overnight Prints</a>. Full color with a nice glossy coating.</p>
<p><strong>Web hosting</strong>—Currently, I’m on <a href="http://www.site5.com/">Site 5</a>. They’ve been affordable
and reliable. The minor annoyance is that they’ve been killing off my
idle shell programs, like if I leave an Emacs running server-side, while
bouncing to a web client to look at what I’m doing.</p>
<p>Another option is to get a slice. I run a server for a friend on
<a href="http://www.slicehost.com/">Slicehost</a>, and they’ve been great. I don’t worry about backups,
because my friend pays the small incremental cost of backing up the
entire slice regularly. I’m running <a href="http://www.ubuntu.com/">Ubuntu</a> Hardy Server there, which
makes it easy to add and update packages with APT.</p>
<p><strong>Website</strong>—I’m using a Content Management System or CMS: <a href="http://drupal.org/">Drupal</a>. It
can handle pages, stories, blogs, even forums. It publishes my site map
to search engines, and offers service links. It’s so good I don’t even
mind it’s written in PHP.</p>
<p>The Apache rewrites that implement the clean URLs won’t rewrite the URLs
of static files, so that would be a possibility for a static,
artistically-designed main page.</p>
<p><strong>Blog editor</strong>–<a href="http://www.red-sweater.com/marsedit/">MarsEdit</a>. Great app, works with Drupal.</p>
<p><strong>Email</strong>—<a href="http://www.google.com/a">Google Apps for your Domain</a>. I used to run my own email
server, but found I was spending too much valuable time working on spam
control. Do you have a dedicated full-time IT employee? Since you don’t,
get somebody else to do the hard work for you. Google Apps is free for
small businesses. You can still access your mail via POP and IMAP if you
like. And you also can use Google for your calendar, internal or public
wiki pages, and <a href="http://www.jabber.org/">Jabber</a>-based chat in your domain (I’m
<a href="mailto:kevin@dashingfalcon.com">kevin@dashingfalcon.com</a> in Jabber).</p>
<p>I won’t run a mail server for myself or anybody else. Ever. I have
better uses for my time than joining the war between spammers and spam
filters.</p>
<p><strong>Version control</strong>—I prefer <a href="http://www.selenic.com/mercurial/wiki/">Mercurial</a>, but also use <a href="http://git.or.cz/">Git</a> when
I’m working with an existing SVN repo. <strong><em>Use version control.</em></strong>
Unconditionally. I can’t stress that more. A <a href="http://en.wikipedia.org/wiki/Distributed_revision_control">DVCS</a> is just the right
size for a small business or indie developer; once you get familiar with
one, you’ll never regret the effort of setting up SVN again.</p>
<p>I use version control for everything. I use it for my application
source, my <a href="http://www.dashingfalcon.com/hg/">open source</a>, my downloads, my website. You can even
incrementally back up dumps of your MySQL database
(<code>mysqldump --skip-extended-insert</code> keeps only one insert per line).
Backing up my website involves pulling the changes from Mercurial from
my web host.</p>
<p>Anything you do with anything, check in to your DVCS. With Mercurial,
it’s as easy as <code>hg init; hg add; hg commit</code>.</p>
<p>Other suggestions or links to <em>your</em> resources? Put them in the
comments!</p>
And on the Seventh Day, he rested…2008-07-08T22:59:00-05:00http://www.dashingfalcon.com/blog/2008/7/8/and-on-the-seventh-day-he-rested<p>Talking with <a href="http://www.rentzsch.com/">Wolf Rentzsch</a> after the <a href="http://groups.google.com/group/cawug">CAWUG</a> meeting today, I
mused about the upcoming <a href="http://www.apple.com/macosx/snowleopard/">Snow Leopard</a> release, which is mostly
internal improvements relating to performance, and few user-facing
features announced so far (the chief being Exchange support).</p>
<p>This is really about showing Microsoft how it’s done. Windows 7 will be
Microsoft figuring out how to slim down the kernel, and reinvent Windows
into some sort of manageable form.</p>
<!--more-->
<p>Meanwhile, OS X is facing its seventh release (10.0 being the first).
Instead of a huge torrent of new features, Snow Leopard takes a step
back, puts on some polish, and puts more horsepower under the hood.</p>
<p>This is a good move on Apple’s part. It’s an indication that the firm
foundations have been laid and built upon, the features are in place and
solid. It’s a sign of success.</p>
<p>It’s basically a sabbatical. The first great act of OS X creation is
complete, and Apple looked upon it, and it was good.</p>
Trying out Bazaar2008-02-17T16:52:00-06:00http://www.dashingfalcon.com/blog/2008/2/17/trying-out-bazaar<p>Considering that it’s the “other” DVCS often considered along with
<a href="http://git.or.cz/">Git</a> and <a href="http://www.selenic.com/mercurial/wiki/">Mercurial</a>, I thought I’d give <a href="http://bazaar-vcs.org/">Bazaar</a> a try.</p>
<p>It’s not working out so well so far. I guess I’m too used to Hg; I found
its workflow agreeable.</p>
<!--more-->
<p>Things I miss or annoy me or I haven’t found in evidence so far (feel
free to comment if I’m not understanding something accurately):</p>
<ul>
<li>Named branches in the repo. Bazaar branches == Hg clones. This is a
big deal to me, I have some projects with several branches that I
switch between rapidly. In other words, this became part of my
workflow.</li>
<li>Hard linked cloning. Hg uses hard links and copy-on-write. When I
clone a bzr repo, it’s a copy of everything. So when I have to make
clones of the repo to get branches, they take just that much more
space. I can imagine how much space large projects with many open
branches take on shared server.</li>
<li>Instant local http server a la <code>hg serve</code>.</li>
<li>Hg has RSS feed generators built in to its server and CGI program;
seems to be an <a href="http://bazaar-vcs.org/FeedGenerators">addon</a> for bzr.</li>
<li>Not to mention automatic tarball creation for downloads.</li>
<li>Specifying the remote bzr command is an environment variable, not an
option. Inconvenient. Also not in the help for <code>bzr clone</code> as a
consequence.</li>
<li>Remote urls are not relative to the log in directory.</li>
<li>Come up with a creative and <a href="http://www.maccvs.org/">original</a> icon and logo!</li>
</ul>
<p>My initial take? It’s like losing some of the coolest features of
Mercurial (low overhead cloning, insta web server), and gaining some of
the things I like least of Git (packs…I have to GC my repo?) and
Subversion (branching <em>has</em> to use a new repo/storage path?).</p>
<p>I’m sure Bazaar will have wide support. I might use it to see how it
works for offline development of projects in Subversion.</p>
<p>I think for rapid indie development and the web work I do, it’s going to
remain Mercurial. It just fits my workflow better and gives me more
power off the shelf.</p>
Backwards-compatible PyObjC development on Leopard2008-02-16T12:06:00-06:00http://www.dashingfalcon.com/blog/2008/2/16/backwards-compatible-pyobjc-development-on-leopard<p>I’m working on a few programs using <a href="http://pyobjc.sourceforge.net/">PyObjC</a>. Some of the neat cool
stuff will be Leopard-only, but there are some utility programs that I’d
like to have working on Tiger as well.</p>
<p>It’d be nice to do all the development with Leopard running.</p>
<!--more-->
<p>It turns out that Leopard has runtime support for <a href="http://python.org/download/releases/2.3.6/">Python 2.3</a> (which
is what ships with Tiger)
in<code>/System/Library/Frameworks/Python.framework</code>. Makes sense, because
some programs written with Tiger may be linked to 2.3, and they still
run.</p>
<p>There is no main Python interpreter 2.3, and there aren’t enough pieces
around to build extensions (the include directory is missing).</p>
<p>This makes it rather difficult to install PyObjC 1.4 into Python 2.3,
since it needs to build some support libraries. A Python command would
be nice too.</p>
<p>I came up with a solution, one that will at least allow building pure
Python applications with Python 2.3. Extensions won’t build because of
the lack of an include directory.</p>
<p>I run Leopard from an external drive, so far, and so my Tiger drive on
my laptop was still mounted. And I’d installed PyObjC and <a href="http://appscript.sourceforge.net/">Appscript</a>
on it.</p>
<p>Digging around, I found the parts that I need: namely, a Python main
program, and the site-packages directory, which hides in
<code>/Library/Python/<version-number></code>. When I installed PyObjC 1.4 and
Appscript under Tiger, they went into site-packages.</p>
<p>So I copied them from my Tiger volume (named Xoots) like this:</p>
<pre><code>$ sudo rsync -avP /Volumes/Xoots/Library/Python/2.3/ /Library/Python/2.3/
$ sudo cp /Volumes/Xoots/usr/bin/python2.3 /usr/local/bin
</code></pre>
<p>Now, build with Python 2.3 using the <a href="http://undefined.org/python/py2app.html">py2app</a> that came with PyObjC
1.4:</p>
<pre><code>$ python2.3 setup.py py2app -s -d Release build
</code></pre>
<p>The <code>-s</code> means to build a “semi-standalone” app. The application bundle
will contain only files that are not in the main Python installation.
This works well for this app since the Python 2.3 runtime support is
available in both Tiger and Panther. It keeps the bundle smaller, too,
about 1.2M instead of 10M.</p>
<p>Checking the binaries that were copied into the app bundle (the
bootstrap loader and the extension modules for Appscript and PyObjC)
showed they all were linked to version 88 of libSystem, which is a good
sign that the program will run on Tiger or newer.</p>
<p>Testing showed that my test program indeed runs on Leopard, and a reboot
later, runs on Tiger too!</p>
Quartz Event Services for interrupting an embedded Python2008-02-07T03:46:00-06:00http://www.dashingfalcon.com/blog/2008/2/7/quartz-event-services-for-interrupting-an-embedded-python<p>I’ve always thought that Emacs was an interesting editor (development
platform?) since it is extensible in the same programming language it’s
written in: Emacs-Lisp. Not only that, but you can extend it at runtime,
right while you’re using it.</p>
<p>I’ve wondered: What if the same thing could be done with a Python
program on OS X. You could even start with a minimal program, and add
functionality to it while running it, saving the intermediate results to
disk so that the next time you start the program, you start up with all
the state and functionality that was there before.</p>
<p>At the very least, it’d be nice to have a robust Python interpreter
running concurrently and inside of the program under consideration.</p>
<!--more-->
<p>I started with the EmbeddedInterpreter project from <a href="http://svn.red-bean.com/pyobjc/branches/pyobjc-1.4-branch/">PyObjC 1.4</a>,
along with parts of the CurrencyConvBinding project so that there’d be
something interesting really going on.</p>
<p>To that I’ve added a class called <a href="http://www.bitbucket.org/kamitchell/interpreterkeycontroller/src/tip/InterpreterKeyController.m">InterpreterKeyController</a>. This
class runs a thread that has an event tap, which can act upon key
presses “out of band”. In other words, it can evaluate key presses as
they arrive in the process, even if the main thread’s run loop is busy
doing something else. Event taps are available with Quartz Event
Services starting in 10.4.</p>
<p>InterpreterKeyController creates the event tap to take effect when
events arrive in the process; it uses <a href="http://developer.apple.com/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html#//apple_ref/c/func/CGEventTapCreateForPSN">CGEventTapCreateForPSN</a> to do
this, which yields a Mach port.</p>
<p>Then it calls <a href="http://developer.apple.com/documentation/CoreFoundation/Reference/CFMachPortRef/Reference/reference.html#//apple_ref/c/func/CFMachPortCreateRunLoopSource">CFMachPortCreateRunLoopSource</a> to make a
CFRunLoopSourceRef, and adds that to the thread’s run loop with
<a href="http://developer.apple.com/documentation/CoreFoundation/Reference/CFRunLoopRef/Reference/reference.html#//apple_ref/c/func/CFRunLoopAddSource">CFRunLoopAddSource</a>.</p>
<p>Note that the events themselves don’t arrive in the thread’s run loop as
they would for the main thread. Instead, the run loop source invokes the
callback for the tap.</p>
<p>The main run loop could be busy running the Python interpreter.
InterpreterKeyController’s event tap looks for control-C keypresses, and
safely interrupts the Python interpreter. It’s important to get
<a href="http://docs.python.org/api/threads.html">Python’s Global Interpreter Lock</a> when doing this to avoid corrupting
the interpreter. The Python interpreter gives up the lock every 100
bytecodes, allowing other threads to run, so the GIL will become
available before too long. The code that does the actual interrupt looks
like this:</p>
<div><figure role=code> <div class="highlight"><table cellpadding="0" cellspacing="0"><tr><td class="gutter"><pre class="line-numbers"><span class='line'>1</span>
<span class='line'>2</span>
<span class='line'>3</span>
</pre></td><td class='code' width='100%'><pre><code class='c'><div class='line'><span class="n">PyGILState_STATE</span> <span class="n">gilstate</span> <span class="o">=</span> <span class="n">PyGILState_Ensure</span><span class="p">();</span>
</div><div class='line'><span class="n">PyErr_SetInterrupt</span><span class="p">();</span>
</div><div class='line'><span class="n">PyGILState_Release</span><span class="p">(</span><span class="n">gilstate</span><span class="p">);</span>
</div></code></pre></td></tr></table></div></figure></div>
<p>KeyboardInterrupt is always taken on the main thread in Python. Due to
the way EmbeddedInterpreter is written, it runs on the main thread. It
does, in fact, run the main thread’s runloop while Python is blocking on
input, and in between I/O operations to the console.</p>
<p>There’s a little bit of code added to the <a href="http://www.bitbucket.org/kamitchell/interpreterkeycontroller/src/tip/PyInterpreter.py">PyInterpreter</a> module to
turn the InterpreterKeyController on only when evaluating interactive
input. Otherwise, the first control-C typed would issue a
KeyboardInterrupt to the application itself, terminating it!</p>
<p>The end result is a Python console that can be embedded into another
running program with some level of safety: If you run something from the
console that goes into an infinite loop, just press control-C and it
will be interrupted. There is no need to force quit the application, as
was necessary with the stock EmbeddedInterpreter if it became hung up.</p>
<p>This can be demonstrated by typing:</p>
<div><figure role=code> <div class="highlight"><table cellpadding="0" cellspacing="0"><tr><td class="gutter"><pre class="line-numbers"><span class='line'>1</span>
<span class='line'>2</span>
</pre></td><td class='code' width='100%'><pre><code class='python'><div class='line'><span class="o">>>></span> <span class="k">while</span> <span class="bp">True</span><span class="p">:</span> <span class="k">pass</span>
</div><div class='line'><span class="o">...</span>
</div></code></pre></td></tr></table></div></figure></div>
<p>which then places the interpreter in an infinite loop. Pressing
control-C results in:</p>
<div><figure role=code> <div class="highlight"><table cellpadding="0" cellspacing="0"><tr><td class="gutter"><pre class="line-numbers"><span class='line'>1</span>
<span class='line'>2</span>
<span class='line'>3</span>
<span class='line'>4</span>
</pre></td><td class='code' width='100%'><pre><code class='python'><div class='line'><span class="n">Traceback</span> <span class="p">(</span><span class="n">most</span> <span class="n">recent</span> <span class="n">call</span> <span class="n">last</span><span class="p">):</span>
</div><div class='line'><span class="n">File</span> <span class="s">""</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1</span><span class="p">,</span> <span class="ow">in</span>
</div><div class='line'><span class="ne">KeyboardInterrupt</span>
</div><div class='line'><span class="o">>>></span>
</div></code></pre></td></tr></table></div></figure></div>
<p>One thing to note is that everything in the running program is available
in Python. For instance, the application delegate is automatically
included into the interpreter. Since the currency conversion uses Cocoa
bindings, executing a statement like</p>
<div><figure role=code> <div class="highlight"><table cellpadding="0" cellspacing="0"><tr><td class="gutter"><pre class="line-numbers"><span class='line'>1</span>
</pre></td><td class='code' width='100%'><pre><code class='python'><div class='line'><span class="o">>>></span> <span class="n">appDelegate</span><span class="o">.</span><span class="n">dollarsToConvert</span><span class="o">=</span><span class="mi">5</span>
</div></code></pre></td></tr></table></div></figure></div>
<p>directly affects the model, with the appropriate text field changing in
the UI, and the calculation is triggered as well.</p>
<p>It is my hope that others will find this useful for more safely adding a
console as a diagnostic tool and to aid in experimentation and diagnosis
during application development.</p>
<p>My testing environment is <a href="http://www.python.org/download/">Python 2.5.1</a> installed on Mac OS X 10.4.11
+ Xcode 2.4.1, with <a href="http://pyobjc.sourceforge.net/">PyObjC</a> 1.4 installed.</p>
<p>You can <a href="http://www.bitbucket.org/kamitchell/interpreterkeycontroller/">browse the source code</a> for a project that uses
InterpreterKeyController, where you can also tarballs.</p>
<p>Apple’s developer site has more information on <a href="http://developer.apple.com/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html">Quartz Event Services</a>.</p>
Notifications in iTunesBridged2008-02-01T01:05:00-06:00http://www.dashingfalcon.com/blog/2008/2/1/notifications-in-itunesbridged<p>HAS commented that I could track changes to the player state of iTunes
using NSDistributedNotificationCenter.</p>
<p>I’ve gone ahead and made changes to the iTunesBriged code to show how to
do that. Now, whenever iTunes changes state, whether it’s via the
iTunesBridged application or by directly manipulating iTunes, the title
of the Play/Pause button changes and the current track name is listed in
the text box.</p>
<p>As mentioned in that comment, <a href="http://www.tildesoft.com/Programs.html">Notification Watcher</a> is a great app
for observing distributed notifications. It made it really easy to
figure out what iTunes was sending and what data was in the userInfo.</p>
<p>Thanks for the comment, and the idea!</p>
<p><a href="http://www.bitbucket.org/kamitchell/itunesbridged/">Get iTunesBridged source downloads</a>, which can be cloned with
Mercurial or downloaded as a tarball.</p>
Changing to Mercurial2008-01-26T19:14:00-06:00http://www.dashingfalcon.com/blog/2008/1/26/changing-to-mercurial<p>Thanks to <a href="http://www.dribin.org/dave/">Dave Dribin</a>, and his <a href="http://www.dribin.org/dave/blog/archives/2007/12/30/why_mercurial/">analysis</a> of git vs.
<a href="http://www.selenic.com/mercurial/wiki/">Mercurial</a>, I decided to give Mercurial a try.</p>
<p>It turns out I rather like it! I’d been keeping a lot of my work in
<a href="http://subversion.tigris.org/">Subversion</a>, which is a pretty good centralized source code
management system, but the usual way of using it seemed so heavy:
branches and tags and all kinds of operations took big URLs.</p>
<!--more-->
<p>Don’t get me wrong. Subversion has a lot going for it in environments
where development is managed, and central control is a plus. I haven’t,
for instance, thought of a way that Mercurial could protect a repository
against ad-hoc changes from a developer the way a UID/GID protected
repository in SVN can.</p>
<p>Mercurial has a nice localized workflow. <code>hg init</code>, and <code>hg add</code> and
<code>hg commit</code>, and my stuff is version-controlled, no need to
find/make/design a Subversion repo.</p>
<p>It wasn’t that hard to set up Mercurial for nice web browsing, with
decent log and diff displays. You can subscribe to an RSS feed of the
checkins. On-the-fly creation of tarballs is included, just turn them on
with a config option. And I didn’t have to install any extra software to
do it.</p>
<p>So, as a good start, <a href="https://bitbucket.org/kamitchell/itunesbridged/overview">iTunesBridged</a> is in the repository. And there’s
a new <a href="http://bitbucket.org/kamitchell/">Source</a> link in the menu at the top of the page.</p>
<p>Now, I can get on to some of the other neat things I’m working on.</p>
A little bit of PyObjC2008-01-14T19:14:00-06:00http://www.dashingfalcon.com/blog/2008/1/14/a-little-bit-of-pyobjc<p>Well, <a href="http://threeve.org/blog/">Jason</a> gave me a bit of a challenge on his <a href="http://twitter.com/threeve">Twitter</a>, and so
that got me to doing something I’d meant to do for a while.</p>
<p>I’ve wanted to mess around with the new Python bindings, and so I booted
up Leopard and settled in with XCode. My goal was to duplicate a
demonstration of Scripting Bridge that Wolf had done at <a href="http://rentzsch.com/psig/111">PSIG</a>, except
in <a href="http://python.org">Python</a>.</p>
<!--more-->
<p>I’ve been a Pythonista for some time, and I like the interactivity mixed
with the ability to create substantial applications.</p>
<p>What do I think? I really like it. I think my development focus is going
to be on Leopard and beyond, for the excellent combination of Cocoa and
Python it offers.</p>
<p>First off, Scripting Bridge takes all the hassle out of talking to
another application. I’ve worked with AppleEvents for years, and it’s
always been a hassle, building up descriptors, and all the half-baked
helpers that have previously existed.</p>
<p>One thing that’s missing from Scripting Bridge for interpreted languages
is that the introspection can’t see the four character codes for
enumerations. That’s easily solved with a little bit of copy and edit
from the .h file made by sdp, so I include that in the code as a
demonstration.</p>
<p>It’s fun to load up <a href="http://ipython.scipy.org/moin/">iPython</a> to tinker around interactively with a
scriptable application. iPython has tab completion for expressions, so
it’s easy to find out the names of various scripting commands. Unlike
Objective-C, you can tinker with the expressions interactively until you
get them the way you want them, then put them into your main Python code
in your app. I’ll put up a tutorial showing how to do that later.</p>
<p>So attached, you’ll find the code for iTunesBridged, a Python-based
Cocoa app for Xcode 3.0 and Leopard. It shows the simple use of an application controller, Scripting Bridge,
and Cocoa Bindings.</p>
Guerilla lemur conservation2007-12-31T22:40:00-06:00http://www.dashingfalcon.com/blog/2007/12/31/guerilla-lemur-conservation<p>Mike Lee over at Delicious Monster has come up with an idea that I
heartily approve of. A campaign to raise donations for the <a href="http://savethelemur.org/">Madagascar Fauna Group</a>.</p>
<p>Viral internet conservation combined with interesting ways for
independent software developers to make a difference.</p>
<p>It’s a great way to help improve the world we live in. Join <a href="http://atomicwang.org/thievey/Club_Thievey/Welcome.html">Club Thievey</a>. I did.</p>
Me software developer2007-05-04T12:00:00-05:00http://www.dashingfalcon.com/blog/2007/5/4/me-software-developer<p>I’m getting back into some independent software development again.</p>
<p>GIFConverter is probably at that stage in its life where it should be
allowed a peaceful senescence. I may do one more release, to get it
working as a Universal Binary. No big feature changes. This is for the
benefit of long-term loyal customers that have supported it over the
years (and for which I thank you).</p>
<!--more-->
<p>If I did something with image viewing and processing, I’d totally start
over. I’d want to take advantage of the increase in computing power in
the last 20 years, and make something of the quality and polish you’d
expect on the Mac.</p>
<p>And I’m looking for the Next Big Thing to do. I want it to be fun,
something that I’d want to have, something that many people would want
to have, something we’d use every day. That’s what GIFConverter was, and
it had a good run.</p>
<p>I have one neat idea in my head so far.</p>