<?xml version='1.0' encoding='UTF-8' ?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title>The creation of a new order of things</title>
	<updated>2012-12-14T13:44:28-05:00</updated>
	<id>http://www.cincomsmalltalk.com/userblogs/antony/blogView</id>
	<rights>Copyright 2007 Antony Blakey</rights>
	<generator uri="/CincomSmalltalkWiki/Silt" version="1.0">Silt Syndication Generator</generator>
	<link href="http://www.cincomsmalltalk.com/userblogs/antony/blogView" rel="alternate" type="text/html"></link>
	<link href="/rssBlog/antony-atom02.xml" rel="self" type="application/atom+xml"></link>
	<entry>
		<title>Onwards and Upwards ...</title>
		<id>http://www.cincomsmalltalk.com/userblogs/antony/blogView?showComments=true&amp;printTitle=Onwards_and_Upwards_...&amp;entry=3525121925</id>
		<updated>2012-09-15T00:32:05-04:00</updated>
		<author>
			<name>Antony Blakey</name>
			<uri>http://www.cincomsmalltalk.com/userblogs/antony/blogView</uri>
			<email>antony.blakey@linkuistics.com.au</email>
		</author>
		<content type="html" xml:lang="en-us"><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p>I've not posted for a while, but now I have some news.



As of next Monday 24/9, I'll be working for Cincom on the GUI/Tools team.



I'm not at liberty to say what I'll be working on in detail, but it's exciting stuff, and this blog is obviously a good pointer to what I'm interested in and what I personally regard as important.



Happy Days!
</p></div>]]></content>
		<link href="http://www.cincomsmalltalk.com/userblogs/antony/blogView?showComments=true&amp;entry=3525121925" rel="alternate" type="text/html"></link>
		<category term="general"></category>
	</entry>
	<entry>
		<title>LinkuisticsLAF for VW 7.7, published</title>
		<id>http://www.cincomsmalltalk.com/userblogs/antony/blogView?showComments=true&amp;printTitle=LinkuisticsLAF_for_VW_7.7,_published&amp;entry=3431737398</id>
		<updated>2009-09-30T04:23:18-04:00</updated>
		<author>
			<name>Antony Blakey</name>
			<uri>http://www.cincomsmalltalk.com/userblogs/antony/blogView</uri>
			<email>antony.blakey@linkuistics.com.au</email>
		</author>
		<content type="html" xml:lang="en-us"><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p><style type='text/css'>

.ASBBlog div.code

{

	margin: 1ex 2em 1ex 2em;

	border: 1px dotted grey;

	padding: 0 1em 0 1em;

	background-color: rgb(230,230,230);

}

.ASBBlog div.callout div.label

{

	font-weight: bold;

    position: absolute;

	margin-top: -0.8em;

	padding: 0 1ex 0 1ex;

	background-color: white;

	border: 1px dotted rgb(128,64,64);

}

.ASBBlog div.callout

{

	margin: 1.5em 2em 0 2em;

	padding: 0 1em 0 1em;

	border: 1px dotted rgb(128,64,64);

	background-color: rgb(230,230,255);

}

.ASBBlog code

{

	font-family: Monaco, monospace;

	color: rgb(0,128,0);

}

</style>



<div class="ASBBlog">



<p>I've published a version of LinkuisticsLAF that loads into VW 7.7, sep09.4. There are a few minor issues, but it's usable. Note that version won't work for 7.6.</p>



<p><img src="files/20090930/LinkuisticsLAF_in_VW7.7.png"/></p>



</div>
</p></div>]]></content>
		<link href="http://www.cincomsmalltalk.com/userblogs/antony/blogView?showComments=true&amp;entry=3431737398" rel="alternate" type="text/html"></link>
		<category term="general"></category>
	</entry>
	<entry>
		<title>LinkuisticsUI in VW 7.7</title>
		<id>http://www.cincomsmalltalk.com/userblogs/antony/blogView?showComments=true&amp;printTitle=LinkuisticsUI_in_VW_7.7&amp;entry=3430783472</id>
		<updated>2009-09-19T03:24:32-04:00</updated>
		<author>
			<name>Antony Blakey</name>
			<uri>http://www.cincomsmalltalk.com/userblogs/antony/blogView</uri>
			<email>antony.blakey@linkuistics.com.au</email>
		</author>
		<content type="html" xml:lang="en-us"><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p><style type='text/css'>

