My Rambling Thoughts

Quote:

Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.

Brian W. Kernighan

News:

Date: . Source: .

The collapse starts

finance

MF Global has filed for brankruptcy protection. It is not exactly a big firm, nor a bank. But this could be the start.

Interesting times ahead. (The same way icebergs are ahead of Titanic.)

The last bubble, the student loans

finance

Where there is cheap credit, there will be a bubble. The US has several bubbles since the late 90s: the Internet, the housing, credit cards and now, student loans.

Total outstanding student loans now exceed US$1 trillion, exceeding even credit card loans — and credit card debt has always been a thorn in American households.

I'll say the current situation with student loans is due to unintended consequences. From what I read, some medical students abused the bankruptcy law in the 80s to discharge their substantial student loans.

Like credit card loans, student loans are unsecured loans, meaning the lender does not get anything in the event of a default. After all, students don't have any assets yet, right?

The law was gradually changed to make student loans non-dischargeable. Yup, you are stuck with it for life.

And what happened? The lenders are now willing to lend more. And education costs went up as well. (Demand outstrip supply due to cheap loans.)

And young people, without knowing any better, took on bigger loans and studied worthless subjects. Well, worthless in the sense that they have no earning ability to justify the cost of education.

And of course, the loan allows them to "live it up" — to live "beyond their means". And that sets them to live a life of debt.

That's why now there are calls to make student loans dischargeable once more. It'll make lenders more prudent, make smaller and more sensible loans, make loans subject to acceptable results, and education will become more affordable again.

Now, even today, there is a way to discharge "student loans". Where there are rules, there are ways to break them.

What you do is to borrow just enough for the first semester or year, then take on as much credit card debt as you can. Live on that. After you graduate, declare bankruptcy. It'll trash your credit for seven years, but you are free after that.

I read about this online. Don't know if it actually works. :hmm:

Greece defaults, or not?

finance

Today, bondholders are forced to write down 50% of their Greek debt. It is a default. Except that it does not trigger CDS (Credit Default Swaps). It means the bondholders are really out their money and if they bought any CDS for insurance, they were doubly screwed.

