RhoMobile Trending

As a partner with Motorola RhoMobile and more important for us, RhoElementsis a critical technology for us to be able to target the Motorola devices with our mobile web applications.  So it is interesting how well they are doing.

To check this out I went to Google Trends and tried a few searches.  The first one was how RhoMobile compares to some of the other frameworks for developing cross platform mobile web applications including Sencha Touch, Appclerator, JQuery Mobile, and PhoneGap. It appears that PhoneGap is running away with the show, although it requires you to compile your code to an application. RhoMobile is lagging behind.

Next I thought I’d see how RhoMobile and the related technologies including RhoElements, RhoConnect, RhoStudio, and the Motorola ET1are doing. Here it looks like RhoMobile is off to a good start, but then after the Motorola acquisition it has been fading. Probably because it is not viewed as a Motorola focused technology, which of course it is.

Finally, what about the Motorola platforms themselves, such as the ET1, MC75, MC65, MC3100, MC3000. These are the ones that we focus on the most. Here it is not quite as clear since there is a general trend of spiking on launch and slowly fading.

So what does this mean to us. Well it certainly makes me nervous after recently going through the collapse of Windows CE and .NET CF as a development platform. Overall I like the Motorola platforms and the company itself, but we must keep an eye on these trends and how they will affect our business.

ASP.Net MVC Modular Component Architecture

I have started adding a little bit more structure to our ASP.Net MVC project to start separating out the various components.  We needed to do this to create a framework that allowed multiple people to work on the application and modularize the code to make it more maintainable.

The basic architecture is to separate the various components in the web application in to the HTML and JavaScript components to reduce the coupling between them.   The HTML is moved in to Partial Views, similar to controls under Web Forms, and the JavaScript is separated in to a namespace hierarchy with separate modules for each of the components.

Partial Views

Separate the various components of the website in to partial views to allow them to be designed independently, shared between views, and to simplify the layout of the page.  This is very similar to how controls work in WebForms.

To do this, create a virtual page:

  1. Select the view directory to place the partial view, “Common” for those shared between different controllers, or in the View folder related to the controller, and select “Add->View”.
  2. Give the view a name, select “Create a partial view (.ascx)”, and “Add” the partial view.
  3. Copy the HTML layout in to the partial view.
    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
    <div id="TimedPopup" class="popup hide">
      <div class="popupHeader">
        <div class="popupTitle">Message</div>
      </div>
      <div class="TimedMessageStyle">
        <div id="TimedMessageText"></div>
      </div>
    </div>
  4. Insert the Partial View in to the Views where it is needed.
       <% Html.RenderPartial("TimedPopup"); %>

Create the Namespace

Namespaces can be used to separate the code in to different separate blocks to avoid naming conflicts.

The namespaces that I we are using for our project is:

  • S1S: Root namespace for all code
  • UI: User interface code
  • <component>: The individual component code
  1. Define the namespace
    For this component the namespace will be “S1S.UI.TimedPopup”
  2. Add the component to the directory tree
    The scripts directory is segmented in to a hierarchy that maps to the namespace.  Add the component under the appropriate directory.  In this case add “TimedPopup.js” to “~/Scripts/S1S/UI”.
  3. Add the namespace setup to the javascript file
    Create the appropriate variables, being careful not to destroy previous objects.

    if (typeof S1S == "undefined" || !S1S) {
    S1S = {};
    }
    if (typeof S1S.UI == "undefined" || !S1S.UI) {
    S1S.UI = {};
    }

 Create the Component Module

  1. Now create a module for the actual logic for the component.  Use a basic module based on the following format:
    S1S.UI.TimedPopup = (function() {
     
      // Private Stuff Here
     
      return {
        // Public Stuff Here 
        Display: function(message) {
        }
      }
    } ());
  2. Implement the component functionality
    Finally implement the component functionality encapsulating the functionality in the module.  For instance you could have a private event handler:

    S1S.UI.Error = (function() {
      /* Close the Popup */
      var onOK = function() {
        $('#ErrorMessage').hide();
        $('#blanket').hide();
      };
     
      return {
        /* Display the Popup */
        Display: function(errorText) {
          // stuff
          $('#OK').one("click", onOK);
          }
        }
    } ());
  3. Use the Component
    To use the component, first add the JavaScript file to the view:

    <script src="<%= Url.Content("~/Scripts/S1S/UI/TimedPopup.js") %>" type="text/javascript"></script>

    and call the method as required:

    S1S.UI.TimedPopup.Display("Item successfully added!");

