Welcome to Atalasoft Community Sign in | Join | Help

#2 – One for each hand – The AutoCropCommand

Sure, this one should be pretty straightforward.  As the name implies, this command automatically crops the solid color border from the edge of an image.  It is available for DotImage Photo, Photo Pro, and Document Imaging.

Setting parameters wouldn’t be very… “automatic”… now, would it?  But there are some details we can set for this one:

  1. OverrideColor – you can set a specific color to represent the image’s “empty” space.
  2. OverrideIndex – similar to the OverrideColor, this sets a palette index value instead of a color
  3. Tolerance – this is the percentage used to locate the edges.
  4. UseMedianFilter – lets you clean up the image a little bit before getting the result dimensions .(good if you have some noise or artifacts keeping you from getting the entire edge cropped).

Here’s the command in action.  I’ve left all of my settings as default values except for Tolerance, which I set to 1 (because 0 results in nothing).

Before (overall image’s size is 640 x 478 pixels):

Rosebud_WhiteBorder

After (overall image’s size is 512 x 359):

autocropcommand_rose

 

Not much difference to show off here, other than to take note that the cropped image is not resampled to the original size.

Next up is the ChangePixelFormatCommand.  Hardly ever used, but very important to people everywhere.  Like sporks.

Posted by Elaine | 0 Comments

#1 in a very long list – ApplyPaletteCommand

Greetings, Campers.  A long time ago, in a galaxy far, far away, some very smart people decided to make things easy.  They developed a bunch of ImageCommands, which, though they did some pretty nifty things to images, were stab-your-eyes-out difficult to find in the documentation.  So, I’m introducing a new series – the DotImage ImageCommands.

First up, the ApplyPaletteCommand.  This command lets you map a colored image into a specific palette, resulting in an 8-bit, 256-color image.  It is available for DotImage Photo, Photo Pro, and Document Imaging.

Properties to consider:

  1. Palette – you can specify the colors you want the image mapped to with a new Palette.
  2. Dithering Mode – this is the algorithm used to colormap.  Options include None, TwoValue, or FloydSteinberg
  3. Dither Error – the amount of dithering to apply.  Should be between 0 and 127.

Here are the results, using the Standard Windows 16-color palette, FloydSteinberg, and 64:

Before (image’s pixel format is 24 bpp BGR):

image

After (image’s pixel format is 8 bpp indexed):

applypalettecommand_rose 

Tomorrow, the AutoCropCommand.

Posted by Elaine | 0 Comments

A bit o’ this, a bit o’ that, a bit o’ the other, a bit o’ honey

Whew.  That was the most complicated demo I’ve ever put together.

To briefly summarize, the application scans in images and uploads them to the image cache, checks them for a barcode, and views them in the browser.  Also, you can select an area on the image and return the text through OCR.

None of that is very hard in itself.  Scanning – check.  Upload – check.  Et cetera – check.  Peter Cetera – check.  Sweep the leg – check.

(Ha – from DotImage to Daniel-san in 5 degrees.  New record.)

The hard part was the .Net tweaks and idiosyncrasies.  The user control that I embed into the web page also needed to fire a javascript event, which in turn I needed to trigger server-side code.  A Com interface handles calling the scanning components, and also launches the event when scanning is completed.  DotTwain has the HttpPost class that uploads my images to my page (which I then use a simple Image Decoder to save them to my image cache).  Scan the image with the Barcoding engine and I have the filename.  Once that completes, an UpdatePanel refreshes my drop down box, and the user can choose to view the document they just scanned.

And for a bit o’ crack, I also threw in the ability to make a selection on the image and return the text.

I went through all this for two reasons.  One, there is a potential customer interested in all this.  I can show him how easy DotImage and DotTwain are to work with (despite the complicated nature of the app in general, the Atalasoft parts were smooth like butter).  Two, someone posted feedback on our website that there weren’t enough demos.  We have a little under 4 dozen demos with source code available with the SDK, and a few more here.

Also, for those who want even more interaction with Atalasoft support, you can follow me on Twitter.

Posted by Elaine | 0 Comments

“Finally there would be a thingamajig that would bring everyone together, even if it kept them apart spatially.”

Webinars are go.

Presented the very first DotImage webinar today.  Went well, I think.  Only ran into two glitches.

The first was when I couldn’t figure out why I was muted.  Five minutes into playing with every button and configuration I could think of, I realized there was a switch on my microphone.  Headset 1, Elaine 0.