(Anyway, CDS is a scam, so it's no big deal, actually.)

Well, it is clear that laws and rules are optional when it comes to too-big-to-fail. Just make them up as you go along.

This is the start of an interesting ride. Finally, something substantial happened.

The first question is, why would anyone else pay their debt? Just "default" and get 50% of your debt waived off!

Really top-of-the-line poker chips

Dal Negro mother-of-pearl poker chips.

DNG 1 DNG 5 DNG 10 DNG 50
DNG 100 DNG 500
DNG 200 DNG 1000

To this day, these are the most beautiful poker chips I've seen. They are slightly smaller than usual, though: 35mm vs 39mm for standard clay poker chips.

However, I couldn't afford them five years ago, and I still can't afford them today.

(One tube of 50 round chips cost about 18 pounds, a set of 25 small plaques cost around 14 pounds and a set of 15 big plaques cost around 12 pounds.)

Very few places carry them, and most of them are out-of-stock! Sets are more worth it, but are even more rare.

I wished I had bought them then, so that I don't have to think about it now. :lol:

But, I think the chance of me owning this set is rather low. I neither need nor want them. I just think that they look beautiful. :love:

Ok, I confess: I want them. :-P However, there are many more things on my wish list before it comes to this. :lol:

My run of the mill poker chips

A few years back, when I was into boardgaming, I wanted to use poker chips to replace paper cash.

I was looking for plain numbered chips. Most chips have ghastly color combinations. Numbered chips were quite hard to find. (It's now easier.)

Also, it was important that the colors are correct: $1 is white, $2 is yellow, $5 is red and so on; these are standard poker chip denominations.

After much searching, both locally and online, I got a set of 400 gold foil numbered (double-side) card-suit 11.5g poker chips. The chips were affordable, but the shipping from UK to Singapore really kills.

Numbered Suit Poker Chips

I didn't get the $25 chip (green) , nor the $250 (pink), $1,000 (light blue) and $5,000 (coffee) chips. I didn't think $25 and $250 were useful. $1,000 and $5,000 were too high values. I didn't think I'll use them. Plus, once we reach $1,000, we typically switch to rectangular plaques.

It turns out that I seldom use the chips, because the gold foil number wasn't as durable as I thought. It can peel with moderate use.

So, they are only used on special occasions. :lol:

But I want to use them more often. That's what I bought them for, right?

What has the world come to?

News: Help me up... so I can sue you

Date: 21 October 2011. Source: ST.

Legal precedents, lack of protection deter Good Samaritans in China

The story of Peng Yu and Xu Shoulan is not part of China's rich collection of ancient folk tales, but most Chinese are familiar with it nonetheless.

In 2006, Mr Peng, a 26-year-old technician from Nanjing, went to the aid of Madam Xu, 65, who had fallen and broken her hip during a scrum to board a public bus. He took her to hospital and even gave her 200 yuan (S$40).

She returned the favour by accusing him of causing her fall and suing him.

By now, everyone should have read the news — and watched the video — where the Foshan two year-old toddler was ran over two vans and ignored by 18 passers-by.

There is no fairy tale this time. The toddler has succumbed to her injuries and died.

Frankly, I can't be surprised by any news that come out of China. Corruption, poor worksmanship, copyright violations, toxic materials, environmental pollution, I take them as they come. It's a money-talks and free-for-all society. It's exactly like those shows that depict China in 1920s. (I like that era, I must say. Freedom, money, glamour. But it was also a dangereous time.)

But I couldn't help but get misty-eyed when I watched the video.

It is true that being a Good Samaritan can give you legal problems later on. I was surprised when I first read about ungrateful victims. It was beyond my comprehension. But later I understood why. These people could not accept their misfortune and blame it on the person they associate the misfortune with — ironically of all — the person who went to their aid.

It's a cruel world.

Here's what a pragmatic Good Samaritan can do: do something, but don't stick around.

The origin of the Good Samaritan

Everyone knows what a Good Samaritan means: a stranger who goes to the aid of another stranger in need.

Jesus Christ told this parable to a Jews audience. But not everyone knows that in the parable, Samaritan and Jews despise each other. It was a shock for a Samaritan to help a Jew.

In today's context, it'll be a Good Palestinian helping an Israelite. It's not something you'll expect.

Imminent disk failure!

I haven't logged into my Linux server via VNC for some time. Imagine my surprise when I did so and I saw this error message in red: "Disk failure is imminent".

The reason is due to the reallocated sector count.

I'm a bit skeptical, but I'm not taking chances with my data.

As fate would have it, Thailand is having a flood crisis and much of the world's hard drive production comes from there. (It used to be from Singapore just 4-5 years back.) Although there isn't shortage yet, HD prices have already went up, or so I read.

It is my destiny to buy at the peak. So, off to shopping.

It looks like external 3.5" drives are on their way out. There are now more 2.5" drives. It's obvious why: they are large enough (at least 500 GB), more portable and can be powered via USB port.

But I'm not after portability. I'm after capacity. To my surprise, the most common capacity is still 1 TB. 1.5 TB and 2 TB HDs are rare. I didn't see any 3 TB HD at all.

Some price points: 500 GB (2.5") for $89, 1 TB for $109, 2 TB for $139. These are the cheapest. A 2 TB HD can cost as much as $229. I wonder what's the difference.

In the end, I got a 2 TB WD My Book Essential for $169. (I didn't have much choice; I went to Suntec City instead of SLS.)

WD My Book Essential

I probably still need to get a replacement for the internal drive. Hopefully prices stay the same, or pray that my disk works until the prices come back down!

(As an example, the internal 3.5" 2 TB WD Caviar Green SATA-3 HD currently costs $139.)

But I really hope the disk continues to work. I don't want to reinstall Ubuntu!

And I also need another strategy for a 24/7 server. Why does the disk fail just after one year? How can I make it last longer?

Know thyself, part 2

If you are on a sinking ship with Li Xin and Lim Cheng and you can save only one, who will you save?

"Gentlemen, it has been an honour working with you."

(I've always wanted to say that! :-P)

Note to self: don't be on the same ship as them.

The person you admire, and why?

I used to admire different people at different times because of their deeds, charm or beauty. But I haven't have anyone in mind now.

What is one change you would love to see in our team?

More interaction!

Confusing operators

programming

C uses most of the keyboard symbols for operators and other purposes. The only unused ones are `, @ and $. (_ is not used as an operator, but it can be part of an identifier.)

Some of the operators can be confusing because they have different meanings depending on the context.

Parenthesis

There are four uses: as part of if/while/for/switch expressions, to override operator precedence, to call a function and for typecasting.

&

Gets the address of a variable when used as an unary operator, and as bitwise-and when used as a binary operator.

*

Dereferences a pointer when used as an unary operator, and as multiplication when used as a binary operator.

Compound operators

Some multiple-symbol operators are too close to one another.

<< is left-shift, but <= is less-or-equal-to. And <<= is left-shift-and-assign.

a+=b means a = a + b, but a=+b means to assign b to a (+ is an unary operator in this case).

a->b is to access the member b through the pointer a, but a>-b is a conditional: whether a is greater than -b.

!= exists, but not ~=. (And != is not an assignment operator!)

The C bitwise operator precedence is wrong!

programming

An operator precedence table shows how sub-expressions are binded to the operators. For example, we all know that 1 + 2 * 3 is 7 and not 9. * has higher precedence than +, so the expression is 1 + (2 * 3).

It is important to know the precedence table because it allows us to avoid unnecessary parenthesis and makes the expression easier to read.

Some people say they prefer to bracket "to be safe". Bullshit! I'll like to know how they interpret this expression:

a = b + c;

Why don't they bracket it: a = (b + c)?

Obviously, they do know about operator precedence. It's just that they don't bother to learn the full table.

The C operator precedence table is especially important because it is used as the basis for most C-style languages: C++, C#, Java, JavaScript, Perl and PHP.

The problem is, C got some of the precedence levels wrong — and the error has propagated for over 30 years!

Can the precedence table be wrong? It is just made-up rules, right? We just need to remember them.

Well, there's something call inituitive-use. Let's take a look at part of the table:

3* / %Arithmetic
4+ -
5<< >>Shift
6< <= > >=Relational
7== !=
8&Bitwise
9^
10|
11&&Logical
12||

Just as we expect a + b == c to mean (a + b) == c, we expect a & b == c to be the same. But no, it means a & (b == c).

The bitwise operators (& ^ |) have lower precedence than the relational operators (== != and others), and that's wrong.

Then we look at shifts and bitwise operators. Should a << b & c mean (a << b) & c or a << (b & c)? No preference either way, actually.

Then we look at arithmetic and shift operators. Should a << b + c mean (a << b) + c or a << (b + c)?

Also, Should a & b + c mean (a & b) + c or a & (b + c)?

Personally, I'll say & and ^ have higher precedence than *, and | should have higher precedence than +. So, the table should look like this:

5<< >>Shift
8&Bitwise
9^
3* / %Arithmetic
10|Bitwise
4+ -Arithmetic
6< <= > >=Relational
7== !=
11&&Logical
12||

This will highly confuse a C programmer, though!

The best thing to do is, always bracket when mixing arithmetic and bitwise expressions. :lol:

Note that Python and Ruby do the right thing by moving the precedence of the bitwise operators above the relational operators. However, they are below the arithmetic operators. I think this is good enough.

Psychology trumps science

I cannot live without Champagne. In defeat I need it, in victory I deserve it.

Napoleon Bonaparte

My version when I'm not feeling well, especially when I have running nose or sore throat:

I need my Pepsi. In sickness I need it, in health I deserve it.

Although soft drinks don't help directly with sickness, they improve my morale, and hence my body can recover faster.

(I seldom drink soft drinks, but I crave it when I'm sick. :lol:)

Sometimes, there is more than just drugs and science involved. There is much in this world that we don't understand — we must keep an open mind. (But not too open that we believe anything!)

Time to leave C behind

programming

C was invented in 1973. By 1978, it has stablized. A C program written then could still be compiled today. That's over 30 years ago.

What's wrong with C?

One word: it's too low-level as a general-purpose language.

Consider: manual memory management, lack of strings and array containers.

Half the time you are struggling with housekeeping stuff.

And it is way too easy to make mistakes — that can be exploited to crash the program or to gain unauthorized access.

Strings

We use strings whenever we deal with user I/O. It is a basic data type.

Does C have strings, or does it not?

The C language recognizes literal strings (such as "hello") and converts them to an array of characters terminated with '\0' (NUL). And that's it. The rest of the string support is in the form of the C string library: strcpy, strcat, strcmp and so on.

So, strings are just character arrays terminated with NUL.

It is now easy to see the main problems:

  • We can find out the length of the string, but how do we know the capacity of the array? They are two different things.
  • If we want to make a copy of the string, how do we allocate space for it? A fixed buffer on the stack? On the heap? Who is going to free it if we need to pass it around?

Many times, we just want to use strings. We don't care how inefficient it is or how much overhead it has!

Array containers

Like strings, arrays in C are not what you expect from other languages.

We can define an array with a fixed number of elements (say, int list[10]). This is the same as other languages.

In usage, an array decomposes to a pointer to the first element of the array. Most of the time, it does not even know its own size!

We can catch a glimpse of this behaviour with this code:

void fn(void) {
  int src[10];
  int dest[10];

  dest = src;
  }

This does not compile. Not under standard C anyway.

We can copy scalar variables and structures, but not arrays. To copy an array, we need this code:

memcpy(dest, src, sizeof(dest));

It seems confusing until you realize arrays decompose to pointers during use.

Another example:

void fn(char list[]) {
  printf("%d", sizeof(list));
  }

void fn2(void) {
  char list[10];
  fn(list);
  }

In a normal language, we would expect to see 10. In C, we see 4 (on a 32-bit platform). The reason is that the code actually reads like this:

void fn(char *list) {
  printf("%d", sizeof(list));
  }

It's a pointer!

Note that arrays are not pointers. In definitions, arrays are arrays. However, arrays decompose to pointers to the first element in usage. This is a big confusion for new C programmers.

And we ask, can we have an array that knows its own size, stores a variable number of elements and can automatically resize itself? Yes, it can be done, but we have to do it ourselves — in every C program that we write.

Manual memory management

Much of C code uses pointers, due to lack of higher-order data types and pass-by-reference. The problem with pointers is that you never know if you need to free them. A pointer can point to the data section, the stack or the heap.

This is especially when we are dealing with variable-length arrays, including strings. It is difficult to create functions that return variable-length results, since they then have to deal with memory allocation. The solution is to pass in an array, but this just shifts the problem to the caller. How is he going to (i) allocate the space, (ii) know the maximum limit?

The takeaway

It's time to add real strings and arrays to C, as well as limited garbage collection. :-D

Sure, the new language won't be directly compatible with C, but it will be close.

There is no need to live with limitations from 30 years ago, no?

A computer giant passes away

Dennis Ritchie, the designer of C and co-creator of Unix, passed away on 8th October.

#include <stdio.h>

int main(void) {
  printf("goodbye, world\n");
  return 0;
  }

His legacy lives on.

My views on Steve Jobs

A friend asked me to elaborate why I don't like Steve Jobs. Let me quote Mr Stallman, the founder of Free Software Foundation.

Steve Jobs, the pioneer of the computer as a jail made cool, designed to sever fools from their freedom, has died.

As Chicago Mayor Harold Washington said of the corrupt former Mayor Daley, "I'm not glad he's dead, but I'm glad he's gone." Nobody deserves to have to die — not Jobs, not Mr. Bill, not even people guilty of bigger evils than theirs. But we all deserve the end of Jobs' malign influence on people's computing.

Unfortunately, that influence continues despite his absence. We can only hope his successors, as they attempt to carry on his legacy, will be less effective.

Richard M. Stallman

He got a lot of backslash for that, of course.

I admire Steve Jobs for his single-minded pursue of his vision and his uncompromising attention to simplicity, especially on the user experience. You can tell he is not just after quality, but perfection.

Steve Jobs is like a hot knife that cuts through glue like butter. We have too many layers and too many inter-group politics in a big organization. We need someone like him to provide a clear vision, and is strong enough to unify everyone behind him.

Steve Jobs also has good showmanship. Everyone should learn a thing or two from him. Presentation counts.

I dislike him for lack of choice. Computers are very versatile machines; their potential is only limited by our imagination (and skills). But Steve Jobs only wants you to do what he says you can do. He wants to sell you an appliance, not a computer.

A soft-boiled egg breakfast

Soft-boiled eggs

Missus has never seen this soft-boiled egg contraption before. It's very simple to use: just pour boiling water inside and wait for it to leak away. The eggs will be perfectly soft-boiled after that.

While it works nicely, I always found it a bit of an overkill. Just put the eggs into just-boiled water and time 3-4 minutes, depending how well-cooked you want them to be.

A decent cutlery set at last

I had a shopping voucher that I needed to use before it expired, so I decided to buy a cultery set with it.

I'm looking for a very plain traditional design. This set is marginally acceptable, except that it is 24pc instead of 30pc (lacks desert fork).

(Not that I have much choice. There were only a few sets to choose from.)

This set costs RM110, but the MSRP is actually RM100. An online shop even sells it for RM75! :-O Yes, the shopping mall I went to is overpriced.

After I bought the set, I googled a little on flatware. It seems there are 18/0 and 18/8 flatware. The latter contains 8% nickel and will retain its shininess over the years. My set is 18/0. :-(

It turns out that a 18/8 set is at least double the price! But I would have gotten it if the design is right. For example, I like the Felli Luxor flatware, but a full set wasn't available. It has a plain design with the correct shape, size, proportion and has rounded ends. A 30pc set costs RM260. Very expensive, but also very high class. I'll feel like eating at a restaurant everyday. :lol:

(Note: RM260 is S$107.)

Apple diminishes its glow

Steve Jobs passed on on 5th October 2011. Most people mourn for him as they remember him for his iMac, iPod, iPhone and iPad products — products that are created after 2000.

For me, the Steve Jobs I remember is from the 70s and 80s. That was when he was working on the Apple II and first Mac computers. Steve Jobs was not an easy person to work with. He wanted total control and seeked no less than perfection. Strangely, I never read if he had any arguments with Steve Wozniak (the Apple co-founder), a techincal genius. That made me wonder if you have to be really technically good and strong-willed before you can face-off with Steve Jobs.

All I have to say about Steve Jobs is that I don't like him, but I do admire his vision and work.

Programming quotes

programming

There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies.

C.A.R. Hoare

Be simple and elegant.

It's the only job I can think of where I get to be both an engineer and an artist. There's an incredible, rigorous, technical element to it, which I like because you have to do very precise thinking. On the other hand, it has a wildly creative side where the boundaries of imagination are the only real limitation.

Andy Hertzfeld

Programming is science, art and craft. That's why it is so difficult to master.

Writing the first 90 percent of a computer program takes 90 percent of the time. The remaining ten percent also takes 90 percent of the time and the final touches also take 90 percent of the time.

N.J. Rubenking

The reason why schedules are unreliable and always slip.

Good code is its own best documentation. As you're about to add a comment, ask yourself, "How can I improve the code so that this comment isn't needed?"

Steve McConnell

I belong to his school of thought, having read his Code Complete book.

Version 1 of any software is full of bugs. Version 2 fixes all the bugs and is great. Version 3 adds all the things users ask for, but hides all the great stuff in Version 2.

Fred Blechman

Why you should always improve your program. It takes three tries to be good.

When in doubt, use brute force.

Ken Thompson

My favourite last resort. :-D

Just what kind of place is Malaysia?

I'm the worst salesman when it comes to Malaysia. Malaysia has so much to offer: cheap stuff, good food, exotic and natural locations. And it is peaceful. No chance of war, very little chance of riot.

And what do I tell people? Malaysia is a lawless place.

Mr Lee Kuan Yew said this in 1997:

"Of all places, he went to Johor," Mr Lee said. "That place is notorious for shootings, muggings and carjackings. It does not make sense for a person who claims to be fearful for his life to go to a place like Johor."

He was spot on. Despite that, he was forced to apologize for his remarks. (It must have been very infuriating for him. :-D)

Malaysia is a place where you can get robbed at knife-point in shopping malls or petrol stations, and passerby will be none-the-wiser.

Malaysia is a place where, if you walk on the pavement, your bag will get snatched away by motorcyclists.

Malaysia is a place where, if your car gets hit in a deserted place and you know it's not your fault, you better not get down from your car.

Malaysia is a place where, even if you parked your car behind a locked gate, the thieves will remove the gate and steal your car.

Malaysia is a place where, if you get robbed, the police will say there is nothing they can do.

Malaysia is also a place where, despite being a Muslim country with strict laws, you can't tell when the sun goes down; and you can get prohibited items and substances easily.

So Malaysia is a lawless place. But you know what? I love it here! :lol:

You want to park your car? You can do so anywhere you want, as long as you don't obstruct other people. You want to sell something? Just set up a store beside the road or in the backlanes. No permit required. You want to throw rubbish? Just throw anywhere. There are no dustbins anyway. (Okay, this one isn't too great.)

I bet, if you want, you can even find an empty plot of land and farm it, and catch fish in the river. There is no need to work.

The point is, it feels free. It is chaotic, but that makes it lively. The pace of life is also slower. It's like time slows down once you crossed the causeway. Malaysia is also much bigger, so it has much more open spaces. It automatically makes you more relaxed.

Back to the bad stuff. Will it happen to you? Well, it may. Thus, you must be cautious at all times. And you must be prepared that bad things can happen — despite your precautions.

Rule #1: don't look out of place.

Rule #2: be in a group.

Rule #3: avoid deserted places.

Rule #4: check the surrounding from time to time. Anyone observing you? Any motorcycle trailing you?

Rule #5: night time is much more dangerous, because there aren't many street lights.

Once you learn to take care of your safety, you can relax a little and enjoy what Malaysia has to offer! :lol:

Who sold my Ferrari?

I've heard of the book The Monk Who Sold His Ferrari a long time, but I dismissed it because I thought it was overhyped.

A well-paid high-ranking man who "went to the east", discovered his spiritual self and renounced his material wealth?

His journey may be inspirational for him, but I've read too many of such stories. Call me cynical. :lol:

Then, I really went and read it.

It was even worse than I expected. The tale was not real. It was a fable. The book is not a biography, it's a self-help book! :-O

In the end, I just looked at its seven key messages and mostly ignored the fable.

For me to read a self-help book, it must have a topic I am curious about and be somewhat scientifically grounded. Most important of all, I must not realize it is a self-help book! :lol:

I won't admit to the kind of self-help books I usually end up reading. :blush: :lol:

The declining fortunes of Firefox

Once a new technology starts rolling, if you're not part of the steamroller, you're part of the road.

Stewart Brand

Judging by market trends, it is predicted that Google Chrome will overtake Firefox as the 2nd most used browser as early as December this year.

Well, Firefox has its moment in the sun for the past 4 years. Why people are abandoning it:

  • It feels sluggish
  • It is a memory hog
  • It leaks memory
  • It is not stable; it crashes frequently enough
  • Frequent updates break extensions

For most part, Chrome is good enough.

In hindsight, it is obvious Mozilla should have created a mobile browser earlier and positioned Firefox as an app platform. They tried, but they didn't really put their heart in it.

Sticking to what one's does best is good in the short term, but it can be disastrous when the tide changes.

I'm not a loyal user of Firefox, so its rise and fall does not matter to me much. I'm using Opera, whose market share has never crossed 3%.

I must admit I use Firefox/Firebug as my primary development browser. Maybe I should donate to Mozilla. :-P (Well, I've donated to jQuery before.)

Not everyone survives a paradigm shift

News: Clock Ticks as Kodak Burns Cash

Date: 27 September 2011. Source: WSJ.

Shares Plunge 27% as Investors Worry Ailing Company Can't Pull Off Turnaround Plan

With its shares closing at their lowest level since the 1950s and investors bailing out of its bonds, Eastman Kodak Co. is under the heaviest pressure yet to prove it can pull off a plan to reinvent itself as a company that makes printers.

Investors' immediate concerns focus on whether Kodak will have enough cash to finish the job. To settle those concerns, Kodak will have to quickly show results from asset sales, patent-suit settlements or an improvement in its businesses, all of which it told investors this summer were on track.

Kodak's shares crashed a further 54% on Friday amid bankruptcy rumors.

A paradigm shift means a distinct change. Even ten years ago, it was clear film was dying; digital is the way to go. The two biggest film makers, Fuji and Kodak, had to reinvent themselves to survive in the digital world.

(Canon released the first "affordable" 3Mpx D30 at US$3,000 in 2000. It has a APS-size CMOS sensor.)

Today, it looks like Kodak is not going to make the cut. It's not for the lack of trying. Kodak was not in denial. It did try to roll out its own DSLRs (licensed from Nikon), but it didn't work out.

I'll say Kodak's main problem was that it didn't own any of the key technology: camera, sensor, lens.

Sometimes, you can try, but you still don't make it. There are no guarantees in life. :-(

There is another company closer to my heart: Microsoft.

I have used MS-DOS 2.0 to 6.22, watched Microsoft work with IBM to release OS/2, launched the ground-breaking Windows 3.0, released the properly-designed multi-platform Windows NT, then the "great leap forward" Windows 95 — and the rest was history. In a sense, I grew up with the company, and yes, I like the company. :lol:

Windows, Office and IE, who do not use them today? But will the monopoly last forever?

These software run only on "heavy" desktops and notebooks. The trend now is "light" tablets and mobile phones. More and more people find that they don't really need a PC after all.

Microsoft also tried to break into this market, but it just didn't succeed. Again, it was not for the lack of trying. There is something about big companies with old monopolies. They can't adapt that easily.

Time will tell.