[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"list-\u002Farticles\u002F9":3},{"items":4,"total":134},[5,21,32,41,56,65,76,86,96,106,117,126],{"id":6,"type":7,"slug":8,"title":9,"date":10,"category":11,"tags":12,"body_markdown":15,"permalink":16,"excerpt_src":16,"media_type":16,"media_title":16,"media_author":16,"media_url":16,"rating":16,"layout":16,"pv":17,"admin_only":17,"created_at":18,"updated_at":18,"deleted_at":16,"status":19,"cover":20},116,"article","about-file-format","【科普文】有关文件格式","2013-11-26 09:27","tech",[13,14],"文件","格式","\n![题图](\u002Fassets\u002Ftech\u002F2013\u002Fabout-file-format\u002F01.jpg)\n\n这篇文章是在知乎回答的一个问题“为什么计算机需要各种各样的格式？能否有一种通用的格式来替代它们？”觉得挺有意思的，可以引起一些在信息架构方面的思考。如果有一天机器有了智能，那么也许我们的格式真的都不再需要了。\n\n首先，格式肯定不是伴随计算机而生的，它并不特指文件格式，而是指一种“规格”“规范”“约定”之类的东西。比如你写合同，最少要有合同正文和甲乙双方签字，这个就是合同的格式；比如你去银行办业务，要填表单，这个就是银行需要的格式；再比如你要写一首古诗，每句要换个行，这也是格式。这些都跟计算机无关，格式是普遍存在的。\n\n其次，格式存在的意义是什么？如上面的所有东西，都可以归为“文档”，或者更通用一些，叫“文本”。理论上，你也可以不需要任何格式，合同就从头到尾，把约定的事情讲清楚就行，去银行也写一段文字，上面交代清楚自己的资料，写诗就从头写到尾一大段，也行。没有格式，这些事情也可以做，那为什么还需要格式？因为有了格式，效率可以更高，比如你一看合同，就知道我该重点看条款，应该在结尾签名，一看银行表单就知道我应该在这栏填姓名，这栏填身份证号，一看分四行每行七字就知道这大概是一首诗了。格式的意义在于规范，让不同的东西有自己的规范，以便更好地书写、检验、读取，比如如果没有银行表单，你可能怎么也不知道要写证件号码，可能写了也不知道还要写发证机关，而有了这个表单（格式）之后，一切都变得好办了，你好写，工作人员也好检查填得对不对，也方便它录入电脑办理后续手续。\n\n\u003C!-- more -->\n\n回到计算机中的文件格式，和上面的格式是一样的，因为文件有不同的用途，约定自己的格式有助于更好地写入、检验和读取。比如你要生成一个文本文件，那按照文本文件的格式，直接ASCII编码，将编码写入磁盘就OK，比如要生成一个BPM文件，那按照BMP的格式，分四个部分，先写BM，再写文件的元数据，再写颜色表，再写图像数据。这样其它软件读取的时候，一看.txt就知道直接ASCII解码，当文本显示就行了，一个.bmp就知道分四个部分读，读完计算出像素值再显示出来。其它格式都依此类推，有了这些格式，生成软件和读取软件可以更好地处理不同类型的文件。\n\n最后，计算机能否有一种通用格式呢？其实这个问题其实不能用“能”或者“不能”来回答。计算机的文件格式是可以分层的，比如最底层，大家都是二进制，0101而已，没区别，全都是一样的格式，这正是这些不同格式的文件可以被放在同一个磁盘上的原因。在这之上是文件系统的格式，文件系统可以将这些0101以不同的策略来分布在物理磁盘上，也可以没事自己做做压缩、搬迁神马的。再之上是这些二进制数据0101的含义，同样的一段数据，可能在作为文本的时候表示“1”，但在作为图像的一部分的时候表示“一个黑色的点”。所以在“含义”这一层，不同用途的文件是一定会有不同的格式的，即便它们用了什么火星来的技术，使用相同的物理格式来保存，最后也一定在逻辑含义上有区分，而这些区分具体到我们日常理解的逻辑，便成了不同的文件格式。\n\nP.S.1: 在上面例子中，人与人之间交互可以使用不分格式的“文本”来做，是因为人具有自然语言书写和理解的能力，比如你写“我的身份证号是xxx”，或者写“身份证xxx”，别人都可以理解，但计算机不能，所以计算机必须通过严格约定的格式来区分不同格式，在逻辑上不存在通用格式。\n\nP.S.2: 将一个文件用base64编码，便得到一段上面说的“火星技术”类似的东西，即不管什么文件看起来都是一样的格式，但一旦被使用，仍然需要base64解码，变成不同的文件格式。追求这样一种看起来通用的格式，并没有什么正面意义，反而增加运算量和人的识别难度。\n",null,0,"2026-08-28 04:37:17","published","https:\u002F\u002Fassets.toobug.net\u002Fassets\u002Ftech\u002F2013\u002Fabout-file-format\u002F01.jpg",{"id":22,"type":7,"slug":23,"title":24,"date":25,"category":26,"tags":27,"body_markdown":30,"permalink":16,"excerpt_src":16,"media_type":16,"media_title":16,"media_author":16,"media_url":16,"rating":16,"layout":16,"pv":17,"admin_only":17,"created_at":18,"updated_at":18,"deleted_at":16,"status":19,"cover":31},68,"about-foreign-develops","关于国外开发者的感受","2013-11-11 12:00:00","life",[28,29],"国外","开发者","\n周末去参加了一场技术交流会，会场有很多外国专家。有两件事情让我感触很深：\n\n第一件是这些外国专家的年龄是如此之大，看得出有好多50甚至60岁以上的。\n\n此外，也有不少的女工程师专家。\n\n而反观国内，做技术的全是年轻小伙，瞬间让我有一种小孩子见长辈的感觉。\n\n由此也可以折射出国内外技术人员的生态问题，在国外，可以一生以技术作为职业，而且他们个个都做得很快乐，精神面貌非常好，似乎技术已经成为他们生活的一部分。而国内，技术只是一门维持生计的手艺，如果30岁甚至40岁还在做技术，一般会被人耻笑，似乎国内做管理才是唯一的出路。\n\n第二件是有关互联网环境，起因是他们到达国内以后没法用Gmail收取邮件，没法上facebook，没法发twitter……\n\n面对这些问题，他们居然束手无策，直到我给他们讲解在国内需要使用VPN或者SSH隧道才能顺利访问这些站点时，他们才明白。\n\n这件事的感受其实也有两个方面：一是国外的互联网环境是如此之好，以至于这些翻墙技术对他们来说完全就是废物一般，根本用不着，着实令人羡慕；二是国外的互联网真的都是一家，他们这些来自不同国家的人都在用facebook，都在用twitter，都在用gmail，都在用youtube，而我们在用人人网、QQ空间、新浪微博、QQ邮箱、优酷，让我觉得虽然我们都在做技术，但我们真不是同一个世界的人。\n","",{"id":33,"type":7,"slug":34,"title":35,"date":36,"category":26,"tags":37,"body_markdown":39,"permalink":16,"excerpt_src":16,"media_type":16,"media_title":16,"media_author":16,"media_url":16,"rating":16,"layout":16,"pv":17,"admin_only":17,"created_at":18,"updated_at":18,"deleted_at":16,"status":19,"cover":40},76,"xihu-image","印象西湖","2013-11-01 13:25",[38],"西湖","\n对不住大家，昨天又“空窗”了，原因是在写一篇题为《红袖添香》的文章，但因太久不碰文字，有点写不下去，故作罢。也许这篇文章会在不久后发出来，也许永远不会了，看灵感吧。\n\n今年8、9月份的时候有去长三角一带逛逛，见识颇多，待我以后慢慢道来。今天先讲讲“印象西湖”。\n\n2010年时去过杭州一次，当然，也就免不了要去西湖和西溪看看。西溪的印象非常一般，就不表了。西湖倒是还不错的。\n\n那年第一次去西湖是自己从火车站走过去的，在西湖东岸逛了一圈，风景非常不错，边上还有大大的草坪。第二次去是在几天后随淘宝的大部队一起去的，在西北岸，要有趣一些。雷峰塔、苏堤都在这一面。\n\n今年是第二次去杭州，因为是自己去玩，行程就安排得悠闲一些，前一天晚上云看了“印象西湖”的演出，第二天在苏堤上骑车逛了一圈。\n\n好了，终于可以说正题了——“印象西湖”演出。\n\n\u003C!-- more -->\n\n按照官方的说法，这是一场“大型户外实景演出”，还挺绕的，其实就是“在西湖上的演出”。等到我真的坐到观众席上，开始生出“舞台在哪”的疑问的时候，才发现舞台真的就在水面上，不愧是张艺谋的大手笔。\n\n演出一开始，一片黑暗，只有一个圆形的屏幕在交代背景，然后随着一束聚光灯，一白衣男子翩翩而来，一下就把人代入到了场景中……等到铺垫完毕时，四周的树突然一下子都发出各种颜色的灯光，一瞬间觉得美不胜收（题图）。\n\n再接下来，故事情节一一推进，女主角出现，相识相知相恋，到最后被干涉而不得不分开，各种光影效果的把握十分到位，几艘划在水面上的船也显得十分飘逸。\n\n![照片](\u002Fassets\u002Flife\u002F2013\u002Fxihu-image\u002F01.jpg)\n\n最后，如化蝶一般，有一个梦境的场景。可是当它出现的时候简直让人目瞪口呆，因为整个布景是从水面上升起来的！\n\n![照片](\u002Fassets\u002Flife\u002F2013\u002Fxihu-image\u002F02.jpg)\n\n就在这个如梦如幻的场景下，男女主角再次出现，并演绎了一段非常唯美的舞蹈。\n\n![照片](\u002Fassets\u002Flife\u002F2013\u002Fxihu-image\u002F03.jpg)\n\n最后，灯光散云，一切归于沉寂，演出结束。\n\n总的来说，这场演出还是非常值得一看的，在视觉效果上老谋子真的是发挥到了极致。另外值得一提的是音乐，整场演出是委约日本作曲家喜多郎先生作曲，很值得一听。\n\nP.S.\n\n1. 演出门票比较贵，最低的260\n2. 不同价格的门票基本没区别，都在同一片看台\n3. 张靓颖的歌曲《印象西湖雨》正是印象西湖表演的主题曲，看完演出会比歌词有更深刻的理解\n4. 请原谅手机渣画质，真实场景比这漂亮很多\n","https:\u002F\u002Fassets.toobug.net\u002Fassets\u002Flife\u002F2013\u002Fxihu-image\u002F01.jpg",{"id":42,"type":7,"slug":43,"title":44,"date":45,"category":46,"tags":47,"body_markdown":50,"permalink":16,"excerpt_src":16,"media_type":51,"media_title":52,"media_author":53,"media_url":54,"rating":16,"layout":16,"pv":17,"admin_only":17,"created_at":18,"updated_at":18,"deleted_at":16,"status":19,"cover":55},11,"film-a-grandson-from-america","【电影】孙子从美国来","2013-10-30 12:53","bmm",[48,49],"观后感","电影","\n![《孙子从美国来》海报](\u002Fassets\u002Flife\u002F2013\u002Ffilm-a-grandson-from-america\u002F01.jpg)\n\n今天聊点轻松的话题——电影。话说最近好像都木有能看的电影，不知道这种状况还要持续多久。当然，如果你有推荐的电影，也可以回复给我哦，稍后可以一并推荐给大家。\n\n看到《孙子从美国来》这部影片纯属偶然。某个寂寞的晚上，百无聊赖的情况下打开了电视，看到了金鸡奖颁奖晚会（其实我也不知道是哪一年的，是直播还是重播……）。\n\n在晚会上，除了一些比较熟悉的电影如《致青春》《中国合伙人》《一九四二》之外，提名较多的就是这部《孙子从美国来》了。刚开始接触这个名字的时候没有任何感觉，因为它像一个句子，一点都不像一部文艺作品的名字，也无法勾起人的兴趣，但是被提名的次数多了，也就忍不住想看看了。于是也就在某天熬到一点多，把它看完了。\n\n看完的感觉，这是一部相当温情的作品。温情片总有些会让人觉得乏味的地方，比如《桃姐》这样一部倍受好评的片子我就几乎看不下去。但这部片例外了，在温情当中透露着国产影片中非常难得的幽默感，几乎可以一直笑到接近尾声。在节奏方面也一点不拖沓，很多地方使用了非常明显的“暗示”手法，并不将情节真的放出来，有点黑幽默的感觉。这些安排使得全片几乎没有“尿点”，每个镜头都相当精彩。\n\n嗯，就到这里啦，不剧透了，有兴趣的不妨一看哦。\n\nP.S.\n\n1. 这部片的上映时间是2012年2月，因此现在在网络上已经可以随处找到了。\n2. 蝶恋花最忠实的关注者之一表示跟老公一起看了两遍，所以真的是部不错的片，不要错过。\n3. 这部片的豆瓣评分是8.0分。\n","movie","孙子从美国来","陈力","https:\u002F\u002Fmovie.douban.com\u002Fsubject\u002F10467774\u002F","https:\u002F\u002Fassets.toobug.net\u002Fassets\u002Flife\u002F2013\u002Ffilm-a-grandson-from-america\u002F01.jpg",{"id":57,"type":7,"slug":58,"title":59,"date":60,"category":26,"tags":61,"body_markdown":63,"permalink":16,"excerpt_src":16,"media_type":16,"media_title":16,"media_author":16,"media_url":16,"rating":16,"layout":16,"pv":17,"admin_only":17,"created_at":18,"updated_at":18,"deleted_at":16,"status":19,"cover":64},71,"meet-the-unknown-self","遇见未知的自己","2013-10-29 09:05",[48,62],"书","\n![《遇见未知的自己》封面](\u002Fassets\u002Flife\u002F2013\u002Fmeet-the-unknown-self\u002F01.jpg)\n\n今天带给大家的是一篇早年在知乎上回答“张德芬的作品卖点在哪里”这个问题时的答案，说的是《遇见未知的自己》这本书：\n\n刚好最近看了《遇见未知的自己》，感觉还是收获挺大的，简单根据印象谈几点，未必全面。\n\n书中强调的几个观点，一是关注自己，不要太在乎周围的世界。当然这不是说为了自己可以不顾全世界的感受，而是说，一些不必要的关注会给自己太多束缚，反而让自己活得不自在。一个简单的例子（不是书中的）是，好多人在完全陌生的环境宁可自己去看半天看不懂的路牌，也不愿意去问下周围的人，无非是碍于别人对自己的看法，觉得自己路都不知道，问起来多丢人之类，但是如果能抛弃这一些想法，会发现生活得更轻松，世界更大更美好。\n\n第二个观点是屈服于现实，即不要太关注事情是如何发生的，而是接受这件事已经发生的事实，去看如何面对。这是一种积极的态度，一味地去想怎么会这样对于问题的解决是无益的。\n\n第三个观点是检视自己的思想，即不要以为自己在想什么就应该去做什么，而应该回头看一看，这样的想法是不是合情合理的，客观地看待自己的思想。\n\n\u003C!-- more -->\n\n第四个观点是控制自己的情绪，不要去渲染，书中的所谓“胜肽”之类的意象其实说白了就是人会有一种本能地渲染自己情绪的能力，要意识到这一现象，然后去控制。丢了100块就是丢了100块，别扯到我怎么一直这么倒霉，为什么丢钱的总是我之类的命题上面去。\n\n我看完之后最大的一个感受是，其实所有的书讲述的道理都是一样的，读得懂的人自然会懂，读不懂的人依然不懂。但是这些书确实在一定程度上会让人去想这些道理，只有想了才会明白，最终才能知行合一，这是一件很困难的是，不是一朝一夕就能完成的。\n\n至于问题中的例子，不想要工作压力，不想要人际竞争，这些都是正常的想法，每个人都一样，而且，对不同的人来说，这些事情的影响是不一样的，看得淡得人真的就不会觉得有太多的压力、竞争。也是书中说的一个观点，观察者会影响被观察者，你有怎样的思想就看到怎样的世界。当你觉得生活很美好的时候生活它就是很美好的，并不是空中楼阁。当然，不是说美好的生活就一切都是完美的，每个人都会有自己的问题和烦恼，但是怎么去处理这些问题和烦恼会影响你对生活的感觉。\n\n另外不为钱而工作真的没什么好反感的，这不等于说“那你来给我工作，我不给你钱”，而只是说，不把注意力放在每个月的工资上面，而是放在自己手上的工作中。当你细心去做你的工作时，真的会发现工作中一些有趣的东西，还有一些可以积累的知识和经验，用这样的心态去工作时，自然效率会高，效果会好，随之而来的是钱也更多。\n\n另外书中也说到，爱好是让自己保持喜悦的一个好办法，所以旅游摄影小清新也是很好的，能让自己觉得喜悦，就会觉得生活很精彩。\n\n最后，我自己总结出来的其实就是：你工作是为了生活，要想办法关注到自己和自己的生活，而不是反过来一有时间就睡觉，只为了下一周的工作。用这样的态度，会觉得生活真的很有意思。\n\n最后的最后，回到这个问题，卖点在哪里，我也说不清，只能说它对于人的自我认知和对生活的认知是有积极意义的，但是最后读出来是什么内容，还得看是谁怎么样在读。\n\n另外一个答案下也有一个很精粹的小结，摘录如下：\n\n> 《遇见未知的自己》很不错，还要多读几遍。\n>\n> 贴书中的一个ABC公式，感觉很多东西豁然开朗了。\n>\n> 记住这个ABC公式：\n>\n> A(事件)——B（信念、想法）——C（结果）\n>\n> A永远是中立的，因为相同的A发生在不同的人身上，会有不同的C。比如我看见婆婆脸色不好看（A），如果我认为她讨厌我（B），我会觉得很难过（C），但是如果我认为她当时心情不好（B1），我会很中立地（C1）注意自己和她的互动;如果我认为她身体不舒服（B2），很心疼地关怀她，就有了完全不同的结果（C2）。\n\n写在最后：这其实是一本很不错的书，当初是我们乐团的指挥推荐给我的，可惜我在上班好久之后才去看，相见恨晚。在很多心理学讲座上也会提到这本书作为心理学入门教材，比较浅显易懂。\n","https:\u002F\u002Fassets.toobug.net\u002Fassets\u002Flife\u002F2013\u002Fmeet-the-unknown-self\u002F01.jpg",{"id":66,"type":7,"slug":67,"title":68,"date":69,"category":70,"tags":71,"body_markdown":74,"permalink":75,"excerpt_src":16,"media_type":16,"media_title":16,"media_author":16,"media_url":16,"rating":16,"layout":16,"pv":17,"admin_only":17,"created_at":18,"updated_at":18,"deleted_at":16,"status":19,"cover":31},160,"how_to_design_front_end_template_engine","如何设计一个前端模板引擎","2013-08-25 09:55:24","web",[72,73],"模板引擎","Template","\n前端模板引擎现在已经被广泛应用于前端开发了，几乎每个项目都会使用。微博上甚至出现了“不写个模板引擎就没办法在前端界混了”的言论。当然，这是玩笑话，却也能在一定程度上反映前端模板的普及程度。如果你还没有了解过前端模板引擎，赶紧去补补课吧。\n\n本文其实算不上是一篇讲模板引擎设计的文章，写这篇文章的动力来自于自己使用过一些模板引擎（jQuery Tmpl、jade、ejs、artTemplate以及ThinkPHP自带后端模板引擎）之后的心得，所以可能不会涉及到模板引擎设计的方方面面，更多地是讲模板引擎之间的一些有差异的细节以及我的思考和取舍。\n\n## 来历\n\n```javascript\nvar tempHtml = '\u003Ctable>' +\n    '     \u003Ctr>' +\n    '       \u003Cth>Hello\u003C\u002Fth>' +\n    '       \u003Cth>World\u003C\u002Fth>' +\n    '       \u003Cth>!\u003C\u002Fth>' +\n    '     \u003C\u002Ftr>' +\n    '     \u003Ctr>' +\n    '       \u003Ctd>' + myData.col1 + '\u003C\u002Ftd>' +\n    '       \u003Ctd>' + myData.col2 +'\u003C\u002Ftd>' +\n    '       \u003Ctd>' + (myData.col3 === 'yes'?'!':'?') + '\u003C\u002Ftd>' +\n    '     \u003C\u002Ftr>' +\n    '   \u003C\u002Ftable>';\n\ndocument.querySelector('#myDiv').innerHTML = tempHtml;\n```\n\n相信上面的代码对哪怕做过一点点涉及界面开发的都应该很熟悉吧。当我们想把一段结构和一段数据组合起来，再放到页面上时，就会常常面临这样一段复杂的代码。\n\n这段代码相信不用我说你也会觉得它实在有点复杂：要处理结构中字符串本身的拼接，还要注意结构与数据的拼接，处理数据拼接时还要注意运算优先级（尤其在使用`?:`三元运算符时），还要为了可读性考虑纠结的缩进……\n\n当然，最麻烦的还不是这里，当我们想要对一个数据循环遍历并输出时，居然还要自己去写循环，再一圈一圈地把这些结构拼起来，最后再拼上首尾的结构。而当数据为空时，又要自己去写一个“暂无数据”之类的占位符……\n\n\u003C!-- more -->\n\n为了解决这些问题，前端模板引擎应运而生。\n\n使用了模板引擎之后，上面的例子可能是类似这样：\n\n```javascript\nvar tmpl = '\u003Ctable>' +\n    ......\n    '   \u003Ctd>{%col1}\u003C\u002Ftd>' +\n    '   \u003Ctd>{%col2}\u003C\u002Ftd>' +\n    '   \u003Ctd>{{if col3===\"yes\"}}!{{else}}?{{end if}}' +\n    ......\n\ndocument.querySelector('#myDiv').innerHTML = template(tmplHtml,myData);\n```\n\n这个例子看起来跟上面也没啥区别呀？字符串拼接一点没见少。没错，但这里有了一个变化，即字符串拼接不再是必须行为（为了可读性而换行拼接另算），因此将这段模板存放到别的地方成为可能，比如直接放入HTML中，使用时用js提取过来即可。这样，代码的复杂度就大大降低了。\n\n## 职责\n\n上面的例子我们看到了模板引擎带来的好处，可以极大简化代码的编写，自然也可以减少出错的可能性。那具体说来，模板引擎到底应该做些什么事情？套用一下重构中的结构、表现、行为分离的概念，模板引擎在做的事情也无非是几个分离，但对应的对象是结构、数据、逻辑和表现：\n\n- 结构：最终要展现出来的结构框架，也即“模板”本身，比如上例中的表格。\n- 数据：不用多解释，要展现出来的数据。\n- 逻辑：即业务逻辑代码，不包含可能存在于模板引擎中的逻辑处理。\n- 表现：数据的具体表现，比如日期可以有各种不同的格式。\n\n### 数据和结构分离\n\n这是一个模板引擎最最基本的功能，即将结构框架和要展现的数据完全独立开来，不让它们直接进行拼接。比如上例中，在使用了模板引擎之后，`tmpl`和`myData`就已经不存在直接拼接的行为，而是最后使用模板引擎将它们两者组合起来。如果这一点做不到，实在不能称为“模板引擎”。\n\n### 数据和逻辑分离\n\n所谓数据和逻辑分离，是指数据处理应该和业务逻辑分离开来。业务逻辑应该只专业于数据读写、用户交互等与业务具体相关的事情，至于数据展现上的一些抉择，比如这里是显示“Yes”还是显示“是”，应该交给处理数据的部分来进行。这样的分工可以有效保持数据处理部分的完整性，使业务逻辑和数据处理部分的耦合减少。对这两部分来说，都是既便于复用，也便于后期维护。\n\n#### 分支逻辑\n\n在上例中，我们可以看到在处理的处理中有一个分支逻辑，用于判断`col3`的值是否为`yes`，然后生成不同的内容。很明显的是，这个逻辑是因为数据而存在，因而应该被放到数据处理部分，因而上例将它写入了模板中。\n\n反过来，如果我们使用了一个无逻辑模板引擎，即逻辑引擎无力处理这种简单的逻辑，我们就只能将这个判断写到业务逻辑中，先判断`col3 === yes`，然后根据这个结构在`myData`中写入一个新的值`col3Display`。这样的话很不利于维护，比如如果`col3`改成了`col3`，首先想到的是需要在模板中更改名，然后需要在模板处理的部分改名，除了这些之处，还需要修改处理`col3Display`的地方，而这个地方是存在于业务逻辑中的。这种耦合也让业务逻辑和模板分别复用变成几乎不可能的事情。\n\n一般而言，模板中需要支持的逻辑主要为分支逻辑和遍历逻辑（下面会提及）即可，其它复杂的逻辑使用得并不普遍。当前市面上的模板引擎几乎100%包含这些简单逻辑的处理，如上面举的例子，这是非常合理的。\n\n#### 数据遍历\n\n基于上面数据和逻辑分离的思想，除了分支逻辑之外，模板引擎还应该支持一个更为基础的功能，即数据自动遍历。也就是说，当我们传入一个数据数组的时候，模板引擎应该能够对数组中的元素自动遍历，对每个数据生成组合后的html片段再组合起来返回给用户，比如：\n\n```javascript\nvar tmplStr = '\u003Cli>My Name is {%name%}, I\\'m {%age%} years old.\u003C\u002Fli>';\n\nvar arr = [{\n    name:'TooBug',\n    age:18\n},{\n    name:'ThreeBug',\n    age:18.1\n}];\n\nvar html1 = template(tmplStr,arr);\n\u002F\u002F 结果：\n\u002F\u002F \u003Cli>My Name is TooBug, I\\'m 18 years old.\u003C\u002Fli>\n\u002F\u002F \u003Cli>My Name is ThreeBug, I\\'m 18.1 years old.\u003C\u002Fli>\n```\n\n如果模板没有自动遍历的功能，那么开发者又只好把用于数据处理的逻辑写入业务代码了：\n\n```javascript\nvar tmplHtml = '';\narr.forEach(function(dataItem){\n\n  tmplHtml += template(tmplStr,dataItem);\n\n});\n```\n\n早期的artTemplate就不支持自动遍历，要么采用上面的方法在业务代码中做，要么在业务代码中把数组再包装成一个对象，在模板中写遍历的代码。这是一件很纠结的事情。（to 糖饼：特此吐槽。）\n\n### 表现与逻辑分离\n\n数据的最佳存储方式与数据的最佳表现方式很多时候并不一致。比如时间类型的数据，最佳的存储方式无疑是时间戳（如`1377399298`），而最佳的表现方式则是我们最为熟悉的年月日的表示方式（如`2013年8月25日`）。此时就需要在数据展现前进行一些格式化。\n\n数据的格式化不像分支逻辑或者遍历逻辑那么简单，它是一个五花八门的工作。比如就时间而言，就有无数种格式，有时候需要`2013年8月25日`，有时候需要`2013-08-25`，有时候需要`11:03`，有时候需要`2 mins ago`……更别说其它更多的数据类型了。因此，做数据格式化往往有一些专门的逻辑，简单一点的可能是一个小函数，复杂一点的则可能是类似moment.js之类的库。\n\n于是，如何处理格式化库、业务逻辑、模板引擎的关系就成为一个很重要的问题。\n\n按照我崇尚的逻辑分离的思想，格式化代码不应该出现在业务代码中，最理想的方式是作为一个单独的文件外挂进来，然后由模板引擎直接调用。拿moment.js为例，最理想的方式就是可以直接在模板中写类似这样的代码：\n\n```html\n......\n\u003Ctd>moment(pubDate).format('YYYY-MM-DD')\u003C\u002Ftd>\n......\n```\n\n事实上，目前大部分模板也是允许这样操作的。但也有部分模板引擎选择了封闭了外部变量的访问，以artTemplate为典型。封闭对外部变量的访问最大的考量就在于阻止在模板中意外修改外部变量。因此，artTemplate在封闭对外部变量访问的同时，提供了另一种方案，即辅助方法机制。用户可以为模板引擎指定一些辅助方法，模板引擎可以访问这些辅助方法。如：\n\n```javascript\ntemplate.helper('myFormat', helper.myFormat);\n```\n\n加了这句代码之后就可以在artTemplate的模板中使用moment库来做日期时间的格式化。\n\n就上面这个例子来说，与直接使用外挂js中的格式化方法唯一的区别只是是否有`helper`这个全局命名空间的区别（artTemplate理想的方式是辅助方法不占用全局命名空间）。但我觉得，“辅助方法”这个概念又增加了不少的学习门槛，想必作者也为此接到了不少咨询。作为模板用户应该知道它所编写的代码会产生怎样的后果，作为模板引擎不应该以易用性和可维护性为代价来保障这个有点牵强的安全性。\n\n在处理格式化方法的问题时，还有一种方案，以jQuery tmpl为代表，在调用`tmpl`方法时可以传入一个对象，对象中的成员函数都可以直接在模板中使用。这种方案与artTemplate的辅助方法机制有些类似，但jQuery tmpl中的辅助方法只对本次渲染的模板有效。\n\n```javascript\n$('myTest').tmpl({\n  myFormat:function(val){\n    return val;\n  }\n},myData);\n```\n\n这种方案其实有点难评价是好是坏。它的就地编写就地使用的方式用起来还是很方便的，而且方法直接写在渲染语句中，也不会给维护带来特别大的问题。但丢一大堆方法在渲染参数中还是多少会有些不爽。算是一种折衷的方案吧。\n\n## 易用性\n\n易用性是衡量一个模板引擎是否优秀的重要指标，因为它的目的就是简化前端开发工作，如果引入模板引擎反而使得代码更加复杂难懂，则有些得不偿失，毕竟模板引擎也是有学习和性能成本的。\n\n### 简化还是繁化\n\n如果一个模板写得人头昏眼花，也许应该回过头来想一下这个模板引擎设计是不是有问题。看一段代码：\n\n```html\n\u003C%if(myData.testArr){%>\n  \u003C%for(var i=0;i\u003CmyData.testArr.length;i++){%>\n    \u003Cinput type=\"checked\"\u003C%if(myData.testArr[i].checked){%> checked\u003C%}%>\u002F>\n  \u003C%}%>\n\u003C%}%>\n```\n\n上面这段代码简化自某个项目的真实代码，一眼看去会不会觉得非常繁杂？其实代码很简单，无非是判断一个数组是否存在，然后对数组元素遍历输出checkbox。但看起来就是觉得头疼，各种符号穿插其中，各种符号鱼龙混杂，甚至连编辑器高亮都可能完全失效。\n\n我觉得这个模板引擎的语法设计是有如下问题的：\n\n- 为降低学习成本使用原生JS语法，这个想法是好的，但这个做法却在客观上增加了代码的复杂性，比如需要用户自己管理临时变量，需要自己管理代码的开始与结束（大括号）。\n- 对JS原生语法的支持有限，比如对于数组的遍历，并不支持使用原生的`forEach`方法，进一步加大代码复杂性。\n- 没有较好地处理“逻辑插值”的问题。（所谓“逻辑插值”是指标记中的某个部分需要按分支逻辑来处理的情况。）导致了在标签属性部分的代码十分复杂。而更为严重的是，尖括号`\u003C>`会严重干扰到编辑器的语法解析过程，导致语法高亮出现错误。\n\n来看jade的处理方法：\n\n```jade\n- if(myData.testArr)\n  - each dataItem in myData.testArr\n    input(type=\"checked\",checked=dataItem.checked)\n```\n\n再来看一下上面提到的三个问题：\n\n- 学习成本：上面的jade代码相信你可以秒懂，既然如此，学习成本便不是问题。\n- 原生语法：jade通过`-`来区分逻辑与标记，在逻辑代码中，随意使用任何原生js语法。\n- 逻辑插值：jade使用`checked=true\u002Ffalse`的方式处理布尔属性，避免了大部分逻辑插值的情况，虽然不能完全解决问题，但已经足够好读了。\n\n此外，jade还有同时适用于对象和数组的each语法，遍历起来十分方便。\n\n看完上面的例子，应该不用多说了，模板如果不能简化开发工作，反而使代码变得复杂和难以维护，那么我个人认为宁可不要。\n\n### 模板标记的选用\n\n在模板标记的选用上，各个引擎可谓是八仙过海各显神通。在这个问题上，也确实没有很多可以拿来比较的东西，但还是有些小点值得一说。\n\n#### 模板标记与页面重构\n\n按照[彪叔](http:\u002F\u002Fwww.twinsenliang.net)的观点，模板标记应该选用“看起来像文本”的标记，比如尖括号就应该避免，因为这样可以让重构同学在做页面的时候大概预览到模板标记所在处的效果，而不是被隐藏掉。\n\n不过，这其实是个不折不扣的伪命题。举个例子，`\u003C%=var%>`这种语法来自ASP，而这种语法在浏览器中并不会被隐藏掉，而是原样显示，因此并不会影响预览效果。至于编码时，则更没区别了，只是敲不同的键而已。既然如此，那么所谓“被隐藏掉”是在哪里呢？答案其实是——DreamWeaver的可视化界面……面对已经被边缘掉的DW，这个问题的的确确可以被彻底忽视了。\n\n当然，如果你坚持使用DW的话，我仍然要说这是个伪命题，因为时至今日，已经很少有人再把模板标记放到正常的文档流中了，因此不管选择什么样的标记，这些不在文档流中的模板都始终不会被看到。\n\n#### 避免与后端语言模板冲突\n\n这倒是一个很值得考虑的问题。在使用jQuery tmpl与ThinkPHP时，由于两者的模板机制均有使用`$`符号，因此经常导致前端模板标记被后端解析，从而导致页面异常。最终只能通过后端强制指定不解析模板来解决问题。\n\n考虑到这个问题的话，在选用前端模板标记时其实也没办法做到尽善尽美，因为后端模板的标记也不少，很难避免所有可能冲突的情况。但我们可以适当做些考虑，避开一些常用的后端模板。比如我会更倾向于使用`{%raw%}{%var%}{%endraw%}`的方式（虽然我也没法证明它是一个更好的选择）。\n\n#### 美观\n\n呵呵。美观是个很主观的话题，所以作者觉得哪个好看就用哪个吧……\n\n不过，除了输出变量之外，其它的模板标记其实更多的是一种语法设计，在这方面，确实要考虑美观的事情，上面说过，如果一个模板写出来异常复杂就不好了。\n\n#### 模板标记转义\n\n其实这个问题与模板标记本身关系不大，主要是指如何让模板强制不解析某个模板标记，原样输出它。一般比较理想的方式是对标记进行转义，但转义也有两个层次的含义：\n\n- 在HTML级别的转义，比如我要输出`\u003C%=var%>`，则直接在模板中写转义后的`&lt;%=var%&gt;`。\n- 在模板级别的转义，比如我要在jade中输出`#{var}`，则在模板中写入`\\#{var}`即可。\n\n对于这两种转义，我更看重的是第二种，因为一个模板应当要有输出任何字符的能力，包括它用到的模板标记本身。（注意在HTML级别转义的话，输出的结果文本是不一样的。）\n\n### 模板位置及提取\n\n在文章开头的例子中，我们把模板写到了JS中，随后也做了说明，模板文本是可以写到HTML中的。接下来就来看看将模板放到HTML中的几种主要方法。（还有更多的方法，玉伯有一篇文章中有详述，由于原文被墙，可以到CSDN转载的页面查看：[《[浅析]淘宝详情页的BigRender优化的最佳方式》](http:\u002F\u002Fwww.csdn.net\u002Farticle\u002F2011-09-27\u002F304989)）\n\n#### 直接放入文档流中的DOM\n\n将模板直接放到DOM中是一种比较原始的方案，这种方法会在写HTML时直接将模板写进去，然后使用JS动态从父容器中取出进行渲染，最后将生成的HTML字符串再写回父容器中。这种方案的弊端很多：\n\n- 模板会被渲染出来，这是开发者不希望看到的。而如果使用css来隐藏的话又在项目中添加了没有意义的代码。\n- 模板存在被修改的可能。一旦DOM节点被渲染后就无法保证它不被修改，有可能等我们用JS去取模板时，它已经被改得面目全非甚至都不在文档中了。（外部JS库、UI库、开发框架如jQuery Mobile、浏览器插件都可能修改页面中的DOM。）\n\n后来，在前辈们的探索下，找到了一种比较完美的方式：放到`textarea`中，这种方案在很大程度上避开了以上问题，只需要处理`textarea`本身即可。取用的时候只要取`textarea`的值即可。\n\n#### 放入script标签\n\n将模板标记放到`textarea`中，虽然使得模板本身避免了被渲染和修改，但`textarea`本身还是需要隐藏。后来，前辈们又发现一个更NB的方案：将模板放到`type`属性不为`script`(以及一堆同义词)的`script`标签中，这个script是一个标准的DOM元素，但又不会受到其它的影响，浏览器也会直接忽略它，并不渲染。\n\n现在一个常见的模板放到`script`标签中可能是这样：\n\n```html\n\u003Cscript type=\"text\u002Ftmpl\" id=\"myTmpl\">\n  模板放这里\n  ......\n\u003C\u002Fscript>\n```\n\n这是一种比较完美的方式，也是现在比较主流的方式。\n\n#### template元素\n\n鉴于模板引擎的广泛使用，web components组件规范中直接定义了一个`template`元素，专门用来存放模板。\n\n```html\n\u003Ctemplate id=\"myTmpl\">\n  模板放这里\n  ......\n\u003C\u002Ftemplate>\n```\n\n目前Chrome和Firefox均已支持这个元素（移动端暂没有浏览器支持）。\n\n#### 模板提取方式\n\n好吧，上面三小节基本是在吹水，其实模板本身放哪里跟模板引擎的关系并不太大，模板引擎只要接受模板字符串进行处理就好了。但说回来，如果模板引擎能辅助用户进行模板的自动提取，则无疑是在易用性上的一个很好的亮点。\n\n目前jQuery tmpl和artTemplate都做了这些方面的努力。在jQuery tmpl中，直接在（经jQuery包裹后的）包含模板的元素上调用`.tmpl`方法即可，jQuery tmpl会自动去页面中提取出模板字符串并进行处理：\n\n```javascript\n$('#myTmpl').tmpl(myData);\n```\n\n而artTemplate允许通过指定包含模板的元素ID的方式自动提取模板：\n\n```javascript\ntemplate.render('myTmpl',myData);\n```\n\n## 性能\n\n任何JS库、框架都逃不开性能这个命题，模板引擎自然也不例外。但模板引擎的性能一直是一个争议不断的话题。\n\n### 性能是否是伪命题\n\n我们来看一个性能测试的页面\u003Chttp:\u002F\u002Faui.github.io\u002FartTemplate\u002Ftest\u002Ftest-speed.html>，其实结果很有意思，看完才知道，原来不同的模板引擎之间的性能差异真的如此巨大！\n\n不过更有意思的是，测试完成后，作者写了一句话：“测试已完成，请不要迷恋速度。”这其实是句很有意思的话，之前也有跟作者聊过性能方面的问题，作者也认为“性能是个伪命题”的观点。原因是这个测试的数据量是100*10000=100W。也即在百万级别的数据渲染时，才有几秒钟的性能差异。\n\n回到我们的日常web开发，单次渲染数据量上千就已经差不多是极限了，此时模板引擎之间的性能差异微乎其微，几乎无法被用户感知。\n\n另外还有一个特别值得注意的地方，模板引擎做的工作只是“模板+数据=包含数据的HTML字符串”，而这些HTML字符串真正显示在页面上还要经过一道DOM操作，而这个DOM操作在数据量大时比模板引擎本身的计算所要消耗的时间要大得多！如果100W条数据显示在DOM上，我觉得即使是Chrome也很难逃脱卡死的命运。\n\n这样看来，模板引擎的性能问题还真可能是个伪命题。那是否可以忽略这一问题呢？我认为也不可取，模板引擎还是要关注性能的，因为你不知道用户会怎么使用你的引擎。比如我就曾经为了偷懒，在一个页面上渲染了6000条数据，此时模板引擎在IE下的表现也可以差到用户可感知的程度。\n\n### 有关预编译\n\n在[《高性能JavaScript模板引擎原理解析》](http:\u002F\u002Fcdc.tencent.com\u002F?p=5723)一文中，artTemplate作者解释了其高性能来源于针对模板的预编译。即在首次渲染时会根据模板解析的结果生成一个用于拼接数据的函数，后续调用时直接使用这个函数而不需要再次解析模板。这是个非常好的思路，目前也有越来越多的模板引擎采用了预编译的方式，所以我猜测一下，上面的测试如果换用最新版、并引入更多的模板引擎再做一次的话，差异应该不会那么明显。\n\n关于预编译的时机，目前的模板引擎基本都放在浏览器端首次调用时进行预编译。artTemplate是我见到的第一个尝试把模板预编译过程放在构建阶段的模板引擎，它可以在发布前对产品中用到的模板进行预处理，最后发出去的直接是拼接字符串的函数。详细详情可以在[这里](https:\u002F\u002Fgithub.com\u002Fcdc-im\u002Fatc)查看。\n\n这其实是个很不错的思路，尤其是在前端编译的概念有燎原之势的这个时机，只要集成方便，还是很有前途的。不过略遗憾的是，目前artTemplate的预编译工具还没有提供Grunt.js的插件，需要单独编译。\n\n顺序发散一下，如果我们在引入jQuery的项目发布前，扫描一下调用的API，然后把jQuery也在发布前预编译一遍会怎样？其实想象空间还挺大的。\n\n## 功能\n\n前面已经说过，一个模板引擎最主要的功能就是实现数据和逻辑、结构的分离，简化开发工作。因此一些剩下的功能就被放到了最后，这些并不是模板引擎的主要考量因素，但如果做好，也会成为很不错的亮点。\n\n### 异常处理\n\n模板引擎都有一套特定的语法，当我们写的模板无法按照这套语法进行解析或者是在处理数据时发生错误时便会产生错误。有一部分模板引擎在产生错误时不会做过多的处理，此时错误被直接抛出，但产生错误的代码行却往往是模板引擎本身，一定程度上会给调试带来困难。\n\nartTemplate在错误处理上有一些尝试，出错时会带上出错的模板本身，这样开发者可以定位到出错的模板代码。而jade则更进一步，直接能定位到出错的位置所在的字符。\n\n当然，这些辅助信息并不一定100%准确，因为很可能错误产生于真正报错之前，这是几乎所有的语言调试过程中面临的一个问题。不过，有了这些辅助信息还是能提升开发者的调试效率的。\n\n### 包含、mixin复用\n\n在后端模板的世界中，模板之间的相互包含是一件非常普遍的事情，因为后端模板往往是以页为单位来进行输出渲染，而相对来讲，前端模板的应用场景则会显示更碎片化。因此个人觉得前端模板中的模板相互包含、引用并不是一个非常普遍的需求。不过，也有不少的模板为了与在后端（Node.js）的使用方式保持一致，也为前端提供了模板包含功能。\n\n除了使用包含来完成模板复用外，jade还提供了一种叫作`mixin`的方式来复用模板：\n\n```jade\nmixin article(title)\n  .article\n    .article-wrapper\n      h1= title\n      if block\n        block\n      else\n        p No content provided\n\n+article('Hello world')\n\n+article('Hello world')\n  p This is my\n  p Amazing article\n```\n\n会编译成：\n\n```html\n\u003Cdiv class=\"article\">\n  \u003Cdiv class=\"article-wrapper\">\n    \u003Ch1>Hello world\u003C\u002Fh1>\n    \u003Cp>No content provided\u003C\u002Fp>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003Cdiv class=\"article\">\n  \u003Cdiv class=\"article-wrapper\">\n    \u003Ch1>Hello world\u003C\u002Fh1>\n    \u003Cp>This is my\u003C\u002Fp>\n    \u003Cp>Amazing article\u003C\u002Fp>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\n```\n\n这种方式其实已经非常接近[Shadow DOM](https:\u002F\u002Fwww.toobug.net\u002Farticle\u002Fwhat_is_shadow_dom.html)中对DOM的封装思路。（当然，如果你玩过LESS、SASS之类的CSS预处理语言，也会觉得这个mixin的概念似曾相识。）\n\n个人以为，相对模板包含而言，这种mixin的复用方式其实是对前端模板而言更为友好的方式。\n\n## 结\n\n洋洋洒洒地码了这么多，其实仍然没有去讲怎么设计一个模板引擎，只是提出了自己使用模板引擎过程中看到的一些差异和一些值得思考的点。真正设计一个工业级的模板引擎还是颇费工夫的。\n\n至于模板引擎的实现，则完全是编码的硬功夫了，除了编译原理外也没啥好说的了，就不打算说了。（装下B，真实原因是我也没写过……Wahaha……）\n\n> 2013-12-04：感谢Barret Lee在评论中给出一篇好文[《javascript模板引擎原理，几行代码的事儿》](http:\u002F\u002Fbarretlee.com\u002Fprinciple-of-javascript-template\u002F)，这是一篇真正在讲如何用js实现一个模板引擎的文章，推荐阅读。\n","\u002Farticle\u002Fhow_to_design_front_end_template_engine.html",{"id":77,"type":7,"slug":78,"title":79,"date":80,"category":46,"tags":81,"body_markdown":82,"permalink":16,"excerpt_src":16,"media_type":83,"media_title":84,"media_author":16,"media_url":16,"rating":16,"layout":16,"pv":17,"admin_only":17,"created_at":18,"updated_at":18,"deleted_at":16,"status":19,"cover":85},9,"a-tiny-book-story-of-paying-back","很小的一本书——《还钱的故事》","2013-07-09 13:25",[48,62],"\n![《还钱的故事》封面](\u002Fassets\u002Flife\u002F2013\u002Fa-tiny-book-story-of-paying-back\u002F01.jpg)\n\n这是在豆瓣阅读上买的第一本书，9毛9，花了两个小时看完了。（这个速度挺慢的了。）摘一段书评吧：\n\n“笔调质朴，写出了细微复杂的中国式人情世故，普通人，日常的情感和痛楚，也是多数人宁愿逃避的问题。钱在什么样的意义下可以买到一切，以及不能买到一切。小说自我呈现得非常好。非常喜欢作者拿捏得恰到好处的表达，无论情感还是思想都很克制，点到即止，不较真，不焦躁，让故事自己去表达。”\n\n点击链接可以找到豆瓣的这本书。当然如果你不想出9毛9，也可以在其它地方找到，这里就不提供地址了。\n\n\u003Chttps:\u002F\u002Fread.douban.com\u002Febook\u002F386053\u002F> （已失效）\n","book","还钱的故事","https:\u002F\u002Fassets.toobug.net\u002Fassets\u002Flife\u002F2013\u002Fa-tiny-book-story-of-paying-back\u002F01.jpg",{"id":87,"type":7,"slug":88,"title":89,"date":90,"category":26,"tags":91,"body_markdown":95,"permalink":16,"excerpt_src":16,"media_type":16,"media_title":16,"media_author":16,"media_url":16,"rating":16,"layout":16,"pv":17,"admin_only":17,"created_at":18,"updated_at":18,"deleted_at":16,"status":19,"cover":31},70,"liu-mang-de-bi-yu","流氓的比喻","2013-06-08 21:17:47",[92,93,94],"随笔","作文","高考","\n最近刚看完《楚汉传奇》，这部电视剧的背景设在秦朝末年的乱世，讲述的是各地豪杰揭竿而起，最终刘邦和项羽展开楚汉之争，以刘邦胜利创立大汉天下而结局。\n\n在剧中，项羽是一个胸无城府的将军，一心只关心军队和战争，从来不想使阴招耍谋略，如果放在今天，绝对能算得上是坦荡荡的君子。而刘邦呢？耍赖、玩心计，无所不用其极，更过分的是他有极强的“见人说人话，见鬼说鬼话”的能力，虽然经常玩阴招，但在需要人才的时候依然把大家拴得死死的。\n\n若以图来喻人的话，估计大部分的中国人都会想到方圆二字吧。在形容人时，总以方来表示思想简单不懂变通之人，以圆来表示进退自如四处逢源之人，在四川地区甚至还有“方脑壳”一说。这一特征不仅在形容人时才得以体现，而是深深地印在了中国的哲学体系之中。以方圆来对应中国的古代哲学，最为典型的莫过于法家和儒家。前者强调规则，不惧与人的冲突，并且以严厉的惩罚来打击与之产生对立的人们；后者强调仁爱，一般不伤人，而是选择找与他人更好的相处之道。这两种感觉与方圆给人的印象是何其相似，一个有棱有角，要么伤着别人，要么搁浅自己，一个圆滑有加，既不会伤人，又能让自己游刃有余。\n\n初看起来，这种比喻十分贴切，但事实果真如此么？\n\n一堆方盒牛奶放在一起，充分利用了所有的空间资源，一点不剩，这算不算另一种相处之道呢？一堆圆瓶矿泉水放在一起，稍微挤压一下，看起来空间十足，但其实彼此都有相当大的压力，这又算不算一种缺憾呢？\n\n换个角度来想，如果以自己为中心，如何产生一个圆？事实上，对周围所有的人事保持同样的态度即可，是不是很简单？事实上，这正是人际气泡理论所关注的模型，人总是会让自己与周围的人保持一定距离，而且这个距离不因为周围人的不同而产生对某个方向的倾向性。反过来，如果以自己为中心，如何产生一个方形？我觉得我一句话说不清，你能吗？时刻关注与他人的距离，时刻让自己调整与周围人事的态度，是不是想想就觉得累？\n\n回头来，我们在说什么？是不是本来以方为比喻的人变成圆了？以圆为比喻的人反而变成方了？是第一个比喻错了吗？是第二个比喻错了吗？事实上，都没错，但他们就是不可调和地产生矛盾了。\n\n比喻是件很容易耍流氓的事情。\n\n比如两个人在打架，A君长得很黑，B君长得很壮但行动缓慢，此时来了一个路人乙，问已经在旁观的路人甲“你说谁会赢？”甲答“B君。你看A黑得像蚂蚁，B壮得像大象，你觉得蚂蚁打得过大象吗？”\n\n当然，这只是个笑话，虽然它一点都不好笑，但逻辑却是流氓十足。这样的事情每天都发生在我们周围，尤其是在与人发生观念碰撞的时候，经常有人抬出比喻这把武器。\n\n有一句十分经典的话，关系的是艺术的雅俗之争——“感冒也很流行，它高雅吗？”这句话在中学时代十分流行，但细想起来，这跟艺术的雅与俗毫无关系，因为这个比喻仅仅是考虑了流行这个现象，而没有考虑造成流行的因素。艺术作品之所以流行，唯一的推动力是人的传播，而感冒的流行，跟人的主观意识没有任何关系，因此要把感冒和人的艺术品味扯上关系无疑是一件牵强的事情。\n\n再比如很久之前跟人讨论网络流量的关系，对方一来直接将网络比喻成高速公路，然后不停地反问，高速公路封装一个方向都可以不影响另一个方向通车，凭什么网络就不可以？我没答，因为很想让他回去补下网络原理，没有双向通信不可能完成互通，而任何一个网络通信动作都一定是需要互通才可以。\n\n所以，比喻是要有度的，它只在讨论某一方面的特性时才能适用。比如举个熟悉的例子，将电脑上的文件路径比喻成办公用品文件夹，也很合适，但如果在讨论文件权限、多文件夹嵌套的时候，你就会发现这个比喻已经完全没有意义了。\n\n这便是比喻的流氓性质所在，它可以从一个熟悉或者恰当的方向入手，将需要讨论的事务替换掉，再用替换来的事务去讨论另一个本来不适用的方向。这样的逻辑往往还会显得非常严密，让人束手无策，但细想起来却总会觉得哪里有些不对。其实只要换个思路，回归到讨论的问题是在哪一方向，比喻中的两个事务在这个方向是否一样，则可轻松破解之。\n\n既然比喻如此流氓，为何文学上对此仍然情有独钟呢？其实是因为比喻在文学中更多的是承担表达的职责，因此能将一个事务换用一种人们更为熟悉和更能接受的方式表达出来即可。例如，我们常常说生命如花，这个比喻中只要能让人从花中联想到生命的美好即可，而无需对生命或者是花的形状、长度、颜色等等方面再做探讨，故而显得贴切。\n\n珍爱生命，远离非文学场合比喻。\n\n> 这是我写的湖北卷高考作文，看起来有点像0分的节奏，因为不但没有去升华方和圆的问题，反而将它们摔下神坛。更何况写作过程中中断一次，加起来历时3天，而且超过额定字数差不多1000字……\n>\n> 不管怎样，还是发上来了，了却多年的心愿，至于写得怎样，就交给大家评价了，接受任何形式的批评指正……\n",{"id":97,"type":7,"slug":98,"title":99,"date":100,"category":46,"tags":101,"body_markdown":102,"permalink":16,"excerpt_src":16,"media_type":51,"media_title":99,"media_author":103,"media_url":104,"rating":16,"layout":16,"pv":17,"admin_only":17,"created_at":18,"updated_at":18,"deleted_at":16,"status":19,"cover":105},13,"zhi-qing-chun","致青春","2013-05-02 12:23:04",[48,49,99],"\n![致青春海报](\u002Fassets\u002Flife\u002F2013\u002Fzhi-qing-chun\u002Fzhiqingchun.jpg)\n\n前几天去看了当下正火的电影《致青春》，回去太晚，没来得及写点什么，现在补上吧。\n\n其实总的来说，我不是太特别这部电影，总是觉得有些地方很别扭，但又说不出来到底是哪里别扭。或许只是视角太窄的原因吧，从头到尾，电影的逻辑可以概括为这样几句话：青春=爱情，爱情逝去=青春腐朽，爱情终将逝去=青春终将逝去（点题），最后没有说出来的是，因为爱情终将逝去，所以青春终将腐朽（没腐朽的人却死掉了）。这样理一下，会发现确定是多少有点问题，不过，为了不剧透，就不打算展开讲电影的主题，而是想讲点花边的东西。\n\n## 大学氛围\n\n这部电影将场景设在了大学，将目光聚集在有限的几位角色身上，从爱情的角度来进行切入，这无可厚非，但是遗憾的是，在“青春”这样一个大题目下，电影几乎没有对除了爱情之外的大学青春做任何描述，在整个大学生活描述里面没有积极活泼、天真向上的因素，看到的只有宿舍的鸡飞狗跳，这其实是很难理解的。\n\n我的大学生活发生在21世纪，身边固然也有在宿舍干架打牌摔东西的人，但大部分人仍然是礼貌待人，生活得有目标有动力，精神是非常积极的。往前的时代我没有经历过，但想想各个时代大学生们意气风发的故事和组织出来的活动，便可一窥其中的风貌。\n\n我不知道是不是因为导演是来自电影学院的缘故，不知道是因为某个特写的学校的风气影响还是导演太想当然，总之，这样的校园氛围和这个年纪的人是有出入的。这一点让我很不能接受。\n\n## 郑微是如何爱上陈孝正的\n\n其实从电影的交代来看，只有简单的两步：舍友起哄在先，紫娟姐姐交心在后。这两步之后，郑微觉得自己彻底爱上了陈孝正。当然，故事最终仍然走得相对合理：接触到和解再到相恋。但是，很遗憾的是这些事情发生在郑微认为自己爱上对方之后，而不是正常的先有接触和解再有好感再有爱。\n\n至此可以深刻的感觉到大学生是有多么迷茫，我相信每个人在大学都会有很多迷茫的时候，而且绝大部分的迷茫都不会有人来解读，最终，还是自己一步一步踏过来了。我曾一度认为，在大学能有个人听你的每一个迷茫，帮助你做出每一个决定是幸运的，直到看到了这部电影。\n\n在电影中，帮助郑微下定决心的正是广播台的紫娟姐姐，一位以广播节目为生计手段的“知心姐姐”，在面对听众的问题的时候，对她而言，其实给出答案比答案是什么更重要，因此，她无关紧要地给出了肯定的答案，而对郑微来说，这是唯一来自外界的力量，一下子就左右了她的世界。\n\n看完电影，关于这个问题我想了很久，结论是关于青春时的人生导师，要么没有，要么有位真正的导师。然后长叹一阵，庆幸年轻时给自己建议的都是真的在听真的在为自己着想的人。\n\n## 朱小北的尊严和人格\n\n朱小北是我比较惋惜的一个角色，她直接、质朴而又不虚荣。但最终以那样一种近乎悲壮的方式退场令我非常震惊。\n\n回想起来，青春期似乎确实是对尊严和人格这样的字眼非常敏感的时候，想想看，从小被爸妈管教，挨打挨骂，然后被老师教育，整天挨批评，直到某一天，突然有人告诉你，你是有尊严的，你是有独立人格的，其它人打你骂你冤枉你侮辱你是违反法律的！这个时候突然觉得人一下子精神了起来，整天为自己掌握了尊严和人格的“真谛”而兴奋不已，觉得再没有人能欺负自己了，因为会有法律保护自己的尊严和人格。\n\n直到某一天，真的有人拿手指戳了你的尊严或者人格，就会有种“养兵千日，用兵一时”的感觉，马上搬出尊严和人格出来理论……当然，最终的结果，要么和朱小北一样不受人待见，然后一腔怒火涌上来干出点什么事儿，要么，别人压根不跟你计较，自己在这里自鸣得意。真正愿意跟你论这事儿的人，寥寥无几。\n\n想起一个游戏，从小到大，一直在发生，不管是玩伴的嘴里还是人人网的状态日志里，那就是“你不X就是Y”“不转不是中国人”……相信每个人小时候都会因为这样的激将而当真，我也会。直到某一天又被别人这样的话堵住，逼我做一件事情时，我一边恼怒，一边在想“为什么我就这样被堵住了，没有别的路吗？”然后就想到“为什么你说这样就是这样，你是谁？”然后就释然了，我是不是Y、是不是中国人跟我是否X、是否转的关系并不是天然存在的，而是对手强加的，凭什么对手加上我就要认可？至此，我再也不惧怕此类游戏，因为对手不是权威，说了也不算。\n\n类比到尊严和人格上来，凭什么对手冤枉我我就要当真，我只要走我的路就好了，你们怎么说，随意。这当然有点阿Q，但是，“不跟你计较”正是自己人格比对手更强大的地方。尊严和人格正是首先来自于自己的尊重，然后才能让对手尊重。\n\n## 吸烟的陈孝正\n\n陈孝正最后叼一支烟出现多少让我有些惊讶，但同时让我有一种他要回归地球的感觉，觉得他要从怪物变回人了。\n\n人在年轻时多少会抗拒一些事物，不管是出于怎么样的考虑。但往往等到过个五年十年再往回看时，会觉得自己划定的那些条条框框是很可笑的。人生苦短，其实不妨不设防线，随遇而安，对事物多一份接触就多一份感悟，这些东西往往是日后都补偿不回来的，就比如来自郑微的爱情。至于目标，当然是要有的，但是否真的要“不允许一厘米的误差”则大可不必，因为人生其实是无法设计的。一位同学曾说过“人一生中总会命中一些目标，但却未必是自己想要的那一个”，但我想说的是，不管最终命中的是哪一些，总归都会是你的。而且，只要方向对了，这些目标之间的差异，并没有想象中那么巨大。因此，瞄准目标所在的方向，保持上进心绝对是必要的，但每天生活得随意一点、舒心一点并不是不思进取不求上进，反而是一种值得推崇的生活方式。\n\n## 结语\n\n以上种种言论并非对电影有什么偏见或者不好的看法，只是从电影的一些细节来讲一些自己的想法，其实这部电影还是值得一看的。\n","赵薇","https:\u002F\u002Fmovie.douban.com\u002Fsubject\u002F6973376\u002F","https:\u002F\u002Fassets.toobug.net\u002Fassets\u002Flife\u002F2013\u002Fzhi-qing-chun\u002Fzhiqingchun.jpg",{"id":107,"type":7,"slug":108,"title":109,"date":110,"category":26,"tags":111,"body_markdown":115,"permalink":16,"excerpt_src":16,"media_type":16,"media_title":16,"media_author":16,"media_url":16,"rating":16,"layout":16,"pv":17,"admin_only":17,"created_at":18,"updated_at":18,"deleted_at":16,"status":19,"cover":116},77,"ya-an-jia-you","雅安，加油！","2013-04-22 19:47:19",[112,113,114],"灾难","地震","雅安","\n从一条微博说起吧：\n\n![杨幂捐款微博](\u002Fassets\u002Flife\u002F2013\u002Fya-an-jia-you\u002Fyangmizhaohangzhuanzhang.png)\n\n这条微博的作者是杨幂，图片是她在灾难发生的当天夜里捐了20万的截图。正是这张截图，第二天在互联网圈子里引起了不小的风波，并不是因为20万太多或者太少的原因，而是这个截图的地址栏中显示的是“C:\\Users\\ruoyao\\...”，标题则是“无标题文档”。想想看，一家网上银行，用户付款成功之后的页面，居然是一个本地C盘的文件，居然没有http，居然没有www！于是技术宅们沸腾了，开始了对杨幂的口诸笔伐。\n\n故事的结局很无趣，技术宅们这次真错了，因为招行就是调用的本地文件显示结果，但钱是真转的。自然，不了了之，道歉的只有那么一两个，那些骂得很欢得人都偷偷潜水了。\n\n想想这些可怜的人，想想曾经的我们，何其相似！2001年911事件发生之时，少不更事的我们，有多少人欢欣鼓舞，2003年伊拉克战争时，又有多少人热血沸腾。那时，有多少人知道世界大厦里丧生的人员的数字，又有多少人能知道伊拉克人民是陷入了怎样一个水深火热的境地。我们总是会关注集体、关注荣誉，但很少有人告诉我们，要关注生命！\n\n唯一努力在教我们关注生命的，只有文艺作品，所有的电影所有的书都在教我们，但可惜，能懂的人太少。甚至还有人利用灾难事件来行骗敛财，让人心寒。\n\n我不喜欢杨幂，但我欣赏她的捐款举动，我讨厌周鸿袆，但欣赏他呼吁寻人平台互通数据的举动。生命面前，所有的善良都该被表扬，哪怕它那么小，甚至曾经不那么善良。所以，壹基金值得表扬，但红会中去到现场的人也值得表扬。至于与生命无关的话题，诸如腐败，在公民意识逐渐觉醒的时候，自会有人算账。\n\n最后，八卦一则消息：\n\n![中国地质大学老师预测雅安地震](\u002Fassets\u002Flife\u002F2013\u002Fya-an-jia-you\u002Fdizhidaxuedizhenyuce.jpg)\n\n中国地质大学老师曾在2012上学术会议上预测雅安地震，但可惜的是，时间无法预测。\n\n但不管怎样，有人在认真做些事情，总可以让人看到希望。希望雅安加油，也希望中国的科研工作者们更加努力！\n\n前几日公众号收到你们的反馈：能看见年少时候的小美好   真是对一天忙碌生活之后的犒劳~\n\n很可惜，这篇并不是一篇美好的文章，而且与青春无关，素材也不集中，流水账一样地平淡无味。但还是希望大家多关注灾难中的生命，少抱八卦心态去看热闹，因为对生命的敬畏正是人格中最闪亮的那一块。\n","https:\u002F\u002Fassets.toobug.net\u002Fassets\u002Flife\u002F2013\u002Fya-an-jia-you\u002Fyangmizhaohangzhuanzhang.png",{"id":118,"type":7,"slug":119,"title":120,"date":121,"category":26,"tags":122,"body_markdown":125,"permalink":16,"excerpt_src":16,"media_type":16,"media_title":16,"media_author":16,"media_url":16,"rating":16,"layout":16,"pv":17,"admin_only":17,"created_at":18,"updated_at":18,"deleted_at":16,"status":19,"cover":31},69,"die-xing-xing","小心思","2013-04-18 19:46:00",[123,120,124],"初中","叠星星","\n今天，蝶恋花启程第二天，感谢关注的朋友们，你们很给面子。\n\n实话说，青春这个话题离我是有一点远了，至少心态上来看，确实如此。从早上上班车开始，到刚刚打开编辑器之前，我一直在想，今天的文章该发点什么。青春是个很容易联想的词语，很容易就能想到激情、理想、冲动，当然，还有爱情。俗，我为自己的想法感到不堪，我竟然已经找不到一件可以具体指代青春的意象。这一方面让我很沮丧，另一方面又使得我坚定了运营蝶恋花的决心：已经远离这么久了，连青春的尾巴都抓不着了。难道还要一直远离下去？\n\n好在，最后一刻，我居然想到了“小心思”，瞬间像抓住了一根救命稻草，青春期那一缕缕细如丝的思绪慢慢飘上心来，于是，想起刚上初中时的那一点点小小的小心思。\n\n那是十月左右的日子，天气转凉，倒也清爽。刚上初中的孩子对一切都是好奇的：这里一个班居然有120多个人，这里的教学楼居然有五楼，这里的电脑开机居然只要5秒，这里的教室居然还有饮水机，这里居然有值日生，这里的女生居然可以跑得比男生还快……当然，这种好奇心并没能延续多久，等到每个晚自习都只剩下背《桃花源记》的时候，日子就枯燥起来了。那时候总是盼望着生活能有那么一丁点儿变化，好让自己的好奇心能再欣喜一下下。\n\n于是，这变化的日子就来了：一批师范学院的实习老师来我们学校实习了，其中有一位老师在我们班任教语文，姓杨。这老师其貌不扬，谈不上漂亮（当然，那个年代，我也不是“懂得”漂亮的人），总是规规矩矩地上课、讲作业。事实上，我的语文老师是位非常好的女老师，她可以把课文讲得生动有趣、通俗易懂，她可以在晚自习的时候同时听十来个人围绕着她背书。但或许是因为年龄的原因，我除了课程，从来不和老师说话。而实习老师的到来，则让我本能地有好感。\n\n现在回想起来，有了实习老师的生活也并没有兴奋多久，但总是觉得那段时间状态会不一样，或许每节课上课铃响的时候只是在好奇“今天谁来上课呢”。\n\n后面的时光具体发生了什么其实已经不大记得了，只知道唯一跟我有关系的就是上课写作业。不过，隐隐约约记得会有一些找实习老师代买东西（住校生是不允许出校门的）、实习老师带学生去医院之类的事情。也许是曾过问过我的身体情况，也许是什么都没发生，总之，当时对这实习老师就陌名其妙地好感。当然，我不是一个人在战斗，一起有好感的还有我周围的一帮同学。\n\n时光总是在飞逝，预感到实习老师将要离别的时候，我和当时班上另一位住校的男生决定给她送些特别的东西——亲手叠的星星。我相信每个人的学生时代都会有一些做手工艺品的岁月，即或没有，周围的同学也想必有的。我的时代就在初一，那时候刚刚学会有吸管叠星星，于是几乎整个业余时间几乎全扑在了上面。每个周末回家都会在学校对门买上好几扎吸管，等周一回学校的时候就变成了一堆一堆的小星星。而那位男生更厉害，到后来已经可以单手叠了，甚至关掉灯都能叠，连最后“穿针引线”的活都不用看。\n\n后来，实习老师如约走了，临走前我和那位男生送上了我们亲手叠的500多颗星星。我的语文老师允许我们在上课时间去送她。我已然忘了最后有没有去送她，但如果让我来写剧本，我一定是悲剧地坐在教室里，怅然若失地呆坐……\n\n再后来，语言老师接着讲完了实习老师讲了一半的课，没有留下一句其它的话，这让我很是失望。再往后的事情，就一点不记得了。\n\n自此以后，再没有为这么小的心思费这么大的劲。回想起来，只能说，青春真是段神奇的日子，那些小心思，连自己都觉得震惊。\n",{"id":127,"type":7,"slug":128,"title":129,"date":130,"category":26,"tags":131,"body_markdown":133,"permalink":16,"excerpt_src":16,"media_type":16,"media_title":16,"media_author":16,"media_url":16,"rating":16,"layout":16,"pv":17,"admin_only":17,"created_at":18,"updated_at":18,"deleted_at":16,"status":19,"cover":31},73,"qi-cheng","蝶恋花 - 启程","2013-04-17 12:27:00",[132],"蝶恋花 启程","\n那一年，我高一，在好友的“诱导”下，一脚踏进了文学的大门，从此一发而不可收拾，一颗很“文学”的心陪着我走过了美好的高中三年。\n\n在这三年，还有另一批朋友，在他们的支持和鼓励下，我开办了一个论坛，最早叫“学子天下”，后来因为域名问题，改名“莘莘星空”。高中生的学业自然繁重无比，论坛的流量也不尽人意，但我的朋友们仍然会时时支持我把这个论坛继续办下去，于是我一直让这个论坛维持到了高中毕业。\n\n高中期间，这个论坛成了我精神支柱的一部分，也在一定程度上成了我和朋友们交流的地方。在这里，沉淀有我和朋友们的心情随笔、散文小说，也有四处收集而来的各种有趣的小玩意。也因为这个论坛，让我在网上认了唯一的一个姐姐，她比我大几岁，时常会给我一些很有意义的指导和和鼓励。她说的一句“你有没有出过书？”着实让我高兴了好一阵子。也正是因为这句话，在行将毕业之时，我顶着来自各方面的压力，一个人固执地完成了文集《蝶恋花》的录入、校对、印刷。\n\n高中毕业之后，一直想要继续维护这个论坛，但发现困难重重，一方面没有时间去维护，一方面国内站长也一再遭遇监管部门的打击。后来，在几次改版无果之后，我关掉了这个站。\n\n如今，我也工作好几年，时过境迁，沧海桑田。只是每当回忆起这个论坛，回忆给那些沉淀下来的句子，总会觉得心里有一种悸动。于是，在看到微信公众号的时候，我决定用另一种方式，将这种回忆拉回现实，继续走下去。\n\n很高兴的是，在未做宣传的情况下，微信公众号已经有了第一位关注者。本来我想等到一定数量再开始运营，但后来觉得我应该认真地对待每一位关注者，因此，早早地发了这一篇文章。\n\n未来的路很长，也可以预见会很艰难，但我会尽量坚持，会不定时地给大家带来一些有关青春的气息，同时，也将这种气息再带回给自己。\n\n以欧阳修一首很著名的《蝶恋花》来结尾吧：\n\n> 庭院深深深几许\n> 杨柳堆烟\n> 帘幕无重数\n> 玉勒雕鞍游冶处\n> 楼高不见章台路\n>\n> 雨横风狂三月暮\n> 门掩黄昏\n> 无计留春住\n> 泪眼问花花不语\n> 乱红飞过秋千去\n",190]