航行日志

追寻梦想


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签
航行日志

github 使用 ssh 方式认证登录

发表于 2013-06-14 | 分类于 程序人生

z:http://www.wojilu.com/forum1/topic/2235

github 使用 ssh 方式认证登录。

 

官方文档:http://help.github.com/ssh-key-passphrases/

 

之所以不使用普通的密码验证登录,原因在于:密码不够安全。如果你使用简单的密码,比如“1234”,非常容易被猜到或者被暴力破解;如果你使用复杂的密码,为了避免自己也忘记,又可能会记在某个地方,如果被人发现,就糟了。两种方式都很不妥。所以 github 采用 ssh 密钥方案。

 

但如果只使用 ssh 密钥而不使用 passphrase(口令或密码),那跟使用复杂密码然后记下来没啥区别。比如你将ssh密钥记在电脑某处,如果其他人获取了这个文件,那就没有安全可言。解决办法是:再增加一个 passphrase。

 

所以,整个认证过程是:

a)先生成一个 ssh key,在github和本地机器配置;

b)然后在登录的时候,再输入 passphrase 登录(当然,我们可以通过脚本配置,避免每次重复输入 passphrase )。

 

第一部分:配置ssh

先进入 cygwin 命令行。为了在你的电脑和github之间建立安全连接,需要SSH keys,所以你需要

 

1)先检测是否有这个key,请点击开始菜单中的 Git Bash,输入如下命令

$ cd ~/.ssh

 

2)系统应该反馈“系统找不到指定文件”,那么,我们需要生成一个新的key,输入如下代码

$ ssh-keygen -t rsa -C “your_email@youremail.com”

——其中的email请填写你注册时候的email

 

系统开始生成ssh公钥和私钥,然后会问你保存的目录,请直接回车即可(直接回车意味着在当前目录下的.ssh目录保存)。

 

3)输入一个密码(passphrase),请至少填写一个4位数,这个密码是你连接到github所用。输入之后,会生成id_rsa(私钥) 和 id_rsa.pub(公钥) 文件,如下图所示:

 

 

 

访问github网站, “Account Settings” > Click “SSH Public Keys” > Click “Add another public key”

 

用文本编辑器打开上图中第二个文件 id_rsa.pub,里面的内容就是SSH key,请复制它,粘贴入key里面,记得不要有任何多余的空格和换行。然后点击“Add key”提交。(Title栏可以不填写)

 

 

现在,你可以测试通过SSH连接到github了。请打开Git Bash,输入如下代码——

ssh -T git@github.com

 

如果提示“can’t be established.”什么东西(如下代码),请不要管,直接按yes

The authenticity of host ‘github.com (207.97.227.239)’ can’t be established.

RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.

Are you sure you want to continue connecting (yes/no)?

然后提示输入密码(passphrase)。

 

如果看到 You’ve successfully authenticated, but GitHub does not provide shell access 信息,就表示连接成功。

 

 

第二部分:避免重复输入 passphrase

 

 

通过上面的流程,已经正确配置了 ssh ,但你每次使用的时候,总是很不爽,比如在命令行下,每次 pull 或 push,都要重复输入 passphrase。你会想:我明明已经使用 ssh key 了,为什么还要我输入密码?

 

分两种情况讨论——

 

一、命令行下避免重复输入

 

在这种情况下,有一个工具可以帮你避免重复输入 passphrase ,这个工具叫 ssh-agent ,它可以帮你安全的存储passphrase,不用重复输入。

 

具体使用方法是通过脚本预设——

 

1)打开用户主目录下(比如c/cygwin/home/Administrator)的 .bashrc 文件,将如下脚本内容添加进去:

 

SSH_ENV=”$HOME/.ssh/environment”

start the ssh-agent

function start_agent {
echo “Initializing new SSH agent…”

spawn ssh-agent

ssh-agent | sed ‘s/^echo/#echo/‘ > “$SSH_ENV”
echo succeeded
chmod 600 “$SSH_ENV”
. “$SSH_ENV” > /dev/null
ssh-add
}

test for identities

function test_identities {

test whether standard identities have been added to the agent already

ssh-add -l | grep “The agent has no identities” > /dev/null
if [ $? -eq 0 ]; then
ssh-add

$SSH_AUTH_SOCK broken so we start a new proper agent

if [ $? -eq 2 ];then
start_agent
fi
fi
}

check for running ssh-agent with proper $SSH_AGENT_PID

if [ -n “$SSH_AGENT_PID” ]; then
ps -ef | grep “$SSH_AGENT_PID” | grep ssh-agent > /dev/null
if [ $? -eq 0 ]; then
test_identities
fi

if $SSH_AGENT_PID is not properly set, we might be able to load one from

$SSH_ENV

