<?xml version='1.0' encoding='UTF-8' ?>
<rss version="2.0" xml:base="http://www.cincomsmalltalk.com/userblogs/travis/" xmlns:admin="http://webns.net/mvcb/" xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:icbm="http://postneo.com/icbm" xmlns:includedComments="http://www.laudably.com/rss2-comments" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:media="http://search.yahoo.com/mrss/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/">
	<channel>
		<title>Objology</title>
		<link>http://www.cincomsmalltalk.com/userblogs/travis/blogView</link>
		<description>Is this TAG Extra?</description>
		<webMaster>tgriggs@cincom.com</webMaster>
		<lastBuildDate>Tue, 21 May 2013 08:32:45 GMT</lastBuildDate>
		<image>
			<url>/images/why-small.png</url>
			<title>Objology</title>
			<link>http://www.cincomsmalltalk.com/userblogs/travis/blogView</link>
			<height>50</height>
			<width>81</width>
		</image>
		<admin:generatorAgent rdf:resource="/CincomSmalltalkWiki/Silt"></admin:generatorAgent>
		<admin:errorReportsTo rdf:resource="mailto:tgriggs@cincom.com"></admin:errorReportsTo>
		<dc:language>en-us</dc:language>
		<dc:creator>Travis Griggs</dc:creator>
		<dc:rights>Copyright 2005-2007 Travis Griggs</dc:rights>
		<dc:date>2013-05-21T08:32:45-04:00</dc:date>
		<icbm:latitude>46.100000</icbm:latitude>
		<icbm:longitude>-118.283333</icbm:longitude>
		<item>
			<title>Controllerless Keyboarding</title>
			<link>http://www.cincomsmalltalk.com/userblogs/travis/blogView?showComments=true&amp;printTitle=Controllerless_Keyboarding&amp;entry=3463158305</link>
			<category>Making Smalltalk Easier?</category>
			<pubDate>Tue, 28 Sep 2010 20:25:05 GMT</pubDate>
			<description><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p>For the last two releases, most of the "custom" widgets we've added to the system are done in a way different than classical VisualWorks widgets. Examples are the new comparison tool, the store feedback widgets, the bundle structure tool, and the prerequisite tool. These have served as a testground to try out some different approaches than classically found in VisualWorks. One the questions that comes up from some colleagues is "so, if you're doing widgets a new way, what is that way?"

<p>

The rest of this post is about one aspect of that "different" way. As I've wandered far and wide through other widget frameworks, I've learned that a) "MVC" is very popular and b) for every different framework there is a new and unique interpretation of "controller." One of the "different" ways I've been building widgets is without controllers. There are two aspects to deal with in this "controllerless" new world. One is how we deal with mouse interaction, the other keyboard interaction. The aspect of interest here today is keyboard interaction.

<p>

The original VisualWorks widget framework based on MVC, sometimes moniker'ed "wrapper," didn't have a keyboard focus concept. What ever widget was below the mouse and was willing, was where your keyboard input went. Round about version 2.0 of VisualWorks (then an add-on product to ObectWorks 4.1), the idea of keyboard focus got added. Which is a long winded way of saying, I didn't design this, I just learned how to work it. To have a controllerless keyboard savvy widget, you should add the following methods to your VisualPart subclass. The example code is what the AbstractComparisonRollupView does with them, as examples.

<ul>

<li><i>view</i> - The object responsible for managing keyboard events (KeyboardProcessor) assumes it's got an object in the role of controller and it can send <i>view</i> to it. Well the whole point is that your view is playing the role of both the controller and view.

<pre>view

	^self</pre>

</li>

<li><i>controller</i> -  Same sort of story as above, just from the other direction.

<pre>controller

	^self</pre>

</li>

<li><i>desiresFocus</i> - This shoud return a boolean. The KeyboardProcessor sends this method to a keyboard consuming object when it's trying to determine if you'd like to be tabbed into. You can simply return true, or do something more complex, such as filter based on whether the receiver is "enabled."

<pre>desiresFocus

	^true</pre>

</li>

</li>

<li><i>requestFocusIn</i> - This shoud return a boolean. Before the KeyboardProcessor will activate your widget as the currently focused widget, it must answer true to this message. This is used, in the current framework for example, to do user entry validation. 

<pre>requestFocusIn

	^true</pre>

</li>

<li><i>requestFocusOut</i> - This shoud return a boolean. Before the KeyboardProcessor will deactivate your widget (making it no longer the currently focused widget) it must return true to this (if it returns false, your widget retains focus). This can be used, for example to complete user edits, or validation.

<pre>requestFocusOut

	^true</pre>

</li>

<li><i>activate</i> - This is sent to your widget, after you've negotiated the requestFocusIn/requestFocusOut/desiresFocus dance. It's where you make things happen as a result of focusing your widget. If your widget draws differently when it's "focused", you may want to invalidate here.

<pre>activate

	self invalidate</pre>

</li>

<li><i>deactivate</i> - This is sent to your widget, after you've negotiated the requestFocusIn/requestFocusOut/desiresFocus dance. It's where you make things happen as a result of defocusing your widget. If your widget draws differently when it's "focused", you may want to invalidate here.

<pre>deactivate

	self invalidate</pre>

</li>

<li><i>hasControl</i> - This is my least favorite of the API, because it looks like a testing method. You can couple it with activate if you like, since they are similar. But it's not sent at the same time as activate it is. It is sent when the window containing your widget gets focus, and your widget is the focused widget in the window. So it's very good for toggling indication of focus that only shows up whether the window is focused or not.

<pre>hasControl

	self header invalidate</pre>

</li>

</ul>

The last thing you have to do, is make the KeyboardProcessor aware that you are interested in keyboard. This is usually done with a line something like

<pre>

	theWindow keyboardProcessor addKeyboardReceiver: myView

</pre>

This last requirement in particular I consider the most onerous, and we hope to make this more "snappable" real soon. You shouldn't have to worry about registering your widgets with the window (and subsequently unregistering them when cleanup is required).
</p></div>]]></description>
			<guid isPermaLink="false">3463158305</guid>
			<pingback:server>http://www.cincomsmalltalk.com/userblogs/travis/servlet/CommentAPIPBServlet?guid=3463158305</pingback:server>
			<pingback:target>http://www.cincomsmalltalk.com/userblogs/travis/blogView?guid=3463158305</pingback:target>
			<includedComments:comment-collection></includedComments:comment-collection>
			<wfw:comment>http://www.cincomsmalltalk.com/userblogs/travis/servlet/CommentAPIServlet?guid=3463158305</wfw:comment>
		</item>
		<item>
			<title>How to get a Human from a Chimpanzee</title>
			<link>http://www.cincomsmalltalk.com/userblogs/travis/blogView?showComments=true&amp;printTitle=How_to_get_a_Human_from_a_Chimpanzee&amp;entry=3445815344</link>
			<category>Smalltalk Journeys</category>
			<pubDate>Fri, 12 Mar 2010 02:55:44 GMT</pubDate>
			<description><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p>One of the things I've never liked about the VisualWorks differencing tools, is that I have to choose between source and text differencing. <i>Usually</i> I want source. Source compares the source code tokens. But sometimes, it shows nothing. Why? Because the only change is a word in the method comment. Unfortunately, it only shows me the whole comment is changed, not the actual localized changes. Changes only in whitespace are equally distracting. The current solution embodied by DiffList, and a UI tool called Differator, doesn't really get where I want to.

