Category Archives: technology

Tablets: A Disambiguation (Part 2)

Arguably the most important factor for people buying a first tablet is price. A common theme among them is to go for a “budget” tablet. I put budget in quotes because I prefer the term cheap. Using cheap more accurately conveys both the price and the quality of the device, in most cases. CNET, among others, has posted reviews for the best “budget” tablets.

With the recent exception of the Nexus 7, my opinion of those lists is that every one of the devices fits into one of two categories: 1. pseudo-tablets or 2. crap.

Psuedo-Tablets

Pseudo-tablet is the name that I like to give to tablets that are essentially glorified e-readers, with very locked down operating systems that may or may not be based on an open OS like Android. I don’t usually consider them to be a part of the full tablet market because of their generally limited power, limited capabilities, and limited flexibility. Amazon’s Kindle Fire series does not enable access to the Google Play Store, has most of it’s storage limited to purchased content, and generally have limited processor speed, even in the higher performance HD Lines.

A lot of people will disagree with me on this, but I think it’s a very valid point. This past Christmas, I won a Kindle Fire in a drawing, and was going to give it to my 10 year old brother-in-law, but he told his parents that he’d rather have an iPod touch than the Kindle Fire. His biggest reason was that the iPod has more games – which is very true (Apple has around 750k apps, and the Amazon Market has around 50k), because the Kindle Fire is limited to the Amazon App Market.

Crap

The second category that I mentioned was crap. I recently became privileged؟ to work with a crap tablet. These are tablets that generally have terrible hardware, a crappy skinned over, bloated, or crippled version of Android, or a combination thereof. Some of them (including the one I have, see below) even seem to have good hardware – but don’t be fooled! Cheap tablets just feel cheap. Similar to how the Windows Experience Index, where the overall score is equal to the lowest score (or more well known – a chain is only as strong as its weakest link) – a cheap tablet will feel crappy if it has any crappy components. It’s like buying a Mac Pro and using an old CRT monitor, or for you non-computer people, like putting a hemi in a Volkswagen bug.

Example: The Ainol (no, seriously) Novo 7

Don’t be fooled by the fact that this tablet has a quad core processor, HDMI out, and a gig of RAM. It is bad. The display has a lower resolution than the Nexus 7, the capacitive screen is very unresponsive, it comes loaded with Chinese Anime games that can’t be uninstalled (only disabled), and it feels cheap. I admit that the “feels cheap” aspect is extremely subjective, but it really is an important factor in electronics, and I believe it’s one of the reasons that Apple and others have succeeded with solid aluminum in so many products.

The biggest drawback for me is the unresponsive screen (which, by the way, came (stock? refurb?) with a screen protector that has visible dust bubbles). Admittedly, I am not used to Android screens (aside from the Nexus 7), but I can not for the life of me maintain a drag on the screen. Trying to move an icon around on the homescreen is like trying to run up a slide.

This is not unique to the Novo 7. These complaints exist all over the place on cheap smartphones and tablets. Many of the complaints are not cite-able, because they expose themselves in long, drawn-out, how-do-I-do-this-and-why-is-it-so-hard forum threads, or frustrated family members calling you to ask why their phone dies after two hours or can’t play a certain game, or doesn’t do anything when they press a certain button.

Enter Nexus 7

The Nexus 7 is a device to behold. It is far-and-away my favorite Android tablet. I’m a big fan of the 7 inch class of tablets, and the Nexus series from Google are the crème de la crème. They include top notch hardware for the price, and get stock Android with regular updates. No other Android device can boast this, and it makes a huge difference. I’ll write more in a later post more about regular updates and platform fragmentation, but it’s worth noting that this makes a huge difference in the quality of the device experience. This is the first Android device I’ve used that felt like a finished product, and not something rushed to market. It is the exception to the rule, being the only good cheap affordable tablet, coming in at $199.

It’s Not Worth it

There are some spectacular devices on all platforms, but the cheap factor is non-trivial. The astute of you will have noticed that on the CNET list linked above (here you go, lazy), all the tablets (aside from the Nexus 7) fall into my pseudo-tablet category. I credit this to the fact that these tablets have modest-to-great hardware in all aspects, but are limited in functionality and content, which is far better than having full device openness and content, but crappy, unresponsive hardware.

Please, for the sake of your own sanity, enjoyment, and the sanity of your tech savvy niece/son/granddaughter/husband, don’t buy a tablet just because it’s cheap.

