— Designsor

首先,我不想解释太多了……因为会用的人一般都知道怎么实现,针对node的话,node自身是提供了一个events的类,具体的api参见:http://nodejs.org/docs/v0.6.3/api/events.html

然后,针对它的使用方法,我是说给一个自己的类增加自定义事件的功能,文档没有细说,简单看下我的例子:https://gist.github.com/1396974

没有几行,在cnodejs上查到相应的解释,那个帖子说的有点模糊,也没解释清楚到底原理是什么。那么下面给出原声js的相应简单代替:https://gist.github.com/1396984

代码都很短,在一个类里实现run方法,然后自定义个触发的时机。主要想写给后端人员看,只实现了on和emit,至于其他的,大同小异。

接下来就是要自己封装一个自动产生拥有events功能的类的工厂方法,类似yui的base类了。唔。。。

Read More

距离上一次写blog又隔了好久,这次又回来更新了。最近一直在忙着吸收新知识,当然 是对于自己不了解的知识。

自从上次用vim代替aptana之后,对linux的文件操作,现在是一点问题没有了,配置插件和设置环境变量【当然都是ubuntu下】都一路顺畅,发现linux系统真的是开发利器,装什么都方便的不行,最最要紧的一点是,通过使用ubuntu进行代码开发,强迫我又去理解和查找了很多linux的常用操作命令和了解它的文件系统。总之,下面来做个总结吧。

常用命令就不说了,google一下,日常的文件夹文件操作,改名mv,移动mv,复制cp,删除rm,递归-r,查看树形tree,查找find,都木的问题。

简单的shell命令比如管道,I/O通道等,工具比如curl,grep,wget,ftp,scp等的使用。

vim与系统的数据交互,vim中多个文件同事编辑,diff,互相读取和粘贴,自定义map映射还有自定义调插件与命令行工具进行便利开发,所有这些,我都让我觉得,我爱上vim这玩意了,或者说,linux下的工作方式。

再然后,linux下git的使用,多个虚拟机(单位服务器,vps服务器,自己家ubuntu,单位虚拟机ubuntu的代码同步全靠他了,合并处理分支一系列的工作)

由于vps的不稳定,我也看了一些相关linux下备份系统的东东,由于linux根目录下的东西在不结束进程的情况下就可以自由备份,所以现在一个tar就可以搞定全部的工作,再配合shell的定时处理和ftp,每天将最新的系统备份到了其他的远程主机,比如公司服务器或者我gd的服务器。

丫真心的很是方便……

再然后就是在linux下安装SpiderMonkey,进行js代码的实时运行,lint工作。安装各种开发套件,比如apache,nginx,node,java,php等。现在来看,我得感谢我的vps太干净了,连zip这种工具都要自己装,所以上面这些全部都是手动编译安装到系统的。又顺带了解到了许多之前不理解的文件夹结构,还有编译前的一些文件配置。【找资料当时找的头疼啊……】

当这些都搞定,我才开始在linux下学习开发以nodejs为基础的web应用~。

说到这里,我想解释一下,node火成现在这个样子,虽然我早在09年出了0.2版本左右的时候就知道有这么个东西了。。就是直到1周前才开始认真去学。

就不说学习的曲折路线了,官方和cnnode社区都给了完整的文档,新手指南和入门教程。源码和安装方法也是windows和linux都有,比较简单,一路走下来没有什么困难。主要下面说一些改变我认知的东西……

当安装完nodejs,跑起来一个http服务的时候。我没任何感觉。。但是当我关掉apache之后,发现这个服务依然存在的时候,我才感觉到这玩意有点意思……。

在cnnode的群里人指导,下开始对node的服务进行apache的配置,其实nginx也是一个道理,把虚拟主机的配置和域名解析,反向代理都弄明白,基本的web开发知识也就是这个样子了,剩下就是配置了,不多说。

当架设好一个反向代理到node server的虚拟主机的时候,我成就感真的很大……当然那时候就只是一个hello world而已。但对于我这种菜鸟来说,你们懂的。

那么,下面开始进行开发了。读完整个node的官方文档和新手入门教程以后,知道了什么模块干什么的,模块的加载机制和如何编写自己的模块,基本就差不多了。语法和js一样,没的解释,写起来很流畅,web程序开发的过程一上来我就选择自己建立自己的mvc编码方式。

简单说一下,node的mvc,超级简单……我现在db层还没有写,但是v和c已经基本完成了。node的路由代码,应该所有网站都有介绍,配合mustache,我根本没有用到express……就把控制器和templates搞定了。虽然我的代码没express那么简洁,但是我觉得如果一上来就用各种框架,很难理解到node的精髓,就像你学js直接用jq开发一样,没意思。。

再然后db层,花了一下午的时候去看mongodb的资料,安装配置,以及简单的4个操作,增删改查……【对于我这种纯前端来说,也就是这个了】。mongodb为什么说和node配合最方便呢,node可以操作别的数据库,npm上应该各种模块都有,但是mongodb的shell居然就是用js的语法写的……包括各种sql。。好吧,那不用它还用啥?而且nosql和bson的方式也是第一次听说,详细看一下,我包你世界观又有改变。。,我在想如果再配合操作Memcache,又会如何呢,之后我会尝试。。

嗯,在写完几个简单的控制器和模板之后,我没有往m层走,而是转向去完成一个node版本的静态服务器,通过朴灵同学的这篇文章可以简单了解实现技术,我就不多说了。。最开始我实现的和他差不多,看过他的之后觉得他的那种方法更好。貌似是从老外的书上翻译来的……?看看你就知道了。http://cnodejs.org/blog/?p=3904

在这个的基础上,【其实我最开始没在他的基础上】我直接就开始搞combo了,写过php版本combo的人都知道,无非就是解析url,抓文件拼合,缓存,返回请求,都不复杂。

期间我自己被自己纠结到了:

就是I/O读取硬盘文件,然后装载到响应体的过程,我开始是要做内存缓存的,后来问了几个人,发现其他语言,都是木有做过cache的,我自己就琢磨要cache。。但是朴灵说:内存永远大不过硬盘。我立刻醒悟了……

那就每次都直接去读吧。确实什么都装进内存,不太好,也不现实。

关于node的异步操作,很多没写过js的人可能不理解,这里我就可以跳来了,对与异步的理解个人觉得我还行。打算写一个自己简化版本的eventproxy实现。。

总之,在实现这个combo的时候,我了解大量以前前端根本不需要了解的知识点……包括对node的进程概念,server概念也是从无到有,逐渐建立起来了,很开心,又学到了。。【node的combo和其他语言不太一样,io是异步的,所以顺序很重要,之前写过一个前端的js加载器,所以这里实现起来很easy~,具体可以看我项目中的lithe v2的loader部分,无非就是异步操作同时发出,依赖关系列队处理,每次回调check列队,全部ok执行callback】

唔。好吧,先说这么多。由于好多东西很杂,我突然想记录一下自己的思绪,所以就这么写了,代码实现可以看github上的2个项目,一个node-board一个node-combo,当然都根本没有写完。。。 – -||

但是总算架子搭起来了。

好,期待下周,能够搞定,由于都是业余时间在弄,进度不保准了……:)

写的很匆忙,睡觉了……有问题欢迎交流,我爱上node这货了。。

Read More

继续之前的vim小节,在对vim和vi有了初步认识之后,真心的觉得vim比什么eclipse,aptana,dreamweaver之类牛逼太多。虽然刚开始上手难受了一点,虽然现在有些时候还会被一些小问题纠结住,但总的使用了一周后感觉良好。

下面把配置文件再扔出来一次:

set nocompatible
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin

set diffexpr=MyDiff()
function MyDiff()
  let opt = '-a --binary '
  if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
  if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
  let arg1 = v:fname_in
  if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
  let arg2 = v:fname_new
  if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
  let arg3 = v:fname_out
  if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
  let eq = ''
  if $VIMRUNTIME =~ ' '
    if &sh =~ ' ' . arg3 . eq
endfunction

"配色
colorscheme slate
"字体
set guifont=Bitstream_Vera_Sans_Mono:h10:cANSI
"行号,行号栏目宽度
set nu
set numberwidth=2
"tab长度
set tabstop=2
"自动对齐
set autoindent
"语法高亮
syntax on
"设置gbk字符会有编码问题,设置字符集
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
"行间距
set linespace=2
"<>调整缩进时的长度
set shiftwidth=2
"初始化窗口宽度高度
set columns=150
set lines=30
"初始化窗口位置
winpos 52 42