<p>

What I really want one is ONE difference mode, that shows all of this at the same time. Pursuing this goal, lend me on an interesting journey. The results are in the mar10.2 7.8 build that will come out tomorrow.

<p>

To begin with, we have to separate two distinct parts. One is comparing texts. The other is what to do with the differences we find. Let's leave the second behind for a minute. If we solve the first problem generally enough, we'll have a myriad of choices open to us for the second.

<p>

A good starting place, is to go to the classic Unix <b>diff</b> command line utility. After digging around for a while with this, we'll discover two things: 1) It's not really about text at all 2) the algorithm found at the heart of the diff program is a nicely tuned piece of work.

<p>

The basic diff algorithm starts out on the basis, that for any two sequences (whether they're sequences of characters, words, textlines, bytecodes, or even DNA markers), there is a sequence that is a "longest common sequence". There may be multiple resolutions to this, but none of them is longer than the other. You can find lots of interesting stuff about this around the net. A simple example is the sequences <b>h-u-m-a-n</b> and <b>c-h-i-m-p-a-n-z-e-e</b>. The longest common sequence (LCS) between the two is <b>h-m-a-n</b>. Once we have that, we can determine the steps it takes to turn the first sequence into the second. This is sometimes called the <i>shortest edit script</i>. In this case, we end up with the following edit script: Insert c, copy h, delete u, copy m, insert p, copy a and n, insert z and e and e. This gives a directional evolution from one to the other. Want to go the other direction though? Just transpose inserts with deletes and keep matches in place.

<p>

With this kind of information, we can envision a number of different ways of highlighting differences between texts, or DNA sequences, etc. We can do them in a unified view. We can do them in side by side views. We can even discern replacements from true insertions or deletions, because it's a paired delete/insert sequence.

<p>

The mar10.2 build adds a new <i>differences:</i> API to SequenceableCollection. You can take any two sequences and determine how to evolve one from the other. You can feed it DNA symbols, strings, numbers, whatever you can think of to put in a SequenceableCollection. The result is an array of SubsequenceDifference subclasses, one for each of the different kind of edits.

<p>

At the heart of the algorithm is a modified/ported version of a generalized version of the Meyer's Diff algorithm. This too, you can find lots of stuff on the net about. You'll even find a couple of visualizations. What the Myers adaptation of the LCS exploits is that usually, the algorithm is applied in cases where differences are few compared to matches. It also integrates the process of finding the LCS with the process of determining steps, it ends up being a linear space algorithm. To say it's a hairy nasty work of indirection and head scratching, is an understatement. It makes sorting algorithms look like kindergarten reading.

<p>

I ported it 3 times. Each implementation I found had a test suite, so I gathered those into one big test suite and added a couple edge cases. The first port was of a C# implementation. This seemed easy, but I ended up with out of bounds errors (the algorithm relies heavily on 0 based array addressing). So I tried a Ruby version. It was ironically harder to port (this is the language that's supposed to be a lot like Smalltalk). And it too had issues. Then I ported a generalized C version (generalized in the sense it was parameter-izable), and it worked! All the tests passed. There's irony for you.

<p>

How much faster is it? Given the degenerate case of determining how to get from <i>Object comment</i> to <i>Object comment reverse</i>, the VisualWorks DiffList which is a hybrid LCS searcher and produces only "unmatching range" information, takes 12.5 seconds to run. The <i>differences:</i> method does it in under half a second. Implementing a naive recursive LCS method, has to be killed after grinding for 3 hours.

<p>

At least two good things have come out of this. One is that there is now a general purpose method to quickly and efficiently produce complete shortest edit scripts between any two sequences. Application programmers don't have to be tied to the IDE's method of highlighting differences between two strings, they can do whatever they want. Application Programmers can use it in contexts beyond source comparison (e.g. comparing load lists, or determining undo differences, or DNA sequencing, or schedule comparison, etc).

<p>

Secondly, we've separated what to diff with how to diff completely. This means that I can have a method on RBScanner which scans source tokens. But it can go further. Since said scanner knows where comments are, we can produce strings for the comments. In fact we can go further, we can break the comments up into words easily. We can even note when the token is a string literal token and break it up into words as well. And we can insert elements for white space. So that when we difference Smalltalk methods, we get everything broken down to the granularity we'd like. Which was what I wanted in the first place.
</p></div>]]></description>
			<guid isPermaLink="false">3445815344</guid>
			<pingback:server>http://www.cincomsmalltalk.com/userblogs/travis/servlet/CommentAPIPBServlet?guid=3445815344</pingback:server>
			<pingback:target>http://www.cincomsmalltalk.com/userblogs/travis/blogView?guid=3445815344</pingback:target>
			<includedComments:comment-collection>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=How_to_get_a_Human_from_a_Chimpanzee&amp;entry=3445815344</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=How_to_get_a_Human_from_a_Chimpanzee&amp;entry=3445815344</includedComments:puid>
					<includedComments:author>Thomas</includedComments:author>
					<includedComments:pubDate>2010-03-12T05:08:33-05:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;That sounds great, as I often wished for better comparison of source code, too.&lt;/p&gt;&lt;p&gt;hat did you say, when will the new VW7.8 version be released ;-)?&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Re: How to get a Human from a Chimpanzee</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=How_to_get_a_Human_from_a_Chimpanzee&amp;entry=3445815344</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=How_to_get_a_Human_from_a_Chimpanzee&amp;entry=3445815344</includedComments:puid>
					<includedComments:author>Arden</includedComments:author>
					<includedComments:pubDate>2010-03-12T09:27:44-05:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;The next release of VW is slated for this summer.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Re: How to get a Human from a Chimpanzee</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=How_to_get_a_Human_from_a_Chimpanzee&amp;entry=3445815344</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=How_to_get_a_Human_from_a_Chimpanzee&amp;entry=3445815344</includedComments:puid>
					<includedComments:author>anonymous</includedComments:author>
					<includedComments:pubDate>2010-11-07T23:12:29-05:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;Hi,&lt;/p&gt;&lt;p&gt;Where may I find the differences: method you're talking about?&lt;/p&gt;&lt;p&gt;I'd like to test it.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Re: How to get a Human from a Chimpanzee</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=How_to_get_a_Human_from_a_Chimpanzee&amp;entry=3445815344</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=How_to_get_a_Human_from_a_Chimpanzee&amp;entry=3445815344</includedComments:puid>
					<includedComments:author>gartho</includedComments:author>
					<includedComments:pubDate>2012-05-08T13:33:15-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;
