2007年12月21日星期五

微软1G网盘注册方法

注册方法:

  现在只要进入Live Skydrive 主页(http://skydrive.live.com/),用自己hotmail、MSN 或Live 帐号登录之后,就可以看到系统的注册提示了,接受协议之后立马即可开通Windows Live Skydrive 服务。无需对账户信息做任何设置。

  某些人可能会看到:"你所在的地区不能使用此服务"的提示,此时只要输入如下网址:http://skydrive.live.com/home.aspx?mkt=en-us就可以开通服务了,然后退出,重新登陆就是简体中文界面的了。。



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

2007年11月30日星期五

Windows XP自动登录设置

Windows XP自动登录设置

原来从没用过这样的方法,只用超级兔子魔法设置过。

方法:单击"开始/运行",输入"rundll32 netplwiz.dll,UsersRunDll",按回车键后弹出"用户帐户"窗口,看清楚,这可跟"控制面板"中打开的"用户账户"面板窗口不同 哦!然后取消选定"要使用本机,用户必须输入用户名和密码"选项,单击确定,在弹出的对话框中输入你想让电脑每次自动登录的账户和密码即可。



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

2007年11月18日星期日

用Python学习正则表达式

Python学习笔记 - 正则表达式 (by Rui Zhang)

正则表达式

正则表达式是一种字符串匹配模式。

一般字符

对于绝大多数的字符来说,它们都只是简单地匹配自己。如
>>> p=re.compile('hi')      # 匹配 hi
>>> m=p.search('very,high') #
>>> m.span() # 找到了位置
(5, 7)
>>>
在正则表达式中,如下的字符是具有特殊含义的
 . ^ $ * + ? { [ ] \ | ( )
它们的含义,我们会慢慢地说。
\
象其它大部分语言一样,'\'表示转义。为了在你的字符串中匹配如上的特殊字符,你就需要用到它。还有就是一些常见的定义,如'\r','\n','\f','\t','\b'等。如
>>> p=re.compile(r'\.e')     #找字符'.'后面紧跟字符'e'
>>> m=p.search('a.exe')
>>> m.span()
(1, 3)
>>>
.
字符.用于匹配任意的非换行字符,在windows下为'\n',在unix下为'\r\n'。在Python中,如果你在构造表达式时指定参数DOTALL的话,字符也可以匹配换行。
>>> p=re.compile(r'.')          #找任意非\n的字符
>>> p.search('abc').span()
(0, 1)
>>> p.search('\ncba').span()
(1, 2)
>>> p=re.compile (r'.',re.DOTALL) #找任意字符,包括\n在内
>>> p.search('\ncba').span()
(0, 1)
>>>
|
字符|表示选择,匹配它两边的任意一种。
>>> p=re.compile(r'abc|cba') #匹配 abc 或 cba
>>> p.search('cabcd').span() #找到 abc
(1, 4)
>>> p.search('cbcbad').span() # 找到 cba
(2, 5)
>>>

[]表示的字符类

如果你想匹配几个字符中的任意一个,那么就要用到字符类了。一个字符类是由[和]表示的,表示其中的任意一个。如
>>> p=re.compile(r'[aeiou.^]')  #找aeiou,字符.或字符^中的任意一个
>>> m=p.search('b.exe') #找到了字符.
>>> m.span()
(1, 2)
>>>
在一个字符类中,只有字符^、-、]和\有特殊含义。字符\仍然表示转义,字符-可以定义字符范围,字符^放在前面,表示非,字符]表示字符类的结束。如
>>> p=re.compile(r'[-a-c]')  #匹配字符-和字符a到c之间的字母,即a,b,c和-。
... #第1个字符-就表示字符-,第2个表示范围
>>> m=p.search('d-a.exe') #找到-
>>> m.span ()
(1, 2)
>>> m=p.search('b-a.exe') #找到b
>>> m.span()
(0, 1)
>>> p=re.compile(r'[^-a-c]') #找非-,a,b,c的字符
>>> m=p.search('b-a.exe') #找到字符.
>>> m.span()
(3, 4)
>>> p=re.compile(r'[-a-c^]') #^没有在首位,就只表示字符^
>>> m=p.search('def^-') #匹配字符^
>>> m.span()
(3, 4)
>>> p=re.compile(r'[[-a-c]') #第2个字符[只是表示字符[
>>> m=p.search('a[') #找到[
>>> m.span()
(0, 1)
>>> p=re.compile(r'[a-c]]') #第1个]已经表示类的结束,第2个表示字符]
... #表示要匹配字符a,b或c后接字符]
>>> m= p.search(']a') #匹配失败
>>> m.span()

Traceback (most recent call last):
File "<pyshell#37>", line 1, in <module>
m.span()
AttributeError: 'NoneType' object has no attribute 'span'
>>> m=p.search('a]') #成功
>>> m.span()
(0, 2)
>>> p=re.compile(r'[a-c\]]') #要表示字符],需要用转义符\
>>> m=p.search(']a') #匹配到字符]
>>> m.span()
(0, 1)
>>>
有若干常用的字符类的表达
转义 含义 可能的等价表达
\d 任意数字 [0-9]
\w 任意单词字符,包括下划线_,数字和字母 [a-zA-Z0-9_]
\s 空白字符 [ \t\r\f\n\v]
\D 非数字 [^\d]
\W 非单词字符 [^\w]
\S 非空白 [^\s]
注意的就是,对于Unicode的实现,会不一样。如\w会包含汉字字符在内。

{}表示重复

在{和}之间的数,用于指定重复的次数
{n} 重复n次
{n,} 重复n次或n次以上
{n,m} 重复n到m次
>>> p=re.compile(r'ab{2}c');  #匹配abbc
>>> p=re.compile(r'ab{2,}c'); #匹配abbc,abbbbbbc
>>> p=re.compile(r'ab{2,4}c'); #匹配abbc,abbbc,abbbbc
>>>
除了用{}表示重复外,还有几个字符也是这种含义
* 重复0次或更多次,与{0,}等价
? 重复0次或1次,与{0,1}等价
+ 重复1次或更多次,与{1,}等价
>>> p=re.compile(r'windows\d+');  #匹配windows后跟至少1个数字
>>> p=re.compile(r'13\d{9}'); #匹配13后跟9个数字
>>>

懒惰模式

在正则表达式的匹配中,采用的尽可能多的匹配原则,即贪婪模式(Greeding),如
>>> p=re.compile(r'a.*c');
>>> m=p.search(r'abcbca'); #匹配尽可能多的情况,即abcbc,而不是abc
>>> m.span()
(0, 5)
>>>
如果说想要采用尽可能少的匹配的话,可以使用懒惰模式(Lazy)。在表达重复的符号后,加上字符?即可,如+?,*?,{n,}?等。
* ? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
>>> p=re.compile(r'a.*?c');  #指定Lazy模式
>>> m=p.search(r'abcbca'); #匹配到abc就结束
>>> m.group()
'abc'
>>>

^和$表示行头和行尾

字符^表示在一行的开始位置,字符$则表示行的结尾位置,它们不代表任何字符。在Python中,需指定参数re.M或re.MULTILINE,才会表示行头和行尾;否则则表示字符串的开关和结尾。
>>> p=re.compile(r'^From:',re.M)     #匹配以From:开始的行
>>> p.search('hello,\nFrom: rui').span() #找到
(7, 12)
>>> p.search('hello, From: rui').span() #失败

Traceback (most recent call last):
File "<pyshell#15>", line 1, in <module>
p.search('hello, From: rui').span()
AttributeError: 'NoneType' object has no attribute 'span'
>>> p=re.compile(r'^From:') #没加参数,则表示要求字符串以From:开头
>>> p.search('hello,\nFrom: rui').span() #失败

Traceback (most recent call last):
File "<pyshell#17>", line 1, in <module>
p.search('hello,\nFrom: rui').span()
AttributeError: 'NoneType' object has no attribute 'span'
>>> p.search('From: rui').span() #成功
(0, 5)
>>>
除了用^和$表示位置外,还有
\b 匹配一个单词边界,也就是指单词和非单词字符间的位置。
\B [^\b]
\A 匹配字符串的开头
\Z 匹配字符串的结尾
如:
>>> p=re.compile(r'ba\b')   # 找以ba为结尾的单词
>>> m=p.search('cba') # 找到,后面可以是结束
>>> m.span() # \b本身不占用字符位
(1, 3)
>>> m= p.search('cba ') # 可以是空格
>>> m.span()
(1, 3)
>>> m=p.search('cba-') # 可以是非单词字符
>>> m.span()
(1, 3)
>>> m=p.search('cbac') # 失败
>>> m.span()

Traceback (most recent call last):
File "<pyshell#55>", line 1, in <module>
m.span()
AttributeError: 'NoneType' object has no attribute 'span'
>>>

()表示分组

前面讲了对单个字符的重复,如果你想重复一个子串的话,就可以采用分组的方法
>>> p=re.compile(r'(ab)+')      #匹配一个以上的ab
>>> p.search('acabababc').span()#成功
(2, 8)
>>> p=re.compile(r'(ab|bc)+') #匹配一个以上的ab或bc
>>> p.search('acabbcababc').span()
(2, 10)
>>>
分组除了当作了表达式外,还有个重要的功能就是记录。(和)中匹配的内容会被记录下来,以备以后引用。在Python中,MatchObject的方法 group(),start(),end(),span()可以传入一个整形参数来得到这些记录。记录以0开始计数,并且0表示整个匹配了的表达式,是这 些方法的缺省参数。分组从左到右从1开始计数。
>>> p=re.compile(r'(a(b)c)d')
>>> m=p.search('abcd')
>>> m.group() #就是缺省参数0
'abcd'
>>> m.group(0)
'abcd'
>>> m.group(1)
'abc'
>>> m.group(2)
'b'
>>> m.group(3) #超出范围

