erlang shell 命令中文说明

erlang shell 是在命令行模式下使用命令和 erlang 交互的工具。erlang shell功能十分强大,可以直接编译、加载、执行、调试模块等等,完全可以将shell做为erlang项目的终端使用。文章将对erlang shell 命令做介绍,还简单以示例说明。

打开erlang shell的帮助信息,在这里变成中文了。同时可以看下官方文档

shell 函数帮助

Eshell V5.10.2  (abort with ^G)
1> help().
** shell 内置命令 **
b()        -- 显示所有绑定的变量
e(N)       -- 重复某次查询 <N>
f()        -- 释放所有绑定的变量
f(X)       -- 释放某个绑定的变量
h()        -- 显示之前的操作
history(N) -- 设置保存之前操作命令的条数
results(N) -- 设置保存之前操作结果的条数
catch_exception(Bool) -- 设置的执行过程中的异常处理
v(N)       -- 使用某次查询的值 <N>
rd(R,D)    -- 定义一个 record
rf()       -- 移除所有 record
rf(R)      -- 移除某个 record
rl()       -- 显示所有 record
rl(R)      -- 显示某个 record 信息
rp(Term)   -- 显示某个元组的所有内容
rr(File)   -- 从一个文件或模块读取 record 定义
** c 模块命令 **
bt(Pid)    -- 显示一个进程的栈回溯
c(File)    -- 编译及重新加载模块
cd(Dir)    -- 改变工作目录
flush()    -- 刷新信箱(以便shell接收信息)
help()     -- 帮助信息
i()        -- 显示系统信息
ni()       -- 和 i() 一样显示系统信息,还包括网络节点的系统信息
i(X,Y,Z)   -- 通过 pid <X,Y,Z> 获取某个进程的信息
l(Module)  -- 加载或重新加载模块
lc([File]) -- 编译一个列表的 Erlang 模块
ls()       -- 显示当前工作目录下的文件列表
ls(Dir)    -- 显示某个目录下的文件列表
m()        -- 显示已加载进系统的模块
m(Mod)     -- 显示某个模块信息
memory()   -- 显示内存分配信息
memory(T)  -- 显示某项内存分配信息 <T>
nc(File)   -- 在所有节点编译及加载模块
nl(Module) -- 在所有节点重新加载模块
pid(X,Y,Z) -- 通过 pid <X,Y,Z> 获取某个进程 pid
pwd()      -- 显示当前工作目录
q()        -- 关闭 erlang shell
regs()     -- 显示注册过的进程信息
nregs()    -- 和 regs() 一样显示注册过的进程信息,还包括网络节点的进程信息
xm(M)      -- 查找某个模块未定义的函数,未使用的函数,已弃用的函数
y(File)    -- 编译 Yecc 文件(.yrl)
** i 模块命令  **
ih()       -- 显示 i 模块的帮助信息
true

继续阅读erlang shell 命令中文说明

Erlang时间处理、时间戳转换

获取当前时间

erlang:now()得到的是从1970年1月1日零时起,到现在经过的时间,结果为{MegaSecs, Secs, MicroSecs}。有个问题要注意,还有另外一个函数可以实现同样的功能:os:timestamp()

那么, erlang:now() 和 os:timestamp() 的区别是什么?

erlang的解释如下:

erlang:now()

If you do not need the return value to be unique and monotonically increasing, use os:timestamp/0 instead to avoid some overhead.

os:timestamp()

The difference is that this function returns what the operating system thinks (a.k.a. the wall clock time) without any attempts at time correction. The result of two different calls to this function is not guaranteed to be different.
继续阅读Erlang时间处理、时间戳转换

skynet服务的本质与缺陷

skynet是为多人在线游戏打造的轻量级服务端框架,使用c+lua实现。使用这套框架的一个好处就是,基本只需要lua,很少用到c做开发,一定程度上提高了开发效率。但skynet文档也相对较少,所以这里利用一点时间学习和总结skynet相关内容,文章这里就讲解下skynet服务的本质与缺陷,希望能有所帮助。

skynet服务的本质

或许我们对skynet服务有着太多的疑问:

skynet服务究竟是什么,为什么有人说服务是一个lua虚拟机,服务与服务之间的通讯是怎样的,为什么服务的内存高居不下, 为什么拿skynet服务和erlang进程做比较?等等。。。而这一切的答案都在代码里面,让我们一步一步解开她的面纱。

继续阅读skynet服务的本质与缺陷

浅析lua异常捕获处理机制

异常捕获是高级语言的一大特性,通过对异常的捕获和处理,可以有效提高系统的稳定性和健壮性。因为无论再怎样改进代码,都不可避免出现一些异常,例如文件io错误、网络错误、内存错误等等,就要求编码对错误进行捕获,同时打印日志以便开发人员跟进问题的处理。当然,lua也提供了接口用于捕获运行时异常。

lua异常捕获函数

lua有两个函数可用于捕获异常: pcall 和 xpcall,这两个函数很类似,都会在保护模式下执行函数,效果类似try-catch,可捕获并处理异常。
两个函数的原型如下:

pcall (func [, arg1, ···])
xpcall (func, errfunc [, arg1, ···])

继续阅读浅析lua异常捕获处理机制

svn分支管理的使用与经验

最近项目用上了svn分支管理,因为项目太过庞杂,版本迭代也过于频繁,致使多个版本的代码交杂在一起,难以维护,无法保证其中某个版本的稳定性。当然,我们也用过很土的办法,代码复制一份出来,但是,这个副本也需要加上新开发的功能。

所以,我们决定使用svn分支管理。当然,这有代价,svn版本管理对二进制文件不友好,可能文件分支合并时二进制文件会难以处理。(这里说的二进制文件,泛指所有非文本文件,比如说美术资源,策划文档)
继续阅读svn分支管理的使用与经验