Even with all the wealth of information on the internet at our fingertips, sometimes it becomes a real challenge to find a solution to what seems to be a relatively simple problem.

For some upcoming work in Build Automator I wanted to be able to send keystrokes to a program. It somehow doesn't sound all that challenging, but I have spent the better part of today trying to come up with a solution. I have read hundreds of posts on multiple forums about this and have discovered that there are far more people that ask for this solution than those that even understand the problem, let alone who can give an intelligent answer. So far I haven't found a single post that solves it, lot of posts that give a hypothetical answer that looks like it should work, but doesn't, at least not in my case.

I have been successful in sending letter keystrokes to the editor window in NotePad, but trying to send something like Alt-F or Ctrl-O completely fails. So I'm putting this on the shelf for now even though I hate walking away from this, but I can't take more time on trying to find the solution at this point. Sometimes in programming, just like in poker, you have to know when to hold them and know when to fold them!

I got the Utilities build out last night while I was babysitting SQL Server 2008 R2 install and Visual Studio 2010 install. That was an interesting experience and I will blog about it tomorrow! I need to get some work in for my clients this week and next week I will be working on our products. I will also put in some work on the Icetips website which we have been working on behind the scenes for a while. Sue is re-doing almost every single page and it will be a very welcome update to the site!

Arnor Baldvinsson

Icetips Utilities build 1.1.2390 is available for download for all customers with a valid Gold Subscription.

This build contains complete documentation for the Date Class, File Search Class and INI Class. For more information please see the online manual and my blog entry from Sunday, September 5. Below is a detailed list of all updates and fixes in this build:

Updates, features:

  • July 2, 2010: Documentation done for File Search Class.
  • July 24, 2010: 22 new methods added to the Date Class: GetThisWeek, GetLastWeek, GetNextWeek, GetThisWorkWeek, GetLastWorkWeek, GetNextWorkWeek, GetThisMonth, GetLastMonth, GetNextMonth, GetThisQuarter, GetLastQuarter, GetNextQuarter, GetThisYear, GetLastYear, GetNextYear, GetLast12Months, GetMonthToDate, GetQuarterToDate, GetYearToDate, GetMonthFromDate, GetQuarterFromDate, GetYearFromDate. Documentation for Date Class updated.
  • July 24, 2010: Documentation done for Date Class.
  • July 28, 2010: 6 new methods added to the Date Class: DateDiff, DateAdd and GetDate to get date differences and SetWeekStartDay, GetWeekStartDay and GetWeekFirstDay that deal with different start day of a week. By default the week start day is set to Monday, but can now be set to any day. Documentation for Date Class also updated.
  • September 3, 2010: Added FreeFiles parameter to the ScanFiles method in the File Search Class. This allows the method to be called repeatedly for different folders or different wildcards without having to handle the files in the Files queue until all the files have been read.
  • September 3, 2010: Added attributes parameter to the FileExists method to Core Class. This allows the method to be used to find more than just FF_:Normal files, such as directories, hidden files etc.
  • September 6, 2010: Documentation done for INI Class.

Fixes:

  • July 21, 2010: HtmlToColor did only handle html color value strings that started with '#' Fixed so now it can handle html value colors without the '#' prefix. I.e. 'C1D8F0' instead of '#C1D8F0'
  • September 3, 2010: ScanFiles did not check if the path passed in ended with a backslash which caused an error. Fixed.
  • September 5, 2010: PROC attribute missing from SetFileAttrib method in Core Class. Fixed.

Arnor Baldvinsson

Monday September 6, is a holiday here in the US - Labor Day - and I am going to take the day off. Been working on a client project over the weekend that took longer than I expected but came out pretty nice. Some minor window cleanup left and I'm done with it for now:)

Today I installed Visual Studio 2010 on a Windows 7 Ultimate virtual machine using VMWare Workstation and I might mess with that a little bit tomorrow, as well as installing MS SQL Server 2008.

