Showing posts with label tools. Show all posts
Showing posts with label tools. Show all posts

NPOI 2.0 series of posts scheduled

NPOI logoWhat’s NPOI you may ask. So here it goes:

NPOI is the .NET version of POI Java project. POI is an open source project which can help you read/write Office 2003/2007 files.

NPOI advantages
a. It's totally free to use
b. Cover most Excel features (cell styles, data formats, formulas and so on)
c. Supports .xls, .xlsx, .docx
d. Designed to be interface-oriented (in NPOI.SS namespace)
e. Supports not only export but also import
f. .NET 2.0 based even for xlsx and docx (but it also supports .NET 4.0)
g. Successful use cases all over the world
h. Great amount of basic and to the point samples
i. Professional service support (even 24*7) directly from NPOI team (not free)

My dear friend Tony Qu from China (the guy behind NPOI development) approached me and asked me to help him share NPOI 2.0 news with the English speakers. I’m always glad to help spread the word about this amazing open source project that has served me in many situations.

The most seen and shared post of this humble blog as of now has almost 9000 shares and was published on 7/02/2009 – oh God that’s exactly 4.5 years ago… its title is Creating Excel spreadsheets .XLS and .XLSX in C#. This huge amount of shares shows that a tool that does what NPOI does is highly demanded in the market. No doubt!

You know: when I wrote that post I had no idea it would be so useful to so many people. My intention with this blog is really to share useful things with the world giving back a bit of what I find/learn/improve from the great minds spread throughout this big planet earth. This is a continuous\infinite process for sure.

OK dude: that’s enough of food for thought. Let me show you what’s going on with NPOI. Here you go…

NPOI 2.0 release
The release is planned for this January. We agreed to publish posts discussing major features/enhancements that’s arriving.

Here they are:

1 - WorkbookFactory can help make HSSF and XSSF transparent for users

2 - Excel 2007 and Word 2007 support

3 - Cell, Row, Sheet copying and Workbook merging

4 - Converting Excel XLS documents to HTML format

5 - isRightToLeft and setRightToLeft in XSSF and HSSF

6 - Diagonal line in cells for both Excel 2003 and Excel 2007

7 - Excel 2007 chart support

8 - New excel functions added in formula calculation

9 - NPOI tag added to files generated with NPOI

10 - XSSFWorkbook implements IEnumerator

Keep an eye on this blog for the next posts.

NPOI source code 
https://github.com/tonyqus/npoi

NPOI NuGet package
https://www.nuget.org/packages/NPOI/2.0.6

MP3 Scan+Repair tool for iTunes on Mac OS

This is another post to add to my MP3 series

Yesterday I tried to add/import a folder full of MP3 files to my iTunes library. Just after adding I opened iTunes and went check those MP3s. To my surprise the MP3s were not added to iTunes. I had a hard time trying to find those files since iTunes moved them from their initial location to a special folder called Not Added. My MP3s ended up here:

/Users/leniel/Music/iTunes/iTunes Media/Automatically Add to iTunes/Not Added/2012-01-16 14.34.38

Note that iTunes created a folder inside Not Added named with the date and time the import operation occurred. The folder Not Added also stores image files and whatever file iTunes doesn’t recognize as valid files to be imported.

Now I see that I have some folders like that one - that are being created since 2010-9-17 (when I bought my Mac mini) and some of those folders have MP3 files that I didn’t notice were missing in my library. Smiley decepcionado

MP3 Scan+Repair LogoThen I realized that for some odd reason iTunes rejected those files. I googled about it with "iTunes won't import MP3" and to my delight I found a forum thread in which the user Afric Pepperbird recommended a fantastic tool called MP3 Scan+Repair by Christian Zuckschwerdt. Using this great piece of software I managed to add those MP3s to my iTunes library.

So as way to say thanks I decided to write a post to demonstrate how it works.

