正式说再见

差不多两个月前,我写了篇blog说Windows Live Spaces要被干掉了。没想到那时这消息还是所谓的机密,Live Spaces的PM追着我的屁股让我删文章,还要去删Google的纪录,让我有机会深刻学习了一把Google WebMaster的使用方法。昨天这个消息终于被正式宣布了,3000万Live Spaces用户将在2011年3月前迁往WordPress。

Live Spaces出道6年,不是没有机会成为一个成功的社交网络,它有很好的用户基础,Live Writer也是出色的写作工具,可是最终结果却像Windows Mobile的结局一样令人失望。在Mobile方面微软至少还在尝试通过Windows Phone 7重生,而在社交网络方面微软已经承认自己不行,彻底放弃了。

产品一个接一个失败,微软正成为一家越来越令人失望的公司吗?

Posted in Uncategorized | Tagged | 1 Comment

拿到iPhone 4了

由于要和SingTel新签Contract,而新的Contract可以免费拿到一部iPhone 4,我于是在8月10号在SingTel的店里预定了一部iPhone 4。当时店员告诉我,大概要等1到2个月才能拿到机器。没想到上周四的时候接到电话说,我的iPhone 4到了。于是周五跑去拿,顺便将我的电话号码转移去新的MicroSIM。

新的MicroSIM并不是立即就可以用的,需要在SingTel那边激活一下。当时店员告诉我可能会要2,3天。直到昨晚电话功能还是不能用,我于是打了SingTel的客服。以前听很多人说过,SingTel的客服不怎么样,可是我昨天的感觉还好。客服mm向我要了sim卡的号码,说会找技术人员看看。我本以为是应付我罢了,没想到过了一个小时竟收到她的callback,询问是否已经好了。当时已经晚上9点多了,我还蛮感觉意外的。

上次在Dallas的苹果店里见识了iPhone 4之后,我对它的屏幕一直印象深刻。实际使用下来,感觉屏幕确实非常清晰,在用一些针对iPhone 4优化过的应用时,那种体验在我以前用过的手机中是绝对没有的。iPhone 4的另一个优点就是简单,比如它能在3g和wifi之间自由切换,并且优先使用wifi。而在我之前用的wm6.5的手机上,经常需要手工切换网络设置。iPhone平台上大量的应用,也使得任何需求都变得简单了。

我现在好奇的是,即将发布的Windows Phone 7将靠什么来和iPhone 4竞争。虽然Xbox Live很酷,但对于非Xbox玩家或非游戏发烧友来说,吸引力并不大。而在软硬件方面,目前看来WP7很难说有什么优势。还好离WP7发布的日子越来越近了,我们就拭目以待吧。

Posted in Uncategorized | Tagged , | Leave a comment

创建基于SQL Azure的External Content Type

微软一直在很努力的推自己的云计算战略。在商业应用方面有BPOS,其中的Exchange Online给我的印象很深,但SharePoint Online就差了许多。在平台、存储和应用开发方面有Windows Azure这个平台。我常常想,Windows Azure对于SharePoint的管理员和开发者来说意味着什么?是否在SharePoint中我们也可以调用一些Windows Azure的服务?

正好最近搞到一个Windows Azure的测试帐号,有机会实际把玩了一下。在SharePoint中能够直接调用的最简单的Azure服务是SQL Azure,将它作为数据源,通过BCS就可以直接获得其中的数据了。我写了一篇文档讨论如何创建基于SQL Azure的External Content Type,在这里

值得一提的是,测试External Content Type的时候,我第一次实际配置了一下Secure Store这个服务。只是取代以前的SSO的新服务,与SQL Azure配合倒是天衣无缝。

Posted in Uncategorized | Tagged , , , | Leave a comment

为SharePoint 2010中的FBA创建自定义登录页面

本文英文版在这里

SharePoint 2010中默认的FBA登录页面非常简单,只提供了一个Asp.Net的Login控件,让用户输入用户名和密码。在大多数情况下,我们需要定制这个页面以满足一些安全需求,比如为登录页面加上验证码等等。

由于SharePoint 2010里的FBA已经变成了基于Claims认证的方式,因此在实现自定义的登录页面时就与MOSS 2007里的做法完全不同了。最显著的一点就是,像Steve Peschka说的,以前的FormsAuthentication类不会再被用到了。现在我们需要用SharePoint的STS来做认证和处理Claims。好在SharePoint提供了相应的借口,让这一切变得容易了许多。这这篇文章里,我将演示如何创建自定义登录页面,并保持默认的master page和样式。

由于要修改默认页面,我不知道这样的做法是否受Microsoft官方支持,如果你要用在你的项目中,风险自负。Smile

