Why I went back to Android from WP8

At BUILD 2012 Microsoft gave me a Nokia 920 Windows Phone.  Ever since then I’ve been using as my primary cell phone.  It has had ups and downs, but in general I enjoyed very much.

Originally, I was using a Samsung Galaxy Nexus.  That phone had served me well for many months before I switched to the Nokia.  I wanted to give the Nokia a fair shot, because I really believe that Windows Phone can succeed.  Although it was a good run, there were several things that made the switch back necessary.  Let’s start with the good things first.

The good

First, the phone is truly beautiful.  I don’t just mean well-built. I mean everything about it is truly amazingly beautiful.  The device itself, the screen, the applications, the start screen.  Everything.  It’s a joy to use.

Second, the integration with Microsoft products is a very impressive.  The office tools work very well.  Skype and Messenger are very good.  The Xbox integration is truly incredible.  Microsoft has done a very nice job of making the Windows Phone platform part of the full Windows suite of products.

Third, despite what people say, the selection of applications is very impressive.  I have yet to find more than one significant application but I need that isn’t in the window store.  The only thing I ever found that was missing was Wuala, but with the weaknesses in Java I switched to SkyDrive anyway.

The bad

Despite the fact that the user interface is very smooth, the whole phone updates very slowly.  It takes a long time to update the applications.  Text messages come in the wrong order.  E-mail takes a long time to synchronize.  In general, network activity is less than wonderful.  When the phone goes to sleep, it forgets a lot.  A lot more than it should.  Every time I wake it to use it have to wait for it to remember what network it’s on, what wifi I was using and what I was doing last.

All of those same lines, and synchronization is very weak.  Trying to get service driven applications to get new data and refresh the cache is very difficult.  If the application developer fails to give you an explicit synchronization option, you’re often out of luck. Often, I had to restart the phone to get things updated.

While there are no lack of applications in the store, developers are not keeping up with new trends.  For instance, there’s no Pebble app for the windows phone.  Windows Phone is still the last in line to get an app for a new online tool, if it ever gets one at all.  I’m not really an early adopter so this isn’t a huge deal for me, but occasionally I’d like to see some of the new stuff that’s out there.  It’s frustrating that I never seem to be able to.

One more thing.  The phone is absurdly heavy.  I know that’s a small thing but after a while it gets to you.  It’s amazing how six ounces matters. Makes my pants fall down.  Nobody needs to see that.

The ugly

The phone reboots 10 times a day.  This is a not the huge problem for me it is for some people because I am not a heavy phone user.  It can get frustrating when I sit down for short ‘break’ (you know what I mean), launch Angry Birds, and immediately get to watch the phone reboot.  Where it really becomes a problem is when some call comes in, and the phone reboots.  This happens to me least once a day.  I have more than a few uncomfortable moments having to call somebody back and explain that my phone reset.

A huge problem is the lack of S/MIME support.  There is just simply is no way to send secure email using Windows Phone.  Yes I’m aware that I could write an application for S/MIME.  But that’s not really my area of specialty in programming, and I have other things I need to write more.  It seems like S/MIME is something that should be supported out of the box on any platform these days.  I mean come on, even Windows Mobile 5 supported S/MIME.

The real nail in the coffin for me is the lack of integration with other e-mail platforms.  Many moons ago I used Microsoft’s online office tools for my business.  The product flopped, and I went to Google Apps.  I very much enjoyed using the Google product since then.  I don’t mind paying for Google Apps, I think Gmail is a fantastic product.  The spam filtering, certainly, and threaded messaging are just too good to leave.  The domain level integration, document storage, search and sharing, and ease of use are just better than anything else out there. Plus, it supports two-factor authentication.

For whatever reason, Windows Phone 8 is horrible running Google Apps. Email synchronization is awful.  Google Talk barely works at all. Notifications don’t work. None of the other applications are available.  Google has decided that they are going to beat Microsoft on at least this one thing, and this is a pretty successful way to do it.  They have not wanted to make their tools available on the windows platform and I can’t blame them.  Microsoft on the other hand has made most of the tools available on Android.  Thus if I want to use a Microsoft tool, it is probably available on the Android platform.  The reverse is not true.

Conclusion

