<?xml version='1.0' encoding='UTF-8' ?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title>Practical Smalltalk</title>
	<updated>2007-12-20T07:35:13-05:00</updated>
	<id>http://www.cincomsmalltalk.com/userblogs/chipd/blogView</id>
	<rights>Copyright 2006 Chip Dice</rights>
	<generator uri="/CincomSmalltalkWiki/Silt" version="1.0">Silt Syndication Generator</generator>
	<link href="http://www.cincomsmalltalk.com/userblogschipd/blogView" rel="alternate" type="text/html"></link>
	<link href="/rssBlog/chipd-atom.xml" rel="self" type="application/atom+xml"></link>
	<entry>
		<title>Learning Pollock</title>
		<id>http://www.cincomsmalltalk.com/userblogs/chipd/blogView?showComments=true&amp;printTitle=Learning_Pollock&amp;entry=3349085048</id>
		<updated>2007-02-16T13:24:08-05:00</updated>
		<author>
			<name>Chip Dice</name>
			<uri>http://www.cincomsmalltalk.com/userblogschipd/blogView</uri>
			<email>stblog@dicehome.com</email>
		</author>
		<content type="html" xml:lang="en-us"><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">

<p>I decided the other day that it was time to learn a bit more about Pollock. After loading up the latest Pollock code from the VW Public Repository, I decided the best place to start was to go to the source. Sam's <a href="http://www.cincomsmalltalk.com/userblogs/pollock/blogArchive?month=3&amp;year=2004">blog</a> about Pollock has some real nice examples and walk-throughs. It is a bit dated however, so I'm going to add my own notes here are I go. </p>
<p>All was going well until I got to his entry on &quot;<a href="http://www.cincomsmalltalk.com/userblogs/pollock/blogView?showComments=true&amp;printTitle=How_To_Build_A_GUI_With_Pollock_-_Hooking_Up_The_Interface&amp;entry=3256471101">How to Build a GUI With Pollock - Hooking up the Interface</a>&quot;. Since writing this, the change mechanism has been... changed. So below are the changes I made to get this example to work. You will need to use these changes in subsequent entries in his blog. As I go forward with Pollock, I'll try and add any additional changes here to make things easier for anyone else.</p><pre>hookupInterface 
	(self paneAt: #TreeView1) when: SelectionChanged do: [:ann | self fillProtocolList] for: self. 
	(self paneAt: #ListBox1) when: SelectionChanged do: [:ann | self fillMethodList] for: self. 
	(self paneAt: #ListBox2) when: SelectionChanged do: [:ann | self displayMethodSource] for: self.
 
 
fillProtocolList 	
	(self paneAt: #TreeView1) selection ifNotNil: [:value | 
		(self paneAt: #ListBox1) list: value organization  categories asObservedList
	] 
 
fillMethodList 	
	(self paneAt: #TreeView1) selection ifNotNil: [:classValue |
  		(self paneAt: #ListBox1) selection ifNotNil:[:protocolValue |
  			(self paneAt: #ListBox2) list: (classValue organization listAtCategoryNamed: protocolValue) asObservedList
 		] 	
	]  
 
displayMethodSource 	
	(self paneAt: #TreeView1) selection ifNotNil: [:classValue |
  		(self paneAt: #ListBox2) selection ifNotNil:[:methodValue |
  			(self paneAt: #TextEdit1) model value: (classValue sourceCodeAt: methodValue)
 		]
 	]</pre></div>]]></content>
		<link href="http://www.cincomsmalltalk.com/userblogschipd/blogView?showComments=true&amp;entry=3349085048" rel="alternate" type="text/html"></link>
		<category term="Pollock"></category>
	</entry>
	<entry>
		<title>Total Leadership</title>
		<id>http://www.cincomsmalltalk.com/userblogs/chipd/blogView?showComments=true&amp;printTitle=Total_Leadership&amp;entry=3337498922</id>
		<updated>2006-10-05T11:02:02-04:00</updated>
		<author>
			<name>Chip Dice</name>
			<uri>http://www.cincomsmalltalk.com/userblogschipd/blogView</uri>
			<email>stblog@dicehome.com</email>
		</author>
		<content type="html" xml:lang="en-us"><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">

<p>I found this interesting <a href="http://www.cio.com/archive/091506/leadership.html">article</a> in CIO magazine. It is a good case example of what I struggle with on a daily basis. Many of you may remember the old adage from many years back &ldquo;you can&rsquo;t go wrong with IBM&rdquo;, in fact the decision makers who used that line just simply didn&rsquo;t have the guts to implement unique solutions. Today it seems that adage would be &ldquo;you can&rsquo;t go wrong with .NET or Java&rdquo;. When in fact if you look at the productivity you get with Smalltalk, there is significant reason to use a product that is not &ldquo;mainstream&rdquo;. How can you get a competitive advantage over the other guy? Use tools that let you focus on the business problem and not the language restraints. I&rsquo;m not some &ldquo;nuts and bolts&rdquo; coder, I&rsquo;m a business applications architect/developer who deals with a lot of complexity. While I believe in having a thorough knowledge of the business problem you are solving, I do not believe that requires a long and tedious design process. Odds are you will be changing that design as you go and enhancing it somewhere down the line. Being flexible while developing makes a better product in the long run, one that fits the user&rsquo;s needs better, solves the problem better. If you are using tools that let you make those changes more efficiently, you can embrace the process of change during development, instead of fight it.</p>
<p>Better products, better maintainability, agility, faster time to market. That&rsquo;s what CIO&rsquo;s should be looking at, not &ldquo;nobody ever got fired for choosing IBM&rdquo;. It's that sort of mentality that stifles real advancement.</p></div>]]></content>
		<link href="http://www.cincomsmalltalk.com/userblogschipd/blogView?showComments=true&amp;entry=3337498922" rel="alternate" type="text/html"></link>
		<category term="General"></category>
	</entry>
	<entry>
		<title>Excel Automation</title>
		<id>http://www.cincomsmalltalk.com/userblogs/chipd/blogView?showComments=true&amp;printTitle=Excel_Automation&amp;entry=3336122872</id>
		<updated>2006-09-19T12:47:52-04:00</updated>
		<author>
			<name>Chip Dice</name>
			<uri>http://www.cincomsmalltalk.com/userblogschipd/blogView</uri>
			<email>stblog@dicehome.com</email>
		</author>
		<content type="html" xml:lang="en-us"><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">

<p>Recently I needed to output some data into Excel and create a nicely formatted page. Using the Com- Automation Examples package provided with VisualWorks, I was able to create some nice excel spreadsheets. I packaged up those extensions and published them to the public repository (Com- Automation Examples Extensions). While there are still a ton of things that could be added, I figured that this would be a good start and hope that others add in functionality as they need it.</p>
<p>If you want to look this over, load the package from the public repository and look at the examples on the class side of ExcelApplicationController.</p></div>]]></content>
		<link href="http://www.cincomsmalltalk.com/userblogschipd/blogView?showComments=true&amp;entry=3336122872" rel="alternate" type="text/html"></link>
		<category term="General"></category>
	</entry>
	<entry>
		<title>Blessing Levels</title>
		<id>http://www.cincomsmalltalk.com/userblogs/chipd/blogView?showComments=true&amp;printTitle=Blessing_Levels&amp;entry=3335604263</id>
		<updated>2006-09-13T12:44:23-04:00</updated>
		<author>
			<name>Chip Dice</name>
			<uri>http://www.cincomsmalltalk.com/userblogschipd/blogView</uri>
			<email>stblog@dicehome.com</email>
		</author>
		<content type="html" xml:lang="en-us"><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">

<p>One of the things I did early on when I moved our code into Store was revise the blessing levels. </p>
<p>The blessing levels I created in house more closely correspond to the way we develop and release code. As a result, I came up with the following levels that progress from development work being done by an individual, to shared development work and all the way up to Production Release</p><p><strong>Broken</strong> - Code that was published that is non-functional and should not be the base for future work</p><p><strong>Work in Progress</strong> - Work being done by an individual developer and should not (at this stage) be merged with any other projects</p><p><strong>Development</strong> - Work being done by more than one developer (so it may need to be merged within the project)</p><p><strong>Wait for Alpha</strong> - Code that is expected to go into Alpha testing but is being held up due to some other reason</p><p><strong>Ready for Alpha</strong> - Code that is ready to be put into Alpha, but is not there yet</p><p><strong>Alpha</strong> - Code that has been released to Alpha</p><p><strong>Wait for Beta</strong> - Code that is expected to go into Beta but is being held up due to some other reason</p><p><strong>Ready for Beta</strong> - Code that has been released to Beta</p><p><strong>Beta</strong> - Code that has been released to Beta</p><p><strong>Wait for Production</strong> - Code that is expected to go into Production but is being held up due to some other reason</p><p><strong>Ready for Production</strong> - Code that is ready to be put into Production but is not there yet</p><p><strong>Production</strong> - Code that has been released to Production environment.</p><p>To me at least, this reflects the path that code may go through on it's way to a production release. </p><p>With the developers that I've worked with and used these levels with, we have an understanding that something &quot;waiting&quot; is ready to go, but requires something else be done (usually something like a db change), while &quot;ready&quot; signifies that the code can be released to that blessing level by the proper person and something at the blessing level (ie Beta), has actually been released to that area for use by the end user.</p><p>For more information on how I deploy my applications, see <a href="http://www.cincomsmalltalk.com/userblogs/chipd/blogView?showComments=true&amp;entry=3335592598">Running the Deployed app</a></p></div>]]></content>
		<link href="http://www.cincomsmalltalk.com/userblogschipd/blogView?showComments=true&amp;entry=3335604263" rel="alternate" type="text/html"></link>
		<category term="Tools"></category>
	</entry>
	<entry>
		<title>Running the deployed app</title>
		<id>http://www.cincomsmalltalk.com/userblogs/chipd/blogView?showComments=true&amp;printTitle=Running_the_deployed_app&amp;entry=3335592598</id>
		<updated>2006-09-13T09:29:58-04:00</updated>
		<author>
			<name>Chip Dice</name>
			<uri>http://www.cincomsmalltalk.com/userblogschipd/blogView</uri>
			<email>stblog@dicehome.com</email>
		</author>
		<content type="html" xml:lang="en-us"><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">

