Posts Tagged 'Mobile'

September 20, 2013

Building a Mobile App with jQuery Mobile: The Foundation

Based on conversations I've had in the past, at least half of web developers I've met have admitted to cracking open an Objective-C book at some point in their careers with high hopes of learning mobile development ... After all, who wouldn't want to create "the next big thing" for a market growing so phenomenally every year? I count myself among that majority: I've been steadily learning Objective-C over the past year, dedicating a bit of time every day, and I feel like I still lack skill-set required to create an original, complex application. Wouldn't it be great if we web developers could finally get our shot in the App Store without having to unlearn and relearn the particulars of coding a mobile application?

Luckily for us: There is!

The rock stars over at jQuery have created a framework called jQuery Mobile that allows developers to create cross-platform, responsive applications on a HTML5-based jQuery foundation. The framework allows for touch and mouse event support, so you're able to publish across multiple platforms, including iOS, Android, Blackberry, Kindle, Nook and on and on and on. If you're able to create web applications with jQuery, you can now create an awesome cross-platform app. All you have to do is create an app as if it was a dynamic HTML5 web page, and jQuery takes care of the rest.

Let's go through a real-world example to show this functionality in action. The first thing we need to do is fill in the <head> content with all of our necessary jQuery libraries:

<!DOCTYPE html>
<html>
<head>
    <title>SoftLayer Hello World!</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.2/jquery.mobile-1.3.2.min.css" />
    <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
    <script src="http://code.jquery.com/mobile/1.3.2/jquery.mobile-1.3.2.min.js"></script>
</head>

Now let's create a framework for our simplistic app in the <body> section of our page:

<body>
    <div data-role="page">
        <div data-role="header">
            <h1>My App!</h1>
        </div>
 
        <div data-role="content">
            <p>This is my application! Pretty cool, huh?</p>
        </div>
 
        <div data-role="footer">
            <h1>Bottom Footer</h1>
        </div>
 
    </div>
</body>
</html>

Even novice web developers should recognize the structure above. You have a header, content and a footer just as you would in a regular web page, but we're letting jQuery apply some "native-like" styling to those sections with the data-role attributes. This is what our simple app looks like so far: jQuery Mobile App Screenshot #1

While it's not very fancy (yet), you see that the style is well suited to the iPhone I'm using to show it off. Let's spice it up a bit and add a navigation bar. Since we want the navigation to be a part of the header section of our app, let's add an unordered list there:

<div data-role="header">
    <h1>My App!</h1>
        <div data-role="navbar">
            <ul>
                <li><a href="#home" class="ui-btn-active" data-icon="home" data-theme="b">Home</a></li>
                <li><a href="#softlayer_cool_news" data-icon="grid" data-theme="b">SL Cool News!</a></li>
                <li><a href="#softlayer_cool_stuff" data-icon="star" data-theme="b">SL Cool Stuff!</a></li>
            </ul>
        </div>
    </div>

You'll notice again that it's not much different from regular HTML. We've created a navbar div with an unordered list of menu items we'd like to add to the header: Home, SL Cool News and SL Cool Stuff. Notice in the anchor tag of each that there's an attribute called data-icon which defines which graphical icon we want to represent the navigation item. Let's have a peek at what it looks like now: jQuery Mobile App Screenshot #2

