Categories
Software development

Bug fixing vs. new development

Reading Time: 2 minutes

In my 13+ years of software development career, I have done both. So which one do I prefer? This is a bit like asking my daughter: who do you like more, mommy or daddy? (I will reveal my daughter’s answer at the end.)

I think both are interesting work, and both could be challenging. If you ask me pick one, I will probably pick the new development, as most developers like to work on new things: from new technologies to new features, new project/product. But from time to time, I have worked on some bug fixing work that is not only interesting, but also challenging and rewarding (mentally not financially, as I worked for companies all these years). I recall 6, 7 years ago, when I was working for CAD software company, we had two bugs to fix, the first one is actually not too bad, essentially it’s a tolerance problem. In other words, I just need to make sure when it checks whether the X, Y, Z axis is orthogonal to each other, I gave some tolerance. I did cross products of vectors, borrowing from similar experience I learned at work.

The second one, is a bit daunting, to say the least. Essentially we have about 2 weeks to fix a nasty problem in a CAD translator, and we don’t have any clue why the results is wrong. By working with 3rd party, and looking carefully at the problem, some teamwork, I was able to solve the mystery when I was working remotely at Shanghai. I recall I could not fall asleep that night, as I knew that’s a tough problem and will help the sales team greatly to sell into a top Europe car maker.

I had similar experience most recently, although it’s a totally different problem, and we as developers also work in much different world: with stackoverflow.com, and google search (blogs).

So back to my daughter’s answer to my silly question: most of times she will say mommy and daddy; sometimes she will say “don’t ask silly questions”.

PS: in some places bug fixing is also called as maintenance. Just like the car maintenance, software also needs regular check-up and fix 🙂

Categories
iPhone app IPO

Facebook Paper app, Twitter

Reading Time: 2 minutes

Two social media companies are in news today, Facebook released the new Paper app on iPhone, and Twitter announced the user growth is not as fast as the Wall Street liked. Maybe the 3rd, LinkedIn announced not so spectacular quarter after market today.

I tried Facebook Paper app. To be honest I have been Facebook user for about 5 years, not heavy user in terms of posting news feed or pictures. But I did use Facebook to communicate with a few friends, and did post some of my daughters’ pictures: fewer and fewer as time goes. The main reason for “fewer” is two folds: 1) Fear of privacy, I saw this “tag” feature there and never liked it; 2) Baby grew up. Btw, as I talked about the picture, by now most of us knew about the Facebook “yearbook” feature which automatically puts together some of the uploaded picture, and I saw Google+ was doing the same thing recently.

Back to Facebook Paper app, “slick” is the first word I would describe it. It tries explain things when I first installed it. I am a Zite user, and I only used Flipboard briefly. In terms of the news feature in Paper app, I think they are similar. And I heard one commentator on Bloomberg saying the “twitter of news” feature. But the commentator likes it too. It may have some impact on the competing news media curating services/apps.

About Twitter, personally I always liked Twitter better. I have 3 Twitter accounts (out of 250 million Twitter users). I used it because when I started using Twitter, I found it’s popular among geeks and iOS developers, the hash tag thing. I feel this quarter or near term is just a bump of the road, Twitter basically does a lot news service now. I recall refreshing twitter feed when important events fold. In terms of their business, I liked their integration with Amex (AmericanExpress card).

I will talk about LinkedIn sometime later.

(Update 02-07-2014) Used Facebook Paper couple days now, one annoying feature appears to be the fast flicking of the news feed for each news section. For now I am using google news and Zite for news and geek stuff.

Categories
Fun iPhone app Life Tips

Back up iPhone iPad photos

Reading Time: < 1 minute

I learned the lesson the hard way. Almost a year ago, I left my former employer, and I had to turn in my iPhone 4s. Being a computer professional, I knew the backup thing, so I backed up the photos to iTunes, both via iCloud and via iTunes to PC. But I forgot one more backup, to the iPhoto on my Mac. The backups on iCloud and iTunes are good, but I can not view the individual photos from there, and eventually I got a new iPhone 5s and got the backup iPhotos to my new iPhone this way. The first thing I did after I receiving my new iPhone is to restore the photos, and backup to iPhoto on my Mac.

I did one more thing, as I learned from my Nexus 4 experience, is turn on auto back up on google+. I paid $20 extra for the additional 10gb space on iCloud (for one year), when the time of renewal comes, I plan to cancel it, as now I will do backup via iPhoto, iTunes and google+.

Personally I felt the management of all these photos on iPhone/iPad is an interesting project. With Apple TV, I did see I play videos on iDevices more, and sometimes even slide show the photo. I did this quite a few times to my young daughter, when I found that’s more fun than the Netflix TV shows 🙂

Categories
Life Life Tips

Year 2013 in review

Reading Time: 2 minutes