< Part 1

Sources and References:
[1]: http://148apps.biz/app-store-metrics/?mpage=appcount
[2]: http://www.theverge.com/2012/9/6/3296612/amazon-appstore-for-android-50000-app-count-september-2012

Tablets: A Disambiguation (Part 1)

In the first quarter of this year, 2013, Apple shipped 19.5 million iPads1. Samsung shipped 8.8 million, Asus 2.7 million, and Microsoft 0.9 million. With others, this means in just 3 months, almost 50 million tablets were shipped worldwide. Of this, Android comprised 56.5% of the market, iOS 39.6%, and Windows (RT and 8) 3.7%. This means that around 27 million people bought an Android tablet, and almost 20 million bought an iPad, and around 2 million people bought a Windows tablet.

There is absolutely no question that people love tablets. When the iPad was announced in January of 2010, there was a lot of hesitation from consumers, because no one really knew why they would get one. Quotes flew, varying from “it could completely replace your pc,” to “it’s just a big iPod touch!” As time passed, the iPad evolved, and competitors arose, people began to realize that tablets have lots of uses, but not necessarily in the places they thought.

I work with tablets every day, as a software developer. My company works in custom software solutions, and I also develop in-house software. This means that I am privileged to work with a wide variety of tablets (operating systems and hardware), on a wide variety of projects. I want to write (over a series of posts) my analysis, comprised of both statistics, and opinion, from the (somewhat) unique perspective of an individual who is a user, developer, and technical support rep (for family, and customers), of multiple platforms and devices, including Android (Asus, Ainol, Samsung), Windows RT (Microsoft), and iOS (Apple).

I want to debunk (or support) some of common ideas about tablets and mobile OS’s, including:

I just want to get a cheap tablet to use 2

Android is just so much more open than iOS  – iOS is so locked down 345

iOS just works 67

Android is easy to develop on 8910

There are so many [more/better] apps on [Android/iOS] 1112

Throughout this series, I’ll do some comparison of form factors – 7” class versus 10” class, comparison of operating systems, and comparison of hardware. Throughout these, I’ll cover normal day to day usage impressions, impressions as a developer, and impressions as a person in a tech support role. At the end, I’ll wrap up with some opinions and research on some of the features available (or not) on each platform, as well as some perspective on how your tablet probably causes stress and wastes time, when it could be doing the opposite. I hope you stick along for the read, because otherwise, I’ll just be wasting my time honing my writing skills and paying for hosting.

Side notes:  I realize that many of the stats about operating system include smartphones, but for the sake of my comparison, I want to stick with analysis of tablets, and stay away from phones. Many of my points directly translate or cross over into phone territory, but I want to stick to tablets because, well, I have 8 of them on my desk.

I also realize that these posts might be spam/flame-war bait, but I’m just looking to share my opinions, share some knowledge, and crush some FUD.  Haters gonna hate, etc. I encourage anyone who wants to comment to respond by writing your own post about your experiences and opinions. There are enough crappy comment (or twitter) threads arguing about Android and iOS.

Part 2 >

Sources and References:

[1]: http://www.idc.com/getdoc.jsp?containerId=prUS24093213
[2]: http://reviews.cnet.com/2733-3126_7-936-5.html
[3]: http://i.imgur.com/15LRm1j.png
[4]: http://www.zdnet.com/blog/mobile-news/apple-ios-is-tightly-closed-android-is-mostly-open/1047
[5]: http://www.pcworld.com/article/240801/amazon_kindle_fire_first_impressions_solid_but_limited.html
[6]: http://en.wikipedia.org/wiki/IOS_version_history#Major_software_bugs
[7]: http://www.businessinsider.com/ios-works-better-than-android-ben-bajarin-2011-11
[8]: http://stackoverflow.com/questions/1554099/slow-android-emulator
[9]: http://www.javasrilankansupport.com/2012/04/how-to-setup-android-application.html
[10]: http://stackoverflow.com/questions/tagged/android?sort=frequent&pagesize=15
[11]: http://readwrite.com/2013/01/30/the-data-doesnt-lie-ios-apps-are-better-quality-than-android
[12]: http://techland.time.com/2013/04/16/ios-vs-android/

Uploading a Photo as Multipart Form Data in C#

