六月 2005


公司最近來了一個新hire,是中國人。他是武漢出生,5歲的時候搬到美國。跟他聊了幾次,發現他不僅在家仍然跟父母用中文交談,還愛看武俠小說?!他說他很多中國朋友都已經完全美國化了,中文都不會講。但是他常回大陸,很希望能夠記得他的roots。
我的天啊!這跟我小時候是多麼大的差別!我小時候,在美國的中國人普遍對中國的印象都非常的差,不喜歡不說,還痛恨對中國的一切。總覺得落後,骯髒,沒像美國這麼的自由先進。我媽還記得我爸在這裡的一個教授,是台灣人,他的小孩有多麼憎恨中國人。那時候還不准人家說他是中國人,完全不想跟中國有任何的關係。
今天呢?上次去我媽朋友的家裡吃飯,他家的兩個小孩,竟然喜歡聽周杰倫的音樂,喜歡去台灣玩,還找了一堆朋友看「向左走,向右走」的VCD!我媽的朋友還說要是台灣政治穩定,他小孩能去那工作也不錯。天啊!這跟我小時候是多麼大的差異!!
Indeed, 這世界正在改變…
前幾天在收聽新加坡的Radio的時候,聽到這首歌,很好聽!這首歌是不是剛剛出來呀?怎麼找來找去都沒找到相關資料?

昨天看到這個數學式子,覺得很好玩…

Here goes…

     Women = Time * Money

     Time = Money    (時間就是金錢)

     Women = Money^2  (Substitute Money for Time)

     Money = square root of (evil) = (evil) ^(1/2)

    (Money is the root of all evil – 金錢為邪惡之根)

    所以…

    Women = Money^2, Money = evil^(1/2),

    Women = evil

哈哈這個有意思喔!

最近美國似乎音樂有點停滯,沒有什麼太多好聽的新歌。去年這時候,有Five for Fighting 的 100 Years,Hobastank 的 The Reason,Avril Lavigne 的 Don’t tell me等等。今年…好像沒什麼!目前好聽的新歌只有Anna Nalick 的 Breathe(2am) 比較矚目而已,其他都沒什麼特色!

所以啦~我聽歌聽到都不想聽了,各位如果知道有幾首好聽的歌,介紹給我吧!~桑若上次給我幾首林俊杰的歌,還挺不賴的!這邊沒辦法找到中文的歌曲,所以就請大家幫幫忙囉!

星期六的時候被義大利的朋友抓去一個愛爾蘭人家吃飯,一群人裡面沒有一個是美國人(除非你算國籍)。德國人,秘魯人,中國人,義大利人,愛爾蘭人,真是超級international的!

愛爾蘭人在GE工作,單身,這輩子住過5個國家,所以對世界很多不同文化不同個性有很深的感觸。他猛講在各個國家的各種感覺,大家因為也都是住過美國以外的,所以很多事情都感觸良深。但是當他們滔滔不絕的講的時候,我卻發現了一件我從來沒發現過的事情: 大家似乎講的很多事情,跟中國人提美國人一樣!換言之,似乎大家都覺得美國人有些地方很奇怪。

大家提到奧運的時候,愛爾蘭人就說他覺得美國這裡播奧運很奇怪,都不播其他國家的。老是只提得名次的運動。例如什麼比賽美國人得第三,新聞上連第一名,第二名是哪國的都不說,只提美國人第三,好像奧運只有美國一個國家參加一樣。愛爾蘭人又說當初從愛爾蘭被調到荷蘭4年,就是因為美國人到荷蘭開會的時候完全拒絕講任何非英語的語言。如此粗魯無理的舉動讓荷蘭人氣的要死,最後GE只好找歐洲國家的員工去荷蘭做生意。要記得,愛爾蘭也是講英文的呀!但是美國人就認為世界上就是英文最重要,完全不在尊重人地方的文化。