Job
I changed too much. Three W-2 in one year. I hope to stick with my current employer for a while.

Family
Our daughter grew up quickly. She brings us joy that words can not be easily described. And frustration sometimes, too. I think patience is very important being parent. Near the year end, we have some exciting news, as my writing (couple days ago Jan 14, 2014 we knew we will welcome a new baby girl in this July 🙂

iOS apps
I did update the myNestEgg app, after 2 years, from iOS 3.1.2 to iOS 7. And I released a new app “To Market ~ farmers market around St. Louis”, this is a free iOS app. I am experimenting some new features there.

Stocks
I was looking at my stock trades in last few years. I realized year 2012 is not good, while 2013 is ok (has not beat market in my Scottrade IRA brokerage account because again I tried to do too much). Looking back a bit more, in year 2010 I made some mistakes on Palm and other stocks, in 2012 it was the Coal stocks (ACI and ANR). It seems I tend to lose money on high volatile cheap stocks (the former high flyer etc, hope it goes back).

The more I think about it, as I was also reading “year 2012 in review“. Once again I am thinking if I can not beat the market, I should pick the index fund, or go with the fund manager I believe in (Steve Romick). His FPA Crescent has done very well for me in last 4 years.

(01-23-2014) I gave it more thought after seeing Logitech (LOGI) jumped more than 20% this morning on beat estimates on earning, and on the news its transition from PC mouse to iPad keyboard worked out. I bought the stock a year ago at about 7.50, hold it only a day. Similar can be said for Logmein (LOGM), which also more than doubled in a year (I owned more LOGM at one time). Anyway, have faith on bad news, though near term when looking back, at the time it’s not easy.

(02-06-14) This annual review is partially inspired by Kirby Turner (whitepeaksoftware.com), congrats to Kirby on his 10 years anniversary of his company. I met him once at an iOS conference in 2010 and was impressed by his iOS/Mac knowledge.

I also recall Kyle Richter talk about doing iOS consulting at RayWenderlich.com to be interesting.

Categories
iPhone app Life Tips

UP band a few months later

Reading Time: < 1 minute

(Update 02-06-2014) My UP band died. I fully charged it, tried both soft reset and hard reset, as discussed below, but seems could not revive it.

The following was written on Nov. 14, 2013. I have a bit more experience with UP band since then, note Jawbone also came up with new UP 24, which has bluetooth connectivity with the smartphone. Also, Fitbit released the app for iPhone 5s which has the basic pedometer functionalities, I just started using it and so far so good.

Good
Does the job, record walking steps and sleeping time

Bad
Need to reboot the iPad sometimes to get sync

The corrosion, partially my dumb mistake

Odd
The switch from “sleep” to “walk” is automatically most of the time. but not the other way around. Occasionally I saw the UP band flashes (both sleep and walk indicators), or would not sync. There is this soft-reset, and I found turn off iPad (iPhone) and turn it back on solves most sync issue.

Categories
Featured iPhone app

Send Email via Cloud Code in Parse

Reading Time: 2 minutes

(Update 05-10-2016) Came across this post about hosting your own Parse server from raywenderlich.com

(Update 01-28-2016) All good things came to end (see today’s Facebook announcement on shutting down Parse on January 28, 2017, a year from today). They also listed migration path. A lot discussion on reddit on this topic. Also a tutorial on Firebase by raywenderlich, note Firebase is owned by Google (they are also famous for shutting down things 🙂

(Update 10-12-2015) Here is the “get started on Cloud Code“. This talks about how to set up the Parse cloud code (including email), the integration with Mandrill is also there. You will need two accounts (both are free for small apps): Mandrill and Parse. Just replace the keys in my code below and in the parse command with your own keys. I also create a github repo here. It has a README just like this blog post and has all the cloud code.

(Original 11-24-2013)
The cloud code (javascript)
refer to this stackoverflow thread; and this Parse documentation. Note I used ManDrill (free for up to 12,000 mails per month), the main things I noticed is they requires 10 letters password, and the API key can be created in Settings (this will be used later, we will use API key instead of SMTP server)

cat ./cloud/main.js

// Use Parse.Cloud.define to define as many cloud functions as you want.
// For example:
Parse.Cloud.define("hello", function(request, response) {
response.success("Hello world!");
});

Parse.Cloud.define("sendMail", function(request, response) {
var Mandrill = require('mandrill');
Mandrill.initialize('12AkxxxxxxxxxxxxxxrZEg');

Mandrill.sendEmail({
message: {
text: request.params.text,
subject: request.params.subject,
from_email: request.params.fromEmail,
from_name: request.params.fromName,
to: [
{
email: request.params.toEmail,
name: request.params.toName
}
]
},
async: true
},{
success: function(httpResponse) {
console.log(httpResponse);
response.success("Email sent!");
},
error: function(httpResponse) {
console.error(httpResponse);
response.error("Uh oh, something went wrong");
}
});
});

To test it out, do the “parse deploy” after put the code above in main.js (under cloud dir), then issue this command:
curl -X POST -H "X-Parse-Application-Id: your-parse-application-id" -H "X-Parse-REST-API-Key: your-parse-REST-API-key" -H "Content-Type: application/json" -d '{"toEmail":"major_xu@yahoo.com","toName":"Major Xu","fromEmail":"minjie.xu@gmail.com","fromName":"Minjie Xu","text":"testing ManDrill email","subject":"this is just a test"}' https://api.parse.com/1/functions/sendMail

Objective-C code
Refer to Parse documentation here. Note this is a simple “Hello World” example.
[PFCloud callFunctionInBackground:@"hello"
withParameters:@{}
block:^(NSString *result, NSError *error) {
if (!error) {
// result is @"Hello world!"
}
}];

My email code is a bit more complex compared to “HelloWorld” 🙂


[PFCloud callFunctionInBackground:@"sendMail"
withParameters:@{@"toEmail":toEmail,@"toName":@"Minnjie Xu",@"fromEmail":@"uudaddy@gmail.com",@"fromName":@"uudaddy",@"text":@"resetPasswordButtonPressed...",@"subject":@"myNestEgg ~ testing ManDrill email"}
block:^(NSString *result, NSError *error) {
if (!error) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Reset Passoword" message:@"Email Sent :-)"
delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alert show];

}
}];