Star Celebs - Nude Celebrity Pics Of Actresses, Models. &lt;a href=&lt;a href="http://sciencenewsarticles.org/394700/celebrity-stolen-videos/&gt;sciencenewsarticles&lt;/a&gt;"&gt;[link 1]&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;
&lt;a href="http://sciencenewsarticles.org/394700/celebrity-stolen-videos/&gt;sciencenewsarticles&lt;/a&gt;"&gt;[1 http://sciencenewsarticles.org/394700/celebrity-stolen-videos/&gt;sciencenewsarticles&lt;/a&gt;]&lt;/a&gt;&lt;br/&gt;
&lt;/p&gt;


&lt;/div&gt;</includedComments:content>
					<includedComments:title>varcevanje v zlatu</includedComments:title>
				</includedComments:comment>
			</includedComments:comment-collection>
			<wfw:comment>http://www.cincomsmalltalk.com/userblogs/travis/servlet/CommentAPIServlet?guid=3445815344</wfw:comment>
		</item>
		<item>
			<title>Skinny 93</title>
			<link>http://www.cincomsmalltalk.com/userblogs/travis/blogView?showComments=true&amp;printTitle=Skinny_93&amp;entry=3445791292</link>
			<category>Ooooh! Shiney!</category>
			<pubDate>Thu, 11 Mar 2010 20:14:52 GMT</pubDate>
			<description><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p>A couple of months ago, I was daunted by the prospect of having to do yet another Look and Feel set of subclasses for the VisualWorks widget set. The technique of subclassing is hopelessly over-leveraged in what is there.

<p>

The debate about whether to do native widgets or not, and in what form factor has gone round and round for years now. It will continue to do so. Somewhere in there, I pondered "what would happen if I could draw standard widgets faithfully (or pretty darn close), but still emulate them? Is there a half way point there?"

<p>

I found that for OSX and Windows, there actually was to some degree. I discovered that all of the graphic resources that OSX uses are actually in a database and can be pried out and reused. You have to make the right decisions about how to use them, but if you use them correctly, you're doing the same thing OSX is. On Windows the story was even better. uxTheme.dll is the theming engine that Windows uses to evolve it's look and feel, as well as customize widgets for other platforms (such as mobile devices) -- much thanks to Michael Lucas-Smith for pointing me towards this.

<p>

So I began experimenting with that, and some other ideas that we've already been hinting at, in a package that I dubbed Skinny. It's so dubbed, because I'm interesting in getting to a point, where changing the skin of a VW app (whether the IDE itself, or something else), is relatively easy.

<p>

Here's a screencast that shows me playing with version 93 which is in the Open Repository.

<p>

<object id="scPlayer" width="1024" height="768"> <param name="movie" value="http://content.screencast.com/users/TravisGriggs/folders/Jing/media/e0bdcd3f-46c8-4dc6-ab30-881d31b44125/jingswfplayer.swf"></param> <param name="quality" value="high"></param> <param name="bgcolor" value="#FFFFFF"></param> <param name="flashVars" value="thumb=http://content.screencast.com/users/TravisGriggs/folders/Jing/media/e0bdcd3f-46c8-4dc6-ab30-881d31b44125/FirstFrame.jpg&containerwidth=1024&containerheight=768&content=http://content.screencast.com/users/TravisGriggs/folders/Jing/media/e0bdcd3f-46c8-4dc6-ab30-881d31b44125/00000108.swf"></param> <param name="allowFullScreen" value="true"></param> <param name="scale" value="showall"></param> <param name="allowScriptAccess" value="always"></param> <param name="base" value="http://content.screencast.com/users/TravisGriggs/folders/Jing/media/e0bdcd3f-46c8-4dc6-ab30-881d31b44125/"></param> <embed src="http://content.screencast.com/users/TravisGriggs/folders/Jing/media/e0bdcd3f-46c8-4dc6-ab30-881d31b44125/jingswfplayer.swf" quality="high" bgcolor="#FFFFFF" width="1024" height="768" type="application/x-shockwave-flash" allowScriptAccess="always" flashVars="thumb=http://content.screencast.com/users/TravisGriggs/folders/Jing/media/e0bdcd3f-46c8-4dc6-ab30-881d31b44125/FirstFrame.jpg&containerwidth=1024&containerheight=768&content=http://content.screencast.com/users/TravisGriggs/folders/Jing/media/e0bdcd3f-46c8-4dc6-ab30-881d31b44125/00000108.swf" allowFullScreen="true" base="http://content.screencast.com/users/TravisGriggs/folders/Jing/media/e0bdcd3f-46c8-4dc6-ab30-881d31b44125/" scale="showall"></embed> </object>

<p>

Here's a list of questions/answers one might ask about such an experiment:<p>

<b>Q:</b> Which versions of VisualWorks do I have to have for this?<p>

<b>A:</b> You need a pretty recent 7.8 dev build. There are small things from this project, that we've been rolling into VisualWorks proper.<p>

<b>Q:</b> Do you plan on integrating this in the product someday?<p>

<b>A:</b> I don't know yet. It could be that we end up doing yet another subclass tree and just harvest the uxTheme.dll drawing know how. Or maybe more of a hybrid. I don't know yet.<p>

<b>Q:</b> Does the Windows look and feel work on other platforms?<p>

<b>A:</b> No. It doesn't.<p>

<b>Q:</b> What other skins have you played with?<p>

<b>A:</b> There's an OSX one. It uses Cairo to render the various graphics excavated out the OSX graphics database. Ironically, it actually works better at the moment on either Windows of X11, since Cairo doesn't interleave efficiently with Quartz drawing. It works there, but it's pretty jerky. Great benchmark for really improving Cairo on OSX.<p>

<b>Q:</b> Which widgets have you built for?<p>

<b>A:</b> Push Buttons, Radio Buttons, Check Boxes, Scroll Bars, Tab Controls, Splitters (the splitters don't build thru UIBuilders tho)<p>

<b>Q:</b> What if I'm more interested in not using UIBuilder technology and just simply snapping widgets together?<p>

<b>A:</b> Look at the various class side example methods on Skinny objects.<p>

<b>Q:</b> What known issues are there already?<p>

<b>A:</b> Haven't made any of them keyboard navigable (waiting to integrate some changes to the core to simplify KeyboardProcessor first). The Scrollbars don't get their thumbs sized initially right, they require a click to do so. Lots of others, I'm sure.<p>

<b>Q:</b> What IDE tools seem to work?<p>

<b>A:</b> In the screencast, I show workspace, inspector, and settings tool. There's actually one page in settings tool that has issues still (a store one with a dataset). The browser kind of works. Some of the widgets don't pick up the skinny skin. The FileBrowser tanked last time I tried it. I have used the debugger on it successfully before, but currently have it turned off.<p>

<b>Q:</b> Why are you blogging about it?<p>

<b>A:</b> Always a good idea to give people a peek at what kind of things are going on. I'd also be interested in people trying to use it with their own apps. I'm curious how long it would stay alive and if there's an obvious "implement this next" vector.<p>
</p></div>]]></description>
			<guid isPermaLink="false">3445791292</guid>
			<pingback:server>http://www.cincomsmalltalk.com/userblogs/travis/servlet/CommentAPIPBServlet?guid=3445791292</pingback:server>
			<pingback:target>http://www.cincomsmalltalk.com/userblogs/travis/blogView?guid=3445791292</pingback:target>
			<includedComments:comment-collection>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Skinny_93&amp;entry=3445791292</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Skinny_93&amp;entry=3445791292</includedComments:puid>
					<includedComments:author>Josefr Springer</includedComments:author>
					<includedComments:pubDate>2010-03-12T11:31:56-05:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;Hi Travis,&lt;/p&gt;&lt;p&gt;JOOPS develops the Business-Process-Management-Suite OfficeTalk. The product is selled by partners. I am looking a long time for the possibility of using i Windows native widgets. I am very interested in testing Skinny. Now my questions:&lt;/p&gt;&lt;p&gt;* We are working with 7.7. Is Skinny running with ?&lt;/p&gt;&lt;p&gt; How can i get Skinny. We are novice using the public repository.&lt;/p&gt;&lt;p&gt; OfficeTalk is using heavily the UIBuilder functionalit. e.g traversing widgets, dynamicly building specs, using the change-notifications, etc. What techniquie is required by Skinny ?&lt;/p&gt;&lt;p&gt; Because OfficeTalk runs on linux too, can both Skinny and emulated widgets coexist ?&lt;/p&gt;&lt;p&gt;Josef Springer&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Re: Skinny 93</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Skinny_93&amp;entry=3445791292</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Skinny_93&amp;entry=3445791292</includedComments:puid>
					<includedComments:author>Annick</includedComments:author>
					<includedComments:pubDate>2010-04-14T06:11:55-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;Hi Travis,&lt;/p&gt;&lt;p&gt;Nice work and we are looking forward for it, since using only 7.7.&lt;/p&gt;&lt;p&gt;e managed to emulate most of this with WidgetPolicies, EXCEPT for the SCROLLBars.&lt;/p&gt;&lt;p&gt;Do you use predefined skins or can you define your own ?&lt;/p&gt;&lt;p&gt;Annick Fron&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Re: Skinny 93</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Skinny_93&amp;entry=3445791292</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Skinny_93&amp;entry=3445791292</includedComments:puid>
					<includedComments:author>pablogancharov@gmial.com</includedComments:author>
					<includedComments:pubDate>2010-10-07T21:46:29-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;It is possible to make skinny work under linux?&lt;/p&gt;&lt;p&gt;Thanks.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>It is possible to..</includedComments:title>
				</includedComments:comment>
			</includedComments:comment-collection>
			<wfw:comment>http://www.cincomsmalltalk.com/userblogs/travis/servlet/CommentAPIServlet?guid=3445791292</wfw:comment>
		</item>
		<item>
			<title>A Mechanical Engineer's Thoughts about Unit testing</title>
			<link>http://www.cincomsmalltalk.com/userblogs/travis/blogView?showComments=true&amp;printTitle=A_Mechanical_Engineers_Thoughts_about_Unit_testing&amp;entry=3443138169</link>
			<category>Testing</category>
			<pubDate>Tue, 09 Feb 2010 03:16:09 GMT</pubDate>
			<description><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p><h3><i>"An idea, like a ghost, must be spoken to a little before it will explain itself." -%A0Charles Dickens</i></h3>