So there you have it.  The problem is not the app store.  The problem is not the lack of the phone’s popularity.  The problem is that in making the phone easy to use and easy to develop for, they have closed the door to too much innovation and integration. It’s really easy to do the things we wanted to do yesterday, and really hard to do the things we need to do tomorrow.

I still think the Windows Phone is an excellent consumer device.  I would recommend it to anybody.  Not too many people worry about A/MIME support, or integration with their business’s Google Apps.  The application selection, games, and Microsoft integration is really very good.  The phone draws stares everywhere I use it.  But it just isn’t right for me, and I can’t make it right for me.  Therein lies the rub.

I’ll still develop for the windows phone.  I’ll still use it as a standalone device.  It just doesn’t work for me as a primary phone, and I can’t imagine that it does for anyone else with specialized needs.  Microsoft has made their decision, and they’re shooting for the 80%. Unfortunately, the 20% are the folk with loud voices.  That might be the platform’s downfall.

Windows 8 CP installation experience

Some of you may have read my dual boot setup post when Dev Preview (DP) came out. Now it is time to upgrade that rig to Consumer Preview (CP), and I through I would give an update.

The bootable USB drive I used for DP got repurposed for CP, so the laptop got booted from that. I decided to format the partition that I had used to set up dev preview, and do a fresh install of Consumer Preview. The disk tools look unchanged (since Vista, actually) and that went painlessly. So far so good.

Interesting that the license key management has been installed, anthough it is freely avainatable. The English key is DNJXJ-7XBW8-2378T-X22TX-BKG7J. Other than that the installation was the same as DP. The install took about 6 minutes on my Intel i7.

If you are using a bootable USB note that Windows won't warn you before reboot. It will go right back into the setup routine when it is finished installing. You can just turn the machine off, unplug the USB drive, and turn the machine back on to continue installation.

The best news was that is honored my dual boot that DP set up!

 I was happy about that. There are backups, and honestly I pretty much live in Windows 8 now, but it is nice to know my Windows 7 partition is still there if I need it.

It should be noted that my display driver wasn't recognized. I downloaded the NVidia display driver from Acer's site and installed it. After a reboot, I was in business - awesomesauce.

Oh, and another thing: I installed Windows 8 CP on my Asus slate Wednesday with zero problems also. It isn't a dual boot though so I didn't think it was worth a blog post. This one is a little neater.

Hope everyone is enjoying Windows 8! Now go build some apps!!

Win8 Metro Style navigation

WARNING! This is based on Developer Preview, and much has changed.

Navigation in Metro is a little fuzzy right now. Fortunately Visual Studio has a navigation template. If you click File.NewProject, and dig into the Metro JavaScript apps, then you will see the Navigation Application. It is described as a “minimal style application that uses Windows Metro style frameworks and includes navigational support.”

The Navigation Template

A look at the source that the Navigation template shows us a pretty contemporary divided-screen model.  It has div that will contain the content, and another one that has the navigation tools.

<body data-homePage="/html/homePage.html">
    <div id="contentHost"></div>
    <div id="appbar" data-win-control="WinJS.UI.AppBar" aria-label="Command Bar" data-win-options="{position:'bottom', transient:true, autoHide:0, lightDismiss:false}">
        <div class="win-left">
            <button id="home" class="win-command">
                <span class="win-commandicon win-large">xE10F;</span><span class="win-label">Home</span>
            </button>
        </div>
    </div>
</body>

The div labeled contentHost will be used to store the content that is directed there. The appbar div is of some more interest. It has a data-win-control property, which is a Metro-specific field that includes specific styles and functionality at render time.

This one is the WinJS.UI.AppBar, which is the little sliding bar that you can access in a Mero app by sweeping from the bottom. There is a 1 pixel trigger left in the bottom of all application that makes the sweep work, and the div shown here sets up the content for the bar.

Right now there is just one button in the bar. If you just click the Debug button without making any changes, you get one button that goes to one page that you already start at. Not terribly interesting.

What that AppBar is supposed to do it give you the ability to load new fragments into contentHost. You can do this with direct buttons, page numbers, or VCR style controls. Doesn’t matter, as long as the content gets loaded.

