<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<language>en-gb</language>
		<title>stuconnolly.com</title>
		<link>http://stuconnolly.com/</link>
		<description>The personal site of Stuart Connolly, Open Source Software developer.</description>
		<copyright>Copyright 2010 Stuart Connolly</copyright>
		<generator>Serve 0.8</generator>
		<atom:link href="http://stuconnolly.com/blog/feed/" rel="self" type="application/rss+xml"/>
		<item>
			<title>SafariTabs 0.7.2</title>
			<dc:creator>Stuart Connolly</dc:creator>
			<pubDate>Wed, 03 Mar 2010 21:27:00 +0000</pubDate>
			<link>http://stuconnolly.com/blog/safaritabs-072/</link>
			<guid>http://stuconnolly.com/blog/safaritabs-072/</guid>
			<comments>http://stuconnolly.com/blog/safaritabs-072/#comments</comments>
			<description><![CDATA[<p><a href="http://stuconnolly.com/projects/safaritabs/">SafariTabs</a> 0.7.2 is now available for <a href="http://stuconnolly.com/downloads/safaritabs/0.7.2/">download</a>. As usual this is a pretty minor release that resolves the following issues:</p>

<ul>
	<li>New window links not working when the 'Force new window links to open in a new tab' option is disabled.</li>
	<li>Not saving the current session's open tabs when private browsing is enabled.</li>
</ul>

<p>The first issue was introduced in the previous release while the second has been around for a couple of versions, which has now finally been resolved. Enjoy.</p>

<p><em class="highlight"><strong>Update:</strong> I've just realised that this version was released exactly 3 years to the day since the <a href="http://stuconnolly.com/projects/safaritabs/safaritabs-version-history/">first</a> public release (version 0.1). Can't believe it's been 3 years already.</em></p>]]></description>
		</item>
		<item>
			<title>SafariTabs 0.7</title>
			<dc:creator>Stuart Connolly</dc:creator>
			<pubDate>Sun, 06 Dec 2009 23:32:00 +0000</pubDate>
			<link>http://stuconnolly.com/blog/safaritabs-07/</link>
			<guid>http://stuconnolly.com/blog/safaritabs-07/</guid>
			<comments>http://stuconnolly.com/blog/safaritabs-07/#comments</comments>
			<description><![CDATA[<p><a href="http://stuconnolly.com/projects/safaritabs/">SafariTabs</a> 0.7 is now available for <a href="http://stuconnolly.com/downloads/safaritabs/0.7/">download</a>. I've been meaning to release this for a while as it includes (the frequently requested) support for Safari 4.0.4 on Snow Leopard (OS X 10.6). It also contains a German localisation contributed by Christoph Schmitz and a Simplified Chinese localisation contributed by Donald Teng.</p>

<p>Anyone who is already using other SIMBL based <em>plugins</em> on Snow Leopard will know that it had to be re-written to get around Apple's tightening restrictions on InputManagers. Without gettting into the exact technical details, if you aren't already using it, SafariTabs requires the very latest <a href="http://www.culater.net/software/SIMBL/SIMBL.php">SIMBL</a> version that is compatible with Snow Leopard. This subsequently means that this version of SafariTabs is also only compatible with Snow Leopard.</p> 

<p><em class="highlight"><strong>Update:</strong> I've pulled this release for the time being because of 64-bit compatibility problems, which I'm currently working on to resolve.</em></p>

<p><em class="highlight"><strong>Update 2:</strong> The release is now available again after the 64-bit issues were resolved. Thanks for your patience and thanks to all the testers who helped out.</em></p>]]></description>
		</item>
		<item>
			<title>SCEvents 0.1.4</title>
			<dc:creator>Stuart Connolly</dc:creator>
			<pubDate>Sat, 05 Dec 2009 22:42:00 +0000</pubDate>
			<link>http://stuconnolly.com/blog/scevents-014/</link>
			<guid>http://stuconnolly.com/blog/scevents-014/</guid>
			<comments>http://stuconnolly.com/blog/scevents-014/#comments</comments>
			<description><![CDATA[<p><a href="http://stuconnolly.com/projects/source-code/">SCEvents</a> 0.1.4 is now available for <a href="http://stuconnolly.com/downloads/scevents/0.1.4/">download</a>. This small update fixes the following:</p>

<ul>
	<li>An issue relating to the removal of an event path's trailing slash.</li>
	<li>An issue that prevented external drives from being ejected even after <code>stopWatchingPaths;</code> had been called.</li>
</ul>

<p>It also includes the new method <code>streamDescription;</code> for debugging purposes. Internally this method is calling FSEvents' <code>FSEventStreamCopyDescription()</code> function, which returns something along the lines of the following:</p>

<pre>
FSEventStreamRef @ 0x1036a0:
    allocator = 0xa0474ee0
    callback = 0x2e92
    context = {0, 0x1050f0, 0x0, 0x0, 0x0}
    numPathsToWatch = 1
    pathsToWatch = 0xa0474ee0
        pathsToWatch[0] = '/Users/stuart'
    latestEventId = -1
    latency = 3000000 (microseconds)
    flags = 0x00000005
    runLoop = 0x105db0
    runLoopMode = 0xa0469c68
</pre>

<p>Many thanks to <a href="http://www.randomapplications.com/">Pico Mitchell</a> for providing valuable feedback that led to these issues being identified. Cheers Pico.</p>

]]></description>
		</item>
		<item>
			<title>Redesigning Sequel Pro's Export Architecture</title>
			<dc:creator>Stuart Connolly</dc:creator>
			<pubDate>Sun, 04 Oct 2009 00:15:00 +0000</pubDate>
			<link>http://stuconnolly.com/blog/redesigning-sequel-pros-export-architecture/</link>
			<guid>http://stuconnolly.com/blog/redesigning-sequel-pros-export-architecture/</guid>
			<comments>http://stuconnolly.com/blog/redesigning-sequel-pros-export-architecture/#comments</comments>
			<description><![CDATA[<p>Ever since joining the team of developers working on <a href="http://www.sequelpro.com/">Sequel Pro</a> in November 2008, we've <a href="http://www.sequelpro.com/blog/category/releases/">released</a> four new versions, each including a huge number of major new features, performance improvements and bug fixes. Highlights of these changes include a completely redesigned preferences window, a redesigned query editor, built in SSH tunnel support, our own forked version of the underlying MySQL framework and most noticeable, major improvements to nearly every aspect of the application's interface. With every new release the feedback from users has been great, from invaluable insight into how they think something should work to general thoughts of appreciation that the application and project behind it actually exist. This has been more evident with the <a href="http://www.sequelpro.com/blog/2009.08/sequel-pro-0-9-6-now-available/">latest</a> release, version 0.9.6, with SSH tunnel support proving to be a very popular addition.</p>

<p>Having said this though, very few applications are considered perfect or perform every one of their functions extremely well and Sequel Pro is no exception. With no disrespect intended to either the developers of the original CocoaMySQL (of which Sequel Pro is a fork and wouldn't exist without) or the other current Sequel Pro developers, CocoaMySQL had a lot of very annoying bugs and performance issues. Nearly all of these have now been addressed, but there are still a few areas that require some major improvement before I think we can release version one.</p>

</p>I'm not talking about adding support for other RDBMS's, such as SQLite and PostgreSQL as although this is one of our major long term goals, it unsurprisingly requires a significant amount of work, including redesigning and rewriting large parts of the application. The particular areas which I am referring to (which are of my own personal view and not those of the other developers) are data import/export, user account management and advanced table content filtering using predicates. As is obvious from the title of this post I'm interested in redesigning the application's data export architecture as it along with data import are among the most heavily used functions of the application.</p>

<h3>The Problems</h3>

<p>First, before I propose my grand plan for the data export's redesign, which will inevitably require a bit of rewriting and a lot of restructuring work, its only right that I provide an overview of its current implementation and the problems associated with it. One of the first things that I should point out is that the core functionality of the current data export (that is, the actual code that generates the CSV, SQL and XML from the data extracted from the database) is generally not the problem and actually performs quite well (with one big drawback, which I'll soon get to). The main problem with its current implementation is in the design and how everything fits together, which subsequently affects its performance. The following outlines two of the main and most obvious problems.</p>

<h4>Class Structure</h4>

<p>Put simply, there is none. All of Sequel Pro's data import and export methods are all contained in a single class, which if you ask any of the other developers I'm sure they'll agree is far from pretty to look at, let alone work with. You might think that having everything to do with the current operation in one place (including the references to the relevant user interface controls) would make things a lot easier as you don't have to worry about passing around references to objects of interest, but it doesn't. As is evident from the current implementation, all of the data import/export code can become quite complex and having it all in once place doesn't help, it just adds to its overall complexity.</p>
	
<h4>Concurrency</h4>

<p>This is the big drawback. Just as above, there is none. None of the data export code is multithreaded, meaning any operation performed will be executed on the application's main thread. This for example&#8212;when exporting a large amount of data (regardless of output format)&#8212;means the entire application will be  <em>blocked</em> until the export is complete. What makes things worse is factoring in the speed of the network over which you are connected to the MySQL host. If like me, you're connected to a database provided by your web host and it's located on the other side of the world, chances are your going to be waiting a while (with no way of cancelling it) if you attempt to export a significant amount of data.</p>

<h3>The Solutions</h3>

<p>As stated, the above are just two of the main issues with regard to the current design, with others not being so obvious and in some cases no doubt the side effects of these two. It should be noted though that addressing these areas are not going to solve every single issue that is wrong with current design and implementation. For example, splitting all the code into separate classes of common functionality and greatly improving upon its current non-existent structure is not going to improve the overall performance of performing a data export operation, but it will greatly improve the ease at which it can be maintained and further developed. In contrast to this though, when introducing a level of concurrency into an operation, significant performance improvements are expected (assuming it's implemented right), but such concurrency no matter how well it's implemented is going to solve the problems associated with working over a slow network.</p>

<h4>Class Structure</h4>

<p>Something that is inherently missing from the current implementation is any form of a recognisable design pattern. I'm a huge fan of design patterns when it comes to designing software, especially <a href="http://en.wikipedia.org/wiki/Model-view-controller">MVC</a>. The reason being that it ultimately results in easily maintainable and reusable modules of code, something that is well worth thinking about before beginning any implementation.</p>

<p>The key thing to note about the data export operation is that very few areas of the complete operation are specific to the chosen format that is selected by the user. For example, regardless of which format the user selects, there are a set of format independent operations that are always going to be performed, including giving the user a visual indication that the export process has begun, getting the data by querying the database, updating the UI to reflect the progress of the export process and finally, writing the resulting data to disk in the chosen format. The obvious missing step (which is format specific) is the conversion of the extracted data to the chosen format, which would take place while the progress of it was updated and presented to the user.</p>

<p>It would then seem logical to split out all format specific data conversion code into their own respective classes. Because they all share some common properties and processes such as indicating when the conversion process starts and ends, providing the progress of the conversion and specifying what character encoding should be used when dealing with the data, these separate classes should all be subclasses of a common exporter. For example, the end result would be <code>SPExporter</code> as the base class containing all non-specific exporter functionality and data format specific subclasses <code>SPCSVExporter</code>, <code>SPSQLExporter</code> and <code>SPXMLExporter</code> obviously containing all format specific conversion code. Adhering to this design would therefore mean the task of adding a new export format would be as simple as subclassing <code>SPExporter</code> and implementing the format specific conversion code.</p>

<p>Note that the exporters should not have to worry about where the data comes from or how it is obtained. They simply need to be supplied it, most likely in the form of a multi-dimensional array as is the case when dealing with exporting entire tables. The exporters could also be designed to handle the data in the form of the raw result set (in this case an instance of <code>MCPResult</code> or <code>MCPStreamingResult</code>) although this would mean making the exporters database and even framework specific. If support were added though, the time consuming step of converting a result set to an array could be eliminated.</p>

<p>All of this is constructed and controlled in a single location by the new <code>SPExportController</code>, which in turn is designed to work with the newly redesigned export interface completed by one of the other developers. <code>SPExportController</code> is responsible for all UI interaction, the initialisation of a specific exporter based on the user's format selection and the task of supplying data to it. The new controller is also the assigned delegate of the exporter, allowing it to be informed of the progress of the data conversion process, which subsequently enables the UI to be updated, providing accurate user feedback.</p>

<h4> Concurrency </h4>
	
<p>The original idea of introducing concurrency into the export architecture was to manually manage all threads ourselves using <code>NSThread</code>. For example, as <code>SPExporter</code> is the superclass of all exporters, the idea was to give this class a single instance of <code>NSThread</code>, with which each exporter subclass would inherit and subsequently use during the process of performing its most time consuming tasks (e.g. converting a data array to CSV data). There is nothing immediately wrong with this approach, but upon its implementation the obvious problems of manually managing threads and having to do it multiple times resulting in code duplication in each specific exporter, become apparent. Regardless of this though, as of Leopard with the introduction of <code><a href="http://developer.apple.com/mac/library/documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html">NSOperation</a></code> and more recently in Snow Leopard with <a href="http://en.wikipedia.org/wiki/Grand_Central_Dispatch">Grand Central Dispatch</a> (GCD) its not exactly the easiest or preferred method of introducing concurrency into an application or process.<p>

<p>Since we're not yet targeting 10.6 only we unfortunately can't use GCD, so <code>NSOperation</code> is the next best thing and is actually perfectly suited to what we are trying to accomplish. With the introduction of both GCD and <code>NSOperation</code> there's been a shift away from manually managing everything with threads to configuring and submitting isolated 'packets' of work that are to be executed concurrently and then their results collated once complete.</p>

<p>For our purposes, subclassing <code>NSOperation</code> is probably the best way to go as it gives us complete control over everything (with the ability to add extra functionality) and also because we are already creating an instance of an exporter, it makes sense to make <code>SPExporter</code> the subclass. Although we'll still have to manually create our own thread to make the operation concurrent, doing so will enable the implementation of all the custom <code>NSOperation</code> code in the exporter base class resulting in the subclasses only having to implement the data conversion code that is specific to each exporter in their <code>main()</code> method.</p>

<p>As stated, the most time consuming part of the export process once the data is obtained is the conversion of this data into the selected format. You could factor in the time its takes to get the data from the server, but this is a separate issue and has also been largely addressed by the addition of result set streaming. The data conversion process is therefore our designated 'packet' of work that needs to be run concurrently. The benefit of this, is that we can now theoretically create as many exporter instances as we want, assign them 'chunks' of data to be converted and place them on an operation queue for the conversion process to be executed concurrently. For example, currently if we want to export ten different tables then we have to&#8212;one after the other&#8212;get the data from these tables, convert it to whatever format and then write the data to separate files on disk. Using the proposed concurrent implementation, after getting the data (either concurrently or not), it can then be assigned to one of the exporter instances and placed on the operation queue.</p> 

<p>The end result is the exporters being placed on the operation queue when the data is available without having to wait on the data from each table. The system then decides when the data conversion process should be executed based on available resources. This could potentially mean that the data conversion for all of the ten tables could be taking place concurrently. The converted data could then be written to disk on a table per file basis as is the case just now, but it could also be done as soon as the conversion process is complete, removing the need to wait on the data from the other tables.</p>

<h3>Implementing It</h3>

<p>So that's the plan, its not perfect but hopefully addressing these two issues will bring noticeable benefits to end-users and the Sequel Pro developers. It's also a start towards a completely re-written export and possibly import architecture. Although data import may seem fundamentally different and it is at its core, but the same general design and approach can be applied to it. The key difference would be in the implementation of the data conversion logic and the result of this. For example, converting CSV data into the relevant SQL <code>INSERT</code> statements and executing those statements against the database instead of writing them to a file.</p> 

<p>If you've reached this far and think what you've just read is more like a bunch of notes rather than a solid statement of intention, it's because it is (and the reason why there isn't any pretty pictures or diagrams), my thoughts on how I think it should be done, not necessarily how it will eventually be done. It's always so much easier to state how you would like something to be done in theory, which is why I'm sure I'll come across and have to overcome problems that I haven't yet thought of at the time of refining its design and eventually its implementation. All the more reason why any form of feedback is welcome and encouraged, especially for things that I may have misinterpreted or overlooked.</p>

<p><em class="highlight"><strong>Update:</strong> I guess I should read the docs more carefully. The statement that "we'll still have to manually create our own thread to make the operation concurrent" is not entirely correct, at least for what we are doing here. You only need to implement the spawning and management of your own thread in your <code>NSOperation</code> subclass' <code>main()</code> method if you plan on starting the execution of the operation manually. That is, starting it by calling it's <code>start()</code> method as opposed to adding it to an operation queue. If you're not planning on starting the operation manually you don't need to implement any threading in your <code>main()</code> method, only the operation code. Once added to an operation queue the system will execute your <code>main()</code> method concurrently.</em></p>]]></description>
		</item>
		<item>
			<title>SafariTabs 0.6.5</title>
			<dc:creator>Stuart Connolly</dc:creator>
			<pubDate>Tue, 18 Aug 2009 11:31:00 +0000</pubDate>
			<link>http://stuconnolly.com/blog/safaritabs-065/</link>
			<guid>http://stuconnolly.com/blog/safaritabs-065/</guid>
			<comments>http://stuconnolly.com/blog/safaritabs-065/#comments</comments>
			<description><![CDATA[<p><a href="http://stuconnolly.com/projects/safaritabs/">SafariTabs</a> 0.6.5 is now available for <a href="http://stuconnolly.com/downloads/safaritabs/0.6.5/">download</a>. This release contains no new features or functionality changes and simply adds support for Safari 4.0.3, which was released last week.</p>

<p>Enjoy.</p>]]></description>
		</item>
		<item>
			<title>Leaving Sun Microsystems</title>
			<dc:creator>Stuart Connolly</dc:creator>
			<pubDate>Mon, 27 Jul 2009 14:42:00 +0000</pubDate>
			<link>http://stuconnolly.com/blog/leaving-sun-microsystems/</link>
			<guid>http://stuconnolly.com/blog/leaving-sun-microsystems/</guid>
			<comments>http://stuconnolly.com/blog/leaving-sun-microsystems/#comments</comments>
			<description><![CDATA[<p>I've been meaning to write this post for a number of weeks now, so here it finally is. As of June 30th I'm no longer working at <a href="http://www.sun.com/">Sun Microsystems</a>. 
I'm not posting this because I believe everyone cares, I expect the opposite that most people reading this will not care, but I believe that I owe it to Sun and those that I worked with while there to show what it meant to me and how 
extremely grateful I am for the opportunity I was given.</p>

<p>I was only originally only supposed to be at Sun for a year as part of my degree, but as I <a href="http://stuconnolly.com/blog/one-year-today/">mentioned</a> a year ago I was given the chance to extend my contract for another year. 
As I predicted back then, my second year was just as good as the first and in many ways was a lot better. Although I was amazed at the amount of access and responsibility given to me in my first year considering I was technically classed 
as an intern, having been there for a year and knowing the various systems and practices in use meant my second year only expanded upon this. I was increasingly given the chance to work on bigger and bigger projects and by the end of my 
two years there I was treated just like any other employee as a core member of our small team, with overall responsibility of my own projects and applications. It were these exact experiences that lead me to learn so much during my time 
there, both technically and professionally.</p>

<p>Before working at Sun I had great respect for the company and especially admired the work they had done and continue to do so in the open source community. Now, after working for them my respect has only increased having seen 
their approach and attitude from a different angle, that is, from the <em>inside</em>. A lot of aspects of the company made it an absolute joy to work there, most notably the people (some of the smartest and most talented I know) 
to the general culture, working attitude and environment. Obviously there were aspects of my job that I didn't particularly like at times, but there were few of them and I wouldn't think twice about going back to work for Sun. I guess I left 
when the company is going through a lot of changes and I'm interested to see what the future brings to say the least.</p>

<p>Working at Sun has been a huge part of my relatively short career (I'm yet to finish my degree) in IT and I think its been the best  possible start I could have had to prepare me for the future. I'm extremely grateful to Sun for giving me, 
at the time an inexperienced 2nd year student the opportunity, allowing me to work with a lot of great people (most of which have become good friends) and to learn an unimaginable amount about my chosen profession. My experience at Sun 
is already starting to open up a lot of new opportunities for my future, but I really do miss working there.</p>]]></description>
		</item>
		<item>
			<title>What's Up With That?</title>
			<dc:creator>Stuart Connolly</dc:creator>
			<pubDate>Sat, 18 Jul 2009 14:02:28 +0000</pubDate>
			<link>http://stuconnolly.com/blog/whats-up-with-that/</link>
			<guid>http://stuconnolly.com/blog/whats-up-with-that/</guid>
			<comments>http://stuconnolly.com/blog/whats-up-with-that/#comments</comments>
			<description><![CDATA[<p>It's supposed to be the middle of summer, isn't it?</p>

<a href="http://stuconnolly.com/images/july-weather.png"><img src="http://stuconnolly.com/images/july-weather-thumb.png" width="226" height="340" alt="Weather" /></a>]]></description>
		</item>
		<item>
			<title>SafariTabs 0.6.4</title>
			<dc:creator>Stuart Connolly</dc:creator>
			<pubDate>Sun, 14 Jun 2009 22:55:14 +0000</pubDate>
			<link>http://stuconnolly.com/blog/safaritabs-064/</link>
			<guid>http://stuconnolly.com/blog/safaritabs-064/</guid>
			<comments>http://stuconnolly.com/blog/safaritabs-064/#comments</comments>
			<description><![CDATA[<p><a href="http://stuconnolly.com/projects/safaritabs/">SafariTabs</a> 0.6.4 is now available for <a href="http://stuconnolly.com/downloads/safaritabs/0.6.4/">download</a>. 
Not much to say for this release except that it adds support for the final (non-beta) release of Safari 4.</p>

<p>Seeing as support for the Safari 4 beta was <a href="http://stuconnolly.com/blog/safaritabs-063/">added</a> in version 0.6.3, and since there were no major functional changes between the beta 
and the final release that affected SafariTabs, this release doesn't actually contain any code changes and only a simple configuration update. Its always good to keep things up to date though.</p>

<p>Enjoy.</p>]]></description>
		</item>
		<item>
			<title>SafariTabs 0.6.3</title>
			<dc:creator>Stuart Connolly</dc:creator>
			<pubDate>Sun, 12 Apr 2009 17:05:29 +0000</pubDate>
			<link>http://stuconnolly.com/blog/safaritabs-063/</link>
			<guid>http://stuconnolly.com/blog/safaritabs-063/</guid>
			<comments>http://stuconnolly.com/blog/safaritabs-063/#comments</comments>
			<description><![CDATA[<p><a href="http://stuconnolly.com/projects/safaritabs/">SafariTabs</a> 0.6.3 is now available for <a href="http://stuconnolly.com/downloads/safaritabs/0.6.3/">download</a>. I guess I'm a bit slow of the mark at updating it in order to make it 
compatible with the Safari 4 beta considering its been out since February, but its finally here. Turns out I really started to miss the tab undo support.</p>

<p>As I fully expected, the release of the Safari 4 beta added support for some of the features that SafariTabs provides and I'm sure that future releases will progressively implement more of its features. As SafariTabs was originally created in order to add the features that I 
personally thought Safari was lacking in comparison to other browsers, its obviously a good thing that Apple is adding them to Safari. Although SafariTabs is really quite stable and as much as I try to keep it this way between Safari releases, there is no guarantee that this will 
always be the case considering the <em>completely unsupported, discouraged</em> and basically <em>hack-like</em> mechanism that it uses to <em>inject</em> its functionality into Safari. What I'm trying to say, is that its much better if these features are native to Safari itself 
rather than provided through plugin.</p>

<p>With that said, SafariTabs 0.6.3 is virtually the same as 0.6.2 with the exceptions of being Safari 4 compatiable and the removal of the preference that allows you to specify which page is loaded when new tabs are created. This preference is now provided by Safari along with a 
few more options than were available in SafariTabs.</p>

<p>Aside from adding Safari 4 compatibilty I was aiming to add a much requested feature, which was to restore the history of a tab that was restored via the undo support. Unfortunately, despite all my efforts I was still unable to figure out a way to do it given the only information 
I have to go from is Safari's headers which are extracted from its binary.</p>

<p>As usual feeback is always <a href="http://dev.stuconnolly.com/feedback/">welcome</a>.</p>]]></description>
		</item>
		<item>
			<title>Sequel Pro</title>
			<dc:creator>Stuart Connolly</dc:creator>
			<pubDate>Sun, 08 Mar 2009 22:57:51 +0000</pubDate>
			<link>http://stuconnolly.com/blog/sequel-pro/</link>
			<guid>http://stuconnolly.com/blog/sequel-pro/</guid>
			<comments>http://stuconnolly.com/blog/sequel-pro/#comments</comments>
			<description><![CDATA[<p>Like most Mac developers that have to interact with databases and more specifically MySQL databases, I had always used the open source and seemingly only decent native Mac application <a href="http://sourceforge.net/projects/cocoamysql/">CocoaMySQL</a> as apposed to the web 
based <a href="http://www.phpmyadmin.net">phpMyAdmin</a> to find my way around and perform basic MySQL database management tasks.</p>

<p>Also, like others who used CocoaMySQL I soon found out that the project had been forked to form its successor <a href="http://sequelpro.com/">Sequel Pro</a>, seeing as any sort of development on CocoaMySQL had been clearly absent for a number of years. Upon discovering Sequel Pro 
back in late November it was right around the time I was looking for a new Mac OS X/Cocoa project to work on having stopped working on my <a href="http://stuconnolly.com/blog/archive/2008/10/31/where-ive-been/">own</a>. Sequel Pro was the perfect project to contribute to as I was looking 
for something that was obviously open source and effectively already estabilished, without having to start my own project from scratch and work on it by myself, which going by my past personal projects probably wouldn't have gone anywhere. I also thought the project was of the perfect 
size, in that it wasn't too big that it would take me a significant amount of time to get up to speed with everything and start contributing code and not too small that the project wouldn't get noticed for a while or development wouldn't grind to a halt at times.</p>

<a href="http://sequelpro.com/"><img src="http://stuconnolly.com/images/sequelpro.png" width="128" height="128" alt="Sequel Pro.app" /></a>

<p>So about a week after contacting the project owners about crontibuting I was accepted as a project member and have been one of its contributing <a href="http://sequelpro.com/developers.html">developers</a> ever since. Since joining the project a lot has been happening, with a significant 
amount of work being put into making Sequel Pro even better than it already is, including the launch of the new website and a couple of more releases on the way to version 1.0. Although there have been times when I've had to stop working on Sequel Pro altogether for weeks on end because of 
other commitments, mainly work and uni, the benefit of it not being my own project with myself as the sole developer means that development has never really ceased and the project continues to evolve.</p>

<p>In terms of what's exactly been happening since starting work on the project, the main focus has been on improving the overall stability and performance of the application and fixing as many of the most obvious bugs as possible. Although CocoaMySQL was a very impressive application to be 
written from scratch, anyone who as ever used it will know it had quite a few bugs and annoying behaviours, as well as some issues that caused crashes when dealing with large data sets. All of the developers including myself have a lot of great ideas for Sequel Pro and I truly believe it can 
become one of the great open source Mac applications, even if there is still a long way to go. Looking at the enhancement requests on the project's Google code <a href="http://code.google.com/p/sequel-pro/issues/list?can=2&q=type%3Aenhancement&colspec=ID+Type+Status+Priority+Milestone+Owner+Summary&cells=tiles">issue tracker</a> 
and the <a href="http://sequelpro.com/feature-requests.html">feature requests</a> page on the project's site will give you a clear idea of what's in store for future releases.</p>

<p>Speaking of releases, the first release candidate of version 0.9.4 was made <a href="http://www.sequelpro.com/blog/2009.03/sequel-pro-094-release-candidate-available/">available</a> on Friday and includes huge number of bug fixes related to stability and performace as well as a number of 
minor usability enhancements. This release goes a long way to providing the desired stability we are aiming for Sequel Pro. Work has already begun on 0.9.5 and initial plans are to focus on further updating the interface and so any <a href="http://sequelpro.com/contact-us.html">feedback</a> 
is welcome and greatly appreciated.</p>]]></description>
		</item>
	</channel>
</rss>