Sometimes, we do things in our programming practices that just seem right. But we may struggle to figure out how to illustrate why it feels right to colleagues and peers. We have a vague idea, and some of the words involved, but a succinct explanation evades us. This post, is an attempt to shed a little light on some of the principles I follow in regards to "unit testing." Some of this fell into place, just days ago, though I've been doing this a certain way for 12 years now.

<p>

Back in the 50's, there was a sort of revolution that took place in the manufacturing world. Quality was the issue. Leading role was played by E. W. Demming. Some of the plot themes were things like process control, quality control, statistical process control, shewart charts, kanban cards, etc. It was a big hit in Japan initially, and would eventually make its way over to the States and other places. As a Mechanical Engineering student, I had this stuff pounded into my head through long years of college.

<p>

One of the things that struck me about these ideas (ideas that would eventually be caught up in and respun as "lean or agile" manufacturing practices) was a subtle shift in quality testing. Many factories convinced themselves that they had quality because they did testing. Classic manufacturing testing philosophy, said that you assembled the gadget, and at the end of the factory, you ran the assembled device thru a screen of tests. If it passed these tests you shipped it. In this era, the bolt vendors could be pretty lax in their tolerances; assembly personal at the plant would take up the slack, pairing bigger bolts with bigger washers and smaller bolts with smaller washes. As long as the machine at the end performed it's function nominally, it was good enough. Of course, when the device came under stress, this variety led to failures and subpar performance.

<p>

Demming and crew, felt that this was pointless to catch defective products that late in the cycle. It was wasteful. So they pushed testing and quality control back into the process. They advocated tolerances on the component parts, rather than the unit as a whole. The basic idea is that if you tighten up the quality on the parts that compose your device, your device ends up the better. In fact, if you had a controlled process, and high quality inputs, then you could confidently ship higher quality products while actually reducing end testing. In years to come, those that made the change to this mentality survived, those that did not, mostly failed.

<p>

It's instructive to me, that while both methods advocated and adhered to "testing", the Demming approach and application of testing was the one that produced better results.

<p>

Since the "splashdown" of XP in 1998 and the following furor of Unit Testing in Software, I've witnessed similar parallels in the application of testing software. Everyone claims they do it. When <a href="http://kentreis.wordpress.com/">Ken Treis</a> and I came home from OOPSLA 98, we determined we'd try this. We put together a version of a Wiki server for VisualWorks, and we used workspace scripts to make test that we got the right http responses when we sent different kinds of queries against our server. And having done that, we went right on writing software the way we always had. It didn't really matter how we architected the code as long as it passed these high level tests. Of course, we kept discovering all kinds of edge cases. Though I was well versed in the Demming school of thought about testing the components, rather than the end product, I missed the potential corollary.

<p>

It wasn't until Camp Smalltalk 2000, when Ken had the chance to work with Ron Jeffries, that we got a chance to see it done right. Ken saw, and quickly shared with me, what a real unit test looked like. The light bulb went off for us. This would change the way we developed our algorithms <i>at a component level.</i> I've been a happy unit tester since. I am firmly entrenched in the belief that unit testing is to software what component testing is to manufacturing. Usually, it takes the form of having a particular test class for each meaningful class in your system. There are of course adaptations, but more often than not, I find that the adaptations are rationalizations that allow people to test in the "old school" style while telling themselves they're doing it differently and making a real difference.

<p>