I recently posted about adding a feature to a Windows 8 app I’m working on wherein the user can select a photo from their pictures library. After they select the photo, I need to upload it to the API I’m using in order to post the picture. The API specifies:

POST /api/media [multipart] AUTHENTICATED

Multipart POST parameters:
  • caption — The caption text.
  • media — The file body itself.

This means that I need to perform an (authenticated) multipart form POST to their API with the image body as a parameter called “media” and an optional caption for the image. However, there were a few issues that I ran into: 1. One missing specification and 2. An issue with default naming of HTTPContent added to a MultipartFormDataContent object in C#.

First, I had to build up the MultipartFormDataContent, assuming that photoContents is a Stream from the file chosen by the user.

var uri = new Uri(API_URL_MEDIA);
var content = new MultipartFormDataContent();
content.Add(new StringContent(caption), "\"caption\"");
var t = new StreamContent(photoContents);
t.Headers.ContentType
    = new System.Net.Http.Headers.MediaTypeHeaderValue(contentType);
fileName = string.IsNullOrEmpty(fileName) ? "\"img.png\"" : fileName;
content.Add(t, "\"media\"", "\"" + fileName + "\"");
var response = PostBuffer(uri, content);
response.EnsureSuccessStatusCode();

If you notice that I explicitly add (escaped) quotation marks to the names of the content objects I’m adding to the MultipartFormDataContent. This was the second from above. When I didn’t explicitly add the quotation marks, the request generated had a ContentDisposition like this (from Fiddler):

Content-Disposition: form-data; name=media; filename=picture.jpg

versus:

Content-Disposition: form-data; name="media"; filename="picture.jpg"

I’m not sure if this is a standard or not. I was able to find that the quotations around the boundary parameter of Multipart request are optional according to my test, but required if the boundary starts with two dashes. I couldn’t find an RFC reference supporting that the quotes around the boundary are optional. The quotes around the parameter’s names may or may not be optional. In any case, when I added them to my request, it succeeded.

As a side note, the “filename” attribute you see was necessary for the request to succeed in the API I’m using, but was not specified in the documentation. This was the first issue above.

In the snippet above, I call PostBuffer(uri, content) which is a helper function to most the MultipartFormDataContent. Here’s what it does, to post the content:

var baseAddress = new Uri(API_URL_BASE);
var cookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
{
    // some defaults, add a header and cookie for authenticating with the API
    client.DefaultRequestHeaders.Add("User-Agent", USER_AGENT);
    client.DefaultRequestHeaders.Add("X-AvoSig", AvoSignature);
    cookieContainer.Add(baseAddress, new Cookie(COOKIE_NAME, CookieValue));
    // Post the content and return the result
    var response = client.PostAsync(uri, content);
    return response.Result;
}

Choosing a photo from the Photos library in Windows 8

I’m working on a Windows 8/RT app, and one of the pieces of functionality I needed was the ability for users to select a photo from their library and upload it (more on the uploading here). I wanted to use the built in Windows 8 photo picker (a specific type of file picker) built around the Modern style.  My app is built with the MVVM pattern, using a few different helper libraries, so I had to jump through a couple hoops in order to do it, but it wasn’t too difficult. Here’s the gist, but there was one gotcha.

// Create an OpenFilePicker starting in the pictures library, viewing thumbnails
var filePicker = new FileOpenPicker();
filePicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
filePicker.ViewMode = PickerViewMode.Thumbnail;

// Filter to include a sample subset of file types
filePicker.FileTypeFilter.Clear();
filePicker.FileTypeFilter.Add(".bmp");
filePicker.FileTypeFilter.Add(".png");
filePicker.FileTypeFilter.Add(".jpeg");
filePicker.FileTypeFilter.Add(".jpg");
// Open a stream for the selected file
StorageFile file = await filePicker.PickSingleFileAsync();

// Ensure a file was selected
if (file == null)
{
    // Get a stream of the file – I’ll use this for uploading
    var stream = await file.OpenStreamForReadAsync();
}

The gotcha was that this code is happening in a function of my viewmodel (invoked from a button command), so it’s not running on the UI thread. If you try to use the OpenFilePicker outside of the UI thread, it will fail. In order to solve this, I moved this code to its own function PickPhoto and invoked it on the UI thread:

public void AddPhoto()
{
    DispatcherHelper.CheckBeginInvokeOnUI(() => { PickPhoto(); });
}

