2013年终总结

今天(2014.1.5)终于抽时间回来把坑填了,曾经坚持的博客,到现在一年一篇的频率都无法达到,只好用这么坑爹的一个办法,让2013年也有一篇文章了 XD

关于2012

我现在才发现原来2012那年也没有这样的年终总结,好吧 =。=|| 那我大概想想去年都干了些啥吧。最重要的是毕业了,工作了,然后居然还歪打正着的买车了,过上了看起十分美好的生活。

回忆2013

我争取做到按月来回忆下今年吧。

  • 1月 沉静于刚买车的喜悦中,磨合期到处跑,印象最深刻的就是每天绕着4环来一圈,7、80km 吧;
  • 2月 因为买车花了太多钱,回家路费也没了,所以决定独自一人在京过年。虽然有同事也不回家,但是还是选择了自己一个人度过年三十,一段奇妙的体验吧,从早上自己准备年夜饭,到晚上看春晚,0点敲钟。其实没有那么凄凉,现在想起来,还是一段奇特的回忆。大年初三还是初几来着,独自开车去了趟大连,第一次一个人开那么久的车,最后来回都算挺顺利的,也不容易了;
  • 3月 搬家了,因为有车后月支出猛增,打算换一个便宜的房子,加之女朋友打算过来实习一段时间,所以必须和室友选择一个两居的房子。现在才能体会之前四环亚运村房子的优势,交通便利,周边生活方便,如今却去到了一个5环外,附近公交就一两趟的『破』地儿;
  • 4月 女友来了之后,过上了一种特别规律,特别居家的生活。朝九晚六的感觉,一起上班,一起下班,一起做饭,然后边看电视边吃饭,然后睡觉,就是一天的生活。不知道这种平淡是好是坏,感觉没有太多精力研究、折腾其他东西了,也许这就是家庭的感觉?清明节的时候跟女友去了一趟成都,然后又回了家一趟,然后玩了玩我至今才去过的丽江。虽然一切并不是很顺利。还去了一趟QCon;
  • 5月 『东西』这个项目已经成了工作中的主旋律,第一次在豆瓣这样一个『慢』公司里体会到了久违的动词打次感觉,虽然这种感觉还是没办法让我找回曾经点点创业的那种激情,也许世故了吧。5月的某一天,东西第一个内测版正式上线;
  • 6月 上半年就这样过去了,我也忘了这个月发生了什么。
  • 7月 女友出国前,一起去了趟青岛。虽然那儿环境不是我想象中的那么美,但是我仍记得『大胡子』的半自助海鲜大餐,新鲜的青岛啤酒真的味道很赞,醇香的麦芽味儿是只有新鲜才有的口感,罐装神马的都弱爆了。
  • 8月 女友出国了。东西的节奏实在让人都没有时间多想其他事儿。
  • 9月 24岁了,主旋律依然是东西。
  • 10月 在一北京朋友带领下,终于光了好多北京有名的地儿,吃了不少好吃的东西。
  • 11月 工作,还是工作。其实这时候已经被各种需求、改版折磨的完全没有思考了,一个 feature 要求得特别急,拼死拼活花了两周开发、上线,使用了两周时间,之后因为另外一个 feature 的原因,不得不就下线了。好吧,细节不多说了,但是类似这种折磨确实让人已经没有其他精力去思考产品,只能『做好自己的事儿』
  • 12月 年末了,突然发现自己有很多事儿需要办——就是各种各样的证,但是这不都是自己一个人的事儿,还需要去求很多其他人,但是没办法呀,为了生活,贵国需要怎样怎样折磨你,你不也得忍受么?虽然各种埋怨,但是该办还是得办,而且我的性格就是那种说做就想里面去做,所以一个证特别特别着急办,但最后发现自己还差半年才能去弄,瞬间就失落了。至于另外一个证呢,贵政府的政策实在呵呵后,只能等来年了。虽然这么多吐槽,但是自己依然还是没有太多勇气能够走出去,不知道是为什么?我就感觉出去是一件特别特别折腾,而且完全不确定的事儿,始终迈不出那一步。虽然现状可能并没有那么满意,但是感觉自己能够有努力的方向,不会那么茫然。现有的东西,我告诉自己确实应该满意很多了,因为现在这些都是曾经自己所期待的,我需要好好珍惜。而且那些期望的东西,其实通过努力,还是有可能的。

流水账至此结束。

期待2014