.ASBBlog div.code

{

	margin: 1ex 2em 1ex 2em;

	border: 1px dotted grey;

	padding: 0 1em 0 1em;

	background-color: rgb(230,230,230);

}

.ASBBlog div.callout div.label

{

	font-weight: bold;

    position: absolute;

	margin-top: -0.8em;

	padding: 0 1ex 0 1ex;

	background-color: white;

	border: 1px dotted rgb(128,64,64);

}

.ASBBlog div.callout

{

	margin: 1.5em 2em 0 2em;

	padding: 0 1em 0 1em;

	border: 1px dotted rgb(128,64,64);

	background-color: rgb(230,230,255);

}

.ASBBlog code

{

	font-family: Monaco, monospace;

	color: rgb(0,128,0);

}

</style>



<div class="ASBBlog">



<p>My initial adaptation of LinkuisticsUI to enable it to load in VW 7.7 (sep09.3) has worked. It still works in 7.6. Not yet available in the public store, but soon.</p>



<p>It has some visual glitches - font baselines seem slightly different, the splitters are unusably slow, the tab control overflow arrow mechanism has changed, and the icons don't play nice. I'm planning on retaining my icons for the lists, except maybe the package tree. Primarily because matching the new icons is an unrealistic amount of work. This is the main reason my iconography looks like it does - people without artistic ability/tools can extend my icon set without it looking like a dogs breakfast. This seems to me to be an absolute requirement in a user-extensible environment such as Smalltalk, which isn't feasible with the more usual icons that VW used/uses. I coincidentally find the less in-your-face design more attractive and usable.</p>



<p><img src="files/20090919/LinkuisticsLAF_in_VW7.7.png"/></p>



</div>
</p></div>]]></content>
		<link href="http://www.cincomsmalltalk.com/userblogs/antony/blogView?showComments=true&amp;entry=3430783472" rel="alternate" type="text/html"></link>
		<category term="general"></category>
	</entry>
	<entry>
		<title>The magnificent Brian Eno</title>
		<id>http://www.cincomsmalltalk.com/userblogs/antony/blogView?showComments=true&amp;printTitle=The_magnificent_Brian_Eno&amp;entry=3407180022</id>
		<updated>2008-12-19T22:53:42-05:00</updated>
		<author>
			<name>Antony Blakey</name>
			<uri>http://www.cincomsmalltalk.com/userblogs/antony/blogView</uri>
			<email>antony.blakey@linkuistics.com.au</email>
		</author>
		<content type="html" xml:lang="en-us"><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p>A long time hero of mine, a beautiful thinker, extraordinary ears and imagination.</p>



<p><object type="application/x-shockwave-flash" height="400" width="400" id="TSBundleWidget" data="http://bits-0.topspin.net/u/byrne/TSBundleWidget.swf?rootPath=https://app.topspin.net&showTrace=false&campaign_id=6001"><param value="always" name="allowScriptAccess"/><param name="allowfullscreen" value="true" /><param name="movie" value="http://bits-0.topspin.net/u/byrne/TSBundleWidget.swf?rootPath=https://app.topspin.net&showTrace=false&campaign_id=6001" /><param name="quality" value="high" /><param name="flashvars" value="campaign_id=6001&amp;baseurl=http://app.topspin.net&amp;width=400&amp;height=400&amp;configurl=http://bits-0.topspin.net/u/byrne/album_config_6001.xml&amp;autoplay=false" /></object></p>