Traceback (most recent call last):
File "<pyshell#33>", line 1, in <module>
m.group(3)
IndexError: no such group
>>> m.groups() #列出所有的分组
('abc', 'b')
>>>
在正则表达式中,还可以对分组做出向后引用,是用'\数字'来表示。即\1表示第1个分组,\2表示第2个,等。
>>> p = re.compile(r'(\b\w+)\s+\1')   # 匹配两个同样的单词连着出现,
... # 即找一个单词,并且在若干个空格后,还是同样的单词
... # \1 表示的是前面的分组(\b\w+)匹配的同样的内容
>>> p.search('Paris in the the spring').groups()
('the',)
>>> p.search('Paris in the the spring').group() #找到
'the the'
>>>

非记录分组和命名分组

若一个表达式很复杂,有很多的分组,而每个分组都要记录的话就会很困难。有两种相应的方法来处理这个问题,不过属于正则表达式的扩展。

在Perl中,它定义了一种正则表达式的扩展,就是在括号后紧跟一个问题,即'(?...)'。而紧跟在问号'?'后的字符则表达了扩展的含义,如(?:foo)表示非记录型的分组含foo,而(?=foo)则表示另一种含义(表示前面有foo)。

除了实现Perl的这些扩展外,Python还有自己的扩展。若在'?'后紧跟的是P的话,则表示是Python的扩展。如(?P< name>...)定义了一个命名分组,而(?P=name)则表示的对前面的向后引用(与\1等的功能一样)。若Perl中引入了同样功能的符 号,Python会同样引入,同时保留P字符功能。

(?P<name>...)和(?P=name)
(?P<name>...)用来定义一个命名分组,它可以通过MatchObject的方法group('name')得到,同时,在表达式中,也可以用(?P=name)来表示对它的引用。
>>> p = re.compile(r'(?P<word>\b\w+\b).*(?P=word)')   #注意命名分组及对它的引用
>>> m = p.search( '(((( Lots of punctuation aLots)))' )
>>> m.group()
'Lots of punctuation aLots'
>>> m.group('word') #在方法中引用
'Lots'
>>> m.span('word')
(5, 9)
>>>
在imaplib模块中,有个读取INTERNALDATA的例子
InternalDate = re.compile(r'INTERNALDATE "'
r'(?P<day>[ 123][0-9])-(?P<mon>[A-Z][a-z][a-z])-'
r'(?P<year>[0-9][0-9][0-9][0-9])'
r' (?P<hour>[0-9][0-9]):(?P<min>[0-9][0-9]):(?P<sec>[0-9][0-9])'
r' (?P<zonen>[-+])(?P<zoneh>[0-9][0-9])(?P<zonem>[0-9][0-9])'
r'"')
显然,用InternalData.group('zonen')比InternalData.group(9)要好得多。
(?:...)
表示非记录分组。即这个分组不会被记录下来。
>>> m = re.match("([abc])+", "abc")
>>> m.groups()
('c',)
>>> m = re.match("(?:[abc])+", "abc") #分组不被记录
>>> m.groups()
()
(?=...)
称为零宽度正预测先行断言。它断言自身出现的位置的后面能匹配表达式...,但它不包括这些表达式。就像\b,^,$那样用于指定一个位置,这个位置应该 满足一定的条件(断言),因此它们也被称为零宽断言。比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分)。
>>> p=re.compile(r'Rui (?=Zhang)')  #匹配Rui 后面跟Zhang时的情况,不包括Zhang在内
>>> p.search('hi, Rui Zhang').group() #成功,匹配的内容不含Zhang
'Rui '
>>> p.search ('hi, Rui Zhang').groups() #分组中没有被记录的部分
()
>>> p.search('hi, Rui Zhou').group() #Rui 后面跟的是Zhou,失败

Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
p.search('hi, Rui Zhou').group()
AttributeError: 'NoneType' object has no attribute 'group'
>>>
(?<= ...)
与前面类似,也是用于指定位置,不作实际匹配,叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式...。比如(?<= \bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分)
>>> p=re.compile(r'(?<=Rui )Zhang')   #匹配前面是Rui 的字符Zhang
>>> p.search('hi, Rui Zhang').group() #成功
'Zhang'
>>> p.search('hi, Shan Zhang').group() #失败

