App Feedback

Some of you may know that I’ve developed and published a fantasy sports app for Windows Phone 8.1. The download count has been steadily going up in the last few weeks and update to 24 as of yesterday.

Today, I received my first feedback: a 1-star! Doh! The reason for this post is because the one thing that I love about the Windows Phone platform is that it allows developers to respond to feedback. In this case, I wanted to get in touch with the user to dig deeper into the issue (which he graciously provided in his feedback).

So, after replying to his feedback (from the Dev Center), I was able to get to the bottom of the issue. He hasn’t updated his rating, and I’m not going to force him to. That’s on his own prerogative… but it was great to be able to do that!

Score one for Microsoft.

Inbox by Gmail

This week, I received my Google Inbox invitation from one of my wife’s good friends who works for Google. I’ve been using it the last few days, but not to the extent to be able to review it completely. Today, however, I did more things with it.

Although I’m not super impressed with it (just yet), it is a fresh perspective on email. It actually took me a while to start getting used to it. Here are some info and quick impressions:

  • It only works in the Chrome browser, Android and iOS phones.
    Being a predominantly Windows user, this didn’t bode well for me. So, for now, I’m only using it in my Chrome browser on my desktop. I did download it on my iPad (that being my only iOS device) but the app itself is designed for the phone. It looks horrible in it’s zoomed out state.
  • It has a concept called Bundles
    Bundles allows you to, well, bundle your emails. The predefined bundles are Promos, Updates, Purchases, etc. You can create your own bundles akin to creating your own tags. In fact, I’m not quite sure if bundles and tags are the same thing/concept within Inbox.
  • I had a hard time determining if I had new emails or not. Part of it is because of the bundles and how the emails collapse within those bundles. For example, a bundle may say “Promos (25+)” and I wasn’t quite sure if I had any new emails in there.
    New emails do show up in bold, as they did in Gmail, and maybe it does the same thing for bundles (and just haven’t seen it light up that way yet).
    I have to say, most of the bundles are accurate – and you do have the ability to fix it if an email was incorrectly placed in a bundle.
  • Google Inbox have Reminders that are first-class citizens within the app
    You can now create reminders for yourself and they show up just like an email would. It’s like sending an email to yourself. I may consider using this over Trello. I’ll have to see how accessible these reminders are from my other devices.
  • Finally, you can pin items. Emails, Reminders, etc.
    With one click of a button, you can view all of your pinned items. I can’t say that I’m that impressed with how Google implemented this feature. A toggle button, thought it makes sense, just seems a bit off to me. Here’s a screenshot:
    Capture
    I’m not exactly sure how I would’ve done it myself, being a developer/designer, but I actually stayed away from that button for the first few days because I didn’t know what it was (until I watched the YouTube video). My best guess is that the experience is best suited for touch devices.
    I think what’s bothering me about it is because there’s a left-side navigation menu that switches it from one view to another, and then there are other ‘toggling’ features (on/off type of UI) that were implemented using a single icon that is either colored in (blue) or disabled (gray). I don’t know, it’s really not that big of a deal.

Well, that’s it for now. I’ll probably do a couple more reviews on it later.

WinJS Everywhere

I’m a bit late to posting about this (about a month), but apparently WinJS has gone everywhere.

I love working WinJS in my Windows Phone and Windows 8 apps. I’m at the point where I’m very familiar (and dare I say good) with it, so I was really excited to read about this. In fact, I had heard about this a few weeks ago, but didn’t really get the chance to get into it; maybe I was still in vacation.

Now, I’m building a new site (Beyond Endurance Sports; “BES”) that will allow all the runners that have used my Marathon Training Google Spreadsheet

Sorry AngularJS, you’re going to be taking a backseat.

A Useful Trick in OneNote

This has bugged me for a long time about OneNote: that when I want to add a new set of notes near another container of notes, that clicking in the vicinity of the container will just make that container bigger. This may be one of the reasons that I have not used OneNote as much. Today, I finally did a search about it and there is a solution.

This blog talks exactly about this issue and how you can solve it:

http://blogs.msdn.com/b/onenotetips/archive/2008/10/29/creating-a-new-container-near-another-one.aspx

I typically oppose re-blogging or kicking back someone’s blog, but this blog post sums it up very well.

LOVE IT!

Removing Security Policies on Windows 8

If you’ve added an account to your Windows 8 email app that consequently installed a mobile policy that has disabled your picture password, you might find out that simply removing the email account does not remove the policy. And you may be wanting to do this because you find the picture password much easier to authenticate with rather than typing your long password.

So how do you remove the policy? Well there’s probably a number of ways to do this, but here’s’s one:

  1. Do a search for ‘policy’.
    “Apps” won’t have any search results, but look under “Settings”.
  2. On the search results, click “Reset Security Policies”.
    If you don’t see this, it’s probably because there aren’t any security policies to reset and you’re already good to go. You can still click “Edit Group Policy” to get to it, though.
  3. After clicking “Reset Security Policies”, you will be navigated to the “User Accounts” control panel, and from there, you can (truly) click “Reset Security Policies”.

At this point, the picture password feature is automatically re-enabled for you. You don’t need to enable it or even restart your machine.

Exposing WCF services with SOAP and REST endpoints

