How I unlocked t-mobile iPhone 5s and transfer to H2O wireless

I have thought about this for a while, especially after hearing about republic wireless $25 month plan from my friend Luke and H2O wireless (thanks to mitbbs penny savers forum). Previously I only heard about the StraightTalk $50 plan ($45 now, it appears T-mobile also dropped its $50 plan to $40). A little background, I had an iPhone 5s for t-mobile, full price bought from Apple store in Oct/Nov 2013. I only used it for T-mobile prepaid legacy plan, which means “pay as you go”, 10 cents a min for phone call, and 10 cents per text message. I like to have the 3G data, like I had before from AT&T. Here are the steps I followed:

1) Unlock the iPhone 5s. Although I paid the full price, by default the phone is still locked to t-mobile network. The quickest way is to chat with t-mobile, which I did. Actually I did twice, because the first time they did not do the job. The second time they sent me notification saying my phone is unlocked.

2) Get a sim card for H2O wireless from Amazon. I made a mistake again. Without much thought I got this micro sim card first, and I quickly realized iPhone 5s needs nano sim.
3) Last but not least, when my t-mobile prepaid balance came very low, and when it’s weekend (not critical time), I started transfer. I did online on h2o wireless website first. Haven’t seen the number transferred after a bit over a day. So I called. One problem is since my t-mobile is prepaid legacy plan, there is no account number. And I did not give correct pin per H2O rep. Got it solved. The next thing they asked me to install couple profiles for internet (because I want data plan). Then talk to the billing department setting up monthly pay, they gave me 10% off for setting up month bill auto pay via credit card, make the final bill $27. Note H2O actually uses AT&T network, and the data usage is available in real time from “Cellular” setting of the phone.

(update) The main reason I ditched T-mobile is its poor coverage. Sometimes I don’t get signal in the condo neighborhood. The wifi-call feature helped out a bit by tapping into the Wifi network, but it has two drawbacks: 1) It still uses the regular minutes; 2) When at work and I walk around, as the Wifi hot spots changes, the phone will disconnect or lose signal.

Also, how to setup Internet and LTE for H2O. The operator texted me two links. Install the first profile for initial Internet setup. The second one was sent via Dropbox link. No need to install Dropbox app, just tap top right, “direct save”, and install. It will complain about the first profile just installed. Go ahead and remove that one, the second one should install. This is not very intuitive as I did not hear instructions clearly from the operator, nor did I bother to look up their website for FAQ. From my own experience, the first one is probably just for verification or something. Also the operator asked if I want multimedia message, I said no because she mentioned I need to install some “jailbreak” app or something.

Also, I heard from my other friend, if one is really budget conscious, Ting is also a good choice, they use both Sprint and T-mobile network.

Silly mistakes in web service implementation

Came across a strange problem this week using a web service from 3rd party. It’s a soap based web service. When we pass the XML with the required data elements in certain order, it works. If we did not follow that order, it complains invalid parameter or something. I guess in the code they have something like this:

if parameter_1 is invalid
return bad_parameter

if parameter_2 is invalid
return bad_parameter

In my opinion, we can do a simple fix as shown below:

if (parameter_1 is invalid) || (parameter_2 is invalid) || …

To be fair, I have made this kind of mistake myself, probably a while ago :-) I think it’s important for experienced developers have empathy towards people who make those mistakes, and understand how they come to the imperfect solution, and how to avoid those problems in the future.

(Update 05-09-2015) It looks like a common problem in web service, as explained in this thread. Quote:…Some vendors may grab SOAP parameter values by element name (the proper way) and others may grab the values by node position (what you’re probably running into)…

Another post on stackoverflow about similar problem on WCF SOAP web service.

Sustainable software development : I

I am starting a series of “Sustainable software development” blog posts. Like many series I did in the past, it could be a series of one and only, or it could be a true fall classic (WS series).

Back to the topic, I have been doing software development for almost 15 years, been through many organizations, sometimes move between different organizations inside one company. And I think among all these agile, water fall, off shore, near shore, on shore etc., the most important of all is: consistently deliver values to customer. The key of what I said is “consistently” and “value”. Note I am not trying to add another one or two buzz words here. By that I mean everybody should be happy: employee or contractor don’t get overworked, feel they got the short end of the stick, managers don’t feel they got squeezed between sales people and the end customer, the customer does not feel been lied to (by the “used car” salesman). How do we achieve that? I think it’s both a management and engineering question or discipline. Note I said “sustainable” in the topic, if any of the one conditions (symptoms) is true in real world, what will happen? Employee or contractor will leave, manager will feel depressed (they may not leave as fast because it’s usually harder to find a manager position), customer will get angry and make threatening calls…