Traceback (most recent call last):
File "<pyshell#14>", line 1, in <module>
p.search('hi, Shan Zhang').group()
AttributeError: 'NoneType' object has no attribute 'group'
>>>
(?!...)
零宽度负预测先行断言。断言此位置的后面不能匹配表达式...。例如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字;\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词。
>>> p=re.compile(r'Rui (?!Zhang)')    #匹配Rui 后面不是Zhang的情况
>>> p.search('hi, Rui Zhang').group() #失败

Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
p.search('hi, Rui Zhang').group()
AttributeError: 'NoneType' object has no attribute 'group'
>>> p.search('hi, Rui Zhou').group() #成功
'Rui '
>>>
(?<!...)
零宽度负回顾后发断言。断言此位置的前面不能匹配表达式...。(?<![a-z])\d{7}匹配前面不是小写字母的七位数字。
>>> p=re.compile(r'(?<!Rui )Zhang')   #匹配前面不是Rui 的字符Zhang
>>> p.search('hi, Rui Zhang').group() #失败

Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
p.search('hi, Rui Zhang').group()
AttributeError: 'NoneType' object has no attribute 'group'
>>> p.search('hi, Shan Zhang').group() #成功
'Zhang'
>>>
(?#...)
表示注释,其中的内容直接被忽略
>>> p=re.compile(r'Rui (?#Zhang)')  #与'Rui '是等价的
>>> p.search('Rui Zhang').groups()
()
>>> p.search('Rui Zhang').group()
'Rui '
>>>
(?iLmsux)
在"i", "L", "m", "s", "u", "x"中的一个或多个,它不匹配任何字串,而是表示对应(re.I, re.L, re.M, re.S, re.U, re.X)的6种选项。
>>> p=re.compile(r'(?m)^From:')       #与使用re.M选项是一样的
>>> p.search('hi,\nFrom: rui').span()
(4, 9)
>>>
(?(id/name)yes-pattern|no-pattern)
这是Python 2.4后加入的特性。表示若分组id或name存在的话,就匹配yes-pattern,否则就匹配no-pattern。|no-pattern是可选 的,若没有的话,就表示忽略它。如(<)?(\w+@\w+(?:\.\w+)+)(?(1)>)就是个简单的E-Mail地址匹配表达式, 它可以匹配'<user@host.com>'或'user@host.com'但不能匹配'< user@host.com'。其中最后一个分组表达(?(1)>)就表示若分组(1)存在(这里是指(<),即是否有符号<),则要求匹配表达式>,否则就忽略它。
>>> p=re.compile(r'(<)?(\w+@\w+(?:\.\w+)+)(?(1)>)')
>>> m=p.search('<xxx@gmail.com.cn>')
>>> m.group ()
'<xxx@gmail.com.cn>'
>>> m.groups()
('<', 'xxx@gmail.com.cn')
>>> m=p.search('< xxx@gmail.com')
>>> m.group()
'xxx@gmail.com'
>>> m.groups()
(None, 'xxx@gmail.com ')
>>> m=p.search('xx@gmail.com')
>>> m.group()
'xx@gmail.com'
>>> m.groups()
(None, ' xx@gmail.com')
>>>

正则表达式的优先权顺序

在构造正则表达式之后,就可以象数学表达式一样来求值,也就是说,可以从左至右并按照一个优先权顺序来求值。

下表从最高优先级到最低优先级列出各种正则表达式操作符的优先权顺序:

操作符 描述
\ 转义符
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \anymetacharacter 位置和顺序
| "或"操作

小结

"."
(点.)代表任何非回车换行字符。当DOTALL选项指定时候,可以匹配包括回车在内的任意字符。
"^"和"$"
表示字串的头和尾。若指定选项MULTILINE,还表示一行的头和尾
"*"
表示重复0或更多个
"+"
表示重复1个以上
"?"
表示重复0或1个
*?, +?, ??
是"*","+"和"?"的懒惰匹配,即尽可能少的匹配
{m}
重复m个
{m,n}
重复n到m个
{m,n}?
{m,n}的懒惰匹配
"\"
转义字符。
[]
字符集。匹配[]中指定的任何一个。可以用"-"来指定一个范围,也可以用[^...]来表示不是其中的字符
"|"
A|B,其中A和B可以是表达式,表示匹配A或B中的任意一个
(...)
分组
(?...)
正则表达式的扩展标识
(?iLmsux)
(取字符"i", "L", "m", "s", "u", "x"中的1个或多个)不匹配任何字串,仅仅用于设置选项。它们分别对应于(re.I, re.L, re.M, re.S, re.U, re.X),一般放在表达式的第一位
(?:...)
非记录分组
(?P<name>...)
命名分组
(?P=name)
取出命名的分组
(?#...)
注释
(?=...)
先行断言。断言此位置的后面能匹配表达式...。
(?!...)
负先行断言。断言此位置的后面不能匹配表达式...。
(?<=...)
后发断言。断言此位置的前面能匹配表达式...。
(?<!...)
负后发断言。断言此位置的前面不能匹配表达式...。
(?(id/name)yes-pattern|no-pattern)
若分组id若name已经匹配,则使用yes-pattern,否则用no-pattern。|no-pattern可选。

一个好的网址

正则表达式30分钟入门教程
Regular Expression HOWTO

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

2007年11月4日星期日

一个测试procmailrc的脚本

在你的测试目录(/home/myid/test,可以改)下建proctest.rc作为procmailrc文件,邮件文件为mail.msg(只包含一个邮件),直接运行proctest就可以了
 
#!/bin/sh
#The executable file named "proctest"
#
# You need a test directory.
TESTDIR=/home/myid/test
if [ ! -d ${TESTDIR} ] ; then
  echo "Directory ${TESTDIR} does not exist; First create it"
  exit 0
fi
#
#Feed an email message to procmail. Apply proctest.rc recipes file.
#First prepare a mail.msg email file which you wish to use for the
#testing.
procmail ${TESTDIR}/proctest.rc < mail.msg
#
#Show the results.
less ${TESTDIR}/Proctest.log
clear
less ${TESTDIR}/Proctest.mail
#
#Clean up.
rm -i ${TESTDIR}/Proctest.log
rm -i ${TESTDIR}/Proctest.mail
 
下面是一个简单的procmailrc的例子proctest.rc
 
SHELL=/bin/sh TESTDIR=/home/myid/test MAILDIR=${TESTDIR} LOGFILE=${TESTDIR}/Proctest.log LOG="--- Logging for ${LOGNAME}, "  #Troubleshooting: VERBOSE=yes LOGABSTRACT=all  #Let's test stripping lines from the email message's header :0 fwh | egrep -vi "(^Content-|^MIME-Version:.)"  #If it is from myself, store the email message :0: * $ ^From:.*${LOGNAME} ${TESTDIR}/Proctest.mail  #Otherwise, discard the email message :0 /dev/null 


--
一步一步教你从互联网赚钱 http://www.zqzn.com/index.asp?rid=key480769
投资理财 http://li-cai.blogspot.com/

2007年11月2日星期五

股市看盘秘诀十八条

股市看盘秘诀十八条
       1, 对大盘,大盘股(白线)上得比小盘股(黄线)快,要出现回调,而黄线上涨比白线快,则会带动白线上.

  2,涨跌比率大于1而大盘跌,表明空方势强,反之多方强.此状况高位看跌低位看涨.

  3,成交量大的股票开始走软,或者前期股市的热门板块走软,当小心行情已接近尾声.

  4,股票基本走软,市场在热点消失还没有出现新市场热点的时候,不要轻易去买股票.

  5, 成交量屡创天量,而股价涨幅不大,应随时考虑派发,反之成交量极度萎缩不要轻易抛出股票.

  6,大盘5分种成交明细若出现价量配合理想当看好后市,反之要小心.

  7,成交量若上午太小,则下午反弹的机会多,如上午太大,则下午下跌概率大.

  8,操作时间最好在下午,因为下午操作有上午的盘子作依托,运用60分种K线分析,可靠性好.

  9,上涨的股票若压盘出奇的大,但最终被消灭,表明仍会上涨.

  10,一般股票的升跌贴着均价运行,若发生背离将会出现反转.

  11,盘面经常出现大手笔买卖,买进时一下吃高几个档位,表明大户在进货.

  12, 个股在盘整或下跌时,内盘大于外盘,且阴线实体小,成交量大,日后该股有行情的可能性大;大盘暴跌,而该股没跌多少或者根本没跌,下档接盘强,成交放得很大,后市有戏的可能大.

  13,股价上冲的线头(曲线)绝对的多于下跌的线头时当看好该股.

  14,在下跌的势道里,应选逆势股;在上涨的势道里,应选大手笔买卖的股票.

  15, 开盘数分种就把股价往上直拉,而均线没有跟上,往往都是以当天失败的形式而告终.

  16, 当日下跌放巨量,但收的阴线实体不大,而且大部分时间在昨日收盘以上运行,第二天涨的机会多.

  17, 涨幅在5-7%以上,内盘大于外盘,高点不断创新,低点不断抬高,说明有机构大户在进货.

  18,分价表若是均匀分布说明大户不在里面,否则有大户介入.

--
一步一步教你从互联网赚钱 http://www.zqzn.com/index.asp?rid=key480769
投资理财 http://li-cai.blogspot.com/

2007年10月30日星期二

正则表达式,相关链接

正则表达式,相关链接
clipped from blog.csdn.net

正则表达式,相关链接
http://blog.csdn.net/laily/category/19548.aspx

http://blog.csdn.net/laily/archive/2004/06/30/30525.aspx 微软的正则表达式教程(五):选择/编组和后向引用

http://blog.csdn.net/laily/archive/2004/06/30/30522.aspx 微软的正则表达式教程(四):限定符和定位符

http://blog.csdn.net/laily/archive/2004/06/30/30517.aspx 微软的正则表达式教程(三):字符匹配

http://blog.csdn.net/laily/archive/2004/06/30/30514.aspx 微软的正则表达式教程(二):正则表达式语法和优先权顺序

http://blog.csdn.net/laily/archive/2004/06/30/30511.aspx 微软的正则表达式教程(一):正则表达式简介

http://blog.csdn.net/laily/archive/2004/06/30/30360.aspx 小程序大作为:高级查找/替换、正则表达式练习器、Javascript脚本程序调试器


正则表达式,正规表达式,正则表达式匹配,正则表达式语法,模式匹配,正规表达式匹配 javascript正则表达式 ASP正则表达式 ASP.NET正则表达式 C#正则表达式 JSP正则表达式 PHP正则表达式 VB.NET正则表达式 VBSCript正则表达式编程 delphi正则表达式 jscript

 blog it

2007年10月29日星期一

Emacs中加入自己编码识别

强大的编辑器要有强大的编码识别能力 -- unicad.el

如果你经常要查看或编辑多种国家语言的文件,那你可能经常碰到乱码的情况。

unicad.el 是从 Mozilla universal charset auto detector 改写过来的 Elisp 程序,在 GNU Emacs 里加载上 unicad 就可以自动识别多种编码,以后再也不会遇到乱码的文件了。把下载到的 unicad.el 复制到 Emacs 的 load-path 里,比如 site-lisp ,在 ~/.emacs 里加上下面这句:

(require 'unicad)

如果你觉得检测过程拖慢了打开文件的速度,可以 byte-compile 这个文件:

M-x byte-compile-file <RET> /path/to/unicad.el

超载地址 http://cid-3643184002e3d5e6.skydrive.live.com/self.aspx/Public/unicad.zip

--
一步一步教你从互联网赚钱 http://www.zqzn.com/index.asp?rid=key480769
投资理财 http://li-cai.blogspot.com/

Emacs code-publish

;;; code-publish.el --- convert codes into html, used for msn space
;; Because of the limited allowed file types,
;; if the extension of this file is not .el, please change it manually.

;; Author: Qichen Huang <jasonal00+emacs at gmail.com>
;; Version: 0.2

;;; Commentary:
;; (require 'code-publish)

;; Usage:
;; M-x code-publish
;; the converted html code will be copied to kill-ring,
;; which could be directly pasted onto msn space as html code.

;; History:
;; 14.08.2006 Version 0.2
;; 14.08.2006  Added: tag <div>
;; 28.07.2006 Version 0.1

;;; Code:

(defun code-publish ()
  "Convert region between mark and point into HTML, save the result into kill ring."
  (interactive)
  (kill-new (code-publish-region (mark) (point)))
  (message "Code convert completed."))



(defvar font-header "<font size=\"2\">")
(defvar div-header "<div style=\"background-color:rgb(255,255,224);\">")
(defvar footer "</div></font>")
(defvar tag-open "<span style=\"font-family: Courier New,Courier,Monospace;")
(defvar tag-close ">")
(defvar tag-end "</span>")
(defvar newline-tag "<br>")
(defvar space "&nbsp;")
(defvar space2 "&nbsp;&nbsp;")
(defvar space4 "&nbsp;&nbsp;&nbsp;&nbsp;")

(defvar code-builtin-color       " color: rgb(0,139,0);\"")
(defvar code-comment-color       " color: rgb(205,0,0); font-style: italic;\"")
(defvar code-constant-color      " color: rgb(47,79,79);\"")
(defvar code-doc-color           " color: rgb(0,139,0);\"")
(defvar code-function-name-color " color: rgb(0,0,255); font-weight: bold;\"")
(defvar code-keyword-color       " color: rgb(160,32,240);\"")
(defvar code-preprocessor-color  " color: rgb(250,128,114);\"")
(defvar code-string-color        " color: rgb(0,139,0);\"")
(defvar code-type-color          " color: rgb(0,0,128);\"")
(defvar code-variable-name-color " color: rgb(139,90,40);\"")
(defvar code-warning-color       " color: rgb(255,0,0);\"")
(defvar code-default-color       " \"")

(defun code-publish-region (begin-point end-point)
  (let ((beg (min begin-point end-point))
        (end (max begin-point end-point))
        (str "")
        (tmp nil)
        (result nil)
        (tface nil)
        (color "")
        )
    ;;(beginning-of-buffer)
    (unless (= beg end)
      (save-excursion
        (setq result (concat result font-header))
        (setq result (concat result div-header))
        (goto-char beg)
        (while (< (point) end)
          (setq tmp (next-single-property-change (point) 'face))
          (unless tmp
            (setq tmp end)) ;; there is no face change, set tmp to end point
          ;; no cross-line properties
          (when (> tmp (line-end-position))
            (setq tmp (line-end-position))) ;; New line
          ;; skip spaces and tabs
          (save-excursion
            (goto-char tmp)
            (when (looking-at "[ \t]+")
              (re-search-forward "[ \t]+" (line-end-position) t)
              (setq tmp (point))))
          (when (> tmp end)
            (setq tmp end))
          (setq str (buffer-substring-no-properties (point) tmp))
          (while (string-match "<" str)
            (setq str (replace-match "&lt;" t nil str)))
          (while (string-match ">" str)
            (setq str (replace-match "&gt;" t nil str)))
          (while (string-match "  " str)
            (setq str (replace-match space2 t nil str)))
          (while (string-match "\t" str)
            (setq str (replace-match space4 t nil str)))
          (setq tface (get-text-property (point) 'face))
          (when (listp tface)
            (setq tface (car tface)))
          (cond
           ((eq tface font-lock-builtin-face)
            (setq color code-builtin-color))
           ((eq tface font-lock-comment-face)
            (setq color code-comment-color))
           ((eq tface font-lock-constant-face)
            (setq color code-constant-color))
           ((eq tface font-lock-doc-face)
            (setq color code-doc-color))
           ((eq tface font-lock-function-name-face)
            (setq color code-function-name-color))
           ((eq tface font-lock-keyword-face)
            (setq color code-keyword-color))
           ((eq tface font-lock-preprocessor-face)
            (setq color code-preprocessor-color))
           ((eq tface font-lock-string-face)
            (setq color code-string-color))
           ((eq tface font-lock-type-face)
            (setq color code-type-color))
           ((eq tface font-lock-variable-name-face)
            (setq color code-variable-name-color))
           ((eq tface font-lock-warning-face)
            (setq color code-warning-color))
           (t (setq color code-default-color)))
          ;; (setq color "<span color=\"\">")
          (setq result (concat result tag-open color tag-close str tag-end))
          (when (= tmp (line-end-position))
            (setq result (concat result newline-tag))
            (setq tmp (+ 1 (line-end-position))))
          (goto-char tmp))
        (setq result (concat result footer))
        result
        ))))

(provide 'code-publish)

;;; ################ code-publish ends here #######################

Emacs中建立文件自动关联mode

一次性关联
(
setq auto-mode-alist
;; 将文件模式和文件后缀关联起来。
( append '(("\\.py\\'" . python-mode)
("\\.s?html?\\'" . html-helper-mode)
(" \\.asp\\'" . html-helper-mode)
("\\.phtml\\'" . html-helper-mode)
("\\.css\\'" . css-mode) )
auto-mode-alist)
)
单个文件关联
(add-to-list 'auto-mode-alist '("\\.org$" . org-mode))


--
一步一步教你从互联网赚钱 http://www.zqzn.com/index.asp?rid=key480769
投资理财 http://li-cai.blogspot.com/

【转帖】如何不重新启动 Emacs 就让 .emacs 的配置起作用

我刚刚使用 Emacs 的时候,总是

vi ~/.emacs

然后重新启动 emacs ,效率很低 ,暗自嘟囔, emacs 怎么没有这种功能,不重起,就自动更新 .emacs 的设置 呢?

后来我发现,这个功能完全没有必要,我的做法是:

  • 用 emacs 打开 .emacs 文件,C-x C-e 光标前面的运行一条语句。立即生效。
  • 选择一个 region , M-x eval-region
  • M-x load-file ~/.emacs
  • M-x eval-buffer

都是立即生效,可以马上试验一条语句的效果。 例如,在任何一个文件中,写

(setq frame-title-format "emacs@%b")

把光标停在在这条语句后面, C-x C-e ,马上看到 emacs 的 标题栏上发生变化。

我用这种方法调试我的每一个小的配置文件,按上篇文章说的方法, 把他放在 ~/Emacs/myconfig/my-site-start.d 中。



--
一步一步教你从互联网赚钱 http://www.zqzn.com/index.asp?rid=key480769
投资理财 http://li-cai.blogspot.com/

Emacs 在窗口的标题栏上显示文件名称

在窗口的标题栏上显示文件名称
(setq frame-title-format "%n%F/%b")
% 后面跟一个特殊字符表示特殊的意义。

--
一步一步教你从互联网赚钱 http://www.zqzn.com/index.asp?rid=key480769
投资理财 http://li-cai.blogspot.com/

Emacs中保存 session 和 desktop

保存 session 和 desktop . 每次关闭 emacs 后, 在打开 emacs 时,恢复很多很多东西, 就像你没有关闭 emacs 一样

(require 'session)
(add-hook 'after-init-hook 'session-initialize)
(load "desktop")
(desktop-load-default)
(desktop-read)
;

第一次使用的时候,要运行 M-x desktop-save 命令.



--
一步一步教你从互联网赚钱 http://www.zqzn.com/index.asp?rid=key480769
投资理财 http://li-cai.blogspot.com/

2007年10月27日星期六

探究X Window System运行原理与启动过程

探究X Window System运行原理与启动过程
http://linux.shangdu.com/news_pub.asp?id=851

第一次在Debian下装XFree86,startx启动了twm,装了gnome 后startx启动了gnome环境,为什么?装gnome 时修改了什么文件以及X环境是怎么起来的?本来是想搞清这几个文题开始研究这个题目的,没想到还学到了很多别的东西^_^本文主要说明X Window System的基本运行原理,其启动过程,及常见的跨网络运行X Window System。

一) 基本运行原理

        X Window System采用C/S结构,但和我们常见的C/S不同。常见的C/S结构中,称提供服务的一方为server,即服务器端(如HTTP服务,FTP服务等),使用服务的称为client,即客户端。但在X Window System中,client是执行程序的一方,在上面执行各种X程序,而server则是负责显示client运行程序的窗口的一方。
       X Window System的组成可以分为X server,X client,X protocol三部分。X server主要控制输入输出,维护字体,颜色等相关资源。它接受输入设备的输入信息并传递给X client,X client将这些信息处理后所返回的信息,也由X server负责输出到输出设备(即我们所见的显示器)上。X server传递给X client的信息称为Event,主要是键盘鼠标输入和窗口状态的信息。X client传递给X server的信息则称为Request,主要是要求X server建立窗口,更改窗口大小位置或在窗口上绘图输出文字等。X client主要是完成应用程序计算处理的部分,并不接受用户的输入信息,输入信息都是输入给X server,然后由X server以Event的形式传递给X client(这里感觉类似Windows的消息机制,系统接收到用户的输入信息,然后以消息的形式传递给窗口,再由窗口的消息处理过程处理)。X client对收到的Event进行相应的处理后,如果需要输出到屏幕上或更改画面的外观等,则发出Request给X server,由X server负责显示。
          常见的情况是X server与X client都在同一台电脑上运行,但他们也可分别位于网络上不同的电脑上。在X Window System中,X client是与硬件无关的,它并不关心你使用的是什么显卡什么显示器什么键盘鼠标,这些只与X server相关。我们平常安装完XFree86后运行xf86config或xf86cfg进行的配置实际上只是与X server有关,可以说就是配置X server吧,不配置照样可以运行X client程序(如:xeyes -display xserver:0就可以在xserver这台机器上的0号屏幕(屏幕编号displaynumber为0)上显示那对大眼睛了)。
         X protocol就是X server于X client之间通信的协议了。X protocol支持现在常用的网络通信协议。我只能测试TCP/IP,可以看到X server侦听在tcp 6000端口上。那X protocol就是位于运输层以上了,应该属于应用层吧?。
         总结下运行过程吧:

  1. 用户通过鼠标键盘对X server下达操作命令
  2. X server利用Event传递用户操作信息给X client
  3. X client进行程序运算
  4. X client利用Request传回所要显示的结果
  5. X server将结果显示在屏幕上

二) 启动过程

         我们从控制台进入X一般是用startx命令。下面就从startx分析起。首先man startx和man xinit可以看到staratx和xinit的使用方法:
startx [[client] options .....] [-- [server] options ....]
xinit [[client] options ] [-- [server] [display] options]
把上面[client]和[server]分别称为client程序和server程序。man手册里写明其必须以/或者./开头。
         下面看看startx这个脚本,中文为我加的注释,这个脚本是安装x-window-system-core后得到的,都是XFree86,不同发行版的linux里该脚本应该大同小异:


#!/bin/sh
userclientrc=$HOME/.xinitrc #用户的client定义文件
userserverrc=$HOME/.xserverrc #用户的server定义文件
sysclientrc=/usr/X11R6/lib/X11/xinit/xinitrc #系统的client
sysserverrc=/usr/X11R6/lib/X11/xinit/xserverrc #系统的server
defaultclient=/usr/X11R6/bin/xterm #默认的client程序
defaultserver=/usr/X11R6/bin/X #默认的server程序
defaultclientargs="" #下面定义了client和server的参数变量
defaultserverargs=""
clientargs=""
serverargs=""
#如果用户client文件存在则使用用户文件里定义的client,否则使用系统定义的client
if [ -f $userclientrc ]; then
defaultclientargs=$userclientrc
elif [ -f $sysclientrc ]; then
defaultclientargs=$sysclientrc
fi
#如果用户server文件存在则使用用户文件里定义的server,否则使用系统定义的server
if [ -f $userserverrc ]; then
defaultserverargs=$userserverrc
elif [ -f $sysserverrc ]; then
defaultserverargs=$sysserverrc
fi
#下面循环处理client和server的参数
whoseargs="client"
while [ x"$1" != x ]; do #若第一个参数为空,退出循环
case "$1" in
# '' required to prevent cpp from treating "/*" as a C comment.
/''*|\./''*) #如果$1是/*或者./*形式(xinit程序要求其参数里的client程序和server程序必须以/或./开头,否则会被视为client程序和server程序的参数,见man xinit)
if [ "$whoseargs" = "client" ]; then #如果当前是在处理client的参数
if [ x"$clientargs" = x ]; then #如果clientargs为空,则赋值$1给client变量,也即上面#startx使用方法里的[client]参数
client="$1"
else
clientargs="$clientargs $1" #否则clientargs赋值为$clientargs $1,即上面#startx使用#方法里的options参数
fi
else #当前在处理server的参数,代码的含义同上
if [ x"$serverargs" = x ]; then
server="$1"
else
serverargs="$serverargs $1"
fi
fi
;;
--)#如果$1为--,则表示开始处理server的参数,--为client和server参数的分界
whoseargs="server"
;;
*)
if [ "$whoseargs" = "client" ]; then #处理给client程序的参数
clientargs="$clientargs $1"
else #处理给server程序的参数
# display must be the FIRST server argument
#屏幕编号必须为第一个给server程序的参数,以:x的形式(x为数字),这可从上面startx和xinit
的使用方法的区别看出,xinit多了个[display],这里即过滤出这个[display]。试试看这两个命令:
xinit /usr/bin/X11/xeyes -display localhost:1 -- /usr/bin/X11/X :1 -dpi 70&
xinit /usr/bin/X11/xeyes -display localhost:1 -- /usr/bin/X11/X -dpi 70 :1&
即可看出不把屏幕编号作为第一个server参数的后果
if [ x"$serverargs" = x ] && expr "$1" : ':[0-9][0-9]*$' > /dev/null 2>&1; then

display="$1"
else #处理屏幕编号以外的参数
serverargs="$serverargs $1"
fi
fi
;;
esac
shift #所有参数左移一次
done
# process client arguments
if [ x"$client" = x ]; then #如果client程序为空
# if no client arguments either, use rc file instead
if [ x"$clientargs" = x ]; then #且clientargs为空,赋值$defaultclientargs给client程序
client="$defaultclientargs"
else
client=$defaultclient #使用默认的client程序
fi
fi
# process server arguments处理server参数,同上
if [ x"$server" = x ]; then
# if no server arguments or display either, use rc file instead
if [ x"$serverargs" = x -a x"$display" = x ]; then
server="$defaultserverargs"
else
server=$defaultserver
fi
fi
#…………省略授权代码若干

xinit $client $clientargs -- $server $display $serverargs #把处理过的参数交由xinit程序处理
#…………


由上面代码可以得出startx主要是置X client和X server所在的位置,并处理相关参数,最后交给xinit处理。可以看出startx 设置X client的位置是先搜寻$HOME/.xinitrc,然后是/etc/X11/xinit/xinitrc;设置X server的位置是先搜寻$HOME/.xserverrc,然后是/etc/X11/xinit/xserverrc。这就解释了我们平常为什么说启动X Window时用户目录下的.xinitrc和.xserverrc文件优先级要高。所以我们用startx命令启动X时,如果用户目录存在. xinitrc和.xserverrc文件,则实际上等价于命令xinit $HOME/.xinitrc -- $HOME/.xserverrc 。如果用户目录不存在那两个文件,则等价于xinit /usr/X11R6/lib/X11/xinit/xinitrc -- /usr/X11R6/lib/X11/xinit/xserver。别的情况类推。
        至于xinit,则根据startx传过来的参数启动X server,成功后根据xinitrc启动X client。
        以上即为X Window System的启动过程,startx只是负责一些参数传递,真正的X启动由xinit实现。实际上可以分为启动X server和启动X client两部分。下面在用户目录下构造.xinitrc(即X client)和.xserverrc(即X server)文件。在.xserverrc里写入/usr/bin/X11/X :1。.xinitrc里写入/usr/bin/X11/xeyes -display localhost:1。这就是最简单的X server+ X client了,只不过把屏幕编号从默认的0改为了1,这里X server即是/usr/bin/X11/X 程序,X client即是/usr/bin/X11/xeyes 程序。
         总结下单机用startx启动过程吧:

  1. startx置X client和X server的位置,处理参数并调用xinit
  2. xinit根据传过来的参数启动X server,成功后呼叫X client
  3. 根据xinitrc设置相关资源,启动窗口管理器,输入法和其他应用程序等X client程序。

         但还未搞清楚gnome是怎么起来的!gnome当然属于X client了,看上面启动过程第(3)步。
这里分两种情况看吧,第一种是用系统的xinitrc文件。看/etc/X11/xinit/xinitrc文件(我的sarge装x-window- system-core和gnome-core),里面只包含了. /etc/X11/Xsession一句话。接着看/etc/X11/Xsession这个脚本,只看关键部分吧。最后面有:

SESSIONFILES=$(run_parts $SYSSESSIONDIR)
if [ -n "$SESSIONFILES" ]; then
for SESSIONFILE in $SESSIONFILES; do
. $SESSIONFILE
done
fi
exit 0

接着看run_parts(),位于本文件中间:

run_parts () {
# until run-parts --noexec is implemented
if [ -z "$1" ]; then
internal_errormsg "run_parts() called without an argument."
fi
if [ ! -d "$1" ]; then
internal_errormsg "run_parts() called, but \"$1\" does not exist or is" \
"not a directory."
fi
for F in $(ls $1); do
if expr "$F" : '[[:alnum:]_-]\+$' > /dev/null 2>&1; then
if [ -f "$1/$F" ]; then
echo "$1/$F"
fi
fi
done
}

大概意思就是run_parts () 把$SYSSESSIONDIR目录下的文件名取出来赋值给$SESSIONFILES,然后循环运行该目录下的文件。看看该目录,即 /etc/X11/Xsession.d目录,可以看到几个以数字开头的文件,实际上这些数值就表示了这几个文件被运行的优先级,数字小的优先级高,因为在上面的run_parts () 里是用ls命令显示该目录下的文件,所以前面数字小的被ls时显示在前面,所以被

for SESSIONFILE in $SESSIONFILES; do
. $SESSIONFILE
done

这个for循环执行时也先被执行。看到/etc/X11/Xsession.d目录下有个55gnome-session_gnomerc文件,里面提到了STARTUP变量。然后运行:

xdkui@Debian:/etc/X11/Xsession.d$ grep STARTUP *


看到50xfree86-common_determine-startup文件。里面有

if [ -z "$STARTUP" ]; then
if [ -x /usr/bin/x-session-manager ]; then
STARTUP=x-session-manager
elif [ -x /usr/bin/x-window-manager ]; then
STARTUP=x-window-manager
elif [ -x /usr/bin/x-terminal-emulator ]; then
STARTUP=x-terminal-emulator
fi
fi

即设置启动程序,实际上设置STARTUP变量,如果以上程序都没有找到,则会报错退出,即X环境没有被启动。再运行

xdkui@Debian:/etc/X11/Xsession.d$ grep STARTUP *


看到优先级最低也即最后被运行的99xfree86-common_start文件,里面只有一句话:

exec $STARTUP

好了,到这里就启动我们的X client了,终于完了^_^。

         总结下这第一种方式的启动过程,简单的说就是依次顺序查找/usr/bin/x-session-manager ,x-window-manager,/usr/bin/x-terminal-emulator 这三个文件。如果存在则启动之,也即X client。如果三个都不存在则报错退出了。看/usr/bin/x-session-manager文件可以看到是个符号连接,最终连接到 /usr/bin/gnome-session,也就是gnome 了。至于我们在gnome 启动时可能会设置启动输入法等程序,那就归gnome-session管了,也就不再分析了。可以试着把/usr/bin/x-session- manager 改为指向xfce4-session(如果安装了的话) ,再startx就会启动xfce4环境了。大概RedHat的switchdesk工具就是改这个连接实现的吧?。或者删掉/usr/bin/x- session-manager ,再startx,只启动了/usr/bin/x-window-manager 所指向的window manager了吧,我这里是blackbox。

           下面看第二种情况,即用户目录的xinitrc文件$HOME/.xinitrc。对比hiweed-debian-desktop_0.55_i386,存在$HOME/.xinitrc文件,在里面有exec xfce4-session。故其X client可以说最主要的x-session-manger是从$HOME/.xinitrc启动的。也就不会经过上面第一种情况的执行过程了。

          终于把gnome(或者说x-session-manger)的启动过程弄明白了,下面说点别的吧。xinit程序同时启动X server和X client,这在单机上还可。要是位于网络上的两台电脑分别是client和server,则xinit就无能为力了。这时就得靠纯"手工"来启动X 了。下面简单的"手工"启动X server和X client:在CUI模式下运行命令:

xdkui@Debian:~$X :1&

看到了一个灰色的全屏幕和一个鼠标指针,这就是X server了,其屏幕编号为1。下面构造X client,按Ctrl+Alt+F1回到刚才的CUI(Ctrl+Alt+F7对应本机的第一个启动的X server,Ctrl+Alt+F8对应第二个,有人说F7对应屏幕编号为0的X server实际上是不对的,如果第一个启动的屏幕编号为1,第二个启动的编号为0,则F7对应1屏幕,F8对应0屏幕),运行命令: xdkui@Debian:~$xeyes -display localhost:1&
然后按Ctrl+Alt+F7,看到我们的X client也就是xeyes了吧。再回到CUI,运行

xdkui@Debian:~$X&

开启一个屏幕编号0的X server,CUI下再运行

xdkui@Debian:~$xterm&

这时Ctrl+Alt+F7对应屏幕编号1;而F8对应屏幕编号0,且其X client为xterm。先退出上面的两个X server,下面复杂点手动启动我们的gnome吧,首先

xdkui@Debian:~$X&


然后

xdkui@Debian:~$gnome-session

看到的就和用startx 启动的X一样了,这时X server是X这个程序,X client是gnome-session及其启动的窗口管理器等程序。看到这里感觉xinit用处并不大(??不知是否正确),简单的脚本就可以实现。本来想把xinit反汇编了分析下,可懒得搞了^_^这是位于本机的情况,对于X server和X client位于不同主机的情况见下面本文第三部分。
个人感觉对于X Window System,搞清楚X server与X client关系很重要。一般X server很简单,就是/usr/bin/X11/X程序;X client则花样繁多,从高级的CDE,GNOME,KDE,到低级一点的只有twm,Window Maker,blackbox等窗口管理器,再到最简陋的只有xterm,rxvt,xeyes等单个x程序。正是由于X client的各种搭配,使得我们的X Window System看起来多样化。这可能也是X Window System最大的卖点之一吧 ^_^

三) 跨网络运行X Window System

        一般用来做服务器的系统(Linux,FreeBSD,Solaris等等) 都不会装X server,甚至很多都没有显示器。这样可以在这些系统里安装简单的X client,以GUI的方式远程显示在管理员们所坐的X server里。我们实验室用FreeBSD做网关,提供WWW,FTP服务,一般在管理员的本地机器起个X server,然后ssh或telnet上网关运行X client程序显示在本地显示器上,当然,也可用XDMCP(X Display Manager Control Protocol),man xsession里提到/etc/X11/Xsession一般被startx(我的/etc/X11/xinit/xinitrc里调用 Xsession脚本)或display manager调用,但有的display manager只调用Xsession而不是xinitrc,故为了startx和display manager两种方式下都可正常启动GUI,最好把X client启动的程序放在Xsession文件里。远程运行X client程序需要设置DISPLAY环境变量,设置为 主机名称:屏幕编号(如192.168.1.2:0,则表示X server是192.168.1.2这台机器上的0号屏幕);或是给X client程序加个—display参数。由于条件限制,只测试了位于TCP/IP网络环境,X server为192.168.1.2,X client为192.168.1.1。

1) Windows系统做X server

a) 用ssh或telnet方式
       Windows下面的X server软件有很多种,我这里使用X-win32。在Windows里运行X-win32程序,则相当于本地机器是个X server。远程登录上Debian(我这里是用VMware仿真网络环境,直接进虚拟机即可^_^),运行:

xdkui@xclient:~$export DISPLAY=192.168.1.2:0
xdkui@xclient:~$xterm&


这时即在Windows里的X server里看到了xterm了,至于X client还运行什么程序就看你的需要了,文件管理器阿,资源查看器等。当然,这里X-win32要设置好授权,好像默认是禁止接入控制,即任何X client都可使用这个X server。
b) XDMCP方式
        常见的Display Manager有xdm,gdm,kdm等。我这里使用的是gdm。需要修改gdm的配置文件/etc/X11/gdm/gdm.conf,修改[xdmcp]段的Enable=true,使得可以远程登录,在X client运行gdm。
