Tuesday, February 23, 2010

How the IPad Fits Into IT

This is a very interesting blog post on PCWorld by John Welch of Macworld.com.

How the iPad Fits Into IT


How do you think the iPad will fit into enterprise IT?


Posted using ShareThis

Friday, February 12, 2010

Device Management for Google Sync


On Wednesday February 3, Google announced support for basic corporate policy enforcement across a range of mobile devices. Administrators may apply these policies to Windows Mobile, Nokia, and iPhone devices, all of which are Exchange ActiveSync enabled. This is a good move by the Google Apps team and brings them one step closer to parity with myriad Exchange hosters. While, in my biased opinion, this capability does not constitute an enterprise class device management solution, I do think that the recognition that organizations want to connect mobile devices to enterprise IT services means that Google is listening to their customers. It also means that Google Apps is becoming more applicable to a wider variety of users, and end-points. These administrative controls, as Google calls them, allow Google Apps admins to set password policies for mobile devices connecting in via Google Sync. An admin can also remotely wipe a mobile device in case it is lost or stolen. Both of these features are critical security measures for enterprises leveraging mobile technology. An interesting omission in all of this however is lack of support for Google's own Android. I imagine Google will remedy this over time, either by adding deeper support for Exchange ActiveSync to the Android platform, including support for security policies, or by some Google proprietary method.

Monday, January 25, 2010

Android Accelerometer and Orientation Example

Following is an example of how to use the Android accelerometer and orientation API’s. This example is based on Frank Ableson’s “Tapping into Android’s sensors” article over at IBM DeveloperWorks. I’ve made a change to the UI to use the Android TableView and implemented it as a Resource.