<p>Get it <a href="http://www.everythingthathappens.com/">here</a></p>
</div>]]></content>
		<link href="http://www.cincomsmalltalk.com/userblogs/antony/blogView?showComments=true&amp;entry=3407180022" rel="alternate" type="text/html"></link>
		<category term="general"></category>
	</entry>
	<entry>
		<title>CouchDB and VW</title>
		<id>http://www.cincomsmalltalk.com/userblogs/antony/blogView?showComments=true&amp;printTitle=CouchDB_and_VW&amp;entry=3403535717</id>
		<updated>2008-11-07T18:35:17-05:00</updated>
		<author>
			<name>Antony Blakey</name>
			<uri>http://www.cincomsmalltalk.com/userblogs/antony/blogView</uri>
			<email>antony.blakey@linkuistics.com.au</email>
		</author>
		<content type="html" xml:lang="en-us"><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p>I'm in the process of moving a GLORP/Postgresql system to <a href="www.couchdb.org">CouchDB</a>. My data translates easily to a document-based model apart from a few indexing issues, such as the transitive closure of a user ->> role ->> permission system. To solve that I've enhanced CouchDB to allow deployment of separately packaged plugins, and written a plugin (in Erlang) that allows documents to be indexed using Mnesia (or SQLlite et al) and subsequently queried using dynamic graph/relational join semantics. The plugin has the same operational semantics as the map/reduce views e.g views update when read, not when data is written, views represent the MVCC snapshot current at view request time, and they are orthogonal to replication. All that remains is to figure out how to manage replication conflicts, which I could do by only allowing writes to a distinguished peer.</p>



<p>Anyway, I've successfully transfered 5G of data in GLORP/Postgresql to CouchDB using the CouchDB package in the Cincom Public Store. I had to fix a few issues and I've published my fixes. IMO the package isn't yet ready for uses other than exporting data.</p>



<p>As a benchmark - it's quicker to read the data through GLORP/Postgresql and write it into CouchDB, on the same machine, than it is to restore the same data into Postgresql from a backup.</p>
</div>]]></content>
		<link href="http://www.cincomsmalltalk.com/userblogs/antony/blogView?showComments=true&amp;entry=3403535717" rel="alternate" type="text/html"></link>
		<category term="general"></category>
	</entry>
	<entry>
		<title>How to load Linkuistics* (ASBAqua etc) components</title>
		<id>http://www.cincomsmalltalk.com/userblogs/antony/blogView?showComments=true&amp;printTitle=How_to_load_Linkuistics*_(ASBAqua_etc)_components&amp;entry=3399913756</id>
		<updated>2008-09-26T20:29:16-04:00</updated>
		<author>
			<name>Antony Blakey</name>
			<uri>http://www.cincomsmalltalk.com/userblogs/antony/blogView</uri>
			<email>antony.blakey@linkuistics.com.au</email>
		</author>
		<content type="html" xml:lang="en-us"><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p>Vladimir Pogorelenko emailed me asking how to reliably load ASBAqua etc from the Cincom Public Store</p>



<p>You shouldn't load any of ASBAqua, ASBLook. Instead, loading LinkuisticsLAF bundle will load the look and feel, loading LinkuisticsUI-Commando will load Commando, and LinkuisticsTools will load a few fixes to e.g. the Glorp Store replication dialog. The head versions these bundles should have correct prerequisites.</p>



<p>Remember this is OSX only.</p>
</div>]]></content>
		<link href="http://www.cincomsmalltalk.com/userblogs/antony/blogView?showComments=true&amp;entry=3399913756" rel="alternate" type="text/html"></link>
		<category term="general"></category>
	</entry>
	<entry>
		<title>A VW command model and UI inspired by TextMate</title>
		<id>http://www.cincomsmalltalk.com/userblogs/antony/blogView?showComments=true&amp;printTitle=A_VW_command_model_and_UI_inspired_by_TextMate&amp;entry=3395013105</id>
		<updated>2008-08-01T03:11:45-04:00</updated>
		<author>
			<name>Antony Blakey</name>
			<uri>http://www.cincomsmalltalk.com/userblogs/antony/blogView</uri>
			<email>antony.blakey@linkuistics.com.au</email>
		</author>
		<content type="html" xml:lang="en-us"><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p><style type='text/css'>

.ASBBlog div.code

{

	margin: 1ex 2em 1ex 2em;

	border: 1px dotted grey;

	padding: 0 1em 0 1em;

	background-color: rgb(230,230,230);

}

.ASBBlog div.callout div.label

{

	font-weight: bold;

    position: absolute;

	margin-top: -0.8em;

	padding: 0 1ex 0 1ex;

	background-color: white;

	border: 1px dotted rgb(128,64,64);

}

.ASBBlog div.callout

{

	margin: 1.5em 2em 0 2em;

	padding: 0 1em 0 1em;

	border: 1px dotted rgb(128,64,64);

	background-color: rgb(230,230,255);

}