IIS Debugging Terminated

When debugging web applications I often get distracted or busy working on understanding a problem and after 90 seconds get the message.
The web server process that was being debugged has been terminated by Internet Information Services (IIS). This can be avoided by configuring Application Pool ping settings in IIS.  See help for further detailsThis is caused by IIS monitoring and shutting down unresponsive processes.  The default is 90 seconds, but when debugging it is easy to exceed this time and get the above message.

The simple solution is to disable ping in IIS Advanced settings for the application poll.  This is done by setting “Ping Enabled” to false.  You can also increase the timeout to a longer interval with “Ping Maximum Response Time”.

Motorola Certified Technical Associate

Over the last couple of days I needed to get a bunch of Motorola certifications so that I could be a Motorola Certified Technical Associate.  So despite the 22 years I have spent developing mobile applications, it takes a test to prove I’m competent.

So now that I’ve earned them, here they are.  The Motorola Certification Wall of Fame:

 

All this now makes me a certified Mobile Computing Technical Associate.

 

Basic SOAP WebMethod Load Testing with soapUI/loadUI

Download the latest release from soapUI.org.  I chose the Windows 64-bit installer (no JRE).  Also include loadUI.

Step 1: Create a New Soap Project

Give the project a name and provide the WSDL and select “Create sample requests for all operations” and  “Create a TestSuite for the exported WSDL or WADL“.

Step 2:Generate the TestSuite

Just accept the defaults and add the option to Generate LoadTests.

And accept the default TestSuite name.

A second prompt for generating another TestSuite will be present, you can cancel this, it is the Soap 1.2 version of the tests.

Step 3: Create a Test Case

Navigate to the Test Case you would like to create, e.g. SetParameters TestCase.  The Default Request Schema fills in the full schema.  Edit this with the correct parameters and run the request.

Next create the assertion to validate the test case with the Add Assertion Icon .  From the option select an XPath Assertion.

To match a value using XPath you first need to declare the namespace and then use XPath to specify the node to match.  Here is a quick reference for XPath Syntax.   In this case:

declare namespace xmlns="http://snapRETAIL.steponesystems.com/"
//xmlns:ResultMessage

with the expected Result:

SUCCESS

Step 4: Run the Load Test

Now select the LoadTest and run the test.

 

All Windows File Shares Broken

Problem: Can not access ANY file shares in the network. Even machine to machine.

Found some NS log errors in event viewer

Computer not able to logon to the domain:

This computer was not able to set up a secure session with a domain controller in domain [DOMAIN] due to the following:
There are currently no logon servers available to service the logon request.
This may lead to authentication problems. Make sure that this computer is connected to the network. If the problem persists, please contact your domain administrator.

Group Policy Failed:

The processing of Group Policy failed. Windows could not resolve the user name. This could be caused by one of more of the following:
a) Name Resolution failure on the current domain controller.
b) Active Directory Replication Latency (an account created on another domain controller has not replicated to the current domain controller).

NtpClient unable to get the time for the domain:

NtpClient was unable to set a domain peer to use as a time source because of discovery error. NtpClient will try again in 3473457 minutes and double the reattempt interval thereafter. The error was: The entry is not found. (0x800706E1)

Checked the domain controller (WS2003) and it has a mouse pointer and a gray screen.

Tried to reboot the server.  Ctrl+Alt+Del – nothing, Hard reboot – success.

System rebooted and now able to connect to file shares.  Started looking at logs and got a message “Automatic Updates – Updating your computer is almost complete.  Your computer needs to be restarted for the updates to take effect.”

On the domain controller I found that it had started doing a windows update the previous night.  And also this message from the previous night.

This computer could not authenticate with \\[Server], a Windows domain controller for domain [Domain], and therefore this computer might deny logon requests. This inability to authenticate might be caused by another computer on the same network using the same name or the password for this computer account is not recognized. If this message appears again, contact your system administrator.

And this one too:

This computer is configured to be the primary domain controller of its domain. However, the computer EXTSERVER is currently claiming to be the primary domain controller of the domain.

