<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><atom:link href="http://oshyn.com/RSSRetrieve.aspx?ID=3244&amp;Type=RSS20" rel="self" type="application/rss+xml" /><title>Software Development</title><description>Software development news, posts, tutorials and best practices collection.</description><link>http://oshyn.com/</link><lastBuildDate>Sat, 19 May 2012 17:57:56 GMT</lastBuildDate><docs>http://backend.userland.com/rss</docs><generator>RSS.NET: http://www.rssdotnet.com/</generator><item><title>Setting up Git as your Version Control System</title><description>&lt;p&gt;&lt;img alt="" width="197" height="101" style="float: right; margin-left: 10px;" src="/blogResources/DiegoVergara/Git quick setupV2.png" /&gt;&lt;a href="http://oshyn.com/_blog/Software_Development/post/Version_Control_Systems_Distributed_vs_Centralized/" title="VCS - Distributed vs. Centralized"&gt;Version control&lt;/a&gt; is an essential task to be performed not only on coding projects but also in any creative process such as writing or designing, and becomes even more important when it is a collaborative process. Git is a Distributed Version Control System that has become very popular not only in Open Source projects, but also in many other types of coding projects. Its versatility and processing speed are turning it into a must-have tool in web development. However, its documentation (as with any other software tool) can be rather difficult, even obscure at times, to read and assimilate.&lt;/p&gt;
&lt;p&gt;The first step is to install Git. You can get the installer for your operating system at Git&amp;rsquo;s homepage. If you are on Windows, the .exe installer will give you a couple of options and will install several tools as the Git Bash. The Git Bash is a command prompt to run Git that can run other Unix commands as well.&lt;/p&gt;
&lt;p&gt;In Mac OSX, if you have installed Xcode, then you already have Git. If not, there are some .dmg files on Git&amp;rsquo;s homepage corresponding to the latest versions of OSX. With this installed, you are ready to start tracking versions of your local projects&amp;rsquo; files&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;To start doing this, just go to directory where your files to be tracked reside, using the bash in OSX or the Git Bash in Windows, and type the following command:
    &lt;br /&gt;
    &lt;p style="font-family: courier; font-weight: bold; margin-left: 10px;"&gt;git init&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;The command prompt should respond with a confirmation message like the following:
    &lt;br /&gt;
    &lt;p style="font-family: courier; font-weight: bold; margin-left: 10px;"&gt;Initialized empty Git repository in /path/to/your/project/.git/&lt;/p&gt;
    This will create a hidden .git folder that will be used to keep track of changes in your directory.
    &lt;/li&gt;
    &lt;li&gt;Then just add the folders and files you want to track and, when ready to do your first commit, return to the bash and use the following command:&lt;br /&gt;
    &lt;p style="font-family: courier; font-weight: bold; margin-left: 10px;"&gt;git status&lt;/p&gt;
    This will output a list of current changes such as untracked files, modified files and deleted files.
    &lt;/li&gt;
    &lt;li&gt;You can then add the changes you want to commit to your staging area, also called index, by using the command:&lt;br /&gt;
    &lt;p style="font-family: courier; font-weight: bold; margin-left: 10px;"&gt;git add file1 file2 file3&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;Then you can effectively create a new revision of your folder by committing what&amp;rsquo;s on the index:&lt;br /&gt;
    &lt;p style="font-family: courier; font-weight: bold; margin-left: 10px;"&gt;git commit &amp;ndash;m &amp;ldquo;This is a message summarizing the contents of this commit&amp;rdquo;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;Then you can check the history of your project by using the following command:&lt;br /&gt;
    &lt;p style="font-family: courier; font-weight: bold; margin-left: 10px;"&gt;git log&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;The output should be something like this:
    &lt;br /&gt;
    &lt;ul style="list-style-type: none; font-family: 'courier'; font-weight: bold;"&gt;
        &lt;li style="list-style-image: none;"&gt;commit 3692dff96ec63a66b379a4fa90c08de45f7dfa4f&lt;/li&gt;
        &lt;li style="list-style-image: none;"&gt;Author: dvergara &amp;lt;dvergara@oshyn.com&amp;gt;&lt;/li&gt;
        &lt;li style="list-style-image: none;"&gt;Date: Mon Feb 6 19:33:50 2012 -0500&lt;/li&gt;
        &lt;li style="list-style-image: none;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Third version, second on this branch&lt;/li&gt;
    &lt;/ul&gt;
    &lt;br /&gt;
    &lt;ul style="list-style-type: none; font-family: 'courier'; font-weight: bold;"&gt;
        &lt;li style="list-style-image: none;"&gt;commit a84128fbab6e5cb791660b082bb0a38ab46987ab&lt;/li&gt;
        &lt;li style="list-style-image: none;"&gt;Author: dvergara &amp;lt;dvergara@oshyn.com&amp;gt;&lt;/li&gt;
        &lt;li style="list-style-image: none;"&gt;Date: Mon Feb 6 18:24:48 2012 -0500&lt;/li&gt;
        &lt;li style="list-style-image: none;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;version 2&lt;/li&gt;
    &lt;/ul&gt;
    &lt;br /&gt;
    &lt;ul style="list-style-type: none; font-family: 'courier'; font-weight: bold;"&gt;
        &lt;li style="list-style-image: none;"&gt;commit 4acb6bf8f245dfa471ea1a4cdb176941aa798494&lt;/li&gt;
        &lt;li style="list-style-image: none;"&gt;Author: dvergara &amp;lt;dvergara@oshyn.com&amp;gt;&lt;/li&gt;
        &lt;li style="list-style-image: none;"&gt;Date: Mon Feb 6 18:07:00 2012 -0500&lt;/li&gt;
        &lt;li style="list-style-image: none;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Initial Commit&lt;/li&gt;
    &lt;/ul&gt;
    &lt;p&gt;
    &lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;Finally, you can see the commit key in case you want to change to a different revision. Let&amp;rsquo;s say we want to go back to the first commit. We need to execute:
    &lt;p style="font-family: courier; font-weight: bold; margin-left: 10px;"&gt;git checkout 4acb6bf8f245dfa471ea1a4cdb176941aa798494&lt;/p&gt;
    &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that I&amp;rsquo;m using the SHA1 key of the first commit as its identifier. It also works with just the initial characters of the string. Now we are on the state of the initial commit of out project. There we can perform changes and create a new commit, or just get back to the latest commit with the following command:&lt;/p&gt;
&lt;p style="font-family: courier; font-weight: bold; margin-left: 10px;"&gt;git checkout master&lt;/p&gt;
&lt;p&gt;These few steps are the basics of what you need to know to start working with Git. In a future post, I will explain more about one of Git&amp;rsquo;s most interesting features: branches. Play around with them and start leveraging the advantages of this versioning system on your next project.&lt;/p&gt;
</description><link>http://oshyn.com/RSSRetrieve.aspx?ID=3244&amp;A=Link&amp;ObjectID=221731&amp;ObjectType=56&amp;O=http%253a%252f%252foshyn.com%252f_blog%252fSoftware_Development%252fpost%252fSetting_up_Git_as_your_Version_Control_System%252f</link><guid isPermaLink="true">http://oshyn.com/_blog/Software_Development/post/Setting_up_Git_as_your_Version_Control_System/</guid><pubDate>Wed, 09 May 2012 20:21:00 GMT</pubDate></item><item><title>Version Control Systems: Distributed vs. Centralized</title><description>&lt;p&gt;&lt;img alt="" width="205" height="176" style="float: right; margin-left: 10px;" src="/blogResources/DiegoVergara/Git And Svn.jpg" /&gt;One fundamental tool in any software project is a Version Control System (VCS). A VCS helps you keep track of features, bug tickets, and any other changes in your project. It is also very helpful to keep backed-up versions of your work just in case anything goes wrong. There are quite a lot of tools available to meet this need, including: Perforce, Mercurial, SVN, Git, CVS, etc. and they can be classified into two classes:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt; Distributed VCS: Git, Mercurial.&lt;/li&gt;
    &lt;li&gt; Centralized VCS: CVS, Perforce, SVN.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The main difference between the two classes is that Centralized VCSs keep the history of changes on a central server from which everyone requests the latest version of the work and pushes the latest changes to. This means that everyone sharing the server also shares everyone&amp;rsquo;s work. Sourceforge.net uses this type of versioning in their projects.&lt;/p&gt;
&lt;p&gt;On the other hand, on a Distributed VCS, everyone has a local copy of the entire work&amp;rsquo;s history. This means that it is not necessary to be online to change revisions or add changes to the work. &amp;ldquo;Distributed&amp;rdquo; comes from the fact that there isn&amp;rsquo;t a central entity in charge of the work&amp;rsquo;s history, so that anyone can sync with any other team member. This helps avoid failure due to a crash of the central versioning server. Open source projects, such as Mozilla Firefox, tend to use this type of versioning.&lt;/p&gt;
&lt;p&gt;After having worked with both of these systems (SVN and Git) my personal impression is that there is not such thing as a clearly superior system. On one hand, a Centralized VCS allows more access control via folder permissions or by allowing checkout of just the needed sub tree from the repository tree. Also these systems are more prone to be backed up regularly, allowing for a more reliable environment of work. The quantity of development tools and Integrated Development Environments (IDEs) integrating with them is considerable. On the other side, a Distributed VCS, like Git, is considerably faster and easier to work with when it comes to creating and merging branches and tags. Also, they allow for flexible workflows, tailored to one&amp;rsquo;s project and team needs.&lt;/p&gt;
&lt;p&gt;However, both systems have room for improvement. Tools like SVN are slow when it comes to process transactions and working with tags and branches can be very tricky as well. Also, when someone on the team checks-in buggy code that takes down the project&amp;rsquo;s application, the whole team&amp;rsquo;s work is potentially affected since everyone has to have the same codebase.&lt;/p&gt;
&lt;p&gt;However, a Distributed VCS, on the other hand, doesn&amp;rsquo;t allow for partial check out of the repository. Also, integration with many IDEs and other development tools (like file comparers) are not yet the rule nowadays and, since there are little repository managers with a Graphical User Interface for Distributed VCSs, it can be very hard in the beginning to be efficient and proficient with this type of Distributed VCSs.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;There are some other factors to consider before choosing a VCS like the workflow you&amp;rsquo;ll be using, available hardware, etc. However, the current trend is to switch to Distributed VCSs to manage coding projects since VCSs like SVN are growing obsolete quickly. Try Git on your next project (not only coding project, it can be any type of collaborative project like a book or a paper) and you will realize the great advantages this system provides. &amp;nbsp;&lt;/p&gt;
</description><link>http://oshyn.com/RSSRetrieve.aspx?ID=3244&amp;A=Link&amp;ObjectID=221718&amp;ObjectType=56&amp;O=http%253a%252f%252foshyn.com%252f_blog%252fSoftware_Development%252fpost%252fVersion_Control_Systems_Distributed_vs_Centralized%252f</link><guid isPermaLink="true">http://oshyn.com/_blog/Software_Development/post/Version_Control_Systems_Distributed_vs_Centralized/</guid><pubDate>Wed, 09 May 2012 20:19:00 GMT</pubDate></item><item><title>Jira new plugin: Bonfire for Agile Testing</title><description>&lt;p style="text-align: justify;"&gt;At the &lt;a href="http://summit.atlassian.com/"&gt;Atlassian Summit 2011&lt;/a&gt;, Andrew Prentice, Atlassian QA Manager, presented a new Jira plugin that allows for more efficient reporting of bugs. As discussed in my &lt;a href="http://oshyn.com/_blog/Software_Development/post/Agile-Testing-Test-Management/"&gt;previous post&lt;/a&gt;, in projects using the Agile model bugs need to be reported as soon as possible. Any tool that helps you to accomplish this, will be very useful for testers. &lt;/p&gt;
&lt;p style="text-align: justify;"&gt;When reporting an issue you need to provide the most details possible so developers are able to reproduce them; for example, when testing a web application you usually provide this information: browser and platform where you find the bug, URL, screenshots. Not all bugs need screenshots, but a screenshot can help developers to see the problem and can provide useful information in the future. The disadvantage of providing more details when reporting a bug is that it takes time. In the Atlassian Conference, Prentice emphasized the idea, &amp;ldquo;Agile Testing, it&amp;rsquo;s about time.&amp;rdquo; He also mentioned that testers spent 16% of their time reporting bugs.&lt;span&gt;&amp;nbsp; &lt;/span&gt;That is a lot of time, especially in Agile development where time is critical.&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;To enhance the process of testing and reporting issues, Atlassian offers the following features in the new Jira plugin:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;1. Fastest way to create bugs with screenshots&lt;/li&gt;
    &lt;li&gt;2. Create issue templates with dynamic content&lt;/li&gt;
    &lt;li&gt;3. Build test sessions and assign them to Jira tasks&lt;/li&gt;
    &lt;li&gt;4. Track time of test sessions&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;How to install Bonfire: &lt;/strong&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;This plugin is installed in Jira server and then each user needs to install browser extensions.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Currently you can get Bonfire free, for 30 days.&lt;span&gt;&amp;nbsp; &lt;/span&gt;To install Bonfire in Jira server, you have to follow the steps outlined here: &lt;a href="http://confluence.atlassian.com/display/BONFIRE/Bonfire+Installation+Guide"&gt;http://confluence.atlassian.com/display/BONFIRE/Bonfire+Installation+Guide&lt;/a&gt; &lt;/p&gt;
