2008年12月23日星期二

放Emacs到U盘上

参考: http://at-aka.blogspot.com/2006/06/portable-emacs-22050-on-usb.html

Emacs for Windows looks for your .emacs file in c:/Document and Setting/USERNAME by default. But USB application must find its init files in the USB memony.

Here the tips!

Put the following codes into f:/emacs+auctex-w32-<date>/Emacs/site-lisp/site-start.el.

 (defvar usb-drive-letter (substring data-directory 0 3)) (defvar usb-home-dir (concat usb-drive-letter "home/"))  (setenv "HOME" usb-home-dir) 

In this section, I use f: for the drive letter of USB flash memory. But please remmember that the drive letter will be changed by each of machines. Do not write the drive letter directly to your init files. Use the variable usb-drive-letter for the drive letter.

Now make directory home in f:/. This is the simple .emacs file in f:/home/

 ;; Portable Emacs init file. ;;;  (setq user-full-name "YOUR NAME") (setq user-mail-address "YOUR EMAIL ADDRESS")  ;; ;; Set environment ;; (defvar usb-site-lisp-dir (expand-file-name "site-lisp" usb-home-dir)) (setq load-path (cons usb-site-lisp-dir load-path)) (let ((dir (delete nil (mapcar (lambda (f)      (unless (string-match "\\.elc?\\'" f) f))           (cddr (directory-files usb-site-lisp-dir t))))))   (setq load-path (append dir load-path))) 

Additional Elisp files should be saved in f:/home/site-lisp/.

2008年10月31日星期五

Subversion中忽略你不想要的文件

如 *.o *.obj 等编译中间文件,设置的时候,可以在你想的目录下,使用
$ svn pe svn:ignore .
这样会打开vi,然后你就可以每一行做为一个,如

*.dat
*.o
*~
CVS

如果你每个目录都想这样的话,可以设置 ~/.subversion/config 中的 global-ignore
$ vim ~/.subversion/config

[miscellany]
### Set global-ignores to a set of whitespace-delimited globs
### which Subversion will ignore in its 'status' output, and
### while importing or adding files and directories.
global-ignores = *.plt *.dat *.mod *.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store

而相对的git,是在你project的根目录下有.git 目录,其中的 .git/info/exclude 文件中就可以设置了

2008年10月25日星期六

mlterm的中文字体

新安装了系统,ubuntu 8.04,发现mlterm中的中文字体显示为方块,看了下配置文件,解决办法如下:
1、建立 ~/.mlterm 目录
2、拷贝系统目录下的配置文件到自己的目录下:
cp /etc/mlterm/main ~/.mlterm
cp /etc/mlterm/aafont ~/.mlterm
cp /etc/mlterm/taafont ~/.mlterm
3、更改配置
aafont 文件中的最后几行中,有
# Simplified Chinese speakers may want to enable the following setting.
# ISO10646_UCS2_1_BIWIDTH=AR PL SungtiL GB-iso10646-1;
改为
ISO10646_UCS2_1_BIWIDTH=STKaiti-iso10646-1;

搞定


2008年9月27日星期六

喝点牛奶有啥呀?

校内网 - 浏览日志 - 喝点牛奶有啥呀?

南开bbs——看完了就不会有人再感慨奶粉事件了...
作为一个食品专业的本科生 我对我们专业是彻底失望了
想当初 系主任展望 我们专业的美好前景的时候 曾说"中国的食品行业还是有很大发
展空间的" 现在终于知道什么是"发展空间"了 套用师兄的话"中国的很多东西还真
不是做给人吃的
从"阜阳大头娃娃"到现在的"三鹿事件", 从苏丹红到肝炎病毒矿泉水。我们的食品
安全课从来不缺素材。几乎每一天上课的时候老师都在爆料,有些是大家都知道的,有
些是我们专业的黑幕。
当大家还考虑是买脑白金还是纽崔莱的时候,你是否想过你今天的午饭可能就是你若干
年后 各种各样怪病的罪魁祸首
中国现在的食品行业根本就不是什么营养健康的问题,是安全卫生的问题。
所以我现在特别想 把我们上课说的那些食品问题 贴出来
也许大家会觉得 吃了这么多年了也没什么事 或者是 疑神疑鬼的什么都不能吃活着也
没什么乐趣
但是我想说 有害食品实际上是个概率问题 就跟抽烟一样。都知道抽烟对什么身体不好
会导致这病那病, 但也有些老烟民活得好好的。 但是从统计数字来看 抽烟还是会挂得
更快一点
ok 我开始贴吧 以下是我们系教授说的 有什么不对的牛人可以指出来
吃鱼的话 最好吃本地产的

新鲜鱼常温下高密度运输的存活时间是8小时。跨地域运输的时间少说要3小时,鱼市早
上开市至少也得卖一天吧,怎么算都无法控制在8小时之内。消费者是不会去买死鱼的。
怎么办呢 只能加孔雀石绿。孔雀石绿是种工业染料,还可以用来炼铜,杀菌效果很好,
又便宜。但对人体有致癌作用

这个东西基本上是行业的潜规则,没办法的。所以最好吃本地的鱼,越近越好。外地的
水产品还是买冰鲜的吧


少吃青蛙和黄鳝

少吃青蛙是因为现在农药使用得太厉害了,青蛙食量很大,体内富集的农药相应的也比
其他动物多一些。体内很少有不残留的。

黄鳝用避孕药催熟大家肯定都知道。 上次有个厂家找到我们系主任说要一起研究"避孕
药催熟的代用方法" 汗啊 避孕药催熟现在俨然成为养殖工艺流程的一部分了

大排档用的肯定是潲水油,只是比例多少问题

现在物价涨的这么厉害 大排档只能在价格上有点优势听我们系的老师说 基本上用的都
是潲水油,而且有很完善的分销网络。有负责收的 负责运的买的 负责打点检验部门的

检验部门的人自己私下都说,要查都有,谁让你自己去吃的


蔬菜上的农药残留用水是泡不掉的

我妈以前老是觉得菜上有农药的话 买回来泡一泡就没事了事实上使用最广泛的有机磷
农药根本就不是水溶性的 是脂溶性的 怎么可能泡一泡就没了呢~~

有这种事,农民兄弟吃了自己的种的菜中毒的,原因是农村普遍认识,觉得喷了农药以
后,下点雨,打点露水,农药就失效了,然后继续喷。导致蔬菜上农药严重超标,因为
农药像油一样粘在叶片上,很难洗掉的。 然后就有人在一场大雨后把昨天才喷完农药的
菜,拿来自己吃或者去卖。然后中毒,去灌肠。

那么怎么洗呢,有人说用盐水。我觉得效果应该不好,没听说过氯化钠能增加有机磷在
水中的溶解度。教授他自己是用洗碗精,只要一点就好。

可能有人会觉得洗碗精会残留在菜里,吃了不好。一滴洗碗精洗菜最后残留的真的只有
痕迹量的成分,每天洗碗残留在碗上的绝对是这个的数量级。洗碗精的成分就是十二烷
基磺酸钠,没有文献显示它对人体有什么毒害作用,只要你不把它当泡泡果奶喝。


贝类在海鲜中最应该少吃的

原来广州流行吃生蚝(先在也还蛮流行的)放在几十年年前,这是没有什么大问题。现
在不一样了,江河湖海都受到了不同程度的污染,重金属元素是就是其中之一。什么汞
啊,镍啊,铬啊。贝类大部分长在大陆架上,以水和泥沙中的浮游动植物为食。而那些
重金属就全部沉在泥沙里。外加一些乱七八糟的微生物(包括病原微生物)

贝类在加工过程中因为壳的缘故很难食品安全要求的温度。餐馆里大多随便颠两下就出
锅了 吃了不仅可能拉肚子,搞不好吃进了不少重金属毒素。

所以吃海鲜最好少吃贝类(口味上我也觉得螃蟹什么的比较好吃)


点心最好买不带奶油的,一定要吃奶油的话,就舍得点去买个用天然奶油的吧

我这里说的不是会不会长胖的问题。而是人造奶油对人身体的影响。