Simultaneously exposing a WCF service with both SOAP and REST endpoints is not as difficult as it may sound. It requires just a few updates to the codebase and configuration. But first, let’s start from the beginning.

This post assumes that you have a WCF service (new or existing) that is only providing a SOAP endpoint. I’m making this assumption because that is the default endpoint for any new WCF service that you create from Visual Studio. The goal is to reconfigure the service to expose the additional REST endpoint.

Another thing to consider is that how you call a service is not always the same thing as to what (format) you expect from it. In other words, if you are downloading a resource from a RESTful URL, then the resource being returned can still be any format such as XML or JSON (further assuming that that we’re talking about character data). However, nowadays, many RESTful services do in fact return JSON data as the default format, so we’ll make assumption in this post as well: that the REST endpoint will return JSON payload, while the SOAP endpoint returns an XML payload.

Let’s get to it.

First, we need to configure the REST endpoint:

  1. Open your WCF project/solution with Visual Studio.
  2. Open the application configuration file (app.config or web.config).
  3. Locate the appropriate service element (under configuration/system.ServiceModel/services).
    Note that the existence of an endpoint element which describes the SOAP endpoint.
  4. Add a new endpoint element under the service element that is similar to the SOAP endpoint; a simple copy/paste of the existing endpoint element should suffice.
  5. Ensure that address attribute for both endpoints are not the same because those values map to a part of the URL that exposes those endpoints.
    For example, provide “soap” and “rest” as values for the address attribute.
  6. Ensure that the newly created REST endpoint has a binding attribute value of webHttpBinding.
    Note that if you copied and pasted this element from the existing one that the binding attribute value will be basicHttpBinding (or some other type of binding).Your endpoint configuration should look similar to:

    <system.serviceModel>
    <services>
    <service name="SoapRestEnabledService.Service1">
    <host>
    <baseAddresses>
    <add baseAddress="http://localhost:8733/Design_Time_Addresses/SoapRestEnabledService/Service1/" />
    </baseAddresses>
    </host>
    <!-- Service Endpoints -->
    <!-- Unless fully qualified, address is relative to base address supplied above -->
    <endpoint address="soap" binding="basicHttpBinding" contract="SoapRestEnabledService.IService1">
    <identity>
    <dns value="localhost" />
    </identity>
    </endpoint>
    <endpoint address="rest" binding="webHttpBinding" contract="SoapRestEnabledService.IService1" behaviorConfiguration="restEndpointBehavior">
    <identity>
    <dns value="localhost" />
    </identity>
    </endpoint>
    <!-- Metadata Endpoints -->
    <!-- The Metadata Exchange endpoint is used by the service to describe itself to clients. -->
    <!-- This endpoint does not use a secure binding and should be secured or removed before deployment -->
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    </service>
    </services>
    

Because we are assuming that the payload format for the REST endpoint should be JSON, we need to configure the endpoint to do so. To do this, we add an endpoint behavior.

  1. In the configuration file, locate the endpointBehaviors element (under configuration/system.serviceModel/behaviors).
  2. Add a new behavior element, and provide a name attribute value such as “restEndpointBehavior”.
  3. Add a new webHttp element in the new behavior.
    From here, we can either indicate that the payload is formatted automatically or specifically.
    To format it automatically, ensure that the automaticFormatSelectionEnabled is set to True.
    To format it specifically (to JSON), ensure that the defaultOutgoingResponseFormat is set to Json.Your new endpoint should look similar to:

    <endpointBehaviors>
      <behavior name="restBehavior">
        <webHttp helpEnabled="true" defaultOutgoingResponseFormat="Json" />
      </behavior>
    </endpointBehaviors>
    
  4. Now, associate the endpoint behavior to the endpoint itself by adding/modifying the behaviorConfiguration attribute on the endpoint (see the first xml configuration above).

The service is now configure to expose the service as both SOAP and REST endpoints.

But wait, we’re not done. We also have to enable the service methods for REST:

  1. Add a Reference to System.ServiceModel.Web to the project.
  2. Add WebGet or WebInvoke attributes to each method for the service. In some cases, such as using WebInvoke, you will need to use UriTemplates to better control the URL.Your service (interface) should now look similar to:
    [ServiceContract]
    public interface IService1
    {
        [WebGet]
        [OperationContract]
        string GetName();
    
        [WebInvoke(UriTemplate = "getdata/{value}")]
        [OperationContract]
        string GetData(string value);
    
        [WebInvoke]
        [OperationContract]
        CompositeType GetDataUsingDataContract(CompositeType composite);
    }
    

Well, that’s about the brunt of what needs to be changed.

DAUG Kick Off

Tomorrow, May 12th, I will be presenting at the Microsoft DTC office in Colorado as part of our kick off event for the new user group Denver Azure User Group or DAUG (“dog”) for short.

I can’t remember the last time I presented in front of a big crowd so this should be quite interesting. I do know I’m very excited to do it especially because I’ll be talking about Windows Azure, a technology that I have grown pretty close to over the last year.

Today, I’ll be working on the presentation itself. Though I’ll be the primary presenter, principal consultant Seth Crichton will be presenting the “business” part of the kick off. I’ll be covering the high level, technical topics.

So far, at least 20 people are attending.

To learn more about this, visit http://www.denverazure.com/events