Other than that, I am barbecuing tomorrow! I have 3 racks of baby back ribs curing in the fridge with my own tried and tested dry rub. They'll go into the smoker at about 2pm tomorrow and cook low and slow for about 5 hours. It has been a while since the last time we had a barbecue and I can barely wait!

Tuesday I will get the new Utilities release out, see my earlier blog post. Everything is ready for it, but I do need to implement a call to TortoiseSVN in the Build Automator script to tag the Utilities build, which creates a new tag for it in the version control database. Tags are builds that are complete and should not be touched again.

I have a 1700 page monster book sitting on my desk about ASP.NET and another 800 page one about C# that I would like to start working through. So many things to learn! I may end up doing some studying on .NET tomorrow. Does that qualify as taking the day off? Hmm...

Arnor Baldvinsson

There will be a new build of the Icetips Utilities released on Tuesday, September 7.

Documentation is now complete for the File Search Class and the Date Class, and work was done in the Core Class, Date Class and File Search Class.

The main work in this build was on the Date Class. It has 28 new methods and the Date Class is now fully documented. This includes methods that are compatible with the DateDiff and DateAdd functions in Microsoft SQL. There are methods to get dates in the past and the future, such as GetLastWeek, GetNextWeek, GetLastMonth, GetNextMonth etc. For more information please see the online manual. Please note that the online manual is not 100% up to date right now but will be updated when the new release is uploaded on Tuesday. The new methods make it easy to do quick date calculations. Week calculations are ISO-8601 compatible and you can set any day of the week as the start date. If you see that some functionality is missing from the Date Class please let me know so I can continue to improve it. 🙂

There is also a new parameter for the FileExists method in the Core Class, which makes it possible to use it to check the existence of files or folders using the FF:_ equates as they are used for the Directory() function in Clarion. This makes it more versatile.

There are some very powerful methods in the File Search Class to scan for folders and files. I have made some minor improvement to the class, including adding a FreeFiles parameter to the ScanFiles method that allows you to call it multiple times and it will add the files to the Files queue rather than free the Files queue each time it is called. This increases flexibility of the method. I also fixed a problem with the ScanFiles method that I ran into when calling it with a fixed path and a wild card. In that situation it did not check if the path ended with a backslash which caused problems.

I am planning to get back on a schedule by releasing new product builds every other week or so. If you have ideas for new methods/classes, please don't hesitate to let me know!

Arnor Baldvinsson

Have you ever had a computer day where you put in something like x = 2+2 and then x turns out to be 352,648,137? Well, I had one of those days todayB)

My client asked me to do some work with his program - extracting a database for a new user. This is a SQL Anywhere database with replication and he needed to add a new replicated database to the system. This was something that we originally had left behind, meaning to get back to it at later time and that later time just never came. The process isn't complicated, but the extracted database needs some massage after it's extracted. I had originally done this with batch files, simplest way as you just construct the sql files and then pass the name to the dbisql.exe command line tool. But I had some other batch files there and managed to execute the wrong one and I'm glad I wasn't working on a live database and that I had backups as it deleted the database!

So I decided to write a nice little program to act as a shell for this process and make it nice and easy to go through and do the extraction and all the little stuff that was needed around it. And that's when my day turned really interesting and things would work in the most mysterious ways! But in the end I prevailed and got most of it done tonight, with some minor work left for tomorrow morning and some clean up. On the positive note, this gave me an idea and most of the code for a simple product that fits well within the Icetips Utilities.

I also got some product related stuff sorted out. I have all the products in version control now, as well as some other non-product related projects so that is all coming along very nicely.

For those who are looking around in the world of .NET, I Discovered what looks to be a very nice tool for Visual Studio at DawliaSoft called Sculpture. It uses model driven code generation. It is open source so it is free but the models are about $99 each, but you can also buy bundles, see their price list They have some video tutorials which look good, but the audio is pretty bad. The company is based in Egypt and the speaker has a bit of an accent although I didn't have a problem understanding him. It is better to download the wmf files rather than watch the videos online.

