嘎子老家

8月17日,早早的,我和老常公司的小伙伴们,坐上了去白洋淀的长途大巴车。
中午时分,我们到达了雄县。 去到才知道,白洋淀比我想象的要大的多的多,
跨是个县:任丘、安新、高阳、雄县、容城。 国家5A级旅游景区, 有“北国江南、北地西湖”之誉。

本来去的时候,没有报太大的期望,真的到了白洋淀,才发现,白洋淀真漂亮。北京的周边野三坡,百里峡去过几次,
和白洋淀比起来,还是觉得白洋淀好的多。

还记得小学的时候,学过一篇课文「小英雄雨来」吗,白洋淀就是我们的小英雄雨来的故乡。
最近的关于白洋淀的印象是前些年的一个电视剧「小兵张嘎」 。 当时觉得,白洋淀的地形又那么复杂吗,鬼子进去没有
人带路,还走不出白洋淀了? 看到白洋淀才觉得是真的,白洋淀真大,真的很大。

白洋淀的景色真不错,尤其是傍晚,太阳落山的时候。

下面请欣赏路上的一些图片。(声明:手机拍的,未做任何后期处理。那天,那水,真的不用处理。)


抵达雄县汽车站


吃饭时,窗外的时不时的有船经过,猜猜照片上雾蒙蒙的是什么?


吃完饭,我们出发了,向着白洋淀


村口


村口




传说中的芦苇荡。挺船长说,水深的的地方有8-9米




入淀检查站


嘿,价格还真不便宜,不过从农家院买票,就便宜很多




情景喜剧:嘎子印象


嘎子印象,日本太君


小码头


白洋淀的另一处景色:大观园




拍了很多张大观园的照片,因为下午去的,35度高温,差点中暑。


这种荷花,小孩子能站上去,够厉害吧





看完大观园,回旅馆,遭遇到了,白洋淀的傍晚,太美了。


傍晚的芦苇荡,太安静了。


傍晚

傍晚

傍晚

傍晚

回到村口


早晨


早上的白洋淀,天真蓝


我们前面的木船


这是路吗?


水边的人家


芦苇荡


队友


芦苇荡

芦苇荡


回村,准备返程了


到北京了

园博园一日游

9月8日,我、我家领导还有我家领导的妹妹一起去逛园博园,听说香港「大黄鸭」来北京园博园了。
冲着大黄鸭的名气也去看看。

园博园的门票还真不便宜,100人民币(团购¥69),其实也就是一个大号的公园,人工在废墟上建立起来的「大公园」


入园




这是什么形象?


这售货机怎么和我们公司的售货机那么像,山寨?


从这个设备上可以看出,园博开了有段时间了


花车巡游


花车巡游


园博奇迹之一,「锦绣谷」说之前是大垃圾堆


锦绣谷


游人不少啊



前面是大黄鸭,看到了没?



力气真大,把大黄鸭都给拖起来了


它在看对面的游人呢?


看大黄鸭的人还真不少


回来的路上发现,原来有去看大黄鸭的专线,我们可是腿着过去的,走了好长的路。亮点:看大黄鸭专线


晋中园搭建的戏台


蒙古包里,墙上挂的画


蒙古包里,墙上挂的画


蒙古包里,墙上挂的画


百寿字,忘了是那个园里的啦



历史


宁波


百年红帮


百年红帮


这饭,一个字『贵』


桃花源记



拉萨园,很孤单


岭南




这椰子树,在北京,很怕冷吧





小姑娘一个人玩的很开心




西安园


西安园的Cosplay



园博后院





植树人


回见,园博

installing github pages

最近发现使用 github-page 来安装Jekyll,可以保持本机的Jekyll和github pages的包版本一直。
再也不用担心,不小心升级jekyll包,导致和github pages 不兼容了。

该方法是gitub官方提供的方法:

本地新建一个 Gemfile

source 'https://rubygems.org'
gem 'github-pages'

然后运行 bundle install , 然后等着就行了。

如果未创建Gemfile,也可以直接运行 gem install github-pages 来安装。

如果要升级,运行:bundle update or gem update github-pages

参考:

jekyll kramdown highlight

把Jekyll的markdown解析换为kramdown,主要的原因是kramdown支持像Github一样的代码块高亮写法。\
今天折腾了好久,Google后发现不是Jekyll的问题,原来如果要使用

1
phpinfo()

的代码高亮, 需要安装coderay。 找了半天文档,发现 http://kramdown.gettalong.org/converter/html.html
有这样一句。

Note that syntax highlighting won’t work unless the CodeRay library is installed!

解决办法:

gem install coderay

但是这还没完,完了发现 github pages 上没有安装coderay,只能作罢!(或者只能在本地编译好,然后传上去了 ..nojekyll)

参考:

jQuery Events 源码学习[转]

众所周知,jQuery 通过jQuery.event.add & jQuery.event.remove
方法对DOM元素(文本和注释节点除外)进行事件的绑定和解绑。这两个方法都提供了四个参数,
前三个参数elem, types, handler 是必选的,最后一个为可选参数分别是data和pos。

绑定:

jQuery在对DOM元素进行绑定事件时,
通过jQuery.data在jQuery.cache中存储绑定的事件类型、响应函数和可选参数data。该数据结构如下:

1
2
3
4
{
events: { },
handle: function(e){ }
}

events是一个对象,events中的属性值存储的是事件类型;值是一个数组。当为DOM元素绑定事件时,首先会创建一个包含响应函数、事件类型、guid和一些附加信息的对象,如果events中不存在值为该事件类型的属性,则添加一个值为该事件类型的属性,和一个值为空的数组,然后将刚创建的新对象push到数组中;如果存在,直接push到相对应的数组中。看下面这个例子就一目了然了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 给id元素绑定两个单击和一个鼠标离开事件
$('#id').bind('click', function() { alert('once'); });
$('#id').bind('click', function() { alert('second'); });
$('#id').bind('mouseout', function(){ alert('mouseout'); });
// events对象的值
{
'click': [
{// 此对象还有:data,guid,namespace属性
handler: function() { alert('once'); },
type: 'click'
},
{
handler: function() { alert('second'); },
type: 'click'
}
],
'mouseout': [
{
handler: function(){ alert('mouseover'); },
type: 'mouseout'
}
]
}

handle是一个函数。
jQuery为每一个DOM元素绑定的任意类型事件的响应函数都是此函数,并不是直接将用户传入的函数绑定为响应函数。该函数会在执行时调用一个公共方法jQuery.event.handle,通过apply更改this的指向,此函数还有一个静态属性elem,也是指向DOM元素自己,下面是jQuery中的源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 引用自jQuery源码
add:
function(elem, types, handler, data) {
var elemData = jQuery._data(elem).handle, // 从jQuery.cache中提取的数据
eventHandle = elemData.handle; // 创建elem对象的事件响应函数
if (!eventHandle) {
elemData.handle = eventHandle = function(e) {
return jQuery.event.handle.apply( eventHandle.elem, arguments ); // 改变对象的this指向
};
}
// handle元素的静态属性elem
eventHandle.elem = elem;
while (type = types[i++]) {
var handlers = events[ type ]; // 查看type类型的事件是否存在
if (!handlers) {
handlers = events[ type ] = [];
// 绑定事件
elem.addEventListener(type, eventHandle, false);
}
handlers.push(handler);
}
}

当用户触发事件后,jQuery.event.handle首先会调用jQuery.event.fix对Event对象做兼容处理,
之后根据Event.type从jQuery.cache中获取用户绑定时传入的响应函数,逐个运行。

解绑:

主要思路是匹配guid,然后从jQuery.cache中events里删除包含相应的响应函数的对象。
最后检查该DOM元素还有没有绑定的事件了,
如果没有才是真的removeEventListener掉handle处理函数关删除jQuery.cache中的数据。

思考:

通过以上的了解,我们可以看到jQuery再为DOM元素的一种类型事件绑定多个响应函数时只会addEventListener一次,
而不需要重复addEventListner,并且该DOM元素的所有类型的事件响应都指向一个函数。这时我的脑子里便浮出了这些问题(这里不谈浏览器兼容上比如IE的内存泄漏之类的问题):这样做的好处是啥?可以减少内存的使用?还是可以提高运行效率?或者说jQuery只是为了对内部事件模块的统一管理?这只是本人所想的到的一些问题,John Resig 这样设计肯定有他的考虑。

接下来,本人就自己所想到的问题进行了思考。我们看看,
这样做的唯一一点就是减少了JavaScript引擎对各个DOM元素本身相同类型事件的listening数,
用一个对象将DOM元素绑定的响应函数重新组织了下,并增加了一些附加信息。难道说减少listening数可以减少对内存的使用,提高运行效率吗?如果是这样,我们便可以用最老土的方法来进行一些测试,以下是本人的测试方法和数据,仅供参考。

Chrome 11          内存使用/MB   解析时间/ms   处理响应时间/ms
jQuery.bind        17.5             44.75         30.75
addEventListener   21.75         215.75        11.5

以上数据是在window下的chrome 11.0.696.65环境中,绑定10 000个事件处理后,
测试得到的平均值。当我绑定100 000个事件处理时,使用原生的addEventListener Chrome就提示无影响了,
而用jQuery.bind是正常的。

根据上面的数据,jQuery这样做却实能减少内存的使用和提高JavaScript引擎的解析时间,
可是在触发事件后的响应处理要慢一点。