<?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-5898656634524000127</id><updated>2011-12-12T04:26:59.911-08:00</updated><title type='text'>Precision Software Design, LLC</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://precisionsoftware.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5898656634524000127/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://precisionsoftware.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Michael Hewitt</name><uri>http://www.blogger.com/profile/17165187461688431759</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>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5898656634524000127.post-4089041454824039534</id><published>2009-05-13T14:34:00.001-07:00</published><updated>2009-05-13T14:55:56.300-07:00</updated><title type='text'>FileSystemWatcher Done Right.</title><content type='html'>For some reason the FileSystemWatcher (aka ChangeNotify) in Windows is just not right.  If you search for this in on the internet, you'll find tons of issues with people attempting to use it and running into problems.  A couple of the top issues:&lt;br /&gt;&lt;br /&gt;* The FileSystemWatcher calls multiple times on a single change.&lt;br /&gt;* It does not call when certain programs change the file.&lt;br /&gt;* If my process changes the file, the FileSystemWatcher calls me.  How do I know I was the only one who changed it (and someone else didn't slip in after I called Close()).&lt;br /&gt;&lt;br /&gt;I built the following class to encapsulate all of these issues, and to do file watching correctly.&lt;br /&gt;&lt;br /&gt;The only things you need to know:&lt;br /&gt;* Create a FileWatcher on a file on the disk.  If it changes by an external process, you will get called once per change.&lt;br /&gt;* If this process needs to write the file, call the FileWatcher's CloseFileInThisProcess() method when ready to close the file.  This will ensure you don't get called when you change the file.&lt;br /&gt;&lt;br /&gt;This is written for WPF.  The only reason that matters is because of the threading issues.  It can easily be tweaked for WinForms.&lt;br /&gt;&lt;br /&gt;There is an example usage following the code.&lt;br /&gt;&lt;br /&gt;&lt;font size="1"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    /// &lt;summary&gt;&lt;br /&gt;    /// This filewatcher works around the 'issues'&lt;br /&gt;    /// with Window's file watcher .NET FileSystemWatcher&lt;br /&gt;    /// or Win32::ChangeNotify).  This code is written for&lt;br /&gt;    /// WPF, but can be tweaked to work with Winforms as well.&lt;br /&gt;    /// &lt;br /&gt;    /// It solves these two main problems:&lt;br /&gt;    /// * The FileSystemWatcher calls multiple times on&lt;br /&gt;    ///   a single change.&lt;br /&gt;    /// * If my process changes the file, the&lt;br /&gt;    ///   FileSystemWatcher calls me.&lt;br /&gt;    /// &lt;br /&gt;    /// It solves the former by using a 100 ms timer to&lt;br /&gt;    /// collapse multiple calls into a single call.  It&lt;br /&gt;    /// solves the latter by storing the file size and&lt;br /&gt;    /// time when this process writes a file, and&lt;br /&gt;    /// comparing this to the values when notified by&lt;br /&gt;    /// FileSystemWatcher.&lt;br /&gt;    /// &lt;br /&gt;    /// Usage is straightforward, except that you must&lt;br /&gt;    /// call CloseFileInThisProcess when you are closing&lt;br /&gt;    /// the file that this watcher is watching.  It will&lt;br /&gt;    /// carefully close the file in such a way that it&lt;br /&gt;    /// can later tell if the change was by this process&lt;br /&gt;    /// or another.&lt;br /&gt;    /// &lt;br /&gt;    /// &lt;/summary&gt;&lt;br /&gt;    public class FileWatcher : FileSystemWatcher&lt;br /&gt;    {&lt;br /&gt;        public delegate void FileChangedHandler(string filepath);&lt;br /&gt;        public FileWatcher(string filepath, FileChangedHandler handler) : &lt;br /&gt;            base(System.IO.Path.GetDirectoryName(filepath), &lt;br /&gt;            System.IO.Path.GetFileName(filepath))&lt;br /&gt;        {&lt;br /&gt;            FilePath = filepath;&lt;br /&gt;            Handler = handler;&lt;br /&gt;            NotifyFilter =&lt;br /&gt;                NotifyFilters.FileName |&lt;br /&gt;                NotifyFilters.Attributes |&lt;br /&gt;                NotifyFilters.LastAccess |&lt;br /&gt;                NotifyFilters.LastWrite |&lt;br /&gt;                NotifyFilters.Security |&lt;br /&gt;                NotifyFilters.Size;&lt;br /&gt;            Changed += new FileSystemEventHandler(delegate(object sender, FileSystemEventArgs e)&lt;br /&gt;            {&lt;br /&gt;                System.Windows.Application.Current.Dispatcher.BeginInvoke(&lt;br /&gt;                    new VoidDelegate(this.FileChanged));&lt;br /&gt;            });&lt;br /&gt;            UpdateFileInfo();&lt;br /&gt;            Timer = new Timer(100);&lt;br /&gt;            Timer.AutoReset = false;&lt;br /&gt;            Timer.Elapsed += new ElapsedEventHandler(delegate(object sender, ElapsedEventArgs e)&lt;br /&gt;            {&lt;br /&gt;                System.Windows.Application.Current.Dispatcher.BeginInvoke(&lt;br /&gt;                    new VoidDelegate(this.TimerElapsed));&lt;br /&gt;            });&lt;br /&gt;            EnableRaisingEvents = true;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// This only works with StreamWriters.  You may need&lt;br /&gt;        /// to make your own version for whatever writer you are&lt;br /&gt;        /// using.&lt;br /&gt;        /// &lt;br /&gt;        /// How this works:  It stores the file size before&lt;br /&gt;        /// calling close.  Then, after close it grabs the write&lt;br /&gt;        /// time.  There is a minute corner case here:  If&lt;br /&gt;        /// another process gets in and writes the file after&lt;br /&gt;        /// the close, but before the GetLastWriteTime call, and the &lt;br /&gt;        /// file is the same length, we will not detect the change.  &lt;br /&gt;        /// If that is critical, one could do a checksum on the file....&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        public void CloseFileInThisProcess(StreamWriter writer)&lt;br /&gt;        {&lt;br /&gt;            writer.Flush();&lt;br /&gt;            LastFileLength = writer.BaseStream.Length;&lt;br /&gt;            writer.Close();&lt;br /&gt;            LastWriteTime = File.GetLastWriteTime(FilePath);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        void UpdateFileInfo()&lt;br /&gt;        {&lt;br /&gt;            var fileInfo = new FileInfo(FilePath);&lt;br /&gt;            LastWriteTime = fileInfo.LastWriteTime;&lt;br /&gt;            LastFileLength = fileInfo.Length;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public delegate void VoidDelegate();        &lt;br /&gt;                &lt;br /&gt;        void FileChanged()&lt;br /&gt;        {&lt;br /&gt;            var fileInfo = new FileInfo(FilePath);&lt;br /&gt;            if (LastWriteTime != fileInfo.LastWriteTime || LastFileLength != fileInfo.Length)&lt;br /&gt;                if (!Timer.Enabled)&lt;br /&gt;                    Timer.Start();            &lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        void TimerElapsed()&lt;br /&gt;        {&lt;br /&gt;            UpdateFileInfo();&lt;br /&gt;            Handler(FilePath);&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        string FilePath;&lt;br /&gt;        FileChangedHandler Handler;&lt;br /&gt;        DateTime LastWriteTime;&lt;br /&gt;        long LastFileLength;&lt;br /&gt;        Timer Timer;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Here is an example usage:&lt;br /&gt;&lt;br /&gt;&lt;font size="1"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    public partial class Window1 : Window&lt;br /&gt;    {&lt;br /&gt;        public Window1()&lt;br /&gt;        {&lt;br /&gt;            InitializeComponent();&lt;br /&gt;            &lt;br /&gt;            // Set up the file watcher given a filename and a handler.&lt;br /&gt;            Watcher = new FileWatcher(@"c:\temp\test.txt", FileChanged);            &lt;br /&gt;        }&lt;br /&gt;        FileWatcher Watcher;&lt;br /&gt;        void FileChanged(string filename)&lt;br /&gt;        {&lt;br /&gt;            // For now just display a message when the file changed.&lt;br /&gt;            MessageBox.Show("Got here");&lt;br /&gt;        }        &lt;br /&gt;        &lt;br /&gt;        // Here is an example of writing the file.&lt;br /&gt;        protected override void  OnMouseDown(MouseButtonEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            var writer = new StreamWriter(@"c:\temp\test.txt");&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                writer.Write("Hello, world, number " + I++);&lt;br /&gt;            }&lt;br /&gt;            finally&lt;br /&gt;            {&lt;br /&gt;                Watcher.CloseFileInThisProcess(writer);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        int I = 0;        &lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5898656634524000127-4089041454824039534?l=precisionsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://precisionsoftware.blogspot.com/feeds/4089041454824039534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5898656634524000127&amp;postID=4089041454824039534' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5898656634524000127/posts/default/4089041454824039534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5898656634524000127/posts/default/4089041454824039534'/><link rel='alternate' type='text/html' href='http://precisionsoftware.blogspot.com/2009/05/filesystemwatcher-done-right.html' title='FileSystemWatcher Done Right.'/><author><name>Eric</name><uri>http://www.blogger.com/profile/10729897529763780203</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>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5898656634524000127.post-4447786109784291091</id><published>2009-03-09T14:23:00.000-07:00</published><updated>2009-07-30T11:07:00.938-07:00</updated><title type='text'>Natural Language .NET Date Parser.</title><content type='html'>As part of the Smpl application, we (&lt;a href="http://precisionsoftwaredesign.com"&gt;Precision Software&lt;/a&gt;) built a natural language date and time parser for .NET.  This is not just another DateTime.Parse("...") class.  It is built to handle the majority of ways that humans communicate dates, times, date spans, time spans, etc.  in English.  And, by the way, English is a much simpler and compact way to communicate complex time specifications than form based UI.  If you don't believe me, take a look at Outlook's Recurring date form.  Wow.  All this to describe what English describes in a few words (ex:  "The 9th of every month").&lt;br /&gt;&lt;br /&gt;Have you needed a date parser that can handle recurring (repeating) dates?  &lt;br /&gt;How about one that can parse something like, "Every Thursday, 2 PM".  &lt;br /&gt;Need to parse dates strings that occur once per month, like "The first Tuesday of every month".  If you searched the web, you probably found the Perl Date::Manip module.  If you are writing a Unix script, that is great, but for those of us C#, Visual Basic, or other .NET languages, calling Perl to parse dates is not a practical option.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This parser treats all dates and times as spans, with optional recurrence.  Thus, "Tuesday, 10AM" is treated as a span from 10-11AM.  This creates a really convenient API:  date.Overlaps(otherDate) will check if two dates overlap.  This will return true, for example, if date = "Jan 5", and otherDate = "Tuesday, 10AM", assuming this Tuesday is January 5th.&lt;br /&gt;&lt;br /&gt;The optional recurrence allows enter dates in the form of "Every Monday, 8PM", or "Every January 5", "Every January", or even "Everyday, 5-9PM".  To iterate these recurrences, one simply asks for date.Next("today"), for example, which will return the next occurrences of a given date after today.  Combining this with Overlaps makes a very tight, easy to read program.&lt;br /&gt;&lt;br /&gt;To deal with ambiguous situations, the parser has a set of flags to control preferences.  For example, "Tuesday from 3-5 PM" could mean *this* Tuesday, or it could mean *every* Tuesday.  By default, this causes a parse error, but by preferring recurring or not, the error can be eliminated.  In such a case, one can still, for example, explicitly state "Every Tuesday, 3-5PM".&lt;br /&gt;&lt;br /&gt;The smart date parser is a .NET module, and therefore can be used with any .NET language, including ASP and other web based languages.&lt;br /&gt;&lt;br /&gt;You can see it in action &lt;a href="http://smplsite.com/NaturalDate/Default.aspx"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If this module would be of use to you, let us know by e-mail:  contact@precisionsoftware.us.  We will respond within 1-2 business days of your e-mail.  For faster response, call us at 208-882-5980.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5898656634524000127-4447786109784291091?l=precisionsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://precisionsoftware.blogspot.com/feeds/4447786109784291091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5898656634524000127&amp;postID=4447786109784291091' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5898656634524000127/posts/default/4447786109784291091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5898656634524000127/posts/default/4447786109784291091'/><link rel='alternate' type='text/html' href='http://precisionsoftware.blogspot.com/2009/03/natural-language-net-date-parser.html' title='Natural Language .NET Date Parser.'/><author><name>Eric</name><uri>http://www.blogger.com/profile/10729897529763780203</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-5898656634524000127.post-1811557343591899653</id><published>2009-01-13T14:39:00.001-08:00</published><updated>2009-01-13T14:54:19.942-08:00</updated><title type='text'>Specification Authoring Tool</title><content type='html'>Does anyone else out there find it annoying that there is not a good specification authoring application on the market?  I'm looking for an application that allows one to author requirements specifications for anything from software to airplanes.  &lt;br /&gt;&lt;br /&gt;One would argue that Microsoft Word is the universal document authoring tool.  Why would you want a different tool?  For those that do development primarily on computers (software developers, electrical engineers, etc.), Word doesn't work very well.  Some of its drawbacks:&lt;br /&gt;  * It has a binary file format.  This doesn't play well with version control.  The new XML file format is better, but its not text.  It won't merge.  Their diff support is also poor.&lt;br /&gt;  * Its styles are horrible.  If you try to use them the way they are intended to be used, you get very frustrated.&lt;br /&gt;  * It has no document consistency checking.  Its all Greek to the computer.&lt;br /&gt;  * It doesn't help you author specifications using your format.&lt;br /&gt;  * Anyone that has used Word with a file locking version control system knows that Word is broke.  Word nicely doesn't inform you that the file you are editing is locked until AFTER you've made changes--ARGH!!!&lt;br /&gt;  * And finally, you cannot programmatically get data out of a word document!!  The most important information about your product is stored in a format that allows you to do two things:  Read it (including print, e-mail, etc), and Text search it (thanks to Google, who had to come along and make it practical).  Why can't I generate manuals by pulling out features from specifications?  Why can't I generate or configure parts of the product directly from the specifications?  &lt;br /&gt;&lt;br /&gt;Is it too much to ask for a tool that meets the above?  The tool should also support:&lt;br /&gt;* Outlines&lt;br /&gt;* Tables&lt;br /&gt;* Styles--done right&lt;br /&gt;* Embedded images&lt;br /&gt;* Ability to publish directly to HTML/PDF&lt;br /&gt;&lt;br /&gt;All while storing the source in a plain text, human readable (not geek readable, like XML) file.  I think most of us would drop Word in a heartbeat if such a tool came along.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5898656634524000127-1811557343591899653?l=precisionsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://precisionsoftware.blogspot.com/feeds/1811557343591899653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5898656634524000127&amp;postID=1811557343591899653' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5898656634524000127/posts/default/1811557343591899653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5898656634524000127/posts/default/1811557343591899653'/><link rel='alternate' type='text/html' href='http://precisionsoftware.blogspot.com/2009/01/specification-authoring-tool.html' title='Specification Authoring Tool'/><author><name>Eric</name><uri>http://www.blogger.com/profile/10729897529763780203</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-5898656634524000127.post-6590804284513176553</id><published>2008-11-17T15:16:00.000-08:00</published><updated>2008-11-24T11:54:22.517-08:00</updated><title type='text'>Smpl Dogfooding.</title><content type='html'>dogfooding (verb) - In a nutshell, dogfooding means "using your own product". A product which is being dogfooded tends to be a lot more polished. When a normal user is annoyed by the product, they can't do anything about it. But when a developer is annoyed by the product, they can stop what they are doing and make the product less annoying.  (From http://www.urbandictionary.com)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;What a month it has been at &lt;a href="http://www.precisionsoftwaredesign.com"&gt;Precision Software&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Since the completion of milestone 1, we've been using Smpl for a variety of tasks.  We now have 20+ real world use cases demonstrating Smpl for uses such as:&lt;br /&gt;* Test plans and test generation&lt;br /&gt;* C# code generation (Menus)&lt;br /&gt;* Church organization (members, sunday school classes, ministries, mailing lists, reminders, directory, and web site)&lt;br /&gt;* Object relational mapping (ORM)&lt;br /&gt;* Generating word documents&lt;br /&gt;* Sending e-mails&lt;br /&gt;* Web site generation&lt;br /&gt;* VHDL module entity generation&lt;br /&gt;* State machine VHDL generation&lt;br /&gt;&lt;br /&gt;Check out the updated web site. By the way, it is now being generated by Smpl.  I sat down to update the site, and decided I was not going to stare at PHP any longer!  So, I copied the content into Smpl, and in less than an hour had it regenerating the site.  Of course, getting all the details took a bit more time.  However, I can now edit something at a high level, instead of dealing with PHP directly.  The Smpl translation templates handle creating the menus, inserting tables, bullets, etc. &lt;br /&gt;&lt;br /&gt;What I love about Smpl is you only need to abstract what you get benefit from.  In the middle of the Smpl web site, I put HTML tags.  Smpl doesn't care--just passes them through.  However, I have it generate the tables and bullets on each page so I don't have to think about that. &lt;br /&gt;&lt;br /&gt;The rest of this post is the Precision Software web site (&lt;a href="http://precisionsoftwaredesign.com/"&gt;http://www.precisionsoftwaredesign.com&lt;/a&gt;) content, in Smpl.  I'm sure it doesn't word-wrap very well for this post (and it looks like some of the HTML tags are getting interpreted), but at least you get the idea.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Precision Software Site :Web Site&lt;br /&gt; Page:&lt;br /&gt;   Mission&lt;br /&gt;     Description:&lt;br /&gt;       Eliminating the tedious work that people do on computers.&lt;br /&gt;     Above Bullets:&lt;br /&gt;       How much of your time do you spend...&lt;br /&gt;     Bullet:&lt;br /&gt;       Engineering and Development&lt;br /&gt;         Description:&lt;br /&gt;           ...making 20+ changes to specifications, designs, code, and tests due to a single requirement change.&lt;br /&gt;           ...causing bugs because you don't know every place that needs to be changed.&lt;br /&gt;           ...dealing with common mistakes made by new members of the team because there was no way to enforce agreed upon rules.&lt;br /&gt;           ...making the same change to the 10 products in a product family.&lt;br /&gt;       Marketing and Sales&lt;br /&gt;         Description:&lt;br /&gt;           ...maintaining four version of a PowerPoint presentation.&lt;br /&gt;           ...updating the data sheet, product brief, product manual, and web site when a product feature changes.&lt;br /&gt;           ...trying to fit your data into the rows and columns of an Excel spreadsheet.&lt;br /&gt;       Business&lt;br /&gt;         Description:&lt;br /&gt;           ...developing a $100K+ custom database application, and by the time the application is ready your process has changed and the application must be updated.&lt;br /&gt;       IT&lt;br /&gt;         Description:&lt;br /&gt;           ...automating everything that you can--but knowing there are more major tasks that you know the computer could be doing&lt;br /&gt;&lt;br /&gt;   Products&lt;br /&gt;     Description:&lt;br /&gt;       The Smpl compiler is focused on technical information, while the Smpl Information Processor is the future of Smpl, making it available for non-technical information as well.&lt;br /&gt;&lt;br /&gt;     Bullet:&lt;br /&gt;       `Smpl` Compiler&lt;br /&gt;         Bullet Link: Smpl_for_DSM.pdf&lt;br /&gt;         Description:&lt;br /&gt;           The Smpl compiler reads Smpl model definitions, models, and translation templates, and then processes and executes the desired result--anything from generating C# code to sending an e-mail with a Word document attachment.&lt;br /&gt;           The Smpl compiler enables developers to implement Domain Specific Modeling in their development processes.  Steven Kelly wrote an &lt;a class="link" href="http://books.google.com/books?hl=en&amp;amp;id=GFFtRFkuU_AC&amp;amp;dq=domain+specific+modeling+steven+kelly&amp;amp;printsec=frontcover&amp;amp;source=web&amp;amp;ots=Qv818icYn-&amp;amp;sig=9zdz8LlhzKsKXb_9fY8MthTLr8k&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;resnum=1&amp;amp;ct=result"&gt;excellent book&lt;/a&gt; on this topic, and see also the &lt;a class="link" href="http://www.dsmforum.org/"&gt;DSM Forum&lt;/a&gt; web-site.&lt;br /&gt;           `Smpl` will move DSM into the mainstream.  This whitepaper discusses how: &lt;a class="link" href="http://www.blogger.com/Smpl_for_DSM.pdf"&gt;Smpl for DSM&lt;/a&gt;.  This paper shows examples of what can be done with Smpl:  &lt;a class="link" href="http://www.blogger.com/Smpl_Examples.pdf"&gt;Smpl Examples&lt;/a&gt;.&lt;br /&gt;           The compiler is currently in pre-Alpha testing.  Please contact Precision Software at 208-882-5980 if you are interested.&lt;br /&gt;&lt;br /&gt;       Smpl Information Processor&lt;br /&gt;         Bullet Link: Smpl_Information_Processor.pdf&lt;br /&gt;         Description:&lt;br /&gt;           Let's face it, today's word processors are dumb.  They have turned computers executing 3 billion instructions per second into advanced typewriters.  Spreadsheets are a step up, but very little real world data actually fits into its rows and columns.  Finally, databases are anything but user friendly.&lt;br /&gt;           Smpl is the future of information processing.  This whitepaper discusses that future: &lt;a class="link" href="http://www.blogger.com/Smpl_Information_Processor.pdf"&gt;Smpl Information Processor&lt;/a&gt;.  This product is not yet available.&lt;br /&gt;&lt;br /&gt;       Dsharper&lt;br /&gt;         Bullet Link: dsharper.php&lt;br /&gt;         Description:&lt;br /&gt;           In the process of developing the Smpl compiler, this C# to &lt;a class="link" href="http://www.digitalmars.com/d/"&gt;D programming language&lt;/a&gt; convertor was developed. It is released open source to the C# and D communities. &lt;a class="link" href="http://www.blogger.com/dsharper.php"&gt;Click here for more information.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;   Technology&lt;br /&gt;     Bullet:&lt;br /&gt;       Smpl :TM&lt;br /&gt;         Description:&lt;br /&gt;           Imagine if every document you authored in the computer was understood by the computer--every document was effectively a mini-database.  If the computer can understand your documents, it can do the mundane work you don't like doing.  This leaves you to do the tasks that you enjoy.&lt;br /&gt;           In technical terms, the Simple Modeling and Processing Language (`Smpl`) is a textual &lt;a class="link" href="http://en.wikipedia.org/wiki/Domain_specific_language"&gt;domain specific modeling&lt;/a&gt; language and &lt;a class="link" href="http://en.wikipedia.org/wiki/Template_processor"&gt;template&lt;/a&gt; based compiler that enables computer aided authoring typical of &lt;a class="link" href="http://en.wikipedia.org/wiki/Source_code_editor"&gt;source code editors&lt;/a&gt; in &lt;a class="link" href="http://en.wikipedia.org/wiki/Integrated_development_environment"&gt;IDEs&lt;/a&gt; but generalized for non-programs, and also brings the sought after goals of &lt;a class="link" href="http://en.wikipedia.org/wiki/Source_code_generation"&gt;code generation&lt;/a&gt; and &lt;a class="link" href="http://en.wikipedia.org/wiki/Business_process_automation"&gt;automation&lt;/a&gt; within reach.&lt;br /&gt;           Smpl is a common human/computer language.  Instead of the plethora of computer languages (including the explosion of such languages that domain specific languages enables), Smpl is one language.  Like natural language, Smpl's extensibility comes through defining new terms, not changing the rules of the language.  A diagram may be worth a thousand words, but it also takes a thousand clicks to create and update.  Using text (or words) is, and will be, the most efficient way to communicate with a computer.&lt;br /&gt;           The following white paper introduces the Smpl technology: &lt;a class="link" href="http://www.blogger.com/A_Smpl_Introduction.pdf"&gt;Introduction to Smpl&lt;/a&gt;.  This paper shows examples of what can be done with Smpl:  &lt;a class="link" href="http://www.blogger.com/Smpl_Examples.pdf"&gt;Smpl Examples&lt;/a&gt;.  Smpl technology is patent pending.&lt;br /&gt;       Advantages&lt;br /&gt;         Description:&lt;br /&gt;           &lt;ul&gt;&lt;li&gt;More efficient authoring of specifications, designs, code, tests, web and published document content, etc.&lt;/li&gt;&lt;li&gt;Information consistency and correctness.  The computer is finding and helping fix mistakes as you type.&lt;/li&gt;&lt;li&gt;Queriability.  The query power of databases available on your documents.&lt;/li&gt;&lt;li&gt;Automation.  Sending e-mails, updating web site content, notifications of information changes.&lt;/li&gt;&lt;li&gt;Generation.  Generate documents, source code and scripts, directories, zip files, etc.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   (Blog)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   About Us&lt;br /&gt;     Description:&lt;br /&gt;       Precision Software was founded in 2004 as a research company investigating methods of improving software development.  The founders are listed to the right.&lt;br /&gt;&lt;br /&gt;     Bullet:&lt;br /&gt;       Eric Hewitt&lt;br /&gt;         Description:&lt;br /&gt;           Eric graduated Summa Cum Laude from the University of Idaho with a degree in Electrical Engineering.  He worked with Advanced Hardware Architectures (AHA), an Integrated Circuit design firm, for seven years, where he gained experience with all phases of IC development including specification, design, testing, and project management.  Eric then worked with Schweitzer Engineering Laboratories (SEL), writing embedded software for their power system protective relays before joining Precision Software Design. &lt;br /&gt;         Image: eric.small.jpg&lt;br /&gt;       Michael Hewitt&lt;br /&gt;         Description:&lt;br /&gt;           Michael graduated from Rice University in 1993 with a BA in Computer Science.  For 10 years, he worked as a programmer and lead programmer at Microsoft on projects including Windows 95, the first four versions of Outlook, and a ground-breaking development environment in Microsoft Research called Intentional Programming. He started with Precision Software Design in 2004.&lt;br /&gt;         Image: michael.small.jpg&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   Contact&lt;br /&gt;     Description:&lt;br /&gt;       If you have questions about Precision Software technology or products, please send e-mail to: &lt;a href="mailto:contact@precisionsoftware.us"&gt;&lt;span style="color:#cf0000;"&gt;contact@precisionsoftware.us&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;     Bullet:&lt;br /&gt;       Address and Phone&lt;br /&gt;         Description:&lt;br /&gt;           Precision Software Design, L.L.C.&lt;br /&gt;105 E. 2nd St. Suite 1&lt;br /&gt;Moscow, ID 83843&lt;br /&gt;Phone:  208-882-5980&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5898656634524000127-6590804284513176553?l=precisionsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://precisionsoftware.blogspot.com/feeds/6590804284513176553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5898656634524000127&amp;postID=6590804284513176553' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5898656634524000127/posts/default/6590804284513176553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5898656634524000127/posts/default/6590804284513176553'/><link rel='alternate' type='text/html' href='http://precisionsoftware.blogspot.com/2008/11/smpl-dogfooding.html' title='Smpl Dogfooding.'/><author><name>Eric</name><uri>http://www.blogger.com/profile/10729897529763780203</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-5898656634524000127.post-4605042672158001426</id><published>2008-10-08T15:34:00.000-07:00</published><updated>2008-10-08T16:28:42.103-07:00</updated><title type='text'>Smpl Compiler Milestone 1 Complete!</title><content type='html'>This blog post is a bit late.  Our plan for completion of milestone 1 on the compiler was the end of August, 2008.  We finished a couple of weeks late, about mid September.  Not bad, considering that at one point our schedule showed completion in 2009!&lt;br /&gt;&lt;br /&gt;Milestone 1 included the highest risk areas:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Nearly all of the Smpl lexer/parser, including basic table support. &lt;/li&gt;&lt;li&gt;The start of a type checker.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The basic engine features necessary to do something with Smpl: Schema, category membership, templates, basic functions.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Textual output.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;How does it look?  Good.  Real good.  No, I mean, really, really good!&lt;br /&gt;&lt;br /&gt;We're now building demos.  Here's some examples of how good:&lt;br /&gt;&lt;br /&gt;DSL/DSM/Code Generation:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Hardware module specification.  This demonstrates using Smpl to model an ASIC VHDL or Verilog module, including description, dates, Generics, and Interfaces (Ports).  The Smpl schema for this example was 18 lines of code.  The generation of a VHDL module entity from a Smpl model is 40 lines of code.  The generation of a professional Tex document specification from the model used 30 lines of Smpl code.  In none of this code did I have to think about how to lex or parse my DSL, or how to construct the abstract syntax tree, or how to patch up references, or any of the stuff you usually have to do when writing a DSL.  This entire process would take about 1-2 hours!&lt;/li&gt;&lt;li&gt;Object Relational Mapping.  We created an object oriented Smpl model of a database.  From this model, we do a two step translation (ORM Model to SQL Model, then SQL Model to SQL Text) that generates the SQL code that creates the database.  ORM Schema:  20 lines; SQL Schema: 20 lines; Translation from ORM to SQL: 50 lines; Translation from SQL Model to SQL Text: 45 lines.  This is just the beginning (it doesn't handle queries yet), but it creates all tables and foreign keys to handle object inheritance and references.  That's only 135 lines of code, ritten in a few hours!&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;How about small business/organization automation:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A consulting business' client list, hour logs, and billing.  This application uses Smpl to model client's contact information, projects, contract details, and consultant timesheets.  Foreach project, it will generate an e-mail to each client containing a Word document attachment showing hours, rate, and total bill.  Yes, a Microsoft Word Document (thanks for .docx, Microsoft!)   Schema:  18 lines: translation to E-mail &amp;amp; Word Document: 70 lines.  That includes the text of the e-mail message!  Oh yeah, and I should mention that the word document template (Smplified) is 78 lines of code--but I didn't have to write that--smplc generated it from the .docx file for me!&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Church organization model.  This allows describing the parts of the organization, the members and what parts they are involved in, and a calendar, and generates:  E-mail lists for all, parts, or specific members (either by name or by title) of the organization,  Reminder e-mails, Web site, and a Word Document directory.  The entire Smpl code is roughly 250 lines.  Wow!&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;What does the Smpl look like, you ask?  I'm not yet ready to present the details, but I will give you a couple of example models.  The following is real code.  Read by the computer.  Processed and generating the above described artifacts.&lt;br /&gt;&lt;br /&gt;An up/down counter module specification in Smpl looks like:&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:78%;"  &gt;&lt;pre&gt;&lt;br /&gt;Up Down Count : Module&lt;br /&gt;  Description:&lt;br /&gt;    This module is a simple n bit unsigned counter, where n is a generic,&lt;br /&gt;    supports counting up, down, or pausing.  The counter can be reset, count&lt;br /&gt;    up, or count down based on inputs.&lt;br /&gt;  Initial Version: 5/21/2008&lt;br /&gt;  Generic:&lt;br /&gt;    Bits&lt;br /&gt;      Description: The number of bits used to represent the count value.&lt;br /&gt;&lt;br /&gt;    Port:              Direction  Width    Description&lt;/span&gt;&lt;br /&gt;    --------------------------------------------------------------------------------&lt;br /&gt;      Clock            in                  System clock.&lt;br /&gt;      Reset            in                  Reset the count.&lt;br /&gt;      Count Up         in                  If true, the counter counts up each clock cycle.&lt;br /&gt;      Count Down       in                  If true (and Count Up is false), counts down.&lt;br /&gt;      Count            out        Bits     Current count value.&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A consultant's client and billing data looks like:&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:78%;"  &gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Company:&lt;br /&gt;  Boeing&lt;br /&gt;    Address:  1 Boeing Lane&lt;br /&gt;    City State Zip: Tacoma, WA  98765&lt;br /&gt;&lt;br /&gt;Project:&lt;br /&gt;  Superconductor Research&lt;br /&gt;    Contact: Bill Jones&lt;br /&gt;    Contact Email: bill@yo.com&lt;br /&gt;    Client: Boeing&lt;br /&gt;    Under Contract:&lt;br /&gt;      Consultant      Rate&lt;br /&gt;      --------------------&lt;br /&gt;      Phil Smith      95&lt;br /&gt;      Bob Wilson      110&lt;br /&gt;&lt;br /&gt;  Engine Mount Design&lt;br /&gt;    Contact: Tom Smith&lt;br /&gt;    Contact Email: tom@dude.com&lt;br /&gt;    Client: Boeing&lt;br /&gt;    Under Contract:&lt;br /&gt;      Consultant      Rate&lt;br /&gt;      --------------------&lt;br /&gt;      Bob Wilson      90&lt;br /&gt;&lt;br /&gt;:Hour Log&lt;br /&gt; For: Phil Smith&lt;br /&gt; Entry:&lt;br /&gt;   Date   For Project              Hours&lt;br /&gt;   -------------------------------------&lt;br /&gt;   9/2    Superconductor Research  4&lt;br /&gt;   9/12   Superconductor Research  8&lt;br /&gt;   9/24   Superconductor Research  3&lt;br /&gt;&lt;br /&gt;:Hour Log&lt;br /&gt; For: Bob Wilson&lt;br /&gt; Entry:&lt;br /&gt;   Date   For Project              Hours&lt;br /&gt;   -------------------------------------&lt;br /&gt;   9/3    Superconductor Research  3&lt;br /&gt;   9/12   Engine Mount Design      9&lt;br /&gt;   9/21   Superconductor Research  4&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There is still a lot of work ahead.  We're looking for professionals to join us, especially on the marketing side.  Its time to take this technology out of the lab, and make it available to the masses.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5898656634524000127-4605042672158001426?l=precisionsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://precisionsoftware.blogspot.com/feeds/4605042672158001426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5898656634524000127&amp;postID=4605042672158001426' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5898656634524000127/posts/default/4605042672158001426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5898656634524000127/posts/default/4605042672158001426'/><link rel='alternate' type='text/html' href='http://precisionsoftware.blogspot.com/2008/10/smpl-compiler-milestone-1-complete.html' title='Smpl Compiler Milestone 1 Complete!'/><author><name>Eric</name><uri>http://www.blogger.com/profile/10729897529763780203</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-5898656634524000127.post-6758807387132974650</id><published>2008-07-10T09:02:00.000-07:00</published><updated>2008-07-10T14:02:08.770-07:00</updated><title type='text'>The difference between a specification and an implementation</title><content type='html'>In some ideal world, the two would be the same--you would write a specification, and the computer would build it! However, if that were true, then it would be impossible to create something new.  Why? Because if you can’t describe what something is, you can’t build it. Any system that allows the description of a specification with automatic implementation must have a fixed set of terms.&lt;br /&gt;&lt;br /&gt;The first time something is done, the step from specification to implementation requires faith. “Let there be light”. What is light? Light has never existed before. So, how can it now exist? Let there be light is a fine specification. But, the implementation cannot be directly derived from the specification. Something has to be added.&lt;br /&gt;&lt;br /&gt;Generally, specifications are easy to &lt;span style="font-style: italic;"&gt;understand&lt;/span&gt;, hard to &lt;span style="font-style: italic;"&gt;believe&lt;/span&gt;. It’s easy to &lt;span style="font-style: italic;"&gt;understand &lt;/span&gt;the statement ‘Build a computer that runs at 10 TeraHz’, or ‘Build a spaceship that will fly to the nearest solar system outside of our own.’ It’s hard to &lt;span style="font-style: italic;"&gt;believe &lt;/span&gt;either can be done.&lt;br /&gt;&lt;br /&gt;Implementations are hard to &lt;span style="font-style: italic;"&gt;understand&lt;/span&gt;, easy to &lt;span style="font-style: italic;"&gt;believe&lt;/span&gt;—because you’re looking at the thing in action! It’s easy to believe there is light. We are living in the implementation of that specification. Figuring out exactly how light works, on the other hand, that’s hard to understand.&lt;br /&gt;&lt;br /&gt;Another example was Bill Gates and Paul Allen. They had a specification to build a BASIC interpreter on the Altair 8800. The specification was simple: Those words, and the BASIC language specification. Easy to understand, hard to believe. Once they completed the implementation, it was easy to believe they had it working.&lt;br /&gt;&lt;br /&gt;Now, if you have done something before, then yes, it is possible to join the specification and implementation. You are not really doing anything new, however. You are just doing the same thing over in a modified way. However, if you want to add anything new to the product, specification is again required.&lt;br /&gt;&lt;br /&gt;Of course, you can always skip the specification stage, and just write the implementation. This is inefficient. Because you don’t fully understand what you are building, you will undoubtedly make mistakes. Finding mistakes at the specification stage is much cheaper than at the coding staging. Finding mistakes at the coding stage is much cheaper than at the testing stage. Finally, finding mistakes at the testing stage is much cheaper than finding them in the hands of the customer.&lt;br /&gt;&lt;br /&gt;Interestingly enough, it should be possible to define a language, and be using it, without thought for what exactly the terms in the language will do. Defining a language should take seconds, not hours, days, or weeks! Creating an implementation (or describing how to create an implementation from a specification), of course, takes time. Again, it’s easy to ‘understand’ a specification. It’s difficult to implement it.&lt;br /&gt;&lt;br /&gt;What is needed, then, is a system that allows you to formalize and implement what you have done before, while simultaneously mixing this with specification for what is new in a particular product. Your specification authors, when describing how to display information or what controls exist on a product, will use the formalized specification/implementation language. When describing how the new fangled space travel feature will work, they will use more free-form. The computer consumes the formal parts, and produces code. You, the developer, get to formalize the informal parts, and describe their implementation to the computer. Next time someone needs the space travel feature, they now have a formal language/implementation. Our hope at Precision Software is that we are building exactly that in the language we call &lt;a href="http://precisionsoftware.us/products.php"&gt;Smpl&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'll close this post with these words: &lt;a href="http://www.blueletterbible.org/cgi-bin/tools/printer-friendly.pl?book=Hbr&amp;amp;chapter=11&amp;amp;version=NIV#6"&gt;Without faith it is impossible to please God!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5898656634524000127-6758807387132974650?l=precisionsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://precisionsoftware.blogspot.com/feeds/6758807387132974650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5898656634524000127&amp;postID=6758807387132974650' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5898656634524000127/posts/default/6758807387132974650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5898656634524000127/posts/default/6758807387132974650'/><link rel='alternate' type='text/html' href='http://precisionsoftware.blogspot.com/2008/07/difference-between-specification-and.html' title='The difference between a specification and an implementation'/><author><name>Eric</name><uri>http://www.blogger.com/profile/10729897529763780203</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-5898656634524000127.post-2808364892708426696</id><published>2008-05-09T10:19:00.001-07:00</published><updated>2008-06-18T09:55:14.074-07:00</updated><title type='text'>Smpl Development Has Begun!</title><content type='html'>Well, after nearly 4 years of (both technology and market) research, we are finally starting development on the product we set out to build so many years ago.&lt;br /&gt;&lt;br /&gt;Our grand ideas of storing all product development information in a single database, providing a word processor-like interface to this database, allowing abstraction across all stored information, and transforming the information into code or other artifacts have been set aside.&lt;br /&gt;&lt;br /&gt;The real world has humbled us.  However, it has also brought out the best in us.  We have been squeezed to create exactly and only what is necessary.  We're calling it a Simple Modeling and Processing Language, or Smpl for short.  It is a &lt;span style="font-weight: bold;"&gt;textual &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Domain-Specific_Modeling"&gt;domain specific modeling&lt;/a&gt; language and associated &lt;span style="font-weight: bold;"&gt;translation based &lt;/span&gt;compiler.&lt;br /&gt;&lt;br /&gt;It will be thin, light, simple, and yet powerful.  Imagine &lt;a href="http://msdn.microsoft.com/en-us/library/bb126235.aspx"&gt;Microsoft DSL Tools&lt;/a&gt; or &lt;a href="http://www.metacase.com/products.html"&gt;MetaCase MetaEdit&lt;/a&gt; without all of the diagram and GUI overhead.  It is text--so, yes, it will integrate with all of your existing development tools and processes.  You will be able to use it in preprocessor mode, allowing you to smoothly transition from a traditional manual coding approach to full domain specific development.&lt;br /&gt;&lt;br /&gt;We are confident you'll like what you see.  The new web site will be coming along shortly, along with a two page introduction to Smpl technology.  Development is moving forward.  Alpha release is expected late 2008.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5898656634524000127-2808364892708426696?l=precisionsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://precisionsoftware.blogspot.com/feeds/2808364892708426696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5898656634524000127&amp;postID=2808364892708426696' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5898656634524000127/posts/default/2808364892708426696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5898656634524000127/posts/default/2808364892708426696'/><link rel='alternate' type='text/html' href='http://precisionsoftware.blogspot.com/2008/05/ripc-development-has-begun.html' title='Smpl Development Has Begun!'/><author><name>Eric</name><uri>http://www.blogger.com/profile/10729897529763780203</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-5898656634524000127.post-6647434814979507663</id><published>2008-04-10T17:32:00.000-07:00</published><updated>2008-04-10T17:33:43.445-07:00</updated><title type='text'>When You Are Researching Vs. Developing</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;A completed (thorough and  consistent) specification marks the end of research, and the beginning of  development.&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;Prior to a completed specification,  one is doing research (no matter how short or long this time may be).  There are  still unknowns.  Unknowns require research.  Research time is not  predictable.&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;After a completed specification, one  is doing development.  The unknowns are hopefully minimal.  Research is not  required.  Development time is predictable.  An incomplete specification will  allow research to slip into the development phase, thus making development time  unpredictable.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5898656634524000127-6647434814979507663?l=precisionsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://precisionsoftware.blogspot.com/feeds/6647434814979507663/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5898656634524000127&amp;postID=6647434814979507663' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5898656634524000127/posts/default/6647434814979507663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5898656634524000127/posts/default/6647434814979507663'/><link rel='alternate' type='text/html' href='http://precisionsoftware.blogspot.com/2008/04/when-you-are-researching-vs-developing.html' title='When You Are Researching Vs. Developing'/><author><name>Eric</name><uri>http://www.blogger.com/profile/10729897529763780203</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-5898656634524000127.post-7306979320475094728</id><published>2008-02-20T12:09:00.000-08:00</published><updated>2008-02-20T12:22:27.661-08:00</updated><title type='text'>Literate Programming</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  &gt;The primary goal of &lt;a href="http://www.literateprogramming.com/"&gt;literate programming&lt;/a&gt; is to create well documented code. &lt;span style=""&gt; &lt;/span&gt;Accordingly, a literate programmer simultaneously authors both the documentation and the code. &lt;span style=""&gt; &lt;/span&gt;Macros enable both the abstraction and a more intuitive ordering of code. &lt;span style=""&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Arial;font-size:10;"  &gt;Abstraction is performed primarily to improve understanding, secondarily to foster reuse.  Compilation of the documentation (called “weaving”) produces a well formatted TeX document which contains the embedded code as well, ordered in an intuitive fashion. &lt;span style=""&gt; &lt;/span&gt;Compilation of the code (called “tangling”) is a single-level process whereby documentation is eliminated, macros are expanded, and the desired code is thereby generated.&lt;span style=""&gt;  &lt;/span&gt;Macros have similar capabilities and drawbacks of C macros.&lt;span style=""&gt;  &lt;/span&gt;&lt;a href="http://www.literateprogramming.com/cweb_download.html"&gt;CWEB&lt;/a&gt;, in fact, employs C macros to do much of its work.  The primary advantage of literate programming is nicely formatted, readily approachable documentation of the code base.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  &gt;Literate programming is missing the following components of a &lt;a href="http://precisionsoftware.blogspot.com/2008/02/template-oriented-programming.html"&gt;Template Oriented Programming&lt;/a&gt; (TOP) system:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=";font-family:Arial;font-size:10;"  &gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span dir="ltr"&gt;&lt;span style=";font-family:Arial;font-size:10;"  &gt;Model syntax&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=";font-family:Arial;font-size:10;"  &gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span dir="ltr"&gt;&lt;span style=";font-family:Arial;font-size:10;"  &gt;Multi-level model to model translation&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=";font-family:Arial;font-size:10;"  &gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span dir="ltr"&gt;&lt;span style=";font-family:Arial;font-size:10;"  &gt;Custom errors to identify model misuse&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=";font-family:Arial;font-size:10;"  &gt;&lt;span style=""&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span dir="ltr"&gt;&lt;span style=";font-family:Arial;font-size:10;"  &gt;Model queries&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=";font-family:Arial;font-size:10;"  &gt;&lt;span style=""&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span dir="ltr"&gt;&lt;span style=";font-family:Arial;font-size:10;"  &gt;Translation debugging&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;            &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  &gt;Most of the CWEB manual focuses on formatting of documentation and code, whereas most of a TOP system focuses on model translation.&lt;span style=""&gt;  &lt;/span&gt;Only the lowest level textual output of a TOP translation focuses on formatting.&lt;span style=""&gt;  &lt;/span&gt;In a TOP system, the model serves as the documentation. &lt;span style=""&gt; &lt;/span&gt;A model pretty-printer can create a well-formatted, hyperlinked, read-only view of the model.&lt;span style=""&gt;  &lt;/span&gt;Syntax highlighting within a text editor can be employed to create a reasonably formatted writable version of the model.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  &gt;Literate programming can be a useful way to organize code. &lt;span style=""&gt; &lt;/span&gt;It is hoped that a TOP system will provide many of the benefits of literate programming, but also yield a considerably higher return on investment with respect to abstraction.   For example, a literate programmer must always be aware of the underlying code being produced.  In contrast, a TOP programmer should be able to think at the level of the model being created, for the most part ignoring the translation of that model to lower level model/code.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5898656634524000127-7306979320475094728?l=precisionsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://precisionsoftware.blogspot.com/feeds/7306979320475094728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5898656634524000127&amp;postID=7306979320475094728' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5898656634524000127/posts/default/7306979320475094728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5898656634524000127/posts/default/7306979320475094728'/><link rel='alternate' type='text/html' href='http://precisionsoftware.blogspot.com/2008/02/literate-programming.html' title='Literate Programming'/><author><name>Michael Hewitt</name><uri>http://www.blogger.com/profile/17165187461688431759</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-5898656634524000127.post-1284182241034216499</id><published>2008-02-18T22:55:00.000-08:00</published><updated>2008-02-22T13:42:58.453-08:00</updated><title type='text'>Template Oriented Programming</title><content type='html'>&lt;p class="MsoNormal"&gt;The phrase Template Oriented Programming is new.&lt;span style=""&gt;  &lt;/span&gt;If you don’t believe me, type that quoted phrase into Google and you’ll find only about 5 unique hits!&lt;span style=""&gt;  &lt;/span&gt;What is template oriented programming, you ask.&lt;span style=""&gt;  &lt;/span&gt;This blog post seeks to answer that, and will hopefully, in part, make its way to Wikipedia, and, with any luck at all, to CS201 at your favorite educational institution.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;Template oriented programming (TOP), as its title hints, is a programming paradigm that focuses on templates to accomplish a programmer’s goals.  Note that when I use the word template here, I am not talking about a specific programming specific language feature such as (C++ template, C# generics, etc).  The goal of template oriented programming is not to directly create machine code (or byte codes) to be executed on a (virtual) machine.&lt;span style=""&gt;  &lt;/span&gt;Instead, the output of TOP is information to be processed by other code (or by humans).&lt;span style=""&gt;  &lt;/span&gt;This could include familiar template output such as HTML/XML, or more complex code like C/C++/Java/C#, shell scripts, VHDL/Verilog, CAD scripts, etc.&lt;span style=""&gt;  &lt;/span&gt;TOP allows one to generate one or more tedious artifacts from a simple, user defined model that is input.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;Similar to the paradigm shift that occurred when moving from &lt;a href="http://en.wikipedia.org/wiki/Structured_programming"&gt;structured programming&lt;/a&gt; to &lt;a href="http://en.wikipedia.org/wiki/Object_oriented_programming"&gt;object oriented programming&lt;/a&gt;, or from unmanaged to &lt;a href="http://en.wikipedia.org/wiki/Managed_code"&gt;managed&lt;/a&gt;, garbage collected code, programming in the TOP paradigm requires a different way of looking at the information.&lt;span style=""&gt;  &lt;/span&gt;The programmer starts with what he desires to have as output of a given set of code.&lt;span style=""&gt;  &lt;/span&gt;This output is then abstracted as necessary to allow customization based on the input.&lt;span style=""&gt;  &lt;/span&gt;The abstractions include:&lt;span style=""&gt;  &lt;/span&gt;Simple field substitution similar to word processing form letters, extracting parts of the template into sub-templates that can be reused, looping over part of a template, making part of a template conditional, etc. The paradigm shift requires thinking about what should be produced instead of thinking about what the computer should do step by step.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;This discussion leads to a short rabbit trail.&lt;span style=""&gt;  &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Imperative_programming"&gt;Imperative programming languages&lt;/a&gt; (Fortran, BASIC, and C for example), evolved from machine language, and focus on telling the computer what to do.  &lt;span style=""&gt;&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Declarative_programming"&gt;Declarative programming languages&lt;/a&gt; (Lisp, Prolog, XML), on the other hand, describe relationships between information.&lt;span style=""&gt;  &lt;/span&gt;The drawback of pure declarative languages is that they cannot do anything, since they have no imperative aspect.&lt;span style=""&gt;  &lt;/span&gt;Thus, most declarative languages have some way to start or otherwise control the execution of the program.&lt;span style=""&gt;  &lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;TOP applies the technique of declarative programming to code generation.&lt;span style=""&gt;  &lt;/span&gt;This allows things like referring to information that does “not yet” exist. &lt;span style=""&gt; &lt;/span&gt;Such references, when first evaluated, will be null.&lt;span style=""&gt;  &lt;/span&gt;However, when the information is “later” created, the reference will be created correctly. &lt;span style=""&gt; &lt;/span&gt;Notice the time related words were placed in quotes.&lt;span style=""&gt;  &lt;/span&gt;That is because, in TOP one does not think about time. &lt;span style=""&gt; &lt;/span&gt;The processing order is handled by the system.&lt;span style=""&gt;  &lt;/span&gt;Relieving this burden from the programmer eliminates many common bugs, and frees the mind of the programmer to focus on the more valuable, customer driven requirements.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;A simple example is in order at this point.&lt;span style=""&gt;  &lt;/span&gt;Let’s say a program was to evaluate a parenthesized mathematical expression. &lt;span style=""&gt; &lt;/span&gt;Assume the expression is mapped to a tree, with the leaves being the inner most expressions. &lt;span style=""&gt; &lt;/span&gt;A traditional imperative evaluator must find the leaves, evaluate these first, and then work up.&lt;span style=""&gt;  &lt;/span&gt;A declarative solution, on the other hand, can simply state the desired result for each operator.  All sub expressions are evaluated  independently, and parent expression results will eventually be updated whenever  a sub expression result changes. &lt;span style=""&gt; The system is responsible for making sure the result at the top is correct based on the last changes to any sub-expressions.  &lt;/span&gt; &lt;span style=""&gt; &lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;Declarative programming solutions have predominantly been used only in academia. &lt;span style=""&gt; &lt;/span&gt;They have many problems that make them inadequate for most commercial purposes. &lt;span style=""&gt; &lt;/span&gt;These issues, however, are mostly related to the runtime use of a declarative system:&lt;span style=""&gt;  &lt;/span&gt;Difficulty handling the updating of program state, performance issues associated with information updating, etc. &lt;span style=""&gt; &lt;/span&gt;The TOP paradigm, instead, uses declarative techniques at compile time, avoiding many of these drawbacks.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;This field is similar to that of &lt;a href="http://en.wikipedia.org/wiki/Template_metaprogramming"&gt;template meta-programming&lt;/a&gt;.&lt;span style=""&gt;  &lt;/span&gt;Template meta-programming systems are generally applied to a single, existing language.&lt;span style=""&gt;  &lt;/span&gt;C++ templates, for example, allow adding templates to the C++ language.&lt;span style=""&gt;  &lt;/span&gt;The focus is how to add compile time abstraction to the C++ language.&lt;span style=""&gt;  &lt;/span&gt;TOP, on the other hand focuses on the templates, with the output language (or languages) being a secondary concern.  In addition, the target language is defined by the programmer.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;a href="http://en.wikipedia.org/wiki/Template_metaprogramming"&gt;Template metaprogramming&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Template_processor"&gt;template processing&lt;/a&gt; are not new.&lt;span style=""&gt;  &lt;/span&gt;What is Precision Software doing that will breath life into these currently niche paradigms?&lt;span style=""&gt;  &lt;/span&gt;Template solutions today focus on the getting the characters in the right order to produce a computer program.&lt;span style=""&gt;  &lt;/span&gt;Our solution, however, focuses on a model of the information that is not character based.&lt;span style=""&gt;  &lt;/span&gt;In this respect, it is similar to Lisp.&lt;span style=""&gt;  &lt;/span&gt;The system supports translating between input and output, where neither are text—both are model.&lt;span style=""&gt;  &lt;/span&gt;The closest analogy is to imagine operating on the &lt;a href="http://en.wikipedia.org/wiki/Abstract_syntax_tree"&gt;abstract syntax tree &lt;/a&gt;within a compiler.&lt;span style=""&gt;  &lt;/span&gt;This frees the programmer from having to continually parse the input, and unparsed (convert to text) the output.  This approach allows information to be represented in a normalized fashion, translated with one or more stages within the tree format very concisely, and then output to one or more target artifacts.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5898656634524000127-1284182241034216499?l=precisionsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://precisionsoftware.blogspot.com/feeds/1284182241034216499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5898656634524000127&amp;postID=1284182241034216499' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5898656634524000127/posts/default/1284182241034216499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5898656634524000127/posts/default/1284182241034216499'/><link rel='alternate' type='text/html' href='http://precisionsoftware.blogspot.com/2008/02/template-oriented-programming.html' title='Template Oriented Programming'/><author><name>Eric</name><uri>http://www.blogger.com/profile/10729897529763780203</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-5898656634524000127.post-2162970406563596357</id><published>2008-02-08T14:57:00.000-08:00</published><updated>2008-02-08T16:02:59.118-08:00</updated><title type='text'>Intentional Programming</title><content type='html'>On the surface, our work would seem very similar to Intentional Programming (IP).  However, there are some important differences.  IP allows for the creation of arbitrary constructs with unconstrained semantics and unconstrained visualization.  At the time I worked in IP, both reduction (R3) and visualization were constructed with imperative code.  Having this level of power definitely falls in the category of creating radically new “languages”, in the same sense that imperative textual compilers are capable of create new languages (e.g. C++, C#, D, Java, Smalltalk, etc).&lt;br /&gt;&lt;br /&gt;What we provide is a shared fabric for abstraction.  Our semantics and visualization are constrained.  All information is represented using a common model, and that model is visualized uniformly with only occasional deviations for brevity.  Once information is represented as model, templates may be used to abstract that model in a controlled, type-checked fashion.  Templates are used both to abstract above a model and to translate higher level model semantics into lower level model semantics.&lt;br /&gt;&lt;br /&gt;Due to constrained visualization, our system will not work well as a structured GPL editor.  This is one of IP's goals, but is not one of our goals.  Instead, we believe that GPL code is stored and edited quite well as text.  Whereas an IP code base may consist of quite a lot of structured GPL (this is, in fact, exactly what the IP code base itself does consist of), a code base in our system will consist of layers with a handful of high-level abstractions at the top and textual GPL code at the lowest level leaves.  Terse visualization of model is therefore less important, and a uniform way to view and abstract every level is far more important.&lt;br /&gt;&lt;br /&gt;One lesson we've learned is that abstraction breaks fancy visualization.  Since our whole world is about abstraction, visualization must be quite general and not depend on a fully realized model structure because the model structure within any given template may only be partially realized.  On the other hand, the editor is completely context aware, so that even within a highly abstracted model, it can still intelligently prompt for valid relations and termini.  Also, templates at all levels must conform to the syntax within which they are operating, yielding a "type-checked" expansion ("reduction" in IP terminology) from top to bottom.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5898656634524000127-2162970406563596357?l=precisionsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://precisionsoftware.blogspot.com/feeds/2162970406563596357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5898656634524000127&amp;postID=2162970406563596357' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5898656634524000127/posts/default/2162970406563596357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5898656634524000127/posts/default/2162970406563596357'/><link rel='alternate' type='text/html' href='http://precisionsoftware.blogspot.com/2008/02/intentional-programming.html' title='Intentional Programming'/><author><name>Michael Hewitt</name><uri>http://www.blogger.com/profile/17165187461688431759</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>