Tomorrow will be a great day!:)

Arnor Baldvinsson

I will be attending the Clarion Live DevCon 2010 in Denver at the end of October as a third party exhibitor. I am very much looking forward to see all the other Clarion developers attending and talk to you guys there!

Please come visit me at the conference if you have any questions, suggestions or comments!

Arnor Baldvinsson

Last week we went on a camping trip to the Klahowya campground, which is only about an hour drive from our home. This was our first camping trip so we didn't want to go too far from home.

The campground is on the banks of the Sol Duc river, which runs from the Olympic Mountains. The Sol Duc enters the Pacific at La Push on the West coast of the Olympic Peninsula.

The campsite we had was right on the river and had a lot of room. If you click on the photo above you will get a higher resolution photo from my photo website. We had no problem putting down two tents and park both cars. We had a nice fire pit and had no problem with the site, apart from some very pesky chipmunk that decided it would challenge John for a sandwich just after we got there. The chipmunk lost, predictably, but John also had some battle scars to show off as the chipmunk was not about to let go of the sandwich without a fight!

We brought both a small grill and cooking stove to cook on as we didn't really know how things would work out. On Tuesday night I grilled some Italian sausage and heated up baked beans. The grill performed very nicely and the chipmunks left us completely alone! I built a fire in the fire pit and we roasted some marshmallows over the fire and made s'mores.

On Wednesday, August 25, we started out by cooking breakfast. Scrambled eggs and breakfast sausage with fresh brewed tea and coffee went down well and was a good start for the day. Around 11 we went to the Sol Duc waterfalls. We left the Subaru at the Sol Duc hot-springs and took the Mazda up to the trail-head for the Sol Duc waterfalls. The plan was to walk up to the waterfalls and take the Lover's Lane trail on the other side of the river back down to the Sol Duc hot-springs. The trail up to the waterfalls is about 0.8 miles (1.3km) and is mostly uphill, but the trail is wide and easy.

There was not a lot of water in the river as the summer has been cool and dry, but the waterfalls are always beautiful to see. I didn't want to lug my tripod around for the walk so I used the rail on the bridge to brace the camera to take the photos of the waterfalls, not really expecting them to come out, but they came out ok. You can see more photos of the falls on my photo website

From the waterfalls we continued our trek. Instead of going back over the bridge, we headed on to the Lover's Lane trail, which is on the West banks of the Sol Duc river. It is a relatively easy trail, not many elevation changes, but the trail itself is rather treacherous because of roots and rocks. The trees are old growth and some of them are very, very tall! Large patches of ferns almost cover the trail in places and it is a bit of a wonderland to walk through this area.

We stopped on the way and had lunch sitting on a big tree trunk that was half way in the river. This trail is about 3 miles so the total distance we walked was around 4 miles. We were all glad that we made it through without falling over some of the roots and rocks. The weather was awesome, sunny and warm and the only negative thing were some bug bites as we had accidentally left the bug spray back at the camp site. When we got back to the campsite we built a fire and we roasted some hot-dogs for dinner and some marshmallows and s'mores followed.

Thursday morning was foggy and a bit nippy. I got up early, around 6am, and made a nice fire to keep everybody warm. At about 8am I made scrambled eggs again and fried up a whole package of bacon that warmed us up nicely. After breakfast we went on the Pioneer trail at the campsite. It takes you through some very tall, second growth, fir and hemlock forest. It is only about 0.3 miles (0.5 km) but it shows well the extremely tall forests of the Pacific Northwest. The rain forests of the Northwest contain some of the largest trees in the world. In fact, newly released research information that used NASA based satellite laser technology has found that the tallest forests in the world are right here where we live, in the Pacific Northwest! This shouldn't come as a surprise to anyone who walks through the rain forests on the West coast of the Olympic Peninsula.