In manufacturing, the point is to reliable reproduce and accepted design. In software, we don't do that. The ability to reproduce our software designs, is not in question. The creative part of what we do, is to create algorithms, of various sizes and shapes, of varying complexities. When we write unit tests for the components (or objects) of our algorithms, we're embracing the same set of principles that drove the quality revolution. Try it out. Don't write so many tests for the overall features of your system. Try writing tests for your components. One to one.
</p></div>]]></description>
			<guid isPermaLink="false">3443138169</guid>
			<pingback:server>http://www.cincomsmalltalk.com/userblogs/travis/servlet/CommentAPIPBServlet?guid=3443138169</pingback:server>
			<pingback:target>http://www.cincomsmalltalk.com/userblogs/travis/blogView?guid=3443138169</pingback:target>
			<includedComments:comment-collection>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=A_Mechanical_Engineers_Thoughts_about_Unit_testing&amp;entry=3443138169</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=A_Mechanical_Engineers_Thoughts_about_Unit_testing&amp;entry=3443138169</includedComments:puid>
					<includedComments:author>anonymous</includedComments:author>
					<includedComments:pubDate>2010-02-09T12:14:22-05:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;"assembly personal at the plant would take up the slack, pairing bigger bolts with bigger washers and smaller bolts with smaller washes. As long as the machine at the end performed it's function nominally, it was good enough. Of course, when the device came under stress, this variety led to failures and subpar performance."&lt;/p&gt;&lt;p&gt;As I learned from a mechanical engineering magazine a few years back, this is in fact how Japanese car-makers have been operating for decades.  They are more concerned with quality of the overall product and not the parts.  American and German car makers thought they were doing what you are describing but that's wrong.&lt;/p&gt;&lt;p&gt;A good analogy is when you lay flooring.  You don't cut all the pieces up front.  You cut most of them and then cut the pieces at the ends to fit.  No matter how good your tolerances are you cannot be as successful any other way.&lt;/p&gt;&lt;p&gt;You are propagating a myth.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Re: A Mechanical Engineer's Thoughts about Unit testing</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=A_Mechanical_Engineers_Thoughts_about_Unit_testing&amp;entry=3443138169</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=A_Mechanical_Engineers_Thoughts_about_Unit_testing&amp;entry=3443138169</includedComments:puid>
					<includedComments:author>Andy Bower</includedComments:author>
					<includedComments:pubDate>2010-02-09T13:00:24-05:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;That's not a good analogy. If you had an accurate set of test templates and cut your floor pieces to match within a certain tolerance then you *would* be able to work this way. However, typically you don't have these templates or the means to ensure the level of accuracy you might need so floor layers do work as you say.&lt;/p&gt;&lt;p&gt;However, with software and most mechanical components one does have accurate templates (i.e. go/no-go tests) and this is a better way of working.&lt;/p&gt;&lt;p&gt;Interestingly, it was in Camp Smalltalk 2000 where the light bulb went on for me also. At that gathering we were given the code and the unit tests for a Smalltalk re-factoring engine and browser with the aim of porting it to Dolphin Smalltalk. We had no idea how it worked or, indeed, much idea about re-factoring itself and yet within one week we had the basic engine working, simply by going through and getting each unit test to pass and fixing problems locally. This would not have been possible if the tests had only been applied to the extremities, i.e. testing whether the re-factoring browser worked from an end user perspective.&lt;/p&gt;&lt;p&gt;Count me +1 for Unit Testing.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Re: A Mechanical Engineer's Thoughts about Unit testing</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=A_Mechanical_Engineers_Thoughts_about_Unit_testing&amp;entry=3443138169</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=A_Mechanical_Engineers_Thoughts_about_Unit_testing&amp;entry=3443138169</includedComments:puid>
					<includedComments:author>Travis Griggs</includedComments:author>
					<includedComments:pubDate>2010-02-10T01:23:55-05:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;anonymous. I guess I'd be hard pressed to be sold one mech eng trade rag article. There is a bit of sensationalism in that kind of thing sometimes, ya know. They've propogated quite a few myths themselves over the years. Consider how we feel as software engineers about some of the absurd things that get written up in "respectable software engineering magazines."&lt;/p&gt;&lt;p&gt;You'll have to believe what you want to believe I guess. I don't think Demming was a myth. I don't think 5 years of college studying the stuff was a myth. I don't think my experiences from 1989-2006 in manufacturing companies (first nuclear fuel, and then food processing equipment) taught me much different than what I presented above. If you want to drive quality up, you push testing down into the roots of your processes. It doesn't mean you forego end testing. But you're a fool if you convince yourself component testing is not necessary.&lt;/p&gt;&lt;p&gt;Glad you picked the floor analogy. We've been remodeling our house for the last four years. In the process, I've come to love tiling and have tiled a large bathroom with L shaped tiles all hand cut, a 25x14 room, and large backsplash area with a tile-wood weave. I'll have to look there for corrolaries, but I don't think it'll change my mind on the value of unit testing, done truly as, unit testing.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Re: A Mechanical Engineer's Thoughts about Unit testing</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=A_Mechanical_Engineers_Thoughts_about_Unit_testing&amp;entry=3443138169</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=A_Mechanical_Engineers_Thoughts_about_Unit_testing&amp;entry=3443138169</includedComments:puid>
					<includedComments:author>Niall Ross</includedComments:author>
					<includedComments:pubDate>2010-02-18T10:33:22-05:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;I both agree and disagree strongly.  I agree 100% (from experience) with Andy Bowers remark that John Brant's Refactoring Browser tests are immensely useful.  And &lt;i&gt;many&lt;/i&gt; of them -  many, but not all - are as Travis' describes:  they test the model layer of specific refactorings, or they verify refactoring engine utilities that these use.  Dolphin (IIUC) chose to integrate the refactorings into their own UI instead of also porting the RB UI;  obviously they needed these tests and not the UI-oriented ones.  Often, I feel the same:  when I extend refactorings to make them more usable programmatically, I depend on these tests.&lt;/p&gt;&lt;p&gt;However John also provided several tests of the kind that (I think) are being criticised, and I have considerably extended and added to these in the custom refactoring project.  UI / user-thread tests are as capable of finding edge conditions in utility tests as the latter are in revealing the inadequacies of thread tests.  Again, I speak from experience.&lt;/p&gt;&lt;p&gt; - Some of these tests simply drive the standard RB tests from the UI.  (These use the approach I presented at StS in 2007;  these take little effort to add and maintain.)  One of the most trivial edge conditions that such tests expose is, "Yes this works great - but I can't invoke it from the UI."  We all know cases when, after running a major change's tests and exercising it by hand from all its UI angles, a last trivial "cannot possibly change anything" change is done, passes its model-leyar tests and a minimally UI exercise, after which you find inconveniently late that the change broke some other pattern of UI invocation.  (And Travis and I know a recent such case. :-) )&lt;/p&gt;&lt;p&gt; - Other tests animate hypothetical user threads.  These too can find the bugs other tests miss:   just this week I reinstating a thread test of John's that we had allowed to lapse and instantly revealed bugs in our code.&lt;/p&gt;&lt;p&gt;What proportions of each kind of test you write depends on the scenario.  If you are using Rob Vens' method for mapping customer domain knowledge into code (see my ESUG2008 report), you will be writing user thread tests (or scripts you convert to tests) at first.  It would be inefficient to try and write utility tests early in that process.  Later, you might write many but some of the thread tests you started with will retain value and the customer will probably supply others.  Conversely when developing a utility or porting an algorithm, it is limiting to write tests for it that run from the particular UI you're connecting to at the time and/or are for the particular user thread(s) that made you decide to port it.  (That said, if you have some thread tests you maintain for other reasons and they reveal issues when you plug in the new algorithm beneath you system, that is a free good.)&lt;/p&gt;&lt;p&gt;If pressed on the ratio of effort to spend on utility tests, on trivial UI reflections of them and on true thread tests in a mature system, I might be persuaded to accept that old standby 80:16:4, which I could then offer as a kind of qualified agreement with Travis.  However I think it is very much horses for courses.  A good partition analysis is a feature of a good test suite.  Each kind of test has bugs it's good at catching and edge cases it's good at missing.  A good suite is not all of one kind.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Re: A Mechanical Engineer's Thoughts about Unit testing</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=A_Mechanical_Engineers_Thoughts_about_Unit_testing&amp;entry=3443138169</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=A_Mechanical_Engineers_Thoughts_about_Unit_testing&amp;entry=3443138169</includedComments:puid>
					<includedComments:author>Alan Wostenberg</includedComments:author>
					<includedComments:pubDate>2010-02-23T20:11:53-05:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;"It wasn't until Camp Smalltalk 2000, when Ken had the chance to work with Ron Jeffries, that we got a chance to see it done right." ... I had a similar experience coding with Ron. &lt;/p&gt;&lt;p&gt;I'd read the books, would write a test, get it to pass, repeat. &lt;/p&gt;&lt;p&gt;About one more test pass every couple hours.&lt;/p&gt;&lt;p&gt;I learned from Ron it should be a 15 minute red-green-refactor cycle. Light bulb pops!  That experience sold me on the value of having a living teacher, instead of just the books.&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Re: A Mechanical Engineer's Thoughts about Unit testing</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=A_Mechanical_Engineers_Thoughts_about_Unit_testing&amp;entry=3443138169</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=A_Mechanical_Engineers_Thoughts_about_Unit_testing&amp;entry=3443138169</includedComments:puid>
					<includedComments:author>vigrx plus</includedComments:author>
					<includedComments:pubDate>2013-05-07T02:42:35-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;Thank you for the sensible critique. Me and my neighbor were just preparing to do a little research on this. We got a grab a book from our area library but I think I learned more clear from this post. I am very glad to see such fantastic info being shared freely out there.&lt;/p&gt;&lt;p&gt;
 &lt;a href="&lt;a href="http://vigrxpluspotent.webnode.com/"&gt;[link 1]&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"&gt;Order VigRX Plus&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
