<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-10202973</id><updated>2024-09-08T11:56:59.092+10:00</updated><category term="mac"/><category term="programming"/><category term="swingame"/><category term="teaching"/><category term="subjects"/><category term="scripts"/><category term="applications"/><category term="concurrency"/><category term="jobs"/><category term="project"/><category term="remember"/><title type='text'>Thinking at the Edge</title><subtitle type='html'>Thoughts from the edge of teaching, software development and .NET.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://andrewcain.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default?alt=atom'/><link rel='alternate' type='text/html' href='http://andrewcain.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default?alt=atom&amp;start-index=26&amp;max-results=25'/><author><name>Andrew Cain</name><uri>http://www.blogger.com/profile/05258615955880287223</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh6.google.com/image/alipatchdrewcain/RlFvcdwrJHI/AAAAAAAAABw/3NvTYvi0PlY/s144/Photo%207.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>92</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-10202973.post-7659500113293585214</id><published>2009-12-02T12:05:00.006+11:00</published><updated>2009-12-02T12:33:10.353+11:00</updated><title type='text'>Locking a Mac</title><content type='html'>Leaving your mac sitting logged in on your desk is not very secure... is there an easy way to lock access to your machine when you step away? Unfortunately there is no ctrl-L style key combination built in, but you can get the same effect using the Screen Saver and hot corners.&lt;div&gt;&lt;ol&gt;&lt;li&gt;Open &lt;b&gt;System Preferences&lt;/b&gt;, and move into the &lt;b&gt;Desktop &amp;amp; Screen Saver&lt;/b&gt; preference pane.&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 160px;&quot; src=&quot;http://2.bp.blogspot.com/_olmWkE7TQpE/SxW-uAeChmI/AAAAAAAAABo/gMwwQZVSrqs/s200/Screen+shot+2009-12-02+at+12.10.42+PM.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5410440224964773474&quot; /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li style=&quot;clear:both&quot;&gt;Click the &lt;b&gt;Hot Corners&lt;/b&gt; button and have the screen saver start when you move the mouse to one of the four corners of your screen. I use the top left corner. Then click &lt;b&gt;OK&lt;/b&gt;, and &lt;b&gt;Show All&lt;/b&gt; to return back to the System Preferences window.&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 160px;&quot; src=&quot;http://4.bp.blogspot.com/_olmWkE7TQpE/SxXBnyyVxnI/AAAAAAAAACA/HSqEg99AVd0/s200/Screen+shot+2009-12-02+at+12.08.59+PM.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5410443416747492978&quot; /&gt;&lt;/li&gt;&lt;li style=&quot;clear:both&quot;&gt;Now open the &lt;b&gt;Security&lt;/b&gt; preference pane.&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 160px;&quot; src=&quot;http://4.bp.blogspot.com/_olmWkE7TQpE/SxXBFAw40_I/AAAAAAAAAB4/fACn0DEUHgE/s200/Screen+shot+2009-12-02+at+12.20.59+PM.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5410442819204076530&quot; /&gt;&lt;/li&gt;&lt;li style=&quot;clear:both&quot;&gt; Finally set the &lt;b&gt;Require password &lt;i&gt;n seconds&lt;/i&gt; after sleep or screen saver&lt;/b&gt;. I use the &lt;b&gt;5 seconds&lt;/b&gt; setting as this gives you a few of seconds to move the mouse when the screen saver kicks in when you are reading a document or similar.&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 160px;&quot; src=&quot;http://2.bp.blogspot.com/_olmWkE7TQpE/SxXCkXWNe2I/AAAAAAAAACI/IYCU4SVCwig/s200/Screen+shot+2009-12-02+at+12.26.28+PM.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5410444457353771874&quot; /&gt;&lt;/li&gt;&lt;li style=&quot;clear:both&quot;&gt;Now when its coffee time just move your mouse to the appropriate &lt;i&gt;hot corner&lt;/i&gt; and your screen saver will lock your computer.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewcain.blogspot.com/feeds/7659500113293585214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10202973/7659500113293585214' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/7659500113293585214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/7659500113293585214'/><link rel='alternate' type='text/html' href='http://andrewcain.blogspot.com/2009/12/locking-mac.html' title='Locking a Mac'/><author><name>Anonymous</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/blank.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_olmWkE7TQpE/SxW-uAeChmI/AAAAAAAAABo/gMwwQZVSrqs/s72-c/Screen+shot+2009-12-02+at+12.10.42+PM.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10202973.post-6358354329394268646</id><published>2009-11-09T16:23:00.003+11:00</published><updated>2009-11-09T17:05:49.126+11:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><category scheme="http://www.blogger.com/atom/ns#" term="swingame"/><title type='text'>Regex for Tracing</title><content type='html'>I&#39;ve been working on SwinGame, and one of the tasks has been to add tracing code to the core to make it easier to debug problems. This involves adding TraceEnter and Trace exit calls to each procedure in the code.&lt;br /&gt;&lt;br /&gt;To avoid having to do this by hand I am using a Regular Expression in TextMate to find procedures in the code, and replace them with a version that includes the injected trace enter and exit code. The regex I am using is shown below. It will work with a maximum depth of four begin/end groups... so its not completely automatic, but is a good start.&lt;br /&gt;&lt;blockquote&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:&#39;courier new&#39;;&quot;&gt;(function |procedure )(.*?)(;(\n|.)*?begin)((\n|(begin(\n|(begin(\n|(begin(\n|(begin(\n|.)*?end)|.)*?end)|.)*?end)|.)*?end)|.)*?)(\n  end;)&lt;/span&gt;&lt;/blockquote&gt;This is then replaced using the following replace text. The $1 values are the groups that are matched in the regular expression. This enables me to place the procedure name, parameters and return type in the traced output ($2). It also ensures that all of the code from the program is output in the right spot.&lt;br /&gt;&lt;blockquote&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:&#39;courier new&#39;;&quot;&gt; $1$2$3&lt;br /&gt;   {$IFDEF TRACE}&lt;br /&gt;     TraceEnter(&#39;sgCamera&#39;, &#39;$2&#39;, &#39;&#39;);&lt;br /&gt;   {$ENDIF}&lt;br /&gt;   $5 &lt;br /&gt;   {$IFDEF TRACE}&lt;br /&gt;     TraceExit(&#39;sgCamera&#39;, &#39;$2&#39;, &#39;&#39;);&lt;br /&gt;   {$ENDIF}&lt;br /&gt; $15&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;This regular expression converts the following code...&lt;br /&gt;&lt;blockquote&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:&#39;courier new&#39;;&quot;&gt;function VectorFrom(x, y: Single): Vector; overload;&lt;br /&gt; begin&lt;br /&gt;   result := VectorFrom(x, y, false);&lt;br /&gt; end;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;into this code which now has the tracing details added.&lt;br /&gt;&lt;blockquote&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:&#39;courier new&#39;;&quot;&gt;function VectorFrom(x, y: Single): Vector; overload;&lt;br /&gt; begin&lt;br /&gt;   {$IFDEF TRACE}&lt;br /&gt;     TraceEnter(&#39;sgCamera&#39;, &#39;VectorFrom(x, y: Single): Vector&#39;, &#39;&#39;);&lt;br /&gt;   {$ENDIF}&lt;br /&gt;  &lt;br /&gt;   result := VectorFrom(x, y, false);&lt;br /&gt;  &lt;br /&gt;   {$IFDEF TRACE}&lt;br /&gt;     TraceExit(&#39;sgCamera&#39;, &#39;VectorFrom(x, y: Single): Vector&#39;, &#39;&#39;);&lt;br /&gt;   {$ENDIF}&lt;br /&gt; end;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;This should save me some time... though a real parser trace injector would be great!</content><link rel='replies' type='application/atom+xml' href='http://andrewcain.blogspot.com/feeds/6358354329394268646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10202973/6358354329394268646' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/6358354329394268646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/6358354329394268646'/><link rel='alternate' type='text/html' href='http://andrewcain.blogspot.com/2009/11/regex-for-tracing.html' title='Regex for Tracing'/><author><name>Anonymous</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/blank.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10202973.post-3400037514193223590</id><published>2009-10-09T09:17:00.003+11:00</published><updated>2009-10-09T09:27:45.754+11:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="mac"/><title type='text'>Finding Menu Options</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://1.bp.blogspot.com/_olmWkE7TQpE/Ss5l0BFcvWI/AAAAAAAAABg/CkoYqAjJehw/s1600-h/Screen+shot+2009-10-09+at+9.20.14+AM.png&quot;&gt;&lt;img style=&quot;float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 139px;&quot; src=&quot;http://1.bp.blogspot.com/_olmWkE7TQpE/Ss5l0BFcvWI/AAAAAAAAABg/CkoYqAjJehw/s200/Screen+shot+2009-10-09+at+9.20.14+AM.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5390357748327955810&quot; /&gt;&lt;/a&gt;Another small feature of MacOS that I use often is the help search feature. This searches for the text you type in the program&#39;s menu options. The image here shows searching for &quot;Picture&quot; in Word. Selecting one of the found options opens the menu and a pointer indicates where the option is. You can then either click the menu or just execute it directly from the help itself.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This has actually changed the way I use the menu itself. I no longer try to remember where a menu option is. Instead I use the help to search and execute the option.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewcain.blogspot.com/feeds/3400037514193223590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10202973/3400037514193223590' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/3400037514193223590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/3400037514193223590'/><link rel='alternate' type='text/html' href='http://andrewcain.blogspot.com/2009/10/finding-menu-options.html' title='Finding Menu Options'/><author><name>Anonymous</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/blank.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_olmWkE7TQpE/Ss5l0BFcvWI/AAAAAAAAABg/CkoYqAjJehw/s72-c/Screen+shot+2009-10-09+at+9.20.14+AM.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10202973.post-6982580784988990547</id><published>2009-09-25T19:41:00.002+10:00</published><updated>2009-09-25T19:50:47.200+10:00</updated><title type='text'>Dictionary Mac Tip</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://4.bp.blogspot.com/_olmWkE7TQpE/SryQl0NapmI/AAAAAAAAABY/mOGMWBXmyAk/s1600-h/Screen+shot+2009-09-25+at+7.42.00+PM.png&quot;&gt;&lt;img style=&quot;float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 138px;&quot; src=&quot;http://4.bp.blogspot.com/_olmWkE7TQpE/SryQl0NapmI/AAAAAAAAABY/mOGMWBXmyAk/s200/Screen+shot+2009-09-25+at+7.42.00+PM.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5385338233772746338&quot; /&gt;&lt;/a&gt;A few people I know have recently switched to using Macs, so I thought I would try to put up Mac related tips for them here on my blog. I&#39;ll try to do one each week, but... we&#39;ll see :).&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One cool feature of Mac OS is the ability to use the dictionary to lookup words in many applications (any that use the basic mac text rendering - so not office for example).  I find this useful when reading web sites and when writing documents. Try hovering the mouse over any word    and pressing &lt;b&gt;Command + Control + D&lt;/b&gt;. You should get a drop down that shows you the words details from the dictionary. The drop down also lets you look the word up in the thesaurus.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewcain.blogspot.com/feeds/6982580784988990547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10202973/6982580784988990547' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/6982580784988990547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/6982580784988990547'/><link rel='alternate' type='text/html' href='http://andrewcain.blogspot.com/2009/09/dictionary-mac-tip.html' title='Dictionary Mac Tip'/><author><name>Anonymous</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/blank.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_olmWkE7TQpE/SryQl0NapmI/AAAAAAAAABY/mOGMWBXmyAk/s72-c/Screen+shot+2009-09-25+at+7.42.00+PM.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10202973.post-1873721647717286779</id><published>2009-09-11T18:47:00.002+10:00</published><updated>2009-09-11T19:12:11.411+10:00</updated><title type='text'>SDL + Objective-C Garbage Collection</title><content type='html'>&lt;div&gt;Today I had another try at getting a version of SDL 1.2 with support for garbage collection. I got a bit further this time... I managed to get SDL to compile for 10.5 (and 10.6 Snow Leopard) with gc support turned on. My games run with the new framework as long as -fobj-gc isn&#39;t supported or required by the application... The games start with garbage collection, but don&#39;t it seems that there is an issue loading LiveType. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I&#39;ll have to look into it again later... but if you have any ideas let me know! (happy to provide compiled SDL framework for anyone interested in helping)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewcain.blogspot.com/feeds/1873721647717286779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10202973/1873721647717286779' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/1873721647717286779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/1873721647717286779'/><link rel='alternate' type='text/html' href='http://andrewcain.blogspot.com/2009/09/sdl-objective-c-garbage-collection.html' title='SDL + Objective-C Garbage Collection'/><author><name>Anonymous</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/blank.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10202973.post-1551809482210498602</id><published>2009-09-09T14:54:00.002+10:00</published><updated>2009-09-09T15:04:04.503+10:00</updated><title type='text'>Setting the title of a slide...</title><content type='html'>I&#39;ve been playing around with two different presentation tools and found the different approaches to scripting to be quite interesting. The two scripts are shown below.&lt;div&gt; &lt;p style=&quot;margin: 0.0px 0.0px 0.0px 39.2px; text-indent: -39.3px; font: 12.0px Verdana; min-height: 15.0px&quot;&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style=&quot;margin: 0.0px 0.0px 0.0px 39.2px; text-indent: -39.3px; font: 12.0px Verdana&quot;&gt;&lt;b&gt;tell&lt;/b&gt; &lt;span style=&quot;color:#3600fc;&quot;&gt;&lt;i&gt;application&lt;/i&gt;&lt;/span&gt; &quot;A&quot;&lt;/p&gt; &lt;p style=&quot;margin: 0.0px 0.0px 0.0px 78.5px; text-indent: -78.6px; font: 12.0px Verdana&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt; &lt;/span&gt;&lt;b&gt;set&lt;/b&gt; &lt;span style=&quot;color:#8300d9;&quot;&gt;title&lt;/span&gt; &lt;b&gt;of&lt;/b&gt; (&lt;span style=&quot;color:#8300d9;&quot;&gt;current slide&lt;/span&gt; &lt;b&gt;of&lt;/b&gt; &lt;b&gt;first&lt;/b&gt; &lt;span style=&quot;color:#3600fc;&quot;&gt;&lt;i&gt;slideshow&lt;/i&gt;&lt;/span&gt;) &lt;b&gt;to&lt;/b&gt; &quot;Hello World&quot;&lt;/p&gt; &lt;p style=&quot;margin: 0.0px 0.0px 0.0px 39.2px; text-indent: -39.3px; font: 12.0px Verdana&quot;&gt;&lt;b&gt;end&lt;/b&gt; &lt;b&gt;tell&lt;/b&gt;&lt;/p&gt; &lt;p style=&quot;margin: 0.0px 0.0px 0.0px 39.2px; text-indent: -39.3px; font: 12.0px Verdana; min-height: 15.0px&quot;&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style=&quot;margin: 0.0px 0.0px 0.0px 39.2px; text-indent: -39.3px; font: 12.0px Verdana; min-height: 15.0px&quot;&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style=&quot;margin: 0.0px 0.0px 0.0px 39.2px; text-indent: -39.3px; font: 12.0px Verdana&quot;&gt;&lt;b&gt;tell&lt;/b&gt; &lt;span style=&quot;color:#3600fc;&quot;&gt;&lt;i&gt;application&lt;/i&gt;&lt;/span&gt; &quot;B&quot;&lt;/p&gt; &lt;p  style=&quot;margin: 0.0px 0.0px 0.0px 78.5px; text-indent: -78.6px; font: 12.0px Verdana; color:#3600fc;&quot;&gt;&lt;span style=&quot;color:#000000;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;activate&lt;/b&gt;&lt;/p&gt; &lt;p style=&quot;margin: 0.0px 0.0px 0.0px 78.5px; text-indent: -78.6px; font: 12.0px Verdana; min-height: 15.0px&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt; &lt;/span&gt;&lt;/p&gt; &lt;p  style=&quot;margin: 0.0px 0.0px 0.0px 78.5px; text-indent: -78.6px; font: 12.0px Verdana; color:#8300d9;&quot;&gt;&lt;span style=&quot;color:#000000;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt; &lt;/span&gt;&lt;b&gt;set&lt;/b&gt; &lt;/span&gt;&lt;span style=&quot;color:#53930f;&quot;&gt;theIndex&lt;/span&gt;&lt;span style=&quot;color:#000000;&quot;&gt; &lt;b&gt;to&lt;/b&gt; &lt;/span&gt;slide index&lt;span style=&quot;color:#000000;&quot;&gt; &lt;b&gt;of&lt;/b&gt; &lt;/span&gt;&lt;span style=&quot;color:#3600fc;&quot;&gt;&lt;i&gt;slide&lt;/i&gt;&lt;/span&gt;&lt;span style=&quot;color:#000000;&quot;&gt; &lt;b&gt;of&lt;/b&gt; &lt;/span&gt;&lt;span style=&quot;color:#3600fc;&quot;&gt;&lt;i&gt;view&lt;/i&gt;&lt;/span&gt;&lt;span style=&quot;color:#000000;&quot;&gt; &lt;b&gt;of&lt;/b&gt; &lt;/span&gt;active window&lt;/p&gt; &lt;p  style=&quot;margin: 0.0px 0.0px 0.0px 78.5px; text-indent: -78.6px; font: 12.0px Verdana; color:#53930f;&quot;&gt;&lt;span style=&quot;color:#000000;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt; &lt;/span&gt;&lt;b&gt;set&lt;/b&gt; &lt;/span&gt;selectedSlide&lt;span style=&quot;color:#000000;&quot;&gt; &lt;b&gt;to&lt;/b&gt; &lt;/span&gt;&lt;span style=&quot;color:#3600fc;&quot;&gt;&lt;i&gt;slide&lt;/i&gt;&lt;/span&gt;&lt;span style=&quot;color:#000000;&quot;&gt; &lt;/span&gt;theIndex&lt;span style=&quot;color:#000000;&quot;&gt; &lt;b&gt;of&lt;/b&gt; &lt;/span&gt;&lt;span style=&quot;color:#8300d9;&quot;&gt;active presentation&lt;/span&gt;&lt;/p&gt; &lt;p style=&quot;margin: 0.0px 0.0px 0.0px 78.5px; text-indent: -78.6px; font: 12.0px Verdana&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt; &lt;/span&gt;&lt;b&gt;set&lt;/b&gt; &lt;span style=&quot;color:#8300d9;&quot;&gt;content&lt;/span&gt; &lt;b&gt;of&lt;/b&gt; &lt;span style=&quot;color:#3600fc;&quot;&gt;&lt;i&gt;text range&lt;/i&gt;&lt;/span&gt; &lt;b&gt;of&lt;/b&gt; &lt;span style=&quot;color:#3600fc;&quot;&gt;&lt;i&gt;text frame&lt;/i&gt;&lt;/span&gt; &lt;b&gt;of&lt;/b&gt; &lt;span style=&quot;color:#3600fc;&quot;&gt;&lt;i&gt;shape&lt;/i&gt;&lt;/span&gt; 1 &lt;b&gt;of&lt;/b&gt; &lt;span style=&quot;color:#53930f;&quot;&gt;selectedSlide&lt;/span&gt; &lt;b&gt;to&lt;/b&gt; &quot;Hello World&quot;&lt;span class=&quot;Apple-style-span&quot; style=&quot;white-space: pre; &quot;&gt; &lt;/span&gt;&lt;/p&gt; &lt;p style=&quot;margin: 0.0px 0.0px 0.0px 39.2px; text-indent: -39.3px; font: 12.0px Verdana&quot;&gt;&lt;b&gt;end&lt;/b&gt; &lt;b&gt;tell&lt;/b&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;The two scripts both set the title of the current slide to &quot;Hello World&quot;. Its interesting to note that while &quot;B&quot; has more features the script is quite brittle, things like selecting the slide in the outline cause it to fail to select the current slide.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;and the moral of the story is... &quot;don&#39;t over engineer your code... keeping things simple with clean abstractions is always better&quot;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewcain.blogspot.com/feeds/1551809482210498602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10202973/1551809482210498602' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/1551809482210498602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/1551809482210498602'/><link rel='alternate' type='text/html' href='http://andrewcain.blogspot.com/2009/09/setting-title-of-slide.html' title='Setting the title of a slide...'/><author><name>Anonymous</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/blank.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10202973.post-4038679555069495489</id><published>2009-05-12T22:03:00.002+10:00</published><updated>2009-05-12T22:07:21.697+10:00</updated><title type='text'>Explore Regex</title><content type='html'>I&#39;ve been playing around with the Google Web Toolkit, and it looks very interesting. As a small project I created a Regular Expression testing web site (see &lt;a href=&quot;http://exploreregex.appspot.com/&quot;&gt;http://exploreregex.appspot.com/&lt;/a&gt;). This uses a simple regular expression highlighting service that you post sample data and a regex, and it returns HTML formatted data indicating the matched expressions. This all works asynchronously, which the GWT makes easy...&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Next will be to add in some of the AppEngine features...&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewcain.blogspot.com/feeds/4038679555069495489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10202973/4038679555069495489' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/4038679555069495489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/4038679555069495489'/><link rel='alternate' type='text/html' href='http://andrewcain.blogspot.com/2009/05/explore-regex.html' title='Explore Regex'/><author><name>Anonymous</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/blank.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10202973.post-4056198246076052772</id><published>2008-12-27T18:39:00.002+11:00</published><updated>2008-12-27T20:02:08.738+11:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="mac"/><title type='text'>Got a new mac... what now?</title><content type='html'>A few of my friends have recently got their first mac... so what things would I recommend for anyone switching from PC to Mac?&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Realise that it will take some time to get started with a new platform... and switching to mac is the same. You will need to spend some time really getting used to using the Mac, but the effort will be worth it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1: What can I do with my PC data and apps I need to use?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think the key to switching is to immerse yourself in the new platform and avoid using the old one for a few weeks... otherwise the temptation will always be to revert back to using Windows and you will never really get the benefits a Mac has to offer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://i3.parallels.com/r/upload/pdbox.gif&quot;&gt;&lt;img style=&quot;float:left; margin:0 10px 10px 10px;cursor:pointer; cursor:hand;width: 73px; height: 107px;&quot; src=&quot;http://i3.parallels.com/r/upload/pdbox.gif&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;However, for somethings you do need Windows... Visual Studio for example. I use &lt;a href=&quot;http://www.parallels.com/&quot;&gt;Parallels&lt;/a&gt; Desktop for Mac. Its a &lt;a href=&quot;http://en.wikipedia.org/wiki/Virtual_machine&quot;&gt;virtual machine&lt;/a&gt;, and allows you to run Windows, or other operating systems, under Mac OS. I have found this has worked really well for me. If you are moving from an existing PC, you can also make use of Parallels Transporter. It can be used to create a Virtual Machine image of your existing PC. You can then use this as a full backup, ensuring you don&#39;t lose any of those important settings or data from your PC.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://www.virtualbox.org/graphics/vbox_logo2_gradient.png&quot;&gt;&lt;img style=&quot;float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 140px; height: 180px;&quot; src=&quot;http://www.virtualbox.org/graphics/vbox_logo2_gradient.png&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;An alternative to Parallels is &lt;a href=&quot;http://www.virtualbox.org/&quot;&gt;Virtual Box&lt;/a&gt;. I know a few people who have used this, but I haven&#39;t tried it myself. The benefit of this is that it is free...&lt;/div&gt;&lt;div&gt;I don&#39;t think it has an equivalent to Parallels Transporter, but you cant argue with the price.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2: What general things should I know about?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well there are many but here are a few important points:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Clicking the Red x on the top left corner only closes the window, in many cases the program is still running. You need to use the Quit link from the program&#39;s menu.&lt;/li&gt;&lt;li&gt;Running programs appear in the Dock with a small light blue ball under it.&lt;/li&gt;&lt;li&gt;You can quit a program by right clicking on the program in the Dock.&lt;/li&gt;&lt;li&gt;System Preferences is the equivalent to Control Panel.&lt;/li&gt;&lt;li&gt;Learn to use Expose.&lt;/li&gt;&lt;li&gt;Command replaces control for many shortcuts - Command Q quits for example.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Things you need to configure:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Make sure you turn on two finger scrolling, and secondary clicks with two fingers in Trackpad settings in System Preferences.&lt;/li&gt;&lt;li&gt;Set the right button on the mouse to secondary click.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;3: What Mac programs should I look at using?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://www.adiumx.com/images/logo.png&quot;&gt;&lt;img style=&quot;float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 128px; height: 128px;&quot; src=&quot;http://www.adiumx.com/images/logo.png&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;If you use any form of chat, you&#39;ll want to get &lt;a href=&quot;http://www.adiumx.com/&quot;&gt;Adium&lt;/a&gt;, a free chat client that can be used to chat with MSN, Yahoo, Google, Facebook, and others... There are heaps of extras that really make it an impressive application. The duck image is really cute, and the many replacement dock images are worth looking at.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://manual.macromates.com/images/project_window_with_tabs.png&quot;&gt;&lt;img style=&quot;float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 330px; height: 226px;&quot; src=&quot;http://manual.macromates.com/images/project_window_with_tabs.png&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://macromates.com/&quot;&gt;Textmate&lt;/a&gt; is a fantastic text editor for developers. Its not free, but it is well worth the price. It comes with many extensions, such as &lt;a href=&quot;http://ciaranwal.sh/2008/08/29/projectplus-update-2&quot;&gt;Project Plus&lt;/a&gt; that integrates SVN flags into the project draw. The extensions for different code formats are also worth looking at.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://www.educational-software.com/images/products/microsoft-office-2008-for-macintosh-full.jpg&quot;&gt;&lt;img style=&quot;float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 150px; height: 150px;&quot; src=&quot;http://www.educational-software.com/images/products/microsoft-office-2008-for-macintosh-full.jpg&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;Office for Mac is likely to be another program that you need. It is mostly compatible with the Windows version, though the 2008 edition is missing VBA support. I have both the 2008 and the 2004 version installed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are some alternatives to Office such as &lt;a href=&quot;http://www.neooffice.org/neojava/en/index.php&quot;&gt;NeoOffice&lt;/a&gt;, and Apple&#39;s &lt;a href=&quot;http://www.apple.com/iwork/&quot;&gt;iWork&lt;/a&gt;. I have been using iWork for a number of tasks, and it is great at creating presentations (in Keynote) and documents (in Pages). It is not as full featured as Office, but I have found it easier to get the layout I want in many cases.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://www.neooffice.org/neojava/images/ship2.jpg&quot;&gt;&lt;img style=&quot;float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 128px; height: 128px;&quot; src=&quot;http://www.neooffice.org/neojava/images/ship2.jpg&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://yourtech.typepad.com/main/WindowsLiveWriter/iwork.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 150px; height: 150px;&quot; src=&quot;http://yourtech.typepad.com/main/WindowsLiveWriter/iwork.png&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well that should be enough to get started with... &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewcain.blogspot.com/feeds/4056198246076052772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10202973/4056198246076052772' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/4056198246076052772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/4056198246076052772'/><link rel='alternate' type='text/html' href='http://andrewcain.blogspot.com/2008/12/got-new-mac-what-now.html' title='Got a new mac... what now?'/><author><name>Andrew Cain</name><uri>http://www.blogger.com/profile/05258615955880287223</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh6.google.com/image/alipatchdrewcain/RlFvcdwrJHI/AAAAAAAAABw/3NvTYvi0PlY/s144/Photo%207.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10202973.post-7067165678162951592</id><published>2008-12-01T14:30:00.002+11:00</published><updated>2008-12-01T15:19:04.279+11:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><category scheme="http://www.blogger.com/atom/ns#" term="teaching"/><title type='text'>Plans for APS</title><content type='html'>&lt;div&gt;Next year I will be teaching Algorithmic Problem Solving (APS) in first semester, a subject that I have developed and worked on over a few years. At the start of this year I trialled portfolio assessment with some success in this subject, though I improved on this in semester 2 with Object Oriented Programming. So what am I going to do differently next year?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: bold;&quot;&gt;Greater focus on the portfolio assessment: &lt;/span&gt;The portfolio assessment was good in this subject last year, but the focus can be even better. I found that this helped the students focus on what was important in OOP, the intended learning outcomes. My plan is to provide assessed learning activities during the semester, the resulting work will then be included in the students&#39; portfolios. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: bold;&quot;&gt;Simpler book: &lt;/span&gt;The first few times I ran this subject we used the language manual that comes with the language we are using. Its very dry, and not presented in an order that is useful for learning. This year I tried providing my own details, but didn&#39;t really get that right. So next year I will be providing a new book.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The book is what I am focusing on now. This will use a syntax based approach to learning the language, along with clear descriptions and illustrations to help students understand the programming abstractions. At this stage I have the following sections for the book:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Programs - introduces the &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: italic;&quot;&gt;Program&lt;/span&gt; abstraction and a large number of new &quot;programming language&quot; terms such as identifier, keyword, procedure, procedure call, expression, literal, etc.&lt;/li&gt;&lt;li&gt;Creating Procedures - focuses on creating your own procedures. &lt;/li&gt;&lt;li&gt;Storing and Using data - variables, and the assignment statement.&lt;/li&gt;&lt;li&gt;Passing Data Around - introduces parameters (both in, out, and in/out).&lt;/li&gt;&lt;li&gt;Calculating Values - covers functions and function calls.&lt;/li&gt;&lt;li&gt;External Libraries - introduces units, shows how to use external units, and provides an example function from the SysUtils unit.&lt;/li&gt;&lt;li&gt;User Input - Up to this stage we will have been using literal values, but now all of the framework is in place to understand user input. This includes ReadLn, as well as reading command line arguments.&lt;/li&gt;&lt;li&gt;Branching - Indicates the change from programming &quot;infrastructure&quot; to control flow, and algorithm design.&lt;/li&gt;&lt;li&gt;Looping - For, while, repeat, etc...&lt;/li&gt;&lt;li&gt;Data abstractions - now the focus changes to the programming abstractions for data. This will include arrays, records and pointers.&lt;/li&gt;&lt;li&gt;Creating Libraries - Lastly onto creating your own programming libraries&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;My idea for this is to have each section as self contained as possible. Knowledge will be built up without the need for any &quot;magic&quot;. This is the reason for delaying user input... this requires functions and out parameters, with library use being necessary if you want to convert values from strings to integers for example.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;These 11 chapters will be covered in the first five weeks of the semester. Week one will cover 1 &amp;amp; 2, week two will be 3 &amp;amp; 4, week three on 5, 6 &amp;amp; 7, week four on 8 &amp;amp; 9, and week five on 10 &amp;amp; 11. This leaves seven weeks of the semester to learn about how these abstractions are used to create programs. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Along with this I am aiming to keep the explanation of each concept or part of the syntax down to a single page, where possible. This is enough room to convey the important aspects, but not too much that the end result is overwhelming. It should also help to create a useful reference, where each idea has its own page. So far I am up to chapter 5 which start at page 39, so there isn&#39;t too may pages per chapter.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let me know what you think. I&#39;ll post up some chapters later...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewcain.blogspot.com/feeds/7067165678162951592/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10202973/7067165678162951592' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/7067165678162951592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/7067165678162951592'/><link rel='alternate' type='text/html' href='http://andrewcain.blogspot.com/2008/12/plans-for-aps.html' title='Plans for APS'/><author><name>Anonymous</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/blank.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10202973.post-2936981380753293644</id><published>2008-11-26T10:08:00.004+11:00</published><updated>2008-11-26T11:34:00.914+11:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="teaching"/><title type='text'>2008 Retrospective</title><content type='html'>Well the semester is over, and I&#39;m starting to reflect upon a year with many experiments. The big things for me this year has been trying to put into practice many of the things that I have been reading about in the education area. The main focus has been on helping students to develop a greater understanding of software development and programming in general.&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: bold;&quot;&gt;Background &amp;amp; the idea:&lt;/span&gt;&lt;br /&gt;Software development is challenging, something that is easy to forget (once you get it). We have taught this through extended practice, in many cases without addressing  or even discussing the associated principles. One of my frustrations with this has been the way many people subsequently approach their programming, usually with little thought or understanding. The classic symptom here is observed when the student makes random changes in the hope of fixing a bug, rather than thinking through their program and reasoning about its structure and implementation.&lt;br /&gt;&lt;br /&gt;Is this a symptom of a lack of experience, or a greater problem related to the students understanding of the abstractions they are working with.&lt;br /&gt;&lt;br /&gt;I am of the opinion that it is largely the latter, and that by refocusing on principles and core concepts we can teach people to better understand what they are doing when they create their own programs.&lt;br /&gt;&lt;br /&gt;The idea, for this year, has been to refocus my teaching around the core principles. Teaching the principles of structured programming in first semester, and object oriented principles in second semester.&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: bold;&quot;&gt;The method:&lt;/span&gt;&lt;br /&gt;My teaching method aimed to get students engaged with the material, it is what the student does that counts...&lt;br /&gt;&lt;br /&gt;Along with this I wanted students to be able to be adventurous, without risking losing marks. It was more important to have good quality, that a fixed time line. I moved to an extreme &quot;Theory Y&quot; position, with the perceived benefits of greater flexibility for the students along with greater responsibility.&lt;br /&gt;&lt;br /&gt;I also wanted to make better use of the lectures, by distributing weekly reading and creating podcasts and using the lectures to discuss issues students were having with the concepts.&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: bold;&quot;&gt;The results:&lt;/span&gt;&lt;br /&gt;Now that semester 2 is over I am reflecting on the results of this approach. For me it has been a real roller coaster of highs and lows. Some aspects have worked well, others need improvement.&lt;br /&gt;&lt;br /&gt;There was a marked difference between the introductory and advanced programming subjects. In general this approach has worked well with the more advanced students (Enterprise .NET), but how about the introductory subjects?&lt;br /&gt;&lt;br /&gt;Releasing control of the system was definitely a different experience, though not an overly positive one in the introductory subjects. During the semester it was obvious that many of these students had failed to take responsibility for their learning. This was seen through missed deadlines, lack of attendance, and few questions on challenging areas. Flexible due dates meant leaving work until the last minute, rather than a chance to do quality work. The marking then reflected this situation, with many of those who &quot;relaxed&quot; failing to submit anything as the workload exceeded their time remaining.&lt;br /&gt;&lt;br /&gt;On the positive side, there were some truly brilliant portfolios submitted. Those students who did take responsibility for their learning were able to demonstrate far more than I could have wished for. I hope that these students appreciated the flexibility, and the chance to explore areas they were interested in. But how can I adjust the process to better suite the larger majority of students.&lt;br /&gt;&lt;br /&gt;Another positive was the portfolio assessment. This was time consuming and while course grained it has given very &quot;accurate&quot; grades, with no students being awarded a grade higher than they deserved due to a poor testing or marking scheme. On the other hand there were some students who&#39;s result I believe could have been better if they applied themselves more to the task, and demonstrating their learning.&lt;br /&gt;&lt;br /&gt;The lecture method worked Ok with the advanced students, but need some tweaking. With the introductory subjects it really failed, which was disappointing. I think the problems were many... The text books were really 500% of what was &quot;really&quot; needed. As a result many students didn&#39;t do the required reading and subsequently blundered along trying to learn details from &quot;lectures&quot; without any real depth to their understanding. The method was significantly different and I failed to engage them in the process. Not providing my own large design early was not a great idea. Some of the lab exercises were incorrectly focused. Some of the portfolio pieces I suggested were overly large and time consuming, without the intended benefits.&lt;br /&gt;&lt;br /&gt;Some bad points:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Not enough focus on programming (overcompensation)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Only few truly engaged with the method&lt;br /&gt;&lt;/li&gt;&lt;li&gt;In general students did a poor job of managing their learning&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Some students didn&#39;t end up understanding the portfolio idea&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Some good points:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Large responsibility on students to manage their own learning.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Mature students are better equipped for this method&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Portfolios were able to capture student learning&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Assessment was &quot;fair&quot;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;No penalties for those who learn during the semester, and can communicate their learning by the end.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;English communication skills can be enhanced, and communication issues are less severe then with exams (which require time compressed communication)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: bold;&quot;&gt;Reflections &amp;amp; Plans:&lt;/span&gt;&lt;br /&gt;In summary this year has been a huge disappointment, and I&#39;ll need to try and reinvigorate myself before next year. I think the approach can work, and if I can get it right there should be some great benefits for the students. Reading back over this has, however, provided me with some hope.&lt;br /&gt;&lt;br /&gt;&quot;Once more unto the breach, dear friends, once more;&quot;&lt;br /&gt;&lt;br /&gt;My plans are to focus on teaching the learning process... as well as teaching about programming :). The method is different and I dont think I spent enough time on what was expected, and how to take advantage of the environment. I also have some more practical ideas related to using more &quot;traditional&quot; practices alongside this to help ease students into the experience. I am also more experienced now on what I need them to focus on in this approach. It has been a long time since I really engaged with these principles, and I&#39;ll be better equipped next year.&lt;br /&gt;&lt;br /&gt;So to my introductory programming students from this year... sorry...&lt;br /&gt;&lt;br /&gt;I would love to know what you thought of this experience and any suggestions you have... what do you think could be done to better next time.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;I also promise to blog more... if you are interested in my plans and progress stay in touch! I need all the help I can get :)&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewcain.blogspot.com/feeds/2936981380753293644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10202973/2936981380753293644' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/2936981380753293644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/2936981380753293644'/><link rel='alternate' type='text/html' href='http://andrewcain.blogspot.com/2008/11/2008-retrospective.html' title='2008 Retrospective'/><author><name>Anonymous</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/blank.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10202973.post-3500315465558868151</id><published>2008-09-30T10:34:00.005+10:00</published><updated>2008-09-30T10:51:48.684+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="mac"/><title type='text'>Automator Postscript Actions &amp; Leopard</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheA6-ENMGAOVRzIvuGQG6VwCEfLB7bc9pR5nT6DJtokdITTFODuYObJBMIPgX_kynhR0wO2ajcksQOrJA2MUHOXYp89JcEUCoRFP22Jt0GDT8Ha4FIRef_yTSSP_9htd-F2_VC/s200/Picture+5.png&quot;&gt;&lt;img style=&quot;float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 100px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheA6-ENMGAOVRzIvuGQG6VwCEfLB7bc9pR5nT6DJtokdITTFODuYObJBMIPgX_kynhR0wO2ajcksQOrJA2MUHOXYp89JcEUCoRFP22Jt0GDT8Ha4FIRef_yTSSP_9htd-F2_VC/s200/Picture+5.png&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;Back in &lt;a href=&quot;http://andrewcain.blogspot.com/2007/02/postscript-automator-actions.html&quot;&gt;February 2007&lt;/a&gt; I developed some Automator actions to manipulate Postscript files. I used these actions in the past to convert my presentation slides into multi-page PDFs. By creating these as scripts it became easy to quickly convert a large number of presentations into &quot;lecture notes&quot; that I could upload for the students.&lt;br /&gt;&lt;br /&gt;Today I went back to test is they worked... and they didn&#39;t! The problem was that Leopard is now unix2003 compatible, and my script wasn&#39;t. The issue was my use of the &lt;em&gt;file -i {}&lt;/em&gt; command which worked in the legacy mode, but fails when using the updated version. The fix was simple, when I found it, use &lt;em&gt;file --mime {}&lt;/em&gt;...&lt;br /&gt;&lt;br /&gt;For those who are interested... &lt;a href=&quot;http://mercury.it.swin.edu.au/swinbrain/images/a/a7/Automator_Actions.zip&quot;&gt;download the automator actions...&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewcain.blogspot.com/feeds/3500315465558868151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10202973/3500315465558868151' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/3500315465558868151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/3500315465558868151'/><link rel='alternate' type='text/html' href='http://andrewcain.blogspot.com/2008/09/automator-postscript-actions-leopard.html' title='Automator Postscript Actions &amp; Leopard'/><author><name>Anonymous</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/blank.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheA6-ENMGAOVRzIvuGQG6VwCEfLB7bc9pR5nT6DJtokdITTFODuYObJBMIPgX_kynhR0wO2ajcksQOrJA2MUHOXYp89JcEUCoRFP22Jt0GDT8Ha4FIRef_yTSSP_9htd-F2_VC/s72-c/Picture+5.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10202973.post-8999353088931252754</id><published>2008-03-05T20:17:00.005+11:00</published><updated>2008-03-06T07:33:30.866+11:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><category scheme="http://www.blogger.com/atom/ns#" term="swingame"/><title type='text'>Python is intriguing...</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://www.python.org/images/python-logo.gif&quot;&gt;&lt;img style=&quot;float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px;&quot; src=&quot;http://www.python.org/images/python-logo.gif&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;I share an office with Clinton who has lately become somewhat of a &lt;span style=&quot;font-style:italic;&quot;&gt;Python&lt;/span&gt; convert. Today I started to play with Python for the first time. Unlike &quot;normal&quot; people I didn&#39;t start with Python in Python... I started by embedding it within a Pascal program. Embedding Python within Pascal was really simple - I am totally amazed! With less than 20 lines of Pascal code you can embed a Python interpreter and have it load and run python modules.&lt;br /&gt;&lt;br /&gt;The code for this will be placed on Google Code once I have it a little farther along.&lt;br /&gt;&lt;br /&gt;Why am I doing this? We are looking at providing the ability to run Scripts within &lt;a href=&quot;http://www.swingame.com&quot;&gt;SwinGame&lt;/a&gt;, its looking like we should have something interesting soon!</content><link rel='replies' type='application/atom+xml' href='http://andrewcain.blogspot.com/feeds/8999353088931252754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10202973/8999353088931252754' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/8999353088931252754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/8999353088931252754'/><link rel='alternate' type='text/html' href='http://andrewcain.blogspot.com/2008/03/python-is-intriguing.html' title='Python is intriguing...'/><author><name>Andrew Cain</name><uri>http://www.blogger.com/profile/05258615955880287223</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh6.google.com/image/alipatchdrewcain/RlFvcdwrJHI/AAAAAAAAABw/3NvTYvi0PlY/s144/Photo%207.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10202973.post-1573127000328715988</id><published>2008-02-27T08:58:00.000+11:00</published><updated>2008-02-27T09:09:41.436+11:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="swingame"/><category scheme="http://www.blogger.com/atom/ns#" term="teaching"/><title type='text'>Portfolio Assessment</title><content type='html'>Well semester 1 has started... I can where did all that time go? This semester I am teaching HIT1301 Algorithmic Problem Solving again, and as always there are improvements to be made. This semester most of the changes revolve around the assessment, with some minor changes to the lectures and resources available. &lt;br /&gt;&lt;br /&gt;On the assessment side of things the assessment will be much more flexible than in the past. Basically for APS there will be some core assignments and tests, each quite short but covering all the basics. Passing these means you pass the subject, in most cases you need to get them working to pass so dont think 50% = pass for these! To get anything greater than this students will need to submit a portfolio that shows their capabilities and depth of understanding of software development. This means students can choose what they want to focus on, while still ensuring they cover all bases. The focus of this assessment is on depth of understanding and quality of work, rather than quantity.&lt;br /&gt;&lt;br /&gt;I&#39;ll keep you informed of how this goes... Let me know what you think of the idea.&lt;br /&gt;&lt;br /&gt;In other news we are  (well Clinton really) making progress with the new python port of &lt;a href=&quot;http://www.swingame.com&quot;&gt;SwinGame&lt;/a&gt;. This will mean that you will be able to call the SwinGame API from Python... the next step is to embed Python within SwinGame :)</content><link rel='replies' type='application/atom+xml' href='http://andrewcain.blogspot.com/feeds/1573127000328715988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10202973/1573127000328715988' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/1573127000328715988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/1573127000328715988'/><link rel='alternate' type='text/html' href='http://andrewcain.blogspot.com/2008/02/portfolio-assessment.html' title='Portfolio Assessment'/><author><name>Anonymous</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/blank.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10202973.post-3918193522461728216</id><published>2008-02-04T20:40:00.000+11:00</published><updated>2008-02-04T20:44:34.062+11:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="swingame"/><title type='text'>SwinGame Excitement</title><content type='html'>The &lt;a href=&quot;http://www.swingame.com&quot;&gt;swingame&lt;/a&gt; project has gone through some very exciting developments. Over the last few weeks we have managed to develop a new edition of SwinGame (version 1.1) and is now available for download. Have a look at the game promo videos that we have created for this of &lt;a href=&quot;http://www.youtube.com/swingame&quot;&gt;YouTube&lt;/a&gt; they have been great fun to create.&lt;br /&gt;&lt;br /&gt;Let us know what you think.</content><link rel='replies' type='application/atom+xml' href='http://andrewcain.blogspot.com/feeds/3918193522461728216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10202973/3918193522461728216' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/3918193522461728216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/3918193522461728216'/><link rel='alternate' type='text/html' href='http://andrewcain.blogspot.com/2008/02/swingame-excitement.html' title='SwinGame Excitement'/><author><name>Andrew Cain</name><uri>http://www.blogger.com/profile/05258615955880287223</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh6.google.com/image/alipatchdrewcain/RlFvcdwrJHI/AAAAAAAAABw/3NvTYvi0PlY/s144/Photo%207.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10202973.post-87361561621503357</id><published>2007-12-14T08:04:00.001+11:00</published><updated>2007-12-14T11:07:41.513+11:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="swingame"/><title type='text'>Exciting things are afoot</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxGj6cuZDDLmfdyVrk0YNQ9wjyPc9mZ8Bt-vYRW0sGkH6FjYnUuHHdJj7AA5I4rDPKXefuVuWpkU-og8NdWvSVLzksP_6CJFWPg-zDYbspyMkTminEAHbVt4Y6qKNOZdulCrwM/s1600-h/Picture+2.png&quot;&gt;&lt;img style=&quot;float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxGj6cuZDDLmfdyVrk0YNQ9wjyPc9mZ8Bt-vYRW0sGkH6FjYnUuHHdJj7AA5I4rDPKXefuVuWpkU-og8NdWvSVLzksP_6CJFWPg-zDYbspyMkTminEAHbVt4Y6qKNOZdulCrwM/s200/Picture+2.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5143612670702530994&quot; /&gt;&lt;/a&gt; The Summer Semester Project this year is working on extending the SwinGame API that was started last year. This is a really exciting project with some great outcomes already, and we&#39;re less than half way through...&lt;br /&gt;&lt;br /&gt;So what have the students achieved? The most visible part is the &lt;a href=&quot;http://www.swingame.com&quot;&gt;SwinGame&lt;/a&gt; web site. This site will be used to promote and distribute the SDKs when they are finished. The site uses a combination of MediaWiki and phpBB, combined together with a common theme. The wiki will be used to document the API while the forum will offer a place to discuss the games, and any issues with the API. You can read their comments on the &lt;a href=&quot;http://swingame.blogspot.com/&quot;&gt;SwinGameSDK Development&lt;/a&gt; blog.&lt;br /&gt;&lt;br /&gt;I&#39;ve used the SDK to create a small game, &quot;Alien Flight&quot;. Its been great fun to have a chance to play around with this, though I guess I&#39;ll need to get back to work soon :(. I&#39;ll be putting the game up on the site some time soon.&lt;br /&gt;&lt;br /&gt;Anyway check out the site and let me know what you think. Its a little empty at the moment, but we&#39;re working on getting content in soon.&lt;br /&gt;&lt;br /&gt;Have a great christmas, and new year!</content><link rel='replies' type='application/atom+xml' href='http://andrewcain.blogspot.com/feeds/87361561621503357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10202973/87361561621503357' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/87361561621503357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/87361561621503357'/><link rel='alternate' type='text/html' href='http://andrewcain.blogspot.com/2007/12/exciting-things-are-afoot.html' title='Exciting things are afoot'/><author><name>Andrew Cain</name><uri>http://www.blogger.com/profile/05258615955880287223</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh6.google.com/image/alipatchdrewcain/RlFvcdwrJHI/AAAAAAAAABw/3NvTYvi0PlY/s144/Photo%207.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxGj6cuZDDLmfdyVrk0YNQ9wjyPc9mZ8Bt-vYRW0sGkH6FjYnUuHHdJj7AA5I4rDPKXefuVuWpkU-og8NdWvSVLzksP_6CJFWPg-zDYbspyMkTminEAHbVt4Y6qKNOZdulCrwM/s72-c/Picture+2.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10202973.post-5870142249741983330</id><published>2007-10-29T21:47:00.000+11:00</published><updated>2007-10-29T22:32:45.139+11:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="mac"/><category scheme="http://www.blogger.com/atom/ns#" term="scripts"/><title type='text'>PS Printing in Leopard</title><content type='html'>Back in February I created some Automator scripts to automate the process of printing and publishing my lecture notes. These scripts hinged on the ability to use a small printer script that send the printer output to file, simple ps script. Upgrading to Leopard has caused me some issues in this regard.&lt;br /&gt;&lt;br /&gt;The first issue is the fact that the &lt;span style=&quot;font-style: italic;&quot;&gt;Print Center&lt;/span&gt; has been removed. In the past you could Option click the &lt;span style=&quot;font-style: italic;&quot;&gt;Add Printer&lt;/span&gt; button to enable the &lt;span style=&quot;font-style: italic;&quot;&gt;Advanced&lt;/span&gt; options. With the new Printer Preferences Pane  this option has been removed.  So my first issue was adding the printer back at all. After some searching I found that the cups process can be administered remotely using &lt;a href=&quot;http://localhost:631&quot;&gt;http://localhost:631&lt;/a&gt;. To create the new printer you can do the following:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Add a generic printer using Printer Preferences Pane&lt;/li&gt;&lt;li&gt;Open a web browser and navigate to &lt;a href=&quot;http://localhost:631&quot;&gt;http://localhost:631&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Navigate to the printers tab&lt;/li&gt;&lt;li&gt;Choose &lt;span style=&quot;font-style: italic;&quot;&gt;Modify Printer&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Step through the process configuring the printer as you would have in the Print Center Advanced options.&lt;/li&gt;&lt;/ol&gt;Following this process I was able to add back the printer, which unfortunately was not able to print :(.&lt;br /&gt;&lt;br /&gt;On Tiger the cups process is run by the root user, however on Leopard the security has been tightened and now the printer is run using a low privilege account, _lp. My old postscript saving scripts would output the file to any folder you chose, and then alter the ownership to the calling user. The new script can no longer do this. I&#39;ve listed the new script below for anyone interested the corrected script. Please note that you will need to setup the printer with reference to a location that can be written to by this user, I have used /tmp.&lt;br /&gt;&lt;br /&gt;I&#39;ll look into this again later, but for the moment this meets my needs. Other suggestions are welcome.&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(128, 128, 128); font-style: italic;&quot;&gt;#!/bin/sh&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(128, 128, 128); font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(128, 128, 128); font-style: italic;&quot;&gt;# Michael Goffioul&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(128, 128, 128); font-style: italic;&quot;&gt;# Updated by P T Withington for Mac OS X&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(128, 128, 128); font-style: italic;&quot;&gt;# Updated by Richard Bronosky&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(128, 128, 128); font-style: italic;&quot;&gt;# Updated by Steve Palm (N9YTY) - case insensitive URI, unique output files&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(128, 128, 128); font-style: italic;&quot;&gt;# Recreated as PS copy by Andrew Cain&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;LOGFILE=&lt;/span&gt;/tmp/psprinter.log&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;FILENAME=&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;CPBIN=&lt;/span&gt;/bin/cp&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;ECHOBIN=&lt;/span&gt;/bin/cat&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;RUNAS=&lt;/span&gt;`/usr/bin/whoami`&lt;br /&gt; &lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;Script:           $0&quot;&lt;/span&gt; &amp;gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$LOGFILE&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;Run as:           $RUNAS&quot;&lt;/span&gt; &amp;gt;&amp;gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$LOGFILE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;job:              $1&quot;&lt;/span&gt; &amp;gt;&amp;gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$LOGFILE&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;user:             $2&quot;&lt;/span&gt; &amp;gt;&amp;gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$LOGFILE&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;title:            $3&quot;&lt;/span&gt; &amp;gt;&amp;gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$LOGFILE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;num-copies:       $4&quot;&lt;/span&gt; &amp;gt;&amp;gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$LOGFILE&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;options:          $5&quot;&lt;/span&gt; &amp;gt;&amp;gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$LOGFILE&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;filename:         $6&quot;&lt;/span&gt; &amp;gt;&amp;gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$LOGFILE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: rgb(128, 128, 128); font-style: italic;&quot;&gt;# case of no argument, prints available URIs&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(177, 177, 0);&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: rgb(102, 204, 102);&quot;&gt;[&lt;/span&gt; $&lt;span style=&quot;color: rgb(128, 128, 128); font-style: italic;&quot;&gt;# -eq 0 ]; then&lt;/span&gt;&lt;br /&gt;  &lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;direct PS &lt;span style=&quot;color: rgb(0, 0, 153); font-weight: bold;&quot;&gt;\&quot;&lt;/span&gt;Unknown&lt;span style=&quot;color: rgb(0, 0, 153); font-weight: bold;&quot;&gt;\&quot;&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 153); font-weight: bold;&quot;&gt;\&quot;&lt;/span&gt;PS Writing&lt;span style=&quot;color: rgb(0, 0, 153); font-weight: bold;&quot;&gt;\&quot;&lt;/span&gt;&quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;exit&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 204);&quot;&gt;0&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(177, 177, 0);&quot;&gt;fi&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: rgb(128, 128, 128); font-style: italic;&quot;&gt;# case of wrong number of arguments&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(177, 177, 0);&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: rgb(102, 204, 102);&quot;&gt;[&lt;/span&gt; $&lt;span style=&quot;color: rgb(128, 128, 128); font-style: italic;&quot;&gt;# -ne 5 -a $# -ne 6 ]; then&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;Usage: ps job-id user title copies options [file]&quot;&lt;/span&gt;&lt;br /&gt;  &lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;exit&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 204);&quot;&gt;1&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(177, 177, 0);&quot;&gt;fi&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: rgb(128, 128, 128); font-style: italic;&quot;&gt;# get ps directory from device URI, and check write status&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;URI_PRE=&lt;/span&gt;`&lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$DEVICE_URI&lt;/span&gt; | cut -c &lt;span style=&quot;color: rgb(204, 102, 204);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 102, 204);&quot;&gt;-2&lt;/span&gt; | tr &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;[a-z]&quot;&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;[A-Z]&quot;&lt;/span&gt;`&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;URI_BODY=&lt;/span&gt;`&lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$DEVICE_URI&lt;/span&gt; | cut -c &lt;span style=&quot;color: rgb(204, 102, 204);&quot;&gt;3&lt;/span&gt;-`&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;DEVICE_URI=&lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;${URI_PRE}${URI_BODY}&quot;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;Device URI: $DEVICE_URI&quot;&lt;/span&gt; &amp;gt;&amp;gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$LOGFILE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;PSDIR=&lt;/span&gt;$&lt;span style=&quot;color: rgb(102, 204, 102);&quot;&gt;{&lt;/span&gt;DEVICE_URI&lt;span style=&quot;color: rgb(128, 128, 128); font-style: italic;&quot;&gt;#PS:}&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(177, 177, 0);&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: rgb(102, 204, 102);&quot;&gt;[&lt;/span&gt; `&lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$PSDIR&lt;/span&gt;|cut -c1&lt;span style=&quot;color: rgb(204, 102, 204);&quot;&gt;-3&lt;/span&gt;` = //~ &lt;span style=&quot;color: rgb(102, 204, 102);&quot;&gt;]&lt;/span&gt;; &lt;span style=&quot;color: rgb(177, 177, 0);&quot;&gt;then&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;PSDIR=&lt;/span&gt;/Users/$&lt;span style=&quot;color: rgb(204, 102, 204);&quot;&gt;2&lt;/span&gt;`&lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$PSDIR&lt;/span&gt;|cut -c4-`&lt;br /&gt;  &lt;span style=&quot;color: rgb(128, 128, 128); font-style: italic;&quot;&gt;# This step added by Richard Bronosky to allow referencing the users home directory&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(177, 177, 0);&quot;&gt;fi&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;PS DIR: $PSDIR&quot;&lt;/span&gt; &amp;gt;&amp;gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$LOGFILE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: rgb(177, 177, 0);&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: rgb(102, 204, 102);&quot;&gt;[&lt;/span&gt;&amp;nbsp;! -d &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;$PSDIR&quot;&lt;/span&gt; -o&amp;nbsp;! -w &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;$PSDIR&quot;&lt;/span&gt; &lt;span style=&quot;color: rgb(102, 204, 102);&quot;&gt;]&lt;/span&gt;; &lt;span style=&quot;color: rgb(177, 177, 0);&quot;&gt;then&lt;/span&gt;&lt;br /&gt;  &lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;ERROR: $PSDIR not writable&quot;&lt;/span&gt; &amp;gt;&amp;gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$LOGFILE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;ERROR: directory $PSDIR not writable&quot;&lt;/span&gt;&lt;br /&gt;  &lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;exit&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 204);&quot;&gt;1&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(177, 177, 0);&quot;&gt;fi&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;ps directory:    $PSDIR&quot;&lt;/span&gt; &amp;gt;&amp;gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$LOGFILE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: rgb(128, 128, 128); font-style: italic;&quot;&gt;# generate output filename&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;OUTPUTFILENAME=&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(177, 177, 0);&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: rgb(102, 204, 102);&quot;&gt;[&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;$3&quot;&lt;/span&gt; = &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span style=&quot;color: rgb(102, 204, 102);&quot;&gt;]&lt;/span&gt;; &lt;span style=&quot;color: rgb(177, 177, 0);&quot;&gt;then&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;OUTPUTFILENAME=&lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;$PSDIR/unknown.ps&quot;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(177, 177, 0);&quot;&gt;else&lt;/span&gt;&lt;br /&gt;  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;OUTPUTFILENAME=&lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;$PSDIR/${3//[^[:alnum:]]/_}.ps&quot;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(177, 177, 0);&quot;&gt;fi&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;FBASE=&lt;/span&gt;`basename &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$&lt;span style=&quot;color: rgb(102, 204, 102);&quot;&gt;{&lt;/span&gt;OUTPUTFILENAME&lt;span style=&quot;color: rgb(102, 204, 102);&quot;&gt;}&lt;/span&gt;&lt;/span&gt; .ps`&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;typeset&lt;/span&gt; -i &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;I=&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 102, 204);&quot;&gt;1&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(177, 177, 0);&quot;&gt;while&lt;/span&gt; &lt;span style=&quot;color: rgb(102, 204, 102);&quot;&gt;[&lt;/span&gt; -e &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$OUTPUTFILENAME&lt;/span&gt; &lt;span style=&quot;color: rgb(102, 204, 102);&quot;&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(177, 177, 0);&quot;&gt;do&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;OUTPUTFILENAME=&lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;${PSDIR}/${FBASE}_$I.ps&quot;&lt;/span&gt;&lt;br /&gt;   &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;I=&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$I&lt;/span&gt;&lt;span style=&quot;color: rgb(204, 102, 204);&quot;&gt;+1&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(177, 177, 0);&quot;&gt;done&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;Output file name: $OUTPUTFILENAME&quot;&lt;/span&gt; &amp;gt;&amp;gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$LOGFILE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: rgb(128, 128, 128); font-style: italic;&quot;&gt;# move ps to destination&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(177, 177, 0);&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: rgb(102, 204, 102);&quot;&gt;[&lt;/span&gt; $&lt;span style=&quot;color: rgb(128, 128, 128); font-style: italic;&quot;&gt;# -eq 6 ]; then&lt;/span&gt;&lt;br /&gt;  &lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;copy $6 $OUTPUTFILENAME&quot;&lt;/span&gt;&lt;br /&gt;  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$CPBIN&lt;/span&gt; $&lt;span style=&quot;color: rgb(204, 102, 204);&quot;&gt;6&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$OUTPUTFILENAME&lt;/span&gt; &amp;gt;&amp;gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$LOGFILE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(128, 128, 128); font-style: italic;&quot;&gt;#  $GSBIN $6 -o $OUTPUTFILENAME &amp;gt;&amp;gt; $LOGFILE&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(177, 177, 0);&quot;&gt;else&lt;/span&gt;&lt;br /&gt;  &lt;span style=&quot;color: rgb(128, 128, 128); font-style: italic;&quot;&gt;#cp /dev/stdin $OUTPUTFILENAME&lt;/span&gt;&lt;br /&gt;  &lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;$ECHOBIN - &amp;gt;&amp;gt; $OUTPUTFILENAME&quot;&lt;/span&gt;&lt;br /&gt;  &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$ECHOBIN&lt;/span&gt; - &amp;gt;&amp;gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$OUTPUTFILENAME&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(128, 128, 128); font-style: italic;&quot;&gt;#  $GSBIN -i -o $OUTPUTFILENAME &amp;gt;&amp;gt; $LOGFILE&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(177, 177, 0);&quot;&gt;fi&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: rgb(128, 128, 128); font-style: italic;&quot;&gt;# modify ownership and permissions on the file&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(128, 128, 128); font-style: italic;&quot;&gt;#  - world readable&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(128, 128, 128); font-style: italic;&quot;&gt;#  - owns to user specified in argument&lt;/span&gt;&lt;br /&gt;chmod a+r &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$OUTPUTFILENAME&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(177, 177, 0);&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: rgb(102, 204, 102);&quot;&gt;[&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;$2&quot;&lt;/span&gt;&amp;nbsp;!= &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span style=&quot;color: rgb(102, 204, 102);&quot;&gt;]&lt;/span&gt;; &lt;span style=&quot;color: rgb(177, 177, 0);&quot;&gt;then&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&quot;Change ownership with: chown $2 $OUTPUTFILENAME&quot;&lt;/span&gt; &amp;gt;&amp;gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$LOGFILE&lt;/span&gt;&lt;br /&gt;  chown $&lt;span style=&quot;color: rgb(204, 102, 204);&quot;&gt;2&lt;/span&gt; &lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;$OUTPUTFILENAME&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(177, 177, 0);&quot;&gt;fi&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 102);&quot;&gt;exit&lt;/span&gt; &lt;span style=&quot;color: rgb(204, 102, 204);&quot;&gt;0&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrewcain.blogspot.com/feeds/5870142249741983330/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10202973/5870142249741983330' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/5870142249741983330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/5870142249741983330'/><link rel='alternate' type='text/html' href='http://andrewcain.blogspot.com/2007/10/ps-printing-in-leopard.html' title='PS Printing in Leopard'/><author><name>Andrew Cain</name><uri>http://www.blogger.com/profile/05258615955880287223</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh6.google.com/image/alipatchdrewcain/RlFvcdwrJHI/AAAAAAAAABw/3NvTYvi0PlY/s144/Photo%207.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10202973.post-6694360439837669898</id><published>2007-10-26T22:18:00.001+10:00</published><updated>2007-10-26T22:25:50.906+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="mac"/><title type='text'>Meow...</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://images.apple.com/home/2007/images/leopardavailable_20071026.jpg&quot;&gt;&lt;img style=&quot;float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px;&quot; src=&quot;http://images.apple.com/home/2007/images/leopardavailable_20071026.jpg&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;Ok installing Leopard was a little more complicated that I thought! &lt;br /&gt;&lt;br /&gt;The main problem related to a lack of resources...&lt;br /&gt;&lt;br /&gt;Yes, thats right, we were nearly out of diesel and with the current diesel shortage finding some so we could get home was an issue :)&lt;br /&gt;&lt;br /&gt;Ok, now seriously. Install = insert DVD, double click (install icon), enter username/password, click, click, click, wait, wait, click, done. It ... well ... just worked.&lt;br /&gt;&lt;br /&gt;Total time almost 2hrs. Validating the DVD took 1hr, install took 1hr.&lt;br /&gt;&lt;br /&gt;I did need to login with my admin account to finish the registration. Most apps are working, though I found that Menu Shades doesn&#39;t... </content><link rel='replies' type='application/atom+xml' href='http://andrewcain.blogspot.com/feeds/6694360439837669898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10202973/6694360439837669898' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/6694360439837669898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/6694360439837669898'/><link rel='alternate' type='text/html' href='http://andrewcain.blogspot.com/2007/10/meow.html' title='Meow...'/><author><name>Andrew Cain</name><uri>http://www.blogger.com/profile/05258615955880287223</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh6.google.com/image/alipatchdrewcain/RlFvcdwrJHI/AAAAAAAAABw/3NvTYvi0PlY/s144/Photo%207.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10202973.post-3591665522375386404</id><published>2007-10-26T17:48:00.001+10:00</published><updated>2007-10-26T17:48:41.753+10:00</updated><title type='text'>Alpha Geek</title><content type='html'>Last launch party I went to was for Windows 98... which was a bit disappointing, and as Raj reminds me took me until 4 in the morning to install. If I remember correctly... the issue was drivers for my SCSI HDD.&lt;br /&gt;&lt;br /&gt;So does it make me a Geek to say that even though I should be home in bed (... I&#39;m not well), tonight I&#39;ll be there at the Leopard &quot;Launch Party&quot; down at the nearest store?&lt;br /&gt;&lt;br /&gt;I hope so :)&lt;br /&gt;&lt;br /&gt;More details once this Tiger has gone, and a Leopard takes its place. That is assuming the update goes to plan... I&#39;m dreaming right... this never really works... Well I&#39;ll let you all know soon enough.</content><link rel='replies' type='application/atom+xml' href='http://andrewcain.blogspot.com/feeds/3591665522375386404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10202973/3591665522375386404' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/3591665522375386404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/3591665522375386404'/><link rel='alternate' type='text/html' href='http://andrewcain.blogspot.com/2007/10/alpha-geek.html' title='Alpha Geek'/><author><name>Andrew Cain</name><uri>http://www.blogger.com/profile/05258615955880287223</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh6.google.com/image/alipatchdrewcain/RlFvcdwrJHI/AAAAAAAAABw/3NvTYvi0PlY/s144/Photo%207.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10202973.post-9071583038959456807</id><published>2007-10-25T11:24:00.001+10:00</published><updated>2007-10-25T11:24:09.811+10:00</updated><title type='text'>Whats up?</title><content type='html'>Well I haven&#39;t blogged for a while... and I just found a nice little Blogger Widget that allows me to post from Dashboard.&lt;br /&gt;&lt;br /&gt;So what exciting has happened lately? Well not much, actually. The semester went slowly at the start but the last few weeks have really shot by.&lt;br /&gt;&lt;br /&gt;In OOP the SwinTrek assignment appears to have causes some students issues, but those who really put in the effort are now showing the benefits. I definately think the assignment has proven itself in terms of learning outcomes.&lt;br /&gt;&lt;br /&gt;Advanced .NET is crusing along. The students are now starting to push themselves. Maybe I need to make the assignments due a bi earlier.&lt;br /&gt;&lt;br /&gt;Well thats enough for now. If your studying one of my subjects please let me know what you think...</content><link rel='replies' type='application/atom+xml' href='http://andrewcain.blogspot.com/feeds/9071583038959456807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10202973/9071583038959456807' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/9071583038959456807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/9071583038959456807'/><link rel='alternate' type='text/html' href='http://andrewcain.blogspot.com/2007/10/whats-up.html' title='Whats up?'/><author><name>Andrew Cain</name><uri>http://www.blogger.com/profile/05258615955880287223</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh6.google.com/image/alipatchdrewcain/RlFvcdwrJHI/AAAAAAAAABw/3NvTYvi0PlY/s144/Photo%207.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10202973.post-3803910419297422567</id><published>2007-09-11T21:00:00.000+10:00</published><updated>2007-09-11T21:07:38.957+10:00</updated><title type='text'>What should we aim for?</title><content type='html'>There has been renewed discussion of &lt;span style=&quot;font-weight:bold;&quot;&gt;another&lt;/span&gt; round of curriculum review. If we are to review the PSD degree what should we change? What should the aims of the degree be?&lt;br /&gt;&lt;br /&gt;I think we need to build good basic software development skills, but focus more on generic skills like the ability to learn independently, investigate/research topics etc.&lt;br /&gt;&lt;br /&gt;Any ideas?</content><link rel='replies' type='application/atom+xml' href='http://andrewcain.blogspot.com/feeds/3803910419297422567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10202973/3803910419297422567' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/3803910419297422567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/3803910419297422567'/><link rel='alternate' type='text/html' href='http://andrewcain.blogspot.com/2007/09/what-should-we-aim-for.html' title='What should we aim for?'/><author><name>Andrew Cain</name><uri>http://www.blogger.com/profile/05258615955880287223</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh6.google.com/image/alipatchdrewcain/RlFvcdwrJHI/AAAAAAAAABw/3NvTYvi0PlY/s144/Photo%207.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10202973.post-5722846739267468813</id><published>2007-09-10T16:44:00.000+10:00</published><updated>2007-09-10T17:37:15.617+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="teaching"/><title type='text'>How important is being open?</title><content type='html'>I&#39;ve been so busy since I got back from leave that I haven&#39;t had ten minutes to put any of my thoughts down in writing. Today I&#39;ve finally got some time to spare so I thought I would write a quick blog entry.&lt;br /&gt;&lt;br /&gt;Over the last two years we have been planning, developing, and delivering the new Bachelor of Science (Professional Software Development) or PSD for short. This is a new degree program aimed at teaching students about modern software development, agile processes, etc. This semester I have been teaching the new Database Programming subject, the last of their programming subjects, and so I&#39;ve been looking back to see how the program has turned out.&lt;br /&gt;&lt;br /&gt;I think in general that the new degree has been quite a bit of an improvement over previous degrees, in that very few of the students &quot;hate&quot; programming. However I think we can improve further in some areas. The one the has surprised me the most is how fixed in their ways some of the students are. Anything that offers a slight challenge is a major obstacle, and the tool is always seems to be to blame. Its not that they are not capable of using the tools, its their attitude that I am finding intriguing. The old saying &quot;A poor worker blames his tools&quot; keeps popping into my mind... Having said all of this, there are also students who are doing well, and are handling the challenges in an admirable fashion. I just want to improve the odds...&lt;br /&gt;&lt;br /&gt;I think its really important to be open to new ideas, and to be prepared to spend time to understand how a tool works. As software developers these students are going to be constantly faced with configuration/installation/integration types of problems. They will need to be able to work out how other software works in order to be able to work effectively with it. &lt;br /&gt;&lt;br /&gt;Anyone have any ideas for how we can encourage these students to be more open in their thinking?&lt;br /&gt;&lt;br /&gt;I want them to be inquisitive about technology, prepared to explore the potential of various solutions.&lt;br /&gt;&lt;br /&gt;I think what shocked me most (and got me wanting to write this) was one conversation I overheard... it went something like this:&lt;br /&gt;&lt;br /&gt;&quot;My notebook is running too slow. I think I will install Linux and Beryl like X did.&quot;&lt;br /&gt;&quot;Really! You dont want to do that. He will have spent ages tweaking it... do you really want to do that... etc. etc.&quot;&lt;br /&gt;&quot;Yeah your right, installing Linux is too difficult... etc. etc.&quot;&lt;br /&gt;&lt;br /&gt;This really isn&#39;t what you want to hear. Playing around with another OS is a really good learning experience, and a good working knowledge of Linux is a real advantage. Not installing it because you may have to learn how to configure it is a really lame excuse. My suggestion, install Linux. Play with Beryl. What have you lost if you end up going back to Windows? Setup a dual boot, then you can play with Windows and Linux. Learning should be fun.</content><link rel='replies' type='application/atom+xml' href='http://andrewcain.blogspot.com/feeds/5722846739267468813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10202973/5722846739267468813' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/5722846739267468813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/5722846739267468813'/><link rel='alternate' type='text/html' href='http://andrewcain.blogspot.com/2007/09/how-important-is-being-open.html' title='How important is being open?'/><author><name>Andrew Cain</name><uri>http://www.blogger.com/profile/05258615955880287223</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh6.google.com/image/alipatchdrewcain/RlFvcdwrJHI/AAAAAAAAABw/3NvTYvi0PlY/s144/Photo%207.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10202973.post-8026645847587568026</id><published>2007-07-25T17:52:00.000+10:00</published><updated>2007-07-25T17:57:39.553+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="subjects"/><title type='text'>Back to work</title><content type='html'>The &lt;a href=&quot;http://alipatch.blogspot.com&quot;&gt;holiday&lt;/a&gt; had to end at some stage... I&#39;m back at work now, and not much has changed. Currently getting ready for the semester which starts in a few weeks.&lt;br /&gt;&lt;br /&gt;My main problem at the moment is finding tutors for a new subject on Database Programming. If you know anyone good who is interested in teaching, and knows Java + C# (or one and happy to learn the other) please let me know. We currently have 6 hours of laboratories that need a tutor. Any ideas?</content><link rel='replies' type='application/atom+xml' href='http://andrewcain.blogspot.com/feeds/8026645847587568026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10202973/8026645847587568026' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/8026645847587568026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/8026645847587568026'/><link rel='alternate' type='text/html' href='http://andrewcain.blogspot.com/2007/07/back-to-work.html' title='Back to work'/><author><name>Andrew Cain</name><uri>http://www.blogger.com/profile/05258615955880287223</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh6.google.com/image/alipatchdrewcain/RlFvcdwrJHI/AAAAAAAAABw/3NvTYvi0PlY/s144/Photo%207.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10202973.post-2607451597227171758</id><published>2007-05-10T17:31:00.000+10:00</published><updated>2007-05-10T18:09:00.759+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="concurrency"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><category scheme="http://www.blogger.com/atom/ns#" term="subjects"/><title type='text'>To Thread or Not To Thread</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://www.bbc.co.uk/drama/shakespeare/60secondshakespeare/images/times/hamlet_yorick.jpg&quot;&gt;&lt;img style=&quot;float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px;&quot; src=&quot;http://www.bbc.co.uk/drama/shakespeare/60secondshakespeare/images/times/hamlet_yorick.jpg&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;Today I have been asked a few threading questions from students studying at Swinburne. Usually these were about the &quot;How to&quot; do something with threads, when I think the real question was should threads be used at all?&lt;br /&gt;&lt;br /&gt;From what I know these students are developing a torrent like application and network protocol. The issue is that they need to accept data from a number of peers at the same time. Initially this appears to suggest the need for threads... but are they really needed?&lt;br /&gt;&lt;br /&gt;In this case I think not. The project indicate potentially thousands of peers... a threaded client with one thread per client will kill the machine with context switches before any real work can be done. So what is the answer? &lt;strong&gt;Non-Blocking IO&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;With Non-Blocking IO you dont need to block, waiting for data to arrive from a peer. Rather you keep a list of connected peers and then loop through those that have data currently available. This can all be performed on a single thread, giving good performance and throughput. &lt;br /&gt;&lt;br /&gt;Java offers a number a library of non-blocking IO utilities. Have a look at the &lt;a href=&quot;http://java.sun.com/j2se/1.4.2/docs/guide/nio/example/NBTimeServer.java&quot;&gt;NBTimeServer.java&lt;/a&gt; example. This shows a time server that accepts connections using non-blocking IO. A quick look through the Java API and you will find the &lt;a href=&quot;http://java.sun.com/j2se/1.5.0/docs/api/java/nio/channels/SelectableChannel.html#register(java.nio.channels.Selector,%20int)&quot;&gt;SelectableChannel&lt;/a&gt; and the &lt;a href=&quot;http://java.sun.com/j2se/1.4.2/docs/api/java/nio/channels/SelectionKey.html&quot;&gt;SelectionKey&lt;/a&gt; class. Using the register methods, and the various SelectionKey options you can loop through only those connections that actually have data waiting to be processed.&lt;br /&gt;&lt;br /&gt;There is a good article, with a good source code example at &lt;a href=&quot;http://tim.owlmountain.com/tutorials/NonBlockingIo.htm&quot;&gt;http://tim.owlmountain.com/tutorials/NonBlockingIo.htm&lt;/a&gt; though there is an interesting note at the start.&lt;br /&gt;As suggested in the article, you could also look at &lt;a href=&quot;http://mina.apache.org/&quot;&gt;MINA&lt;/a&gt; the &lt;strong&gt;Multipurpose Infrastructure for Network Applications&lt;/strong&gt;. If you use MINA just stick with the basic &quot;getting started&quot; code and build on top of that. There is no real need to worry about fiddling with the thread model. But... check with the subject convener first...</content><link rel='replies' type='application/atom+xml' href='http://andrewcain.blogspot.com/feeds/2607451597227171758/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10202973/2607451597227171758' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/2607451597227171758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/2607451597227171758'/><link rel='alternate' type='text/html' href='http://andrewcain.blogspot.com/2007/05/to-thread-or-not-to-thread.html' title='To Thread or Not To Thread'/><author><name>Andrew Cain</name><uri>http://www.blogger.com/profile/05258615955880287223</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh6.google.com/image/alipatchdrewcain/RlFvcdwrJHI/AAAAAAAAABw/3NvTYvi0PlY/s144/Photo%207.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10202973.post-1423705108561593844</id><published>2007-05-08T14:46:00.000+10:00</published><updated>2007-05-08T15:01:35.087+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><category scheme="http://www.blogger.com/atom/ns#" term="subjects"/><title type='text'>Programming 2D Games</title><content type='html'>Are you interested in programming 2d games? Got a PC, Mac, or linux box? That all you need with the new &lt;a href=&quot;http://mercury.it.swin.edu.au/swinbrain/index.php/SwinGame_V2_Pascal_API&quot;&gt;SwinGame API&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The SwinGame API was developed initially by &lt;a href=&quot;http://mercury.it.swin.edu.au/swinbrain/index.php/User:Dchambers&quot;&gt;Daniel Chambers&lt;/a&gt; as a Windows API for developing small games. Over the last few weeks I have been modifying the code to extend its features, and to make it cross platform. The latest version is still in testing, but is worth looking at if you are interested in creating a 2D game.&lt;br /&gt;&lt;br /&gt;SwinGame features:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Window drawing is double buffered&lt;/li&gt;&lt;li&gt;Create a Window of any size&lt;/li&gt;&lt;li&gt;Load and display images of various formats including bmp, png, and jpg&lt;/li&gt;&lt;li&gt;Works with 32 bit images, including alpha blending&lt;/li&gt;&lt;li&gt;Load true type fonts&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Read and write text&lt;/li&gt;&lt;li&gt;Draw lines, and shapes&lt;/li&gt;&lt;li&gt;Sprite management routines&lt;/li&gt;&lt;li&gt;Load and play sounds in various formats including wav, ogg, and mp3&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Detect collisions between sprites, bitmaps, and areas of the screen&lt;/li&gt;&lt;li&gt;Perform pixel level collision detection&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Vector manipulation routines&lt;/li&gt;&lt;li&gt;Use matrices to manipulate game vectors &lt;/li&gt;&lt;/ul&gt;There are a couple of games in the process of being built by the 1st year PSD students at the moment, and I will make these available for download from &lt;a href=&quot;http://mercury.it.swin.edu.au/swinbrain&quot;&gt;SwinBrain&lt;/a&gt; as soon as they are complete.</content><link rel='replies' type='application/atom+xml' href='http://andrewcain.blogspot.com/feeds/1423705108561593844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10202973/1423705108561593844' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/1423705108561593844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/1423705108561593844'/><link rel='alternate' type='text/html' href='http://andrewcain.blogspot.com/2007/05/programming-2d-games.html' title='Programming 2D Games'/><author><name>Andrew Cain</name><uri>http://www.blogger.com/profile/05258615955880287223</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh6.google.com/image/alipatchdrewcain/RlFvcdwrJHI/AAAAAAAAABw/3NvTYvi0PlY/s144/Photo%207.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10202973.post-9146644343823278685</id><published>2007-03-27T16:34:00.000+10:00</published><updated>2007-03-27T16:48:49.579+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><category scheme="http://www.blogger.com/atom/ns#" term="teaching"/><title type='text'>Empty your Mind</title><content type='html'>Today one of the PSD students showed me what he had started for the game he was developing for Algorithmic Problem Solving. He had started on the game yesterday, and it already looks quite impressive. Basically this is going to be a scrolling space arcade game. So far he has the weapon firing in a number of shot combinations. The screenshot below shows the largest fire pattern.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVpBOoPV3qxBlemTcwqQqVV2F6l71dXmXQ3Qm-7BBUKa6tA411jYQIb3h6eQBa9RHrcXCEvaxDMZR_mXpAkRPU7yxmqsGCk51MVELxYrWLAUimt_G_j9XqSZNJMnAX4breuwYt/s1600-h/Picture+1.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVpBOoPV3qxBlemTcwqQqVV2F6l71dXmXQ3Qm-7BBUKa6tA411jYQIb3h6eQBa9RHrcXCEvaxDMZR_mXpAkRPU7yxmqsGCk51MVELxYrWLAUimt_G_j9XqSZNJMnAX4breuwYt/s200/Picture+1.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5046489516663118194&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Looks like some of the students are having fun with this assignment. The SwinGameAPI is a real hit, making this possible without having to worry about many complexities. &lt;br /&gt;&lt;br /&gt;Keep the games coming...</content><link rel='replies' type='application/atom+xml' href='http://andrewcain.blogspot.com/feeds/9146644343823278685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/10202973/9146644343823278685' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/9146644343823278685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10202973/posts/default/9146644343823278685'/><link rel='alternate' type='text/html' href='http://andrewcain.blogspot.com/2007/03/empty-your-mind.html' title='Empty your Mind'/><author><name>Andrew Cain</name><uri>http://www.blogger.com/profile/05258615955880287223</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://lh6.google.com/image/alipatchdrewcain/RlFvcdwrJHI/AAAAAAAAABw/3NvTYvi0PlY/s144/Photo%207.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVpBOoPV3qxBlemTcwqQqVV2F6l71dXmXQ3Qm-7BBUKa6tA411jYQIb3h6eQBa9RHrcXCEvaxDMZR_mXpAkRPU7yxmqsGCk51MVELxYrWLAUimt_G_j9XqSZNJMnAX4breuwYt/s72-c/Picture+1.png" height="72" width="72"/><thr:total>4</thr:total></entry></feed>