1 - Download MP3 Scan+Repair (it's in Beta and is free for the moment)

http://triq.net/articles/mp3-scan-repair-download

2 - Open the App and drag and drop the problematic folder (the one that lies within the Not Added folder) to the app screen:

MP3 Scan+Repair main screenFigure 1 - MP3 Scan+Repair main screen

3 - Select all the files using command+A and then click the hammer button (mouse button is over it) to repair the files:

MP3 Scan+Repair listing the files and their respective problemsFigure 2 - MP3 Scan+Repair listing the files and their respective problems

See the Messages column with the description of what’s wrong with each file… even warnings prevent iTunes from adding the MP3 file to its library.

When repairing MP3 Scan+Repair will try to recreate the MP3s moving the old ones to the trash and writing the new ones to the current folder.

After following these easy steps you should be good to go and add those MP3s files to your iTunes media library.

The app is straightforward and does what it advertises… I’m really satisfied!

SVN, Hudson & MSBuild - Building code on post commit

SVN, Hudson and MSBuild - Revision control repository
SVN, Hudson and MSBuild - Continuous Integration

This is the third and last installment in the series I’m writing about SVN, Hudson and MSBuild.

Today I’m going to show you the last piece that actually makes the whole thing work. We could call this the plumbing. The piece lies within a specific SVN folder related to your project. It’s called hooks. The path to the hooks folder is this:

Project’s hooks folder before the set upFigure 1 - Project’s hooks folder before the setup

As you can see there are some template files ( .tmpl ). The one we’re going to use to inform Hudson that it’s time to build the code just committed to the repository is the file post.commit.tmpl. Make a copy of this file and change its extension to .bat since it’ll be used by SVN to execute some commands. The file should be named post-commit.bat.

Open the .bat file and add this code at the end:

SET REPOS=%1
SET REV=%2
SET CSCRIPT=C:\WINDOWS\system32\cscript.exe
SET VBSCRIPT=C:\svn\post-commit-hook-hudson.vbs
SET SVNLOOK=C:\Program Files\VisualSVN Server\bin\svnlook.exe
SET HUDSON=http://leniel-pc:8080/
"%CSCRIPT%" "%VBSCRIPT%" "%REPOS%" %REV% "%SVNLOOK%" %HUDSON%

Note above that we’re setting some vars and pointing to some specific files:

- CSCRIPT points to cscript.exe file that should be present in your Windows system32 folder.

- VBSCRIPT points to to the post-commit-hook-hudson.vbs file and its code is as follows:

repos   = WScript.Arguments.Item(0)
rev     = WScript.Arguments.Item(1)
svnlook = WScript.Arguments.Item(2)
hudson  = WScript.Arguments.Item(3)

Set shell = WScript.CreateObject("WScript.Shell")

Set uuidExec = shell.Exec(svnlook & " uuid " & repos)
Do Until uuidExec.StdOut.AtEndOfStream
  uuid = uuidExec.StdOut.ReadLine()
Loop
Wscript.Echo "uuid=" & uuid

Set changedExec = shell.Exec(svnlook & " changed --revision " & rev & " " & repos)
Do Until changedExec.StdOut.AtEndOfStream
  changed = changed + changedExec.StdOut.ReadLine() + Chr(10)
Loop
Wscript.Echo "changed=" & changed

url = hudson + "subversion/" + uuid + "/notifyCommit?rev=" + rev
Wscript.Echo url

Set http = CreateObject("Microsoft.XMLHTTP")
http.open "POST", url, False
http.setRequestHeader "Content-Type", "text/plain;charset=UTF-8"
http.send changed

- SVNLOOK points to svnlook.exe file that comes with VisualSVN Server (see part 1 of this series for more details about it).

- HUDSON points to your Hudson server address. Change it accordingly.

With it all configured we should be ready to get an automatic build when code is committed to the repository.

To test your environment, change any file already versioned and commit it. Open Hudson in your browser and watch a new build start automatically.

If you look in Hudson’s build Console Output you’ll see that the build was initiated by an SCM change.

That’s all!

This is how your SVN project hooks folder should look like now:

Project’s hooks folder after the set upFigure 2 - Project’s hooks folder after the setup

Can you spot another .bat file in the folder? It’s the pre-revprop-change.bat. I’ve been using it so that I can modify the commit’s log message/comment when I forget to mention something or to correct spelling. More info about this file can be seen in this StackOverflow question: What is a pre-revprop-change hook in SVN and how do I create it?

SVN, Hudson and MSBuild - Continuous Integration

SVN, Hudson and MSBuild - Revision control repository
SVN, Hudson and MSBuild - Building code on post commit

This is the second installment in the series I’m writing about SVN, Hudson and MSBuild.

This time I’ll show you how to set up a job in Hudson to build and package an ASP.NET MVC 3 Hello World sample app (download it here). This job will point to the SVN repository set up in the 1st part of this series. I’ve committed the app’s source code to the trunk folder and it’s now versioned.

Question: Why should I use a Continuous Integration ( CI ) process?

Because it allows you to fine tune and extend your build process. You’ll be able to plug hooks in various stages of your build process. CI gives you more control over the process allowing an infinite set of possibilities as for example an automated build => test => package => deploy scenario.

In this post I’m going to show this simple workflow: build => package

So, to start off, the first thing you should do is to download Hudson at http://hudson-ci.org/. The latest production version is 2.1.0 as of the time of this post. Download the .war file (53.3 MB) to your C:/ drive to keep things at hand. When the download finishes, read this thorough installation guide: Install Hudson as a Windows service. This is how I’ve set up Hudson. There should be no errors if you follow the instructions.

Note
Open a command prompt at C:\ and type:

java -jar hudson-2.1.0.war

This will start Hudson and you should be able to install it as a service following this link.

Now I suppose you have Hudson working on your machine.

Head over to you Hudson instance that is located at this URL by default:

http://localhost:8080/

Let’s configure a new Job in Hudson:

Selecting New Job in Hudson dashboardFigure 1 - Selecting New Job in Hudson dashboard

When you click the New Job link you go to a screen where you can give a name to the job and choose what kind of build you want the job to execute.

I named the job HelloWorldMvc3 and selected Build a free-style software project because it fits the purpose of this series.

* As you can see I already have a job called FitnessCenter configured.

Naming the New Job and selecting the build typeFigure 2 - Naming the New Job and selecting the build type

After clicking OK we go to a new page that allows us to enter detailed configuration settings. The following image shows the options I used (click the image to enlarge it):

Configuring the job and adding a Visual Studio project or solution build stepFigure 3 - Configuring the job and adding a Visual Studio project or solution build step

Note above in the Source Code Management section that I have chosen Subversion and passed the Repository URL:

file:///C:/svn/MyProject/trunk

The path above is related to the SVN repository I set up here.

The sample ASP.NET MVC 3 Hello World app is located in the /trunk folder.

Now we must add a build step to tell Hudson we want to build and package the app as part of the job execution. I have highlighted the option in blue in Figure 3 above. I selected Build a Visual Studio project or solution using MSBuild.

When you add that build step you must pass some info to Hudson as shown in the following picture:

Selecting MSBuild version, filling MSBuild Build File and specifying the command line arguments

Figure 4 - Selecting MSBuild version, filling MSBuild Build File and specifying the command line arguments

MsBuild Build File = the path to the .proj or .sln file that MSBuild will use to build. This path is related to the trunk folder structure you have. In this case I have this folder structure:

C:\MyProject\trunk\HelloWorldMvc3\HelloWorldMvc3.csproj

Command Line Arguments = a whitespace separated list of command line arguments you can specify. These can be the same as if you were to run msbuild from the command line.

I used these command line arguments above to package the app:

/T:Package /P:Configuration=Release;
SolutionDir="C:\hudson\jobs\MyProject\workspace\;
PackageLocation="C:\MyProject\Package.zip"

Apontando para cima These command line arguments are power in our hands…

You can also select post-build actions as to send an e-mail notification. If configured, Hudson will send out an e-mail to the specified recipients when a certain important event occurs:
1 - Every failed build triggers a new e-mail.
2 - A successful build after a failed (or unstable) build triggers a new e-mail, indicating that a crisis is over.
3 - An unstable build after a successful build triggers a new e-mail, indicating that there's a regression.
4 - Unless configured, every unstable build triggers a new e-mail, indicating that regression is still there.

When you finish the configuration, make sure to click the Save button.

This is everything you need to configure a new job in Hudson.

With this we achieved our objective, that is, Hudson and SVN are now plugged.

To run the job and build the app I just have to click the Build Now link in Hudson panel (see left menu bar at the top in Figure 3) but the great thing about a Continuous Integration process it to have the build process happen automatically and this is definitely possible.

Summary
Hudson is a free CI server which makes it a viable option for the majority of developers and companies out there that don’t want to spend a lot of money with equivalent expensive software. Besides, as you saw in this post you can get it working with Subversion in a couple of minutes.

Hudson has a lot of additional goodies that you can and should explore. Go over each menu option to learn about its additional features.

Next in this series
In the next and final part of this series I’m going to show you what’s missing to get SVN to inform Hudson that it’s time to build the code just committed to the repository. In the meanwhile I’ll entertain you with the Console Output regarding the first execution of the job we created in this post. It took only 08.33 seconds to build and package the app in a beautiful .zip package that can be used to deploy the app in IIS (I'll do a blog post about this topic in the future):

Started by user anonymous
Checking out file:///C:/svn/MyProject/trunk
A         HelloWorldMvc3.sln
AU        HelloWorldMvc3.suo
A         HelloWorldMvc3
A         HelloWorldMvc3\HelloWorldMvc3.csproj
A         HelloWorldMvc3\Properties
A         HelloWorldMvc3\Properties\AssemblyInfo.cs
A         HelloWorldMvc3\Web.Release.config
A         HelloWorldMvc3\packages.config
A         HelloWorldMvc3\Global.asax
A         HelloWorldMvc3\Controllers
A         HelloWorldMvc3\Controllers\HomeController.cs
A         HelloWorldMvc3\Controllers\AccountController.cs
A         HelloWorldMvc3\Web.Debug.config
A         HelloWorldMvc3\App_Data
A         HelloWorldMvc3\Scripts
A         HelloWorldMvc3\Scripts\modernizr-1.7.js
A         HelloWorldMvc3\Scripts\jquery.validate.js
A         HelloWorldMvc3\Scripts\jquery.unobtrusive-ajax.js
A         HelloWorldMvc3\Scripts\MicrosoftMvcValidation.js
A         HelloWorldMvc3\Scripts\jquery.validate-vsdoc.js
A         HelloWorldMvc3\Scripts\MicrosoftMvcAjax.js
A         HelloWorldMvc3\Scripts\jquery.validate.unobtrusive.min.js
A         HelloWorldMvc3\Scripts\MicrosoftMvcValidation.debug.js
A         HelloWorldMvc3\Scripts\jquery-1.5.1-vsdoc.js
A         HelloWorldMvc3\Scripts\MicrosoftMvcAjax.debug.js
A         HelloWorldMvc3\Scripts\jquery-ui-1.8.11.min.js
A         HelloWorldMvc3\Scripts\jquery-1.5.1.min.js
A         HelloWorldMvc3\Scripts\MicrosoftAjax.js
A         HelloWorldMvc3\Scripts\jquery-ui-1.8.11.js
A         HelloWorldMvc3\Scripts\jquery-1.5.1.js
A         HelloWorldMvc3\Scripts\MicrosoftAjax.debug.js
A         HelloWorldMvc3\Scripts\modernizr-1.7.min.js
A         HelloWorldMvc3\Scripts\jquery.validate.min.js
A         HelloWorldMvc3\Scripts\jquery.unobtrusive-ajax.min.js
A         HelloWorldMvc3\Scripts\jquery.validate.unobtrusive.js
A         HelloWorldMvc3\Content
A         HelloWorldMvc3\Content\themes
A         HelloWorldMvc3\Content\themes\base
A         HelloWorldMvc3\Content\themes\base\jquery.ui.base.css
A         HelloWorldMvc3\Content\themes\base\jquery.ui.slider.css
A         HelloWorldMvc3\Content\themes\base\jquery.ui.button.css
A         HelloWorldMvc3\Content\themes\base\jquery.ui.progressbar.css
A         HelloWorldMvc3\Content\themes\base\jquery.ui.accordion.css
A         HelloWorldMvc3\Content\themes\base\jquery.ui.theme.css
A         HelloWorldMvc3\Content\themes\base\jquery.ui.selectable.css
A         HelloWorldMvc3\Content\themes\base\jquery.ui.resizable.css
A         HelloWorldMvc3\Content\themes\base\jquery.ui.autocomplete.css
A         HelloWorldMvc3\Content\themes\base\jquery.ui.dialog.css
A         HelloWorldMvc3\Content\themes\base\images
AU        HelloWorldMvc3\Content\themes\base\images\ui-bg_glass_95_fef1ec_1x400.png
AU        HelloWorldMvc3\Content\themes\base\images\ui-icons_2e83ff_256x240.png
AU        HelloWorldMvc3\Content\themes\base\images\ui-bg_flat_75_ffffff_40x100.png
AU        HelloWorldMvc3\Content\themes\base\images\ui-bg_glass_55_fbf9ee_1x400.png
AU        HelloWorldMvc3\Content\themes\base\images\ui-icons_222222_256x240.png
AU        HelloWorldMvc3\Content\themes\base\images\ui-icons_888888_256x240.png
AU        HelloWorldMvc3\Content\themes\base\images\ui-bg_glass_65_ffffff_1x400.png
AU        HelloWorldMvc3\Content\themes\base\images\ui-icons_454545_256x240.png
AU        HelloWorldMvc3\Content\themes\base\images\ui-icons_cd0a0a_256x240.png
AU        HelloWorldMvc3\Content\themes\base\images\ui-bg_glass_75_e6e6e6_1x400.png
AU        HelloWorldMvc3\Content\themes\base\images\ui-bg_flat_0_aaaaaa_40x100.png
AU        HelloWorldMvc3\Content\themes\base\images\ui-bg_highlight-soft_75_cccccc_1x100.png
AU        HelloWorldMvc3\Content\themes\base\images\ui-bg_glass_75_dadada_1x400.png
A         HelloWorldMvc3\Content\themes\base\jquery.ui.datepicker.css
A         HelloWorldMvc3\Content\themes\base\jquery.ui.all.css
A         HelloWorldMvc3\Content\themes\base\jquery.ui.tabs.css
A         HelloWorldMvc3\Content\themes\base\jquery.ui.core.css
A         HelloWorldMvc3\Content\Site.css
A         HelloWorldMvc3\Global.asax.cs
A         HelloWorldMvc3\Models
A         HelloWorldMvc3\Models\AccountModels.cs
A         HelloWorldMvc3\Web.config
A         HelloWorldMvc3\Views
A         HelloWorldMvc3\Views\Shared
A         HelloWorldMvc3\Views\Shared\_Layout.cshtml
A         HelloWorldMvc3\Views\Shared\Error.cshtml
A         HelloWorldMvc3\Views\Shared\_LogOnPartial.cshtml
A         HelloWorldMvc3\Views\_ViewStart.cshtml
A         HelloWorldMvc3\Views\Web.config
A         HelloWorldMvc3\Views\Account
A         HelloWorldMvc3\Views\Account\ChangePasswordSuccess.cshtml
A         HelloWorldMvc3\Views\Account\LogOn.cshtml
A         HelloWorldMvc3\Views\Account\Register.cshtml
A         HelloWorldMvc3\Views\Account\ChangePassword.cshtml
A         HelloWorldMvc3\Views\Home
A         HelloWorldMvc3\Views\Home\Index.cshtml
A         HelloWorldMvc3\Views\Home\About.cshtml
AU        HelloWorldMvc3.sln.docstates.suo
A         packages
A         packages\jQuery.UI.Combined.1.8.11
A         packages\jQuery.UI.Combined.1.8.11\Content
A         packages\jQuery.UI.Combined.1.8.11\Content\Scripts
A         packages\jQuery.UI.Combined.1.8.11\Content\Scripts\jquery-ui-1.8.11.min.js
A         packages\jQuery.UI.Combined.1.8.11\Content\Scripts\jquery-ui-1.8.11.js
A         packages\jQuery.UI.Combined.1.8.11\Content\Content
A         packages\jQuery.UI.Combined.1.8.11\Content\Content\themes
A         packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base
A         packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\jquery.ui.base.css
A         packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\jquery.ui.slider.css
A         packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\jquery.ui.button.css
A         packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\jquery.ui.progressbar.css
A         packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\jquery.ui.accordion.css
A         packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\jquery.ui.theme.css
A         packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\jquery.ui.selectable.css
A         packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\jquery.ui.resizable.css
A         packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\jquery.ui.autocomplete.css
A         packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\jquery.ui.dialog.css
A         packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\images
AU        packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\images\ui-bg_glass_95_fef1ec_1x400.png
AU        packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\images\ui-icons_2e83ff_256x240.png
AU        packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\images\ui-bg_flat_75_ffffff_40x100.png
AU        packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\images\ui-bg_glass_55_fbf9ee_1x400.png
AU        packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\images\ui-icons_222222_256x240.png
AU        packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\images\ui-icons_888888_256x240.png
AU        packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\images\ui-bg_glass_65_ffffff_1x400.png
AU        packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\images\ui-icons_454545_256x240.png
AU        packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\images\ui-icons_cd0a0a_256x240.png
AU        packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\images\ui-bg_glass_75_e6e6e6_1x400.png
AU        packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\images\ui-bg_flat_0_aaaaaa_40x100.png
AU        packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\images\ui-bg_highlight-soft_75_cccccc_1x100.png
AU        packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\images\ui-bg_glass_75_dadada_1x400.png
A         packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\jquery.ui.datepicker.css
A         packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\jquery.ui.all.css
A         packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\jquery.ui.tabs.css
A         packages\jQuery.UI.Combined.1.8.11\Content\Content\themes\base\jquery.ui.core.css
AU        packages\jQuery.UI.Combined.1.8.11\jQuery.UI.Combined.1.8.11.nupkg
A         packages\jQuery.Validation.1.8.0
A         packages\jQuery.Validation.1.8.0\Content
A         packages\jQuery.Validation.1.8.0\Content\Scripts
A         packages\jQuery.Validation.1.8.0\Content\Scripts\jquery.validate.js
A         packages\jQuery.Validation.1.8.0\Content\Scripts\jquery.validate-vsdoc.js
A         packages\jQuery.Validation.1.8.0\Content\Scripts\jquery.validate.min.js
AU        packages\jQuery.Validation.1.8.0\jQuery.Validation.1.8.0.nupkg
A         packages\jQuery.vsdoc.1.5.1
A         packages\jQuery.vsdoc.1.5.1\Content
A         packages\jQuery.vsdoc.1.5.1\Content\Scripts
A         packages\jQuery.vsdoc.1.5.1\Content\Scripts\jquery-1.5.1-vsdoc.js
AU        packages\jQuery.vsdoc.1.5.1\jQuery.vsdoc.1.5.1.nupkg
A         packages\repositories.config
A         packages\EntityFramework.4.1.10331.0
AU        packages\EntityFramework.4.1.10331.0\EntityFramework.4.1.10331.0.nupkg
A         packages\EntityFramework.4.1.10331.0\lib
AU        packages\EntityFramework.4.1.10331.0\lib\EntityFramework.dll
A         packages\EntityFramework.4.1.10331.0\lib\EntityFramework.xml
A         packages\jQuery.1.5.1
AU        packages\jQuery.1.5.1\jQuery.1.5.1.nupkg
A         packages\jQuery.1.5.1\Content
A         packages\jQuery.1.5.1\Content\Scripts
A         packages\jQuery.1.5.1\Content\Scripts\jquery-1.5.1.min.js
A         packages\jQuery.1.5.1\Content\Scripts\jquery-1.5.1.js
A         packages\Modernizr.1.7
AU        packages\Modernizr.1.7\Modernizr.1.7.nupkg
A         packages\Modernizr.1.7\Content
A         packages\Modernizr.1.7\Content\Scripts
A         packages\Modernizr.1.7\Content\Scripts\modernizr-1.7.min.js
A         packages\Modernizr.1.7\Content\Scripts\modernizr-1.7.js
At revision 2
Path To MSBuild.exe: C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe
Executing command: cmd.exe /C C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /T:Package /P:Configuration=Debug;SolutionDir=C:\hudson\jobs\MyProject\workspace\;PackageLocation=C:\MyProject\Package.zip HelloWorldMvc3\HelloWorldMvc3.csproj && exit %%ERRORLEVEL%%
[workspace] $ cmd.exe /C C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /T:Package /P:Configuration=Debug;SolutionDir=C:\hudson\jobs\MyProject\workspace\;PackageLocation=C:\MyProject\Package.zip HelloWorldMvc3\HelloWorldMvc3.csproj && exit %%ERRORLEVEL%%
Microsoft (R) Build Engine Version 4.0.30319.1
[Microsoft .NET Framework, Version 4.0.30319.454]
Copyright (C) Microsoft Corporation 2007. All rights reserved.

Build started 7/30/2011 12:16:23 AM.
Project "C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\HelloWorldMvc3.csproj" on node 1 (Package target(s)).
ValidateGlobalPackageSetting:
  $(PackageAsSingleFile) is True
  $(PackageFileName) is C:\MyProject\Package.zip. Validating...
PrepareForBuild:
  Creating directory "bin\".
  Creating directory "obj\Debug\".
GenerateTargetFrameworkMonikerAttribute:
Skipping target "GenerateTargetFrameworkMonikerAttribute" because all output files are up-to-date with respect to the input files.
CoreCompile:
  c:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe /noconfig /nowarn:1701,1702 /nostdlib+ /errorreport:prompt /warn:4 /define:DEBUG;TRACE /reference:C:\hudson\jobs\HelloWorldMvc3\workspace\packages\EntityFramework.4.1.10331.0\lib\EntityFramework.dll /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Microsoft.CSharp.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.ComponentModel.DataAnnotations.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Configuration.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Core.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Data.DataSetExtensions.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Data.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Data.Entity.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Drawing.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.EnterpriseServices.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Web.Abstractions.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Web.ApplicationServices.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Web.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Web.DynamicData.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Web.Entity.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Web.Extensions.dll" /reference:"c:\Program Files\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\Assemblies\System.Web.Helpers.dll" /reference:"c:\Program Files\Microsoft ASP.NET\ASP.NET MVC 3\Assemblies\System.Web.Mvc.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Web.Routing.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Web.Services.dll" /reference:"c:\Program Files\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\Assemblies\System.Web.WebPages.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Xml.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Xml.Linq.dll" /debug+ /debug:full /optimize- /out:obj\Debug\HelloWorldMvc3.dll /target:library Controllers\AccountController.cs Controllers\HomeController.cs Global.asax.cs Models\AccountModels.cs Properties\AssemblyInfo.cs "C:\Windows\TEMP\.NETFramework,Version=v4.0.AssemblyAttributes.cs"
_CopyFilesMarkedCopyLocal:
  Copying file from "C:\hudson\jobs\HelloWorldMvc3\workspace\packages\EntityFramework.4.1.10331.0\lib\EntityFramework.dll" to "bin\EntityFramework.dll".
  Copying file from "C:\hudson\jobs\HelloWorldMvc3\workspace\packages\EntityFramework.4.1.10331.0\lib\EntityFramework.xml" to "bin\EntityFramework.xml".
CopyFilesToOutputDirectory:
  Copying file from "obj\Debug\HelloWorldMvc3.dll" to "bin\HelloWorldMvc3.dll".
  HelloWorldMvc3 -> C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\bin\HelloWorldMvc3.dll
  Copying file from "obj\Debug\HelloWorldMvc3.pdb" to "bin\HelloWorldMvc3.pdb".
CollectFilesFromIntermediateAssembly:
  Gather all files from Project items @(IntermediateAssembly). Adding:
  bin\HelloWorldMvc3.dll to bin\HelloWorldMvc3.dll
  bin\HelloWorldMvc3.pdb to bin\HelloWorldMvc3.pdb
CollectFilesFromContent:
  Gather all files from Project items @(Content). Adding:
  Content\themes\base\images\ui-bg_flat_0_aaaaaa_40x100.png;Content\themes\base\images\ui-bg_flat_75_ffffff_40x100.png;Content\themes\base\images\ui-bg_glass_55_fbf9ee_1x400.png;Content\themes\base\images\ui-bg_glass_65_ffffff_1x400.png;Content\themes\base\images\ui-bg_glass_75_dadada_1x400.png;Content\themes\base\images\ui-bg_glass_75_e6e6e6_1x400.png;Content\themes\base\images\ui-bg_glass_95_fef1ec_1x400.png;Content\themes\base\images\ui-bg_highlight-soft_75_cccccc_1x100.png;Content\themes\base\images\ui-icons_222222_256x240.png;Content\themes\base\images\ui-icons_2e83ff_256x240.png;Content\themes\base\images\ui-icons_454545_256x240.png;Content\themes\base\images\ui-icons_888888_256x240.png;Content\themes\base\images\ui-icons_cd0a0a_256x240.png;Content\themes\base\jquery.ui.accordion.css;Content\themes\base\jquery.ui.all.css;Content\themes\base\jquery.ui.autocomplete.css;Content\themes\base\jquery.ui.base.css;Content\themes\base\jquery.ui.button.css;Content\themes\base\jquery.ui.core.css;Content\themes\base\jquery.ui.datepicker.css;Content\themes\base\jquery.ui.dialog.css;Content\themes\base\jquery.ui.progressbar.css;Content\themes\base\jquery.ui.resizable.css;Content\themes\base\jquery.ui.selectable.css;Content\themes\base\jquery.ui.slider.css;Content\themes\base\jquery.ui.tabs.css;Content\themes\base\jquery.ui.theme.css;Global.asax;Scripts\jquery-1.5.1-vsdoc.js;Scripts\jquery-1.5.1.js;Scripts\jquery-1.5.1.min.js;Scripts\jquery-ui-1.8.11.js;Scripts\jquery-ui-1.8.11.min.js;Scripts\jquery.validate-vsdoc.js;Scripts\jquery.validate.js;Scripts\jquery.validate.min.js;Scripts\modernizr-1.7.js;Scripts\modernizr-1.7.min.js;Web.config;Web.Debug.config;Web.Release.config;Content\Site.css;Scripts\jquery.unobtrusive-ajax.js;Scripts\jquery.unobtrusive-ajax.min.js;Scripts\jquery.validate.unobtrusive.js;Scripts\jquery.validate.unobtrusive.min.js;Scripts\MicrosoftAjax.js;Scripts\MicrosoftAjax.debug.js;Scripts\MicrosoftMvcAjax.js;Scripts\MicrosoftMvcAjax.debug.js;Scripts\MicrosoftMvcValidation.js;Scripts\MicrosoftMvcValidation.debug.js;Views\_ViewStart.cshtml;Views\Account\ChangePassword.cshtml;Views\Account\ChangePasswordSuccess.cshtml;Views\Account\LogOn.cshtml;Views\Account\Register.cshtml;Views\Home\About.cshtml;Views\Home\Index.cshtml;Views\Shared\Error.cshtml;Views\Shared\_LogOnPartial.cshtml;Views\Shared\_Layout.cshtml;Views\Web.config;packages.config
CollectFilesFromIntermediateSatelliteAssembliesWithTargetPath:
  Gather all files from Project output (IntermediateSatelliteAssembliesWithTargetPath). Adding:
CollectFilesFromReference:
  Gather all files from Project items @(ReferenceCopyLocalPaths,ReferenceComWrappersToCopyLocal,ResolvedIsolatedComModules,_DeploymentLooseManifestFile,NativeReferenceFile).
CollectFilesFromAllExtraReferenceFiles:
  Gather all files from Project items @(AllExtraReferenceFiles). Adding:
CollectFilesFrom_binDeployableAssemblies:
  Gather all files from Project items @(_binDeployableAssemblies). Adding:
PipelineCollectFilesPhase:
  Publish Pipeline Collect Files Phase
CollectWebConfigsToTransform:
  Found The following for Config tranformation:
  Web.config, Views\Web.config
  Creating directory "C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\TransformWebConfig\transformed\".
  Creating directory "C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\TransformWebConfig\transformed\Views\".
PreTransformWebConfig:
  Copying Web.config to obj\Debug\TransformWebConfig\original\Web.config.
TransformWebConfigCore:
  Transforming Source File: C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\Web.config
    Applying Transform File: C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\Web.Debug.config
    Output File: obj\Debug\TransformWebConfig\transformed\Web.config
  Transformation succeeded
PostTransformWebConfig:
  Transformed Web.config using Web.Debug.config into obj\Debug\TransformWebConfig\transformed\Web.config.
PipelineTransformPhase:
  Publish Pipeline Transform Phase
PreAutoParameterizationWebConfigConnectionStrings:
  Creating directory "C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\CSAutoParameterize\transformed\Views\".
  Copying Views\Web.config to obj\Debug\CSAutoParameterize\original\Views\Web.config.
  Copying obj\Debug\TransformWebConfig\transformed\Web.config to obj\Debug\CSAutoParameterize\original\Web.config.
AutoParameterizationWebConfigConnectionStringsCore:
  Transforming Source File: C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\Views\Web.config
    Applying Transform File: <?xml version="1.0"?>
          <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
            <connectionStrings>
              <add
                connectionString="{% token='$(ReplacableToken_#(parameter)_#(tokennumber))' xpathlocator='name' parameter='$(name)-Web.config Connection String' description='$(name) Connection String used in web.config by the application to access the database.' defaultValue='$(connectionString)' tags='SqlConnectionString' %}"
                xdt:Transform="SetTokenizedAttributes(connectionString)" xdt:SupressWarnings="True" />
            </connectionStrings>
          </configuration>
    No element in the source document matches '/configuration/connectionStrings'
    Not executing SetTokenizedAttributes (transform line 6, 15)
    Output File: obj\Debug\CSAutoParameterize\transformed\Views\Web.config
  Transformation succeeded
  Transforming Source File: C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\TransformWebConfig\transformed\Web.config
    Applying Transform File: <?xml version="1.0"?>
          <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
            <connectionStrings>
              <add
                connectionString="{% token='$(ReplacableToken_#(parameter)_#(tokennumber))' xpathlocator='name' parameter='$(name)-Web.config Connection String' description='$(name) Connection String used in web.config by the application to access the database.' defaultValue='$(connectionString)' tags='SqlConnectionString' %}"
                xdt:Transform="SetTokenizedAttributes(connectionString)" xdt:SupressWarnings="True" />
            </connectionStrings>
          </configuration>
    Output File: obj\Debug\CSAutoParameterize\transformed\Web.config
  Transformation succeeded
PostAutoParameterizationWebConfigConnectionStrings:
  Auto ConnectionString Transformed Views\Web.config into obj\Debug\CSAutoParameterize\transformed\Views\Web.config.
  Auto ConnectionString Transformed obj\Debug\TransformWebConfig\transformed\Web.config into obj\Debug\CSAutoParameterize\transformed\Web.config.
CopyAllFilesToSingleFolderForPackage:
  Creating directory "obj\Debug\Package\PackageTmp".
  Copying all files to temporary location below for package/publish:
  obj\Debug\Package\PackageTmp.
  Copying bin\HelloWorldMvc3.dll to obj\Debug\Package\PackageTmp\bin\HelloWorldMvc3.dll.
  Copying bin\HelloWorldMvc3.pdb to obj\Debug\Package\PackageTmp\bin\HelloWorldMvc3.pdb.
  Copying Content\themes\base\images\ui-bg_flat_0_aaaaaa_40x100.png to obj\Debug\Package\PackageTmp\Content\themes\base\images\ui-bg_flat_0_aaaaaa_40x100.png.
  Copying Content\themes\base\images\ui-bg_flat_75_ffffff_40x100.png to obj\Debug\Package\PackageTmp\Content\themes\base\images\ui-bg_flat_75_ffffff_40x100.png.
  Copying Content\themes\base\images\ui-bg_glass_55_fbf9ee_1x400.png to obj\Debug\Package\PackageTmp\Content\themes\base\images\ui-bg_glass_55_fbf9ee_1x400.png.
  Copying Content\themes\base\images\ui-bg_glass_65_ffffff_1x400.png to obj\Debug\Package\PackageTmp\Content\themes\base\images\ui-bg_glass_65_ffffff_1x400.png.
  Copying Content\themes\base\images\ui-bg_glass_75_dadada_1x400.png to obj\Debug\Package\PackageTmp\Content\themes\base\images\ui-bg_glass_75_dadada_1x400.png.
  Copying Content\themes\base\images\ui-bg_glass_75_e6e6e6_1x400.png to obj\Debug\Package\PackageTmp\Content\themes\base\images\ui-bg_glass_75_e6e6e6_1x400.png.
  Copying Content\themes\base\images\ui-bg_glass_95_fef1ec_1x400.png to obj\Debug\Package\PackageTmp\Content\themes\base\images\ui-bg_glass_95_fef1ec_1x400.png.
  Copying Content\themes\base\images\ui-bg_highlight-soft_75_cccccc_1x100.png to obj\Debug\Package\PackageTmp\Content\themes\base\images\ui-bg_highlight-soft_75_cccccc_1x100.png.
  Copying Content\themes\base\images\ui-icons_222222_256x240.png to obj\Debug\Package\PackageTmp\Content\themes\base\images\ui-icons_222222_256x240.png.
  Copying Content\themes\base\images\ui-icons_2e83ff_256x240.png to obj\Debug\Package\PackageTmp\Content\themes\base\images\ui-icons_2e83ff_256x240.png.
  Copying Content\themes\base\images\ui-icons_454545_256x240.png to obj\Debug\Package\PackageTmp\Content\themes\base\images\ui-icons_454545_256x240.png.
  Copying Content\themes\base\images\ui-icons_888888_256x240.png to obj\Debug\Package\PackageTmp\Content\themes\base\images\ui-icons_888888_256x240.png.
  Copying Content\themes\base\images\ui-icons_cd0a0a_256x240.png to obj\Debug\Package\PackageTmp\Content\themes\base\images\ui-icons_cd0a0a_256x240.png.
  Copying Content\themes\base\jquery.ui.accordion.css to obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.accordion.css.
  Copying Content\themes\base\jquery.ui.all.css to obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.all.css.
  Copying Content\themes\base\jquery.ui.autocomplete.css to obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.autocomplete.css.
  Copying Content\themes\base\jquery.ui.base.css to obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.base.css.
  Copying Content\themes\base\jquery.ui.button.css to obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.button.css.
  Copying Content\themes\base\jquery.ui.core.css to obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.core.css.
  Copying Content\themes\base\jquery.ui.datepicker.css to obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.datepicker.css.
  Copying Content\themes\base\jquery.ui.dialog.css to obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.dialog.css.
  Copying Content\themes\base\jquery.ui.progressbar.css to obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.progressbar.css.
  Copying Content\themes\base\jquery.ui.resizable.css to obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.resizable.css.
  Copying Content\themes\base\jquery.ui.selectable.css to obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.selectable.css.
  Copying Content\themes\base\jquery.ui.slider.css to obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.slider.css.
  Copying Content\themes\base\jquery.ui.tabs.css to obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.tabs.css.
  Copying Content\themes\base\jquery.ui.theme.css to obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.theme.css.
  Copying Global.asax to obj\Debug\Package\PackageTmp\Global.asax.
  Copying Scripts\jquery-1.5.1-vsdoc.js to obj\Debug\Package\PackageTmp\Scripts\jquery-1.5.1-vsdoc.js.
  Copying Scripts\jquery-1.5.1.js to obj\Debug\Package\PackageTmp\Scripts\jquery-1.5.1.js.
  Copying Scripts\jquery-1.5.1.min.js to obj\Debug\Package\PackageTmp\Scripts\jquery-1.5.1.min.js.
  Copying Scripts\jquery-ui-1.8.11.js to obj\Debug\Package\PackageTmp\Scripts\jquery-ui-1.8.11.js.
  Copying Scripts\jquery-ui-1.8.11.min.js to obj\Debug\Package\PackageTmp\Scripts\jquery-ui-1.8.11.min.js.
  Copying Scripts\jquery.validate-vsdoc.js to obj\Debug\Package\PackageTmp\Scripts\jquery.validate-vsdoc.js.
  Copying Scripts\jquery.validate.js to obj\Debug\Package\PackageTmp\Scripts\jquery.validate.js.
  Copying Scripts\jquery.validate.min.js to obj\Debug\Package\PackageTmp\Scripts\jquery.validate.min.js.
  Copying Scripts\modernizr-1.7.js to obj\Debug\Package\PackageTmp\Scripts\modernizr-1.7.js.
  Copying Scripts\modernizr-1.7.min.js to obj\Debug\Package\PackageTmp\Scripts\modernizr-1.7.min.js.
  Copying Content\Site.css to obj\Debug\Package\PackageTmp\Content\Site.css.
  Copying Scripts\jquery.unobtrusive-ajax.js to obj\Debug\Package\PackageTmp\Scripts\jquery.unobtrusive-ajax.js.
  Copying Scripts\jquery.unobtrusive-ajax.min.js to obj\Debug\Package\PackageTmp\Scripts\jquery.unobtrusive-ajax.min.js.
  Copying Scripts\jquery.validate.unobtrusive.js to obj\Debug\Package\PackageTmp\Scripts\jquery.validate.unobtrusive.js.
  Copying Scripts\jquery.validate.unobtrusive.min.js to obj\Debug\Package\PackageTmp\Scripts\jquery.validate.unobtrusive.min.js.
  Copying Scripts\MicrosoftAjax.js to obj\Debug\Package\PackageTmp\Scripts\MicrosoftAjax.js.
  Copying Scripts\MicrosoftAjax.debug.js to obj\Debug\Package\PackageTmp\Scripts\MicrosoftAjax.debug.js.
  Copying Scripts\MicrosoftMvcAjax.js to obj\Debug\Package\PackageTmp\Scripts\MicrosoftMvcAjax.js.
  Copying Scripts\MicrosoftMvcAjax.debug.js to obj\Debug\Package\PackageTmp\Scripts\MicrosoftMvcAjax.debug.js.
  Copying Scripts\MicrosoftMvcValidation.js to obj\Debug\Package\PackageTmp\Scripts\MicrosoftMvcValidation.js.
  Copying Scripts\MicrosoftMvcValidation.debug.js to obj\Debug\Package\PackageTmp\Scripts\MicrosoftMvcValidation.debug.js.
  Copying Views\_ViewStart.cshtml to obj\Debug\Package\PackageTmp\Views\_ViewStart.cshtml.
  Copying Views\Account\ChangePassword.cshtml to obj\Debug\Package\PackageTmp\Views\Account\ChangePassword.cshtml.
  Copying Views\Account\ChangePasswordSuccess.cshtml to obj\Debug\Package\PackageTmp\Views\Account\ChangePasswordSuccess.cshtml.
  Copying Views\Account\LogOn.cshtml to obj\Debug\Package\PackageTmp\Views\Account\LogOn.cshtml.
  Copying Views\Account\Register.cshtml to obj\Debug\Package\PackageTmp\Views\Account\Register.cshtml.
  Copying Views\Home\About.cshtml to obj\Debug\Package\PackageTmp\Views\Home\About.cshtml.
  Copying Views\Home\Index.cshtml to obj\Debug\Package\PackageTmp\Views\Home\Index.cshtml.
  Copying Views\Shared\Error.cshtml to obj\Debug\Package\PackageTmp\Views\Shared\Error.cshtml.
  Copying Views\Shared\_LogOnPartial.cshtml to obj\Debug\Package\PackageTmp\Views\Shared\_LogOnPartial.cshtml.
  Copying Views\Shared\_Layout.cshtml to obj\Debug\Package\PackageTmp\Views\Shared\_Layout.cshtml.
  Copying packages.config to obj\Debug\Package\PackageTmp\packages.config.
  Copying C:\hudson\jobs\HelloWorldMvc3\workspace\packages\EntityFramework.4.1.10331.0\lib\EntityFramework.dll to obj\Debug\Package\PackageTmp\bin\EntityFramework.dll.
  Copying C:\hudson\jobs\HelloWorldMvc3\workspace\packages\EntityFramework.4.1.10331.0\lib\EntityFramework.xml to obj\Debug\Package\PackageTmp\bin\EntityFramework.xml.
  Copying obj\Debug\CSAutoParameterize\transformed\Views\Web.config to obj\Debug\Package\PackageTmp\Views\Web.config.
  Copying obj\Debug\CSAutoParameterize\transformed\Web.config to obj\Debug\Package\PackageTmp\Web.config.
PipelinePreDeployCopyAllFilesToOneFolder:
  Publish Pipeline Deploy phase Pre-Deploy CopyAllFilesToOneFolder Stage
Package:
  Invoking Web Deploy to generate the package with the following settings:
  $(LocalIisVersion) is 7
  $(DestinationIisVersion) is 7
  $(UseIis) is False
  $(IncludeIisSettings) is False
  $(_DeploymentUseIis) is False
  $(DestinationUseIis) is False
GenerateMsdeployManifestFiles:
  Generate source manifest file for Web Deploy package/publish ...
CollectDatabasesToPublish:
  Creating directory "obj\Debug\Database".
PackageUsingManifest:
  Packaging into C:\MyProject\Package.zip.
  Starting Web deployment task from source:manifest(C:\MyProject\Package.SourceManifest.xml) to Destination:package(C:\MyProject\Package.zip).
  Adding package (package).
  Adding child iisApp (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp).
  Adding child createApp (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp).
  Adding child contentPath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp).
  Adding child dirPath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp).
  Adding child dirPath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\bin).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\bin\EntityFramework.dll).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\bin\EntityFramework.xml).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\bin\HelloWorldMvc3.dll).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\bin\HelloWorldMvc3.pdb).
  Adding child dirPath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\Site.css).
  Adding child dirPath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes).
  Adding child dirPath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base).
  Adding child dirPath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\images).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\images\ui-bg_flat_0_aaaaaa_40x100.png).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\images\ui-bg_flat_75_ffffff_40x100.png).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\images\ui-bg_glass_55_fbf9ee_1x400.png).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\images\ui-bg_glass_65_ffffff_1x400.png).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\images\ui-bg_glass_75_dadada_1x400.png).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\images\ui-bg_glass_75_e6e6e6_1x400.png).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\images\ui-bg_glass_95_fef1ec_1x400.png).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\images\ui-bg_highlight-soft_75_cccccc_1x100.png).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\images\ui-icons_222222_256x240.png).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\images\ui-icons_2e83ff_256x240.png).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\images\ui-icons_454545_256x240.png).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\images\ui-icons_888888_256x240.png).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\images\ui-icons_cd0a0a_256x240.png).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.accordion.css).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.all.css).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.autocomplete.css).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.base.css).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.button.css).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.core.css).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.datepicker.css).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.dialog.css).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.progressbar.css).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.resizable.css).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.selectable.css).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.slider.css).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.tabs.css).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Content\themes\base\jquery.ui.theme.css).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Global.asax).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\packages.config).
  Adding child dirPath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Scripts).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Scripts\jquery-1.5.1-vsdoc.js).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Scripts\jquery-1.5.1.js).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Scripts\jquery-1.5.1.min.js).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Scripts\jquery-ui-1.8.11.js).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Scripts\jquery-ui-1.8.11.min.js).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Scripts\jquery.unobtrusive-ajax.js).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Scripts\jquery.unobtrusive-ajax.min.js).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Scripts\jquery.validate-vsdoc.js).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Scripts\jquery.validate.js).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Scripts\jquery.validate.min.js).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Scripts\jquery.validate.unobtrusive.js).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Scripts\jquery.validate.unobtrusive.min.js).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Scripts\MicrosoftAjax.debug.js).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Scripts\MicrosoftAjax.js).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Scripts\MicrosoftMvcAjax.debug.js).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Scripts\MicrosoftMvcAjax.js).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Scripts\MicrosoftMvcValidation.debug.js).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Scripts\MicrosoftMvcValidation.js).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Scripts\modernizr-1.7.js).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Scripts\modernizr-1.7.min.js).
  Adding child dirPath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Views).
  Adding child dirPath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Views\Account).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Views\Account\ChangePassword.cshtml).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Views\Account\ChangePasswordSuccess.cshtml).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Views\Account\LogOn.cshtml).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Views\Account\Register.cshtml).
  Adding child dirPath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Views\Home).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Views\Home\About.cshtml).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Views\Home\Index.cshtml).
  Adding child dirPath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Views\Shared).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Views\Shared\Error.cshtml).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Views\Shared\_Layout.cshtml).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Views\Shared\_LogOnPartial.cshtml).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Views\Web.config).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Views\_ViewStart.cshtml).
  Adding child filePath (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp\Web.config).
  Adding child setAcl (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp).
  Adding child setAcl (C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\obj\Debug\Package\PackageTmp).
  Adding declared parameter 'IIS Web Application Name'.
  Adding declared parameter 'ApplicationServices-Web.config Connection String'.
  Successfully executed Web deployment task.
  Package "Package.zip" is successfully created as single file at the following location:
  file:///C:/MyProject
  To get the instructions on how to deploy the web package please visit the following link:
  http://go.microsoft.com/fwlink/?LinkId=124618