最庸俗的,年底需要的那些证都能够办好。纠结大半年的事儿,希望自己能够弄清楚。希望能过得更好,身边关心自己,爱自己的人都更好。

-EOF-

浅谈 HTML5 的 Drag and Drop

前言

这里引用 PPK 大神一篇文章 The HTML5 drag and drop disaster 里面的一段话作为开始:

After spending about a day and a half in testing I am forced to conclude that the HTML5 drag and drop module is not just a disaster, it’s a fucking disaster.

可想而知,这货是有多么坑爹啦?不过 PPK 的文章我确实也没仔细看,只是在翻阅资料的时候,偶尔看见了,然后第一句话就让我感同身受,好吧,那接下来就与 DND 战斗吧!

需求

大致说一下需求,这里需要完成一个拖拽上传的功能,相信这也是老生常谈了,2、3年前 Gmail 便实现了,国内各网站也有了不同程度的支持,点点网 一贯以追求良好的用户体验为楷模,所以今年年初他们也推出了这个功能。但是总体来说,通过细致的体验后发现,细节方面做得还是不够完善。

做完整个功能之后,我总结一下我所希望考虑到的细节吧:

  1. 有东西拖动进入页面,需要有反馈,知道这是一个拖动;
  2. 设定一个允许 drop 的区域,文件拖入此区域才算是一个正确的用户行为,并有相关反馈提示此处可以 drop,其他区域无法 drop,如果用户提前释放鼠标,则会有相关的 revert 的动画出现(貌似这个就 Mac 下会有,Windows 一切尽在不言中);
  3. drop 成功后,前端拿到适合的图片文件,直接通过 dataURI 进行展示,然后通过兼容之前 form 表单提交接口,后台完成图片数据的后端提交,基本做到平滑、用户无感;
  4. 考虑到浏览器其他插件会也会充分运用到 Drag and Drop 的因素,尽量做到不影响其他脚本功能。

大致就那么多吧,前三点是开始完成需求时就一直要求完成的,也是其中最纠结的地方,充分让我体会到了 DND 事件和API是如何的 sucks!!!
阅读全文…

写在生日今天

第23个生日就这样平静地来,平淡的去,没有过多的祝福,没有过多的庆祝,IM 上的一些问候,短信里的几个文字,这也许就是信息世代的结果,也许就是工作后平淡的开始……

毕业

毕业时,也未曾有过一点儿文字的记忆,可是回头看,已经远远离去。现在眼前还会依稀浮现出室友的感叹“还有一个月”,“还有十天吧”,“没有几天了”,直到最后的聚餐,拿证,匆忙的离别。是的,我的大学就这样结束了,给我留下最深刻印象的只有友情和爱情。也许这就是一个完美的结局了,最后毕业的两张纸,以及满当当的情。只能感叹岁月无情,4年转瞬即逝!依然还在回忆大一和你们三打扮寝室,与里面俩一课不落地学习,食堂听你俩的故事,和你们俩忐忑地面对第一次面试,和你逐渐走到一起。四年里发生了太多,你们一直陪我经历,四年后就淡然,感觉一切又都那么淡了,逐渐都不在我身边了。

是啊,就是大学的这份情最真,最纯,谢谢你们!

工作

最后的工作还是来到了自己心仪的一个地方,工作节奏也逐渐地适应过来,感觉还是比较适合自己的。就是工作后每天整个人都会处于一种很疲惫的状态,可能还没有从学校状态中转变过来吧。下班之后,整个人都会比较懒,正好家里有电视,就会漫无目的地看电视,哎~~其实很多书都堆着还没看呢,这种状态还是要改变吧,总是得从书本中学到些赶货,也要保持先进性啊!

最后

以上这篇文章又水了,本来还算抒情的感觉被一个电话搅乱了,好吧~~不过最近有一篇工作中技术方面的干货会尽快准备出来呢,总算是又改来点儿技术的东西了,哈哈 :)

= EOF =

Top Down Operator Precedence - 自顶向下算符优先分析法

这是一篇翻译,原文来自 Top Down Operator Precedence。由于毕设搞的就是相关技术,所以近期花了块两天时间把文章翻译了,实在够累,希望大侠看见,不吝赐教!

作者:Douglas Crockford

简介