&lt;p style="text-align: justify;"&gt;After installing it, you have to get a license (even for the free trial), just follow these steps: &lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;If you don&amp;rsquo;t already have one, create an account in https://my.atlassian.com&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
    &lt;li&gt;Login in Atlassian and go to &amp;ldquo;New Evaluation License&amp;rdquo;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;Select the product &amp;ldquo;Bonfire&amp;rdquo; and copy the license text&lt;/li&gt;
    &lt;li&gt;Click on &amp;ldquo;Generate License&amp;rdquo;&lt;/li&gt;
    &lt;li&gt;Copy the license text&lt;/li&gt;
    &lt;li&gt;Go to Jira &amp;gt; Administration&amp;gt; Plugins &lt;/li&gt;
    &lt;li&gt;In the left side menu, click on &amp;ldquo;Bonfire License&amp;rdquo;&lt;/li&gt;
    &lt;li&gt;Paste license and click on &amp;ldquo;Add&amp;rdquo;&lt;/li&gt;
&lt;/ol&gt;
&lt;p style="text-align: justify;"&gt;Now that Bonfire is installed in the Jira Server, testers or anyone on the team can download the browser extensions to start reporting issues. Browser extensions are supported in these browsers: Internet Explorer, Firefox, Chrome and Safari (Bonfire User Guide, 2011).&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;strong&gt;How to use Bonfire:&lt;/strong&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;I prepared a video to show Bonfire features, it contains the following sections:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Install Bonfire browser extension in Chrome&lt;/li&gt;
    &lt;li&gt;Create a test session for a Jira task
    &lt;ul&gt;
        &lt;li&gt;For the task, &amp;ldquo;Testing Oshyn&amp;rsquo;s site&amp;rdquo;, I will create the test session &amp;ldquo;Testing Blog posts&amp;rdquo;&lt;/li&gt;
        &lt;li&gt;Create a template with variables
        &lt;ul&gt;
            &lt;li&gt;I will create two variables: &amp;ldquo;platform&amp;rdquo; and &amp;ldquo;lastDateModified&amp;rdquo; &lt;/li&gt;
            &lt;li&gt;Template will contain a description with dynamic content&lt;/li&gt;
            &lt;li&gt;Create an issue using the&amp;nbsp; template and adding a screenshot&lt;/li&gt;
            &lt;li&gt;End the test session and log the time spent testing&lt;/li&gt;
            &lt;li&gt;Check all the test sessions of the task &amp;ldquo;Testing Oshyn&amp;rsquo;s site&amp;rdquo;&lt;/li&gt;
        &lt;/ul&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
&lt;/ul&gt;
&lt;iframe width="425" height="349" frameborder="0" src="http://www.youtube.com/embed/2V4sIeBOdSE"&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;strong&gt;What are the Advantages of using Bonfire?&lt;/strong&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;The two Bonfire features that allow testers to save time are: creation of templates and attaching screenshots directly from the browsers. Usually when reporting bugs, you need to select the same bug properties many times (like Affects version, Fix version, Assignee, Priority, etc.).&lt;span&gt;&amp;nbsp; &lt;/span&gt;With Bonfire, you can just select a template and all the repeated fields will be pre-populated.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Additionally, Bonfire allows you to use JavaScript variables in your templates, so you can have dynamic information in your bugs.&lt;span&gt;&amp;nbsp; &lt;/span&gt;You can add variables depending on your needs; for example, in the video I added a variable to get the user&amp;rsquo;s platform. &lt;span&gt;&amp;nbsp;&lt;/span&gt;Creating an issue with a Bonfire template saves you time and adding a screenshot is very simple and quick. You don&amp;rsquo;t need to use a graphic tool to crop, blur, put an arrow or text to show the bug; you can just use the Bonfire toolbar in the same browser window.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Test sessions is another useful feature; not only for testers but also for the whole team. Testers and developers can check issues reported when testing a particular area of the product and Project managers can verify the time spent in a test session.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Bonfire is a great way to save time when reporting bugs and allows organizing testing activities in your Jira Project. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;References:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bonfire User Guide: &lt;a href="http://confluence.atlassian.com/display/BONFIRE/Bonfire+User+Guide"&gt;http://confluence.atlassian.com/display/BONFIRE/Bonfire+User+Guide&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Agile Testing: It's about time - Atlassian Summit 2011: &lt;a href="http://www.youtube.com/watch?v=dYFzeh"&gt;http://www.youtube.com/watch?v=dYFzeh&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bonfire for Jira: &lt;a href="http://www.atlassian.com/en/software/bonfire/video"&gt;http://www.atlassian.com/en/software/bonfire/video&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div language="JavaScript" id="_com_1"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div language="JavaScript" class="msocomtxt" id="_com_1"&gt;
&lt;!--[if !supportAnnotations]--&gt;&lt;/div&gt;
&lt;!--[endif]--&gt;&lt;/div&gt;
&lt;/div&gt;
</description><link>http://oshyn.com/RSSRetrieve.aspx?ID=3244&amp;A=Link&amp;ObjectID=201117&amp;ObjectType=56&amp;O=http%253a%252f%252foshyn.com%252f_blog%252fSoftware_Development%252fpost%252fJira_new_plugin_Bonfire_for_Agile_Testing%252f</link><guid isPermaLink="true">http://oshyn.com/_blog/Software_Development/post/Jira_new_plugin_Bonfire_for_Agile_Testing/</guid><pubDate>Wed, 09 Nov 2011 22:57:00 GMT</pubDate></item><item><title>Google App Inventor: An Android Mobile App Developer for Everyone</title><description>&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 14px;"&gt;Google has launched the application "Google App Inventor" aimed towards people of all backgrounds, ages, and experience levels in computer programing. To achieve this goal, Google offers a graphical interface that allows the user to experiment creating a fully-functional Android app, for a mobile device running the Android platform, by snapping together visual programing blocks.&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 14px;"&gt;
Now all you need to build an Android application to be used on a mobile device is access to a computer and an internet connection. The App Inventor is a simple but powerful web application. A Google account is needed to use it.&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt; &lt;/p&gt;
&lt;div style="text-align: center;"&gt;&lt;span style="font-size: 14px;"&gt;&lt;img alt="" src="/blogResources/Santiago Pesantez/App Inventor/appInventor.png" style="border: 0pt none;" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;
&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: 14px;"&gt;App Inventor provides access to all the mobile device features so you can create your own applications to solve aspects from your personal life, home, school, or work, instead of being limited to the apps available in the Android Market.&lt;br /&gt;
&lt;br /&gt;
It could be used as a great tool for education; allowing teachers to easily create educational software to help students prepare for a test or aid students with disabilities using features like TextToSpeech or Media Player.&lt;br /&gt;
&lt;br /&gt;
In the future, I hope to see Google develop some kind of training program that is more in-depth than its current online tutorial system for App Inventor. This way, more users could take advantage of it, thus turning it into a widespread educational tool.&lt;br /&gt;
&lt;br /&gt;
Watch an app being built using App Inventor&lt;/span&gt;
&lt;span style="font-size: 14px;"&gt;&lt;br /&gt;
&lt;a href="http://www.youtube.com/watch?v=8ADwPLSFeY8"&gt;http://www.youtube.com/watch?v=8ADwPLSFeY8&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;More information is available here: &lt;/strong&gt;&lt;/span&gt;
&lt;span style="font-size: 14px;"&gt;&lt;br /&gt;
App Inventor for Android: &lt;a href="http://appinventor.googlelabs.com/about/"&gt;http://appinventor.googlelabs.com/about/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Reference:&lt;/strong&gt;&lt;/span&gt;
&lt;span style="font-size: 14px;"&gt;&lt;br /&gt;
http://en.wikipedia.org/wiki/App_inventor#External_links&lt;br /&gt;
http://blog.wareseeker.com/all/iphoneapps/google-app-inventor-with-writing-applications-for-android/&lt;br /&gt;
http://www.techpoweredmath.com/android-app-inventor-education/&lt;br /&gt;
http://www.linuxinsider.com/story/Googles-Android-App-Inventor-Help-or-Hindrance-70397.html?wlc=1290803058&lt;br /&gt;
http://www.appinventor.org/what-you-can-do-with-app-inventor&lt;br /&gt;
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><link>http://oshyn.com/RSSRetrieve.aspx?ID=3244&amp;A=Link&amp;ObjectID=199825&amp;ObjectType=56&amp;O=http%253a%252f%252foshyn.com%252f_blog%252fSoftware_Development%252fpost%252fGoogle_App_Inventor_An_Android_Mobile_App_Developer_for_Everyone%252f</link><guid isPermaLink="true">http://oshyn.com/_blog/Software_Development/post/Google_App_Inventor_An_Android_Mobile_App_Developer_for_Everyone/</guid><pubDate>Wed, 09 Nov 2011 22:57:00 GMT</pubDate></item><item><title>Agile Testing and Test Management </title><description>&lt;p&gt;Recently, I attended to a webinar called &amp;ldquo;Where Agile Testing and Test Management Collide&amp;rdquo; &lt;a href="http://www.pushtotest.com/agile-testing-test-management"&gt;http://www.pushtotest.com/agile-testing-test-management&lt;/a&gt;, that mainly focused on two tools for Test Management and testing: Zephyr and TestMaker.&lt;span&gt;&amp;nbsp; &lt;/span&gt;Basically, Zephyr is Test Management software and TestMaker is a tool for performance and automated testing (the demo of these two products took most of the time of the webinar, my opinion is that it was missing more information about how Agile Testing is performed). &lt;/p&gt;
In this post I will first analyze what Agile software development is, how testing in this model is achieved, and what features are needed in a Test management tool.
&lt;p&gt;Agile Testing basically adapts to Agile software development.&lt;span&gt;&amp;nbsp; &lt;/span&gt;If you do a search for Agile development you will find the &amp;ldquo;Agile Manifesto&amp;rdquo;, written by a group of developers in 2001. According to the Manifesto, there are 12 principles of the model:&lt;/p&gt;
&lt;ol&gt;
    &lt;span&gt;1.&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;Satisfy customer through early and continuous delivery of valuable software&lt;br /&gt;
    &lt;span&gt;2.&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;Welcome changing requirements even late in development&lt;br /&gt;
    &lt;span&gt;3.&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;Deliver working software quickly&lt;br /&gt;
    &lt;span&gt;4.&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;Business people and developers work together daily through the project&lt;br /&gt;
    &lt;span&gt;5.&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;Build project with motivated individuals&lt;br /&gt;
    &lt;span&gt;6.&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;To obtain information the most efficient method is face-to-face conversation&lt;br /&gt;
    &lt;span&gt;7.&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;Working Software is a measure of progress&lt;br /&gt;
    &lt;span&gt;8.&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;Agile processes promote sustainable development&lt;br /&gt;
    &lt;span&gt;9.&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;Continuous attention to technical excellence and good design&lt;br /&gt;
    &lt;span&gt;10.&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;Simplicity is considered to be the art of maximizing the amount of work not done&lt;br /&gt;
    &lt;span&gt;11.&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;The best architecture, requirements and design emerge from self-organized teams&lt;br /&gt;
    &lt;span&gt;12.&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;At regular intervals, team should talk about how to become more effective&lt;span&gt;&amp;nbsp; &lt;/span&gt;and adjust their behavior&amp;nbsp; &lt;br /&gt;
    (&lt;a href="http://agilemanifesto.org/"&gt;Agile Manifesto&lt;/a&gt;)