And:

The browser has forced an election on network \Device\NetBT_Tcpip_{DC2707B3-885D-4F87-9FB1-A844145E5013} because the Domain Controller (or Server) has changed its role.

Synology Diskstation:

The Synology Server is still not authenticating correctly.  Rebooted cleared that up, perhaps getting a new, good, connection to the windows authentication server.

Canon MP980 Printer Head Cleaning

I’ve been having some problems with my Canon MP980.  First the black was sketchy and wouldn’t pass the grid tests.  After lots of head cleanings, it finally was working.  Then about a month later, the Cyan was faded (which came back) and the Black would print for a page and then get lighter and lighter, eventually not printing at all.  So after a little internet research I decided to give cleaning the printer heads a go.

The best article I found was an answer to My printer does not print light magenta. (Canon MP220 – CL-38).  It references another extended discussion on whirlpoll, Print Head Cleaning Canon MP980 which has even more information.

Step 1: Remove the Ink Cartridges

Open the printer and remove the ink cartridges.  Place them in a zip lock bag so they don’t dry out.

Step 2: Remove the Print Head.

Lift the Gray Lever up, grab the print head firmly and pull out under the gray lever.

The print head is now removed.

Step 3: Clean the print head with warm water

Run warm water gently  through the ink jet ports.  Ink will come pouring out the bottom.  Turn to spray the bottom and sides as well.  Do a final rinse with polarized water to get rid of any minerals.

Step 4: Wait for the Print Head to Dry Thoroughly

Set everything aside until the print head is thoroughly dry to prevent any damage to the electronics.  This will take a while to get everything dry.

Step 5: Reassembly

Put the print head back in to the printer, insert the cartridges and test the printer.

 

Mobile Safari Home Icon – Unable to Launch App

As part of one of our web applications, we launch a separate iOS payment application on the handheld, process the payment, and then returns to the web application.  This is done by calling a special URL to launch the application with the format “app://StartPage/…”.

On Mobile Safari, everything works fine regardless of how the launch URL is opened.  It works through all of the normal methods:

  • window.open(url)
  • window.location.href = url,
  • As a link: <a href=”hybridpins1s1test:/StartPage/…”/>

However, If we do the same thing when the application was launched from a “Home Icon”, it only works if we use a link.  The other methods give an error “Cannot Open App, … The URL can’t be shown”.  This is apparently related to the popup blocker.

I found this on Stack OverFlow, Open External Website/Address From Sencha Touch Application,  to fake launching from a link.  It was originally from a post on the Sencha site: window.open() from toolbar button opens window, from list item a new tab??.

Ext.util.openLink = function(href) { 
  var link = document.createElement('a');
  link.setAttribute('href', href);
  link.setAttribute('target','_blank');
  var clickevent = document.createEvent('Event');
  clickevent.initEvent('click', true, false);
  link.dispatchEvent(clickevent);
 return false;
}

 

VS2008 Multiple Web Projects Launch on Debug

In one of our VS2008 Solutions we have 17 web projects.  Each time you try to debug one of them they all launch an instance of the ASP.NET Development Server even though I only want to debug one of them.

To avoid having them all launch, set the project property “Always Start When Debugging” to False.  This prevents the project from launching when another project is started.  From SO: How can I stop Visual Studio running all my web services.

Note that this setting is actually store in the user project file which we don’t check in, so it must be reset each time the project is checked out.   But at least you can select all of the web projects and toggle them in one shot.

<AlwaysStartWebServerOnDebug>True</AlwaysStartWebServerOnDebug>

If you do actually want multiple projects to run at startup you can configure this with the solution property.  See also:  Tips & Tricks: Start-Up Options and Instances of ASP.Net Development Server in a Multi-project Solution.

AppleSyncNotifier – Entry Point Not Found (SQLite3.dll)

On boot up of my Window 7 Laptop I’ve been getting the “AppleSyncNotifier.exe – Entry Point Not Found” error with the text “The procedure entry point sqlite3_wal_checkpoint could not be located in the dynamic link library SQLite3.dll.”

Fortunately I found the fix on How to Geek: How to Fix the “AppleSyncNotifier.exe Entry Point Not Found” Error.  Worked great!!!