在X-win32里建一个XDMCP的session,查询方式,填入IP为运行gdm的机器地址。连接,即可看到登录界面,下面的就不用说了,享受吧

2) Linux与Linux互联

a) ssh或telnet方式
         在linux 本地起个X server,需要注意授权问题,建立文件/etc/X0.hosts,填入X client的IP192.168.1.1,其中X0.hosts表示本地第0个屏幕允许连接的X client地址,建立X1.hosts文件则是本地第1个屏幕允许连接的X client地址,以此类推,man xserver里有。运行

xdkui@xserver:~$X&

运行该程序时别加-nolisten参数,否则不会在网络上侦听。
这个时候Ctrl+Alt+F7是X server,返回Ctrl+Alt+F1还可以ssh上X client机器上。
然后登录上X client,运行

xdkui@xclient:~$xterm –display 192.168.1.2:0

即可在本地的X server里看到xterm了,如果有的话,还可把gnome-session也显示在本地来。同样可以在linux里的VMware里做这个测试,需要用点手腕了^_^见下
b) XDMCP方式
         在我们的X client里运行gdm(别忘了修改gdm.conf),然后在本地X server的CUI下面运行X -query 192.168.1.1(X client开gdm机器的地址)。可以看到登录界面了吧。
我是在linux里的VMware里做的测试,说说所用的手腕吧。在Ctrl+Alt+F1的CUI下正常运行startx&启动GUI,这时 Ctrl+Alt+F7即为我的X server,X client启动的gnome,然后在这里运行VMware打开Debian虚拟机,并运行gdm。然后回到Ctrl+Alt+F1,运行X :1 -query 192.168.1.1。看到登录界面了吧。这时Ctrl+Alt+F7为我的0号屏幕,里面运行了虚拟机。Ctrl+Alt+F8为1号屏幕,在远程 GUI登录X client。相当于我在本地起了两个X server。