else
if [ -f “$SSH_ENV” ]; then
. “$SSH_ENV” > /dev/null
fi
ps -ef | grep “$SSH_AGENT_PID” | grep -v grep | grep ssh-agent > /dev/null
if [ $? -eq 0 ]; then
test_identities
else
start_agent
fi
fi

 

 

2)然后打开 cygwin 的命令行,第一次打开,它会要求你输入 passphrase ,输入之后,再执行相应的远程操作,就不会要求重复输入 passphrase 了(当然重启电脑会要求再次输入)。

 

 

二、git extentions 中避免重复输入

 

【启用 PuTTY】

 

1)打开 PuTTY,方法:“远程”->PuTTY->“生成或者导入key”

 

2)导入你前面的 ssh key,点击下面的“Load”按钮,导入前面生成的 id_rsa 文件(注意:是id_rsa,没有后缀名,不是id_rsa.pub)

 

 

3)这时它要求你输入 passphrase

4)输入成功,然后你需要点击下图的 Save private key,将私钥保存,你可以将它保存在 id_rsa(ssh私钥) 同一个目录。PuTTY 生成的私钥文件是 .ppk 后缀名。

 

 

【在 git extensions 中使用 PuTTY】

1)打开 git etensions,在 “远程”菜单中,点击“管理远程档案库”

 

2)点击右下部分的“私钥文件”后面的“浏览”,将前面 PuTTY 中保存的 .ppk 后缀的私钥文件加载进来。

 

然后点击“加载SSH密钥”,输入 passphrase,然后点击“测试连接”

此时 PuTTY/plink.exe 开始启动,只要这个开着,就不用重复输入 passphrase

 

 

3)现在可以顺利和远程库操作,比如下面的“拉取”

 

或者在 vs 中直接操作——

航行日志

小顾的段位证书

发表于 2013-06-07 | 分类于 成长路上

看上去是不是挺酷的。

IMG_3499

IMG_3498

航行日志

好吃的冰棍

发表于 2013-06-05 | 分类于 成长路上

昨天下午围棋课结束,梁老师为了鼓励一下小顾和小米同学,一人奖励一根冰棍。小顾因为有过敏症状,医生关照发育前都不要吃冷饮。

这次,吃上了,真是过瘾啊。本来下课就可以回家了,他说:“我等吃完再回去吧,要不然奶奶就要没收了。”你也太明白了吧,坏小子。

航行日志

小顾发烧了

发表于 2013-05-27 | 分类于 成长路上 , 未分类

昨晚下棋,中盘互相杀龙,一度我占上风。两人都非常投入,最终,我屠龙失败,投子认输。

一看他小脸通红,一摸额头,也很烫,以为是上头,赶紧洗洗睡觉了。晚上一直感觉他的身体比较热,有些不正常。

早上起来,一测体温,38.5C。边吃早饭,他还在摆棋,说晚上做梦,梁老师给他讲棋了。吃饭完毕,赶紧去医院。说是扁桃体有些发炎,血项检查都比较正常,稍微放心了点。

小顾,希望你早日康复。

精神有些不振作

航行日志

本来想去看天元赛的,最终无法成行

发表于 2013-05-15 | 分类于 成长路上

这几天,同里天元赛正在进行中,这个时间定的刚好是工作日。网上也找不到活动日程,今天才知道聂老在镇广场有小棋手的指导棋。另外,小顾这几天都说嗓子疼,不敢带他出门了。反正各种原因没法成行,可惜了,这次没带小顾去见识见识。
等后面中韩天元对抗,不知道还在不在同里,聂老还去不去了,如果去的话一定要带小顾去看看,开开眼界。希望同里的主办者早点把日程公布,好让外地游客及爱好者可以提前安排好行程。

航行日志

几个对弈网站某些特性的比较

发表于 2013-05-09 | 分类于 程序人生

在这几个月的对弈客户端的编程中,玄玄围棋先后连上了中国围棋网(CWS)、熊猫围棋网(即原来的IGS)、Tom、弈城(YC)。它们有各自不同的特性。从对它们的比较中我们大致可以看出对弈软件(包括服务器和客户端)的发展。这里需要说明一下的是,连上Tom/YC完全是为了检测玄玄围棋连上多个服务器的程序结构的合理性,是为了测试否能连上各种不同类型的网站,并没有发布它们的打算,因而只实现了看棋和评棋的功能,当然,如果它们主人不介意的话,那我肯定会毫不犹豫发布连上它们的功能,真希望能这样,因为上面有大量高手在下棋,还有大赛的转播,资源实在太丰富了。

中国围棋网和熊猫围棋网其实都是脱胎于原NNGS围棋服务器,属于最早一代围棋服务器。他们的数据结构,通信协议非常接近,但后者做了很多扩充和改进。而Tom和YC的相近程度更高,主要的区别在于,后者注重多国用户的支持,而前者目标用户主要是国内。因此,下面的比较,主要是CWS/ISG与Tom/YC两大阵营的比较。