GenerateSampleDeployScript:
  Sample script for deploying this package is generated at the following location:
  C:\MyProject\Package.deploy.cmd
  For this sample script, you can change the deploy parameters by changing the following file: 
  C:\MyProject\Package.SetParameters.xml
Done Building Project "C:\hudson\jobs\HelloWorldMvc3\workspace\HelloWorldMvc3\HelloWorldMvc3.csproj" (Package target(s)).

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:08.33
Finished: SUCCESS

Software to automate website screenshot capture

I needed a software that allowed me to capture screenshots of a web application I developed. The software should do it automatically (batch capture). This way it’d save me a lot of time.

How do I used to do that?
I visited each web page I wanted to take a screenshot. It took me about 1 hour to finish the work.

I posted a question at Super User as always: Software to automate website screenshot capture and got an answer suggesting that I use a combination of a URL fetcher + Selenium capability to take screenshots.

Well, I tried Selenium (.NET bindings selenium-dotnet-2.0rc3.zip ) to test its screenshot capture feature but it doesn’t seem to fit the job because it doesn’t allow you to configure screenshot properties as size (height x width). Moreover it doesn’t work well with Ajax (requires you to write a lot of code to check for the existence of Ajax calls, etc). This kills a screenshot that needs everything in place (I mean every DOM object should be part of the screenshot). I tried the 3 drivers available: Internet Explorer, Firefox and Chrome. Screenshots taken with Internet Explorer driver were close to what I expected.

