Monday, January 19, 2015

Technology and friendship

When I first started using Facebook, there would be great excitement whenever a connection to a long lost friend was reestablished. At that time, I accepted friend requests from close friends, acquaintances, remote relatives or even strangers. There wasn’t any filter whenever I shared my thoughts.

Overtime I realized despite the thousands of friends I had on Facebook, a great number of them was really strangers. Times and times again I found it inappropriate to discuss more personal matters openly. After some spring-cleaning, my friends are now people with whom I have had interactions, regardless how little. I figure that is the least I could do to keep my sanity on Facebook.

As social media became a part of my daily routine, I had a deeper understanding about friendship; not every good person we met could eventually become a closed friend. In his novel Demi-Gods and Semi-Devils (Tian Long Ba Bu), Louis Cha has a very vivid description of this exact predicament.

In this story, the only punishment of anyone who had committed the crime of betrayal to the boss was death. However, the boss could overrule the death penalty if he chose to cleanse the crime with his own blood. 

As the boss snatched away the knife from the accused when he tried to kill himself for his crime, the boss said, “I am like a cowboy and I do not like to hangout with people who are meticulous and calculative. I too like to drink and laughed loudly with friends. That is why although we work together, I usually choose to drink and make a lot of noise with the lower ranked members.  That is just how I am, and it does not mean that I have something against you. You never get drunk and are extremely careful in dealing with the gang business. This is a fine quality that I can never be better than you.”

Then he pierced the knife into his own shoulder to cleanse the crime of the accused.

In this story, Louis Cha pointed out that two great men may not be able to be close friends simply because of the differences in characters and belief, and not because someone else has committed some unspeakable sins.

And there are a great variety of people with different viewpoints and characters on my Facebook. Therefore, it could be challenging to discuss my viewpoints at times; and there have been unpleasant experiences where I offended people unknowingly.

To avoid such miscommunications, I chose not to say so much. Or I only share things that do not matter. Or I just come here to see my friend’s recent activities. And because of these reservations, a great platform on which we could build better friendship has deteriorated to something very skin-deep.

I am in the technology business. I once naively believed that technology could fix anything. I only understood after my 40th birthday that technology could not replace the warm feeling shared when having diner with my old folks, or the boisterous laughers cheered during drinking sessions with my buddies, or the creativity generated during brainstorming session with my partners. Physical contacts are still required to create fire.


In the Chinese character, we need to first have a heart before we can have a relationship. So in this new year, please give your loved ones a big bear hug.


January 18, 2015. Kuala Lumpur. 

說情

剛有臉書的時候,常常會因找到失聯的朋友而興奮不已。不論是深交,點頭交,熟人,陌生人,都能加入成好友。那時候什麼都說,什麼都分享。

慢慢的發現,千多個朋友裡面,很多是不來往戶。有時候只想對熟人分享的資訊或事,公開發表會很不妥當。大掃除後, 刪了好多不認識的人;朋友圈裡面剩下了算是有過交流的。

隨著人和事的逐漸累積,了解到並不是所有的好人,都能交心。天龍八部裡面,金庸說到喬峰用自己的鮮血洗淨陳孤雁長老的叛變罪時,有過這樣的描述,寫的很貼切。

他目光緩緩向陳長老移去。陳長老性情乖戾,往年做了對不起家門之事,變名出亡,老是擔心旁人揭他瘡疤,心中忌憚喬峰精明,是以和他一直疏疏落落,並無深交,這時見喬峰的目光瞧來,大聲道:「喬幫主,我跟你沒什麼交情,平時得罪你的地方太多,不敢要你流血贖命。」雙臂一翻,忽地從背後移到了身前,只是手腕仍被牛筋牢牢縛著。原來他的「通臂拳功」已練到了出神入化之境,一雙手臂伸縮自如,身子一蹲,手臂微長,已將一柄法刀搶在手中。
喬峰反手擒拿,輕輕巧巧的搶過短刀,朗聲道:「陳長老,我喬峰是個粗魯漢子,不愛結交為人謹慎、事事把細的朋友,也不喜歡不愛喝酒、不肯多說多話、大笑大吵之人,這是我天生的性格,勉強不來。我和你性情不投,平時難得有好言好語。我也不喜馬副幫主的為人,見他到來,往往避開,寧可去和一袋二袋的低輩弟子喝烈酒、吃狗肉。我這脾氣,大家都知道的。但如你以為我想除去你和馬副幫主,那可就大錯而特錯了。你和馬副幫主老成持重,從不醉酒,那是你們的好處,我喬峰及你們不上。」說到這裡,將那法刀插入了自己肩頭,說道:「刺殺契彤國左路副元帥耶律不魯的大功勞,旁人不知,難道我也不知麼?」(天龍八部,十五章,杏子林中 商略平生義)