1、对局室
对于CWS/ISG来说,我感觉一个主要的不足是,对局室在比赛一结束就不存在了。这至少会带来两个问题,一是,对于较为重要的比赛,例如大赛转播,比赛一结束人们就无法看棋了。比赛结束并不意味着对局室就没有人进入了,恰恰相反的是,比赛结束后往往还有许多用户想进去看棋。二是,比赛一结束看棋的用户就不能在原对局室对棋局进行评棋了,因为对局室都不存在了。Tom/YC显然注意到了这些问题,对局室并不会因为比赛结束而消失;对于普通棋局,只有当对局室内空无一人,服务器才将对局室删除。对于转播的大赛棋局,对局室必须经由管理员才能删除,即便室内已空无一人,它们还可以存在在服务器上。

2、文本数据与二进制数据
CWS/IGS客户端与服务器的通信都是文本格式的,我认为采用文本格式的通信协议唯一的好处是,不同客户端开发者能较容易分析通信数据并开发相应的功能。不足之处是,通信效率低下。而二进制格式的协议和文本格式的刚好相反,通信效率高了,别人也不容易为服务器开发客户端。如果需要协议保密的话,这样当然更好。我曾注意到,如果服务器上有3000个用户在线,连上Tom/YC所需的通信量不到CWS/IGS的一半。另外,在同样知晓通信协议的情况下,为Tom/YC写客户端要容易很多。

3、计时机制
在CWS/IGS上,每当有用户走子时,服务器除了提供走子的坐标,还会传来双方的剩余时间。随着时间一秒一秒的流逝,在下一步走子之前,客户端要显示时间只有靠自己计时。这样会带来一个问题,就是客户端的计时和服务器的有一定差异,尤其当网络不够通畅时,网速慢的一方常常因网络不通被判超时。Tom/YC则不同,客户端每一秒的时间显示都是来自服务器的指示,当网络不通时,时间就会停止不动,服务器也会停止为不通的一方计时,这样,基本上不会有人因网速慢而输棋,当然,反复掉线除外。

4、列表更新
CWS/IGS对于客户端的对局列表/用户列表/观棋者列表通常是不会通知更新的。用户为了更新这些信息,通常需要主动向服务器发出请求。Tom/YC则不同,这些列表一有更新,就会主动通知客户端进行更新,这样客户端在任何时候的对局列表和用户列表都是最新的,而且更新的效率很高,因为每次更新信息相对于重新获取这些数据信息量是很小的。正是这个原因,玄玄围棋在实现CWS/IGS的对局室时,只列出对局双方的信息,而不像Tom/YC,还包括观棋者列表。

5、赌棋功能
Tom/YC具有赌棋的功能,就是在看棋的时候用银两押某一方胜负的功能。按说这一功能和下棋的关系不大,有时还会有押某两支球队的比赛哪支获胜的赌局,这和围棋一点关系都扯不上。但即便如此,还是有许多人乐此不疲。我就见过不少人,他们几乎不下棋,专门赌棋,虽然赢来银两只是一个虚拟的数字。有过一段时间,发现我自己居然也有点上瘾了,在看棋时心揪得更紧。或许,好赌也是人的天性吧。

如果将CWS看成是第1代的围棋服务器的话,IGS可以算2代,而Tom/YC则是第3代。上述的5大差异基本上反映了第2代与第3代围棋服务器之间的差异。下面我们来看看,IGS这个2代服务器相对于第1代的CWS到底做了哪些改进,在比较的过程中我可能还会顺便就同一功能和Tom/YC进行比较。