&lt;/ol&gt;
&lt;p&gt;In the Agile model, a project is divided in &lt;strong&gt;iterations &lt;/strong&gt;that include: analysis, design, development, testing and acceptance testing when the product is demonstrated to stakeholders. Each one can last up to four weeks. The measure of progress is working software, so the goal of each is to have an available release with the minimum amount of bugs.&lt;span&gt;&amp;nbsp; &lt;/span&gt;At the end of each iteration, stakeholders and a customer representative need to review the progress and redefine the priorities of the project. (&lt;a href="http://en.wikipedia.org/wiki/Agile_software_development"&gt;Wikipedia &amp;ndash; Agile Model&lt;/a&gt; )&lt;/p&gt;
&lt;p&gt;In Agile development, a project needs to &lt;strong&gt;adapt to changes quickly&lt;/strong&gt;, there is not enough time for detailed documentation. When developers find questions, a customer representative needs to be available to respond and stakeholders need to produce documentation as required.&lt;span&gt;&amp;nbsp; &lt;/span&gt;As principle #6 in the manifesto mentions&lt;strong&gt;, face-to-face conversation &lt;/strong&gt;is the most efficient way to obtain information; this applies to communication with the client as well as within the team.&lt;span&gt;&amp;nbsp; &lt;/span&gt;In Agile projects, there is usually a quick, daily meeting attended by the whole team, a customer representative and any other stakeholder.&lt;span&gt;&amp;nbsp; &lt;/span&gt;During these meetings, each member reports what they did the day before, develops the plan for the current day and reports any blocker.&lt;span&gt;&amp;nbsp; &lt;/span&gt;(&lt;a href="http://en.wikipedia.org/wiki/Agile_software_development"&gt;Wikipedia &amp;ndash; Agile Model&lt;/a&gt; )&lt;/p&gt;
&lt;p&gt;In an Agile model, the testing team needs to adapt to a rapid development cycle, test with a customer perspective and have a constant communication with the whole team. Testers need to provide testing results as soon as possible so the developers can resolve any bugs; thus producing the least number of bugs at the end of an iteration. As mentioned before, in the Agile model communication is essential; therefore, the testing team needs to have a good relationship with the developers. &lt;/p&gt;
&lt;p&gt;In Agile development, the test manager needs to ensure that the testing team is reporting issues, communicating these issues to the development team and giving daily reports about critical issues. See the testing cycle in the following graphic:&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;img alt="" src="/blogResources/belenPadillaPosts/1_agile_testing.jpg" style="border: 0pt none;" /&gt;&lt;/p&gt;
&lt;p&gt;(&lt;a href="http://www.getzephyr.com/resources/zephyr_qa_methodologies.php"&gt;Zephyr&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;In this scenario, a test management tool ideally needs to have the following features: &lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Divide testing into Releases/Iterations&lt;/li&gt;
    &lt;li&gt;Link test cases with requirements &lt;/li&gt;
    &lt;li&gt;Assign test cases to testers&lt;/li&gt;
    &lt;li&gt;Create, edit and reuse test cases &lt;/li&gt;
    &lt;li&gt;Link test cases with bugs&lt;/li&gt;
    &lt;li&gt;Reporting&amp;nbsp; &lt;/li&gt;
    &lt;li&gt;Allow sharing of the results with the whole team&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These features will help the Test Manager to adapt testing to a rapid development cycle and to keep the team updated with the current status of the project.&lt;span&gt;&amp;nbsp; &lt;/span&gt;In an Agile model, &amp;ldquo;the measure of success is working software&amp;rdquo;, so it is very important that the Test Management tool helps to keep the team informed about critical issues in each iteration. &lt;/p&gt;
&lt;p&gt;Finally, I feel that a good Test Management tool is very helpful in Agile Software development; however, the Test Manager should never lose attention of the other aspects, like testing with end-user perspective and having good relationships with developers and clients, needed to achieve a collaborative and successful project.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;References&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Agile Alliance: &lt;/span&gt;&lt;a href="http://www.agilealliance.org/"&gt;&lt;span&gt;http://www.agilealliance.org/&lt;/span&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;span&gt;Agile Manifesto: &lt;/span&gt;&lt;a href="http://agilemanifesto.org/"&gt;&lt;span&gt;http://agilemanifesto.org/&lt;/span&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Wikipedia Agile Sofware Development: &lt;a href="http://en.wikipedia.org/wiki/Agile_software_development"&gt;http://en.wikipedia.org/wiki/Agile_software_development&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Wikipedia Agile Testing: &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Agile_testing"&gt;&lt;span&gt;http://en.wikipedia.org/wiki/Agile_testing&lt;/span&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Manage Agile Testing Methodology Effectively with Zephyr: &lt;a href="http://www.getzephyr.com/resources/zephyr_qa_methodologies.php"&gt;http://www.getzephyr.com/resources/zephyr_qa_methodologies.php&lt;/a&gt;&lt;/p&gt;
</description><link>http://oshyn.com/RSSRetrieve.aspx?ID=3244&amp;A=Link&amp;ObjectID=198169&amp;ObjectType=56&amp;O=http%253a%252f%252foshyn.com%252f_blog%252fSoftware_Development%252fpost%252fAgile-Testing-Test-Management%252f</link><guid isPermaLink="true">http://oshyn.com/_blog/Software_Development/post/Agile-Testing-Test-Management/</guid><pubDate>Wed, 09 Nov 2011 22:58:00 GMT</pubDate></item><item><title>.Net Source Code Quality Tools – Part 3: Analyzing Code</title><description>&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;Analyzing Code&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;(Continued from &lt;a href="http://oshyn.com/_blog/Software_Development/post/Net_Source_Code_Quality_Tools_%E2%80%93_Part_2_Configuring_the_Build/"&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;Part 2&lt;/span&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;/strong&gt;)&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;There are several tools that allow Hudson to collect output from quality metric rules and then show them for every build and then the results can displayed in a trend graph. &lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;When building a .Net Project, is recommended to use FxCop. This is a free static analysis tool from Microsoft that allows analyzing managed code assemblies against more than 200 different possible coding standards violations in the following areas:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt; &lt;span style="font-size: 12px;"&gt;Correctness&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span style="font-size: 12px;"&gt;Library design&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span style="font-size: 12px;"&gt;Internationalization and localization&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span style="font-size: 12px;"&gt;Naming conventions&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span style="font-size: 12px;"&gt;Performance&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span style="font-size: 12px;"&gt;Security &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;Many of the issues concern violations of the programming and design rules set forth in the &lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/czefa0ke%28vs.71%29.aspx"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;Design Guidelines&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;, which are the Microsoft guidelines for writing robust and easily maintainable code by using the .NET Framework.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;This tool could be useful to developers to adapt them and get used to the .Net Framework development best practices and coding standards. &lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;To install this tool, you have to go to the Microsoft Windows SDK folder, generally located at &lt;em&gt;&amp;ldquo;%ProgramFiles%\Microsoft SDKs\Windows\v7.0A&lt;/em&gt;&amp;rdquo;&lt;em&gt; &lt;/em&gt;and&lt;em&gt; &lt;/em&gt;find the &amp;ldquo;&lt;em&gt;FxCop&amp;rdquo;&lt;/em&gt; folder that contains the installer.&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;Once installed, this tool offers both, graphical and command line interfaces, this last one is the one we will use as part of the automated build process.&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;Configuring FxCop in Hudson&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;Go to the project &amp;ldquo;&lt;em&gt;Configure&lt;/em&gt;&amp;rdquo; page and under the &lt;em&gt;Build&lt;/em&gt; section click the &lt;em&gt;&amp;ldquo;Add build step&amp;rdquo;&lt;/em&gt; button and select &lt;em&gt;&amp;ldquo;Execute Windows batch command&amp;rdquo;.&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;Fill in the &amp;ldquo;&lt;em&gt;command&amp;rdquo; &lt;/em&gt;filed&lt;em&gt; &lt;/em&gt;with the command parameters depending on how you like to execute the tool, as: &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 36pt; text-align: justify;"&gt;&lt;span style="font-size: 12px;"&gt;&lt;em&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;"%ProgramFiles%\Microsoft FxCop 1.36\FxCopCmd.exe" /file:"HudsonQualityTools\bin\Release\*.dll" /out:fxcop-result.xml /console&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;More information about the FxCopCmd and its parameters visit &lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb429474.aspx"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;Using FxCopCmd&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;This command will execute the FxCopCmd command and check the .dll files found in the &amp;ldquo;&lt;em&gt;Release&amp;rdquo; &lt;/em&gt;folder. Besides it will record the results in a file named &amp;ldquo;fxcop-resul.xml&amp;rdquo; and display those results in the console.&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;div style="text-align: center;"&gt;&lt;span style="font-size: 12px;"&gt;&lt;img alt="" width="601" height="136" style="border: 0pt none;" src="/blogResources/Santiago Pesantez/.Net Source Code Quality Tools/6.png" /&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;To finish, check the &lt;em&gt;&amp;ldquo;Report Violations&amp;rdquo;&lt;/em&gt; check box under the &amp;ldquo;&lt;em&gt;Post-build Actions&lt;/em&gt;&amp;rdquo; and set the &lt;em&gt;fxcop&lt;/em&gt; field to: &amp;ldquo;&lt;em&gt;fxcop-result.xml&amp;rdquo;.&lt;/em&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px;"&gt;&lt;br /&gt;
&lt;span style="font-size: 12px; line-height: 115%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;&lt;img alt="" style="border: 0pt none;" src="/blogResources/Santiago Pesantez/.Net Source Code Quality Tools/7.png" /&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;Save the changes and build the solution. Then check the &lt;em&gt;Build &lt;/em&gt;to get a summary and check the state of the solution.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;br /&gt;
&lt;span style="font-size: 12px; line-height: 115%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;&lt;img alt="" width="601" height="321" style="border: 0pt none;" src="/blogResources/Santiago Pesantez/.Net Source Code Quality Tools/8.png" /&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;And then click on the graphic to get a more detailed version of the solution analyzed by FxCop.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;div style="text-align: center;"&gt;&lt;span style="font-size: 12px;"&gt;&lt;img alt="" width="601" height="295" style="border: 0pt none;" src="/blogResources/Santiago Pesantez/.Net Source Code Quality Tools/9.png" /&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 12px;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;To step into the reported violations, click on any of the files listed on the lower part of the site.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;
&lt;div style="text-align: center;"&gt;&lt;span style="font-size: 12px;"&gt;&lt;img alt="" width="600" height="261" style="border: 0pt none;" src="/blogResources/Santiago Pesantez/.Net Source Code Quality Tools/10.png" /&gt;&lt;/span&gt;&lt;span style="font-size: 12px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;span style="font-size: 12px;"&gt;&lt;br /&gt;
&lt;span style="font-size: 12px; line-height: 115%;"&gt;And there we will have access to the violations and the codes where it has occurred.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;
&lt;div style="text-align: center;"&gt;&lt;span style="font-size: 12px;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;&lt;img alt="" style="border: 0pt none;" src="/blogResources/Santiago Pesantez/.Net Source Code Quality Tools/11.png" /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: 12px; line-height: 115%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style="font-size: 12px; line-height: 115%;"&gt;&lt;br /&gt;
We can integrate Hudson to show those issues into an issue tracking solution as JIRA by installing the plug-in from the &amp;ldquo;&lt;em&gt;Plugin Manager&amp;rdquo; &lt;/em&gt;and&lt;em&gt; &lt;/em&gt;configuring it on the &amp;ldquo;&lt;em&gt;Manage Hudson&lt;/em&gt;&amp;rdquo; menu option. &lt;/span&gt;
&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;This allows the submitter and watchers to quickly find out which build they need to pick up to get the fix. Besides hudson can update JIRA issues with backpointers to builds by cheching the &lt;em&gt;&amp;ldquo;Update relevant JIRA issues&amp;rdquo;&lt;/em&gt; check box under the &lt;em&gt;&amp;ldquo;Post-build Actions&amp;rdquo;&lt;/em&gt; in the &amp;ldquo;&lt;em&gt;Configure&amp;rdquo;&lt;/em&gt; section.&lt;/span&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;&lt;img alt="" width="600" height="178" style="border: 0pt none;" src="/blogResources/Santiago Pesantez/.Net Source Code Quality Tools/12.png" /&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;In conclusion there are several good tools in store to ensure the .Net source code quality along the entire software development process, and Hudson is one of them, having a vast variety of easy to install and use plug-ins to automate tasks and make the development process more efficient. As shown above, it does not take too much configuring effort to start building a project using Hudson. The best approach to measure the source code quality is to start building the project, and then focus on running unit tests and other quality metrics so you can monitor the quality progress on your project.&lt;/span&gt;&lt;/p&gt;
</description><link>http://oshyn.com/RSSRetrieve.aspx?ID=3244&amp;A=Link&amp;ObjectID=196639&amp;ObjectType=56&amp;O=http%253a%252f%252foshyn.com%252f_blog%252fSoftware_Development%252fpost%252fNet_Source_Code_Quality_Tools_%25e2%2580%2593_Part_3_Analyzing_Code%252f</link><guid isPermaLink="true">http://oshyn.com/_blog/Software_Development/post/Net_Source_Code_Quality_Tools_–_Part_3_Analyzing_Code/</guid><pubDate>Wed, 09 Nov 2011 22:58:00 GMT</pubDate></item><item><title>Using WMDRM on your Application – Part 2</title><description>&lt;p style="text-align: justify;"&gt;&lt;strong&gt;&lt;span style="font-size: 14pt; line-height: 115%;"&gt;Getting data form your device using WMDRM API&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="BodyTextLink"&gt;&lt;span style="font-size: 12pt;"&gt;To initialize a WMDRM interface, the application calls CoCreateInstance to obtain an instance of IWMDRMDeviceApp or IWMDRMDeviceApp2 for the extended DRM queries, as shown in the following example:&lt;/span&gt;&lt;/p&gt;
&lt;p class="BulletList" style="text-indent: 0cm;"&gt;&lt;span style="font-size: 12pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;hr = CoCreateInstance(CLSID_WMDRMDeviceApp,&lt;/span&gt;&lt;/p&gt;
&lt;p style="page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; NULL,&lt;/span&gt;&lt;/p&gt;
&lt;p style="page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; CLSCTX_INPROC_SERVER,&lt;/span&gt;&lt;/p&gt;
&lt;p style="page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; IID_IWMDMDeviceApp2,&lt;/span&gt;&lt;/p&gt;
&lt;p style="page-break-after: avoid;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;span style="font-size: 12pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; (&lt;/span&gt;&lt;span style="font-size: 12pt; color: blue;"&gt;void**&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;)ppWMDRMDeviceApp2);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 12pt; font-family: courier new; color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new;"&gt;&lt;span style="font-size: 12pt; color: blue;"&gt;if &lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;(hr != S_OK)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf ("! Failed to CoCreate IWMDRMDeviceApp2\n");&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 12pt; line-height: 115%;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12pt; line-height: 115%;"&gt;The next step is to obtain an IWMDMDevice instance to use as an input parameter for the IWMDRMDeviceApp and IWMDRMDeviceApp2 methods.&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12pt; line-height: 115%;"&gt;The process of deriving the WPD device instance is covered in detail by the WPD Sample Application in the Windows SDK and MSDN&amp;reg; documentation and will not be repeated here.&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12pt; line-height: 115%;"&gt;Each WPD device is identified by a unique Plug and Play Device Identifier (PnPDeviceID) string. Similarly, each WMDM device is also identified by a unique string known as the WMDM canonical name. If the two strings can be correlated for a given WPD MTP device, a matching IWMDMDevice instance can be retrieved from the list of enumerated WMDM devices.&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12pt; line-height: 115%;"&gt;To associate the PnPDeviceID string of a WPD device with its WMDM canonical name we have to follow the next steps:&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 36pt;"&gt;&lt;span style="font-size: 12pt;"&gt;1.)&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -moz-font-feature-settings: normal; -moz-font-language-override: normal;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Replace the device interface globally unique identifier (GUID) with the WMDM interface GUID for the current WPD PnPDeviceID.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;//&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;// Step 1: Converting a WPD PnP Device ID to a WMDM PnP Device ID&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;// (Error checking is omitted for brevity)&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;//&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 54pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;hr = pIPortableDevice-&amp;gt;GetPnPDeviceID(&amp;amp;pszPnPDeviceID); &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new; color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;CAtlStringW strWMDMPnPID = pszPnPDeviceID;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; text-align: justify;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;// Truncate the WPD interface GUID&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;span style="font-size: 12pt; color: blue;"&gt;int&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt; pos = strCurrentWMDMPnPID.ReverseFind(L'{');&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; text-align: justify;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;strWMDMPnPID = strWMDMPnPID.Left(pos);&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;// Append the WMDM interface GUID&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;strWMDMPnPID += L"{f33fdc04-d1ac-4e8e-9a30-19bbd4b108ae}";&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 0cm; text-indent: 0cm; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 36pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt;"&gt;2.)&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -moz-font-feature-settings: normal; -moz-font-language-override: normal;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Enumerate devices by using the WMDM API and get the canonical name for each. Convert the canonical name to a WMDM PnPDeviceID.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;//&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;// Step 2: Enumerating the WMDM Canonical Names&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;// (Error checking is omitted for brevity)&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;//&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 54pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;hr = pWMDeviceManager2-&amp;gt;EnumDevices2(&amp;amp;pWMDMEnumDevice); &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;span style="font-size: 12pt; color: blue;"&gt;if &lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;(hr == S_OK)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; IWMDMDevice* pWMDMDevice = NULL;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp; ULONG&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ulFetched&amp;nbsp;&amp;nbsp; = 0;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp; // Traverse the list of enumerated WMDM devices&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;span style="font-size: 12pt;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="font-size: 12pt; color: blue;"&gt;while&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;(pWMDMEnumDevice-&amp;gt;Next(1, &amp;amp;pWMDMDevice, &amp;amp;ulFetched) == S_OK)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WCHAR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wszCanonicalName[MAX_PATH] = {0};&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IWMDMDevice2*&amp;nbsp; pWMDMDevice2 = NULL;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;hr = pWMDMDevice-&amp;gt;QueryInterface(IID_PPV_ARGS(&amp;amp;pWMDMDevice2));&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Get the canonical name for the current WMDM device&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pWMDMDevice2-&amp;gt;GetCanonicalName(wszCanonicalName,&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; ARRAYSIZE(wszCanonicalName);&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CAtlStringW&amp;nbsp;&amp;nbsp; strTestPnPID = wszCanonicalName;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Truncate the WMDM virtual device index&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;span style="font-size: 12pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-size: 12pt; color: blue;"&gt;int&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt; pos = strTestPnPID.ReverseFind(L'$')&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strTestPnPID = strTestPnPID.Left(pos);&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Do Step 3 here &amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 36pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt;"&gt;3.)&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -moz-font-feature-settings: normal; -moz-font-language-override: normal;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Call IPortableDevice::Open on the WMDM PnPDeviceID obtained from enumerating the WMDM canonical names to get the PnPDeviceID.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 36pt; text-indent: 0cm; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt;"&gt;Although the PnPDeviceID returned from IPortableDevice::GetPnPDeviceID is the same literal string as the original WMDM PnPDeviceID from Step 1, this test &amp;ldquo;closes the loop&amp;rdquo; by ensuring that both WPD and WMDM can access the same WMDM device identifiers.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif;"&gt;//&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif;"&gt;// Step 3: Verify that the WMDM Device ID converted from the&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif;"&gt;// Canonical Name can be accessed by WPD&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif;"&gt;// (Error checking is omitted for brevity)&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif;"&gt;//&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif;"&gt;IPortableDevice* pPortableDeviceTest = NULL;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif;"&gt;IPortableDeviceValues* pClientInfo&amp;nbsp;&amp;nbsp; = NULL;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif;"&gt;LPWSTR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pszWPDPnPDeviceID&amp;nbsp;&amp;nbsp; = NULL;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif;"&gt;//&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif;"&gt;// CoCreate a new instance of IPortableDevice (not shown) &amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif;"&gt;// CoCreate and populate client information (not shown) &amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif;"&gt;//&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif;"&gt;hr = pIPortableDeviceTest-&amp;gt;Open(strTestPnPID, pClientInfo);&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif; color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-family: ms sans serif;"&gt;&lt;span style="font-size: 12pt; color: blue;"&gt;if&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt; (hr == S_OK)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif;"&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pIPortableDeviceTest-&amp;gt;GetPnPDeviceID(&amp;amp;pszWPDPnPDeviceID);&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Compare the result with our WMDM PnP ID&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-family: ms sans serif;"&gt;&lt;span style="font-size: 12pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-size: 12pt; color: blue;"&gt;if&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt; (strWMDMPnPID.CompareNoCase(pszWPDPnPDeviceID) == 0)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Found a matching IWMDMDevice instance&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: ms sans serif;"&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 4pt 36pt; text-indent: -18pt; line-height: normal;"&gt;&lt;span style="font-size: 12pt;"&gt;4.)&lt;span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -moz-font-feature-settings: normal; -moz-font-language-override: normal;"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;Now that you have found the IWMDMDevice pointer that has the correct canonical name, you can use that IWMDMDevice as the input parameter to call IWMDRMDeviceApp or IWMDRMDeviceApp2 methods on that device. &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0cm 0cm 4pt 36pt; line-height: normal;"&gt;&lt;span style="font-size: 12pt;"&gt;For example, the following code snippet queries if the current device supports WMDRM:&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;hr = pWMDRMDeviceApp2-&amp;gt;QueryDeviceStatus2(pWMDMDevice,&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WMDRM_QUERY_DEVICE_ISWMDRM,&amp;amp;dwStatus);&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;span style="font-size: 12pt; color: blue;"&gt;if &lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;(hr == S_OK)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;span style="font-size: 12pt;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-size: 12pt; color: blue;"&gt;bool&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt; bSupportsWMDRM = (dwStatus &amp;gt; 0)?&lt;/span&gt;&lt;span style="font-size: 12pt; color: blue;"&gt;true&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;:&lt;/span&gt;&lt;span style="font-size: 12pt; color: blue;"&gt;false&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-left: 18pt; page-break-after: avoid;"&gt;&lt;span style="font-size: 12pt; font-family: courier new;"&gt;}&lt;/span&gt;&lt;/p&gt;
</description><link>http://oshyn.com/RSSRetrieve.aspx?ID=3244&amp;A=Link&amp;ObjectID=196737&amp;ObjectType=56&amp;O=http%253a%252f%252foshyn.com%252f_blog%252fSoftware_Development%252fpost%252fUsing_WMDRM_on_your_Application_%25e2%2580%2593_Part_2%252f</link><guid isPermaLink="true">http://oshyn.com/_blog/Software_Development/post/Using_WMDRM_on_your_Application_–_Part_2/</guid><pubDate>Wed, 09 Nov 2011 23:21:00 GMT</pubDate></item><item><title>.Net Source Code Quality Tools – Part 2: Configuring the Build</title><description>&lt;p style="text-align: justify;"&gt;&lt;strong&gt;&lt;span style="font-size: 12pt; line-height: 115%;"&gt;Configuring the Build&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12pt; line-height: 115%;"&gt;(Continued from &lt;span style="text-decoration: underline; font-size: 16px;"&gt;&lt;strong&gt;&lt;a href="http://oshyn.com/_blog/Software_Development/post/Net_Source_Code_Quality_Tools_%E2%80%93_Part_1_Setup/"&gt;Part 1&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;)&lt;br /&gt;
&lt;/span&gt; &lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12pt; line-height: 115%;"&gt;The next step is to build the solution using MSBuild. We can use any other plug-in we want to achieve this goal. &lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12pt; line-height: 115%;"&gt;First of all, we have to set-up the plug-in so we can select the path where the .Net Framework is located. We will build this project using the .Net Framework 4.&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;
    &lt;span style="font-size: 16px;"&gt;In&lt;em&gt; &amp;ldquo;Configure System&amp;rdquo;&lt;/em&gt; page, localize the&lt;em&gt; &amp;ldquo;MSBuild Builder&amp;rdquo;&lt;/em&gt; section and set the name and the path to&lt;em&gt; &amp;ldquo;MSBuild.exe&amp;rdquo;&lt;/em&gt; where this tool has been installed:&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ol&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;Name:&lt;em&gt; &lt;/em&gt;&lt;/strong&gt;&lt;em&gt;&amp;ldquo;MSBuild .Net Framework 4&amp;rdquo;&lt;/em&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;Path to MSBuild.exe:&lt;em&gt; &lt;/em&gt;&lt;/strong&gt;&lt;em&gt;&amp;ldquo;C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe&amp;rdquo;&lt;/em&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
    &lt;li&gt;&lt;span style="font-size: 16px;"&gt;After this, go to the&lt;em&gt; &amp;ldquo;Configure&amp;rdquo; &lt;/em&gt;page in the project&amp;rsquo;s main menu and under the Build section, click on the&lt;em&gt; &amp;ldquo;Add build step&amp;rdquo;&lt;/em&gt; button and then select &lt;em&gt;&amp;ldquo;Build a Visual Studio project or Solution using MSBuild&amp;rdquo;.&lt;/em&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;MSBuild Version:&lt;/strong&gt; &lt;em&gt;&amp;ldquo;MSBuild .Net Framework 4&amp;rdquo;&lt;/em&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;MSBuild Build File:&lt;/strong&gt;&lt;em&gt; &amp;ldquo;HudsonQualityTools.sln&amp;rdquo;&lt;/em&gt;. This is the name of the solution file we want to build.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;Command Line Arguments&lt;/strong&gt;: &lt;em&gt;&amp;ldquo;/p:Configuration=Release&amp;rdquo;&lt;/em&gt;. The parameters we want to use to build this solution. To read more information, go to MSBuild Command Line Reference.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;&lt;span style="font-size: 12pt; line-height: 115%;"&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div style="text-align: center;"&gt;&lt;span style="font-size: 12pt; line-height: 115%;"&gt;&lt;img alt="" src="/blogResources/Santiago Pesantez/.Net Source Code Quality Tools/4.png" style="border: 0pt none;" /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;span style="font-size: 12pt; line-height: 115%;"&gt;&lt;br /&gt;
