<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>leeane's webdev blog</title>
	
	<link>http://blog.leeane.com</link>
	<description />
	<lastBuildDate>Wed, 15 Apr 2009 23:49:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=abc</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/LeeanesBlog" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="leeanesblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">LeeanesBlog</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Please digg, don’t open links in a new window!</title>
		<link>http://blog.leeane.com/2009/04/please-digg-dont-open-links-in-a-new-window/</link>
		<comments>http://blog.leeane.com/2009/04/please-digg-dont-open-links-in-a-new-window/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 10:00:02 +0000</pubDate>
		<dc:creator>leeane</dc:creator>
				<category><![CDATA[miscellaneous]]></category>

		<guid isPermaLink="false">http://blog.leeane.com/?p=221</guid>
		<description><![CDATA[Digg is a very popular link/news site which recently released a little something called the DiggBar. This DiggBar has caused a bit of controversy surrounding link juice and a whole bunch of SEO stuff which I won&#8217;t pretend to understand. I actually find the DiggBar useful as I am far more likely to &#8220;digg&#8221; something [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-222" title="digg-logo" src="http://blog.leeane.com/wp-content/uploads/2009/04/digg-logo.gif" alt="digg-logo" width="300" height="158" /><a href="http://www.digg.com" target="_blank">Digg</a> is a very popular link/news site which recently released a little something called the <a href="http://digg.com/tools/diggbar" target="_blank">DiggBar</a>. This DiggBar has caused a bit of controversy surrounding link juice and a whole bunch of SEO stuff which I won&#8217;t pretend to understand.</p>
<p>I actually find the DiggBar useful as I am far more likely to &#8220;digg&#8221; something when the DiggBar is sitting so handy right at the top of my browser window.</p>
<p>But.</p>
<p>I have one suggestion for the Digg Team. Currently, when I am viewing the &#8220;digg details&#8221; page of a news article (e.g. <a href="http://digg.com/apple/Apple_s_Tiny_iPod_Shuffle_Cost_a_Mere_28_of_Retail_Price">http://digg.com/apple/Apple_s_Tiny_iPod_Shuffle_Cost_a_Mere_28_of_Retail_Price</a> ) and I click on the link title, it opens up the actual article (albeit framed by the DiggBar) in a new window (i.e. they use target=&#8221;_blank&#8221; in the HTML code).</p>
<p>Why!?</p>
<p>Since I use the DiggBar, opening the actual article in a new browser window is redundant now as the DiggBar encapsulates everything I would need from Digg for the article (e.g. view comments, digg, bury etc). All it does is clutter up my Firefox tab bar with more tabs. I then have to close the original tab containing the &#8220;digg details&#8221; page and then switch back to the article framed by the DiggBar.</p>
<p>Please note, I am not suggesting to change opening links on the Digg homepage in new windows. This only applies to the h1 link on the &#8220;digg details&#8221; page &#8211; and only if the user has the DiggBar enabled (surely Digg can do a little smarts to code the h1 target attribute appopriately based on the user settings?!?!).</p>
<p>I know it&#8217;s a small thing, and I can easily put up with it. But would be nice to see this changed.</p>
<p><strong>Update:</strong><br />
I have been alerted that Digg has an option in the &#8220;My Profile&#8221; &gt; &#8220;Settings&#8221; section which says &#8220;Open external links in:&#8221;. There, you can choose to open links in a new window or the current window. Whilst this is useful, it is not quite what I am after as it means now all links (including ones on the homepage) open in the current window by default (unless I do the middle-click trick with Firefox). I really think Digg should treat the homepage links and &#8220;digg details&#8221; page differently.</p>
<p>If I am on the homepage, chances are I want to view many articles (therefore, open links in a new window).<br />
If I am on the &#8220;digg details&#8221; page, chances are I only want to view that one article (therefore, open in the same window)</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.leeane.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/LeeanesBlog?a=RSbpy2Fs1KM:C-vWPiVXVkM:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/LeeanesBlog?i=RSbpy2Fs1KM:C-vWPiVXVkM:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/LeeanesBlog/~4/RSbpy2Fs1KM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.leeane.com/2009/04/please-digg-dont-open-links-in-a-new-window/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hallelujah! Cross Browser Testing Made Easy (FINALLY!)</title>
		<link>http://blog.leeane.com/2009/02/hallelujah-cross-browser-testing-made-easy-finally/</link>
		<comments>http://blog.leeane.com/2009/02/hallelujah-cross-browser-testing-made-easy-finally/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 00:56:00 +0000</pubDate>
		<dc:creator>leeane</dc:creator>
				<category><![CDATA[software]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[web design]]></category>
		<category><![CDATA[xenocode]]></category>

		<guid isPermaLink="false">http://blog.leeane.com/?p=215</guid>
		<description><![CDATA[Earlier this week, a company called Xenocode released an awesome new free set of tools which will be an absolute god-send for web developers. The Xenocode Browser Sandbox provides 8 browsers for download. This includes IE6 which is the biggest pain of all for developers to test. You have two options to run the browsers [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.xenocode.com/browsers/"><img class="alignright size-full wp-image-216" title="ie6" src="http://blog.leeane.com/wp-content/uploads/2009/02/ie6.png" alt="ie6" width="276" height="222" /></a>Earlier this week, a company called <a href="http://www.xenocode.com">Xenocode</a> released an awesome new free set of tools which will be an absolute god-send for web developers.</p>
<p>The <strong><a href="http://www.xenocode.com/browsers/">Xenocode Browser Sandbox</a> </strong>provides 8 browsers for download. This includes IE6 which is the biggest pain of all for developers to test.</p>
<p>You have two options to run the browsers &#8211; download a &#8220;ClickStart&#8221; plugin and run the browsers as a &#8220;plugin&#8221; or download the standalone executable (.exe) file.</p>
<p>Personally, I was unable to get the &#8220;ClickStart&#8221; plugin to work at all &#8211; I tried installing it through Firefox and IE7 but nothing would happen when I tried to then run the browsers.</p>
<p>However, downloading the standalone executables works flawlessly. This is my preferred way of running them anyway &#8211; very easy to use. Once you have downloaded the exe file, double-click the executable and the relevant browser will load up as a normal application. From there, you can do anything you normally would in a browser.</p>
<p><strong>This is incredibly handy for cross browser development testing. </strong></p>
<p>So is there room for improvement? Yes, at the moment they work only on a Windows operating environment. I have read the company is not far away from releasing the downloads for a Mac environment. This would be insanely awesome &#8211; to run IE6 without having to do any Windows VMWare installations!</p>
<p><a href="http://www.xenocode.com/browsers/">Check it out</a> (at your own risk of course). As with any .exe file on the Internet, it is up to you to determine if you are willing to run it! I have read that people with Office 2007 installations have conflicts with the IE browsers downloaded from Xenocode &#8211; so best to hold off until that bug is fixed if you are reliant on your Office 2007 installation.</p>
<p>You can follow the company for updates on <a href="http://twitter.com/xenocode">twitter</a> or on their <a href="http://www.xenocode.com/Community/Forums/Forum.aspx?mode=singleForum&amp;forum=d2fe9f13-4423-437b-8cf2-c79f70d6c8bd">forums</a>.</p>
<p>Leeane</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.leeane.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/LeeanesBlog?a=GmAfr6yXXPQ:Jqi-VK3FUxQ:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/LeeanesBlog?i=GmAfr6yXXPQ:Jqi-VK3FUxQ:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/LeeanesBlog/~4/GmAfr6yXXPQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.leeane.com/2009/02/hallelujah-cross-browser-testing-made-easy-finally/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Statuso Goes Live</title>
		<link>http://blog.leeane.com/2009/02/statuso-goes-live/</link>
		<comments>http://blog.leeane.com/2009/02/statuso-goes-live/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 11:47:43 +0000</pubDate>
		<dc:creator>leeane</dc:creator>
				<category><![CDATA[apple]]></category>
		<category><![CDATA[reviews]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[statuso]]></category>

		<guid isPermaLink="false">http://blog.leeane.com/?p=210</guid>
		<description><![CDATA[The iPhone application which I have been collaborating on over the past 2 months has finally gone live onto the iTunes App Store. It&#8217;s called Statuso and this is exciting times! You can grab it from here if your interested. I have collaborated with Jeff from England on this &#8211; he did most of the [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-medium wp-image-211" title="iphone_screenshot" src="http://blog.leeane.com/wp-content/uploads/2009/02/iphone_screenshot-167x300.png" alt="iphone_screenshot" width="167" height="300" />The iPhone application <a href="http://blog.leeane.com/2008/12/simple-iphone-app-idea-for-a-bored-developer/">which I have been collaborating</a> on over the past 2 months has finally gone live onto the iTunes App Store. It&#8217;s called <a href="http://www.statuso.com">Statuso</a> and this is exciting times!</p>
<p>You can grab it from <a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=304227078&amp;mt=8">here</a> if your interested.</p>
<p>I have collaborated with Jeff from England on this &#8211; he did most of the hard work in actually developing the app, whilst I did design/logic and website stuff mostly. We submitted the app to Apple about 2 weeks ago and after a nervous wait it was made live today.</p>
<p>Of course, I have been spamming it to as many blog and iPhone related websites as possible. And also asking everyone I know with an iPhone to check it out!</p>
<p>I don&#8217;t think this app is going to make us rich &#8211; but it has been a great learning experience and also brings a huge sense of accomplishment to actually have something out there in the world which we created from scratch ourselves. We do not have any sales data just yet, but if theres anything interesting I will be sure to share it with y&#8217;all <img src='http://blog.leeane.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>What&#8217;s next? Well maybe there will be another app (a game to be more precise) but for now we want to improve <a href="http://www.statuso.com">Statuso</a> by adding more support for websites (and maybe a few features here and there).</p>
<p>Leeane</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.leeane.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/LeeanesBlog?a=tLLJp0WU1g4:Lumf6YdVYTY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/LeeanesBlog?i=tLLJp0WU1g4:Lumf6YdVYTY:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/LeeanesBlog/~4/tLLJp0WU1g4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.leeane.com/2009/02/statuso-goes-live/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducing: iconPot.com</title>
		<link>http://blog.leeane.com/2009/02/introducing-iconpotcom/</link>
		<comments>http://blog.leeane.com/2009/02/introducing-iconpotcom/#comments</comments>
		<pubDate>Sun, 15 Feb 2009 01:55:48 +0000</pubDate>
		<dc:creator>leeane</dc:creator>
				<category><![CDATA[miscellaneous]]></category>
		<category><![CDATA[web 2.0]]></category>
		<category><![CDATA[web design]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[iconpot]]></category>
		<category><![CDATA[icons]]></category>
		<category><![CDATA[web 2.0. web design]]></category>

		<guid isPermaLink="false">http://blog.leeane.com/?p=204</guid>
		<description><![CDATA[In one of my previous posts I hinted at a weekend project with the hint of : &#8220;snoci&#8221;. Those smarty-pants out there would have realized that it is the word &#8220;icons&#8221; spelt backwards. The site didn&#8217;t take very long to do, and I actually managed to finsih it from scratch within about 4 hours. From [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-208" title="logo1" src="http://blog.leeane.com/wp-content/uploads/2009/02/logo1.png" alt="logo1" width="253" height="135" />In one of my previous posts I hinted at a weekend project with the hint of : &#8220;snoci&#8221;. Those smarty-pants out there would have realized that it is the word &#8220;icons&#8221; spelt backwards.</p>
<p>The site didn&#8217;t take very long to do, and I actually managed to finsih it from scratch within about 4 hours. From thinking of a domain name, design and content right through to spamming it to as many sites as possible. <img src='http://blog.leeane.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Here&#8217;s the blurb:</p>
<blockquote><p>The aim of this site is simple. We list a whole bunch of icons which are all great to use for your web development projects. But we are different to other icon-related websites because <strong>we only list icons which you can use for free on personal AND commercial projects AND without having to provide back-links/credit to the author</strong>. These types of icons can be tough to find, so here is a while list for your convenience!</p></blockquote>
<p>So please visit, bookmark, suggest etc.</p>
<p>Link: <a href="http://www.iconpot.com">http://www.iconPot.com</a></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.leeane.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/LeeanesBlog?a=_QY7-RVZZc8:0sVoI2V6luA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/LeeanesBlog?i=_QY7-RVZZc8:0sVoI2V6luA:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/LeeanesBlog/~4/_QY7-RVZZc8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.leeane.com/2009/02/introducing-iconpotcom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sitepoints Massive Fundraiser</title>
		<link>http://blog.leeane.com/2009/02/sitepoints-massive-fundraiser/</link>
		<comments>http://blog.leeane.com/2009/02/sitepoints-massive-fundraiser/#comments</comments>
		<pubDate>Sat, 14 Feb 2009 07:05:51 +0000</pubDate>
		<dc:creator>leeane</dc:creator>
				<category><![CDATA[miscellaneous]]></category>
		<category><![CDATA[bushfires]]></category>
		<category><![CDATA[sitepoint]]></category>

		<guid isPermaLink="false">http://blog.leeane.com/?p=201</guid>
		<description><![CDATA[Sitepoint is a site I visit fairly regularly to get some industry news etc. They are based in Melbourne, Australia and did a massive fundraiser in response to the tragic Victoria Bush fires which have ravaged 700+ home and killed up to 300 people. The offer was to buy any 5 of their books for [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.sitepoint.com">Sitepoint</a> is a site I visit fairly regularly to get some industry news etc. They are based in Melbourne, Australia and did a massive fundraiser in response to the tragic Victoria Bush fires which have ravaged 700+ home and killed up to 300 people.</p>
<p>The offer was to buy any 5 of their books for just $29.95 and ALL sale proceeds (i.e. not just profits) would go to the Red Cross Bushfire appeal. That is a massive saving for anyone interested in PHP, SQL, Javascript, AJAX etc. Their books are very informative and definitely some good reference material for people interested in web development.</p>
<p>I was really pleased to hear that they have smashed their original target of $50k and it is looking like they have raised in excess of $200k. That is a huge figure for a website to have single handedly raised. This will all go towards the $80+ million which has been raised by Red Cross through other avenues. Let&#8217;s hope it goes to the people and communities that need it the most.</p>
<p>I know I am a bit late in blogging about this since the offer has closed down now &#8211; but there is talk they might extend the offer soon. The reason the offer was closed was because they were threatened with huge fines by Consumer Affairs because they hadn&#8217;t registered appropriately with the Government as a fundraising entity. Damn bureaucrats!</p>
<p>Kudos to sitepoint &#8211; a lot of respect going your way.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.leeane.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/LeeanesBlog?a=JwsdHKv_2Co:LQy78-9ha5Q:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/LeeanesBlog?i=JwsdHKv_2Co:LQy78-9ha5Q:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/LeeanesBlog/~4/JwsdHKv_2Co" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.leeane.com/2009/02/sitepoints-massive-fundraiser/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Facebook photos and break-ups</title>
		<link>http://blog.leeane.com/2009/02/facebook-photos-and-break-ups/</link>
		<comments>http://blog.leeane.com/2009/02/facebook-photos-and-break-ups/#comments</comments>
		<pubDate>Sat, 14 Feb 2009 06:51:38 +0000</pubDate>
		<dc:creator>leeane</dc:creator>
				<category><![CDATA[miscellaneous]]></category>
		<category><![CDATA[facebook]]></category>

		<guid isPermaLink="false">http://blog.leeane.com/?p=197</guid>
		<description><![CDATA[This is just something I am interested in, not for personal reasons at all. I have seen some of my friends go through break-ups recently and have wondered what the best way to handle this is. So you are in a relationship with someone and during that time you get lots of photos on facebook [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-medium wp-image-198" title="975584_27295398" src="http://blog.leeane.com/wp-content/uploads/2009/02/975584_27295398-300x198.jpg" alt="975584_27295398" width="300" height="198" />This is just something I am interested in, not for personal reasons at all. I have seen some of my friends go through break-ups recently and have wondered what the best way to handle this is.</p>
<p>So you are in a relationship with someone and during that time you get lots of photos on facebook with you and your partner tagged in them. In loving embraces etc etc.</p>
<p>Then you break up.</p>
<p>Do you remove or un-tag yourself from those photos?</p>
<p>Is  it awkward to know that your next girlfriend/boyfriend-to-be is going to see all those photos of you seemingly totally in love with someone else? And also, is it painful to have such easy access to see all those photos yourself and re-surface all those possibly painful memories?</p>
<p>Pre-facebook days, you would have taken all the photos of you and your partner out of their frames and put them in a shoebox or something. So that they are hidden from future partners, and hidden from your tender heart.</p>
<p>What did you do in this situation? Or what <strong>would</strong> you do?</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.leeane.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/LeeanesBlog?a=QgJMdO3KANo:2Hu47-khh_s:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/LeeanesBlog?i=QgJMdO3KANo:2Hu47-khh_s:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/LeeanesBlog/~4/QgJMdO3KANo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.leeane.com/2009/02/facebook-photos-and-break-ups/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What are you doing?</title>
		<link>http://blog.leeane.com/2009/02/what-are-you-doing/</link>
		<comments>http://blog.leeane.com/2009/02/what-are-you-doing/#comments</comments>
		<pubDate>Sat, 14 Feb 2009 06:34:12 +0000</pubDate>
		<dc:creator>leeane</dc:creator>
				<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[miscellaneous]]></category>
		<category><![CDATA[web design]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[statuso]]></category>
		<category><![CDATA[threadler]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://blog.leeane.com/?p=193</guid>
		<description><![CDATA[I have been keeping busy with a few things lately. The iPhone application is finished and is currently awaiting approval on the Apple App Store (see www.statuso.com). It has been a great learning experience, especially collaborating with a great iPhone application developer from England. Threadler is progressing, albeit very slowly. Work on it is very [...]]]></description>
			<content:encoded><![CDATA[<p>I have been keeping busy with a few things lately. The iPhone application is finished and is currently awaiting approval on the Apple App Store (see <a href="http://www.statuso.com">www.statuso.com</a>). It has been a great learning experience, especially collaborating with a great iPhone application developer from England.</p>
<p><a href="http://www.threadler.com">Threadler</a> is progressing, albeit very slowly. Work on it is very sporadic unfortunately, but I am liking how much I am learning with it. I have finished the installer process and am now working on the admin interface (roles and database structure etc). No doubt I will go back and improve things as I keep picking up lots of tips from the <a href="http://codeigniter.com/forums/">CodeIgniter</a> forums.</p>
<p>I also have a bit of a weekend project which I will be starting .. this weekend. It should be pretty simple but it will likely take me more than just a weekend due to other commitments. But,  I will give you a clue as to what it is &#8211; &#8220;snoci&#8221;.<br />
Stay tuned, should have something to showcase soonish.</p>
<p> <img src='http://blog.leeane.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.leeane.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/LeeanesBlog?a=Zgt2rV2OQtg:3A8-1yCrlWo:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/LeeanesBlog?i=Zgt2rV2OQtg:3A8-1yCrlWo:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/LeeanesBlog/~4/Zgt2rV2OQtg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.leeane.com/2009/02/what-are-you-doing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Free Logo’s For All</title>
		<link>http://blog.leeane.com/2009/01/free-logos-for-all/</link>
		<comments>http://blog.leeane.com/2009/01/free-logos-for-all/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 11:34:36 +0000</pubDate>
		<dc:creator>leeane</dc:creator>
				<category><![CDATA[web design]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[logo]]></category>

		<guid isPermaLink="false">http://blog.leeane.com/?p=182</guid>
		<description><![CDATA[I came across a site which might come in handy one day: Logo Instant. It appears to be a fairly new site, but the premise is simple: High quality logos for 100% totally free. Download the PSD or Illustrator file and do what you want with them. I know there&#8217;s a few sites like this, [...]]]></description>
			<content:encoded><![CDATA[<p>I came across a site which might come in handy one day: <a href="http://www.logoinstant.com/">Logo Instant</a>.</p>
<p>It appears to be a fairly new site, but the premise is simple: High quality logos for 100% totally free. Download the PSD or Illustrator file and do what you want with them.</p>
<p>I know there&#8217;s a few sites like this, but what sets Logo Instant apart is the logos are extremely high quality. You can tell the designer has put a lot of effort into each of them. Which almost makes me guilty using one of their designs&#8230;. almost.</p>
<p>I haven&#8217;t used any of their logos yet, but I will definitely keep it in mind if a project comes up soon which requires a quick and nasty logo (e.g. a site for me or a friend). Obviously you wouldn&#8217;t want to be using these logo&#8217;s for a professional organisation as it wont be unique.</p>
<p>Here are a few samples to whet the appetite:</p>
<p style="text-align: center;"><a href="http://www.logoinstant.com/2008/12/monkeyrule/"><img class="size-medium wp-image-183 aligncenter" title="monkeyrule-493x328" src="http://blog.leeane.com/wp-content/uploads/2009/01/monkeyrule-493x328-300x199.jpg" alt="monkeyrule-493x328" width="300" height="199" /></a></p>
<p style="text-align: center;"><a href="http://www.logoinstant.com/2009/01/lazeefish/"><img class="size-medium wp-image-184 aligncenter" title="lazeefish-493x328" src="http://blog.leeane.com/wp-content/uploads/2009/01/lazeefish-493x328-300x199.jpg" alt="lazeefish-493x328" width="300" height="199" /></a></p>
<p style="text-align: center;"><a href="http://www.logoinstant.com/2009/01/good-waves/"><img class="size-medium wp-image-185 aligncenter" title="goodwaves-493x328" src="http://blog.leeane.com/wp-content/uploads/2009/01/goodwaves-493x328-300x199.jpg" alt="goodwaves-493x328" width="300" height="199" /></a></p>
<p style="text-align: center;"><a href="http://www.logoinstant.com/2008/12/magnificent/"><img class="size-medium wp-image-186 aligncenter" title="magnificent-493x328" src="http://blog.leeane.com/wp-content/uploads/2009/01/magnificent-493x328-300x199.jpg" alt="magnificent-493x328" width="300" height="199" /></a></p>
<p>Hey considering they are free, they aren&#8217;t too bad!</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.leeane.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/LeeanesBlog?a=tQXglsLio3Q:1b5WTYnEj_w:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/LeeanesBlog?i=tQXglsLio3Q:1b5WTYnEj_w:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/LeeanesBlog/~4/tQXglsLio3Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.leeane.com/2009/01/free-logos-for-all/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Plugin Architecture for CodeIgniter</title>
		<link>http://blog.leeane.com/2009/01/plugin-architecture-for-codeigniter/</link>
		<comments>http://blog.leeane.com/2009/01/plugin-architecture-for-codeigniter/#comments</comments>
		<pubDate>Sat, 03 Jan 2009 14:52:57 +0000</pubDate>
		<dc:creator>leeane</dc:creator>
				<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[threadler]]></category>

		<guid isPermaLink="false">http://blog.leeane.com/?p=167</guid>
		<description><![CDATA[I have finally started development of Threadler &#8211; my uber new discussion forum system! I have stalled a lot on this project mainly because I couldn&#8217;t decide which framework (if any) to use for development. I have been using CodeIgniter for the past 2 or 3 years but I was tempted by Kohana (a CI [...]]]></description>
			<content:encoded><![CDATA[<p>I have finally started development of <a href="http://www.threadler.com">Threadler</a> &#8211; my uber new discussion forum system! I have stalled a lot on this project mainly because I couldn&#8217;t decide which framework (if any) to use for development. I have been using <a href="http://codeigniter.com">CodeIgniter</a> for the past 2 or 3 years but I was tempted by <a href="http://kohanaphp.com">Kohana</a> (a CI spin-off) and the prestige of building my own framework.</p>
<p>But in the end, I settled with CodeIgniter as I am pretty sure (for now) that I can make it do everything that I want it to.</p>
<p>So the first stumbling block was building the software to allow the use of plugins (a.k.a modules, extensions or add-ons depending on your favourite buzz word). Plugins will be used to extend the functionality of Threadler. For example, the bare-bones installation will not have Private Messaging installed, instead you can add this as a pre-built module and voila!</p>
<p>My plugins architecture must cater for:</p>
<ul>
<li>Hooks/events/triggers to add specified code into the existing Threadler code base</li>
<li>All new pages (made up of controllers, models and views) which the new module may need</li>
</ul>
<p>For example, a Private Messaging module may use a hook to add in the &#8220;Private Message&#8221; link within the normal forum display. But then it also requires new pages to display the form required to send/receive private messages.</p>
<p>Anyway, here is what I have come up with so far, remember it is still a  work in progress. I have basically used a combination of the elements below:</p>
<ul>
<li>The hooks/triggers/events concept from <a href="http://www.68kb.com">68kb project</a></li>
<li>The modular development concept from the <a href="http://wiredesignz.co.nz/">Modular Extensions HMVC </a>CI plugin</li>
</ul>
<p><span style="color: #993300;"><strong>Disclaimer: The code below is proof of concept stuff only! I have not fully tested or tried to extend this to any degree. Also, I have not yet implemented the administration section to activate/deactivate a module &#8211; this will be another blog post.</strong></span></p>
<p><span style="color: #993300;"><strong><br />
</strong></span></p>
<h2>Module Requirements</h2>
<p>For it all to work, the end result is that modules must have the following things:</p>
<ul>
<li>Be contained within a folder within /system/application/modules/ (e.g. /system/application/modules/private_messaging/)</li>
<li>Should contain:
<ul>
<li>module_info.php file &#8211; contains information about the module (e.g. author, name of module etc)</li>
<li>activate.php (optional) &#8211; contains code which is run when the module is activated in an administration section (e.g. sql statements to create private messaging tables)</li>
<li>deactivate.php (optional) &#8211; contains code which is run when the module is deactivated</li>
<li>events.php (optional) &#8211; registers which triggers/hooks the module requires</li>
<li>controllers (optional) &#8211; used if the module requires separate files (as per a normal CI Controller). All controllers must extend the Modules_Controller (see later for reasoning).</li>
<li>views (optional) &#8211; used if the module requires separate view files (as per normal CI View files)</li>
<li>models (optional) &#8211; used if the module requires separate model files (as per normal CI Model files)</li>
</ul>
</li>
</ul>
<h2>Module Example Code</h2>
<p>Here is a very basic test module which can be found in /system/application/modules/test/. This module does not require any activate.php or deactivate.php file because it pretty much does nothing except echo out some wonderful text.</p>
<p>The module_info file:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'module'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;test&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'module'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'displayname'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Test Module&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'module'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'description'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Module which does very little'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'module'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'version'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;1.0.0&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'module'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'author'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Leeane&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'module'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'homepage'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://blog.leeane.com&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>The events file:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> test_events
<span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">function</span> test_events<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$threadler_events</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$threadler_events</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">register</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'testing'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'my_test'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
		<span style="color: #000088;">$threadler_events</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">register</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'testing'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'my_test2'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">function</span> my_test<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'This is a test of an event trigger&lt;br /&gt;'</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">function</span> my_test2<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'This is yet another test of an event trigger&lt;br /&gt;'</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>The example controller (accessible by http://mysite.com/test/):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> Test <span style="color: #000000; font-weight: bold;">extends</span> Modules_Controller <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">function</span> Test<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		parent<span style="color: #339933;">::</span><span style="color: #004000;">Modules_Controller</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">function</span> index<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">view</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'welcome_message'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>The example view file:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">&lt;html&gt;
&lt;head&gt;&lt;title&gt;Welcome to CodeIgniter&lt;/title&gt;&lt;/head&gt;
&lt;h1&gt;Testing the Modules thingo!&lt;/h1&gt;
Now lets test the output of a trigger/event/hook thingo! 
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">threadler_events</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">trigger</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'testing'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>OK thats enough of the module itself, onto the library code.</p>
<h2>Libraries</h2>
<p>First up, the events and hooks library (this is largely taken from the 68Kb project &#8211; I encourage you to look at the <a href="http://code.google.com/p/68kb/source/browse/#svn/trunk/upload/sources/libraries">relevant project page at Google Code</a>):</p>
<p>/system/application/libraries/Threadler_events.php</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>  
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">defined</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'BASEPATH'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #990000;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'No direct script access allowed'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009933; font-style: italic;">/**
 * Threadler Events
 *
 * This is largely based on the Kb_events class authored by Eric Barnes (68Kb).
 *
 * @author		Eric Barnes
 * @link		http://www.68kb.com/hooks.html
 */</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Threadler_events
<span style="color: #009900;">&#123;</span>
	<span style="color: #009933; font-style: italic;">/**
	 * @var array Array of registered hooks and their listners
	 */</span>
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$listeners</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Threadler events
	 * 
	 * Allow users to extend the system.
	 * Idea from Iono
	 */</span>
	<span style="color: #000000; font-weight: bold;">function</span> threadler_events<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$data</span><span style="color: #339933;">=</span><span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$CI</span> <span style="color: #339933;">=&amp;</span> get_instance<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">//if($CI-&gt;db-&gt;table_exists('modules'))</span>
		<span style="color: #666666; font-style: italic;">//{</span>
		<span style="color: #666666; font-style: italic;">//	$CI-&gt;db-&gt;from('modules');</span>
		<span style="color: #666666; font-style: italic;">//	$CI-&gt;db-&gt;where('active', '1'); </span>
		<span style="color: #666666; font-style: italic;">//	$query = $CI-&gt;db-&gt;get();</span>
		<span style="color: #666666; font-style: italic;">//	foreach ($query-&gt;result() as $row)</span>
		<span style="color: #666666; font-style: italic;">//	{</span>
				<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">@</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span>APPPATH <span style="color: #339933;">.</span><span style="color: #0000ff;">'modules/test/events.php'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
				<span style="color: #009900;">&#123;</span>
					<span style="color: #b1b100;">include_once</span><span style="color: #009900;">&#40;</span>APPPATH <span style="color: #339933;">.</span><span style="color: #0000ff;">'modules/test/events.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #000088;">$class</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'test_events'</span><span style="color: #339933;">;</span>
					<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">class_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$class</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> 
					<span style="color: #009900;">&#123;</span>
						<span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000088;">$class</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #009900;">&#125;</span>
				<span style="color: #009900;">&#125;</span>
		<span style="color: #666666; font-style: italic;">//	}</span>
		<span style="color: #666666; font-style: italic;">//}</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Register a listner for a given hook
	 *
	 * @param string $hook
	 * @param object $class_reference
	 * @param string $method
	 */</span>
	<span style="color: #000000; font-weight: bold;">function</span> register<span style="color: #009900;">&#40;</span><span style="color: #000088;">$hook</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$class_reference</span><span style="color: #339933;">,</span> <span style="color: #000088;">$method</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// Specifies a key so we can't define the same handler more than once</span>
		<span style="color: #000088;">$key</span> <span style="color: #339933;">=</span> <span style="color: #990000;">get_class</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$class_reference</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'-&gt;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$method</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">listeners</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$hook</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$class_reference</span><span style="color: #339933;">,</span> <span style="color: #000088;">$method</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Trigger an event
	 *
	 * @param string $hook
	 * @param mixed $data
	 */</span>
	<span style="color: #000000; font-weight: bold;">function</span> trigger<span style="color: #009900;">&#40;</span><span style="color: #000088;">$hook</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #339933;">=</span><span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$call_it</span><span style="color: #339933;">=</span><span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// Are there any hooks?</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">listeners</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$hook</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">listeners</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$hook</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">listeners</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$hook</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// Loop</span>
			<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">listeners</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$hook</span><span style="color: #009900;">&#93;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$listener</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				<span style="color: #666666; font-style: italic;">// Set up variables</span>
				<span style="color: #000088;">$class</span> <span style="color: #339933;">=&amp;</span> <span style="color: #000088;">$listener</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
				<span style="color: #000088;">$method</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$listener</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
				<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">method_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$class</span><span style="color: #339933;">,</span><span style="color: #000088;">$method</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
				<span style="color: #009900;">&#123;</span>
					<span style="color: #666666; font-style: italic;">// Call method dynamically</span>
					<span style="color: #000088;">$call_it</span><span style="color: #339933;">.=</span><span style="color: #000088;">$class</span><span style="color: #339933;">-&gt;</span><span style="color: #000088;">$method</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$call_it</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Please note, you would want to uncomment out the database calls in the file above &#8211; I took them out just to get this proof of concept working. I have hard-coded this to work with the &#8220;test&#8221; module only for now. Please also note that for this all to work you will need to autoload the &#8220;threadler_events&#8221; library by adding $this->load->library(&#8216;threadler_events&#8217;); in your /system/application/config.php file.</p>
<p>/system/application/libraries/Threadler_hooks.php</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">defined</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'BASEPATH'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #990000;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'No direct script access allowed'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * Threadler Hooks
 *
 * This is largely based on the Kb_hooks class authored by Eric Barnes (68Kb).
 *
 * @author		Eric Barnes
 * @link		http://www.68kb.com/hooks.html
 */</span>
	<span style="color: #000000; font-weight: bold;">class</span> Threadler_hooks 
	<span style="color: #009900;">&#123;</span>
		<span style="color: #009933; font-style: italic;">/**
		* @var array All User modules
		* @access private
		*/</span>
		<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$user_modules</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$listeners</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">function</span> Threadler_hooks<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// ------------------------------------------------------------------------</span>
&nbsp;
		<span style="color: #009933; font-style: italic;">/**
		 * Test if a function exists
		 *
		 * @access	private
		 * @param	string	the function name
		 * @return	bool
		 */</span>
		<span style="color: #000000; font-weight: bold;">function</span> _test_exists<span style="color: #009900;">&#40;</span><span style="color: #000088;">$function_name</span><span style="color: #009900;">&#41;</span> 
		<span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #990000;">function_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$function_name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// ------------------------------------------------------------------------</span>
&nbsp;
		<span style="color: #009933; font-style: italic;">/**
		 * Invoke the hook
		 *
		 * This function actually invokes the hook. 
		 * It is used so two modules can share one hook.
		 *
		 * @access	private
		 * @param	string	the function name
		 * @param	array	the function params
		 * @return	bool
		 */</span>
		<span style="color: #000000; font-weight: bold;">function</span> _invoke_hook<span style="color: #009900;">&#40;</span><span style="color: #000088;">$function_name</span><span style="color: #339933;">,</span> <span style="color: #000088;">$params</span><span style="color: #009900;">&#41;</span> 
		<span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #990000;">call_user_func</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$function_name</span><span style="color: #339933;">,</span> <span style="color: #000088;">$params</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// ------------------------------------------------------------------------</span>
&nbsp;
		<span style="color: #009933; font-style: italic;">/**
		 * Call the hook
		 *
		 * Throughout the script when a certain action 
		 * occurs it will call this hook.
		 *
		 * @access	public
		 * @param	string	the function name
		 * @param	array	the function params
		 * @return	bool
		 */</span>
	 	<span style="color: #000000; font-weight: bold;">function</span> call_hook<span style="color: #009900;">&#40;</span><span style="color: #000088;">$function</span><span style="color: #339933;">,</span> <span style="color: #000088;">$params</span><span style="color: #339933;">=</span><span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// Find all the user modules</span>
			<span style="color: #000088;">$data</span><span style="color: #339933;">=</span><span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$CI</span> <span style="color: #339933;">=&amp;</span> get_instance<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$CI</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">helper</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'url'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">//$CI-&gt;db-&gt;from('modules');</span>
			<span style="color: #666666; font-style: italic;">//$CI-&gt;db-&gt;where('active', '1'); </span>
			<span style="color: #666666; font-style: italic;">//$query = $CI-&gt;db-&gt;get();</span>
			<span style="color: #666666; font-style: italic;">//echo $CI-&gt;db-&gt;last_query();</span>
			<span style="color: #666666; font-style: italic;">//foreach ($query-&gt;result() as $row)</span>
			<span style="color: #666666; font-style: italic;">//{</span>
				<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">@</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span>APPPATH <span style="color: #339933;">.</span><span style="color: #0000ff;">'modules/test/hooks.php'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
				<span style="color: #009900;">&#123;</span>
					<span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span>APPPATH <span style="color: #339933;">.</span><span style="color: #0000ff;">'modules/test/hooks.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
				<span style="color: #000088;">$function_name</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'test_'</span><span style="color: #339933;">.</span><span style="color: #000088;">$function</span><span style="color: #339933;">;</span>
				<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_test_exists<span style="color: #009900;">&#40;</span><span style="color: #000088;">$function_name</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> 
				<span style="color: #009900;">&#123;</span>
					<span style="color: #000088;">$data</span><span style="color: #339933;">.=</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_invoke_hook<span style="color: #009900;">&#40;</span><span style="color: #000088;">$function_name</span><span style="color: #339933;">,</span> <span style="color: #000088;">$params</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
			<span style="color: #666666; font-style: italic;">//}</span>
 			<span style="color: #b1b100;">return</span> <span style="color: #000088;">$data</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Please note, you would want to uncomment out the database calls in the file above &#8211; I took them out just to get this proof of concept working. I have hard-coded this to work with the &#8220;test&#8221; module only for now.</p>
<p>Next you want to install the Modular Extensions HMVC plugin &#8211; basically you just need to drop the Modules.php, Controller.php and MY_Router.php files into the /system/application/libraries/ folder and you&#8217;re all done.</p>
<p>Lastly, I do not want people to be able to access a modules controllers directly unless the module has been activated in the administration section. Thankfully, the hooks/events will not trigger unless the module is activated (thanks to 68Kb project&#8217;s code, although those relevant bits were commented out in this example). But people will be able to directly access http://mysite.com/test/ and view the test controller which is probably not a good idea! </p>
<p>So for this, we want to make a new Controller class which all modules must inherit from.<br />
I.e. class MyNiftyModule extends Module_Controller {&#8230;}</p>
<p>The module can be tested for conformity to this rule at the point a module is added to the library of available modules on the threadler website &#8211; I haven&#8217;t got code for this yet. This new Module_Controller will be called before any module&#8217;s controller is run, and will check (thanks to a database call) if the relevant module is activated.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">defined</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'BASEPATH'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #990000;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'No direct access allowed'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009933; font-style: italic;">/**
 * Modules_Controller
 *
 *
 * Description:
 * This library is used in all modules for Threadler (via &quot;class ModuleName extends Modules_Controller {...}&quot;)
 * It checks if a given module is &quot;activated&quot; in the database before displaying any content.
 *
 * This is used to prevent anyone from directly accessing an unactivated modules' controllers
 *
 */</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Modules_Controller <span style="color: #000000; font-weight: bold;">extends</span> Controller <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">function</span> Modules_Controller<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		parent<span style="color: #339933;">::</span><span style="color: #004000;">Controller</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$CI</span> <span style="color: #339933;">=&amp;</span> get_instance<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">//grab modules name (this will be the folder under /threadler/modules/)</span>
		<span style="color: #000088;">$module_name</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$CI</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">uri</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">segment</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">//query the database to determine if the module is activated</span>
		<span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$CI</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SELECT 1 
								 FROM threadler_modules 
								 WHERE module_name = &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$CI</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">escape</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$module_name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;
								 AND enabled = 'yes'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$num_results</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$query</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">num_rows</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$num_results</span> <span style="color: #339933;">!=</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">//stop everything!</span>
			show_error<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Uh-oh! This module has not been activated in the threadler administration section.'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">else</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">//do nothing, allow the controller to load as per normal</span>
		<span style="color: #009900;">&#125;</span>		
	<span style="color: #009900;">&#125;</span>	
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>I am sure you can get the gist for the kind of SQL table you need for this to function properly.</p>
<h2>Testing</h2>
<p>When we go to http://mysite.com/test/, we get:</p>
<p><b>Testing the Modules thingo!</b><br />
Now lets test the output of a trigger/event/hook thingo!<br />
This is a test of an event trigger<br />
This is yet another test of an event trigger</p>
<h2>Conclusions</h2>
<p>It all seems to work fairly well so far. There&#8217;s obviously more work to do with actually activating the module in the admin section and maybe a priority setting for a modules hook etc but I am fairly happy with what I have so far (all be it a quick throw-together).</p>
<p>I am a bit new to plugins so if you see any issues with the architecture or code I have posted please let me know. I am interested to see how it could be improved.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.leeane.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/LeeanesBlog?a=q1v0eArr48g:NUEpKZcme-0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/LeeanesBlog?i=q1v0eArr48g:NUEpKZcme-0:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/LeeanesBlog/~4/q1v0eArr48g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.leeane.com/2009/01/plugin-architecture-for-codeigniter/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>10 of the Best Tools For Web Development on a Mac</title>
		<link>http://blog.leeane.com/2008/12/10-of-the-best-tools-for-web-development-on-a-mac/</link>
		<comments>http://blog.leeane.com/2008/12/10-of-the-best-tools-for-web-development-on-a-mac/#comments</comments>
		<pubDate>Sun, 14 Dec 2008 02:34:48 +0000</pubDate>
		<dc:creator>leeane</dc:creator>
				<category><![CDATA[apple]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[web design]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[macbook]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://blog.leeane.com/?p=142</guid>
		<description><![CDATA[Having only had my macbook for a couple of weeks, I am still very new to OSX and all the apps which are available. The primary reason I bought the lovely new macbook is for web development &#8211; specifically for PHP/MySQL sites which I develop. I spent a number of weeks both before and after [...]]]></description>
			<content:encoded><![CDATA[<p>Having only had my macbook for a couple of weeks, I am still very new to OSX and all the apps which are available. The primary reason I bought the lovely new macbook is for web development &#8211; specifically for PHP/MySQL sites which I develop.</p>
<p>I spent a number of weeks both before and after purchasing the macbook looking for the perfect web development environment for me. In this post I will outline what I am using and why, any pitfalls I have had and also alternative software which you might want to try out.</p>
<h2><strong>Apache/MySQL/PHP</strong></h2>
<p><img class="alignright size-full wp-image-152" title="screenshot_s1_3_en" src="http://blog.leeane.com/wp-content/uploads/2008/12/screenshot_s1_3_en.jpg" alt="screenshot_s1_3_en" width="220" height="160" />Probably no real suprises here, but I opted to go with MAMP (MacOSX, Apache, MySQL, PHP) as the tool to manage my web and database servers. It is incredibly easy to setup.</p>
<p>There are two versions, MAMP (free) and MAMP Pro (not free). MAMP Pro gives you access to setup and manage your virtual hosts as well as GUI access to other things you might want such as loading certain Apache modules. I tried out both, and honestly I have uninstalled MAMP Pro (and just kept the standard MAMP) as I found I was actually having issues where my Apache server would fail to start with MAMP Pro. I definitely do need access to edit virtual hosts but read on for my alternative program to do this.</p>
<p>MAMP allows you to choose the PHP version to use (4 or 5) as well as any caching engines or php accelerators. Stuff that any serious developer would appreciate having quick and easy access to. You can also easily change the ports which Apache and MySQL use to the defaults (80 and 3306). Definitely makes things a lot easier if you use the normal ports.</p>
<p><strong>Download</strong>: <a href="http://www.mamp.info/en/index.php">http://www.mamp.info/en/index.php</a><br />
<strong>Price</strong>: Free<br />
<strong>Alternatives</strong>: XAMPP (includes Perl), or do it all via the terminal yourself! See <a href="http://mymacinations.com/2007/10/28/apache-php-and-mysql-on-leopard/">http://mymacinations.com/2007/10/28/apache-php-and-mysql-on-leopard/</a> for more info.</p>
<h2><strong>Virtual Hosts</strong></h2>
<p><img class="alignright size-full wp-image-153" title="vh" src="http://blog.leeane.com/wp-content/uploads/2008/12/vh.png" alt="vh" width="134" height="139" />Since I didn&#8217;t want to be paying for MAMP Pro, I came across another free application which will let me manage my virtual hosts in a nice and easy GUI screen. It is called Virtual HostsX and once again is pretty simple to use. It automatically detects MAMP and prompts you if you want to update MAMP&#8217;s apache configuration files (yes). I believe it is limited to 3 active virutal host entries at any one time &#8211; but this shouldn&#8217;t pose to much of an issue for me. If you need more entries at any one time, hey its only $9 to buy and support the developer.</p>
<p>An important thing which new people to Virtual HostsX sometimes do not realise is that when installing the program, it automatically enables the &#8220;Web Sharing&#8221; option in your System Preferences &gt; Sharing screen. So make sure you go in there and un-tick the Web Sharing option &#8211; this will just cause all sorts of issues if you are using MAMP.</p>
<p>One pitfall I had with MAMP was a compatibility issue with Virtual HostsX application (the virtual hosts weren&#8217;t being picked up properly). After finding a thread on the same thing, it was recommended to use MAMP 1.7.1. For this reason, I actually had to downgrade from MAMP 1.7.2 to MAMP 1.7.1.</p>
<p><strong>Download</strong>: <a href="http://clickontyler.com/virtualhostx/">http://clickontyler.com/virtualhostx/</a><br />
<strong>Price</strong>: Free &#8211; $9 if you want more than 3 virutal host entries at any one time.<br />
<strong>Alternatives</strong>: MAMP Pro (I couldn&#8217;t get this to work though) or edit apache config files via terminal yourself.</p>
<h2>Code Editor</h2>
<p><img class="alignright size-full wp-image-154" title="coda" src="http://blog.leeane.com/wp-content/uploads/2008/12/coda.png" alt="coda" width="140" height="132" />Ohh mac people are spoiled for choices in this category! On my Windows machine I was a Dreamweaver user (hey it is decent and does the job). And although the Adobe CS4 suite was one of the first things I installed on my machine (yay for academic agreements) I wanted to try out a few of the mac editor apps which I kept on hearing so much about. More specifically, Coda and TextMate. After using both for a short while, I came to the conclusion that:</p>
<p>Coda &#8211; wins.</p>
<p>After watching the <a href="http://www.panic.com/coda/developer/">videos on the panic website</a>, everything just seemed to make sense. It seems to be very intuitive and so far I am really liking it. When first opening the application, I was quite underwhelmed as there didn&#8217;t seem to be many bells and whistles. But after watching the videos and playing around with it for an hours, I realised that all the bells and whistles (and more) are there, they just do not clutter the interface in a way that I am used to with something like Dreamweaver. Kudos to the developers &#8211; I think this really sets a new standard in code editors.</p>
<p><strong>Download</strong>: <a href="http://www.panic.com/coda/">http://www.panic.com/coda/</a><br />
<strong>Price</strong>: Demo available. $99 to purchase after demo expires.<br />
<strong>Alternatives</strong>: TextMate, Dreamweaver etc</p>
<h2>Database Manager</h2>
<p><img class="alignright size-full wp-image-155" title="screenshot-1" src="http://blog.leeane.com/wp-content/uploads/2008/12/screenshot-1.jpg" alt="screenshot-1" width="184" height="137" />I normally like to use a desktop-based tool to manage SQL databases. On Windows I have used SQLyog and the MYSQL Administrator package. The popular choice for this functionality on a Mac seems to be Sequel Pro (formally Cocoa MySQL). It certainly is more than adequate for most users and I am happy with it so far. The interface is pretty standard for these types of programs and I haven&#8217;t had any problems working out how to do something.</p>
<p>Important: If you are using MAMP, make sure you put the following into the &#8220;socket&#8221; field in Sequel Pro: &#8220;/applications/mamp/tmp/mysql/mysql.sock&#8221;. Otherwise, you wont be able to connect to the MySQL server!</p>
<p><strong>Download</strong>: <a href="http://www.mjmedia.com.au/sequel-pro.html">http://www.mjmedia.com.au/sequel-pro.html</a><br />
<strong>Price</strong>: Free<br />
<strong>Alternatives</strong>: phpMyAdmin (web-based), NaviCat, Aqua Data Studio etc</p>
<h2>Database Designer</h2>
<p><img class="alignright size-thumbnail wp-image-165" title="a-200" src="http://blog.leeane.com/wp-content/uploads/2008/12/a-200-150x150.png" alt="a-200" width="105" height="105" />Everyone loves a good database modeler &#8211; right? For your bigger projects you want to have a good tool to map out your tables, keys and relationships. Make sure everything looks about right before you dive into the deep end. I didn&#8217;t really look around all that much for software for this. I stumbled across a free tool called Power*Architect which looks to be a tool which will handle the job nicely.</p>
<p><strong>Download</strong>: <a href="http://www.sqlpower.ca/page/architect">http://www.sqlpower.ca/page/architect</a><br />
<strong>Price</strong>: Free<br />
<strong>Alternatives</strong>: SQLEditor</p>
<h2>FTP</h2>
<p><img class="alignright size-full wp-image-156" title="transmit" src="http://blog.leeane.com/wp-content/uploads/2008/12/transmit.png" alt="transmit" width="155" height="136" />Although I don&#8217;t have much need for FTP anymore (thanks to SVN) it is handy to have a good FTP program for the odd job here and there. There are a number of alternatives here, but the main contenders are CyberDuck (free) and Transmit (paid). I have to admit that I prefer Transmit&#8217;s interface (especially since I am using Coda which is by the same developers) but at the end of the day, CyberDuck is a fantastic free program which is fine for what I am actually using FTP for.</p>
<p><strong>Download</strong>: <a href="http://www.panic.com/transmit/">http://www.panic.com/transmit/</a><br />
<strong>Price</strong>: Demo available &#8211; $29.95 for full version.<br />
<strong>Alternatives</strong>: CyberDuck FTP</p>
<h2>SVN Tool</h2>
<p><img class="alignright size-medium wp-image-150" title="versions" src="http://blog.leeane.com/wp-content/uploads/2008/12/versions-300x253.png" alt="versions" width="180" height="152" />Some sort of code versioning is an absolute must for any serious developer. Once you make the jump into versioning you will never look back. There are a few options (cvs, git etc) but I choose to use subversion (svn) as there are plenty of tools out there to make it all very easy to integrate into your development process.</p>
<p>Coda has some built in svn integration, but since you cannot add comments to each revision with Coda I was on the lookout for something a bit more powerful. There are a number of options out there and for now I have settled on Versions.app which is a powerful (and pretty) tool to manage all your svn goodness. Whether or not I end up buying it after the demo runs out will depend on how I go over the next few weeks.</p>
<p><strong>Download</strong>: <a href="http://www.versionsapp.com">http://www.versionsapp.com</a><br />
<strong>Price</strong>: Demo available &#8211; $52 for full version.<br />
<strong>Alternatives</strong>: SmartSVN, SynchroSVN etc</p>
<h2>SVN Hosting</h2>
<p><img class="alignright size-full wp-image-160" title="assembla_logo" src="http://blog.leeane.com/wp-content/uploads/2008/12/assembla_logo.gif" alt="assembla_logo" width="130" height="50" />There are a few options when it comes to hosting &#8211; you can host it yourself or use a hosted solution. I have opted for a hosted solution although I am still tossing up between Dreamhost&#8217;s SVN option or using an application such as Assembla (which will include wiki, miletstones, trac etc). I like the idea of Assembla so will probably end up giving their free plan a go.</p>
<p><strong>Download</strong>: <a href="http://www.assembla.com">http://www.assembla.com</a><br />
<strong>Price</strong>: Free plan (200mb limit)<br />
<strong>Alternatives</strong>: Unfuddle, Google Code, Sourceforge or set it up yourself on your own server.</p>
<h2>Graphics</h2>
<p><img class="alignright size-full wp-image-158" title="adobephotoshopcs3" src="http://blog.leeane.com/wp-content/uploads/2008/12/adobephotoshopcs3.png" alt="adobephotoshopcs3" width="100" height="100" />I couldn&#8217;t go past Adobe PhotoShop and Adobe Illustrator for this. Seriously, if you have access to them for free you really need to consider using these tools. CS4 has some great improvements (tabbed windows ftw!) and I am still finding new features every time I use it. It truly is the industry standard for a reason.</p>
<p><strong>Download</strong>: <a href="http://adobe.com">http://adobe.com</a><br />
<strong>Price</strong>: Very expensive&#8230; unless you have access to free version (e.g. academic agreement etc)<br />
<strong>Alternatives</strong>: GIMP, Fireworks etc</p>
<h2>Browser</h2>
<p><img class="alignright size-full wp-image-159" title="firefox" src="http://blog.leeane.com/wp-content/uploads/2008/12/firefox.jpg" alt="firefox" width="140" height="132" />Everyone will have a favorite browser &#8211; and for me that is <a href="http://www.mozilla.com/en-US/">Firefox</a>. Combined with a few plugins such as <a href="https://addons.mozilla.org/en-US/firefox/addon/60">Web Developer Toolbar</a>, <a href="https://addons.mozilla.org/en-US/firefox/addon/271">ColorZilla</a>, <a href="https://addons.mozilla.org/en-US/firefox/addon/5369">YSlow</a> and <a href="http://users.skynet.be/mgueury/mozilla/download.html">HTML Validator </a>it is unbeatable in my opinion. But it doesn&#8217;t stop there as we need to check our websites in other browsers (Safari, Opera, IE6 and IE7 at a minimum).</p>
<p>Testing IE is the biggest pain of all on a mac. You can use VMware Fusion or Parallels to install Windows and test IE7. But then you cannot run native versions of IE6 and IE7 on Windows at the same time. Boo to Microsoft. So that means two installations of Windows which therefore means you need 4Gb of ram otherwise your development machine will be crawling.</p>
<p>I am still a bit undecided about all of this. I have installed <a href="http://www.kronenberg.org/ies4osx/">ies4osx</a> which at the moment only supports IE6 (despite the fact that the website says both IE6 and IE7). IE6 seems to work well enough so hopefully the developers can add in IE7 to the new version soon. I have been wanting to avoid installing Windows (via vmware fusion or parallels) as I do not want to slow my machine down just because I need to run IE6 and IE7. So for now I am just going to check rendering on my Windows desktop machine (with Multiple IE&#8217;s installed).</p>
<h2>Conclusion</h2>
<p>Now there is definitely room for improvement, and I will always be on the lookout for something better. If you have any great suggestions please let me know. I also haven&#8217;t really started using all of these together to any great degree just yet &#8211; the first task was just getting is all set up.</p>
<p>Maybe things will change in the future &#8211; but for now I am pretty darn happy with it all.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.leeane.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/LeeanesBlog?a=MzCsJWPPgo4:doUeeWZioq0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/LeeanesBlog?i=MzCsJWPPgo4:doUeeWZioq0:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/LeeanesBlog/~4/MzCsJWPPgo4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.leeane.com/2008/12/10-of-the-best-tools-for-web-development-on-a-mac/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss><!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