IGS通常上面的用户可达3000多人,而NNGS服务器的源代码很多年以前我是看过的,记得好像支持的在线用户数大约不到1000人,CWS好像是500人。要支持3-6倍的用户数,我相信看不见的改进肯定不少。此外,IGS还做了如下改进:
1、为了和传统的客户端兼容,IGS支持传统方式的对局申请。这一申请方式有许多不足,其中主要的是,不能在申请时说明让多少子,是否猜先。因此IGS引进了所谓“新对局申请”方式,这一方式除了弥补了前面说的两个不足,还可以在申请时说明是采用熊猫网计时方式还读秒方式。所谓的“熊猫网计时方式”就是我们知道的“加拿大计时方式”,它规定在读秒时,必须在规定的时间内走完25手。虽然IGS可以采用读秒方式进行读秒,但是真正使用这种方式下棋的人非常少,我统计了一下,大约不会超过千分之二。如此低的使用率,加上它将读秒时间分成三个组成要素,1 基本读秒时间 2 考虑时间 3 考虑次数,这让读秒时间的显示变得很复杂,完全不像Tom/YC那样的,30/60秒3次,简单明了。因此玄玄围棋不支持在IGS上使用读秒方式的。这里捎带一提的是,为了实现新对局申请方式,作者花了很长时间,烦得半死。
2、IGS支持“自动申请对局”(Tom/YC也支持,但实现的方式好像不一样,使用的人相对较少,要申请成功不是很容易,还要付出银两)。这一功能我觉得很有用,常常是“自动申请对局”的按钮一按下,就可以立即开始对局。
3、IGS支持用户设定对局条件。对局条件主要是对局时间和让子猜先的设定。有了这一设定,其它人如果使用“新对局申请”方式向你提出对局申请,就必须符合你设定的条件,这样免去了许多无谓的打扰。另外还可以设定自动申请对局的条件。
4、对于悔棋的处理IGS也比较好。CWS规定最多只能悔棋5次。常有对手在达到这个极限前反复要求悔棋。而IGS的处理策略是这样的,一旦某一方的悔棋请求被另一方拒绝,双方就不能再悔棋了。而Tom/YC的策略是对局申请时就规定是否允许悔棋。这有点死板。常常是,明显是鼠标点错了的棋,因为一开始申明不能悔棋而无法悔棋,导致对局无效。
5、在IGS上,下手向上手申请对局时,系统通常会自动设定让子。对局结果计入升降级比赛成绩,而在Tom/YC上,让子棋只算友谊对局,不计入升降级比赛。因此,在Tom/YC,让子棋比较少,而在IGS上,让子棋随处可见。让子棋有让子棋的乐趣。
6、IGS的用户信息中包含“国家/地区”的信息,彰显了IGS的“国际性”。Tom/YC在这方面还有待改进。
7、IGS提供了局后对弈双方复盘的功能,玄玄围棋称之为“连线复盘”。这一功能Tom/YC上也有。玄玄围棋在7.0的第一次发布中尽量包含这一功能,除非预计实现它会严重推后新版本的发布。玄玄围棋在写这篇搏文时,IGS对弈模块就差这个功能没有实现,其余全部写好了。
8、 IGS引入了“新段位评定”方式,比如同样是1段,分为 1d?、1d、1d+,分别代表自设1段,系统认定1段,系统认定强1段。它们之间的水平往往差距较大。
9、IGS需要“弃权一手”3次才开始进入点目模式,这样更合理。2次就进入点目有人会不粘劫就进入点目模式,从而便宜1目。

从以上可以看出,Tom/YC虽然总体上比IGS要先进,但在许多实用性细节上IGS反而要更好,上面的2、3、4、5、6都是IGS更为优秀的地方。当然IGS也有改得连CWS都不如的地方,例如,用户的留言信息只能是一行,对局历史列表只列出最近24小时内的成绩。Tom/YC不允许用户留言,但对局历史却非常详细,还可以调出历史棋局来看。另外,IGS在大厅中不能交谈,只能用户间一对一交流或在对局室内评棋,大厅里显得很冷清。
我认为,如果在第3代的Tom/YC基础上再结合IGS的各种优点,就可以算第4代的围棋服务器了,那就是围棋服务器中的F22了。真希望有机会能自己写一个这样的服务器。

转自:http://blog.sina.com.cn/s/blog_67de34630100p96w.html

航行日志

编写高效的CSS选择器

发表于 2013-05-08 | 分类于 程序人生

高效的CSS已经不是一个新话题,也不是一个我非得重拾的话题,但是,它却是自我在SKY工作以后,真正感兴趣并始终关注的一个话题。

很多人或者忘记了,或者仅仅是没有意识到,CSS可以是高效的也可能导致低能。然而,我们可以不考虑当你自认为会的太少而使用了低效的CSS这种情况。

这些规则只真正用在性能要求很高的网站上,这些网站对速度要求很高,任何一个页面可能含有成百上千个DOM元素。但是实践出真理,不管你是在打造下一个facebook 还是在开发一个本地的展示网页,多学点总是好的….

 

CSS 选择器

