The World According to Marc

  • Google Voice

    Somewhat quietly Google opened up Google Voice to the public last week.

    If you haven’t had the chance to try Google Voice, I suggest taking a look. For people like me, with multiple phone numbers and locations, its a killer app.

    With Google Voice you get a single phone number that simultaneously rings all your phones (first one to answer wins) and you can quickly transfer calls between those phones.  I’ve had conference calls that started in my office that I seamlessly transferred to my cell and then to my home phone without anyone noticing a thing.

    You can also place free outbound calls using the service for free in the US (no idea about other locations). I use this feature to dramatically reduce my home telephone bill, I dropped all local and long distance service from my land-line and simply use my browser to initiate all calls. And thanks to syncing my Outlook contacts with Google this is extremely simple to do.

    Outbound IVR types should also be ready for Google Voice. Google seems to be accomplishing the simultaneous ring and transfer functionality by using a conference bridge as the core technology. While this is a pretty cool idea, it does present a problem for those of us attempting to detect answering machines. Essentially Google has answered the call long before the remote caller has answered the phone. Google Voice needs to be treated similarly to recipients who play music instead of standard ringing.

  • UCMA 2.0 Tip: Communications Sequence Activity

    I’ve been playing around with the UCMA 2.0 SDK for the last few weeks, mainly in preparation for the upcoming v.next release of Communication Server. For those interested in what comes after Speech Server it is a worthy endeavor to dig into the UCMA. Going forward the UCMA will be the tool we use. 

    When I first started playing I made one simple mistake that left me scratching my head for longer that I’d like to admit. In an effort to help others avoid my mistake (and to remind me should I forget again):

    With the UCMA, all of your activities must live within a Communications Sequence Activity.

    With Speech Server the tools automatically provide you with a “parent sequence” in which all your activities live. With the UCMA this isn’t the case; you need to include it in your workflow. When you create a new project it provides this for you, just don’t be like me and think its ok to just delete it….

    FTR, the exception I received was:

    System.InvalidOperationException: 'Workflow1' does not have a value for Call property. Please specify a name that corresponds to a call in the CommunicationsWorkflowRuntime service

  • SharePoint & External Data

    Today I ran into one of those little tasks that seem to grow from “I’ll whip it out before lunch” to “Lunch will be at 2 o'clock” before you realize what you’ve bitten off.

    Someone asked if I could display a very simple list of data from our production database in our SharePoint intranet. This is a pretty straightforward request so I said sure, why not. And it would have been a five minute job were I running the full Microsoft Office SharePoint Server, it has all sorts of tools for pulling this off. Unfortunately this is using the free SharePoint Services.

    With SharePoint Services it is a bit more buried that I thought it would be. Luckily I found an extremely easy to follow blog post from Ishai Sagi (SharePoint MVP) that walked me through setting it up.

    Seriously, how did we ever manage to get anything done prior to the web?

  • KB974571 Breaks OCS 2007 R2

    I came back from vacation to find that I was unable to login to OCS. Turns out that an update installed on 10/14 broke the front-end services for OCS. The event log shows the following error:

    The evaluation period for Microsoft Office Communications Server 2007 R2  has expired. Please upgrade from the evaluation version to the full released version of the product.

    Uninstalling the KB974581 update corrected the problem.

    Big thanks to Dietmar Kraume’s blog post at http://tinyurl.com/yjefeg9 for pointing to the solution.

  • 2009 MVP Award

    Yesterday I received an email announcing that I had been made an MVP for my work in the Microsoft Communications Server community. This is my first MVP award. I’m very excited to be a part of the MVP program and to be a resources to others in the community. I expect Unified Communications (and OCS along with it) to experience substantial growth over the next 5 years and I’m thrilled to be a part of it.

    image001

  • MagicJack Catches Flack

    In what I think may be the most entertaining blog post this year, Richard Martin describes a panel discussion at the Internet Telephony Expo. This particular panel seems to have gotten nasty when the panel members started questioning the validity of fellow panelist Dan Borislow, the creator of MagicJack.

    What makes this post so entertaining are the comments. The first from Dan Borislow who seems to have decided the best defense is a good offence, calling out Matt Bramson, CSO of InPhonex and post author Richard Martin. In concluding his comment Mr. Borislow said the following:

    “If you are interested in learning how we have a huge cost benefit over our competition, send me an email.I think I can easily explain this to you. I believe you will be quite fascinated” – Dan Borislow

    The following comment comes from Matt Bramson, who after explaining to Mr. Borislow who InPhonex is, ended with:

    “If you are interested in learning how to sustain long-term, profitable business performance, send me an e-mail. I think I can easily explain this to you. I believe that you will be uninterested.” -Matt Bramson

    And they say telecommunications is boring…

  • A Talk by jQuery Creator, John Resig

    I’ve you’re going to be in the Boston area this Wednesday the Boston .NET User Group is offering a talk by jQuery creator John Resig. It isn’t often that you have an opportunity see hear a talk by someone with this much influence. And it is even rarer to do so in such an small group (most of these talks have less than 40 people in attendance).

    Boston .NET User Group
    John Resig, jQuery Creator and Lead Developer
    Wednesday Feb. 11, 2009 6:00-8:00 p.m.
    MSFT Office, Waltham, MA

  • Getting jQuery to work with MasterPages - Code Junkie

    Jared Roberts asked a question today on his blog about using jQuery with ASP.NET Master Pages (Getting jQuery to work with MasterPages - Code Junkie). Master Pages present some interesting problems. Because the Content Page could live at a different directory level than the Master you can quickly run into issues with relative paths breaking.

    The solution is to place your scripts references into a ScriptManager on the Master Page. This ScriptManager will render the proper <Script> tags for you at runtime. For example:

    <asp:ScriptManager ID="ScriptManager" runat="server">
    <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">    <span style="color: #0000ff">&lt;</span><span style="color: #800000">Scripts</span><span style="color: #0000ff">&gt;</span></pre>
    
    <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none">        <span style="color: #0000ff">&lt;</span><span style="color: #800000">asp:ScriptReference</span> <span style="color: #ff0000">Path</span><span style="color: #0000ff">=&quot;~/js/jquery-1.2.6.min.js&quot;</span> <span style="color: #0000ff">/&gt;</span></pre>
    
    <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">    <span style="color: #0000ff">&lt;/</span><span style="color: #800000">Scripts</span><span style="color: #0000ff">&gt;</span></pre>
    
    <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #0000ff">&lt;/</span><span style="color: #800000">asp:ScriptManager</span><span style="color: #0000ff">&gt;</span></pre>
    

    The downside of this is that your Content Pages will lack Intellisense for the scripts you’ve referenced. The workaround for this is to give the designer a reference it can use at design time but that won’t render at runtime. This is done by placing the following code into your Content Page:

    <%
       if (false) { 
    %>
    <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">    <span style="color: #0000ff">&lt;</span><span style="color: #800000">script</span> <span style="color: #ff0000">src</span><span style="color: #0000ff">=&quot;../js/jquery-1.2.6-vsdoc.js&quot;</span> <span style="color: #ff0000">type</span><span style="color: #0000ff">=&quot;text/javascript&quot;</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">script</span><span style="color: #0000ff">&gt;</span></pre>
    
    <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="background-color: #ffff00">&lt;%</span><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><p>   } </p></pre><span style="background-color: #ffff00">%&gt;</span></pre>
    

    This gives you properly pathed <Script> tags at runtime and JS Intellisense at design time. This also works with User Controls where you’re using a ScriptManagerProxy and want Intellisense support.

    As an aside, the <% if (false) { %> trick is useful for other design time content. We’ve used it to reference style sheets when building user controls. It lets the control developer get a good visual of what the final control might look like but allows the final styles to be controlled by the page hosting the control.