&lt;a href="http://vigrxpluspotent.webnode.com/"&gt;[1 http://vigrxpluspotent.webnode.com/]&lt;/a&gt;&lt;br/&gt;
&lt;/p&gt;


&lt;/div&gt;</includedComments:content>
					<includedComments:title>VigRX Additional Male Enhancement Pills</includedComments:title>
				</includedComments:comment>
			</includedComments:comment-collection>
			<wfw:comment>http://www.cincomsmalltalk.com/userblogs/travis/servlet/CommentAPIServlet?guid=3443138169</wfw:comment>
		</item>
		<item>
			<title>Superpower Adventures in Lightweight Classing</title>
			<link>http://www.cincomsmalltalk.com/userblogs/travis/blogView?showComments=true&amp;printTitle=Superpower_Adventures_in_Lightweight_Classing&amp;entry=3440856756</link>
			<category>SuperPower Lessons?</category>
			<pubDate>Wed, 13 Jan 2010 17:32:36 GMT</pubDate>
			<description><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p><a href="http://www.iam.unibe.ch/~akuhn/blog/">Adrian Kuhn</a> has been blogging a series of Smalltalk Superpowers. What a wonderful blog topic. And a great job Adrian is doing too. He's a worthy Smalltalk Superhero.

<p>

I'm having an adventure in superpowering right now. I need, for reasons as of yet undisclosed (superheros live secret lives, ya know), to have my own subclass of UILookPolicy. UILookPolicy participates with UIBuilder objects to compile (build) user interfaces from WindowSpec objects. Much of its behavior is in UILookPolicy, but it is in fact an abstract class. It has a handful of platform specific subclasses.

<p>

The problem, is that I don't want a whole new subclass. I don't want to re-implement all of UILookPolicy. What I want is a generic subclass of whatever the default subclass is, whether it's a MacOSXLookPolicy or a WinXPLookPolicy.

<p>

But the subclass card has been played already. To get that kind of structure with normal everyday living, I'll have to make a subclass of each subclass. Or...

<p>

I can step into a booth and don my Lightweight Classes costume. Here's what it looks like

<p>

<pre>

UILookPolicy&gt;&gt;myOwnPolicy



	| lightweightClass |

	lightweightClass := MyLookPolicy copy.

	lightweightClass superclass: self class.

	^lightweightClass new

</pre>

<p>

With this costume on, I can send the message <b>myOwnPolicy</b> to any subclass instance of UILookPolicy (e.g. a MotiffLookPolicy instance) and end up with a new instance which implements the behavior of MyLookPolicy as if it were a subclass of that class. When in reality, it's a subclass of UILookPolicy, and by default, a sibling to the likes of WinXPLookPolicy and friends.

<p>

This allows me to derive from any standard LookPolicy object, one that overrides methods like button:into:, but otherwise, inherits all of the behavior of the original instance.
</p></div>]]></description>
			<guid isPermaLink="false">3440856756</guid>
			<pingback:server>http://www.cincomsmalltalk.com/userblogs/travis/servlet/CommentAPIPBServlet?guid=3440856756</pingback:server>
			<pingback:target>http://www.cincomsmalltalk.com/userblogs/travis/blogView?guid=3440856756</pingback:target>
			<includedComments:comment-collection>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Superpower_Adventures_in_Lightweight_Classing&amp;entry=3440856756</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Superpower_Adventures_in_Lightweight_Classing&amp;entry=3440856756</includedComments:puid>
					<includedComments:author>Karsten</includedComments:author>
					<includedComments:pubDate>2010-01-14T03:36:45-05:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;Don't you also need to copy the class's meta-class? I think it could create some weird problems if a class's meta class has a different superclass.&lt;/p&gt;&lt;p&gt;Karsten&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Re: Superpower Adventures in Lightweight Classing</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Superpower_Adventures_in_Lightweight_Classing&amp;entry=3440856756</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Superpower_Adventures_in_Lightweight_Classing&amp;entry=3440856756</includedComments:puid>
					<includedComments:author>Travis Griggs</includedComments:author>
					<includedComments:pubDate>2010-01-15T00:46:18-05:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;Karsten, only if I was doing class side stuff. I think. :)&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Re: Superpower Adventures in Lightweight Classing</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Superpower_Adventures_in_Lightweight_Classing&amp;entry=3440856756</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Superpower_Adventures_in_Lightweight_Classing&amp;entry=3440856756</includedComments:puid>
					<includedComments:author>Mark Pirogovsky</includedComments:author>
					<includedComments:pubDate>2010-01-18T11:38:44-05:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;Bob Hinkle&lt;/p&gt;&lt;p&gt;ad a presentation at OOPSLA about instance based debugging and light weight classes.  and similar article in Smalltalk report on how to do this  - with examples and detailed explanations. I used to have actual code for the light weight class.  If I can find it I'll send it to you &lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Re: Superpower Adventures in Lightweight Classing</includedComments:title>
				</includedComments:comment>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Superpower_Adventures_in_Lightweight_Classing&amp;entry=3440856756</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Superpower_Adventures_in_Lightweight_Classing&amp;entry=3440856756</includedComments:puid>
					<includedComments:author>impapypousa</includedComments:author>
					<includedComments:pubDate>2013-05-11T17:48:33-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;Youre so cool! I dont suppose Ive read something like this ahead of. So nice to come across somebody with some original thoughts on this subject. realy thank you for beginning this up. this web-site is something which is required on the internet, a person having a little originality. beneficial job for bringing something new to the world wide web!&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;
