月份彙整: 2009 年 7 月

Cloud Computing 2

上文介绍了一些云计算的基本情况。说到云计算,就不得不提google这个将云计算发挥得淋漓尽致的公司。Google的网上办公(google apps)可以说是云计算的代表作,使用了google apps之后,公司不用再自己维护一堆服务器,使得公司的IT人员从繁琐的设定和高昂的维护费用中解放出来。有兴趣的人其实可以自己上网登记体验一下,25个账户以下的服务都是免费的。如果拥有自己的域名的话,更加可以通过设置CNAME来“个人化”自己的服务。比如说,我现在就有以下的服务:

http://mail.jiyunalex.com

http://docs.jiyunalex.com

http://calendar.jiyunalex.com

这三个分别是邮箱,文件和日历服务。所以呢,现在如果你发邮件到admin@jiyunalex.com的话,我就可以从下面这个画面登录进去检阅:

怎么样?cool吧。文件和日历功能都是类似的。当然,这些都是面向企业服务的,普通用户可能不会接触到。其实除了google,也有其他公司提供类似的云计算服务,其中一个就是www.dreamhostapps.com

dreamhostapps可以让用户免费寄存自己的网站,该网站提供了5个常用的服务,分别是WordPress, Drupal, ZenPhoto, phpBB和MediaWiki。用户登记之后就可以选择安装自己需要的服务。同样的,只要你有自己的域名,设定好一个CNAME之后,就相当于自己配置了一个服务器:

http://photo.jiyunalex.com

http://forum.jiunalex.com

通过这些服务,就可以省却自己架设和管理一台服务器的麻烦了。

7月22日,日蝕

今天9点15分偷偷从办公室跑下去,准备看500年一遇的日蚀。下去后已经看到一大群学生聚在一起看了,于是也挤过去凑凑热闹。怎么居然碰见一个同事:),哈哈,大家心照不宣吧。由于只是日偏食,太阳周围的阳光还是很猛烈,我们拿着自备的滤镜啥也看不见。正好这时候来了一个装修工人手里拿着人家焊东西时戴在脸上的滤镜,过去借来一看,哇,整个太阳顿时一览无遗。就和晚上的月亮一模一样,缺了一块。生平第一次看日蚀,感觉太好了。有机会一定要看看日全食是什么样子。

这里介绍一下最简单的观测工具:

  • 借一个焊东西用的滤镜,估计去五金店买也不贵
  • 拿一片不用的软盘(floppy disk),拆开通过那块黑色的圆盘观察

实验证明,效果都挺好的。

Multipart form POST in C#

关于Multipart message的格式,可以参考W3C的网站,本文集中演示怎样用C#代码实现该类消息的传送。

