Archive for the ‘Mobile Software’ Category

Monetate renews contract with men’s apparel retailer

Monetate, a vendor of choice for testing, targeting, and personalization for eCommerce websites, announced today the renewal of its contract with Casual Male Retail Group, the largest retailer of big and tall men’s apparel with operations throughout the United States, Canada and Europe.

“Monetate is delighted that Casual Male Retail Group chose to renew its contract going into the 2010 holiday season,” said David Brussin, Founder and CEO of Monetate. “We feel this is a vote of confidence in the performance and reliability of Monetate’s marketing technology as well as the quality of our client support services.”

According to Ric Della Bernarda, Chief Marketing Officer and Senior Vice President of Casual Male Retail Group, “Monetate continues to drive incremental revenue for us because of the exceptional testing and targeting features that it provides; with Monetate on our websites we have the ability to deliver relevant and personalized content to all of our visitors, throughout their online shopping experience.”

Casual Male Retail Group, Inc. is the largest retailer of big and tall men’s apparel with operations throughout the United States, Canada and Europe. Casual Male Retail Group, Inc. operates 454 Casual Male XL retail and outlet stores, 19 Rochester Clothing stores, 4 Destination XL stores and direct to consumer businesses which include several catalogs and eCommerce sites.


Phone Number Fixer for Android

One of the curses of working with computers is that you often become The IT person for friends and family. In fact, I should get a commission from Apple for all of the business I’ve sent their way by getting family members to switch to Mac computers. Ditto for the Firefox browser. I can’t make people switch to Mac, after all that’s often an expensive proposition, but it’s long been a condition of my help that you never even think about using IE. For some of my less computer savvy relatives, I’ve learned to make IE disappear. This just made my life a lot easier (less things to fix) especially back in the heady days of weekly IE6/ActiveX exploits. Anyways… These days most folks, including friends and family, mostly use web applications and since I’ve had them on Firefox for a long time now, there aren’t too many problems. However, recently I got an unusual request for help from a high school friend Maria.

She had just switched to a Nexus One — a phone that she seemed to be extremely happy with. She had imported several contacts from her SIM card that had been in her old phone. The only problem was that for these contacts, their phone number was classified as “Other.” That would not be a big deal, but when she would try to send a text to a number, Android’s auto-complete would not include these “Other” phone numbers as part of its search domain. So she would have to completely type out the number to send the text to — which kind of defeats the purpose of having an address book on your phone. She could manually change each of these phone numbers to be of type “Mobile”, and this would solve the problem for that number. However as you might guess, she had a lot of numbers and changing each manually would be painful to say the least. And that’s where I come in…

This sounded like an easy enough problem to solve. Find all of the numbers that were of type “Other” and change them to “Mobile.” That might not work for everyone — there might be some people who really want to classify some phone numbers as “Other” — but it certainly worked for Maria (and I would guess most people, too.) So I cooked up a quick little app. First, I wanted to display all of the numbers that this was going to affect:

ContentResolver resolver = getContentResolver();String[] fields = new String[]{People._ID, People.NAME};Cursor cursor = resolver.query(People.CONTENT_URI, fields, null, null, People.NAME);LinkedHashMap<Integer, String> people = new LinkedHashMap<Integer,String>();int id = cursor.getColumnIndex(People._ID);int nameCol = cursor.getColumnIndex(People.NAME);if (cursor.moveToFirst()){ do{  people.put(cursor.getInt(id), cursor.getString(nameCol)); }while (cursor.moveToNext());}cursor.close();

This gives you a LinkedHashMap whose keys are the IDs of each contact, and whose values are the names of the contacts. Why did I bother with these two bits of info? Well, we need the contacts to query the phones, and I wanted something friendly to display to Maria so she knew which numbers were about to get “fixed”. Anyways, now it was easy to query the phones:

ArrayList<String> data = new ArrayList&kt;String>();StringBuilder sb = new StringBuilder();String[] projection = new String[]{Phones.DISPLAY_NAME, Phones.NUMBER, Phones._ID};Uri personUri = null;Uri phonesUri = null;int displayName = 0;int number = 1;int phoneIdCol = 2;int phoneId = -1;int cnt = 0;for (int personId : people.keySet()){ personUri = ContentUris.withAppendedId(People.CONTENT_URI, personId); phonesUri = Uri.withAppendedPath(personUri,             People.Phones.CONTENT_DIRECTORY); cursor = resolver.query(phonesUri, projection,             Phones.TYPE + "=" + Phones.TYPE_OTHER, null, null); displayName = cursor.getColumnIndex(Phones.DISPLAY_NAME); number = cursor.getColumnIndex(Phones.NUMBER); phoneIdCol = cursor.getColumnIndex(Phones._ID); if (cursor.moveToFirst()){  do {   sb.setLength(0);   sb.append(people.get(personId));   sb.append(": ");   sb.append(cursor.getString(displayName));   sb.append('|');   sb.append(cursor.getString(number));   data.add(sb.toString());   phoneId = cursor.getInt(phoneIdCol);   cnt += updateContact(phoneId);  } while (cursor.moveToNext()); } cursor.close();}ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.phone, data);setListAdapter(adapter);Toast.makeText(this, cnt + " phone numbers updated", Toast.LENGTH_LONG).show();

