<?xml version="1.0" encoding="UTF-8"?>

<rdf:RDF
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns="http://purl.org/rss/1.0/"
 xmlns:content="http://purl.org/rss/1.0/modules/content/"
 xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns:syn="http://purl.org/rss/1.0/modules/syndication/"
 xmlns:admin="http://webns.net/mvcb/"
>

<channel rdf:about="http://tabletumlnews.powerblogs.com/">
<title>Tablet UML News</title>
<link>http://tabletumlnews.powerblogs.com/</link>
<description>News and commentary from Martin L. Shoemaker, author of Tablet UML</description>
<dc:language>en-us</dc:language>
<dc:date>2007-07-11T17:07+00:00</dc:date>
<items>
 <rdf:Seq>
  <rdf:li rdf:resource="http://tabletumlnews.powerblogs.com/posts/1184174108.shtml" />
  <rdf:li rdf:resource="http://tabletumlnews.powerblogs.com/posts/1176788673.shtml" />
  <rdf:li rdf:resource="http://tabletumlnews.powerblogs.com/posts/1176216254.shtml" />
  <rdf:li rdf:resource="http://tabletumlnews.powerblogs.com/posts/1176216254.shtml" />
  <rdf:li rdf:resource="http://tabletumlnews.powerblogs.com/posts/1122474050.shtml" />
  <rdf:li rdf:resource="http://tabletumlnews.powerblogs.com/posts/1122474050.shtml" />
  <rdf:li rdf:resource="http://tabletumlnews.powerblogs.com/posts/1122474050.shtml" />
  <rdf:li rdf:resource="http://tabletumlnews.powerblogs.com/posts/1175861713.shtml" />
 </rdf:Seq>
</items>
</channel>

<item rdf:about="http://tabletumlnews.powerblogs.com/posts/1184174108.shtml">
<title>With a little help for my friends</title>
<link>http://tabletumlnews.powerblogs.com/posts/1184174108.shtml</link>
<description>Since I know some people who maybe could use it, I thought I would share some info from my leads folder. I can't promise which of these have openings, but some...</description>
<dc:creator>Martin L. Shoemaker</dc:creator>
<dc:date>2007-07-11T17:07+00:00</dc:date>
<content:encoded><![CDATA[Since I know some people who maybe could use it, I thought I would share some info from my leads folder. I can't promise which of these have openings, but some of them will.<br />
<br />
<h3>Kalamazoo Area Tech Job Resources</h3><br />
<br />
<ul><br />
    <li><a href="http://www.teksystems.com/Careers/Default.aspx">TEK Systems</a> - I'm finding them to be one of the best contracting firms around.</li><br />
    <li><a href="http://www.michiganjobnetwork.com/jobs.asp">Michigan Job Network</a> - Job search by area.</li><br />
    <li><a href="http://www.michigan.org/medc/services/serviceprovider/results.asp?selind=14%7C%7CInformation@%21Technology&Selcity=Kalamazoo&compname=&txtMinority=0&txtWoman=0">Information Technology (and related) jobs within 50 miles of Kalamazoo</a> (from <a href="http://www.michigan.org/medc/services/serviceprovider/?m=12;6">the MEDC Business Directory</a>)</li><br />
    <li><a href="http://www.williamsonemployment.com/jobs.html">Williamson Employment Services</a> - A local contracting firm.</li><br />
    <li><a href="http://paragonusa.com/candidate/currentopenings/jobalert/index.asp">Paragon Recruiting</a> - A local recruiting firm.</li><br />
    <li><a href="http://www.advantagecommunication.com/contact.htm">Advantage Communication Enterprises</a> - IT solutions.</li><br />
    <li><a href="http://www.appstrategy.com/developers.php">appStrategy</a> - .NET/Web-based CRM solutions.</li><br />
    <li><a href="http://www.blue-granite.com/Pages/default.aspx">Blue Granite</a> - .NET solutions.</li><br />
    <li><a href="http://www.configsc.com/OurCompany/employmentOps.php">Configuration Solutions</a> - Java development.</li><br />
    <li><a href="http://www.data-pro.com/">Data Pro</a> - Reporting software.</li><br />
    <li><a href="http://www.digitalsystemsgroup.com/contact.htm">Digital Systems Group Incorporated</a> - Web design.</li><br />
    <li><a href="http://www.inetmi.com/index.html">I/NET</a> - Digital imaging, voice recognition, multimedia, and natural language.</li><br />
    <li><a href="http://www.itscommunications.com/?view=company&cat=jobs">ITS Communications</a> - Voice and data integration.</li><br />
    <li><a href="http://www.lueckdatasystems.com/">Lueck Data Systems</a> - IT solutions.</li><br />
    <li><a href="http://www.manatron.com/careers/careers.htm">Manatron</a> - Property software.</li><br />
    <li><a href="http://www.mdp.net/prod.html">Medical Data Processing</a> - Medical billing software.</li><br />
    <li><a href="http://www.salespage.com/company_careers.shtml">SalesPage Technologies</a> - CRM.</li><br />
    <li><a href="TCB Networks">TCB Networks</a> - IT solutions.</li><br />
</ul><br />
<br />
<h3>Battle Creek Area Tech Job Resources</h3><br />
<br />
<ul><br />
    <li><a href="http://douglas-associates.com/">Douglas Associates</a> - Software for non-profits.</li><br />
    <li><a href="http://www.shsbc.com/">SH Systems</a> - Desktop and Web software.</li><br />
</ul><br />
<br />
I have other leads for other areas. Let me know if you need them.]]></content:encoded>
</item>