Note I will mentioned “software”, not “application” or something. Software is a bit older word than application, or “apps” the new buzz word popularized by Apple (Steve Jobs?). Good old fashion software. A lot of times when I saw “applications” people developed, it’s merely a configuration or customization of some prepackaged software. I used to work for company does that sort of thing too. Don’t get me wrong, there is value in customization or configuration. But that is NOT “software development”, that is “software customization” or “configuration”. Also, there is a drawback to this approach, the “upgrade nightmare”, because it’s hard to upgrade to the original software due to poor customization. Customization, if properly done, I think the changes can be localized, and the application can be maintained. On the other hand, if it’s not properly done, just like “hard code” things in the code, it becomes harder and harder to catch up with the vendor as time goes. It’s very likely those kinds of system will generate a lot of outages and support calls, and we know most developers don’t like handle production support problem all day (and night). They like development better.

This reminds me a related question I came across on Quora How do you make programmers work 60-80 hours per week? The short answer is don’t do that. In today’s world, we still think about a problem when in shower (just like Warren Buffett got the idea to buy BoA stock in shower :-), as Ryan Matte said in Quora: a programmer never really turns it off. So from management point of view, they should really encourage the hard working developers to go off to take a break. I recall my middle school teacher had very similar philosophy.

So this is my 2 cents to get started on this topic. I will hopefully get back to this soon…maybe talk about how to use agile and team size to make software development more sustainable:-)

So long…

Java app memory leak, performance

A collection, I will add my comments later. Symptom: PermGen run out of space

Memory leak
Overview (Mark Thomas)

Memory leak happened in multiple deployment (more likely happens in development)

Tomcat 7 (Mark Thomas)

Application or library code that can trigger this situation include:
JDBC driver registration
Some logging frameworks
Storing objects in ThreadLocals and not removing them
Starting threads and not stopping them

There are also a number of places that using the standard Java API can trigger a similar issue. These include:
Using the javax.imageio API (the Google Web Toolkit can trigger this)
Using java.beans.Introspector.flushCaches() (Tomcat does this to prevent memory leaks caused by this caching)
Using XML parsing (the root cause is unknown due to a bug in the JRE)
Using RMI (somewhat ironically, causes a leak related to the garbage collector)
Reading resources from JAR files

Overview and use VisualVM to debug memory leak (Colm Divilly)

Nikita Salnikov-Tarnovski

Overview of memory and performance of J2EE app (PDF, Steven Haines)

Upgrade to iOS 8.1.3: some tips and tricks

I decided to upgrade to iOS 7.1.3 to iOS 8 recently due to the t-mobile wifi calling feature which is only available on iOS 8. Previously I tried to delay the update due to the main reason: my iPhone 5s is almost full and I need to back up and delete photos. I know people talk about just update it by the way of iTunes desktop (using USB/lighting cable connecting iPhone and laptop).

After back up my photos to two iPhoto library, and made an iTunes backup to my PC (laptop), I need to decide one thing quickly: whether I want o upgrade to iOS 8.2 which can be done from iPhone itself (Settings => General …), or do I go through the trouble to find 8.1.3 from web and restore it myself. I decided to go the latter, because I don’t want the Apple watch app on 8.2, also my company does not support 8.2 (I need to use it for company email). So here is the site I found the ipsw file. After the download, run checksum using this md5 command, then verify the SHA-1 digest using openssl command. Restore it using iTunes 11.1.5 on my mac (hold alt and click “restore” to open ipsw file).

The usual new iPhone setup afterwards (I used restore from iCloud, an old backup). After that I got all the email, plus the apps on the phone a while back (May 2014 to be precise). One interesting thing is I noticed even the phone call/messages are also back dated to May 2014. But iCloud had my recent contacts and it appears all intact on the phone.

Some odds and ends
The day after the update (yesterday morning), I found I could not install apps. Turns out there is a massive iTunes store outage (I found it out as I tried iTunes music and tried my iPad mini).

My Sienna audio does not recognize the “updated” phone. The trick is delete “car multi-media” from phone and pair it again. I have another post dedicate to this topic. Interestingly, my Camry 2012 audio recognize the the “new” iPhone without problem. Also, all the existing WiFi connections are gone after upgrade, so I need to ask around the Wifi passwords again :-)

Google+ plus photo missed some recent pictures. I don’t think it’s a big deal, as I already have iPhoto and iTunes backup. But this combined with the iTunes outage, made me think twice about the cloud storage.

I will share more as I remember more things.