创建自定义登录页面

如果我们留意一下会发现,默认的FBA登录页面是_forms/default.aspx。这样的设计有一个好处,就是如果我们修改了default.aspx,它不会影响别的Web app。下面我就在一个default.aspx页面上加了一个验证码功能。

 <asp:login id="loginControl"
   
FailureText="<%$Resources:wss,login_pageFailureText%>"
   
runat="server" width="100%" OnLoggingIn="signInControl_LoggingIn"
   
OnAuthenticate="signInControl_Authenticate"> <layouttemplate>
        <
asp:label id="FailureText" class="ms-error" runat="server"/>
        <
table width="100%">
        <
tr>
            <
td nowrap="nowrap">
                <
SharePoint:EncodedLiteral runat="server"
                   
text="<%$Resources:wss,login_pageUserName%>"
                   
EncodeMethod='HtmlEncode'/>
            </
td>
            <
td width="100%">
                <
asp:textbox id="UserName"
                   
autocomplete="off"
                   
runat="server"
                   
class="ms-inputuserfield" width="99%" />
            </
td>
        </
tr>
        <
tr>
            <
td nowrap="nowrap">
                <
SharePoint:EncodedLiteral runat="server"
                   
text="<%$Resources:wss,login_pagePassword%>"
                   
EncodeMethod='HtmlEncode'/>
            </
td>
            <
td width="100%">
                <
asp:textbox id="password" TextMode="Password"
                   
autocomplete="off" runat="server"
                   
class="ms-inputuserfield" width="99%"/>
            </
td>
        </
tr>
        <
tr>
            <
td nowrap
="nowrap">
                <
SharePoint:EncodedLiteral runat
="server"
                   
text="Secure Code:" EncodeMethod
='HtmlEncode'/>
            </
td
>
            <
td width
="100%">
                <
asp:textbox id="secureCode" autocomplete
="off"
                   
runat="server" class="ms-inputuserfield" Width
="85%" />
                <
SharePoint:EncodedLiteral ID
="secureCodeLit"
                   
runat="server" Text="1234" EncodeMethod
="HtmlEncode" />
            </
td
>
        </
tr
>
        <
tr>
            <
td colspan="2" align="right">
                <
asp:button id="login" commandname="Login"
                   
text="<%$Resources:wss,login_pagetitle%>" runat="server" />
            </
td>
        </
tr>
        <
tr>
            <
td colspan="2">
                <
asp:checkbox id="RememberMe"
                   
text="<%$SPHtmlEncodedResources:wss,login_pageRememberMe%>"
                   
runat="server" />
            </
td>
        </
tr>
        </
table>
    </
layouttemplate>
</
asp:login>

我的想法是,当用户登录的时候,只有输入了正确的用户名密码和验证码,这里是1234,之后才能成功登录。页面运行的效果如下:

当然,此时验证码还没有作用,我们必须写一些代码来实现验证的功能。

创建Code Behind类实现验证和登录功能

接下来是为default.aspx实现一个类来实现验证和登录功能。在项目中添加一个类,可以命名为FormsSignInPage。接着是添加一些引用,首先是Microsoft.SharePoint.dll。由于我们要处理Claims,System.IdentityModel.dll和Microsoft.IdentityModel.dll也是必须的。另外,SharePoint有一个自己的处理Claims的Module,Microsoft.SharePoint.IdentityModel.dll。添加对它的引用时,需要定位到它所在的目录。引用添加完,看起来像下面这样。

我们的类,FormsSignInPage,当然可以从Asp.Net的Page类派生,但是如果我们看一下默认的登录页面,它是派生自IdentityModelSignInPageBase。这个类在Microsoft.SharePoint.IdentityModel.Pages名字空间下,它提供了一些属性和方法,在处理登录时很方便。所以,我决定我的FormsSignInPage也从这个类派生。

当用户点击页面上的登录按钮时,有两个Login控件的事件需要处理,一个是LoggingIn,在这个事件中,我们可以处理验证码。另一个是Authenticate,在这个事件中可以实现真正的登录。

protected void signInControl_LoggingIn(objectsender, LoginCancelEventArgs e)
{
    LoginControl login = sender asLoginControl;
    login.UserName = login.UserName.Trim();
    if(string.IsNullOrEmpty(login.UserName))
    {
        ClaimsFormsPageMessage.Text = "The server could not sign you in. The user name cannot be empty.";
        e.Cancel = true;
    }
    if(string.IsNullOrEmpty(secureCode.Text) ||
        !string.Equals(secureCode.Text.ToLower(), secureCodeLit.Text.ToLower()))
    {
        ClaimsFormsPageMessage.Text = "The server could not sign you in. Please input correct secure code.";
        e.Cancel = true;
    }
}