Loading the fragments is set up in default.js. Remember that weird data-homepage attribute in the body tag of the default page? Well, that’s used to set the initial page in contentHost.

WinJS.Application.onmainwindowactivated = function (e) {
        if (e.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.launch) {
            homePage = document.body.getAttribute('data-homePage');

            document.body.addEventListener('keyup', function (e) {
                if (e.altKey) {
                    if (e.keyCode === WinJS.Utilities.Key.leftArrow) {
                        WinJS.Navigation.back();
                    }
                    else if (e.keyCode === WinJS.Utilities.Key.rightArrow) {
                        WinJS.Navigation.forward();
                    }
                }
            }, false);

            WinJS.UI.process(document.getElementById('appbar'))
                .then(function () {
                    document.getElementById('home').addEventListener('click', navigateHome, false);
                });

            WinJS.Navigation.navigate(homePage);
        }
    }

After activating the app, a few keyboard events are handled, and then the WinJS.Navigation namespace is used to navigate the page to homepage.

Adding a fragment

One page is really quite boring – why would you need navigation for one piece of content, right? To make things a little more interesting let’s do something wild, like add a page, screen form, wqhatever you want to call it. From Microsoft’s perspective, it is a ‘fragment’ and it is treated like a form or page in any other paradigm.

To add a ‘page 2’ to the template application:

1) In the Solution Explorer, right click on the HTML folder and click Add | New Item…

2) In the Add New Item dialog select the HTML Fragment item and name is Page2.html.

3) After you have added the new fragment, all of the fragment files will be in the HTML folder, as of this writing. Move them into their correct folder. The CSS file goes in the CSS folder and the JS file goes in the JS folder.

4) Update the references in the Page2.html file to point to the new file locations.

<link rel="stylesheet" href="/css/Page2.css" />

<script type="ms-deferred/javascript" src="/js/Page2.js"></script>

5) Update the body content of Page2.html so that we can show some cool neato content when we get there.

<body>
    <div class="Page2 fragment">
        <header role="banner" aria-label="Header content">
            <button disabled class="win-backbutton" aria-label="Back"></button>
            <div class="titleArea">
                <h1 class="pageTitle win-title">Welcome to Page2</h1>
            </div>
        </header>
        <section role="main" aria-label="Main content">
            <p>This is my new page 2! Isn’t it cool?</</p>
        </section>
    </div>
</body>

6) In default.html, add a button that will take the user to page 2. This goes in the appbar div.

<div id="appbar" data-win-control="WinJS.UI.AppBar" aria-label="Command Bar" data-win-options="{position:'bottom', transient:true, autoHide:0, lightDismiss:false}">
    <div class="win-left">
        <button id="home" class="win-command">
            <span class="win-commandicon win-large">xE10F;</span><span class="win-label">Home</span>
        </button>
        <button id="page2" class="win-command">
            <span class="win-commandicon win-large">xE10F;</span><span class="win-label">Page2</span>
        </button>
    </div>
</div>

7) In default.js, you will need an event handler for the new button.   Add it to the process method for the appbar (it’s near the end).

WinJS.UI.process(document.getElementById('appbar'))
    .then(function () {
        document.getElementById('home').addEventListener('click', navigateHome, false);
        document.getElementById('page2').addEventListener('click', navigatePage2, false);
        });
WinJS.Navigation.navigate(homePage);

8) Hey, we need a navigatePage2 method, don’t we? Let’s add that above the process code.

function navigatePage2() {
    WinJS.Navigation.navigate("html/page2.html");
    WinJS.UI.getControl(document.getElementById('appbar')).hide();
}

That should be everything we need. Press F5 to run and (if you are on a regular machine) press Windows+Z to bring up the new appbar. Tap that neat new Page 2 button. And of course here is more to it than this. You might need to keep an array of pages in memory and provide a next/back button, or give random access via a menu. The principles are the same though. Good luck!

Referencing a custom .NET assembly from a Metro application in Windows 8

I have a project that requires use of legacy .NET application code from MetroUI. You can't just reference a .NET DLL from Metro projects (yet) but it is possible to do the reference by hand. Here is how you need to do it. I am using my MeetupApi as an example here. Note that your assembly must be COM addressible, as WinRT is aCOM based solution.