CSS 选择器对我们大多数人来说并不新鲜,较基础的选择器分别是类型(如 div),ID(如#header)和类(如.tweet)。较不寻常的包括基础的伪类(如:hover)和更复杂的CSS3以及 ‘正则’(‘regex’)选择器,比如:first-childor[class^=”grid-“]。选择器具有固有效率,引用Steve Souders的话来说,较有效到较不有效的CSS选择器的顺序是这样的:

  • ID,如#header
  • Class, 如.promo
  • Type, 如div
  • Adjacent sibling, 如h2 + p
  • Child, 如li > ul
  • Descendant,如ul a
  • Universal,即*
  • Attribute, 如[type=”text”]
  • Pseudo-classes/-elements, 如a:hover

    引用自Steve Souders的Even Faster网站认识这很重要,虽然一个ID技术上更快而且表现更优,但几乎都不这样用。用Steve Souders的CSS测试器,我们可以发现一个 ID 选择器 和 一个类选择器 在再渲染速度方面差别很小。在一台Windows机器上的Firefox6中,我获得了关于一个简单的类选择器的平均再渲染数据。ID选择器给出了12.5的平均值,所以实际上它要比一个类再渲染得慢一点。
    ID与类之间的速度差异几乎是不相干的。

    对一个类型(<a>)的选择测试,相比一个类或ID给出了慢得多的再渲染。对一个层次非常多的子孙选择器的测试给出了 大约440的数值!通过这我们可以发现IDs/classes与types/descendants的差别非常巨大…它们自身之间的差异很细微。
    注意 这些数值在不同的机器和浏览器变化非常大。我极力建议你自己运行一下。

    组合选择器

    你可以单独使用一种标准选择器,如#nav,来选择所有以”nav”为ID的元素,你也可以使用组合选择器,如#nav a,来选择任何在ID为’nav’的元素里面的链接元素。现在,我们从左到右读这个组合标签。我们先找到#nav ,然后再找到里面的元素。但是我们的浏览器不是这样解析的,它是从右到左来解析这些组合选择器的。当我们看到#nav里面有个a,而浏览器看到的却是有个a在 #nav里面,这些细微的差异对浏览器的性能有重大影响,同事学习他们是很有价值的。如果想知道浏览器这样解析的原因,请参考this discussion on Stack Overflow.对浏览器来说,从最右边的元素(它最想渲染的元素)开始,然后回溯到DOM树比从DOM树的最高层开始选择向下寻找,甚至可能达不到最右边的选择器(关键的选择器)要高效。这对CSS选择器的性能有重大影响….

    关键选择器

    这里讨论的关键选择器, 是处在复杂选择器最右端的选择器,也是浏览器最先解析的选择器。让我们回到讨论开始的地方,哪种选择器最高效?哪种选择器作为关键选择器会影响选择器的性能;当我们书写CSS代码的时候,正是这个关键选择器影响选择器的效率。一个关键选择器是这样的:


    PHP代码

  1. #content.intro{}

    天生高效选择器如类型选择器是不是就会有更高的性能?浏览器会寻找.Intro的所有实例(数量不会很多),然后向上查找DOM树,以确定该关键选择器是否在以“content’”为ID的元素里面。然后,以下的选择器性能就不怎么好了:



    PHP代码

  2. #content*{}

    这个选择器做的工作是这样子的,它先查找每个页面(是每个单个的页面),然后去看看它们是否有一个 #content 的父元素。这是一个非常不高效的选择器,因为它的关键选择器执行开销太大了。运用这些知识我们就能在分类和选择元素时做更好的选择。
    假设我们有一个非常庞大的页面,非常的大并且是一个还有一个庞大的网站。在这个也面上,有上百甚至上千哥<a>标签。社交媒体的链接只占很少的一部分,并且包含在ID为#social的<ul>里面。假设这些链接是,Twitter, facebook, Dribble 和 Google+。我们在这个页面上有四个社交媒体链接,还有上百个其他的链接。以下这个选择器代价很高而且性能不好:



    PHP代码

  3. #social a{}

    浏览器将访问扫描页面上的上千个链接,然后才选择上#social节点下的四个链接。我们的关键选择器匹配了大量的我们并不感兴趣的标签。为了消除这个问题,我们可以为每一个包含在社交媒体<ul>块下面的<a>标签指定更明确和显式的选择器.social-link。但是这跟我们所知道的恰恰相反;我们知道了,当我们使用精简的标签的时候,尽量不要使用多余的类。这就是为什么我觉得性能是如此的有意思;在网页标准最佳实践和速度之间,需要一个平衡。我们通常会这么写:



    PHP代码

  4. <ul id=“social”>

  5. <li><a href=“#” class=“twitter”>Twitter</a></li>
  6. <li><a href=“#” class=“facebook”>Facebook</a></li>
  7. <li><a href=“#” class=“dribble”>Dribbble</a></li>
  8. <li><a href=“#” class=“gplus”>Google+</a></li>
  9. </ul>

    CSS:



    PHP代码

  10. #social a{}

    现在我们改为:



    PHP代码

  11. <ul id=“social”>

  12. <li><a href=“#” class=“social-link twitter”>Twitter</a></li>
  13. <li><a href=“#” class=“social-link facebook”>Facebook</a></li>
  14. <li><a href=“#” class=“social-link dribble”>Dribbble</a></li>
  15. <li><a href=“#” class=“social-link gplus”>Google+</a></li>
  16. </ul>

    对应的CSS:



    PHP代码

  17. #social .social-link{}

    这是一个全新的关键选择器,匹配更少的元素,意味着浏览器可以更快地找到它们并给它们赋予样式。同时,实际上,我们可以进一步精简选择器,使用.social-link{},而不需要过渡的约束它;阅读下一章节来了解详情。所以,概括的说,你的关键选择器是其中一个决定浏览器的工作量,所以你需要好好的留意它。

航行日志

JavaScript之JSON详解

发表于 2013-05-08 | 分类于 程序人生
向服务器发出Ajax请求时,可以以两种不同的方式从服务器响应检索数据:一种是使用XMLHttpRequest对象的reponseXML属性访问XML格式的数据;一种是XMLHttpRequest对象的responseText属性访问字符串格式的数据。当前,XML是进行数据传输的标准语言,但是使用XML的缺点之一是很难对它进行解析并提取要添加到页面的数据。
 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,我们称之为JavaScript对象表示法。使用JSON进行数据传输的优势之一是JSON实际上就是JavaScript。它基于ECMAScript第3版中JavaScript对象字面量语法子集的一种文本格式。这表示可以使用responseText从服务器中检索JSON数据,然后再使用JavaScript的eval()方法将JSON字符串转换成JavaScript对象,那么,使用附加JavaScript就可以很地从该对象中提取数据,而不需要处理DOM。
 另外,也有针对大部分编程语言(包括C++,C#,ColdFusion、Java、Perl、PHP和Python)的JSON库,这些库能将上述语言格式化数据转换成JSON格式。

 尽管有许多宣传关于XML如何拥有跨平台,跨语言的优势,然而,除非应用于Web Services,否则,在普通的Web应用中,开发都经常为XML的解析作秀了脑筋,无论是服务器端生成或处理XML,还是客户端用JavaScript解析XML,都常常导致复杂的代码,极低的开发效率。实际上,对于大多数Web应用来说,根本不需要要复杂的XML来传输数据,XML的扩展性很少具有优势,许多Ajax应用甚至直接返回HTML片段来构建动态Web页面。和返回XML并解析它相比,返回HTML片段大大降低了系统的复杂性,但同时缺少了一定的灵活性。XML使用元素、属性、实体和其他结构。JSON不是文档格式,因此它不需要这些附加结构。因为JSON数据只包括“名-值”对(对象)或值(数组),所以JSON数据比同等的XML数据占用更少的空间,执行速度更快。
 (一)JSON语法 
 JSON建构于两种结构:
 对象——名称/值对的集合。不同的语言中,它被理解为对象,纪录,结构,字典,哈希表,有键列表(keyed list),或者关联数组。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
 数组——值的有序列表。在大部分语言中,它被理解为数组。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
 JSON没有变量或其他控制结构。JSON只用于数据传输。
 JSON语法是基于对面字面量和数组字面量的JavaScript语法。当使用字面量时,将包括数据本身,但不包括生成数据的表达式。
 1、 数据类型
 JSON数据结构包含以下数据类型:字符、数字、布尔值(true/false)、null、对象,数组。
 JSON字符串必须使用双引号括起来。它们使用标准的JavaScript转义序列。因此在以下列字符的前面要添加一个反斜线:
 JSON具有以下这些形式:”(引号)、b(空格)、n(新行)、f(换页)、r(回车)、t(水平定位)、u(为Unicode字符增加4个数位)、\(反斜线符号)、/(正斜杠符号)。
 2、对象字面量
 JSON使用字面量来表示对象,如果有一个以上的成员对象,则在JSON中,可以将其表示为一个包含拥有两个对象的数组的对象。下列代码显示JOSN文本形式的member对象:
 {“memeber”:[
       {
             “name”:”Tom”,
             “age”:22,
             “country”:”USA”
 },
 {
             “name”:”WangMing”,
             “age”:25,
             “country”:”China”
 }
 ]
 }
 3、使用JSON解析器
 可以使用JSON解析器从对象和数组中创建JSON文本或者JSON文本中创建对象和数组。JSON站占www.json.rog/json.js上提供有JSON解析器,通过将下列代码加入到页面的头部上即可使用。JSON解析器提供了两个函数:toJSONString()和parseJSON()。
 toJSONString()方法被添加到JavaScript Object和Array定义中,该方法能将JavaScript对象或数组转换成JSON文本。不必将对象或数组转换成字面量就能使用该方法。
 parseJSON()方法能从JSON文本中创建对象或数组。
 (二)使用XMLHttpRequest对象创建JSON数据请求
 1、创建请求
 如果直接请求服务器上一个JSON文件中的JSON数据,则可以利用文件名来请求JSON文件。
 respone.open(“GET”,”classes.txt”,true);
 在这种情况下,classes.txt是JSON数据文件的名称,request是创建用来存放XMLHttpRequest对象的变量。
 2、 解析响应
 一旦接受服务器的JSON数据,就可以采用两种不同的方式解析该响应。可以使用JavaScript的内置函数eval(),或者为了进一步的安全,使用JSON解析器代替。
 eval()方法可以把JavaScript字符串当作参数,还可以将该字符串转换成对象,或作为命令动作。如果使用XMLHttpRequest对象的responseText属性请求JSON数据,那么使用eval()将JSON文本字符串转换成JavaScript对象。因为JSON字符串常包包含花括号,所以用圆括号来括住JSON字符串,以表明字它是一个求值表达式,而不是一个要运行的命令。
 var jsonResp=request.responseText;
 jsonResp=eval(“(”+jsonResp+”)”);
 如果Web服务器既提供JSON数据也提供请求页面,则适合选用eval()方法。如果涉及安全,则适合使用JSON解析器。JSON解析器只作用于JSON文本,并且不执行其他JavaScript。在这种情况下,可以使用responseText,但要使用parseJSON()方法将JSON文本字符串转换成JavaScript对象。要访问parseJOSN函数,需要要添加引用json.js文件到页面中。
 var jsonResp=request.responseText;
 jsonResp=jsonResp.parseJSON();
 下面以实例来说明在JavaScript中简单使用JSON:
 <script type="text/javascript">
 var user =[
 {
       "name":”shenmiweiyi”,
       "QQ":306451129,
       "email":”shenmiweiyi@163.com”
       "address":
       [
             {"City":"ZhengZhou","ZipCode":"450000"},
             {"City":"BeiJing","ZipCode":"100000"}
       ]
 },
 {
       "name":”kehao”,
       "QQ":254892313,
       "email":”kehao@163.com”
       "address":
       [
             {"City":"ShangHai","ZipCode":"200000"},
             {"City":"GuangZhou","ZipCode":"510000"}
       ]
  }
 ]
 alert(user[0].name+”的Email是:”user[0].email);  //outputs shenmiweiyi的Email是:shenmiweiyi@163.com
  alert(user[1].name+”住在:”user[1].address[0].city) //outputs kehao住在:ShangHai


JSON已经是JavaScript标准的一部分。目前,主流的浏览器对JSON支持都非常完美,应用JSON,我们可以从XML的解析中摆脱出来,对那些应用Ajax的Web2.0网站来说,JSON确实是目前最灵活的轻量级方案。

转载自http://www.yiiyaa.net/

航行日志

卡尔维诺 孤独

发表于 2013-05-07 | 分类于 段子

我停下来打量他们。他们在干活,晚上,在一条冷僻的街上,在商店的门板上动手脚。这是一块很重的门板。他们正用一个铁门闩当杠杆,但是门板就是一动不动。
我当时正在闲荡,一个人,没什么特别的地方要去。我就抓住那个铁门闩帮他们一把。他们挪了点地方给我。我发现,大家并不是同时在使劲,我就叫:“嗨,往上!”站我右边的人用他的肚子捅了捅我,低声说:“闭嘴!你疯了!你想叫他们听见吗?”我晃了晃我的脑袋,就好象是说我不过是说漏了嘴。
撬门板这件事颇费了我们一点时间,大家都浑身是汗,但最后我们终于把门板撬到足够一个人从下面钻进去的高度了。我们互相看看,十分高兴。然后我们就进去 。他们让我提着一个口袋,其他人把东西拿过来放了进去。“只要那些狗娘养的警察别出现!”他们说。
“对!”我说:“他们真是狗娘养的!”
“闭嘴!你没听见脚步声?”他们每隔几分钟就这么说一次。我很仔细地听着,心里有点害怕。
“不,不,不是他们!”我说。
“那些家伙总在你最不希望他们出现的时候到来!”其中一个人说。
我晃了晃自己的脑袋,说:“要是能把他们统统杀了就好了。”
接着,他们派我出去,到街角探探风,看看有没有人过来。我就出去了。

外面,在街角,另有一群人扶着墙,身子藏在阴影里,慢慢地朝我移过来。我就加入进去。
“你干什么!”旁边的人严厉地低声问道。
“那边有情况。”我指着那个商店说。
“收回你的胳膊,白痴,他们会看见我们,然后逃走的!”他嘘了一声。
“好的。”说着,我也在墙边蹲了下来。
另一个说:“只要我们不知不觉地包围他们,就可以把他们活捉了。”
“他们好像没有很多人。”我说。
于是,我们一点点地朝前移动,所有的人都屏着气息,蹑手蹑脚。每隔几秒钟,我们就交换一下晶亮的眼神。
“现在他们逃不掉了。”我兴奋地说。
“我们终于可以在现场抓获他们了。”有人说。
“这些不要脸的混蛋,胆子也太大了,竟敢破店而入!”有人低声吼道。
“真是混蛋!”我愤怒地重复道。
由于我是一个普通老百姓,有人提议派我到前面看看,探探风。我就又回到了商店里。

“情况怎么样?”一个人一边忙着装东西一边问我。
“有人来了,不过他们离这儿还挺远呢。”我说。
“快,我们从后面出去!这样我们就能在他们的鼻子底下溜走了。”另一个人说。
我们的嘴角都挂上了胜利者的微笑。
“他们一定会备感痛心的。”我说。
接着,我们从商店后门鱼贯钻出。
“那群白痴被我们愚弄了!”我得意地说。

这时一个声音响起来:“站住,谁在那儿?”接着,那群追赶的人就从商店的后门冲了出来。我们被吓坏了,撒腿狂奔!在路上,我被绊倒了三次,渐渐落在了后面。很快我就发现自己混在了追赶的队伍里!
“快点,快点!”有人对我说:“这次千万不能让他们跑掉了!”
“他们已经跑不动了!”我高兴地说。
那群被追赶的人果然越来越近了,我大声喊道:“快点站住吧,你们跑不掉啦!”
终于,我追上了他们中的一个。他说:“干得不坏,你逃出来了?快,朝这边跑,我们就可以甩掉他们了!”
我就和他们一起跑。过了一会儿,我发现又剩下我一个人了,有个人从巷道口闪出身子,对我说:“快快快,这边!我看见了,他们朝那边跑了!”
跑着跑着,我停了下来,浑身大汗淋漓。周围没人了,我再也听不见叫喊声。我把双手插进口袋里,开始走。一个人,没什么特别要去的地方。

航行日志

恭喜小顾定段成功

发表于 2013-04-30 | 分类于 成长路上

金陵杯第一阶段的定段赛今天结束了。

定段赛相比定级,激烈的不少,8盘棋分了两天的赛程。这一轮定段,有350多名小朋友参加,规模还是很大的。

第一天的比赛,其实我比小家伙兴奋,早上5:30就醒了,起来后准备好了应用物品。由于赛场离得比较远,必须6:00就叫他起床。不过这次叫起床无比轻松,一喊就吧嗒翻身起床,自己穿衣穿裤。洗漱已毕,和爷爷三人,早早出发。本来天气预报要下雨的,还好没下,方便了不少。

来到秦淮体育中心已经7:30了。稍作整顿,小家伙便进了赛场。

家长们乱哄哄的在大厅里等待,甚至的有还打起来掼蛋。

40分钟过后,陆续有小朋友出来了,胜的兴高采烈,败的神态各异。看到小顾出来时,我看出来他胜了,蹦蹦跳跳的。棋开得胜是个好兆头。

不过,第二个对手就没那么轻松了,吃了败仗。第三盘,他开始谨慎起来,又赢了一局。本来他就在2月才定上1级,这次就是个练兵,看看在什么水平,两胜至少也保本了。

第一天结果还不错,2胜2负,没有吃0蛋。

IMG_3422

第二天,小顾好运气,小顾的好朋友柴同学的爸爸妈妈好热心,特地带我们一起去赛场,免去了我们转车的麻烦,真是谢谢他们。

[caption id=”attachment_534” align=”aligncenter” width=”224”]比赛间歇都在玩iPad,那么多脑袋 比赛间歇都在玩iPad,那么多脑袋[/caption]

碰运气的小顾今天真是顺,上午两连胜,居然还有定段的机会,完全出乎我的意料。第七盘,小输了8目。居然他还有机会下最后一盘,最关键的是,这时,小分居然有66分。如果拿下最后一盘,非常有机会定段。

最后一场,进去以后,我在想着他输着出来的样子,应该不会很难过的,他胜四盘后心情放松很多。这次的时间等的有点久,大概过了50分钟,第一批小孩出来了,手里拿着单子的,应该是定段成功的,6盘直接定上了。又过了一会,第二批小孩出来了,这次有的哭、有的垂头丧气,不过里面还是没有小顾。又下来了两批,有赢有输,就是没有小顾。

难不成赢了?这时,一位很Nice的美女工作人员告诉我,小顾真赢了,在算小分呢(小顾中班,个子还比较小,很容易给人留下印象)。这家伙今天真是发威了啊,居然又胜了。由于之前我闲着等,就算了下小分,非常有机会。心里有了那么点期盼。大概又过了10分钟,终于最后一班电梯下来了,小家伙表情严肃的告诉我,他获胜了,其实我早就看到他手里的通知书了,第一次定段居然侥幸过关,离定级只隔了2个月,有点小厉害。

IMG_3438加油吧,小顾!

最后必须感谢梁老师、王老师、汪老师、许斐老师、段老师的付出的心血。谢谢你们啦,没有你们的悉心教导就没有今天小顾的成绩,谢谢。

 

123…15
Wooley Gu

Wooley Gu

我将去向哪里

147 日志
22 分类
95 标签
友情链接
  • 栖霞棋院
© 2016 Wooley Gu
由 Hexo 强力驱动
主题 - NexT.Pisces