&lt;a href=&lt;a href="http://www.topredbottoms.com&gt;christian "&gt;[link 1]&lt;/a&gt;louboutin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;
&lt;a href="http://www.topredbottoms.com&gt;christian "&gt;[1 http://www.topredbottoms.com&gt;christian ]&lt;/a&gt;&lt;br/&gt;
&lt;/p&gt;


&lt;/div&gt;</includedComments:content>
					<includedComments:title>Choosing The Best Pair Of Basketball Shoes - Tips And Tricks</includedComments:title>
				</includedComments:comment>
			</includedComments:comment-collection>
			<wfw:comment>http://www.cincomsmalltalk.com/userblogs/travis/servlet/CommentAPIServlet?guid=3440856756</wfw:comment>
		</item>
		<item>
			<title>Cool Cairo Machinery</title>
			<link>http://www.cincomsmalltalk.com/userblogs/travis/blogView?showComments=true&amp;printTitle=Cool_Cairo_Machinery&amp;entry=3435261617</link>
			<category>look over there! look over there!</category>
			<pubDate>Mon, 09 Nov 2009 23:20:17 GMT</pubDate>
			<description><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p>Chris Thorgrimsson sent me a link to <a href="http://mycairographics.com/">his new blog where he's talking about some of the things they're doing with Cairo and VisualWorks</a>. The demos and stuff I show are OK, but it's always way cooler to see it in real life stuff. Thanks for sharing Chris.



Chris actually prompted <a href="http://www.cincomsmalltalk.com/userblogs/travis/blogView?showComments=true&printTitle=How_Low_Can_You_Go&entry=3421629022">this post a while back</a>.
</p></div>]]></description>
			<guid isPermaLink="false">3435261617</guid>
			<pingback:server>http://www.cincomsmalltalk.com/userblogs/travis/servlet/CommentAPIPBServlet?guid=3435261617</pingback:server>
			<pingback:target>http://www.cincomsmalltalk.com/userblogs/travis/blogView?guid=3435261617</pingback:target>
			<includedComments:comment-collection></includedComments:comment-collection>
			<wfw:comment>http://www.cincomsmalltalk.com/userblogs/travis/servlet/CommentAPIServlet?guid=3435261617</wfw:comment>
		</item>
		<item>
			<title>Herling to the Top of a Micro and Soft Hill</title>
			<link>http://www.cincomsmalltalk.com/userblogs/travis/blogView?showComments=true&amp;printTitle=Herling_to_the_Top_of_a_Micro_and_Soft_Hill&amp;entry=3433024256</link>
			<category></category>
			<pubDate>Thu, 15 Oct 2009 01:50:56 GMT</pubDate>
			<description><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p>It's the hill climbing factor. It doesn't matter if you've just climbed the smallest mole hill next to Mount Rainier, if you've worked hard to get to the top of that hill, and you've struggled to get there, you experience the biggest high having achieved a local maximum when you get to the top.

<p>

I've often theorized that this is why the masses never have taken to the higher level langauges such as Smalltalk, Lisp, ML. Building and enumerating a doubly linked list in C is a challenge! Doing it in Smalltalk. Meh. You run out of easy hills to feel good about climbing.

<p>

Tonite, I'm feeling that kind of feeling. After banging my head, googling through obscure references, I've got to the point where I can do a one-click doit to download all of the Cairo, Zlib, Libpng sources and compile Zlib and Libpng, using Microsoft's freely available Express tools.

<p>

I'm simply amazed that Microsoft took over the world, so to speak, with such an operating system/environment, where automating anything is so difficult. The flip side, is that getting an automated download and configure/compile gives me a huge rush.

<p>

On the way, I'm having continued fun with Herl. I've further fleshed out some of it's OS interface parts for Windows now. Keeping in the tradition of "making it up as I go."
</p></div>]]></description>
			<guid isPermaLink="false">3433024256</guid>
			<pingback:server>http://www.cincomsmalltalk.com/userblogs/travis/servlet/CommentAPIPBServlet?guid=3433024256</pingback:server>
			<pingback:target>http://www.cincomsmalltalk.com/userblogs/travis/blogView?guid=3433024256</pingback:target>
			<includedComments:comment-collection>
				<includedComments:comment>
					<includedComments:guid>blogView?showComments=true&amp;printTitle=Herling_to_the_Top_of_a_Micro_and_Soft_Hill&amp;entry=3433024256</includedComments:guid>
					<includedComments:puid>blogView?showComments=true&amp;printTitle=Herling_to_the_Top_of_a_Micro_and_Soft_Hill&amp;entry=3433024256</includedComments:puid>
					<includedComments:author>Auth</includedComments:author>
					<includedComments:pubDate>2012-07-23T12:31:55-04:00</includedComments:pubDate>
					<includedComments:content>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;p&gt;and adds itself to the block. It is in early alpha but this is loiokng pretty good so far. APE, the highly anticipated Motor Physics from polygonal labs and now FOAM, so many wonderful physics toys to build games&lt;/p&gt;
&lt;/div&gt;</includedComments:content>
					<includedComments:title>Re: Herling to the Top of a Micro and Soft Hill</includedComments:title>
				</includedComments:comment>
			</includedComments:comment-collection>
			<wfw:comment>http://www.cincomsmalltalk.com/userblogs/travis/servlet/CommentAPIServlet?guid=3433024256</wfw:comment>
		</item>
		<item>
			<title>Herling CairoGraphics</title>
			<link>http://www.cincomsmalltalk.com/userblogs/travis/blogView?showComments=true&amp;printTitle=Herling_CairoGraphics&amp;entry=3432594532</link>
			<category>Is it a lark, or not?</category>
			<pubDate>Sat, 10 Oct 2009 02:28:52 GMT</pubDate>
			<description><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">
<p>This last week, I've been trying to get CairoGraphics libraries built on the breadth of platforms we support VisualWorks on. Doing so makes it easy for customers to use CairoGraphics with VisualWorks in their own projects, and if we manage to get ALL the platforms, it makes it so we can begin to improve our own IDE with its capabilities. It's unknown how many, if any, we'll get included for preview for the 7.7 release, but something is better than nothing. Windows and MacOSX seems a good probability at this point. X11 is proving more difficult.

<p>

Having built CairoGraphics libraries a couple of times, over the last year or so, with long pauses in between, I often find the documentation is not quite up to date, that I end up having to ask questions of their very helpful mailing list or irc channel. I'm not GNU build guru, so they're probably naive. Which led me to want to script the download and building of these libraries. So that it was reproducible. And precisely documented.

<p>

Bash is the script environment I'm most comfortable with. But I'm no wizard. Especially when it comes to doing higher level algorithmic things. I have to ask for help for those, and I end up missing Smalltalk anyway.

<p>

So I thought I'd take the rudimentary ScriptingSupport package that we include as preview in VisualWorks, and try that. At this point, it's still pretty young. It implements stuff to make command line execution easier, and adds the & binary sugar, which is a handy way of concatenating single objects onto collections (as opposed to , which concatenates multiple elements).