private void EstablishSessionWithToken(SecurityToken securityToken)
{
    if (null == securityToken)
    {
        throw new ArgumentNullException("securityToken");
    }
    SPFederationAuthenticationModule fam = SPFederationAuthenticationModule.Current;
    if (null == fam)
    {
        throw new ArgumentException(null, "FederationAuthenticationModule");
    }

    fam.SetPrincipalAndWriteSessionToken(securityToken);
}

protected void signInControl_Authenticate(object sender, AuthenticateEventArgs e)
{
    SecurityToken token = null;
    LoginControl formsLoginControl = sender as LoginControl;

    if (null != (token = GetSecurityToken(formsLoginControl)))
    {
        EstablishSessionWithToken(token);
        e.Authenticated = true;
        base.RedirectToSuccessUrl();
    }
}

private SPIisSettings IisSettings
{
    get
   
{
               
        SPWebApplication webApp = SPWebApplication.Lookup(new Uri(SPContext.Current.Web.Url));

SPIisSettings settings = webApp.IisSettings[SPUrlZone.Default];
        return settings;
    }
}

private SecurityToken GetSecurityToken(LoginControl formsLoginControl)
{
    SecurityToken token = null;
    SPIisSettings iisSettings = IisSettings;
    Uri appliesTo = base.AppliesTo;

    if (string.IsNullOrEmpty(formsLoginControl.UserName) ||
        string.IsNullOrEmpty(formsLoginControl.Password))
        return null;

    SPFormsAuthenticationProvider authProvider = iisSettings.FormsClaimsAuthenticationProvider;
    token = SPSecurityContext.SecurityTokenForFormsAuthentication(
        appliesTo,
        authProvider.MembershipProvider,
        authProvider.RoleProvider,
        formsLoginControl.UserName,
        formsLoginControl.Password);

    return token;
}

代码的核心部分是执行登录的部分。SharePoint提供了SecurityTokenForFormsAuthentication专门供开发者处理Forms验证。我使用了SPIisSettings来取得当前Web App所使用的membership provider和roleship provider。

SPFormsAuthenticationProvider authProvider = iisSettings.FormsClaimsAuthenticationProvider;
token = SPSecurityContext.SecurityTokenForFormsAuthentication(
    appliesTo,
    authProvider.MembershipProvider,
    authProvider.RoleProvider,
    formsLoginControl.UserName,
    formsLoginControl.Password);

关联Default.aspx和FormsSignInPage

这部分比较简单,只要修改<%@ Page %>使它继承我们的FormsSignInPage就好了。

<%@PageLanguage="C#"AutoEventWireup="true"
  
Inherits="Morpheus.Demo.Pages.FormsSignInPage,FormsSignInPage, Version=1.0.0.0, Culture=neutral, PublicKeyToken=72d2bbe72853b8eb"
  
MasterPageFile="~/_layouts/simple.master"%>

然后我们就可以将我们的Assembly部署到GAC中,同时将default.aspx拷贝到_forms目录里。当执行登录时,如果用户没有输入正确的验证码,下面的错误会显示出来。

这个登录页面的代码可以从这里下载

Posted in Uncategorized | Tagged , , | 3 Comments

龍應台在北京大學百年紀念講堂演講全文

转载自联合报

我們的「中國夢」

第一次接到電話,希望我談談「中國夢」的時候,我的第一個反應是:「一千枚飛彈對準我家,我哪裡還有中國夢啊?」

可是沉靜下來思索,一九五二年生在臺灣的我,還有我前後幾代人,還真的是在「中國夢」裡長大的,我的第一個中國夢是什麼呢?

我們上幼稚園時,就已經穿著軍人的制服、帶著木製的步槍去殺「共匪」了,口裡唱著歌。當年所有的孩子都會唱的那首歌,叫做《反攻大陸去》:

反攻 反攻 反攻大陸去
大陸是我們的國土
大陸是我們的疆域
我們的國土 我們的疆域
不能讓共匪盡著盤據
不能讓俄寇盡著欺侮
我們要反攻回去 我們要反攻回去
反攻回去 反攻回去
把大陸收復 把大陸收復

這不是一種「中國夢」嗎?這個夢其實持續了滿久,它是一個至高無上的圖騰,也被人們真誠地相信。

倉皇的五十年代進入六十年代,「中國夢」持續地深化。余光中那首《鄉愁四韻》傳頌一時:

給我一瓢長江水啊長江水
那酒一樣的長江水
那醉酒的滋味是鄉愁的滋味
給我一瓢長江水啊長江水
給我一掌海棠紅啊海棠紅
那血一樣的海棠紅
那沸血的燒痛是鄉愁的燒痛
給我一掌海棠紅啊海棠紅

一九四九年,近兩百萬人突然之間被殘酷的內戰連根拔起,丟到了一個從來沒有去過、甚至很多人沒有聽說過的海島上。在戰火中離鄉背井,顛沛流離到了島上的人,思鄉之情刻骨銘心,也是無比真誠的。那分對中華故土的魂牽夢繞,不是「中國夢」嗎?

夢的基座是價值觀

我的父母那代人在一種「悲憤」的情結中掙扎著,我這代人在他們鄉愁的國家想像中成長。但是支撐著這個巨大的國家想像下面,有一個基座,墊著你、支撐著你,那個基座就是價值的基座。

它的核心是什麼?台灣所有的小學,你一進校門門當頭就是四個大字:「禮義廉恥」。進入教室,簡樸的教室裏面,牆壁上也是四個大字:「禮義廉恥」。如果一定要我在成千上萬的「格言」裏找出那個最基本的價值的基座,大概就是這四個字。

小的時候跟大陸一樣,四周都是標語,只是內容跟大陸的標語不一樣。最常見到的就是小學裡對孩子的解釋:

禮,規規矩矩的態度。
義,正正當當的行為。
廉,清清白白的辨別。
恥,切切實實的覺悟。

上了初中,會讀文言文了,另一番解釋就來了:

禮義廉恥,國之四維,四維不張,國乃滅亡。~管仲

然而四者之中,恥尤為要。人之不廉而至於悖禮犯義,其原皆生於無恥也。故士大夫之恥,是為國恥。~顧炎武

「士大夫之恥,是為國恥」,這些價值在我們小小的心靈有極深的烙印。

二○○六年,上百萬的「紅衫軍」包圍總統府要求陳水扁下臺,臺北的夜空飄著大氣球,一個一個氣球上面分別寫著大字:「禮」,「義」,「廉」,「恥」。我到廣場上去,抬頭乍看這四個字,感覺好像是全臺灣的人到這廣場上來開小學同學會了。看著那四個字,每個人心領神會,心中清晰知道,這個社會在乎的是什麼。

除了價值基座,還有一個基本的「態度」。我們年紀非常小,可是被教導得志氣非常大,小小年紀就已經被灌輸要把自己看成「士」,十歲的孩子都覺得自己將來就是那個「士」。「士」,是幹什麼的?

士不可以不弘毅,任重而道遠。仁以為己任,不亦重乎?死而後已,不亦遠乎?~論語泰伯篇

我初中一年級的國文老師叫林弘毅,數學老師叫陳弘毅。同時期大陸很多孩子可能叫「愛國」、「建國」,我們有很多孩子叫「弘毅」。我們都是要「弘毅」的。

對自己要期許為「士」,對國家,態度就是「以國家興亡為己任,置個人生死於度外」。這是蔣介石的名言,我們要背誦。十一二歲的孩子背誦這樣的句子,用今天的眼光看,挺可怕的,就是要你為國家去死。

然而在「國家」之上,還有一句:

為天地立心,為生民立命,為往聖繼絕學,為萬世開太平。~張載

對那麼小的孩子也有這樣的期待,氣魄大得有點嚇人。饒有深意的是,雖然說以國家至上,但是事實上張載所說的是,在「國家」之上還有「天地」,還有「生民」,它其實又修正了國家至上的秩序,因為「天地」跟「生民」比國家還大。

十四歲的時候,我第一次讀到《國語》,《國語》是兩千多年前的經典了,其中一篇讓我心裏很震動:

厲王虐,國人謗王。召公告曰:「民不堪命矣!」王怒,得衛巫,使監謗者。以告,則殺之。國人莫敢言,道路以目。王喜,告召公曰:「吾能弭謗矣,乃不敢言。」召公曰:「是障之也。防民之口,甚於防川,川壅而潰,傷人必多。民亦如之…」

王不聽,於是國人莫敢出言。三年,乃流王於彘。

最後一句,簡單幾個字,卻雷霆萬鈞,給十四歲的我,深深的震撼。

就是這個價值系統,形成一個強固的基座,撐起一個「中華大夢」。

我是誰?

這個中國夢在一九七○年代出現了質變。