&lt;br /&gt;
To test those configurations, save the settings and build the solution. While the build is running you can check the console log that is updated as the build goes on.&lt;/span&gt;&lt;span style="font-size: 12pt; line-height: 115%;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;img alt="" width="602" height="171" src="/blogResources/Santiago Pesantez/.Net Source Code Quality Tools/5.png" style="border: 0pt none;" /&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
</description><link>http://oshyn.com/RSSRetrieve.aspx?ID=3244&amp;A=Link&amp;ObjectID=196634&amp;ObjectType=56&amp;O=http%253a%252f%252foshyn.com%252f_blog%252fSoftware_Development%252fpost%252fNet_Source_Code_Quality_Tools_%25e2%2580%2593_Part_2_Configuring_the_Build%252f</link><guid isPermaLink="true">http://oshyn.com/_blog/Software_Development/post/Net_Source_Code_Quality_Tools_–_Part_2_Configuring_the_Build/</guid><pubDate>Wed, 09 Nov 2011 23:21:00 GMT</pubDate></item><item><title>Using WMDRM on your Application – Part 1</title><description>&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;Using WMDRM on your Application &amp;ndash; Part 1&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;Windows Media DRM (WMDRM) is a Digital Rights Management service for the Windows Media Platform, it&amp;rsquo;s used to manage multimedia files in a way that the distributor can control how that content is used. The content delivered with the WMDRM encryption is not universally accessible but limited to those users running Microsoft Windows. &lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;This service supports portable media players running Media Transfer Protocol (MTP) that implement WMDRM-PD.&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;To create a Windows Portable Devices application, you must have the Windows Software Development Kit (SDK) installed on your computer.&lt;/span&gt;&lt;/p&gt;
&lt;p class="BulletList" style="margin-left: 0cm; text-indent: 0cm; text-align: justify;"&gt;&lt;span style="font-size: 12px;"&gt;The SDK provides the following interfaces for devices that support Windows Media Digital Rights Management 10 for Portable Devices (WMDRM-PD):&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;span style="font-size: 12px;"&gt;IWMDRMDeviceApp, which enables an application to meter, synchronize licenses, and update DRM components on the device&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span style="font-size: 12px;"&gt;IWMDRMDeviceApp2, which extends IWMDRMDeviceApp and enables an application to query a specific DRM status or capability on the device.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="BulletList" style="margin-left: 0cm; text-indent: 0cm; text-align: justify;"&gt;&lt;span style="font-size: 12px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;The WMDRM API offers a sample application we can use to work and interact with portable devices. To build this application we need to complete the next steps:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;span style="font-size: 12px;"&gt;Install the Microsoft Windows SDK for Windows Vista (or superior)&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span style="font-size: 12px;"&gt;Install the Windows Media Format SDK version 11 (or greater)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;The console application has the following files we can use to modify and customize according to what we want to achieve:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;WpdApiDrmSample.vcproj:&lt;/strong&gt; This is the main project file for VC++ projects generated using an Application Wizard. It contains information about the version of Visual C++ that generated the file, and information about the platforms, configurations, and project features selected with the Application Wizard.&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;WpdApiDrmSample.cpp:&lt;/strong&gt; This is the main application source file.&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;DeviceEnumeration.cpp:&lt;/strong&gt; This file contains examples of how to enumerate portable devices.&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;ContentEnumeration.cpp:&lt;/strong&gt; This file contains examples of how to enumerate content on a portable device.&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;ContentTransfer.cpp: &lt;/strong&gt;This file contains examples of how to transfer content to a portable device.&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;WmdmEnumeration.cpp:&lt;/strong&gt; This file contains examples of how to initialize WMDM on a portable device that supports WMDM.&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;WmdrmDeviceApp.cpp:&lt;/strong&gt; This file contains examples of how to call IWMDRMDeviceApp methods on a portable device.&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;WMDMProgress.h:&lt;/strong&gt; This file contains an example implementation of IWMDMProgress3, used when updating the device's secure clock&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;AppKey.h, AppKey.cpp: &lt;/span&gt;&lt;/strong&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;These files define the application certificate and key used for protected content transfers. To authenticate your application, modify AppKey.cpp to set your application's private key and certificate values obtained from Windows Media Licensing. &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><link>http://oshyn.com/RSSRetrieve.aspx?ID=3244&amp;A=Link&amp;ObjectID=196640&amp;ObjectType=56&amp;O=http%253a%252f%252foshyn.com%252f_blog%252fSoftware_Development%252fpost%252fUsing_WMDRM_on_your_Application_%25e2%2580%2593_Part_1%252f</link><guid isPermaLink="true">http://oshyn.com/_blog/Software_Development/post/Using_WMDRM_on_your_Application_–_Part_1/</guid><pubDate>Wed, 09 Nov 2011 23:23:00 GMT</pubDate></item><item><title>.Net Source Code Quality Tools – Part 1: Setup</title><description>&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;Setup&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;Software quality is strongly connected with the source code quality. Coding standards may be very helpful in order to assure the high quality of the code, especially that they are supported by many applications tools. Now we are going to review some tools for checking the .Net source files.&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;As we are talking about .Net technologies, our first option would be to talk the Visual Studio Team Foundation System, due to its integration with the visual studio IDE and its flexibility managing and tracking the development activities across multiple branches. It allows to set-up a distributed and automated build process that quickly validates that every code check-in maintains product quality before the changes are committed to the sources repository. &lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;Besides we have some other open source options we could use to ensure the code quality, the advantages of this approach are that we have a good cohesion with .Net tools and that we can use those tools for free. &lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;There are different tools to work at any level of the development life cycle, due to our environment configuration we will use a Hudson&amp;rsquo;s plug-ins to check the code and get reports about the reported issues. Our Hudson environment is going to be configured to achieve the following goals:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;span style="font-size: 12px;"&gt;Get the source code from the Subversion repository.&lt;br /&gt;
    &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span style="font-size: 12px;"&gt;Build the project using MSBuild.&lt;br /&gt;
    &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span style="font-size: 12px;"&gt;Execute FxCop on an assembly and show warnings and a trend graph.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;Download plug-ins&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;To get the Hudson plug-ins we use in this document and some more, please visit those URLs:&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px;"&gt;&lt;a href="http://hudson-ci.org/download/plugins/"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;http://hudson-ci.org/download/plugins/&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px;"&gt;&lt;a href="http://download.hudson-labs.org/plugins/"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;http://download.hudson-labs.org/plugins/&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px;"&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Plugins#Plugins-Buildtools"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;https://wiki.jenkins-ci.org/display/JENKINS/Plugins#Plugins-Buildtools&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;Plug-ins Installation &lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;Once we have downloaded the plug-ins, the next step is to upload the .hpi files to install the plug-ins from outside the central plug in repository from the &amp;ldquo;&lt;em&gt;Advanced&amp;rdquo; &lt;/em&gt;tab in &amp;ldquo;&lt;em&gt;Manage Plugins&amp;rdquo; &lt;/em&gt;in the &amp;ldquo;&lt;em&gt;Manage Hudson&amp;rdquo;&lt;/em&gt; main menu option. Then restart Hudson and the plug-ins are ready be configured and work.&lt;/span&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt; &lt;/p&gt;