.ASBBlog code

{

	font-family: Monaco, monospace;

	color: rgb(0,128,0);

}

</style>



<div class="ASBBlog">



<p>I've been distracted from writing a MirrorImage walkthrough by a discussion on vwnc about Pragmas. One of the final entries was <a href="http://www.cincomsmalltalk.com/userblogs/mls/blogView?showComments=true&printTitle=Whats_in_a_method&entry=3394176039">this</a> blog post by Michael. Apart from his surprising advocacy for text as UI - why not extend that argument from a single method to multiple methods, and then to the class - the comment that stood out for me was "Is it easier to pull down a menu to define an attribute on a method, or easy enough just to write some code...". Quite true. VW requires that just about everything is done with the mouse. On OSX at least, the very few keyboard shortcuts only partially work, and in any case you can't use the command key for anything but C/C/P. So all of my muscle memory on my wonderfully uniform (and configurable so) OSX works <em>against</em> me when using VW.</p>



<p>As an aside, text editing in in VW is not just poor, it's appalling. The code editor completely blows. And the implementation of error messages being inserted in the text is IMO not only a crappy idea, it's a complete PITA as implemented. In a recent vwnc thread about this it was asserted that the error message was always selected so you could just hit delete immediately after accepting in order to clear the message. Not so. I started monitoring this after being told about this 'convenience'. Most of my errors leave part of the message selected, and part not, so it's no wonder I hadn't noticed the 'convenience'.</p>



<p>All of this means that whilst on a macro level VW is wonderfully productive, on a micro-level it is anti-productive. The reverse of this situation is something like TextMate. TextMate is optimized for entering and editing text, and is amazingly, beautifully tuned for this task. What I'd like is TextMate micro-convenience and slickness in a Smalltalk environment.</p>



<p>All of that got me thinking about how to achieve some TextMate goodness in VW. And you know what? It's neither difficult nor a lot of work. Unless of course you need to maintain 100% compatibility with customers with a gazillion of mission critical GUI screens dependent on extensions and monkeypatching of the GUI framework.</p>

	

<p>I decided to start with command invocation, which I've implemented and published in the <code>LinkuisticsUI-Commando</code> bundle.</p>



<p>I've done a screencast showing the <a href='files/CommandoDemo.mp4'>system in action</a>. Instructionally its useful to watch both before you read the rest of this post, and afterwards. It's a bit cheap, especially the audio, but I'm not feeling well enough to walk to my studio and do a pro job. Also it's h.264 to lower the file size, so please forgive any minor artifacts.</p>



<h3>What is a command?</h3>



<p>In abstract, a command is the thing behind menu items, shortcut keys, text snippets, and non-semantic tab completions. The most obvious characteristic of a command is that it does something when it is invoked. Commands are applicable in a particular context e.g. 'Delete Class' might be applicable only if a class is selected. Or maybe that command could also operate without a selection by raising a class selector if there is no current selection. Commands execute in a certain context and may require information from that context (such as the currently selected class) in order to execute. The enablement of e.g. a menu item, is an indication of whether the command is applicable in the current context. Commands can be invoked in a number of ways: from a menu, or via a shortcut key, or by pressing tab at the end of a given text string in an editor, or from a list as in TextMate, which uses a nice filtering mechanism to allow commands to be quickly and concisely selected. Another benefit of list-of-commands UI is that you can easily discover all of the commands available in a given context, and check their shortcut invocations. It also allows you to disambiguate control-key shortcuts with multiple resolutions, and provides an obvious source for task/command-specific linking to help.</p>



<h3>The implementation</h3>



<p>There is a global registry of all commands known to the system in <code>Commando.Commands</code>. Commands are registered in <code>getLUICommands</code> class methods, which are discovered via reflection. There is currently no mechanism to monitor changes, so you have to manually invoke <code>Commando.findAllCommands</code> to (re-)install them, or you can use the command UI - there are commando commands registered. Each command has a name, which can be constructed from a hierarchical path. The use of a path means that the command is easier to filter and the name doesn't have to jump through linguistic hurdles to include it's context. It's also the basis for replacing the menu system by a filtered view of extant commands, which is my intention. A command can have a shortcut, which is either a control key shortcut or a tab-triggered prefix for text-based snippets. Finally, a command has to implement <code>applicableInContext: aContext</code> and <code>executeInContext: aContext</code>, the meaning of which should be obvious.</p>