This is a sample code I used based on the code taken from here:

using System;
using System.Drawing.Imaging;
using System.Text;
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.IE;
using OpenQA.Selenium.Support.UI;

namespace SeleniumTest
{
    [TestFixture]
    public class SeleniumExample
    {
        private FirefoxDriver firefoxDriver;
    
        #region Setup

        [SetUp]
        public void Setup()
        {
            firefoxDriver = new FirefoxDriver();
        }

        #endregion

        #region Tests

        [Test]
        public void DisplayReport()
        {
            // Navigate
            firefoxDriver.Navigate().GoToUrl("http://localhost/FitnessCenter/Report/TotalPaymentsByPeriod");

            IWebElement startDate = firefoxDriver.FindElement(By.Name("StartDate"));
            
            startDate.Clear();
            startDate.SendKeys("January 2011");

            IWebElement generate = firefoxDriver.FindElement(By.Id("Generate"));
            generate.Click();

            var wait = new WebDriverWait(firefoxDriver, TimeSpan.FromSeconds(5));
            wait.Until(driver => driver.FindElement(By.Id("Map")));

            SaveScreenShot(firefoxDriver.Title);
        }

        /// <summary>
        /// Saves a screenshot of the current error page
        /// </summary>
        public void SaveScreenShot(string fileName)
        {
            // Get the screenshot
            Screenshot screenshot = firefoxDriver.GetScreenshot();

            // Build up our filename
            StringBuilder filename = new StringBuilder(fileName);
            filename.Append("-");
            filename.Append(DateTime.Now.ToString("yyyy-MM-dd HH_mm_ss"));
            filename.Append(".png");

            // Save the image
            screenshot.SaveAsFile(filename.ToString(), ImageFormat.Png);
        }