一九七一年中華民國被迫退出聯合國,臺灣人突然之間覺得自己變成了孤兒。可是,最壞的還沒到,一九七九年一月一號,中美正式斷交,這個「中」指的是當時的中華民國,也就是台美斷交,中美建交。長期被視為「保護傘」的美國撤了,給臺灣人非常大的震撼,覺得風雨飄搖,這個島是不是快沉了。在一種被整個世界拋棄了而強敵當前的恐懼之下,救亡圖存的情感反而更強烈,也就在這個背景下,原來那個中國夢對於一部分人而言是被強化了,因為危機感帶來更深更強的、要求團結凝聚的民族情感;大陸人很熟悉的《龍的傳人》,是在那樣的悲憤傷感的背景下寫成的。這首歌人人傳唱,但是一九八三年,創作者「投匪」了,歌,在臺灣就被禁掉了,反而在大陸傳唱起來,情境一變,歌的意涵又有了轉換。

你們是否知道余光中《鄉愁》詩裏所說的「海棠紅」是什麼意思?

地圖
圖/取自龍應台講稿

我們從小長大,那個「中國夢」的形狀,也就是中華民國的地圖,包含外蒙古,正是海棠葉的形狀。習慣這樣的圖騰,開始看見中華人民共和國地圖的前面好幾年,我都還有種奇怪的錯覺,以為,哎呀,這中國地圖是不是畫錯了?

一九七○年代整個國際情勢改變,台灣的「中國夢」開始有分歧。對於一部分人而言,那個「海棠」中國夢還虔誠地持續著,可是對於另外一部分人就不一樣了。

夢,跟著身邊眼前的現實,是會變化的,一九四九年被連根拔起丟到海島上的一些人,我的父母輩,這時已經在臺灣生活了三十年,孩子也生在臺灣了—這海島曾是自己的「異鄉」卻是孩子的「故鄉」了,隨著時間推移,無形之中對腳下所踩的土地產生了具體而實在的情感。所以,你們熟悉余光中先生寫的那首《鄉愁》,卻可能不會知道他在一九七二年的時候創作了另外一首詩,詩歌禮讚的,是台灣南部屏東海邊一個小鎮,叫枋寮:

車過枋寮
雨落在屏東的甘蔗田裡
甜甜的甘蔗 甜甜的雨
從此地到山麓 一大幅平原舉起
多少甘蔗,多少甘美的希冀
長途車駛過青青的平原
檢閱牧神青青的儀隊

余先生這首詩,有「中國夢」轉換的象徵意義。但是今天想跟大家分享的,還有一首我稱之為「里程碑」的歌,叫《美麗島》。

一位淡江大學的年輕人,李雙澤,跟很多臺灣年輕人一樣, 七○年代發現臺灣不能代表中國,而且逐漸被國際推到邊緣,在危機感和孤獨感中,年輕人開始檢視自己:為什麼我們從小被教要愛長江、愛黃河、歌頌長城的偉大—─那都是我眼睛沒見過,腳板沒踩過的土地,而我住在淡水河邊,怎麼就從來不唱淡水河,怎麼我們就不知道自己村子裡頭小山小河的名字?台灣也不是沒有大江大海呀?

演講現場播放了幾首相關歌曲。
圖/南方周末提供

青年人開始推動「唱我們的歌」,開始自己寫歌。那個「中國夢」顯得那麼虛無飄渺,是不是該看看腳下踩的泥土是什麼樣?他寫了《美麗島》,改編於一首詩,一下子就流行起來,大家都喜歡唱。

《美麗島》真的是代表了從中國夢慢慢地轉型到「站在這片泥土上看見什麼、想什麼」的「台灣夢」里程碑:

我們搖籃的美麗島
是母親溫暖的懷抱
驕傲的祖先正視著
正視著我們的腳步
他們一再重覆地叮嚀
不要忘記 不要忘記
他們一再重覆地叮嚀
蓽路藍縷以啟山林
婆娑無邊的太平洋
懷抱著自由的土地
溫暖的陽光照耀著
照耀著高山和田園
我們這裡有勇敢的人民
蓽路藍縷以啟山林
我們這裡有無窮的生命
水牛 稻米 香蕉 玉蘭花

一九七五年,我二十三歲,到美國去讀書,每天泡在圖書館裏,從早上八點到半夜踩著雪光回到家,除了功課之外就有機會去讀一些中國近代史的書,第一次讀到國共內戰的部分,第一次知道一九二七年國民黨對共產黨員的殺戮,才知道之前所接受的教育那麼多都是被黨和國家機器所操縱的謊言,這是一個很大的震撼。十年之後寫了《野火集》,去「腐蝕」那個謊言。

一九七九年,我個人的「中國夢」也起了質變。在中國夢籠罩的臺灣,我們是講「祖籍」的。也就是說,任何人問,龍應台你是哪裡人,我理所當然的回答就是:「我是湖南人。」