X Window System设计的真是相当神奇,使用方法更是眼花缭乱。佩服………

PS:这篇文章参考了人民邮电出版的《X Window彻底研究》,有小部分是里面的原话。有兴趣可以看看,不过里面只有2~3章值得一看,不到一个小时即可翻完,但确有助于理解X Window System。打了这么多字,希望对想了解的朋友有帮助,不然可就辛苦我了阿,小弟水平有限,如有错误之处,还请指正^_^



--
一步一步教你从互联网赚钱 http://www.zqzn.com/index.asp?rid=key480769
投资理财 http://li-cai.blogspot.com/
 
2007-10-27

2007年10月24日星期三

编程内核


 make-kpkg --revision tchai.0818 \
          --append-to-version .kov \
          --config menuconfig \
            kernel_image modules_image


make-kpkg --rootcmd fakeroot \
          --revision tchai.0818 \
          --append-to-version .kov \
          --config menuconfig \
            kernel_image modules_imageo


有时还是直接编译成binary-arch好,还可以生成kernel-headers,方便其它模块的编译, 比如alsa
nvidia等。。。

对于2.4的,偶经常是
$make-kpkg --rootcmd fakeroot binary-arch
对于2.6的,
$make-kpkg --rootcmd fakeroot --initrd binary-arch

