Monday, September 28, 2009

DOS BAT File Copy Rename with String Manipulation

I needed to rename a directory of files to truncate the file names to the first 5 characters (plus the file extension).  I found one example that showed how two write a FOR loop that broke out the filename and extension and passed it to a second BAT file:

for /f %%a IN (’dir /b *.txt’) do call runner.bat %%~na %%~xa

And using a second example that covered DOS string manipulation, I put together this batch file that accepts two parameters and does a substring to get the first 5 characters of the first parameter:

set file=%1
set file=%file:~0,5%
ren %1%2 %file%%2


Thursday, September 17, 2009

Creating an Asynchronous ASP.NET Page To Initiate Batch Processes

I recently created a page that gave the user the option of initiating a long-running batch process.  The batch required repeatedly calling external web services that would have taken far too long for a user to wait for the traditional page processing model.  But, by using ASP.NET asynchronous execution to initiate the batch process on a separate thread, the page response is excellent.  I started by working through this excellent tutorial on asynchronous execution, but quickly ran into problems when I began calling web services.  Creating an asynchronous process involves writing a method that can execute without needing anything from the HttpContext (Application, Page, Session, Cache, Configuration, etc.) since this is not available when you use BeginInvoke to run your subroutine.  This presented me with an issue since my project had a library that we used to setup web service instances (with WSE security), but that library relied on the HttpContext’s Application object.  To work around this limitation, I created a private inner class that encapsulated the web service references. 

    Private Class WebSvcInstances

        Public FSI As MyWseSVc1 = GetMyWseSVc1

        Public PSI As MyWseSVc2 = GetMyWseSVc2

    End Class

The inner class was passed into the batch method while the Application object was still available and providing the objects the batch would need later.

To start off, create the subroutine you want to initiate asynchronously:

    Private Sub InitiateBatch(ByVal wsRefs As WebSvcInstances)

Create a Delegate in your code behind with the same signature as the subroutine:

    Private Delegate Sub Batch_Delegate(ByVal wsRefs As WebSvcInstances)

Then you can initiate your subroutine in a page event like so:

    Dim batchDelegate As InitiateBatch_Delegate

    Dim wsRefs As New WebSvcInstances

    batchDelegate = New InitiateBatch_Delegate(AddressOf InitiateBatch)

    Dim asyncResult As IAsyncResult

    asyncResult = batchDelegate.BeginInvoke(wsRefs, Nothing, Nothing)

You can read up on BeginInvoke to learn more about the callback features.  I didn’t need to be notified when the execution finished, so I just set those to Nothing

Before and AFTER

It hasn't taken quite as long as the lack of blog posts would have you believe, but the refurbishment of Flying Scot 338 is nearly complete. In addition to the fairing and painting, I've just finished replacing the gooseneck and standing rigging, installing a boom whoopie, turtle bags and guy hooks. I hope to get the transom port, bow bag, and stem band on before the Boathouse Regatta this weekend. I am SO glad I have a Flying Scot since the class builder has been SUPER helpful including instructions with all of the replacement parts.

Painting recap:

After talking to another club member who did the same paint job (but rolled everything) I should have been more aggressive with sanding the primer. I was concerned about sanding too much off and not hiding the yellow gel coat so I wet sanded with 220. My friend said he used 80-100 on the primer which I now wish I had done (with a long board)...but time was limited. I didn't think I'd have a chance to put a 2nd primer coat on.
I am very impressed with the shine and durability of Interlux Brightsides so far. I don't think I've scratched any paint off, though it's only been a couple months of light use.
During the refurb, I decided to tackle the bottom as well, painting it with VC Performance (a 2-part epoxy) and given that experience, I think I would be more willing to attempt a 2-part poly for the topsides next time. A warning about VC Performance though: it is extremely thin (runny), being designed to spray on. They say it is possible to brush/roll it on, but it would seem far easier to spray given my limited experience. My "spray rig" consisted of a $99 compressor and $15 gravity fed gun, both from Harbor Freight.


As earlier pictures showed, my centerboard was in terrible shape. The leading edge was so badly damaged, there was actually a large accumulation of clay between the lead balast and the outer fiberglass causing a bulging in the airfoil shape. I ended up cutting out a curved section of fiberglass from the leading edge (both sides) and repairing it with about 4-5 layers of 1.5oz mat. I faired the repair and other leading edge defects with Interlux Watertite and finished with two coast of VC Performance (after removing LOTS of bottom paint) the board looks almost new.