<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5316557363652281135</id><updated>2011-12-19T05:24:45.060-08:00</updated><title type='text'>Brian's MultiValue Blog</title><subtitle type='html'>Thoughts, musings and occasional curmudgeon regarding the worlds of MultiValue and IBM/Rocket U2 technology.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>45</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-3429435142355030225</id><published>2011-12-19T05:24:00.000-08:00</published><updated>2011-12-19T05:24:45.067-08:00</updated><title type='text'>mvStudio First View</title><content type='html'>Well it's been a while since the last blog, so what' been happening?&lt;br /&gt;&lt;br /&gt;The big news is that I've been hard at work on my new development toolkit, codenamed 'mvStudio' though that may well change between now and its general release next year. This is already being used in anger by a couple of my clients and the feedback has been overwhelmingly positive so far.&lt;br /&gt;&lt;br /&gt;mvStudio is the natural inheritor to uvCase, a development environment I wrote years ago whilst working for ADG (that dates it). uvCase was a Windows based 4GL for UniVerse that was probably ahead of its time, and some of the better features have found their way into mvStudio.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-IbaJXOpIXUQ/Tu8v7BE9wHI/AAAAAAAAADY/j03agz8mPeY/s1600/mvstudio_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="291" src="http://4.bp.blogspot.com/-IbaJXOpIXUQ/Tu8v7BE9wHI/AAAAAAAAADY/j03agz8mPeY/s400/mvstudio_1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Architecturally, mvStudio consists of a runtime client written using .NET WinForms connecting to a database server over UniObjects. So why not web based? Well the issue there is that mvStudio is specifically designed to work with legacy systems, and has lots of tricks up its sleeve for code reuse and for making the most out of the sort of - shall we say -&amp;nbsp;less than optimal file design that somtimes accompanies mature applications that have undergone years of organic growth.&lt;br /&gt;&lt;br /&gt;Anyway, the issues with putting web based front ends onto those is that they use a different model to legacy applications, and can cause some fun and games when you want to mix and match them with existing locking, security, workfile creation&amp;nbsp;and user management. Plus you end up having to buy connection pools to stay legal.&lt;br /&gt;&lt;br /&gt;That is not to say you can't add web front ends to legacy systems - and for that you can always use my &lt;strong&gt;mvScript&lt;/strong&gt; tools! But these are often for new features, adding new eCommerce&amp;nbsp;capabilities for instance.&lt;br /&gt;&lt;br /&gt;mvStudio is designed to handle the nuts and bolts that make up the&amp;nbsp;whole of the application, and so coexistence with existing code and operations is very high on the priority list.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #3d85c6; font-size: large;"&gt;Talking the MultiValue Language&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Another high priority is familiarity. mvStudio uses&amp;nbsp;a small number of highly flexible tools&amp;nbsp;that roughly translate to the things well known&amp;nbsp;to&amp;nbsp;MultiValue developers: screens, menus, listings, command and the like.&lt;br /&gt;&lt;br /&gt;The number of such tool types has been deliberately kept to a minimum to make for a shallow learning curve - but each of these is very flexible indeed.&amp;nbsp;A screen can be a dialog, can be linked to a real or virtual data source, can integrate with subroutines for its data. So can a listing - which&amp;nbsp;can also be used for export and reporting.&amp;nbsp;A command can render text or HTML complete with&amp;nbsp;two-way&amp;nbsp;javascript integration&amp;nbsp;so even a simple command can be used to present complex information and to use standard javascript libraries like Google Visualisation, as in the screen shot above. &lt;br /&gt;&lt;br /&gt;Back on the subject of familiarity, linking all of these togther is the scripting language, which is the real heart of mvStudio. &lt;br /&gt;&lt;br /&gt;Rather than requiring developers to learn a new and alien language, the mvStudio language is modelled on an event-oriented, tool-oriented version of UniVerse Basic. &lt;br /&gt;&lt;br /&gt;So you have all the familiar structures and functions: nice loops (with an&amp;nbsp;MV style understanding of true and false, not the Windows one!);&amp;nbsp;familiar conditionals and case structures; dynamic array operators; database I/O statements (open, read, write, delete, readu, release etc); calls to subroutines; execute and capture; functions like DCount() - all the regular paraphernalia. &lt;br /&gt;&lt;br /&gt;To that familiar base has been added the GUI support - Windows-specific functions such as message boxes, property and method acccess on tools and objects, runtime overrides of the ways that the tools operate. &lt;br /&gt;&lt;br /&gt;The snippet below gives an example of how this works - first a search dialog runs, returning a set of user-entered details as a dynamic array, then this is used to construct a new TCL SELECT statement to override the regular Command property for a listing:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-bZCCkRjJ8jk/Tu82nvd6WUI/AAAAAAAAADg/hU3ox7DPOis/s1600/mvstudio_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/-bZCCkRjJ8jk/Tu82nvd6WUI/AAAAAAAAADg/hU3ox7DPOis/s400/mvstudio_2.png" width="387" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This is just a very small taster on mvStudio and I'll be blogging more about mvStudio over the coming weeks.&lt;br /&gt;&lt;br /&gt;Happy Holidays.&lt;br /&gt;&lt;span style="color: #8515ea; font-size: x-small;"&gt;&lt;span style="color: #8515ea; font-size: x-small;"&gt;&lt;span style="color: blue;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-3429435142355030225?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/3429435142355030225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=3429435142355030225' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/3429435142355030225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/3429435142355030225'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2011/12/mvstudio-first-view.html' title='mvStudio First View'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-IbaJXOpIXUQ/Tu8v7BE9wHI/AAAAAAAAADY/j03agz8mPeY/s72-c/mvstudio_1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-4713328018422910875</id><published>2011-08-07T04:07:00.000-07:00</published><updated>2011-08-07T04:07:13.157-07:00</updated><title type='text'>Fun with NS-BASIC</title><content type='html'>Over the past few weeks I've been boring my associates with my troubles regarding app development with Titanium. Whilst there is no denying that Titanium is a very powerful and capable platform for creating professional apps, and whilst there is no denying that the native apps it produces are themselves extremely powerful and capable, there is also no denying that using it for Android is just .. frustrating.&lt;br /&gt;&lt;br /&gt;So a breath of fresh air has been playing with NS-BASIC. Unlike Titanium this is a webkit based tool, so it lacks some of the high end features that can be built&amp;nbsp;into a Titanium app. But, that said, it makes use of the PhoneGap APIs to extend it and developers can use the excellent new PhoneGap packaging service, currently in beta (and therefore currently free) to build native style packages for Android, iPhone and Blackberry. It also comes with a simple IDE (one that offers a form painter, unlike Titanium)&amp;nbsp;and a reasonable handbook. There is no free version, but at $99 it's a snap and a lot cheaper than a Titanium subscription. And there are other savings to be made.. because it's webkit based, now that PhoneGap is avialable as an online service you don't need to buy a Mac to develop cross platform apps - something that you need to do with Titanium. &lt;br /&gt;&lt;br /&gt;Other nice things are the fact&amp;nbsp;that you do not need to mess around with the ugly Android emulators&amp;nbsp;- you can simply run and debug your apps using a local copy of Chrome, which is very much quicker and easier, and developing is responsive. It feels a bit rough and ready in places - there is clearly a long way to go - but it makes the whole job of app development feel more appealing.&lt;br /&gt;&lt;br /&gt;In fact, the only thing wrong with NS-BASIC is the name. On the face of it - yes, you are programming in a style of Basic, and one that is not too far removed from the old Visual Basic, which makes it look friendly and approachable. That is then converted in JavaScript behind the scenes, which is where the really useful part of NS-BASIC comes in - you can, if you wish, totally bypass this Basic generation and code your app directly in JavaScript. Given the extensive JavaScript libraries that are out there this opens up a world of possibilities. In fact the places where the language struggles is in the differences between JavaScript and Basic, and so coding in JavaScript makes more sense if you are used to the foibles of both.&lt;br /&gt;&lt;br /&gt;And you still have access to the SQLite databases for local data storage, and to calling web services for access to live data. So I should be able to&amp;nbsp;fetch data&amp;nbsp;from an mvScript page from NS-BASIC as I can from Titanium. I'll let you know how I get on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-4713328018422910875?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/4713328018422910875/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=4713328018422910875' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/4713328018422910875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/4713328018422910875'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2011/08/fun-with-ns-basic.html' title='Fun with NS-BASIC'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-7088849113859454470</id><published>2011-07-20T02:10:00.000-07:00</published><updated>2011-07-20T02:10:05.256-07:00</updated><title type='text'>mvScript, Ajax and JSON</title><content type='html'>I've been asked to write a website for a new client. Nothing unusual in that, except that I have not yet met the client and the requirements, as they stand, are - well - thin, to say the least. I have a bunch of data in a spreadsheet with instructions that this needs to be served up to registered users. There will be a search box and a heirarchical navigation of some kind.&lt;br /&gt;&lt;br /&gt;The solution will need to be available on all standard desktops and mobile platforms, and the data will change regularly.&lt;br /&gt;&lt;br /&gt;For the mobile platform, I'm leaning towards a Titanium app. just because. I've spent quite some time recently working with Titanium and learning its foibles, to the extent that I'm writing a new book on Android Development with Titanium - not, if anyone from Appcelerator is watching (unlikely)&amp;nbsp;- to diver away from their training, but because just getting up and running in the first instance is so very frustrating. A good product let down with pitiful documentation and very poor hand holding .. where have we heard that one before?&lt;br /&gt;&lt;br /&gt;For the desktops, a web site seems the obvious choice, which means using one of my favourite technologies - the DoJo toolkit. This now, in fact, comes with mobile controls that emulate the look and feel of a real mobile application, but on the web - and unlike other webkit-based stacks it really does look and feel like a real app. It's also easier to prototype the look and feel using this than Titanium.&lt;br /&gt;&lt;br /&gt;Which is where mvScript comes in.&lt;br /&gt;&lt;br /&gt;The final website will be delivered using mainstream technologies - in this case it will probably be using SQL Server and&amp;nbsp;WCF services to deliver data in JSON format. Which is a good combination but painful to prototype - there's too much configuration involved and too much general messing about. Once the data requirements have been hammered out and the functionality solidified I'm sure it will form a good basis. But we're not there yet.&lt;br /&gt;&lt;br /&gt;I've written before about the flexibility of the UniVerse platform, and how it lends itself to rapid development especially during the prototype cycle. I can see a role for it even in dedicated Oracle and SQL Server&amp;nbsp;shops just as a prototyping tool - the fact that it is typeless, handles complex data structures and has completely dynamic metadata makes changing the data structures a breeze. So in no time at all, and assisted with a copy of mvStudio, I had the database designed and a set of Windows forms to maintain it.&lt;br /&gt;&lt;br /&gt;But what of the front end?&lt;br /&gt;&lt;br /&gt;I've possibly made a mistake in marketing mvScript as a simple solution. It is - you can create dynamic web pages in just a couple of minutes, using regular DHTML and it's UniVerse-like scripting language. It can call regular&amp;nbsp;UniVerse subroutines for data, can read and write files, execute commands, and has all the dynamic array handling and logic constructs of a standard UniVerse application. Except it delivers these up as web pages.&lt;br /&gt;&lt;br /&gt;But what I've failed to communicate, is that mvScript is not limited to DHTML. You can create anything in mvScript that can be served up through a web server - and that applies especially to web services and to JSON.&lt;br /&gt;&lt;br /&gt;Building JSON output from UniVerse code is childs play - just create some template lines and call CHANGE() to substitute real data. That's the great beauty of JSON - it really lends itself to the multivalue model in terms of its data format, and it is incredibly simple. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SUBROUTINE adManfacturers(InData, OutData, ErrText)&lt;br /&gt;$OPTIONS PICK&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ErrText = ""&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Results = ''&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Open 'MANFACTURERS' To MANUFACTURERS Else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ErrText = 'Cannot open MANUFACTURERS'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RETURN&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Template = \{ identifier: 'name',&amp;nbsp; label: 'fullname',&amp;nbsp; items: [ {DATA} ]}\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ItemTemplate=\{ name: '{ID}', type:'manufacturer', fullname:'{FULLNAME}', image:'{IMAGE}' }\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GoSub DoSelect&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RETURN&lt;br /&gt;*---------------------------------------------------------------------------&lt;br /&gt;* DoSelect&lt;br /&gt;*---------------------------------------------------------------------------&lt;br /&gt;DoSelect: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ExLine = 'SSELECT MANUFACTURERS'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Perform ExLine&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReadList List Else List = ''&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dc = Dcount(List,@FM)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For P = 1 To Dc&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GoSub Add&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Convert @FM To "," In Results&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OutData = Change(Template,'{DATA}',Results)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return&lt;br /&gt;Add:&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Id = List&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Read ManufRec From MANUFACTURERS, Id Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Line = ItemTemplate&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Line = Change(Line,'{ID}',Id)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Line = Change(Line,'{FULLNAME}', ManufRec&amp;lt;1&amp;gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Line = Change(Line,'{IMAGE}', ManufRec&amp;lt;2&amp;gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Results&amp;lt;-1&amp;gt; = Line&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And&amp;nbsp;creating mvScript pages to source data in JSON format is equally simple. How simple?&lt;br /&gt;&lt;br /&gt;&lt;!--r&gt;&amp;nbsp;&amp;nbsp; InData = ''&lt;br /&gt;&amp;nbsp;&amp;nbsp; Call adManufacturers(InData, Results, ErrText)&lt;br /&gt;&amp;nbsp;&amp;nbsp; Crt Results&amp;nbsp;&amp;nbsp; &lt;br--&gt;&lt;br /&gt;That simple!&lt;br /&gt;&lt;br /&gt;DoJo, and many other similar projects such as the popular jQuery, make handling JSON and the whole process of AJAX simple. In the case of DoJo it's just a call to a URL and instructing the library in the format of the expected output. All DoJo visual components are data aware and can be sourced from JSON formatted data, so building a tree view, for example, is accomplished by calling the mvScript page and populating a data source:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;function getManufacturers(){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;dojo.xhrPost(&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{url : "&lt;/span&gt;&lt;a href="http://localhost/ad/adTreeJSON.wsp"&gt;&lt;span style="font-size: x-small;"&gt;http://localhost/ad/adTreeJSON.wsp&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: x-small;"&gt;",&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; handleAs: "json",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; load: function(data, args){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mStore = new dojo.data.ItemFileWriteStore({data : data});&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var mGrid = dijit.byId("grdManufacturers");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mGrid.setStore(mStore);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;},&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; error: function(error, args){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert('Error reported is ' + error);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Result - a nicely populated tree view, list or table.&lt;br /&gt;&lt;br /&gt;If you want to see mvScript and DoJo in action together, take a look at the Better and Better site at the U2UG. And while you're there, feel free to post suggestions.&lt;br /&gt;&lt;br /&gt;The U2UG board have been spending the last meetings discussing the future of the U2 products with Rocket and suggestions for getting new developers involved. But that's food for another post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-7088849113859454470?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/7088849113859454470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=7088849113859454470' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/7088849113859454470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/7088849113859454470'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2011/07/mvscript-ajax-and-json.html' title='mvScript, Ajax and JSON'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-318246662154331373</id><published>2011-07-04T04:31:00.000-07:00</published><updated>2011-07-04T04:31:50.569-07:00</updated><title type='text'>Another Bad Delphi Day</title><content type='html'>Some days I just hate Delphi. Other days I love it - the speed, the power. That can even get me past the ugliness of the Pascal syntax, the horrible unit structure, the disappointing upgrades and just why the h*ll has Borland/CodeGear/Embarcadero never added split screen editing when the whole structure of the interface/implementation sections just cries out for it.&lt;br /&gt;&lt;br /&gt;Today was a bad day.&lt;br /&gt;&lt;br /&gt;mvPDF runs as a service application. This presents its own problems - it’s virtually impossible to debug, for a start. So I have three versions: the regular version (service), the lite version (service) and a test desktop version where I can see what is going on.&lt;br /&gt;&lt;br /&gt;Today, I’ve been testing out some changes to the printing functionality. mvPDF, as the name suggests, was designed to produce documents, and it does this very well. But you can also use mvPDF to generate prints directly through Windows, supporting all the features - the basic API, spooler capture, merge forms, reports, markup, PCL parser etc.&lt;br /&gt;&lt;br /&gt;The initial problem is that Delphi can only render one real print job at a time. Its printing interface is nice to use, but very limited in terms of device control. And it uses a globally defined Printer object that causes all kinds of mayhem when you have two threads trying to print to different printers at the same time. Which is of course, not good for a reporting service.&lt;br /&gt;&lt;br /&gt;So mvPDF uses a virtual printer class to generate the print jobs, then has a separate spooler thread that sends the jobs to the designated Windows printer. By this point, all the work of building the job has been done and so each print takes a few milliseconds to spool. It’s also safer - if a printer backs up too far (e.g. if your printer runs out of paper) you can safely queue a few hundred documents but after a time the Windows spooler just stops accepting prints.&lt;br /&gt;&lt;br /&gt;All soak tested fine with the test (desktop) version of mvPDF, so on to testing the service. And hit another Delphi problem. &lt;br /&gt;&lt;br /&gt;When you try to print from a service application on Windows 7, you get the nice error: &lt;br /&gt;&lt;br /&gt;&lt;em&gt;There is no default printer currently selected.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Now, there is a reason why there is no default printer - whilst users should always have a default printer, a Windows 7 service runs as Local System, which won’t. It is also completely irrelevant, since the code sets the destination printer explicitly. But Delphi still complains, and so the only solution is to have Delphi set a default printer on the way in.&lt;br /&gt;&lt;br /&gt;Except you can’t. Because to do so you need to get the device details. And to get the device details you need to access a Delphi TPrinter. And as soon as you do that it crashes with the same no default printer error. Because whenever you set the printer index, whatever you set it to, it checks the current state of the printer and that gets the current printer index and that crashes with this error. Nice one.&lt;br /&gt;&lt;br /&gt;There are get-arounds, of course. You can run mvPDF as anything other than Local System - which is fine - or I can use the Windows API to get the device information, and bypass Delphi entirely. Or fix Delphi’s printer unit so it doesn’t have this stupid check. One of which I’ll have to do. But it’s another couple of hours and another job to do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-318246662154331373?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/318246662154331373/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=318246662154331373' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/318246662154331373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/318246662154331373'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2011/07/another-bad-delphi-day.html' title='Another Bad Delphi Day'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-17849795687343511</id><published>2011-03-19T04:43:00.000-07:00</published><updated>2011-03-19T04:43:15.254-07:00</updated><title type='text'>Connecting to UniVerse over SSL</title><content type='html'>&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;As I wrote in my last post, I have been writing a custom secure terminal emulator for connecting to a client system running UniVerse. This entails using an encrypted telnet connection over SSL, a feature that is available through the UniVerse telnet service on Windows or the uvtelnetd daemon on UNIX. &lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Whether you roll your own emulator – and my reasons for my doing so are specific to this client – or use a standard emulator that supports the encrypted communication such as WinTegrate, actually setting up the server end of the connection is relatively straight forward. If you don't want to have to learn about certificates and encryption here is a step-by-step quick guide to get you up and running.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;Still Running TELNET?&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;First off, why should you be using SSL? Simply, if you are accessing your system over a regular TELNET connection, whether for administration tasks or to access text based legacy applications -&amp;nbsp; it is open to the world – or at least to anyone on your network – to listen in. Network sniffers are easy to find (man &lt;span class="SpellE"&gt;tcpdump&lt;/span&gt;) and genuinely useful for developers engaged in supporting network protocols, and so listening in on a communication between a client and server is simple enough.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;TELNET was clearly designed in the days before people were concerned about network security and did not have auditors breathing down their necks asking why plain text passwords were being sent over the wire. Anything you type over a regular TELNET connection is plainly visible – even your credentials.&amp;nbsp; And that should be a cause for concern.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;Using Telnet over SSL&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;The preferred mechanism for talking to UniVerse from a terminal style connection is to run TELNET over SSL. This &lt;span class="GramE"&gt;uses&amp;nbsp; the&lt;/span&gt; standard TELNET protocol and all the negotiations involved, so retaining compatibility with existing software, but the data passed between client and server is encrypted. Moreover, you can add endpoint verification at each end of the connection to ensure that both client and server are who they say they are.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;Enabling Telnet over SSL&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;There are a number of steps that need to be followed before you can connect to UniVerse using TELNET over SSL. These can be performed using the administration client or, if that is not available or you just don’t like it (understandably), UniVerse Basic has a set of tools for working with certificates and for accessing security contexts and so I have scragged together a simple Basic program that can do this for you:&amp;nbsp; download it from &lt;a href="http://109.104.64.69/public/files/setup_ssl.zip"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;This is provided as a self-instsalling program so to use this:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Create an installation file as a type 19 directory, preferably called inst.bp.&lt;/li&gt;&lt;li&gt;Copy the downloaded installation file into that directory, compile and run.&lt;/li&gt;&lt;li&gt;It will create two files, one named blutil.bp and the other blstd.bp.&lt;/li&gt;&lt;li&gt;The program is named BUILD_SSL and is written to the blutil.bp file.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;e.g. on sensible PICK flavour:&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&amp;gt;CREATE.FILE inst.bp 1,1 1,1,19&lt;/div&gt;&lt;div class="MsoNormal"&gt;(copy the&amp;nbsp; setup_ssl.uvexe using Windows explorer, ftp etc. into the inst.bp directory.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&amp;gt;BASIC inst.bp setup_ssl.uvexe&lt;/div&gt;&lt;div class="MsoNormal"&gt;&amp;gt;RUN inst.bp setup_ssl.uvexe&lt;/div&gt;&lt;div class="MsoNormal"&gt;&amp;gt;SETUP_SSL&lt;/div&gt;&lt;div class="MsoNormal"&gt;&amp;nbsp; &lt;/div&gt;&lt;div class="MsoNormal"&gt;The SSL layer is based on certificates used to authenticate the server and to provide the encryption keys: it can also make use of client side certificates to verify the identities of the clients. So the first steps involve creating the necessary certificates and then attaching these to the UniVerse telnet service.&lt;/div&gt;&lt;div class="MsoNormal"&gt;The steps to do this are:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Create a certificate request.&lt;/li&gt;&lt;li&gt;Create or assign a certificate.&lt;/li&gt;&lt;li&gt;Create a security context&lt;/li&gt;&lt;li&gt;Attach the security context to the service.&lt;/li&gt;&lt;li&gt;Enable the service&lt;/li&gt;&lt;/ul&gt;&lt;div class="MsoNormal"&gt;The SETUP_SSL program will walk you through the first four of these stages.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;b&gt;Step 1. Creating a Certificate Request&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;Certificates may be generated in-house or, for additional security, by a trusted third party such as VeriSign depending on the level of trust that is required. If your only requirement is to encrypt the communication so it cannot easily be snooped, an in-house self-signed certificate may well be all you need, and can be used in the first instance for testing anyway.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;Regardless of where the certificate originates, its life begins with a certificate request. This encodes details about the organization and the preferred certificate format. You can use a regular tool to create the request, but this – and the other certificate functions – is now available as a set of UniVerse functions anyway so it is just as easy to use those.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;I’m going to assume that you will be using the SETUP_SSL program, but the prompts generally follow the same form as the UniVerse admin client.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;The certificate request is encoded into a file, conventionally given a &lt;span class="SpellE"&gt;csr&lt;/span&gt; suffix. There are no standard naming conventions here so to keep everything simple I suggest using the name of the server for the root of the file name, and the following suffixes:&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;csr&lt;/td&gt;&lt;td&gt;certificaterequest&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;cer&lt;/td&gt;&lt;td&gt;certificate&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;pvt&lt;/td&gt;&lt;td&gt;private key&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;pub&lt;/td&gt;&lt;td&gt;public key&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;You also have some choices to make regarding the format of the certificate, although in some cases this will be dependent on your certificate authority or other provider.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-p0PWtsttR2k/TYSDYpllBJI/AAAAAAAAACc/4xGtAmDxFUA/s1600/uvssl1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="281" src="http://2.bp.blogspot.com/-p0PWtsttR2k/TYSDYpllBJI/AAAAAAAAACc/4xGtAmDxFUA/s400/uvssl1.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;The screen above (you can click to show full size) shows a typical certificate request, one that you can use as a template for your certificates. Note the Common Name in this case refers to the name of the server, since that is what will be identified using this certificate, and not the name of the company. The organization&amp;nbsp; unit and email are both optional.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;Once accepted this will create the three files – the request, private and public key files – in the nominated directory, here c:\ssl. Obviously if you are running on UNIX you will need to substitute equivalent UNIX paths.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;Step 2 Creating the Certificate&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;Once you have defined your request, you can either go ahead and create the certificate yourself if that is sufficient, or send it to a third party trusted authority to create the certificate on your behalf – for a fee. If you can generate the certificate yourself, this is simply a matter of determining the length of time for which it will be valid and supplying the request and private key files you created in the first step:&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-fKZRnn7CHOA/TYSELccG7QI/AAAAAAAAACk/IMdAD94QleE/s1600/uvssl2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="279" src="http://2.bp.blogspot.com/-fKZRnn7CHOA/TYSELccG7QI/AAAAAAAAACk/IMdAD94QleE/s400/uvssl2.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;Step 3 Creating the Security Context&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;So far so good – you have a certificate that can be used to identify you and the keys required to unlock it. But the certificate alone does not contain the necessary information to dictate how it will be used in the context of securing the SSL connection. That is the job of the Security Context Record, or SCR.&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;The security contexts are held in a UniVerse account and I suggest holding these in either a dedicated account or in the uv account: it does not make any difference as far as the ability to access accounts is concerned, it just has to live somewhere that UniVerse can find it. Frankly I don’t know why Rocket designed it this way and did not just make it part of the uv account like the key store.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-ZMgBWsyZOaw/TYSEpWFXnKI/AAAAAAAAACs/XgwQW5aOnY0/s1600/uvssl3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="279" src="http://3.bp.blogspot.com/-ZMgBWsyZOaw/TYSEpWFXnKI/AAAAAAAAACs/XgwQW5aOnY0/s400/uvssl3.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;span class="GramE"&gt;Each&amp;nbsp; SCR&lt;/span&gt; is held as a separate record in the &amp;amp;SECUCTX&amp;amp; file, and so needs to have a unique record key. The SCR binds together the certificate you created earlier, the private key required to access it and the authority that it will confer on a UniVerse service. Needless to say, &lt;span class="GramE"&gt;the &amp;amp;&lt;/span&gt;SECUCTX&amp;amp; file is itself encrypted.&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;There are three levels at which you can choose to apply the authentication. &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;i&gt;No Client Authentication.&lt;/i&gt; In this mode, the the server will send its certificate to the client to begin the encryption process, but it does not request a return certificate from that client. This may well still be sufficient for your needs – if your only requirement is to encrypt the data in transit, this will meet that requirement.&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;i&gt;Client Authentication in GENEROUS mode&lt;/i&gt; (see Auth Type in the figure above). The client will send its certificate to the server, which will check the validity of the certificate but does not verify the identity of the client itself. rocket suggests that this should only be used for testing and development.&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;i&gt;Client Authentication in STRICT mode&lt;/i&gt;. Here the client will send its certificate and the server must verify the identify of the client against the list of trusted names along with other details in the certificate. You will need to create a certificate for each client that will identify the client to the server using the Common Name entry: a list of these ‘trusted peers’ is maintained as part of the security context. This will of course involve a major administrative effort both in setting this up and in keeping the record up to date as new clients are added, especially where your user community runs to hundreds if not thousands of users.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;Step 4. Assigning the Security Context to a Service&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;Once the security context has been created, the last piece for the UniVerse side is to attach that to one or more of the UniVerse services. For telnet over SSL this will be the uvtelnetd service, and the same context can also be applied to help secure other connections, such as UniObjects.&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;The attachment is made through a file named &lt;i&gt;.unisecurity&lt;/i&gt;. This is a text file that is created in the unishared directory – until you run this it is not created by default so there is no point looking for it.&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;The .unisecurity file binds together the name of the service with the account holding the SCR and the name of the SCR record itself. It also contains the password to the SCR in plain text which is not the best idea but that is how it is.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-U14Um7EngOU/TYSFvZ7_JfI/AAAAAAAAAC0/KQR80nZ4lY4/s1600/uvssl4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="275" src="http://3.bp.blogspot.com/-U14Um7EngOU/TYSFvZ7_JfI/AAAAAAAAAC0/KQR80nZ4lY4/s400/uvssl4.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Step 5. Starting on Windows&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;On Windows, that is all you need to do: your TELNET access to UniVerse is provided through the UniVerse telnet service whether you are running over SSL or not, so the service is good to go. You may need to unblock port 992 on your firewall. Find an emulator that supports Telnet over SSL and connect on port 922: notice the difference in the logon banner.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Mf3heHkN2GU/TYSF81nNpDI/AAAAAAAAAC8/0JqigmJKuj4/s1600/uvssl5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="86" src="http://3.bp.blogspot.com/-Mf3heHkN2GU/TYSF81nNpDI/AAAAAAAAAC8/0JqigmJKuj4/s400/uvssl5.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;i&gt;Remember that limited period evaluation copies of WinTegrate are available for download from the Rocket website if you wish to test out the SSL connection and the other WinTegrate features.&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;Step 6. Enabling the uvtelnetd service on UNIX&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;On UNIX you have a little more pain, as you will need to specifically enable the &lt;span class="SpellE"&gt;uvtelnetd&lt;/span&gt; service.&amp;nbsp; There are two approaches: for those flavours of UNIX that use &lt;i&gt;inetd&lt;/i&gt; or &lt;i&gt;xinetd&lt;/i&gt; and for Solaris that doesn’t.&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;The first step in both cases is to define the uvtelnetd service in the /etc/services file. You will need to add or modify the entry for the telnets service on port 992 so that it is connected to the UniVerse telnet daemon and not to any pre-existing telnet service. The /etc/services file is relatively similar across all UNIX flavours and you may find a line that reads:&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;telnets&lt;/b&gt;&lt;b&gt; 992/tcp # telnet protocol over TLS/SSL&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;This should be modified, or a new line added, to specify the path to the uvtelnetd binary and any startup flags: for your first test you may wish to enable detailed logging through the –d3 flag:&lt;/div&gt;&lt;div class="MsoNormal"&gt;telnets 992/tcp no-wait/uv../bin/uvtelnetd –d3&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;On Linux and most UNIX, including older versions of Solaris, the service should be configured through the xinted or inetd configuration files respectively. &lt;/div&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;On most Linux, the xinetd.conf file is populated using individual entries in the xinetd.d directory, so you will need to create a new entry for telnets similar to the one below:&lt;/div&gt;&lt;pre&gt;&lt;br /&gt;# This is the configuration for the tcp telnets service.&lt;br /&gt;&lt;br /&gt;service telnets&lt;br /&gt;{&lt;br /&gt;        disable = no&lt;br /&gt;        socket_type     = stream&lt;br /&gt;        wait            = no&lt;br /&gt;        user            = root&lt;br /&gt;        server          = /usr/uv/bin/uvtelnetd&lt;br /&gt;        server_args     = -d3&lt;br /&gt;        log_on_failure  += USERID&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;On Solaris 10 the inetd configuration has been replaced with the service control management. This uses an XML based definition of each service (a “manifest”) that is imported into a services repository using the service configuration commands. The intent is to provide a single model for controlling all of the different types of service available.&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;The best starting point is therefore to take the existing telnet service definition as a template and modify it to build the telnets definition. You should find this in the &lt;i&gt;/var/svc/manifest/network&lt;/i&gt; directory. Copy this to create the telnets.xml file and modify it as below:&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;pre&gt;service_bundle type='manifest' name='SUNWtnetr:telnets'&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;service &lt;br /&gt;        name='network/telnets' &lt;br /&gt;        type='service' &lt;br /&gt;        version='1'&amp;gt; &lt;br /&gt;&lt;br /&gt;        &amp;lt;create_default_instance enabled='false' /&amp;gt; &lt;br /&gt;&lt;br /&gt;        &amp;lt;restarter&amp;gt; &lt;br /&gt;                &amp;lt;service_fmri value='svc:/network/inetd:default' /&amp;gt; &lt;br /&gt;        &amp;lt;/restarter&amp;gt; &lt;br /&gt;&lt;br /&gt;        &amp;lt;exec_method &lt;br /&gt;                type='method' &lt;br /&gt;                name='inetd_start' &lt;br /&gt;                exec='/opt/universe/bin/uvtelnetd -d3' &lt;br /&gt;                timeout_seconds='0'&amp;gt; &lt;br /&gt;                &amp;lt;method_context&amp;gt; &lt;br /&gt;                lt;method_credential user='root' group='root' /&amp;gt; &lt;br /&gt;                &amp;lt;/method_context&amp;gt; &lt;br /&gt;        &amp;lt;/exec_method&amp;gt; &lt;br /&gt;&lt;br /&gt;        &amp;lt;exec_method &lt;br /&gt;                type='method' &lt;br /&gt;                name='inetd_disable' &lt;br /&gt;                exec=':kill' &lt;br /&gt;                timeout_seconds='0'&amp;gt; &lt;br /&gt;        &amp;lt;/exec_method&amp;gt; &lt;br /&gt;&lt;br /&gt;        &amp;lt;property_group name='inetd' type='framework'&amp;gt; &lt;br /&gt;                &amp;lt;stability value='Evolving' /&amp;gt; &lt;br /&gt;                &amp;lt;propval name='name' type='astring' value='telnets' /&amp;gt; &lt;br /&gt;                &amp;lt;propval name='endpoint_type' type='astring' value='stream' /&amp;gt; &lt;br /&gt;                &amp;lt;propval name='proto' type='astring' value='tcp6' /&amp;gt; &lt;br /&gt;                &amp;lt;propval name='wait' type='boolean' value='false' /&amp;gt; &lt;br /&gt;                &amp;lt;propval name='isrpc' type='boolean' value='false' /&amp;gt; &lt;br /&gt;        &amp;lt;/property_group&amp;gt; &lt;br /&gt;&lt;br /&gt;        &amp;lt;stability value='Unstable' /&amp;gt; &lt;br /&gt;&lt;br /&gt;        &amp;lt;template&amp;gt; &lt;br /&gt;                &amp;lt;common_name&amp;gt; &lt;br /&gt;                        &amp;lt;loctext xml:lang='C'&amp;gt; Telnets server &amp;lt;/loctext&amp;gt; &lt;br /&gt;                &amp;lt;/common_name&amp;gt; &lt;br /&gt;                &amp;lt;description&amp;gt; &lt;br /&gt;                        &amp;lt;loctext xml:lang='C'&amp;gt; &lt;br /&gt;                          UniVerse Telnet over SSL. &lt;br /&gt;                        &amp;lt;/loctext&amp;gt; &lt;br /&gt;                &amp;lt;/description&amp;gt; &lt;br /&gt;                &amp;lt;documentation&amp;gt;                        &lt;br /&gt;                &amp;lt;/documentation&amp;gt; &lt;br /&gt;        &amp;lt;/template&amp;gt; &lt;br /&gt;&amp;lt;/service&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;/service_bundle&amp;gt; &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;To install this as a service you will need to call upon the service controller /usr/sbin/svccfg to validate and import the manifest into the services repository. Note that in common with most UNIX commands, this performs its operations silently unless an error is encountered.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;# /usr/sbin/svccfg &lt;br /&gt;svc:&amp;gt; validate telnets.xml &lt;br /&gt;svc:&amp;gt; import telnets.xml&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;Finally you will need to enable the service before it can be launched:&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;pre&gt;# /usr/sbin/svcadm enable telnets&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;You can test this by listing the currently installed services using the svcs command:&lt;/div&gt;&lt;pre&gt;# svcs | grep teln &lt;br /&gt;online         Dec_30   svc:/network/telnet/tcp6:default &lt;br /&gt;online         13:46:51 svc:/network/telnets:default&lt;br /&gt;&lt;/pre&gt;&lt;div class="MsoNormal"&gt;You should now be able to connect to the uvtelnetd service by using a terminal emulator that supports telnet over SSL and connecting on port 992. Note that the first time you connect to the service there may be a delay of up to a minute: this Is not the case for subsequent connections.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-17849795687343511?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/17849795687343511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=17849795687343511' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/17849795687343511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/17849795687343511'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2011/03/connecting-to-universe-over-ssl.html' title='Connecting to UniVerse over SSL'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-p0PWtsttR2k/TYSDYpllBJI/AAAAAAAAACc/4xGtAmDxFUA/s72-c/uvssl1.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-2486322044896130197</id><published>2011-03-11T01:12:00.000-08:00</published><updated>2011-03-11T01:12:27.484-08:00</updated><title type='text'>Catching Up</title><content type='html'>Has it really been this long since I posted? &lt;br /&gt;&lt;br /&gt;Must do better: but the past few weeks have been insanely busy juggling a lot of small projects (including converting ENTER to handle SIMPLE definitions, and for a real PRIME client&amp;nbsp;- would you believe it?)&amp;nbsp; and one dragging on - adapting mvPDF to directly output PCL for faster printing. &lt;br /&gt;&lt;br /&gt;The regular Windows PCL drivers are notoriously slow (just Google for PCL and slow)&amp;nbsp;and bloat-producing, so this has meant changing the report&amp;nbsp;generation in particular to directly generate PCL macros and to use better compression&amp;nbsp;for the content. You did know mvPDF did reporting, and not just raw PDFs, didn't you?&lt;br /&gt;&lt;br /&gt;It has been a nightmare. I will &lt;strong&gt;never&lt;/strong&gt; code PCL again.&lt;br /&gt;&lt;br /&gt;But amongst these tribulations one particular client project has been especially interesting in its own painful way, and containing a number of features deserving&amp;nbsp;of comment. &lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;SWINE (Secure Windows Emulator)&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;There seems to come a time in every serious MultiValue developers' life when he or she has to write a terminal emulator: it just goes with the territory. Back in the mists of time one of my colleagues created WinTerm so I had some idea how difficult this seemingly simple technology can be.&lt;br /&gt;&lt;br /&gt;The new&amp;nbsp;terminal emulator in question is a highly customized emulator written for a specific client.&lt;br /&gt;&lt;br /&gt;Amongst its features are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Encrypted communication with UniVerse using Telnet over SSL. On Solaris.&lt;/li&gt;&lt;li&gt;Programmable look and feel.&lt;/li&gt;&lt;li&gt;Scripting language to control such aspects as exporting, capture and opening URLs.&lt;/li&gt;&lt;li&gt;Security and other constraints that I'm not going to share.&lt;/li&gt;&lt;/ul&gt;Aside from that, it's written in C# which gives its own peculiar restrictions, especially when it comes to performance and graphics. And it would be nice if it could automatically correct my typing but that's a bit beyond..&lt;br /&gt;&lt;br /&gt;It does give me an opportunity to blog about:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;SSL and UniVerse, and how to set this up on UNIX-like systems.&lt;/li&gt;&lt;li&gt;Scripting using the Irony compiler toolkit.&lt;/li&gt;&lt;li&gt;Getting almost sensible performance out of .Net (hint, avoid GDI+).&lt;/li&gt;&lt;/ul&gt;So watch this space over the coming days.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;U2 UniVersity&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The U2 UniVersity visits the UK this month, so if you are involved in U2 and you have not signed up - shame on you! This is the main event and I look forward to meeting y'all there.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;U2 User Group&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;After a long wait we are finally ready for the new board elections, and I can step down once again as President. The presidential roles are managed on a three year rolling cycle - the Vice President is elected, becomes President after the first year and Past President the year after. It gives a good blend of continuity and change.&lt;br /&gt;&lt;br /&gt;The election is also a good time to announce the launch of one of our pet projects - an incubator for new (and old) U2 developers. This is an open source collection of applications all featuring the same underlying database and giving examples of how to use the U2 technologies around it - similar to the sample applications provided by Microsoft for SQL Server.&lt;br /&gt;&lt;br /&gt;I've started the ball rolling with a simple C# and UniObjects.NET implementation, and my colleagues will be adding various other pieces - reporting using DataVu, terminal based versions, and so forth. Over time we want the community to embrace and extend this so it becomes a useful resource for everyone.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-2486322044896130197?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/2486322044896130197/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=2486322044896130197' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/2486322044896130197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/2486322044896130197'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2011/03/catching-up.html' title='Catching Up'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-5514894817119872721</id><published>2010-12-23T05:04:00.000-08:00</published><updated>2010-12-23T05:04:15.752-08:00</updated><title type='text'>Away from the City</title><content type='html'>Like most of us in the UK I've been trapped by snow - that unexpected event that occurs with&amp;nbsp;reassuring predictability every couple of years - and the indignities of a 6 1/2 hour train journey home after work with equally predictable cancellations, engineering works and miserable vacuity&amp;nbsp;of those nominally in charge of our third world rail infrastructure. &lt;br /&gt;&lt;br /&gt;But then, that's what I get for working in Canary Wharf (London) and living in deepest rural Oxfordshire. I invested this year in&amp;nbsp;building an office in the garden, thanks to Green Retreats, so I can VPN in whilst working away from the house - much to my wife's relief.&amp;nbsp;Perfect timing.&lt;br /&gt;&lt;br /&gt;So I took the dog out for a walk to admire the snow and remember just why I live here.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_pZlbX6rhC4s/TRNF3XBygZI/AAAAAAAAACM/YOT3hRhHDwo/s1600/IMG_0511a.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" n4="true" src="http://1.bp.blogspot.com/_pZlbX6rhC4s/TRNF3XBygZI/AAAAAAAAACM/YOT3hRhHDwo/s320/IMG_0511a.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_pZlbX6rhC4s/TRNF7aWdNEI/AAAAAAAAACQ/fI-vZZX4b4w/s1600/IMG_0513a.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="204" n4="true" src="http://1.bp.blogspot.com/_pZlbX6rhC4s/TRNF7aWdNEI/AAAAAAAAACQ/fI-vZZX4b4w/s320/IMG_0513a.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Seasons' Greetings to All.&lt;br /&gt;&lt;br /&gt;Brian&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-5514894817119872721?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/5514894817119872721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=5514894817119872721' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/5514894817119872721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/5514894817119872721'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2010/12/away-from-city.html' title='Away from the City'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_pZlbX6rhC4s/TRNF3XBygZI/AAAAAAAAACM/YOT3hRhHDwo/s72-c/IMG_0511a.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-2096321499210550169</id><published>2010-12-04T07:44:00.000-08:00</published><updated>2010-12-04T07:44:35.221-08:00</updated><title type='text'>UniObjects, VBScript and Windows 7 (64)</title><content type='html'>As some of you will know from previous articles, I'm a big fan of VBScript. Yes, I started my grown-up programming life with UNIX and have spent a good number of hours using - and teaching - various forms of shell programming as a result. But VBScript is one of the true hidden gems of Windows, a full and well designed scripting language that sits on every desktop and has just the right mixture of control and invisibility. The VB-like syntax gives you the control when you need it and by offering almost no features of its own, it lets you control your scripting environment, applications, operating system and devices by calling on other, more powerful language elements to do the dirty work by acting as a COM client.&lt;br /&gt;&lt;br /&gt;One particularly useful application of this, is that VBScript allows you to create easily-maintained scripts to automate a whole batch of UniVerse (or UniData) operations by leveraging UniObjects. Since UniObjects is a simple class wrapper around an excellent protocol for accessing the U2 databases, it plays very nicely with VBScript as a means of executing commands, calling subroutines and all the other paraphernalia that goes along with automating otherwise tedious and long running tasks.&lt;br /&gt;&lt;br /&gt;Like cutting releases. Since almost all my products have some degree of client/server operation this naturally&amp;nbsp;means having to build setups that span client and server code, and so I keep a nice library of cutting scripts, one for each product. &lt;br /&gt;&lt;br /&gt;These will typically perform a&amp;nbsp;series of actions such as:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;requesting a product version number.&lt;/li&gt;&lt;li&gt;logging in the server.&lt;/li&gt;&lt;li&gt;updating the source code version stamps.&lt;/li&gt;&lt;li&gt;recompiling all source code for all platforms.&lt;/li&gt;&lt;li&gt;building the server side setups.&lt;/li&gt;&lt;li&gt;recompiling all client side code.&lt;/li&gt;&lt;li&gt;updating the version stamp on the setup (normally InstallShield).&lt;/li&gt;&lt;li&gt;building the setup.&lt;/li&gt;&lt;li&gt;copying and renaming the setup files into a shipping directory.&lt;/li&gt;&lt;li&gt;zipping up the setup.&lt;/li&gt;&lt;li&gt;updating various log files.&lt;/li&gt;&lt;/ul&gt;So being able to use VBScript to automate these actions is very, very important to me.&lt;br /&gt;And suddently not being able to call UniObjects from VBScript - typically at a point of urgent need - was .. well.. a problem.&lt;br /&gt;&lt;br /&gt;Unfortunately, my nice new sleek laptop running 64 bit windows 7 wouldn't start UniObjects. No errors or breakages in the script, just a refusal to create the UniObjects instance - or any other third party COM&amp;nbsp;component I wanted to access.&lt;br /&gt;&lt;br /&gt;The reason was, of course, obvious.&lt;br /&gt;&lt;br /&gt;UniObjects is a 32 bit COM component and I'm now using a 64 bit version of the Windows Scripting Host (WScript or CScript). Thankfully, Microsoft has provided two versions of the scripting host, with a 32 bit version sitting in the %windir%\SysWOW64 directory. This starts up UniObjects nicely and I can get back to running my cutting scripts, backups and all the other automation scripts. So if you are having problems with your COM scripts, that is the place to turn.&lt;br /&gt;&lt;br /&gt;But an error message might have been nice.&lt;br /&gt;&lt;br /&gt;As would retaining the ScriptPW class that allows you to prompt for a password. Gone in Windows 7.&lt;br /&gt;&lt;br /&gt;Incidentally VBScript is also great for automated testing. I've been developing a new version of mvQuery for Sandri Technologies, who earlier this&amp;nbsp;year&amp;nbsp;bought the product outright. This involves replacing all the old VB and C++ code with shiny new .NET code, upgrading the Delphi code to the latest version&amp;nbsp;- which is not backwardly compatible, thanks to its new owners&amp;nbsp;- and redesigning the look and feel to fit a more up to date presentation. &lt;br /&gt;&lt;br /&gt;But one feature definitely retained is the COM interface, which may seem anacrhonistic in this age of managed code.&amp;nbsp;But the COM interface was added so we could perform automated regression testing: it&amp;nbsp;has the ability to call into the client and perform&amp;nbsp;a suite of activities&amp;nbsp;from running queries to setting filters, running reports and exports and all the result set operations - and because this is a two way interface&amp;nbsp;controlled through a scripting language,&amp;nbsp;not only can it call these actions but it can spot check the results against what is expected.&lt;br /&gt;&lt;br /&gt;One more advantage of VBScript for COM automation. Whenever I create a new COM controller in Delphi, this upsets my antivirus which wipes it immediately before I can get to run it. Which is damn inconvenient. But no such problems with VBScript... so far.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-2096321499210550169?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/2096321499210550169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=2096321499210550169' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/2096321499210550169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/2096321499210550169'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2010/12/uniobjects-vbscript-and-windows-7-64.html' title='UniObjects, VBScript and Windows 7 (64)'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-3642692920504684958</id><published>2010-10-25T13:28:00.000-07:00</published><updated>2010-10-25T13:28:51.821-07:00</updated><title type='text'>UniVerse Release 11</title><content type='html'>Two important new announcements from Rocket this week.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The first is the imminent release of UniVerse 11. This is the first full release to bear the Rocket brand and the first full release of UniVerse in some time, so in many ways this sets the tone for future expectations - and I have to say, this sounds very positive. It is clear that Rocket is listening to its users and that the promised development freedom is beginning to bear fruit.&lt;br /&gt;&lt;br /&gt;The U2 team have clearly not been resting on their laurels. There are some welcome new additions and extensions to the products, and the good news is that this takes in both the front end features and also some core functionality that has been missing or simply become outdated.&lt;br /&gt;&lt;br /&gt;At the core level, we see changes to the MQ interface to support the current API in place of the deprecated AMI interface. This is a change that won’t affect many sites but for those who rely on message queues it is a welcome relief and sends a strong signal in terms of support. I’ll be writing in Spectrum about this new interface. Added to this are extensions to make the UCI layer fully ODBC 3 compatible – another welcome piece of backfill.&lt;br /&gt;&lt;br /&gt;Then there are some pieces that will truly strengthen the product. Replication has had an overhaul – this has often been seen as a less than optimal part of the product: following the changes Rocket can now announce high availability with fast switchover and read-only copies for reporting and data warehousing down to the account level.&lt;br /&gt;&lt;br /&gt;Data encryption has been extended with keys and indices now getting the encryption treatment and additional protection for master keys available – sites can now require more than one password to unlock the master key, preventing a single disgruntled employee from wrecking the master.&lt;br /&gt;&lt;br /&gt;Sign-on now supports both PAM and LDAP for authentication.&lt;br /&gt;&lt;br /&gt;Then we come to the big ticket items. Rocket is continuing the theme of embracing Eclipse for administration and development seen in BDT and WebDE, and now added a new administration interface to the mix (XAdmin) – of which I will post more later.&lt;br /&gt;&lt;br /&gt;And we also see the release of EDA. For those not familiar with this latest term, this adds External Data Access to UniVerse, allowing seamless access to external sources such as SQL Server and Oracle under the guise of UniVerse tables. UniVerse is not the first to add this facility – it has been part of jBASE and mvON for many years. Again, this deserves a post in its own right.&lt;br /&gt;&lt;br /&gt;As if getting the new Universe release out was not enough, members of the U2 User Group will already have received a newsflash regarding another tool to come out of Rocket in the same timeframe – DataVu. This is the first evidence of the collaboration between the U2 team and the other technologies that sit under the Rocket banner – in the case, an adaptation of CorVu, a BI tool for key indicators. David Jordon has been looking into this – see the post on the U2UG website for more details.&lt;br /&gt;&lt;br /&gt;Good news all round, and thumbs up to the Rocket crew.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-3642692920504684958?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/3642692920504684958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=3642692920504684958' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/3642692920504684958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/3642692920504684958'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2010/10/universe-release-11.html' title='UniVerse Release 11'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-7323451019346652297</id><published>2010-07-31T10:53:00.000-07:00</published><updated>2010-07-31T10:53:52.258-07:00</updated><title type='text'>mvScan going open</title><content type='html'>mvScan was originally a tool that I had developed for my use, to document a UniVerse system by iterating through the account and file structures, building impact maps and filling out tables with information culled from the entries found to make it easier for someone to search through their system.&lt;br /&gt;&lt;br /&gt;Information such as the relationships between files, programs, subroutines, external functions, SUBR() dictionary calls, translates, includes, common blocks, use of variables, string tables, calling menus and paragraphs. All captured, linked together and available for enquiry or to build documentation, assisted in my case with my autodoc headers and version stamps.&lt;br /&gt;&lt;br /&gt;However, and I stress this, it was a tool for my own use.&lt;br /&gt;&lt;br /&gt;After various questions in various forums - especially the u2-user list - from people wanting something along these lines to document their systems, I decided to package it up and add it to my product list. But with every system being so different, however adaptable it is (and it &lt;strong&gt;&lt;em&gt;is&lt;/em&gt;&lt;/strong&gt; designed to be highly adaptable) I'm always worried whether it has had enough of a real world thrashing for me to feel confident offering it as a packaged product.&lt;br /&gt;&lt;br /&gt;So I've decided the best way forward is for me to open it up. That way, people who want to&amp;nbsp;run it&amp;nbsp;on their systems can do so and feed back any updates and changes that result from applying it to their specific structure and code organization.&lt;br /&gt;&lt;br /&gt;So watch this space for announcements. If this goes well, there's plenty of other stuff I want to open source.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-7323451019346652297?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/7323451019346652297/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=7323451019346652297' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/7323451019346652297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/7323451019346652297'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2010/07/mvscan-going-open.html' title='mvScan going open'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-2744833800968814424</id><published>2010-07-30T05:47:00.000-07:00</published><updated>2010-07-30T05:47:36.918-07:00</updated><title type='text'>Message Queues</title><content type='html'>Good news for those deploying UniVerse as part of a distributed infrastructure.&lt;br /&gt;&lt;br /&gt;Rocket has announced that the upcoming Release 11 of UniVerse - the first and eagerly awaited major release of UniVerse since the move to Rocket - will include an upgrade to the current support for IBM WebSphere message queues (MQ).&lt;br /&gt;&lt;br /&gt;UniVerse has long offered support for MQ through a serviceable Basic interface built upon AMI. However, this route for accessing MQ was superceded some years back and is now deprecated: the patches required to use AMI are not available for all operating systems and it is becoming increasingly difficult to track these down. So the investment in providing a link to MQ that supports more current protocols is very welcome, both technically and as a signal of intent.&lt;br /&gt;&lt;br /&gt;From what I have been told, the old functions will continue to operate as they do currently so that sites can continue to run their existing MQ routines without the need to do any immediate development. The new functionality will be provided through a new set of MQI functions. This means that sites wanting to make use of the new features will need to do some development work, but it is probably the safer option.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-2744833800968814424?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/2744833800968814424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=2744833800968814424' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/2744833800968814424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/2744833800968814424'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2010/07/message-queues.html' title='Message Queues'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-7317535976592423973</id><published>2010-06-24T07:54:00.000-07:00</published><updated>2010-06-24T07:54:28.595-07:00</updated><title type='text'>Tell me Less</title><content type='html'>Deep joy: I need to evaluate some new&amp;nbsp;software. Like most developers it something I do on a regular basis -a triumph of hope over expectation that inevitably leaves my various PCs cluttered with garbage, and worse. &lt;br /&gt;&lt;br /&gt;Talking of which..&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Dear Software Provider&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;I'm about to evaluate your software.&lt;br /&gt;&lt;br /&gt;If it is any good, I'll buy it. &lt;em&gt;If not, I don't want to hear from you&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;I do &lt;strong&gt;not&lt;/strong&gt; want to fill in five pages of 'Required Fields' telling you about my business, size of business, number of employees, market sector, and especially not my phone number. &lt;em&gt;If I have a problem, I'll call you&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;You are &lt;strong&gt;not &lt;/strong&gt;doing me a favor by letting me download this.&lt;br /&gt;I'm giving up my valuable time to see if your miserable product is worth my hard earned cash.&lt;br /&gt;&lt;br /&gt;So guess what - I'm &lt;strong&gt;not&lt;/strong&gt; going to waste more of it&amp;nbsp;filling out stupid questionaires. You don't need to know what databases I use, what languages I prefer and what my shoe size is.&amp;nbsp;And that&amp;nbsp;drop-down list of 'relationships' to say whether I'm an end user, VAR or supplier -&amp;nbsp;I'm none of those yet. &lt;em&gt;Just let me see the damn software&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Ask me what you need to know: an email address to send a registration. &lt;em&gt;Nothing more&lt;/em&gt;. Because I'm not giving you any other marketing-related crap that your employees can leave on a bus.&lt;br /&gt;&lt;br /&gt;And no,&amp;nbsp;I do &lt;strong&gt;not&lt;/strong&gt; want to speak with an advisor. If&amp;nbsp;I need&amp;nbsp;an advisor to test your software, you need to think about redesigning your website. Or your software. Or both.&lt;br /&gt;&lt;br /&gt;Got it? No? &lt;br /&gt;&lt;br /&gt;Then you're off the list. I'm off to your competitor who will ask me my email and nothing more.&lt;br /&gt;&lt;br /&gt;Some of us have better things to do with our time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-7317535976592423973?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/7317535976592423973/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=7317535976592423973' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/7317535976592423973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/7317535976592423973'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2010/06/tell-me-less.html' title='Tell me Less'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-2237629691693231200</id><published>2010-03-21T03:20:00.000-07:00</published><updated>2010-03-21T03:20:52.697-07:00</updated><title type='text'>UniVerse Free Edition</title><content type='html'>Exciting news for UniVerse and UniData developers: we are told that Rocket are preparing now to release free versions of these databases. This will share the same technical limitations as the current personal edition, but significantly will no longer be restricted to non-commercial use and will relax the restrictions on distribution.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This is a huge and very welcome (and very timely) step forward. &lt;br /&gt;&lt;br /&gt;There has never been a way for new developers to release a free or very low cost, entry-level product using this technology because of the cost of the database licence. It has been all but impossible to release free demonstration copies of commercial products, because of the licence restrictions that prevented distribution of the personal edition,&amp;nbsp;without signing up as a business partner.&lt;br /&gt;&lt;br /&gt;Why does that matter? Because we need new blood in this industry, and&amp;nbsp;new developers are not going to&amp;nbsp;run with a technology that&amp;nbsp;put barriers in the way of getting&amp;nbsp;their products in front of potential clients: not when there are other, free and easily distributable alternatives. New developers don't want to sign up to partnership agreements, or to have to direct clients to&amp;nbsp;external websites to download underlying technology: they want to get their new products in front of clients in the easiest way possible. But simply getting in&amp;nbsp;at the bottom rung - so bread and butter to the rest of the industry - has simply not been a practicable option in this market. Perhaps this is down to the history of a product that began its life as an emulator, running software applications that had already been developed elsewhere. But it&amp;nbsp;has long been&amp;nbsp;a clear barrier to new start-up&amp;nbsp;developers entering the U2 marketplace.&lt;br /&gt;&lt;br /&gt;Compare this with the most obvious rival, SQL Server. There the pattern has always been, to release entry-level products using the JET database engine (the one shared with Access) or more recently with SQL Server Express, in the knowledge that over time at least some of those clients will grow and upscale their investment: at which point they have a natural and largely automated upgrade path to the full SQL Server. Unfortunately, the MultiValue world has been largely blind to this model throughout its history.&lt;br /&gt;&lt;br /&gt;Which is one of the two reasons why I am so excited about this move.&lt;br /&gt;&lt;br /&gt;The other, is that from the very start, one of the key objectives of the U2 User Group has been to disseminate knowledge about the model. But we have been constantly held back by the fact that we could not distribute the software alongside learning materials. &lt;br /&gt;&lt;br /&gt;We could not, for example, produce a CD holding a learner pack that had pre-installed the demonstration database and samples, to give away at venues: downloading the database and installing software is fine for existing MultiValue users of various flavours, but we want to get the U2 model in front of people who are not familiar with the concepts and to make it as easy as possible for them to explore and to experience it. &lt;br /&gt;&lt;br /&gt;Now Rocket are working on a way to allow us to do exactly that. &lt;br /&gt;&amp;nbsp; &lt;br /&gt;So watch this space for progress reports.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-2237629691693231200?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/2237629691693231200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=2237629691693231200' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/2237629691693231200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/2237629691693231200'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2010/03/universe-free-edition.html' title='UniVerse Free Edition'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-8366135780643941492</id><published>2010-03-06T03:44:00.001-08:00</published><updated>2010-03-06T03:44:53.062-08:00</updated><title type='text'>BCI.IMPORT posted on website</title><content type='html'>In my last blog I wrote about using UniVerse as a prototyping tool for rapidly modelling complexity. Creating a prototype application may require a different approach to regular development, with the onus being on dividing a process into stages to ensure that each one can be individually verified. Therefore when modelling financial calculations in particular, I take the approach of generating each step as a workfile, which is less efficient but allows the data from each stage to be assessed and proven.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To assist me in doing this I have been leveraging a set of dictionary-driven tools, along with the much-neglected REFORMAT (often a better choice than INSERT and UPDATE) to handle each stage.&lt;br /&gt;&lt;br /&gt;As promised, the first of these is now available on the website, in the hope that it may prove useful to other developers.&lt;br /&gt;&lt;br /&gt;BCI.IMPORT, as the name suggests, is an import routine using BCI, the Basic Calling Interface built into UniVerse and enabling access to remote data sources using ODBC. Whilst ODBC has its limitations, the BCI implementation is sufficiently near to the metal that it can be a very fast choice when directed to natively relational databases such as SQL Server. It requires ODBC drivers, which are an additional expense if running on UNIX platforms.&lt;br /&gt;&lt;br /&gt;BCI.IMPORT runs either a SQL statement or stored procedure and assigns the results to one or more UniVerse files deriving the keys and fields to be updated from the dictionary. It supports a range of update operations for multivalued data in particular, and provides simple structural validation. More importantly, it enables you to specify expressions using the incoming data following the UniVerse I-Descriptor format, giving full reign to massage and to enrich the incoming data before assigning it.&lt;br /&gt;&lt;br /&gt;BCI.IMPORT is free, and can be downloaded from the Freebies section of the website. As always, comments and suggestions welcome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-8366135780643941492?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/8366135780643941492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=8366135780643941492' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/8366135780643941492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/8366135780643941492'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2010/03/bciimport-posted-on-website.html' title='BCI.IMPORT posted on website'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-7878251061161989766</id><published>2010-02-27T02:12:00.000-08:00</published><updated>2010-02-27T02:12:06.054-08:00</updated><title type='text'>Prototyping with UniVerse</title><content type='html'>Whenever I write about UniVerse - or MultiValue in general - I always refer to it as a business engine, which encapsulates the difference between this and the mainstream relational database model in practice. I have blogged before about the advantages of keeping the data definitions and business logic in the same space when it comes to speed of development and consistency of access.&lt;br /&gt;&lt;br /&gt;All the same, in my day job I'm frequently working with SQL Server (it's practically impossible to make a living as an independent MultiValue consultant in the UK). So it's good when the opportunity arises to use both technologies together and to bring their respective strengths to the fore.&lt;br /&gt;&lt;br /&gt;If the relational model is predicated on structure and rigourous design, the MultiValue model is founded on agility and the&amp;nbsp;ease of managing complex data.&amp;nbsp;And so in situations where change is the top of the agenda, and given the facility with which it can read and write SQL Server data, UniVerse can become a powerful tool&amp;nbsp;for solving problems in SQL Server.&lt;br /&gt;&lt;br /&gt;Two projects over the last few months have allowed me to do just that.&lt;br /&gt;&lt;br /&gt;The first was&amp;nbsp;a data cleansing exercise, pulling data that had orginated in different applications from different vendors and patching up differences and errors. Here the key piece is the granularity offered by the low level UniVerse read and write operations, especially when hunting down data that might be in one of several different places. True, it can be done in SQL Server by using temporary tables and lots of updates through potential joins, but UniVerse does it more neatly and with lower overheads.&lt;br /&gt;&lt;br /&gt;The second has been more interesting. I've been asked to develop a new risk calculation engine that will eventually be written in C# for SQL Server. But before getting to that point, the calculations themselves must be modelled; different methods assessed; data checked for consistency; missing data provided; results scrutinized and business processes adapted. All of which argued for prototyping the financial calculations first.&lt;br /&gt;&lt;br /&gt;Here, once again, is a job for UniVerse. The fact that UniVerse is metadata driven makes it very adaptable - just what you need in a prototype, especially when that prototype involves modelling different alternate operations to see which one fits the business needs best. You can change a file structure in seconds by adding or amending dictionaries, and calculations can be embedded into virtual field descriptors: more lightweight and powerful than using SQL views&amp;nbsp;or stored procedures.&amp;nbsp;Again, where data is difficult to come by, or needs to be split or merged in more complex ways, it may be synthesized or extracted using UniVerse Basic. So, despite the fact that the final delivery will be pure SQL Server, to model and remodel the prototype has been pure UniVerse.&lt;br /&gt;&lt;br /&gt;One thing that has helped, is that over time I have put together a good series of dictionary-driven commands that allow me to script file and dictionary creation, importing from remote data source using BCI, exporting in various formats, pivoting and amending data. These are slower than the equivalent Basic routines, of course, but are more quickly adapted and easier to document as the prototype develops.&lt;br /&gt;&lt;br /&gt;Over the coming months I will be adding these to the website, so watch the blog for details and instructions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-7878251061161989766?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/7878251061161989766/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=7878251061161989766' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/7878251061161989766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/7878251061161989766'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2010/02/prototyping-with-universe.html' title='Prototyping with UniVerse'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-5110305660100927313</id><published>2009-12-29T07:47:00.000-08:00</published><updated>2009-12-29T07:47:12.277-08:00</updated><title type='text'>New Book Release</title><content type='html'>Well it's taken far, far longer than planned (courtesy of having been placed on the back shelf whilst I've been busy wth my day job working on financial trading system) but at last book 3 of my Self Paced Training Series in UniVerse (and UniData) has been sent to the publisher, sent back,&amp;nbsp;re-edited, turned around, sent again and&amp;nbsp;is now finally available for purchase!&lt;br /&gt;&lt;br /&gt;The third volume treats the subject of client/server development for UniVerse, focussing on development using the Microsoft&amp;nbsp;.NET platform with UniObjects for native transactional systems an using ODBC and OleDb with ADO.NET for mainstream access. &lt;br /&gt;&lt;br /&gt;The sticking point for this, and the reason for the long gestation, has been the IBM ADO.NET provider. This was shaping into a nice new middleware for UniVerse with nascent support for Entity Framework when the sale to Rocket was announced. I had held off writing the final sections until the initial Entity Framework bugs had been ironed out, then waited a bit longer until there was news on what would happen to this provider after the sale, to finally drop the chapter when it became apparent that this would no longer be a core part of the U2 product line. &lt;br /&gt;&lt;br /&gt;So now, readers can enjoy the new title:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.brianleach.co.uk/pages/books.htm"&gt;IBM UniVerse Client Developer - Self Paced Training&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- at least, until I get the name changed to Rocket throughout - when the first Rocket version of UniVerse (11) is released.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-5110305660100927313?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/5110305660100927313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=5110305660100927313' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/5110305660100927313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/5110305660100927313'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2009/12/new-book-release.html' title='New Book Release'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-8666362651481495198</id><published>2009-12-03T04:18:00.000-08:00</published><updated>2009-12-03T04:21:46.747-08:00</updated><title type='text'>Silverlight 4 CAS restrictions (loadFromResourcesSwitch)</title><content type='html'>A whole morning wasted on this one..&lt;br /&gt;&lt;br /&gt;I've been upgrading a bunch of silverlight stuff to version 4, which should be straight forward, except that I had included some third party controls in the projects.&lt;br /&gt;&lt;br /&gt;Now whenever I try to build the project, VS2010 came back with the less than helpful error:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;The "ValidateXaml" task failed unexpectedly...&lt;/em&gt;&lt;br /&gt;&lt;em&gt;System.IO.FileLoadException: Could not load file or An attempt was made to load an assembly from a network location which would have caused the assembly to be sandboxed in previous versions of the .NET Framework. This release of the .NET Framework does not enable CAS policy by default, so this load may be dangerous. If this load is not intended to sandbox the assembly, please enable the loadFromRemoteSources switch. See http://go2.microsoft.com/fwlink/?LinkId=131738 for more information.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Problem? Well apart from something new to have to fix, the files&amp;nbsp;concerned are not&amp;nbsp;being loaded from a remote source: they are all referenced libraries on my local machine, with Copy Local settings.&lt;br /&gt;&lt;br /&gt;Which led to three questions:&lt;br /&gt;&lt;br /&gt;a) where exactly does this mythical switch go?&lt;br /&gt;b) why does Microsoft think this is a remote file?&lt;br /&gt;c) why is Microsoft once again insistent on breaking everything by treating everyone as idiots?&lt;br /&gt;&lt;br /&gt;According to the knowledge base, the way to fix is to add a switch to the config file for the project. &lt;br /&gt;&lt;br /&gt;&amp;lt;runtime &amp;gt;&lt;br /&gt;&amp;lt;loadfromresourcesswitch enabled="true" &amp;gt;&lt;br /&gt;&amp;lt;/runtime &amp;gt;&lt;br /&gt;&lt;br /&gt;Small&amp;nbsp;problem here&amp;nbsp;- Silverlight projects don't have a config file. I added the switch to the config file for the web application hosting it, but to no avail. I still can't build the project in the first place. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Solution.&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;After a whole morning of hitting my head against a brick wall, I found the solution. The files are local, but these were custom controls &lt;em&gt;originally downloaded&lt;/em&gt; from the vendors website. Which means that Windows had marked them as remote files (adding the 'Mark of the Web' to the file). That mark remains for ever, unless you explicitly Unlock the files using the Properties tab in Windows Explorer. &lt;br /&gt;&lt;br /&gt;So the .NET runtime was confused into thinking they were remote files.&lt;br /&gt;&lt;br /&gt;So I hope this helps someone else.&lt;br /&gt;&lt;br /&gt;Now to fix the other stuff that the upgrade has broken - like all the service references..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-8666362651481495198?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/8666362651481495198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=8666362651481495198' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/8666362651481495198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/8666362651481495198'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2009/12/silverlight-4-cas-restrictions.html' title='Silverlight 4 CAS restrictions (loadFromResourcesSwitch)'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-3747299943959021624</id><published>2009-10-24T04:08:00.000-07:00</published><updated>2009-10-24T04:15:07.920-07:00</updated><title type='text'>More Government Unhelpfulness</title><content type='html'>It's that happy time of year when I celebrate the anniversary of setting up my own company and the fact that I have made it through another year. Which means the usual round of fees and insurances (including of course, the mandatory employers liability insurance even though I am a one person company, just in case I sue myself for emotional damages) and the attendant paperwork, shareholders meeting and submitting my Annual Return.&lt;br /&gt;&lt;br /&gt;Normally this is a simple procedure, since the only share holders are myself and my wife. However, Companies House have now added a new box - from this month - in which you must 'disclose the particulars of rights attached to any shares'.&lt;br /&gt;&lt;br /&gt;Whatever that means.&lt;br /&gt;&lt;br /&gt;From the limited blurb I get that this covers such things as voting rights, dividend distribution and the like, all as per the articles of association (you know, that long tedious piece of unpenetrable legalese you were sent when you bought your company from a web shop). Since this is a new provision that affects EVERY limited company, from the largest to one-person companies like mine, you would think that Companies House would offer some guidance on how this is to be completed or what they expect it to contain. &lt;br /&gt;&lt;br /&gt;Wrong. &lt;br /&gt;&lt;br /&gt;It's just a memo box. No guidance, template answers, standard wording, nothing.&lt;br /&gt;Above all, nothing to suggest the level of detail they are requiring.&lt;br /&gt;&lt;br /&gt;Internet search shows everyone else - including accountants - are equally confused. &lt;br /&gt;&lt;br /&gt;What level of detail will they accept? Is a simple statement of 'all shares have equal voting rights and dividends are divided on the basis of shareholding' sufficient? Or do you need to reproduce all the relevant text from the articles of association? Which they have anyway, so what exactly is the point?&lt;br /&gt;&lt;br /&gt;One small grain of comfort: after the website has predictably timed out whilst you try to find this garbage, after searching once again for those auth codes you filed back after logging in, you can at least resume back at the page where you left off. &lt;br /&gt;&lt;br /&gt;And, correct me if I'm wrong, the point of the changes to the companies act was to make life simpler for small companies.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-3747299943959021624?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/3747299943959021624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=3747299943959021624' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/3747299943959021624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/3747299943959021624'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2009/10/more-government-unhelpfulness.html' title='More Government Unhelpfulness'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-4588602377871506504</id><published>2009-10-16T01:14:00.000-07:00</published><updated>2009-10-16T01:21:10.143-07:00</updated><title type='text'>U2 University</title><content type='html'>I'm just back from another U2 University event, this time held in the rather surprising location of Liverpool. This has proven to be another well run and highly informative symposium, with a broad range of talks spanning such diverse topics as Data Encryption, Web services, a talk by Susan Joslyn on standards and regulation, and the chance to hobnob with old and new friends. The U2 community is a tight-knit and friendly one, and so the opportunity to get together is always welcome.&lt;br /&gt;&lt;br /&gt;The news about the acquisition seems to now have been accepted as a 'good thing'. Panic is decidedly over, and there is a strong sense that everyone wants to make this work. &lt;br /&gt;&lt;br /&gt;The second piece of good news is that the product continues to move forward, keeping with - or in many cases well in front of - the technology curve. &lt;br /&gt;&lt;br /&gt;In particular this year the spotlight has been on data security. As companies in the US and beyond grapple with PCI compliance, UniVerse and UniData are ready for the challenge with SSL being rolled into the final pieces of the middleware jigsaw (more below) to protect data in transit, and the now mature automated data encryption to protect data at rest.&lt;br /&gt;&lt;br /&gt;One side effect of this will be a major change to WebDE (formerly RedBack) to fully meet with the challenges of encryption and NLS. Rather than beef up the legacy RedBack code that makes up the scheduler/responder architecture, IBM/Rocket have taken the sensible decision to move the whole thing over to UO.Net (RedPages) and UOJ (RedBeans). &lt;br /&gt;&lt;br /&gt;This will then use connection pooling in place of webshares, which introduces a few potential issues: &lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the question of how to licence existing customers transferring from multiple web servers, since the connection pooling will be managed in the middle tier and not at the database.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;the effect on upgrading method calls where subroutines are cached in memory (UniVerse) without bouncing the web servers themselves.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;IBM/Rocket are aware of these issues and are working to address them. The move in architecture should lead to quicker response times, and better focus as IBM/Rocket consolidate all the main architectures (web services, WebDE etc.) into a single middleware family in UO.&lt;br /&gt;&lt;br /&gt;Top of the list on cool new technologies must be the introduction of EDA to UniVerse. EDA (Extensible Data Architecture) allows U2 products to directly map data at the file level to external data sources using a driver structure based loosely around the ODBC concepts. Once in place, this becomes entirely transparent to the application. Files are mapped individually, and - a very good piece of thinking here - only specific columns need to be mapped, with the addition fields being stored as a long string or blob in dynamic array format. This reduces the overheads on type mapping and updates.&lt;br /&gt;&lt;br /&gt;Clearly IBM/Rocket have been thinking ahead with this one. In addition to moving data out permanently, they have also realized the potential for replicating data though this gateway to external databases for BI and reporting purposes. This uses the existing replication architecture to set up a publisher/subscriber model that &lt;br /&gt;may reside in the same machine, and directing the subscriber to push data through EDA to a remote data source.&lt;br /&gt;&lt;br /&gt;The fact that you do not need to individually map every column, also opens up the opportunities to use this as a general gateway - something I have asked for long ago. I can see this opening up services such as continuous backup and more intelligent auditing, since the drivers do not necessarily need to be directing to data sources.&lt;br /&gt;&lt;br /&gt;EDA is already present for UniData with an initial driver for DB2: now that the link with IBM has been dissolved, the way is free to extend this more quickly to other databases such as SQL Server and mySQL. &lt;br /&gt;&lt;br /&gt;UniVerse will gain the new facilities in version 11, which is being slated for release next year.&lt;br /&gt;&lt;br /&gt;All in all, a good event and my thanks to the U2 team for organizing it so well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-4588602377871506504?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/4588602377871506504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=4588602377871506504' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/4588602377871506504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/4588602377871506504'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2009/10/u2-university.html' title='U2 University'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-7521765148099289986</id><published>2009-10-01T01:27:00.000-07:00</published><updated>2009-10-01T01:34:44.755-07:00</updated><title type='text'>Rocket Launch</title><content type='html'>Rocket have posted a news flash &lt;a href="http://www.rocketsoftware.com/news/news_item/205"&gt;here&lt;/a&gt; about the acquisition. The deal has closed, and the U2 products are now under new ownership.&lt;br /&gt;&lt;br /&gt;This promises to be an exciting time for us all. The potential for this platform is huge, especially in nervous financial times, and we all wish the new owners and all of the U2 teams involved the very best.&lt;br /&gt;&lt;br /&gt;Expect to see the U2-sphere bursting with excitement as the news can now be posted.&lt;br /&gt;&lt;br /&gt;This should be a good transition: Rocket has all the pieces in place to really set this product on the right path and let it flourish. THe people who have managed the products through the IBM years (not forgetting those still with IBM) have done an excellent job despite the constraints, and whilst we don't know what constraints Rocket will put upon them, everything heard so far seems good news.&lt;br /&gt;&lt;br /&gt;Let's make sure we all give these guys our full support.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-7521765148099289986?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/7521765148099289986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=7521765148099289986' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/7521765148099289986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/7521765148099289986'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2009/10/rocket-launch.html' title='Rocket Launch'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-420555940640462054</id><published>2009-09-30T09:08:00.000-07:00</published><updated>2009-09-30T09:11:54.668-07:00</updated><title type='text'>Update on the Update</title><content type='html'>I've spoken with IBM UK and there is good news: it appears the rumour of legal action is nothing more than baseless speculation - there is nothing planned outside of the usual TUPE requirements. So that can be well and truly laid to rest.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-420555940640462054?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/420555940640462054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=420555940640462054' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/420555940640462054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/420555940640462054'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2009/09/update-on-update.html' title='Update on the Update'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-2397621098735024164</id><published>2009-09-28T02:58:00.000-07:00</published><updated>2009-09-30T09:13:28.047-07:00</updated><title type='text'>General Update</title><content type='html'>Plenty of opportunities for curmudgeon this week, after staying silent for a while. So a general round up seems in order.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;U2 and Rocket&lt;/h2&gt;&lt;br /&gt;Well the dust is settling after the shock announcement by IBM of the sale of the U2 assets to Rocket Software. The feeling in the community seems to have settled down to a grim resignation offset by a feeling that we should give these guys a chance. At the same time, the sale is still underway and not closed, and for the time being the U2 products are still part of IBM, which limits what any of us can say (IBM lawyers haven't gone on strike as far as we know).&lt;br /&gt;&lt;br /&gt;Still, some useful information (or rumour) seems to have trickled out.&lt;br /&gt;&lt;br /&gt;Here is what people are saying:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;It seems that the push came from within the U2 division.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;IBM was not planning on getting rid of U2, but U2 wanted out of IBM.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;All the U2 staff have been invited to join Rocket.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The senior U2 management will be moving with the product.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;There were nine companies in the frame for purchasing U2.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Rocket was chosen because they offered an opportunity to take the products forward.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Rocket has a 'hands-off' style of management that should let the products breathe.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Most of the U2 people in the US are excited about the opportunities.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;So there we have it. I can possibly look forward to editing all of my books, course ware, articles and other materials to remove the IBM name. No doubt screen shots and registry locations will change yet again. And there is still no solid news on what will happen to the ADO.NET provider in all of this.&lt;br /&gt;&lt;br /&gt;I will post more when I have spoken with Andy Youniss, the head of Rocket, this week.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;FSA Transaction Reporting&lt;/h2&gt;&lt;br /&gt;On the consulting front I'm embarking on a project to boost the FSA transaction reporting and compliance for a client. Not that their reporting is bad, I hasten to add, but the FSA is getting very tight on this with the announcement of a GBP 2.4 million fine for Barclays for misreporting, and the knowledge that they will be increasing their fines for companies and individuals is getting people worried. &lt;br /&gt;&lt;br /&gt;Still, I must say I'm looking forward to this project - it should prove exciting!&lt;br /&gt;&lt;br /&gt;All this getting tough is about time, some would say, but typically there is a fly in the ointment. Whilst the FSA puts great responsibility on firms to ensure that their reporting and controls are accurate and robust, the same cannot be said of their own guidelines. The FSA have now released a new version of their transaction reporting handbook, which explicitly excludes any guidance for data formats, and their web site is minimalist in the extreme when it comes to pertinent information. Whilst they will monitor companies to ensure they have sufficient controls in place, they offer no guidelines or advice on what they expect and what they would deem to be adequate.&lt;br /&gt;&lt;br /&gt;This recalls the very first project I ever worked on, as a young and green analyst/programmer. I was hired by a company producing software for local government at the time the dreaded and hated Community Charge (aka poll tax) was brought out in a flurry of hurried and badly formed legislation, and I was accordingly set to work on that, taking over the development of the commercial side (NNDR) a year later. With the political to and fro the legislation was subject to constant revision, and whilst the key dates remained in force and enshrined in law, the guidance from the goverment lagged behind - in some cases by months. &lt;br /&gt;&lt;br /&gt;The first legally enforced deadline was the registration period, during which local authorities had to ensure that all properties and individuals within their area were registered onto the new systems ready for billing, which AFAICR was in the April. &lt;br /&gt;&lt;br /&gt;At that time (we're taking early eighties and PICK operating systems) most local authorities lacked the resources to print out and despatch the registration forms inhouse, and so half inch tapes containing the necessary details needed to be despatched to the printers some time in advance. This was duly undertaken and the registration completed on time.&lt;br /&gt;&lt;br /&gt;So what was the problem with that? The guidance from the government for what information was required to complete the registration came out some six weeks later.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt; LME SMART&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;After long planning, various LME member firms are going live on SMART as we speak. SMART is the new interface to the LME trading platforms, and a project that has occupied me on and off for some months, which has meant radical changes to the ways in which trades are submitted and followed through their various registration, matching and clearing states.&lt;br /&gt;&lt;br /&gt;This has seen a switch from the synchronous LCH protocols (where everyone knew where they were) to an asynchronous FIX based solution providing feedback using execution reports. The change was necessary with the new division of responsibilities between te LME and LCH, and as part of the LME's ongoing work to spearhead new development of their systems.&lt;br /&gt;&lt;br /&gt;The advantage of course is that FIX is a known quantity, and the messages can be based on the FIX standards (with the usual 'tuning' to the specific industry that seems always to take place). The result has been the creation a general purpose FIX engine with validation and extraction layers that can be adapted to this, and to future FIX based interfaces.&lt;br /&gt;&lt;br /&gt;So far, touch wood, the roll out seems to be going as planned, though the LME have 'temporarily' issued a severe throttling rate for messages to ensure their systems are not overwhelmed during the early phases. Good idea that, introduce a protocol known for its speed and then throttle back. Fortunately, forewarned is forearmed and so the solution we put together has the necessary throttling built in, but it's hardly a glowing endorsement.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-2397621098735024164?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/2397621098735024164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=2397621098735024164' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/2397621098735024164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/2397621098735024164'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2009/09/general-update.html' title='General Update'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-6208155295837713541</id><published>2009-09-16T09:29:00.000-07:00</published><updated>2009-09-16T09:40:26.050-07:00</updated><title type='text'>IBM Sells U2 (more)</title><content type='html'>Tony G has written an excellent blog that distills some of the initial reaction and brims with perceptive comments. Read it &lt;a href="http://Nebula-RnD.com/blog/tech/mv/2009/09/u2sold1.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Another thought just struck me: maybe they will do away with the 'U2' moniker. That would be such a relief. As long as nobody there thinks 'rocket base' is a good alternative..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-6208155295837713541?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/6208155295837713541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=6208155295837713541' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/6208155295837713541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/6208155295837713541'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2009/09/ibm-sells-u2-more.html' title='IBM Sells U2 (more)'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-4414620766145281576</id><published>2009-09-16T02:26:00.000-07:00</published><updated>2009-09-16T09:25:09.966-07:00</updated><title type='text'>IBM Sells U2 Products</title><content type='html'>Well the news that greeted me this morning was certainly a surprise. IBM is selling off the U2 brands - UniVerse and UniData - to Rocket Software.&lt;br /&gt;&lt;br /&gt;The loss of the IBM branding will a hard blow for the U2 community.&lt;br /&gt;&lt;br /&gt;On the other hand, there are silver linings to this cloud. The same people will be involved in driving the product forward, and now unshackled from the restrictions of working through IBM. What restrictions Rocket apply will remain to be seen, but there is positive news in this.&lt;br /&gt;&lt;br /&gt;Yes, there are already murmurings, but let's give these guys the benefit of the doubt. They have chosen U2, and so are coming in with some commitment. IBM have done a good job in the work they have done with the product, especially with the XML features. But they could have gone much further, and marketing always seemed compromised by the DB2 banner.&lt;br /&gt;&lt;br /&gt;There are practical questions raised, of course. What happens to the ADO.NET support, since that is a generic IBM provider? What happens to training - does this mean that independent trainers like myself can now get a foot back into the market? What about strategic partnerships for products? Rocket already have a portfolio that includes reporting and data migration, amongst others: perhaps they will realize the value of the tools that face end users, or maybe they have their own plans for that space.&lt;br /&gt;&lt;br /&gt;It could have been worse. IBM could have sold off the U2 products to one of the major vendors (assuming they had the money), which would have fractured the community. Rocket is, to the best of my very limited knowledge, independent in this regard. They could have sold it to another database vendor, with competing products: once again, through Rocket have storage solutions, the U2 products look like a brand that could carve a space in their portfolio, if the will is there to do so.&lt;br /&gt;&lt;br /&gt;I just hope that the move to Rocket opens up as many opportunities as it closes.&lt;br /&gt;&lt;br /&gt;Fingers crossed and keep faith.&lt;br /&gt;We've been through this before, and U2 has remained intact.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-4414620766145281576?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/4414620766145281576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=4414620766145281576' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/4414620766145281576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/4414620766145281576'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2009/09/ibm-sells-u2-products.html' title='IBM Sells U2 Products'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-4302927188321353118</id><published>2009-08-29T02:07:00.000-07:00</published><updated>2009-08-29T02:47:49.542-07:00</updated><title type='text'>C# Finger Stress</title><content type='html'>I hear that my comments on Silverlight found their way to a TEXMUG meeting. Thanks for following along - I never thought anyone read this stuff! So I'll be posting more on my travails with Silverlight and UniVerse as I go..&lt;br /&gt;&lt;br /&gt;But now for more pressing curmugeon:&lt;br /&gt;&lt;br /&gt;I spent yesterday debugging some old code.&lt;br /&gt;&lt;br /&gt;This was for a system I had written some four years ago for a client: it has been working and live throughout, but in the way that things sometimes happen they had hit an unforeseen circumstance ("events, dear boy") that had caused a hiccup. Nothing major (since I'm blogging live about my software!) but a once-in-four-years annoyance and four years on is probably a good time to review code anyway.&lt;br /&gt;&lt;br /&gt;The interesting thing for me was that this was written in VB.Net.&lt;br /&gt;&lt;br /&gt;Now I switched to using C# pretty much exclusively for my .Net coding soon after that and today all my .Net work is in C# - and so looking back at some VB.Net code was a pleasure. It is so much easier to read and to debug, especially when coming back to code you haven't seen in a long time.&lt;br /&gt;&lt;br /&gt;Intellectually, I know that there is nothing that you can do in C# that you can't do in VB.Net, and that under the hood they are effectively the same. Yes, I have heard the argument trotted out that C# is quicker but that was only the case back in 1.1.&lt;br /&gt;&lt;br /&gt;In fact, there is nothing (apart from the XML auto-documentation) that should really cause anyone to prefer C# over VB.Net. Particularly if considering the entire product lifecycle: if everyone who developed were forced to support their own code, and they might think twice about intelligibility!&lt;br /&gt;&lt;br /&gt;Sadly, industry doesn't see it that way. Look at the Microsoft marketing, and it is clear that VB.net is positioned as a hobby language and C# as a tool for professionals. Well, they had to appease the C++ community somehow, I guess. C# is the language par-excellence for geekdom, and if you can't churn out some decent lamda expressions to create anonymous types and delegates in C#, you're not even on the first step.&lt;br /&gt;&lt;br /&gt;So why did I turn to C#? Because it just makes me seem more professional and in the some of the areas I deal with, more of the examples are in C#. Clearly, VB.Net programmers are not supposed to do complicated stuff. Look at the blog-sphere on things like dynamic type creation if you don't believe me. Chances of finding good examples in VB are down there with articles about MultiValue on CodeProject.&lt;br /&gt;&lt;br /&gt;MultiValue databases also use a variant of Basic, and just like VB.net this is a far cry from the old Dartmouth stuff. MultiValue Basic - in all its various forms - is a hugely capable language specialized for business processing. It is not perfect, but it has stood the test of time and offers tremendous advantages in terms of focussed business performance. It is also an elegant language for expressing business rules, and the use of external subroutines and functions as the main building blocks of an application makes it highly flexible and adaptable. It lacks OO features (and who really needs them in server procedures?) but even this is being addressed by OpenQM in their version.&lt;br /&gt;&lt;br /&gt;But the same snobbery rears its head when you talk about UniVerse Basic. Oh, it's Basic, it can't be a real language. Urm, you must mean compared to the syntactic richness and highly developed business features available for writing stored procedures in the likes of TSQL? Yeah, really. And if run time typing is a problem, take a look at PHP.&lt;br /&gt;&lt;br /&gt;Good MultiValue code - written with an eye to maintainability - is a joy. &lt;br /&gt;&lt;br /&gt;[Note the word 'good' in that sentence. There is plenty of unreadable and unmaintainable rubbish in the MV world as well. But there is less excuse.]&lt;br /&gt;&lt;br /&gt;Certainly, VB.Net is more legible and syntactically simpler than C#. Is that enough to relegate it to a hobby language?&lt;br /&gt;&lt;br /&gt;Well, aside from the debugging yesterday, I've been using the two side by side for some time building the example code for a book. One thing is clear: my poor fingers definitely prefer VB.Net! For productive, professional programming the layout of C# is simply not keyboard-friendly. And given the relative extents to which you need to cast types in C# over VB.Net, it is not necessarily shorter, either:&lt;br /&gt;&lt;br /&gt;MyAwkwardTypeName myType = new MyAwkwardTypeName();&lt;br /&gt;MyOtherThing myThing = (MyOtherThing) ((MyContainerClass) someObject).property;&lt;br /&gt;&lt;br /&gt;Couple that with the huge role played by property gets and sets (and now I'm using Silverlight, the fact that so much of the UI is based on data binding to properties and decorating the resultant code with endless attributes) and I wonder whether anyone has researched into the effect of different computer languages in creating RSI.&lt;br /&gt;&lt;br /&gt;Take a (very) simple construct like the one below:&lt;br /&gt;&lt;br /&gt;[DataMember]&lt;br /&gt;public Boolean myProperty{&lt;br /&gt;  get{ return _myProperty; }&lt;br /&gt;  set{ setMyProperty(value); }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Now type that out twenty times (for different properties, duh). Remember the intellisense, so you can make use of the cursor and tab keys as well (or Esc to stuff it out of the way again). Do that often enough and your fingers will start to feel the stress. However good a typist you are - and I'm not, as anyone who has seen live demos of my software will attest.&lt;br /&gt;&lt;br /&gt;If there is a league table for RSI, I bet C# is at the front of the list.&lt;br /&gt;&lt;br /&gt;But I'll probably keep using it and grinning through the pain. That's the price of geek-dom after all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-4302927188321353118?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/4302927188321353118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=4302927188321353118' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/4302927188321353118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/4302927188321353118'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2009/08/c-finger-stress.html' title='C# Finger Stress'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-7162423663440255838</id><published>2009-08-22T03:21:00.000-07:00</published><updated>2009-08-22T03:47:03.569-07:00</updated><title type='text'>Hating Silverlight</title><content type='html'>It's official. I hate Silverlight.&lt;br /&gt;&lt;br /&gt;Or at least, I hate some of the Microsoft'ed-ness of it. A great idea, excellent technology, and yet at every step you hit your head against a wall. And with Silverlight 3 it's a different set of walls to Silverlight 2 and Silverlight 1..&lt;br /&gt;&lt;br /&gt;Why?&lt;br /&gt;&lt;br /&gt;Here's a typical piece of Microsoft thinking:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;We have decided in our wisdom that all syncronous calls to services are evil. So you can't do them. The only service calls we will support are asynchronous. So there. We don't know about you, we know nothing about your applications, but we know better. So we are not going to give you the choice.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Now don't get me wrong: I understand the arguments for why async should generally be preferred in many situations, and I fully intend to use the async model &lt;strong&gt;where appropriate&lt;/strong&gt;. But I'm intelligent enough (I hope) to know when and where to use these. Like with sockets: you can (still) choose to make a socket call asychrounously or syncronously depending on the context. At least there I have the choice. &lt;br /&gt;&lt;br /&gt;But not with Silverlight. No, never, we know best.&lt;br /&gt;&lt;br /&gt;Now, I need to do something very simple at the start of one of my applications. I neeed to present a login dialog with a list of connections provided by a service, request the connection name, user name and password, and send these back to the same service for validation.&lt;br /&gt;&lt;br /&gt;Here is how it works in a Windows Forms scenario:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;The user clicks a Connect menu item.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;This fetches a list of connection names from the service using a remoting call.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;This then creates the connection dialog, and populates the drop down list.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The connection dialog is displayed modally.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;On acceptance, the details are passed to a Connect function on the service via remoting.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;All handled in a single function, so easy to follow and to debug.&lt;br /&gt;&lt;br /&gt;Now the Silverlight version:&lt;br /&gt;&lt;br /&gt;Well, first of all there is no synchronous call to get the connection names. So the user clicks Connect, I fire off a async call to get the connections, and lock the UI in the meantime since they can't legitimately do anything else at this point. &lt;br /&gt;&lt;br /&gt;A second event handler is fired when the call returns, so at that point I can get hold of the connection names. Create a child window, populate the drop down list of connections and show. Except that this doesn't support a modal show (just what is the point of a dialog that can't be shown modally?)&lt;br /&gt;&lt;br /&gt;So a third event handler to pick up the dialog close. Now I can call the connect function - once again as an async call.&lt;br /&gt;&lt;br /&gt;Which means coding a fourth event handler for the connect call response..&lt;br /&gt;&lt;br /&gt;And the code becomes more and more fragmented. And that is just for one simple action. &lt;br /&gt;&lt;br /&gt;So I'm left with a choice: carry on writing the entire application using the async model with reams of functions cluttering up the place until it all becomes an unmaintainable mess, or write another pointless container for the service calls that will perform these on a non-UI thread, blocking as it goes to simulate syncronous operation by using a ManualResetEvent:&lt;br /&gt;&lt;br /&gt;   myEvent.Reset();&lt;br /&gt;   client.getConnectionsCompleted += (sender, args) =&gt; { myEvent.Set(); };&lt;br /&gt;   client.getConnectionsAsync(new ReportStudioSL.RSMainService.getConnectionsRequest&lt;br /&gt;       (connections, errText));&lt;br /&gt;   myEvent.WaitOne();&lt;br /&gt;&lt;br /&gt;and so on and so forth for every call that needs to be logically handled syncronously. And there are quite a few of these...&lt;br /&gt;&lt;br /&gt;So today, I hate Silverlight. Officially.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-7162423663440255838?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/7162423663440255838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=7162423663440255838' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/7162423663440255838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/7162423663440255838'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2009/08/hating-silverlight.html' title='Hating Silverlight'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-8514777420401028825</id><published>2009-07-23T07:31:00.001-07:00</published><updated>2009-07-23T07:38:26.340-07:00</updated><title type='text'>Microsoft Patches Linux</title><content type='html'>So Microsoft have reportedly released 20,000 lines of code for the Linux kernel, to improve performance when hosted under their Virtualization technology, Hyper-V.&lt;br /&gt;&lt;br /&gt;Cynical: possibly. Self-serving: definitely. Useful: quite probably.&lt;br /&gt;&lt;br /&gt;No doubt there will be rants from the anti-Microsoft fraternity, but this is open source and anyone can play. The code should be treated entirely on its merits, regardless of who posted it. If it is good, accept it. If not, reject or improve it. That's what it's all about.&lt;br /&gt;&lt;br /&gt;I run Linux under Microsoft's Virtual PC, so I'm not complaining.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-8514777420401028825?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/8514777420401028825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=8514777420401028825' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/8514777420401028825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/8514777420401028825'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2009/07/microsoft-patches-linux.html' title='Microsoft Patches Linux'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-3790574317940773285</id><published>2009-06-26T09:45:00.000-07:00</published><updated>2009-06-26T09:53:30.276-07:00</updated><title type='text'>Painting Pictures Part 2</title><content type='html'>Just to follow up from the previous post, I now have the beta version of the new mvScan ready, including the graphics generated from UniVerse. In the event I also decided to put a Windows front end onto the map files, but I expect the generated pages to be the most useful resource - and they don't require a database licence.&lt;br /&gt;&lt;br /&gt;So here are a couple of shots of the new charts in action.&lt;br /&gt;&lt;br /&gt;First a field listing, breaking the dictionary out into its various associations:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_pZlbX6rhC4s/SkT8C0ZB2zI/AAAAAAAAAB0/KUVehGq3gnA/s1600-h/mvscan_fields_medium.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 337px; height: 400px;" src="http://3.bp.blogspot.com/_pZlbX6rhC4s/SkT8C0ZB2zI/AAAAAAAAAB0/KUVehGq3gnA/s400/mvscan_fields_medium.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5351679382576552754" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And a logic diagram following from menus through executed programs and called subroutines:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_pZlbX6rhC4s/SkT8b76wg7I/AAAAAAAAAB8/Itul4k8DCF4/s1600-h/mvScan_results_medium.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 381px; height: 400px;" src="http://2.bp.blogspot.com/_pZlbX6rhC4s/SkT8b76wg7I/AAAAAAAAAB8/Itul4k8DCF4/s400/mvScan_results_medium.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5351679814093800370" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Naturally these are all hyperlinked alongside the text, so developers can drill around their systems.&lt;br /&gt;&lt;br /&gt;So I guess I'll be writing a &lt;a href="www.intl-spectrum.com"&gt;Spectrum article&lt;/a&gt; on UniVerse and graphics in the near future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-3790574317940773285?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/3790574317940773285/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=3790574317940773285' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/3790574317940773285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/3790574317940773285'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2009/06/painting-pictures-part-2.html' title='Painting Pictures Part 2'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_pZlbX6rhC4s/SkT8C0ZB2zI/AAAAAAAAAB0/KUVehGq3gnA/s72-c/mvscan_fields_medium.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-3928320273095037770</id><published>2009-06-21T04:40:00.000-07:00</published><updated>2009-06-21T04:57:11.684-07:00</updated><title type='text'>Painting Pictures</title><content type='html'>As part of the grand scheme of releasing new versions of all my products in advance of getting down to completing my new reporting tools, this week I've turned my attention to mvScan. This is a set of analytical tools for scanning a UniVerse system and determining all the impacts: programs accessing files, subroutine calls (including external function calls), routines called from dictionaries, PROCs accessing files, tools called from menus - all the bits and pieces that make up a live UniVerse application.&lt;br /&gt;&lt;br /&gt;The analytical part derived from some tools I've been using in a consulting mode, and so when I came to take a new look at them last month, they were capable but not particularly user-friendly. And whilst they generate a goldmine of information, navigating that takes some work. So I needed a new way to present the results.&lt;br /&gt;&lt;br /&gt;Part of that job was already done: the tools produce technical documentation in the form of HTML pages - handy since anyone can view them and they can drill up and down through the relationships. But I wanted something more graphical to present these links as a chart or diagram.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;UniVerse and Graphics&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Now whilst UniVerse has plenty of APIs for working with data and for interacting with remote systems, graphics has never been part of the mix. Normally I would tackle this by adding an external library, something along the lines of mvPDF that runs as a service backed by calls made from UniVerse Basic. Using this technique I could simply harness existing Windows graphics libraries to generate images. But it seemed a little cumbersome for what I was looking for, and in any case there is an additional complication in the fact that I want these to include the same links. Clicking a subroutine in a diagram should take you to the map for that subroutine, and so forth. This would mean not only creating an image, but an image map to overlay, which seemed to be the wrong choice.&lt;br /&gt;&lt;br /&gt;So I decided that I needed a way to generate web images directly from UniVerse Basic. That means using a format that can be easily assembled by a language that is predominently string based and lacks the sort of feedback required for image placement.&lt;br /&gt;&lt;br /&gt;Which leads to two real possibilities: markup languages like XAML or a dedicated image language like SVG.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Vector Graphics&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;I had not really appreciated SVG (Scalable Vector Graphics) before this exercise. This is an XML based definition of - well, scalable vector graphics. And it has the great benefit of being extremely simple. &lt;br /&gt;&lt;br /&gt;SVG is presented as an XML document. Despite being a W3C recommendation, it is noticeably absent in Internet Explorer, but can be viewed using a free plugin from Adobe. The syntax consists of graphics primitives: lines, rectangles, ellipses, polygons, polylines, paths and text. Graphics elements can be combined into reusable definitions - perfect for a diagram holding a limited pallate of symbols. And the rendering of those elements: fill, stroke, colours etc. all follows regular CSS. Even better, you can include regular HTML style anchor tags to provide hot-spotting.&lt;br /&gt;&lt;br /&gt;So I'm now working towards my goal of generating diagrams directly from UniVerse Basic. When the new evaluation version of mvScan is released, you can see how I got on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-3928320273095037770?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/3928320273095037770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=3928320273095037770' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/3928320273095037770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/3928320273095037770'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2009/06/painting-pictures.html' title='Painting Pictures'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-9068905223449228142</id><published>2009-06-14T05:01:00.001-07:00</published><updated>2009-06-14T06:13:24.971-07:00</updated><title type='text'>Testing Times</title><content type='html'>&lt;div&gt;This week has been a flurry of activity as I've taken advantage of an enforced break from contract work to bring a number of my products up to date. Over the next month or so, look out for new versions of mvPDF, mvScript, mvInstaller, mvDeveloper and some new utilities such as Conduit, which is an export pipeline between IBM UniVerse and SQL data sources.&lt;br /&gt;&lt;br /&gt;First out of the gate will be a new mvScript, with a completely rewritten connection handler to take advantage for the first time of the IBM Pooled Connection licences and with the first round of support for QM, which I'm getting to like more and more as I work with it.&lt;br /&gt;&lt;br /&gt;A large part of my development philosophy has always been to reduce the amount of manual intervention required to get a product through QA and out of the door. For example, when building a product I run cutting scripts that will rebuild all the source on the server, reversion everything, generate the server side setups (using mvInstaller, naturally), then progress to updating any resources in the client, build the client and package it all up in the shipping directory. All of which is automated to the point where it should happen consistently every time.&lt;br /&gt;&lt;br /&gt;The same is true wherever possible with regard to testing. I've already written elsewhere about how I try to have all my server subroutines use the same calling convention, making it easy to write test rigs that can stack in arguments and unit test by checking the results. Added to that, products like mvScript have their own test beds: for mvScript this is a set of pages that cover every function and statement in the language and the runtime facilities such as the emulated COMMON blocks.&lt;br /&gt;&lt;br /&gt;But with the extension to the connection pool, I now have another layer to test. And with two connection pools, new database support for QM and three connection models (pooled, connect on demand or pooled licencing) that is new raft of things to automate.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Using CallHTTP&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;Fortunately, once more IBM UniVerse comes to the rescue. UniVerse is stuffed full of different APIs for performing all kinds of useful operations, usually representing an easy-to-use abstraction of some underlying protocols. The socket API is a case in point, providing a single high level model for socket communication that irons out some of the annoying difficulties across different platforms (as anyone who has coded socket routines on UNIX will attest).&lt;br /&gt;&lt;br /&gt;One of the APIs that is built upon the socket support is CallHTTP. As the name suggests, this provides a quick and simple route for making HTTP requests: spanning the various HTTP methods (GET, POST, TRACE etc) and allowing form post variables to be sent along with the request. Perfect then for soak testing the connection pool.&lt;br /&gt;&lt;br /&gt;So here's how I'm now testing the new mvScript connectivity. I have a file of requests, holding details of pages to fetch (URL, query string, post variables, additional http headers and proxy data - not all of these needed, but I'll allow for them for future operations). Then a file of responses, that will capture the HTTP status, headers and data returned from the calls, along with any errors from the calling routine.&lt;br /&gt;&lt;br /&gt;Next, to run this I will need to fire off some phantom processes to ensure that requests can be sent concurrently - there is no point testing connection pooling with sequential requests! I will be slightly limited by the need for each of these to consume an iPhantom licence since the request involves a socket call, but so be it.&lt;br /&gt;&lt;br /&gt;Then to the request routine itself, which is laudably simple since I'm not using secure socket connections, which take a bit more work to set up.&lt;br /&gt;&lt;br /&gt;The first step is to configure the HTTP environment. This sets the HTTP version (1.0 or 1.1) and details of any proxy servers and/or ports, using the setHTTPDefault function: &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_pZlbX6rhC4s/SjT1baROuZI/AAAAAAAAABU/xqQr-qFWMdg/s1600-h/f1.bmp"&gt;&lt;img id="BLOGGER_PHOTO_ID_5347168508852484498" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 88px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_pZlbX6rhC4s/SjT1baROuZI/AAAAAAAAABU/xqQr-qFWMdg/s400/f1.bmp" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now the call is set up in two stages: first the request is created and any parameters attached, and then the request is submitted.&lt;br /&gt;&lt;br /&gt;Creating the request requires the URL and HTTP method:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_pZlbX6rhC4s/SjT2Gqrdd9I/AAAAAAAAABc/bKU2rxrFcGs/s1600-h/f2.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 124px;" src="http://2.bp.blogspot.com/_pZlbX6rhC4s/SjT2Gqrdd9I/AAAAAAAAABc/bKU2rxrFcGs/s400/f2.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5347169251991844818" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The &lt;i&gt;hRequest&lt;/i&gt; is a handle to the new request, to which you can add new HTTP headers calling the setRequestHeader() function, and form post parameters through the addRequestParameter() function.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_pZlbX6rhC4s/SjT2qlsfAcI/AAAAAAAAABk/oUz83UlJqKI/s1600-h/f3.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 126px;" src="http://4.bp.blogspot.com/_pZlbX6rhC4s/SjT2qlsfAcI/AAAAAAAAABk/oUz83UlJqKI/s400/f3.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5347169869129253314" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Finally the request can be submitted, using the submitRequest() function. This requires a timeout in milliseconds, and returns the HTTP status, HTTP headers and data in three separate variables. You can supply additional post data as an alternate to using the addRequestParameter above:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_pZlbX6rhC4s/SjT3LAwBlHI/AAAAAAAAABs/WyUVAuXykyg/s1600-h/f4.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 124px;" src="http://4.bp.blogspot.com/_pZlbX6rhC4s/SjT3LAwBlHI/AAAAAAAAABs/WyUVAuXykyg/s400/f4.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5347170426147673202" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;Simple. So now I'm off to soak test my new connection pool. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-9068905223449228142?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/9068905223449228142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=9068905223449228142' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/9068905223449228142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/9068905223449228142'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2009/06/testing-times.html' title='Testing Times'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_pZlbX6rhC4s/SjT1baROuZI/AAAAAAAAABU/xqQr-qFWMdg/s72-c/f1.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-6860696266459831894</id><published>2009-05-28T04:16:00.000-07:00</published><updated>2009-05-28T04:23:04.458-07:00</updated><title type='text'>mvDeveloper Interface</title><content type='html'>Friends of my free Windows editor for MultiValue platforms, &lt;em&gt;mvDeveloper&lt;/em&gt;, may be pleased to learn that I've finally got off my backside regarding specifying a new interface API.&lt;br /&gt;&lt;br /&gt;mvDeveloper was designed to be as lightweight as possible, allowing me to carry it around on a USB stick and connect it to any passing MultiValue database (generally UniVerse or UniData) as required by my work. Specifically, it was designed such as to require nothing special installed on the server side.&lt;br /&gt;&lt;br /&gt;However, this cavalier approach does not sit with those sites who have implemented rigorous (or otherwise) source code control or source management systems. So for the current release I added Handler subroutines, that can be called for read/write and build operations, but really that was something of a stop-gap approach.&lt;br /&gt;&lt;br /&gt;So at a timely prompt from Susan Joslyn of SJ+ Associates, the author of the highly esteemed PRC system for code management, I've written a proposal for a generic interface that should hopefully meet the needs of any such systems out there.&lt;br /&gt;&lt;br /&gt;If anyone is interested in commenting, please drop me an email at the usual address.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-6860696266459831894?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/6860696266459831894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=6860696266459831894' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/6860696266459831894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/6860696266459831894'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2009/05/mvdeveloper-interface.html' title='mvDeveloper Interface'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-9013821347881522114</id><published>2009-05-10T02:33:00.000-07:00</published><updated>2009-05-10T02:54:36.283-07:00</updated><title type='text'>Transformations</title><content type='html'>Out here in the Oxfordshire countryside, the last few weeks have been a time of huge changes. Only a month ago the trees and thorn bushes along the river that winds its way around the village, were bare and lifeless: then two weeks in which they were transformed, covered in white blossoms - at first incongruous and then glorious. Then, just as quickly, the blossom was gone and in there place a vista of green: how many different greens there are in the world!&lt;br /&gt;&lt;br /&gt;In the Chinese Five Element system, Spring is the time of the Wood Element and signified by the colour green: a time for growth, momentum and transformation.&lt;br /&gt;&lt;br /&gt;It has been a time of change here as well. Another financial year survived marking four years working for myself, and the end of a long and enjoyable contract that had seen me back working on commodity trading systems, which is where ADG and my adventures with UniVerse really began. And now bringing with it a chance to spend some time working on my products again (at least until the next job comes along) - and transformation is the theme here once again.&lt;br /&gt;&lt;br /&gt;First up for new treatment is mvPDF. I'm launching a new "mvPDF Lite" for these credit-crunch times, offering the most requested features at a bargain price: transforming existing MultiValue reports into PDF documents and Windows printouts, by using spooler capture and a page designer to generate new backgrounds, and now with improvements to the PCL parsing and support for EPSON/Brother/HP compatible barcodes.&lt;br /&gt;&lt;br /&gt;More exciting, I'm also adding report transformation into the product, based on software I originally designed for mvQuery. This captures existing reports and strips the report content, allowing this to be reformatted and extended to generate new and more current reports without reprogramming. For most companies, the existing reports represent a substantial investment in time and knowledge, and throwing these out to replace them with new reporting solutions - however glossy - is simply not a viable option. mvPDF and the new mvPDF Lite will allow clients to retain this investment, whilst transforming a vital part of their instrastructure.&lt;br /&gt;&lt;br /&gt;The second transformative product that is getting a new round of attention is Conduit: a program I wrote for a customer again to assist with their reporting, that makes it simple to strip data from a UniVerse system and to post it to an external data source: typically SQL Server. Conduit runs as a Windows service, generating the data for export from dictionary driven defintions, and with sufficient control to handle both batch and continuous updates, and the ability to generate and call stored procedures to optimise the posting performance. The transformation in this case is not just between data sources: the Conduit data engine is a powerful beast for generating real and virtual data and handling the necessary normalizng of UniVerse data without the need to use the clumsy UniODBC drivers.&lt;br /&gt;&lt;br /&gt;So whilst the contract work dies down I won't be twiddling my thumbs.. time to get down to some serious product development and hit the infinite to-do list while the Spring is here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-9013821347881522114?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/9013821347881522114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=9013821347881522114' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/9013821347881522114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/9013821347881522114'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2009/05/transformations.html' title='Transformations'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-8442040230135163142</id><published>2009-04-26T02:52:00.000-07:00</published><updated>2009-04-26T03:19:12.888-07:00</updated><title type='text'>Writing in mvScript</title><content type='html'>Okay, I'll admit it: mvScript was written for fun. But Tony G has recently hassled me about why I don't market it, which is a nod in its favour, so I guess it's time I told a few more people about it. So here we go.&lt;br /&gt;&lt;br /&gt;I wanted an easy way to create dynamic content from UniVerse – mostly web pages, but possibly other content such as XML for AJAX – without having to tangle with the cost and overheads of existing web transports. Also, I wanted something that felt natural to UniVerse (and potentially to other MultiValue) developers. Thus mvScript was born.&lt;br /&gt;&lt;br /&gt;mvScript, as the name suggests, is a scripting language. Similar to ASP or PHP, it is a language that can generate dynamic content for web pages. There are two significant differences however: first, mvScript is compiled and interpreted on the database server; and second, mvScript is modelled after UniVerse Basic.&lt;br /&gt;&lt;br /&gt;In this post I am going to give a very brief introduction to mvScript: which I believe to the be the simplest way to create websites for MultiValue platforms. You can download an evaluation copy, along with the demonstration database, from &lt;a href="http://www.brianleach.co.uk/"&gt;http://www.brianleach.co.uk/&lt;/a&gt;. You will need to create a virtual directory in Internet Information Server to host your pages. Once installed and configured you should be ready to play.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Creating an mvScript Page&lt;/h3&gt;&lt;br /&gt;Pages in mvScript are generally created as regular HTML or XHTML. You can use your favourite web design tool (I use Microsoft Expression) or even Notepad. So let's begin with a simple greeting:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_pZlbX6rhC4s/SfQx93Rk31I/AAAAAAAAAAs/51LVWLHu2Xw/s1600-h/mvscript_fig1.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5328939197965590354" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 368px; CURSOR: hand; HEIGHT: 180px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_pZlbX6rhC4s/SfQx93Rk31I/AAAAAAAAAAs/51LVWLHu2Xw/s400/mvscript_fig1.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The scripts are identified by the tags &amp;lt; % and % &amp;gt;. The code between should seem familiar: these are regular UniVerse Basic statements to show the text and current time in external format. To ensure that this is handled by mvScript, save the page in the virtual directory with a wsp extention and request it in your browser making sure you give the full URL so that it runs through IIS (if you just give the file location, it won't). Each time you refresh the page, the time will change.&lt;br /&gt;&lt;br /&gt;So how did this work? mvScript pages are passed through an IIS DLL and compiled on demand on the server into an intermediate code format. This code is interpreted by a run machine on the server and the resulting page returned to the browser. The Crt statement in Basic displays to screen: in mvScript Crt (and “=”) update the dynamic page content.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Performing Data Operations&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;The advantage becomes clear when you work with UniVerse data. Each page requires a single round trip to the server regardless of how much it needs to interact with the database. mvScript uses familiar constructs to access the data in your system: opening files, reading and writing records, handling dynamic arrays. See how we can show a record from the demonstration database:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_pZlbX6rhC4s/SfQy8zYWksI/AAAAAAAAAA0/1UbL5phSNAQ/s1600-h/mvscript_fig2.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5328940279252030146" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 387px; CURSOR: hand; HEIGHT: 400px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_pZlbX6rhC4s/SfQy8zYWksI/AAAAAAAAAA0/1UbL5phSNAQ/s400/mvscript_fig2.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Entering Values&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;The page above is less than useful in the real world: it only displays a fixed id! We really need to enter the id or to select it from a list. Web pages have two routes for supplying data: the querystring or form post variables. The QueryString is the key/value pairings part of a URL that sits after a question mark, as in: http://mysite/mypage.htm?key=value.&lt;br /&gt;&lt;br /&gt;mvScript can access the querystring and form post values through a Query() and Form() function respectively. So you can extend the page to fetch a title id by adding: id=Query(“id”), and call the page adding the id to the URL.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Calling Subroutines&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;mvScript, like all good front-end MultiValue tools, is designed primarily to call Basic subroutines. Any client/server or web based application should be backed by subroutines. These offer the fastest, most direct route to handling data and can be most easily tested. A well designed subroutine library builds into an API that can document the interface to your application: one that can be reused across a variety of interfaces, both current and future, to protect your investment.&lt;br /&gt;&lt;br /&gt;Having created a page to view a title record, now we need a way to select candidate records. Because of space restrictions I'm going to build these into a table in Basic:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_pZlbX6rhC4s/SfQzxaOR0yI/AAAAAAAAAA8/dRnr6LYoa3A/s1600-h/mvscript_fig3.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 328px;" src="http://1.bp.blogspot.com/_pZlbX6rhC4s/SfQzxaOR0yI/AAAAAAAAAA8/dRnr6LYoa3A/s400/mvscript_fig3.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5328941183031956258" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now we can host this in an mvScript page. mvScript uses the same Call syntax as UniVerse Basic, so you can hide the complex parts away in your UniVerse Basic code:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_pZlbX6rhC4s/SfQ0OHw5wAI/AAAAAAAAABE/YjfYi2KEpjI/s1600-h/mvscript_fig4.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 349px; height: 248px;" src="http://4.bp.blogspot.com/_pZlbX6rhC4s/SfQ0OHw5wAI/AAAAAAAAABE/YjfYi2KEpjI/s400/mvscript_fig4.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5328941676293111810" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So there you have it – the start of a simple application. Not pretty, but mvScript pages are fully formed web pages in their own right, capable of using all the ususal web adornments including style sheets, javascript and AJAX, whilst keeping the important part – the database logic – close to home.&lt;br /&gt;&lt;br /&gt;For any seasoned MultiValue developer, it doesn't get much easier than that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-8442040230135163142?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/8442040230135163142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=8442040230135163142' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/8442040230135163142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/8442040230135163142'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2009/04/writing-in-mvscript.html' title='Writing in mvScript'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_pZlbX6rhC4s/SfQx93Rk31I/AAAAAAAAAAs/51LVWLHu2Xw/s72-c/mvscript_fig1.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-2875730032859429757</id><published>2009-03-29T06:40:00.000-07:00</published><updated>2009-03-29T06:48:18.896-07:00</updated><title type='text'>The Return of ODBC</title><content type='html'>Interesting news from Redmond this week. It seems that after a decade of dormancy, Microsoft have been looking once again at ODBC. Even redeveloping driver code and extending the specification. Yes, that's right - the cross platform database access protocol that they dumped like a hot potato in favour of OleDB/ADO/ADO.Net and whatever is the current flavour of the month, is now back on the agenda.&lt;br /&gt;&lt;br /&gt;Perhaps their data strategists finally just ran out of acronyms and needed to recycle. &lt;br /&gt;&lt;br /&gt;Good news? Not necessarily.&lt;br /&gt;&lt;br /&gt;The story of ODBC in UniVerse is - well, mixed.&lt;br /&gt;&lt;br /&gt;Today, there are two ODBC centred routes in UniVerse: the BCI (Basic Calling Interface) and the UniODBC driver. And they are both very different beasts.&lt;br /&gt;&lt;br /&gt;BCI is one of a batch of protocols for making calls out from the server. Remember the key thing about MultiValue databases in general, and IBM UniVerse in particular, is that the business processing is handled within the database: no three tier solutions required. So BCI is in a genuinely useful place. Using BCI, developers can make calls to external ODBC data sources, and perform all the regular ODBC style operations: fetching data, running inserts, creating and hitting stored procedures. And as ODBC goes, it's pretty quick, though for UNIX based UniVerse it requires third party ODBC drivers from companies like Merant and EasySoft.&lt;br /&gt;&lt;br /&gt;The UniODBC driver runs in the other direction. That is used for calling into UniVerse from external systems (and into UniData also, using a different model). This is the latest in a long line of ODBC protocols that began with a third party product called HyperStar, which explains the naming behind many of the commands and control files that mostly begin with 'HS'.&lt;br /&gt;&lt;br /&gt;Now these products reflect the twin natures of ODBC with UniVerse, and the problems faced when trying to integrate MultiValue data with the outside world.&lt;br /&gt;&lt;br /&gt;BCI runs within UniVerse, and so has direct access to UniVerse data and the multivalued data structures. It is driven by code, so developers can use all the facilities of the language to process that data, either for posting or upon retrieval. Any normalizing that needs to take place to accommodate primitive data tables, can be handled through code and tailored exactly to the circumstances. If you're looking to export quantities of data to third party systems, BCI is a very attractive route.&lt;br /&gt;&lt;br /&gt;UniODBC on the other hand is driven from the outside, MultiValue-intolerant world. So the database has to present UniVerse data as if it came from a standard relational system. That means it must 'dynamically normalize' the data that is presented: multivalue associations are automatically presented as child tables, to be joined back to the parents as desired through the ODBC SQL. On top of this there is a lot of administration to be undertaken: dictionaries need to be cleaned up, preferably replaced with reporting views of the data; associations fully defined; data types specified.&lt;br /&gt;&lt;br /&gt;Now, interestingly the SQL that runs through UniODBC is not the same SQL that runs inside UniVerse. Despite being a MultiValue database, Universe also has first line SQL capabilities built, once again, directly into the run machine. The native SQL is &lt;br /&gt;something I will be touching on later, as it is the most under-utilized feature of UniVerse: largely, I believe, because of the experience UniVerse developers have had with the ODBC SQL. Native UniVerse SQL is multivalued, and handles the native structures with aplomb making it fast. It also understands the dictionary structures, including virtual fields in the same way as the MultiValue enquiry language, RetrieVe. So for many tasks it can represent the best of both worlds.&lt;br /&gt;&lt;br /&gt;The UniODBC driver, on the other hand, has to work hard to translate between these two models, which means overheads in terms of operation and complexity for developers. It can also hit the lock table if used poorly.&lt;br /&gt;&lt;br /&gt;In recent years, changes to the world of data access have moved away from simple tabular data. In particular, the rise of XML as a transport has been a huge benefit to MultiValue systems, since the XML schema more neatly encapsulates the nested entities present in MultiValue data. The ability to export data without having to &lt;br /&gt;normalize it actually puts MultiValue at an advantage since the native features can come into play.&lt;br /&gt;&lt;br /&gt;So whilst some improvements in driver manager performance may be a good thing for many, the re-emergence of ODBC may not necessarily be such a welcome sight.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-2875730032859429757?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/2875730032859429757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=2875730032859429757' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/2875730032859429757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/2875730032859429757'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2009/03/return-of-odbc.html' title='The Return of ODBC'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-6581079383872968366</id><published>2009-03-24T03:49:00.000-07:00</published><updated>2009-03-24T03:51:17.464-07:00</updated><title type='text'>Fundamentals of MultiValue (6)</title><content type='html'>&lt;h3&gt;The View from 20,000 feet&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;In this mini-series I have tried to highlight some of the differences between the MultiValue model as expressed by IBM UniVerse and IBM UniData, and the mainstream relational database model. By the nature of a blog these posts have been high level summaries: as the blog progresses many of these areas will be plumbed in more detail.&lt;br /&gt;&lt;br /&gt;Even so, we have covered a lot of ground and so I thought the time had come to further summarize where we have reached. Call this an Executive Summary, if you like.&lt;br /&gt;&lt;br /&gt;Put simply, Why should you consider UniVerse for your next project?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;MultiValue is Ubiquitous&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The first thing most people say when asked about MultiValue is - "never heard of it".&lt;br /&gt;Don't let that put you off: it may not be as pervasive as SQL Server, but you will find MultiValue applications in every industry, every government sector, every size and shape of application. &lt;br /&gt;&lt;br /&gt;So why don't you get to hear about it? Two reasons.&lt;br /&gt;&lt;br /&gt;First - it is simple, works and is cheap. That's bad news for industry commentators, consultants and anyone who earns a living from technology. Running MultiValue is easy, getting return on investment for running your business on MultiValue is quick, but making money out of MultiValue is hard.&lt;br /&gt;&lt;br /&gt;Second - it is classed as an 'embedded database'. That means you don't - and shouldn't - see it. All you see is the application and the database just works.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;MultiValue is Stable&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The MultiValue data model has been powering mission critical systems for over 40 years. In that time it has been improved and extended but it survives because it got the key things right.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Application Engine&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;MultiValue servers are application engines and database systems rolled into one.&lt;br /&gt;&lt;br /&gt;This makes for a low cost of ownership: no need for three tier solutions, dedicated application servers and complicated rollouts. Inside the MultiValue environment, data and business processing share the same space: making it quicker, cleaner and faster to respond to changes in the way your business operates.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Low, Low Administration&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Remember what I just said about an embedded database? These are systems that keep running invisibly, and cannot afford to stall. Did you know that most MultiValue sites have no dedicated DBAs for their MultiValue systems? &lt;br /&gt;&lt;br /&gt;No wonder the commentators don't like it. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Real World Data Model&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The secret behind the technology: MultiValue data models the real world.&lt;br /&gt;&lt;br /&gt;No messy and costly joins, no need to normalize your data, no need to scatter information across hundreds of tables only to put it back together every time you come to use it. Making your systems easy to understand.&lt;br /&gt; MultiValue data storage is flexible, scalable and resource friendly. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Virtual Data&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Why store what you can derive? And why force developers - and power users - to write complex enquiries to perform even simple calculations?&lt;br /&gt;&lt;br /&gt;Information in the MultiValue world is open through the Dictionary: a reusable store of definitions giving you the information you need, without resorting to costly and time consuming programming. Give your business professionals their own dictionaries and they can build the information they want to see in the way they want to see it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What's in a Name&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The word "MultiValue" was coined to address the fragmentation a generation of vendors had made of marketing the model. &lt;br /&gt;&lt;br /&gt;But today, one of the world's most important names stands behind the leading MultiValue platforms.&lt;br /&gt;&lt;br /&gt;That name: IBM.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-6581079383872968366?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/6581079383872968366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=6581079383872968366' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/6581079383872968366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/6581079383872968366'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2009/03/fundamentals-of-multivalue-6.html' title='Fundamentals of MultiValue (6)'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-2364327175448019414</id><published>2009-03-14T04:27:00.000-07:00</published><updated>2009-03-14T04:29:39.678-07:00</updated><title type='text'>Fundamentals of MultiValue (5)</title><content type='html'>In the previous blogs in this mini-series I have outlined the file store, metadata and the enquiry languages that form three of the four pillars of the MultiValue model. In this blog I will look briefly at the remaining pillar: the development language.&lt;br /&gt;&lt;br /&gt;The MultiValue model is not just about data. It's all about what you do with it.&lt;br /&gt;&lt;br /&gt;Modern databases are generally tied to one task: fetching and storing data. Some of these may use stored procedures to empower this task, but they are not complete application engines. If you want to build a business application, you need to invest in n-tier solutions and application servers to hold your business logic.&lt;br /&gt;&lt;br /&gt;That is hard work, and expensive too.&lt;br /&gt;&lt;br /&gt;The MultiValue model puts the application at the heart of the database. Away with three tier solutions: at your disposal you have a fully formed, high level business language that can handle all the complexity of real solutions. By keeping the business logic in the same space as the database, you not only reduce your costs and simply the development, you can gain in efficiency and scale.&lt;br /&gt;&lt;br /&gt;I'm not going to go through the whole development language here. For that, you can download my free primer &lt;a href="http://212.241.202.162/cms/learnerpack/articles/first_uv_app.pdf"&gt; here&lt;/a&gt;, along with the free Personal Edition of UniVerse from IBM. &lt;br /&gt;&lt;br /&gt;But there are some elements of the language that are pure joy, so I'm going to share some of those.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Direct Data Access&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Updating the data store is a fast, low level operation. No intervening SQL to worry about: just read a record by specifying the key, change it and write it back. To add a new record, just use a different key. Simple and fast. And let the database take care of the rest.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Locking and Contention&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Contention management is the achilles heel of many a relational application. Optimistic locking may be all well in theory, but the practicalities of merging changes (or more often than not, simply rejecting them as the easy option) are subjects for whole volumes in themselves. Yes, tools like Visual Studio may selecting and updating data easy, but even they do not help when it comes to handling contention.&lt;br /&gt;&lt;br /&gt;Because the update logic is on the server, MVDBMS developers can use a granual pessimistic locking model that is robust and far simpler. And if you do need optimistic merging, it's a lot easier with multivalued data than across parent/child tables.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Runtime Binding&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;MVDMBS applications are built up from libraries of external subroutines and functions. These are loaded dynamically on request, so adding to an existing application is childs play. No need to stop and relink the whole app or deploy the whole caboodle to an application server.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Features&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Device control, socket interfaces, XML parsing, SOAP requests, SQL gateways, external C calls: you name it, the language can handle it. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The Language&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;The MVDBMS language is a highly modified and extended version of Basic, that has been specially designed to work with the conventions and data structures that make up the MVDMBS platform. All using a nice high level syntax that is simple to learn and immensely productive.&lt;br /&gt;&lt;br /&gt;Why do people use PHP? Because it is simple, it works, and it gets the job done quickly. Exactly the same reaons people use this language.&lt;br /&gt;&lt;br /&gt;After all, what is the benefit of complicating things with difficult syntax? &lt;br /&gt;It's the business rules lying behind them that really count.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-2364327175448019414?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/2364327175448019414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=2364327175448019414' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/2364327175448019414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/2364327175448019414'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2009/03/fundamentals-of-multivalue-5.html' title='Fundamentals of MultiValue (5)'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-3186539542246145993</id><published>2009-02-26T00:51:00.000-08:00</published><updated>2009-02-26T01:01:27.784-08:00</updated><title type='text'>Molly - definitely a multi-valued dog</title><content type='html'>This week our lives have been turned upside down by the arrival of the latest, four footed member of the family: a five year old labrador collie cross from a rescue centre. Size of a big labrador and temperament of a collie, and we're quickly learning the limitations of her training! &lt;br /&gt;&lt;br /&gt;Molly fills the house. The cat has taken shelter upstairs on our bed all week, surprising since she's normally an evil beast (in the best possible feline way, of course). Fortunately we live in a small Oxfordshire village so open countryside is only a couple of minutes away, otherwise Mollie would just be too big for our tiny house and frenetic lives. &lt;br /&gt;&lt;br /&gt;It's taking time to get used to working with her curled on the mat beside my desk, but the benefits will outweigh the difficulties: the life of a consultant/developer/writer is essentially a sedentary one, especially now my daughters have reached the staying-away and the-only-exercise-I-get-is-on-WII (how that sounds like &lt;em&gt;ennui&lt;/em&gt;) ages respectively. The early morning walk over the lanes (Mollie seems to have a particular propensity for tracking through mud) are almost a tonic to match the double expressos that usually start my day.&lt;br /&gt;&lt;br /&gt;So the mornings are now a chance to reflect before I start on the day's tasks. Thinking time has been in short supply recently, with the pressures to complete contract work, finish the new book and get the next set of products under way. With the result that the latter two have not been progressing as well as they should. Thinking time is important in any project, and stepping back has been difficult.&lt;br /&gt;&lt;br /&gt;Thought for the Day: have a Thought for the Day.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-3186539542246145993?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/3186539542246145993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=3186539542246145993' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/3186539542246145993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/3186539542246145993'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2009/02/molly-definitely-multi-valued-dog.html' title='Molly - definitely a multi-valued dog'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-4475274559926877173</id><published>2009-02-22T08:41:00.000-08:00</published><updated>2009-02-22T09:05:01.289-08:00</updated><title type='text'>Fundamentals of MultiValue (4)</title><content type='html'>In the last instalment I wrote about the Dictionary, the meta-data that resides at the heart of a MultiValue database. The dictionary defines the physical content of the database, and extends this further to encompass virtual and derived information such as common calculations, synonyms and lookups.&lt;br /&gt;&lt;br /&gt;The purpose of the Dictionary is to present as much potential information as possible, in as simple a manner as possible. This user-friendly approach to presenting the system is mirrored in the next piece of the puzzle: the MultiValue Enquiry language.&lt;br /&gt;&lt;br /&gt;Annoyingly, at this point one thing definitely &lt;em&gt;does not&lt;/em&gt; provide for user-friendly content: the protective attitude of the former generation of MultiValue vendors. There is no single, standard way to refer to the enquiry language: each MultiValue platform uses its own, proprietary and usually trademarked name for what is essentially exactly the same facility. The Enquiry language is known as RetrieVe or UniQuery under IBM UniVerse and UniData respectively; for D3 and jBASE we have AQL and jQL; while learning the technologies I used Access, English and Inform. No wonder nobody gets a handle on this technology!&lt;br /&gt;&lt;br /&gt;Whatever you call it, the enquiry language itself is straightforward and flexible. The main commands are the LIST and SORT commands, used as below:&lt;br /&gt;&lt;br /&gt;LIST BOOK_TITLES WITH AUTHOR_NAME LIKE “Eoin...”&lt;br /&gt;SORT BOOK_SALES BY SURNAME BY FORENAME TOTAL BALANCE TOTAL SALES_TAX&lt;br /&gt;&lt;br /&gt;Unlike SQL, which is predicated on a mathematical model and aimed principally at engineers, the MultiValue enquiry languages have always been pitched at power users. Several things distinguish these languages:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;They harness the power of the Dictionary.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;All of the elements referred to in the queries, other than the source file name, are defined through the Dictionary. Meaning that the enquiry languages can leverage real and virtual data using the dictionary expressions. In the first example above, AUTHOR_NAME could be (and for the standard demonstration database, really is) a lookup to another file (the BOOK_AUTHORS file). In the second the SALES_TAX might likewise be calculated from the sales order total.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The point of the dictionary is, that to the end user the derivation of the information is entirely irrelevant so long as the definitions are present. Whilst it is possible to use in-line expressions just as in SQL, there should rarely if ever be a need to do so.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;They are flexible.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;SQL in particular forces a predictable order for a query. In the MultiValue world, these three statements are synonymous and perfectly valid:&lt;br /&gt;&lt;br /&gt;LIST BOOK_TITLES BY DEPT BY GENRE WITH UNITS &gt; 10&lt;br /&gt;LIST BOOK_TITLES WITH UNITS &gt; 10 BY DEPT BY GENRE&lt;br /&gt;LIST BOOK_TITLES BY DEPT WITH UNITS &gt; 10 BY GENRE&lt;br /&gt;&lt;br /&gt;This makes it easier to build up more complex enquiries in pieces as you go.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;They are helpful.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The extent to which this statement in true depends very much on the specific implementation, but generally the MultiValue Enquiry languages will attempt to make sense of what you intend.&lt;br /&gt;&lt;br /&gt;The following, for example, would normally be synonymous:&lt;br /&gt;&lt;br /&gt;LIST BOOK_TITLES WITH GENRE = “HISTORY” OR WITH GENRE = “FANTASY”&lt;br /&gt;LIST BOOK_TITLES WITH GENRE “HISTORY” “FANTASY”&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;They are based on reporting.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Back in the world of fixed pitched printing, the enquiry languages were principally used for reporting. This means that they support a range of layout keywords and handle such useful features as subtotals and detail rows:&lt;br /&gt;&lt;br /&gt;SORT BOOK_TITLES BY DEPT BY GENRE BREAK.ON DEPT_GENRE TOTAL UNITS HEADING “Books in Stock 'D'”&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Books in Stock 22 Feb 2009&lt;br /&gt;&lt;br /&gt;Title......................... Dept &amp;amp; Genre........ Units&lt;br /&gt;My Year                        ADULT-BIOGRAPHY         10&lt;br /&gt;&lt;br /&gt;                               ***                     10&lt;br /&gt;&lt;br /&gt;The 7 Habits of Highly         ADULT-BUSINESS           9&lt;br /&gt;Effective People&lt;br /&gt;Grass Roots Management         ADULT-BUSINESS          12&lt;br /&gt;5 Steps to Successful Selling  ADULT-BUSINESS          15&lt;br /&gt;Principle Centred Leadership   ADULT-BUSINESS          23&lt;br /&gt;The One Minute Manager         ADULT-BUSINESS           1&lt;br /&gt;The Leader in You              ADULT-BUSINESS           4&lt;br /&gt;Elizabeth                      ADULT-BUSINESS           1&lt;br /&gt;7 Steps to Fearless Speaking   ADULT-BUSINESS          18&lt;br /&gt;&lt;br /&gt;                               ***                     83&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Great Expectations             ADULT-CLASSIC            4&lt;br /&gt;The Importance of Being        ADULT-CLASSIC           22&lt;br /&gt;Earnest&lt;br /&gt;David Copperfield              ADULT-CLASSIC            9&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;These are simple examples of a truth: the MultiValue enquiry languages are designed to appeal to business users who want answers from a system.&lt;br /&gt;&lt;br /&gt;Behind these stand one other features that is far more important to the designers of a system. So important, in fact, that it provides the basis for the name '&lt;strong&gt;MultiValue&lt;/strong&gt;'.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;MultiValued Data&lt;/h3&gt;&lt;br /&gt;The relational database model is founded on certain axioms. Like all such models, these axioms are matters of faith and convenience: they provide a fundamental statement of what the model is about, but are not statements of truth beyond that model.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The particular axiom that most separates the MultiValue and Relational models is this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Each row (aka record or tuple) represents a single fact and each row contains information about just one fact.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This may be true in the rarefied atmosphere of mathematical system design but to quote a recent Gartner report; not all data is flat. In fact, the MultiValue model makes extensive use of repeating fields where it makes sense to do so: that is, everywhere you don't want to incur the unnecessary expense of performing parent/child table joins.&lt;br /&gt;&lt;br /&gt;Consider a sales order. In the relational world this is divided into (at least) two tables: one for the order header and one for the order lines. When you need to access it, these need to be joined together once again, an expensive and wasteful operation.&lt;br /&gt;&lt;br /&gt;In the MultiValue world, a sales order is represented by a single file. The order lines are held in repeating fields known as an association. Here is how the MultiValue world might represent a simple sales order:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   Date&lt;br /&gt;   Time&lt;br /&gt;   Customer_Code&lt;br /&gt;   Delivery_address&lt;br /&gt;   Product_Code&lt;br /&gt;   Quantity&lt;br /&gt;   Price&lt;br /&gt;   Line_Total&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In this scheme, the order header is represented by the Date, Time, Customer_Code and Delivery_Address. Note that this does not preclude the use of relations: the Customer_Code would normally point to a customers table just as in a relational model. The Delivery_Address, however, need not be split into separate components (unless it makes sense to do so in the context).&lt;br /&gt;&lt;br /&gt;The order lines are represented by the Product_Code (another foreign key), Quantity, Price and (calculated) Line_Total. These will be repeating fields. Each Product_Code fields might contain zero or many product codes, each with an associated entry in the Quantity and Price fields. Where a field contains multiple entries, these are referred to as 'values' – hence the name, MultiValue.&lt;br /&gt;&lt;br /&gt;This makes it exceptionally easy to access and to manipulate three dimensional data like a sales order without needing to invest in joins. Note that for the following enquiry to work, the calculated LINE_TOTAL automatically vectors the calculation across each MultiValued PRICE and QTY :&lt;br /&gt;&lt;br /&gt;LIST BOOK_SALES SALE_DATE SALE_TIME SURNAME FORENAME TITLE_ID QTY PRICE TITLE_NAME LINE_TOTAL&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Sale Date.. 26 MAY 2005&lt;br /&gt;Sale Time.. 15:30&lt;br /&gt;SURNAME.... MAGGS&lt;br /&gt;FORENAME... CARL&lt;br /&gt;&lt;br /&gt;TITLE_ID QTY PRICE Title............... Line Total&lt;br /&gt;      49   1  9.99 Jingo                      9.99&lt;br /&gt;      47   1 49.99 Harry Potter and the      49.99&lt;br /&gt;                   Goblet of Fire (Book&lt;br /&gt;                   4 - Unabridged 14&lt;br /&gt;                   Audio Cassette Set)&lt;br /&gt;      11   1 12.99 I'm Sorry I Haven't       12.99&lt;br /&gt;                   a Clue: Vol 8 (BBC&lt;br /&gt;                   Radio Collection)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Do repeating fields make sense? Yes: just look at XML.&lt;br /&gt;&lt;br /&gt;In fact, the UniVerse and UniData enquiry languages are specialized to produce XML:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;root&amp;gt;&lt;br /&gt;&amp;lt;book_sales&amp;gt;&lt;br /&gt;&amp;lt;sale_date&amp;gt;26 MAY 2005&amp;lt;/sale_date&amp;gt;&lt;br /&gt;&amp;lt;sale_time&amp;gt;15:30&amp;lt;/sale_time&amp;gt;&lt;br /&gt;&amp;lt;surname&amp;gt;MAGGS&amp;lt;/surname&amp;gt;&lt;br /&gt;&amp;lt;forename&amp;gt;CARL&amp;lt;/forename&amp;gt;&lt;br /&gt;&amp;lt;sale_items-mv&amp;gt;&lt;br /&gt;&amp;lt;title_id&amp;gt;49&amp;lt;/title_id&amp;gt;&lt;br /&gt;&amp;lt;qty&amp;gt;1&amp;lt;/qty&amp;gt;&lt;br /&gt;&amp;lt;price&amp;gt;9.99&amp;lt;/price&amp;gt;&lt;br /&gt;&amp;lt;title_name&amp;gt;Jingo&amp;lt;/title_name&amp;gt;&lt;br /&gt;&amp;lt;line_total&amp;gt;9.99&amp;lt;/line_total&amp;gt;&lt;br /&gt;&amp;lt;/SALE_ITEMS-MV&amp;gt;&lt;br /&gt;&amp;lt;sale_items-mv&amp;gt;&lt;br /&gt;&amp;lt;title_id&amp;gt;47&amp;lt;/title_id&amp;gt;&lt;br /&gt;&amp;lt;qty&amp;gt;1&amp;lt;/qty&amp;gt;&lt;br /&gt;&amp;lt;price&amp;gt;49.99&amp;lt;/price&amp;gt;&lt;br /&gt;&amp;lt;title_name&amp;gt;Harry Potter and the Goblet of Fire (Book 4 - Unabridged 14 Audio Cassette Set)&amp;lt;/title_name&amp;gt;&lt;br /&gt;&amp;lt;line_total&amp;gt;49.99&amp;lt;/line_total&amp;gt;&lt;br /&gt;&amp;lt;/SALE_ITEMS-MV&amp;gt;&lt;br /&gt;&amp;lt;sale_items-mv&amp;gt;&lt;br /&gt;&amp;lt;title_id&amp;gt;11&amp;lt;/title_id&amp;gt;&lt;br /&gt;&amp;lt;qty&amp;gt;1&amp;lt;/qty&amp;gt;&lt;br /&gt;&amp;lt;price&amp;gt;12.99&amp;lt;/price&amp;gt;&lt;br /&gt;&amp;lt;title_name&amp;gt;I'm Sorry I Haven't a Clue: Vol 8 (BBC Radio Collection)&amp;lt;/title_name&amp;gt;&lt;br /&gt;&amp;lt;line_total&amp;gt;12.99&amp;lt;/line_total&amp;gt;&lt;br /&gt;&amp;lt;/SALE_ITEMS-MV&amp;gt;&lt;br /&gt;&amp;lt;/book_sales&amp;gt;&lt;br /&gt;&amp;lt;/root&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;XML, with its support for nested entities, is a perfect fit for the MultiValue model. Coupled with client side technologies like LINQ for XML, this is fast becoming the route of choice for MultiValue developers in extracting and sharing data.&lt;br /&gt;&lt;br /&gt;So have we finished our tour of the fundamentals of MultiValue here? Not yet! The enquiry languages are used for just what their names suggest – for enquiring on the information in the system. To manipulate that information, these platforms do not use queries. In the next instalment I will write about the server side development language that turns these into a scalable and efficient business platform.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-4475274559926877173?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/4475274559926877173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=4475274559926877173' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/4475274559926877173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/4475274559926877173'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2009/02/fundamentals-of-multivalue-4.html' title='Fundamentals of MultiValue (4)'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-4189599601053944292</id><published>2009-02-07T03:07:00.000-08:00</published><updated>2009-02-07T03:56:57.151-08:00</updated><title type='text'>Fundamentals of MultiValue (3)</title><content type='html'>In my last post I blogged about the MultiValue file store. In this post I will introduce one of the four defining aspects of a MultiValue system - the file dictionary. &lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;MultiValue files, unlike traditional database entities, may or may not define their content. For the most part, having a full content definition for files that contain regular data, such as customers or sales orders, is a good thing. But that raises an interesting question - just what is a full content definition?&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Defining Information&lt;/h3&gt;&lt;div&gt;For a database engineer this would simply indicate the physical file content and its data types, with possibly a few constraint thrown in for good measure. But that isn't really the full story.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;For one, the same content may mean different things to different people, or to different groups within an organization. A payments department might refer to a customer identifier as an account code, where the same identifier might be known as a client code to the sales team. Subtle distinctions, perhaps, but these things can be politically important and can cause confusion. &lt;/div&gt;&lt;br /&gt;&lt;div&gt;Sometime data has different meanings in different contexts, or may require different forms of presentation. A simple thing like a date might require different formatting for reports, exports to third party systems, or analysis based on periods. A code might be built up from several pieces of useful information, as in the case where an accounting period and department mnemonic form part of an invoice reference: in some instances this may need to be seen as a whole or in others broken into its constituent parts.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Even then, you are only looking at a very small subset of the information that is potentially available. Where a file contains base data, what about all the information that can be derived from it? If an order detail line holds a quantity, price and tax code it makes sense to calculate the line totals before and after tax, and to make that part of the &lt;em&gt;'information domain'&lt;/em&gt; as the academics like to call it.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;A file may include data that forms relations to other data. Not just between files in the case of a foreign or shared key that can be used as a lookup - like a relational join or a vlookup() in a spreadsheet - but also between fields in the same file that naturally form groupings. A file holding a full specification of customer details might include the title, first name and last name for a customer: together these form a grouping that makes up the full customer name.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;As you can see, it is possible to enhance the information available about a file content beyond just a listing of the physical data: but with that comes resposibilities. As the information domain extends, so does the need for control. Not all departments may be privileged to see all of the information; some may be meaningless or only required in special circumstances. Creating customized subsets of that information can help to maintain security and makes the content presented easier to navigate.&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;The Dictionary&lt;/h3&gt;&lt;div&gt;All this is handled by the Dictionary in a MultiValue system.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Every file in the system has - potentially at any rate - at least one and possibly several associated dictionaries, through which the developer or DBA, and in some cases power users, can make sense of the content of the system.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;A dictionary contains four types of definitions:&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;Data Definitions&lt;/strong&gt; deal with the real stuff held in the file. These act like the column definitions in a SQL schema, describing the data content, format, type and size. Recall, however, that not all columns need to be defined, and not all may be defined across all dictionaries: only the ones that are actually useful.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;Synonym Definitions&lt;/strong&gt; present the same content under different names, or providing different formatting. Here you might specify alternate date and period formats, extract meaningful pieces from composite codes, handle issues of casing or number formatting.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;Association Definitions&lt;/strong&gt; identify groupings of fields within the file. These act as shortcuts and as controllers for complex data. &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;Interpreted Definitions&lt;/strong&gt; are the most potent symbol of the MultiValue model. These define virtual content: information that is derived from the real data either by means of calculations or lookups. An Interpreted Definition might perform a calculation, retrieve a piece of related information from a secondary file by means of a join or call a stored procedure. &lt;/div&gt;&lt;br /&gt;&lt;div&gt;In a perfect world, a Dictionary should lay out everything you might need to know or understand based on a file - not just the content, but the whole information domain that can be derived from that file. No need for the enquirer to understand and to navigate the underlying data model. No need to resort to views or joins. All there, conveniently held in one place.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Enough theory - let us consider an example of a simple sales order. In a relational database, this might be presented as a set of related tables:&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;img id="BLOGGER_PHOTO_ID_5300019838843506370" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 381px; CURSOR: hand; HEIGHT: 363px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_pZlbX6rhC4s/SY1z9nTKTsI/AAAAAAAAAAc/8TDamzHpUuw/s400/mvbasis1.gif" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;In a MultiValue database this is presented in a single dictionary, providing access to the related information and adding calculated content:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5300020363209835010" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 322px; CURSOR: hand; HEIGHT: 235px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_pZlbX6rhC4s/SY10cIt1ggI/AAAAAAAAAAk/Ea7Q65fhISg/s400/mvbasis2.gif" border="0" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Dictionaries make the system easy to understand, and easy to extend. If new information is required, it may be just a simple definition away: consider the effect of this on the cost of running a MultiValue system as opposed to the cost of making programming changes or employing costly database architects to craft new views and enquiries.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Dictionaries are more than just metadata. They are about making the system approachable and easy to use. In this spirit they are the driving force behind the second defining aspect of a MultiValue system and the subject of my next post: the user-friendly enquiry language.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-4189599601053944292?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/4189599601053944292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=4189599601053944292' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/4189599601053944292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/4189599601053944292'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2009/02/fundamentals-of-multivalue-3.html' title='Fundamentals of MultiValue (3)'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_pZlbX6rhC4s/SY1z9nTKTsI/AAAAAAAAAAc/8TDamzHpUuw/s72-c/mvbasis1.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-4190038992869724018</id><published>2009-01-21T12:31:00.000-08:00</published><updated>2009-01-22T00:56:33.069-08:00</updated><title type='text'>Fundamentals of MultiValue (part 2)</title><content type='html'>In my last post, I promised to explain more about 'MultiValue' as a data model. So in this post I will start our tour of the fundamental aspects of this technology.&lt;br /&gt;&lt;br /&gt;MultiValue systems are generally referred to as 'databases', and are sometimes given the designation 'MVDBMS' (MultiValue DataBase Management Systems) to differentiate them from Relational Databases (usually with the RDBMS acronym).&lt;br /&gt;&lt;br /&gt;I always feel uncomfortable with this designation since the term '&lt;em&gt;database&lt;/em&gt;' conjures up a set of expectations about what the technologys is expected to deliver - and, more to the point, what it does not deliver. The fact is, MultiValue platforms generally offer a much wider range of functionality, and play a much fuller participatory role in their solutions, than you might expect from a simple 'database'. For this reason, I prefer to refer to these as '&lt;em&gt;business platforms&lt;/em&gt;', being a more accurate reflection of the jobs that they perform.&lt;br /&gt;&lt;br /&gt;However, MultiValue platforms do share some similarities with mainstream databases, not least of which are the central roles played by the data storage and enquiry facilities. So it seems reasonable to begin our tour with the most basic aspect of the model: the data store.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;The Data Store&lt;/h4&gt;Data storage and retrieval sits at the heart of the MultiValue model. MultiValue platforms have their own fully featured data store containing at first glance all the elements you might associate with any data model: files (tables), indices, records (rows) and fields (columns). Some MultiValue databases - notably IBM UniVerse - even offer out-of-the-box support for the most popular enquiry language - SQL - making them appear instantly familiar to database users.&lt;br /&gt;&lt;br /&gt;However, this is really giving a false impression: these are not relational databases and designing a MultiValue database using standard data modelling and applying the normal techniques of relational theory will end up in tears. Under the hood the storage and retrieval models are very different. UniVerse SQL may follow standard syntax, but this is still using the features of the MultiValue architecture.&lt;br /&gt;&lt;br /&gt;To understand how this makes a difference consider this: a truck and a Formula 1 racing car both have wheels, gears, axles and engines; both can be driven on the road or track; but the designs for each are aimed at different solutions. A Formula 1 car may be much quicker, but might not be the best choice for towing a heavy load! MultiValued data is often heavily loaded with information, and so is designed to be accessed in a particular way: and that often counts against the database when used with industry standard protocols such as ODBC. To understand further, we first need to understand the difference in layout between a mainstream database and the MultiValue file and record structures.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Files and Records&lt;/h4&gt;MultiValue platforms hold data in files. These are similar in nature to tables in other databases, but with one very important difference: in a mainstream database, tables are created based on a definition of the structure of their content. In a MultiValue database, they are not.&lt;br /&gt;&lt;br /&gt;If you wish to create a new table in a relational database, the tool of choice is the SQL CREATE TABLE command:&lt;br /&gt;&lt;br /&gt;CREATE TABLE MYTABLE&lt;br /&gt;(ID INT NOT NULL PRIMARY KEY,&lt;br /&gt;SOME_NAME VARCHAR,&lt;br /&gt;SOME_DATE DATE);&lt;br /&gt;&lt;br /&gt;The CREATE TABLE command is a slight misnomer since it is really not defining the table at all, but rather defines the column structure of the rows that will make up the data in that table. It may be extended to hold details about the storage patterns, volume placement and other paraphernalia associated with a particular database, but its primary purpose is to set out the data layout. Once defined, only data that supports that structure can be stored in that table: the table is said to be 'homegeneous'.&lt;br /&gt;&lt;br /&gt;MultiValue databases define files based on storage structure alone. The equivalent CREATE.FILE statement labels the file and determines the internal structure (more on which later) and optionally the initial storage size to reserve for best performance.&lt;br /&gt;&lt;br /&gt;CREATE.FILE MYFILE DYNAMIC&lt;br /&gt;&lt;br /&gt;The CREATE.FILE statement does not define the data layout. Why should this be?&lt;br /&gt;&lt;br /&gt;MultiValue files hold data in the form of records, each of which is identified by a primary key and each of which can be subdivided into its constituent fields.&lt;br /&gt;&lt;br /&gt;But here is the first shock - a MultiValue datastore does not require you to define the data you will be holding. In fact, the MultiValue model explicitly allows you to create files that have no known layout, and to use these to store records that can be accessed generically, without regard to the column layouts or to data types.&lt;br /&gt;&lt;br /&gt;That may seem a very uncomfortable concept for DBAs - after all, if you cannot define the format how can you have faith in the structure? Avoiding the obvious corrollary - that plenty of systems founded on relational databases seem to end up with problems and cost overruns despite the strong definitions - the fact is that the MultiValue model &lt;b&gt;does&lt;/b&gt; allow you to define the data format, but &lt;b&gt;does not&lt;/b&gt; make that definition mandatory or prescriptive. And just as the ability to use generic or variant types has its uses in programming languages (where appropriate), so there are some real advantages to that in the data store.&lt;br /&gt;&lt;br /&gt;For example, it enables MultiValue developers to design files that are not necessarily homogeneous. Not all data held in a system is structured: look into any sizeable application and you will find it littered with parameter records, control values, settings - either sitting in tables with single rows, tables offering key/value pairings or shipped out into INI or XML files. In a MultiValue system, these control records can reside side by side in a general parameter file.&lt;br /&gt;&lt;br /&gt;Second, it allows developers to use data stores whose content is not known until run time. These may be work files, intermediate files used during processing or more often files used for the storage and manipulation of data that flows through the system from elsewhere. If the data store does not require the layout to be known, it opens the door for the application logic to work easily with 'soft-coded' data definitions - such as the definitions of streams of data that may be captured from external systems, and even 'dirty' data that needs to be cleansed and formalized before sending it on. Because of this, the MultiValue model can be used as a foundation for complex data analysis, transformation and extraction tools, rules based systems and anywhere that the data formats are defined based on context.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;One particular advantage of this can be found in the use of systems development tools. Using generic data stores makes it possible to build applications that are themselves data interpreters - leading to a market in which fourth generation languages and advanced system generation tools play a prominent role, being able to harness the ability to work with such generics at the storage and enquiry levels whilst applying their own rules and interpretations of the data at a higher level. 4GLs and interpreted systems have had occasional renaissances amongst RDBMS vendors, but often have to fight against the restrictions imposed by the data model, rather than working comfortably with them.&lt;br /&gt;&lt;br /&gt;There are other uses for opaque data structures, but the most powerful one is this: the MultiValue model forces a separation of the definition of the data (the '&lt;em&gt;metadata&lt;/em&gt;') from the data itself. An equivalent in the mainstream world might be the separation of a DTD or schema from an XML document. By separating the two, and by removing the dependencies between the storage and definition of the data, the model is better adapted to suit the ever changing nature of data-centered operations in the real world.&lt;br /&gt;&lt;br /&gt;This separation opens up a whole realm of opportunities for presenting and shaping information based on context, including the ability to derive 'virtual' data from the information held in the data store. This in turn makes it far easier (and therefore cost-effective) for building agile systems that can quickly respond to changing requirements and to supporting new business processes.&lt;br /&gt;&lt;br /&gt;And that will be the subject of the next post when we will take a look at the metadata and enquiry languages.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-4190038992869724018?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/4190038992869724018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=4190038992869724018' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/4190038992869724018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/4190038992869724018'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2009/01/fundamentals-of-multivalue-part-2.html' title='Fundamentals of MultiValue (part 2)'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-1293415729656233495</id><published>2009-01-01T06:00:00.000-08:00</published><updated>2009-01-04T05:58:13.263-08:00</updated><title type='text'>About MultiValue (Part 1)</title><content type='html'>First and foremost, Happy New Year to everyone!&lt;br /&gt;&lt;br /&gt;You may - I hope - have noticed the title of this blog and be curious as to the meaning of the term 'MultiValue'. So before I pursue my musings further, let me set out my stall and explain the derivation and compass of this technology.&lt;br /&gt;&lt;br /&gt;Now this is too large a task for a single posting, so I will take pity on my readers and break this down into bite sized pieces. In this series I will do my best to define terms, encourage you to take an interest in this model, and point out some of the advantages (and occasional disadvantages) it offers over other, more widely understood, data practices. All opinions will, of course, be my own.&lt;br /&gt;&lt;br /&gt;The term MultiValue refers to a database model, and more.&lt;br /&gt;&lt;br /&gt;The term was first coined by Gus Giobbi, then editor of &lt;a href="http://www.intl-spectrum.com/"&gt;International Spectrum Magazine&lt;/a&gt;, as a shorthand through which to refer to a wide range of products from a number of disparate suppliers, all of which shared the same data model and, to a large extent, the same technologies and languages.&lt;br /&gt;&lt;br /&gt;Unfortunately, each of these manufacturers had for a long time pushed their own proprietary derivations of the same data model: a situation not unlike the relational world at that time, but with the significant exception that these manufacturers were doing their utmost not to even acknowledge the existence of their competitors. So unlike the relational world in which elements like SQL form a well -known standard (albeit with many different variations), in this technology group there were no standard terms that were not trademarked to one or other manufacturer, and no standard way in which to refer to the technology in a generic way.&lt;br /&gt;&lt;br /&gt;This led to two practical problems:&lt;br /&gt;&lt;br /&gt;1. Speaking about MultiValue becomes a pain in the backside, when referring to a key part of the technology such as the enquiry language means reeling off a list of different names to ensure the whole audience understands what the speaker is talking about.&lt;br /&gt;&lt;br /&gt;2. For outsiders, it appears even today that this is a small and localized set of technologies. Without a standard name, commentators cannot get a sense of the actual size and impact of this market.&lt;br /&gt;&lt;br /&gt;The story of the MultiValue industry is an interesting (and often debated) one: Dawn Wolthuis of &lt;a href="http://www.tincat-group.com/"&gt;Tincat Group &lt;/a&gt;has done a great job in researching this topic. Suffice it to say that MultiValue technology is found in every industry sector, in every size of company from one or two user systems to systems with tens of thousands of concurrent users, from finance to manufacture, ecommerce, government and military, education, publishing, healthcare - whatever sector you choose to name, there will be MultiValue systems in evidence, usually in mission critical capacities.&lt;br /&gt;&lt;br /&gt;So why is the technology so little known?&lt;br /&gt;&lt;br /&gt;The blame for this can be laid at two doors: the MultiValue vendors and the technology.&lt;br /&gt;&lt;br /&gt;For most of its history, vendors have fought over the MultiValue market rather than taking an active role in attempting to increase it. The lack of any central marketing for the technology - in the way of a marketing board or a single nomenclature - has left it lagging far behind the public consciousness.&lt;br /&gt;&lt;br /&gt;Technically, MultiValue is also a peculiar victim of its own success. MultiValue systems suffer from being exceptionally stable and feature rich. A typical MVDBMS (to give the regular abbreviation) requires little to no maintenance, and may run for years with nothing more than an automated backup routine to concern those using the system. I often liken MVDBMS to a highly capable secretary, doing his or her work quietly in the background, and consequently frequently overlooked. Systems that need constant hand-holding are meat and drink to consultants and to the assembled ranks of the IT industry, and so tend to get high profiles. Systems that just work make it difficult to pay the bills!&lt;br /&gt;&lt;br /&gt;MVDBMS is primarily an embedded technology - hence the requirement for exceptional stability - and so end users are generally aware of the applications being supported by the technology as opposed to the technology itself.&lt;br /&gt;&lt;br /&gt;Today, the MultiValue market has consolidated into a handful of significant vendors. Top of that list is IBM, with the lions share of the market and two of the leading MVDBMS platforms - UniVerse and UniData. To assist in the general confusion, some bright spark in IBM Marketing decided that combining the two under the marketing name of U2 would be a good idea, and we have suffered from that insanity ever since. Most of my posts will concentrate on these two platforms, since they form most of my work.&lt;br /&gt;&lt;br /&gt;There are alternatives however that deserve a mention: OpenInsight from Revelation Technologies is a PC based MVDBMS with a significant and loyal following; OpenQM is an open-source offering from Ladybridge Systems; jBASE has a high profile in the banking sector in particular; D3 from Raining Data/Tiger Logic is still found in many industries; and there are a number of smaller systems enjoying a long shelf life.&lt;br /&gt;&lt;br /&gt;What these have to offer, and why the name 'MultiValue' came about, will be the subject of the next post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-1293415729656233495?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/1293415729656233495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=1293415729656233495' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/1293415729656233495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/1293415729656233495'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2009/01/about-multivalue-part-1.html' title='About MultiValue (Part 1)'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-8289088208971675849</id><published>2008-12-21T05:02:00.000-08:00</published><updated>2008-12-21T05:28:53.952-08:00</updated><title type='text'>UniRPC and Security</title><content type='html'>No blog last weekend since I was reminded by Clif Oliver that it was a submission deadline for &lt;a href="http://www.intl-spectrum.com/"&gt;International Spectrum Magazine&lt;/a&gt;. Spectrum has long waved the MultiValue banner, and I will be posting a short history of the magazine and the organization in a later blog.&lt;br /&gt;&lt;br /&gt;Security has been on my mind this week, prompted by two rather different incidents.&lt;br /&gt;&lt;br /&gt;The first was taking the train into London from my home in Oxfordshire, something I am forced to do all too frequently. I habitually sit in the quiet carriage, which for those unfamiliar with our creaking rail system, is a carriage in which mobile phones, personal stereos and loud conversation are banned whilst commuters sleep, read or consult their notebooks. This particular morning a chap in the seat in front of mine was reading some papers, clearly unaware that there was anyone behind him. The papers were labelled 'RESTRICTED' and from the glance I took related to the foreign office. Had I wished (and I will quickly point out that I had better things to do) I could have easily read every word.&lt;br /&gt;&lt;br /&gt;The second was a posting on the U2-Users list from a colleague on the U2UG board, asking whether the UniRPC protocol had been published. UniRPC is the underlying protocol used to connect to UniVerse and UniData databases, and chance would have it that I had asked exactly the same question of IBM on various occasions over the last few years, and for exactly the same reason: to create a PHP driver direct to the UniRPC deamon without the need to install UniObjects or InterCall.&lt;br /&gt;&lt;br /&gt;Each time I have asked for this the result has been negative.&lt;br /&gt;&lt;br /&gt;There are other ways to connect PHP with IBM U2: using the java or COM bridges to run UniObjects or WebDE or by calling U2 web services, but these are not always practical particularly for systems that use external hosting. Plus IBM's insistance on penalizing developers wanting to build web based solutions by requiring connection pooled licences makes web services an expensive option. Personally I think IBM are shooting themselves in the foot with this policy - no other database vendor requires this, and hosted solutions are the best option for the future of U2, since they play to the traditional strengths of fast, low level data access and minimal resource consumption coupled with a application-centric and feature rich runtime.&lt;br /&gt;&lt;br /&gt;Returning to the theme, however: I suggested that the protocol could be easily worked out from tracing the network. I have traced UniObjects in the past for support reasons and the traffic is easily readable: it would take time but not too much work to deconstruct the protocol.&lt;br /&gt;&lt;br /&gt;Which led me to think -&lt;br /&gt;&lt;br /&gt;a) how many U2 sites are running the UniRPC daemon/service without SSL?&lt;br /&gt;b) how many administrators are running UniRPC without realizing the hole it makes in their security?&lt;br /&gt;&lt;br /&gt;Most U2 administrators are traditionalists: that combined with the age of most U2 applications mean that security is too often considered from the point of the application (menu options, for example). UniObjects blows a hole in that - from a UO connection (easy from any Windows PC) anyone with authority to connect to the server can browse, view and update any part of the application. UniData offers some security with the (helpfully undocumented) UOLOGIN subroutine that can deny UniRPC access to an account based on logic. UniVerse does not seem to have such a beast. At the very least, adminstrators should be implementing the Data Encyption At Rest functionality now available for sensitive U2 data.&lt;br /&gt;&lt;br /&gt;Like the chap reading restricted material on the train, many U2 administrators may be unwittingly leaving the door open for anyone to view their systems. That is a frightening thought.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-8289088208971675849?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/8289088208971675849/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=8289088208971675849' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/8289088208971675849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/8289088208971675849'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2008/12/unirpc-and-security.html' title='UniRPC and Security'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-3172882380240460463</id><published>2008-11-28T00:21:00.000-08:00</published><updated>2008-11-28T00:51:00.200-08:00</updated><title type='text'>New Toy</title><content type='html'>I have a new toy.&lt;br /&gt;&lt;br /&gt;I've finally settled - at least for now - on a Samsung NC10 to take on the train. A fraction of the price of the Vaio, and so following a quick (and easy) memory upgrade, a not-so-quick Vista Ultimate installation, a slow Visual Studio 2008 setup and the inevitable wait-for-geological-time VS SP1 upgrade (why does it take sooooo long), and I'm ready for action.&lt;br /&gt;&lt;br /&gt;With, of course, a copy of IBM UniVerse and Silverlight.&lt;br /&gt;&lt;br /&gt;I've been waiting for Silverlight for a long time. Not specifically that product, but for an RIA that is really pitched at developers. There have been some good toolkits - OpenLaszlo and the excellent GOA WinForms for example - but even these haven't quite hit the spot. OpenLaszlo was too limited, and GOA - at the time - too tied into its own technology.&lt;br /&gt;&lt;br /&gt;Flash, of course, has ruled the roost for a long time, but has never hit the developer spot: ActionScript just doesn't read like a real language and the IDEs were too - foreign - to developers weaned on C++, Delphi and Visual Studio. And when it comes to IBM U2, products like mvScript and WebDE can make use of AJAX but it's a lot of work for little real reward.&lt;br /&gt;&lt;br /&gt;When we designed mvQuery for MultiValue databases such as IBM UniVerse and IBM UniData, we were hamstrung by our decision to make the product into a real reporting tool - one that generated complex reports, not just simple tables of results. That of course meant building a report designer, and one that was powerful enough to handle the vagaries (for which read massive flexibility) of the MultiValue data model. And that meant using an environment that offfered the level of user interaction required by a graphical report painter. And that, in turn, meant that it could not be web based. We did, eventually, settle on a compromise: developers and power users got the Windows based client to design the reports, and other users got a web based tool through which they could schedule and run those reports, either viewing or emailing the results as PDF.&lt;br /&gt;&lt;br /&gt;Now, at long last, Microsoft has stepped up to the mark with a full technology stack for RIAs that suits the needs of designers and developers alike, and I have started work full throttle on a new reporting tool that will both deliver and design UniVerse and UniData reports through Silverlight.&lt;br /&gt;&lt;br /&gt;It's been a long time since programming has been fun, and I'm looking forward to this one.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-3172882380240460463?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/3172882380240460463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=3172882380240460463' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/3172882380240460463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/3172882380240460463'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2008/11/new-toy.html' title='New Toy'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-489255908991573484</id><published>2008-11-23T10:00:00.000-08:00</published><updated>2008-11-23T10:00:02.764-08:00</updated><title type='text'>Has Sony Gone Mad?</title><content type='html'>I've been looking for a new laptop for the past weeks, and it is not proving easy.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;On my desk at the moment I have two laptops: an IBM ThinkPad and a Sony Vaio. The two premier brands of the laptop world, according to most reviewers. (I wouldn't consider anything without reading &lt;a href="http://www.trustedreviews.co.uk/"&gt;trusted reviews&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The ThinkPad is a workhorse: solid construction, professional and practical, a laptop that oozes confidence. The Vaio is - well, you must know what Vaios are like. Pure beauty.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;That is where the real difference comes. The ThinkPad I can use - but it simply does not make me feel the same way as the Vaio. When I get out the Vaio it just feels special. And it makes me feel special. It is expensive, yes, but that feeling is a price worth paying given the hours I spend in front of the screen.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;But - the TT series? I could fall in love with that - except for the insane pricing. A couple of hundred pounds extra for an SDD would be reasonable, but almost six hundred for that upgrade? Two hundred pounds for an extra two GB RAM? And all for a machine that is slower and heavier than the Samsung NC10 - at almost two thousand pounds less.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sorry Sony, but not this time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-489255908991573484?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/489255908991573484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=489255908991573484' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/489255908991573484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/489255908991573484'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2008/11/has-sony-gone-mad.html' title='Has Sony Gone Mad?'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5316557363652281135.post-8272674652900002941</id><published>2008-11-22T05:53:00.000-08:00</published><updated>2008-11-22T06:04:23.744-08:00</updated><title type='text'>Starting Out</title><content type='html'>Well I guess it had to happen sooner or later.&lt;br /&gt;&lt;br /&gt;Three things convinced me to finally start a blog:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A request from IBM, who had noticed that my profile as an IBM Data Champion did not include a blog entry. As if the website(s), books and wiki weren't enough.&lt;/li&gt;&lt;li&gt;Reading the thoughts of an old friend, Robert Altinger, on his &lt;a href="http://blog.altinger.com/"&gt;blog&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;The feeling that the U2UG may be back on track again.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The latter probably needs some explanation.&lt;br /&gt;&lt;br /&gt;For the last months we have been floundering a little - we have all been busy with other matters, I've been occupied writing the first two volumes of my &lt;a href="http://www.brianleach.co.uk/publications.htm"&gt;series&lt;/a&gt; on IBM UniVerse, and more importantly, we have lost Janet Oswald, our IBM liaison, who has gone on to better things with a fully deserved promotion. We wish her every success.&lt;br /&gt;&lt;br /&gt;This week we met our new liaison - Martha, whose background includes previously working for the Informix user group. Having IBM attend the board meetings is crucial in meeting our obligations to act as a conduit between the U2 technology users and IBM.&lt;br /&gt;&lt;br /&gt;There is plenty of work to be done at U2UG: the website, whilst functional, needs a redesign; the wiki needs serious content and there are moves afoot to extend the Learner Pack with samples using as many U2 technologies as possible.&lt;br /&gt;&lt;br /&gt;So there should be exciting times ahead.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5316557363652281135-8272674652900002941?l=mvdeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mvdeveloper.blogspot.com/feeds/8272674652900002941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5316557363652281135&amp;postID=8272674652900002941' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/8272674652900002941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5316557363652281135/posts/default/8272674652900002941'/><link rel='alternate' type='text/html' href='http://mvdeveloper.blogspot.com/2008/11/starting-out.html' title='Starting Out'/><author><name>Baffled</name><uri>http://www.blogger.com/profile/05623711922784150913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