This code just loops over the contacts we got from the first query. For each of those contacts it queries to see if the contact has any phones that are of type “Other” (Phones.TYPE_OTHER). If it does, it creates a string that shows the contact’s name, the phone’s display name, and the phone number. This string is added to an ArrayList. Once all of the queries complete, an ArrayAdapter is created using the ArrayList of contact name/phone strings and used to populate a ListView.
You might have also noticed that a there is a counter variable being incremented, and an updateContact method. This is actually the method that fixes the phone number. I probably should have just kept track of the phoneIds and then gave the user a button to initiate the fixes, but I was lazy. Here is the code for updateContact.

private int updateContact(int phoneId){ ContentValues values = new ContentValues(); values.put(Phones.TYPE, Phones.TYPE_MOBILE); ContentResolver resolver = getContentResolver(); Uri phoneUri = ContentUris.withAppendedId(Phones.CONTENT_URI, phoneId); return resolver.update(phoneUri, values, null, null);}

Too easy. Contacts are an example of a Content Provider in Android. Many people (including my Android in Practice co-author and author of Unlocking Android, Charlie Collins) have criticized Android for exposing too much of the database backing of Content Providers. As you can see from the examples above, you have to deal with cursors (moving, closing), queries, updates, and very thinly abstracted select and where-clauses. Maybe it would have been better to drop down directly to the SQL, or provide a more object oriented API. Now you can create your own Content Provider, and you don’t have to use SQL database to back it — but then implementing the Content Provider contract can be quite awkward.
Anyways, I found that the easiest way to get this little app to Maria was to simply put it on the Market. It’s still on there if you happen to have a similar problem (maybe many people switching to Android might experience this?) If you are on your Android phone you can just select this link. If you are on your computer you can scan this QR code.

PUMA uses Menlo Worldwide’s 3PL services

Menlo Worldwide Logistics the global logistics subsidiary of Con-way Inc, announced a new contract with PUMA to provide warehousing and inventory management and domestic delivery in Singapore. PUMA is one of the world’s leading sport lifestyle companies that designs and develops footwear, apparel and accessories.

In addition to overseeing domestic distribution in Singapore for PUMA, Menlo will manage 21,000 square feet of rack/shelving space at a multi-client warehouse located in Boon Lay Way, Singapore. The scope of the logistics management relationship includes domestic transportation, the use of Menlo’s warehouse management system (SIMS), as well as a range of value-added services such as price tagging for retail distribution points, returns management and tendering orders for overseas shipments.

“We were looking for a provider with an established presence in Singapore and the ability to offer innovative solutions to improve customer service, on-time delivery and order fulfillment,” said Sheryl Wong, general manager, PUMA Singapore. “Menlo provides not just the technical capabilities but also leverages their experience in the Singapore market to better manage the complex global supply chain needs of companies like ours.”

“PUMA needed an experienced third-party logistics provider in Singapore that could enhance operational efficiency, inventory visibility and turnaround time,” said Desmond Chan, managing director, South Asia, Menlo Worldwide Logistics. “Our multi-client facility in Boon Lay Way provides PUMA with a tried and tested solution that offers best-in-class logistics services designed and managed to improve warehouse operations and domestic delivery.”

Menlo’s multi-client warehouse management solution offers flexibility in contract commitment length, the ability to share existing IT platforms, an experienced management and labor infrastructure, requisite equipment and assets, and a more extensive geographic network of pre-configured warehouse operations.


Mobile Zealotry

“You’re either with me or against me!”
Does this feel like the rhetoric coming out of Google and Apple lately? Sometimes I wonder if Russell from Survivor is working for these guys. I was at Google I/O last week, and I have to admit that Vic Gundotra delivered a great keynote. It really got the troops excited.

“One man, one company, one device, one carrier would be our only choice … Not the Future We Want”
Indeed. But before you go out and get an Android tattoo, and toss your iPhone off of the Golden Gate Bridge, take a deep breath and remember: You don’t work for Google (unless you do, in which case I assume you’ve already got said tattoo.) You should not care who wins this jihad — but make sure that you aren’t collateral damage.

If you are a mobile developer, what you should most care about is delivering the best and most useful experience to your users. So first and foremost, you need to care about what kind of devices your users are using. If they are all iPhone users and you really want to build Android apps, well sorry. Further, if they are all Blackberry users, then you can just ignore the drama going on here in the Valley.

Of course the device of choice for your users today is quite possibly not what they will be using tomorrow. Former Android engineer Cedric Beust makes the point that the iPhone may well have peaked. Things look great when you’re at your peak, especially if you don’t realize that the descent has begun. So you might build a killer iPhone app this year, only to find that your users have moved on next year. Nobody ever said that this was an easy game.

Hedging your bets and investing in multiple platforms seems like the safe thing to do, if it’s practical. But don’t forget the other factor: delivering a great app. If you can’t deliver a great app on Android, then don’t bother. If you can’t deliver on the iPhone, then don’t bother. Both Apple and Google have gone out of their way to provide developers with fantastic tools and platforms for creating great apps, so this may be a moot point. There are definitely types of apps that are better suited for one platform than the other. For example, the iPhone seems to be superior for games. If you look at the success of consoles, you can see why that kind of environment where hardware and software are highly standardized, translates well to the iPhone. Similarly, the lack of background processing on the iPhone (and don’t believe any hype about iPhone OS 4 changing this, it does not except in a few special cases) cripples the capabilities of many iPhone apps.

The most important thing to keep in mind in all of this is that it is in Apple and Google’s best interests to be as divisive as possible. If they can convince you that they are “right” and that you should only develop for their platform, this is a huge win for them. So expect the rhetoric to only get worse. How many days until WWDC?

Technology News | Computer Programming | Mobile Phone Software's at AJAX Tech