通過喬峰,金庸點出了就算是好人,因為個性,愛好上的分別,也未必能成為好友。不見得就是對方做了什麼不可告人的事情。卻卻是曲洋和劉正風這樣的黑白兩道的死對頭,反而成了生死之交(笑傲江湖)。因此友情不能單純的以好人或壞人來區分。現實生活中,像岳不群這樣的正人君子比比皆是。

我臉書上就有太多不同個性與信念的朋友。分享看法的時候,就有了些難度。也發生過因發表意見而無意開罪別人的不愉快。

為了減少這些無謂的爭執,就選擇了不說。或儘量選些無關痛癢的事情來分享。又或只是上來看看朋友們的動態。而一個本來是用來聯繫,加深友情的的平台,就這樣逐漸地被表面化了。

我是個搞科技的。以前我總是天真的認為,科技能取代一切。過了四十才領悟到,和老人家一起吃飯閒話家常時的溫馨,和好兄弟一起舉杯共飲時的豪邁,和好夥伴一起腦力激盪時爆發出的創意,和好朋友聚會時的歡樂,都不是任何尖端科技能取代的。火花,還是要實在的碰撞才能產生的。

有了心,才能有情。今年,給你愛的人,一個結實的擁抱吧

2015-01-18。寫於吉隆坡。



Friday, August 31, 2012

緣起

禮堂裡面喧鬧一片,大喇叭在嘶啞的播著不熟悉的歌曲。服務員們穿梭於餐桌之間,夾插許多不懂是家長還是校友的宴客,在會場起起落落。帶位員感覺到我的迷失,費了好些時間,終於把我引到事先編排好的座位。

同座的臉孔陌生中帶些熟悉,互相禮貌的點頭微笑,然後繼續著和夥伴們的聊天。太太的眼神里,有些煩躁,我們和這一切是那麼的格格不入。宴席還沒開始,而雪華有些事還在路上。面對著陌生與煩囂,原本忐忑的心,更是有點後悔了。

月前收到莉的短訊,通知母校將搞個千人宴籌款。大家都知道這年頭獨中的不容易,所以當雪華聯繫上我時,不猶豫的就答應了。除了對母校的微薄貢獻,更多的是懷念求學期間的事情。厭倦了商場上的勾心鬥角,綿綿不絕的各種良/惡性競爭, 總是渴望能再尋回單純些的友情。

但,心理深處也有些疑惑; 可以嗎?二十多年不見,同學們肯定有所改變。大家過的好嗎?這次千人宴能見到他們嗎?

時間一刻刻的過去。太太煩悶了也開始玩手機。枯燥中我偶爾向會場掃描,盼望會遇上一兩張熟悉的臉孔。悶的有些發慌,怎麼這麼心急早到呢?好端端的一個星期五晚,大老遠的跑來這裡,吃這無聊的晚宴。偏偏這千人中,也遇不上一個故友,還真可以算是件奇事。

這幾天在工作上忙碌的疲憊,漸漸湧了上來。

倏忽間有人坐到了我旁邊,一開口,“你是梁永順!”對馮老師的驚人記憶感覺訝異的當兒,鬱悶感也跟著煙消雲散。心理也覺得自己好笑。老師問起我這幾年的經歷,談話中,隱隱感覺她對學生的關懷依然。

聊著,旁邊桌忽然起轟,“飲勝!”抬頭一看,維漢正在人群中和他們乾杯。終於來了個同輩的。 看到老同學,感覺踏實了些,便過去和他碰個杯。

正乾杯中,來了個女的,“嗨!梁永順,我是你同學,記得我嗎?”躊躇了好久,對方的笑容也逐漸僵硬了起來。“您是夏老師!您一點都沒有變化!”,老師的笑容,也隨著我的忽然開竅而更燦爛了。去去去,怎麼我老化的比老師還快啊?