1) Create a new text file called SDKMAnifest.xml in your Documents folder, and put this content in it:

<?xml version="1.0"?>
<FileList AppliesTo="TailoredC#,TailoredVB"
    MinToolsVersion="4.0" MinVSVersion="11.0" 
    DisplayName="The Meetup.com API for .NET"> 
    <File Reference="POINT.MeetupLibrary.Dll"/> 
</FileList>

2) Make a folder at C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0\ExtensionSDKs\POINT.MeetupLibrary\1.0\

3) Copy the SDKManifest to the new directory

4) Add these directories to the 1.0 folder: \References\CommonConfiguration\neutral

5) Copy POINT.MeetupLibrary.dll to the new neutral folder.

6) In your Visual Studio project, right click on the References folder and select Add References.

7) The POINT.MeetupLibrary will show in the Windows Extension SDKs folder (you may need to restart Visual Studio)

 

You can then reference your new library with:

var MyMeeting = new POINT.MeetupLibrary.Meeting()

The Build Button

At Code and Coffee yesterday, Tim Wingfield suggested that I blog about my Build Button, so here it is.

A while back I got myself a Griffin Technologies PowerMate.  This device is designed as a multimedia controller.  Read: Volume knob.  It has six events:

  • Turn left
  • Turn right
  • Press
  • Press and hold
  • Press and turn left
  • Press and turn right

 I left the Turn left and turn right events violume for Media Player, but I set Press to be <CTRL> + <SHIFT> + B

That's right, build, baby.

So, when I get to finidh a method, I can just up and smack the button, and the project compiles.  It's quite an experience.  I used to have Press and hold set to <F5> but now I think I will have it run the unit tests since that is how I tend to develop these days.

Any, it's not a cheap thrill at $45, but I still think it is worth it.

By the by - i also have an Optimus Mini Three, which I recommend for the remarkably high geek factor.

 

Sempf's Laws


Sempf's First Law: In any system, no single effect has a single cause.
 
Sempf's Second Law: All systems can be decomposed into binary decisions.
 
Sempf's Third Law: Given the correct catalyst, all systems will accelerate descent into entropy.

How you know you were a geek in the eighties

  1. You remember when AD&D went to Second Edition, and were ticked off about it.
  2. You know the Commodore 64 bootup sequence.
  3. Wargames was your favorite movie.
  4. After watching Wargames, you dialed into Delta's system and ordered tickets to Paris.
  5. You subscribed to Dragon Magazine and Boy's Life.
  6. You listened to Dr. Demento.
  7. There are three bins of Space Legos in your basement.
  8. There are CDs in your collection that are twenty years old.
  9. You ran a BBS from your TRS 80.
  10. You remember Donkey Kong's four screens, and know who Jumpman is now.
  11. Johnny Five - scaring the SHIT outta me since 1986.
  12. There is a a Mac Classic in your basement you have been meaning to turn into a Macquarium.
  13. You know at least one method for bypassing physical copy protection on floppy disks.
  14. After the Challanger disaster, you were the one that explained to everyone exactly what happened.
  15. You still have your big fuzzy marching band hat.
  16. You have a working IBM Luggable in the basement.
  17. If you STILL jump after the phones ring because of Lawnmower Man.

Random thoughts about M

I am working on the table of contents for my new book on designing software with SQL Server Modeling, or TheModelingSystemFormerlyKnownAsOslo.  There is a lot to be shared, but TOCs are kinda boring.  I thought I would use a post to fill out any random thoughts.

I think I am going to break the book into three parts.  First, some Microsoft-centric bits about modeling in general.  Second, a detailed look at M.  Finally, we are gonna build an app.  I want to make this thing functional.  If I can't build real, usable software with it and make my life easier, then I don't want it, and I don't want you to use it.  Proves how much I think of the SQL Modeling team if I am writing a book on it, huh?

Anyway.  The tl;dr on M is that is eats examples and poops your database AND your POCOs.  If they eventually get to the point where complex examples are handles gracefully, then we might have something here.

I am still not sold on Quadrant.  They need to stop showing SQL Server table level examples.  That's.  Not.  The.  Point.  If I can't gain visibility into my AD and my file structure and my partner's accounting system, I'll just use Crystal Reports or Query Analyzer.

