Thursday, June 30, 2011

WP7 Mango–Multi tasking support

Yes, Windows Phone 7 will support multi-tasking with the Mango update.

To check it out, just press the back button for a couple of seconds and you should see a screen that displays all the applications currently running.

To kill an app, select it from the multi-tasking screen and then hit the back button. (The windows button will continue running the app in the back ground).

Sunday, June 26, 2011

Are lunch breaks paid or unpaid?

I recently was having a discussion with a friend regarding whether meal breaks were paid or unpaid. Since my first job at a start-up in Montana, I have always worked at a minimum 8.5 hours a day. So did everyone else at the company. I always assumed that meal breaks were unpaid. It just makes common sense, because you can use that time for anything: eating, personal chores, etc.

But my friend disagreed, saying that lunch breaks were compensated periods and so one had to only work 8 hours (that included the 1/2 hour meal break).

Obviously I had to figure out what the law says about this topic. According to the DOL page, I was correct. Federal law does not provide for compensated lunch breaks: http://www.dol.gov/dol/topic/workhours/breaks.htm

Federal law does not require lunch or coffee breaks. However, when employers do offer short breaks (usually lasting about 5 to 20 minutes), federal law considers the breaks as compensable work hours that would be included in the sum of hours worked during the work week and considered in determining if overtime was worked. Unauthorized extensions of authorized work breaks need not be counted as hours worked when the employer has expressly and unambiguously communicated to the employee that the authorized break may only last for a specific length of time, that any extension of the break is contrary to the employer's rules, and any extension of the break will be punished.

Bona fide meal periods (typically lasting at least 30 minutes), serve a different purpose than coffee or snack breaks and, thus, are not work time and are not compensable.

For more information read the Title 29: Section 785.19.

Meal breaks are compensated only if you are not completely relived of your duties during the break (think of a receptionist that answers phone calls during their lunch). But if you are relieved of your job duties and you didn’t do anything related to work, then you don’t get compensated.

Although Federal law does not require lunch breaks, some States do. But none of theses States require that lunch breaks be compensated. (Typically in these States, you need to work for at least 6 hours to qualify for the mandatory 30 minute unpaid break time). Some of these States are: California, Colorado, Connecticut, Delaware, Illinois, Kentucky, Maine, Massachusetts, Minnesota, Nebraska, Nevada, New Hampshire, New York, North Dakota, Oregon, Rhode Island, Tennessee, Washington, and West Virginia.

See Colorado Dept of Labor and Employment: Breaks and Meal Periods and 7 CCR 1103-1 (Colorado Minimum Wage Order Number 27)

Colorado’s law does specify that:

Employees shall be permitted to fully consume a meal of choice “on the job” and be fully compensated for the “on-duty” meal period without any loss of time or compensation.

I am not 100% exactly what is meant by the above statement, but it seems to me, that you are allowed to eat and work at the same time and in that case, the time is considered to be compensated.

My Thoughts: More often than not, I work while I am taking my lunch break. Its because I am running a software build, reading up on some research, etc. But I almost always consider that time as unpaid time and hence will at a minimum work 8.5 hours a day. Its just easier that way, because apart from work, I need to spend time heating my lunch, or I am sometimes reading news, or speaking to someone or taking care of some personal errands (and when taken with the sum of other personal interruptions that occur throughout the day, I think it’s a wash).. In my opinion, it’s the ethical thing to do.

Disclaimer: I am not an attorney. Nor do I know law. This is just my opinion based on a discussion with a friend and some Googling I did.

TomTom–owning multiple devices can be a pain

The weirdest requirement of owning a TomTom GPS device: If you have multiple devices that you use at the same time (eg: one for your car and one for your wife’s), then you can only have one device registered to an email account at a time.

image

http://uk.support.tomtom.com/app/answers/detail/a_id/10079/~/linking-devices-to-your-mytomtom-account

How PAINFUL!

Even worse, I had a TomTom device a long time back. I bought a new one in January of this year and it was working with my original computer without a problem. But since I got my new laptop, TomTom Home 2 continuously recognizes my XXL 550 device as a TomTom One device. The biggest problem with that: I had registered a LifeTime map update service for my XXL 550 and it no longer gets picked up by my TomTom Home2. So I am unable to get the latest maps.