This Dispatch Helper is definitely a big help! It’s included as a part of the MetroMVVM project which is based off the old MVVMToolkit project. Then what you get is the Modern file picker:

Product Review: Nook Simple Touch

I recently got a Nook Simple Touch (sans glow light), and, in short: I love it.

Prior to the Simple Touch, I had a Nook color, the first all-color, touch screen Nook. It was nice for a while, but it had some major flaws. First and foremost, the battery was abysmal. I couldn’t get through a few solid hours of reading without needing a charge, which was wholly unacceptable for vacations and long visits to the in-laws’. The screen was also weirdly touchy, especially with moisture – the pages would start turning sporadically and I’d have to lock the screen to stop it. The screen also attracted much more dirt and spots than other touch-screens with which I’m accustomed, namely iOS devices. It was nice about switching between content easily and quickly. The homescreen had a sort of “most recent reads” list, like the most-recently-used-app multitasking list on iOS. This made switching between multiple books extremely simple. The other great feature was it’s ability to run Dropbox, meaning dropping in files and books was painless and quick.

Upgrading to the Simple Touch was a definite improvement. I don’t miss any apps like games or social networking, as I kept those off the Nook Color, to prevent distractions from reading, in the first place. I do miss Dropbox, however; adding files requires plugging the device into a computer and dropping them on. The battery life is amazing – allowing me to get through most of a long book on a single charge.

Keep in mind that reading speed affects battery life on the Nook Color (i.e., non-epaper screens) but not on the Simple Touch (e-paper screen), because e-paper only needs battery to change the screen. So, excluding wifi and extra menu usage, the Simple Touch battery could be measured roughly by pages, instead of hours.

The Simple Touch has a touch screen, which is nice for looking up words by long-pressing the word, but for scrolling and page turning, I much rather use the hardware buttons. The buttons are well placed and easy to press, while not being too sensitive. The edge of the device is a bit sharp, but nothing uncomfortable for holding. I don’t have it in a case, and I think it’s a great size and weight. I’m a huge proponent of naked devices, not using a case or cover on my iPhone or iPad either, and the Simple Touch is great as-is.

Two negative points I have for the device: switching between multiple books can be a pain the butt. The homescreen only shows the most recent read, and to get back to anything prior (if it was saved from an SD card), you have to manually navigate to the file and load it each time – no quick access to recent files/books. The second is the “pages left in chapter” requires two taps instead of one. I’m a slow reader, so I really like to be able to quickly see how many pages are left in the chapter. On the Nook Color, I could tap once on the screen and see this info. On the Simple Touch, I have to tap on the screen, then tap “go to” to see the pages left in chapter. It seems less painful than it is, because screen loading is so slow.

I didn’t get the glow light because I’d read bad reviews about it, and figured it would just take away from the biggest feature (in my mind) – the especially long battery. I usually read with lights on anyway, meaning it wouldn’t help me much. The second biggest feature I was looking forward to is the epaper screen itself. I love to read outside, but the Nook Color was abysmal at displaying the screen (even at max brightness) when in sunlight. The Simple Touch does this fine. Text on the simple touch is crystal clear and great to read.

Overall product rating: Great. Would recommend.

Creating an Enterprise App Catalog

Motive

One of the challenges faced with developing in-house (or “enterprise”) mobile applications is deployment. For public applications, deployment is handled almost exclusively through platform app stores, like the iOS App Store or the Google Play Store. Deploying apps to employees of a single company, without making use of those stores, is a difficult problem. Android apps can be deployed just by making the apk available, but browsing, versioning and updating is still a problem.

Many companies solve this problem through the use of a Mobile Device Management (MDM) server that includes app catalog or deployment capabilities. Good Mobile Manager and AirWatch are both popular and (according to Gartner) leading platforms for MDM. My company tried out AirWatch, but ultimately decided that it was a bit too buggy and high maintenance, without much benefit.

Without going too much off topic, here’s a brief overview of what AirWatch was, and wasn’t, for us. MDM servers often provide the ability to remotely encrypt and wipe devices, install or uninstall enterprise apps, enforce usage and security policies, and other things. AirWatch did none of these things well, and some didn’t work at all due to platform limitations *AHEM*android*AHEM*. What we really needed was a way for employees to have access to our in-house developed applications. We already had some security control via our exchange server and it’s policies, and we could enforce other levels of security through the apps themselves (i.e., verifying that the device is encrypted, or has a passcode set).

Idea

