blog
blog copied to clipboard
涵曦的博客
其实主要是演示如何编译出 `cjson.so` 文件,因为不能使用操作系统里的 lua 来编译,需要使用 skynet 配套的 `3rd/lua` 来编译。对于新手来说,可能无法理解或者处理这些版本差异带来的一系列报错,比如: ``` lua loader error : error loading module 'cjson' from file './luaclib/cjson.so': ./luaclib/cjson.so: undefined symbol: 1ua_newuserdata ``` ## 添加 lua-cjson 源码...
[wezterm](https://github.com/wez/wezterm) 是采用 Rust 实现和 Lua 配置的终端软件,我之前一段时间都是使用 Windows terminal ,发现 wezterm 是采用 Lua 配置的,很方便自定义功能。比如之前给 Windows terminal 提过的一个很小的需求,[像 vscode 一样自动读取 .ssh/config 文件的主机配置](https://github.com/microsoft/terminal/issues/9031) ,然而却却迟迟没有实现,Windows terminal 采用 JSON 配置的(如果是 JavaScript 的话还有可能),不能像 wezterm 一样使用 Lua...
搭建自己的音乐库
> 大家都知道现在音乐版权问题,想听几首歌还要下载各个音乐APP,所以就有下面这个办法。 1. 使用 [jellyfin ](https://jellyfin.org/) 搭建在线听歌平台 2. 使用 [AriaNg](https://github.com/hanxi/AriaNg) 音乐搜索插件下载音乐 jellyfin 和 AriaNg 都可以采用 Docker 安装。 其中 AriaNg 用到了 [QQMusicApi](https://jsososo.github.io/QQMusicApi/) 和 [MiguMusicApi](https://jsososo.github.io/MiguMusicApi/#/) 作为后台接口,可以自己搭建后台或者直接配置反向代理这两个 Api 的测试地址。 效果图  jellyfin 作为音乐播放器有一段时间了,用起来也不错,我的...
主要注意文件权限相关问题 ### 参考: 1. http://blog.itpub.net/30345407/viewspace-2711704/ 2. http://www.hechuangyi.com/install-sftp-server-on-centos7/ #### 1. 创建用户 sftpuser,并禁止ssh登录,不创建家目录 ```bash useradd -s /sbin/nologin -M sftpuser ``` #### 2. 设置用户密码 ```bash passwd sftpuser ``` #### 3. 创建sftp根目录。 ```bash mkdir...
本文主要演示如何给 skynet 设置一个自定义的日志服务,并添加一些额外的功能。 - 每天切割日志文件 - 扩展 kill -1 信号,支持安全关服,重新打开日志文件等 - 日志等级划分 ## 参考示例 首先参考示例 `examples/userlog.lua` ,使用 `skynet.register_protocol` 注册 `skynet.PTYPE_TEXT` 文本消息,用于输出日志。注册 `skynet.PTYPE_SYSTEM` 系统消息,用于接收系统信号。 ## 实现日志等级功能 代码位置 `lualib/log.lua` ,这里逻辑比较简单,就是根据配置的日志等级和接口对比,决定是否输出日志,分为 `debug`, `info`...
计划了好久想要写个入门教程的,今天才开始写。 ### 环境搭建(以ubuntu12.04lts 为例) * 执行下面命令: $ sudo apt-get install qt4-dev-tools qt4-doc qt4-qtconfig qt4-demos qt4-designer * 当代码中含有 #include <QSqlDatabase> 需要用到mysql数据库需要执行下面命令安装(自带sqlite驱动), $ sudo apt-get install libqt4-sql-mysql ### 来一个helloworld程序 * 建立工程目录:我的目录在/home/hanxi/tmp/ $...
### C++额外负担 C++在布局以及存取时间上主要的额外负担是由virtual引起,包括: * virtual function机制,用以支持一个有效率的执行期绑定(runtime binding) * virtual base class,用以实现多次出现在继承体系中的base class,有一个单一而被共享的实体 ### 3种对象模型 #### 简单对象模型 一个对象是一系列的slots,每一个slots指向一个members,members按其声明次序,各被指定一个slot。每个成员数据或成员函数都有自己的一个slot。 该观念用在C++的指向成员的指针(point-to-member)观念之中。 #### 表格驱动对象模型 对象本身内含一个指向data member table 的指针和一个指向member function table的指针,member function table 是一系列的slots,每一个slot指向一个member function;...
### 默认构造函数 默认构造函数在编译器需要的时候被编译器产生出来。 编译器会自动生成的四种有用的默认构造函数: #### 带有default constructor 的member class object(组合结构) 如果一个类没有任何构造函数,而它含有一个对象成员,且该成员有默认构造函数,那么编译器需要为该类合成一个默认构造函数,不过合成操作只在构造函数真正需要被调用的时候才会发生。 被合成的默认构造函数只满足编译器的需要,而不是程序的需要。如: class Foo {public: Foo(), Foo(int) ...}; class Bar {public: Foo foo; char* str;} // 组合 void foo_bar() {...
### 目录结构 编译出来为我所需的文件,以及代码文件 ├── bin │ ├── test │ └── test.lua ├── build ├── CMakeLists.txt ├── lua │ ├── include │ │ ├── lauxlib.h │ │ ├── lua.h │ │ ...
上星期跟同事讨论到现在的游戏框架的网络协议处理模块是只支持单消息单处理函数的.就是接受到一个协议只会进入一个处理函数.这对于服务端来说挺正常的.实现也是很简便的,只需要绑定协议Id和handler函数即可.可客户端就没有这么简单了.可能客户端收到一个消息后需要执行多个模块的处理.而各个模块又可能不是同一个人做的.所以就出现了经常需要在一个模块的处理函数中调用另一个模块的某些处理函数.比如我添加了一个新的功能,然后实现了之后需要告诉之前某些实现的人调用一下我的函数.这样就造成遗漏的情况和增加工作负担. 实现单消息多处理函数后,我只需要知道需要添加一个处理函数,自己实现完后注册一下而不需要通知其他同事来调用我的接口.如果涉及到优先执行关系只需在注册的时候写好就行了. https://gist.github.com/hanxi/6338589