windows中安装ubuntu 13.04 (what a fucking day!)

上次参见gurudigger的hacthathon,指导队友当场装了一个ubuntu,就装在windows8下。我分明看到ubuntu是这样的:

市场的图标就是一个A。

然后回家我也想装装看,到ubuntu.com,看各种消息再见Wubi:Ubuntu不再支持从Windows安装都说无法使用wubi.exe来在window上安装ubuntu 13.04了。

shit,那hackathon上我分明看到队友的window中跑滴就是ubuntu13.04呀,看着那个市场滴A我羡慕啊。

多方求证看来是无法安装了,那我只能升级我的12.04了,修改更新策略花了五六个小时升级到了12.10,然后又花了八个小时升级到了13.04,升级过程中,说ubuntu-deskstop这个包无法安装,跳过了。等我重启进去,说fontconfg什么什么的问题,进不去。

怎么办,无法直接安装,升级也升到我想吐血。

再次询问队友,当时是怎么装的,无果。

我把12.04的wubi下载下来,替换13.04中wubi不行,可是:

把13.04 iso解压将wubi拷贝出来,运行它,结果它就开始加载虚拟光驱中的镜像,在windows中安装ubuntu13.04了,本文就在安装好的系统中写成。

what a fucking day!

至今我没搞清楚,队友是如何装成的!

发表在 未分类 | 标签为 | 留下评论

CoffeeScript 1.6.1发布,支持Source Map

3月5号,CoffeeScript发布了1.6.1版,开始支持期待已久特性——Source Map。

终于可以在Chrome中直接调试CS了,使用非常简单:

:coffee -c -m .

继续阅读

发表在 CoffeeScript | 标签为 | 留下评论

在Node中使用全局变量?

在昨天的Hackathon中,需要搭建Web服务器,于是我们采用基于Node的开源框架express来搭建。

在紧张的开发过程中,战友问了一个问题,如何读写一个全局变量(或者是让某个变量能可以全局都能访问)?也就是说我们有这么一个需求,在程序的多个地方(尤其是不同的模块中),我们需要对同一个对象进行读写。

于是我开始想,Node中有全局变量么?有的话挂上去就好咯。Google了一下,发现Node提供了一个global变量,可以往上面扔东西,这些东西就可以在全部使用。还存在一个GLOBAL变量,其实就是相当于global。

还有其他方式么?有,看下面的代码:

global.js中的timestamp就是全局的。因为foo.js对它的修改可以影响bar.js的输出。

于是,我明白了,我以前陷入了一个误区。不是每个require都会重新执行依赖的代码,生成不同的对象,模块只会被加载一次。而本身模块一定是挂在某个特殊的全局变量上的,这与浏览器端的模块加载器是一致的。

于是,我们就可以使用如上的,无入侵式的方式使用全局变量(或者说是所谓的全局变量)。

发表在 Node.js | 标签为 | 2 条评论

奇异事件,我把豆瓣电台插件卖掉了!

我觉得这是一个奇异事件,两年多前,拉着jQuery的裙摆初识JavaScript,我在图书馆中泡了数日,折腾出了豆瓣电台这个chrome插件。没想到最近有人邮件我愿意以四千元的价格购买,现在我获得了这笔钱!

这个插件没有任何技术含量,就是在用户点击chrome右上角的icon时,打开http://douban.fm/radio,就这么简单。

曾经被chrome迷报道过,然后加入了某同学的插件联盟,我不知道这些用户为什么会使用这样一个毫无用处的插件,慢慢就有了一些用户。最多的时候大约有1.7万,现在下滑了不少1.2万左右。

我当时做这个插件的目的只有一个,当时的豆瓣电台还是最初的版本,我每次要打开都需要点击多次还行,所以我才做了一个这种“超链接”。

时常倒腾点东西,说不准还真能发生点奇异事件什么的。

最后感谢女朋友,那个时候和我一起在图书馆里,只是我在瞎搞,而她在学习!

发表在 未分类 | 标签为 , , , | 7 条评论

Hackathon小记

到王淮的博客上看看上次公司组织Hackathon是什么时候(2013年1月18号),结果发现了对公司年会的严重吐槽

回到Hackathon上,我与另外一位前端同事和兄弟部门的两位同事组队,做一个名为Thunder的东西。本来大家没什么题目,然后做我一直想做的用户行为热力图系统。最后一天Dozer同学说我们可以做Bump类似的东西,讨论了一下这个点子挺棒,于是决定使用Bump来改进我们的验券流程。

如果大家了解Bump的话,很容易理解我们的目标。即开发出两个智能手机客户端,一个商户用,一个用户用,验券过程及其简单,双方在一起碰一下手机,互相确认身份匹配后,就可以通信验券了,无需抄写券号,也无需在验券平台手动输入券号。

我们不是客户端开发工程师,所以技术方案采用PhoneGap实现,后端使用Node.js,使用Socket.IO在客户端和服务端之间进行通信。

我们分头合作,有人设计UI,有人研究配对算法,设计流程,而我就是搭搭环境,重构了部分页面,写了一些JS把大家的成果粘到一起,戏称“首席架构师”。

coding到了深夜,我到旁边小睡了一会儿,等我醒来,最根本的功能手机配对成功,真不敢相信原来真的可以实现。

然后继续优化到Hackathon结束,基本功能完成,商户可以和用户配对,用户选择要验的券,验券,双方显示验券结果。

周日我做了一个chrome插件,就是为了在我们的线上验券平台注入一段JS,实现PC验券页面与用户客户端的Bump通信。