I designed, proposed, and implemented a custom enterprise app catalog for my company to solve this problem. This app catalog would meet our greatest need by enabling users to download our in-house applications. It also provides us with some statistical information through basic analytics (a combination of Google Analytics and my own user-agent tracking). It also provides us with security of downloads, by authenticating users and download requests against active directory. It does not provide any remote installation/updating/uninstallation, nor any remote wiping capabilities. Some of the other features include:

  • Automatic PLIST generation for iOS over-the-air installation
  • Token based authentication for iOS over-the-air installation (which doesn’t support authentication cookies)
  • Role based app availability (beta testers, for example)
  • User-to-device tracking
  • A management UI for adding or editing users and roles
  • A management UI for adding and editing apps
  • Automatic “compatible app” views based on detection of device platform and version
  • Mobile optimization including standalone “web app” mode on iOS

Implementation

Frameworks

The app catalog I built (cleverly named “App Catalog”) is built with ASP.NET MVC 3, SQL Server, Entity Framework 4, and jQuery Mobile. Honestly, I used Entity Framework because I wanted to try it out. It ended up being extremely useful, combined with linq-to-entities. I can let my entity data model diagram speak for itself about my design.

image

Authentication and Downloading

Unauthenticated users are redirected to a login page, which accepts domain credentials and authenticates against active-directory using forms authentication. I leverage forms authentication cookies to allow users to remain signed in for 14 days.

To explain the authentication of downloads on iOS, I need to take a brief tangent here and explain how iOS OTA installation works. For more information, check out this blog post. To trigger an iOS OTA download, the link must be formatted with a special itms-services:// protocol link. When clicked, it first requests a plist file (which must be returned with the mimetype text/xml) that includes information like the app package name, version, icon url, package url, and a few other various items (this plist file can be generated by Xcode by selecting “distrubute for enterprise” when archiving an application). Then, it uses the package url to download and install the application package. All of this is invisible to the user except for the initial “foo.com would like to install ‘Bar.’ would you like to continue?” message (which occurs between the plist and package (ipa) downloads). Unfortunately, this double-bounce OTA installation does not support cookies, or at least it does not use Safari’s cookies.

Because of this, if the plist or ipa files are behind an authentication wall, the download will fail. In order to authenticate the downloads, when the link to the plist is output on the app catalog page, it is a link to an unsecured action on my controller, with the current authenticated user’s unique download token as a parameter. Then, when the action is requested, that token is authenticated and the plist file is generated from a template (this killed two birds with one stone – authenticating the plist request, while making the plist dynamically generated. Managing the plists manually is a pain, especially with the weird caching that the OTA service does). The proper icon link, file link, app name, and package name are filled in, and returned as a plist file. The package link works the same way – it’s a link to a file download action, with the token as a parameter. When the request comes to this action, the token is verified again, and the app package file is returned (with mimetype application/octet-stream).

It’s important that we go through these steps to authenticate the plist and ipa files, because our Apple Enterprise Developer license only allows employees of the company to download applications signed with our certificate. If our apps were to be vulnerable to anonymous downloads, our certificate and license could be revoked. Much of this is specific to the iOS OTA installation; for Android, the download link points to the app package download action which authenticates the token and returns the app package directly.

Site Behavior

When a user first arrives at the site, they see our company’s in-house apps that are compatible with their device. This compatibility check is done in the request. A request’s user agent is parsed for platform (Android, iOS, Windows) and version, and I use linq-to-entities to get all apps that match the platform and are compatible with their version or lower. Other views allow viewing all apps, or public apps (like recommended applications in public app stores). The apps are presented in a mobile-friendly jQuery Mobile listview with icons, titles, and descriptions, and two-tap downloads (one to confirm).

image

Because we can check for Windows, we also have some listings for common Windows applications that our teams use, and we have a special page for Windows software stored on our network, which simply displays the path to find it on the network, as opposed to a download or installation link.

iOS Supports standalone web applications and webclip (shortcut) icons, so all of these are configured. This provides a more streamlined feel to the website, almost as if it’s an installed application.

Management

I put quite a bit of effort into the management UI for the app catalog. Naturally, we needed the ability to quickly create and update applications in the catalog, without manually copying files and editing the database. There’s an editor form for uploading new icons and app package files, as well as changing any of the properties of the apps, including availability, version, name, description, and platform/platform compatibility. Likewise, there’s a user manager page, where users can be assigned to roles like “tester” or “admin.” All of these management options allow extremely low overhead for updating applications. We even have a module for our apps that checks the app catalog with it’s catalog Id for newer versions, so when a new version goes up, the user is notified right away.

