Name | HTML | Result |
---|---|---|
Copyright Trademark Cent Degree sign double-less than micron Midline dot Negation, continuation line Paragraph Plus/Minus British Pound double greater than Section Yen | © ® ¢ ° « µ · ¬ ¶ ± £ » § ¥ | © ® ¢ ° « µ · ¬ ¶ ± £ » § ¥ |
星期二, 十二月 18, 2007
html special character
星期一, 十二月 10, 2007
My blog is removed from GOOGLE search results
I paste the guidelines:
- Avoid hidden text or hidden links.
- Don't use cloaking or sneaky redirects.
- Don't send automated queries to Google.
- Don't load pages with irrelevant keywords.
- Don't create multiple pages, subdomains, or domains with substantially duplicate content.
- Don't create pages that install viruses, trojans, or other badware .
- Avoid "doorway" pages created just for search engines, or other "cookie cutter" approaches such as affiliate programs with little or no original content.
- If your site participates in an affiliate program, make sure that your site adds value. Provide unique and relevant content that gives users a reason to visit your site first.
It's such a terrible thing.
change icon of google page create
<link rel="icon" href="http://www . yoursite . com/favicon . ico"
type="image/x-icon" />
<link rel="shortcut icon" http://www . yoursite . com/favicon . ico" type="image/x-icon" />
星期日, 十二月 09, 2007
MFA and Filter Adsense to Get high Ads
They bid extremely low on adwords and their ads you get on your site pay low (like your 0.05).
Filtering some MFA sites can get better results for you.
Have google adsense preview tool and preview the ads that are appearing in US and UK,
there's a "Show Ad URL" option,
check the url to decide if it's an MFA site and filter it in your adsense acount.
It helped me a lot. i now have 1-4$ per click ads on my page.
Keywords CTR and Conversion
There are so many other variables to take into account. My own initial target is a 5% CTR and go from there but revise it depending on circumstances. However, having managed many campaigns for others, there occasionally are things which you can't explain.
Example 1: a client of mine selling aquarium products is in first or second position for most keywords. But, the CTR is low in the 2-3% range and sometimes lower for some categories. Why when he is near or often at the top? I would expect the CTR to be near or easily breaking the 10% barrier in this case. Sometimes it just is and can't explain why people are not clicking on the ad. The first thing to look at is keywords, the next the ads (clickability). Obviously, there is something we have not yet figured out in that what they are searching for is not what the ad is offering. Negative keywords will help in weeding those out. Right now, the target is more like 2.5%. Tests by reducing the CPC to reduce the position and see how the CTR is affected are being conducted. Sometimes a lower position gives best results.
Example 2: another client decided to go and make his own ad (something I just hate when they do). I judge the client's ad very poor (not clickable). However, it does better by twice the CTR any of my ads, about 8% in sixth position. Can't figure out why. Again, one those things. I try to learn from it and testing new ads to try to better his CTR.
As for the conversion rate, I want a rate that will still yield a profit at the average cost per click the client is paying. This means testing not only different ads but different page copy. I normally stop a campaign if it can't bring at least a 1% conversion. Factors to take into consideration are the product and the competition. I have my own scale created based on Adwords' own Quality Score terms. It is not set in stone for every product but used as a general reference.
A conversion rate is considered Poor if it is under 1.25%. It is OK between 1.25 and 2%, Good between two and three percent and Great over three percent. I sometimes go even further by calling it Super if it is over five percent.
But a conversion rate can be considered Great if it is 1%, in a niche with lots of competitors, 500 daily visitors from clicks, an actual CPC of 10 cents on a product selling for $100 with an after-cost profit of $75 meaning a pure total daily profit of $325 after advertising costs on those five sales.
A lower CTR ad can be better than a higher one. It could have a much higher conversion rate than a higher CTR ad with a lower conversion. Which ad is best to use? Simply multiply the CTR and conversion rate. The ad with the higher number is the one giving the best returns, given everything else such as position and CPC are the same.
But it all means nothing if you can't make a profit.
Spam prevention robots
I have created a blog, and post some group content on it.
And After a week, I have received a mail and said the blog is spam.
It seems that there is a spam-prevention robots doing the detect work.
I really want to know how they judge the spam blog.
Following is some info:
Blogger's spam-prevention robots have detected that your blog has characteristics of a spam blog. (What's a spam blog?) Since you're an actual person reading this, your blog is probably not a spam blog. Automated spam detection is inherently fuzzy, and we sincerely apologize for this false positive.
We received your unlock request on December 9, 2007. On behalf of the robots, we apologize for locking your non-spam blog. Please be patient while we take a look at your blog and verify that it is not spam.
Find out more about how Blogger is fighting spam blogs.
星期四, 十二月 06, 2007
Python POP mail parse
先说接受邮件. poplib 方法.
1.poplib.POP3('这里填入你pop邮件服务器地址') 登陆服务器.
2.poplib.user('用户名 ') poplib.pass_('密码')
3.poplib.stat()方法返回一个元组:(邮件数,邮件尺寸)
mailCount,size=poplib.stat()
这样mailCount就是邮件的数量,size,就是所有邮件的大小.
3.poplib.rert('邮件号码')方法返回一个元组:(状态信息,邮件,邮件尺寸)
hdr,message,octet=server.retr(1) 读去第一个邮件信息.
hdr的内容就是响应信息和邮件大小比如'+OK 12498 octets'
message 是包含邮件所有行的列表.
octet 是这个邮件的内容.
得到的message是邮件的原始内容,也就是没有解码过的,里面的内容和标题基本上都是base64编码的,下面说说如何处理原始邮件.
python 的email库里提供了很多处理邮件的方法,我们先把原始邮件转成email实例,这样就可以用库方法处理邮件.
email.message_from_string() 这个方法能把String的邮件转换成email.message实例.
比如我们上面的message,向下面这样调用.
mail=email.message_from_string(string.join(message,'\n'))
这样我们就生成了一个email.Message实例
现在我们来提取邮件内容,和标题,mail支持字典操作.比如下面的操作.
mail['subject'] ,mail.get('subject')
mail['To'],mail.get('to')'
mail.keys() ,mail.items() 等等.
中文邮件的标题和内容都是base64编码的.解码可以使用email.Header 里的decode_header()方法.
比如 print mail['subject'] 显示的都未处理的编码.
'=?GB2312?B?UmU6IFtweXRob24tY2hpbmVzZV0g?=\n\t=?GB2312?B?y63E3LDvztLV0tbQzsS1xFBZVEhPTrP10afRp8+wtcTXysHP?='
email.Header.decode_header(mail['subject']) 下面是解码后的信息.
[('Re: [python-chinese] \xcb\xad\xc4\xdc\xb0\xef\xce\xd2\xd5\xd2\xd6\xd0\xce\xc4\xb5\xc4PYTHON\xb3\xf5\xd1\xa7\xd1\xa7\xcf\xb0\xb5\xc4\xd7\xca\xc1\xcf', 'gb2312')]
返回的是一个列表,里面的内容保存在一个元组里,(解码后的字串,字符编码)
显示解码后的标题就象下面这样
print email.Header.decode_header(mail['subject'])[0][0]
Re: [python-chinese] 谁能帮我找中文的PYTHON初学学习的资料
上面的mail标题编码是'gb2312'的,在我的winxp机器上可以直接显示,如果编码是别的比如'utf-8'编码,那么显示出来的就是 乱码了.所以我们需要使用unicode()方法,unicode('这里是string','这里是编码,比如UTF-8'),比如
subject=email.Header.decode_header(mail['subject'])[0][0]
subcode=email.Header.decode_header(mail['subject'])[0][1])
print unicode(subject,subcode)
Re: [python-chinese] 谁能帮我找中文的PYTHON初学学习的资料
下面看如何处理邮件内容.
mail里有很多方法,熟悉这些方法处理邮件就很容易了。
get_payload() 这个方法可以把邮件的内容解码并且显示出来.第一个可选择参数是mail实例,第二个参数是decode='编码' ,一般都是,'base64'编码
is_multipart(),这个方法返回boolean值,如果实例包括多段,就返回True,
print mail.is_multipart()
true ,这说明这个mail邮件包含多个字段。我下面的函数就可以处理,显示邮件的全部内容。
def showmessage(mail):
if mail.is_multipart():
for part in mail.get_payload():
showmessage(part)
else:
type=mail.get_content_charset()
if type==None:
print mail.get_payload()
else:
try:
print unicode(mail.get_payload('base64'),type)
except UnicodeDecodeError:
print mail
最后,有点要说明,如果邮件里的中文用mail.Header.decode_header()方法,和unicode()方法都不能正常显示,那么说明这个中文无法处理了,显示出来就是乱码.比如:看看看见,最终处理完成后,还是乱麻。
>;>;>;mail.get('subject')
'Re: [python-chinese] =?UTF-8?B?wrnDmMOTw5p4bWzCscOgw4LDq8K1w4TDjg==?=\n\t=?UTF-8?B?w4rDjMOi?='
>;>;>;decode_header( mail.get('subject'))
[('Re: [python-chinese]', None), ('\xc2\xb9\xc3\x98\xc3\x93\xc3\x9axml\xc2\xb1\xc3\xa0\xc3\x82\xc3\xab\xc2\xb5\xc3\x84\xc3\x8e\xc3\x8a\xc3\x8c\xc3\xa2', 'utf-8')]
>;>;>;print decode_header( mail.get('subject'))[1][0]
鹿脴脫脷xml卤脿脗毛碌脛脦脢脤芒
>;>;>;print unicode(decode_header( mail.get('subject'))[1][0],'utf-8')
1?óúxml±à??μ??êìa
python pop example
import poplib
import pprint
import email
import string
import re
import sys
import traceback
class GetMail():
def __init__(self,server,username,passwd):
self.servername = server
self.username = username
self.passwd = passwd
self.data = []
def connect(self):
try:
self.pop = poplib.POP3(self.servername)
self.pop.set_debuglevel (1)
self.pop.user(self.username)
self.pop.pass_(self.passwd)
return True
except:
print "--"*20
traceback.print_exc(file=sys.stdout )
print "--"*20
return False
def get_mail(self):
num,total_size = self.pop.stat()
for index in range(1, num+1):
status = self.pop.list(index)
length = string.atoi(string.split(status)[-1])
print "length %d" % length
if length < 50000:
hdr,messages,octet=self.pop.retr (index)
message = ""
for line in messages:
if line:
if line[-1] == "=":
message += line[0:-1]
else:
message += line
message += "\n"
else:
message += "\n"
print message
self.data.append(message)
if __name__ == "__main__":
gm =GetMail("pop3.126.com","*","*")
if not gm.connect():
print "connect error"
sys.exit(1)
gm.get_mail()
fileout = open("dafads","w")
for message in gm.data:
fileout.write (message)
fileout.write("-*-"*20)
fileout.write("\n\n")
星期三, 十二月 05, 2007
正则表达式 预搜索,不匹配;反向预搜索,不匹配
前面的章节中,我讲到了几个代表抽象意义的特殊符号:"^","$","\b"。它们都有一个共同点,那就是:它们本身不匹配任何字符,只是对 "字符串的两头" 或者 "字符之间的缝隙" 附加了一个条件。理解到这个概念以后,本节将继续介绍另外一种对 "两头" 或者 "缝隙" 附加条件的,更加灵活的表示方法。
正向预搜索:"(?=xxxxx)","(?!xxxxx)"
格式:"(?=xxxxx)",在被匹配的字符串中,它对所处的 "缝隙" 或者 "两头" 附加的条件是:所在缝隙的右侧,必须能够匹配上 xxxxx 这部分的表达式。因为它只是在此作为这个缝隙上附加的条件,所以它并不影响后边的表达式去真正匹配这个缝隙之后的字符。这就类似 "\b",本身不匹配任何字符。"\b" 只是将所在缝隙之前、之后的字符取来进行了一下判断,不会影响后边的表达式来真正的匹配。
举例1:表达式 "Windows (?=NT|XP)" 在匹配 "Windows 98, Windows NT, Windows 2000" 时,将只匹配 "Windows NT" 中的 "Windows ",其他的 "Windows " 字样则不被匹配。
举例2:表达式 "(\w)( (?=\1\1\1)(\1) )+" 在匹配字符串 "aaa ffffff 999999999" 时,将可以匹配6个"f"的前4个,可以匹配9个"9"的前7个。这个表达式可以读解成:重复4次以上的字母数字,则匹配其剩下最后2位之前的部分。当然,这个表达式可以不这样写,在此的目的是作为演示之用。
格式:"(?!xxxxx)",所在缝隙的右侧,必须不能匹配 xxxxx 这部分表达式。
举例3:表达式 "((?!\bstop\b ).)+" 在匹配 "fdjka ljfdl stop fjdsla fdj" 时,将从头一直匹配到 "stop" 之前的位置,如果字符串中没有 "stop",则匹配整个字符串。
举例4:表达式 "do(?!\w)" 在匹配字符串 "done, do, dog" 时,只能匹配 "do"。在本条举例中,"do" 后边使用 "(?!\w)" 和使用 "\b" 效果是一样的。
反向预搜索:"(?<=xxxxx)","(?<!xxxxx)"
这两种格式的概念和正向预搜索是类似的,反向预搜索要求的条件是:所在缝隙的 "左侧",两种格式分别要求必须能够匹配和必须不能够匹配指定表达式,而不是去判断右侧。与 "正向预搜索" 一样的是:它们都是对所在缝隙的一种附加条件,本身都不匹配任何字符。
举例5:表达式 "(?<=\d{4}) \d+(?=\d{4})" 在匹配 "1234567890123456" 时,将匹配除了前4个数字和后4个数字之外的中间8个数字。由于 JScript.RegExp 不支持反向预搜索,因此,本条举例不能够进行演示。很多其他的引擎可以支持反向预搜索,比如:Java 1.4 以上的 java.util.regex 包,.NET 中System.Text.RegularExpressions 命名空间,以及本站推荐的最简单易用的 DEELX 正则引擎。
扑克 与 历法 zz
许多人会利用扑克牌进行各种游戏娱乐活动,但懂得扑克经的人恐怕为数不多。扑克是历法的缩影。
五十四张牌中,有五十二张是正牌,表示一年有五十二个星期;两张是副牌,大王代表太阳,小王代表月亮;一年四季春、夏、秋、冬,用桃、心、梅、方来表示,其中红心、方块代表白昼,黑桃、梅花代表黑夜。
每一季是十三个星期,扑克中每一花色正好是十三张牌;每一季是九十一天,十三张牌的点数相加正好是九十一。四种花色的点数加起来,再加上小王的一点,是三百六十五。如果再加上大王的一点,那就正好是闰年的天数。
扑克中的 J、Q、K 共十二张牌,既表示一年有十二个月,又表示太阳在一年中经过的十二个星座。
扑克牌中的四种花色,还有不同寓意:黑桃象征橄榄叶,表示和平;红桃是心形,表示智慧;梅花是黑色三叶,源于三叶草;方块表示钻石,意味着财富。这四种花色,是对人们在一年中美好的祝愿。
非贪婪匹配的效率 zz
当发现非贪婪匹配之时,恍然大悟,同样功能的表达式可以写得如此简单:"<td>.*?</td>"。 顿时间如获至宝,凡是按边界匹配的地方,尽量使用简捷的非贪婪匹配 ".*?"。特别是对于复杂的表达式来说,采用非贪婪匹配 ".*?" 写出来的表达式的确是简练了许多。
然而,当一个表达式中,有多个非贪婪匹配时,或者多个未知匹配次数的表达式时,这个表达式将可能存在效率上的陷阱。有时候,匹配速度慢得莫名奇妙,甚至开始怀疑正则表达式是否实用。
效率陷阱的产生:
在本站基础文章里,对非贪婪匹配的描述中说到:"如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配成功。"
具体的匹配过程是这样的:
- "非贪婪部分" 先匹配最少次数,然后尝试匹配 "右侧的表达式"。
- 如果右侧的表达式匹配成功,则整个表达式匹配结束。如果右侧表达式匹配失败,则 "非贪婪部分" 将增加匹配一次,然后再尝试匹配 "右侧的表达式"。
- 如果右侧的表达式又匹配失败,则 "非贪婪部分" 将再增加匹配一次。再尝试匹配 "右侧的表达式"。
- 依此类推,最后得到的结果是 "非贪婪部分" 以尽可能少的匹配次数,使整个表达式匹配成功。或者最终仍然匹配失败。
当一个表达式中有多个非贪婪匹配,以表达式 "d(\w+?)d(\w+?)z" 为例,对于第一个括号中的 "\w+?" 来说,右边的 "d(\w+?)z" 属于它的 "右侧的表达式",对于第二个括号中的 "\w+?" 来说,右边的 "z" 属于它的 "右侧的表达式"。
当 "z" 匹配失败时,第二个 "\w+?" 会 "增加匹配一次",再尝试匹配 "z"。如果第二个 "\w+?" 无论怎样 "增加匹配次数",直至整篇文本结束,"z" 都不能匹配,那么表示 "d(\w+?)z" 匹配失败,也就是说第一个 "\w+?" 的 "右侧" 匹配失败。此时,第一个 "\w+?" 会增加匹配一次,然后再进行 "d(\w+?)z" 的匹配。循环前面所讲的过程,直至第一个 "\w+?" 无论怎么 "增加匹配次数",后边的 "d(\w+?)z" 都不能匹配时,整个表达式才宣告匹配失败。
其实,为了使整个表达式匹配成功,贪婪匹配也会适当的"让出"已经匹配的字符。因此贪婪匹配也有类似的情况。当一个表达式中有较多的未知匹配次数的表达式时,为了让整个表达式匹配成功,各个贪婪或非贪婪的表达式都要进行尝试减少或增加匹配次数,由此容易形成一个大循环的尝试,造成了很长的匹配时间。本文之所以称之为"陷阱",因为这种效率问题往往不易察觉。
举例:"d(\w+?)d(\w+?)d(\w+?)z" 匹配 "ddddddddddd..." 时,将花费较长一段时间才能判断出匹配失败 。
效率陷阱的避免:
避免效率陷阱的原则是:避免"多重循环"的"尝试匹配"。并不是说非贪婪匹配就是不好的,只是在运用非贪婪匹配的时候,需要注意避免过多"循环尝试"的问题。
情况一:对于只有一个非贪婪或者贪婪匹配的表达式来说,不存在效率陷阱。也就是说,要匹配类似 "<td> 内容 </td>" 这样的文本,表达式 "<td>([^<]|<(?!/td>))*</td>" 和 "<td>((?!</td>).)*</td>" 和 "<td>.*?</td>" 的效率是完全相同的。
情况二:如果一个表达式中有多个未知匹配次数的表达式,应防止进行不必要的尝试匹配。
比如,对表达式 "<script language='(.*?)'>(.*?)</script>" 来说, 如果前面部分表达式在遇到 "<script language='vbscript'>" 时匹配成功后,而后边的 "(.*?)</script>" 却匹配失败,将导致第一个 ".*?" 增加匹配次数再尝试。而对于表达式真正目的,让第一个 ".*?" 增加匹配成"vbscript'>"是不对的,因此这种尝试是不必要的尝试。
因此,对依靠边界来识别的表达式,不要让未知匹配次数的部分跨过它的边界。前面的表达式中,第一个 ".*?" 应该改写成 "[^']*"。后边那个 ".*?" 的右边再没有未知匹配次数的表达式,因此这个非贪婪匹配没有效率陷阱。于是,这个匹配脚本块的表达式,应该写成:"<script language='([^']*)'>(.*?)</script>" 更好。
匹配次数中的贪婪与非贪婪(zz)
表达式 | 匹配结果 |
"\w+" 将匹配第一个 "d" 之后的所有字符 "xxxdxxxd" | |
"\w+" 将匹配第一个 "d" 和最后一个 "d" 之间的所有字符 "xxxdxxx"。虽然 "\w+" 也能够匹配上最后一个 "d",但是为了使整个表达式匹配成功,"\w+" 可以 "让出" 它本来能够匹配的最后一个 "d" |
由此可见,"\w+" 在匹配的时候,总是尽可能多的匹配符合它规则的字符。虽然第二个举例中,它没有匹配最后一个 "d",但那也是为了让整个表达式能够匹配成功。同理,带 "*" 和 "{m,n}" 的表达式都是尽可能地多匹配,带 "?" 的表达式在可匹配可不匹配的时候,也是尽可能的 "要匹配"。这 种匹配原则就叫作 "贪婪" 模式 。
非贪婪模式:
在修饰匹配次数的特殊符号后再加上一个 "?" 号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的 "不匹配"。这种匹配原则叫作 "非贪婪" 模式,也叫作 "勉强" 模式。如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配成功。举例如下,针对文本 "dxxxdxxxd" 举例:
表达式 | 匹配结果 |
"\w+?" 将尽可能少的匹配第一个 "d" 之后的字符,结果是:"\w+?" 只匹配了一个 "x" | |
为了让整个表达式匹配成功,"\w+?" 不得不匹配 "xxx" 才可以让后边的 "d" 匹配,从而使整个表达式匹配成功。因此,结果是:"\w+?" 匹配 "xxx" |
更多的情况,举例如下:
举例1:表达式 " <td>(.*)</td>" 与字符串 "<td><p>aa</p></td> <td><p>bb</p></td>" 匹配时 ,匹配的结果是:成功;匹配到的内容是 "<td><p>aa</p></td> <td><p>bb</p></td>" 整个字符串, 表达式中的 "</td>" 将与字符串中最后一个 "</td>" 匹配。
举例2:相比之下,表达式 " <td>(.*?)</td>" 匹配举例1中同样的字符串时 ,将只得到 "<td><p>aa</p></td>", 再次匹配下一个时,可以得到第二个 "<td><p>bb</p></td>"。
星期二, 十二月 04, 2007
星期六, 十一月 24, 2007
NFO convert to plain text(txt) python script
line = infile.read()
newline = ""
for i in range(0,len(line)):
c1 = ord(line[i])
if c1 > 0x7e or c1 < 0x20:
if c1 == 0x0a or c1 == 0x0d:
newline += line[i]
else:
newline += " "
else:
newline += line[i]
print newline
import string
import re
pattern_empty = """^\s*$"""
pattern_head = """^\s+"""
pattern_tail = """\s+$"""
reg_empty = re.compile(pattern_empty,re.MULTILINE)
reg_head = re.compile(pattern_head,re.MULTILINE )
reg_tail = re.compile(pattern_tail,re.MULTILINE)
newline, num = reg_empty.subn("<br>",newline)
newline, num = reg_head.subn(" ",newline)
newline, num = reg_tail.subn(" ",newline)
print newline
print num
星期二, 十一月 20, 2007
星期一, 十一月 19, 2007
星期日, 十一月 18, 2007
拦阻索
当舰载机降落时,尾钩放下,其位置比起落架还低,着舰点在1、2道拦阻索之间为好,这就要求飞行员有很高的操纵技术。据美国海军统计,白天着舰的舰载机尾钩挂住2、3道拦阻索的合计约占62-64%,尾钩挂住第4道索的约为18%,尾钩挂到第1道索的约为16%。在夜间尾钩多挂住第3、4道索。如尾钩未挂住拦阻索,着舰机必须拉起复飞,这在白天约为5%,夜间则高达12-15%。
美国航母的MK-73型拦阻索缓冲器可使30吨重的舰载机以140节的速度着舰后滑跑91.5米停止。舰载机停下后,拦阻索自动复位,迎接下一架着舰机的到来。/摘自环球军事论坛
航母飞机弹射器的发展
不过,弹射飞机可不像弹射弓箭和打乌用的石子,飞机不仅比它们大得多,而且,航空母舰弹射飞机是为了使飞机在极短的飞行甲板上达到起飞速度,这就要求飞机弹射器具有独特的性能。据资料表明,现在普遍采用的喷气式舰载机起飞时,需要加到每小时350公里以上的速度才能拔地而起,依现行飞机的重量和发动机功率计算,飞机需在跑道上滑跑几千米距离才能达到,而航空母舰的甲板最长也不过百余米,所以,弹射器加快起飞速度是必不可少的环节。
弹射器目前主要有三种:液压弹射器、蒸汽弹射器、内燃弹射器。世界上最早的弹射器是由美国西奥多・埃利森海军上尉于1911年研制成功的。这种原始的弹射器由三条绳索和一块法码组成,但这种弹射器太原始,几乎没起到什么作用。后来,埃利森又对这种原始的弹射器进行改进,研制成功压缩空气式弹射器,于1912年11月12日进行了人类史上第一次弹射起飞。
不过,埃利森的发明并没有引起人们的注意。因为当时的舰载飞机重量轻、速度低,不需要弹射也可从航空母舰的飞行甲板上起飞。直至喷气式飞机诞生后,弹射器才变得日渐重要起来。而第二次世界大战结束时,航空母舰上所装备的弹射器都是液压的,弹射能量极小,根本无法满足喷气式飞机的需要。1951年,英国海军航空兵后备队司令米切尔率先提出研制蒸汽弹射器的设想。他当年就将其研制成功,并装备在海军"莫仙座"号航空母舰上。后来,美国人又于1960年研制成功了内燃弹射器,并将这种弹射器安装在"企业"号核动力航空母舰上。不过,这种内燃式弹射器至今仍不能令人满意,所以"企业"号上除了装备内燃弹射器之外,还装备有蒸汽弹射器。
综上所述,目前航空母舰上采用的弹射器以蒸汽弹射器为主。蒸汽弹射器就是一台往复式蒸汽机,只不过其动力冲程很长,目前已近百米。蒸汽弹射器由发射系统、蒸汽系统、拖索张紧系统、复位系统、润滑及控制系统等部分组成。工作时,由锅炉产生高压蒸汽,并把这种高压蒸汽储存在蒸汽室里,弹射前,用拖索将舰载机钩在往复车上,一旦将高压蒸汽充入汽缸筒,蒸汽的巨大压力推动活塞,活塞带动往复车,往复车带动舰载机飞速向前滑动,从而将飞机弹射出去。如美国的C-13型蒸汽弹射器,可将36.3吨重的舰载机以185节(即每小时339公里)的高速弹射出去。
蒸汽弹射又分为两种方式,最先采用的是拖索式,后来采用前轮拖曳式。拖索式弹射是首先由牵引车将舰载机拖到弹射器上,由甲板工作人员用钢质拖索将飞机挂在往复的滑块上。然后,用一根牵引释放杆把飞机尾部与弹射器后端固定,竖起喷气偏流挡板,飞行员将飞机发动机启动并放到推力最大位置。这一系列准备工作完成后,甲板指挥官一声令下,高压蒸汽使弹射滑块猛向前冲,拉断牵引释放杆上的定力拉断栓,滑块拉着飞机沿轨道加速,在轨道即将结束时把飞机加速到起飞速度。此时,拖索从飞机上脱落,飞机在自身发动机的牵引下飞向空中。而滑块则返回弹射轨道起点,准备弹射下一架飞机。
1964年开始,美国海军又研制成功另一种蒸汽弹射方式,即前轮拖曳式。这种弹射方式目前已在航空母舰上普遍采用。它放弃了弹射拖索,从而使专门用于回收弹射拖索的加收角没有存在的必要了。所谓前轮牵引式弹射起飞,就是给舰载飞机的前轮支架装上曳杆,把前轮直接挂在滑块上,弹射时由滑块直接拉着飞机的前轮加速起飞。取消了拖索,既可减少挂拖索和回收拖索的8~10名甲板人员,也可减少每架飞机弹射的时间间距。目前,美国海军的航空母舰中,除装备CB-1型弹射器的航母弹射一架飞机需45秒钟,其他每弹射一架飞机仅需30秒钟。
Torpark软件的简介和下载 zz
TorPark是一种整合了Tor(The Onion Router洋葱头表层代理网络)和FireFox的代理软件。
Tor作为一个Socks5代理软件,如果要用于HTTP,FTP类运用,必须使用专用软件转换协议后方能使用,例如Privoxy、SocksCap。Privoxy
是一个开放源码的WEB代理服务软件。
由于Tor的设置对于一般网民来讲有点困难,因此有人就提供了一个TorPark软件包,里面将设置全部都做好,可以直接运行,免去了不少麻烦。对于一般网民来说很省事。
我使用TorPark的感觉是,有时候速度较慢,IP地址会不断变化,其FireFox浏览器访问某些网站显示会有点问题,不过在IE里其实也可以用。如果懒得去找代理服务器的话,用这个软件可以省事不少。不仅仅可以访问Google,类似维基百科,新语丝,Wordpress等网站都可以正常访问了。
另外,对于ADSL用户,请在使用这个软件前,一定记住先打10000号去关闭"互联星空"这个电信支付服务(电信局开通帐号会自动开通"互联星空"),因为Torpark属于代理服务器,别人可能会使用这个代理,直接去一些网站(如Q币充值)进行消费而无需验证,这将造成个人经济上的损失,这就是电信的"互联星空"服务本身具有的巨大安全隐患。
突破网络防线 Tor
所以想找找有没有其他的替代。
TOR tor 以前也听说过,不过那时没有GUI,没有深入去研究。
今天发现 tor也提供了GUI支持,Vidalia,现在使用也很方便。
可以直接去tor的官方网站去下载打包好的软件包。
直接安装就可以使用,基本不用配置。
http://www.torproject.org/download.html.zh-cn
包内有下面四个部分:
Tor & Privoxy & Vidalia & Torbutton bundle
Tor提供socks接口,使用sockscap可以网遍天下了
Tor为了防止垃圾邮件,不提供对25端口的链接。
不过速度不快,有点慢:(
星期六, 十一月 17, 2007
static variable in python
L[0]+=1
return L[0]
print fun(),fun(),fun(),fun() # will produce 1 2 3 4
this use the default variable.
the default variable value should be a list.
星期五, 十一月 16, 2007
去除 blogger 中的虚线
你可以找到对应的部分去除。
先找到定义侧边栏的部分,
然后可能描述的语句会类似:
border-bottem:1px;
去除即可
google blog search
It can index my article just 2 hours after my publish it.
It amazing.
wonderful thing
http://blogsearch.google.com/blogsearch?hl=en&ie=UTF-8&q=site%3Akeepoo.blogspot.com&btnG=Search+Blogs
----------------------------------------------------
I think I was punished because of this post, all my blog is gone from google search result
META标签的常见用法
最近,Danny Sullivan谈到了如何处理的搜索引擎meta标签的问题,以下是一些关于在Google中如何处理这些问题的答案。
多内容数值
我们建议你把所有的Meta标签内容放在一个meta中。这将使得meta标签更易于读取并降低发生错误的概率。例如:
<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
如果一行包含对个meta标签,我们将会累加标签的内容,例如,我们会将
<META NAME="ROBOTS" CONTENT="NOINDEX">
<META NAME="ROBOTS" CONTENT="NOFOLLOW">
理解为:
<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
如果内容的数值有冲突,我们将使用最严格的那个。所以,如果有个页面包含下面的meta标签:
<META NAME="ROBOTS" CONTENT="NOINDEX">
<META NAME="ROBOTS" CONTENT="INDEX">
我们将只遵守noindex的数值。
单词拼写规范
Googlebot可以理解任何大小写的组合,所有大小写都是同样的效果。如果包含多内容的数值,数值之间需要使用逗号分隔。
同时使用robots.txt和robots meta标签
如果你同时使用了robots.txt文件和robots meta标签,如果robots.txt和meta标签有冲突,googlebot 将使用限制更严的。具体来说:
如果你在robots.txt里禁止了某一页,Googlebot永远也不会去索引那一页,也不会读取那一页的任何标识。
如果你在robot.txt中允许,但是在页面中使用 meta 标签对其进行限制,那么Googlebots会访问那一页,读取里面的标签,但不会对其进行索引。
有效的meta标签数值
Googlebot可以对下面的标签进行如下的解读:
NOINDEX - 阻止页面被列入索引。
NOFOLLOW - 阻止对于页面中任何超级链接进行索引。(注,这不同于超级链接上的nofollow属性,那个属性只是组织索引单独的链接)
NOARCHIVE - 不保存该页面的网页快照。
NOSNIPPET - 不在搜索结果中显示该页面的摘要信息,同时不保存该页面的网页快照。
NOODP - 在搜索结果中不使用Open Directory Project中的描述信息作为其摘要信息。
NONE - 相当于"NOINDEX, NOFOLLOW"。
数值NONE的含义
据robotstxt.org的定义, 下面的标记等价于 NOINDEX, NOFOLLOW 。
<META NAME="ROBOTS" CONTENT="NONE">
不过,有些网站站长使用这个标签来限制和组织所有搜索引擎来的内容索引。
Using the robots meta tag
Multiple content values
We recommend that you place all content values in one meta tag. This keeps the meta tags easy to read and reduces the chance for conflicts. For instance:
<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
If the page contains multiple meta tags of the same type, we will aggregate the content values. For instance, we will interpret
<META NAME="ROBOTS" CONTENT="NOINDEX">
<META NAME="ROBOTS" CONTENT="NOFOLLOW">
The same way as:
<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
If content values conflict, we will use the most restrictive. So, if the page has these meta tags:
<META NAME="ROBOTS" CONTENT="NOINDEX">
<META NAME="ROBOTS" CONTENT="INDEX">
We will obey the NOINDEX value.
Unnecessary content values
By default, Googlebot will index a page and follow links to it. So there's no need to tag pages with content values of INDEX or FOLLOW.
Directing a robots meta tag specifically at Googlebot
To provide instruction for all search engines, set the meta name to "ROBOTS". To provide instruction for only Googlebot, set the meta name to "GOOGLEBOT". If you want to provide different instructions for different search engines (for instance, if you want one search engine to index a page, but not another), it's best to use a specific meta tag for each search engine rather than use a generic robots meta tag combined with a specific one. You can find a list of bots at robotstxt.org.
Casing and spacing
Googlebot understands any combination of lowercase and uppercase. So each of these meta tags is interpreted in exactly the same way:
<meta name="ROBOTS" content="NOODP">
<meta name="robots" content="noodp">
<meta name="Robots" content="NoOdp">
If you have multiple content values, you must place a comma between them, but it doesn't matter if you also include spaces. So the following meta tags are interpreted the same way:
<METANAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
<META NAME="ROBOTS" CONTENT="NOINDEX,NOFOLLOW">
If you use both a robots.txt file and robots meta tags
If the robots.txt and meta tag instructions for a page conflict, Googlebot follows the most restrictive. More specifically:
- If you block a page with robots.txt, Googlebot will never crawl the page and will never read any meta tags on the page.
- If you allow a page with robots.txt but block it from being indexed using a meta tag, Googlebot will access the page, read the meta tag, and subsequently not index it.
Googlebot interprets the following robots meta tag values:
- NOINDEX - prevents the page from being included in the index.
- NOFOLLOW - prevents Googlebot from following any links on the page. (Note that this is different from the link-level NOFOLLOW attribute, which prevents Googlebot from following an individual link.)
- NOARCHIVE - prevents a cached copy of this page from being available in the search results.
- NOSNIPPET - prevents a description from appearing below the page in the search results, as well as prevents caching of the page.
- NOODP - blocks the Open Directory Project description of the page from being used in the description that appears below the page in the search results.
- NONE - equivalent to "NOINDEX, NOFOLLOW".
As defined by robotstxt.org, the following direction means NOINDEX, NOFOLLOW.
<META NAME="ROBOTS" CONTENT="NONE">
However, some webmasters use this tag to indicate no robots restrictions and inadvertently block all search engines from their content.
robots的写法介绍
robots.txt是一个纯文本文件,在这个文件中网站管理者可以声明该网站中不想被robots访问的部分,或者指定搜索引擎只收录指定的内容。
当一个搜索机器人(有的叫搜索蜘蛛)访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在,搜索机器人就会按照该文件中的内容来确定访问的范围;如果该文件不存在,那么搜索机器人就沿着链接抓取。
另外,robots.txt必须放置在一个站点的根目录下, 而且文件名必须全部小写。
robots.txt写作语法
访问以上具体地址,我们可以看到robots.txt的具体内容如下:
# All robots will spider the domain
User-agent: *
Disallow:
以上文本表达的意思是允许所有的搜索机器人访问www.csswebs.org站点下的所有文件。
具体语法分析:其中#后面文字为说明信息;User-agent:后面为搜索机器人的名称,后面如果是*,则泛指所有的搜索机器人;Disallow:后面为不允许访问的文件目录。
下面,我将列举一些robots.txt的具体用法:
允许所有的robot访问
Disallow:
或者也可以建一个空文件 "/robots.txt" file
禁止所有搜索引擎访问网站的任何部分
Disallow: /
禁止所有搜索引擎访问网站的几个部分(下例中的01、02、03目录)
Disallow: /01/
Disallow: /02/
Disallow: /03/
禁止某个搜索引擎的访问(下例中的BadBot)
User-agent: BadBot
Disallow: /
只允许某个搜索引擎的访问(下例中的Crawler)
Disallow:
Disallow: /
另外,我觉得有必要进行拓展说明,对robots meta进行一些介绍:
Robots META标签则主要是针对一个个具体的页面。和其他的META标签(如使用的语言、页面的描述、关键词等)一样,Robots META标签也是放在页面的<head></head>中,专门用来告诉搜索引擎ROBOTS如何抓取该页的内容。
Robots META标签的写法:
Robots META标签中没有大小写之分,name="Robots"表示所有的搜索引擎,可以针对某个具体搜索引擎写为name="BaiduSpider"。 content部分有四个指令选项:index、noindex、follow、nofollow,指令间以","分隔。
INDEX 指令告诉搜索机器人抓取该页面;
FOLLOW 指令表示搜索机器人可以沿着该页面上的链接继续抓取下去;
Robots Meta标签的缺省值是INDEX和FOLLOW,只有inktomi除外,对于它,缺省值是INDEX,NOFOLLOW。
这样,一共有四种组合:
<META NAME="ROBOTS" CONTENT="NOINDEX,FOLLOW">
<META NAME="ROBOTS" CONTENT="INDEX,NOFOLLOW">
<META NAME="ROBOTS" CONTENT="NOINDEX,NOFOLLOW">
其中
<META NAME="ROBOTS" CONTENT="INDEX,FOLLOW">可以写成<META NAME="ROBOTS" CONTENT="ALL">;
<META NAME="ROBOTS" CONTENT="NOINDEX,NOFOLLOW">可以写成<META NAME="ROBOTS" CONTENT="NONE">
目 前看来,绝大多数的搜索引擎机器人都遵守robots.txt的规则,而对于Robots META标签,目前支持的并不多,但是正在逐渐增加,如著名搜索引擎GOOGLE就完全支持,而且GOOGLE还增加了一个指令"archive",可以 限制GOOGLE是否保留网页快照。例如:
表示抓取该站点中页面并沿着页面中链接抓取,但是不在GOOLGE上保留该页面的网页快照。
hoho 今天 $1.28 看来英文的就是值钱
AdSense for Content 344 7 2.03% $3.73 $1.28
看来英文的就是值钱,中文的哼哧哼哧搞半天也没英文的多
ooo
http://efd-j.blogspot.com
星期四, 十一月 15, 2007
Godaddy免费空间广告去掉屏蔽方法 zz
其实最初我对广告横幅是理解的,因为天下没有免费的午餐。但后来使用中发现两个大的问题:一是由于广告是在正常显示网页后,让正常页面下移腾出空间显示的。所以打开每个页面都会非常明显的感受到页面加载中的下移过程,让人非常不舒服。二是广告的载入速度非常慢,结合第一点,使网页显示完成大为延缓。
我不得不决定去广告,查看加广告后的网页代码,可以看到在末尾加上了一段Java语句:
< script language='javascript'
src='https://a12.alphagodaddy.com/hosting_ads/gd01.js'>
< /script>
Godaddy就是通过这段代码,在每一页加上广告的。
在网上搜索了一下,发现不少去广告的方法。
方法一:在页面最后加
<script>
可以完全去掉广告,在需要去广告的页面后面加该标记后,广告代码加入后就成为:
<script>
中间可以有非Java内容
< script language='javascript'
src='https://a12.alphagodaddy.com/hosting_ads/gd01.js'>
< /script>
这就造成广告代码匹配出现错误,从而阻止了广告代码的执行。这种方法完全去除了广告的影响,可以大大提升页面显示速度,是目前最好的方法,我用的就是这一种。不足之处是可能导致空间被K,为了尽量避免其发生,建议保留部分页面的广告。
方法二:在文件结尾处加入
<noscript>
可以完全去掉广告。原理和方法一差不多,阻止后面的广告代码的执行,效果和可能导致的后果也完全一样。
方法三:文件的开头加入
<div style= "margin-top:-94" >
在末尾加入
</div >
这种方法是让页面顶端的部分内容不显示出来,由于顶端是加的广告,所以可以起到隐藏广告的作用。隐藏内容的高度为:94,可以修改-94的大小适应广告的高度直到隐藏广告。使用这种方法是隐藏广告不是删除广告,广告仍然存在只是看不到了,所以空间应该不会被K。不足之处是,广告仍然被载入,所以广告对页面显示速度的影响没有消除。
我没有用过这种方法,不知道效果如何,但我分析想法是好的,用起来仍会非常不爽。因为不是一开始顶端显示的就是广告,广告是正常显示页面后,让正常页面下移腾出地方显示广告的。
那么针对Zblog,需要做哪些修改呢?我使用的是第一种方法,当然不是在每一个文件后面都做修改,我们要做的是在适当的地方做适当的修改。
Z-Blog 用户只需要修改TEMPLATE目录下的
Catalog.html/Default.html/Search.html/Single.html/Tags.html
5个模板文件,在这五个文件末尾加上<script>,再重建文件和索引就可以了。修改后前台页面的广告就都去掉了,后台管理页面的广告仍然存在,我想没必要去掉。如果一定要有人看到那些广告的话,那么博客主们是当仁不让的了,对吧?
星期二, 十一月 13, 2007
blogger 搬家注意事项 (ZZ)
請注意,Blogger 每天文章數量發表限制約是 50 篇,所以你一次只能搬 50 篇而已,可以分多天慢慢搬!
請注意,如果你第一次匯50篇成功,可是隔天或之後的文章一直之後一直匯失敗,可能是 Blogger
開啟圖片驗證把你的搬家機器人擋掉,一旦出現這種情形,請使用
https://www.google.com/accounts/DisplayUnlockCaptcha?service=blogger
解鎖,再繼續匯入。
星期一, 十一月 12, 2007
星期日, 十一月 11, 2007
星期六, 十一月 10, 2007
Google AdSense优化关键技巧
经过无数人(次)的证明,在投放GGAD时,应优先选择下列尺寸的广告格式:
大矩形 (336 X 280)
中等矩形 (300 X 250)
为什么?原因很简单,因为它能够带来最高的点击率。我自己的研究表明,这种尺寸的广告看上去非常像是网页正文的一部分。我对所有的adsense广告尺寸都做过试验,它的效果是最好的。
其他人也告诉过我相同的结论。我只要知道这一条就足够了!
我也推荐你采用"宽幅摩天大楼",当然,只要文字的,并且把它放在网页紧贴右侧边缘的位置。你是否想过这个问题,几乎所有的PC机使用者都是右手拿鼠标 (即使像我这样的左撇子也是用右手)。显示在右侧边缘的广告在"心理上"缩短你的右手和屏幕之间的距离。我认为,这种"亲密"的关系会使浏览者感觉更加舒 适,因而也更容易去点击链接。
特别提醒:远离468 X 60的广告!
Google AdSense优化关键技巧之二:广告颜色的设置
如果您在使用Gmail,看看Gmail的右侧广告就知道关于GGAD颜色的设置,一个原则:将你的ggad风格与网站风格融为一体。
以下面是ggad代码中相关颜色的设置为例进行说明:
google_color_border = "FFFFFF"; 边框颜色,设成与页面背景相同,就是不要边框
google_color_bg = "FFFFFF"; 背景色,设成与页面背景相同
google_color_link = "0379C0"; 大标题链接颜色,设成网站链接颜色
google_color_text = "000000"; 广告中的文字颜色,设成页面正文颜色
google_color_url = "008000"; 广告中的url地址颜色,与广告中的文字保持相同颜色
Google AdSense优化关键技巧之三:广告位置的选择
位置就是一切。如果不在第一位置让观众看见,就算是全世界最漂亮的广告也等于一张白纸。但是经过这么多次的Google Adsense投放之后,我想告诉你的是:最可见的位置并不总意味着最好的效果。实际上,很可能正因为它们"太显眼"了而被浏览者视而不见。
仔细看一看网页的设计和布局,确定大多数访问者都能看到的地方,把这些地方标记出来作为可能的广告位。
实际上,Google已经为我们提供了一张"热图",它能够帮助我们更有效率地做这个工作。
http://www.google.com/images/adsense/zh_CN/support/general_zh-CN.jpg
Google的"热图"显示了一个"普通"网页的热点区域。颜色较深的地方是浏览者最经常关注的区域。但是,记住,没有哪个网页是"普通"的,所以,确认你自己的热点区域。
Google承认网页上某些区域相对其它区域的广告效果更好。研究者也发现当访问者浏览一个网页时,他们的视线总是先从左上角开始,然后从左至右,逐行向下。
上面说的这些都没错。但是每一个网页的热点区域都是不同的,只有实践才能出真知。
Google AdSense优化关键技巧之四:如何吸引相关的广告
合适的颜色和位置可以帮助你提高点击率,但是它们决定不了哪些广告会出现在你的网站上。 理论上说,这是由Google控制的,用户无法选择。但我们可以通过一些技巧使广告的相关性增强,广告的相关性越强,浏览者点击广告的几率就越大。
最重要的技巧是在URL、title标题中包含你的关键词!
URL中的目录名和文件名是非常重要的。如果你在把网页文件上传到服务器之前,用本地机浏览这些网页,你会发现adsense是根据网页文件所在的目录的名称或文件来展示相关的广告。
如果你发现网站上出现的广告和网站内容毫不相干,那么首先应该纠正的是目录名和title,重新给它们起一个更相关的名字。
标题也很重要。不要给它们用<font>标签,尝试一下<h1>。标题最好能包含内容关键字,这有助于机器人的识别。
如果整个网页中一个标题都没有,试着加几个上去。
做到上面几步,您的Google Adsense优化已经达到非常不错的水平了,等着收Money吧:)
给所有Adsense使用者提了几项建议:
1)要分析访客的IP地址。通过访客的IP地址,来分析他来自于哪个国家和地区。因为很多时候,美国的一个访客点击一个广告,可能会给你带来5美金的广告收入。但是其他地方的访客有可能只有2毛钱的收入。
2)你必须建立一个能吸引回头客的网站。他的建议是:不要幻想能通过搜索引擎优化本身来致富。但是如果你建立的是一个免费的找工作的网站,你却可能一年赚 个3 千万。其他像俱乐部会员,免费交友等等,这类网站都有可能赚大钱。寻找一个已成熟的市场,给这个市场提供一个免费的服务,然后卖广告。
3)让你的用户和访客来生成网站内容。比如让他们写一些例如夜总会的,旅馆的或是高尔夫球场的评论。
4)不要进入一个太多人已经在用Adsense的市场。最好是能创造一个你自己的市场。
5)网站必须非常简单,必须速度快。一页最多两个广告,最多一到两张图片。不要让你的访客晕头转向,不知所措。
6)到其他论坛里去转转。如果人们没有在谈论你的目标市场,那么你有很大的机会在这个市场里赚钱。
adsense 突破
google adsense 的收入 终于 突破 $1了, 虽然这是个小数字.
不知道点CTR是不是太高了一点
Page impressions | Clicks | Page CTR | Page eCPM [?] | Earnings | |
AdSense for Content | 89 | 8 | 8.99% | $11.79 | $1.05 |
cnbook_ccword_buttom | 58 | 5 | 8.62% | $18.04 | $1.05 |
ccbook_ccworld_top | 13 | 0 | 0.00% | $0.00 | $0.00 |
view all AdSense for Content channels » | |||||
Browser Name | Number of requests | |
---|---|---|
1. | Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) | 9,465 |
2. | Baiduspider+(+http://www.baidu.com/search/spider.htm) | 3,331 |
3. | Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) | 1,927 |
baidu和google也一直在抓我的站,不过我的流量都来自baidu, 看来国人用baidu的比较多
http://cnbook.ccworld.info/
星期五, 十一月 09, 2007
在JavaScript中实现命名空间
注:好久没写了,今天把我在公司内网写的文章拷一份,出来露露脸,刚转Web开发,所以开始学JavaScript!
在引入命名空间之前,一个令开发人员头疼的问题就是如何防止函数名/类名和其他人的冲突,在一个公司内部项目组之间可以通过命名预定(比如加前缀等)解决这个问题,但是把视线放到整个软件开发领域,在当今协作开发相当盛行的时代,这个问题却依然存在。在使用多个第三方框架或类库的时候,你唯一能作的就是祈祷它们的命名不要冲突,如果真正发生这种灾难的话,你唯一能作的就是放弃其中一个(注:可能是我孤陋寡闻,呵呵)。命名空间的引入相当程度上解决了这个问题,当然,如果你使用的命名空间和其他公司不幸一样,而对方又是微软、SUN等大佬,那恭喜你,呵呵@_@!
从事Web开发不可避免要接触JavaScript,目前最新版本的JavaScript还是不支持命名空间,所以命名冲突的问题凸显无疑,想象一下你引用了两个js文件,却发现由于命名问题导致你不得不放弃其中一个,从而导致多写了许多代码,无疑是十分令人沮丧的。在JavaScript新版本引入命名空间概念之前,发扬自立更生精神和创造性是我们程序员的基本义务;-)
实现前提:与Delphi、C#等语言不同,JavaScript中的类并不是对象的定义,事实上JavaScript中并不存在真正的类,这里的类实际上是用函数模拟实现的,而JavaScript中的函数实际上是一个对象,因此在JavaScript中:一个类就是一个对象。这和传统概念概念极为不同,在JavaScript中,创建某个类的实例实际上就是将类(=对象,记住)复制了一份。看到这里,有点设计模式概念的应该就可以看出来了,在JavaScript中,类机制使用了 原型(prototype)模式。
实现原理:既然看清楚了类的本质,那么问题就简单了,如果将GEA项目组所有JS类和函数作为属性放在名为GEA的对象里面,然后将GEA对象以属性的方式放在名为Grandsoft对象里面不就可以达到我们的目的,比如Grandsoft.GEA.Person实际上是在Grandsoft对象的属性GEA(也是一个对象)中的类Person(还是一个对象)。
实现非常简单,整个命名空间机制的实现不超过20行代码,分析如下:
Namespace = new Object();
// 全局对象仅仅存在register函数,参数为名称空间全路径,如"Grandsoft.GEA"
Namespace.register = function(fullNS)
{
// 将命名空间切成N部分, 比如Grandsoft、GEA等
var nsArray = fullNS.split('.');
var sEval = "";
var sNS = "";
for (var i = 0; i < nsArray.length; i++ )
{
if (i != 0 ) sNS += "." ;
sNS += nsArray[i];
// 依次创建构造命名空间对象(假如不存在的话)的语句
// 比如先创建Grandsoft,然后创建Grandsoft.GEA,依次下去
sEval += "if (typeof(" + sNS + ") == 'undefined') " + sNS + " = new Object();"
}
if (sEval != "") eval(sEval);
}
上面就是在JavaScript中模拟命名空间机制的完整实现,使用方式如下:
Namespace.register("Grandsoft.GEA ");
Namespace.register( "Grandsoft.GCM");
// 在Grandsoft.GEA命名空间里面声明类Person
Grandsoft.GEA.Person = function(name, age)
{
this.name = name;
this.age = age;
}
// 给类Person添加一个公共方法show()
Grandsoft.GEA.Person.prototype.show = function()
{
alert(this.name + " is " + this .age + " years old!" );
}
// 演示如何使用类Person
var p = new Grandsoft.GEA.Person("yanglf", 25);
p.show();
哈哈,简单吧,这么简单的代码我就不多说了,大家自己看着玩吧,其实我有点懒,呵呵@_@!!!