<item rdf:about="http://tabletumlnews.powerblogs.com/posts/1176788673.shtml">
<title>Dee Jay, Part 5: Homophones and Alternates</title>
<link>http://tabletumlnews.powerblogs.com/posts/1176788673.shtml</link>
<description>So in Part 4, I said that recognizing the music key would be tricky....</description>
<dc:creator>Martin L. Shoemaker</dc:creator>
<dc:date>2007-04-17T07:04+00:00</dc:date>
<content:encoded><![CDATA[So in <a href="http://tabletumlnews.powerblogs.com/posts/1175663470.shtml">Part 4</a>, I said that recognizing the music key would be tricky.<br />
<br />
But why? Didn't I spend most of <a href="http://tabletumlnews.powerblogs.com/posts/1175604385.shtml">Part 3</a> explaining how cleverly I used M-SAPI so that users only had to say partial names to be recognized?<br />
<br />
Well, yes; but I've long said that programming has a Conservation of Complexity law: the less complex for the users, the more complex for the programmers. (Be glad: that's the short version. My long discussion on Conservation of Complexity would take up the rest of this post.)<br />
<br />
The reason why this flexibility leads to complexity is because one short phrase can match multiple long phrases. For instance, one album in my collection is <a href="http://www.amazon.com/Forever-Gold-B-B-King/dp/B00000JFQF/ref=sr_1_2/104-7263427-9262344?ie=UTF8&s=music&qid=1176789968&sr=8-2">Forever Gold by B.B. King</a>. It includes these songs:<br />
<br />
2. How Blue Can You Get?  <br />
3. Every Day I Have the Blues  <br />
10. Catfish Blues  <br />
14. Other Night Blues  <br />
<br />
I also have some sample music provided with Windows Vista, including one track from Aaron Goldberg's <a href="http://www.artistdirect.com/nad/store/artist/album/0,,3608062,00.html?src=search&artist=Aaron+Goldberg">Worlds</a>: OAM's Blues. From <a href="http://www.amazon.com/Sports-Huey-Lewis/dp/B000003JAP/ref=pd_bbs_sr_1/104-7263427-9262344?ie=UTF8&s=music&qid=1176790418&sr=1-1">Sports</a> by Huey Lewis and the News, I have Honkytonk Blues. From <a href="http://www.amazon.com/Jonathan-Richman/dp/B0000003JP/ref=sr_1_8/104-7263427-9262344?ie=UTF8&s=music&qid=1176790607&sr=1-8">Jonathan Richman's self-titled album</a>, I have Blue Moon. From <a href="http://www.amazon.com/Celebrating-Best-Jazz-Louis-Armstrong/dp/B00005QG6M/ref=sr_1_1/104-7263427-9262344?ie=UTF8&s=music&qid=1176790710&sr=1-1">Celebrating the Best of Jazz</a> by Louis Armstrong, there's St. Louis Blues and Black and Blue. From <a href="http://www.amazon.com/Am-I-Cool-What-Garfield/dp/B000008FW7/ref=sr_1_1/104-7263427-9262344?ie=UTF8&s=music&qid=1176790870&sr=1-1">Am I Cool or What?</a> (yes, that's a Garfield CD &mdash; go ahead, laugh, but it has The Temptations, Patti LaBelle, Carl Anderson, Natalie Cole, The Pointer Sisters, Lou Rawls, Diane Schuur, Valerie Pinkston, Desiree Goyette, and B.B. King), there's Monday Morning Blues. From <a href="http://www.amazon.com/True-Blue-Madonna/dp/B000002L9S/ref=pd_bbs_sr_1/104-7263427-9262344?ie=UTF8&s=music&qid=1176791069&sr=1-1">True Blue</a> by Madonna, there's True Blue. From <a href="http://www.amazon.com/Cargo-Men-at-Work/dp/B000088E76/ref=sr_1_1/104-7263427-9262344?ie=UTF8&s=music&qid=1176791161&sr=1-1">Cargo</a> by Men at Work, there's Blue for You. From <a href="http://www.amazon.com/All-Time-Top-100-TV-Themes/dp/B000AOENJK/ref=pd_bbs_sr_1/104-7263427-9262344?ie=UTF8&s=music&qid=1176791263&sr=1-1">All-Time Top 100 TV Themes</a>, there's Hill Street Blues. From <a href="http://www.amazon.com/Tropico-Pat-Benatar/dp/B000I73KYS/ref=pd_bbs_sr_1/104-7263427-9262344?ie=UTF8&s=music&qid=1176791374&sr=1-1">Tropico</a>, there's Outlaw Blues. From <a href="http://www.amazon.com/Forever-Gold-Ray-Charles/dp/B00000JCI2/ref=sr_1_2/104-7263427-9262344?ie=UTF8&s=music&qid=1176791478&sr=1-2">another Forever Gold title with Ray Charles</a>, there's Sentimental Blues. From my fellow <a href="http://www.AADuelist.org">Duelist</a> Geoff Nostrant (a.k.a. <a href="http://silvercord.millim.com/?xc=2006&tid=silvercord">Silvercord</a>), there's blueshift. From <a href="http://www.amazon.com/Whos-Next-Who/dp/B000002OX7/ref=pd_bbs_sr_1/104-7263427-9262344?ie=UTF8&s=music&qid=1176791861&sr=1-1">Who's Next</a> by The Who, there's Behind Blue Eyes.<br />
<br />
So if all I say to Dee Jay is "Dee Jay, Play Blue", Dee Jay will be really confused. Thirteen different songs have "Blue" in the title. Now that's my fault as the user; but we can't blame the users if we want happy users. We want to cope with what real users do, not just force them to do what we want.<br />
<br />
So how do we make Dee Jay understand all these potential matches? As in Part 3, there's the obvious way and the lazy way. And once again, the lazy way (relying on Microsoft to solve the problem) is the smart way. When M-SAPI returns a <a href="http://msdn2.microsoft.com/en-us/library/system.speech.recognition.recognizedphrase.aspx">RecognizedPhrase</a> (or the subclass, <a href="http://msdn2.microsoft.com/en-us/library/system.speech.recognition.recognitionresult.aspx">RecognitionResult</a>), it can include a list of equally good partial matches, called <a href="http://msdn2.microsoft.com/en-us/library/system.speech.recognition.recognizedphrase.homophones.aspx">Homophones</a>. Now we could quibble about that term: in grammar, homophones are words which sound the same but have different meanings. Here, the homophone phrases likely don't sound alike at all; but the recognized words form part of each phrase. But ignoring the terminology, the concept is easy: every phrase in the Homophones list is just as good of a match as the top-level phrase.<br />
<br />
So remember from <a href="http://tabletumlnews.powerblogs.com/posts/1175598857.shtml">Part 2</a> that Dee Jay is designed to select one or more songs or albums or artists (i.e., media descriptors) that match a given phrase. Well, now we want the media descriptors that match the phrase <i>and its Homophones</i>. So the code for selecting all the matches looks something like this:<br />
<br />
<blockquote><br />
// Music commands may include a specifier.<br />
string specifier = "";<br />
if (e.Result.Semantics.ContainsKey(_Specifier))<br />
{<br />
<blockquote><br />
SemanticValue valSpecifier = e.Result.Semantics[_Specifier];<br />
if (valSpecifier.Confidence >= 0.8)<br />
{<br />
<blockquote><br />
specifier = e.Result.Semantics[_Specifier].Value.ToString();<br />
</blockquote><br />
}<br />
</blockquote><br />
}<br />
<br />
// Add the best match to the media phrase list.<br />
List&lt;RecognizedPhrase> testedPhrases = new List&lt;RecognizedPhrase>();<br />
List&lt;MediaPhrase> phrases = new List&lt;MediaPhrase>();<br />
AddRecognizedMediaPhrase(command, e.Result, testedPhrases, phrases);<br />
<br />
...<br />
<br />
/// &lt;summary><br />
/// Add a recognized phrase to a list of music phrases.<br />
/// &lt;/summary><br />
/// &lt;param name="command">The command being built.&lt;/param><br />
/// &lt;param name="reco">The recognized phrase.&lt;/param><br />
/// &lt;param name="testedPhrases">The phrases which have already been tested.&lt;/param><br />
/// &lt;param name="phrases">The current list of music phrases.&lt;/param><br />
private void AddRecognizedMediaPhrase(string command,<br />
            RecognizedPhrase reco, List&lt;RecognizedPhrase> testedPhrases, List&lt;MediaPhrase> phrases)<br />
{<br />
<blockquote><br />
// Avoid infinite recursion.<br />
if (testedPhrases.Contains(reco))<br />
{<br />
<blockquote><br />
return;<br />
</blockquote><br />
}<br />
testedPhrases.Add(reco);<br />
<br />
// Only confident items with music.<br />
if ((reco.Confidence >= 0.8) && (reco.Semantics.ContainsKey(_MusicKey)))<br />
{<br />
<blockquote><br />
// Only matching commands.<br />
if ((reco.Semantics.ContainsKey(_Command)) && (reco.Semantics[_Command].Value.ToString() == command))<br />
{<br />
<blockquote><br />
// Add the key. Don't duplicate.<br />
string key = reco.Semantics[_MusicKey].Value.ToString();<br />
if (!phrases.Contains(_Map[key]))<br />
{<br />
<blockquote><br />
phrases.Add(_Map[key]);<br />
</blockquote><br />
}<br />
</blockquote><br />
}<br />
</blockquote><br />
}<br />
<br />
// If we have homophones, add those, too.<br />
if ((reco.Homophones.Count != null) && (reco.Homophones.Count > 0))<br />
{<br />
<blockquote><br />
foreach (RecognizedPhrase phrase in reco.Homophones)<br />
{<br />
<blockquote><br />
AddRecognizedMediaPhrase(command, reco, testedPhrases, phrases);<br />
</blockquote><br />
}<br />
</blockquote><br />
}<br />
</blockquote><br />
}<br />
<br />
</blockquote><br />
<br />
So now we have a richer list of possible matches, based on the top phrase and its Homophones. But we could potentially make it richer still. While any RecognizedPhrase can have Homophones, a RecognitionResult can also have <a href="http://msdn2.microsoft.com/en-us/library/system.speech.recognition.recognitionresult.alternates.aspx">Alternates</a>, a list of lower confidence matches, each possibly including Homophones. So I could conceivably add code like this:<br />
<br />
<blockquote><br />
// If we have alternates, add those, too.<br />
if ((e.Result.Alternates != null) && (e.Result.Alternates.Count > 0))<br />
{<br />
<blockquote><br />
foreach (RecognizedPhrase alt in e.Result.Alternates)<br />
{<br />
<blockquote><br />
AddRecognizedMediaPhrase(command, alt, testedPhrases, phrases);<br />
</blockquote><br />
}<br />
</blockquote><br />
}<br />
</blockquote><br />
<br />
But so far, I'm not very happy with the results when I do that. I need to experiment with different Confidence thresholds, and maybe tolerance on individual SemanticValues (as discussed in Part 4), to see if there's a good way to filter out "good" alternates from "bad".<br />
<br />
So now we have a great big list of possible media phrases that the user might have meant. How is Dee Jay to know which one is correct? Well, the same way any M-SAPI application should clarify user intentions: it's going to ask. And that will be the topic of Part 6.]]></content:encoded>
</item>

<item rdf:about="http://tabletumlnews.powerblogs.com/posts/1176216254.shtml">
<title>I'll be there, too!</title>
<link>http://tabletumlnews.powerblogs.com/posts/1176216254.shtml</link>
<description>...</description>
<dc:creator>Martin L. Shoemaker</dc:creator>
<dc:date>2007-04-10T14:04+00:00</dc:date>
<content:encoded><![CDATA[<a href="http://www.grdotnet.org/DODN07/"><img src="http://www.grdotnet.org/DODN07/images/Site-Badge-I.gif" alt="WM Day of .Net May 19, 2007 - I'll be there!" /></a> <br />
<br />
Will you?]]></content:encoded>
</item>

<item rdf:about="http://tabletumlnews.powerblogs.com/posts/1176216254.shtml">
<title>I'll be there, too!</title>
<link>http://tabletumlnews.powerblogs.com/posts/1176216254.shtml</link>
<description>...</description>
<dc:creator>Martin L. Shoemaker</dc:creator>
<dc:date>2007-04-10T14:04+00:00</dc:date>
<content:encoded><![CDATA[<a href="http://www.grdotnet.org/DODN07/"><img src="http://www.grdotnet.org/DODN07/images/Site-Badge-I.gif" alt="WM Day of .Net May 19, 2007 - I'll be there!" /></a> <br />
<br />
Will you?]]></content:encoded>
</item>

<item rdf:about="http://tabletumlnews.powerblogs.com/posts/1122474050.shtml">
<title>My speaking and other travel schedule (Revised April 10, 2007)</title>
<link>http://tabletumlnews.powerblogs.com/posts/1122474050.shtml</link>
<description>UPDATE: To make it easier to find this entry, I've added a link to it in the right sidebar, right under the links for my books and my classes....</description>
<dc:creator>Martin L. Shoemaker</dc:creator>
<dc:date>2007-04-10T14:04+00:00</dc:date>
<content:encoded><![CDATA[UPDATE: To make it easier to find this entry, I've added a link to it in the right sidebar, right under the links for my books and my classes.<br />
<br />
<a href="http://www.grdotnet.org">West Michigan .NET User Group</a> in Grand Rapids MI. April 17. Topic: Dee Jay: A Voice-Controlled Juke Box for Windows Vista.<br />
<br />
<a href="http://www.dayofdotnet.org/Sessions.aspx">Ann Arbor Day of .NET</a> in Ann Arbor MI. May 5. Topic: Talking with Vista.<br />
<br />
<a href="http://www.grdotnet.org/DODN07/Sessions.aspx">West Michigan Day of .NET</a> in Grand Rapids MI. May 5. Topics: Do, Undo, Redo, Do Over: A Generics Command Pattern Implementation; Talking with Vista.<br />
<br />
<a href="http://huntug.org/DesktopDefault.aspx">Huntsville New Technology User Group</a> in Huntsville AL. September 11. Topic: Dee Jay: A Voice-Controlled Juke Box for Windows Vista.<br />
]]></content:encoded>
</item>

<item rdf:about="http://tabletumlnews.powerblogs.com/posts/1122474050.shtml">
<title>My speaking and other travel schedule (Revised April 10, 2007)</title>
<link>http://tabletumlnews.powerblogs.com/posts/1122474050.shtml</link>
<description>UPDATE: To make it easier to find this entry, I've added a link to it in the right sidebar, right under the links for my books and my classes....</description>
<dc:creator>Martin L. Shoemaker</dc:creator>
<dc:date>2007-04-10T14:04+00:00</dc:date>
<content:encoded><![CDATA[UPDATE: To make it easier to find this entry, I've added a link to it in the right sidebar, right under the links for my books and my classes.<br />
<br />
<a href="http://www.grdotnet.org">West Michigan .NET User Group</a> in Grand Rapids MI. April 17. Topic: Dee Jay: A Voice-Controlled Juke Box for Windows Vista.<br />
<br />
<a href="http://www.dayofdotnet.org/Sessions.aspx">Ann Arbor Day of .NET</a> in Ann Arbor MI. May 5. Topic: Talking with Vista.<br />
<br />
<a href="http://www.grdotnet.org/DODN07/Sessions.aspx">West Michigan Day of .NET</a> in Grand Rapids MI. May 5. Topics: Do, Undo, Redo, Do Over: A Generics Command Pattern Implementation; Talking with Vista.<br />
<br />
<a href="http://huntug.org/DesktopDefault.aspx">Huntsville New Technology User Group</a> in Huntsville AL. September 11. Topic: Dee Jay: A Voice-Controlled Juke Box for Windows Vista.<br />
]]></content:encoded>
</item>

<item rdf:about="http://tabletumlnews.powerblogs.com/posts/1122474050.shtml">
<title>My speaking and other travel schedule (Revised April 10, 2007)</title>
<link>http://tabletumlnews.powerblogs.com/posts/1122474050.shtml</link>
<description>UPDATE: To make it easier to find this entry, I've added a link to it in the right sidebar, right under the links for my books and my classes....</description>
<dc:creator>Martin L. Shoemaker</dc:creator>
<dc:date>2007-04-10T14:04+00:00</dc:date>
<content:encoded><![CDATA[UPDATE: To make it easier to find this entry, I've added a link to it in the right sidebar, right under the links for my books and my classes.<br />
<br />
<a href="http://www.grdotnet.org">West Michigan .NET User Group</a> in Grand Rapids MI. April 17. Topic: Dee Jay: A Voice-Controlled Juke Box for Windows Vista.<br />
<br />
<a href="http://www.dayofdotnet.org/Sessions.aspx">Ann Arbor Day of .NET</a> in Ann Arbor MI. May 5. Topic: Talking with Vista.<br />
<br />
<a href="http://www.grdotnet.org/DODN07/Sessions.aspx">West Michigan Day of .NET</a> in Grand Rapids MI. May 5. Topics: Do, Undo, Redo, Do Over: A Generics Command Pattern Implementation; Talking with Vista.<br />
<br />
<a href="http://huntug.org/DesktopDefault.aspx">Huntsville New Technology User Group</a> in Huntsville AL. September 11. Topic: Dee Jay: A Voice-Controlled Juke Box for Windows Vista.<br />
]]></content:encoded>
</item>

<item rdf:about="http://tabletumlnews.powerblogs.com/posts/1175861713.shtml">
<title>I'll be there!</title>
<link>http://tabletumlnews.powerblogs.com/posts/1175861713.shtml</link>
<description>...</description>
<dc:creator>Martin L. Shoemaker</dc:creator>
<dc:date>2007-04-06T12:04+00:00</dc:date>
<content:encoded><![CDATA[<a href="http://www.dayofdotnet.org"><img src="http://www.dayofdotnet.org/images/DoDNBadge.png" alt="Day of .Net May 5, 2007 - I'll be there!" /></a><br />
<br />
Will you?]]></content:encoded>
</item>

</rdf:RDF>