When we came back from our walk on the Pioneer trail, we started packing things. As we were getting the bigger tent down it started drizzling just a little bit so we kicked into high gear to get everything broken down and packed. 5 minutes after we left the camp site it started raining. We needed to get gas for the Subaru so Sue, John and Laila went to Beaver to get gas and we decided to stop together at the Hungry Bear Cafe that is between Klahowya and Beaver. The food was ok, nothing to write home about, but the ice cream was very good! The restaurant was in dire need of some fixing up. The termites had already finished the windows and probably the rest of the wood in the building and long since moved on to something with a bit more sustenance.

All counted we feel that our first camping trip went pretty well. We are planning a second camping trip in September to the Cougar Rock campsite at Mt. Rainier. Since Laila starts school in two days this will have to be a weekend trip and we'll see how the troops do in a bit cooler climate!

Arnor Baldvinsson

I have my Clarion REDirection file set up so that all generated files are created into sub-folders from the application folder. This makes the application folder clean, as no generated files are created there. In my version control setup, I decided to exclude those folders so that I do not version control the generated files.

I don't see a reason for it since I'm version controlling the .app files. For this I need to set Tortoise to ignore the files. I do that via the properties on the project root, by using the svn:ignore property and set it to ignore all my folders, using both the upper and lower case variations! Works fine, but this only ignores the files and doesn't remove them from the repository.

After some digging around, I found that since TortoiseSVN does not have a full command line interface for SVN available, they have made an exe that you can use to execute certain SVN functions directly via the TortoiseSVN interface. This is documented in Appendix D of the TortoiseSVN documentation, which is about Automating TortoiseSVN.

To make things easier for me I created a bat file to do the removal of the folders from version control.

"c:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:remove /closeonend:1 /path:"z-backup"
"c:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:remove /closeonend:1 /path:"z-clw"
"c:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:remove /closeonend:1 /path:"z-inc"
"c:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:remove /closeonend:1 /path:"z-lib"
"c:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:remove /closeonend:1 /path:"z-obj32"
"c:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:remove /closeonend:1 /path:"z-source"

Note that the statements above will wrap. This takes care of removing the folders and then I commit and I'm back in business. I just move this RemoveSVN.bat file from one folder to the other when I need to use it and this makes it much quicker to go through this process when dealing with multiple folders.

There is an option to put multiple paths on the /path: parameter, like:

REM "c:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:remove /closeonend:1 /path:"z-backup*z-clw*z-inc*z-lib*z-obj32*z-source"

but I ran into problem with it where it would lock the folders, requiring to execute the "Cleanup" action on the folder to unlock it. I'm not sure why that happened, but it does not happen when dealing with the paths individually.

Version control actions are on my drawing board for Build Automator and my plan is to have it supporting at least TortoiseSVN/SVN before the end of 2010 and perhaps MS Team Foundation Server 2010. If you are using a different version control system and would like to see it supported by Build Automator please let me know:)

Arnor Baldvinsson

Version control systems have a reputation, at least in my mind, for being complicated, difficult to manage, difficult to implement, difficult to use, the list of difficulties goes on! So why on earth would I want to implement this stuff?

One of the most frustrating parts of development for me has always been the risk of breaking something, and spending hours rolling back and sometimes not be able to completely roll back. Then you have to restore from backup, and lose hours or even days of work - because at some junction in the development design I took the wrong turn for whatever reason (I'm sure I'm the only one who ever does that;). Then I find that I ended up on a dead end street going nowhere.

A well implemented and well functioning version control system can completely eliminate this risk. It will allow you to go digging into whatever blind alley of programming that you want, and make sure that you can come back to the real world without a scratch.

Many developers look at version control as being only for developer teams, where more than one developer is working on the same piece of program at the same time. While most good version control systems support exactly that, that is not their primary goal. Their primary goal is to make sure that you can, without risk, save your work and create copies of your work and roll back to any revision that you want, without losing anything. They enable you to pull out a two year old source file to check something, or pull out a whole system from last year, compile it and run it to see how your project looked a hundred builds back.