這麼一路做「湖南人」做了幾十年,到一九七九年,中國大陸開放了,我終於在紐約生平第一次見到了一個真正的「共匪」站在我面前,這個樸實人剛剛從湖南出來,一口濃重的湖南腔。有人衝著他問「你是哪裡人」,他就說「我是湖南人」,問話者接著就回頭問我「你是哪裡人」——我就愣住了。

我不會說湖南話,沒有去過湖南,對湖南一無所知,老鄉站在面前,我登時就說不出話來了。這一輩子的那個「中國夢」突然就把我懵在那兒了,這是一九七九年一個非常大的震撼——原來啊,我是臺灣人。

一起做夢,一起上課

從海棠葉的大中國夢慢慢過渡到臺灣人腳踩著泥土的小小台灣夢,人民在七○年代末八○年代初開始問「我是誰」。八○年代後,臺灣兩千多萬人走向了轉型,自我感覺就是越來越小,什麼事情都一步一個腳印,一點一點做。所以,臺灣人就一塊兒從大夢慢慢轉到小夢的路上來了,開始一起上八○年代的民主大課。這個民主課程上得有夠辛苦。

《美麗島》這首歌,在一九七九變成黨外異議人士的雜誌名字,集結反對勢力。當年十二月十日,政府對反對者的大逮捕行動開始,接著是大審判。面臨巨大的挑戰,國民黨決定審判公開,這是審判庭上的一張照片:

美麗島大審,第二排露出一排白牙笑得瀟灑的是施明德,施明德的右邊是陳菊,左邊是呂秀蓮。
圖/中央社資料照片

你們認得其中任何一個人嗎?第二排露出一排白牙笑得瀟灑的,是施明德,他被判處無期徒刑。施明德右手邊的女子是陳菊,今天的高雄市長,左手邊是呂秀蓮,上一任的副總統。

我想用這張圖片來表達八○年代臺灣人慢慢地腳踩泥土重建夢想和希望的過程。如果把過去的發展切出一個三十年的時間切片來看,剛好看到一個完整的過程:這圖裏有三種人,第一種是叛亂犯,包括施明德,呂秀蓮,陳菊等等,她們倆分別被判十二年徒刑;第二種是英雄,在那個恐怖的時代,敢為這些政治犯辯護的律師,包括陳水扁,謝長廷,蘇貞昌等等;第三類是掌權者,當時的總統是蔣經國先生,新聞局長是宋楚瑜先生。從這些名字你就看出,在三十年的切片裡,政治犯上台變成了掌權者,掌權者下台變成了反對者,而當時得盡掌聲以及人們殷殷期待的,以道德作為註冊商標的那些英雄們變成了什麼?其中一部分人變成了道德徹底破產的貪污嫌疑犯。

這個轉變夠不夠大?親眼目睹這樣一個切膚痛苦的過程,你或許對臺灣民主的所謂「亂」有新的理解。

它所有的「亂」,在我個人眼中看來,都是民主的必修課;它所有的「跌倒」都是必須的實踐,因為只有真正跌倒了,你才真正地知道,要怎麼再站起來,跌倒本身就是一種考試。所以,容許我這樣說:臺灣民主的「亂」,不是亂,它是必上的課。

表面上臺灣被撕裂得很嚴重,但不要被這個表面騙了。回到基座上的價值觀來看,從前的中國夢慢慢被拋棄了,逐漸發展為臺灣的小夢,然後一起上非常艱辛、痛苦的民主課,然而臺灣不管是藍是綠,其實有一個非常結實的共識,比如說:

國家是會說謊的,
掌權者是會腐敗的,
反對者是會墮落,
政治權力不是唯一的壓迫來源,
資本也可能一樣的壓迫。

而正因為權力的侵蝕無所不在,所以個人的權利、比如言論的自由,是每個人都要隨時隨地、寸土必爭、絕不退讓的。

這是大多數臺灣人的共識。你所看到的爭議、吵架,立法院撕頭髮丟茶杯打架,其實都是站在這個基礎上的。這個基礎,是以共同的價值觀建立起來的。

我有中國夢嗎?

回到今天中國夢的主題,可能有很多臺灣人會跳起來說:中國不是我的夢,我的夢裡沒有中國。

但是,你如果問龍應台有沒有中國夢,我會先問你那個中國夢的「中國」指的是什麼?如果指的是「國家」或「政府」,「國家」「政府」在我心目中不過就是個管理組織,對不起,我對「國家」沒有夢,「政府」是會說謊的。但如果你說的「中國」指的是這塊土地上的人,這個社會,我怎麼會沒有夢呢?別說這片美麗的土地是我摯愛的父親、母親永遠的故鄉,這個地方的好跟壞,對於臺灣有那麼大的影響,這個地方的福與禍,會牽動整個人類社區的未來,我怎會沒有中國夢呢?