需要的时候直接dpkg -i安装上。

make-kpkg --revision $1 --append-to-version $2 kernel_image modules_image



--
一步一步教你从互联网赚钱 http://www.zqzn.com/index.asp?rid=key480769
投资理财 http://li-cai.blogspot.com/

直接从XP/W2K下通过硬盘启动来进行Ubuntu网络安装

直接从XP/W2K下通过硬盘启动来进行网络安装

只需要下载6M的文件,就可以从XP/W2K下通过硬盘启动来进行网络安装。
一:安装GRUN
  1. 下载GRUB   GRUB
  2. grldr 复制到 C:\,编辑C:\BOOT.INI,加入一行:
    C:\GRLDR="GRUB"
    注意:在下载的过程中,IE有时会自动加上.Dat的扩展名,如果如此,将文件名 grldr.dat 改为 grldr .

二:下载并设置安装包

1.   下载 netboot.tar.gz

2.   解压缩,提取 ubuntu-install/i386/ 目录下的 linuxinitrd.gz 到 C:\

三:重新启动计算机,按 c 进入 grub 命令行 根据下载的文件存放的位置,输入并回车:
    grub>kernel (hd0,0)/linux root=/dev/ram ramdisk_size=20000 devfs=mount,dall

    grub>initrd (hd0,0)/initrd.gz

    grub>boot

    这样,就可以开始安装了。

    注意:如果使用代理服务器或自己内部的源,有可能出现长时间的停顿,一共会出现两次。第一次手工设置完毕镜像后,如果出现停顿,使用 Alt+F2 切换到其它的控制台,使用 ps -LA 查看全部进程,将两个 wget 的进程 kill 掉,就可以再使用 alt+F1 切换回去,进行下一步的代理服务器设置,第二次也是在设置镜像之后。同样切换到控制台使用 ps -LA 查看全部进程,将一个最后名为 http 的进程 kill 掉,就可以同样再使用 alt+F1 切换回去开始安装系统了。

--
一步一步教你从互联网赚钱 http://www.zqzn.com/index.asp?rid=key480769
投资理财 http://li-cai.blogspot.com/

做张grub启动盘

http://dev.csdn.net/article/70/70523.shtm

有时候我们的电脑可能出现系统无法引导的情况,比如说你重装了windows,把MBR给重写了,又比如像我今天这样,把装了grub的系统给格了,电脑启动后无法读到引导信息出错,什么系统都进不了了。
这时你当然可以用安装时或什么管你什么时候做的启动盘启动LINUX(然后再进行修复),用windows启动盘启动windows。
但这样你得至少做两张启动盘啊(呵呵,当然用loadlin之类的也行,不过我觉得更麻烦)。而且你每装一个LINUX就得做一张启动盘,不是很麻烦吗?
其实没有那么麻烦,只要你用grub做的引导,就很容易了,那么就是做一张grub启动盘.
这样你就相当于把grub装到了软盘上,利用一些grub命令就可以做到你的MBR没有被破坏前能做的所有事。而且,你在A机器上做的启动盘还可以拿到B、C、D……等等其它机器上用。
制作方法:

首先你用的引导程序必须是grub。
确认了这一点之后进入/boot/grub目录:
cd /boot/grub
然后把stage1和stage2两个文件写到你的软盘上去(呵呵,当然别忘了把软盘放进去哦):
dd if=stage1 of=/dev/fd0 bs=512 count=1
dd if=stage2 of=/dev/fd0 bs=512 seek=1

这样一张grub引导盘就做好了,下面就谈谈使用方法(虽然很简单,但还是怕有人不清楚)