        #endregion

        #region TearDown

        [TearDown]
        public void FixtureTearDown()
        {
            if (firefoxDriver != null) firefoxDriver.Close();
        }

        #endregion
    }
}

Indeed, Selenium is powerful for what it does, that is, helping you automate browser interactions while you test your code. It even allows you to take a screenshot let’s say when something goes wrong (a test fail for example). That’s great and that’s what it does best. It’s a choice for every operating system since it’s an API that can be programmed against.

Paparazzi! beautiful application iconWhat I needed was something more specialized to take screenshots. A software that allows me to configure screenshot properties. The good news is that I managed to find such piece of software and it’s called Paparazzi! - a very suggestive name by the way. One drawback is that it’s only available for Mac OS. As one would expect, it uses Safari browser engine behind the curtains to capture the screenshots. Paparazzi! has minor bugs but it gets the job done. It doesn’t have documentation. I had a hard time trying to make it work. It has batch capture capability but no docs explaining how to do it. So I hope this post will shed some light…

The following lines describe what I did to achieve my objective with Paparazzi!:

1 - Created a list of URLs I’d like to take screenshots of. Like this (one URL per line):

http://192.168.1.106/FitnessCenter/Account/ChangeCulture?lang=en&returnUrl=%2FFitnessCenter%2F
http://192.168.1.106/FitnessCenter/Student
http://192.168.1.106/FitnessCenter/Student/Create
http://192.168.1.106/FitnessCenter/Student/Edit/79
http://192.168.1.106/FitnessCenter/Student/Details/79
http://192.168.1.106/FitnessCenter/Student/Delete/79
http://192.168.1.106/FitnessCenter/Anamnesis
http://192.168.1.106/FitnessCenter/Anamnesis/Create
http://192.168.1.106/FitnessCenter/Anamnesis/Edit/79
http://192.168.1.106/FitnessCenter/Anamnesis/Details/79