Our app isn't doing a whole lot yet, but you can see from our screenshot that the pieces are starting to come together nicely. Because we're developing our mobile app as an HTML5 app first, we're able to make quick changes and see those changes in real time from our phone's browser. Once we get the functionality we want to into our app, we can use a tool such as PhoneGap or Cordova to package our app into a ready-to-use standalone iPhone app (provided you're enrolled in the Apple Development Program, of course), or we can leave the app as-is for a very nifty mobile browser application.

In my next few blogs, I plan to expand on this topic by showing you some of the amazingly easy (and impressive) functionality available in jQuery Mobile. In the meantime, go grab a copy of jQuery Mobile and start playing around with it!

-Cassandra

August 2, 2012

Meet Memcached: A Developer's Best Friend

Whether you're new to software development or you've been a coder since the punchcard days, at some point, you've probably come across horrendous performance problems with your website or scripts. From the most advanced users — creating scripts so complex that their databases flooded with complex JOINs — to the novice users — putting SQL calls in loops — database queries can be your worst nightmare as a developer. I hate to admit it, but I've experienced some these nightmares first-hand as a result of some less-than-optimal coding practices when writing some of my own scripts. Luckily, I've learned how to use memcached to make life a little easier.

What is Memcached?

Memcached is a free and open source distributed memory object caching system that allows the developer to store any sort of data in a temporary cache for later use, so they don't have to re-query it. By using memcached, a tremendous performance load can be decreased to almost nil. One of the most noteworthy features of the system is that it doesn't cache EVERYTHING on your site/script; it only caches data that is sure to be queried often. Originally developed in 2003 by Brad Fitzpatrick to improve the site performance of LiveJournal.com, memcached has grown tremendously in popularity, with some of the worlds biggest sites — Wikipedia, Flickr, Twitter, YouTube and Craigslist — taking advantage of the functionality.

How Do I Use Memcache?

After installing the memcached library on your server (available at http://memcached.org/), it's relatively simple to get started:

<?php
  // Set up connection to Memcached
  $memcache = new Memcached();
  $memcache->connect('host', 11211) or die("Could not connect");
 
  // Connect to database here
 
  // Check the cache for your query
  $key = md5("SELECT * FROM memcached_test WHERE id=1");
  $results = $memcache->get($key);
 
  // if the data exists in the cache, get it!
  if ($results) {
      echo $results['id'];
      echo 'Got it from the cache!';
  } else {
    // data didn't exist in the cache
    $query = "SELECT * FROM memcached_test WHERE id=1");
  $results = mysql_query($query);
  $row = mysql_fetch_array($results);
  print_r($row);
 
  // though we didn't find the data this time, cache it for next time!
  $memcache->set($key, $row, TRUE, 30); 
  // Stores the result of the query for 30 seconds
  echo 'In the cache now!';
 
  }
 
?>

Querying the cache is very similar to querying any table in your database, and if that data isn't cached, you'll run a database query to get the information you're looking for, and you can add that information to the cache for the next query. If another query for the data doesn't come within 30 seconds (or whatever window you specify), memcached will clear it from the cache, and the data will be pulled from the database.

So come on developers! Support memcached and faster load times! What other tools and tricks do you use to make your applications run more efficiently?

-Cassandra

April 12, 2012

HTML5 - Compatibility for All?

Many of us remember when Flash was the "only" way to enhance user experience and create rich media interactivity. It was a bittersweet integration, though ... Many users didn't have the browser compatibility to use it, so some portion of your visitors were left in the dark. Until recently, that user base was relatively small — the purists who didn't want Flash or the people whose hardware/software couldn't support it. When Apple decided it wouldn't enable Flash on the iPhone/iPad, web developers around the world groaned. A HUGE user base (that's growing exponentially) couldn't access the rich media and interactive content.

In the last year or so, Adobe released Flash Media Server to circumvent the Apple-imposed restrictions, but the larger web community has responded with a platform that will be both compatible and phenomenally functional: HTML5.

HTML5 allows us to do things we've never been able to do before (at least without the hassle of plugins, installations and frustration). Gone are the limitations that resigned HTML to serving as a simple framework for webpages ... Now developers can push the limits of what they thought possible. As the platform has matured, some developers have even taken it upon themselves to prototype exactly where this generation of scripting is heading by creating Flash-free browser games.

Yes, you read that right: Games you can actually play on your browser, WITHOUT plugins.

From simple Pong clones that use browser windows as the paddles and ball to adventure-based Zelda-like massively multiplayer online role playing games (MMORPGs) like BrowserQuest, it's pretty unbelievable to see the tip of the iceberg of possibilities enabled by HTML5 ... Though it does seem a bit ironic to say that a Pong clone is such a great example of the potential of the HTML5 platform. Click on the screenshot below to check out BrowserQuest and tell me it doesn't amaze you:

Browser Quest

With an ingenious combination of CSS, JavaScript and HTML5, developers of BrowserQuest have been able to accomplish something that no one has ever seen (nor would ever even have thought possible). Developers are now able to generate dynamic content by injecting JavaScript into their HTML5 canvasses:

<code>
function handleKeyDown(evt){
keys[evt.keyCode] = true;
}
 
function handleKeyUp(evt){
keys[evt.keyCode] = false;
}
 
// disable vertical scrolling from arrows :)
document.onkeydown=function(){return event.keyCode!=38 &amp;&amp; event.keyCode!=40}
</code>

Look familiar? The game-making process (not syntax!) appears eerily similar to that of any other popular language. The only difference: You don't need to install this game ... You just open your browser and enjoy.

Using a popular port of Box2D, a physics simulator, making pure browser-based games is as simple as "Make. Include. Create." Here's a snippit:

<code>
//Make your canvas
<canvas id="game" width="600" height="400"></canvas>  
 
//include your js physics files
 
// create your world
function createWorld() {
// here we create our world settings for collisions
var worldAABB = new b2AABB();
worldAABB.minVertex.Set(-1000, -1000);
worldAABB.maxVertex.Set(1000, 1000);
// set gravity vector
var gravity = new b2Vec2(0, 300);
var doSleep = true;
// init our world and return its value
var world = new b2World(worldAABB, gravity, doSleep);
return world;
}
</code>

We may be a few years away from building full-scale WoW-level MMORPGs with HTML5, but I think seeing this functionality in native HTML will be a sigh of relief to those that've missed out on so much Flash goodness. While developers are building out the next generation of games and apps that will use HTML5, you can keep yourself entertained (and waste hours of time) with the HTML5 port of Angry Birds!

Angry Birds

HTML5 is not immune to some browser compatibility issues with older versions, but as it matures and becomes the standard platform for web development, we're going to see what's to come in our technology's immediate future: Pure and simple compatibility for all.

-Cassandra

November 1, 2011

SoftLayer on the iPad

Shortly after we began implementing the SoftLayer Mobile application for the iPhone and Android, Apple released the iPad. With our development resources limited, we focused on adding the functionality our customers required to the iPhone application with only a few small features added to support the new device.

As we became more familiar with the iPad, we started seeing a few key areas where SoftLayer Mobile could benefit from the large format iPad user interface. We've been able to incorporate a phenomenal feature set in the SoftLayer Mobile application, and as our desired feature set has become more and more complete, we've gotten a bit of breathing room from our iPhone releases. We used that breathing room to re-visit the iPad and what it could mean for the SoftLayer Mobile customer experience on a tablet. The result of that investigation is the SoftLayer Mobile HD application:

SL HD

As you might expect, SoftLayer Mobile HD shares quite a bit of functionality with its iPhone sibling. The application offers a window into your SoftLayer environment so that you can browse, create and edit support tickets; discover information about computing resources and bandwidth; and keep up-to-date on the latest notifications from our data centers. The iPad application also helps you keep track of financial information by allowing you to browse your account and its invoices. All this functionality benefits from the intuitive interface of the iPad. You have more room to browse, more room to edit, and fewer screens to navigate as you manage and explore your virtual SoftLayer data center.

SL HD

SL HD

Best of all: The application is only in its first release, and already shows great promise! We have plenty of room to grow and tons of ideas about the next features and functions we want to add. If you're iPad-equipped, get the SoftLayer Mobile HD application in the iTunes App Store. When you're navigating through the interface, take note of anything you'd like to see us change or add, and let us know!

-Scott

September 8, 2011

Boston Startup Scene - WebInnovatorsGroup

We love startups and entrepreneurship communities that help startups become successful. Startups are usually all about innovation and approaching existing problems in a new way ... And if you're familiar with SoftLayer's "Innovate or Die" motto, you know that we're cut from the same cloth. We've partnered with incubators like Tech Wildcatters to provide up-and-coming companies with a year of $1,000/mo hosting credits along with a little SoftLayer expertise sprinkled in for good measure, and we are happy to support community partners like non-profits and user groups where new ideas are born every day.

Given our commitment to the startup community, when we heard that a sponsorship opened up for the September 13 WebInnovatorsGroup quarterly meeting, we jumped on the chance to get involved. WebInno events are fueled by a long-standing community of Internet and mobile entrepreneurs founded by David Beisel, and while I could tell you everything I know about what they're doing in Boston, the best person to hear from is David himself:

Boston + Entrepreneurs + Technology + Beer ... It was a no-brainer for us to be a Gold Sponsor of WebInno31.

Visit WebInnovatorsGroup.com to learn more about the WebInno community or head straight to the WebInno31 registration form to reserve your spot at Royal Sonesta Cambridge on Tuesday, September 13, at 6:30pm.

-Kevin

P.S. If you have a startup community or an ongoing event like WebInno that SoftLayer can be involved with, leave a comment on this blog or let us know on Twitter: @SoftLayer

August 3, 2011

CyberlinkASP: Tech Partner Spotlight

This is a guest blog from Chris Lantrip, CEO of CyberlinkASP, an application service provider focused on hosting, upgrading and managing the industry's best software.

The DesktopLayer from CyberlinkASP

Hosted virtual desktops – SoftLayer style.

In early 2006, we were introduced to SoftLayer. In 2007, they brought us StorageLayer, and in 2009, CloudLayer. Each of those solutions met a different kind of need in the Application Service Provider (ASP) world, and by integrating those platforms into our offering, DesktopLayer was born: The on-demand anytime, anywhere virtual desktop hosted on SoftLayer and powered by CyberlinkASP.

CyberlinkASP was originally established to instantly web-enable software applications that were not online in the past. Starting off as a Citrix integration firm in the early days, we were approached by multiple independent software vendors asking us to host, manage and deliver their applications from a centralized database platform to their users across multiple geographic locations. With the robust capabilities of Citrix, we were able to revolutionize application delivery and management for several ISV's.

Over time, more ISV's starting showing up at our doorstep, and application delivery was becoming a bigger and bigger piece of our business. Our ability to provision users on a specific platform in minutes, delete them in minutes, perform updates and maintain hundreds of customers and thousands of users all at one time from a centralized platform was very attractive.

Our users began asking us, "Is it possible to put our payroll app on this platform too?" "What about Exchange and Office?" They loved the convenience of not managing the DBs for individual applications, and they obviously wanted more. Instead of providing one-off solutions for individual applications, we built the DesktopLayer, a hosted environment for virtual desktops.

We deliver a seamless and integrated user experience utilizing SoftLayer, Citrix XenApp and XenDesktop. When our users log in they see the same screen, the same applications and the same performance they received on their local machine. The Citrix experience takes over the entire desktop, and the look and feel is indistinguishable. It's exactly what they are accustomed to.

Our services always include the Microsoft suite (Exchange, Office, Sharepoint) and is available on any device, from your PC to your Mac to your iPad. To meet the needs of our customers, we also integrate all 3rd party apps and non-Microsoft software into the virtual desktop – if our customers are using Peachtree or Quickbooks for accounting and Kronos for HR, they are all seamlessly published to the users who access them, and unavailable to those that do not.

We hang our hat on our unique ability to tie all of a company's applications into one centralized user experience and support it. Our Dallas-based call center is staffed with a team of knowledgeable engineers who are always ready to help troubleshoot and can add/delete and customize new users in minutes. We take care of everything ... When someone needs help setting up a printer or they bought a new scanner, they call our helpdesk and we take it from there. Users can call us directly for support and leave the in-house IT team to focus on other areas, not desktop management.

With the revolution of cloud computing, many enterprises are trending toward the eradication of physical infrastructure in their IT environments. Every day, we see more and more demand from IT managers who want us to assume the day-to-day management of their end user's entire desktop, and over the past few years, the application stack that we deliver to each of our end users has grown significantly.

As Citrix would say "the virtual desktop revolution is here." The days of having to literally touch hundreds of devices at users' workstations are over. Servers in the back closet are gone. End users have become much more unique and mobile ... They want the same access, performance and capabilities regardless of geography. That's what we provide. DesktopLayer, with instant computing resources available from SoftLayer, is the future.

I remember someone telling me in 2006 that it was time for the data center to "grow up". It has. We now have hundreds of SMB clients and thousands of virtual desktops in the field today, and we love having a chance to share a little about how we see the IT landscape evolving. Thanks to our friends at SoftLayer, we get to tell that story and boast a little about what we're up to!

- Chris M. Lantrip, Chief Executive, CyberlinkASP

This guest blog series highlights companies in SoftLayer's Technology Partners Marketplace.
These Partners have built their businesses on the SoftLayer Platform, and we're excited for them to tell their stories. New Partners will be added to the Marketplace each month, so stay tuned for many more come.
July 7, 2011

Me and My Android

Last weekend I went to an outdoor concert where I saw a pretty decent Beatles tribute band that hails from the great state of Texas and goes by the name Me and My Monkey. The entire excursion from home to the venue and back again lasted just about six hours. I was pulling into my driveway engaged in a phone conversation with a friend about which fake Beatle was her favorite when my Android gave a strangled beep, cut us off and powered down.

At first I thought it was a glitch, but a quick attempt to turn it back on showed me otherwise. I was out of juice. My battery was drained beyond the point of no return — or at least no return without access to an electrical outlet. I wondered if I had forgotten to charge the phone the previous night. After all, I was outside with friends, food, and music all evening. My phone was snug in my pocket on standby ... Or was it?

I was the first to arrive to the venue, so I made a call to let the my freinds know I had staked us out a shady spot. After that, I fired up go sms to coordinate getting the right number of chairs, and I used it again while searching the parking lot for my friend's car to help her carry those chairs. During the Sgt. Pepper set in an attempt to settle an argument, I "Googled" which year the Beatles officially broke up (turns out it was 1970 but the break-up dragged out until 1975). Sometime between Strawberry Fields and Hello, Goodbye I got an email from the office, so I logged into my handy SoftLayer App to check on a support ticket.

During the intermission, a local radio station was piped through the sound system and someone asked me to Shazam what turned out to be a Florence and the Machine cover of a track off Abbey Road. Since my phone was at the ready, I was the point person to find out whether the chorus to I Am the Walrus really said goo goo g'joob. I didn't have a lighter on me, but my Virtual Zippo did the trick nicely during Hey Jude. And did I mention I don't wear a watch because if I just hit the power button on my spiffy smart phone ... ta-da, I get the time!

It's a funny feeling when you realize how something that didn't really exist five years ago has managed to ingrain itself so deeply into your everyday life. That's what I found myself thinking as I was drifting off to sleep Saturday night, me in my bed and my Android recharging on the night stand ... Well, that and who are the eggmen? Goo goo g'joob.

-William

Categories: 
May 27, 2011

SoftLayer Mobile - Coming of Age

The SoftLayer Mobile application allows customers to work with support tickets, examine and control servers, monitor bandwidth information and more. The application is available on two platform: Apple iOS - supporting iPhones and iPads, and the Google Android operating system - supporting mobile phones and devices from a variety of vendors.

The SoftLayer Mobile application is quickly approaching its first birthday. The application was first introduced to the world in June of 2010. Frequent visitors to this blog may remember when we introduced the iPhone application right here in the SoftLayer blog. We got back with you again when the Android application reached the milestone of 100 downloads. Our success with the application continues to this day with the both the iOS and Android versions sporting impressive download statistics which multiply those of a year ago many dozens of times over.

In the course of the past year, we've gotten some great suggestions for improvements from our customers. The first request was for the application to store account passwords a feature which we implemented quickly. From those humble beginnings we added some larger, more complex functionality based on your feedback like two-factor authentication using VeriSign Identity Protection, bandwidth charting, and the ability to check account balances and make one-time payments against those balances from your phone.

We'd love to continue that trend and hope to tap into the experience of the thousands of you who are working with the application. In the coming year, we hope to expand our existing functionality, include new features, and support both new operating systems and new devices. We'd love to hear about your ideas on how we can best improve the SoftLayer Mobile application to make it an even more valuable tool for you.

Would you like improved tracking of your bandwidth? Can we offer greater control over your server's network ports? Do you need to monitor your server's CPU usage even while you're in line at the bank? Is there one particular task that compels you to visit the SoftLayer Customer Portal time and again? If so, and if it would be convenient for you to have that information on the phone in your pocket rather than on the computer at your desk, please let us know!

To offer your suggestions, please create a support ticket in your SoftLayer account detailing your needs. Alternatively, if you are already using the SoftLayer Mobile application, drop us a line through the feedback links built into the Support section.

If you haven't been using the SoftLayer Mobile application, then we'd like to invite you to download it and explore its features. For more information, and for links and information about downloading and installing the application, visit our Mobile Application resource page.

Keep watching that page over the coming months as well. We have some exciting projects in the works and hope to share them with you very soon!

-Scott

May 3, 2011

SoftLayer's Android Client Gets an Extreme Makeover

One of the things you expect when you merge two organizations in the same vertical space is for your talent pool to get deeper. SoftLayer had a seriously talented bunch of developers before the merger - I should know, I consider myself one of them - and as I was promised would be the case, after the merger, we were joined by an equally talented group of engineers from The Planet. Where we had two low-level developers, now we have four. Where we had a dozen guys with .NET experience, now we have twenty. It's better for us employees, and better for our customers too.

What I didn't expect as part of the merger was that our talent pool would get wider. No, I don't mean we now employ an army of body builders and Siamese twins. I mean as result of the merger, we ended up with an entirely new group of folks here unlike any SL previously had on the payroll. This new and exotic breed of folks - new and exotic at least from my perspective - are collectively known as "user experience" engineers.

I admit (and I suspect most software engineers will concur) when I develop something, it becomes my baby. Each software engineer has his or her own method for inciting that spark of genius ... I start out with some ideas on a yellow pad, refine them until I can whip up an actual spec, code some unit tests and wait to see if my baby takes its first step or falls flat on its digital face. Either way, over time with gentle nudging and TLC, eventually an application grows. And like any loving parent I'm certain that my application can do no wrong.

So when I was told a "usability study" would be done on one of my babies by the user experience, team you can imagine what went through my mind. After all, I was there when the first API call succeeded. I was the one who got up in the middle of the night when the application got cranky and decided to throw an unhandled exception. Who the heck are these user interface specialist and what do they know that I don't?

In retrospect, I couldn't have been more wrong. I am a professional coder with more than a decade of experience under my belt. But I'm often more interested in how I can squeeze a few more CPU cycles out of a sub-routine than how much easier it would be for the user if I rearranged the order of the GUI's a little bit. The user interface review I received really got me thinking from a user's perspective and excited about the application in a way I hadn't been since the early days when I banged out those first few lines of code.

Two weeks ago, we released a new, radically different looking Android client. If you are a current user of the application, you've undoubtedly received an OTA update by now, and I hope you are as pleasantly surprised by the result as I am. For those of you with Android phones who have not installed the SoftLayer client, I encourage you to do so. You can get more info by visiting http://www.softlayer.com/resources/mobile-apps/.

Before I let you go, what kind of father would I be if I didn't take out my wallet and bore you to tears with pictures of my children? Without further ado, I present to you the latest and greatest Android Mobile Client:

SL Android App

SL Android App

SL Android App

SL Android App

-William

Categories: 
October 22, 2010

Microsoft Windows 7 Goes Mobile

On October 11, our friends at Microsoft unveiled what promises to be the first in a long series of devices that will be powered by the newly minted Windows Mobile 7 operating system.

From a device perspective, they look familiar to what we currently get from Apple and Google Android powered devices. Each device features a relatively large touch screen, and a number of on-board applications that let you send and receive phone calls, send email, listen to music, watch videos and browse the internet. In addition, Microsoft offers the promise of the Marketplace Hub – here you can download other applications and games to the device.

The great thing about all of this is the potential impact on SoftLayer. The success of both Apple and Google’s Android OS (which is found on a number of different vendors including HTC, LG, Lenovo, Samsung and others) is due to a lot of factors. What is certain is that one of those factors has been the birth of a developer community that feeds all sorts of wild and wonderful applications to the Apple App Store and the Android Market. It is amazing how many people will pay $2.00 to hurl a bunch of fowl at pigs…make no mistake, this is a lucrative marketplace.

It goes without saying that SoftLayer has a bunch of app developers as clients. Our ability to quickly scale combined with a network architecture that can take whatever is thrown at it makes us a great partner. Not only do we host a number of test and development environments, but we also host a number of the live applications that are getting pushed out to end users. The addition of a robust Microsoft powered device to the family means a few things for us:

  1. A number of companies will begin to work on porting games/apps to Microsoft Mobile 7. (We have already started)
  2. A new flock of developers will arrive that are focused on Microsoft Mobile 7 apps. They will start there and consider porting to Apple and Android environments if they are successful.
  3. Once the test and development work has been completed, it will be time to put those new apps in the hands of a bunch of eager consumers.

As far as I can tell, everything points to more SoftLayer! And the world needs more SoftLayer. So, on that note, let’s me take the opportunity to wish Microsoft terrific success with the new mobile OS. After all, a rising tide raises all ships!

-@quigleymar

Subscribe to mobile