<p>

And then I just decided to have fun. I followed the following design principles, which seem to be at the heart of the design of most scripting languages.

<ol>

<li>Typing sucks. It's no fun. So add lots of sugar to make things terse and conserve keyboard srokes.</li>

<li>Use lots of infix characters.</li>

<li>Make it up as you go. As you encounter new situations, add more stuff, don't try to come up with any sort of simple unifying theme. Just throw more stuff on.</li>

<li>Typing sucks. The other kind. Support few basic types, and abuse them. Just mash them together. You should be deluded into thinking you have don't have to worry about types, except now and then again in surprising ways. Don't make me convert from one type to another.</li>

</ol>

<p>

The only non-traditional requirement I added, was that I don't want to build a new parser or anything. So it has to strictly speaking, still be Smalltalk. 

<p>

It's still a work in progress; I'm not out to start a movement. I expect derision and flames. Its all a lark to me right now. I've named my little Domain Specific Scripting Language "Herl". Ken Treis actually suggested the name; thanks Ken. It's been replicated up to the Open Repository and has a package comment that looks like any scripting language reference manual.

<p>

For those who aren't that interested (all of you likely), a snapshot of the "script" I wrote with it, is probably enough.

<p>

<pre>

rootDir := '$(HOME)/BuildCairo'.

rootDir rm.

rootDir mkdir.

rootDir cd.



"Download everything"

page := #(curl   -s 'http://www.cairographics.org/releases/' ) exec.

cairo := (((page -@ $>)  detect: [:each | 'LATEST-cairo-.*' ?= each]) -@ $<) _1.

(#(curl -s) & ('http://www.cairographics.org/releases/' , cairo) , #(-o 'cairo.tgz')) exec.

pixman := (((page -@ $>)  detect: [:each | 'LATEST-pixman-.*' ?= each]) -@ $<) _1.

(#(curl -s) & ('http://www.cairographics.org/releases/' , pixman) , #(-o 'pixman.tgz')) exec.

page := #(curl  -s 'http://pkgconfig.freedesktop.org/releases/' ) exec.

pkgconfig := ((((page -@ $>)  select: [:each | each =? 'pkg-config-.*' ]) sortBy: [:each | (each -@ $.) _2 asNumber]) last -@ $<) _1.

(#(curl -s) & ('http://pkgconfig.freedesktop.org/releases/' , pkgconfig) , #(-o 'pkgconfig.tgz')) exec.

#(curl -s 'ftp://ftp.simplesystems.org/pub/libpng/png/src/libpng-1.2.40.tar.gz' -o 'libpng.tgz') exec.



"Untar and rename all 4"

#(tar -xzf 'pkgconfig.tgz') exec.

'pkgconfig.tgz' rm.

(rootDir ls: 'pkg.*') _1  mv: 'pkgconfig'.

#(tar -xzf 'libpng.tgz') exec.	

'libpng.tgz' rm.

(rootDir ls: 'libpng.*') _1 mv:  'libpng'.

#(tar -xzf 'pixman.tgz') exec.	

'pixman.tgz' rm.

(rootDir ls: 'pixman.*') _1 mv: 'pixman'.

#(tar -xzf 'cairo.tgz') exec.	

'cairo.tgz' rm.

(rootDir ls: 'cairo.*') _1 mv: 'cairo'.



"Build, install pkg-config"

(rootDir / 'pkgconfig' ) cd.

(rootDir / 'pkgconfig' / 'configure' & ('--prefix=' , (rootDir / '') forExec)) exec.

#(make) exec.

#(make install) exec.



"Environment variables for our pkg-config"

'PKG_CONFIG' setenv: rootDir / 'bin' / 'pkg-config'.

'PKG_CONFIG_PATH' setenv: rootDir / 'lib' / 'pkgconfig'.



"Setup environment variables for fat binary compilation"

'MACOSX_DEPLOYMENT_TARGET' setenv: '10.4'.

'LDFLAGS' setenv: '-arch ppc -arch i386 -isysroot /Developer/SDKs/MacOSX10.4u.sdk'.

'CFLAGS' setenv: '-Os -arch ppc -arch i386 -isysroot /Developer/SDKs/MacOSX10.4u.sdk'.



"Build, install libpng"

(rootDir / 'libpng') cd.

(rootDir / 'libpng' / 'configure' & ('--prefix=' , (rootDir / '') forExec) & '--disable-dependency-tracking') exec.

#(make) exec.

#(make install) exec.



"Build, install pixman"

(rootDir / 'pixman') cd.

(rootDir / 'pixman' / 'configure' & ('--prefix=' , (rootDir / '') forExec) & '--disable-dependency-tracking' ) exec.

#(make) exec.

#(make install) exec.



"Build, install cairo"

(rootDir / 'cairo') cd.

(rootDir / 'cairo' / 'configure' & ('--prefix=' , (rootDir / '') forExec) & '--disable-xlib' & '--disable-dependency-tracking') exec.

#(make) exec.

#(make install) exec.



"Move dylibs to platform staging directories"

(rootDir / 'Frameworks') mkdir.

rootDir / 'lib' / 'libpng12.0.dylib' cp: rootDir / 'Frameworks'.

rootDir / 'lib' / 'libpixman-1.0.dylib' cp: rootDir / 'Frameworks'.

rootDir / 'lib' / 'libcairo.2.dylib' cp: rootDir / 'Frameworks'.



"Make them all relocatable"

(rootDir / 'Frameworks') cd.

#(install_name_tool -id '@executable_path/../Frameworks/libpng12.0.dylib' 'libpng12.0.dylib') exec.

#(install_name_tool -id '@executable_path/../Frameworks/libpixman-1.0.dylib' 'libpixman-1.0.dylib') exec.

#(install_name_tool -id '@executable_path/../Frameworks/libcairo.2.dylib' 'libcairo.2.dylib') exec.

(#(install_name_tool -change) & (rootDir / 'lib' / 'libpixman-1.0.dylib') , #('@executable_path/../Frameworks/libpixman-1.0.dylib' 'libcairo.2.dylib')) exec.

(#(install_name_tool -change) & (rootDir / 'lib' / 'libpng12.0.dylib') , #('@executable_path/../Frameworks/libpng12.0.dylib' 'libcairo.2.dylib')) exec.



"Clear build variables"

'MACOSX_DEPLOYMENT_TARGET' unsetenv.

'LDFLAGS' unsetenv.

'CFLAGS' unsetenv.

<pre>

<p>

Feel like Herl-ing now?
</p></div>]]></description>
			<guid isPermaLink="false">3432594532</guid>
			<pingback:server>http://www.cincomsmalltalk.com/userblogs/travis/servlet/CommentAPIPBServlet?guid=3432594532</pingback:server>
			<pingback:target>http://www.cincomsmalltalk.com/userblogs/travis/blogView?guid=3432594532</pingback:target>
			<includedComments:comment-collection></includedComments:comment-collection>
			<wfw:comment>http://www.cincomsmalltalk.com/userblogs/travis/servlet/CommentAPIServlet?guid=3432594532</wfw:comment>
		</item>
	</channel>
</rss>