&lt;div style="text-align: center;"&gt;&lt;span style="font-size: 12px;"&gt;&lt;img alt="" width="600" height="318" style="border: 0pt none;" src="/blogResources/Santiago Pesantez/.Net Source Code Quality Tools/1.png" /&gt; &lt;/span&gt;&lt;/div&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px;"&gt;&lt;strong&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;Setting up the Source Code Management&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;I have created a console solution in visual studio and uploaded it to &lt;em&gt;SourceForge.&lt;/em&gt; Hudson supports CVS and SVN out of the box, but there are many other plug-ins we can use. After checking out the files from the repository, Hudson will show the new change sets since the previous build in the &lt;em&gt;Build&lt;/em&gt; page. The &lt;em&gt;Changes &lt;/em&gt;page contains a detailed view of changes sets such as the developer name, comments and the files that were changed.&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;To configure we have to access to the &amp;ldquo;&lt;em&gt;Configure&amp;rdquo; &lt;/em&gt;page located in the project&amp;rsquo;s main menu. &lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;Under the Source Code Management section, select &lt;em&gt;Subversion&lt;/em&gt; option.&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;&lt;span style="font-size: 12px;"&gt;Set the &amp;ldquo;Repository URL&amp;rdquo; field, in this example: &amp;ldquo;https://sourcequality.svn.sourceforge.net/svnroot/sourcequality/HudsonQualityTools/trunk&amp;rdquo;&lt;br /&gt;
    &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span style="font-size: 12px;"&gt;Set the &amp;ldquo;Local Module Directory&amp;rdquo; to: &amp;ldquo;.&amp;rdquo;.&lt;br /&gt;
    &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span style="font-size: 12px;"&gt;Set the repository browser to its default option: &amp;ldquo;Auto&amp;rdquo;.&lt;/span&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;&amp;nbsp;&lt;/span&gt; &lt;/li&gt;