周二Demo Show,评选,后来结果拿到了金奖和图灵奖。各位看官或许觉得这件事情太小case,抄袭没创新,这种水平还能拿奖?不管怎样下面几点是我学到的:

1. 每个人都有自己的优势,团队协作就是发挥需要发挥大家的优势;

2. 一个团队中,单干并不可取,每个人都积极参与,效率和产出更高;

3. 注意细节,接受别人的批评(我在做好PPT之后,给旁边的一位QA演示了一下,她给我提了若干意见,我觉得都说到了点子上,很多细节没有注意好);

4. 私觉得Show PPT的时候脉络要清楚,最好最后要有一张总结。

可以在Github上查看我们的项目,这是我们Demo Show时候的PPT:

 

发表在 未分类 | 标签为 | 留下评论

CoffeeScript编译器(二):是如何打包到客户端的?

CoffeeScript编译器中有很多细节可以学习,今天就来看看CoffeeScript是如何把Node模块打包到浏览器端的?

CNode上有篇帖子:发现coffee-script在浏览器端的是自己实现的require,有谁研究过原理和实现么?

这是一个什么问题?

目前CoffeeScript的源码使用CoffeeScript写的,全都放在src下面,而且遵循的是Node的包规范,即使用require、exports、module这三个对象来组织代码。这些文件会被编译到lib/coffee-script下面,当然也都是一个个Node包文件。这些文件在Node环境中当然可以运行,但在浏览器环境中就不一样了,那如何能让这些代码在浏览器中运行呢? 继续阅读

发表在 CoffeeScript, JavaScript | 标签为 , , , , | 2 条评论

f5 v0.0.4 发布

f5必须严重感谢UncleBill同学,是他的热情参与f5才能发布v0.0.4版。

新版本的改动不大,主要是bug fix:

  • 修改不能动态刷新的bug,这个bug完全是P1级别的呀,f5的核心功能;
  • 文件列表根据文件类型排序,不同类型的文件使用不同的icon图片;
  • fix中文乱码问题;
  • 使用ejs模板引擎,分离数据和展现;

大概就是这些。 继续阅读

发表在 JavaScript | 标签为 , , | 4 条评论

addEventListener的另外一种使用方法

今天发现原来addEventListener还可以这样用,上代码:

var body, listener;
listener = {
    handleEvent: function (evt) {
        console.log(evt.type);
    }
};
body = document.body;
body.addEventListener("click", listener);
body.addEventListener("keyup", listener);

解释在这里

The object that receives a notification when an event of the specified type occurs. This must be an object implementing theEventListener interface, or simply a JavaScript function.

即listener除了可以传递一个函数以外,还可以传递一个实现了Interface EventListener的对象,简单的讲,就是该对象实现了一个名为handleEvent的函数即可。

发表在 JavaScript | 2 条评论

CoffeeScript编译器(一)

CoffeeScript越来越流行,接触CoffeeScript也已经一年有余,最近正在看它的编译器实现,在这里把体会记录下来。

目前,CoffeeScript编译器是使用CoffeeScript编写的,很多人会问,这是蛋生鸡呢,还是鸡生蛋? 其实CoffeeScript编译器最初是使用Ruby编写的,CoffeeScript团队于2010年2月21号发布了v0.5.0,使用CoffeeScript重写了编译器。 继续阅读

发表在 CoffeeScript | 标签为 , | 2 条评论

【翻译】CoffeeScript Source Maps

作者:Ryan Florence

Michael Ficarra创建的“better CoffeeScript compiler”的kickstarter很成功,而且现在还反馈了一个巨大的红利支持者——source maps,CoffeeScript调试,作为不把CoffeeScript用在浏览器中最流行也是最强的反对意见,现在已经解决90%了。

安装CoffeeScriptRedux

从Github上把它clone下来:

    $ git clone git://github.com/michaelficarra/CoffeeScriptRedux.git

安装依赖:

    $ cd CoffeeScriptRedux
    $ make deps

运行测试,保证没啥问题:

    $make test

把你的文件编译为JS吧

CoffeeScriptRedux没有使用与CofffeeScript一样的接口,所以可能这会与你使用的稍微有点不一样。

从CoffeeScriptRedux目录开始:

    $ ./bin/coffee --js -i /path/to/test.coffee

这会创建一个文件:/path/to/test.js

创建Source Map文件

    $ ./bin/coffee --source-map -i /path/to/test.coffee > /path/to/test.js.map

为了干成这事,我不得不安装了source-map:

    $ npm install source-map

把Source Map告诉浏览器

你需要告诉浏览器source map文件在哪里,可以往文件里添加一行注释,你可以编辑test.js,或者直接运行:

    $ (echo; echo '//@ sourceMappingURL=test.js.map') >> /path/to/test.js

打开Chrome开启Source Map功能

打开控制台,点击右边的齿轮按钮,勾选“Enable Source Maps”。

chrome

“That’s it!”

打开一个带有test.js的页面,查看web inspector的“Sources”,你的CoffeeScript就在那里,你可以设置断点,鼠标划过变量能够看到它们的值(译者:噢噢噢噢),诸如此类!

下面是一个我故意打破映射的实现:

下载示例文件

map

那,那10%没有解决的是什么?

就是,你无法在console中直接输入CoffeeScript。这里有一个CoffeeConsole chrome插件,但是在断点的地方它什么都不知道啊 。(译者:说不准可以使用://@sourceUrl=<path>解决?)

发表在 CoffeeScript | 一条评论