2006-11-29

在 WEB 开发中指示文件的格式和显示方式

网络上的 WEB 服务器,往往网络地址的扩展名决定下载内容的格式。比如, http://www.google.com/images/logo_sm.gif 表示一个 gif 图片文件,http://www.ietf.org/rfc/rfc0001.txt 表示一个 txt 文本文件。然后,也有少数不是这样的,比如 Gmail ,链接地址都是看不懂的一串字符,可是这也能在浏览器中显示图片,并且对于附件中的图片,提供了直接在浏览器中查看和下载到本地两个按钮。这些功能都很人性化,是在返回的消息头信息中,告诉浏览器本消息格式这样的方式来实现的。
在返回的头信息中, Content-Type 字段指示了消息的类型,消息的类型由 MIME 决定。MIME ,全名 Multipurpose Internet Mail Extensions (多用途网际邮件扩展),是一个描述消息内容的标准,网络浏览器通过此标准解析收到的内容。
在 RFC( Request for Comments) 文档 rfc2045 中,对消息内容的类型作了以下说明:

content := "Content-Type" ":" type "/" subtype
           *(";" parameter)
           ; Matching of media type and subtype
           ; is ALWAYS case-insensitive.

type := discrete-type / composite-type

discrete-type := "text" / "image" / "audio" / "video" /
                 "application" / extension-token

composite-type := "message" / "multipart" / extension-token

extension-token := ietf-token / x-token

ietf-token := <An extension token defined by a
               standards-track RFC and registered
               with IANA.>

x-token := <The two characters "X-" or "x-" followed, with
            no intervening white space, by any token>

subtype := extension-token / iana-token

iana-token := <A publicly-defined extension token. Tokens
               of this form must be registered with IANA
               as specified in RFC 2048.>

parameter := attribute "=" value

attribute := token
             ; Matching of attributes
             ; is ALWAYS case-insensitive.

value := token / quoted-string

token := 1*<any (US-ASCII) CHAR except SPACE, CTLs,
            or tspecials>

tspecials := "(" / ")" / "<" / ">" / "@" /
             "," / ";" / ":" / "\" / <">
             "/" / "[" / "]" / "?" / "="
             ; Must be in quoted-string,
             ; to use within parameter values

上面指出,目前独立的内容类型主要有5种,分别是 text(文本),image(图片),audio(音频),video(视频),application(应用程序识别),当浏览器收到此类型定义时,解析器根据此字段调用不同的组件显示收到的消息。所以,修改 Content-Type ,我们可以指定浏览器以何种方式显示收到的消息。
同时,对于没有指定内容类型的消息, rfc 文档指定了默认值,如下:

Content-type: text/plain; charset=us-ascii

另外,在文档 rfc2183 中,补充了接收展现的信息,定义为 Content-Disposition :

disposition := "Content-Disposition" ":"
                disposition-type
                *(";" disposition-parm)

disposition-type := "inline"
                    / "attachment"
                    / extension-token
                    ; values are not case-sensitive

disposition-parm := filename-parm
                    / creation-date-parm
                    / modification-date-parm
                    / read-date-parm
                    / size-parm
                    / parameter

filename-parm := "filename" "=" value

creation-date-parm := "creation-date" "=" quoted-date-time

modification-date-parm := "modification-date" "=" quoted-date-time

read-date-parm := "read-date" "=" quoted-date-time

size-parm := "size" "=" 1*DIGIT