我們就從「大國崛起」這個詞說起吧。我很願意看到中國的崛起,可是我希望它是以文明的力量來崛起的。

如何衡量文明?我願意跟大家分享我自己衡量文明的一把尺。它不太難。看一個城市的文明的程度,就看這個城市怎樣對待它的精神病人,它對於殘障者的服務做到什麼地步,它對鰥寡孤獨的照顧到什麼程度,它怎樣對待所謂的盲流民工底層人民。對我而言,這是非常具體的文明的尺度。

一個國家文明到哪裡,我看這個國家怎麼對待外來移民,怎麼對待它的少數族群。我觀察這個國家的多數如何對待它的少數——這當然也包含十三億人如何對待兩千三百萬人!

誰在乎「大國崛起」?至少我不在乎。我在乎的是剛才我所說的文明刻度——你這大國怎麼對待你的弱勢與少數,你怎麼包容意見不同的異議份子,這,才是我在乎的。如果說,所謂的大國崛起,它的人民所引以自豪的,是軍事的耀武揚威,經濟的財大氣粗,政治勢力的唯我獨尊,那我寧可它不崛起,因為這種性質的崛起,很可能最終為它自己的人民以及人類社區帶來災難和危險。

誰又在乎「血濃於水」?至少我不那麼在乎。如果我們對於文明的尺度完全沒有共識,如果我們在基座的價值上,根本無法對話,「血濃於水」有意義嗎?

我的父親十五歲那年,用一根扁擔、兩個竹簍走到湖南衡山的火車站前買蔬菜,準備挑回山上。剛巧國民黨在招憲兵學生隊,這個少年當下就做了決定:他放下扁擔就跟著軍隊走了。

我的父親在一九一九年出生,二○○四年,我捧著父親的骨灰回到了湖南衡山龍家院的山溝溝,鄉親點起一路的鞭炮迎接這個離家七十年、顛沛流離一生的遊子回鄉。

在家祭時,我聽到一個長輩用最古老的楚國鄉音唱出淒切的輓歌。一直忍者眼淚的我,那時再也忍不住了。

楚國鄉音使我更深刻地認識到父親一輩子是怎麼被迫脫離了他自己的文化,過著不由自主的放逐的一生。一直到捧著他的骨灰回到那片土地,我才深切的感覺到這個七十年之後以骨灰回來的少年經歷了怎樣的中國的近代史。而我在浙江新安江畔長大的母親,是如何地一生懷念那條清澈見魚的江水。

一個開闊、包容的中國

所以,請相信我,我對中國的希望是真誠的。但是請不要跟我談「大國崛起」, 請不要跟我談「血濃於水」,我深深盼望見到的,是一個敢用文明尺度來檢驗自己的中國;這樣的中國,因為自信,所以開闊,因為開闊,所以包容,因為包容,所以它的力量更柔韌、更長遠。當它文明的力量柔韌長遠的時候,它對整個人類的和平都會有關鍵的貢獻。

一九八五年我寫《野火集》,一九八六年一月,《野火集》在風聲鶴唳中出版。八月,我遷居歐洲。離開台灣前夕,做了一場臨別演講,是「野火」時期唯一的一次。演講在害怕隨時「斷電」的氣氛中進行。今天,二○一○年八月一日,在北京大學,我想唸那篇演講的最後一段,與大陸的讀者分享:

在臨別的今天晚上,你或許要問我對臺灣有什麼樣的夢想?

有。

今天晚上站在這裏說話,我心裏懷著深深的恐懼,恐懼今晚的言詞帶來什麼後果,我的夢想是,希望中國人的下一代可以在任何一個晚上站在任何一個地方說出心裏想說的話,而心中沒有任何恐懼。我們這一代人所做的種種努力也不過是希望我們的下一代將來會有免於恐懼的自由。

那是一九八六年八月十一日。

(二○一○年八月一日北京大學百年紀念講堂演講全文)

Posted in Uncategorized | Tagged , | Leave a comment

国庆日

8月9日是新加坡国庆日。每年的这天,新加坡政府会举办一些庆祝活动,比如歌舞表演,花车巡游之类的,旨在提高国民的国家认同感或自豪感。其中一个重要的环节是阅兵,当然规模是没法和中国的阅兵比了。看来新加坡和中国一样,相信展示军队的力量是促进民族自豪感的有效途径。