The second glitch came when I discovered that Visual Studio refused to save all the snippets I had prepared ahead of time.  I use two different kinds of snippets – one saved as XML files and another that are just chunks of code dragged over to the toolbox.  It’s the second kind that VS doesn’t save, when you’re viewing a Javascript page.  I’ve never had trouble saving them from ASPX pages or code-behind, so I wasn’t expecting to be so unprepared.  Visual Studio 1, Elaine 0.  Luckily, though, I was able to demonstrate what I needed to without the snippets, so Visual Studio 1, Elaine 1.

I think I was less nervous when doing a presentation in front of 20 people live than doing one over the internet.  Luckily, I had Rick from Sales and Eric the Marketing Dude join me.  Rick was a calming influence, and Eric got me a glass of water (which I had completely forgotten about) and told me to present to Yoda (a figurine we have in the office).  Having an audience always makes presenting easier.

The next webinar is next Wednesday, same Bat time, same Bat channel.  The topic will be another basic application, but this time focusing on DotImage WinForms controls.  I’ll also be adding other webinars later, such as an advanced Web how-to, WPF, and Silverlight applications.

If you’d like to sign up for a webinar, go to our new Education page.  And, uh, “try and be nice to people, avoid eating fat, read a good book every now and then, get some walking in, and try and live together in peace and harmony with people of all creeds and nations. And, finally, here are some completely gratuitous pictures of” fish.

Posted by Elaine | 0 Comments

Anyone know what this is? Class? Anyone? Anyone? Anyone seen this before?

In a time when the GDP of the United States is running screaming like a co-ed in a horror movie, how does a company like ours induce people to buy our product?

You improve the product.

I’m not the one to improve the DotImage product itself, but I can improve the support to go with it.  We offer phone support, forums, a knowledge base, and case submission, but it’s not enough.  We’re adding two new things to the mix – personal introductory training for presales customers and webinars with varying topics and degrees of difficulty.

First step to the presales training is the game plan.  Assess each individual potential customer for the problem they’re trying to solve, and what parts we can provide for the solution.  It’s more than just answering the question “can DotImage do this?”; it’s asking “what can DotImage do for us?”

Second part is the webinar.  Assess the global needs of our potential customers and… wait, that sounds familiar.  Turns out, getting ready for the personal training is exactly the same as getting ready for the webinar.  I have a demonstration program ready, pre-made snippets of code that I can call by typing a keyword and pressing TAB TAB (loving snippets – they are so easy to build, and Visual Studio can’t lose them like code dragged into the toolbox).  The real difference is in the delivery; for the webinars, I have a script to follow, for the training, it’s a conversation.

I haven’t performed the first webinar yet, as we’re still working out the delivery method.  I have delivered 5-6 personal training conversations with customers, and so far, they’ve been pretty successful on the sales side, and on the support side, the customers have walked away from the conversation feeling a lot more confident with our product.  It also boosts customers’ confidence in our company that they can talk to a real live person (with people skills!) who can walk them through things (and open Visual Studio and demonstrate code, rather than talk hypothetically).

Doing my part in this economy, and certainly not taking any bailout money to do it.

Posted by Elaine | 0 Comments

Customer Service Observed

Pack up your gear, campers, we’re going to Vegas.

Actually, I’m going to Vegas this weekend, and in preparation for my trip, I noticed some customer support performances that made me both cringe and applaud.  I’m going to point out these various stops along our route.

To tell the tale, I’ll start with some background information.  I have bad ears, and flying without aids is not only painful, but makes me nauseous.  There are two main brands of pressure-reducing aids on the market.  Of these brands, usually only one is available (1).  Unfortunately, though this brand has two sizes, one is too big and the other too small, so it’s unacceptable.

The other brand is the perfect size, but not readily available in stores.  I found it on the internet a week ago and ordered it.

My package arrived yesterday.  Unfortunately, they did not send me the brand I ordered, but the uncomfortable brand (2).  I had to search for a number to call (3).  When finally connected, I told the representative I was sent the wrong products.  She offered to send me the correct products, but said they would arrive on Friday.  I said that didn’t do me any good, as my flight was on Thursday.  She asked what else she could do, and I said, “Well, I’d rather have a refund.”

In less than 10 minutes, I had notification that my refund went through (4).

I still did not have any ear plugs, and only one day to get this resolved.  Now, every day, one of our engineers goes for a walk, and sometimes one or two of us go with him.  The walk goes to the local pharmacy to get a soda, which takes about 40 minutes round-trip.  I went, remembering that the manager of the pharmacy said some products could be ordered with a one-day turn-around.  I gave the SKU number for the product, and she told me to return the next day after 1:00 PM.