<p>I haven't implemented the tab-completion mechanism yet, partly because to be be as good as TextMate it requires more extensive changes to the text editor. For example, when inserting a fragment that has placeholders you should be able to tab between the placeholders to fill them, including tabbing backwards which on my system triggers the emergency evaluator :(. Improving the text editor is on my list of things to look at.</p>



<h3>What is a context?</h3>



<p>My implementation handles all invocation in the KeyboardProcessor, whose currentConsumer is regarded as the source of the context. The context that is used is a list of objects which are created by visiting the source, it's components and it's parent in a (potentially) recursive manner. It's a trivial mechanism, but it works. You can end with VisualParts, models/applications, windows and controllers in the list.</p>



<p>My original plan was to have objects such as the <code>BrowserNavigator</code> decompose their state so that you would have individual context entries for each of the types of code model objects e.g. Classes/Protocols/Pundles etc. Commands applicable to a given code model object could then trivially operate in any UI which exposes the code model. This is related to the idea of more directly reifying the code model in the interface. It turns out that a lot of the existing UI uses <code>BrowserNavigator</code>, and given that I automatically include the RB commands, which naturally integrate with a <code>BrowserNavigator</code> context, I decided not to do any further decomposition unless I actually build a code-model-reifying UI.</p>



<h3>Menu itegration</h3>



<p>I have a rough plan for how to build menus from commands, thus replacing the menu system. It's particularly obvious when considering the OSX situation, which for native integration wants a single menu bar, but it's also applicable to menu-per-window model, and trivially replaces existing popup-context-menu  systems - it is after all a generaisation of the concept of a context menu.</p>



<p>The published version includes code that processes the RB's menus to create code model commands. The RB already has a command-based system, although that model is somewhat more declarative, which reflects the fact that <code>RBCommand</code>s are manipulated by a command definition UI.</p>



<h3>But ...</h3>



<p>The UI for this works well, but unfortunately the rest of VW isn't really setup to deal well with keyboard navigation, so often you can invoke a command using the keyboard and then you have to switch to the mouse to navigate the result. And as you can see in the screencast, even the mouse behaviour is sometimes annoyingly wrong, particularly in list selection.</p>



<p>I'd like to do something about keyboard view manipulation, and add a similar interface for navigating both to and within code model elements, but that's probably best done in the context of a different type of browser.</p>



</div>
</p></div>]]></content>
		<link href="http://www.cincomsmalltalk.com/userblogs/antony/blogView?showComments=true&amp;entry=3395013105" rel="alternate" type="text/html"></link>
		<category term="general"></category>
	</entry>
	<entry>
		<title>Any interest in a server-focussed reboot of VW? It seems not.</title>
		<id>http://www.cincomsmalltalk.com/userblogs/antony/blogView?showComments=true&amp;printTitle=Any_interest_in_a_server-focussed_reboot_of_VW_It_seems_not.&amp;entry=3394911085</id>
		<updated>2008-07-30T22:51:25-04:00</updated>
		<author>
			<name>Antony Blakey</name>
			<uri>http://www.cincomsmalltalk.com/userblogs/antony/blogView</uri>
			<email>antony.blakey@linkuistics.com.au</email>
		</author>
		<content type="html" xml:lang="en-us"><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p>I've had one expression of interest, but no offers of assistance, so I guess the answer is no. That's disappointing, but it does confirm my suspicion, and thus saves me wasting effort setting up a website and publicizing the project.</p>



<p>Right now I'm putting the finishing touches on a release of a TextMate-inspired command framework and invocation UI. I started this in response to Michael's comment in the pragma thread that using a menu to add an annotation to a method was a PITA. I agree. I had hoped to do a demo screencast and publish the code and an explanation last weekend, but my kids lovingly passed their 10-day-long-gastro on to me.</p>
</div>]]></content>
		<link href="http://www.cincomsmalltalk.com/userblogs/antony/blogView?showComments=true&amp;entry=3394911085" rel="alternate" type="text/html"></link>
		<category term="general"></category>
	</entry>
</feed>