.
.
.

2 - Open Paparazzi! and click the Window menu => Batch capture (really difficult to find this option Disappointed smile ):

Paparazzi! difficult to find Batch Capture menu optionPicture 1 - Paparazzi! difficult to find Batch Capture menu option

3 - Drag and drop a text file .txt (the file that contains the URLs) to the Batch Capture window:

Paparazzi! Batch Capture window surfacePicture 2 - Paparazzi! Batch Capture window surface

Here is where I think I found a limitation and it’s by design. This should definitely not happen IMHO. If you try to add a file clicking on ( + button), Paparazzi won’t let you select a text file. The only way I got it working was selecting the .txt file and then drag and dropping the file to the Batch Capture window.

4 - Configure screenshot properties by clicking the list button (see mouse cursor above it):

Paparazzi! screenshot process basic configurationsPicture 3 - Paparazzi! screenshot process basic configurations

You can define the screenshot size. There are pre-defined values for standard screen resolutions. It allows you to define new presets.

You can also delay the capture to wait the page finish loading, etc.

There are a set of configurations available related to the batch capture functionality. To access these configurations, go to Paparazzi! menu and select Preferences:

Paparazzi! Preferences… menu optionPicture 4 - Paparazzi! Preferences… menu option

The first configuration worth mentioning the Default Filename Format available in the General section:

Paparazzi! General preferences sectionPicture 5 - Paparazzi! General preferences section

Above I’m defining this format:

%t = page title
%Y = year
%m = month
%d = day
%H = hour
%M = minute
%S = second

The example in the picture is pretty clear… Smile

Another set of configurations is available in the Batch capture section:

Paparazzi! Batch Capture preferences sectionPicture 6 - Paparazzi! Batch Capture preferences section

Here you can choose where to save the screenshots as well as the type of the images.

After configuring the batch capture session, it’s the gran finale time...

5 - Click the Play button, go take a coffee and relax while the computer does the job for you Fingers crossed.

Paparazzi! Batch Capture in actionPicture 7 - Paparazzi! Batch Capture in action

Hope you have found this post interesting and that it’s useful to help in documenting a little bit of this small but really powerful application.

Pointing up Now I get all the screenshots in less than 1 minute!

References
Paparazzi!
http://derailer.org/paparazzi/

SVN, Hudson and MSBuild - Revision control repository

SVN, Hudson and MSBuild - Continuous Integration
SVN, Hudson and MSBuild - Building code on post commit

This three part series of posts I’m starting today serves as a guide on how to setup a continuous integration/CI server.

Tools I’m going to use (all FREE) and a brief description of them:

Continuous integration

Hudson Hudson