(Update 3-15-15) I learned form my friend, and also verified on my t-mobile account, the Wifi calling is not free. It’s merely use Wifi to enhance the signal. Because I am a prepaid user (legacy plan), so this does not really saving me money :-(

Update vs. restore
The main difference between update and restore is like this: think Windows update vs. re-install the OS. In other words, all the stuff (files and software; pictures and apps) will be intact after update, but restore will get rid of all that. It will start fresh. The reason I did restore instead of update is I don’t have enough space on my 16Gb iPhone 5s.

Is pair programming worth the hassle?

I have been doing programming for over 14+ years, and from time to time I did pair programming (mostly debugging problem). Since early last year I have been doing more pairing, mostly due to the hints from above. I have mixed feeling on this, mostly along the lines of advantages of disadvantages talked about here by Mark Weldon.

Quote Mark here, “When you pair program, you’re effectively joined at the hip with your pair. You can’t pair if only one of you is there. This means that you both come into work at the same time, you both take lunch at the same time, you both take breaks at the same time, and you both leave at the same time. The work is so concentrated that you work 8-hour days (which is good). But you can’t take time off without affecting your pair. Working from home is possible, but it’s obviously not as pairy as sitting beside one another…” I have very similar feeling here. Mark is probably an experienced developer. I also did a google search, saw other people with different background shared their thoughts on pair programming (manningdigital, a CS student). Mark also talked about the personality clash, essentially one developer with strong will (or more stubborn gets her/his way), which is also echoed by other 2.

Curious about this topic, and don’t want to limit by the google, I came to quora, and searched this topic. I came up with Is pair programming worth the trade off in engineering resources and Does Pair Programming really work.

And I saw this from the legendary coder Kent Beck, he suggested it works when

“The problem space is big and unknown. You don’t know what exact problem you are solving and the probability is high that any solution you find will change your understanding of the problem.
The solution space is big and unknown. You are working with technology you don’t fully understand and the chances are that any solution you find will change your understanding of what constitutes an effective solution.
You need to build relationships on a team…”

I think that’s where I agree with on pair programming at this time.

2014 Year end review on myself : family, personal finance, career, agile

I was a bit late doing this, but I think better late than never.

Family and Personal Finance
We had baby (girl) No. 2 in the summer, baby Sophia is healthy and happy for the most part. I had to be honest, having 2nd kid is not as thrilling as the 1st.

With the birth of new baby, we had some more challenges to make sure baby No. 1 is happy. We have achieved this to large extent. With some caveats (see below). It’s almost unthinkable that Serenity will start kindergarden in the fall. Time flies. Enjoy it while we can. Leave the iDevices/mac if I can.

On personal finance front, I felt stretched a bit after the cost associated with new baby (hospital bill, etc.) and the preschool tuition for my older daughter. So in Sept. I made a painful decision to transfer Serenity to the preschool at church, which will save us some money. Initially I tried to bite the bullet and started some financial engineering such as refinance the mortgage (to get some cash). But it was not enough.

Reflect on my own mistakes on personal finance, mostly on playing the stock market, and over spend on things such as organic milk. I felt not very good. But again better late than never. I started shopping more on Aldi’s and try to control the discretionary spending. Also, for the stock market part, noticing the fall of oil and the DRIP (dividend re-investing program), I decided to put some money in Exxon Mobile Drip program. I also think about the performance of my self managed IRA account vs. the other 401k/Rollover IRA accounts managed passively (all mutual funds managed by professional money managers).

I did not change job in the last year, hopefully I can stay at current place longer than past few years (change job almost yearly). Another important thing to consider is the feel of being challenged and learn new things, plus work/life balance.

Another interesting point is, since my wife seeing the benefits of the programmer job, and she is taking care of baby No. 2 full time now, she is thinking about learning java in her spare time. So hopefully we will have another IT professional in our household soon :-)

Continue reading

Moving wordpress from shared host to aws ec2

I did an experiment recently trying to move my wordpress website from a shared hosting site to Amazon aws ec2 micro instance (t1). The migration was mostly successful, I did not make the move eventually due to some technical and non-technical reasons. Nonetheless, I would like to share some of the lesson I learned from this process. I followed this blog post form smashmagazine as a blueprint for “moving wordpress”. Note I already have ubuntu installed on ec2, and has setup keys for my laptop.

1) Setup wordpress on new host. This is the link I followed to setup wordpress on ubuntu on my aws ec2. Another useful article is here.

2) Upload files: I used FileZilla (SFTP) for uploading the files. Here is the link regarding setup keys. Note the file permission is also very important to make wordpress work, which is especially important when moving the sites. More on this later.

3) File permission, one thing I noticed quickly is I don’t have any writing privilege after moving, e.g., update plug-ins etc. Did google quite a bit, and tries to change the file permissions using FileZilla. No luck. Eventually I read this from wordpress official doc. Quote:…(a) file ownership: all of your WordPress files must be owned by the user under which your web server executes. In other words, the owner of your WordPress files must match the user under which your web server executes. The web server user (named “apache”, “web”, “www”, “nobody”, or some such) is not necessarily the owner of your WordPress files…