&lt;/ol&gt;
&lt;p style="text-align: justify;"&gt; &lt;/p&gt;
&lt;div style="text-align: center;"&gt;&lt;span style="font-size: 12px;"&gt;&lt;img alt="" width="601" height="257" style="border: 0pt none;" src="/blogResources/Santiago Pesantez/.Net Source Code Quality Tools/2.png" /&gt; &lt;/span&gt;&lt;/div&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;span style="font-size: 12px; line-height: 115%;"&gt;To test that this configuration is correct, save the changes and build the solution. The source code will be downloaded from the repository and then located into the Workspace. Accessing to the &lt;em&gt;&amp;ldquo;Workspace&amp;rdquo;&lt;/em&gt; page, we can measure that the files had been checked out.&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt; &lt;span style="font-size: 12pt; line-height: 115%;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style="text-align: center;"&gt;&lt;span style="font-size: 12pt; line-height: 115%;"&gt;&lt;img alt="" width="500" height="290" style="border: 0pt none;" src="/blogResources/Santiago Pesantez/.Net Source Code Quality Tools/3.png" /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: 12pt; line-height: 115%;"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p style="text-align: center;"&gt; &lt;/p&gt;
</description><link>http://oshyn.com/RSSRetrieve.aspx?ID=3244&amp;A=Link&amp;ObjectID=196629&amp;ObjectType=56&amp;O=http%253a%252f%252foshyn.com%252f_blog%252fSoftware_Development%252fpost%252fNet_Source_Code_Quality_Tools_%25e2%2580%2593_Part_1_Setup%252f</link><guid isPermaLink="true">http://oshyn.com/_blog/Software_Development/post/Net_Source_Code_Quality_Tools_–_Part_1_Setup/</guid><pubDate>Wed, 09 Nov 2011 23:23:00 GMT</pubDate></item><item><title>ClickOnce Deployment - Creating a Custom Installer</title><description>&lt;p&gt;ClickOnce is a Microsoft technology that lets you easily deploy and update your Windows application, weather it is a Windows Forms, Windows Presentation Foundation (WPF), Console application or an Office solution (VSTO).&lt;/p&gt;
The application can be deployed using 3 different ways: from a Web Page, from a Network File Share or from media such as CD-ROM. &lt;br /&gt;
&lt;br /&gt;
There is plenty documentation and examples out there that show you how to deploy an application using ClickOnce. In this blog I am going to show you how to create a custom installer for a ClickOnce application.&lt;br /&gt;
&lt;br /&gt;
A custom installer could be required in case we need to provide custom user experience to our default ClickOnce installation process. Custom logic may include among others, system requirements checks, license agreement screen, customs messages, etc.&lt;br /&gt;
&lt;br /&gt;
In order to facilitate this, Microsoft has provided us with the &lt;a href="http://msdn.microsoft.com/en-us/library/ms136930.aspx" target="_blank" title="System.Deployment.Application"&gt;System.Deployment.Application&lt;/a&gt;&amp;nbsp;namespace which contains classes that let us customize the install and update behaviors in our ClickOnce application.&lt;br /&gt;
&lt;br /&gt;
The following steps will show you how to create a Custom Installer that installs an already existing ClickOnce application. Make sure you have a ClickOnce application deployed to either a web server location or a network share. If not, please look &lt;a href="http://msdn.microsoft.com/en-us/library/748fh114.aspx" target="_blank" title="Publishing ClickOnce Applications"&gt;here&lt;/a&gt;&amp;nbsp;for instructions on how to do it.&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
    &lt;li&gt;1.	Create a Windows Forms or WPF application and specify a name for it.&amp;nbsp; I am using a Windows Forms application named ClickOnceCustomInstaller for this tutorial.&lt;/li&gt;
    &lt;li&gt; &lt;/li&gt;
    &lt;li&gt;2.	Place a Label, a ProgressBar Control and a Button on the default form.&amp;nbsp; Set the &lt;em&gt;Modifiers &lt;/em&gt;property of the Label and ProgressBar to &lt;strong&gt;Public&lt;/strong&gt;, so you can access them from the custom installer class logic added in the following steps.&lt;/li&gt;
