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

<channel>
	<title>Wirestorm &#187; Development</title>
	<atom:link href="http://wirestorm.net/blog/category/development/feed/?category_name=development" rel="self" type="application/rss+xml" />
	<link>http://wirestorm.net/blog</link>
	<description>Ray Hilton&#039;s blog about interesting technology</description>
	<lastBuildDate>Mon, 12 Dec 2011 11:07:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2-bleeding</generator>
		<item>
		<title>Using Git to Deploy</title>
		<link>http://wirestorm.net/blog/2011/10/13/using-git-to-deploy/</link>
		<comments>http://wirestorm.net/blog/2011/10/13/using-git-to-deploy/#comments</comments>
		<pubDate>Thu, 13 Oct 2011 02:50:30 +0000</pubDate>
		<dc:creator>rayh</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://wirestorm.net/blog/?p=183</guid>
		<description><![CDATA[I&#8217;ve recently started using Git to deploy to my servers. Anyone who has used Heroku would be familiar with this technique and it feels kinda cool to be able to think of your different environments as just git remotes. I can&#8217;t vouch for the appropriateness of this technique in the general case, but I just [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve recently started using Git to deploy to my servers.  Anyone who has used Heroku would be familiar with this technique and it feels kinda cool to be able to think of your different environments as just git remotes.  I can&#8217;t vouch for the appropriateness of this technique in the general case, but I just wanted to make a note on what I&#8217;ve found to work for me.  Hopefully, others may find this useful.</p>
<p>So, I use GitHub as my main source code repository, but I set up a second repository on the server I want to deploy to, normally in my home directory.  First create an empty Git repo:</p>
<pre class="brush: bash">
$ git init --bar ~/git/my-repo.git
</pre>
<p>To trigger a deployment on a push, we define a post-receive hook in this new repository.  Hooks allow the you took invoke behaviour on a variety of git events, in this case we are interested in when the repository has successfully received a push.</p>
<pre class="brush: bash">
$ vi ~/git/my-repo.git/hooks/post-receive
</pre>
<p>This is just an example, but the contents of the post-receive hook might look like this for a rack/passenger based web application:</p>
<pre class="brush: bash">
#!/bin/bash

cd /var/ww/my-site
unset GIT_DIR
GIT_WORK_TREE=/var/ww/my-site git pull
GIT_WORK_TREE=/var/ww/my-site git reset --hard
GIT_WORK_TREE=/var/ww/my-site git submodule update -i
bundle install
touch tmp/restart.txt
</pre>
<p>Of course, this file can contain whatever you want, just make sure you set the executable bit on the file:</p>
<pre class="brush: bash">
$ chmod +x ~/git/my-repo.git/hooks/post-receive
</pre>
<p>All that remains is to push your local repository to the new git repo on your server:</p>
<pre class="brush: bash">
$ git remote add prod ray@my-server.com:~/git/my-repo.git
$ git push prod master
</pre>
<p>This is just a simple example, but because you are executing a script on the server, you can basically perform any functionality you like.  I don&#8217;t know whether this would be a good idea in a large-scale production environment, but the key here is to make the deployments as simple and easy as possible to encourage smaller and more regular changes.   Backing it with git enables a basic form of rollback, but anything that is not controlled by git, i.e. database schema state, will still need to be managed separately.</p>
]]></content:encoded>
			<wfw:commentRss>http://wirestorm.net/blog/2011/10/13/using-git-to-deploy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Control Xcode builds from Ruby</title>
		<link>http://wirestorm.net/blog/2011/10/12/control-xcode-builds-from-ruby/</link>
		<comments>http://wirestorm.net/blog/2011/10/12/control-xcode-builds-from-ruby/#comments</comments>
		<pubDate>Wed, 12 Oct 2011 05:13:49 +0000</pubDate>
		<dc:creator>rayh</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://wirestorm.net/blog/?p=156</guid>
		<description><![CDATA[Previously I had created an Xcode plugin for Hudson to allow you to configure and invoke builds directly. Although this worked for some cases, there are a few projects where the build process is more complex or non-standard enough to force me back to scripting things manually. Rather than update the plugin to try and [...]]]></description>
			<content:encoded><![CDATA[<p>Previously I had created an Xcode plugin for Hudson to allow you to configure and invoke builds directly.  Although this worked for some cases, there are a few projects where the build process is more complex or non-standard enough to force me back to scripting things manually.  Rather than update the plugin to try and cope with every esoteric use case, I decided to flip things around and simple create a ruby-wrapper for Xcode.  This allows me to take what i need and create custom Rakefiles to control the build process.  The aim of <a href="http://github.com/rayh/xcoder" title="xcoder on github">this gem</a> is provide an object model for navigating the project structure and be able to invoke some common types of modifications.  I aim to gradually add more functionality to this gem as I come across new use cases.</p>
<p>The source is available <a href="http://github.com/rayh/xcoder" title="xcoder on github">on github</a>, but it is available to install from ruby forge by using the command:</p>
<pre class="brush: bash">
$ gem install xcoder
</pre>
<p>A simple use-case would be to find the only project in a directory, update the project&#8217;s build number and then invoke a build:</p>
<pre class="brush: ruby">
# Find the first project in the current directory
project = Xcode.find_projects.first

# Find the target called "TargetName"
target = project.target(:TargetName)

# Find the configuration called "Debug"
config = config.config(:Debug)

# Update the build number
config.info_plist do |info|
    info.version = ENV['BUILD_NUMBER']
    info.save
end

# Clean the build for this target's configuration 
config.clean

# Build the target using this configuration
config.build

# Create an IPA for this target's configuration signed using the provided identity and embed the provided profile
config.package :sign => 'iPhone Distribution: Developer Name, :profile => 'Provisioning/ProfileToEmbed.mobileprovision'
</pre>
<p>It&#8217;s early days yet, but I plan on adding support for OCUnit => JUnit output mapping (like the xcode-hudson-plugin) as well as loading provisioning profiles from the file system and generally manipulating the project file.  Please send issues/feature requests to the <a href="http://github.com/rayh/xcoder/issues" title="xcoder germ">Xcoder page on github</a> </p>
]]></content:encoded>
			<wfw:commentRss>http://wirestorm.net/blog/2011/10/12/control-xcode-builds-from-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Block-based observation with KVO</title>
		<link>http://wirestorm.net/blog/2011/05/27/block-based-observation-with-kvo/</link>
		<comments>http://wirestorm.net/blog/2011/05/27/block-based-observation-with-kvo/#comments</comments>
		<pubDate>Thu, 26 May 2011 22:47:07 +0000</pubDate>
		<dc:creator>rayh</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://wirestorm.net/blog/?p=136</guid>
		<description><![CDATA[Blocks in Objective-C have been a life-saver and allowed our code to become terser and more understandable. Although some of the main parts of the iOS SDK have block-based alternatives (animations, etc), KVO is still based on defining a method with a well-known signature in your observer (not even defined by a @protocol and doesn&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>Blocks in Objective-C have been a life-saver and allowed our code to become terser and more understandable.  Although some of the main parts of the iOS SDK have block-based alternatives (animations, etc), <a href="http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/Articles/KVOBasics.html#//apple_ref/doc/uid/20002252-178352" title="KVO Observation in iOS">KVO is still based on defining a method with a well-known signature</a> in your observer (not even defined by a  @protocol and doesn&#8217;t allow the use of arbitrary @selector).  I felt there should be a way to be able to achieve this and the result is <a href="http://github.com/rayh/kvo-block-binding" title="KVO Block Binding">this project on github</a>. </p>
<p>In order to encapsulate the observation, a new instance of an object that implements the callback method signature is created for each observation and passed back to the caller.  It is expected that this object is retained by the caller until the caller wants the observation to end.  I&#8217;m not totally convinced that this is the best pattern, but it is at least concise and uses the existing language semantics.  So, on to a simple example:</p>
<p><script src="https://gist.github.com/994318.js"> </script></p>
<p>As you can see, this is very terse and means that all the code to react to changing properties can be encapsulated in the one place.  The returned value is being set to a retained property so that the binding does not get dealloc&#8217;d.  This observation will remain in effect until you release the returned object by setting the property to nil (as in the example) or, indeed, set the property to any other binding.</p>
<p>I would be very interested in feedback about whether this works for you.</p>
]]></content:encoded>
			<wfw:commentRss>http://wirestorm.net/blog/2011/05/27/block-based-observation-with-kvo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>“This item is no longer available in the App Store”</title>
		<link>http://wirestorm.net/blog/2011/02/22/this-item-is-no-longer-available-in-the-app-store/</link>
		<comments>http://wirestorm.net/blog/2011/02/22/this-item-is-no-longer-available-in-the-app-store/#comments</comments>
		<pubDate>Tue, 22 Feb 2011 04:44:53 +0000</pubDate>
		<dc:creator>rayh</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://wirestorm.net/blog/?p=81</guid>
		<description><![CDATA[My AppStore apps are currently all reporting that “This item is no longer available in the App Store” or “This item is temporarily unavailable” as of couple of days ago. I have received no notification from Apple and apparently nothing wrong in iTunes connect. After a bit of googling I stumbled across this blog post [...]]]></description>
			<content:encoded><![CDATA[<p>My AppStore apps are currently all reporting that “This item is no longer available in the App Store” or “This item is temporarily unavailable” as of couple of days ago.  I have received no notification from Apple and apparently nothing wrong in iTunes connect.  After a bit of googling I stumbled across <a href="http://www.duffresearch.com/blog/when-ready-for-sale-isnt">this blog post</a> where it seemed that at least one other person had experienced something similar.</p>
<p>I followed the post&#8217;s suggestions and updated my availability date and suddenly the app was marked as &#8220;Pending Contract&#8221;.  However, all my apps are currently freebies and so there are no contracts in place, nor should there be.  I filled out as much of them as I could (bar registering for GST), but to no avail.</p>
<p>I seem to be at the whim of Apple&#8217;s famously distant customer service right now.</p>
<p><strong>Update</strong>:  I eventually solved this by releasing a new version of the app, the process seemed to fix the existing app as it immediately reappeared in the app store while the new version was awaiting approval.  Go figure!</p>
]]></content:encoded>
			<wfw:commentRss>http://wirestorm.net/blog/2011/02/22/this-item-is-no-longer-available-in-the-app-store/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>3D &amp; HTML5 Canvas with three.js</title>
		<link>http://wirestorm.net/blog/2010/05/29/3d-html5-canvas-with-three-js/</link>
		<comments>http://wirestorm.net/blog/2010/05/29/3d-html5-canvas-with-three-js/#comments</comments>
		<pubDate>Sat, 29 May 2010 16:46:20 +0000</pubDate>
		<dc:creator>rayh</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[3d]]></category>
		<category><![CDATA[canvas]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[processing]]></category>
		<category><![CDATA[three.js]]></category>

		<guid isPermaLink="false">http://wirestorm.net/blog/?p=59</guid>
		<description><![CDATA[I spent quite a bit of time playing with Processing.org a few years back, mainly using it for video processing (video effects, blob detection, etc) but also for 3D. I recently stumbled across a javascript port of Processing called, logically, Processing.js. This is a really nice idea, taking the established processing syntax (a subset of [...]]]></description>
			<content:encoded><![CDATA[<p>I spent quite a bit of time playing with <a href="http://processing.org/">Processing.org</a> a few years back, mainly using it for video processing (video effects, blob detection, etc) but also for 3D.  I recently stumbled across a javascript port of Processing called, logically, <a href="http://processingjs.org/">Processing.js</a>.  This is a really nice idea, taking the established processing syntax (a subset of Java) and rendering it to a HTML5 Canvas.  The Processing framework uses a &#8220;dont call me, i&#8217;ll call you&#8221; inversion-of-control pattern which makes it very easy to get something up and running but that, and the fact that it is not standard javascript, can make it tricky to integrate.</p>
<p>I also found a very slick library called <a href="http://github.com/mrdoob/three.js">three.js</a> which I used to create the header animation on <a href="http://rayh.com.au">rayh.com.au</a>.  It provides a basic set of 3d concepts such as points, lines, renderer, camera, etc which can use to draw and animate basic 3d scenes.  There is no special loop function, you just use setInterval to trigger your animation to update every once in a while.</p>
]]></content:encoded>
			<wfw:commentRss>http://wirestorm.net/blog/2010/05/29/3d-html5-canvas-with-three-js/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Super Simple Site using Sinatra</title>
		<link>http://wirestorm.net/blog/2010/05/29/super-simple-site-using-sinatra/</link>
		<comments>http://wirestorm.net/blog/2010/05/29/super-simple-site-using-sinatra/#comments</comments>
		<pubDate>Sat, 29 May 2010 13:50:41 +0000</pubDate>
		<dc:creator>rayh</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://wirestorm.net/blog/?p=54</guid>
		<description><![CDATA[My personal site, rayh.com.au, was in need of dire attention. I had originally made it a flat html/js/css site to show off some jQuery skills. However, even though I really like the idea of a site built entire from static files (damn fast) and using javascript to drive the dynamic elements, it is not search [...]]]></description>
			<content:encoded><![CDATA[<p>My personal site, <a href="http://rayh.com.au">rayh.com.au</a>, was in need of dire attention.  I had originally made it a flat html/js/css site to show off some jQuery skills.  However, even though I really like the idea of a site built entire from static files (damn fast) and using javascript to drive the dynamic elements, it is not search engine friendly.  </p>
<p>Biting the bullet, I decided that I needed some sort of server-side scripting.  By day, I mainly use Java and sometimes Ruby.  So my choices seemed to be Java, Ruby or PHP.  Many moons ago, I was a PHP developer and I bailed out of that technology in favour Java.  For me, PHP just sucks in far too many areas for me to adopt it for a one-off tiny website, but the reasons why is another story.  Java seems way to heavyweight and verbose for my needs and so Ruby seemed like the natural choice.  </p>
<p>Previously I had used Rails for projects, but it&#8217;s full-stack solution was still too much for my needs as my site has no database access.  This led me to look at <a href="http://www.sinatrarb.com/">Sinatra</a>, a super lightweight and declarative approach to a web application.  I simply converted my existing html file to a .erb and told Sinatra:</p>
<pre lang="ruby" class="brush: ruby">
require 'rubygems'
require 'sinatra'

get '/' do 
  erb :index
end
</pre>
<p>This code is pretty much all that is needed to get up and running.  It tells Sinatra that when a user accesses the root of the site using GET, serve the index.erb file from the views/ directory.  This approach allowed me to just add the features I needed to perform the simple set of requirements I had rather than trying to convince Rails to do less. </p>
<p>When it came to deploying the app, I used <a href="http://www.modrails.com/">Passenger</a> (AKA mod_rails) with apache which was an absolute breeze.  I highly recommend this approach if you need something more powerful than simple javascript &#038; html without resorting to full-stack web application frameworks or ugly php scripts embedded in html.</p>
]]></content:encoded>
			<wfw:commentRss>http://wirestorm.net/blog/2010/05/29/super-simple-site-using-sinatra/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criteria for ActiveRecord</title>
		<link>http://wirestorm.net/blog/2008/04/06/criteria-for-activerecord/</link>
		<comments>http://wirestorm.net/blog/2008/04/06/criteria-for-activerecord/#comments</comments>
		<pubDate>Sun, 06 Apr 2008 08:00:39 +0000</pubDate>
		<dc:creator>rayh</dc:creator>
				<category><![CDATA[Criteria]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[activerecord]]></category>
		<category><![CDATA[query]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://wirestorm.net/blog/?p=53</guid>
		<description><![CDATA[Over the last couple of days I&#8217;ve been working on a Criteria for ActiveRecord. The concept is quite simple; rather than writing strings of SQL to pass to the find() method, we build the criteria using an object-orientated approach. Anyone who has used Hibernate, Torque, Propel et al will know how powerful and useful this [...]]]></description>
			<content:encoded><![CDATA[<p>Over the last couple of days I&#8217;ve been working on a Criteria for ActiveRecord.  The concept is quite simple; rather than writing strings of SQL to pass to the find() method, we build the criteria using an object-orientated approach.  Anyone who has used Hibernate, Torque, Propel et al will know how powerful and useful this can be.  </p>
<p>For example, imagine you have a series of filters, all of which may, or may not, add constraints or expressions to your query.  Each filter will need to append it&#8217;s own SQL to the end of any previously generated SQL and may even need to introspect the existing SQL to determine if its doubling up on statements or resolve potential conflicts.</p>
<p>With Criteria this becomes simpler.  For example:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby">criteria = Criteria.<span style="color:#9900CC;">new</span>
criteria.<span style="color:#9966CC; font-weight:bold;">and</span> <span style="color:#9966CC; font-weight:bold;">do</span> |c|
  c.<span style="color:#9966CC; font-weight:bold;">or</span> User.<span style="color:#9900CC;">role</span>.<span style="color:#9900CC;">eq</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:admin</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  c.<span style="color:#9966CC; font-weight:bold;">or</span> User.<span style="color:#9900CC;">active</span>.<span style="color:#9900CC;">eq</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">false</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  c.<span style="color:#9966CC; font-weight:bold;">or</span> User.<span style="color:#9900CC;">createdAt</span>.<span style="color:#9900CC;">gt</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">10</span>.<span style="color:#9900CC;">hours</span>.<span style="color:#9900CC;">ago</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
criteria.<span style="color:#9966CC; font-weight:bold;">and</span> <span style="color:#9966CC; font-weight:bold;">do</span> |c|
  c.<span style="color:#9966CC; font-weight:bold;">or</span> User.<span style="color:#9900CC;">role</span>.<span style="color:#9900CC;">eq</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:editor</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  c.<span style="color:#9966CC; font-weight:bold;">or</span> User.<span style="color:#9900CC;">active</span>.<span style="color:#9900CC;">eq</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">true</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  c.<span style="color:#9966CC; font-weight:bold;">or</span> <span style="color:#9966CC; font-weight:bold;">do</span> |c2|
    c2.<span style="color:#9966CC; font-weight:bold;">and</span> User.<span style="color:#9900CC;">createdAt</span>.<span style="color:#9900CC;">gt</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">20</span>.<span style="color:#9900CC;">days</span>.<span style="color:#9900CC;">ago</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    c2.<span style="color:#9966CC; font-weight:bold;">and</span> User.<span style="color:#9900CC;">createdAt</span>.<span style="color:#9900CC;">lt</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">10</span>.<span style="color:#9900CC;">hours</span>.<span style="color:#9900CC;">ago</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
users = User.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:all</span>, criteria<span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>We could, at any point, introspect the state of criteria by calling:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby">criteria.<span style="color:#9900CC;">ands</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> |c|
  put <span style="color:#996600;">&quot;AND #{c}&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
criteria.<span style="color:#9900CC;">ors</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> |c|
  put <span style="color:#996600;">&quot;OR #{c}&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>And, finally, we can remove arbitrary bits of criteria:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby">criteria.<span style="color:#9900CC;">ands</span>.<span style="color:#9900CC;">delete_at</span> <span style="color:#006666;">2</span></pre></div></div>

<p>I hope to have a release out very soon, but for the time being some more examples and API docs are  on the <a href="http://criteria.rubyforge.org/">Criteria project page</a> on <a href="http://rubyforge.org">RubyForge</a></p>
]]></content:encoded>
			<wfw:commentRss>http://wirestorm.net/blog/2008/04/06/criteria-for-activerecord/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Setting Swing Client Properties in JavaFX</title>
		<link>http://wirestorm.net/blog/2007/09/30/setting-swing-client-properties-in-javafx/</link>
		<comments>http://wirestorm.net/blog/2007/09/30/setting-swing-client-properties-in-javafx/#comments</comments>
		<pubDate>Sun, 30 Sep 2007 23:50:17 +0000</pubDate>
		<dc:creator>rayh</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://wirestorm.net/blog/?p=48</guid>
		<description><![CDATA[I have been looking around for a way in which to set Swing client properties easily in JavaFX, without subclassing the whole widget. This seems like the simplest (and most obvious, in hindsight) way of doing this. Documentation is still a bit thin on the ground so I am unsure if this is the proper [...]]]></description>
			<content:encoded><![CDATA[<p>I have been looking around for a way in which to set Swing client properties easily in JavaFX, without subclassing the whole widget.  This seems like the simplest (and most obvious, in hindsight) way of doing this.  Documentation is still a bit thin on the ground so I am unsure if this is the proper way to do things:</p>
<p><code>
trigger on (new Button) {
	button.putClientProperty("Quaqua.Button.style", "placard");
}
</code></p>
<p>The above code allows me to inform the underlying Quaqua LookAndFeel that I wish to use the placard button style.  If I wanted to use this selectively, I would have to subclass Button.fx, provide an additional attribute (say style) and then apply the property if the attribute is set.</p>
<p>Obviously, you need to know the internal name for the Swing component you are trying to access, <a href="http://langintro.com/jfx/makeapi/api/index.html">this API documentation</a> is pretty helpful for that.</p>
]]></content:encoded>
			<wfw:commentRss>http://wirestorm.net/blog/2007/09/30/setting-swing-client-properties-in-javafx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eclipse + PHP + J2EE + Rails</title>
		<link>http://wirestorm.net/blog/2007/07/04/eclipse-php-j2ee-rails/</link>
		<comments>http://wirestorm.net/blog/2007/07/04/eclipse-php-j2ee-rails/#comments</comments>
		<pubDate>Wed, 04 Jul 2007 02:33:42 +0000</pubDate>
		<dc:creator>rayh</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Howto]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://wirestorm.net/blog/?p=47</guid>
		<description><![CDATA[I have just decided to upgrade Eclipse, and thought it best to start from scratch. I do a lot of work in Java, PHP as well as Ruby on Rails and so I tried to set up an integrated environment using Eclipse. I have documented the steps here as much as a reminder for myself [...]]]></description>
			<content:encoded><![CDATA[<p>I have just decided to upgrade Eclipse, and thought it best to start from scratch.  I do a lot of work in Java, PHP as well as Ruby on Rails and so I tried to set up an integrated environment using Eclipse.  I have documented the steps here as much as a reminder for myself as a guide for other people trying to something similar.</p>
<p>First, download and unzip the Ecipse + J2EE package from <a href="http://www.eclipse.org/downloads/">http://www.eclipse.org/downloads/</a>.  You do not need to &#8216;install&#8217; Eclipse as such, just put the uncompressed directory somewhere logical (/Applications on a Mac, for example).<a href="http://www.eclipse.org/downloads/">
</a></p>
<ol>
<li>Launch Eclipse <img src='http://wirestorm.net/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </li>
<li>Select: <strong>Help</strong> -> <strong>Software Update</strong> -> <strong>Final and Install</strong>.</li>
<li>Select  <strong>Search for new features to install</strong></li>
<li>Check the <strong>Europa Discovery Service</strong></li>
<li>Select<strong> Add Remote Site</strong></li>
</ol>
<ol>
<li>Type in name:<strong> Aptana </strong>(For javascript support)</li>
<li>Type in url: <strong>http://update.aptana.com/install/3.2/</strong></li>
<li>Select <strong>OK
</strong></li>
</ol>
<li>Select<strong> </strong><strong>Add Remote Site</strong> (For Ruby on Rails support)<strong>
</strong></p>
<ol>
<li>Type in name:<strong> RadRails</strong></li>
<li>Type in url:<strong> http://update.aptana.com/install/rails/3.2/</strong></li>
<li>Select<strong> OK</strong></li>
</ol>
</li>
<li>Select<strong> Add Remote Site </strong>(For SVN integration)
<ol>
<li>Type in name: <strong>Subclipse</strong></li>
<li>Type in url:<strong> http://subclipse.tigris.org/update_1.2.x</strong></li>
<li>Select<strong> OK</strong></li>
</ol>
</li>
<li>Select<strong> Add Remote Site</strong> (for PHP support)<strong>
</strong></p>
<ol>
<li>Type in name: <strong>PDT</strong></li>
<li>Type in url:<strong> http://download.eclipse.org/tools/pdt/updates/</strong></li>
<li>Select<strong> OK</strong></li>
</ol>
</li>
<li>Select<strong> Add Remove Site </strong>(for Hibernate support)
<ol>
<li>Type in name:<strong> Hibernate Tools</strong></li>
<li>Type in url:<strong> http://download.jboss.org/jbosside/updates/development</strong></li>
<li>Select<strong> OK
</strong></li>
</ol>
</li>
<li>Select <strong>Finish</strong></li>
<li>Select your nearest mirror, when prompted</li>
<li>Select <strong>Eurpoa Discovery Site</strong> -> <strong>Programming Languages</strong> -> <strong>Ruby Development Tools</strong></li>
<li>Select <strong>PDT</strong></li>
<li>Select <strong>Aptana</strong></li>
<li>Select <strong>RadRails</strong></li>
<li>Select <strong>Subclipse</strong></li>
<li>Select<strong> Hibernate Tools
</strong></li>
<li>Select <strong>Select Required</strong> (to resolve dependencies)</li>
<li>Select <strong>Next</strong></li>
<li>Accept the agreement(s) and <strong>select Next</strong></li>
<li>Select <strong>Finish</strong></li>
<li>Go for a walk.</li>
<p>Phew, so after all that, you should have an Eclipse IDE set up to support PHP, Ruby, Rails, Javascript, Java, Hibernate and  Subversion.  You can, of course, select many other tools from the Europa discovery site for other development tools, graphical editing and the like.</p>
]]></content:encoded>
			<wfw:commentRss>http://wirestorm.net/blog/2007/07/04/eclipse-php-j2ee-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windy Road » (Re)Introducing Javascript And Hidden Applets (JAHA)</title>
		<link>http://wirestorm.net/blog/2007/04/26/windy-road-%c2%bb-reintroducing-javascript-and-hidden-applets-jaha/</link>
		<comments>http://wirestorm.net/blog/2007/04/26/windy-road-%c2%bb-reintroducing-javascript-and-hidden-applets-jaha/#comments</comments>
		<pubDate>Thu, 26 Apr 2007 09:41:11 +0000</pubDate>
		<dc:creator>rayh</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://wirestorm.net/blog/?p=46</guid>
		<description><![CDATA[Windy Road has a nice article on the use of Javascript And Hidden Applets, what they call JAHA.  This is similar to the technique I have used in Robonobo, however I am having all sorts of issues on Mactel Firefox, possibly due to the Apple MRJ / Firefox integration. It would be nice to have [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://windyroad.org/">Windy Road</a> has a nice article on the use of <a href="http://windyroad.org/?p=23">Javascript And Hidden Applets</a>, what they call JAHA.  This is similar to the technique I have used in Robonobo, however I am having all sorts of issues on Mactel Firefox, possibly due to the Apple MRJ / Firefox integration.</p>
<p>It would be nice to have a small js library that allowed you to dynamically instantiate and destroy embedded, hidden applets.</p>
]]></content:encoded>
			<wfw:commentRss>http://wirestorm.net/blog/2007/04/26/windy-road-%c2%bb-reintroducing-javascript-and-hidden-applets-jaha/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Elmo RDF Beans</title>
		<link>http://wirestorm.net/blog/2007/03/28/elmo-rdf-beans/</link>
		<comments>http://wirestorm.net/blog/2007/03/28/elmo-rdf-beans/#comments</comments>
		<pubDate>Wed, 28 Mar 2007 15:30:03 +0000</pubDate>
		<dc:creator>rayh</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[RDF]]></category>

		<guid isPermaLink="false">http://wirestorm.net/blog/?p=45</guid>
		<description><![CDATA[&#8220;Elmo is a JavaBean pool implementation for the Sesame RDF repository. Specifically, Elmo is a subject-oriented RDF Bean pool that allows JavaBeans to be cast to different roles and provides a unique context specific view of the subject.&#8221; Basically, you can annotate your classes with url&#8217;s describing the RDF namespace of the class or property. [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;Elmo is a JavaBean pool implementation for the Sesame RDF repository. 			Specifically, Elmo is a subject-oriented RDF Bean pool that allows 			JavaBeans to be cast to different roles and provides a unique context 			specific view of the subject.&#8221;</p>
<p>Basically, you can annotate your classes with url&#8217;s describing the RDF namespace of the class or property.  You can then use SPARQL to query/retrieve the beans, and serialize them to/from XML.  Serialization can be acheived through the <a title="Sesame" href="http://www.openrdf.org/doc/sesame2/2.0-beta2/users/">Sesame</a> framework.</p>
<p><a href="http://www.openrdf.org/doc/elmo/1.0/user-guide/">Elmo User Guide</a></p>
<p>Additionally, there is another project, <a title="JRDF" href="http://docs.mulgara.org/system/jrdfapis.html">JRDF</a>, that builds upon Sesame and Jena.  I have yet to use it, but sounds like in encompasses the best of all worlds.</p>
]]></content:encoded>
			<wfw:commentRss>http://wirestorm.net/blog/2007/03/28/elmo-rdf-beans/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Applets + HTML/Javascript</title>
		<link>http://wirestorm.net/blog/2007/01/31/applets-htmljavascript/</link>
		<comments>http://wirestorm.net/blog/2007/01/31/applets-htmljavascript/#comments</comments>
		<pubDate>Wed, 31 Jan 2007 12:33:00 +0000</pubDate>
		<dc:creator>rayh</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://rayh.co.uk/blog/?p=20</guid>
		<description><![CDATA[As part of our, seemingly unending, refactoring of Robonobo, we packaged the whole app into an applet. However, writing a UI in swing felt very un-webby, and would fail to integreate, visually, with the style of the site. We would also like our users to have the ability to be able to customize or rebuild [...]]]></description>
			<content:encoded><![CDATA[<p>As part of our, seemingly unending, refactoring of <a href="http://robonobo.net">Robonobo</a>, we packaged the whole app into an applet.  However, writing a UI in swing felt very un-webby, and would fail to integreate, visually, with the style of the site.  We would also like our users to have the ability to be able to customize or rebuild their own UIs using simple standards.
Luckily, however, applets have some very cool features that I only just learnt about, inlcuding LiveConnect (from whence XPConnect comes from).  This provides a bridge between java and javascript, allowing me to call java functions from javascript and return real java objects to javascript.</p>
<p>Using this, we created an applet with no UI, that sits in a 0&#215;0 pixel container, and a javascript support library which communicates and wraps the functionality provided by robonobo.  All the UI can now be rendered using html, css and javascript, in a very ajaxian fashion.</p>
<p>There are a couple of gotchas though:</p>
<ul>
<li>You cannot return primitive types such as int, float, etc.  Instead you must use the object equivilents Integer, Float, etc.</li>
<li>Calling from javascript comes from an unprivileged thread, so despite your applet&#8217;s policy, it may well be denied permissions.  You can simply wrap such requests on the java-side with an AccessController.doPrivileged()</li>
<li>Large applets can lock up the browser because the JVM and the jar are being loaded concurrently.  This can be aleviated by splitting your applet into a smaller jar containing just the applet and interfaces, and the main jar containing the implementation.  This way, the jvm and applet initialize quickly, and then do not block the browser when the second jar is downloaded.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://wirestorm.net/blog/2007/01/31/applets-htmljavascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wish: P2P Virtual Office</title>
		<link>http://wirestorm.net/blog/2007/01/05/wish-p2p-virtual-office/</link>
		<comments>http://wirestorm.net/blog/2007/01/05/wish-p2p-virtual-office/#comments</comments>
		<pubDate>Fri, 05 Jan 2007 00:02:35 +0000</pubDate>
		<dc:creator>rayh</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://rayh.co.uk/blog/?p=22</guid>
		<description><![CDATA[I work for a couple of companies whose employees are distributed across timezones and countries and someone needs to write a bit of software to make this easier. Something like BoxCloud combined with Subversion. The idea being that all shared files exist on each individual machine and are synchronized when people come online. All previous [...]]]></description>
			<content:encoded><![CDATA[<p>I work for a couple of companies whose employees are distributed across timezones and countries and someone needs to write a bit of software to make this easier.  Something like <a title="BoxCloud" href="http://www.boxcloud.com/">BoxCloud</a> combined with <a title="Subversion" href="http://subversion.tigris.org/">Subversion</a>.  The idea being that all shared files exist on each individual machine and are synchronized when people come online.  All previous versions of the documents are stored as well.  A new file can be shared with everyone just by placing into a special folder on ones computer, which is monitored by the client.</p>
<p>Then, you need a Push-to-talk voip system.  Often you dont need to have a full conversation with someone, but instead let them know what your doing, or that you have just updated a document, etc.  A special key on the keyboard (maybe caps lock?  put it to some good use) will enable you to say a few words to a person or to the whole team.</p>
]]></content:encoded>
			<wfw:commentRss>http://wirestorm.net/blog/2007/01/05/wish-p2p-virtual-office/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP&#8217;s Lacking</title>
		<link>http://wirestorm.net/blog/2006/09/27/phps-lacking/</link>
		<comments>http://wirestorm.net/blog/2006/09/27/phps-lacking/#comments</comments>
		<pubDate>Wed, 27 Sep 2006 12:37:09 +0000</pubDate>
		<dc:creator>rayh</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://rayh.co.uk/blog/?p=19</guid>
		<description><![CDATA[I like PHP; its fun, quick and easy&#8230; most of the time. However, I have recently had the misfortune of attempting to make WordPress, Wikka Wiki and Vanilla work together. Although, individually, they are very powerful and superb examples of open source development, they suck at working with other projects. Two things immediately struck me: [...]]]></description>
			<content:encoded><![CDATA[<p>I like PHP; its fun, quick and easy&#8230; most of the time.  However, I have recently had the misfortune of attempting to make WordPress, Wikka Wiki and Vanilla work together.  Although, individually, they are very powerful and superb examples of open source development, they suck at working with other projects.</p>
<p>Two things immediately struck me:  1) lack of a common templating system and 2) lack of a common authentication /authorisation system</p>
<p>Now, I don&#8217;t mean that there should be a single templating system used by all, but there should at least be support for a simple border template system.  Such a system could let me define the basic outline, css, scripts, divs, etc and then nominate extention points, i.e. places in the template other systems can hook into and publish their content.  HTML with some proprietry xml tags embedded could be transformed using XSLT into the project specific template format.  Indeed, drivers could be provided to allow converstion to most popular templating systems.</p>
<p>Templating is a big issue with me, everyone has their own way of doing it. I do not agree with systems like Smarty that try to seperate the user from the structures of php in order to prevent them from embedding control logic in their templates.  Of course, a developer shouldn&#8217;t be doing this, but this is a self-discipline issue, not a need to develop a non-standard scripting language on top of another, perfectly functional, scripting language.</p>
<p>The templating issue was overcome, if in a rather hacked manner, by reducing the templates of each project to the bare minimum, ie, no css, simple div structures, etc.  A proxy-like service would then explode the head and body section and recombine it using a standard template.  This could be seem as object-like inheritance of a standard template dom tree (similar to the concept of XUL overlays).</p>
<p>Although templating is an irritating issue, it is not quite as irritating as the authentication issue.  Here we have three seperate projects, each with their own authentication system, and although some allow the easy application of your own code, quite why the community cannot make efforts to agree on a common authentication API, is beyond me.</p>
<p>PHP needs to be distributed with a set of APIs that cover these common problem areas.  Additionally, if you want to include code from several projects into one, you NEED some form of namespacing standard.  I would love to see some sort of PHP community standards effort that would lay down the law for such things.  Projects built to these specifications would automagically behave well together and allow coders to get on with writing Cool Shit rather than hacking a project&#8217;s ludircrously over-complex templating system.</p>
]]></content:encoded>
			<wfw:commentRss>http://wirestorm.net/blog/2006/09/27/phps-lacking/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Passing Arguments using JavaXPCOM</title>
		<link>http://wirestorm.net/blog/2006/06/06/passing-arguments-using-javaxpcom/</link>
		<comments>http://wirestorm.net/blog/2006/06/06/passing-arguments-using-javaxpcom/#comments</comments>
		<pubDate>Tue, 06 Jun 2006 10:57:41 +0000</pubDate>
		<dc:creator>rayh</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[XPCOM]]></category>
		<category><![CDATA[XUL]]></category>

		<guid isPermaLink="false">http://rayh.co.uk/blog/?p=15</guid>
		<description><![CDATA[Following on from yesterday, I needed to pass arguments to the window being opened. The data I needed to pass was quite simple, so I simply serialized it to JSON and then passed them as strings in a nsICollection (actually, a @mozilla.org/supports-array;1 collection of @mozilla.org/supports-string;1) and then just eval()&#8217;d the data within the xul window&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>Following on from yesterday, I needed to pass arguments to the window being opened.  The data I needed to pass was quite simple, so I simply serialized it to JSON and then passed them as strings in a nsICollection (actually, a @mozilla.org/supports-array;1 collection of @mozilla.org/supports-string;1) and then just eval()&#8217;d the data within the xul window&#8217;s javascript.</p>
<p>This is a bit of a hack,  but its probably the simplest way of passing structured data.  What would be nice is a bit of code that would automagically serialize a bean to JSON notation&#8230; I&#8217;m sure there are many out there (<a href="http://struts.apache.org/struts-sandbox/struts-flow/apidocs/org/apache/struts/flow/json/JSONSerializer.html">This apache struts class looks promising</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://wirestorm.net/blog/2006/06/06/passing-arguments-using-javaxpcom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Injecting Events onto XPCOM&#8217;s UI Thread</title>
		<link>http://wirestorm.net/blog/2006/06/05/injecting-events-onto-xpcoms-ui-thread/</link>
		<comments>http://wirestorm.net/blog/2006/06/05/injecting-events-onto-xpcoms-ui-thread/#comments</comments>
		<pubDate>Mon, 05 Jun 2006 15:04:26 +0000</pubDate>
		<dc:creator>rayh</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[XUL]]></category>

		<guid isPermaLink="false">http://rayh.co.uk/blog/?p=14</guid>
		<description><![CDATA[Finally worked this out&#8230; These pages are rather helpful: Mozilla&#8217;s guide to using proxies and XulPlanet&#8217;s description of the nsIProxyObjectManager This interface defines a proxy manager. An instance of this manager is used to create a proxy for a particular object on which you wish to invoke a method. If you are calling from any [...]]]></description>
			<content:encoded><![CDATA[<p>Finally worked this out&#8230;</p>
<p>These pages are rather helpful: <a href="http://www.mozilla.org/projects/xpcom/Proxies.html">Mozilla&#8217;s guide to using proxies</a> and <a href="http://www.xulplanet.com/references/xpcomref/ifaces/nsIProxyObjectManager.html">XulPlanet&#8217;s description of the nsIProxyObjectManager</a></p>
<p>This interface defines a proxy manager.  An instance of this manager is used to create a proxy for a particular object on which you wish to invoke a method.  If you are calling from any other thread that which you initialized xpcom on, you will need to do this, and as far as I am aware, there is no trivial way of doing otherwise.</p>
<p>Anyway, the code to open a new window would be as follows.  Note, this method assumes that there is already a constructed object called windowWatcher, which is an instanceof nsIWindowWatcher, see previous post for details.</p>
<pre><code> public void openWindow(String chromeUri, String name) {
nsIEventQueueService eventQueueServive =
(nsIEventQueueService)serviceManager.getServiceByContractID(
"@mozilla.org/event-queue-service;1",
nsIEventQueueService.NS_IEVENTQUEUESERVICE_IID);

nsIEventQueue eventQueue = eventQueueServive.getSpecialEventQueue(
nsIEventQueueService.UI_THREAD_EVENT_QUEUE);

nsIProxyObjectManager proxy =
(nsIProxyObjectManager)componentManager.createInstanceByContractID(
"@mozilla.org/xpcomproxy;1",
null,
nsIProxyObjectManager.NS_IPROXYOBJECTMANAGER_IID);

nsIWindowWatcher windowProxy =
(nsIWindowWatcher)proxy.getProxyForObject(
eventQueue,
windowWatcher.NS_IWINDOWWATCHER_IID,
windowWatcher,
nsIProxyObjectManager.INVOKE_SYNC );

windowProxy.openWindow(null, chromeUri, name, "centerscreen", null);
} </code></pre>
<p>The code here uses the service manager to get an instance of the event queue manager, which is subsequently used to retreive the main UI event queue.  This is then passed to the proxy manager&#8217;s getProxyForObject method, along with the IID of the nsIWindowWatcher interface, the actual instance, and flag representing the type of proxy operation (async, sync, etc, see the xulplanet page for more info).</p>
<p>This method returns an instance of nsIWindowWatcher, which is actually a proxy which will inject events onto the UI thread for you.  Then, just use the object as normal, sweet!</p>
]]></content:encoded>
			<wfw:commentRss>http://wirestorm.net/blog/2006/06/05/injecting-events-onto-xpcoms-ui-thread/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JavaXPCOM</title>
		<link>http://wirestorm.net/blog/2006/04/29/javaxpcom/</link>
		<comments>http://wirestorm.net/blog/2006/04/29/javaxpcom/#comments</comments>
		<pubDate>Sat, 29 Apr 2006 16:01:26 +0000</pubDate>
		<dc:creator>rayh</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[XUL]]></category>

		<guid isPermaLink="false">http://rayh.co.uk/blog/?p=13</guid>
		<description><![CDATA[After poking around for some hours (then days) trying to find some useful information on how to use JavaXPCOM (which is a bridge between XPCOM and Java, formally known as Javaconnect) I stumbled across a few things as well as hacking together some understanding myself and through C++ examples of XPCOM usage. We decided a [...]]]></description>
			<content:encoded><![CDATA[<p>After poking around for some hours (then days) trying to find some useful information on how to use JavaXPCOM (which is a bridge between XPCOM and Java, formally known as Javaconnect) I stumbled across a few things as well as hacking together some understanding myself and through C++ examples of XPCOM usage.</p>
<p>We decided a while back to adopt an XML based protocol wherever possible, and moreover, RDF where appropriate.  When communicating with a central server, this would use HTTP, so it seemed logical to use the same on the localhost.  So, XUL uses AJAX, basically, to do asynchronous calls over HTTP to localhost, and retreives XML which is then passed into objects representing the returned resources.  This way, we dont need to heavily integrate Java and XUL using XPCOM, and we allow other applications to be able to place nicely with the API over a well-known protocol and format.  Anyway, this means that the only work JavaXPCOM needs to do is:</p>
<ul>
<li>Start XPCOM using a XULRunner installation</li>
<li>Start an XUL window and pass control over to it</li>
<li>Be able to call javascript/xul events from java (to open windows, etc)</li>
</ul>
<p>So to start with, we need to find an XULRunner install.  As it stands, we will distribute a version with the installer, but JavaXPCOM contains code to easily find installed versions as well (this is actually documented on the <a href="http://developer.mozilla.org/en/docs/JavaXPCOM">JavaXPCOM site</a>).</p>
<ol>
<li>Set the path the XULRunner directory, here we are doing it explicitly:
<code>File grePath = new File(new File(".").getAbsolutePath(), "platform/win32/xulrunner");</code></li>
<li>Next create an instance of the LocationProvider
<code>LocationProvider locProvider = new LocationProvider(grePath);</code></li>
<li>Initialize JavaXPCOM embedding:
<code>Mozilla.getInstance().initEmbedding(grePath, grePath, locProvider);</code></li>
<li>Now we need to start an XUL application, so we get an instance of the XPCOM service manager
<code>nsIServiceManager serviceManager = moz.getServiceManager();</code></li>
<li>Now we need to get the @mozilla.org/toolkit/app-startup;1 service:
<code>nsIAppStartup appStartup = (nsIAppStartup)serviceManager.getServiceByContractID("@mozilla.org/toolkit/app-startup;1", nsIAppStartup.NS_IAPPSTARTUP_IID);</code></li>
<li>Get the nsIWindowWatcher interface to the above
<code>nsIWindowCreator windowCreator = (nsIWindowCreator)appStartup.queryInterface(nsIWindowCreator.NS_IWINDOWCREATOR_IID);</code></li>
<li>Get the window watcher service
<code>nsIWindowWatcher windowWatcher = (nsIWindowWatcher)serviceManager.getServiceByContractID("@mozilla.org/embedcomp/window-watcher;1", nsIWindowWatcher.NS_IWINDOWWATCHER_IID);</code></li>
<li>Set the window creator (from step 6)
<code>windowWatcher.setWindowCreator(windowCreator);</code></li>
<li>Create the root XUL window:
<code>nsIDOMWindow win = windowWatcher.openWindow(null, "chrome://your-app/content/window.xul", "mywindow", "chrome,resizable,centerscreen", null);</code></li>
<li>Set this as the active window
<code>windowWatcher.setActiveWindow(win);</code></li>
<li>Hand over the application to xpcom/xul, this will block:
<code>appStartup.run();</code></li>
</ol>
<p>Now, the LocationProvider is responsible for providing path(s) and file(s) that XPCOM needs.  I have implemented a version that when the &#8216;ChromeML&#8217; location is asked for returns an array of File&#8217;s, the first of which points to my own applications chrome folder, and the second of which is the xulrunner&#8217;s own chrome folder.  This seems to work, but there are several issues:</p>
<ol>
<li>I do not seem to be able to open XUL windows (or in anyway interact with xpcom/xul) from another thread.  Since this run() method on nsIAppStartup blocks, this is a bit annoying.  I presume there is a way to run this loop manually, or hook into it so we can queue up requests from other threads to be invoked on the xpcom thread.</li>
</ol>
<p>Ok, thats only one major issue for now, but I&#8217;m sure I will think of others.
If anyone has any ideas how these problems can be solved, or how one may circumvent them, I&#8217;m all ears.  Also, I know that this area is so bleeding edge it hurts, so it would be nice to talk to some other people doing the same things!</p>
]]></content:encoded>
			<wfw:commentRss>http://wirestorm.net/blog/2006/04/29/javaxpcom/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>XUL + Media</title>
		<link>http://wirestorm.net/blog/2006/02/10/xul-media/</link>
		<comments>http://wirestorm.net/blog/2006/02/10/xul-media/#comments</comments>
		<pubDate>Fri, 10 Feb 2006 12:54:40 +0000</pubDate>
		<dc:creator>rayh</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[XUL]]></category>

		<guid isPermaLink="false">http://rayh.co.uk/blog/?p=12</guid>
		<description><![CDATA[Just a quick roundup of some interesting developments I&#8217;ve seen recently in the world of persuing elegant cross-platform solutions for media players. Songbird is a media player in the vein of iTunes that uses XUL http://xullicious.blogspot.com/2005/06/xul-music.html  is an example of how to make a cross platform media player using gstreamer and directx for the application, [...]]]></description>
			<content:encoded><![CDATA[<p>Just a quick roundup of some interesting developments I&#8217;ve seen recently in the world of persuing elegant cross-platform solutions for media players.
<a xhref="http://www.songbirdnest.com">Songbird</a> is a media player in the vein of iTunes that uses XUL</p>
<p><a xhref="http://xullicious.blogspot.com/2005/06/xul-music.html">http://xullicious.blogspot.com/2005/06/xul-music.html</a>  is an example of how to make a cross platform media player using gstreamer and directx for the application, and XUL for the front end.</p>
<p><a xhref="http://www.croczilla.com/zap">Zap!</a> is a XUL based SIP (ie, VoIP) client for mozilla.  Basically a cross-platform streaming audio tool using the <a xhref="http://www.portaudio.com">PortAudio</a> audio library.</p>
]]></content:encoded>
			<wfw:commentRss>http://wirestorm.net/blog/2006/02/10/xul-media/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XUL</title>
		<link>http://wirestorm.net/blog/2005/12/20/xul/</link>
		<comments>http://wirestorm.net/blog/2005/12/20/xul/#comments</comments>
		<pubDate>Tue, 20 Dec 2005 16:16:14 +0000</pubDate>
		<dc:creator>rayh</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[DotNet]]></category>
		<category><![CDATA[XUL]]></category>

		<guid isPermaLink="false">http://rayh.co.uk/blog/?p=11</guid>
		<description><![CDATA[Our choice of platform for MixIndex was .NET/C# since it was, at the time, going to be tightly integrated and specific to the Windows OS. However, with the pace of development of Mono and PortableDotNet over the last couple of years, most of the app will now run on any platform. Two key components, however, [...]]]></description>
			<content:encoded><![CDATA[<p>Our choice of platform for <a href='http://www.mixindex.net/'>MixIndex</a> was .NET/C# since it was, at the time, going to be tightly integrated and specific to the Windows OS.  However, with the pace of development of Mono and PortableDotNet over the last couple of years, most of the app will now run on any platform.  Two key components, however, do not.</p>
<p>First, is the streaming audio library, DirectX is used on windows, but since this is quite well abstracted, it could be rewritten on a per-platform basis, not the best solution, but it is doable.</p>
<p>Second, however, is the UI, System.Windows.Forms is an ugly beast, and not supported very well by either of the two open-source dotnet runtimes, so a choice needs to be made.</p>
<p>After looking at WX.NET, a .NET implmentation of WX widgets, and GTK#, GTK+ bindings for .NET, I was begining to get dishartened by the hackish way they were all implemented.  GTK# is just ugly on all platforms, rather than looking good on one or two.  WX uses the native interface, but there are no decent, free/cheap, tools to help you, the ones that do are so clunky, they make me worried as to how the rest of the system is imlpemented.  All in all, very underwhelming.</p>
<p>Anyway, I am now looking at XUL and its damn nice, clean, standards complient, cross platform and open-source.  The XUL Runner is a standalone application for running XUL apps, which would be packaged into the apps installer, and then the XUL part can communicate with the &#8216;real&#8217; application over SOAP, XML RPC, or whatever, enforcing a strict seperation of UI and Application.  Stuff like localization is done through entities defined in DTDs, and styling is done through css, very very cool.</p>
<p>This is the <a href="http://www.xulplanet.com/tutorials/xultu/">tutorial</a> I followed.</p>
]]></content:encoded>
			<wfw:commentRss>http://wirestorm.net/blog/2005/12/20/xul/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Location Based Events RSS</title>
		<link>http://wirestorm.net/blog/2005/12/19/location-based-events-rss/</link>
		<comments>http://wirestorm.net/blog/2005/12/19/location-based-events-rss/#comments</comments>
		<pubDate>Mon, 19 Dec 2005 11:18:59 +0000</pubDate>
		<dc:creator>rayh</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://rayh.co.uk/blog/?p=10</guid>
		<description><![CDATA[Just a thought, wouldn&#8217;t it be nice if you could agregate rss feeds for events, and filter by location. Therefore, when I&#8217;m in Seattle in January, I could instantly see whats going down in the area, and when i return to the UK, I would then again see details for events in the London area. [...]]]></description>
			<content:encoded><![CDATA[<p>Just a thought, wouldn&#8217;t it be nice if you could agregate rss feeds for events, and filter by location.  Therefore, when I&#8217;m in Seattle in January, I could instantly see whats going down in the area, and when i return to the UK, I would then again see details for events in the London area.</p>
<p>Its quite interesting that the marketing world is begining to pick up on this, I for one would quite like an RSS feed from ticketmaster, say, complete with community tagging, so i could just get a feed of stuff I&#8217;m interested, based on my current location.  The transition from being an irritating, ever-present, lowest-common-denominator-targeted,  to useful, informative, open and transparent will make the early adopting marketing firms very very rich, they just need to become the first point of contact for such things.</p>
<p>No doubt, this will be Google; &#8220;Tell us your events on google base, and people can search based on their current location!&#8221;&#8230;  Oh wait, isn&#8217;t this already possible?</p>
]]></content:encoded>
			<wfw:commentRss>http://wirestorm.net/blog/2005/12/19/location-based-events-rss/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