I currently have 20 products that I'm putting into version control (no, I didn't quite finish getting them all set up over the weekend). That is a total of 25,627 files in 2,599 folders! They include all the current Icetips products, some old products that I have not worked on for quite some time, and some new ones that are in development. I also have some in-house projects in there, too, that I work on from time to time and want to have the freedom to experiment on. With the safety net of version control, I am protected from myself. 😉

That is exactly what version control is about for me: Freedom to experiment without risk. Version control allows me to commit my project, create a branch and experiment on that branch. Note that Subversion/TortoiseSVN uses the term "commit" for saving the local files to the repository, which is the database with all the projects and all the revisions of the projects. Other version control systems also use the term "check in" about committing changes to the repository.

For example, I have been experimenting with some code for our OutlookBar. To do that, I make sure that my OutlookBar product folder is committed to the repository and then I right click on it and select "TortoiseSVN | Branch/Tag..." What this does is make a copy of my current project into a "branch". See the screen shot above.

I think a small tutorial on terminology is in order before I go any further. From the start you will hear references to Trunk, Branches and Tags. It took me a while to figure out what those things were and how they worked. Not necessarily because it was complicated, but just about every reference to those terms that I found did not explain them at all or did not explain if they are something that you create or the version control system should create for you.

The Trunk, Branches and Tags are simply folders inside the version control that make it easier to deal with versioning. If you are using Subversion/TortoiseSVN, it is up to you to create those folders in the root of the repository. See the screen shot above with the structures I have now set up for Build Automator. I have not created any Tags or Branches yet, so those folders are empty. When you create the repository, you should create those 3 folders.

The Trunk folder is where your current development version resides. This is what will become your next public release. This is where you copy files from to tags and branches.

The Branch folder is where you create branches of the trunk to work on without disturbing your trunk. This is where you create your experimental code, try things out, play like a pig in a pool of mud, do what ever you want to do without risking your precious code in the trunk! You simply copy your trunk there by using the "TortoiseSVN | Branch/Tag..." menu option. Use a descriptive name, like "Testing sub-classing in WindowsClass" for the branch.

The Tags folder is for your builds when they are done. Once you create a new build (hopefully using Build Automator and SetupBuilder:)) this is where you copy your trunk using the "TortoiseSVN | Branch/Tag..." menu option. Just like for the branches, you just pick the Tags folder instead of the Branches. As with the branches you should use a descriptive name for your tags, like "Build 1.2.1234, 2010-08-23" for a tag to give a good indication of what it is.

So in essence the tags are what you had, the trunk is what you have and the branches are what you will have! Actually pretty simple when you think about it! Once you have created the branch, you check it out to your working folder and work with it and commit to it. When you are done with your experiments, and if everything has gone well and you are satisfied that your new code is good, you can then merge your changes back to your trunk or basically copy the branch back to the trunk.

TortoiseSVN provides merge tools that can merge code for you and show you differences between files. It cannot merge binary files, so you cannot merge Clarion app files. To work with Clarion apps, you must work with TXA files and export them and import them to Clarion. For what I need, I'm not going that far at this time (I probably will sooner than later, though). For more information about how to deal with TXA and version control I strongly suggest you watch Rick Martin's webinars from Clarion Live. See my first blog about the version control for links to the webinars.

I will be away for most of this week and will resume my blog on Friday, August 27. Tomorrow I am going to Redmond for a .NET user group meeting where they will be demonstrating the new Microsoft LightSwitch - and the LightSwitch project manager will be there. Tuesday through Thursday the whole clan is going camping for the first time! For those of you who like photos and don't follow me on Facebook, please take a look at my online photos at http://arnor.zenfolio.com/ I will post some photos there when I get back!

Arnor Baldvinsson