关于军队这个话题,我曾和不同的新加坡人聊过。新加坡有义务兵役制度,而且是全民服役,每个新加坡男孩到了一定的年龄都需要去部队服两年兵役,之后每年还需要回部队完成一定时间的National Service。我认识的大部分人都认为2年兵役是浪费时间,导致同样年龄的男孩子比女孩子晚进入职场,起步低了,连女朋友都不好找。

但是也有人认为服兵役是完全必要的,国家小更需要军队。有一次我坐出租车,司机是个上了年纪的老头。聊起军队来,他就很支持政府花钱更新军队的装备,说如果政府需要,他可以为了军队装备给政府捐钱。他说万一邻居们打过来,即使美国要来救,也至少要新加坡的军队要能够坚持到那个时候。我想他的看法也许缘于对当年新加坡独立前后的风云岁月的经验吧。这也从一个侧面印证了最近的这个调查:越富裕的新加坡人对国家越不自豪

Posted in Uncategorized | Tagged | Leave a comment

佛曰,不可说

以后写东西大概不会贴到Spaces里,而只会贴在这里了。

Tagged , | Leave a comment

配置SharePoint 2010和ADFS 2.0

我曾经为了向客户演示SharePoint 2010中的Claims-based Authentication是怎么回事,专门写了一个简单的IP-STS,花了许多功夫配置SharePoint和这个IP-STS,并写了两篇文章。我最初是想用ADFS 2.0的,可是看了它的文档被吓着了,里面概念和名词一大堆,我怕真的用ADFS 2.0配合SharePoint作演示的话,光它的相关概念就得解释半天了。

不过在生产环境中,如果需要做联合认证(federated authentication),典型的比如在两个没有信任关系的域之间作认证,很少有用户会自己开发IP-STS,大部分用户会选择使用现成的产品,当然,ADFS 2.0是无法忽略的首选产品。最近又有客户让我演示配置ADFS 2.0和SharePoint 2010,于是花了些时间在Lab环境里配置了一下,发向也没有想象的复杂。现在在我的Lab环境里,有这样一个Web App,我同时在它上面启用了4种认证方式,Windows认证,Forms认证,基于ADFS 2.0的STS,和自定义的STS。

image

总结一下配置ADFS 2.0和SharePoint的步骤:

  1. 在Account Partner域中安装并配置ADFS 2.0。它的联合认证服务需要一个FQDN和相应的证书。
  2. 在ADFS 2.0中设置RP,这个RP就是Resource Partner域中的SharePoint网站。
  3. 设置Claims Rule,选择要发给SharePoint的claims。
  4. 最后在SharePoint设置信任这个ADFS 2.0,并在相应的Web App上启用这个STS。

详细的步骤,可以参考Steve Peschka的这篇文章,图文并茂,非常详细。

Posted in SharePoint | Tagged , , | Leave a comment

升级到WordPress 3.0.1了

在Blog后台看到3.0.1的升级信息很久了,一直懒着没动,今天终于忍不住动手升级了。WordPress的升级步骤很简单,我的blog里也没用到太复杂的插件和定制,所以按照升级文档的三步做下来,没遇到问题,一切顺利。3.0.1的后台程序比2.5的清爽多了。

顺便换了一个新的主题,TwentyTen,同时将SCP插件升级到了1.0.6。

Tagged | Leave a comment

从Google索引中删除网页内容

根据Google Webmaster Tools的说明文当,如果要从Google的搜索结果中删除网页内容,必须至少满足三个条件中的一个:

  1. 访问该页面返回404或者410错误。必须是HTTP Header里包含错误,而不是返回自定义错误页面。
  2. 用robots.txt禁止对特定页面的索引。
  3. 在HTML页面中是用meta tag noindex。

Google说满足该条件之后,Google的机器人在下次爬网的时候,会从索引中删除该页面。可是有时候好像即使满足上面条件之一,页面也并不能完全从搜索结果中删除。这时可以用Google Webmaster Tools提交一条删除链接申请。该申请如果被批准,链接基本能从搜索结果中删除了,但该申请也有可能被拒绝。不知道Google在批准或拒绝申请时,是人工还是机器。

上面的方法对特定的页面或文件有效,但对象WordPress首页这样的动态页面效果不大。因为这个页面不大可能返回404或410,如果只想移出某一篇blog,也不大可能加noindex的meta tag,同样如果用robots.txt,所有blog都不会被索引。我试着提交了一个移出链接申请,结果被拒绝了。最终我选择使用robots.txt暂时block全站,这样google检索之后,在搜索结果中虽然还能看到我的blog,但缓存的内容已经没有了。问题是我修改robots.txt恢复全站索引之后,内容好像有回来了。

Google说页面的内容必须有改变才会重新索引,加了这篇blog之后,看看索引和缓存会不会更新。

Tagged | Leave a comment