<p>Development on our system takes pace at a rapid pace, it&rsquo;s not uncommon for me to release new/fixed code many times a day. Generally these are small enhancements, incremental development or even &ldquo;preview&rdquo; code that I want only specific users to run. So it is not uncommon to have three different versions of the code &ldquo;out there&rdquo; at any one point.</p>
<p>I&rsquo;ve divided up our releases into Production, Beta, Alpha and Testing. The first three types correspond to the blessing levels I use and the final is an area I use mostly for myself to test and debug runtime issues. My deployment procedure is pretty simple, create the .pcl files, copy them to the appropriate directories (corresponding to the release types) and have the user restart.</p><p>The end user actually executes a .cmd file. This file copies all of the application down to the local hard drive (in a directory corresponding to the release type). This includes visual.exe, all .pcls from Visualworks that are used, all of my .pcls and any configuration files. It then uses the start command to launch visual in a new process so that the .cmd file can exit and the command window disappears. </p><p>The .cmd file starts by changing to the local hard drive and verifying that the target directory exists using the following command</p><p><em>IF not Exist C:\Production731\prn md C:\Production731</em></p><p>So it will create the folder on the fly if the local drive does not already have a folder named it.</p><p>The copy command (I use XCopy) uses the /D and the /Y options, /D ensures that only newer files are copied down (making the startup process much faster) and the /Y eliminates any &ldquo;overwrite this file&rdquo; messages that the command processor might throw.</p><p> Here is an example of the start command which will start my application in another process, thus allowing the command window to close. </p><p><em>START Visual.EXE Runtime.im -cnf myApp.cnf -notifier MyNotifier -doit 'MyApp open'</em></p><p>By copying everything locally and then running the application, I do not have issues with copying the .pcl files out onto our network during a busy time. The actual files on the network are not &ldquo;in use&rdquo; by anyone directly. </p><p>You can see that my release directories also include the version of VW that we are running. This lets me then migrate users to the next version in a much more controlled fashion. The shortcut that the user has to start the application actually points to a general .cmd file for Production/Beta/Alpha on our network. In that .cmd file, I call another .cmd file for the specific version of VW that I am running. That way, when I am ready to move Beta users over to VW7.4.1, all I do it edit the Beta.cmd file on our network to point to the Beta741.cmd file. The end users shortcut on the desktop is not changed, so there are no changes on the workstation that we need to make. This also adds in the ability to revert back to 7.3.1 should I find anything that is unacceptable. Since I use release directories with the VW version number as part of the name, there are no issues with running a mix of the wrong code.</p><p>Down the road, if I want to clean up the local users hard drive, I can always insert a command in the .cmd file to delete a previous release directory should it exist.</p><p>In practice I&rsquo;ve found that these techniques make deployment much easier to manage. I can easily place Alpha users on a different version of VW, or have Beta users running different code than production. I may release code in the middle of the day and ask a specific user who requested a change to restart. This gives them the new code but does not disrupt any of the other users.</p><p>Here is a listing of one of my .cmd files </p><p>@Echo off Echo Starting Target Trading II - 2005 Beta Version ... </p><p>Echo Updating Source Code Echo Please wait.... </p><p>REM Code to update the local workstation with new code </p><p>IF not Exist C:\TradingBeta731\prn md C:\TradingBeta731 C: CD \TradingBeta731 </p><p>REM DEL . /Q </p><p>XCOPY I:\Forest\Apps\VisualWorks7.3.1\*.* C:\TradingBeta731 /D /Y </p><p>XCOPY I:\Forest\Apps\TargetTrading\Beta7.3.1\*.* C:\TradingBeta731/D /Y </p><p>XCOPY I:\Forest\Apps\TargetTrading\bmp\TargetIIBeta.bmp C:\TradingBeta731\Herald.bmp /D /Y </p><p>C: </p><p>Echo Code update complete. </p><p>CD\TradingBeta731 </p><p>START Visual.EXE Runtime.im -cnf trading.cnf -notifier TargSysNotifier -doit 'TargetFrameApp open' </p></div>]]></content>
		<link href="http://www.cincomsmalltalk.com/userblogschipd/blogView?showComments=true&amp;entry=3335592598" rel="alternate" type="text/html"></link>
		<category term="Deployment"></category>
	</entry>
	<entry>
		<title>Developer Tool</title>
		<id>http://www.cincomsmalltalk.com/userblogs/chipd/blogView?showComments=true&amp;printTitle=Developer_Tool&amp;entry=3335530531</id>
		<updated>2006-09-12T16:15:31-04:00</updated>
		<author>
			<name>Chip Dice</name>
			<uri>http://www.cincomsmalltalk.com/userblogschipd/blogView</uri>
			<email>stblog@dicehome.com</email>
		</author>
		<content type="html" xml:lang="en-us"><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml"><p> One of the things I do every time I migrate my apps to a new version of Visualworks is start by upgrading my &ldquo;Developers Tool&rdquo;. While I&rsquo;ve found some great add-ins in the public repository, I&rsquo;ve always customized the VisualLauncher with buttons and hot keys to make myself as productive as possible. VisualLauncher is still open in my image, so that I can get to everything thing it offers, but my DevTool is customized to my environment, the way I work. </p><p>I&rsquo;ve got the Transcript in it as well as many of the Menu options that VisualLauncher has, but I&rsquo;ve added in a section at the bottom with buttons (and hotkeys) for my most commonly used &ldquo;stuff&rdquo;. I'll try and figure out how to show it below and I&rsquo;ve listed some of the buttons options I use. What options would you add?</p><p>My development tool also contains a list of My Bundles (I exclude all the system bundles). By selecting a bundle I can easily create .pcls files and then release them to different development and production directories. This makes the process of releasing code to my users fast and painless.</p><p>Here are some of my more usefully buttons </p><p><strong>Browse class/Implementors/Senders</strong> - I use these, but I find that the hotkeys are much more convenient. When I upgrade to 7.4.1 (currently in progress). I need to make my hotkeys more consistent, which will require me to change a few of them.</p><p><strong>Garbage collect</strong> - I&rsquo;m always using this to make sure I don&rsquo;t have stuff left around from debugging before I save.</p><p><strong>Process Monitor</strong> - More recently I added this, because it helps me further clean my image before saving it.</p><p><strong>Published items/More recently published items</strong> - Standard options from the VisualLauncher menu</p><p><strong>Sweep Alpha/Sweep Beta/Sweep Production</strong> - Works like &ldquo;More recently published&rdquo; but only for those packages/bundles at the specified Blessing level or above (Note that I&rsquo;ve modified my blessing levels to be a bit different than the standard ones). </p><p><strong>Show SQL</strong> - This toggles a global variable I use in my persistence framework which will send all SQL commands to the transcript. Very helpful in tracking down issues with SQL interaction.</p><p><strong>Create</strong> - Will create a .pcl file using the bundle I have selected in my bundle list. Will not let me create a .pcl on unpublished code (unless I enable that option). </p><p><strong>Release</strong> - Will copy the .pcl file (created previously) to a list of directories (as presented to the user). My options for release are things such as &ldquo;Production Environment&rdquo;, &ldquo;Beta Environment&rdquo;, &ldquo;Alpha&rdquo;, &ldquo;All environments&rdquo;. This copy will first &ldquo;archive the existing.pcl file (and keep the most recent 10 version of it) so that I can back out a release quickly.</p><p><strong>Target</strong> - This is the name of the main application and this button just launches it. I also have hot keys for launching it. </p><p><strong><em>Hot keys</em></strong></p><p> <strong>Ctrl-A</strong> Find all senders of halt (and althalt) that are in the image. This excludes halts that are in the VW system code. As a matter of procedure, I never release code that has halts or althalts, I therefore always use this option prior to creating a .pcl file and releasing it. </p><p><strong>Ctrl-B</strong> Browse a class </p><p><strong>Ctrl-Q</strong> Browse implementers </p><p><strong>Ctrl-W</strong> List VW windows </p><p></p></div>]]></content>
		<link href="http://www.cincomsmalltalk.com/userblogschipd/blogView?showComments=true&amp;entry=3335530531" rel="alternate" type="text/html"></link>
		<category term="Tools"></category>
	</entry>
	<entry>
		<title>Starting out</title>
		<id>http://www.cincomsmalltalk.com/userblogs/chipd/blogView?showComments=true&amp;printTitle=Starting_out&amp;entry=3335529481</id>
		<updated>2006-09-12T15:58:01-04:00</updated>
		<author>
			<name>Chip Dice</name>
			<uri>http://www.cincomsmalltalk.com/userblogschipd/blogView</uri>
			<email>stblog@dicehome.com</email>
		</author>
		<content type="html" xml:lang="en-us"><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">

<p>I decided to jump into the world of blogging in order to demonstrate some of the techniques I use while writing/maintaining a complex financial application in Visualworks. I&rsquo;ve been using Visualworks for the last 8+ years, mostly developing a comprehensive Portfolio Management/Risk evaluation system for several hedge funds. While over the years I&rsquo;ve had help in writing the code and designing the application, it has been myself who has been the overall architect for the systems in place. As a result, I&rsquo;ve developed techniques/procedures/tools to help manage and enhance these applications that I hope you will find useful, or at least thought provoking. </p>
<p>As of this writing, I am the only developer on this system, so I play the roles of architect, developer, tester, advocate, operations manager (I do get some help in this area) and anything else related to this system. It is a testament to Smalltalk that I can not only continue to maintain this system in production (it is quite extensive) but also continue enhancements. </p><p>Please feel free to add constructive comments to my blog and encourage the use of Smalltalk out there for real-world applications</p><p>Chip</p></div>]]></content>
		<link href="http://www.cincomsmalltalk.com/userblogschipd/blogView?showComments=true&amp;entry=3335529481" rel="alternate" type="text/html"></link>
		<category term="Introduction"></category>
	</entry>
</feed>
