<?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>tim laqua dot com &#187; Thoughts</title>
	<atom:link href="http://timlaqua.com/category/thoughts/feed/" rel="self" type="application/rss+xml" />
	<link>http://timlaqua.com</link>
	<description>Thoughts and Code from Tim Laqua</description>
	<lastBuildDate>Sun, 09 May 2010 15:25:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>VersionOne Nag: Reminding Us To Burn Our Points</title>
		<link>http://timlaqua.com/2010/02/versionone-nag-reminding-us-to-burn-our-points/</link>
		<comments>http://timlaqua.com/2010/02/versionone-nag-reminding-us-to-burn-our-points/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 04:19:41 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Scripts & Code]]></category>
		<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[powershell]]></category>
		<category><![CDATA[version one]]></category>

		<guid isPermaLink="false">http://timlaqua.com/?p=341</guid>
		<description><![CDATA[You'll forget - we all do. After a hard day of work, the last thing that pops in to your head is "hey, I should go update this story in VersionOne before I go home." Oh no, the only thing you're thinking about is how bad traffic will be, what you're having for dinner, your [...]]]></description>
			<content:encoded><![CDATA[<p>You'll forget - we all do.  After a hard day of work, the last thing that pops in to your head is "hey, I should go update this story in VersionOne before I go home."  Oh no, the only thing you're thinking about is how bad traffic will be, what you're having for dinner, your trip to Seattle, which bar has the best drink specials tonight, etc.  So accepting that we forget to burn points now and then, why don't we just make a script to remind us?  While you're at it, might as well add a reminder for when you accidentally close a story without setting the ToDo points to zero.</p>
<p>Luckily, since you obviously use VersionOne (because it's the gold standard), there's an API for that:<br />
<span id="more-341"></span><br />
<em>Note:  The following script will request your VersionOne username and password via Read-Host - if you want this to run every day at 4pm, you need to embed your username and password somewhere (securestring support in powershell is helpful, but still - nothing's perfect in this scenario unless you can use LDAP auth)</em></p>
<p><strong>PowerShell script: v1Nag.ps1</strong></p>

<div class="wp_syntax"><div class="code"><pre class="powershell" style="font-family:monospace;"><span style="color: #800080;">$emailFrom</span> <span style="color: pink;">=</span> <span style="color: #800000;">&quot;whoever.replies@shouldgoto.com&quot;</span>
<span style="color: #800080;">$emailSMTPServer</span> <span style="color: pink;">=</span> <span style="color: #800000;">&quot;your.smtpserver.com&quot;</span>
<span style="color: #800080;">$teamName</span> <span style="color: pink;">=</span> <span style="color: #800000;">&quot;Your Team Name in VersionOne&quot;</span>
&nbsp;
<span style="color: #800080;">$url</span> <span style="color: pink;">=</span> <span style="color: #800000;">&quot;https://wwwXXX.v1host.com/yourhostingid/&quot;</span>
<span style="color: #800080;">$username</span> <span style="color: pink;">=</span> <span style="color: #008080; font-weight: bold;">Read-Host</span> <span style="color: #800000;">&quot;User&quot;</span>
<span style="color: #800080;">$password</span> <span style="color: pink;">=</span> <span style="color: #008080; font-weight: bold;">Read-Host</span> <span style="color: #008080; font-style: italic;">-assecurestring</span> <span style="color: #800000;">&quot;Password&quot;</span>
&nbsp;
<span style="color: #800080;">$password</span> <span style="color: pink;">=</span> <span style="color: #000000;">&#91;</span>System.Runtime.InteropServices.Marshal<span style="color: #000000;">&#93;</span>::PtrToStringAuto<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#91;</span>System.Runtime.InteropServices.Marshal<span style="color: #000000;">&#93;</span>::SecureStringToBSTR<span style="color: #000000;">&#40;</span><span style="color: #800080;">$password</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
&nbsp;
<span style="color: #800080;">$apiClient</span> <span style="color: pink;">=</span> <span style="color: #008080; font-weight: bold;">resolve-path</span> <span style="color: #800000;">&quot;versionone.sdk.apiclient.dll&quot;</span>
<span style="color: #800080;">$objectModel</span> <span style="color: pink;">=</span> <span style="color: #008080; font-weight: bold;">resolve-path</span> <span style="color: #800000;">&quot;versionone.sdk.objectmodel.dll&quot;</span>
<span style="color: #000000;">&#91;</span>Reflection.Assembly<span style="color: #000000;">&#93;</span>::<span style="color: #800000;">LoadFrom</span><span style="color: #000000;">&#40;</span><span style="color: #800080;">$apiClient</span><span style="color: #000000;">&#41;</span> <span style="color: pink;">&gt;</span> <span style="color: #800080;">$NULL</span>
<span style="color: #000000;">&#91;</span>Reflection.Assembly<span style="color: #000000;">&#93;</span>::<span style="color: #800000;">LoadFrom</span><span style="color: #000000;">&#40;</span><span style="color: #800080;">$objectModel</span><span style="color: #000000;">&#41;</span> <span style="color: pink;">&gt;</span> <span style="color: #800080;">$NULL</span>
<span style="color: #800080;">$v1</span> <span style="color: pink;">=</span> <span style="color: #008080; font-weight: bold;">new-object</span> VersionOne.SDK.ObjectModel.V1Instance<span style="color: #000000;">&#40;</span> <span style="color: #800080;">$url</span><span style="color: pink;">,</span> <span style="color: #800080;">$username</span><span style="color: pink;">,</span> <span style="color: #800080;">$password</span><span style="color: #000000;">&#41;</span>
<span style="color: #800080;">$v1</span>.Validate<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
&nbsp;
<span style="color: #800080;">$sf</span> <span style="color: pink;">=</span> <span style="color: #008080; font-weight: bold;">new-object</span> VersionOne.SDK.ObjectModel.Filters.StoryFilter
<span style="color: #800080;">$v1</span>.Get.Iterations<span style="color: #000000;">&#40;</span><span style="color: #800080;">$null</span><span style="color: #000000;">&#41;</span> <span style="color: pink;">|</span> <span style="color: pink;">?</span> <span style="color: #000000;">&#123;</span> <span style="color: #800080;"><span style="color: #000080;">$_</span></span>.IsActive <span style="color: #000000;">&#125;</span> <span style="color: pink;">|</span> <span style="color: pink;">%</span> <span style="color: #000000;">&#123;</span> <span style="color: #800080;">$sf</span>.Iteration.Add<span style="color: #000000;">&#40;</span><span style="color: #800080;"><span style="color: #000080;">$_</span></span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#125;</span>
<span style="color: #800080;">$v1</span>.Get.Teams<span style="color: #000000;">&#40;</span><span style="color: #800080;">$null</span><span style="color: #000000;">&#41;</span> <span style="color: pink;">|</span> <span style="color: pink;">?</span> <span style="color: #000000;">&#123;</span> <span style="color: #800080;"><span style="color: #000080;">$_</span></span>.Name <span style="color: #FF0000;">-match</span> <span style="color: #800080;">$teamName</span> <span style="color: #000000;">&#125;</span> <span style="color: pink;">|</span> <span style="color: pink;">%</span> <span style="color: #000000;">&#123;</span> <span style="color: #800080;">$sf</span>.Team.Add<span style="color: #000000;">&#40;</span><span style="color: #800080;"><span style="color: #000080;">$_</span></span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#125;</span> 
<span style="color: #800080;">$stories</span> <span style="color: pink;">=</span> <span style="color: #800080;">$v1</span>.Get.Stories<span style="color: #000000;">&#40;</span><span style="color: #800080;">$sf</span><span style="color: #000000;">&#41;</span>
&nbsp;
<span style="color: #800080;">$memberDetail</span> <span style="color: pink;">=</span> <span style="color: pink;">@</span><span style="color: #000000;">&#123;</span><span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0000FF;">foreach</span> <span style="color: #000000;">&#40;</span><span style="color: #800080;">$story</span> <span style="color: #0000FF;">in</span> <span style="color: #800080;">$stories</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
	<span style="color: #0000FF;">foreach</span> <span style="color: #000000;">&#40;</span><span style="color: #800080;">$owner</span> <span style="color: #0000FF;">in</span> <span style="color: #800080;">$story</span>.Owners<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
		<span style="color: #0000FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: pink;">!</span><span style="color: #800080;">$memberDetail</span>.Contains<span style="color: #000000;">&#40;</span><span style="color: #800080;">$owner</span>.ID<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span> 		
			<span style="color: #800080;">$md</span> <span style="color: pink;">=</span> <span style="color: #008080; font-weight: bold;">New-Object</span> PSObject <span style="color: pink;">|</span> <span style="color: #008080; font-weight: bold;">select</span> Email<span style="color: pink;">,</span> DetailEstimate<span style="color: pink;">,</span> ToDo<span style="color: pink;">,</span> Effort<span style="color: pink;">,</span> EffortToday<span style="color: pink;">,</span> DoneWithToDo
			<span style="color: #800080;">$md</span>.Email <span style="color: pink;">=</span> <span style="color: #800080;">$owner</span>.Email;
			<span style="color: #800080;">$md</span>.DetailEstimate <span style="color: pink;">=</span> <span style="color: #000000;">0</span>;
			<span style="color: #800080;">$md</span>.ToDo <span style="color: pink;">=</span> <span style="color: #000000;">0</span>;
			<span style="color: #800080;">$md</span>.Effort <span style="color: pink;">=</span> <span style="color: #000000;">0</span>;
			<span style="color: #800080;">$md</span>.EffortToday <span style="color: pink;">=</span> <span style="color: #000000;">0</span>;
			<span style="color: #800080;">$md</span>.DoneWithToDo <span style="color: pink;">=</span> <span style="color: pink;">@</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
			<span style="color: #800080;">$memberDetail</span>.Add<span style="color: #000000;">&#40;</span><span style="color: #800080;">$owner</span>.ID<span style="color: pink;">,</span> <span style="color: #800080;">$md</span><span style="color: #000000;">&#41;</span>
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #800080;">$memberDetail</span><span style="color: #000000;">&#91;</span><span style="color: #800080;">$owner</span>.ID<span style="color: #000000;">&#93;</span>.ToDo <span style="color: pink;">+=</span> <span style="color: #800080;">$story</span>.ToDo;
		<span style="color: #800080;">$memberDetail</span><span style="color: #000000;">&#91;</span><span style="color: #800080;">$owner</span>.ID<span style="color: #000000;">&#93;</span>.DetailEstimate <span style="color: pink;">+=</span> <span style="color: #800080;">$story</span>.DetailEstimate;
&nbsp;
		<span style="color: #0000FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #800080;">$story</span>.ToDo <span style="color: #FF0000;">-ne</span> <span style="color: #000000;">0</span> <span style="color: #FF0000;">-and</span> <span style="color: #800080;">$story</span>.Status.CurrentValue <span style="color: #FF0000;">-eq</span> <span style="color: #800000;">&quot;Done&quot;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
			<span style="color: #800080;">$memberDetail</span><span style="color: #000000;">&#91;</span><span style="color: #800080;">$owner</span>.ID<span style="color: #000000;">&#93;</span>.DoneWithToDo <span style="color: pink;">+=</span> <span style="color: #800080;">$story</span>;
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0000FF;">foreach</span> <span style="color: #000000;">&#40;</span><span style="color: #800080;">$effortRecord</span> <span style="color: #0000FF;">in</span> <span style="color: #800080;">$story</span>.GetEffortRecords<span style="color: #000000;">&#40;</span><span style="color: #800080;">$null</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
			<span style="color: #800080;">$memberDetail</span><span style="color: #000000;">&#91;</span><span style="color: #800080;">$owner</span>.ID<span style="color: #000000;">&#93;</span>.Effort <span style="color: pink;">+=</span> <span style="color: #800080;">$effortRecord</span>.Value;
			<span style="color: #0000FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #800080;">$effortRecord</span>.CreateDate <span style="color: #FF0000;">-ge</span> <span style="color: #000000;">&#91;</span>DateTime<span style="color: #000000;">&#93;</span>::Today<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
				<span style="color: #800080;">$memberDetail</span><span style="color: #000000;">&#91;</span><span style="color: #800080;">$owner</span>.ID<span style="color: #000000;">&#93;</span>.EffortToday <span style="color: pink;">+=</span> <span style="color: #800080;">$effortRecord</span>.Value;
			<span style="color: #000000;">&#125;</span>
		<span style="color: #000000;">&#125;</span>
	<span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #800080;">$smtp</span> <span style="color: pink;">=</span> <span style="color: #008080; font-weight: bold;">new-object</span> Net.Mail.SmtpClient<span style="color: #000000;">&#40;</span><span style="color: #800080;">$emailSMTPServer</span><span style="color: #000000;">&#41;</span>
&nbsp;
<span style="color: #800080;">$memberDetail</span>.Values <span style="color: pink;">|</span> <span style="color: pink;">?</span><span style="color: #000000;">&#123;</span> <span style="color: #800080;"><span style="color: #000080;">$_</span></span>.EffortToday <span style="color: #FF0000;">-eq</span> <span style="color: #000000;">0</span> <span style="color: #FF0000;">-and</span> <span style="color: #800080;"><span style="color: #000080;">$_</span></span>.ToDo <span style="color: #FF0000;">-gt</span> <span style="color: #000000;">0</span><span style="color: #000000;">&#125;</span> <span style="color: pink;">|</span> <span style="color: pink;">%</span> <span style="color: #000000;">&#123;</span> <span style="color: #800080;">$smtp</span>.Send<span style="color: #000000;">&#40;</span><span style="color: #800080;">$emailFrom</span><span style="color: pink;">,</span> <span style="color: #800080;"><span style="color: #000080;">$_</span></span>.Email<span style="color: pink;">,</span> <span style="color: #800000;">&quot;V1 Nag: No Points Burned Down Today&quot;</span><span style="color: pink;">,</span> <span style="color: #800000;">&quot;Please make sure you have recorded any effort completed on your stories for the day.&quot;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #800080;">$memberDetail</span>.Values <span style="color: pink;">|</span> <span style="color: pink;">?</span><span style="color: #000000;">&#123;</span> <span style="color: #800080;"><span style="color: #000080;">$_</span></span>.DoneWithToDo.Count <span style="color: #FF0000;">-gt</span> <span style="color: #000000;">0</span> <span style="color: #000000;">&#125;</span> <span style="color: pink;">|</span> <span style="color: pink;">%</span> <span style="color: #000000;">&#123;</span> <span style="color: #800080;">$smtp</span>.Send<span style="color: #000000;">&#40;</span><span style="color: #800080;">$emailFrom</span><span style="color: pink;">,</span> <span style="color: #800080;"><span style="color: #000080;">$_</span></span>.Email<span style="color: pink;">,</span> <span style="color: #800000;">&quot;V1 Nag: Story Marked As Done With ToDo Balance&quot;</span><span style="color: pink;">,</span> <span style="color: #800000;">&quot;Please make sure you have zero'd out ToDo on your Completed/Done stories.&quot;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#125;</span></pre></div></div>

<p>You'll need to download the .NET SDK and build the requisite DLLs from:<br />
<a href="http://community.versionone.com/Downloads/default.aspx">http://community.versionone.com/Downloads/default.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://timlaqua.com/2010/02/versionone-nag-reminding-us-to-burn-our-points/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wouldn&#8217;t it be fun if Cubes could talk?</title>
		<link>http://timlaqua.com/2009/11/wouldnt-it-be-fun-if-cubes-could-talk/</link>
		<comments>http://timlaqua.com/2009/11/wouldnt-it-be-fun-if-cubes-could-talk/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 19:47:21 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Scripts & Code]]></category>
		<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[amo]]></category>
		<category><![CDATA[analysis services]]></category>
		<category><![CDATA[bi]]></category>
		<category><![CDATA[business intelligence]]></category>
		<category><![CDATA[cubes]]></category>

		<guid isPermaLink="false">http://timlaqua.com/?p=291</guid>
		<description><![CDATA[I didn't say "wouldn't it be useful" because after putting a test together, asking a cube questions with no context tends to return answers that it probably shouldn't have returned. In BI, it is incredibly important to understand what exactly it is you're asking for - if we just say we want "sales" and return [...]]]></description>
			<content:encoded><![CDATA[<p>I didn't say "wouldn't it be useful" because after putting a test together, asking a cube questions with no context tends to return answers that it probably shouldn't have returned.  In BI, it is incredibly important to understand what exactly it is you're asking for - if we just say we want "sales" and return an answer, nobody really knows what we meant by "sales."  Sure, in various circles, "sales" means the same thing - but once you start talking to different areas, departments, etc - the meaning of the word starts to shift.</p>
<p>But I digress - asking cubes questions is still pretty fun and some of the random things it returns when you point it at your own cubes can be flat out hilarious.</p>
<p>Here's a few questions thrown at the Adventure Works cube in the Adventure Works DW 2008 Analysis Services database<br />
<span id="more-291"></span></p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">what was sales for nichole nara
SELECT {[Measures].[Internet Sales Amount]} ON 0  FROM (SELECT {[Customer].[Customer].[Nichole Nara]} ON 0 FROM [Adventure Works])
$13,295.38
what were sales for nichole nara in cy 2004
SELECT {[Measures].[Internet Sales Amount]} ON 0  FROM (SELECT {[Date].[Calendar Year].[CY 2004]} ON 0 FROM (SELECT {[Customer].[Customer].[Nichole Nara]} ON 0 FROM [Adventure Works]))
$2,419.06
what were sales for nichole nara in cy 2004 in north america
SELECT {[Measures].[Internet Sales Amount]} ON 0  FROM (SELECT {[Sales Territory].[Sales Territory Group].[North America]} ON 0 FROM (SELECT {[Date].[Calendar Year].[CY 2004]} ON 0 FROM (SELECT {[Customer].[Customer].[Nichole Nara]} ON 0 FROM [Adventure Works])))
No Results Found
what were sales for nichole nara in cy 2004 for bikes
SELECT {[Measures].[Internet Sales Amount]} ON 0  FROM (SELECT {[Product].[Category].[Bikes]} ON 0 FROM (SELECT {[Date].[Calendar Year].[CY 2004]} ON 0 FROM (SELECT {[Customer].[Customer].[Nichole Nara]} ON 0 FROM [Adventure Works])))
$2,384.07
what were sales in north america in fy 2003 for bikes
SELECT {[Measures].[Internet Sales Amount]} ON 0  FROM (SELECT {[Product].[Category].[Bikes]} ON 0 FROM (SELECT {[Date].[Fiscal Year].[FY 2003]} ON 0 FROM (SELECT {[Sales Territory].[Sales Territory Group].[North America]} ON 0 FROM [Adventure Works])))
$1,739,306.95
sales for cy 2004 in cy q1, cy q2, and cy q4 in north america and canada
SELECT {[Measures].[Internet Sales Amount]} ON 0  FROM (SELECT {[Sales Territory].[Sales Territory Group].[North America],[Customer].[Country].[Canada]} ON 0 FROM (SELECT {[Date].[Calendar Quarter of Year].[CY Q1],[Date].[Calendar Quarter of Year].[CY Q2],[Date].[Calendar Quarter of Year].[CY Q4]} ON 0 FROM (SELECT {[Date].[Calendar Year].[CY 2004]} ON 0 FROM [Adventure Works])))
I don't know - Query Failure: Members belong to different hierarchies in the  function.
sales for cy 2004 in cy q1, cy q2, and cy q4 in north america
SELECT {[Measures].[Internet Sales Amount]} ON 0  FROM (SELECT {[Sales Territory].[Sales Territory Group].[North America]} ON 0 FROM (SELECT {[Date].[Calendar Quarter of Year].[CY Q1],[Date].[Calendar Quarter of Year].[CY Q2],[Date].[Calendar Quarter of Year].[CY Q4]} ON 0 FROM (SELECT {[Date].[Calendar Year].[CY 2004]} ON 0 FROM [Adventure Works])))
$3,967,371.16
sales between cy 2003 and cy 2004 for large resellers
SELECT {[Measures].[Internet Sales Amount]} ON 0  FROM (SELECT [Large Resellers] ON 0 FROM (SELECT {[Date].[Calendar Year].[CY 2003]:[Date].[Calendar Year].[CY2004]} ON 0 FROM [Adventure Works]))
$19,561,960.04
sales for top 50 customers in fy 2004 in fy q1 and fy q3
SELECT {[Measures].[Internet Sales Amount]} ON 0  FROM (SELECT {[Date].[Fiscal Quarter of Year].[FY Q1],[Date].[Fiscal Quarter of Year].[FY Q3]} ON 0 FROM (SELECT {[Date].[Fiscal Year].[FY 2004]} ON 0 FROM (SELECT [Top 50 Customers] ON 0 FROM [Adventure Works])))
$177,263.41</pre></div></div>

<p>The above questions returned pretty much exactly what I was looking for except for the one that threw us an error about members belonging to different hierarchies.  That one was because "Canada" was in [Customer].[Country] and "north america" was in [Sales Territory].[Sales Territory Group].  Yeah, it was a dumb question because canada is in north america, but it illustrates that when you don't qualify things, you can get some pretty confusing results.</p>
<p><strong>How's it work?</strong></p>
<ol>
<li>Enumerate all the Attribute Values for each Attribute Hierarchy and store them as "keywords"</li>
<li>Get some input</li>
<li>Look for the aforementioned "keywords" in the input string</li>
<li>Construct an MDX query based on what "keywords" were found in the string</li>
<li>Make sure there aren't any extra (non-noise) words in the string</li>
<li>Run Query</li>
<li>Return Results</li>
</ol>
<p><strong>How the queries are constructed</strong></p>
<ul>
<li>Attribute Values just create a subcube - it creates a new nested subcube for each list, range, or named set it finds</li>
<li>It only supports one measure as written and it just selects that from whatever quagmire of subcubes it's created</li>
</ul>
<p>There are tons of issues with this methodology when we have role playing dimensions because the attribute values will be the same for these dimensions - so only the first one enumerated will get in (there's a way to ignore certain dimensions in the app.config - ignore all but one role playing dimension).  It throws away context and calls it "noise" - now that's dangerous;  if you throw away the context and just look for keywords, it's pretty easy to answer a question that wasn't really asked (oops).</p>
<p>As far as configuring this thing goes - take a look at the app.config and throw in appropriate values for your setup.  You'll have to tweak the *Pattern values to fit things you want to match or exclude in your particular cube.  It's configured for the Adventure Works cube right now, but I didn't work with it much - I just flat out excluded a few dims and hierarchies that would obviously confuse it.</p>
<p>Also note that, as written, it needs an Analysis Services 2008 cube.</p>
<p>Let me know if you want to give it a try and I'll be more than happy to work with you on configuring/modifying it for your setup.  Also post comments on interesting observations you have when asking cubes unqualified questions <img src='http://timlaqua.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><a href='http://timlaqua.com/wp-content/uploads/2009/11/SmartCube.zip'>Download the VS 2008 Project: SmartCube.zip</a></p>
<p>Also note, the project uses an interface called IODoodad for getting questions and responding - this has two public methods, GetInput() and Respond().  The original theory here is that we could make an old-school IRC bot type thing.  We did manage to hook it to Yammer for its IO, respond to private messages and public messages prefixed with @cube, etc.  I didn't really explain the config for YammerIO (there's a custom config section for that that needs a bunch of OAuth stuff).  Again, if you're interested in getting that working, let me know and I'll post instructions.  The project above is set to use ConsoleIO.</p>
<p>I don't plan on doing any more development here, it was just a quick PoC to see what it looked like and get some initial feedback.  If anyone's interested in moving forward with it and making it smarter (the project arguably should have been titled DumbCube at this point), let me know so I can post a link to your work and fork away <img src='http://timlaqua.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://timlaqua.com/2009/11/wouldnt-it-be-fun-if-cubes-could-talk/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Customer Service at the Golf Course (the customer is NOT always right)</title>
		<link>http://timlaqua.com/2009/03/customer-service-at-the-golf-course-the-customer-is-not-always-right/</link>
		<comments>http://timlaqua.com/2009/03/customer-service-at-the-golf-course-the-customer-is-not-always-right/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 12:00:45 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Golf]]></category>
		<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[customer servie]]></category>

		<guid isPermaLink="false">http://timlaqua.com/?p=175</guid>
		<description><![CDATA[In most businesses, the name of the game is giving the customer what they want when they want it. Putting the right opportunities in front of them at the right time. At the golf course (the elitist ones), the game changes quite a bit. Take the Pro Shop for example - everything is overpriced, at [...]]]></description>
			<content:encoded><![CDATA[<p>In most businesses, the name of the game is giving the customer what they want when they want it.  Putting the right opportunities in front of them at the right time.  At the golf course (the elitist ones), the game changes quite a bit.  Take the Pro Shop for example - everything is overpriced, at least 20% above what you could get it for at TGW or GolfGalaxy.  Why?  Because if you're in need of something before a round and you remember just as you're standing in the pro shop, you're certainly not going to hop in your car and head over to GolfGalaxy - you just buy it there, you're trapped more or less.  Don't even bother trying to work with the pro shop guys on the price either, they could care less.  Which brings me to my second point - the staff.<br />
<span id="more-175"></span><br />
In most businesses, the staff is friendly and there to serve your every need (within reason) - here, at the golf course, the staff appears to be convinced that you are there to mess up their course.  It is your priveledge to play on their course - not your right.  Paying your greens fees in no way gives you the right to run amok leaving divots, unraked bunkers, and unsightly walking paths through all the hazards.  There is quite a bit to be said for cleaning up after yourself on the golf course - a few irresponsible patrons can do some pretty serious damage to the course.  But really, most golf course staff take it way too far.  Yesterday I showed up late for a tee time (by late, I mean on time - i was supposed to be on the tee box when I was paying my greens fees).  The pro shop guy started spouting off about how horrible this situation was, then I went on to say I was solo for the day, while my tee time was reserved for two.  Which, of course, led to a lecture on how much money I just cost him.  Playing as a single, the course goes pretty quick - the only issue is that you do take up the space between the group in front of you and the group behind you.  Regardless, the pro shop guy felt the need to ask the twosome (who had taken my slot on the teebox) if I could play with them.  They agreed (reluctantly - again, the staff pretty much tells you the way it is - they didn't have much of a choice).  So I played the first hole with them and jumped ahead to the 2nd hole once they both found the green.  Unfortunately, this is where I found the two foursomes in front of me and I got stuck there for the front 9.</p>
<p>I know, I shouldn't have played ahead and subsequently made the group behind me wait to tee off until after my 2nd shot, but I didn't come to the golf course to play with these two guys - and they didn't come here to play with me.  This isn't to say that two singles don't often find each other and have a nice time playing together - I'm saying that when a group comes to the course, they come to play together - not with strangers.  Singles are a different situation.</p>
<p>It is your duty as a responsible golfer to always replace divots, rake bunkers, and avoid tromping around in the weeds needlessly (usually hunting for balls, sometimes your own).  It just bothers me that the golf course staff, more often than not, seem to assume the worst about you.</p>
]]></content:encoded>
			<wfw:commentRss>http://timlaqua.com/2009/03/customer-service-at-the-golf-course-the-customer-is-not-always-right/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The Ellipsis &#8230; stop abusing it!</title>
		<link>http://timlaqua.com/2008/09/the-ellipsis-stop-abusing-it/</link>
		<comments>http://timlaqua.com/2008/09/the-ellipsis-stop-abusing-it/#comments</comments>
		<pubDate>Thu, 11 Sep 2008 23:36:08 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[elipsis]]></category>
		<category><![CDATA[grammar]]></category>

		<guid isPermaLink="false">http://timlaqua.com/?p=39</guid>
		<description><![CDATA[I have no idea how many times in the last week I've fell prey to the errant ellipsis. You see it in an instant message and then wait for the rest of the thought like a dog awaiting a promised treat. Alas, nothing follows. Do you ask for the rest of the thought? Do you [...]]]></description>
			<content:encoded><![CDATA[<p>I have no idea how many times in the last week I've fell prey to the errant ellipsis.  You see it in an instant message and then wait for the rest of the thought like a dog awaiting a promised treat.  Alas, nothing follows.  Do you ask for the rest of the thought?  Do you wait and try to followup next time you see them in person?  Or...  Even worse... do they not know what an ellipsis means?  For some reason more often than not lately I have been a victim of the "I just end sentences with multiple periods" syndrome.  Stop it.  You can not add extra periods to imply that you are super duper done with your statement.  Sure, extra exclimation points are good fun - but extra periods like... mean something - they don't indicate extra done-ness.</p>
<p>Now, I'm certainly not a grammar specialist, but when I see an ellipsis, I get all excited waiting for the held back nugget of drama.  Then when it doesn't come I am sad.  So, so sad.  So please.  One period means "statement over," while more than one means "more awesome stuff to come."</p>
]]></content:encoded>
			<wfw:commentRss>http://timlaqua.com/2008/09/the-ellipsis-stop-abusing-it/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Starting a Business = Divorce?</title>
		<link>http://timlaqua.com/2008/07/starting-a-business-divorce/</link>
		<comments>http://timlaqua.com/2008/07/starting-a-business-divorce/#comments</comments>
		<pubDate>Mon, 21 Jul 2008 13:17:23 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://timlaqua.com/?p=35</guid>
		<description><![CDATA[So I was trying to find some sort of "start a business" packet with all the required forms and such - so I naturally searched Google for "minnesota start a business packet" And what is the 3rd ranked hit? Starting a divorce. Nice.]]></description>
			<content:encoded><![CDATA[<p>So I was trying to find some sort of "start a business" packet with all the required forms and such - so I naturally searched Google for "minnesota start a business packet"</p>
<p>And what is the 3rd ranked hit?  Starting a divorce.  Nice.</p>
<p><a href='http://timlaqua.com/wp-content/uploads/2008/07/start-a-business-search.jpg'><img src="http://timlaqua.com/wp-content/uploads/2008/07/start-a-business-search.jpg" alt="" title="start-a-business-search" width="500" height="383" class="alignnone size-full wp-image-36" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://timlaqua.com/2008/07/starting-a-business-divorce/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