1973年,波士顿 Vaughan Pratt编程语言原则座谈会(Principles of Programming Languages Symposium) 第一期年刊上发表 自顶向下算符优先(Top Down Operator Precedence)。在论文中 Pratt 描述了一种结 合递归向下(Recursive Descent)方法 以及 Floyd 算符优先(Operator Precedence)方法 优良特性的解析技术。它非常易用。同时,它看起来很像递归向下,但是却可用更少代码实现以及更高效的性能。他声称这项技术非常易懂,便于实现,方便使用,性能特出,同时也很灵活。它是动态的,支持真正语言级别的扩展。

但是很奇怪,对于编译器编译来说如此优异的方法如今却完全被忽略了。为什么会这样呢?Pratt 在论文中指出,由于更早出现的 BNF 语法以及其各种各样的变种版本,伴随着与之相关的自动机和定理的出现,限制了自动机这种不可见领域的多样发展。

另外一种解释说,他的这种技术只是在应用于动态的,函数式编程语言上才会有很高的效率。将它应用于静态程序语言上则略先困难。在论文中,Pratt 用 LISP 语言基本毫不费力地就从词法单元流中解析出来了语法树。但是这种解析技术却没有在 LISP 社区中体现出太大的价值。自从 LISP 诞生之日起,就有出现很多让它拥有算法似的语法(ALGOL-like syntax),其中包括 Pratts 的 CGOLLISP 2MLISPDylanInterlisp 的 Clisp 以及 McCarthy 的 原始 M 表达式(original M-expressions)。但是最终都没有被接纳。LISP 社区发现协调程序与数据比富裕表达的语法更有价值。但是主流编程社区依然热衷于自己的语法,所以 LISP 从来没被主流接纳过。Pratt 的技术需要一门动态语言,但是动态语言社区历来都没使用过方便 Pratt 的技术解析的那种语法。

JavaScript

随着 JavaScript 的诞生这种情况发生了改变。JavaScript 是一门动态的函数式语言,但是从语法上看它明显是 C 语言风格家族的一员。它是一门动态语言且拥有社区都喜欢的语法。

JavaScript 也拥有面向对象特性。Pratt 1973年的论文预测面向对象将会是一种趋势,但是却缺乏一套富于表达的描述方法。JavaScript 是一门非常适合使用 Pratt 技术的语言。接下来我会用 JavaScript 快速实现一个简单的解析器。

在这么短小的一个章节里,我们没有足够的时间来实现整个 JavaScript,同时我们基本上也不会想去实现,因为语言里面的有一部分是糟粕。但是语言里面依然有一些考虑周全的精华元素。我们将会编写一个只能解析 简化版 JavaScript(Simplified JavaScript) 的解析器。同时我们也会使用简化版的 JavaScript 来编写这个解析器。简化版的 JavaScript 只包含精华的部分,包括:

  • 函数是一级对象。在简化版 JavaScript 中,函数是拥有词法作用域的 lambda 表达式。
  • 原型继承的动态对象。对象是类无关的。我们可以使用普通的赋值方法像任何一个对象中添加一个成员。一个对象可以从另外一个对象中继承其成员。
  • 拥有对象直接量和数组直接量。对于创建新的对象和数组,这是一种绝佳的描述方法。JavaScript 直接量是 JSON 数据接口格式的灵感来源。

我们将充分利用 JavaScript 原型继承的先天特性让词法单元继承自符号对象(symbols)。我们的实现依赖于 Object.create 方法(这个方法是创建一个新对象,并从一个已存在的对象中继承成员)以及一个词法单元生成器(tokenizer)(这个方法是从一个字符串里面生成一个包含简单词法单元对象的数组)。我们在这个词法单元的数组中逐步前进,生成我们的解析树。

符号表

每一个词法单元,例如操作符和标识符,都继承自一个符号对象。我们把所有的符号都保存在 symbol_table 对象(这个符号表是用来判断我们语言中词法单元的类型)中。

var symbol_table = {};

这个 original_symbol 对象是所有其他符号的原型。它其中的方法同时是被用来重写(overridden)的。(我们将会在接下来的优先级一节来解释 nudled 的作用以及约束力的含义)

var original_symbol = {
    nud: function() {
        this.error('Undefined.');
    },
    led: function(left) {
        this.error('Missing operator.');
    }
};

让我们来定义一个生成符号的函数。它包含一个符号 id 和一个可选的约束力值,默认为0。函数返回一个对应 id 的符号对象。如果这个符号已经存在于 symbol_table 中,则函数就直接返回那个符号对象。否则,就创建一个继承于 original_symbol 的符号对象,存储在符号表中,并返回这个对象。一个符号对象初始的时候包含一个 id,一个符号值,一个左约束力,以及其他从 original_symbol 中继承的元素。

