HTC Worst Warranty or Customer Service Ever

After buying hundreds or even thousands of products for years, I have a fair amount of chances to utilize warranty or after services from various companies. However, HTC is definitely the worst one, which has a lengthy after service process, but more shockingly, it doesn’t trust its customers at all. The quality of HTC’s products is quite decent, but its customer service makes me laugh and I will definitely never purchase anything expensive from HTC every again.

The story begins when I bought my nexus 9 3 months ago as my nexus 7 was broken. It was good for a few days and I enjoyed it very much. However, the nexus 9 starts to get hot at the back near the camera when I surf the internet. I have to kill my browser and Wifi and leave it for a while to make it cool down.It is also a known issue according to this. https://productforums.google.com/forum/#!topic/nexus/KOsz8Y8GLxg. The problem wasn’t the serious, so I tolerate it for around 3 months. However, it definitely happened more frequently month after month.

2 weeks ago, my Google apps stop and I couldn’t even hit the factory reset button. I made up my mind and call HTC customer service to report this as well as the heating problem. After explaining to the operator what happened, she kindly guided me to do factory reset by safe boot and my HTC was healthy again. The resolution turned out to be very simple, just update the google service app. However, I still want to get rid of the heating problem so I consult her about that. Instead of trying everything possible to find out the root cause for her customer, I feel that she wanted to discard my concern and stop me from using the warranty. She first warned me that it would take about 2 weeks until I get my nexus back, regardless of the problem. She also “kindly” reminded me that if it was found that I was the one at fault, I will be charged accordingly. After thinking through, I decided to proceed and use the warranty service since I know if the heating problem will gradually slow down my nexus and eventually kill it.