[code:c#]

public static class FormUpload
    {
        public static HttpWebResponse MultipartFormDataPost(string postUrl, string userAgent, Dictionary<string, object> postParameters)
        {
            string formDataBoundary = “—————————–28947758029299”;
            string contentType = “multipart/form-data; boundary=” + formDataBoundary;

            byte[] formData = GetMultipartFormData(postParameters, formDataBoundary);

            return PostForm(postUrl, userAgent, contentType, formData);
        }
        private static HttpWebResponse PostForm(string postUrl, string userAgent, string contentType, byte[] formData)
        {
            HttpWebRequest request = WebRequest.Create(postUrl) as HttpWebRequest;

            if (request == null)
            {
                throw new NullReferenceException(“request is not a http request”);
            }

            // Set up the request properties

            request.Method = “POST”;
            request.ContentType = contentType;
            request.UserAgent = userAgent;
            request.CookieContainer = new CookieContainer();
            request.ContentLength = formData.Length;  // We need to count how many bytes we’re sending.

            using (Stream requestStream = request.GetRequestStream())
            {
                // Push it out there

                requestStream.Write(formData, 0, formData.Length);
                requestStream.Close();
            }

            return request.GetResponse() as HttpWebResponse;
        }

        private static byte[] GetMultipartFormData(Dictionary<string, object> postParameters, string boundary)
        {
            Stream formDataStream = new System.IO.MemoryStream();
            Encoding encoding = Encoding.Default;

            foreach (var param in postParameters)
            {
                if (param.Value is byte[])
                {
                    byte[] fileData = param.Value as byte[];

                    // Add just the first part of this param, since we will write the file data directly to the Stream

                    string header = string.Format(“–{0}\r\nContent-Disposition: form-data; name=\”{1}\”; filename=\”{2}\”;\r\nContent-Type: application/octet-stream\r\n\r\n”, boundary, param.Key, param.Key);
                    formDataStream.Write(encoding.GetBytes(header), 0, header.Length);

                    // Write the file data directly to the Stream, rather than serializing it to a string.

                    formDataStream.Write(fileData, 0, fileData.Length);
                }
                else
                {
                    string postData = string.Format(“–{0}\r\nContent-Disposition: form-data; name=\”{1}\”\r\n\r\n{2}\r\n”, boundary, param.Key, param.Value);
                    formDataStream.Write(encoding.GetBytes(postData), 0, postData.Length);
                }
            }

            // Add the end of the request

            string footer = “\r\n–” + boundary + “–\r\n”;
            formDataStream.Write(encoding.GetBytes(footer), 0, footer.Length);

            // Dump the Stream into a byte[]

            formDataStream.Position = 0;
            byte[] formData = new byte[formDataStream.Length];
            formDataStream.Read(formData, 0, formData.Length);
            formDataStream.Close();

            return formData;
        }

    }

[/code]

上面的FormUpload类目的是构造消息,下面就是FormUpload类的调用方法:

[code:c#]

        static void Main(string[] args)
        {
            // Read file data

            FileStream fs = new FileStream(“c:\\example.txt”, FileMode.Open, FileAccess.Read);
            byte[] data = new byte[fs.Length];
            fs.Read(data, 0, data.Length);
            fs.Close();

            // Generate post objects

            Dictionary<string, object> postParameters = new Dictionary<string, object>();
            postParameters.Add(“user”, “fdreader”);
            postParameters.Add(“pass”, “pl!mnsj@38“);
            postParameters.Add(“logfile”, “example.txt”);
            postParameters.Add(“example.txt”, data);

            // Create request and receive response

            string postURL = @”http://bigbird.itsc.cuhk.edu.hk/etickettest/palm/attendance.asp“;
            string userAgent = “Someone”;
            HttpWebResponse webResponse = FormUpload.MultipartFormDataPost(postURL, userAgent, postParameters);

            // Process response

            StreamReader responseReader = new StreamReader(webResponse.GetResponseStream());
            string fullResponse = responseReader.ReadToEnd();
            webResponse.Close();
            Console.Write(fullResponse);
            Console.ReadKey();
        }

[/code]

清华大学登山队成功登顶海拔7546米的慕士塔格峰

北京时间7月17日14:45分,清华登山队5名队员,李国伟,杨昆淼,李凤麟,赵兴政,曹富强,与2名教练,云旦,克珠,沿慕士塔格峰西南山脊路线登顶慕峰。登顶队员准备于当天下撤回本营,昨天住C3的队员中马翔和雷岳川现在还在C3接应冲顶队员。

慕士塔格峰位于新疆西部,海拔7546米,有“冰川之父”的美誉。这是清华大学登山队继1997年之后第二次登顶慕士塔格峰峰,也是自2000年冲顶失败后的9年重返。本次攀登采用从塔什库尔干县向上的西南山脊路线,区别于传统的西山脊路线。

此次清华大学登山队的攀登队员:马翔(队长)、谢俊骏、杨昆淼、杨绍利、李国伟、何锐、李凤麟、周斌、李铖、赵兴政、曹富强、雷岳川、钱纪芸(女)、白凌(女)张立恒(女)。

Cloud Computing

云计算(Cloud Computing)一词,起源于2004年左右,意指将所有软件和大部分的计算功能都放在一块云里面。客户端只需要安装一个云端程序(PC上一般已浏览器为主),就可以使用大量由云提供的服务。套句老话,这其实是一个瘦客户端-肥服务端模型,这个模型与十几二十年前的模型本质上是一样,但他们的出现原因和运作方法却不太一样。在十几年前,个人电脑刚刚兴起的年代,客户端的运算能力非常有限,而且当时人们对于服务商提供的服务没有什么要求,一般来说只要求文字和图片,对服务器的要求相对来说比较低。所以当年大部分的运算都是在服务端进行的。这就是当年的瘦客户端模型。后来,随着接入互联网的人数逐年提高,并且人们希望能得到更多的多媒体内容,服务器慢慢变得不胜负荷。这个时候由于个人电脑的速度也在不断提升。于是,就有人提出将一部分的运算放到客户端上运行,从而减低服务器的负荷。这就形成了肥客户端模型。可是到了现在,人们对于软件的需求又有了新的变化。随时可得和永不丢失的数据,即时更新的信息都是人们需要的东西。得益于高速发展的互联网,于是又有人提出将所有数据和运算重新归纳到服务端(云)上,客户只需要手持一台能上网的机器(手机,PDA,MID)就能随时随地访问到需要的数据和服务。在这种背景下,云计算就诞生了。

云计算有以下的特点:

  • 所有服务都是基于网络的(Web-based)。客户端只需要安装一个浏览器就可以访问所有服务。
  • 客户端不会储存任何资料和数据。所有东西都保存在服务器(云)上,这样用户无论何时何地在任何一台电脑上,都能访问到属于自己的个人数据。
  • 服务是通用的,就像Microsoft Office等通用软件一样,你可以做一些个性化的设置,但不会专门有大规模的customization。

对于企业用户来说,云计算可以省却维护服务器的麻烦。服务提供商为你提供了必要的软件和硬件维护,并且有24小时专人技术支持。企业能省下大量维护和升级的费用,所以云计算是很受欢迎的。

政治從不是簡單的事——由三地暴亂說起(转载自明报)

【明報專訊】人們看問題都會有一種簡化,並向擁有較大資訊權力這一方傾斜的現象。因此,許多問題可能更重要且真實的部分就被遮蔽。這種情形在政治這個一切權力的源頭可能最明顯,也最糾纏。最近一年多,拉亞非即有3宗案例,值得特別警惕。

最近猶未落幕的中美洲洪都拉斯政變,就很值得注意。洪國總統塞拉亞有意修憲,將目前總統一任4年不得連任的規定改變。這是個公共議題,不同意即應設法使它通不過。但因塞拉亞是右派出身,當選後才轉左派的領導人,他的國家機器如國會和司法仍在右派手上,於是這些人遂以外表合法但實質非法的方式炮製出政變,將他逮補放逐。這起政變與2002年委內瑞拉政變,企圖推翻查維斯政權如出一轍。

 

不過我們都知道,今天的拉丁美洲早已不一樣了。它長期受到大國操控,動輒被武力顛覆及出兵干涉,整個區域早已有了覺醒,區域組織「美洲國家組織」已不再唯命是從,美國意圖扶植的人選已絕不可能選上。委內瑞拉政變後,「美洲國家組織」立刻緊急會議,譴責政變並要求立刻放人。該組織的態度鼓舞了已被政變嚇呆的查維斯支持群眾,他們立即上街示威,要求放人。如此裏應外合,政變遂告失敗。這次洪都拉斯政變,合理的推斷當然也有美國的角色。「美洲國家組織」的反應也和上次一樣,還將它鬧到了聯合國,聯合國大會一致決議要求放人。

 

洪都拉斯政變後由美國曖昧的態度及政變的因果,我們不能否認美國的角色,這也是此案的解決仍有極多枝節的原因。如果洪都拉斯放人復職,洪國左派聲勢必將大漲,美國在中美洲將失去這個堡壘。這也是政變一方,準備和稀泥,放人復職免談,但可接受提前大選,反正他們掌控國家機器,不難炮製出想要的大選結果,而且可藉此將政變問題一舉揭過。他們此舉,「美洲國家組織」當然心知肚明。這種對峙如何解決,恐仍得拖延一陣。

 

由洪都拉斯政變政府轉移話題的伎倆,就讓人想到2007年底東非肯尼亞的大選。肯尼亞是美國的東非據點,當時的總統齊貝吉在大選嚴重作票,把反對派的奧廷加做掉,齊貝吉甚至在票未開完前就宣布當選並草草就職。由於作弊太嚴重,歐盟立即抨擊,但美國卻宣布承認選舉結果。肯尼亞大選舞弊,引發至少3個月的部族暴亂,死亡超過1000人,但最後怎麼解決的?在聯合國前秘書長安南和稀泥下,作票問題一舉揭過,齊貝吉當總統,奧廷加則當總理,合作成立「真相調查委員會」。但至今已過一年多,這個委員會毫無進展,和稀泥解決問題後所成立的奇怪分享政府,也癱瘓無能到了極致。肯尼亞國家失敗,即在於由於強權介入,舞弊犯法都可在和稀泥之下一筆帶過,那麼這個國家又還有什麼是非道理呢?

 

因此,政治上人們都可將觀念簡化而去奢談什麼自由民主,但政治從來就不是這麼簡單的事,它有各國內部的族群鬥爭,也有太多強權的挑撥與干涉,遂使得問題變得複雜而難以釐清。這也是人們必須格外小心的就事論事,加以深入探究的原因。

 

就以最近沉寂下來的伊朗亂局而言,伊朗的現任總統艾哈邁迪內賈德確實極有爭議。他極端反美反以色列,伊朗內部的神權控制仍極嚴厲,人們對此也都不陌生;但換個角度,伊朗的石油資源使它一向受到覬覦,它的戰略地位也使強權始終念茲在茲。去年10月底,《紐約客》雜誌的資深自由派作家西摩.赫什即揭發一宗內幕﹕那就是布殊政府在下台前即秘密通過一項高達2億美元的伊朗方案,由中情局和軍方的「聯合特戰指揮部」負責。赫什指出這個方案送達民主黨佔多數的參院時,根本沒有內容即稀里糊塗通過。根據他揭露的內容,這個方案主要做法有二﹕(一)是透過選舉而改變伊朗政權,這也是後來人們說的,伊朗所發生的事是一次「未完成的顏色革命」。(二)則是人們至今仍不明白的,該方案將暗殺「有價值的受害人」俾引發紛爭,這裏所謂的「有價值的受害人」究竟何所指?到底誰才是「有價值的受害人」?是伊朗要員呢?或者嫁禍用的反對派人士?

 

當我們理解了這些因素,伊朗大選就變得更複雜了。經過這次大選的亂局,伊朗內部的矛盾,特別是族群矛盾已更趨嚴重,由於落選的穆薩維是亞塞拜疆裔的伊朗人,將來伊朗的邊界也將因此而多事。特別是,選舉時刻乃是群眾被動員的時刻,一個人縱使只有30%得票率,但若一個國家有10%或20%的人口上街遊行示威,就已局面不可收拾,這也是利用選舉而製造顏色革命被認為有效的原因。但若選舉與顏色革命可以結合,人們也接受這種結合,那麼我們又將如何判斷民主的價值呢?這次伊朗的顏色革命並未成功,關鍵是以前顏色革命成功的國家如格魯吉亞、吉爾吉斯最近都已出現反向的群眾運動及暴亂。這些國家的人民已發現顏色革命並未帶來更好的政府,只是另一種顏色的政府。只是人民的不滿儘管依舊,但答案又在哪裏?拉丁美洲那種高度區域自主,拒絕讓強權干預的態度,在其他地區有沒有可能出現呢?

 

因此,中美洲洪都拉斯的改變、肯尼亞的選舉舞弊,以及伊朗的選舉暴亂,都不是我們所想的那麼簡單。一國政治從不是人民自己的事,也是有太多國家在干預的國際事務,但代價最後還是各國人民自己要付,如此而已!

 

南方朔

 

《亞洲週刊》主筆

荔枝

又到了一年一度的吃荔枝季节了。每年荔枝都只能在夏天6,7月份才能吃到。一般来说,荔枝又分糯米糍,桂味等等。刚刚从老爸身上学会了怎么分辨糯米糍,在这里和大家分享一下吧。

糯米糍有以下五个特征:

  1. 在每个荔枝顶端有一小块突出的地方。有些比较明显的会完全长成一个小球,像个小荔枝一样。
  2. 每个荔枝身上会有一道明显的痕迹,贯穿整个荔枝,形成一个圆环。
  3. 荔枝壳比较光滑,不扎手。
  4. 剥壳后荔枝汁不沾手。
  5. 果肉比较爽,味道很甜。

今年糯米糍价格大概18元一磅,大家去买来尝尝吧。