義大利人這時候也語重心長的提到,他覺得在美國要認識人很容易,大家表面上都很熱情,很客氣。但是要真正交朋友,那種談心,又能一起出去做什麼事情的朋友,真的很難。義大利的女孩也說他在這裡沒有美國人的朋友,朋友都是像我們這樣的。德國人笑著說他覺得美國人非常表面,外表很漂亮,裡面很空虛。他就說去美國人家裡,外面漂亮的要死,裡面簡直是髒的嚇死人。他也說覺得美國人家庭好奇怪,很不close。

這些話,我很久以前就在說了,但是有很多人不相信,甚至說我很極端,有好一段時間我開始懷疑是不是我自己的問題。所以當他們在講這些事情的時候,我只在旁邊安靜的聽他們說。但是越聽,我心理越鬆了口氣。看來不只是我這樣認為,連歐洲人都這樣講,那一定不會我自己的問題了。我也不是說美國人很壞,而是這裡的文化就是如此,我不喜歡這樣的文化。回到家後我心理舒服很多。我以後仍然是很少會跟別人說我對美國的看法了,因為我知道那些人都覺得我瘋了。但是~至少我現在知道,不是只有我這樣想!

我在去年秋天的時候,自己給自己許一個願望,答應自己如果能找到實習的工作,就買iPod (好像很多人不知道iPod是什麼耶?不知道請看http://www.apple.com/ipodphoto/)。算是…給自己的禮物吧!

上禮拜天的時候,等了許久,終於在網路上定了iPod Photo。定完之後apple送來tracking number,一看發現哇!我的iPod遠從上海寄過來喔!哈有意思,繞過地球大半圈,專程送給我。結果今天早上查tracking的時候,上面說已經寄到我的公寓啦。真的假的?!星期一寄出來,今天就到?!這麼快啊!!FedEx果然是名不虛傳!太棒啦!!下班匆匆忙忙的衝到車上,東西全部丟(砸)進車裡,趕緊飆回家~回到家之後跑到公寓專門收寄包裹的辦公室,興高采烈的衝到門前,赫然發現門上貼了一張紙,上面寫著:

Office Closed for Wednesday

什麼?!竟然星期三給我關門?!! 搞什麼鬼啊~我站在辦公室門口前,整個人都愣住了。心理想著我的iPod就隔著門後等著我…離我這麼近~可是我竟然得等到明天24小時候才能拿到,這…我…氣死人啦!!可惡…只是隔個門而已~So near yet so far!!

我…直接把門踹開破門而入,隨後警鈴大響,我也管不了這麼多了,直接把iPod拿走~然後趕快衝到電梯回家!哈哈!如果我喝醉酒喝到神智不清才有可能這樣做的吧!Instead,我只有心理亂罵有誰星期三關門的,然後慢慢走回家!唉!!iPod呀~今天跟你沒緣啦,明天我在帶你回家吧!

在美國一個人住實在是太傷身體了。我從一月開始自己住之後,問題層出不窮。先是臉上痘子猛長,接下來是背部肌肉開始僵硬,之後有一次心血來潮去量了血壓,結果發現去年九月才被護士稱讚為perfect的血壓,六個月不到已經瀕臨高血壓!之後看醫生又發現我胃酸過多,侵蝕食道造成心臟疼痛。天啊!太恐怖了~我到現在看醫生加買藥的錢已經花了300多美金了。我才20歲,感覺上已經是50歲的身體了,一直出問題!

現在吃藥加運動,大部分的問題已經開始改善了。但是胃酸的部分卻一直沒辦法解決。主要原因是我食量很小,但是因為自己煮東西的時候份量抓的不是很準,常常煮太多。但是又怕浪費,所以就一直猛塞,塞到肚子漲得不得了。為了善待自己的身體,所以現在只有吃飽了就算了,不會超出自己的份量。可是每次買菜又得開車開一段距離,所以通常又會多買點菜,省得麻煩。吃的少,菜買的多,結果就是一大堆東西還沒吃完就壞掉。唉!麻煩死了!食量小也是個問題!

說到食量小,我上禮拜五跟同事去吃飯,他們狼吞虎嚥的一下子就把東西全部吃完,我才吃了一半。美國人吃東西吃的都好趕,好像在比賽一樣。他們後來一直催我,叫我快一點,他們要回公司工作,我只好硬塞,回到公司又是肚子不舒服~唉!我吃個飯難道不能慢慢吃嗎?吃那麼快幹嘛啊!好不容易出來吃個飯,還要趕成這樣,那麼緊張幹嘛!

在算NTP時間的時候,看到我一直不知道的規則。所有的百年,只要除400除不盡的話,就不是閏年。所以1700,1800,1900都不是閏年,但是2000年是。

有沒有人想過為什麼要這樣啊?還有,為什麼現在我們使用的月曆叫做Gregorian Calendar? Gregory是誰?

拜google所賜(google 實在是太好用了…),我在前幾個禮拜的時候找到了原因。這段歷史故事源由到兩千年以前,凱撒大帝統治羅馬帝國的時候。

但是首先,先解釋一下月曆的道理,為什麼一年是365天。一年有四個季節,地球自然的季節變化,一年是365.2422天。我們現在使用的陽曆,把春天訂在3月21日(春分),夏天訂在6月21日,秋天在9月21日,冬天在12月21日。如果每一年一直都是365天的話,一年後,實際上會少了0.2422天,所以時間一久,就會開始出問題。如果每年都是365天,10年後,就會少掉2.422天,100年後,就會少掉24.22天,這樣春天就不是3月21開始了,反而是要等到4月14號才會開始。因此~偉大的凱撒大帝在44BC的時候,制訂了一個新的月曆,規則是一年為365天,但是每四年,就加一天,為366天。這樣一來,前面3年是365天,最後第4年是366天,所以平均一年是365.25天,跟地球自然的365.2422天一年,只差了0.0078天!凱撒大帝所制訂的月曆,叫做Julian Calendar (凱撒英文是Julius Caesar).

凱撒大帝在制訂新月曆的時候,還把月份作了調整。羅馬帝國所使用的月曆是10個月,從3月到12月。1月跟2月在羅馬的月曆裡,是沒有月份的。羅馬帝國又很迷信,很多月份的名字是奉獻給他們的神。例如,3月叫做March,為戰神 Mars (這也是火星的由來)所命名。 June是為Jupiter的太太Juno命名。

也有月份的名字是照數字排序命名,七月是Quintilis (第五個月,記得羅馬的月曆是從3月開始算第一個月),八月是Sextilis(第六個月),九月是September(第七個月Septem是拉丁文的7),10月是October(第八個月,Oct 是八的意思,Octopus-八隻腳的怪獸,也就是八爪烏賊,Octagon,八角形,這些英文字都是由拉丁而來),11月是November (Novem是九的意思),12月是December (Dec 是十的意思,Decimal-10進位的數字,Decade-十年,Decathlon-十項全能運動,這些英文字也都是由拉丁而來)。

因此~凱撒大帝制訂新月曆的時候,把一月跟二月加進去。但是~還不只是這樣!凱撒大帝是在羅馬月曆的第五個月(Quintilis) 出生,為了紀念他的出生月份,他把第5個月Quintilis改名為July (記得他的名字是Julius)!!所以一直到今天,我們的第7個月仍然紀念著凱撒大帝(不過大概沒多少人知道就是了!)。

因此凱撒大帝的Julian Calendar便在兩千多年前開始使用了。凱撒大帝在3月15號(Ides of March)被元老暗殺之後(Et Tu, Brutus?!),他的姪子屋大維 Octavius 繼承他,跟著馬克安東尼Marc Anthony 一起攻擊布魯特斯 Brutus(暗殺凱撒的人之一)。Octavius打敗Brutus之後,接著開始攻打安東尼。安東尼這時候逃到埃及,得到了埃及王后克麗珮托菈 Cleopatra的協助,在地中海跟Octavius的羅馬海軍大戰。結果Octavius大勝,安東尼戰死,Cleopatra在羅馬月曆的第六個月Sextilis服毒自殺,之後Octavius成為皇帝,改名為Augustus Caesar。為了紀念Sextilis這個月是Augustus Caesar 掌握大權的月份,Augustus(也就是Octavius)把Sextilis這個月改名為August。為了跟他叔叔凱撒大帝的月份一樣,他把August這個月分的天數也改為31天,因為July也是31天!這是為什麼7月的天數跟8月的天數一樣都是31天~August這個字今天在英文也有偉大,高貴的意思。

但是~Julian Calendar從44 BC一直用到了16世紀,卻出問題啦!記得Julian Calendar每一年平均是365.25天,但是地球自然季節變化是一年365.2422天。每一年多了0.0078天。也就是說~從44 BC到16世紀差不多1500年的時間,總共多出了1500*0.0078 = 11.7天!春天已經不是3月21日開始了,反而是21號前11天就開始。因此,當時的教宗Pope Gregory XIII 在1582年的時候訂製了新的月曆制度。規則跟Julian Calendar一樣,每四年有一個閏年,但是如果是百年的話(1600, 1700, 1800等等),只有除400除的盡的才算是閏年。所以也就是說,每400年有97個閏年 (400/4 = 100個閏年,然後減掉100,200,300這三年沒有算閏年,所以是97個)。這樣的話,一年平均是(400*365 + 97)/400 = 365.2425天。這樣一來,跟地球自然的365.2422天只差了0.0003天。也就是說1000年之後也只會多0.3天而已!

所以為了紀念Pope Gregory XIII所制訂更精準的月曆,一直到現在,我們所使用的月曆都稱為Gregorian Calendar!呼!終於講完啦~我小時候就讀過凱撒大帝被暗殺,屋大維攻打安東尼,埃及王后自殺的故事,沒想到八月竟然是為了此事而命名!我們到今天使用的月曆,想都沒想過是兩千年前,現在骨頭恐怕都化成灰的人,所制訂的!歷史真的是很好玩!~

花了好久的時間,總算是把上次NTP的問題解決了~我這次連星期幾都給他算出來了,哈哈!心理真舒服~

/*
 * Created on May 26, 2005
 */

/**
 * @author Jonathan Ou-yang
 */

public class time
{

    public static void main(String[] args)
    {
        long currentTime = System.currentTimeMillis();

        System.out.println (currentTime+" ms after 1/1/1970");

        int year = getYears(currentTime); 
        int yearDay = getYearDay(currentTime, year);

        String month = null;
        int day = 0;
        int leapDay = (isLeapYear(year)? 1:0);

//determine the month and day of month.
        if (yearDay < 32)
        {
            month = "January";
            day = yearDay;
        }
        else if (yearDay < (60 + leapDay))
        {
            month = "February";
            day = yearDay – 31; //January has 31 days, regardless of leap year
        }
        else if (yearDay < (91 + leapDay) )
        {
            month = "March";
            day = yearDay – (59 + leapDay);
        }
        else if (yearDay < (121 + leapDay))
        {
            month = "April";
            day = yearDay – (90 + leapDay);
        }
        else if (yearDay < (152 + leapDay))
        {
            month = "May";
            day = yearDay – (120 + leapDay);
        }
        else if (yearDay < (182 + leapDay))
        {
            month = "June";
            day = yearDay – (151 + leapDay);
        }
        else if (yearDay < (213 + leapDay))
        {
            month = "July";
            day = yearDay – (181 + leapDay);
        }
        else if (yearDay < (244 + leapDay))
        {
            month = "August";
            day = yearDay – (212 + leapDay);
        }
        else if (yearDay < (274 + leapDay))
        {
            month = "September";
            day = yearDay – (243 + leapDay);
        }
        else if (yearDay < (305 + leapDay))
        {
            month = "October";
            day = yearDay – (273 + leapDay);
        }
        else if (yearDay < (335 + leapDay))
        {
            month = "November";
            day = yearDay – (304 + leapDay);
        }
        else if (yearDay < (366 + leapDay))
        {
            month = "December";
            day = yearDay – (334 + leapDay);
        }

        String dayOfWeek = dayOfWeek (year, yearDay);

        System.out.println(dayOfWeek + " " + month + " " + day + ", "+year);

//due to daylight saving time, Eastern Standard Time is 4 hours behind
        //GMT.
        System.out.println((currentTime/(3600*1000))%24-4+" hours, "+
                     (currentTime/(60*1000))%60+" minutes, "+
                     (currentTime/1000)%60+" seconds.");
    }

   /**
     * @param year
     * @return
     */
    private static boolean isLeapYear(int year)
    {
        boolean leapYear = false;
        if (year % 100 == 0)
        {
//if this is a century year
            //i.e. 1800, 1900, 2000, etc
            leapYear = (year %400 == 0? true: false);
        }
        else
        {
   //non-century year
            //i.e.  1812, 1789, 1776, 2004, etc
            leapYear = (year %4 == 0? true: false);
        }
        return leapYear;
    }

  /**
     * @param currentTime
     * @return
     */
    private static int getYears(long currentTimeInMs)
    {
        float currentTimeAsFloat = currentTimeInMs; //using float since we’re going to divide
        float fourYear = (currentTimeAsFloat/1000/86400/1461);
//every four years is 1461 days (365*3 + 366).  366 days due to leap year.

        return (int)(fourYear*4) + 1970;
//our epoch is 1970.  So the value will be years after 1970.
    }

/**
     * @param currentTime
     * @return
     */
    private static int getYearDay(long currentTime, int year)
    {
        float currentTimeAsFloat = currentTime; //using float since we’re going to divide
        float fourYear = (currentTimeAsFloat/1000/86400/1461);

        int numberOfDaysInThisYear = (isLeapYear(year)? 366:365);

        return (int)(((fourYear*4)+1970-year)*numberOfDaysInThisYear)+1;
   //yearDay comes in number of full days + fraction of the current day
        //e.g. 135.14 days is 135 full days plus a few hours of the 136th day
        //so in this case we are actually living in the 136th day, not the 135th.
    }

  /**
     * @param yearDay
     * @return
     */
    private static String dayOfWeek(int year, int yearDay)
    {
//determine the day of the week of the current year
        int yearSinceEpoch = year – 1970;

        int leapYearsSinceEpoch = (int)((year – 1972)/4) + 1;
//(year-1972)/4 gives the number of leap years after 1972.
        //Since 1972 is also a leap year, the result is incremented to include 1972.

        int startDayShifted = yearSinceEpoch + leapYearsSinceEpoch;

        if (isLeapYear(year) == true)
        {
  //at a leap year, the days actually do not shift by 2 until the next year
            //e.g. 2004 is a leap year, however the effect of an extra day in 2004 is
            //not felt until 2005, where the start of the weekday shifts by 2.
            //So (2004-1972)/4 + 1 = 9 leap years.  But the extra day in 2004 does not
            //change the start day of the week of 2004.  Therefore we need to adjust
            //our days shifted.
            startDayShifted –;
        }

        int startWeekDayShifted = startDayShifted % 7;

        int weekDayShiftedSinceThisYearStarted = (yearDay-1) % 7;
  //If we are at 1/1/1970, it is the first day of the year, so 1 % 7 = 1. 
        //But shifting it by 1 would have made 1970 start on friday (it started
        //on thursday).  So it should actually shift 0 days, not 1.  To adjust
        //for this fact, the yearDay is decremented by 1.

        int totalWeekDayShiftedSinceEpoch = (startWeekDayShifted +
                 weekDayShiftedSinceThisYearStarted)%7;

        switch (totalWeekDayShiftedSinceEpoch)
        {
  //1970 started on a Thursday
            case 0:
                return "Thursday";

            case 1:
                return "Friday";

            case 2:
                return "Saturday";

            case 3:
                return "Sunday";

            case 4:
                return "Monday";

            case 5:
                return "Tuesday";

            case 6:
                return "Wednesday";
            default:
                return "God only created 7 days!";
        }
    }
}