I was asked to choose a day for my nexus 9 to be taken to HTC and it was Thursday 9/10. However, I received an email on Wednesday saying that 9/10 was impossible and I have to reply right away if I want 9/11, otherwise, it will be way later than that. I finally changed it to 9/17 since I’d be on a business trip from 9/13 to 9/16. Strangely, I got a phone call on 9/12 from a deliver, who later came and take my nexus 9. I thought it is a good sigh as they came earlier than my expectation. It gets even more weird when I was waken up at 9/17 morning and asked to give my nexus 9 again my another delivery guy. I told him it was collected last week already and this must be a mistake. He quickly left and I feel very sorry for myself to be waken up at the next morning of my 4 days business trip :(. At this point, my hope was still quite high and I did not even think or worry about it.

Yesterday, I got an email from HTC which states that my nexus 9 didn’t have a single problem and it’d be returned to me as it is if I had . It said that my nexus 9 has been tested and no heating issue was found. It then blamed me for making my nexus 9 hot due to my usage like playing game, updating software or multitasking. That is it, no more questions, no more investigations. This is just ignorant and stupid. I already told the operator that I was using only chrome when my nexus 9 got hot. It happened even after factory reset, when there’s no apps installed in my nexus 9. I wanted to say to her I even do not play games, but probably she wouldn’t care or believe anyway. I do not know how the hell my nexus 9 was tested in HTC lab, but my guess was that they run some standard app, putting it to a cool room. HTC does not care how I was using it, it just simply states it is my fault to make the nexus 9 hot.

Reading the above email when traveling with my friend, I was in no mood to reply. A day later, I got a phone call from HTC’s operator, she quickly asked me if I agree to get my nexus 9 back and my answer was “仕方ないでしょう、はい” which means “I have no choice, right? OK, yes. “. Given my unsatisfying emotion, an operator from Amazon or Apple would definitely ask more to offer me more choices and help. However, predictably the HTC’s operator simply politely apologize in Japanese way, which normally just a procedure, and hang up.

I always consider myself as a lucky person since all expensive products I bought either work fine all the time or get covered by warranty services. It is certainly not the case anymore. I was really jealous when seeing one of my friend play with his Experia Z3 and I understandably wish I bought that one in the first place. The most important message I want to convey is that, think twice about buying a HTC product. Do you want to buy something costly without a decent warranty service? For me, the answer is pretty damn simple, NO!

Advertisements
Posted in Uncategorized | Leave a comment

My first day at work

I have joined MS on April 1st, and I have attended the training until this morning. This afternoon is the first time for me to come to the team. I have got two one-one meetings with my manager and mentor. They gave me a pretty good idea about my initial projects at MS. I am very excited.

I have received my brand new desktop and monitors. Their specs are beyond my expectation. The setup was a pain in the ass. It took about 3 hours to be able to boot into the start screen.

I am running home now, let’s write this later.

Posted in Life | Leave a comment

“Not having enough time”, really?

How do you explain your failure? I always blame myself first, others later if any. However, I have come to realize that the most common reason people use to explain their failures is the lack of time. I do not have enough time to study because of my hectic work schedule. I spend too much time on club activity so that I cannot pass the exam. The deadline for applying the scholarship is looming, I do not have time to write a reasonable SOP. I have heard similar things so many time.

Do we really not have enough time to do what we want? I do not think so. I think it is merely a lame excuse. I believe most people have complete control over their schedules, the inability of managing them leads to failures, not the lack of time.

I wanted to master my English skills back in high school, but I only managed to acquire a decent grammar and a limited vocabulary. Even though I was truly busy learning mathematics, I still have a plenty of time to play. The reason is not the shortage of time, but because I could not sacrifice the playing time for English. I guess I could not realize the importance of English at that time, and playing is obviously more enjoyable.

I have been editing some writings for a friend who is applying for a master scholarship. That is not a hard task for me any more, I actually enjoy it. However, I hope she could have taken more time to write the first and only draft, which was clumsy, diffuse and inarticulate. She told me she was too busy at work, the reason I cannot take any more. She knew she would have to apply for a scholarship years ago. She knew how important studying abroad is for her career. I have not once reminded her to practice English. Nonetheless, she has not spent time on improving her English skills, especially writing. She could not manage to spend around 10, 20 hours more to write her LORs or SOP. She is going to learn about management, but I truly hope she will be able to manage her time better first.

Managing time well is a challenging task, which I am not a master at all. I just want to stress the fact that we control time, not the way around. Our failures should be on US, not on TIME.

Posted in Life | Leave a comment

Triangle

http://oj.leetcode.com/problems/triangle/

The problem statement is deceptive by mentioning path from “top” to “bottom”. I was fooled at first and tried to compare all the ways from the top to the bottoms. However, it is impractical since there are O(2^(n-1)) such paths.
I think this is a typical demonstration of the difference between bottom-up and top-down dynamic programming. It would be remarkably easier if we start from bottom and do upward. The solution is very short when the idea is set.

class Solution{
public:
    int minimumTotal(vector<vector<int>>& triangle ){		
		int N = triangle.size();
		if(!N)
			return 0;
		vector<int> r = triangle[N-1];
		for(int i= N-2; i>=0; i--){
			for(int j=0; j<=i; j++){
				r[j] = triangle[i][j]+min(r[j],r[j+1]);
			}
		}		
		return r[0];
	}
};
Posted in Computer Science, LeetCode | Tagged , , , | Leave a comment

Sum Root to Leaf Numbers

http://oj.leetcode.com/problems/sum-root-to-leaf-numbers/
Another problem from Leetcode that I came up with two different solutions.
The first solution idea is to get paths from root to leaves first, compute the sum later. Those paths can be easily discovered by depth first search, while each path can be transformed to integer easily.
The second solution is much more elegant. There is no need to keep track of any paths, we calculate the sum as we go deeper from root to leaves. It runs a lot faster than the previous solution (12ms vs 36ms).

Second solution

class Solution {
public:
    int sumNumbers(TreeNode *root) {
       return sumNumbers(root,0);
    }
    int sumNumbers(TreeNode* root, int curr){
        if(!root)
            return 0;
        curr=curr*10+root->val;
        if(!root->left && !root->right)
            return curr;
        return sumNumbers(root->left,curr)+sumNumbers(root->right,curr);
    }
};

First solution

class Solution {
public:
    vector<int> pow10;
    int sumNumbers(TreeNode *root) {
        if(!root)
            return 0;
        pow10.resize(10);
        pow10[0]=1;
        for(int i=1; i<pow10.size();i++){
            pow10[i]=10*pow10[i-1];
        }
        list<int> path{root->val};
        return sumNumbers(root,path);
    }
    
    int sumNumbers(TreeNode *root, list<int> &path){
        if(!root->left && !root->right){
            return calculateSum(path);
        }
        int sum = 0;
        if(root->left){
            path.push_back(root->left->val);
            sum+=sumNumbers(root->left, path);
            path.pop_back();
        }
        if(root->right){
            path.push_back(root->right->val);
            sum+=sumNumbers(root->right, path);
            path.pop_back();
        }
        return sum;
    }
    
    int calculateSum(list<int>& path){
        int sum = 0;
        int n = path.size();
        int i =0;
        for(int p:path){
            sum+=p*pow10[n-1-i];
            i++;
        }
        return sum;
    }
};
Posted in Computer Science, LeetCode | Tagged , , , , | Leave a comment

Flatten Binary Tree

LeetCodeLink
I have solved this problem weeks ago, but today I completely forgot how I had solved it. As I tried to simulate the interview, I started to think and finally came up with a solution, which is interestingly different from the previous one. That’s what I want to write about this problem, not because it’s difficult or intriguing itself, but because it encouraged me to think twice from different perspective.

My first solution idea is that the problem can be solved by tweaking DFS: inorder traversal. We just need to keep track of the current pointer and the next one.

    void dfs(TreeNode* root, TreeNode* next){
        if(!root){
            return;
        }
        if(!root->left && !root->right){
            root->right = next;
            return;
        }
        else if(root->left){
            if(root->right){
                dfs(root->left, root->right);
                dfs(root->right, next);
            }
            else{
                dfs(root->left, next);
            }
            root->right = root->left;
            root->left=NULL;
        }
        else{
            dfs(root->right,next);
        }
    }

The other solution I came up today involve return the result as a pair of pointer.

    Pair flatten(TreeNode* root){
        if(!root){
            return Pair(NULL,NULL);
        }
        if(!root->left && !root->right){
            return Pair(root,root);
        }
        else if(root->left){
            Pair left=flatten(root->left);
            Pair right=flatten(root->right);
            root->left=NULL;
            root->right=left.first;
            left.second->right=right.first;
            if(right.second)
                return Pair(root,right.second);
            else
                return Pair(root,left.second);
        }
        else{
            Pair right = flatten(root->right);
            return Pair(root,right.second);
        }
    }

The two solutions are essential the same, but the point of practicing this problem is thinking path, not memorizing. There are tons of interesting problems come from binary tree, the more I solve, the more intuitive my thinking is.

Posted in Computer Science, LeetCode | Leave a comment

Bellman-Ford’s Algorithm

Dijkstra’s algorithm is fast, but limited to non-negatively weighted graph. It also does not applicable for distributed system. Bellman-Ford’s algorithm is the solution for the two problems. It is asymptotically slower than Dijkstra’s algorithm as its complexity is O(EV). However, it can solve shortest path in negatively weighted graph, and it is highly distributed. In fact, it is the basic foundation for modern internet routing.

The code is extremely simple

vector<int> bellmanford(Graph &g, int start=0){
	vector<double> distance(g.V(),INF);
	vector<int> parent(g.V(),-1);
	distance[start]=0;
	parent[start]=0;
	for(int cnt=1; cnt<g.V(); cnt++){	
		for(int from=0; from<g.V(); from++){
			for(auto e:g.adj[from]){
				double dis=e.weight()+distance[from];				
				if(dis<distance[e.to()]){
					distance[e.to()]=dis;
					parent[e.to()]=from;					
				}
			}
		}
	}
	return parent;	
}

Posted in Algorithms, Computer Science | Tagged , , , , | Leave a comment