&lt;/ol&gt;
&lt;div style="text-align: center;"&gt;&lt;img alt="" src="/blogResources/cmartinez/ClickOnce/01.png" style="border: 0pt none;" /&gt; &lt;/div&gt;
&lt;ol&gt;
    &lt;li&gt;3.	Add references to System.Deployment and System.Windows.Forms if needed.&lt;/li&gt;
    &lt;li&gt; &lt;/li&gt;
    &lt;li&gt;4.	Add the following class to your project &lt;a href="/blogResources/cmartinez/ClickOnce/CustomInstaller.cs.txt" target="_blank" title="CustomInstaller.cs"&gt;CustomInstaller.cs&lt;/a&gt;.&amp;nbsp; This class handles the logic to install the application.&amp;nbsp; It uses various methods in the &lt;a href="http://msdn.microsoft.com/en-us/library/system.deployment.application.inplacehostingmanager.aspx" target="_blank" title="InPlaceHostingManager"&gt;InPlaceHostingManager&lt;/a&gt; which belongs to the &lt;a href="http://msdn.microsoft.com/en-us/library/ms136930.aspx" target="_blank" title="System.Deployment.Application"&gt;System.Deployment.Application&lt;/a&gt; namespace mentioned above.&lt;/li&gt;
    &lt;li&gt; &lt;/li&gt;
    &lt;li&gt;5.	Now let&amp;rsquo;s add some logic to invoke the installation process from our form.  Use the following code for the button&amp;rsquo;s click event.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;&lt;span style="font-size: 9.5pt; font-family: consolas; color: blue;"&gt;private&lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: consolas;"&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; button1_Click(&lt;span style="color: blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af;"&gt;EventArgs&lt;/span&gt; e)&lt;/span&gt;&lt;br /&gt;
{&lt;span style="font-size: 9.5pt; font-family: consolas; color: blue;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: 9.5pt; font-family: consolas; color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; const string&lt;/span&gt; deployManifestUri = &lt;span style="font-size: 9.5pt; font-family: consolas; color: #a31515;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: 9.5pt; font-family: consolas;"&gt;&lt;span style="color: #a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; "http://localhost/ClickOnceDemoApp/ClickOnceDemoApp.application"&lt;/span&gt;;&lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: consolas; color: #2b91af;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: 9.5pt; font-family: consolas;"&gt;&lt;span style="color: #2b91af;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CustomInstaller&lt;/span&gt; installer = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;CustomInstaller&lt;/span&gt;();&lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: consolas;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: 9.5pt; font-family: consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; installer.InstallApplication(deployManifestUri);&lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: consolas;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: 9.5pt; font-family: consolas;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: 9.5pt; font-family: consolas;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size: 9.5pt; font-family: consolas;"&gt;&lt;/span&gt;
&lt;blockquote class="webkit-indent-blockquote" style="border: medium none; margin: 0px 0px 0px 40px; padding: 0px;"&gt;&lt;br /&gt;
In the code above the variable &lt;em&gt;deployManifestUri &lt;/em&gt;represents the Uniform Resource Identifier (URI) to the deployment manifest of the application that will be installed or in other words the location of the manifest where the ClickOnce application was deployed to.&lt;/blockquote&gt;&lt;br /&gt;
&lt;ol&gt;
    &lt;li&gt;6.	Run the application and click the &lt;em&gt;Install &lt;/em&gt;button.&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;The application will be downloaded from the server and installed on the local machine. You will see the following screen.&lt;/li&gt;
&lt;/ol&gt;
&lt;div style="text-align: center;"&gt;&lt;img alt="" src="/blogResources/cmartinez/ClickOnce/02.png" style="border: 0pt none;" /&gt;
&lt;/div&gt;
&lt;blockquote class="webkit-indent-blockquote" style="border: medium none; margin: 0px 0px 0px 40px; padding: 0px;"&gt;&lt;br /&gt;
The application has been installed on your computer and you can now run the application from the Start menu link, or the desktop shortcut if one has been created.&lt;br /&gt;
&lt;br /&gt;
If you try to run the installer again, you will get the following message.&lt;/blockquote&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;img alt="" src="/blogResources/cmartinez/ClickOnce/03.png" style="border: 0pt none;" /&gt; &lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
So now you can use this as your starter code to build your own Custom Installer, adding the forms and related logic needed for your application.&lt;br /&gt;
&lt;br /&gt;
Also, please note that you can use the same ClickOnce Deployment API to override the default update behavior and check for updates using your own custom logic.&lt;br /&gt;
&lt;br /&gt;
</description><link>http://oshyn.com/RSSRetrieve.aspx?ID=3244&amp;A=Link&amp;ObjectID=186434&amp;ObjectType=56&amp;O=http%253a%252f%252foshyn.com%252f_blog%252fSoftware_Development%252fpost%252fClickOnce_Deployment_-_Creating_a_Custom_Installer%252f</link><guid isPermaLink="true">http://oshyn.com/_blog/Software_Development/post/ClickOnce_Deployment_-_Creating_a_Custom_Installer/</guid><pubDate>Wed, 09 Nov 2011 23:24:00 GMT</pubDate></item><item><title>Build Automation for Windows Presentation Framework (WPF) and Silverlight Applications</title><description>In this post, I want to share a way to do automated builds for Microsoft WPF Applications. The idea is to easily compile and deploy this type of application when the same code needs to be deployed to different environments, but applying different configuration files depending on the environment. For this technique I am going to use NAnt and the .NET framework 4.0.&lt;br /&gt;
&lt;br /&gt;
Suppose that you have a .NET application and you want to deploy the same code to different environments. The difference between deploying to one environment and another is the configuration files that need to be applied. So in this case, the app.config file values changes according to which environment deploy. Consider that your configuration file have an entry like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;add key="serverUri" value="http://www.integration.com"/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where the value of &amp;ldquo;serverUri &amp;rdquo; needs to change according to which environment is under compilation. To archive that we need to create a parameterized NANT script that receives as a parameter which environment to compile and applies the desired configuration file.&lt;br /&gt;
&lt;br /&gt;
The first thing that I suggest is to create a Configuration Manager structure inside your code versioning. So suppose that your project code is on svn in the location:&lt;br /&gt;
&lt;br /&gt;
trunk\Code\&amp;lt;Project Name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In your versioning repository you should create a folder structure like:&lt;br /&gt;
&lt;br /&gt;
trunk\ConfigurationManagement\BuildFiles\ (Put here the nant scripts)&lt;br /&gt;
trunk\ConfigurationManagement\Environments\&amp;lt;Project Name&amp;gt;\app.format.config&lt;br /&gt;
trunk\ConfigurationManagement\Environments\&amp;lt;Project Name&amp;gt;\Integration\ EnvBuild.property&lt;br /&gt;
trunk\ConfigurationManagement\Environments\&amp;lt;Project Name&amp;gt;\QA\ EnvBuild.property&lt;br /&gt;
trunk\ConfigurationManagement\Environments\&amp;lt;Project Name&amp;gt;\Production\ EnvBuild.property&lt;br /&gt;
&lt;br /&gt;
Where app.format.config is the configuration file of the application, and it contains tokens like:&lt;br /&gt;
&amp;lt;add key="serverUri" value="http://${dnsServer}"/&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
The value of &amp;ldquo;serverUri&amp;rdquo; is defined inside each property file EnvBuild.property and this value changes according to which environment is under compilation. So each EnvBuild.property file contains the entries respectively:&lt;br /&gt;
&amp;lt;property name="dnsServer" value="integration.oshyn.com" /&amp;gt;&lt;br /&gt;
&amp;lt;property name="dnsServer" value="qa.oshyn.com" /&amp;gt;&lt;br /&gt;
&amp;lt;property name="dnsServer" value="production.oshyn.com" /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to do that here is a very simple example of a NAnt script that needs to be located inside the folder trunk\ConfigurationManagement\BuildFiles\default.build.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=" /blogResources/jpalbuja/default.build"&gt;Click here to get the build sample File&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The following command should be used to execute the NAnt script from cmd:&lt;br /&gt;
&lt;br /&gt;
nant -buildfile:default.build -D:ftpserver=ftp.host.com -D:ftpuser=user -D:ftppass=password -D:ftpdestinationprefix=/PublishedApplication "-D:ftpsourceprefix=c:\installer" -D:project.name=Player -D:propertyfile=EnvBuild.property -D:sourcefile=app.format.config -D:environmenttag=QA -D:destinationfile=app.config ftpdeploy&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;
Important Components Requirements:&lt;/strong&gt;&lt;br /&gt;
1)&amp;nbsp;&amp;nbsp;&amp;nbsp;You need to have installed and configured NAnt in order to build your .NET 4.0 projects. Check &lt;a href="http://nant.sourceforge.net"&gt;http://nant.sourceforge.net/.&lt;/a&gt;&lt;br /&gt;
2)&amp;nbsp;&amp;nbsp;&amp;nbsp;You need to install and configure NAntContrib&amp;nbsp; in order to do some operation on your scripts like loadtasks, msbuild, etc&amp;hellip; Check &lt;a href="http://nantcontrib.sourceforge.net"&gt;http://nantcontrib.sourceforge.net/&lt;/a&gt;&lt;br /&gt;
3)&amp;nbsp;&amp;nbsp;&amp;nbsp;For the FTP deployments, you need to you use NAnt Task &lt;a href="http://www.spinthemoose.com/~ftptask/"&gt;http://www.spinthemoose.com/~ftptask/&lt;/a&gt;.&lt;br /&gt;
4)&amp;nbsp;&amp;nbsp;&amp;nbsp; The machine that is going to compile the .NET application needs to have all the necessary .NET components required for the compilation like the .NET framework, etc.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;
Important Notes about the Sample NAnt Script&lt;/strong&gt;&lt;br /&gt;
1)&amp;nbsp;&amp;nbsp;&amp;nbsp;The NAnt Settings section provides information of the NAnt task to include like the FTPTask and NAntContrib. Also it sets the target .NET framework version.&lt;br /&gt;
2)&amp;nbsp;&amp;nbsp;&amp;nbsp;To define a property in a scrip you can use&lt;br /&gt;
&amp;lt;property name="project.name" value="invalid.project" overwrite="false"/&amp;gt;, the overwrite=false shows that if that property were not defined upper or was not passed as parameter like -D:project.name=Player, the value assigned is going to be invalid.project.&lt;br /&gt;
3)&amp;nbsp;&amp;nbsp;&amp;nbsp;The target &amp;ldquo;build&amp;rdquo; has a dependency of the target &amp;ldquo;configMerge&amp;rdquo; in charge of the replacements of the tokens defined on the EnvBuild.property files into the app.format.config according to the property &amp;ldquo;environmenttag&amp;rdquo;. That dependency means that first is going to be executed the target &amp;ldquo;configMerge&amp;rdquo; and then the target &amp;ldquo;build&amp;rdquo;. Target build is executed by default if you do not specify any target at the moment of the execution of the NAnt script.&lt;br /&gt;
4)&amp;nbsp;&amp;nbsp;&amp;nbsp;Inside the msbuild task, the example is performing a ClickOnce compilation. For more details check &lt;a href="http://msdn.microsoft.com/en-us/library/ms165431%28v=vs.80%29.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms165431%28v=vs.80%29.aspx.&lt;/a&gt;&lt;br /&gt;
5)&amp;nbsp;&amp;nbsp;&amp;nbsp;The target &amp;ldquo;ftpdeploy&amp;rdquo; have a dependency to the target &amp;ldquo;build&amp;rdquo; that means that the target &amp;ldquo;configMerge&amp;rdquo;, &amp;ldquo;build&amp;rdquo; are going to be executed before the target &amp;ldquo;ftpdeploy&amp;rdquo;.&lt;br /&gt;
&lt;br /&gt;
As I exposed here, this is an example of how to automate deployments for WPF applications. Notice that this script sample receives the parameter environmenttag to decide which configuration file to apply and deploy.&amp;nbsp; In order to automate the execution of NAnt commands you can create .bat files that download the latest code using a svn client and execute the NAnt command.&lt;br /&gt;
&lt;br /&gt;
</description><link>http://oshyn.com/RSSRetrieve.aspx?ID=3244&amp;A=Link&amp;ObjectID=183076&amp;ObjectType=56&amp;O=http%253a%252f%252foshyn.com%252f_blog%252fSoftware_Development%252fpost%252fWindows-Presentation-Framework-Build-Automation-Silverlight%252f</link><guid isPermaLink="true">http://oshyn.com/_blog/Software_Development/post/Windows-Presentation-Framework-Build-Automation-Silverlight/</guid><pubDate>Wed, 09 Nov 2011 23:24:00 GMT</pubDate></item><item><title>Mac OS X iTunes Development - Easy Cocoa Integration with iTunes</title><description>&lt;p&gt;You &lt;strong&gt;CAN&lt;/strong&gt; integrate your mac application with iTunes, this post assumes you have basic knowledge of Objective-C. The Cocoa frameworks makes it very easy to add animations, link an action to a button, play videos, audio files and much more. You can use the QTKit framework to embed a QuickTime player in your application, but when it comes to iTunes integration, there is no framework to play with like there is for QuickTime. Nevertheless, that doesn&amp;rsquo;t mean you can&amp;rsquo;t integrate your app with iTunes. The solution is AppleScripts. &lt;/p&gt;
&lt;p&gt;
The concept of AppleScripts is very simple, its a scripting language developed by Apple that can control other applications. Cocoa can run, send data and get data from applescripts. Lets look at the most simplest example applescript that simply opens iTunes:&lt;/p&gt;
&lt;strong&gt;tell&lt;/strong&gt; &lt;span style="color: #0000ff;"&gt;&lt;em&gt;application&lt;/em&gt;&lt;/span&gt; "iTunes"&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff;"&gt;&amp;nbsp;run&lt;/span&gt;&lt;br /&gt;
&lt;strong&gt;end tell&lt;br /&gt;
&lt;br /&gt;
&lt;/strong&gt;This scripting language is very easy to write. This script tells iTunes to run like you can probably figure out by just reading the code. To run this script we use event descriptors, there are several lines of code required to run scripts and running them with arguments is very different to running them without arguments. I built this &lt;a href="http://oshyn.com/blogResources/germanVillacrecesPosts/ScriptManager.zip"&gt;manager class &lt;/a&gt;(ScriptManager.h,ScriptManager.m) to do all the dirty work for us, its a very simple class with &lt;strong&gt;three methods&lt;/strong&gt;:&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;
(void) executeScript:(NSString *) name;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
You can use this method if you simply want to run a script that takes no arguments, the name argument is the script filename you have added to your Cocoa project.&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;
(void) executeScript:(NSString *) name withArguments:(NSArray *) args;&lt;br /&gt;
&lt;/strong&gt;&lt;br /&gt;
When you have a script that takes one or more arguments, you call this method and send the arguments as an NSArray.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;(NSMutableArray *) getResults;&lt;br /&gt;
&lt;/strong&gt;&lt;br /&gt;
This method returns a mutable array with all the results that the most recently executed script returned.&lt;br /&gt;
&lt;br /&gt;
You will also see a method called &amp;ldquo;arrayFromDescriptor&amp;rdquo;, don&amp;rsquo;t pay any attention to that one, its just an internal method.&lt;br /&gt;
&lt;br /&gt;
So how do we use this class?&amp;nbsp; In a nutshell, first you add the applescript to your project, adding it to the Resources folder is not enough, you need to drag and drop the script to the Copy Bundle Resources group in the Targets tree, under your project&amp;rsquo;s name. Otherwise the manager wont find your script. Once you have done that you simple import the ScriptManager class to your project, and make an instance of the class to run any number of scripts. &lt;br /&gt;
&lt;br /&gt;
Lets build an example Cocoa project called ScriptDemo, we will have our AppDelegate main class header and main file (ScriptDemoAppDelegate.h,ScriptDemoAppDelegate.m). We add the ScriptManager.h and ScriptManager.m files to our project, and on our ScriptDemoAppDelegate header class, we add the required lines (in bold and color);&lt;br /&gt;
&lt;span style="color: #595959;"&gt;&lt;br /&gt;
#import &amp;lt;Cocoa/Cocoa.h&amp;gt;&lt;strong&gt;&lt;br /&gt;
&lt;span style="color: #494429;"&gt;#import&lt;/span&gt; &lt;span style="color: #c00000;"&gt;"ScriptManager.h"&lt;/span&gt;&lt;/strong&gt;&lt;span style="color: #c00000;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
@interface ScriptDemoAppDelegate : NSObject &amp;lt;NSApplicationDelegate&amp;gt; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; NSWindow *window;&lt;span style="color: #205867;"&gt;&lt;strong&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;ScriptManager &lt;span style="color: #000000;"&gt;*&lt;/span&gt;manager;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@property (assign) IBOutlet NSWindow *window;&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;
-(&lt;span style="color: #c0504d;"&gt;IBAction&lt;/span&gt;)startiTunes:(&lt;span style="color: #c0504d;"&gt;id&lt;/span&gt;)sender;&lt;br /&gt;
&lt;/strong&gt;&lt;br /&gt;
@end&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
We create a ScriptManager object, and the IBAction to trigger the applescript with a button.&lt;br /&gt;
&lt;br /&gt;
Open MainMenu.xib on Interface Builder and place a button (Push Button) anywhere in the window, change its label to &amp;ldquo;Start iTunes&amp;rdquo; and link it to the action startiTunes.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;img alt="" style="border: 0pt none; width: 90%; height: 90%;" src="/blogResources/germanVillacrecesPosts/Screen shot 2010-10-05 at 8.09.35 PM.png" /&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
Next, open the ScriptDemoAppDelegate main class, and place the IBAction definition:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #595959;"&gt;#import "ScriptDemoAppDelegate.h"&lt;br /&gt;
&lt;br /&gt;
@implementation ScriptDemoAppDelegate&lt;br /&gt;
&lt;br /&gt;
@synthesize window;&lt;br /&gt;
&lt;br /&gt;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;// Insert code here to initialize your application &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;strong&gt;&lt;br /&gt;
-(&lt;span style="color: #c0504d;"&gt;IBAction&lt;/span&gt;)startiTunes:(&lt;span style="color: #c0504d;"&gt;id&lt;/span&gt;)sender{&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span style="color: #31859b;"&gt;manager&lt;/span&gt; = [&lt;span style="color: #31859b;"&gt;ScriptManager&lt;/span&gt; new];&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;[&lt;span style="color: #31859b;"&gt;manager&lt;/span&gt; &lt;span style="color: #205867;"&gt;executeScript&lt;/span&gt;:&lt;span style="color: #c00000;"&gt;@"startiTunes"&lt;/span&gt;];&lt;br /&gt;
}&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #595959;"&gt;@end&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
All we do here is create an instance of the ScriptManager class and call the executeScript method to trigger an applescript without sending any arguments. Make sure the applescript is called &amp;ldquo;startiTunes&amp;rdquo; and its placed on the Copy Bundle Resource group under Targets like I mentioned before.&lt;br /&gt;
&lt;br /&gt;
Build and run your project, click on the Start iTunes button and iTunes should run! &lt;br /&gt;
&lt;br /&gt;
Here are the used files:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://oshyn.com/blogResources/germanVillacrecesPosts/ScriptDemo.zip"&gt;ScriptDemo XCode Project&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://oshyn.com/blogResources/germanVillacrecesPosts/ScriptManager.zip"&gt;ScriptManager Class&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://oshyn.com/blogResources/germanVillacrecesPosts/startiTunes.scpt"&gt;startiTunes.scpt&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I ope this small example was helpful, feel free to post any comments or questions.&lt;br /&gt;
&lt;br /&gt;
</description><link>http://oshyn.com/RSSRetrieve.aspx?ID=3244&amp;A=Link&amp;ObjectID=166783&amp;ObjectType=56&amp;O=http%253a%252f%252foshyn.com%252f_blog%252fSoftware_Development%252fpost%252fMac_OS_X_iTunes_Development_-_Easy_Cocoa_Integration_with_iTunes%252f</link><guid isPermaLink="true">http://oshyn.com/_blog/Software_Development/post/Mac_OS_X_iTunes_Development_-_Easy_Cocoa_Integration_with_iTunes/</guid><pubDate>Wed, 06 Oct 2010 02:09:00 GMT</pubDate></item><item><title>Video element on HTML5</title><description>&lt;span style="line-height: 150%; font-size: 12pt;"&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="font-family: cambria; font-size: 18px; color: #4f81bd;"&gt;Introduction &lt;/span&gt;&lt;/h2&gt;
&lt;p style="line-height: 150%; margin: 0in 0in 10pt; text-align: justify;"&gt;&lt;span style="line-height: 150%; font-size: 12pt; font-family: calibri;"&gt;HTML5 is introducing many new features, APIs, and elements; one of them is the video element which we&amp;rsquo;ll discuss briefly on this post.&lt;/span&gt;&lt;/p&gt;
&lt;p style="line-height: 150%; margin: 0in 0in 10pt; text-align: justify;"&gt;&lt;span style="line-height: 150%; font-size: 12pt; font-family: calibri;"&gt;One of the biggest issues that web pages face is that video is not natively supported by any browser; normally you will need a plug-in like Flash player to reproduce videos. This is not a big deal if you use Firefox or Internet Explorer, but what happens if you have an iPhone or an iPad? Well, you can&amp;rsquo;t access these videos&amp;hellip; that&amp;rsquo;s why HTML5 is so important, especially with the growing demand of mobile devices like the iPhone.&lt;/span&gt;&lt;/p&gt;
&lt;p style="line-height: 150%; margin: 0in 0in 10pt; text-align: justify;"&gt;&lt;span style="line-height: 150%; font-size: 12pt; font-family: calibri;"&gt;The purpose of the video element is to standardize playback for video on all browsers. This is not that easy, as you might imagine&amp;hellip; The current HTML5 draft specification does not specify which video formats browsers should support. There are lots of video formats nowadays, and it&amp;rsquo;s hard to define which one to use; it should be royalty free of course, have a good compression, high quality image and it shouldn&amp;rsquo;t kill the CPU while decoding the file.&lt;/span&gt;&lt;/p&gt;
&lt;p style="line-height: 150%; margin: 0in 0in 10pt; text-align: justify;"&gt;&lt;span style="line-height: 150%; font-size: 12pt; font-family: calibri;"&gt;&amp;nbsp;There are three main candidates:&lt;/span&gt;&lt;/p&gt;
&lt;p style="line-height: 150%; margin: 0in 0in 0pt 0.5in; text-align: justify;"&gt;&lt;span style="line-height: 150%; font-size: 12pt;"&gt;&lt;span style="font-family: calibri;"&gt;-&lt;/span&gt;&lt;span style="line-height: normal; font-variant: normal; font-style: normal; font-size: 7pt; font-weight: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt; font-family: calibri;"&gt;Ogg Theora&lt;/span&gt;&lt;/p&gt;
&lt;p style="line-height: 150%; margin: 0in 0in 0pt 0.5in; text-align: justify;"&gt;&lt;span style="line-height: 150%; font-size: 12pt;"&gt;&lt;span style="font-family: calibri;"&gt;-&lt;/span&gt;&lt;span style="line-height: normal; font-variant: normal; font-style: normal; font-size: 7pt; font-weight: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt; font-family: calibri;"&gt;H.264&lt;/span&gt;&lt;/p&gt;
&lt;p style="line-height: 150%; margin: 0in 0in 10pt 0.5in; text-align: justify;"&gt;&lt;span style="line-height: 150%; font-size: 12pt;"&gt;&lt;span style="font-family: calibri;"&gt;-&lt;/span&gt;&lt;span style="line-height: normal; font-variant: normal; font-style: normal; font-size: 7pt; font-weight: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt; font-family: calibri;"&gt;VP8&lt;/span&gt;&lt;/p&gt;
&lt;p style="line-height: 150%; margin: 0in 0in 10pt; text-align: justify;"&gt;&lt;span style="line-height: 150%; font-size: 12pt; font-family: calibri;"&gt;In my opinion browsers should support as many file types as they can, but the most important thing is to standardize this on all browsers.&lt;/span&gt;&lt;/p&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="font-family: cambria; font-size: 18px; color: #4f81bd;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 style="margin: 10pt 0in 0pt;"&gt;&lt;span style="font-family: cambria; font-size: 18px; color: #4f81bd;"&gt;Examples&lt;/span&gt;&lt;/h2&gt;
&lt;p style="line-height: 150%; margin: 0in 0in 10pt; text-align: justify;"&gt;&lt;span style="line-height: 150%; font-size: 12pt; font-family: calibri;"&gt;Ok, now to give you an idea how this element works:&lt;/span&gt;&lt;/p&gt;
&lt;p style="line-height: normal; margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 12pt; font-family: calibri;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="line-height: normal; margin: 0in 0in 0pt;"&gt;&lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;em&gt;&lt;span style="font-size: 12pt; font-family: calibri;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;video src="video.ogv"&amp;gt;&amp;lt;/video&amp;gt;&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="line-height: normal; margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 12pt; font-family: calibri;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="line-height: 150%; margin: 0in 0in 10pt; text-align: justify;"&gt;&lt;span style="line-height: 150%; font-size: 12pt; font-family: calibri;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="line-height: 150%; margin: 0in 0in 10pt; text-align: justify;"&gt;&lt;span style="line-height: 150%; font-size: 12pt; font-family: calibri;"&gt;As you can see it&amp;rsquo;s pretty simple, and besides that basic markup you have some parameters that you could use, like controls, autoplay, etc.&lt;/span&gt;&lt;/p&gt;
&lt;p style="line-height: 150%; margin: 0in 0in 10pt; text-align: justify;"&gt;&lt;span style="line-height: 150%; font-size: 12pt; font-family: calibri;"&gt;I also found a couple of examples while researching this topic:&lt;/span&gt;&lt;/p&gt;
&lt;p style="line-height: 150%; margin: 0in 0in 0pt 0.5in; text-align: justify;"&gt;&lt;span style="line-height: 150%; font-size: 12pt;"&gt;&lt;span style="font-family: calibri;"&gt;-&lt;/span&gt;&lt;span style="line-height: normal; font-variant: normal; font-style: normal; font-size: 7pt; font-weight: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;a href="http://double.co.nz/video_test/test2.html" target="_blank"&gt;&lt;span style="line-height: 150%; font-size: 12pt; font-family: calibri; color: #0000ff;"&gt;http://double.co.nz/video_test/test2.html&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="line-height: 150%; margin: 0in 0in 10pt 0.5in; text-align: justify;"&gt;&lt;span style="line-height: 150%; font-size: 12pt;"&gt;&lt;span style="font-family: calibri;"&gt;-&lt;/span&gt;&lt;span style="line-height: normal; font-variant: normal; font-style: normal; font-size: 7pt; font-weight: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;a href="http://html5demos.com/video" target="_blank"&gt;&lt;span style="line-height: 150%; font-size: 12pt; font-family: calibri;"&gt;http://html5demos.com/video&lt;/span&gt;&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p style="line-height: 150%; margin: 0in 0in 10pt; text-align: justify;"&gt;&lt;span style="line-height: 150%; font-size: 12pt; font-family: calibri;"&gt;These examples might or might not work depending on your browser. You can also find out which browser supports which file extensions &lt;/span&gt;&lt;span xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;a href="http://en.wikipedia.org/wiki/HTML5_video" target="_blank"&gt;&lt;span style="line-height: 150%; font-size: 12pt; font-family: calibri; color: #0000ff;"&gt;here&lt;/span&gt;&lt;/a&gt;&lt;span style="line-height: 150%; font-size: 12pt; font-family: calibri;"&gt;, together with some more info on HTML5 video.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/span&gt;
</description><link>http://oshyn.com/RSSRetrieve.aspx?ID=3244&amp;A=Link&amp;ObjectID=151877&amp;ObjectType=56&amp;O=http%253a%252f%252foshyn.com%252f_blog%252fSoftware_Development%252fpost%252fVideo_element_on_HTML5_%252f</link><guid isPermaLink="true">http://oshyn.com/_blog/Software_Development/post/Video_element_on_HTML5_/</guid><pubDate>Wed, 09 Nov 2011 23:24:00 GMT</pubDate></item><item><title>How to configure Zend Framework with Zend Server to create modern PHP applications</title><description>&lt;p&gt;This guide will guide you through configuring the &lt;a href="http://zendframework.com/"&gt;Zend Framework&lt;/a&gt; which is a very popular and powerful &lt;a href="http://oreilly.com/php/archive/mvc-intro.html"&gt;MVC&lt;/a&gt; framework for PHP, the idea is to configure it using the libraries provided on the &lt;a href="http://www.zend.com/en/products/server"&gt;Zend Server&lt;/a&gt; package installer.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
On a &lt;a href="http://www.oshyn.com/_blog/Software_Development/post/Introducing_Drupal_to_Zend_Zerver_CE_5,_How_to/"&gt;previous post&lt;/a&gt; I explained how to set up a Zend Server installation, follow it so you can have both, Zend Server CE and the Zend Framework installed on your system.&lt;br /&gt;
&lt;br /&gt;
Once you have downloaded and installed all the necessary packages this is the folder structure where u can find the files for the Zend Framework, for this guide I'm using Zend Server version 5 which is at the moment the latest release and it comes also with the latest version of the Zend Framework v 1.10:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;/usr/local/zend/share/ZendFramework (root folder for the Zend Framework)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;/usr/local/zend/share/ZendFramework/bin (shell scripts folder, these scripts will help you handle &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;your project config, I'll explain later)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;/usr/local/zend/share/ZendFramework/library/Zend (Framework library files)&lt;br /&gt;
&lt;br /&gt;
Ok, now that we have all the tools, let's create our first PHP application using the Zend Framework, as I mentioned above, Zend Framework comes together with a shell script that will help creating or modifying element on our MVC project structure, in order to use this script we'll have to create first a link to it just for easy handling globally through the command line, on Linux you create a link by typing:&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;$ sudo ln -s /usr/local/zend/share/ZendFramework/bin/zf.sh /usr/local/bin/zf&lt;br /&gt;
&lt;br /&gt;
Let's now create a new PHP project in our home folder, we do so by typing:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;$ zf create project /home/username/my_first_project&lt;br /&gt;
&lt;br /&gt;
the command will create the whole project structure including some initial config files that you can alter later while developing your project. Once the command is done the folder structure you'll see will look similar to:&lt;br /&gt;
&lt;br /&gt;
my_first_project&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;|-- application&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;|&amp;nbsp;&amp;nbsp; |-- Bootstrap.php&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;|&amp;nbsp;&amp;nbsp; |-- configs&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;|&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp; `-- application.ini&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;|&amp;nbsp;&amp;nbsp; |-- controllers&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;|&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp; |-- ErrorController.php&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;|&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp; `-- IndexController.php&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;|&amp;nbsp;&amp;nbsp; |-- models&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;|&amp;nbsp;&amp;nbsp; `-- views&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |-- helpers&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; `-- scripts&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |-- error&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp; `-- error.phtml&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; `-- index&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; `-- index.phtml&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;|-- library&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;|-- public&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;|&amp;nbsp;&amp;nbsp; |-- .htaccess&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;|&amp;nbsp;&amp;nbsp; `-- index.php&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;`-- tests&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |-- application&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp; `-- bootstrap.php&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |-- library&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp; `-- bootstrap.php&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; `-- phpunit.xml&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now we need to link the Zend Framework's library files to our library project so we can make use of them, to do so we need to create a extra link that will point our library folder to our Zend Framework's current installation, type this in your terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;$ ln -s /home/username/my_first_project/library path/to/ZendFramework/library/Zend&lt;br /&gt;
&lt;br /&gt;
and voila! You are all set up to start coding your application with all the advantages that Zend Framework brings.&lt;br /&gt;
&lt;br /&gt;
You can find more info about what the zf.sh script does by typing:&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;$ zf --help&lt;br /&gt;
&lt;br /&gt;
</description><link>http://oshyn.com/RSSRetrieve.aspx?ID=3244&amp;A=Link&amp;ObjectID=145270&amp;ObjectType=56&amp;O=http%253a%252f%252foshyn.com%252f_blog%252fSoftware_Development%252fpost%252fHow_to_configure_Zend_Framework_with_Zend_Server_to_create_modern_PHP_applications_%252f</link><guid isPermaLink="true">http://oshyn.com/_blog/Software_Development/post/How_to_configure_Zend_Framework_with_Zend_Server_to_create_modern_PHP_applications_/</guid><pubDate>Fri, 21 May 2010 18:17:00 GMT</pubDate></item></channel></rss>