首先用这张启动盘启动后会出现一些关于grub的信息,然后就是如下:
grub>
这就是在等你输入grub命令来启动系统。
对于LINUX,一般需要如下三个命令:
root,kernel,boot.
ROOT命令就是让你告诉GRUB,你的LINUX系统装在哪个分区,KERNEL命令就是让你指出用哪个内核启动,BOOT当然就是开始引导啦。
举个例子:
grub>root (hd0,
File system Type is ext2fs.(这一行告诉你文件系统是什么,详细的显示内容可能跟我写的不一样)
grub>kernel /boot/vmlinuz ro root=/dev/hda9
grub>boot

这样你的LINUX系统就启动了,注意的一点是GRUB中关于分区的叫法跟LINUX有点不一样,比如上面的(hd0,就表示hda9.是的,hdX就代 表第X+1个硬盘,hd0就代表第1个硬盘(相当于hda),8就代表第9个分区(GRUB中的表示方法跟C语言有点像,下标是从0开始的),(hd0, 当然就是代表hda9啦。
知道这些应该知道怎么引导LINUX系统了吧?注意一点,如果你不清楚具体的内核文件名(比如有的可能是vmlinuz-2.4.20什么的),那么你可 以用TAB键自动补全,相当方便,你只要打入kernel /boot/vm然后再按一下TAB键,那么就会显示全部在/boot/下以vm开头的文件。

引导其它系统就方便多了(比如windows,FreeBSD等),你要做的也是三个命令,ROOT跟BOOT命令跟LINUX一样,反正就是用ROOT 命令指定你装的这个系统所在的分区,BOOT命令就是开始引导系统。不同的是把引导linux的kernel命令改成chainloader +1命令。例如:

grub>root (hd0,0)
File System Type Vfat
grub>chainloader +1
grub>boot


呵呵,好了,把你做好的grub启动盘好好保存起来吧,以后装LINUX的时候它如果问你要不要做启动盘时你都可以大胆地说:NO!。因为你的这张grub启动盘基本上可以应付大部分无法启动的情况了。
呵呵,不过这种启动盘无法应付严重的系统错误(比如内核文件受到破坏什么的等等),但是这样的情况我还没有遇见过,我需要启动盘的情况往往是因为引导程序出了问题,比如重装WINDOWS,比如GRUB被我搞掉了等等。'



--
一步一步教你从互联网赚钱 http://www.zqzn.com/index.asp?rid=key480769
投资理财 http://li-cai.blogspot.com/

2007年10月22日星期一

一个muse设置和例子

;;-*- elisp -*-
;;-*- encoding: UTF-8 -*-

(require 'muse-mode)
(require 'muse-wiki)
(require 'muse-html)
(require 'muse-latex)
(require 'muse-texinfo)
(require 'muse-docbook)

;; 我的 MUSE 工程设置。
(require 'muse-project)
(setq muse-project-alist
'(("ExaosWiki" ;; 我的个人 Wiki
("~/Documents/MyWiki" :default "index")
(:base "html" :path "~/Documents/MyWiki/html")
;(:base "pdf" :path "~/Documents/MyWiki/pdf")
(:base "latexcjk" :path "~/Documents/MyWiki/tex")
)
("WorkWiki" ;; 我的工作 Wiki
("~/Documents/MyWorkWiki" :default "index")
(:base "html" :path "~/Documents/MyWorkWiki/html")
;(:base "pdf" :path "~/Documents/MyWorkWiki/pdf")
(:base "latexcjk" :path "~/Documents/MyWiki/tex")
)
))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq muse-wikipedia-country "zh") ;; WikiPedia 的国家代码
(setq muse-file-extension "wiki") ;; 文件扩展名
(setq muse-mode-auto-p t) ;; 自动加载 muse-mode
;; Muse LaTeX CJK 设置
(setq muse-latexcjk-encoding-default "{GBK}{song}") ; "{UTF8}{song}")
(setq muse-latexcjk-footer "
%\\end{CJK*}
\\end{document}
")
(setq muse-latexcjk-header "%\\documentclass{article}
\\documentclass{ctexart}
%\\usepackage[encapsulated]{CJK}
%\\usepackage{ucs}
%\\usepackage[utf8x]{inputenc}
\\usepackage{indentfirst}
\\usepackage[CJKbookmarks=true]{hyperref}
\\usepackage[pdftex]{graphicx}
\\newcommand{\\comment}[1]{}

\\begin{document}
%\\begin{CJK*}(muse-latexcjk-encoding)

\\title{(muse-publishing-directive \"title\") }
\\author{(muse-publishing-directive \"author\")}
\\date{(muse-publishing-directive \"date\")}

\\maketitle

(and muse-publish-generate-contents
(not muse-latex-permit-contents-tag)
\"\\\\tableofcontents
\\\\newpage\")

")



--
一步一步教你从互联网赚钱 http://www.zqzn.com/index.asp?rid=key480769
投资理财 http://li-cai.blogspot.com/

procmail使用

procmail不区分大小写,它使用Unix最常用的模式匹配方式进行匹配特定的邮件。因此使用这些匹配模式和procmail规则,可以定义一个更复杂的.procmailrc:

  
PATH=$HOME/bin: /usr/bin: /usr/ucb: /bin: /usr/local/bin:.
SHELL=/bin/sh
MAILDIR=$HOME/mail
DEFAULT=$MAILDIR/mailbox
LOGFILE=/dev/null
SENDMAIL=/usr/lib/sendmail
:0:
* ^From.*badguy     
/dev/null/
:0c:
* ^(From|Cc|To).*freebsd.org
| gzip >> freebsdmail.gz
:0:
* ^From.*@hotmail.com
* ^Subject:.*(joke|funny)
{
  :0 c
  ! friend1@hotmail.com friend2@usa.net
  :0
  joke
}
:0
* ^Subject:.*order
* !^FROM_DAEMON
* !^X-Loop: marketing@company.com
{
  :0 h c
  | (formail -r -A"X-Loop: marketing@company.com " ; \
  cat /market/acknowlegement.txt ) | $SENDMAIL -t
  :0 c
  ! market2@company.com
  :0
  market
}

  这个配置文件的第一部分中设置了几个环境变量,用于设置procmail的运行环境,其中将 MAILDIR设置为~/mail,与pine使用的目录相同,因此这将使pine能直接读取procmail处理过的邮件。

  第二部分中为邮件定义了三个不同的过滤规则及相应的处理操作,第一个规则将来自badguy 的邮件滤掉(输出到/dev/null);第二个规则将与freebsd.org的通信使用gzip保存到freebsdmail.gz 中,用于保存相应maillist的邮件;第三个规则将某个使用hotmail帐号的朋友,并使用joke或funny标题给自己发送笑话的邮件同时转给其他几个朋友,并同时保存在joke文件夹中;最后一个规则是设置了一个自动回复邮件系统,对于使用order做标题,并且没有FROM_DAEMON行(自动邮件回复程序使用FROM_DAEMON 作标记,通常不需要回复这些的邮件,否则会造成回复循环),并且没有包括X-Loop行的邮件进行处理:

  首先将X-Loop行添加到邮件中(使用formail将它们添加到mail的信封上),以免造成对同一个邮件的循环处理,然后将文件/market/acknowlegement.txt发回给发送者;并以及转发邮件,在market中保存邮件。

  根据这些规则,使用Procmail就能完整的处理各种邮件,减轻电子邮件不断增多而造成的困扰。

Procmail的使用

       Procmail 是一个邮件过滤工具,可以根据邮件的发信人、主题、长度以及关键字 等对邮件进行排序、分类、整理等工作,特别是在你订阅了邮件列表的时候显得 非常有用。
 

Procmail 的配置文件是 ~/.procmailrc 。配置非常简单,首先是一些选项,后 面则是一些过滤规则,如:

# -*- Conf -*-
MAILDIR=$HOME/Maildir/
ORGMAIL=/var/mail/$USER
LOGFILE=$HOME/.maillog
SHELL=/bin/zsh
LOCKFILE=$HOME/.lockmail
VERBOSE=no

# webmaster always sends junk mail~~
:0
* ^From:
webmaster@st\.zju\.edu\.cn
/dev/null

# all other mail goes to inbox
:0:
inbox/

Procmail 使用 recipe 来决定处理哪些邮件以及如何处理他们。一个 recipe 有这种格式:
:0 [flags] [ : [locallockfile] ]
<zero or more conditions (one per line)>
<exactly one action line>
conditions 以 * 开头,为其后到行尾的所有内容,当然除去头和尾的空格。它会送入 egrep 做正则表达式匹配。若conditions以 ! 开始,表示其后条件的反;若以 $ 开始,表示其后的部分要用sh来扩展;若以 ? 开始,表示使用其后跟的命令的返回值做判断;若以 < 或 > 开始,表示邮件长度。

接下来是 action line 。如果以 ! 开头,则对邮件进行 forward 到指定的地 址;如果是以 | 开头则是启动相应的程序;以 { 开头则可以指定嵌套的 recipe ;其他情况则被视为本地邮箱,如果是一个目录,则表示 maildir 格式, 否则是 mbox 格式。

flags 具体可以参见 man procmailrc ,后面如果加上冒号则表示对文件进行锁 定,这样可以避免同时运行几个 Procmail 操纵相同的文件的时候造成混乱。这里给出几个: D 表示大小写敏感模式;c 表示处理邮件的复件,在一个嵌套的recipe块中可以产生连续处理的效果。
 
几个常用的环境变量,具体的请参考man手册。
MAILDIR :当前目录
DEFAULT :缺省的mailbox文件
LOGFILE :信息记录文件
SENDMAIL :指定forward用的程序:处理的命令其实是: "$SENDMAIL" $SENDMAILFLAGS "$@"
LINEBUF:指定一行可以容纳的最多字符数
 
还有一些预定义好的表达式可以用:
^TO_ :匹配收件人包含后面跟的address
^TO :匹配收件人包含后面跟的word
^FROM_DAEMON :可以匹配大部分的自动邮件,
^FROM_MAILER :可以匹配大部分的系统产生的邮件
 
在表达式中,若有 \/ 出现,则这个表达右边的匹配部分会放入变量 MATCH 中。
 
几个好的例子:
 

# DISPLAY from and subject ON THE SCREEN!
:0 c
* ^Subject:.*\/.*
{
    SUBJECT=$MATCH

    :0 ih
    * ^From: .*\/[^<]*
    | echo "$SUBJECT from $MATCH"
}

 

              :0
              * ^From.*peter
              * ^Subject:.*compilers
              {
                 :0 c
                 !
william@somewhere.edu

                 :0
                 petcompil
              }

 

对系统邮件,存入 postm 中
              :0:
              * ^FROM_MAILER
              postm
 

              :0 Whc: vacation.lock
               # Perform a quick check to see if the mail was addressed to us
              * $^To:.*\<$\LOGNAME\>
               # Don't reply to daemons and mailinglists
              * !^FROM_DAEMON
               # Mail loops are evil
              * !^X-Loop: your@own.mail.address
              | formail -rD 8192 vacation.cache

                :0 ehc         # if the name was not in the cache
                | (formail -rI"Precedence: junk" \
                     -A"X-Loop: your@own.mail.address " ; \
                   echo "I received your mail,"; \
                   echo "but I won't be back until Monday."; \
                   echo "-- "; cat $HOME/.signature \
                  ) | $SENDMAIL -oi -t

copy all you mail to your an other account

              :0 c
              * !^X-Loop:
yourname@your.main.mail.address
              | formail -A "X-Loop: yourname@your.main.mail.address" | \
                 $SENDMAIL -oi
yourname@the.other.account

  sends  back at most one file per request, it ignores the body of incoming mails, the Subject: line has to look  like "Subject: send file the_file_you_want" (the blanks are significant), it does not return files that have names starting with a dot, nor does  it allow  files  to be retrieved that are outside the fileserver directory  tree (if you decide to munge this example, make sure you do  not  inadvertently loosen this last restriction).
              :0
              * ^Subject: send file [0-9a-z]
              * !^X-Loop:
yourname@your.main.mail.address
              * !^Subject:.*Re:
              * !^FROM_DAEMON
              * !^Subject: send file .*[/.]\.
              {
                MAILDIR=$HOME/fileserver # chdir to the fileserver directory

                :0 fhw                   # reverse mailheader and extract name
                * ^Subject: send file \/[^ ]*
                | formail -rA "X-Loop:
yourname@your.main.mail.address"

                FILE="$MATCH"            # the requested filename

                :0 ah
                | cat - ./$FILE 2>&1 | $SENDMAIL -oi -t
              }

--
一步一步教你从互联网赚钱 http://www.zqzn.com/index.asp?rid=key480769
投资理财 http://li-cai.blogspot.com/

开通Yahoo邮箱的POP3功能



雅虎邮箱,终生伙伴!

2007年10月21日星期日

[转]图解我的股票买卖思路

图解我的股票买卖思路 [原创 2007-10-21 15:06:39 ] 发表者: 涨停教主

上周末《与朋友们告个别》中,对其中的两个股票买卖操作,希望股友们能解读出其中的买卖依据,可惜应者寥寥,现在图解一下当时我的思路,供朋友们参考,如果有高手读到本文,鄙人还是希望能看到不同角度的真知灼见

     一、002154的买卖思路

   1、买入前的K线图分析和分时图

查看更多精彩图片
查看更多精彩图片

    2、卖出时K线图分析和分时图

查看更多精彩图片
查看更多精彩图片

      二、 600477的买卖思路

    1、买入前K线图分析和分时图

查看更多精彩图片
查看更多精彩图片



   2、卖出时的K线分析和分时图

查看更多精彩图片
查看更多精彩图片



--
一步一步教你从互联网赚钱 http://www.zqzn.com/index.asp?rid=key480769
投资理财 http://li-cai.blogspot.com/

买卖股票思路

上周末《与朋友们告个别》中,对其中的两个股票买卖操作,希望股友们能解读出其中的买卖依据,可惜应者寥寥,现在图解一下当时我的思路,供朋友们参考,如果有高手读到本文,鄙人还是希望能看到不同角度的真知灼见

     一、002154的买卖思路

   1、买入前的K线图分析和分时图

查看更多精彩图片
查看更多精彩图片

    2、卖出时K线图分析和分时图

查看更多精彩图片
查看更多精彩图片

      二、 600477的买卖思路

    1、买入前K线图分析和分时图

查看更多精彩图片
查看更多精彩图片



   2、卖出时的K线分析和分时图

查看更多精彩图片
查看更多精彩图片



--
一步一步教你从互联网赚钱 http://www.zqzn.com/index.asp?rid=key480769
投资理财 http://li-cai.blogspot.com/

2007年10月19日星期五

你的MSN和GTalk可以做什么?

1、当然是聊天;
2、GTalk可以直接与MSN,Yahoo,ICQ通话;
3、发布MiniBlog到Twitter类网站,国内的有:zuosa.com,fanfou.com,叽歪,微客等;
4、发布博客到wordpress类,livejournal,Blogger等;这里要用到IMified网站的服务;
     在IMified中,还有很多其它的服务, 如del.icio.us等可以用,并且它有开放的API可以用
5、利用http://scheduler.lenovolabs.com/,做事务、任务管理
6、利用http://www.9fav.com/,收藏书签

--
一步一步教你从互联网赚钱 http://www.zqzn.com/index.asp?rid=key480769
投资理财 http://li-cai.blogspot.com/

看看你的E-Mail可以做什么?

1、当然是收发邮件了;
2、可以注册、使用MSN和Google的相关服务;
     这样,对Google的Group,你可以用E-Mail进行收发操作;
3、发布Blog;
     支持的博客系统包括:blogger.com 和 MSN Spaces。需要做相关设置
4、传送照片到网络相册中;
     支持的系统包括:yupoo,flickr,photobucket等
5、上传文件到网络硬盘;
     支持的系统包括:box.net,esnips.com


--
一步一步教你从互联网赚钱 http://www.zqzn.com/index.asp?rid=key480769
投资理财 http://li-cai.blogspot.com/

Zoundry的MSN空间的设置


原来用户名要用你空间的名字,如我的空间地址是 http://ustc-num.spaces.live.com/ ,那么用户名是ustc-num;而密码用的是你的空间设置中:"选项->电子邮件发布"页面中的"机密字"。空间的API地址是: https://storage.msn.com/storageservice/MetaWeblog.rpc




Technorati : ,
Del.icio.us :

2007年10月15日星期一

年轻漂亮MM想嫁有钱人 金融家的回复令人拍案叫绝

一个年轻漂亮的美国女孩在美国一家大型网上论坛金融版上发表了这样一个问题帖:我怎样才能嫁给有钱人?
  
    "我下面要说的都是心里话。本人25岁,非常漂亮,是那种让人惊艳的漂亮,谈吐文雅,有品位,想嫁给年薪 50万美元的人。你也许会说我贪心,但在纽约年薪100万才算是中产,本人的要求其实不高。
  
    这个版上有没有年薪超过 50万的人?你们都结婚了吗?我想请教各位一个问题——怎样才能嫁给你们这样的有钱人?我约会过的人中,最有钱的年薪 25万,这似乎是我的上限。要住进纽约中心公园以西的高尚住宅区,年薪25万远远不够。我是来诚心诚意请教的。有几个具体的问题:一、有钱的单身汉一般都在哪里消磨时光? (请列出酒吧、饭店、健身房的名字和详细地址。)二、我应该把目标定在哪个年龄段?三、为什么有些富豪的妻子看起来相貌平平?我见过有些女孩,长相如同白开水,毫无吸引人的地方,但她们却能嫁入豪门。而单身酒吧里那些迷死人的美女却运气不佳。四、你们怎么决定谁能做妻子,谁只能做女朋友? (我现在的目标是结婚。)"——波尔斯女士
  
    下面是一个华尔街金融家的回帖:
  
    "亲爱的波尔斯:我怀着极大的兴趣看完了贵帖,相信不少女士也有跟你类似的疑问。让我以一个投资专家的身份,对你的处境做一分析。我年薪超过50万,符合你的择偶标准,所以请相信我并不是在浪费大家的时间。
  
    从生意人的角度来看,跟你结婚是个糟糕的经营决策,道理再明白不过,请听我解释。抛开细枝末节,你所说的其实是一笔简单的"财""貌"交易:甲方提供述人的外表,乙万出钱,公平交易,童叟无欺。但是,这里有个致命的问题,你的美貌会消逝,但我的钱却不会无缘无故减少。事实上,我的收入很可能会逐年涕增.而你不可能一年比一年漂亮。
  
    因此,从经济学的角度讲,我是增值资产,你是贬值资产,不但贬值,而且是加速贬值!你现在25,在未来的五年里,你仍可以保持窈窕的身段,俏丽的容貌,虽然每年略有退步。但美貌消逝的速度会越来越快,如果它是你仅有的资产,十年以后你的价值甚忧。
  
    用华尔街术语说,每笔交易都有一个仓位,跟你交往属于"交易仓位"(tradingl position),一旦价值下跌就要立即抛售,而不宜长期持有——也就是你想要的婚姻。听起来很残忍,但对一件会加速贬值的物资,明智的选择是租赁,而不是购入。年薪能超过50万的人,当然都不是傻瓜,因此我们只会跟你交往,但不会跟你结婚。所以我劝你不要苦苦寻找嫁给有钱人的秘方。顺便说一句,你倒可以想办法把自己变成年薪50万的人,这比碰到一个有钱的傻瓜的胜算要大。
  
    希望我的回帖能对你有帮助。如果你对"租赁"感兴趣,请跟我联系。"——罗波.坎贝尔(J·P·摩根银行多种产业投资顾问)

--
一步一步教你从互联网赚钱 http://www.zqzn.com/index.asp?rid=key480769
投资理财 http://li-cai.blogspot.com/