During this time, a man was in front of me, trying to pick up a prescription.  He was told they were out (5), but he could go to their store in the next town where they had the drugs (6).

I walked back to the store today, and my ear plugs were waiting for me.  The right brand, a decent price, and promises kept.

 

Throughout this tale, I’ve numbered some customer-service items.  I’ll explain my thoughts on them:

1. Two national brands, vastly different in shape.  Why not carry both?  They don’t expire, so leaving them on the shelf until they sell should not be an issue.  In other words, give people options.  Forcing people to choose means either they grudgingly accept the product they don’t want (and are unhappy), or they don’t buy at all.

2. Someone decided to fill my order with the wrong product.  Either they thought the products were interchangeable, they were lazy, or they were out of the product I wanted.  It’s not up to them to change it, and if the product is unavailable, notify me and give me options to substitute, wait, or cancel.  If they are lazy, make sure it doesn’t happen again or take action to correct the behavior.

3. Make your number available on websites and receipts.  Customers should never have to search for that information.  Atalasoft’s number is at the top of every page in our site.  So is the sales’ team email address.  (Scribe's note: shortly after returning from Vegas, I was informed the number and email were removed from every page sometime in December, and is now only available on the Support and Contact pages.  I argued for their return and was denied.)

4. I was an unhappy customer, and the representative tried to make me happy by getting me the right product, and when that wasn’t the best option, refunded my money without question and faster than I would have ever imagined.  I would do business with them again, knowing I have some safety in my transactions.

5. This point goes back to #2.  If you know you are out of a product, inform the customer.  In this particular industry, records are tracked by computer – it should be just as easy to develop a way to call or send an email to the customer.  There are zero reasons these days to be uncommunicative.  Let the customer know he may have to drive to a different location.

6. This references point #5.  You have a customer who needs something.  You know you don’t have it, but your other store does.  Is it not possible to have the product delivered to your store?  For pharmacies, it may be that the courier needs special licensing or bonding to handle such transporting, but it should be a consideration to have that in place.  What if the customer was dependent on public transportation?

 

I could end all this with some philosophical advice and parallels of my experiences as a support engineer in the software industry, but, really, everything is pretty clear in four rules:

1. Do it right.

2. If you can’t, communicate.

3. Do what you can do.

4. Do it quickly.

 

Off to Vegas now.  Wish me luck at the tables.

Posted by Elaine | 0 Comments

Five for Fighting… err… Friday

Greetings, campers.  Different kind of post today.  I have some posts on deck that are one topic only, but my list o'links is piling up on me…

1.  Sara Ford’s blog and book – go read it, go buy it.  The tips ended December 19th on the blog – there’s so much fantastic information there, and Sara has a knack for explaining things in layman’s terms.  The book is the first 251 tips from the blog, and the author’s proceeds go towards helping send Hurricane Katrina survivors to college.  So, yeah, so you could just read the tips online, but go get the book – much easier to highlight your favorite tips (or mark them with sticky notes as I did one night when I couldn’t put it down).

2.  Visual Studio Hacks.  Again, there’s a blog and a book, but the content between the two is different.  James Avery is the name on the cover, but there are quite a few contributing editors.  The difference between James’ and Sara’s work is that James is more code-centric, often showing how to write add-ins to Visual Studio, while Sara highlights things that are already in place but rarely seen.

3.  National Day of Service – Seth Godin lists 18 ideas for giving back to the community.  Here is #14:

“Use Copilot to diagnose and fix computer problems for people or causes that can't afford fancy IT support. It's free on weekends”

I’m guessing that anyone who’s made their way to my blog or any other Atalasoft blog knows their way around a computer.  This would be a fantastic way for us geeks to give back.  And, no, fixing your Aunt Mildred’s computer does not count.  You should be doing that anyway.

4. 5 Whys – A way to find the root cause of a problem.  Sometimes the cause is only 3 questions deep, and sometimes it goes far beyond.  Ever have a small child ask you “why?”  The answer is never as simple as the surface level, and if you are satisfied with that, you will never fully have a solution, only a band-aid.  The 5 Whys approached was developed by Sakichi Toyoda, founder or Toyota.  There is some criticism to the method, but I’m not sure that author isn’t dismissing the technique for advertising his own system. 

5.  I’m presenting a talk on Blueprints at our Western Mass .Net Users Group next month.  If you’re going to be in the area, stop by and introduce yourself.

Posted by Elaine | 0 Comments

Wrong version of Libeay32.dll == Nothing, no error, no message, not working

One of my shorter posts, campers.  I want to give a shout-out to our customer, James Nachbar, for discovering a problem that Crystal Reports creates with Twain drivers.

To summarize the problem, Crystal Reports loads a version of LIBEAY32.dll that is not compatible with the Konica Minolta Twain Driver.  The dll itself is an OpenSource file and is used for coded communications over networks.

James has a great explanation and solution – read all about it in his blog.  Many thanks to him for finding this.

On a side note – when searching for information on that particular dll, I not only find the SourceForge page for it, but also various bad things that use this dll, and also good programs that work with only certain versions of the dll.  James mentions having 18 different versions of it on his machine; I have six – one for my FTP application and the others for VMware.  I really am surprised that someone like Crystal Reports would use something so seemingly unstable.

Posted by Elaine | 0 Comments

Blueprints, part deux: The question isn't "What are we going to do," the question is "What aren't we going to do?"

We’re going to teach everyone how to build a Blueprint to build a Web Application that loads annotations.

A little background for those of you reading this through a kick, digg, reddit, or other link -- my company, Atalasoft, builds a .Net toolkit for imaging called DotImage.  Part of the toolkit focuses on WebControls and annotations for images.  I don’t wish to advertise DotImage here (“Why the heck not???” my marketing guys may ask), but if you see something in the screenshots that are not native to .Net, you will be able to find where they came from… if you’re curious.

Now, back to the Blueprints.

If anyone read my previous entry about Blueprints, once you get past the Fish references, you’ll see that I was very excited about Blueprints, but disappointed about the lack of instructions.  The team at Microsoft, headed by Michael Lehman, have done a great job with the new screencasts, and following them makes building a Blueprint a piece of cake.

I don’t intend to rehash what Michael says in the screencasts, but instead put many of the pieces together.  One of my major frustrations with providing support is people who don’t try.  Blueprints is going to be my way of remote teaching.  Sure, many people will copy the code without understanding what’s going on, but maybe there will be one or two who reach enlightenment.

Before we begin building a Blueprint, there are some necessities to get out of the way.

  1. Some aspects of the Blueprints require Visual Studio 2008 SP1.  Go get it.
  2. Install the Blueprints Manager
  3. Your life will be easier if you add the following registry key:
    1. In HKLM\Software\Microsoft\Blueprints, add a string value EnableDeveloperFeatures with a value of true.  This will allow you to delete Blueprints from the manager if you are just testing them, or if you make changes (which don’t always “take”, in my experience).  As of November 22nd, Michael was still debating about making this straight out enabled or continuing to leave it as a “developer” feature.

Now, on to building.

Step 1 – Which comes first, the chicken or the egg?

Ultimately, I want to build a Blueprint that unfolds a Web Application.  So, do I build the Web App first, or unfold the Blueprint Factory into a new solution?  Either one – it’s my choice.  For these purposes, I’m going to build the Web Application parts first.

Opening Visual Studio 2008 (with SP1 installed), I’m going to create a new ASP.Net Web Application.  My project opens with the Source view of my Default.aspx page.  I’ll set up the project with my references, and I’ll tweak the design view a little bit.

One of the specific problems DotImage customers face when building this type of project is not knowing what properties to set in the design view.  I’ll go ahead and set them now, too.

-- For DotImage customers following along, I’m setting the WebAnnotationViewer’s AutoLinkThumbnailViewer to True, the WebThumbnailViewer’s ShowAnnotations to True, and setting the ViewerID property of the WebThumbnailViewer to the WebAnnotationViewer’s ID.

The point, though, is I can set as much or as little as I want here.  I could build the whole project if I wanted to, but since some items coming up are more customizable, I’ll give directions for those items through the Blueprint.  For now, this is as far as I’m going to go with my Web Application.

Step 2 – Configuring the Blueprint

I’m going to leave my Web Application alone for a moment (after saving my work), and unfold the Microsoft Blueprints Factory into my solution.  After the factory unfolds, the Configuration Editor opens:

ConfigEditor

I’ve filled in some details, but we’ll be coming back to this editor later on.

After closing the editor, the Workflow for the Blueprints Factory opens.  There are six activities listed in the workflow (well, five, really – the last one is who to call for support.  And I did email Michael with questions, and he was very nice and helpful).  I’m going to ignore the activities, as I feel I am familiar enough with them now to proceed without referencing them.

In order to put my Web Application into a Blueprint, I need to create a template from it.  Clicking File –> Export Template… will launch the Wizard.  I select Project Template, choose my Web Application in the drop down box, and click next.  I uncheck the Auto import, and click Finish.  Honestly, I could have created the template prior to unfolding the Blueprint Factory, but rather than searching for it, the window with the zip file I need opens up directly.  I drag the newly-created zip file to the templates folder in the Blueprint Factory in my solution.

Now, I select “Edit Configuration…” from the Blueprints menu (which can be found by right-clicking on the BlueprintFactory in the Solution Explorer.  On the configuration tab, I switch the template drop-down from Auto-generated to User supplied, and type in the name of my zip file in the template:

template

Now, if I had completely set up my entire Web Application exactly as I wanted, I could build this solution, which would build my Blueprint for me, but there are more details I need to set up first.  Also, if I wanted, I could remove the Web Application from my solution altogether, but I’m going to leave it so I remember what I’m doing.

Step 3 – Writing the Workflow

For all the details that are left out, I’m going to include instructions.  Because some steps are dependant on others, it would make sense to force people to call the base steps first – adding a Blueprints Workflow Process will make this easiest.

Right-click on the BlueprintFactory in the Solution Explorer, and choose “Add WF-Process…” from the Blueprints menu.  A new project is added to you solution, with the special file project.workflow.xoml.  This is going to be the Workflow of Activities for someone to follow when they unfold our WebLoadAnnotations Blueprint.

-- When I first opened the XOML file, I did not have the toolbox controls as Michael did in his screencast.  To add them, right-click on the Toolbox and select “Choose Items…”.  Filtering by Blueprints will let you quickly find the controls you need to add.

Having built this particular Web Annotations project numerous times, I already know some of the dependant steps.  I’m going to use the SequenceActivity and Parallel controls from the Windows Workflow 3.0 toolbox to structure my dependencies, and then the BlueprintProcessActivity will be the actual activity.

  1. Each BlueprintProcessActivity must have a surrounding SequenceActivity, but more than one BlueprintProcessActivity can be inside a single SequenceActivity.
  2. Two BlueprintProcessActivities in the same SequenceActivity will be dependant in a top-down linear fashion, unless…
  3. BlueprintProcessActivities in a Parallel will not be dependant to each other, but will be dependant to any BlueprintProcessActivities in the same SequenceActivity prior to the parallel.

Maybe it would be better to illustrate this…

workflow

In this workflow, I’ve left the overview (as it’s always nice to have an introduction with details).  Then, the user can choose to pursue the AddFolders or AddCode activities.  If the choose AddFolders, they can then go to SetWebConfig or AddFiles.  With each BlueprintProcessActivity, there is a ShortDescription property – this is what will show up in your Blueprint’s Workflow.  Also, you can associated a document to open in your workflow.  For example, I’m going to associate a new file, AddCode.mht with the AddCode activity.  The BlueprintFactory has a set of empty files under doctemplates that you can use.  When I finish making changes to that file, I’ll add it to the content/workflow folder in the BlueprintFactory.

For the SetWebConfig activity, I’ll take advantage of the KnowledgeBase article already written about the subject, by putting the link to the webpage in the activity’s details.  I’ll fill in the remaining missing documents I want, and rewrite the provided Overview to be more specific to my Blueprint.

Once the Workflow is finished, I’ll go to my project dependencies (right-click on the Solution in the Solution Explorer), and set my BlueprintFactory dependent on the WorkFlowProcess project.

All that’s left now is to build the solution.  The Blueprints will be automatically installed into the Blueprints Manager.

Step 4 – All done.  Let’s see what’s happening…

Since spell check can only catch so much, I’m going to run through what I’ve built.  First, I’ll open a new instance of Visual Studio, and instead of creating a new project or solution, I’ll go straight to the Blueprints Manager:

newBlueprint

There’s the new Blueprint, and the Overview file I changed is showing in the Manager itself.  I’ll unfold, and because I do not currently have anything open, the manager will automatically prompt me to begin a new project.  I’ll select Other Project Types –> Visual Studio Solutions –> Blank Solutions.  However, I could select anything, and the Blueprint will unfold into it.  If I already had a solution open, it would add my Blueprint to it.

The manager then asks me to Specify the Project Name.  By default, it will be the name I set up in my configuration editor.

And, voila.  My Web Application has unfolded itself from its template, including the references I added to the project.  My Activites are showing with their dependencies:

newWorkflow

And I can step through the workflow to accomplish my tasks.  Notice how the Setup Web.Config and Add Files to Folders are enabled once Add Folders to App is checked off:

tasks

For those of you who want the Blueprints I just built, the zip file is available.  Copy the file to your desktop, then point to it using the Blueprints Manager –> Update –> Add File.  As an alternative, you can set up the RSS feed -- in the Blueprints Manager --> Update --> Add Feed... and paste this URL:

http://www.atalasoft.com/cs/files/folders/blueprints/rss.aspx

Wow, over 1,600 words for all this.  That wasn’t too hard, was it?

Posted by Elaine | 1 Comments

RemoteInvokes invoke remotely.

(Scribe’s note: throughout this post I’m going to refer to the WebImageViewer, but everything will apply to the WebAnnotationViewer as well.  The converse, though, isn’t true; if I refer to Annotations, that only applies to the WebAnnotationViewer and not the WebImageViewer.)

The doorknob said, “Read the directions and directly you will be directed in the right direction.” 

One of the most used features, and least understood, in DotImage is the WebImageViewer’s RemoteInvoke.   The RemoteInvoke function in JavaScript calls a server-side function without doing a postback to the server.

The benefits are that you can perform image processing (rotate, despeckle, burn annotations) without reloading your entire page – only the WebImageViewer will update itself.

The drawbacks are that only the WebImageViewer will update itself.

Our AJAX Specialist Dave  gave the following analogy to a customer recently: think of the RemoteInvoke as a bubble.  This bubble surrounds the WebImageViewer and doesn’t know anything else exists.  That means it doesn’t know the WebThumbnailViewer exists.  Also, the WebImageViewer only holds one image at a time – there is no ImageCollection associated with the WebImageViewer.  That means it also doesn’t know that any other images exist.

However, that doesn’t mean you can’t work with multiple images.  If you use the OpenUrl method to open your image in the WebImageViewer, then the ImageUrl property is the URL linking to your file.  From this file, you can generate an ImageCollection, which will give you access to all the pages of your file.  You can then perform image processing on the image in the viewer, and replace that image in your ImageCollection.  WebImageViewer.CurrentPage will tell you which page you are looking at (careful, though – CurrentPage is one-index based, while the ImageCollection is zero-indexed).  Save your changes back to the file with the URL and the appropriate encoder.

Remember, your WebThumbnailViewer doesn’t know anything has happened.  You’re still inside your RemoteInvoke bubble, changing the file on the server.  If you return your URL from your server-side function, you can get this string by calling WebImageViewer.getReturnValue() in your JavaScript.  Then, use that URL in the WebThumbnailViewer.OpenUrl call (still in JavaScript), and your WebThumbnailViewer will reflect the changes you made server-side.

When using RemoteInvokes, there are two calls on the JavaScript side.  One is RemoteInvoke (present-tense), in which you pass the name of the server-side function you want to call and an array holding the variable parameters for the function.  Two is RemoteInvoked (past-tense), an event in which you assign the function you want called when the RemoteInvoke returns from the server-side processing.  It is important to assign the RemoteInvoked event BEFORE you call the RemoteInvoke process (the DotImage ASP.Net Web Demo actually has this wrong in its JavaScript examples).

This is only a brief overview of the RemoteInvoke function.  To go deeper, you’ll need to take the red pill .

Posted by Elaine | 0 Comments

Blueprints – Reason #42 for not turning in your term paper after an all-nighter

Microsoft Blueprints, or the plans to a new interstellar hydro-combustion miracle-patented micro-teflon nuclear gamma strato rocketship-grade missile.

As part of the PDC 2008 Expo, Steve and I watched a demo of the new Microsoft Blueprints.  If they work (notice I said “if”, campers), they will make delivering how-to’s, demos, templates, workflows, etc., as easy as pie.

Here is how they work for building a Blueprint:

1.        Download and install the Blueprints Manager into Visual Studio 2008.

2.       Open a new project, and launch the Blueprints Manager.

3.       “Unfold” the Blueprints Factory into your project.

4.       Follow the on-screen directions.

In the initial Factory Blueprint, it will lead you through creating a very basic workflow blueprint (not an uppercase Workflow, but workflow).   You add activities, and with each activity you can create a Word documents, HTML files, or MHT files.  You can even associate URLs with your activity.  Word docs will open Word, and links will open up your default browser, but MHT and HTML files will open as details inside Visual Studio.  Make a change to a Blueprint, and you can update your audience through an RSS subscription.  You can include DLLs (imagine never having to download and install a hotfix again!)

This is fantastic for giving directions.  It’s teaching you to fish, rather than just handing you a fish template.  Let’s call this Fish Level 100.

Fish Level 200 is Code Resources.  Say I’ve built a custom Fish class – unfolding a Blueprint that contains it will add this class to your project.  Fish Level 300 is built-in commands (back to handing you the fish template); 400 is Solution templates (cooking the fish for you); 500 is altering Visual Studio to become Fishual Studio.

Here’s what I’m excited about – in one of those levels, I should be able to design a Blueprint so that I can tell you – Add a Goldfish to your project.  If you add the Goldfish, the activity goes green and you can continue to the next activity.  If you add a Flounder, the activity stays red.

At least, that’s what I was shown I could do at the PDC demo.  And that’s what the screenshot on MSDN shows I can do.  But I can’t find any samples of it being done!

So far, I’m seeing quite a bit of fluff.  I’ve downloaded and installed the Blueprints Manager and every sample I could get my hands on, read through forums and discussions, watched videos, and pressed every button.  The closest I’ve come to seeing anything useful used the Guidance Package Manager, which the Blueprints Manager is supposed to replace!

On another note, if you go to the Codeplex site, it says “Please also: Visit our MSDN site”… which gives you the related link back to the Codeplex site.  Sheesh.

The Blueprints are definitely useful, even in their infancy – I will be building some Atalasoft Blueprints to demonstrate adding functionality to your applications.  For this, I highly recommend installing the Blueprints Manager if you have Visual Studio 2008.

“And so, because of the automated and irrevocable decision-making process which rules out human meddling, the Doomsday machine is terrifying and simple to understand... and completely credible and convincing.”

 

Posted by Elaine | 0 Comments

PDC 2008 -- Keep your head and hands inside the car at all times.

Microsoft’s Professional Developer’s Conference 2008 – Pretty Darn Cool.

So, sports fans and software enthusiasts, I haven’t updated in a few weeks. I’m here now to tell you all about this year’s PDC conference. The main course on the table was Windows Azure, Microsoft’s answer for cloud computing.

So, what is cloud computing, and why is Microsoft getting into it? First answer, it is a platform for you to run your ASP.Net applications on, eliminating the need for on-site servers to host applications, while also adding enhancements like SQL Services and Live Services (a way to let users use their MS Live IDs to authenticate themselves). Second answer, Amazon, Force.com, and Google all provide a cloud platform already. :-)

Now, there are two major caveats to impart before you rush out and download the SDK. #1 – the Azure SDK will not install on Windows XP-based machines. #2 – it cannot handle unmanaged code at the moment, which means DotImage is a no-go (we use both managed and unmanaged code – see Steve’s recent article for an explanation of the difference).

Some benefits to Windows Azure…

1. Need to expand your hardware? Not with Azure. Microsoft has said they will charge based on consumption, letting you expand as you need, or retract services if they are not used.

2. If you use Azure for application deployment, you will not have downtime while upgrading your application. They have a method to “switch” an application from Production to Staging seamlessly (switching the app back will allow for rollback if something goes wrong).

Some drawbacks…

1. To make changes to your data itself, you will need to include version numbers on your tables or adjust your code for old or new data – there’s no “backup” for the tables.

2. Right now, there is only one datacenter for running Azure services. Of course, that will expand to 9 or 10 worldwide when Azure goes live for everyone, but that opens up geopolitical ramifications.

 This is just a brief opening for Azure. Tomorrow, I’ll be putting together a demo application. After that, I’ll be talking about Windows 7 (no more UAC? Haha), Blueprints, and “M” (a.k.a. Oslo – MS’s new modeling platform).

Also, if you find yourself out in Los Angeles and have an opportunity to go Universal Studios, regardless of the length of the line, get on the Simpsons Ride.  So worth it.

Posted by Elaine | 0 Comments

As SpongeBob says, "Where's the love?"

On a Seth Godin kick recently, dear readers.  Recently, he talked about being nice.

There is no cost for being nice; in my point of view (and as supervisor, it's also a demand of this department), being nice is required.  It is a skill at which both Kevin and I excel.  In fact, you would not be hired for Atalasoft Developer Support if you weren't nice.  You would be escorted (nicely) to the door.

When dealing with customers you don't meet face to face, it is easy to forget that you are talking to a person.  Customers, by the same token, may forget that we in support are human beings, too.  Which leads to my real point for writing.  Does paying for a first class seat or first class support entitle the customer to be rude?

So, to play devil's advocate to Seth's examples, what amount of money is worth the following:

Paying money to get on an airplane and saying, "Stewardess.  Go get me a cocktail.  And a pillow.  Now."

Paying money for the presidential suite and saying, "You're just a maid.  Go get me some more towels.  These aren't fluffy enough."

Paying money for the gold support and saying, "Your app works and mine doesn't.  Fix my code for me."

In that last case, I will help you debug your code -- I will *not* debug your code for you. 

Do I get paid to take abuse?  Thus far, 99.6% of my customers are nice.  Not all, and most likely, that might have just been a bad day or a particularly frustrating problem.  One customer demanded we implement a fix.  That particular solution would have required a month of Sundays from our engineers, and was only applicable to that person's particular situation.  When I explained to that person that we weren't going to fix the problem, but would give all of our help to develop a work-around, I think the spell-checker may have caught and filtered the blue words.  What if it had been a phone call?

Rudeness doesn't go anywhere with me, and it certainly doesn't give you higher priority over other customers.

Saying "please" and "thank you" goes a long way, no matter which side of the phone you're on.  My mom taught me that.

Posted by Elaine | 0 Comments

A strange game. The only winning move is not to play. How about a nice game of chess?

Seth Godin wrote an interesting blog article about how to consider the, ahem, inexperienced.

From a software support perspective, the question is, how much should I expect my end-user to know?  If someone asks me a basic question about DotImage, then I answer it without hesitation.  But what if someone asks me a programming question?  For example, how to create a for-loop?  Or what is a static constructor (public shared for you VB.Net programmers)?

Generally, I just answer the question, but they do stack up with a nOOb.  And at a rapid pace.  As I put together a training manual and application, I am trying to keep things simple so a person can find what they are looking for in an instant.  No complicated mathematical formulas, no high-level behavioral concepts.  Click leads to code leads to action.  Am I shorting my advanced users by doing this?  Yes and no.  No, because they would never have need of a document like this.  Yes, because I can't get into the "really cool stuff".

Add to that, who ever admits they're not part of the elite?

Seth suggests telling someone "this might just not be for you".  How do you say that to someone who has sought out your product, evaluated it, and purchased it?  Or worse, they're using it because someone *else* evaluated it and purchased it, and they're stuck with it.  His approach is good for someone with the luxury of being able to tell someone "no."  It doesn't apply to someone who has already spent thousands of dollars.

Every support person has fantasized about telling the user to send back the computer, but that is definitely not an option.

From the other side, how would I like to be treated?  Personally, I would appreciate someone giving me the basics, but I would not want to waste someone's time (trust me, I've asked my share of dumb questions).

I guess the real problem is not answering the simple questions, but having to answer lots of simple questions.  It rather feels like I'm just giving away goldfish instead of fishing poles.  And when it's a repeat offender, I wonder why they are programming -- maybe it's not our software that's not right for the person, but development in general.

I'm not writing this to dissuade people from asking me questions; on the contrary, I would rather someone ask me than do something wrong.  But if I gently suggest to a person that he/she would be better off consulting a C# manual or MSDN, I hope they will not be offended.

Posted by Elaine | 1 Comments

I am looking forward to completing your training. In time, you will call me... Master.

Salutations, campers.

I am currently working on eliminating my job... sort of.  I am hard at work on a customer training manual, to help everyone out there who ever once said, "I can't find anything in the documentation", or, "The documentation... <insert derogatory verb here>!"

It's not an easy thing to write a training manual on a topic you already know.  Do I repeat to myself each step as I code new applications?  Of course not; some things are just ingrained into head as "the way to do things", like adding the ImageCache folder to a WebApplication and putting the AppSettings key into the Web.Config.

Another hard part of writing a manual is what tone to use.  Do I assume basic programming techniques?  Do I write a version for C# and one for VB.Net?  Do I include code snippets, or write full-blown applications for each topic (I'm choosing the latter on that one -- I can always add the snippets later on).  Who is my general audience?

In the DotImage 6.0c release newsletter, Marketing Dude Eric released a training survey to get feedback from everyone.  Basic questions were included -- how many days do you think it should take, would you travel or want the trainer to travel to you, et cetera.  There is even a chance to win a $50 Amazon gift certificate by completing  the survey.

Click here to take the survey

Additionally, we have an email if you have questions, opinions, or suggestions about training.

pictureofemailaddress

So, if this manual is successful, you won't need me anymore.  And I can focus on my own training to become a cage fighter.
Posted by Elaine | 0 Comments
More Posts Next page »