Now, I have to spend time calling the customer service department (which is not open on a sunday) and get a solution for this. I just hope they have a solution, cause I paid good money for the LifeTime map service for my XXL.

You would think that the TomTom account would allow you to register multiple devices and that you could manage your subscriptions through their web-portal, but No! none of that is possible. You would think that the TomTom Home 2 software would automatically determine the device attached to the computer, use its serial number to determine what kind of TomTom device it is and also show you the different services associated with the device – again, not thought of! Without both of these basic features, my recent experience with the device has been very frustrating.

image image
TomTom web-portal shows my active device as XXL TomTom Home 2 shows the currently connected device as TomTom One and the “Change Device” option never enables itself – EVER!

Hopefully, the customer service call ends up being less frustrating.

Wednesday, June 22, 2011

VS 2010–web.Config file transformations

web.Config file transformations make it extremely easy to create multiple configuration files for different environments from one main config file. (Before VS2010, you needed to create one web.config file for each environment and any changes in one had to be replicated to the other config files). Get information about the available transformations available in VS2010 at: http://msdn.microsoft.com/en-us/library/dd465326.aspx.

Also, check out the following post for a quick run down on whats possible": http://vishaljoshi.blogspot.com/2009/03/web-deployment-webconfig-transformation_23.html

GreenShot–free screen-capture tool

GreenShot is now my new favorite screen-capture tool.

Its open-source (and free). It has all the features one would care about when creating screen-shots. And it works great.

Story-pointing using relative sizing

Using the Sticky-Notes application in Windows 7 makes it easy for every one to see and also works out great when you have multiple teams offsite, that are using screen-sharing to take part in the planning session.
Below is a picture of one such session, where we were using a projector to display the relative sizes locally and an offsite team was viewing the same screen using Mikogo.
image

Also checkout my previous post on using sticky-notes for story-point estimation: http://blog.aggregatedintelligence.com/2011/05/estimating-user-storiesallowing-team-to.html

Incorporating feedback within Scrum

Came across this nice graphic that shows how feedback from customers is incorporated into the Scrum cycle.

scrum_feedback

BHarry discusses it in more detail at: http://blogs.msdn.com/b/bharry/archive/2011/06/21/the-importance-of-feedback-in-software-development.aspx

Monday, June 20, 2011

WCF authentication issue: HTTP request is unauthorized with client authentication scheme ‘Anonymous’

We were getting the following error, when we attempted to use a web-service through a website.

The HTTP request is unauthorized with client authentication scheme ‘Anonymous’. The authentication header received from the server was ‘Negotiate,NTLM’.

Looks like there could be multiple reasons that this could happen. In our case none of the Google hits were fixing our problem.

Finally we figured out that the cause of the issue in our case was that we were hitting the website with a URL that was different from how the binding was set in IIS (that is: we were hitting the site as myWebService.myCompany.Com and the binding in IIS was set to myWebService.) Once we updated the binding in IIS to “myWebService.myCompany.Com”, the issue got fixed).

image

Your Mileage May Vary!

C#–ObjectDumper

In “C:\Program Files (x86)\Microsoft Visual Studio 10.0\Samples\1033”, you will find a zip file called “CSharpSamples.zip”.

Within it you will find a file called ObjectDumper.cs (CSharpSamples\LinqSamples\ObjectDumper). This is a nifty little utility class that you can use to dump the data within an object. (It will walk the object graph to a specified depth which you can then output to console or a textWriter).

To call it you can use the following code:

StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
Test test = new Test();
ObjectDumper.Write(test, 1, sw);
Console.WriteLine(sw.ToString());

Here is the code from that file:

// Copyright © Microsoft Corporation.  All Rights Reserved.
// This code released under the terms of the
// Microsoft Public License (MS-PL,
http://opensource.org/licenses/ms-pl.html.)
//
//Copyright (C) Microsoft Corporation.  All rights reserved.

using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;

// See the ReadMe.html for additional information
public class ObjectDumper {

    public static void Write(object element)
    {
        Write(element, 0);
    }

    public static void Write(object element, int depth)
    {
        Write(element, depth, Console.Out);
    }

    public static void Write(object element, int depth, TextWriter log)
    {
        ObjectDumper dumper = new ObjectDumper(depth);
        dumper.writer = log;
        dumper.WriteObject(null, element);
    }

    TextWriter writer;
    int pos;
    int level;
    int depth;

    private ObjectDumper(int depth)
    {
        this.depth = depth;
    }

    private void Write(string s)
    {
        if (s != null) {
            writer.Write(s);
            pos += s.Length;
        }
    }

    private void WriteIndent()
    {
        for (int i = 0; i < level; i++) writer.Write("  ");
    }

    private void WriteLine()
    {
        writer.WriteLine();
        pos = 0;
    }

    private void WriteTab()
    {
        Write("  ");
        while (pos % 8 != 0) Write(" ");
    }

    private void WriteObject(string prefix, object element)
    {
        if (element == null || element is ValueType || element is string) {
            WriteIndent();
            Write(prefix);
            WriteValue(element);
            WriteLine();
        }
        else {
            IEnumerable enumerableElement = element as IEnumerable;
            if (enumerableElement != null) {
                foreach (object item in enumerableElement) {
                    if (item is IEnumerable && !(item is string)) {
                        WriteIndent();
                        Write(prefix);
                        Write("...");
                        WriteLine();
                        if (level < depth) {
                            level++;
                            WriteObject(prefix, item);
                            level--;
                        }
                    }
                    else {
                        WriteObject(prefix, item);
                    }
                }
            }
            else {
                MemberInfo[] members = element.GetType().GetMembers(BindingFlags.Public | BindingFlags.Instance);
                WriteIndent();
                Write(prefix);
                bool propWritten = false;
                foreach (MemberInfo m in members) {
                    FieldInfo f = m as FieldInfo;
                    PropertyInfo p = m as PropertyInfo;
                    if (f != null || p != null) {
                        if (propWritten) {
                            WriteTab();
                        }
                        else {
                            propWritten = true;
                        }
                        Write(m.Name);
                        Write("=");
                        Type t = f != null ? f.FieldType : p.PropertyType;
                        if (t.IsValueType || t == typeof(string)) {
                            WriteValue(f != null ? f.GetValue(element) : p.GetValue(element, null));
                        }
                        else {
                            if (typeof(IEnumerable).IsAssignableFrom(t)) {
                                Write("...");
                            }
                            else {
                                Write("{ }");
                            }
                        }
                    }
                }
                if (propWritten) WriteLine();
                if (level < depth) {
                    foreach (MemberInfo m in members) {
                        FieldInfo f = m as FieldInfo;
                        PropertyInfo p = m as PropertyInfo;
                        if (f != null || p != null) {
                            Type t = f != null ? f.FieldType : p.PropertyType;
                            if (!(t.IsValueType || t == typeof(string))) {
                                object value = f != null ? f.GetValue(element) : p.GetValue(element, null);
                                if (value != null) {
                                    level++;
                                    WriteObject(m.Name + ": ", value);
                                    level--;
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    private void WriteValue(object o)
    {
        if (o == null) {
            Write("null");
        }
        else if (o is DateTime) {
            Write(((DateTime)o).ToShortDateString());
        }
        else if (o is ValueType || o is string) {
            Write(o.ToString());
        }
        else if (o is IEnumerable) {
            Write("...");
        }
        else {
            Write("{ }");
        }
    }
}

Sunday, June 12, 2011

XBox 360, Windows 7 and Connection Issues

I suddenly started having connection issues between my computer and the Xbox and could no longer play music from my computer.

I checked everything: firewall settings, router settings, network settings….. nothing worked.

I then came across a couple of posts that talked about DRM issues. Following along, I walked through resetting DRM and magically, my Xbox started finding my music from my computer.

Not sure what about DRM was causing the issues, but now that its working – I am not complaining.

My setup:

  1. Windows 7
  2. Wired Network
  3. Zune Player on computer

Steps:

  1. You need to rename the DRM cache folder:
    1. Go to C:\ProgramData\Microsoft
      Rename the folder “DRM” to “DRM-Old”
      image
      If you cant find the above folder, make sure you have setup the folder options to show hidden folders and files.
    2. Once you have renamed the DRM folder, go to the following website: http://drmlicense.one.microsoft.com/Indivsite/en/indivit.asp?force=1
      Important: Visit site only in IE.
    3. If the upgrade button is disabled, make sure Zune and Windows Media Player are not running.
      Also refresh the page a couple of times. I think this page has issues in Windows 7.
    4. Hit the upgrade button.
    5. Restart your computer and Xbox (xbox only after your computer has restarted).
    6. Make sure that you can view Xbox device on your computer:
      image
      If Xbox 360 shows up, then you know that your computer is able to see your Xbox.
    7. Try and play your music from your Xbox.

If the above doesn’t work, make sure you have turned off your firewall and then retry.

If that too doesn’t work…. Google for other solutions Smile

Tuesday, June 07, 2011

Reinstalling OS on a Dell Laptop

Here is a page that I came across on Dell’s website that goes into the proper order of driver installation when you are attempting a fresh OS install.

http://support.dell.com/support/topics/global.aspx/support/downloads/en/driver_install_order?c=us&cs=19&l=en&s=dhs&~lt=print

Useful if you need to reset your laptop.

Sunday, June 05, 2011

Nissan in-dash navigation system–no exit numbers?

Until today, all the GPS systems that I have ever had, would display the exit number at which you were supposed to exit. But that does not seem to be the case with the GPS system installed in the Nissan Rogue (2011)! Am I missing a settings option, or does the Nissan Navi system not know about exit numbers?

image 

Nissan 2011 Rogue Navigation System manual: http://www.nissanusa.com/content/dam/nissan/pdf/techpubs/2011/2011-Nissan-LC-Navi.pdf

Saturday, June 04, 2011

Extended warranty for Nissans

Although Consumer Reports says that extended warranties are typically not useful, I was intrigued by Nissan’s extended warranty (called Security+Plus) as it’s a Nissan administered plan. And at the right price it would definitely make sense.

Instead of buying it from the Nissan dealer where I bought my Nissan Rogue, I opted to purchase it later. And it turned out to be a good thing: The dealer where I bought the Rogue, quoted me $2100 for the extended warranty (84 months, 70k miles). I ended up buying it at Larry Miller Nissan for much less, $600 less.

So here is what I suggest:

  • Make sure the length of the warranty makes sense for you. In my case, we typically drive our car about 10k miles a year. So the warranty should last for 4 extra years beyond the original Nissan warranty. At the reduced price that I paid at Larry Miller Nissan, I should end up recouping the cost if I have just one medium severity problem.
  • Don’t buy the extended warranty at the time you are buying your car, unless you are getting a good deal (basically you are paying a small mark-up above the invoice price for the warranty). Instead go home and call all the dealers. One of them is bound to give you a good price. (Think of it just like how you would buy your car).

Larry Miller Nissan: http://www.larrymillernissan.com/index.htm (Ask for Joe Lee)

Thursday, June 02, 2011

Car Insurance–What coverage should I get?

Was trying to determine what is the best coverage to get for my cars. Here is what I found:

  • Buy standard 100/300/100 coverage, which pays for bodily injury up to $100,000 per person and $300,000 per accident, and property damage up to $100,000.
  • If you have a high net worth,
    • boost it to 250/500/100.
    • also take a look at a separate umbrella policy to insure against a lawsuit seeking an amount beyond the auto policy's limits.
  • Protect yourself by buying uninsured/underinsured motorist protection with the same limits as your liability coverage
  • You can probably cancel your collision and/or comprehensive coverage when the annual cost equals or exceeds 10 percent of your car's book value
  • Make sure your insurer knows about your reduced driving habits. Lower mileage normally equals lower premiums.
  • If you qualify, ask to be included in the top-tier customer group, which typically have the best premiums.

In Colorado, as of June 2011, the minimum coverage that you are expected to carry is: 25/50/15.

A good reference document is the “CONSUMER’S GUIDE TO AUTO INSURANCE” from DORA: http://www.dora.state.co.us/insurance/pb/supporting%20documents/autoins04.pdf

Consumer Reports: http://www.consumerreports.org/cro/magazine-archive/2010/october/money/car-insurance/overview/index.htm

Limit maximum memory available to Sql-Server

Here is a script that can be used to limit the maximum memory available to Sql-Server

EXEC sys.sp_configure N'max server memory (MB)', N'8192'
GO
RECONFIGURE WITH OVERRIDE
GO

Where 8192 is 8gb in the above example