Categories
iPhone app

Some roadblocks and tips when updating app for iOS 7

Reading Time: 2 minutes

Recently I’ve worked on updating one of my app to make it works on iOS 7, and have encountered some roadblocks.

Push view controller
problem/symptom: the new view controller pushed from old view controller shows no content, on iOS 7. It works fine on iOS 6.1 (the deployment target is still iOS 6.1).

solution/diagnose: I found the following code snippets by Sourabh Kumbhar at mobinett very handy when debugging those kinds of issues.

Put the following in the viewDidload of the view controller got affected by iOS upgrade.
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7)
{
self.edgesForExtendedLayout = UIRectEdgeNone;
}

Back to the original problem. Animation problem? I did quite a few googles trying to find out if the animation change is the cause here, but to no vail. Depends on the view, fix it in viewWillAppear or use NSNotification to make sure the viewDidLoad calls after the view property gets reset (web view).

Old code
MarketDetailViewController *marketDetailViewController =
[[MarketDetailViewController alloc] initWithNibName:@"MarketDetailViewController" bundle:nil];

// Set the title of the detail page
[marketDetailViewController setTitle:product.name];

// Push the detail controller on to the stack
[self.navigationController pushViewController:marketDetailViewController animated:YES];

// Populate the details
[marketDetailViewController setLabelsForProduct:product];

-(void) setLabelsForProduct: (Market*) theProduct
{
NSLog(@"inside setLabelsForProduct, time =%@", theProduct.time);

// Set the text of the labels to the values passed in the Product object
[nameLabel setText:theProduct.name];
[manufacturerLabel setText:theProduct.city];
[detailsLabel setText:theProduct.state];
[priceLabel setText:theProduct.phone];
[quantityLabel setText:theProduct.produce];
[daysLabel setText:theProduct.days];
[self.timeLabel setText:theProduct.time];
[startDateLabel setText:theProduct.startDate];
[endDateLabel setText:theProduct.endDate];
[emailButton setTitle:theProduct.email forState:UIControlStateNormal];
[webButton setTitle:theProduct.web forState:UIControlStateNormal];
}

New code
- (void) viewWillAppear:(BOOL)animated{
NSLog(@" MarketDetailViewController::viewWillAppear");
[super viewWillAppear:animated];

[nameLabel setText:theMarket.name];
[manufacturerLabel setText:theMarket.city];
[detailsLabel setText:theMarket.state];
[priceLabel setText:theMarket.phone];
[quantityLabel setText:theMarket.produce];
[daysLabel setText:theMarket.days];
[self.timeLabel setText:theMarket.time];
[startDateLabel setText:theMarket.startDate];
[endDateLabel setText:theMarket.endDate];
[emailButton setTitle:theMarket.email forState:UIControlStateNormal];
[webButton setTitle:theMarket.web forState:UIControlStateNormal];
[self.view setAlpha:1];
}

-(void) setLabelsForProduct: (Market*) theProduct
{
NSLog(@"inside setLabelsForProduct, time =%@", theProduct.time);
...keep all those setters here...otherwise it will break iOS 6.1
theMarket = theProduct;
}

Web View
Similar idea, but I used NSNotification to fix the problem in iOS 7.