Conclusion

I’m sure there are some features that I’ve missed, or features that are purposely missing that would be deal breakers for others who might need an app deployment solution. For now, it’s been working pretty well. I’ve only had one logged error in the last 3 months, and we’ve hit 200 downloads (300 if you include all of our testers’ downloads) of apps in our company, from the app catalog. I’ve very open to feedback and questions!

HFR XD 3D 1080p HD WTF

Last night I went to see The Hobbit: An Unexpected Journey in HFR XD 3D. The XD seems to just be Cinemark’s name for their new theatre style, because HFR 3D was available not in XD. In any case, we saw the movie in 3D, filmed and played at a high frame rate (HFR) of 48fps vs the usual 24.

Before seeing the movie, I was waiting in line and listening intently to the comments of viewers of the previous showing. Most of them had comments along the lines of it messed with me and it was a little weird. One woman compared the lifelike-ness to watching a soap opera.

This reminded me of my first experience with full 1080p content on a large screen. We were watching an episode of Dexter on a friend’s large tv in a small apartment. My wife didn’t like the HD, because the detail was so great that sets actually looked like sets – similar to the obvious and shoddy sets of soap operas. I remember understanding the sentiment, but I enjoyed the detail and embraced it. I appreciated the elements of high detail that enhanced the show and accepted/ignored those that may have detracted. By now, I’m very used to the super high definition, and love it. I would be very interested to see viewer reactions and sort them by “watches 1080p content at home.”

One of the comments about the HFR in The Hobbit was that it made things look unnaturally fast and jerky – particularly, the first scene, with Bilbo gathering his books. When I saw this scene, it did look a little fast, almost like it was sped up. However, another article I read mentions that the effect makes things like Bilbo putting a napkin on his shirt feel like an acid trip. This one was just ridiculous. I don’t know if there is an HFR adjustment period of sorts, but by the scene with the napkin reference (still very early in the movie), everything just kind of seemed more HD. By this I mean that it didn’t feel wrong or sped up, it just seemed to have great detail, and I liked it.

The big negative for me was not the HFR, but the 3D. I have never enjoyed 3D movies and I hope that they phase out. The HFR was only available in 3D, so we went to experience it. I won’t be doing it again. I’d be willing to pay the same 3D premium for an HFR 2D movie, but I won’t willingly see 3D movies anymore.

iOS 6 Assistive Touch

iOS 6 brought a great new accessibility feature that’s actually pretty handy for general use. The feature, called “Assistive Touch” can be enabled in Settings.app > general > accessibility. When this feature is enabled, a small dot-like button is overlayed on the screen, and can be moved and docked on any screen edge. Oddly, it doesn’t appear in device screenshots.

20120924-150539.jpg

Opening the menu by tapping the dot shows this menu. Selecting favorites shows one default: pinch.

20120924-150815.jpg

Trying this out in maps places a blue overlay line with an arrow at each end. Oddly, this doesn’t show in screenshots either.

What’s great about this is that you can now pinch-to-zoom and plane-rotate the maps, with just a thumb – still holding your phone with one hand.

Switching from AT&T to Verizon for the iPhone 5

My process of switching to Verizon for the iPhone 5 was quick and easy. I had the phone on and working in less than a minute, and it instantly switched my number over automatically. Just to break it down for anyone concerned about the process, here it is:

  1. Check your phone number port eligibility with AT&T’s Tool.
  2. Be sure you have all of your AT&T account information ready, like:
    - Account number
    - Username/Password
    - Account holder personal information
  3. Sign into an existing Verizon account and choose “Add a device” (or you can create an account and get your first device)
  4. Choose your device and plan
  5. Choose the “keep my number” option, and put in all the required information (that you should have gathered in step 2)
  6. Pay, and wait for your phone to arrive via FedEx.
  7. Open your iPhone 5, turn it on, restore from iCloud or iTunes backup (if you have either).
  8. Use your Phone.

I never once spoke with a sales rep from either company about switching my number. My line is still active on AT&T (we’re opting to keep it open until it runs out instead of dealing with cancellation fees), and I just have to talk to someone to get a new (temporary) number assigned to it.