人造奶油学名是氢化植物油。这个名字听上去蛮健康的(我妈就这么想的,只要有"植
物""天然"这样的字眼她就觉得蛮健康的)其它就是反式脂肪的一种。油炸食品被诟
病为垃圾食品的主要原因之一就是它。

这里我直接引用文献好了:

"研究显示反式脂肪含量高的饮食和诸如心脏动脉疾病以及动脉硬化等疾病有关联性每
天摄入反式脂肪5g,心脏病的发病几率会增加25%"

美国为什么得血管病的那么多,跟他们的饮食习惯肯定有关系的。以前还没有这个概念
,现在越来越多的蛋糕店以使用天然奶油为荣了。

2007年7月,纽约市规定所有的速食店,都不可以再使用反式脂肪,否则将被罚款。

国内现在出了极个别的高级品牌连锁店(不要跟我说麦波啊·~)如breadtalk之类有贵
的要死的天然奶油蛋糕(其实也不值那个价)其他的一律都是氢化奶油做的

所以老人过生日,别再弄两块硕大无比的奶油蛋糕给他吃。要吃的话,把奶油刮了吧~~


远离反式脂肪绝对不是不吃奶油这么简单

接着刚才的话题,反式脂肪现在已经渗透到食品的各个角落,油炸食品,蛋糕,甜甜圈
,饼干几乎都是用的凡是脂肪。因为它便宜啊,而且烹调特性,又好起酥又不容易变质
。于是你用我用大家用。少吃点没关系,每天坚持不懈的吃的话。。。呵呵呵

说到坚持不懈,现在上班族喝咖啡就挺坚持不懈的。我马上就要工作了,估计到时也差
不多吧。咖啡是跟伴侣在一起的,袋装的配好了,瓶装的自己配。

伴侣可以使咖啡变得细滑香浓,但很少人去探究伴侣到底使什么?


是什么呢?

椰丝? 我在没上专业课之前也一直使这么想的。多像啊,白白的,香香的。


事实上伴侣是油,去看那些小得不能再小的标签吧,成分那一栏写着"氢化植物油"

伴侣的生产过程就是把氢化植物油喷雾,小液滴在空气中被裹上一层膜,然后干燥。


每天一小匙,咖啡伴侣,就是一小匙反式脂肪。还不算上你蛋糕饼干油饼里的那些。

记住每天5g反式脂肪,心脏病的发病几率会增加25%哦


最后说下保健品吧

从来没见过我们系的老师逢年过节送过什么保健品的。

老师帮企业做项目,企业除了给米米之外,也送会点产品过来意思一下。做枣子的送点
枣子啦,做酒的送点酒啦。但保健品场除外,就给钱,给很多钱。绝对不会弄两箱口服
液给老师家送,那太讽刺了。"我还不知道你这里头是什么,你还不如直接送点鸡蛋好
"

现在中国的保健品市场,基本停留在买概念的阶段。Marketing绝对比R&D来钱来得快。

随便说几个吧


脑白金

吃过的人知道,一盒里头两大瓶水 加几板胶囊。

有效成分其实只有胶囊里的褪黑素 但几百块钱就几颗丸子,消费者不会买啦。太贵了。
加上两瓶主要成分比王老吉多一味药(山楂)的"纯天然制剂"大家就觉得划得来了。
赶上优惠大酬宾,再多给你一瓶"纯天然制剂"就"物超所值"了就"过节不收礼,只
收脑白金"了

回过头看褪黑素是什么.原来是美国空中乘务人员,倒时差用的药品。没什么害处,但也
没什么神奇的效果。20刀一大瓶,一百粒。每一粒可以做两粒脑白金胶囊。自己算算他
的利润吧



黄金搭档

脑白金的姐妹产品,一样sb的广告。一样的铺天盖地。把一块二一瓶的维生素买到一百
二。牛!

他的诉求点是:中国人磷 铜超标,再补会有副作用。黄金搭档的营养成分都经过严格搭
配 所以就值这个价。

学过营养的人都知道这根本就是扯淡嘛



广告上说的那些"面色红润有光泽个子长高不生病"没错是维生素的效果,维生素是重要
,要不怎么叫维生素呢。但那是缺维生素的人吃了维生素以后的由亚健康转为健康的表
现。换句话说,你如果不缺,甚至是不是严重缺乏的话,是没有明显效果的。有也是心
理作用。你想你心情一好了 自然就面色红润有光泽了跟他nnd黄金搭档有什么关系啊



还有 所谓的严格搭配跟更可笑。维生素又不是激素,多吃一克会死人。水溶性的维生素
如Vc 吃多了 就随尿液排除体外了(还有理论说超量服用Vc可以防癌,是据牛逼无比的
泡林说的,他自己就是实践着,拿了诺贝尔奖,提出泡林不相容原理还活了90多岁,有
兴趣可以google 一下)脂溶性维生素吃多了倒是会对身体不好但那是得怎么个吃法行
啊 每天用鱼肝油炒菜?



安利的纤维素 蛋白粉

安利的东西都知道海贵了。他还喜欢一套套的让你买

他说的那些纯度啊 什么的 也都是真的。老外的工艺还是没得说



但是。。。。我们真的需要99%的蛋白粉吗?

来我们来看看他的生产流程吧



拿最常见的番茄为例。安利有很多番茄系列的产品 又是番茄红素又是果胶 又纤维素

把番茄买来 皮归皮 肉归肉 皮里绝不带一点肉 肉里绝不带一丝皮

然后皮去提取番茄红素 肉去做果胶 纤维素

再然后我们就有了高纯度的几百快一瓶的 番茄红素 果胶和纤体纤维素

安利的专业营养师会"建议你一起服用,效果更佳"

于是你花几百块 让失散了多年的 果皮和果肉团聚在一起

我花几块钱 买个西红柿 享受跟你相差无几的服务也许口味还更好点



不喝乳饮料,基本是水兑出来的,乳饮料一定会在标签上面标出来,尽管饮料两个字可能印刷得很小

尽量吃比较干的食品 或者糖度比较高易保存的
如果含水量高 货架期又长的 不要买 全是靠防腐剂 而不是低水分活度保存的

有些产品会用复合防腐剂 就是几种联合抗腐败的 这种少吃

光明的乳制品比其他国企的都要好

香精有天然来源的 也有化工合成的 建议少吃 适量也无所谓
很多香精公司直接接触香精的调香师 应用工程师普遍过早出现白头发 就是频繁接触香精的结果

不要喝除了纯鲜奶之外的任何产品 UHT的不要喝
有些奶
香——奶味香精
浓——增稠剂,淀粉或胶体

酸奶:有条件的话 注意一下标签 买配料表里没有"复原乳、奶粉"字样的

冷冻的水饺之类
首先 一定不能买散装的 很可能是混有过期的解冻的坏包的拆开来卖的
第二包装上的生产日期如果是黑色打印的 最好也不要买 要买就要买是凹凸版的
第三 解过冻的最明显的就是 粘连 皮上有白霜 最简单的区分方法是皮上没白霜 一个一个独立的是一直保持在温度要求的 汤圆碎开的裂开的就是解冻过的 丸子上有霜也是解冻过的 鱼饺由于机器问题所以最后一道工序都是手工弯的 一定要买大品牌

湾仔码头是美国通用磨房的产品 对肉类的控制比较好

99%的蟹肉棒是香精+淀粉+色素+蛋白做的

超市里散装的冷冻食品其实污染也不小的

康师傅方便面 防腐剂肯定有 但是要买原厂的就是杭州厂的 不要买其他厂的东西
看包装上的日期是黑色还是凹凸版的 如果有黑有凹凸就买凹凸的 所有包装食品都一样的啊

大桶的正广和水 你一定要跟正广和订而不是送水站 如果你能不喝桶装水更好因为桶装水的桶是反复使用的 怕消毒不够 而且要尽快喝完时间久了会有细菌

罐装王老吉,难办喝喝ok 因为是凉茶所以里面有中草药成分 所以多喝了对人体不好

靖江的猪肉浦 大包的肯定有问题,因为猪肉的位置不好 也就是我们说的下脚料 要买就要买双鱼的独立小包装 这个肉比较好 而且一定要注意生产日期 还有这个东西添加剂不会少少吃点

百威暂时没问题 酒原是美国过来的而且要喝就喝听装和小瓶装 700cc供应外面饭店的少喝为妙所有品牌哦

但是最近朝日的原料污染不要喝了

雪花是国内的酒料但是要看厂 以前我做采购的时候不喝的

反正 同志们 我现在所有零食基本不吃 幺么就吃销售量最大的当季吃 过了季节就不吃了 还有蜜饯大家不要吃了 生产过程太脏了,真的

简单的说 从我们日常来看 能做到的是尽量吃热的食物 营养损失不谈 饭菜之类从冰箱拿出来之后先热一下 冰箱里的污染通常被忽略

小店的东西尽量少吃 如果你参与过饭店卫生检查 你会非常震惊的

有些东西怀疑 要坏掉了就不要吃 尤其是肉类 因为可怕的不是微生物 而是肉类常见菌的产物:毒素,轻者腹泻 种者死亡

没持续打乙肝疫苗的tx赶紧去补 我国是乙肝大国

大家不要忽略卫生 以为拉拉肚子就没事了 对你肠道系统免疫系统的伤害是会累积的

马口铁和罐头食品,一般不含防腐剂 罐头的工艺已经非常非常成熟了 杀菌后有的可以保存很多年 不考虑营养问题 可以买哦

马口铁罐装,防腐剂少,但罐头食品的营养其实是比较少了,卫生问题,只要看不鼓起,应该是没啥问题。午餐肉主要问题是亚硝盐的问题,亚硝盐有致癌作用,越少吃越好。唉,我也爱吃,只能偶尔吃吃,解馋

冷饮推荐和路雪

烟熏的东西尽量少吃 还有肠类 有些肠为了颜色好看 除了色素问题 还有硝酸盐超标问题

饭店里的海鲜问题也很多 最简单的就是福尔马林泡了 看起来新鲜肉质又好又筋道

记得无锡有三白的特产 其中的银鱼 有些饭店里吃到的颜色好看到透明 都是泡出来的

我再爆一个外面饭店红烧肉的问题
红烧肉出锅前,加入乙基麦芽酚,加热后产生有光泽的铁锈红,并且会增加红烧肉醇厚的香气。。。
至于加热后乙基麦芽酚是否会产生有毒物质,我不了解。。。反正饭店里红烧肉烧得比我老妈烧得好吃的,我就尽量克制不吃。。。

果汁
货架上的 所有果汁 除了盒装的 其他的都表买
透明包装的 瓶装的 都防腐剂 而且很多
因为果汁的特殊性 见光就开始变质 所以要喝好果汁就要买利乐包装的 而且一定要买100%的 稍微好点 防腐剂肯定有
如果有条件 自己榨果汁吃 苹果生梨洗洗干净去皮去核

说到西红柿 不要买那种屁股突出来的 是打激素的
也不要买畸形的很大的原理和草莓一样

做妈妈的 不要给小孩吃果冻了

所有菜 水果 都买当季的 有句老话 水果要吃中间上市的 蔬菜要吃新鲜上市额 太早和太晚或者反季节的 最好不要买
蔬菜上有点虫不要紧 拿回来洗干净 就好了
蔬菜上有洞洞眼 多泡泡 没洞洞眼 穷炮
能买到本地人自己提着篮子的蔬菜最好 很可能是自留地里多出来的

不要吃翅尖
记得学医的老师曾经告诉我 鸡从小到大打过的激素之类不会完全代谢掉 一般会在肢体末端累积就是鸡翅尖~

冷饮能不吃就不吃
1。冷链可能有漏洞 当然大品牌的自己送货还可以
2。热量高
3。对肠胃有刺激
4。营养难说,看一下营养成分表就知道啦

还有 巧克力 不是越甜越好 是要吃纯的
在瑞士 意大利 最值钱的巧克力叫黑薄片 最差的巧克力是果仁


中国已经把全麦的概念毁掉了
国外的全麦 是真的whole wheat 面粉本身在加工的时候保留了一部分麸 磨出的面粉发暗 但是营养全面 这种产品价格也不便宜
国内很多偷换概念 所谓全麦就是普通产品加上点看得见的麸皮之类 就叫全麦了 价格也低很多

有钱的话 就买贵的。。。价格是王道

海苔要看原料来源的 哎 否则色素和淀粉填充物也很多

讲到葡萄 我来八一下吧 尽管也是听别人说的我老爸的死党 XX市环保局局长 如今退休自己承包果园了 他曾经对我说过 吃什么都不要吃葡萄 那个打的农药实在太多了.

旁友说,葡萄的确是要打很多农药的,从一开始种藤起,就要打驱虫药水啊,否则藤都要死光了.打药水的时候,他家都是用环保纸袋套牢的,以免药水和葡萄接触.有些黑心果农,为了提早让葡萄上市,就要打催熟针.要果子大,就要打膨大剂(尤其是乒乓和巨峰),一直打到上市前几天才歇手 .

我旁友家有四亩果园,就她公公一个人在忙,所以除了驱虫外,根本来不及做那些手脚,就算是驱虫药水,在葡萄上市前一个多月就要停止打了.所以她家的葡萄都要比外面上市的慢起码大半个月,而且个子和卖相也明显有些逊色,但是好歹人吃了放心呢.
朋友说,好的葡萄,刚采下来,哪怕不放冰箱放了外面,两天也不会变质.如果码子大的葡萄摸上去皮软软的,么有光泽和弹性的,很有可能是注射了膨大剂,那个经不住放的.
有白霜的都是打过农药的。。洗完还有的。。用纸巾擦擦

葡萄,橘子最恶心,不知道要打多少的农药

蔬菜 就吃颜色深额蔬菜比如 踏库菜 叶子颜色越深越好 越排毒 不过爆难吃
有条件最好吃有机产品.
水果当中农药含量最高的: 苹果, 生梨, 桃子, 葡萄, 草莓...
水果当中农药含量较底的; 香焦, 菠罗, 弥猴桃...
绿叶蔬菜相对而言, 农药的含量都老高的.

还有一个非常值得重视大家也都知道的 控制钠摄入量 饼干之类的 尤其是苏打 不要给父母吃 里面钠太多了 钠的控制其实是个养身过程 中国人普遍钠摄入超标~

火腿就肯定有亚硝酸类 不超标就可以 这类食品要经常注意的是
第一 表多吃 少吃点可以
第二 买颜色不好看的 你要好看就表健康 要健康就表好看
第三 要买新鲜 销量好的品牌

香草精和香草粉都是化学合成,以尽量少用为好,可以买干的香草叶来用。

泡打粉是小苏打(碳酸氢钠)和硫酸铝,淀粉的混合物,其中铝对儿童大脑发育不利。

烧烤不好的原因是糖,蛋白质烧焦致癌,自己烧一样会焦。尽量不要焦,但口味肯定是略焦的好。

康师傅的老板说的表喝他们的东西,他自己都不会喝

脉动,维体等,都是功能性饮料,补充体液的,如果不运动的时候喝会增加肾脏负担,减分不加分哦!!

我以前在KFC打过工,他们用的不是我们平时见到的桶装油......是一种类似黄油一样的物质,.经过温度熔化形成的.........!!!!!!!!!!! 是棕榈油,本身熔点高,常温下是固态。但是氢化植物油最常用原料是棕榈油

露露的杏仁露和椰树的椰奶可以放心吃吃 肯定没问题的 我老早就是做这个采购的
而且只有椰树和露露 这两个牌子过关 ok 但是露露没有椰树好

蛋白粉这种东西还是不要吃得好, 早两年就听说有人吃蛋白粉吃出问题了

吃果冻和粉丝。。就是在吃马夹袋

无光驱CDROM通过ISO文件从Windows安装Ubuntu(非vm环境)

无光驱CDROM通过ISO文件从Windows安装Ubuntu(非vm环境)

安装全新的Ubuntu, 没有光驱或不想刻录CD, 也不是装在VMWARE上(VM可以直接映射iso成cd)
奸商已经在机上装了xp

用下面方法32/64 bit 都已经安装成功,自己Windows PC也在VMWare上安装了Ubuntu

1. 创建 c:\hd-media
2. Download vmlinuz and initrd.gz from 
    http://archive.ubuntu.com/ubuntu/dists/feisty/main/installer-i386/current/images/hd-media/
    and save them to hd-media
3.下载 Ubuntu ISO 文件,迅雷搜一下一大堆。
   或者去官方: Download the ALTERNATE ubuntu-installer CD from [WWW] http://www.ubuntulinux.org/download/
注意:只对 Alternate Ubuntu install CD 有效
   如:ubuntu-7.04-server-i386.iso
   
   下载后请保存在C:\
   
4. 下载 Grub For Dos 
    http://sarovar.org/download.php/1138/grub_for_dos-0.4.2.zip
    解压里面的 grldr 保存在 c:\grldr. 其他文件不需要。

5. 修改 c:\boot.ini(需要显示隐藏系统文件才能看到), 后面添加
        c:\grldr="Install Ubuntu"
        
6. 创建新文本文件 c:\menu.lst

      title Install Ubuntu
      kernel   (hd0,0)/hd-media/vmlinuz root=/dev/ram0 ramdisk_size=128000
      initrd   (hd0,0)/hd-media/initrd.gz

7. 重新启动 Windows, 启动菜单里面选择



64-bit Ubuntu:
(AMD64, INTEL EM64T系列)

1. 创建 c:\hd-media
2. Download vmlinuz and initrd.gz from 
    http://archive.ubuntu.com/ubuntu/dists/feisty/main/installer-amd64/current/images/hd-media/
    and save them to hd-media
3.下载 Ubuntu ISO 文件,迅雷搜一下很多选择。
   或者去官方: Download the ALTERNATE ubuntu-installer CD from [WWW] http://www.ubuntulinux.org/download/
注意:只对 Alternate Ubuntu install CD 有效
   如:ubuntu-7.04-server-amd64.iso
   
   下载后请保存在C:\
   
4. 下载 Grub For Dos 
    http://sarovar.org/download.php/1138/grub_for_dos-0.4.2.zip
    解压里面的 grldr 保存在 c:\grldr. 其他文件不需要。

5. 修改 c:\boot.ini(需要显示隐藏系统文件才能看到), 后面添加
        c:\grldr="Install Ubuntu"
        
6. 创建新文本文件 c:\menu.lst

      title Install Ubuntu
      kernel   (hd0,0)/hd-media/vmlinuz root=/dev/ram0 ramdisk_size=128000
      initrd   (hd0,0)/hd-media/initrd.gz

7. 重新启动 Windows, 启动菜单里面选择 

2008年9月15日星期一

Pownce的多种使用

1. Firefox扩展:
2. 客户端:AIR
3. AIM和Jabber:
    Jabber:pownce[at]valkertown.org  (http://www.valkertown.org/jance.html
    Jabber: pownceim[at]gmail.com   (http://kylebrowning.com/project/pownceim#proj
  AIM: pownceaim

--

拥抱真是很奇妙,虽然两颗心靠得很近,却看不见对方的脸。

启动多个使用不同配置的Forefox

在執行Firefox的後面加上[-ProfileManager]這段參數就可以启动官方Profile Manager,使用[-ProfileManager D:\XXX\profile],就會開啟異地的profile資料夾,使用[-p "YYY"](YYY為子Profile名稱),就會自動選擇Profile,最後是[-no-remote]這個參數,可以啟動多重的Profile。使用參數[-ProfileManager -no-remote],可以開啟多重Firefox及多個Profile

--

拥抱真是很奇妙,虽然两颗心靠得很近,却看不见对方的脸。

2008年9月13日星期六

Latex: CJK字体与Word对应的字号

CJK中字义与Word中相应的字号

\newcommand\zihao[1]{
   \ifthenelse{\equal{#1}{0}}{\CJKfontsize{42bp}{50.4pt}{.5pt}{.3pt}}{}
   \ifthenelse{\equal{#1}{-0}}{\CJKfontsize{36bp}{43.2pt}{.5pt}{.3pt}}{}
   \ifthenelse{\equal{#1}{1}}{\CJKfontsize{26bp}{31.2pt}{.5pt}{.3pt}}{}
   \ifthenelse{\equal{#1}{-1}}{\CJKfontsize{24bp}{28.8pt}{.5pt}{.3pt}}{}
   \ifthenelse{\equal{#1}{2}}{\CJKfontsize{22bp}{26.4pt}{.5pt}{.3pt}}{}
   \ifthenelse{\equal{#1}{-2}}{\CJKfontsize{18bp}{21.6pt}{.3pt}{.2pt}}{}
   \ifthenelse{\equal{#1}{3}}{\CJKfontsize{16bp}{19.3pt}{.3pt}{.2pt}}{}
   \ifthenelse{\equal{#1}{-3}}{\CJKfontsize{15bp}{18pt}{.3pt}{.2pt}}{}
   \ifthenelse{\equal{#1}{4}}{\CJKfontsize{14bp}{16.8pt}{.3pt}{.2pt}}{}
   \ifthenelse{\equal{#1}{-4}}{\CJKfontsize{12bp}{14.4pt}{.3pt}{.2pt}}{}
   \ifthenelse{\equal{#1}{5}}{\CJKfontsize{10.5bp}{12.6pt}{.3pt}{.2pt}}{}
   \ifthenelse{\equal{#1}{-5}}{\CJKfontsize{9bp}{10.8pt}{.2pt}{.1pt}}{}
   \ifthenelse{\equal{#1}{6}}{\CJKfontsize{7.5bp}{9pt}{.2pt}{.1pt}}{}
   \ifthenelse{\equal{#1}{-6}}{\CJKfontsize{6.5bp}{7.8pt}{.2pt}{.1pt}}{}
   \ifthenelse{\equal{#1}{7}}{\CJKfontsize{5.5bp}{6.6pt}{.1pt}{.1pt}}{}
   \ifthenelse{\equal{#1}{8}}{\CJKfontsize{5bp}{6pt}{.1pt}{.1pt}}{}
}


--

拥抱真是很奇妙,虽然两颗心靠得很近,却看不见对方的脸。

2008年8月5日星期二

将军令:男儿行

男儿当杀人,杀人不留情。
千秋不朽业,尽在杀人中。
昔有豪男儿,义气重然诺。
睚眦即杀人,身比鸿毛轻。
又有雄与霸,杀人乱如麻,
驰骋走天下,只将刀枪夸。
今欲觅此类,徒然捞月影。
君不见,竖儒蜂起壮士死,神州从此夸仁义。
一朝虏夷乱中原,士子豕奔懦民泣。
我欲学古风,重振雄豪气。
名声同粪土,不屑仁者讥。
身佩削铁剑,一怒即杀人。
割股相下酒,谈笑鬼神惊。
千里杀仇人,愿费十周星。
专诸田光俦,与结冥冥情。
朝出西门去,暮提人头回。
神倦唯思睡,战号蓦然吹。
西门别母去,母悲儿不悲。
身许汗青事,男儿长不归。
杀斗天地间,惨烈惊阴庭。
三步杀一人,心停手不停。
血流万里浪,尸枕千寻山。
壮士征战罢,倦枕敌尸眠。
梦中犹杀人,笑靥映素辉。
女儿莫相问,男儿凶何甚?
古来仁德专害人,道义从来无一真。
君不见,狮虎猎物获威名,可怜麋鹿有谁怜?
世间从来强食弱,纵使有理也枉然。
君休问,男儿自有男儿行。
男儿行,当暴戾。
事与仁,两不立。
男儿事在杀斗场,胆似熊罴目如狼。
生若为男即杀人,不教男躯裹女心。
男儿从来不恤身,纵死敌手笑相承。
仇场战场一百处,处处愿与野草青。
男儿莫战栗,有歌与君听:
杀一是为罪,屠万是为雄。
屠得九百万,即为雄中雄。
雄中雄,道不同:
看破千年仁义名,但使今生逞雄风。
美名不爱爱恶名,杀人百万心不惩。
宁教万人切齿恨,不教无有骂我人。
放眼世界五千年,何处英雄不杀人?

--

那存在的,都是幻影;那永恒的,终将毁灭;世界万物,缤纷色彩,都是被蒙蔽的人心罢了。终有一日,天上人间,青山绿水,存在只依我心

[转]:在车后坐挖鼻孔的后果


  一个风雨交加的深夜,外面漆黑一片,只有借助闪电的光亮才能看清楚路面。街上早已经没有任何行人。一辆出租车刚送完最后一位客人,孤单的行使在返程的路上。突然,一道闪电划过,出租车司机隐约看见路边有一位穿白色连衣裙的长发女子伸手揽车。虽然司机已经想直接回家了,但想到一位孤单女子在这么晚的雨夜站在路边叫车一定也急着回家,变动了恻隐之心,决定再送这最后一位客人。

  女子坐在后座上后,冷冷的说了句"八宝山"。司机不由的打了个寒颤。虽然他不相信有鬼,但这么晚了去那种地方心里还是有点慎的幌。司机硬着头皮启动了车子,心里想,一个女子那么晚了去八宝山干什么呢?不会是-------?转念又一想,这世界怎么会有鬼呢?我还是别自己吓自己了!想着想着,不由自主的瞥了一眼观后镜,怎么?后面怎么没人?他马上扭头看去,看见那位白衣女子好端端的坐在后座上正对着他笑,那笑容是那么的不自然。司机不好意思的扭过头去,刚才在观后镜里没看见人,是我眼花了吗?可她为什么对着我那样的奇怪的笑呢?司机纳闷的想着。不自觉的又看了一眼观后镜,还是没人!这怎么可能?迅速回头,那女子确实还坐在那,不过这回没有笑,而是在瞪着他。司机不敢正视她,赶快把头转过去了。听说鬼在镜子里是看不见的,难道是真的?这个世界上真的有鬼?他边想边往观后镜望去。还是没人,我见着鬼了!突然,一阵雷鸣,他浑身一哆嗦,条件反射的踩了急刹车,然后慢慢的回头望去。一道闪电划过,他看得清清楚楚,那白衣女子披头散发,煞白的脸,鼻子里冒着血,正怒目而视的瞪着他!鬼,真的是鬼!他刚张口还没来得急说,就晕了过去!------

  警车上,那名女子接受警察的询问。"我今天上夜班,很累,又赶上下大雨,心情很不好。下班后我见路边正好有辆出租车,便伸手上车。我住在八宝山边上的小区,由于心情不好就只说了一句'八宝山'。司机就开车了。一会儿,我觉得鼻子痒痒,就想抠鼻子。你也知道,我一个女孩,让人看见我抠鼻子多不好,我就低下头来抠,这样谁也看不见我。可我刚低头开始抠,那个司机就转过头来看我,我赶快抬起头不好意思的冲他笑笑。他转过头后我又刚低头抠,他很讨厌马上又转头看我,我赶快又把头抬起来,很生气的瞪着他。他可能也觉得不好意思了,赶快把头转了回去。我想,这回他不会打搅我了吧,便放心的低头抠。可是不知怎么回事,他突然踩了脚急刹车,我往前一栽,把鼻子给抠破了,还把我的头发弄乱了,我生气的抬起头看他,他张着嘴就晕了过去------"女子迷茫的说!

--

WENO 编程有些初步搞定了

2008年7月30日星期三

Linux下享受IPv6的畅快

Linux下享受IPv6的畅快

2008-05-20 17:24 | 分类 网络相关 | By TualatriX | 3,883次阅读

随着互联网的不断发展,当今的IPv4制式已渐渐满足不了应用,往下一代IPv6的转换也悄悄开始了。

早在去年11月,台湾的电信运营商即开始正式启用IPv6;今年2月份,国际互联网从IPv4向IPv6转移也已启动;而四天前,Google也开通了IPv6网络专访的网址

一切动作显示,向IPv6的转换的脚步是越来越快了。

虽然我们还不知道什么时候会转向IPv6,但是看完了本文,你就可以在Linux下享受IPv6!

—–

本文是对bones7456兄写的的"ipv6"进行的扩充,并在Ubuntu 8.04下试验成功。其他Linux发行版类似,只需要安装好相关开发包即可。

原理简介

利用現有 IPv4 網路,透過二端建立起一條 隧道(Tunnel) ,Server端透過這個 Tunnel 發送一組 IPv6 位址給另一端,使兩端可以使用 IPv6 封包在 Tunnel 內傳遞,如同現行很熱門的 VPN應用,是同相道理,使用者在外可使用公司內部私人網路,一樣是透過 Tunnel 建立,公司內部網段 IP 在 Tunnel 內傳遞,只不過這時換成 IPV6 封包。

0、先决条件

在编译这个软件前,首先确保你的Linux系统准备好了以下开发包,以顺利进行编译:gcc,g++,libc6-dev,libssl-dev

1、下载软件

先下载这个包,解压至任意位置,如桌面。其中tspc-advanced/INSTALL文件内有详细的安装说明。

2、编译并安装

进入tspc-advanced,执行make target=linux编译:

cd ~/Desktop/gw6c/tspc-advanced/
make target=linux

然后执行下面的命令安装:

sudo make target=linux installdir=/usr/local/gw6c install

3、修改配置文件

sudo gedit /usr/local/gw6c/bin/gw6c.conf

然后找到server=那行,修改为: server=tb.ipv6.apol.com.tw,保存退出。

4、运行

cd /usr/local/gw6c/bin/ 然后执行 sudo ./gw6c ,如果看到类似:

Gateway6 Client v5.0-RELEASE build May 16 2008-12:30:00
Connection to tb.ipv6.apol.com.tw established.

这样的输出,就表示连接成功了。这时,软件会在后台运行,需要注意的是,每次电脑启动后都需要手动加载。假如你需要自动连接,可以将/usr/local/gw6c/bin/gw6c写入/etc/init.d/rc.local文件。

5、测试效果

这时如果你在终端下运行ifconfig,可以发现多了一个项目,比如我是:sit1      Link encap:IPv6-in-IPv4。

你也可以使用ping命令的ipv6版来ping Google的主页:ping6 ipv6.google.com,测试是否能通。

当然,最重要的目的,当然是上网了。

你可以访问Google的IPv6版,也可以通过sixxs.org来访问Wikipedia,无需任何代理。下面可是用普通网络不能访问的唷!而且速度更不是普通代理所能达到的。

http://ipv6.google.com

http://zh.wikipedia.org.sixxs.org

所有的IPv4网站,都可以以http://(URL).sixxs.org的形式进行访问。

下图是我用Firefox访问这两个网站的截图:

不知道朋友们还知道什么有关IPv6的应用,这样就能好好发挥我们的"IPv6"了!

参考资料: http://www.apol.com.tw/ipv6/ipv6-tb-1.html (windows及其他平台的方法也请看这里)

感谢bones7456的原始文章。



--
6G免费网络U盘: http://www.orbitfiles.com/signup/rleon

2008年7月19日星期六

CVS pserver安装的错误

CVS pserver安装好后,连接的时候,会显示错误信息:
cvs [login aborted]: reading from server: Connection reset by peer
参考 http://ximbiot.com/cvs/wiki/CVS--Concurrent%20Versions%20System%20v1.12.12.1:%20Troubleshooting 后,用telnet直接连接,有
$ telnet 210.45.121.131 2401
Trying 210.45.121.131...
Connected to 210.45.121.131.
Escape character is '^]'.
Connection closed by foreign host.
断定inetd.conf有问题,仔细check后,发现
2401  stream  tcp  nowait  cvsroot  /usr/local/bin/cvs cvs -f --allow-root=/home/cvsroot pserver
中的/usr/local/bin/cvs是从网上拷贝的,应该是 /usr/bin/cvs ,而后,一切正常

--
6G免费网络U盘: http://www.orbitfiles.com/signup/rleon

2008年7月12日星期六

网站介绍


http://summize.com/ ,可以搜索twitter上的内容,并有RSS输出,


HTML文件中的Form表单的提交

HTML文件中的Form表单,  
<form method="GET" action="cgi-bin/spam.cgi">
  Your name: <input type="text" name="name" size=30><p>
  Your email: <input type="text" name="email" size=40><p>
  <input type="submit" value="Submit">
</form>

会提交HTTP数据为:
GET /cgi-bin/spam.cgi?name=Dave+Beazley&email=beazley%40cs HTTP/1.0 
然后网页服务器 (如, Apache) 会启动一个 CGI 程序来处理它

--
6G免费网络U盘: http://www.orbitfiles.com/signup/rleon

2008年6月29日星期日

ssh 不用输入密码直接登陆

ssh的不用输入密码直接登陆

 先在本机利用ssh-keygen -t rsa或ssh-keygen -t dsa生成id_rsa.pub和id_dsa.pub文件,rsa和dsa是两种不同的加密算法,在实际应用的时,你可以自己选择.

ssh-keygen -t rsa(生成id_rsa.pub)
ssh-keygen -t dsa (生成id_dsa.pub)
生成的文件一般都会在本机的/root/.ssh/下.
我们再把所生成的文件id_dsa.pub或ids.rsa.pub拷贝到目标主机(也就是我们不需要输入密码的机器中去)并改名为:authorized_keys ,
这种我们就可以直接通过ssh到目标主机上去,不需要输入密码.
如果还有其它的机器也需要这样做.也把用ssh-keygent生成的文件拷到目标机器上去.
cat id_rsa.pub >>authorized_keys
cat id_dsa.pub >>authorized.keys


--
6G免费网络U盘: http://www.orbitfiles.com/signup/rleon

2008年6月26日星期四

Code: codecs做编码转换(Python)



---------- Forwarded message ----------
From: Rui Zhang <rui@ustc.edu.cn>
Date: Jun 26, 2008 1:19 PM
Subject: codecs做编码转换
To: r01ustc@gmail.com

python模块之codecs: 自然语言编码转换,
http://hi.baidu.com/python23/blog/item/e3cdf503f3d34d763912bbda.html
2007-06-07 11:54
python对多国语言的处理是支持的很好的,它可以处理现在任意编码的字符,这里深入的研究一下python对多种不同语言的处理。
   有一点需要清楚的是,当python要做编码转换的时候,会借助于内部的编码,转换过程是这样的:
      原有编码 -> 内部编码 -> 目的编码
    python的内部是使用unicode来处理的,但是unicode的使用需要考虑的是它的编码格式有两种,一是UCS-2,它一共有65536个码位,另一种是UCS-4,它有2147483648g个码位。对于这两种格式,python都是支持的,这个是在编译时通过--enable-unicode=ucs2或--enable-unicode=ucs4来指定的。那么我们自己默认安装的python有的什么编码怎么来确定呢?有一个办法,就是通过sys.maxunicode的值来判断:

import sys
print sys.maxunicode

    如果输出的值为65535,那么就是UCS-2,如果输出是1114111就是UCS-4编码。
我们要认识到一点:当一个字符串转换为内部编码后,它就不是str类型了!它是unicode类型:

a = "风卷残云"
print type(a)
b = a.unicode(a, "gb2312")
print type(b)

输出:
<type 'str'>
<type 'unicode'>

这个时候b可以方便的任意转换为其他编码,比如转换为utf-8:

c = b.encode("utf-8")
print c

    c输出的东西看起来是乱码,那就对了,因为是utf-8的字符串。
好了,该说说codecs模块了,它和我上面说的概念是密切相关的。codecs专门用作编码转换,当然,其实通过它的接口是可以扩展到其他关于代码方面的转换的,这个东西这里不涉及。

#-*- encoding: gb2312 -*-
import codecs, sys

print '-'*60
# 创建gb2312编码器
look = codecs.lookup("gb2312")
# 创建utf-8编码器
look2 = codecs.lookup("utf-8")

a = "我爱北京天安门"

print len(a), a
# 把a编码为内部的unicode,
# 但为什么方法名为decode呢,我的理解是把gb2312的字符串解码为unicode
b = look.decode(a)
# 返回的b[0]是数据,b[1]是长度,这个时候的类型是unicode了
print b[1], b[0], type(b[0])
# 把内部编码的unicode转换为gb2312编码的字符串,encode方法会返回一个字符串类型
b2 = look.encode(b[0])
# 发现不一样的地方了吧?转换回来之后,字符串长度由14变为了7!
# 现在的返回的长度才是真正的字数,原来的是字节数
print b2[1], b2[0], type(b2[0])
# 虽然上面返回了字数,但并不意味着用len求b2[0]的长度就是7了,仍然还是14,仅仅是codecs.encode会统计字数
print len(b2[0])

    上面的代码就是codecs的使用,是最常见的用法。另外还有一个问题就是,如果我们处理的文件里的字符编码是其他类型的呢?这个读取进行做处理也需要特殊的处理的。codecs也提供了方法.

#-*- encoding: gb2312 -*-
import codecs, sys

# 用codecs提供的open方法来指定打开的文件的语言编码,它会在读取的时候自动转换为内部unicode
bfile = codecs.open("dddd.txt", 'r', "big5")
#bfile = open("dddd.txt", 'r')

ss = bfile.read()
bfile.close()
# 输出,这个时候看到的就是转换后的结果。如果使用语言内建的open函数来打开文件,这里看到的必定是乱码
print ss, type(ss)

上面这个处理big5的,可以去找段big5编码的文件试试。
www.pythonid.com



--
6G免费网络U盘: http://www.orbitfiles.com/signup/rleon

Code: iconv做语言编码转换(c++)



用iconv做通用的语言编码转换
2007-06-01 22:38
以前我写了一个gb18030到utf-8编码转换的程序,这段代码还是有些问题的,因为现在我需要对任意的两个iconv支持的语言编码做互相转换,比如GB2312,
GBK, GB18030, UTF-8, UTF-16,
BIG5等等,所以才有了这段程序,注释我不加了。目前这段代码是非常的稳定,测试了超过10万行的数十种编码的文本的转换都没有出问题。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iconv.h>

#ifndef ICONV_CONST
# define ICONV_CONST const

2008年6月21日星期六

Python: OptionParser的使用

ython optparse package学习笔记[转贴]

  转自:http://www.javaworld.com.tw
dummycat edited on 2005-01-13 23:58

簡介:
optparse 是一個能夠讓程式設計人員輕鬆設計出簡單明瞭、易於使用、符合標準的 Unix 命令列程式的 Python 套件。開始學習 Python 之後,我常常會寫一些小程式來處理日常的工作;漸漸地,我發現無法處理參數的程式的彈性有限,於是就開始為我的程式加上解讀命令列參數的功能。在發現這個 套件之前,我總是覺得解讀命令列不難,但是要做到像標準 Unix 命令那樣完善的使用者互動和錯誤處置,可就不是一件簡單的事了!某天在 Python Library Reference 中發現這個套件,真是如獲至寶!從此不用再為解讀參數煩惱,可以更專注在解決問題上了!

如果對於 optparse 套件有興趣,想快速入門的話,可以直接看"基本使用流程"小節,然後再看後面的一些介紹與說明;當然啦!想獲得最詳細的資訊,就只有自己去看 Python Library Reference 囉~

就以下列命令來解釋一些術語,myprog 是命令的名字, $ 是命令列提示符號:

$myprog -f thefile.txt -s xyz a1 a2 a3


●argument:
使 用者在命令後面所輸入的字串。以本例來說,"-f", "thefile.txt", "-s", "xyz", "a1", "a2", "a3" 都是 argument。在 Python 中,可以使用 sys.argv[1:] 來得到命令列傳進來的 argument。為什麼是 sys.argv[1:] ,而不是 sys.argv 呢?因為命令列收到完整的參數還要加上一個命令本身的檔名,以本例來說, sys.argv 應該是:

["myprog", "-f", "thefile.txt", "-s", "xyz", "a1", "a2", "a3"]


所以如果要得到去除命令本身的檔名以後的參數列,就要靠 sys.argv[1:] 了。

●option:
一些傳遞給命令的額外 argument,以改變程式的行為。以本例來說, "-f", "-s" 就是 option。
有 幾種 option 的寫法,在 Unix 系統上的傳統寫法是 "-" 後跟著一個字母,例如 "-f", "-s";以及 "-f -s", 和 "-fs", 在 Unix 系統上都可以被接受。 GNU project 使用另一種方式,以 "--" 後面跟著一串由 "-" 分開的字串,例如 "--file-for-log"。Python 的 optparse 套件只接受以上所提的兩種 option 格式。

顧名思義, option 應該是可有可無的,即使命令中沒有任何的 option,程式也應該能夠正確地執行。如果程式需要使用者輸入某些資料才能運作,那麼也應該是使用 positional argument 才對。

●option argument:
緊 跟隨在 option 後的 argument,就是 option argument。以本例來說, "thefile.txt", "xyz" 都是 option argument。指定 option argument 有兩種寫法, "-f thefile" 和 "-fthefile", optparse 套件都接受。

option 亦可以沒有 option argument,意即 option 單獨存在。這樣的 option 通常做為旗標 (flag) 用,代表某個功能的開啟或是關閉。

●positional argument:
當一個 argument list 被解讀完後,剩下的就是 positional argument 了!以本例來說, "a1", "a2", "a3" 就是 positional argument。通常被用在"使用者必須輸入"的資訊上。

●required option:
一 個有點讓人覺得矛盾的名詞:既然是 "option" (選擇),又怎麼會是 "required" (必須)的呢? optparse 套件不對這種 option 做出任何的限制或是協助。詳情可以參閱 Python Library Reference 6.20.5 的範例程式。

基本使用流程:

》1.產生一個 optparse.OptionParser 的物件。可以在產生時將"程式的命令列說明" (usage) 做為參數,交給 OptionParser 的建構子:

from optparse import OptionParser
MSG_USAGE = "myprog[ -f <filename>][ -s <xyz>] arg1[, arg2...]"
optParser = OptionParser(MSG_USAGE)


》2.呼叫 OptionParser.add_option() 加入接受的 option:

optParser.add_option("-f",
"--file",
action = "store",
type = "string",
dest = "fileName")


參數 action 有許多種類,預設是 "store",所以即使省略也無妨,其它的 action 種類在下面會繼續說明。

若有一個以上的 option,重覆上述的方式加入(注意:以下省略了 action 參數):

optParser.add_option("-s",
"--someopt",
type = "string",
dest = "someopt")


》3. 呼叫 OptionParser.parse_args() 進行解讀。如果沒有傳入參數, OptionParser 預設會以 sys.argv[1:] 為對象進行解讀。OptionParser.parse_args() 會傳回一個 tuple,由 optparse.Values 和 一個 list 所組成。下例傳入一個假造的參數列:

fakeArgs = ['-f', 'thefile.txt', '-s', 'xyz', 'arg1', 'arg2', 'arge']

options, args = optParser.parse_args(fakeArgs)

print options.fileName
print options.someopt
print args


最後會得到的輸出結果:

thefile.txt
xyz
['arg1', 'arg2', 'arge']


這 是一個簡單的範例,說明了 OptionParser 的一般使用方式。透過這個例子,可以看到如果為程式加入 option, 並且在程式中取得 option argument 和 positional argument。OptionParser.parse_args() 還有許多用法,下面會說明一部份。

為程式加入 flag option:

許多的 Unix 命令擁有 "-v", "-q" 的 option,代表"提供詳細訊息"或是"不顯示訊息"。要做到這一點,只要在程式中加入下列的 option :

parser.add_option("-v", action="store_true", dest="verbose")
parser.add_option("-q", action="store_false", dest="verbose")
opts, args = parser.parse_args()


第 一個 add_option() 加入了一個 "-v" 的 option;如果命令列參數中出現了 "-v",則 opts.verbose 將會是 True;相反的,第二個 add_option() 加入了一個 "-q" option;如果命令列參數中出現了 "-q",則 opts.verbose 將會是 False,這兩者並不相悖,程式可以設計成:當收到 "-v" 時,顯示詳細訊息;當收到 "-q" 時,顯示概略訊息,或完全不顯示;當兩者都沒有收到,則顯示一般的訊息。

設定 option 的預設值:

上述的例 子都假設命令例會收到預期中的 option,那麼如果沒有 option 時,接收到的 option 值會是什麼呢?答案是 None!如果想為 option 提供預設值,只要在 OptionParser.parse_args()中指定參數 default 就行了:

parser.add_option("-v", action="store_true", dest="verbose", default = True)
parser.add_option("-q", action="store_false", dest="verbose")
opts, args = parser.parse_args()


上述的程式碼為程式加入了兩個 option,當 "-v" 沒有出現時, opts.verbose 預設值為 True;當 "-q" 被指定時, opts.verbose 被設定為 False,和上一個例子有點不同。再看下一個例子:

parser.add_option("-v", action="store_true", dest="verbose", default=False)
parser.add_option("-q", action="store_false", dest="verbose", default=True)


opts.verbose 的預設值會是什麼?答案是 True,最後一個指定到同一個目標的 option 預設值會被採用。

一般的 option 亦可加入預設值:

parser.add_option("-f", action="store", dest="fileName", default = "defaultConfig.txt")


為程式加入說明:

標準的 Unix 命令大多有著 "-h", "--help" 的 option,會將使用說明印出來。在 OptionParser.parse_args() 中指定 "help" 參數,並指定說明的字串,就可以為這個 option 加入說明了:

parser.add_option("-v",
action="store_true",
dest="verbose",
default=False,
help="make lots of noise [default]")


當程式收到 "-h" 或 "--help",交給 OptionParser 解讀時,會自動印出說明內容,而忽略其它的 argument:

usage: <yourscript> [options] arg1 arg2

options:
-h, --help show this help message and exit
-v, --verbose make lots of noise [default]
-q, --quiet be vewwy quiet (I'm hunting wabbits)
-fFILE, --file=FILE write output to FILE
-mMODE, --mode=MODE interaction mode: one of 'novice', 'intermediate'
[default], 'expert'


還 記得一開始提到交給 OptionParser 建構子的參數 MSG_USAGE 嗎? optparse 套件對 usage 訊息也提供了一些支援。在 usage 中使用 "%prog" 關鍵字, OptionParser 會自動將其代換為程式名,即 sys.args[0]:

usage = "usage: %prog [options] arg1 arg2"


如果程式名為 "myprog",則出現在 help 訊息中的 usage 就會是:

usage = "usage: myprog [options] arg1 arg2"


如果OptionParser 建構子沒有收到任何參數,則會自動產生一個 usage 訊息:

"usage: %prog [options]"


前提是程式沒有 positional argument。甭擔心 option 在 help 訊息中排列的方式, OptionParser 會搞定一切,如同前面程式所示。

替 option 分門別類:

如果能夠在 help 訊息中,將性質相近的 option 放在一起,與其它 option 明顯區別開來,相信使用者在閱讀時,就能夠很快地查到所要的資訊了。 optparse 套件提供了將 option 以 group 分開的機制:

group = OptionGroup(parser, "Dangerous Options",
"Caution: use these options at your own risk. "
"It is believed that some of them bite.")
group.add_option("-g", action="store_true", help="Group option.")
parser.add_option_group(group)


首 先產生一個 OptionGroup 物件,將 OptionParser 和 help 訊息當做參數交給建構子,然後呼叫 OptionGroup.add_option() 加入 option,最後再呼叫 OptionParser.add_option_group() 加入此 group。如此 help 訊息中的 option 就會按 group 顯示了!

usage: [options] arg1 arg2

options:
-h, --help show this help message and exit
-v, --verbose make lots of noise [default]
-q, --quiet be vewwy quiet (I'm hunting wabbits)
-fFILE, --file=FILE write output to FILE
-mMODE, --mode=MODE interaction mode: one of 'novice', 'intermediate'
[default], 'expert'

Dangerous Options:
Caution: use of these options is at your own risk. It is believed that
some of them bite.
-g Group option.


顯示程式版本:

無論是 GUI 或是 CUI 程式,使用者都會關心目前的程式版本資訊。 optparse 套件也提供了版本資訊的支援:

parser = OptionParser(usage="%prog [-f] [-q]", version="%prog 1.0")


在 OptionParser 建構時指定 version 參數,並將提供版本訊息(先前提到的 "%prot" 關鍵字亦可用在此處)。當使用者下達的命令中帶有參數 "---version" (只有 "-v" 不行)時,程式會顯示版本資訊:

$/usr/bin/foo --version
foo 1.0


指定讀入 option argument 的個數:

add_option() 有一個參數 nargs,用以指定該 option 會從命令列上讀入幾個 option argument。舉例來說,如果 add_option(..., narg = 3, ...):

$myprog --file w x y z


則 opts.file 將會是一個 tuple,內容為 ('w', 'z', 'y')。如果 option argument 個數不足,程式會回應錯誤訊息。

type of an option:

在 加入 option 時,參數 type 代表該 option 儲存 dest 的型態。支援的型態有 string, int, long, choice, float 和 complex。若要加入其它型態,請參考 Python Library Reference 6.20.5 小節,"Extending optparse"。
對於 string 型態的 option, option argument 會被直接將結果存入 dest。

對於 int, long, float 和 complex 型態, option argument 會被轉換成相對應的型別;如果轉換的過程失敗,例如原本預期收到一個 int,卻收到一個字串,程式會結束並列印錯誤訊息。

對 於 choice 型態, 在呼叫 OptionParser.add_option() 要指定一個由字串所組成的 tuple 或 list 給 choice 參數,接著 OptionParser.check_choice() 會比對傳入的 option argument 是否和 choice tuple 或 choice list 相同,若不相同則會丟出 OptionValueError。

action of an option:

在加入 option 時,參數 action 代表對 option argument 所要進行的動作。參數 action 有下列幾種:
<ul>
<li>store : 預設的 action,將 option argument 存到指定的 dest。</li>
<li>store_const : 將 dest 的值設為一個給定的常數。</li>

make_option("-q", "--quiet",
action="store_const", const=0, dest="verbose"),
make_option("-v", "--verbose",
action="store_const", const=1, dest="verbose"),
make_option("--noisy",
action="store_const", const=2, dest="verbose"),


當 "--noisy" 出現時, opts.verbose 的值將會被設定成 2。<br>
</li>
<li>store_true : 將 dest 的值設定為 True。<br></li>
<li>store_false : 將 dest 的值設定為 False。<br></li>
<li>append : 將 option argument 增加到 dest 中,而 dest 的型態將會是 list。使用 append action 時,命令列中可以重覆出現 option 和 option argument:

$myprog -f 1 -f 2 -f 3


則 opts.optargs 將會是 ['1', '2', '3']。如果是 store action,那麼 opts.optargs 將只會是 3,因為每指定一次 option, dest 的值就一直被更新。

若呼叫 add_option() 時參數 nargs 被設定,而 action = append 時,程式可以接受下列命令列參數:

parser.add_option(dest = "optargs",
action = "append",
nargs = 3)
...
print opts.optargs

-----------------------------

$myprog -f 1 2 3 -f 4 5 6 -f 7 8 9
[('1', '2', '3'), ('4', '5', '6'), ('7', '8', '9')]


看出其中差異了嗎? nargs 會將 option argument 包裝成 tuple,而 append 參數會將包裝好的 tuple 再"附加"到原有的 list 中。</li>
<li>count : 將 dest 的值加 1。 dest 的值會被初始會 0,該 option 每出現一次, dest 的值就增加 1。<br></li>
<li>callback : 請參考 Python Library Reference 6.20.4。<br></li>
<li>help : 列印 help 訊息。<br></li>
<li>version : 列印程式版本。<br></li>
</ul>

錯誤處置:
如果 option 預期會收到一個 int,而使用者傳入的是 string 參數時,會發生什麼事?

optParser.add_option("-n",
dest = "theNumber",
type = "int")


若使用者輸入的命令是:

$ /usr/bin/foo -n abc


程式會發出錯誤訊息,並告知使用者輸入的參數有誤,並且以非零的回傳值結束:

usage: foo[ -n <theNumber>]

foo: error: option -n: invalid integer value: 'abc'


OptionParser 的一些操作方法:

在加入 option 或解讀完參數之後,可以透過 OptionParser 的一些方法來得到一些資訊(以下的 opt_str 就是 "-f", "--file" 這些在增加 option 時所用到的參數):

<UL>
<LI>has_option(opt_str) : 檢查 OptionParser 中是否有某個 option。</LI>
<LI>get_option(opt_str) : 取得 OptionParser 中的某個 option。</LI>
<LI>remove_option(opt_str) : 刪除 OptionParser 中的某個 option。</LI>
</UL>

當 option 發生碰撞(重覆)時:

option 以下列的方式加入時:

parser.add_option("-n", "--dry-run", ...)
...
parser.add_option("-n", "--noisy", ...)


就稱為"碰撞"。當 option 碰撞時, optparse 會丟出 OptionConflictError。程式設計師應該在設計期就解決掉這個問題,也就是說,不應該使用 try - except 來捕捉這個錯誤 - 畢竟這在設計期就可以被處理掉的。

當 OptionParser 的被繼承時,一些標準的 option 就很有可能被子類別覆蓋掉。這種情況下,可以設定 OptionParse 處置碰撞的方式:

parser.set_conflict_handler("resolve")
or
parser = OptionParser(..., conflict_handler="resolve")


都 可以讓後來加入的 option 覆蓋掉原有的 option。預設的 conflict_handler 值為 "error",也就是直接丟出 OptionConflictError。所謂覆蓋,也不是直接移除掉原有的 option,而是避開後來加入的 option:

parser = OptionParser(conflict_handler="resolve")

parser.add_option("-n", "--dry-run", ..., help="original dry-run option")
...
parser.add_option("-n", "--noisy", ..., help="be noisy")


在 help 訊息中,就會看到:

options:
--dry-run original dry-run option
...
-n, --noisy be noisy


第一個 option 的 "-n" 被刪去了。如果這時又加入一個 option,使用了 "--dry-run"做為名稱呢?那麼第一個 option 就會直接被移除,因為它已經完全被覆蓋掉了,程式將不認得它, help 訊息中也不會有它的蹤跡。

在這裡我省略了 Callback option 和 Extending optparse 兩個小節,如果有興趣,可以親閱 Python Library Reference;對於這篇文章若有疑問的,也可以先找找 Reference,也許我漏掉了也說不定。

程 式寫得愈多,愈覺得自己的渺小。這些設計精良的套件,若不是當初由許多無私的前輩們開發出來,我們又怎麼夠享受到它的便利性?以上是我參考 Python Library Reference, 6.19 optparse 介紹的內容,所寫的心得筆記。希望對這裡的 Python 同好有幫助,如果有錯誤也請多指正!


void optparse::OptionParser::add_option ( std::string  shrt_flag,


std::string  lng_flag,


std::string  destination,


std::string  help = "",


action_t  act = STORE,


type_t  type = STRING,


std::string  dfault = "",


std::string  allowed_values = "" 

)


Add an option to the parser.

Parameters:

shrt_flag Short option name, like e.g. "-q".

lng_flag Long option name, like e.g. "--quiet"

destination Key under which the option argument is stored in the dictionary.

help Help string for generating the usage info.

act Action, one of STORE, STORE_TRUE, STORE_FALSE.

type Type info of the expected option argument. One of INT, DOUBLE, STRING, BOOL.

dfault Default value. Value stored in the dictionary if the option is not given.

allowed_values List of possible option values. A string of comma-separated allowed values. An empty string means that any value is allowed.

 
 
 
 

--
海阔天空,做什么就记什么。主要是 Ubuntu Linux 和 Latex 及编程相关的东东: http://hai-kuo.blogspot.com/ 



上房老大买二手房,看实景照片,挑专业经纪人

2008年6月8日星期日

[Code]: some Python code

get system platform
>>> os.name
'posix'
>>> sys.platform
'linux2'
>>>

get HOME path

>>> os.environ['HOME']
'/home/rui'
>>> os.system('echo $HOME')
/home/rui
0
>>>

get command line

>>> sys.argv
['']
>>>

--
海阔天空,做什么就记什么。主要是 Ubuntu Linux 和 Latex 及编程相关的东东: http://hai-kuo.blogspot.com/ 



上房老大买二手房,看实景照片,挑专业经纪人

2008年6月5日星期四

[Code]: Python中发邮件时,使用中文subject

 
msg=mail.Message.Message()    #一个实例
msg['to']='love@python.com'      #发送到哪里
msg['from']='my@email.com'       #自己的邮件地址
msg['date']=time.ctime()      
       #时间日期
msg['subject']=email.Header
.Header('邮件主题','gb2312')
#这里用Header方法处理subject.
完成后的样子.
>>> print msg.as_string()
to: love@python.com
from: my@email.com
date: Mon Jul 11 20:18:13 2005
subject: =?gb2312?b?08q8
/tb3zOI=?= 
 
 

--
海阔天空,做什么就记什么。主要是 Ubuntu Linux 和 Latex 及编程相关的东东: http://hai-kuo.blogspot.com/ 



上房老大买二手房,看实景照片,挑专业经纪人

[Code]: Python code to statistic file size

>>> import os
>>> print os.getcwd()
/home/rui/projects/simplemaile
r
>>> print os.listdir('.')
['example', 'mimemail.py', 'weblogger.tar', '.git']
>>> os.stat('mimemail.py')
(33188, 341L, 2054L, 1, 1000, 1000, 4874L, 1211887832, 1210834210,
1210834210)
>>> os.stat('mimemail.py').st_size
4874L


 
 
 

--
海阔天空,做什么就记什么。主要是 Ubuntu Linux 和 Latex 及编程相关的东东: http://hai-kuo.blogspot.com/ 



上房老大买二手房,看实景照片,挑专业经纪人

2008年6月1日星期日

Source code for Programmer's Notepad

Programmer's Notepad, sourcecode:  http://code.google.com/p/pnotepad/
 
 
 

--
海阔天空,做什么就记什么。主要是 Ubuntu Linux 和 Latex 及编程相关的东东: http://hai-kuo.blogspot.com/ 



中 国 最 强 网 游 --- 网 易 梦 幻 西 游 ,166 万 玩 家 同 时 在 线

2008年5月30日星期五

可以美化高亮你的代码的网站

可以美化高亮你的代码的网站,

http://www.fayaa.com/code/ : 发芽网,注册后还可以在线存贮,收藏代码,语言较全,多种theme选择
http://pylonshq.com/pasties/new : python, html, css, java, xml等
http://pastie.caboo.se/pastes/new : python, java, html, ruby, c/c++, css, sql等常用语言,并且可以有多个theme可选
http://dumpz.org/ : Python, ruby, c, html, java等很多,可以注册帐号,然后就可以保存你的代码
http://dpaste.com/ : python, ruby等,支持语言不多

 
 
 

--
海阔天空,做什么就记什么。主要是 Ubuntu Linux 和 Latex 及编程相关的东东: http://hai-kuo.blogspot.com/ 



眼睛干涩?润洁一下!清凉配方,多重营养,缓解眼疲劳

2008年5月28日星期三

通达信全新公式1755个[无密码]

 

通达信全新公式1755个[无密码]


自 己比较喜欢用这个软件抄股,自己用过同花顺、大智慧、证券之星等软件就这个好用,主要是它的自定义界面方便实用,还可以定义模板,看到了好多的人将公式加 了密码,想学习也看不到,经过几天的收信和研究将所有的公式密码破解了,通达信全新公式1755个,包括创幻所有系列,有益母操盘手系列、愚公系列、青松 红牛等等太多了,现在你只需要导入就可以了,方便大学习公式。解压后,在通达信软件中按CTRL+F导入就可以了。
 
 
 

--
海阔天空,做什么就记什么。主要是 Ubuntu Linux 和 Latex 及编程相关的东东: http://hai-kuo.blogspot.com/ 



眼睛干涩?润洁一下!清凉配方,多重营养,缓解眼疲劳

2008年5月27日星期二

一个git用的exclude文件

git可以在文件.git/info/exlude中设置规则来忽略一些文件,如
 
# git-ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
*.[oa]
*~
# .svn/目录是subversion用的
.svn/
*.dat
*.mod
*.exe
*/old/

 
 

--
海阔天空,做什么就记什么。主要是 Ubuntu Linux 和 Latex 及编程相关的东东: http://hai-kuo.blogspot.com/ 



尽享江北城市荣光,开启滨江世界岸区,东海岸赠空间近50%

常用OpenID的提供

AOL
openid.aol.com/screenname
Blogger
blogname.blogspot.com
Flickr
www.flickr.com/photos/username
LiveDoor
profile.livedoor.com/username
LiveJournal
username.livejournal.com
Orange (France Telecom)
http://openid.orange.fr/
SmugMug
username.smugmug.com
Technorati
technorati.com/people/technorati/username
Vox
member.vox.com
Yahoo
http://openid.yahoo.com
WordPress.com
username.wordpress.com
 
 
 

--
海阔天空,做什么就记什么。主要是 Ubuntu Linux 和 Latex 及编程相关的东东: http://hai-kuo.blogspot.com/ 



尽享江北城市荣光,开启滨江世界岸区,东海岸赠空间近50%

[网摘]: 文本查找/替换工具regexsr发布

 

文本查找/替换工具regexsr发布

正则表达式文本查找/替换工具 REGular EXpression Search and Replace tool
(注:这是一个命令行工具,替换功能目前无效,以后版本添加)

2007 Feb08更新: 修正了一个文件句柄泄露的小bug
2008 Feb21更新: 现在可以输出重定向了:)

下载地址http://www.2maomao.com/blog/wp-content/uploads/regexsr.zip

这个工具跟windows的FindStr、linux下面的grep干同样的事情:在众多文本中查找包含指定内容的文件

不过,前文说到,FindStr和grep(UnixUtil包)在搜索中文的时候都会有"抢床"问题,而且在搜索windows下的Unicode或者BigEndian Unicode的时候无效,所以自己动手写了一个检索、替换工具:regexsr.exe

本软件的优点
1. 解决了FindStr和grep(UnixUtil包)在搜索中文的时候都会有的"抢床"问题
2. 常见的Unicode文件和ANSI文件都可搜索
3. 可以指定搜索路径、文件过滤、大小写等选项
4. 使用彩色命令行输出结果,一目了然

运行方法如下:
regexsp [-i|n|r|y] -[s|S]:search_str -[r|R]:replace_str] [-d:folder] -[t|T]:file_pattern]

一些简单选项(需要详细文档请在下载后阅读Readme.txt):
-i : 不区分大小写
-n : 在搜索结果中显示结果所在行号
-r : 搜索子文件夹

一些例子
regexsr "-s:foo bar" //在当前目录下搜索所有含有"foo bar"的文件
regexsr "-s:foo bar" -r -T:*.h //在当前目录下(包括子目录)所有.h文件中搜索所有含有"foo bar"的文件

为了便于在当前文件夹下进行的常见的查询操作,下载包里面还有几个小的批处理文件:
rs.bat xxx   //查找xxx,比如 rs foobar,区分大小写
rsi.bat xxx   //查找xxx,不区分大小写
rsr.bat xxx   //查找xxx,区分大小写,包含子文件夹
rsri.bat xxx   //查找xxx,不区分大小写,包含子文件夹
rsri.bat xxx *.h //查找xxx,不区分大小写,包含子文件夹,文件名包含.h


运行效果

文本搜索工具regexsr

实现细节
VS2005 + greta + WinXP

 
 
 

--
海阔天空,做什么就记什么。主要是 Ubuntu Linux 和 Latex 及编程相关的东东: http://hai-kuo.blogspot.com/ 



尽享江北城市荣光,开启滨江世界岸区,东海岸赠空间近50%

[网摘]: 随时随地进入命令行

随时随地进入命令行


Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\cmd]
[HKEY_CLASSES_ROOT\Directory\shell\cmd\command]
@="cmd /k cd %1"

[HKEY_CLASSES_ROOT\*\shell\cmd]
[HKEY_CLASSES_ROOT\*\shell\cmd\command]
@="cmd /k"
 
 
 把上面存为文件cmd.reg

安装方法:点击上面的cmd.reg链接,保存到本地后打开或者直接打开,会提示你是否导入到注册表,选择"是",然后就ok了。

使用方法:将注册表文件导入以后,随便找个文件或者文件夹右击一下,就可以看到一个"cmd"菜单条目,点击即可进入命令行,而且进入命令行以后自动转入当前目录(即被点击的文件所在目录):


--
海阔天空,做什么就记什么。主要是 Ubuntu Linux 和 Latex 及编程相关的东东: http://hai-kuo.blogspot.com/ 



尽享江北城市荣光,开启滨江世界岸区,东海岸赠空间近50%

[网摘]: 如何在配置Windows下的GTK+开发环境

 

如何在配置Windows下的GTK+开发环境

能找到这儿的,应该对GTK+有所了解,不了解的看这里

如果英文还可以的,到GTK的老巢看看说明就行了。

好,和我差不多的看官,下面开始介绍,以2.1x为例,其他的版本请自行到GTK的老巢翻找

总共需要:gtk以及其支持库,unixutils(make程序),gcc for windows(MinGW),后面两个不介绍了,自己找资料,下载后记得加入系统的PATH变量里

0. 打开gtk的下载页面:http://www.gtk.org/download/

1. hoho,有3个ftp链接,分别是:GTK+ SourceGLib SourcePango Source

2. 首先用ftp工具(没有的话下载一个filezilla看看)匿名登录GTK+ Source所在的那个ftp地址:ftp://ftp.gtk.org/pub/gtk/v2.10/ (限制连接数,请勿用ie打开)

3. 因为是windows系统,windows现在的主流还是win32,进入win32目录

4. 对,你看到了一堆的东西,包括cario / cairo-dev / gtk+ / gtk+-dev,各找个最新的下载下来

5. 然后,进入dependencies目录,霍霍,这里更多

6. 别客气,里面的atk / atk-dev / gettext / gettext-dev / libiconv / libjpeg / libpng / libtiff / libxml2 / pkg-config / zlib123-dll,捡最新的都下载下来吧

7. 好了,现在重复2-6,下载Pango和GLib所在的ftp目录下的win32及win32\depenencies目录下的东东,记住三个关键字:win32, dependencies, 还有"最新"的, "-dev" 也不放过

8. 好了好了,真的好了,把这些下载的文件全部解压到一个目录下,比如d:\system\gtkplus目录

9. 还差一点点就可以开始了,别忘了我们最终编写的程序还要有运行时支持,就像MFC也有mfcxxx.dll一样,gtk+需要GTK+运行库的支持,懒一点儿的下载这个(如果还有效的话),想稳定的到这里去找找下载吧:http://sourceforge.net/projects/gimp-win/,嫌太慢的话就搜搜google

10. 好,下载并安装完gtk+runtime(我用的是gtk+-2.10.13-setup.exe)以后,开始编写Hello world

————————编写Hello World健体强国,Oh Yeah! 分割线————————

1. 首先写个hello.c,里面的内容是

下载: hello.c
#include <gtk/gtk.h>
static gboolean delete_event( GtkWidget *widget, GdkEvent *event, gpointer data )
{
  
g_print ("delete event occurred\n");
  
return FALSE;
}
static void destroy( GtkWidget *widget, gpointer data )
{
  
gtk_main_quit ();
}
int main( int argc, char *argv[] )
{
  
GtkWidget *window;
  
GtkWidget *label;
  
gtk_init (&argc, &argv);
  
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  
g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL);
  
g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy), NULL);
  
label = gtk_label_new ("Hello GTK");
  
gtk_container_add (GTK_CONTAINER (window), label);
  
gtk_container_set_border_width (GTK_CONTAINER (window), 10);
  
gtk_widget_show (label);
  
gtk_widget_show (window);
  
gtk_main ();
  
return 0;
}

(为了缩短篇幅删去了所有注释和空行,完整版本参见后面参考资料里面的内容)

2. 好的,为了简单起见,不依赖任何开发环境,咱来写个makefile

gtk_include=-IE:/system/gtkplus/include -IE:/system/gtkplus/lib/gtk-2.0/include -IE:/system/gtkplus/include/gtk-2.0 -IE:/system/gtkplus/include/atk-1.0 -IE:/system/gtkplus/include/pango-1.0 -IE:/system/gtkplus/include/glib-2.0 -IE:/system/gtkplus/include/cairo -IE:/system/gtkplus/lib/glib-2.0/include

gtk_lib=-LE:/system/gtkplus/lib -lcairo -lintl -lgettextpo -lglib-2.0 -lgmodule-2.0 -lgobject-2.0 -lgthread-2.0 -lgdk_pixbuf-2.0 -lgdk-win32-2.0 -lgtk-win32-2.0 -lcharset -liconv -lpango-1.0 -lpangoft2-1.0 -lpangowin32-1.0 -lpangocairo-1.0 -lzdll -latk-1.0

#target_dir=Debug

main: hello.c
gcc -mms-bitfields -Wall -g hello.c -o hello \
${gtk_include} ${gtk_lib}

all:
${MAKE} main

注意事项:
a). 这里我的目录是e:\system\gtkplus,你解压的目录可能不一样
b). "gtk_lib=" 后面的"L"后跟的是gtk lib根目录,然后后面的小写的'l'对应该根目录下面所有的.lib文件,一一排好队,中间空格隔开
c). "gtk_include=" 后面的是所有包含.h文件的文件夹,前面加个"-I",也来排好队,中间空格隔开
d). 注意makefile要用tab不要用空格
很繁琐吧,试试这个:windows下编译gtk文件的简单方法

3. 好啦,都有了,把hello.c和makefile放在同一个目录下,打开一个命令行进入该目录,敲入"make",回车(没有make程序?到前头翻翻是否下载了unixutils和gcc for windows)

结果出来了,运行了hello.exe会看到这个界面:
Hello GTK

恭喜,你成功了?什么?还没搞定,rp太差了吧~~~~ :D

参考资料:
1、GTK+ 开发简介
2、在Windows 下以GTK+ 撰写视窗程式安装GTK+

 
 
 

--
海阔天空,做什么就记什么。主要是 Ubuntu Linux 和 Latex 及编程相关的东东: http://hai-kuo.blogspot.com/ 



尽享江北城市荣光,开启滨江世界岸区,东海岸赠空间近50%

2008年5月25日星期日

校内网用绿丝带 qq用黄丝带,还有的车上用红丝带,我都晕了 到底分别表示什么意思啊?

 

这个非常时期,校内网用绿丝带 qq用黄丝带,还有的车上用红丝带,我都晕了 到底分别表示什么意思啊??有没有人知道?

绿丝带代表帮助,戴上绿色带代表你会帮助别人。

红丝带代表爱心,戴上红丝带代表你为灾区的人们奉献了自己的爱心。 如:志愿者人群。

黄丝带代表祈福,戴上黄丝带代表你对灾区的人们祈福

 

来源:百度知道

 
 
 

--
海阔天空,做什么就记什么。主要是 Ubuntu Linux 和 Latex 及编程相关的东东: http://hai-kuo.blogspot.com/ 



花园洋房48万起

Google Doc的一个功能

Google Docs中,你可以自己定义一张网页表单,然后通过它填写的数据会自动保存到你的一表格文件中。地址是: Create Your Own Form

 http://spreadsheets.google.com/newform
 
 

--
海阔天空,做什么就记什么。主要是 Ubuntu Linux 和 Latex 及编程相关的东东: http://hai-kuo.blogspot.com/ 



花园洋房48万起

2008年5月23日星期五

Account: weave

 r01ustc@gmail.com : [No1] ([zhang3])
 
 weave是mozilla提供的一个在线保存书签的东东,附件是相应的扩展
 

--
海阔天空,做什么就记什么。主要是 Ubuntu Linux 和 Latex 及编程相关的东东: http://hai-kuo.blogspot.com/ 



瑞雪春堂 即将开启

Account: linkwad

 http://www.linkwad.com/ : rleon :: [No1] (r01ustc@gmail.com)
 
 linkwad是个网上收藏组工具,它通过FireFox的扩展,把当前你打开的所有窗口,保存为一个标签组
 

--
海阔天空,做什么就记什么。主要是 Ubuntu Linux 和 Latex 及编程相关的东东: http://hai-kuo.blogspot.com/ 



瑞雪春堂 即将开启

2008年5月16日星期五

Account: 360doc

http://www.360doc.com/ : r01ustc@gmail.com :: [No1]
 
 360doc是个网摘收藏网站,类似与google note
 

--
海阔天空,做什么就记什么。主要是 Ubuntu Linux 和 Latex 及编程相关的东东: http://hai-kuo.blogspot.com/ 



眼睛干涩?润洁一下!清凉配方,多重营养,缓解眼疲劳

2008年4月24日星期四

网摘: 数学模型


建立一个简单的数学模型:http://hi.baidu.com/ic_layout/blog/item/a190870af01f351a95ca6b9f.html

一个社会中有三个人abc,共有300单位的资源。

a的暴力最强大,获得了统治地位。由于某种原因,它承诺这300单位的资源是公产,而且在它的治下,abc都平等。

有一天,政治路线发生了变化,要发展私有制,因此需要分配公产。

a迟迟不肯分配,因为按照它作出的那个平权承诺,它能公开提出的分配方案只能是每人100,实际上它却想暗地全部贪污。

但是a害怕这样bc会造反。因此他决定分肥,让bc也参与到贪污过程中来,以确保自己能安全得到最大的份额。当然,分肥的比例由他决定。

如果bc联合起来造反的话,有0.3的胜算;如果c单独造反的话,有0.1的胜算。

bc联合造反b可能的收益是300/2*0.3=45单位
因此,a决定给b分50单位,这样b不会造反。

c在b不造反情况下自己造反可能的收益就是300*0.1=30单位

因此,a决定给c35单位,这样c也不会造反。

最后a得到了剩余的215单位。

这个统治结构就很稳定。

bc知道自己即使参加分肥跟平等分配相比还是吃亏么?知道。
bc会不参加分肥么?不会,否则自己一个子儿都得不到。
bc心里反对这种公有+分肥的体制么?反对。
它们会行动起来反对么?不会。
bc会对这种分肥羞耻么?理智上说,会的,毕竟是在贪污公产。但在现实中分肥是常态,自己也参与了,屡屡折磨这个道德标准,最后不得已放弃操守,也不说贪污是可耻的了。
bc最倒霉了,道德上又堕落,利益上还吃亏。
当然,我们还可以设想一个人d,它毫无力量,a甚至一点也不给它分肥的机会(虽然名义上d也是这个社会的公民,也享有平等的权利)。跟d比起来,bc还不算最倒霉的。但是,bc因此对d又在道义上生出一种歉疚感。因此bc残存的良心又受到折磨。

a是什么角色?闷声发大财。
a心里乐意bc参与分肥么?不乐意,如果没有bc,我就全得了,多美。可是,该死的bc偏偏都存在,逼急了还有力量造反。
a反对贪污么?它怎么会反对!但是,如果bc能不参与贪污,它更高兴。如果能通过思想教育,教导bc安贫乐道,那就最好了。

这样,有一个问题,a和bc都参与了分肥,它们的角色和态度相同么?显然不同。bc虽然参与分肥,但实际上它们并不是既得利益者,是反对这种制度的,但是力不从心,所以不会行动反对。a则绝对是维护这种制度的。即使都参加了分肥,五十步和百步也不能视作一丘之貉。

这个格局在什么情况下可以被打破?a失去统治权力,这一套公有+分肥的规则被三方共和后的平均分配取代。a当然极力防止出现这种局面,除了不断巩固自己的实力,还经常打压bc可能形成的实力。

a统治的成功在什么地方?它一手制造的这种利益格局,让bc既吃了亏,还成了不道德的同谋,陷入了道德困境。

附注:对于a b c是谁,大家可以根据自己对社会的理解对号入座
 
 
 

--
海阔天空,做什么就记什么。主要是 Ubuntu Linux 和 Latex 及编程相关的东东: http://hai-kuo.blogspot.com/ 


--
6G免费网络U盘: http://www.orbitfiles.com/signup/rleon

软件设置: urxvt和xterm启动慢


 Ubuntu7.10, fcitx,UTF-8下,urxvt和xterm启动慢,而mlterm则没问题,google后,改动后 ~/.Xresource如下:

XTerm*preeditType: Root
URxvt*imFont: -misc-simsun-medium-r-normal-0-0-0-0-p-0-iso10646-1



--
海阔天空,做什么就记什么。主要是 Ubuntu Linux 和 Latex 及编程相关的东东: http://hai-kuo.blogspot.com/ 

--
6G免费网络U盘: http://www.orbitfiles.com/signup/rleon

2008年4月16日星期三

应用: git常用命令速查

参考: http://git.or.cz/gitwiki/GitCheatSheet

--
6G免费网络U盘: http://www.orbitfiles.com/signup/rleon

应用: 用Grub引导光盘


Howto: Boot CD/DVD Using Grub

To avoid using the bios option to set boot from CD/DVD, or to help get incalcitrant bootable CDs or DVDs to boot, you can add Smart Boot Manager/MemDisk to your boot options in Grub and boot from Grub instead of using your bios.

You need a working grub loader installed.

First off, download these files attached:
sbm.tar
and untar

then copy them to your boot directory:
Code:
 sudo cp memdisk sbm.bin /boot
then open up menu.lst in your editor (I have used nano here)
Code:
 sudo nano /boot/grub/menu.lst
and add this to the bootable options (not in the magic section)
Code:
title=SBM-Boot a CD
kernel /boot/memdisk
initrd /boot/sbm.bin
Next time you reboot into grub, you will see a new entry "SBM-Boot a CD"

With your CD/DVD in the drive, select this option, and you will get the Smart Boot Manager menu.
Scroll down to the CD-Rom option, press "Return", and then "Return" again out of the confirmation dialogs.

Your CD/DVD should now boot.

Tested on Ubuntu Edgy 6.10
Thanks to the Gentoo Wiki for guidance
Just retrace your steps to remove this option.

Enjoy
 
 
 

--
海阔天空,做什么就记什么。主要是 Ubuntu Linux 和 Latex 及编程相关的东东: http://hai-kuo.blogspot.com/ 



蒙牛以领先责任创4年至高荣誉 权威数据为蒙牛加冕



--
6G免费网络U盘: http://www.orbitfiles.com/signup/rleon

应用: 用 git 维护 vim 代码



---------- Forwarded message ----------
From: <rleon@163.com>
Date: 2008/4/16
Subject: 应用: 用 git 维护 vim 代码
To: "my-secret-blog@googlegroups.com" <my-secret-blog@googlegroups.com>, r01ustc <r01ustc@gmail.com>


 
 

用 git 维护 vim 代码

Source: http://www.cnblogs.com/huqingyu/archive/2008/02/09...

Displaying mentions in this article, for full text please visit source.


众所周知的是,vim 的代码是 Bram 用 patch 的方式维护的,一种典型的集约式管理,虽然 edyfox 在 https://vim.svn.sourceforge.net/svnroot/vim 维护了 svn 版本,但这也只是导入 CVS 的内容而已,别人无法往里面加入代码,问题是,当你想开发一系列试验性功能时,没法直接在 vim 的 svn 仓库上工作 (比如创建分支),而只能用自己的版本管理仓库。

这便造成了一个显然的维护问题,以我自己为例,vim-cocoa 的代码原本使用 code.google.com 提供的 svn 服务进行维护,但 Subversion 是以目录为单位跟踪修改的,所以,同一个代码目录,要么来自 vim 的代码仓库,要么来自 google code 的代码仓库,二者不可兼得。

所以我原来使用了一套非常麻烦的维护方式:

$ svn co https://vim.svn.sourceforge.net/svnroot/vim/vim7
$ cp -r vim7/ vim-cocoa/
$ cd vim-cocoa; find . -name ".svn/*" -exec rm -rf {};
$ svn import src/gui_mac.m https://vim-cocoa.googlecode.com/gui_mac.m
...

也就是说,抓下一份 vim 的代码来,复制一份,去掉其 svn 的数据,然后将我修改过的部分导入 google code 的版本仓库。在我完成一部分修改,代码达到稳定之后,再返回 vim7 目录,更新原来用 svn 下载的代码,然后将我在 vim-cocoa/ 下做出的修改 back port 回最新的 vim7 代码里,生成针对最新版本的 patch,并编译,发布。

显然这里要花大量的时间在没有必要的手工操作上,而且很容易出错。这便是 git 该出现的时候了。再简单复述一下我的需求:

能够通过 svn 经常更新到最新的 vim 代码自己正在工作的 vim-cocoa 分支代码不受影响能把主干代码和分枝代码按需合并vim 的 svn 库里有些自动生成的文件,应该删除,因为 Bram 不愿意,所以我应该可以在自己的分支里删除,这样可以避免每次 commit 之前需要恢复这些自动生成的文件

下面是用 git 完成的步骤,主要就是利用了 git-svn 这套方便的工具:

$ mkdir vim; cd vim
$ git-svn init https://vim.svn.sourceforge.net/svnroot/vim/vim7
$ git-svn fetch -r 625 # 这里为了减少消耗,不复制整个 svn 版本仓库,只抓最新的 revision

这时 git-svn 会产生一个叫做 git-svn 的 remote branch,并让本地的 master 指向这个 branch。所以,我们可以从 master 分支出一个自己的版本来:

$ git checkout -b cocoa
# 下面是把所有原来 vim-cocoa 做的修改在这个最新版的 vim 代码中打上
$ git commit -m "import vim-cocoa changes into git repo"

此后,如果上游的 vim svn 库更新了,我们可以用 git fetch git-svn 把更新下载下来,然后,用 git merge git-svn 将这些更新 merge 到当前的 branch 里,当然,也可以用 git pull git-svn 把两步合在一起完成,只要你确定 merge 不会出现冲突。

那么,现在就有很好的一个的平台来做本地修改了,但 vim 的一个问题是,src/auto/ 中自动生成的文件也被放在 svn repo 里,这是一个很麻烦的问题,因为 vim 也不支持 off-directory build,所以在我们测试、调试过后,如果要生成 patch,就不得不先把这些 (configure/make 过程中) 必然会生成的文件先恢复到初始状态,无谓的增加了操作,如果在 git 里 commit,也会提示你这些文件更新了,但你显然不愿意把这些改动都算进你的 commit 里,那怎么让这些文件不烦人呢?

简单,我们不管上游的 vim svn 库怎么维护,可以在本地 git 仓库中把这些文件删除,也就是不跟踪的改动了:

# --cached 表示只删除 git 缓存,不删除实际文件
$ git rm --cached src/auto/config.h
$ git rm --cached src/auto/config.mk
$ git rm --cached src/auto/configure
...
$ git commit -m "stop tracking auto generated files"

因为就算这些文件不在跟踪中,一旦它们修改过了,git status 还是会提示你它们更新了,而且这样用 git commit -a 把所有修改过的文件加入下一次 commit 也不方便,怎么办呢?用 .gitignore 文件:

$ vi .gitignore

加入以下内容:

.*.swp
.DS_Store
src/TAGS
src/tags
src/Vim
src/auto/*
src/auto/configure
src/auto/config.h
src/auto/config.mk
src/auto/if_perl.c
src/auto/link.log
src/auto/link.sed
src/auto/osdef.h
src/auto/pathdef.c
src/config.log
src/config.status
src/objects
src/xxd/*
src/Vim.app/*

这样不管这些文件怎么变,git 都不会提示了。

现在我们需要一个用来作为参考的分支,以定期生成 patch,这个分支必须随着上游 svn 的更新而更新,但我们这里删除这些自动生成文件的记录又不应该包含在内,怎么办呢?可以用 git-svn 自动生成的 master branch 来做这件事情:

$ git checkout master
$ git rm --cached src/auto/config.h
...
$ git commit -m "blahblahblah"

这样,以后每次要生成一个独立的 vim-cocoa 分支相对 vim 主干的 patch 时,我都可以先在 master 分支上:

$ git-svn rebase
$ git pull git-svn

然后切换回 cocoa 分支:

$ git checkout cocoa
$ git diff master > vim-cocoa.patch

这样便完整了 patch 的生成。

最后,如果我们需要把现在这个 vim-cocoa 像原来 google code 的代码仓库一样,随时公布到网上该怎么办呢?http://repo.or.cz 提供了公开的代码仓库,申请以后可以获得一个 push 地址:

git+ssh://repo.or.cz/srv/git/vim-cocoa.git

push 需要添加一个用户,然后上传它的 ssh 公钥 (在本地用 ssh-keygen 生成)。然后,如果我要把本地的 cocoa 分支发布到网上,就可以执行:

$ git push git+ssh://repo.or.cz/srv/git/vim-cocoa.git cocoa:master

其中 cocoa 指的是来源 (本地) 分支,master 指的是目的 (远程) 分支,为什么要 push 到另一个名字的分支去呢?因为 master 是 git 默认 clone 下来的分支,为了方便其他用户的抓取,以及 gitweb 的信息显示,还是保持公开仓库里的 master 分支是你最常更新的那个分支为好。

This entry was written by jjgod and posted on November 3, 2007 at 1:00 am and filed under Mac, Programming, Tools. Bookmark the permalink. Follow any comments here with the RSS feed for this post. Post a comment or leave a trackback: Trackback URL.
 
 

--
海阔天空,做什么就记什么。主要是 Ubuntu Linux 和 Latex 及编程相关的东东: http://hai-kuo.blogspot.com/ 



蒙牛以领先责任创4年至高荣誉 权威数据为蒙牛加冕



--
6G免费网络U盘: http://www.orbitfiles.com/signup/rleon

2008年4月4日星期五

搞笑: 清明节


 "如果你死后,墓志铭打算写点啥?"以下是一些回复:
1.一居室,求合租,面议。
2.小事招魂,大事挖坟。
3.我觉得我还可以抢救一下!
4.提供鞭尸服务,一次100!
5.基因重组中,请稍候二十年
6.单挑冥王 迪斯中,征求组队!
7.当你看清这行字的时候:朋友,你踩到我了。
8.老子终于不用怕鬼了!
9.给爷笑一个,要不爷给你笑一个?
10.陪聊,提供夜间上门服务。
11.还看,你丫也会有这一天的
12.我從前是個胖子,現在和所有躺著的人一樣有骨感。
13.强力推荐这个给我挖坑的,电话:xxxxxxxxx
14.曾经很黄很暴力,现在很黑很安静
15.谢谢来访,改日登门回拜.呵呵
16.来客请便,无人倒茶,站累躺下一起聊聊?
17。终于解决住房问题了
18.广告位招租
19.牧师,帮我复活一下下,谢谢,坐标××.××。
20.神农氏的墓志铭:我靠!这草有毒!
21.某丧心病狂的Firefox推介:"赶紧快下载带有Google工具栏的Firefox,看女鬼洗澡不会中毒!!!"
22.墓主人不在服务区,请稍候再来;
您所挖掘的墓地以被挖过,请换挖别家;
你想打开的目的现在不方便开启,请稍候再开;
23.此地,钱多,站少,速来!
24.老子是被活埋的!曰!
 
 
 

--
海阔天空,做什么就记什么。主要是 Ubuntu Linux 和 Latex 及编程相关的东东: http://hai-kuo.blogspot.com/ 


--
6G免费网络U盘: http://www.orbitfiles.com/signup/rleon

2008年3月30日星期日

ICON資料



 
 

Sent to you by Leon via Google Reader:

 
 

via 学海无涯 回头是岸 by ncforest on 3/30/08

ICON資料  
根據VC5聯機幫助中有關圖標的資料翻譯而成
 
● 圖標
圖標是一張圖片,它是由一張位圖和一個掩碼圖像產生的透明圖像區域。以下內容描述了怎樣創建、顯示、銷毀和復制圖標。  
 
● 關于圖標(About Icons)
在Windows系統中圖標隨處可見,它一般用來描述一個對象,比如文件、文件夾、快捷方式、應用程序、以及各種文檔。在Win32 API中的圖標函數可以允許應用程序來創建、讀取、排列和銷毀圖標。  
有關用特定圖標來代表某一種文件類型的資料,請參見Icon Handlers一節。  
 
● 圖標的熱點(Icon Hot Spot)
圖標中的某一個像素被指定為熱點,操作系統將根據這個點來跟蹤和定位圖標。一般情況下,圖標的熱點都是定位在圖標的中心點上。如果你用CreateIconIndirect()函數來創建一個圖標,那么你可以指定圖標的任何一點作為它的熱點。(譯者注:其實圖標并不使用熱點,這可能是微軟的文檔沒有寫清楚。使用熱點的是光標。)  

● 圖標的類型(Icon Types)
操作系統提供了一組標准圖標供應用程序隨時使用,在Windows頭文件(windows.h)中有這些圖標的資源ID值(以IDI_為前綴的定義)。每一個標准圖標都有一個缺省的圖像與之對應,用戶可以隨時用標准光標(?)來替換這些缺省圖像。定制圖標(Custom icons)可以用于特殊程序或隨便什么目的(譯者注:微軟很有意思,我們不可能只用標准圖標而不用自己的圖標:-),下面是几個定制圖標:  
 
● 圖標的尺寸(Icon Sizes)
Windows使用四種圖標尺寸:系統小型、系統大型、殼小型、殼大型。
系統小型圖標用于顯示在窗口的標題條中。如果你想改變這種圖標的尺寸,可啟動顯示控制面板程序,單擊"外觀"卡片,從"項"(Item)列表中選擇"標題按鈕"(Caption Buttons),然后修改"尺寸"值。如果你想在應用程序中獲取系統小型圖標的尺寸,可調用GetSystemMetrics()函數(使用SM_CXSMICON和SM_CYSMICON作為參數)。  
系統大型圖標主要是被應用程序自身使用(比如在"關于"對話框中),但它也顯示在Alt+Tab對話框中。CreateIconFromResource()、DrawIcon()、ExtractIcon()、和LoadIcon()函數都是使用系統大型圖標。因為系統大型圖標的尺寸是被視頻設備定義的,所以不能修改。如果你想獲取這種圖標的尺寸,可調用GetSystemMetrics()函數(使用SM_CXICON和SM_CYICON作為參數)。CreateIcon()、CreateIconFromResourceEx()和CreateIconIndirect()這三個函數可以創建與系統大型圖標尺寸不同的圖標。  
殼小型圖標是被用于Windows Exploer程序和一些公共對話框,通常情況下,這種圖標的尺寸是與系統小型圖標的尺寸相等的。你可以使用SHGetFileInfo()函數來獲取該類型圖標的圖標列表句柄(使用SHGFI_SHELLICONSIZE|SHGFI_SMALLICON作為參數),然后使用ImageList_GetIconSize()函數來獲得圖標的尺寸。  
殼大型圖標將被用于桌面。如果你想修改這種圖標的尺寸,可啟動顯示控制面板程序,單擊"外觀"卡片,從"項"列表中選擇"圖標",然后設置它的值。(注:這個值將被保存在系統注冊表中,地址是:HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\Shell Icon Size),你同時也需要單擊"Plus!"卡片,并選擇"使用大圖標"復選框。要想獲取這種圖標的尺寸,可先用SHGetFileInfo()函數(使用SHGFI_SHELLICONSIZE作為參數)來取得系統圖像的列表,然后用ImageList_GetIconSize()函數來取得圖標的尺寸。  
系統"開始"菜單中將使用殼大型圖標或者殼小型圖標,具體使用哪一種將取決于"使用大圖標"復選框是否被設置。   
你的應用程序圖標應該提供以下几種格式:
        * 48×48, 256色
        * 32×32, 16色
        * 16×16, 16色
當你的應用程序在注冊窗口類時,WNDCLASSEX結構中的hIcon成員應對應于32×32的圖標,hIconSm成員則對應于16×16圖標。有關類圖標的更多信息,請參見Class Icons一節。  
 
● 圖標的創建(Icon Creation)
標准圖標是預定義的,所以他們不需要創建。要想使用標准圖標,應用程序可以用LoadImage()函數來獲得這種圖標的句柄(圖標句柄是一個HICON類型的系統唯一值,可用于代表一個標准圖標或定制圖標)。  
如果應用程序想使用自己的圖標(稱為定制圖標),那么開發者一般都是先用圖像軟件來制作圖標的圖像,然后將該圖像作為ICON資源包含到程序中。在程序運行的時候,調用LoadIcon()或LoadImage()函數來獲取圖標的句柄。圖標資源一般將包含几種不同顯示設備所需要的數據,LoadIcon()和LoadImage()函數在讀取圖標時,會自動調入與當前顯示設備最匹配的數據。  
應用程序也可以在運行的時候創建一個定制圖標,方法是先填寫一個ICONINFO結構,再使用CreateIconIndirect()函數創建即可。你也可以用GetIconInfo()函數來獲取指定圖標的熱點、掩碼位圖和彩色位圖。但應用程序應該盡量避免在運行時創建圖標,最好的方法是將定制圖標做成資源,然后用LoadIcon()或LoadImage()函數在運行時調用。這樣作的好處是可以消除圖標對設備的依賴、軟件本地化更容易,并可以使應用程序間共享圖標。  
CreateIconFromResourceEx()函數可以讓應用程序瀏覽從系統資源、被創建的圖標、到基于資源數據的光標等數種圖像,CreateIconFromResourceEx()函數也可以根據其他EXE文件或DLL文件中的二進制資源數據來創建圖標。有關資源函數的更多信息,請參見Resource Functions一節。  
 
● 圖標的顯示(Icon Display)
應用程序可以調用GetIconInfo()函數來獲取指定圖標的圖像(譯者注:即位圖的句柄),也可以調用DrawIconEx()函數來顯示圖標。如果想顯示一個圖標的默認圖像,在調用DrawIconEx()函數時請指定DI_COMPAT標志,如果不指定這個標志,該函數將使用用戶指定的圖像。  
 
● 銷毀圖標(Icon Destruction)
當應用程序不再需要一個在運行時(使用CreateIconIndirect()函數創建的)創建的圖標的時候,它應該銷毀這個圖標。可以使用DestroyIcon()函數來達到該目的,DestroyIcon()函數將銷毀圖標句柄,并釋放指定圖標所占用的內存資源。(注:DestroyIcon()函數只能用于銷毀由CreateIconIndirect()函數創建的圖標,而其它類型的圖標是不需要銷毀的)。  
 
● 圖標的復制(Icon Duplication)
CopyIcon()函數可以復制圖標的句柄,這使得應用程序或DLL可以取得其他程序的圖標(復制),當那些程序被釋放的時候,這些復制的圖標將繼續有效。  
CopyImage()函數可以創建一個基于指定圖標的新的圖標。這個新圖標可以大于或小于原來的圖標。有關在EXE文件中加、減、替換圖標的信息,請參見Resources一節。  
 
● 創建一個圖標(Create an Icon)  
 
要想使用圖標,應用程序必需先獲得圖標的句柄。下面的范例將展示怎樣創建兩種不同類型的圖標句柄:一種是標准圖標(一個感嘆號),另一種是定制圖標(作為程序的資源)。  
 
HICON hIcon1; // icon handle  
HICON hIcon2; // icon handle  
 
// Create a standard question icon.  
hIcon1 = LoadIcon(NULL, IDI_QUESTION);  
 
// Create a custom icon based on a resource.  
hIcon2 = LoadIcon(hinst, MAKEINTRESOURCE(460));  
 
// Create a custom icon at run time.   
 
雖然應用程序最好不要在運行時創建圖標,但此處還是放置了一個用CreateIcon()函數創建運行時圖標的例子,其目的主要是講解系統對掩碼位圖的解釋原理。
HICON hIcon3; // icon handle   
// Yang icon AND bitmask
BYTE ANDmaskIcon[] = {
0xFF, 0xFF, 0xFF, 0xFF, // line 1  
0xFF, 0xFF, 0xC3, 0xFF, // line 2  
0xFF, 0xFF, 0x00, 0xFF, // line 3  
0xFF, 0xFE, 0x00, 0x7F, // line 4  
 
0xFF, 0xFC, 0x00, 0x1F, // line 5  
0xFF, 0xF8, 0x00, 0x0F, // line 6  
0xFF, 0xF8, 0x00, 0x0F, // line 7  
0xFF, 0xF0, 0x00, 0x07, // line 8  
 
0xFF, 0xF0, 0x00, 0x03, // line 9  
0xFF, 0xE0, 0x00, 0x03, // line 10  
0xFF, 0xE0, 0x00, 0x01, // line 11  
0xFF, 0xE0, 0x00, 0x01, // line 12  
 
0xFF, 0xF0, 0x00, 0x01, // line 13  
0xFF, 0xF0, 0x00, 0x00, // line 14  
0xFF, 0xF8, 0x00, 0x00, // line 15  
0xFF, 0xFC, 0x00, 0x00, // line 16  
 
0xFF, 0xFF, 0x00, 0x00, // line 17  
0xFF, 0xFF, 0x80, 0x00, // line 18  
0xFF, 0xFF, 0xE0, 0x00, // line 19  
0xFF, 0xFF, 0xE0, 0x01, // line 20  
 
0xFF, 0xFF, 0xF0, 0x01, // line 21  
0xFF, 0xFF, 0xF0, 0x01, // line 22  
0xFF, 0xFF, 0xF0, 0x03, // line 23  
0xFF, 0xFF, 0xE0, 0x03, // line 24  
 
0xFF, 0xFF, 0xE0, 0x07, // line 25  
0xFF, 0xFF, 0xC0, 0x0F, // line 26  
0xFF, 0xFF, 0xC0, 0x0F, // line 27  
0xFF, 0xFF, 0x80, 0x1F, // line 28  
 
0xFF, 0xFF, 0x00, 0x7F, // line 29  
0xFF, 0xFC, 0x00, 0xFF, // line 30  
0xFF, 0xF8, 0x03, 0xFF, // line 31  
0xFF, 0xFC, 0x3F, 0xFF}; // line 32  
 
// Yang icon XOR bitmask  
 
BYTE XORmaskIcon[] = {
0x00, 0x00, 0x00, 0x00, // line 1  
0x00, 0x00, 0x00, 0x00, // line 2  
0x00, 0x00, 0x00, 0x00, // line 3  
0x00, 0x00, 0x00, 0x00, // line 4  
 
0x00, 0x00, 0x00, 0x00, // line 5  
0x00, 0x00, 0x00, 0x00, // line 6  
0x00, 0x00, 0x00, 0x00, // line 7  
0x00, 0x00, 0x38, 0x00, // line 8  
 
0x00, 0x00, 0x7C, 0x00, // line 9  
0x00, 0x00, 0x7C, 0x00, // line 10  
0x00, 0x00, 0x7C, 0x00, // line 11  
0x00, 0x00, 0x38, 0x00, // line 12  
 
0x00, 0x00, 0x00, 0x00, // line 13  
0x00, 0x00, 0x00, 0x00, // line 14  
0x00, 0x00, 0x00, 0x00, // line 15  
0x00, 0x00, 0x00, 0x00, // line 16  
 
0x00, 0x00, 0x00, 0x00, // line 17  
0x00, 0x00, 0x00, 0x00, // line 18  
0x00, 0x00, 0x00, 0x00, // line 19  
0x00, 0x00, 0x00, 0x00, // line 20  
 
0x00, 0x00, 0x00, 0x00, // line 21  
0x00, 0x00, 0x00, 0x00, // line 22  
0x00, 0x00, 0x00, 0x00, // line 23  
0x00, 0x00, 0x00, 0x00, // line 24  
 
0x00, 0x00, 0x00, 0x00, // line 25  
0x00, 0x00, 0x00, 0x00, // line 26  
0x00, 0x00, 0x00, 0x00, // line 27  
0x00, 0x00, 0x00, 0x00, // line 28  
 
0x00, 0x00, 0x00, 0x00, // line 29  
0x00, 0x00, 0x00, 0x00, // line 30  
0x00, 0x00, 0x00, 0x00, // line 31  
0x00, 0x00, 0x00, 0x00}; // line 32  
 
hIcon3 = CreateIcon(
     hinst, // application instance  
     32, // icon width  
     32, // icon height  
     1, // number of XOR planes  
     1, // number of bits per pixel  
     ANDmaskIcon, // AND bitmask  
     XORmaskIcon); // XOR bitmask   
 
在創建圖標時,CreateIcon()函數使用下列的原理表來AND和XOR位掩碼:
        AND位掩碼       XOR位掩碼               顯示
        -------------------------------------------
        0       0               黑色
        0       1               白色
        1       0               屏幕
        1       1               屏幕的反色
 
在關閉之前,應用程序必需用DestroyIcon()函數來銷毀任何用CreateIconIndirect()函數創建的圖標(譯者注:這也可以看出用資源圖標的好處)。  

● 顯示圖標(Displaying an Icon)  
 
你的應用程序可以將讀入或創建的圖標顯示在程序的客戶區或子窗口中,下面的范例顯示了怎樣在一個窗口中顯示圖標(HDC代表窗口):
        HICON hIcon1;   // icon handle   
        HDC hdc;        // handle of display context  
        DrawIcon(hdc, 10, 20, hIcon1);  
 
Windows系統會自動的顯示窗口的類圖標,你的應用程序可以在注冊窗口類時指定這個圖標。也可以在程序運行時調用SetClassLong()函數來替換類圖標(該函數會修改所有該類的窗口設置),下面的范例演示了用一個圖標資源來替換類圖標的方法:
        HINSTANCE hinst;            // handle of current instance  
        HWND hwnd;                  // main window handle   
 
        // Change the icon for hwnd's window class.    
        SetClassLong(hwnd,          // window handle  
            GCL_HICON,              // changes icon  
            (LONG) LoadIcon(hinst, MAKEINTRESOURCE(480))
           );   
有關窗口類的更多信息,請參見Window Classes一節。   
 
● 共享圖標資源(Sharing Icon Resources)  
 
下面的范例演示了怎樣從另一個應用程序中提取圖標,并在自己的程序中顯示出來。代碼中調用了CreateIconFromResourceEx()、DrawIcon()、LookupIconIdFromDirectoryEx()、和其它的几個資源函數。  

        HICON hIcon1;       // icon handle  
        HINSTANCE hExe;     // handle to loaded .EXE file  
        HRSRC hResource;    // handle for FindResource   
        HRSRC hMem;         // handle for LoadResource  
        BYTE *lpResource;   // address of resource data   
        int nID;            // ID of resource that best fits current screen    
        HDC hdc;            // handle of display context  
 
        // Load the file from which to copy the icon.    
        hExe = LoadLibrary("myapp.exe");  
 
        // Find the icon directory whose identifier is 440.    
        hResource = FindResource(hExe,  
            MAKEINTRESOURCE(440),  
            RT_GROUP_ICON);  
 
        // Load and lock the icon directory.    
        hMem = LoadResource(hExe, hResource);   
        lpResource = LockResource(hMem);  
 
        // Get the identifier of the icon that is most appropriate for the video display.    
        nID = LookupIconIdFromDirectoryEx((PBYTE) lpResource, TRUE,  
            CXICON, CYICON, LR_DEFAULTCOLOR);  
 
        // Find the bits for the nID icon.
 
        hResource = FindResource(hExe,  
            MAKEINTRESOURCE(nID),  
            MAKEINTRESOURCE(RT_ICON));  
 
        // Load and lock the icon.    
        hMem = LoadResource(hExe, hResource);    
        lpResource = LockResource(hMem);  
 
        // Create a handle to the icon.    
        hIcon1 = CreateIconFromResourceEx((PBYTE) lpResource,  
            SizeofResource(hExe, hResource), TRUE, 0x00030000,  
            CXICON, CYICON, LR_DEFAULTCOLOR);
   
        // Draw the icon in the client area.    
        DrawIcon(hdc, 10, 20, hIcon1);  
 
● 關于圖標的函數:(Icon Fuctions)
        CopyIcon  
        CreateIcon  
        CreateIconFromResource  
        CreateIconFromResourceEx  
        CreateIconIndirect  
        DestroyIcon  
        DrawIcon  
        DrawIconEx  
        GetIconInfo  
        LoadIcon  
        LookupIconIdFromDirectoryEx  
 
● 關于圖標的結構:(Icon Structures)  
        ICONINFO  
        ICONMETRICS    
 
● 關于圖標的消息:(Icon Messages)  
        WM_ERASEBKGND  
        WM_ICONERASEBKGND  
        WM_PAINTICON


 
 

Things you can do from here: