男女的友谊-当哈利遇上莎莉

有一部电影常常听人说起,这么一部经典的电影经常与男女之间的友谊扯上关系。作为电影爱好者的我却一直没看,在艳阳天的周末,一个人静静的欣赏了这部好片“当哈利遇到莎莉”。

大学毕业后莎莉和哈利结伴驱车到纽约,两人由此相识,但却是一个糟糕的开始。途中两人言语相左,成为对方讨厌的人,到纽约后两人得出不可能成为朋友的结论后,不欢而散。也由此引出经典的男女问题,排除性男女之间是否有纯友谊。

男女之间是否存在纯友谊?这个问题被人反复讨论了无数次,跟大多数问题一样没有定论,相信和不相信者自由其理论。此命题首先界定了主体为两个异性的人类,但我想先将命题变换为两个同性的主体。同性之间是否存在纯友谊?

继续阅读

谎言

chapter 1

阿香从小喜欢说谎,她在每次说谎中得到乐趣得到满足,即使母亲都打骂教育她不能说谎,但她总是左耳进右耳出。一天,她见好友买了新鞋便欺骗对方父亲也给她买了,只是过几天才能穿。她在河边找到了正在垂钓的父亲,想问父亲拿钱,在父亲的追问下道出想买鞋的实情,还说父亲上次答应了考100分就可以买鞋。父亲问她把考卷拿出来看,她支支吾吾把考卷拿出来但却不肯给父亲看,最后特意扔进湖。阿香和父亲的感情很好,在打闹嬉笑中父女之情表露无遗。父亲笑着说我帮你捡起来随之跳进湖里,却再也没起来过。当然阿香没考100,当然阿香没想到一个小小的谎言葬送了父亲的性命,当然阿香无法原谅自己。从此阿香不再说谎,她母亲也是个不说谎的人,只是阿香无法向任何人说真话父亲是自己害死的。说真话的阿香不再是以前受人欢迎的那个嘴巴甜的姑娘,长大后阿香要去城市里,母亲告诉她城里是个没有谎言、充满真理的地方。阿香告别母亲,前往那个没有谎言的地方。可是前途未知,阿香不知道,世上根本不存在没有谎言的地方。

继续阅读

《异乡人》读后感

chapter 1

广州已经持续了几日的阴雨天气,今天终于悄然退出。清晨仍是乌云密布的样子,让人们在期盼的周末到来时,望着阴暗的天空,感受甚是丧气。当以为又要窝在家消磨时光,阳光终于还是耐不住寂寞,拨开遮挡在他眼前的云障,用其温暖的力量再次统治大地。广州的冬天像是秋天,有时又让人以为春天已经不知不觉到来,沐浴在和煦的阳光中,是我今天必须做的,这样的力量这样的温暖,再坚硬的墙也无法抵挡如此激烈的欲望。

chapter 2

恰巧有事需要来天河这边一趟,当我把事结了后,想起有家书店一直想去,就步行道天河北的这家1200bookshop。开在繁华的地段,无需走上几段幽静,意外的是整条街上的建筑和商店都给人清新恬静的感觉,而书店就在显眼的地方,让我不禁想起小隐隐于林,大隐隐于市。在广州生活这么多年,好像第一次发现,或许是以前路过却不留意吧,又或许在我离开的这五年,发生了许许多多的变化,难道不是吗?世上不缺少美的地方,只是少有发现美的眼睛,也缺少寻找美的自然心境。走进书店,一排排棕色木质的书架,满满各式各样的书,人不多,大多坐在桌旁静静的阅读或虚席,我知道我来对地方了。不像方所的拥挤,想起上次去方所看到都是人头,就没有走进的欲望。聊聊数人如我般徘徊在书架边,随手拿起一本书,看上一段。耳边是淡淡的音乐声和沙沙的翻书声,这是独属于书店的协奏曲,静谧而空灵。

继续阅读

我为什么阅读

chapter 1

拖着疲惫的身躯踏上这辆通往港湾的列车,我理应庆幸,每天往来与人流高峰恰好反方向,车上显得没这么拥挤,但做些什么打发这一段旅程的时光好呢?盯着车上的玻璃,看窗口黑洞洞的墙壁一闪而过,让思绪远离身体吗?还是像周遭的人一样做个低头族,刷刷微博朋友圈、玩游戏、看电影?但手机是我最不想拿起的工具,从包里拿出书,翻到上次停下遨游的地方。从什么时候开始,出门带包时总会放一本书,我已忘却,当习惯无意识成为一种本能后,总会忘了当时是怎么开始,是以一种什么心情在行动。在车上这种嘈杂、拥挤的环境看书,确是一种装逼的行为,或许有一个女孩走过来,问你“嗨,你在看什么?”然后你放下书,balabala开始愉快的聊天,也许如你所愿开始一段新的恋情,你看,在车上看书是一种泡妞的手段。即使不是如此狗血的桥段,你真看得下去吗?文字会变成一个个奇怪的符号,在空气中飘荡吗?当我拿起书,作者描述的世界在自己的世界中一一显现,外界的一切与我无关。

chapter 2

最近看了好多篇文章关于人为什么阅读,我也在思考,自己为什么阅读。印象中小时候最早看的书是凡尔纳的《海底两万里》,跟着尼莫船长穿梭在奇妙的海底世界中,还有是江户川乱步的侦探小说,最喜欢他小说里的怪人二十面相。说到我喜爱的侦探小说,后来看的当然有横沟正史,现在又迷上在国内大热的东野圭吾。随后我也投身于应试教育中,随之看的书少之又少,现在想来,后悔在自己青葱岁月没多阅读几本书,人生的不同阶段阅读带来的是不同的感受。上了大学后,可支配的时间变多了,有那么一段时间常常泡图书馆,温习功课或随手找本书阅读。不是学霸的我,甘愿当占座的流氓,早出晚归,消失在同学朋友的世界中。记得一好友跟我说“觉得你很厉害,竟能如此坚持”,当时的我心里清楚,这是一种无奈,阅读是逃避。直到现在,书和阅读成为我生活中不可或缺的一部分,坐车、闲暇的时间或每个失眠的夜晚都会翻翻书,周末找间咖啡馆看一本书,一坐一下午。

chapter 3

阅读等于为自己筑起一个避难所,几乎可以避免生命中所有的灾难。毛姆如是说,或许这也是我阅读的原因。生活中有很多磨难,工作上满是操蛋的事,但这种种在不久的将来回头看,都不算是事。只是在当时那烦心的时刻,或者心情很低落时,当负面情绪笼罩在我的天空时,我就逃进自己的避难所。阅读让我焦躁的心变得平静,想象作者的世界和我的世界合二为一,在这个奇妙的新世界里只有我一个人,但我并不孤独。后来阅读成了习惯,不再记得最初自己为什么阅读,不再思考阅读有什么意义。如果有人问我“阅读有什么用”,我会直接赠对方三个字“没毛用”。

Node loader

什么是loader

Node静态资源加载器。该模块通过两个步骤配合完成,代码部分根据环境生成标签。上线时,需要调用minify方法进行静态资源的合并和压缩。

npm install loader

render:

res.render('index', {
  Loader: require('loader')
});

或在app.js中:

app.locals({
  Loader: require('loader')
});

模板文件:

<%- Loader("/public/javascripts/aa.js", "/public/stylesheets/style.css")
.js("/public/javascripts/a.js")
.js("/public/javascripts/b.js")
.css("/public/stylesheets/style.css")
.done(assetsMap, prefix, combo) %>

环境判别

环境判别由done方法的第三个参数决定,如果传入combo值,将决定选用线下版本(false)还是线上版本(true)。如果不传入第三个参数,将由环境变量决定。

// 设置window下node环境变量
// 生产环境
set NODE_ENV="production"
// 开发环境
set NODE_ENV="development"

线上输出

在应用根目录下使用命令:

// loader views_dir base_dir
loader ./views ./

会在根目录下生成assets.json文件:

{"/public/javascripts/aa.js":"/public/javascripts/aa.2e4c08f9.min.js","/public/stylesheets/style.css":"/public/stylesheets/style.b6b3ce7e.min.css"}

在app.js中:

app.locals({
  Loader: Loader,
  assets: require('./assets.json'),
  mini_assets: true
});

done方法参数为:

.done(assets, '', mini_assets)

html为:

<script src="/public/javascripts/aa.2e4c08f9.min.js"></script>
<link rel="stylesheet" href="/public/stylesheets/style.b6b3ce7e.min.css" media="all">

ejs学习笔记--nodejs(四)

ejs模板引擎

因为express默认的模板引擎为jade,如果你想生成ejs的程序骨架,可以使用以下命令生成程序:

express -e myapp
// 安装依赖包,这里是express和ejs
cd myapp && npm install

在app.js

// 设置视图的路径
app.set('views', path.join(__dirname, 'views'));
// 设置模板引擎为ejs
app.set('view engine', 'ejs');
// 如果你的ejs模板后缀为.html
app.set('view engine', 'html');
app.engine('.html', require('ejs').__express);

一个简单的例子

在app.js中:

app.get('/', function(req, res) {
  res.render('index', {title: 'Express Ejs', message: 'hello world!'});
});

./views/index.ejs:

<!doctype html>
<html lang="zh_CN">
<head>
  <meta charset="UTF-8">
  <title><%= title %></title>
</head>
<body>
  <%= message%>
</body>
</html>

继续阅读

ejs学习笔记-源码(三)

EJS全局属性

EJS有三个比较重要的全局属性,分别为:

  • cache,设置模板是否缓存,默认值为true
    当你通过element或url创建EJS实例时,会在EJS.templates_directory对象中添加相应的属性(属性名为element的id或url),该属性为对象,其中text属性值为模板的内容。相应的有EJS.get(path, cache)EJS.update(path, template)的方法获取、更新缓存
  • type,设置模板的匹配符,默认为<
  • ext,通过url加载模板的文件后缀,默认为.ejs

EJS.Scanner类