Most people don't understand that we have been given unprecedented access into a technology that probably won't be ready for prime time for a couple of years.  M is rough.  Quadrant is rough.  There is a lot of SCOPE work to do, not to mention a little coding.  This concept is just starting to find itself.  There are technologies that SSM depends on that haven't been built yet.  Have a little patience, people.

Now, this  Linq to M idea is a very interesting look into the thinking of the SSM team. We describe something in M.  We upload to the repository.  We can 'query' the example in C# with Linq.  Great.  Are we ever going to use M to move REAL data, rather than example data?  No?  Then how is this different from Linq to SQL?  It isn't?  Oh, OK.

Generally, though, this is something I have been saying since my "Web Design With The End in Mind" article back in 1999.  The data is the application.  If you understand the behavior of the data - which you somehow must store and business rules (or metadata) then your application is done. Skin it and go get a beer.

Wow, Shawn Wildermuth's article on Textual DSLs is really good.  Why haven't I seen this?  I thought he was just a UI geek.  Color me impressed.

Sorry this is so stream-of-consciousness.  It is late and this cough is keeping me from sleeping.

I think that SQL Server Modeling has the potential to dramatically change how Microsoft architects design software for clients.  I think it has the potential to improve design too, by making good, principled design part of the fabric rather than a documented rule.  I really, really wish they hadn't pinned it to SQL Server, but I guess I get it.  The data is the application.  Tha'ts why I have called it the Data Driven Web for fifteen years.


 

VB6, VB.NET and dynamic typing

A recent reader emailed to wax poignant about VB6, and ask about dynamic typing – among other things – in VB.NET.  although I feel that static typing has a more firmly established place than ever in software development, I commiserated with him in this response:

A lot of people agree with you.  There is even a well-established petition at http://classicvb.org/ that states these and a lot of other problems with VB.NET, and the .NET Framework in general.

However, you have to remember that VB.NET is a language, and VB6 is a program, language and framework all in one.  As I pointed out in Chapter 1, they are designed to do different things.  A lot of the things that you could do in VB6 are considered bad practice now, due to scalability and other issues, although many are coming back into vogue. 

For instance, you point out the Variant issue.  What you are saying here is that VB6 is dynamically typed and VB.NET is strongly typed.  Coding for a strongly typed system is a lot slower than for a dynamically typed system.  You will, however, have a lot fewer errors with a statically typed system because any typing issues will usually be caught at compile time.

I have always found it interesting that many community members belittle VB6 for being a 'hack' out of one side of their mouth, and then extol the speed and ease of Ruby out of the other side of their mouth, never realizing that the dynamic typing system is a common defining characteristic of both 'languages'. 

I should add that dynamic typing is coming back in VB10 (as it is in C# 4.0) with the dynamic language runtime.  Hopefully that will return some of the flexibility to the language that you are looking for.

Blocking social networking at the firewall

My current client has blocked Twitter and Live Mesh at the firewall.  At what point are organizations going to realize that social networking is beneficial to project progress?  Now, I can no longer access my network of peers (well, I "can" but they are trying to prevent me), which has already provided me with many leads, links and ideas related to making this project better.  Now I can no longer access my repository of project files, where I am getting all of my templates and reference documentation.

What is the point?  Are they trying to prevent people from wasting time?  How about blocking YouTube?  How about uninstalling Solitare?  How about not providing access to the external internet at all?  There are a lot of clericals here, and many of them are temps, so why don't you just lock everything down?  If that is too draconion, how about two firewall profiles, one for developers and another for clericals?

This fear of the Internet is remarkable in this day and age.  Watching organizations (especially government organizations) try to bridge the gap of providing free access to information and keeping the temps from surfing porn is very frustrating for me.

Who the heck is Bill Sempf?

Bill Sempf

Husband. Father. Pentester. Secure software composer. Brewer. Lockpicker. Ninja. Insurrectionist. Lumberjack. All words that have been used to describe me recently. I help people write more secure software.

Paying the bills

 

profile for Bill Sempf on Stack Exchange, a network of free, community-driven Q&A sites

INETA Community Speakers Program

EFF Member 2013

Recently played games

Month List

I spoke at

I'm speaking at Black Hat Europe