Hudson monitors executions of repeated jobs, such as building a software project or jobs. Hudson helps building/testing software projects continuously. In a nutshell, Hudson provides an easy-to-use so-called continuous integration system, making it easier for developers to integrate changes to the project, and making it easier for users to obtain a fresh build. The automated, continuous build increases the productivity.


Build automation

MSBuild (Visual Studio 2010 native build system)

The Microsoft Build Engine (MSBuild) is the build platform for Microsoft and Visual Studio. MSBuild is completely transparent with regards to how it processes and builds software, enabling developers to orchestrate and build products in build lab environments where Visual Studio is not installed.


Revision control

TortoiseSVN

TortoiseSVN is an easy-to-use SCM / source control software for Microsoft Windows and possibly the best standalone Apache™ Subversion® client there is. It is implemented as a Windows shell extension, which makes it integrate seamlessly into the Windows explorer. Since it's not an integration for a specific IDE you can use it with whatever development tools you like.

VisualSVN Server

VisualSVN Server allows you to easily install and manage a fully-functional Subversion server on the Windows platform. Thanks to its robustness, unbeatable usability and unique enterprise-grade features, VisualSVN Server is affordable both for small business and corporate users. It greatly simplifies installing and managing Subversion and is available for free.

The series will focus on continuous integration of .NET family of projects and I’ll write things in the order I installed them.

This 1st part will deal with the Revision Control repository configuration.

The only difference here is that I’m running all these software engineering tools on my Windows 7 virtual machine that is used exclusively for software development. A more ubiquitous situation is when/where you have each one of these tools working on their specific servers, that is, you’ll frequently see a dedicated continuous integration server, a dedicated build server and a dedicated repository server.

Having dedicated servers is good for a software development team/company. This definitely isn’t my case. I’m doing solo work and as such I decided to have a stable environment which can give me all the benefits of a continuous integration process running in a single machine (cost effective solution). This allows me to apply a better quality control over my code and at the same time I can automate common tasks.

These tools are working great on my machine right now where I’m developing and integrating an ASP.NET MVC 3 application. Bellow I’ll describe what you need in order to get a revision control repository running in your development machine.

I try to simplify every step going to the point and avoiding the intrinsic aspects such as why things are named or done this or that way.

When you finish this step by step guide, the following question should be answered:

Question: How/Why should I put my code under revision control?

Valid answer:

1 - Download and install TortoiseSVN. TortoiseSVN is a Subversion client.

2 - Create the SVN folder for your project. For example in C:\svn\MyProject. Right-click this folder and select TortoiseSVN → Create repository here. You should get a confirmation message like this one:

TortoiseSVN - Repository Successfully CreatedFigure 1 - Repository Successfully Created

3 - Create this temporary folder structure so that you have a standard SVN folder layout:

C:\Temp\MyProject\trunk
C:\Temp\MyProject\branches
C:\Temp\MyProject\tags

Do not mind the Temp folder for now. The main idea here is that you’ll put you current project’s folders/files inside the trunk folder. For more on this, read revision control.

4 - Move all MyProjects’s code to the trunk folder.

5 - Now right click the folder C:\Temp\MyProject and select TortoiseSVN → Import… Now you must provide the SVN address where you want to import your project. Do this:

TortoiseSVN - ImportFigure 2 - Import

Note the slashes ( / ) instead of back slashes ( \ ).

Before you import the project into the repository take note of:

- Just import the content needed to build the project. Remove unnecessary or temporary files/folders generated by the compiler e.g. Files = *.suo/*.user and folders = Bin/obj that contain compiled binaries.
- Organize your project in folders and subfolders. Using TortoiseSVN you can later rename/move files but it’s highly recommended that you set your project’s structure before importing!

After clicking OK, you should see this:

TortoiseSVN - MyProject Import FinishedFigure 3 - MyProject Import Finished

Great. Now we have just imported MyProject’s files to a revision control repository. See that we are at revision 1.

Now we’re going to check out this code in a different folder so that we can have the benefits of revision control.

6 - Create the folder C:\MyProject.

7 - Right click C:\MyProject and select SVN Checkout…

TortoiseSVN - CheckoutFigure 4 - Checkout

After clicking OK, you should get this:

TortoiseSVN Checkout FinishedFigure 5 - Checkout Finished

You’ll see that Windows Explorer now shows an icon in each file/folder informing that that specific file/folder is up to date or not with the one we have in the SVN repository:

Windows Explorer with Project Under Version ControlFigure 6 - Windows Explorer with Project Under Version Control

As you can see, I have changed the content of the file Main line Project Files and Folders go here.txt and as a result of this action I’m informed that this file was changed since the last check out (red exclamation mark). When I perform a commit to the repository this file that is marked as modified will be part of the head revision of the repository.

TortoiseSVN context menu options
SVN is a really powerful tool that has a lot of functions as the revision graph selected bellow:

TortoiseSVN - Context Menu OptionsFigure 7 - TortoiseSVN Context Menu Options

You’ll learn about and use each one of these functions for sure as the time passes by. Do not panic and take it easy! Surprised smile Be careful though when performing a commit to the repository and avoid breaking things. This can cause headaches.

Summary
In this simple step by step guide you saw how to put a project under revision control. This gives you a cool way of keeping track of what has been added, deleted, changed in your project since its start through what we call revisions. In addition you also get the chance of rolling back your changes in case anything goes wrong. This I think is the greatest feature of a revision control repository, that is, it acts in such a way that if I later decide to rollback to a previous version of a given file I’m allowed to do so because it keeps the old files. This works just like the database rollback function.

Next in this series
In the 2nd part of this series I’ll go into the details related to the installation and configuration of Hudson that is the continuous integration server.