談笑間,驀然回首,瞄見遠處飄來了個二十多年不見的身影,盈盈的走著過來。笑容依然,青春如故,歲月仿佛沒有在雪華的臉上留下任何痕跡。大家寒暄不久,宴席就開始了。回到位子上,雪華介紹了順欽 。他原來是高二來的,當時我已離開了。

後來,團標也來了。在大家得體又有禮的談話中,感覺之間的關係疏離了 。也暗暗的在安慰自己,畢竟也這麼久沒見,淡了也是必然的。離開前,大家應酬式的互相留下了電話後,答應會保持聯絡。當時也沒有放在心上,只是覺得應該短期間都不會再見了。

無法預見的是,千人宴雖然只是一顆小石頭,但是它在之後我生活中,已造成了不可扭轉的變化。

那又是另一個故事了。



Sunday, November 13, 2011

App Crash in IOS 5.0.1

I updated my old iPhone 3GS over the air to IOS 5.0.1 two days ago and the experience was a cool one. This is the first time I could do something like that without needing to connect my phone to iTunes.

However, there were a few problems with the upgrade. I found out that my phone was slower, and applications are crashing more frequently. Applications like WhatsApp, or Facebook kept crashing seconds after I launched them, and thus rendered the phone useless.

I finally could not take it anymore and took it upon myself to find a solution to this. When I launched SystemLite, it showed that I only had only 3-4 MB of free RAM. Something is very weird here as I am supposed to have 256MB RAM for 3GS, and the numbers don't add up. I think there is some serious flaw in IOS memory management.

Anyway, by accident, I found a way to work around this issue. Apparently IOS gives more priority to its core app like Camera. Anytime I found my applications are crashing like crazy, all I need to do is to launch Camera, kill it and then I suddenly will have more than 100MB of RAM. And from that point on all the apps will be running fine. I have tested it on a few phones and a number of times, and it has worked like a charm. It even worked on older version of IOS.

The following is a series of steps to demonstrate how this works:

  1. Trying to launch my Facebook. The splash screen showed up but then it crashed within a few seconds.
  2. Launching SystemLite and it shows that I only have 3MB of RAM free.

  3. So I just launched the Camera app and it crashed too.

  4. But now when I opened up the SystemLite, the available memory suddenly becomes 115MB.
  5. And from this point on my Facebook works like a charm.

Saturday, November 12, 2011

Story of two grannies

This is a story of two grannies who had gone through similar hardship in life. I met them a while back and they both shared the following bad experiences:
  • Both of them were orphaned at a very young age, and both were adopted.
  • Both of them married an alcoholic, and had difficult marriages
  • Both of them had disrespectful and unfilial children
  • Both of them had kidney failure and had to go through painful dialysis
There could however be no bigger contrast in how they viewed life.
The first lady looked at life as a blessing and as she had gone through all the adversities when she was younger.

She felt that her life was never better and she was at a much better place now.

She was also a volunteer worker for an NGO helping the less fortunate ones.

The 2nd lady was however outrageous when we discussed her past. She blamed her sons and cursed her daughters in law. She was angry with God because he was unfair to her.

Although this lady was also part of the same NGO, she was not a volunteer but a patient suffering from clinical depression disorder.

What hit me the most was the stark difference in their facial expression and the vibes they sent out, although both suffered similar misfortunes in life.

As the first lady had let go of the distress and set herself free from the past, she left a peaceful and kind impression upon us. People like to be near her as she was very approachable and she carried herself with dignity and grace.

The depressed lady however still burried all her pain and burden from the past within her; she was very critical, aggressive and violent. People avoided her at all cost and she looked like a devil at times.

I sincerely had deep sympathy for her as she had gone through a hard life. However, she had to relive those painful but long gone miseries every day, and she was not willing to let go of those painful memories. With that, she was torturing herself daily with all the awful bygones.

Perhaps, there are just too many irreversible grief and regrets in life. Perhaps we feel so sorry for ourselves that we cry our lung out in those lonely nights. We damn the world, as this is such an insufferable hell.

But, we ought to know that we are the only one person who can release us from that living hell. No one else can help us.

There are just too many baggages in life, we can choose to carry them wherever we go, or we can choose to put them down gracefully and move on.

Whether or not we want to let go of these baggages can decide our future; it makes the difference of whether we continuously live a painful life, or turn over a new leaf and live in happiness.

The only way to end those bad dreams, is to wake up.

The only way to live happily, is to let go.


Related Article:

This post has been translated from an article I read from Facebook. Please excuse my poor attempt in translating and if you would like to read the original post, you can get it here.

Waking up

In a world that's filled with troubled souls and pain, many asked Buddha what they could do to stop their worries and live a happy life.

Buddha invariably gave the same answer, "You will be free if you let go."

After sometimes, a smart man became disgruntled with the same answer, and decided to challenge him.

He went to Buddha and asked, "There are tens of millions of people in this world, each experiencing different problems and agonies. The solution you offered them has always been the same. Don't you think it's ridiculous to even imagine that your one way can solve all the problems in the world?"

Buddha calmly asked the man, "Do you dream when you sleep?"

"Of course!” said the man.

"Are your dreams always the same every night?” asked Buddha.

"Of course not!” the man answered.

"You have slept thousands of nights and you have had thousand of different dreams. But no matter how bad or good your dreams are, there is only one way to end them."

Buddha continued with smiles, "That is to wake up."


Related Article:

This post has been translated from an article I read from Facebook. Please excuse my poor attempt in translating and if you would like to read the original post, you can get it here.

Saturday, September 17, 2011

How to create a consistent look and feel with Grails Layout ~ Grails Tutorial 3

So far we have created a controller and a view, and we have learned how to pass values from the controller to the view. Although we can now start improving the look and feel of the store with fancy HTML or CSS codes, but that means we would need to do that with every single gsp we create.

Would it not be great if we can create a template for all the pages in the application with the same header, the same menu, the same footer? That way we can always be assured of a consistent look and feel across the store.

The answer for this question lies in Grails Layout, and our objective in this session is to:
  1. Create a template that apply to all the different views in the application with Grails Layout
To have all the actions in our CatalogController share the same layout, we will need to create a layout file with the same name at /grails-app/views/layouts. Lets create the following file now then:
/grails-app/views/layouts/catalog.gsp
Again, grails' convention over configuration is put at work here. We don't have to write any XML files to wire the two together. Everything works just perfectly. Below is the code snippet for catalog.gsp:
<html>

 <head> <title> Camgear - <g:layoutTitle/></title>
  <link rel="stylesheet" href="
   <g:createLinkTo dir='css' file='camgear.css' />
  " />
  
  <g:layoutHead />
 </head>
 
 <body>
  
  <div id="header">
   <img src="
    <g:createLinkTo dir='images' file='camgear-logo.gif' />
   " alt='logo' height='100'/>
   <hr />
  </div>
  <g:layoutBody />
  
  <div id="footer">
   <a>All Rights Reserved</a>
  </div>
  
 </body>
 
</html>
Of course, we will still need to put the camgear.css file in the
/camgear/web-app/css
folder. The following is a sample css file that I used:
body {
 font: "Helvetica Neue", Trebuchet MS, Verdana, Helvetica;
 margin: 0px;
}
#review sub {
 font-size: 2.5em;
 display: block;
 margin: .5em;
 padding: .5em;
 background: url(../images/background.png) repeat-x;
 border: 1px dotted black;
}
#review con   {
 font-size: 1.5em;
 text-align:right;
 margin-right: 2em;
}
#nav {
 text-align:right;
 margin-right: 1em;
}

#header {
  background: url(../images/logo-background.gif) repeat-x;
 padding: 0px;  
}
#header img {
 padding: 1em;
}
#footer {
  background: url(../images/background.png) repeat-x;
 padding: 0px;  
}

#footer a {
 font-size: 0.7em;
 display: block;
 color: white;
 text-align:center;
 margin-top:30px;
 font-family:"Lucida Handwriting", Verdana, Helvetica;
}

#menu {
 background: url(../images/logo-background.gif) repeat-x;
 padding: 5px; 
}
#menu li {
 display: inline;
 margin-left: 5px;
 margin-right: 5px;

}

#menu a {
 font-size: 1.5em;
 text-decoration: none;
 color: #4F82B5; // #14477A
}
Once all these are done, all we need to do is to refresh our browser, and we will see a totally different web page; I mean it feels as though technology has evolved for 10 years with just these two changes. We now have a standard header, standard footer and more importantly, a standard theme. Note that we have not done anything to the view we created yesterday.
So, that's all for today. We will talk about binding to the database tomorrow.
Related Articles
  1. Tutorial 1 - Creating our first controller in grails
  2. Tutorial 2 - How we present ourselves to the world