To get going, all you need to do is
  1. Create a new Android project 
  2. Replace the contents of main.xml with the xml in this sample 
  3. Replace the contents of your Activity class with the code in this sample

    Following is the new main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:stretchColumns="1">

        <TableRow>
            <TextView
                android:id="@+id/accelerometer_label"
                android:layout_column="1"
                android:text="Accelerometer"
                android:textSize="9pt"
                android:padding="3dip" />
        </TableRow>
      
        <TableRow>
            <TextView
                android:id="@+id/accel_x_label"
                android:layout_column="1"
                android:text="X:"
                android:textSize="8pt"
                android:padding="3dip" />
            <TextView
                android:id="@+id/accel_x_value"
                android:gravity="right"
                android:textSize="8pt"
                android:padding="3dip" />
        </TableRow>

        <TableRow>
            <TextView
                android:id="@+id/accel_y_label"
                android:layout_column="1"
                android:text="Y:"
                android:textSize="8pt"
                android:padding="3dip" />
            <TextView
                android:id="@+id/accel_y_value"
                android:gravity="right"
                android:textSize="8pt"
                android:padding="3dip" />
        </TableRow>

        <TableRow>
            <TextView
                android:id="@+id/accel_z_label"
                android:layout_column="1"
                android:text="Z:"
                android:textSize="8pt"
                android:padding="3dip" />
            <TextView
                android:id="@+id/accel_z_value"
                android:gravity="right"
                android:textSize="8pt"
                android:padding="3dip" />
        </TableRow>

        <View
            android:layout_height="2dip"
            android:background="#FF909090" />
          
    <TableRow>
            <TextView
                android:id="@+id/orientation_label"
                android:layout_column="1"
                android:text="Orientation"
                android:textSize="9pt"
                android:padding="3dip" />
        </TableRow>
      
        <TableRow>
            <TextView
                android:id="@+id/orient_x_label"
                android:layout_column="1"
                android:text="X:"
                android:textSize="8pt"
                android:padding="3dip" />
            <TextView
                android:id="@+id/orient_x_value"
                android:gravity="right"
                android:textSize="8pt"
                android:padding="3dip" />
        </TableRow>

        <TableRow>
            <TextView
                android:id="@+id/orient_y_label"
                android:layout_column="1"
                android:text="Y:"
                android:textSize="8pt"
                android:padding="3dip" />
            <TextView
                android:id="@+id/orient_y_value"
                android:gravity="right"
                android:textSize="8pt"
                android:padding="3dip" />
        </TableRow>

        <TableRow>
            <TextView
                android:id="@+id/orient_z_label"
                android:layout_column="1"
                android:text="Z:"
                android:textSize="8pt"
                android:padding="3dip" />
            <TextView
                android:id="@+id/orient_z_value"
                android:gravity="right"
                android:textSize="8pt"
                android:padding="3dip" />
        </TableRow>

    </TableLayout>





    Following is the new Android Activity Java class

    package com.blogspot.mobilestrategist;



    import com.blogspot.mobilestrategist.R;

    import android.app.Activity;
    import android.hardware.Sensor;
    import android.hardware.SensorEvent;
    import android.hardware.SensorEventListener;
    import android.hardware.SensorManager;
    import android.os.Bundle;
    import android.widget.TextView;

    public class AccelOrientExample extends Activity implements SensorEventListener {
    // Accelerometer X, Y, and Z values
    private TextView accelXValue;
    private TextView accelYValue;
    private TextView accelZValue;
    // Orientation X, Y, and Z values
    private TextView orientXValue;
    private TextView orientYValue;
    private TextView orientZValue;
    private SensorManager sensorManager = null;
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // Get a reference to a SensorManager
            sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
            setContentView(R.layout.main);
          
            // Capture accelerometer related view elements
            accelXValue = (TextView) findViewById(R.id.accel_x_value);
            accelYValue = (TextView) findViewById(R.id.accel_y_value);
            accelZValue = (TextView) findViewById(R.id.accel_z_value);
          
            // Capture orientation related view elements
            orientXValue = (TextView) findViewById(R.id.orient_x_value);
            orientYValue = (TextView) findViewById(R.id.orient_y_value);
            orientZValue = (TextView) findViewById(R.id.orient_z_value);
          
            // Initialize accelerometer related view elements
            accelXValue.setText("0.00");
            accelYValue.setText("0.00");
            accelZValue.setText("0.00");
          
            // Initialize orientation related view elements
            orientXValue.setText("0.00");
            orientYValue.setText("0.00");
            orientZValue.setText("0.00");      
        }
      
        // This method will update the UI on new sensor events
        public void onSensorChanged(SensorEvent sensorEvent) {
        synchronized (this) {
        if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
        accelXValue.setText(Float.toString(sensorEvent.values[0]));
        accelYValue.setText(Float.toString(sensorEvent.values[1]));
        accelZValue.setText(Float.toString(sensorEvent.values[2]));    
        }
        
        if (sensorEvent.sensor.getType() == Sensor.TYPE_ORIENTATION) {
        orientXValue.setText(Float.toString(sensorEvent.values[0]));
        orientYValue.setText(Float.toString(sensorEvent.values[1]));
        orientZValue.setText(Float.toString(sensorEvent.values[2]));    
        }
        }
        }
      
        // I've chosen to not implement this method
        public void onAccuracyChanged(Sensor arg0, int arg1) {
    // TODO Auto-generated method stub
    }
      
        @Override
        protected void onResume() {
        super.onResume();
        // Register this class as a listener for the accelerometer sensor
        sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
        // ...and the orientation sensor
        sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_NORMAL);
        }
      
        @Override
        protected void onStop() {
        // Unregister the listener
        sensorManager.unregisterListener(this);
        super.onStop();
        }
    }

    Android in the Enterprise: A Roadmap: Phase 1

    There has been a lot of discussion recently regarding Google's Nexus One and whether or not it is a suitable device for enterprise use. Instead of answering that question directly, I will discuss the broad requirements that most enterprises must satisfy before allowing mobile devices to connect to IT services.

    Mobile devices must be able to connect to enterprise messaging systems. Though the best mobile platforms have moved beyond being just messaging tools, email is still the killer application for mobile devices and support for enterprise messaging systems should be a core part of any enterprise grade mobile platform. To be specific, deep support for Exchange ActiveSync (EAS) is required. EAS is becoming the de-facto standard for syncing email and personal information manager (PIM) data to mobile devices, and is supported by Lotus Domino, Google Sync, and others in addition to Microsoft Exchange. The EAS protocol even supports pushing security policies to the device over the air.

    Many of the articles and blogs around the topic of Android in the enterprise have focused on the inherit ability of the phone to be secured and managed by enterprise IT. Google has designed a security architecture for Android that is focused on ensuring that applications running on the platform adhere to specific security policies that govern access to private user data, data owned by other applications, and device resources such as network access, Bluetooth access, etc. You can read more about the Android security model here.

    This security model, however necessary, solves a qualitatively different problem than the security burden placed on IT personnel charged with implementing a mobility solution for their organizations.
    Enterprise IT's primary mobile related security threat is physical loss of the device. Therefore a robust device loss protection (DLP) solution is required to address this problem. At minimum, most sophisticated IT organizations require that mobile device platforms provide the following capabilities before being allowed to access enterprise resources:
    • Device Lock, i.e. a PIN or alphanumeric password is required to unlock the device
    • Data-at-rest encryption for all sensitive corporate data and in some cases personal data
    • Remote wipe capability, i.e. a remote wipe command sent via an IT administrative console to destroy data in the event of device loss
    • Local wipe policies, to destroy data after a given number of failed unlock attempts--i.e. Enter a PIN five times, the device automatically wipes all data
    • A mechanism to ingest a security policy configurations from a mobility management system

    Here I'll propose a simplified hypothetical Phase 1 roadmap for the Nexus One, and Android writ large, to become an enterprise class mobile platform.

    Support for Exchange ActiveSync

    Exchange ActiveSync is supported by most major mobile OS platforms, including iPhone OS, Windows Mobile, Symbian, and the Palm's webOS. Some Android handsets do support EAS, but those have tended to be handset vendor specific implementations, namely from HTC and Motorola. The Android platform itself is behind the curve here and should accelerate investment in EAS as a core platform capability.

    • Exchange ActiveSync 2.5 and 12.1 and later
    • Email Sync
    • Contacts Sync
    • Calendar Sync
    ◦ Ability to accept meetings
    ◦ Ability to Schedule meetings and send invites
    • Security Policies: PIN, Encryption, Remote and Local Wipe


    Device Loss Protection

    Device loss is, at this time, the top mobile computing security threat faced by enterprise IT organizations. Therefore device loss protection mechanisms should be a core component of a comprehensive security model built into enterprise class mobile computing platforms.

    • A robust PIN and/or alphanumeric device lock facility to prevent unauthorized access to the device itself
    • Robust and transparent data-at-rest encryption
    ◦ Fast, seamless
    ◦ Multiple entropy, e.g. user's PIN as entropy, with PIN caching to allow for background sync while the device is locked
    • Remote wipe: respond to remote wipe commands
    • Local wipe capabilities
    ◦ Based on number of failed password attempts

    In a follow on post, I'll propose an extension to the roadmap to include device management, and enterprise integration.

    Tuesday, September 15, 2009

    MonoTouch for iPhone

    According to Yahoo! Tech News, Novell is bringing .NET application development to the iPhone in the form of MonoTouch. Is this blasphemy or will it bring a new slew of application developers to the iPhone?

    According to Novell “MonoTouch allows developers to create C# and .NET based applications that run on the iPhone and can take advantage of the iPhone APIs…”

    The advantages of a tool like this are probably obvious to ISV’s (independent software vendors) as well as IT shops that develop applications for their own internal users. Some developers have avoided entering the fray of iPhone development because the development environment is unfamiliar to them. You have to buy a Mac, learn Xcode, and learn Objective-C. Learning Objective-C may be the most onerous to IT managers who just want to get an app built without having to spin up their programmers on yet another language and development environment. Or, in some cases, hiring new developers or outsourcing to a specialized iPhone development shop.

    Developing in C# in a .NET environment on the other hand is quite familiar to many organizations. In fact, many enterprises have built their own sophisticated back-ends for a wide variety of systems in the .NET environment and therefore already have those skills in house.

    In addition, the .NET environment offers a very rich set of libraries, which may not even be found in Apple’s native iPhone development kit. Building your iPhone app in .NET should also foster some reuse of code you’ve already developed for other related systems.

    I’m not going to argue the merits of .NET vs. Xcode/Objective-C/native code here. That’s too much of a religious battle, but there will likely be some disadvantages to the MonoTouch toolkit as compared to Apple’s way of developing apps.

    For example, as new API’s and bug fixes are introduced by Apple, MonoTouch will lag behind a bit in terms of responding to those changes and implementing the appropriate bindings for those new and enhanced capabilities. If you’re at all familiar with trying to run Silverlight based web apps on Mono’s Moonlight, then you get the idea. In addition, like any software package, MonoTouch will have bugs of its own to sort out. There is also a question of how easy it will be to debug apps built using MonoTouch on either the iPhone emulator or a real device.

    All in all though, MonoTouch is an interesting product on the surface and probably worth a look, unless you already have a staff of experienced iPhone developers.

    If any of you are already using the MonoTouch toolkit, I’d love to read about your experiences with it.

    Thursday, June 25, 2009

    How to Remove a Provisioning Profile from iTunes on Windows XP

    If you are developing and testing applications for the iPhone, you may occasionally need to remove an old or obsolete provisioning profile from iPhones in a test or pilot environment. While this is straightforward, the problem is that the profile is reinstalled on the iPhone the next time your users sync with iTunes. The way to work around this problem is to remove the provisioning profile from iTunes as well. While this is not difficult, there is no obvious way to do this from iTunes. Therefore, I thought I’d post some instructions on how to do just this. Here I’ll describe how to remove a provisioning profile from iTunes on a Windows XP machine, as well as how to remove it from the phone.

    Step 1

    Ensure that your iPhone is not connected to your PC (you’ll connect and sync later).

    If iTunes is running, close it.

    Step 2
    Delete the provisioning profile from your PC
    1. Navigate to: C:\Documents and Settings\Application Data\Apple Computer\MobileDevice\ Note that Application Data may be a hidden folder.
    2. Delete the provisioning profile
    Step 3

    Remove the provisioning profile from your iPhone
    1. Go to Settings -> General we
    2. Scroll down to Profiles
    3. Tap the profile you wish to remove
    4. Tap the red Remove button, a confirmation dialog will appear
    5. Tap Remove to dismiss the dialog and remove the provisioning profile
    6. You will be returned to Settings -> General
    There. You’re done and the profile is gone.

    Tuesday, June 9, 2009

    WWDC Day 2 Session: Integrating iPhone into the Enterprise

    This session centered on deploying iPhone 3.0 into the enterprise.
    It’s about 8:40AM PDT, and I’m in the Mission room waiting for the Integrating iPhone into the Enterprise session to begin. Apple is blasting Lady Gaga and Pink through the PA system. It’s kind of like a Top 40 dance club vibe, sans drinks.
    This particular session, as well as some others I’ll attend later, is geared towards enterprise IT pros more so than iPhone programmers.
    Following is Apple’s description of the session. “iPhone has become a leading choice for mobile professionals. Find out about configuring and deploying iPhone in your organization, learn tools and techniques for configuration and deployment of native and web-based iPhone applications, and discover how server-side technologies integrate with iPhone, all from the IT professional's perspective.”
    It’s now 8:57AM PDT and Apple’s playing the Ting Tings.
    There’s no window to jump out of, so I guess I’ll just tough it out.
    Presenter: John Wright, Core OS Software Engineering
    Apple considers the iPhone a new mobile business platform
    JD Power Associates – iPhone Manufacturer Apple Ranks Highest in Business Wireless Smartphone Customer Satisfaction (old news)
    Some of the New Security and Networking Oriented Features of iPhone 3.0
    • Certificate based authentication to Exchange.
    • New EAS policies (still no specific details, but I do know that Allow Camera (true/false) is one of them)
    • LDAP Support: ability to specify LDAP search paths. This allows users to query the corporate LDAP server directly through the Contacts app on the iPhone. This should be most applicable to non-Exchange environments
    • VPN On Demand.
    • Proxy support for VPNs (no specific details on this yet)
    • Wi-Fi Configuration
      • Captive network support
    • Extensions to configuration profiles
      • Should now support restrictions
      • Should now be able to prevent the end user from deleting a config profile from the phone.
    • Support for SCEP

    ShareThis