quoted-date-time := quoted-string
                    ; contents MUST be an RFC 822 `date-time'
                    ; numeric timezones (+HHMM or -HHMM) MUST be used

上面指定了展现时主要有两种类型: inline(直接打开)和 attachment(作为附件打开)。通过对 Content-Disposition 的修改,我们可以让浏览器直接显示或弹出保存文件的对话框。常用的附加参数还有文件名,创建日期,修改日期,文件大小,最后读取日期等,浏览器将遵循这些字段保存文件。
可以看到,浏览器通过对 Content-Type 和 Content-Disposition 的读取决定显示消息的类型和方式,与网络地址的扩展名毫无关系。下面分别使用 ASP.NET 和 Servlet 列出在客户端弹出图片下载窗口的方法。
使用 C# 在 ASP.NET 中的实现:

...
Response.ContentType = "image/gif";//指示客户端传输的内容为gif图片
Response.AddHeader("Content-Disposition",
     "attachment;filename=cs.gif");//默认的文件名是cs.gif
//在这里使用 Response.BinaryWrite 方法往客户端写二进制数据
Response.Close();
...

使用 Java 在 Servlet 中的实现:

...
resp.setContentType("image/gif");//指示客户端传输的内容为gif图片
resp.addHeader("Content-Disposition",
      "attachment;filename=java.gif");//默认的文件名是java.gif
//使用 resp.setContentLength 方法设定发送的长度
ServletOutputStream stream = resp.getOutputStream();
//在这里使用 stream.write 方法往客户端写二进制数据
stream.close();
...

2006-11-28

寒号鸟

哆罗罗,哆罗罗,寒风冻死我,明天就垒窝。

2006-11-26

美国大兵

172 Stryker 旅23步兵团的 Kyle Shelton 在摩苏尔搜寻武装分子

2006-11-24

一无所有

演唱:崔健

我曾经问个不休,你何时跟我走
可你却总是笑我,一无所有
我要给你我的追求,还有我的自由
可你却总是笑我,一无所有

噢……你何时跟我走
噢……你何时跟我走

脚下这地在走,身边那水在流
可你却总是笑我,一无所有
为何你总笑个没够,为何我总要追求
难道在你面前,我永远是一无所有

噢……你何时跟我走
噢……你何时跟我走

脚下这地在走,身边那水在流

告诉你我等了很久,告诉你我最后的要求
我要抓起你的双手,你这就跟我走
这时你的手在颤抖,这时你的泪在流
莫非你是正在告诉我,你爱我一无所有

噢……你这就跟我走
噢……你这就跟我走

噢……你这就跟我走

2006-11-23

旗木卡卡西

同样的忍术不能对我使用两次

今天我在人生的道路上迷失了

木叶第一技师复制忍者卡卡西

在 .Net 中使用低级键盘钩子屏蔽 Win 键

在微软的文档《HOW TO:在 Visual C# .NET 中设置窗口挂钩 》中,对 .NET 框架中的钩子有如下描述:

在 .NET 框架中不支持全局挂钩
您无法在 Microsoft .NET 框架中实现全局挂钩。若要安装全局挂钩,挂钩必须有一个本机动态链接库 (DLL) 导出以便将其本身插入到另一个需要调入一个有效而且一致的函数的进程中。这需要一个 DLL 导出,而 .NET 框架不支持这一点。托管代码没有让函数指针具有统一的值这一概念,因为这些函数是动态构建的代理。

在 .NET 2.0 中,已经可以开发程序使用全局挂钩了,下面给出使用 C# 开发低级键盘钩子屏蔽 Win 键的代码:
使用钩子需要用到 3 个 Win32 API 函数: SetWindowsHookEx,CallNextHookEx和UnhookWindowsHookEx,在 C# 中需要声明一下:

class Win32API
{
   [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
   public static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId);

   [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
   public static extern int CallNextHookEx(IntPtr hhk, int nCode, uint wParam, int lParam);

   [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
   public static extern int UnhookWindowsHookEx(IntPtr hhk);
}

低级键盘钩子用到了 KBDLLHOOKSTRUCT 结构,在 C# 中定义对应的结构:

struct KeyBoardHookStruct
{
   public UInt32 vkCode;
   public UInt32 scanCode;
   public UInt32 flags;
   public UInt32 time;
   public UInt32 dwExtraInfo;
}

对于低级键盘钩子,Win32 提供了 LowLevelKeyboardProc 格式的回调函数,对应的,在 C# 中使用代理:

delegate int HookProc(int nCode, uint wParam, int lParam);

最后封装一个类屏蔽左右 Win 键:

class MaskKey
{
   private const int WH_KEYBOARD_LL = 13;
   private const int HC_ACTION = 0;
   private const int VK_LWIN = 0x5B;
   private const int VK_RWIN = 0x5C;
   private IntPtr m_hook;

   public bool StartMaskKey()
   {
     if (m_hook != IntPtr.Zero) return false;

     IntPtr pInstance = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().ManifestModule);
     m_hook = Win32API.SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, pInstance, 0);
     if (m_hook == IntPtr.Zero) return false;

     return true;
   }

   public bool StopMaskKey()
   {
     if (m_hook != IntPtr.Zero)
     {
       int succeed = Win32API.UnhookWindowsHookEx(m_hook);
       if (succeed == 0) return false;

       m_hook = IntPtr.Zero;
     }

     return true;
   }

   private int LowLevelKeyboardProc(int nCode, uint wParam, int lParam)
   {
     if (nCode == HC_ACTION)
     {
       KeyBoardHookStruct khs = (KeyBoardHookStruct)Marshal.PtrToStructure(
          new IntPtr(lParam), typeof(KeyBoardHookStruct));
       if (khs.vkCode == VK_LWIN || khs.vkCode == VK_RWIN) return 1;
     }
     return Win32API.CallNextHookEx(m_hook, nCode, wParam, lParam);
   }
}

上面的代码使用了低级键盘钩子,其中 ManifestModule 为 .Net 2.0 新增的属性,作用是获取包含当前程序集清单的模块。
编译成功后会发现程序仍然无法正确运行,这是因为需要修改 VS2005的编译选项,右键选择项目属性,在 Debug 选项卡中取消 Enable the Visual Studio hosting process 前面的选中标记, 重新编译运行,键盘的左右 Win 键已经不能使用了。

2006-11-20

美国反禁枪广告(四)

如果歹徒攻击这位女士会的到什么?她的身体、尊严和钱财?还是她准备好的子弹?易于攻击的受害者?还是武装的公民?让歹徒去猜吧!怎么能说“只有我失却了防卫能力,才能使他人免于暴力犯罪”呢?

美国反禁枪广告(三)

在美国的有些地方,这把枪使你安全。因为歹徒不知道你并非赤手空拳。拥有这些不会成为电脑黑客、电锯狂魔或纵火犯。那为什么仅仅害怕这个呢?合法地隐藏地携带,让图谋不轨的人看到它——阻止犯罪,自卫反击未雨绸缪,长缨在手,成竹在胸手无寸铁,让早期的人类成为牺牲品,而进化让我们使用工具,不再成为他人的食物了!拨打911可以让犯罪终结者以80英里每小时的速度赶到,而她的来复枪可以达到800英里每小时。哪个可以及时终结犯罪挽救她的性命?守护神就在身边,让我们得以摆脱恐惧一个真正的女权主义者不会依靠男人来保护,你会么?打电话报警需要时间,等待救援可能葬送你的余生,自卫反击!为什么要让你的生命依赖一罐喷雾剂?选择更好的工具!

美国反禁枪广告(二)

9..1..1..忙音...重播...救命,这儿发生了强奸案...要一个半小时?嘿,等等!
也许你可以是一个好的证人,但是你能够挽救一个生命么?
强大的火力才能保障和平最初的承诺,请承认一个早已存在的人权他的和她的安全现在就掌握在你的手中。要么就让它停在甜品店旁的警车里击退来犯者,保护你的社区有些父母自己保护他们的孩子,有些宁可依赖陌生人,你呢?政客们让我们见到罪犯就跑开,但我们中的有些人做不到,每个人都有自卫的权利如果你的家庭受到袭击,你是做个自卫者呢?还是仅仅做一个证人?人的生命值得捍卫

美国反禁枪广告(一)

孩子相信父母能保证他们的安全,不要辜负他们的信任自我防卫才是最好的!——难道妇女要依靠男人来保护嘛?束手待毙算一种选择,你的选择呢?武装起来——人民挥舞这个标志;解除武装——受害者佩戴这个标志没有反抗侵害者,都都鸟灭绝了;不要成为都都鸟,起来自卫!保护家人是你的责任,你准备好了吗?衣服使你温暖,手枪使你安全,在公众场合,不要让自己“赤身裸体”手无寸铁!(象Genovese一样)让警察来保护你?
ps:1964年,住在纽约皇后区的Kitty Genovese小姐被歹徒当街刺杀身亡。当时有三十八位邻居从窗户亲眼看到她被歹徒追逐长达半个小时的过程,但是没有一位目击者打电话报警。斩钉截铁地说“不”

小熊杰里米

我是小熊杰里米,聪明能干又伶俐,会唱小调 Do Re Mi ……
鸟王听了我的歌,十分高兴对我说,送你一只小魔哨,魔哨吹起:嘟嘟嘟嘟嘟嘟嘟 ……

2006-11-18

祷告

基督教
新约全书,马太福音第6章


我们在天上的父,愿人都尊你的名为圣。
愿你的国降临,愿你的旨意行在地上,如同行在天上。
我们日用的饮食,今日赐给我们。
免我们的债,如同我们免了人的债。
不叫我们遇见试探,救我们脱离凶恶。
因为国度、权柄、荣耀,全是你的,直到永远,阿们。

圣火经文

金庸
倚天屠龙记


焚我残躯,熊熊圣火,
生亦何欢,死亦何苦?
为善除恶,惟光明故,
喜乐悲愁,皆归尘土。
怜我世人,忧患实多!
怜我世人,忧患实多!

2006-11-15

QQ 宠物语录

百里香代表着勇敢,风铃草代表着感激,雏菊代表着纯真,那鸢尾花呢……

难怪现在的MM都这么暴力,唉,学校的课程该改改了。叹气

关关之鸠,在河之洲,窈窕淑女,君子好逑。QMM一点也不窈窕呀,怎么还是那么……

做宠物如果没有梦想,那跟企鹅有什么区别?我的梦想就是去寻宝乐园寻出大奖。

我不饿,只是前胸贴后背而已,这对企鹅来说不算什么。

当记者太不容易了,不仅要有良好的文字功底,还要有一定的武术基础。

秋天的景色好美啊,要是能去狩猎场一边打猎一边欣赏美景,那就一箭双雕啦!

其实减肥不是靠节食,是靠运动,对吧James?我给你耍两招好吗?

呵呵,现在肚子不饿啦,我陪你玩好不,James?

James,配合我做一次采访吧,主题就是《我的宠物情缘》。

James,月饼就象是遗失在风中的烟花,让我来不及说声再见就吞下去了。

高高抬起头,大步向前走,训练营里刻苦练,争当主人的小帮手!

一场秋雨一场凉,秋天昼夜温差较大,主人记得要随时增减衣服,以防秋凉感冒。

轻轻地,我走了。James,你舍得我吗?风都变向了……

星球大战

在遥远遥远的将来,黑星及其手下为统治地球而发动了罪恶的战争,他们的唯一对手是科学家詹姆斯·查科博士和他的精锐勇士,他们在一起是不可战胜的,他们在一起就是——麦克瑞一号!

小星星

小星星,亮晶晶,闪着明亮的眼睛。

一闪一闪亮晶晶,满天都是小星星。

十八罗汉

佛教


  1. 降龙罗汉:庆友尊者,传说曾降伏恶龙。

  2. 坐鹿罗汉:宾罗跋罗多尊者,曾乘鹿入皇宫劝喻国王学佛修行。

  3. 举钵罗汉:迦诺迦跋哩陀尊者,是一位托钵化缘的行者。

  4. 过江罗汉:跋陀罗尊者,过江似蜻蜓点水。

  5. 伏虎罗汉:宾头卢尊者,曾降伏过猛虎。

  6. 静坐罗汉:诺距罗尊者,又为大力罗汉,因过去乃武士出身,故力大无穷。

  7. 长眉罗汉:阿氏多尊者,传说出生时就有两条长眉。

  8. 布袋罗汉:因揭陀尊者,常背一布袋笑口常开。

  9. 看门罗汉:注茶半托迦尊者,为人尽忠职守。

  10. 探手罗汉:半托迦尊者,因打坐完常只手举起伸懒腰,而得此名。

  11. 沉思罗汉:罗怙罗尊者,佛陀十大弟子中,以密行居首。

  12. 骑象罗汉:迦理迦尊者,本是一名驯象师。

  13. 欢喜罗汉:迦诺伐蹉尊者,原是古印度一位雄辩家。

  14. 笑狮罗汉:罗弗多尊者,原为猎人,因学佛不再杀生,狮子来谢,故有此名。

  15. 开心罗汉:戍博迦尊者,曾袒露其心,使人觉知佛于心中。

  16. 托塔罗汉:苏频陀,是佛陀所收最后一名弟子,他因怀念佛陀而常手托佛塔。

  17. 芭蕉罗汉:伐那婆斯尊者,出家后常在芭蕉树下修行用功。

  18. 挖耳罗汉:那迦犀那尊者,以论“耳根清净”闻名,故称挖耳罗汉。

2006-11-13

《东邪西毒》海报

2006-11-12

House Season 3

I don't regret what I did.
------ Dr. Ezra Powell, 3.3 - Informed Consent

2006-11-11

林达作品

近距离看美国系列(三联书店版):
之一《历史深处的忧虑》(台湾版名《辛普森案的启示》)
之二《总统是靠不住的》
之三《我也有一个梦想》
之四《如彗星划过夜空》

《扫起落叶好过冬》(三联书店版)
《带一本书去巴黎》(三联书店版)
《在边缘看世界》(云南人民版)
《一路走来一路读》(湖南文艺版)
《汉娜的手提箱》、《克拉拉的战争》、《盖比橱柜的秘密》(译著/湖南文艺版)

2006-11-10

PTU 机动部队

每个人都不喜欢四面楚歌的感觉,枪能使他们感到安全。

2006-11-09

一个字头的诞生

荒诞的故事,荒诞的年代,他变成了他心目中的样子。

The Period

Charles John Huffam Dickens
A Tale of Two Cities


It was the best of times, it was the worst of times,
it was the age of wisdom, it was the age of foolishness,
it was the epoch of belief, it was the epoch of incredulity,
it was the season of Light, it was the season of Darkness,
it was the spring of hope, it was the winter of despair,
we had everything before us, we had nothing before us,
we were all going direct to Heaven, we were all going direct the other way.

2006-11-08

名言动漫篇

各位,早啊,今天我在人生的道路上迷路了
------- 旗木卡卡西《火影忍者》

能原谅女人的谎话的,才是男人
------- 山治《海贼王》

名言小说篇

你无论为朋友做了什么,都是你自己的事,根本就不必想要朋友知道。
------- 燕七《欢乐英雄》(古龙)

那都是很好很好的,可是我偏不喜欢。
------- 李文秀《白马啸西风》(金庸)

尊敬、优雅、智慧、拥有独特品味的修斯大人,您可有什么不愉快的事吗?
------- 格里高利《亵渎》(烟雨江南)

我本就不为什么而来,也就不为什么而去。
------- 杨过《神雕侠侣》(金庸)

情深不寿,强极则辱,谦谦君子,温润如玉。
------- 乾隆《书剑恩仇录》(金庸)

2006-11-06

《讣告》自《缘分天注定》

Obituary from Serendipity

Jonathan Trager, Prominent television producer for ESPN, died last night from complications of losing his soul mate and his finance.

He was 35 years old and soft-spoken and obsessive. Trager never looked the part of a hopeless romantic, but in the final days of his life, he revealed an unknown side of his psyche. This hidden quasi-Junqian person a surfaced during the Agatha Christie-like pursuit for his long-reputed soul mate, a woman whom he only spent a few precious hours with.

Sadly, The protracted search ended late Saturday night in complete and utter failure.

Yet even in certain defeat, the courageous Trager secretly clung to the belief that life is not merely a series of meaningless accidents or coincidences uh-uh, but rather it’s a tapestry of events that culminate in an exquisite, sublime plan.

Asked about the loss of his dear friend, Dean Kansky, the Pulitzer Prize-winning author and executive editor of the New York Times described Jonathan as a changed man in the last days of his life, “things were clearer for him” Kansky noted.

Ultimately, Jomathan concluded that if we are to live life in harmony with the universe, we must all possess a powerful faith in what the ancients used to call “fatum”, what we currently refer to as destiny.

《讣告》自《缘分天注定》

乔纳森·卓加,有线体育台优秀监制,既失红颜,复破婚盟,肝肠寸断,遂于昨日撒手尘寰。享年三十有五。庄君文质彬彬,公而忘私,平素言行,绝无痴态。孰料,阳寿将尽之际,流露鲜为人知之浪漫。刹那惊艳,化作萦回梦魂,遍觅芳踪,历尽一波三折,本性情怀,浮现无疑。呜呼,踏破铁鞋,方觉一番心事悉付东流。语云:匹夫可以夺其爱,不可夺其志。然庄君坚信,人生际遇绝非偶然,冥冥之中,上苍早已安排周详,丝毫不爽。其友文坛巨擘,时报主笔甸恩谓:庄君晚年脱胎换骨,有所顿悟,一以蔽之——欲臻天人合一,须坚信一字,此字古已有之,于今亦然,唯“缘”而已。

——————————————分隔线——————————————
此译文来源于各大字幕组,原作者不明。

2006-11-05

大事件

只是一场秀而已,除了 Neo 这只带有人类血统的怪物,理论上没有任何人能在长时间的短距离枪林弹雨中挥洒自如。

两个只能活一个

无论何时何地,我们的内心深处还保留着一丝纯真,也只是一丝而已。

缘分天注定

对于神,我们不能祈求的太多。

2006-11-04

非常突然

非常突然的意思是:你知道了所有的后果,你做好了所有的准备,仅仅因为一只蝴蝶扇动了几下翅膀,你变得和以前不一样。