I did “ps -ef|grep httpd” at my ubuntu server, and find the user for apache web server (not “root”). And changed the file owner to this user (via “chown” command).

4) MySQL server crash: I found this happens quite often (as often as once every 3 days). Turns out to be a memory problem for the t1 micro instance and apache web server and mysql fights for the memory, eventually mysql lost. The solution I found is add virtual memory to the system, and reduce the memory requirement for mysql in config file. Eventually I was able to have mysql run as long as 13 days without shutting down. Not idea, but meaningful improvement. Another idea, people talked about is use a lightweight http server such as this one.

5) MySQL database migration. Found out for large database, php export will not complete, and will end up with some junk html in the database file (.sql), it will fail during import. The workaround is do the export and import in the mysql command line. But I still have one problem with database, it appears the Chinese character got lost during this process. This problem along with the mysql server problem mentioned above, and the relative higher cost of AWS compared to shared host, made me decide to not switch at this time.

Other links:
Setup php/mysql, and phpMyAdmin.

Some tips for submit updated app to iTunes store post iOS8

With (before) the release of iOS8, I noticed the iTunes Connect web interface has also been changed. But today is the first time I submit my app (update) to the store for last few months. There are some changes.

1) First, there is no “ready to submit app” button in the iTunes Connect, instead we just create a new version at ITC;

2) After that, we load the app to the app store, I used good old Xcode 5.1.1, which is the minimum version Apple requires now. Now here is a tip when submit from Xcode organizer, when I run “validate” before submit, it says I could not change “bundle” number, which I have not. Looking more carefully, it appears the good old Xcode 5.1.1 got confused with which app profile to use, and it picked the wrong one all the time. So I manually corrected it. After that I was able to upload the binary.

3) There is one more step, the actual “submit for review”, in the past the step 2) is sufficient. Now there is this extra step. In this step, it will ask questions similar to the questions being asked when we do “ready to submit” in the ITC in the past (before this change). In my case, since the app has “iAd”, it insists me check the Ad identifier selection, and after I check that, it let me submit (note I will try couple times, eventually I started over). But it appears not let me check “no” in the Ad section. This appears to be a glitch, I was able to submit my other 2 apps without any problem when checking no for the Ad identifier. There is another glitch though, that is I have to quit the app, before pick the newly added build, and submit for review. In summary, it appears ITC web page needs some work.

I will report more when/if I find anything new next time I submit app update. I noticed there is new marketing collaterals such as the preview video, and screenshots for 4.7/5.5 inch screen. My gut feeling is those will be required after this transition period. So hurry up if you have some app or update to release :-)

(PS, 09-28-2014) One more thing, I noticed if I wanted to reject a binary (a build in new term), I need to create a new version. In the past, I could upload a newer binary with same version number. I think it’s probably a good idea to limit this back and forth. Note Apple added testFlight capability too. It should help app testing.

Set up Apple TV with AT&T u-verse

It seems the wifi router comes with AT&T u-verse does not work with Apple TV. Apple TV could not find the wifi network from the build in u-verse wifi router. I found one workaround, that is to turn off the build in Wifi, use an old wifi router (D-Link DI-524) for Wifi instead. But there is still problem with the mirroring from iPad to Apple TV. Since I still have my previous LinkSys wrt54g router, I set it up as second router behind the DI-524, and connecting both the Apple TV and iPad to wrt54g. That worked. Another side benefits is wrt54g is a newer/more powerful router, and could broadcast wider range. So in a summary the architecture from internet to apple TV is something like below.

u-verse modem (wifi off) => D-Link DI-524 router => LinkSys wrt54g router => Apple TV/iPad

You may wonder why I add this extra D-Link DI-524 old router. The problem was I could not easily connect LinkSys wrt54g (the newer router) to u-verse modem. So I used the old router as a bridge. If someone has idea to make it work without this extra router, please let me know. (Email: minjie DOT xu AT gmail DOT com; or twitter @stlplace)

There is another problem with setup AT&T u-verse which is not related to Apple TV. The problem is when creating new account at their web site, they prompt for secret question/answer, it appears they don’t take any space in the answer. It was a programming error (web page text field validation) in my opinion, since I have done some web programming lately. The workaround is not to type any space. Simple enough.

This is also after using cable internet for about 8 or 9 years, I am switching to AT&T. I was using their DSL before switching to cable. The main reason is their service is cheaper, another factor is the cable had some connection issues lately.

(Update 05-07-2015) Came across this post regarding how to make direct connection from linksys wrt54gl to uverse router. I tried it but was not successful. It does not like the new local ip address for linksys. But the theory there (conflicting local ip address between uverse and wrt54gl) seems holds, as I saw people discuss similar problem on linksys support forum.