self.webViewController = [[WebViewController alloc] initWithNibName:@"WebViewController" bundle:nil];
// Set the title of the detail page
[self.webViewController setTitle:[nameLabel text]];

[self.navigationController pushViewController:self.webViewController animated:YES];

NSLog(@"[product web] = %@", [[webButton titleLabel] text]);

// The following works in iOS 6.1, but no longer in iOS 7
//[webViewController refreshView:[[webButton titleLabel] text]];

add the following to the viewDidLoad of parent view controller
// Listen for new image uploads so that we can refresh the image wall table
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(webPageDownloaded:)
name:N_WebPageDownloaded
object:nil];

In the web view controller, viewDidload, add
[[NSNotificationCenter defaultCenter] postNotificationName:N_WebPageDownloaded object:nil];

refreshView is the same:
-(void) refreshView:(NSString*)webAddress0
{
self.webAddress = webAddress0;
[self.myWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:webAddress0]]];

CGRect textFieldFrame = CGRectMake(kLeftMargin, kTweenMargin,
self.view.bounds.size.width - (kLeftMargin * 2.0), kTextFieldHeight);
UITextField *urlField = [[UITextField alloc] initWithFrame:textFieldFrame];
...some code to render the urlField, omit for the sake of readability...
[self.view addSubview:urlField];
}

// the call back being called when posting Notification
- (void) webPageDownloaded:(NSNotification *)notification
{
[self.webViewController refreshView:[[webButton titleLabel] text]];
}

Code signing
symptom: when submit to app store, it will say no valid provision profile can be found. In some cases Xcode will crash for that project. If the user tries to submit an ad-hoc package (ipa file) via Application Loader, Apple will send “invalid signature” email right away, reject that binary. And I found following solution at stackoverflow.com
old distribution provision profile no longer work, create a new one for Xcode5

Categories
iPhone app

A collection of iOS dev tutorial guide

Reading Time: < 1 minute

Arguably iOS 7 bring most drastic changes to iOS in last 3 to 5 years. With new features like dynamics in UIKit, (more/new) auto layout, it creates both opportunities and challenges for developers. But I know the Mac/iOS developer community is best, in terms of sharing knowledge. With the iOS 7 out just 2 weeks ago, I already see some good iOS 7 dev tutorial and guides.

Tristan O’Tierney ‏@tristan recommend this one by @ashfurrow. Note Tristan is one of the early iOS developer for Square. Ash Furrow is an iOS developer @teehanlax.

Essential iOS 7 developers guide by Double Encore
Remember seeing those guys (guys wearing their T-shirt) at one of the iOS dev conference (Voice that matter, Fall 2010 at Philly).

RayWenderlich.com iOS 7 by tutorial
This is probably the most comprehensive and the best iOS tutorial in the market. Ray started this tradition from iOS 5 (so this is three years in a row). Note Ray has also published a few shortened version of selected tutorials in the iOS 7 tutorial feast (free).

I will add more as I see fit.

Categories
iPhone app

iPad in classroom

Reading Time: < 1 minute

Good idea? Bad idea? I read this article on LATimes talking about how the kids hacked the MDM software on school issued iPads. The topic was on security. Obviously the MDM provider did not do a through job, as explained by an article on alertboot here.

This reminds me of another question, the iPad in classroom. A while ago I recall seeing a plea at my local school website, the kids there asked parents/friends donation, to buy them iPad, so that they can do cool things like count coins on iPad. My take then is why not counting the real coins. I can understand the pitch from educators (such as this one at LAUSD), the blah blah (perceived good things are going to happen with the iPads). At the end of the day, those devices have to be used to enhance the kids learning, not to distract their learning, or to reduce teachers’ creativity.

(Update 10-02-13) Tom Kaneshige of CIO magazine has a more comprehensive explanation of MDM and why the incident happened.

Categories
iPhone app

iOS 7 first impression #iOS7transition

Reading Time: < 1 minute

(Update 09-27-13) I think it’s a bit silly people are all over the motion-sickness caused by iOS 7. I found the new Safari “color effect under address bar when the web page moves up” cool, it took me a while to figure out why the color on the top is changing sometimes (very subtle 🙂

(Original 09-25-13) I updated my iPad mini from iOS 6.1.2 to iOS 7 (upgrade to 6.1.3 first) in the weekend, when I saw the tide is turning to iOS 7 for the iDevices 🙂

Some impressions
Motion fact, when one rotate or moves the iDevice, cool;

Warm and fuzzy (screen saver, password screen), control center;

Enterprise deployment change (ad hoc deployment now checks version/bundle number);

App: Zite, the close article (x check mark) is at bottom left, previously user tap background, note the new icon for sharing;

Safari, again note the new icon for sharing, bookmark, history.

By the way, I am tweeting some of my iOS 7 observations on twitter using #iOS7transition.