var symbol = function(id, bp) {
    var s = symbol_table[id];
    bp = bp || 0;
    if (s) {
        if (bp >= s.lbp) {
            s.lbp = bp;
        }
    } else {
        s = Object.create(original_symbol);
        s.id = s.value = id;
        s.lbp = bp;
        symbol_table[id] = s;
    }
    return s;
};

下列是常见的分隔符号和结束符号。

symbol(':');
symbol(';');
symbol(',');
symbol(')');
symbol(']');
symbol('}');
symbol('else');

(end) 符号表示词法单元流的结束。(name) 符号是新命名符号的原型,例如变量名。包含在 id 两边的括号主要是用来防止与用户定义的词法单元冲突。

symbol('(end)');
symbol('(name)');

词法单元

我们假设源代码已经被转换成一个包含简单词法单元对象(tokens)的数组,每一个对象有一个类型(type)成员(包含名称(name),字符串(string),数字(number)或者操作符(operator))以及一个值(value)成员(是字符串或者数字)。

token 变量总是指向当前的词法单元。

var token;

advance 方法从数组中的下一个简单词法单元创建一个新的词法单元对象,并且赋值给 token 变量。它拥有一个可选参数 id 用来检查是否和之前一个词法单元匹配。新的词法单元对象的原型是当前作用域中的 (name) 词法单元或者是符号表中的一个符号。新的词法单元的 arity(运算元) 是 名称(name),直接量(literal)或者操作符(operator)。arity 随后也可能根据我们了解更多该词法单元在程序中的角色而变化成二元运算(binary),一元运算(unary)或者语句(statement)。

var advance = function(id) {
    var a, o, t, v;
    if (id && token.id !== id) {
        token.error('Expected "' + id + '".');
    }
    if (token_nr >= tokens.length) {
        token = symbol_table['(end)'];
        return;
    }
    t = tokens[token_nr];
    token_nr += 1;
    v = t.value;
    a = t.type;
    if (a === 'name') {
        o = scope.find(v);
    } else if (a === 'operator') {
        o = symbol_table[v];
        if (!o) {
            t.error('Unknown operator.');
        }
    } else if (a === 'string' || a === 'number') {
        a = 'literal';
        o = symbol_table['(literal)'];
    } else {
        t.error('Unexpected token.');
    }
    token = Object.create(o);
    token.value = v;
    token.arity = a;
    return token;
};

阅读全文…

2011 回顾

距离上一篇文章又是大半年过去了,真的不得不说现在的自己是越来越懒了,不过随着 2011 过去,大批的总结文章也都出来,自己想想,的确也应该自己总结一下啦~

学业

首先还是先说说学业吧,虽不说一起都顺风顺水,但是到现在,基本整个大学的考试都结束了,学分问题也不是很大了,就剩最后的毕设了,一切总算都过来了~现在回想起大三下学期的几门课程,真的都不敢想像是怎么熬过来的~

工作

大三整年基本都在实习中过去,很多的变故,很多的经历,很多的故事都在不言中,大二暑假到大三上的淘宝实习,大三下、大三暑假的点点实习,体验到两种截然不同的公司类型,但是最终都在两支优秀的团队里面得到了太多太多,淘宝让自己知道山外有山,静心去学习专业知识;点点让我看到了整个团队的运作,整个网站的运作,一起都可以尽在掌控~真的十分感谢你们,是你们让我成长得这么快~是的,最终还是放弃了这些选择,真的对不起,很遗憾,但是我会坚持信念,不后悔这样的选择~

生活

本本从 VAIO 转到了 MBP(感谢点点为我提供了这样一个机会),驾照一切顺利(感谢李师傅)~生活,上述的一切不就是为了更好的生活么?所以回过头想想,既然自己向往品质生活,那么肯定就需要为此去付出努力,去追求,虽然前途、目标还是很模糊,但是拼命奔向眼前正确的选择也不失为一个中庸的选择~

2012

世界末日?好吧,我还真的不信~大四下学期,需要好好实习一段时间,同时为了学业的毕设,也不能放松,毕竟自己给自己挖的那个坑也不小~毕业前,还是要好好珍惜那不多的大学时光了,毕业后的工作,希望一切能顺利,既然最终的选择已经定了,不管发生什么都应该坚持下去,毕竟这就是自己未来事业的开端了!

反正大家也算是知道,我这个博客还活着吧~祝各位元旦快乐 :)

Page 1 Of 2712345678...最旧 »