"禁止自动换行
set nowrap
"在输入命令时列出匹配项目
set wildmenu
"显示光标位置
set ruler
"分割窗口保持相等宽高
set equalalways

"匹配括号规则,增加html的<>
set matchpairs=(:),{:},[:],<:>
"让退格,空格,上下箭头遇到行首位自动移到下一行(包括insert模式)
set whichwrap=b,s,<,>,[,]
"取消自动备份
set nobackup
"关闭文件之前保留一个备份
set writebackup

"js语法高亮脚本
let g:javascript_enable_domhtmlcss=1

"光标准星
set cursorline
hi cursorline guibg=NONE gui=underline
set cursorcolumn
hi cursorcolum gui=underline

"自动修改
set autoread

"不明字体宽度,按照double的来
set ambiwidth=double
"打开javascript折叠
"
setlocal foldlevel=1
let g:tlist_javascript_settings = 'javascript;s:string;a:array;o:object;f:function;m:member'
let b:javascript_fold=1  "开启折叠
"自动补齐括号等
:inoremap ( ()i
:inoremap ) =ClosePair(')')
:inoremap { {}O
:inoremap } =ClosePair('}')
:inoremap [ []i
:inoremap ] =ClosePair(']')
:inoremap " ""i
:inoremap ' ''i

function ClosePair(char)
  if getline('.')[col('.') - 1] == a:char
      return "/"
  else
      return a:char
  endif
endfunction

"自动补齐html"
function! InsertHtmlTag()
        let pat = 'c<w+s*(s+w+s*=s*[''#$;,()."a-z0-9]+)*s*>'
        normal! a>
        let save_cursor = getpos('.')
        let result = matchstr(getline(save_cursor[1]), pat)
        "if (search(pat, 'b', save_cursor[1]) && searchpair('<','','>','bn',0,  getline('.')) > 0)
        if (search(pat, 'b', save_cursor[1]))
           normal! lyiwf>
           normal! a
        endif
        :call cursor(save_cursor[1], save_cursor[2], save_cursor[3])
endfunction
inoremap > :call InsertHtmlTag()a

"半透明设置"
au GUIEnter * call libcallnr("vimtweak.dll", "SetAlpha", 234)
"git 配置"
set laststatus=2
set statusline=%{GitBranch()}

command Gogm cd E:apachehtdocsgm

看注释就明白了,简单说一下目前我觉得足够用的功能,其实都是想到了现google搜的,全部解决。然后在淘宝师傅给我的vim键盘表也排上了用场,这里也要谢谢猥琐的师傅啊……- -

简单说一下,之前用aptana主要是使用他得js,css,html代码提示功能。在vim里,用ctrl+n和p其实是可以直接调用的,牛逼的是提示不区分语言,而是从缓存里直接去读,甚至目录,我当时就被震惊了……这尼玛还要什么代码提示,先开一个jquery源文件,然后再写jq代码,确实是爽的不行,之后又安装了自动弹出提示的插件,感觉比那半残的aptana不知道好多少……。

然后是自定义的命令使用,每次打开vim都要cd一堆到我的工作目录,然后再开启目录树那个NERDTree插件,后来编辑了直接cd到目录的快捷命令,方便很多了,再之后调用bat脚本,直接!强制执行就OK了……更是便捷……再最后,增加括号补全,自动保存,一些颜色配置等,视觉效果比aptana牛逼多了,而且半透明的界面有时候还可以边抄边写代码。。。真是不错- -||

最后在aptana下有一个localstore,是我比较喜欢的,最后在vim下安装了git-vim插件,再也不用开bash界面了,再也不用再bash界面看恶心的diff了。。真是……而且也强迫了我把gitpro前面入门的章节看完了。。- -|| 总之 store的东西也就这样解决了~

周末用vim正则帮媳妇处理文本,1800多个ctrl+v,c,十几分钟就被搞定了……

我知道vim还有很多更强大的命令,期待以后慢慢挖掘……耶,哥终于转型vimer了……~发个文章,庆祝一下,而且新到的《学习vi,vim编辑器》也送到了~灭哈哈O(∩_∩)O~等着哥的读书笔记吧。

Read More