我理解这个Scanner为一个解析器,用来解析EJS模板,它会解析模板非空的每行代码,然后对每行代码通过匹配符分隔后的字符串进行编译。匹配符为/(<%%)|(%%%%>)|(<%=)|(<%#)|(<%)|(%>\n)|(%>)|(\n)//(\[%%)|(%%\])|(\[%=)|(\[%#)|(\[%)|(%\]\n)|(%\])|(\n)/

原型方法scan

解析字符串,用分隔符\n将字符串分隔,保存到数组中,实现代码如下:

1
var source_split = rsplit(this.source, /\n/);
for(var i=0; i<source_split.length; i++) {
 var item = source_split[i];
 this.scanline(item, regex, block);
}
//如以下代码
<h1>date_tag</h1>
<div class="row"><%= date_tag('date', new Date())%></div>
<% var a = 'hello'; %>
//source_split数组值为
[0] '<h1>date_tag</h1>'
[1] '\n'
[2] '<div class="row"><%= date_tag('date', new Date())%></div>'
[3] '\n'
[4] '<% var a = 'hello'; %>'

原型方法scanline

解析字符串,通过分隔符将字符串分隔,然后执行回调函数。

1
var line_split = rsplit(line, regex);
for(var i=0; i < line_split.length; i++) {
    var token = line_split[i];
    if (token != null) {
        try{
            block(token, this);
        }catch(e){
            throw {type: 'EJS.Scanner', line: this.lines};
        }
    }
}
若line = <% var a = "hello"; %>
则line_split = ['<%', ' var a = "hello"'; '%>']

EJS.Scanner.to_text

如果参数是Date对象则返回toDateString(),若为其他对象返回toString(),否则返回空字符串。

继续阅读

google代码风格指南

本文翻译自Google HTML/CSS Style Guide

通用风格规则

协议

嵌入资源时省略协议。嵌入的图像或其他媒体资源、样式表、脚本的url地址是“http:”、“https:”可省略协议部分。可使URL变成相对地址,避免混合内容问题并略微减少文件大小。

1
<!-- 不推荐 -->
<script src="http://www.google.com/js/gweb/analytics/autotrack.js"></script>
.example {
  background: url(http://www.google.com/images/example);
}
<!-- 推荐 -->
<script src="//www.google.com/js/gweb/analytics/autotrack.js"></script>
.example {
  background: url(//www.google.com/images/example);
}

通用格式话规则

缩进

使用2个空格缩进。不要使用tab或tab混合空格。

大小写

只使用小写。所有代码使用小写,包括HTML标签、属性、属性值(不包括text/CDATA)、CSS选择器、CSS属性、CSS属性值。当然字符串仍可以使用大写。

1
<!-- 不推荐 -->
<A HREF="/">Home</A>
color: #E5E5E5;
<!-- 推荐 -->
<img src="google.png" alt="Google">
color: #e5e5e5;

末尾空格

移除所有末尾空格。它们是不必要并可能带来麻烦。

1
<!-- 不推荐 -->
<p>What?_
<!-- 推荐 -->
<p>Yes please.

继续阅读

ejs学习笔记(二)

视图工具

EJS封装了一些视图工具插件,提供创建常用视图(如link,form)的快捷方式,让你的代码更简明扼要、更易懂。

tag(tag, html_options, end)

创建一个标签,tag为标签名,html_options为标签的属性值,end参数可选,设置标签的结束符,缺省为’>’。

1
<%= tag('div', {id: 'divElm', class='row'})%>
//生成以下html
<div id="divElm" class="row"></div>

不过上面的代码在IE会报错,在EJS源码里是这么说的special case because “class” is a reserved word in IE,所以如果要设置class属性,则<%= tag('div', {id: 'divElm', Class='row'})%>

start_tag_for(tag, html_options)

创建一个标签的开始

1
<%= start_tag_for('div', {id: 'divElm', class='row'})%>
//相当于
<%= tag('div', {id: 'divElm', class='row'})%>

tag_end(tag)

创建标签的结束

1
<%= tag_end('div')%>
//生成以下html
</div>

single_tag_for(tag, html_options)

创建一个自封闭标签,如img,input。但的HTML5的规范里,标签可以不闭合,关于闭不闭合,伯乐在线有篇文章写得挺清楚的:http://blog.jobbole.com/61514/

1
<%= single_tag_for('img', {id: 'imgElm', src='image.jpg'})%>
//相当于
<%= tag('img', {id: 'imgElm', src='image.jpg'}, '/>')%>

继续阅读

ejs学习笔记(一)

为什么学习ejs

最近间间断断在学习nodejs,也尝试写小的网站,前阵子匆匆忙忙写了个UED网站,给组内同事使用,前端都是静态html,但实在写得太烂,所以也不了了之。因此下决心学习一个模板引擎,而决定学习ejs最大原因或许是它使用<% %>包裹代码吧,工作上一直使用的是asp,觉得上手会容易些也或许是由于习惯吧。本应该在本文开头分析ejs的优点,及其与其他模板引擎的对比的(如jade),但又觉得还没入门,没有太深的了解分析这些优点言之过早。

ejs基础

跟asp一样:

  • 使用<% %>包裹javascript代码段
  • 使用<%= %>添加html元素

官网上一张图很好阐释了ejs的作用:
图(1)

继续阅读