<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Daily Morn by Raymond Li</title>
	<atom:link href="http://rayli.net/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://rayli.net/blog</link>
	<description></description>
	<lastBuildDate>Fri, 31 May 2013 03:10:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Visual Studio integration with p4merge</title>
		<link>http://rayli.net/blog/2013/05/visual-studio-integration-with-p4merge/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=visual-studio-integration-with-p4merge</link>
		<comments>http://rayli.net/blog/2013/05/visual-studio-integration-with-p4merge/#comments</comments>
		<pubDate>Thu, 30 May 2013 02:04:09 +0000</pubDate>
		<dc:creator>Raymond Li</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://rayli.net/blog/?p=1390</guid>
		<description><![CDATA[Integrating Perforce&#8217;s p4merge with Visual Studio can be a bit tricky, but it doesn&#8217;t have to be! Using a couple of pre-written batch files and Visual Studio configurations, you&#8217;ll be up-and-running in no time. Step 1: Copy the following batch files to your c:\Program Files\Perforce\ directory. p4diff.bat is for diffing files p4merge.bat is for merging [...]]]></description>
			<content:encoded><![CDATA[<p>Integrating Perforce&#8217;s <em><a title="p4merge" href="http://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools">p4merge</a></em> with Visual Studio can be a bit tricky, but it doesn&#8217;t have to be! Using a couple of pre-written batch files and Visual Studio configurations, you&#8217;ll be up-and-running in no time.</p>
<p><span id="more-1390"></span></p>
<h3>Step 1: Copy the following batch files to your <em>c:\Program Files\Perforce\</em> directory.</h3>
<ul>
<li><em><a title="p4diff.bat" href="http://rayli.net/ref/2013-05/p4diff.bat">p4diff.bat</a></em> is for diffing files</li>
<li><em><a title="p4merge.bat" href="http://rayli.net/ref/2013-05/p4merge.bat">p4merge.bat</a></em> is for merging files</li>
</ul>
<h3>Step 2: In Visual Studio, navigate to the <em>Configure User Tools</em> dialog.</h3>
<ul>
<li>Launch Visual Studio.</li>
<li>Go to <em>Tools &gt; Options&#8230; &gt; Source Control &gt; Visual Studio Team Foundation Server.</em></li>
<li>Click on <em><em>Configure User Tools</em>.</em></li>
</ul>
<div><em><img class="alignnone" title="Visual Studio Options" src="http://rayli.net/ref/2013-05/options.png" alt="Visual Studio Options" width="400" height="228" /></em></div>
<h3>Step 3: Click <em>Add</em>.</h3>
<ul>
<li>You&#8217;ll need to do this Add step twice.</li>
<li>&#8230;once to configure p4merge for file compare.</li>
<li>&#8230;and a second time to configure p4merge for file merge.</li>
</ul>
<div><img class="alignnone" title="Configure User Tools Dialog" src="http://rayli.net/ref/2013-05/configure_user_tools.png" alt="Configure User Tools Dialog" width="400" height="235" /></div>
<h3>Step 4: Configure Visual Studio to use <em>p4diff.bat</em> for file compare.</h3>
<div>
<ul>
<li>In the Configure Tool dialog, enter the following details.</li>
<li>Extension: .*</li>
<li>Operation: Compare</li>
<li>Command: C:\Program Files\Perforce\p4diff.bat</li>
<li>Arguments: %1 %2 &#8220;x&#8221; &#8220;x&#8221; &#8220;x&#8221; %6 %7</li>
</ul>
<div><img class="alignnone" title="Configure Tool for Compare" src="http://rayli.net/ref/2013-05/configure_tool_compare.png" alt="Configure Tool for Compare" width="402" height="205" /></div>
</div>
<h3>Step 5: Configure Visual Studio to use <em>p4merge.bat</em> for file merging.</h3>
<ul>
<li>In the Configure Tool dialog, enter the following details.</li>
<li>Extension: .*</li>
<li>Operation: Merge</li>
<li>Command: C:\Program Files\Perforce\p4merge.bat</li>
<li>Arguments: %1 %2 %3 %4 &#8220;x&#8221; %6 %7 %8 %9</li>
</ul>
<p><img class="alignnone" title="Configure Tool - Merge" src="http://rayli.net/ref/2013-05/configure_tool_merge.png" alt="Configure Tool - Merge" width="403" height="207" /></p>
<h3>Summary</h3>
<p>After saving all your changes, you&#8217;re all set. The next time you do a file compare or file merge operation in Visual Studio, p4merge will be launched. The file merge operation uses 3-way merge. The left-most pane is the file on the server, the middle pane is the version you had before you made any modifications and the right-most pane is your modified version of the file. The bottom pane is the merged result of the 3-way merge.</p>
<h3>References</h3>
<p><a title="Using P4Merge with Visual Studio 2008 and TFS" href="http://www.richard-banks.org/2009/09/using-p4merge-with-visual-studio-2008.html">Using P4Merge with Visual Studio 2008 and TFS</a></p>
]]></content:encoded>
			<wfw:commentRss>http://rayli.net/blog/2013/05/visual-studio-integration-with-p4merge/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to block phone numbers on Windows Phone</title>
		<link>http://rayli.net/blog/2013/04/how-to-block-phone-numbers-on-windows-phone/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=how-to-block-phone-numbers-on-windows-phone</link>
		<comments>http://rayli.net/blog/2013/04/how-to-block-phone-numbers-on-windows-phone/#comments</comments>
		<pubDate>Thu, 18 Apr 2013 00:52:23 +0000</pubDate>
		<dc:creator>Raymond Li</dc:creator>
				<category><![CDATA[Popular]]></category>
		<category><![CDATA[Windows Phone 7]]></category>

		<guid isPermaLink="false">http://rayli.net/blog/?p=1380</guid>
		<description><![CDATA[You own a Windows Phone 7, and you&#8217;d like to ignore calls from certain numbers. There&#8217;s no need for MarketPlace Apps or special hacks. Read on to configure this easily. The basic solution is to use a silent ringtone for numbers you don&#8217;t want bothering you. This consists of 4 basic steps. Get yourself a [...]]]></description>
			<content:encoded><![CDATA[<p>You own a Windows Phone 7, and you&#8217;d like to ignore calls from certain numbers. There&#8217;s no need for MarketPlace Apps or special hacks. Read on to configure this easily.</p>
<p><span id="more-1380"></span></p>
<p>The basic solution is to use a <strong>silent ringtone</strong> for numbers you don&#8217;t want bothering you. This consists of 4 basic steps.</p>
<ol>
<li>Get yourself a blank mp3.</li>
<li>Make it a ringtone in Zune.</li>
<li>Sync it to your phone.</li>
<li>Set it as a ringtone.</li>
</ol>
<h3>Step 1: Get yourself a blank mp3</h3>
<ul>
<li>Download a blank mp3 from here: <a title="Blank MP3s" href="http://www.xamuel.com/blank-mp3s">http://www.xamuel.com/blank-mp3s</a></li>
<li>You can also make your own.</li>
</ul>
<h3>Step 2: Make it a ringtone in Zune</h3>
<ul>
<li>Copy the blank mp3 to your Music folder.</li>
<li>Launch Zune.</li>
<li>Zune should pick it up in its collection.</li>
<li>In Zune, navigate to Collection &gt; Music.</li>
<li>Find the blank mp3.</li>
<li>Right-cilck on the mp3 &gt; Edit.</li>
<li>Change the title to: Silent</li>
<li>Change the genre to: ringtone</li>
<li>Click OK.</li>
</ul>
<h3>Step 3: Sync it to your phone</h3>
<ul>
<li>Connect your laptop to your phone via USB.</li>
<li>Right-click on the mp3 &gt; Sync with &lt;your phone name&gt;.</li>
<li>Disconnect your phone from your laptop.</li>
</ul>
<h3>Step 4: Set it as a ringtone</h3>
<ul>
<li>In your apps, go to Phone.</li>
<li>Click on a phone number in your call history to block.</li>
<li>After the profile for the phone number displays, click the pencil icon to edit.</li>
<li>Click on Ringtone.</li>
<li>Select the Silent ringtone which should be in the Custom section.</li>
</ul>
<p>There you have it! Now you&#8217;ll never hear  that caller calling again (unless they change phone numbers)! <img src='http://rayli.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://rayli.net/blog/2013/04/how-to-block-phone-numbers-on-windows-phone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL stress test: Simulate full database</title>
		<link>http://rayli.net/blog/2013/03/sql-stress-test-simulate-full-database/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sql-stress-test-simulate-full-database</link>
		<comments>http://rayli.net/blog/2013/03/sql-stress-test-simulate-full-database/#comments</comments>
		<pubDate>Wed, 06 Mar 2013 02:43:25 +0000</pubDate>
		<dc:creator>Raymond Li</dc:creator>
				<category><![CDATA[Software Testing]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://rayli.net/blog/?p=1349</guid>
		<description><![CDATA[Simulating a full database is a beautiful stress test, but how the heck can this be done quickly with SQL Server? A full database is likely never encountered during development and probably completely forgotten during testing (it was in our case!). It will likely cause numerous issues for your software under test, since it&#8217;s usually [...]]]></description>
			<content:encoded><![CDATA[<p>Simulating a full database is a beautiful stress test, but how the heck can this be done quickly with SQL Server?</p>
<p><span id="more-1349"></span></p>
<p>A full database is likely never encountered during development and probably completely forgotten during testing (it was in our case!). It will likely cause numerous issues for your software under test, since it&#8217;s usually forgotten. Here&#8217;s 4 easy steps to simulate a full SQL Server database without spending loads of time and resources filling up your database. This test is designed to mimic a full disk drive.</p>
<ol>
<li>Prepare the database</li>
<li>Create a TrueCrypt volume</li>
<li>Copy the database to the TrueCrypt volume</li>
<li>Bring the database back online</li>
</ol>
<p>The idea is to put a copy of your database on a TrueCrypt volume just big enough to hold your database. As you add records to this database, it fills up quickly. Below is each step in detail.</p>
<h3>Step 1: Prepare the database</h3>
<ul>
<li>Take the database offline. The simplest way to do this is to run the following SQL.</li>
</ul>
<pre class="brush: sql; title: ; notranslate">
ALTER DATABASE your_database_name
SET OFFLINE WITH ROLLBACK IMMEDIATE
GO
</pre>
<ul>
<li>Make a copy of the original database.<br />
To find the location of your database in <em>SQL Server Management Studio</em>, simply right-click on your database and select <em>Properties</em>. Make a copy of all files associated with your database and store them in a separate directory. The idea is to keep a copy of your database in case something goes wrong. This is highly recommended.</li>
<li>Bring the database back online. Running the following SQL will do just that.</li>
</ul>
<pre class="brush: sql; title: ; notranslate">
ALTER DATABASE your_database_name
SET ONLINE
GO
</pre>
<ul>
<li>Shrink the database.<br />
Right-click on your database in<em> SQL Server Management Studio</em>. Then select <em>Tasks</em> &gt; <em>Shrink</em> &gt; <em>Database</em>. Database files are frequently bigger than the space the records occupy. The goal of this step is to make the database files about the same size as the space needed to store the records. This step also makes the database files a bit easier to deal with, since the shrunken files will be smaller. In addition, it means you&#8217;ll waste less time creating a TrueCrypt volume as a container for a gazillion GB of database files.</li>
</ul>
<h3>Step 2: Create a TrueCrypt volume</h3>
<ul>
<li>Determine the size of your shrunken database files. This size determines the size of your TrueCrypt volume.</li>
<li>Launch TrueCrypt.</li>
<li>Click <em>Create Volume</em>.</li>
<li>In the <em>TrueCrypt Volume Creation Wizard</em>, select <em>Create an encrypted file container</em>. Click <em>Next</em>.</li>
<li>Choose <em>Standard TrueCrypt volume</em>. Click <em>Next</em>.</li>
<li>Enter any filename for the <em>Volume Location</em>. Click <em>Next</em>.</li>
<li>Use the defaults for the <em>Encryption Options</em>. Click <em>Next</em>.</li>
<li>For the <em>Volume Size</em>, enter a size nearest to the size of the database files. Click <em>Next</em>.</li>
<li>For the <em>Volume Password</em>, enter a password. Click <em>Next</em>.</li>
<li>Click <em>Format</em>.</li>
<li>Using TrueCrypt, mount the volume.</li>
</ul>
<h3>Step 3: Copy the database to the TrueCrypt volume</h3>
<ul>
<li>Take the database offline. Use the SQL from Step 1.</li>
<li>Detach the database.<br />
In <em>SQL Server Management Studio</em>, right-click on your database. Select <em>Tasks</em> &gt; <em>Detach&#8230; </em>Click OK in the <em>Detach Database</em> dialog. Detaching the database allows you to re-attach the database at a different location.</li>
<li>Copy the shrunken database files to the TrueCrypt volume.</li>
</ul>
<h3>Step 4: Bring the database back online</h3>
<ul>
<li>I got errors when trying to attach a database using my own username. To work-around this, run <em>SQL Server Management Studio</em> as Administrator.</li>
<li>Attach the database in the TrueCrypt volume.<br />
In <em>SQL Server Management Studio</em>, right-click on Databases, select <em>Attach&#8230;</em> In the <em>Attach Databases</em> dialog, click <em>Add</em>. Select the MDF file for the shrunken database you copied to your TrueCrypt volume.</li>
<li>Bring the database online. Use the SQL from Step 1.</li>
</ul>
<p>There you have it! You now have an identical copy of the database running in a volume with just enough space. Adding just a few more records will make the database full.</p>
]]></content:encoded>
			<wfw:commentRss>http://rayli.net/blog/2013/03/sql-stress-test-simulate-full-database/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>3 ways to make your bug reports awesome</title>
		<link>http://rayli.net/blog/2013/02/3-ways-to-make-your-bug-reports-awesome/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=3-ways-to-make-your-bug-reports-awesome</link>
		<comments>http://rayli.net/blog/2013/02/3-ways-to-make-your-bug-reports-awesome/#comments</comments>
		<pubDate>Mon, 04 Feb 2013 02:16:27 +0000</pubDate>
		<dc:creator>Raymond Li</dc:creator>
				<category><![CDATA[Software Testing]]></category>

		<guid isPermaLink="false">http://rayli.net/blog/?p=1324</guid>
		<description><![CDATA[Never look down on the bug report. With a compelling bug report, the bug report author wields tremendous influence over a software product, the team and their own reputation. The top 3 most powerful elements of a bug report are&#8230; Bug title Screenshot Steps to reproduce Bug title Your bug title is your gateway to [...]]]></description>
			<content:encoded><![CDATA[<p>Never look down on the bug report. With a compelling bug report, the bug report author wields tremendous influence over a software product, the team and their own reputation.</p>
<p><span id="more-1324"></span></p>
<p>The top 3 most powerful elements of a bug report are&#8230;</p>
<ol>
<li>Bug title</li>
<li>Screenshot</li>
<li>Steps to reproduce</li>
</ol>
<h2>Bug title</h2>
<p>Your bug title is your gateway to your entire team. Everyone scans bug titles. The easier your bug title is to digest, the more likely your bug will be fixed. If someone evaluating your bug needs to open your bug again and again because your title is too long and cryptic, you have wasted their time. Your bug title should describe at a high level what observation you are seeing and when you are seeing it. There are exceptions to this general template, but following this formula leads to bug titles that save people time. Your bug is already a plea for someone&#8217;s time &#8212; why take up more time with a poorly worded bug title?</p>
<p>Developers scan bugs assigned to them by looking at the bug titles. Management scans bug titles to quickly determine which ones need to be fixed. Testers scan bug titles to look for duplicates and see which areas of the system are unstable. With so many people looking at bug titles, it&#8217;s frequently baffling why more time isn&#8217;t spent crafting a concise and informative bug title. Here are a few examples of clear bug titles&#8230;</p>
<ul>
<li>Client crashes when copying to clipboard while clipboard is busy</li>
<li>Save dialog is blank after browsing to network drive</li>
</ul>
<p>The 2 examples above exemplify a similar formula:</p>
<ul>
<li>observation <em>WHEN</em> something happens</li>
<li>observation <em>AFTER</em> something happens</li>
</ul>
<div></div>
<h2>Screenshot</h2>
<p>Coupled with a great bug title, a well-taken screenshot is the next key to an awesome bug report. If the bug title and screenshot are really good, someone reading your bug might be able to skip the other details all together. It&#8217;s a great sign when with only the bug title and the screenshot, someone looking at the bug already understands the bug.</p>
<p>A screenshot with clear direction about what to look at and just enough explanatory text is priceless. This is the best kind of bug, because it saves everyone time and communicates precisely what you&#8217;d like the team looking at. If they want more information, they can read the rest of the bug, steps to reproduce, stack trace, etc. If they want just enough information to understand what the bug is about and the impact of the bug (that&#8217;s what most people want to know!), then your bug title and a great screenshot are really all they need.</p>
<h2>Steps to reproduce</h2>
<p>Despite the awesomeness of the bug title and screenshot combination, the steps to reproduce a bug are another important item and are generally most important to the developer looking to fix the bug. Developers frequently complain about the steps to reproduce. Sometimes it&#8217;s the lack of detail in the bug. Frequently, it&#8217;s that the steps to reproduce the bug don&#8217;t really reproduce the bug.</p>
<p>Adding a great set of steps to reproduce the bug makes the bug easier to fix. However, it&#8217;s generally much harder to get these steps just right than at first glance. The amount of detail to put in these steps is crucial. You don&#8217;t want to waste your own time crafting super detailed steps to reproduce the bug. You also don&#8217;t want to waste the time of someone who knows the bug area super well, since they&#8217;ll be trudging through mundane detail trying to extract the steps that really matter. Finally, you don&#8217;t want to include too little detail so that someone new to the bug area can&#8217;t reproduce the bug. You need to find a balance. Unfortunately, finding the right balance means that someone will be unhappy. The real question is how you keep the majority of people happy.</p>
<h3>Two-phase approach to repro steps</h3>
<p>A two-phase approach to repro steps is what I use to address this balance. In the first phase, start with high-level steps for someone familiar with the area. Assume domain knowledge and familiarity with the bug area when writing these steps. Leave out the &#8220;click on this,&#8221; &#8220;enter this,&#8221; &#8220;launch this&#8221; steps. Think about how you would write the bug if you were reporting it to yourself. You probably wouldn&#8217;t care about all the mundane steps to accomplish an action. Instead of click File, then click Save, then enter your new filename, and finally click the Save button, something like &#8220;Save your document&#8221; is enough.</p>
<p>Once you&#8217;ve gotten this squared away, we move onto the second phase. Under each high-level step, add enough detail so that someone unfamiliar with the bug area can reproduce the bug. Make the high-level step more recognizable by highlighting it, underlining it, bolding it or putting asterisks in front of it. The idea is someone familiar with the bug area can scan the high-level steps, and someone unfamiliar with the bug area can dive into the more detailed steps.</p>
<h2>Conclusion</h2>
<p>So there you have it! The top 3 most powerful parts of an awesome bug report. <span style="font-size: 13px;">There are lots of other things to include that may help with the bug investigation: your environment, the build you&#8217;re using, observations, perceived customer impact, priority, severity, any debugging you&#8217;ve already done, etc. Include anything you think that will help the team understand the bug, but make sure to use a concise, descriptive bug title, a great screenshot of the bug and two-level repro steps. Happy testing!</span></p>
]]></content:encoded>
			<wfw:commentRss>http://rayli.net/blog/2013/02/3-ways-to-make-your-bug-reports-awesome/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C# clipboard locking and a crash</title>
		<link>http://rayli.net/blog/2013/01/c-clipboard-locking-and-a-crash/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=c-clipboard-locking-and-a-crash</link>
		<comments>http://rayli.net/blog/2013/01/c-clipboard-locking-and-a-crash/#comments</comments>
		<pubDate>Tue, 01 Jan 2013 20:53:06 +0000</pubDate>
		<dc:creator>Raymond Li</dc:creator>
				<category><![CDATA[Software Testing]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://rayli.net/blog/?p=1227</guid>
		<description><![CDATA[While testing a feature that accessed the clipboard recently, I came up against an interesting clipboard scenario. What test strategies and models can we use to approach this feature in order to highlight the most important risks? A straight-forward approach is to treat the clipboard as an external resource. It is an external resource! Generally, [...]]]></description>
			<content:encoded><![CDATA[<p>While testing a feature that accessed the clipboard recently, I came up against an interesting clipboard scenario. What test strategies and models can we use to approach this feature in order to highlight the most important risks?</p>
<p><span id="more-1227"></span></p>
<p>A straight-forward approach is to treat the clipboard as an external resource. It is an external resource! Generally, we normally don&#8217;t consider it an external resource &#8212; it&#8217;s part of Windows, it&#8217;s just a simple API call and it&#8217;s almost always available. However, the clipboard is a resource shared by other applications. Because of this characteristic, all the issues that come with sharing a resource (waiting for access, locking, deadlocking, etc.) become higher risk areas.</p>
<p>The advantage of this approach is you start thinking about things that may happen if the shared resource is unavailable. But the clipboard is always available, right? Like any shared resource, it can be held up. So what  does your application do when it&#8217;s held up? That&#8217;s exactly what this piece of code does. It holds onto the clipboard a bit longer than it should. It&#8217;s not the nicest thing to  do, but it can happen. Another application may have a bug, or perhaps a large amount of data is being copied to the clipboard causing a slight delay. The application you&#8217;re testing should be able to recover from such errors, because there&#8217;s no guarantee that every other application is a good citizen.</p>
<p>The key risk being assessed is&#8230; Does a busy clipboard cause issues for your application? It caused a crash in my case. This C# snippet does the magic of hanging onto the clipboard for 30 seconds. Enough time for you to get into your application under test to do your investigation.</p>
<pre class="brush: csharp; title: ; notranslate">
class Program
{
    [System.Runtime.InteropServices.DllImport(&quot;user32.dll&quot;)]
    static extern IntPtr GetOpenClipboardWindow();

    [System.Runtime.InteropServices.DllImport(&quot;user32.dll&quot;, SetLastError = true)]
    static extern bool OpenClipboard(IntPtr hWndNewOwner);

    [System.Runtime.InteropServices.DllImport(&quot;user32.dll&quot;, SetLastError = true)]
    static extern bool CloseClipboard();

    static void Main(string[] args)
    {
        int secondsToLockClipboard = 30;

        IntPtr handleWnd = GetOpenClipboardWindow();
        OpenClipboard(handleWnd);

        for (int i = 1; i         {
            System.Threading.Thread.Sleep(1000);
            Console.WriteLine(i);
        }

        CloseClipboard();
    }
}
</pre>
<p>The difficulty is coming up with this particular scenario. In this case, by modeling the components in the software and thinking about how to make components unavailable, the test ideas started flowing.</p>
]]></content:encoded>
			<wfw:commentRss>http://rayli.net/blog/2013/01/c-clipboard-locking-and-a-crash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>In response to &#8220;The Oracle Problem and the Teaching of Software Testing&#8221;</title>
		<link>http://rayli.net/blog/2012/12/in-response-to-the-oracle-problem-and-the-teaching-of-software-testing/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=in-response-to-the-oracle-problem-and-the-teaching-of-software-testing</link>
		<comments>http://rayli.net/blog/2012/12/in-response-to-the-oracle-problem-and-the-teaching-of-software-testing/#comments</comments>
		<pubDate>Sat, 01 Dec 2012 18:07:51 +0000</pubDate>
		<dc:creator>Raymond Li</dc:creator>
				<category><![CDATA[Software Testing]]></category>

		<guid isPermaLink="false">http://rayli.net/blog/?p=1246</guid>
		<description><![CDATA[In The Oracle Problem and the Teaching of Software Testing post, Cem Kaner wrestles with teaching how a tester could determine oracles for an exam question about automated testing. Unfortunately, the window for posting replies on the post has expired. Thus&#8230; this blog post is born! Here’s the exam question he gives his students: Suppose [...]]]></description>
			<content:encoded><![CDATA[<p>In <a title="The Oracle Problem and the Teaching of Software Testing" href="http://kaner.com/?p=190">The Oracle Problem and the Teaching of Software Testing</a> post, Cem Kaner wrestles with teaching how a tester could determine oracles for an exam question about automated testing. Unfortunately, the window for posting replies on the post has expired. Thus&#8230; this blog post is born! <img src='http://rayli.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><span id="more-1246"></span></p>
<p>Here’s the exam question he gives his students:</p>
<blockquote><p>Suppose you have written a test tool that allows you to feed commands and data to Microsoft Excel and to Open Office Calc and to see the results. The test tool is complete, and it works correctly. You have been asked to test a new version of Calc and told to automate all of your testing. What oracles would you use to help you find bugs? What types of information would you expect to get with each oracle?</p>
<p>Note: Don’t just echo back a consistency heuristic. Be specific in your description of a relevant oracle and of the types of information or bugs that you expect.</p></blockquote>
<p>As other comments on the post point out, I also find <a title="A Taxonomy of Test Oracles" href="http://softwarequalitymethods.com/html/papers.html#taxonomy">Hoffman&#8217;s list</a> better suited for this exam question. As Cem Kaner already mentioned, they do indeed lend themselves well to being coded. After all, that&#8217;s exactly what they were designed for.</p>
<p>With respect to teaching a tester to generate oracles for the question, perhaps the student might be confused by the question itself. I don&#8217;t find it straight-forward to think about what oracles I would be using before I think about what information I&#8217;m trying to find out about the new version of Calc. As a tester, how often do we think about the oracle before thinking about what information we&#8217;re trying to ascertain?</p>
<p>As an example, perhaps I&#8217;m interested in finding out more information about Calc&#8217;s implementation of the SUM function. I may have used the Hoffman list which triggered a thought about the reference program oracle. Maybe this lead me to using the command feeding test tool to compare with Excel. Or perhaps <a title="Transpection Transpected" href="http://www.developsense.com/blog/2010/05/transpection-transpected/">Bach/Bolton&#8217;s comparable product heuristic</a> triggered a similar thought. Why not use the &#8220;consistent with itself&#8221; heuristic to use Calc as its own oracle? After all, SUM should have an equivalent result when using a Calc addition operation? Would I have missed this if I were using the Hoffman list? Would I have been preoccupied with using Excel as a reference program rather than Calc itself?</p>
<p>In my own test design experience, I don&#8217;t find that the Bach/Bolton list triggers as many ideas as let&#8217;s say the SFDIPOT list or even just a giant list of test techniques/objectives (function testing, scenario testing, compatibility testing, etc.). Although I&#8217;m not as familiar with Hoffman&#8217;s list, you can bet I&#8217;ll be making use of it now. As Cem and other commenters on the post have mentioned, each list is not complete. Once we know what information we&#8217;re looking for, the Bach/Bolton list, Hoffman list or some custom combination of lists could be used to trigger thoughts about useful oracles which may or may not be automated.</p>
]]></content:encoded>
			<wfw:commentRss>http://rayli.net/blog/2012/12/in-response-to-the-oracle-problem-and-the-teaching-of-software-testing/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Initial look at automating your testing</title>
		<link>http://rayli.net/blog/2012/11/initial-look-at-automating-your-testing/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=initial-look-at-automating-your-testing</link>
		<comments>http://rayli.net/blog/2012/11/initial-look-at-automating-your-testing/#comments</comments>
		<pubDate>Thu, 01 Nov 2012 14:02:03 +0000</pubDate>
		<dc:creator>Raymond Li</dc:creator>
				<category><![CDATA[Software Testing]]></category>
		<category><![CDATA[automation]]></category>

		<guid isPermaLink="false">http://rayli.net/blog/?p=1268</guid>
		<description><![CDATA[On Martin Anderson&#8217;s blog, he wrote a post Why QA needs to change? A few passages struck a chord with me and I considered posting a reply within the post itself. Due to the length of my response, I&#8217;ve chosen to publish a blog post instead. In Martin Anderson&#8217;s Why QA needs to change? post, [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="Why QA needs to change?" src="http://rayli.net/ref/2012-11/qa_change.png" alt="Why QA needs to change?" width="132" height="100" />On Martin Anderson&#8217;s blog, he wrote a post <a title="Why QA needs to change?" href="http://bloodredsun.com/2012/10/23/why-qa-needs-to-change/">Why QA needs to change?</a> A few passages struck a chord with me and I considered posting a reply within the post itself. Due to the length of my response, I&#8217;ve chosen to publish a blog post instead.</p>
<p><span id="more-1268"></span></p>
<p>In Martin Anderson&#8217;s <a title="Why QA needs to change?" href="http://bloodredsun.com/2012/10/23/why-qa-needs-to-change/">Why QA needs to change?</a> post, he wrote:</p>
<blockquote><p>&#8230;The ability to deliver code into production at will has a direct effect on your bottom line but to do this effectively you need two things, 1) understand the important areas of functionality that the customers really use and 2) be able to test these areas as quickly and easily as possible.</p>
<p>The first is a business issue but the second boils down to automating your testing.</p></blockquote>
<p>I agree with all points, except I do not agree that it always boils down to automating your testing. I agree understanding the important areas of functionality and making testing faster and easier is the right direction. I agree automating certain aspects of the testing process can help speed up parts of the testing process. I agree automation certainly seems to make it easier to run the automated aspects of the testing process.</p>
<p>However, we&#8217;d probably benefit from redefining what &#8220;automating your testing&#8221; means. To me, it means automating the verification of facts that we know about the system under test (SUT). The test code <em>arranges</em> the system, an <em>action</em> is performed and then one or more <em>assertions</em> (facts!) is made about the state of the system. Or&#8230; <em>given</em> a certain state of the system, <em>when</em> some action is performed, <em>then</em> certain facts about the system are true.</p>
<p>However we spin it, running this automation is not testing, it&#8217;s just verifying facts that we believe should be true when the system is behaving as expected. What&#8217;s testing?</p>
<ol>
<li>Designing the test code to perform the verification. That&#8217;s testing.</li>
<li>Evaluating the results of the verification to determine whether a failing verification is a bug in the system or a bug in the test code. Yes, that&#8217;s testing.</li>
<li>Redesigning the test code so that a failing verification provides more useful information to the individual evaluating it. That&#8217;s testing.</li>
<li>Making the determination that a failing verification is actually a bug in a programmer&#8217;s interpretation of an ambiguous requirement. That&#8217;s testing, too.</li>
</ol>
<p>Whether the act of designing, evaluating, redesigning and requirements follow-up is done by a programmer, tester or anyone outside these roles, it&#8217;s testing. At this moment, these testing activities are very difficult if not impossible to automate.</p>
<p>Going back to the original goal of delivering production code at will, rather than prioritizing by areas of functionality that the customers really use and then focusing your testing on those areas, why not focus on those areas that represent the biggest risk to the business value of the software for the customer?</p>
<p>If you&#8217;re unlucky, these might be the very same areas. More likely than not, the riskiest areas are a subset of the functionality that the customer uses plus any other new areas that might present new risks. These are the areas that testing should focus on.</p>
<p>Re-running that tired, old test on an area of the system that hasn&#8217;t changed but was deemed an &#8220;important area&#8221; tells us virtually nothing new about the system and adds no value to the testing process.</p>
<p>However, targeted testing (using manual or automated verification) on those high risk areas (areas that have changed recently, areas that have been the source of numerous bugs, areas that were recently added, etc.) is one shortcut to delivering high quality testing as quickly as possible.</p>
<p>Will this allow testing to happen more quickly? Probably. This approach allows testing to zero-in on the riskiest areas to find important issues quickly. It won&#8217;t find all issues (that&#8217;s impossible!), but it should give feedback to the team faster than attempting a singular focus on automating as many of the important areas as possible.</p>
<p>Will this be easy? Probably not, but testing is not easy either. Yet another reason why testing is so difficult to automate.</p>
]]></content:encoded>
			<wfw:commentRss>http://rayli.net/blog/2012/11/initial-look-at-automating-your-testing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Book Scanning: Step 3, Use ABBYY for OCR to produce an eBook</title>
		<link>http://rayli.net/blog/2012/10/book-scanning-step-3-use-abbyy-for-ocr-to-produce-an-ebook/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=book-scanning-step-3-use-abbyy-for-ocr-to-produce-an-ebook</link>
		<comments>http://rayli.net/blog/2012/10/book-scanning-step-3-use-abbyy-for-ocr-to-produce-an-ebook/#comments</comments>
		<pubDate>Mon, 01 Oct 2012 16:04:46 +0000</pubDate>
		<dc:creator>Raymond Li</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[kindle]]></category>

		<guid isPermaLink="false">http://rayli.net/blog/?p=1183</guid>
		<description><![CDATA[In September, I posted about how to pre-process the captured content to maximize successful optical character recognition (OCR) . In this post, we’ll use ABBYY FineReader for optical character recognition (OCR) to produce an eBook. Getting a physical book onto your Kindle requires 3 basic steps: Capture the book content using a camera. Pre-process the [...]]]></description>
			<content:encoded><![CDATA[<p>In <a title="DailyMorn.com - Archive for September, 2012" href="http://rayli.net/blog/2012/09/">September</a>, I posted about how to <a title="Book Scanning: Step 2, Pre-process the captured content using Scan Tailor" href="http://rayli.net/blog/2012/09/book-scanning-step-2-pre-process-the-captured-content-using-scan-tailor/">pre-process the captured content to maximize successful optical character recognition (OCR</a>) . In this post, we’ll use ABBYY FineReader for optical character recognition (OCR) to produce an eBook.</p>
<p><span id="more-1183"></span><img title="More..." src="https://rayli.net/blog/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" /></p>
<p>Getting a physical book onto your Kindle requires 3 basic steps:</p>
<ol>
<li><a title="Book Scanning: Step 1, Capture the book content" href="http://rayli.net/blog/2012/07/book-scanning-step-1-capture-the-book-content/">Capture the book content using a camera.</a></li>
<li><a title="Book Scanning: Step 2, Pre-process the captured content using Scan Tailor" href="http://rayli.net/blog/2012/09/book-scanning-step-2-pre-process-the-captured-content-using-scan-tailor/">Pre-process the captured content using Scan Tailor</a>.</li>
<li><span style="color: #ff6600;"><strong>Use ABBYY FineReader for optical character recognition (OCR) to produce an eBook.</strong></span></li>
</ol>
<p>In this post, I&#8217;ll be covering <span style="color: #ff6600;"><strong>step 3</strong></span>.</p>
<h2>Materials</h2>
<p>3 items are needed to produce an eBook  using the *.tiff files from <a title="Book Scanning: Step 2, Pre-process the captured content using Scan Tailor" href="http://rayli.net/blog/2012/09/book-scanning-step-2-pre-process-the-captured-content-using-scan-tailor/">step 2</a>.</p>
<ol>
<li><strong>ABBYY FineReader 11.</strong> <a title="ABBYY FineReader" href="http://finereader.abbyy.com/">ABBYY FineReader</a> is &#8220;an optical character recognition (OCR) application developed by the Russian software company ABBYY.&#8221; We will be using it to process the *.tiff files and generate an ePub eBook.</li>
<li><strong>TIFF Image Files.</strong> You will need the *.tiff image files from <a title="Book Scanning: Step 2, Pre-process the captured content using Scan Tailor" href="http://rayli.net/blog/2012/09/book-scanning-step-2-pre-process-the-captured-content-using-scan-tailor/">step 2</a>. These image files should all be residing in a single directory.</li>
<li><strong>Calibre.</strong> <a title="Calibre" href="http://calibre-ebook.com/">Calibre</a> is a &#8220;free and open source e-book computer software that organizes, saves and manages e-books, supporting a variety of formats.&#8221; We will be using it to convert the ePub file to a .mobi file. Then we will use Calibre to sync the .mobi file to your Kindle.</li>
</ol>
<h2>Opening the generated *.tiff files</h2>
<ol>
<li>Launch ABBYY FineReader.</li>
<li>In ABBYY FineReader, click the Open button.</li>
<li>Navigate to the directory containing the generated *.tiff files.</li>
<li>Select all of them.</li>
<li>Open them in ABBYY FineReader.</li>
</ol>
<h2>The Hard Part</h2>
<ol>
<li>Verify that the text generated by the OCR process is what you want in your eBook.</li>
<li>Depending on the quality of the *.tiff files, this may involve a lot of manual work.</li>
</ol>
<h2>Generating the ePub</h2>
<ol>
<li>I&#8217;ve found the best FineReader format for getting onto the Kindle is ePub.</li>
<li>By default, FineReader is configured to generate an MS Word file.</li>
<li>Look for a Word icon in the toolbar labelled Save.</li>
<li>Change this to ePub, but don&#8217;t generate just yet (click Cancel).</li>
<li>Look for a wrench icon in the toolbar.</li>
<li>Click on it, and configure the title and author of your book.</li>
<li>Now, click on the ePub Save button.</li>
<li>Voila, you&#8217;ve generated an ePub file!</li>
</ol>
<h2>Getting it onto your Kindle</h2>
<ol>
<li>I&#8217;m a heavy user of <a title="Calibre" href="http://calibre-ebook.com/">Calibre</a>.</li>
<li>Import the newly genereted ePub.</li>
<li>Convert it to the *.mobi format.</li>
<li>Then sync it to your Kindle.</li>
</ol>
<p>Enjoy reading your newly created eBook on your Kindle! <img src='http://rayli.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://rayli.net/blog/2012/10/book-scanning-step-3-use-abbyy-for-ocr-to-produce-an-ebook/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Book Scanning: Step 2, Pre-process the captured content using Scan Tailor</title>
		<link>http://rayli.net/blog/2012/09/book-scanning-step-2-pre-process-the-captured-content-using-scan-tailor/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=book-scanning-step-2-pre-process-the-captured-content-using-scan-tailor</link>
		<comments>http://rayli.net/blog/2012/09/book-scanning-step-2-pre-process-the-captured-content-using-scan-tailor/#comments</comments>
		<pubDate>Sat, 01 Sep 2012 18:41:27 +0000</pubDate>
		<dc:creator>Raymond Li</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[kindle]]></category>

		<guid isPermaLink="false">http://rayli.net/blog/?p=1181</guid>
		<description><![CDATA[In July, I posted about how to capture the physical book content using a camera. We&#8217;ll go over how to pre-process the captured content to maximize successful optical character recognition (OCR). Getting a physical book onto your Kindle requires 3 basic steps: Capture the book content using a camera. Pre-process the captured content using Scan [...]]]></description>
			<content:encoded><![CDATA[<p>In <a title="DailyMorn.com - Archive for July, 2012" href="http://rayli.net/blog/2012/07/">July</a>, I posted about how to <a title="Book Scanning: Step 1, Capture the book content" href="http://rayli.net/blog/2012/07/book-scanning-step-1-capture-the-book-content/">capture the physical book content using a camera</a>. We&#8217;ll go over how to pre-process the captured content to maximize successful optical character recognition (OCR).</p>
<p><span id="more-1181"></span></p>
<p>Getting a physical book onto your Kindle requires 3 basic steps:</p>
<ol>
<li><span style="color: #000000;"><a title="Book Scanning: Step 1, Capture the book content" href="http://rayli.net/blog/2012/07/book-scanning-step-1-capture-the-book-content/">Capture the book content using a camera.</a></span></li>
<li><span style="color: #ff6600;"><strong>Pre-process the captured content using Scan Tailor.</strong></span></li>
<li><a title="Book Scanning: Step 3, Use ABBYY for OCR to produce an eBook" href="http://rayli.net/blog/2012/10/book-scanning-step-3-use-abbyy-for-ocr-to-produce-an-ebook/">Use ABBYY FineReader for optical character recognition (OCR) to produce an eBook.</a></li>
</ol>
<p>In this post, I&#8217;ll be covering <span style="color: #ff6600;"><strong>step 2</strong></span>.</p>
<h2>Materials</h2>
<p>Only 2 items are needed to pre-process the captured book content  from <a title="Book Scanning: Step 1, Capture the book content" href="http://rayli.net/blog/2012/07/book-scanning-step-1-capture-the-book-content/">step 1</a>.</p>
<ol>
<li><strong>Scan Tailor.</strong> The <a title="Scan Tailor" href="http://scantailor.sourceforge.net/">Scan Tailor</a> software is an &#8220;interactive post-processing tool for scanned pages. It performs operations such as page splitting, deskewing, adding/removing borders, and others. You give it raw scans, and you get pages ready to be&#8230;&#8221; fed into optical character recognition (OCR) software. Scan Tailor is <a title="Wikipedia - Free software" href="http://en.wikipedia.org/wiki/Free_software">Free Software</a>.</li>
<li><strong>Book Image Files.</strong> In <a title="Book Scanning: Step 1, Capture the book content" href="http://rayli.net/blog/2012/07/book-scanning-step-1-capture-the-book-content/">step 1</a>, you captured a book chapter as image files. These image files should all be residing in a single directory.</li>
</ol>
<h2>Creating a new Scan Tailor project</h2>
<ol>
<li>Launch <em>Scan Tailor</em>.</li>
<li>Create a New Project.</li>
<li>When prompted for the input directory, choose the directory containing your image files.</li>
<li>Scan Tailor will now load your image files.</li>
</ol>
<h2>Let Scan Tailor do its magic</h2>
<div>
<ol>
<li>At the time of this blog post, <em>Scan Tailor</em> consists of 6 steps: <em>Fix Orientation</em>, <em>Split Pages</em>, <em>Deskew</em>, <em>Select Content</em>, <em>Margins</em> and <em>Output</em>.</li>
<li>Click the <em>Play</em> button for each of these steps and let <em>Scan Tailor</em> do its magic. <img src='http://rayli.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li>The <em>Output</em> step takes the longest and will generate *.tiff image files in a sub-directory named <em>out\</em>.</li>
<li>You can save your <em>Scan Tailor</em> project, if you think you&#8217;ll make tweaks in the future.</li>
</ol>
<p>Navigate to your <em>out\</em> sub-directory and check-out the newly generated *.tiff image files. These pre-processed image files should be a huge improvement over your original image files from <a title="Book Scanning: Step 1, Capture the book content" href="http://rayli.net/blog/2012/07/book-scanning-step-1-capture-the-book-content/">step 1</a>. It&#8217;s possible to use this pre-processed content to generate quality PDFs, but we&#8217;ll take it a step further in the next post.</p>
<p>Congratulations! You&#8217;ve just pre-processed your first chapter!</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://rayli.net/blog/2012/09/book-scanning-step-2-pre-process-the-captured-content-using-scan-tailor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Get media content now &#8211; SOLVED</title>
		<link>http://rayli.net/blog/2012/08/get-media-content-now-solved/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=get-media-content-now-solved</link>
		<comments>http://rayli.net/blog/2012/08/get-media-content-now-solved/#comments</comments>
		<pubDate>Wed, 01 Aug 2012 13:49:19 +0000</pubDate>
		<dc:creator>Raymond Li</dc:creator>
				<category><![CDATA[Popular]]></category>
		<category><![CDATA[Windows Phone 7]]></category>

		<guid isPermaLink="false">http://rayli.net/blog/?p=1169</guid>
		<description><![CDATA[I got an SMS a few days ago with a Get media content now hyperlink. Here&#8217;s how to view it. If I press the hyperlink, the text appears to change for a moment like it&#8217;s downloading something, but then it plays a ding sound and the hyperlink returns. This is an issue with receiving MMS messages and [...]]]></description>
			<content:encoded><![CDATA[<p>I got an SMS a few days ago with a <em>Get media content now</em> hyperlink. Here&#8217;s how to view it.</p>
<p><span id="more-1169"></span>If I press the hyperlink, the text appears to change for a moment like it&#8217;s downloading something, but then it plays a ding sound and the hyperlink returns.</p>
<p>This is an issue with receiving MMS messages and can be fixed by resetting your cellular network. My phone specifications are given below:</p>
<ul>
<li>Model: HTC T7575 (HTC Arrive)</li>
<li>Software: Windows Phone 7.5</li>
<li>OS version: 7.10.7720.68</li>
<li>Firmware revision number: 2305.13.40301.651</li>
</ul>
<p>Follow the steps below to fix the issue:</p>
<ol>
<li>Go to your <em>Settings</em> app.</li>
<li>Select <em>Cellular</em>.</li>
<li>Select <em>Change prl</em>.</li>
<li>Allow your phone a few moments to search for the prl.</li>
<li>After the search is complete, navigate back to the mysterious SMS.</li>
<li>Select the <em>Get media content now</em> hyperlink.</li>
</ol>
<p>The MMS content should now download, and all is again right in the world of Windows Phone.</p>
]]></content:encoded>
			<wfw:commentRss>http://rayli.net/blog/2012/08/get-media-content-now-solved/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
