#3 楼 @blacktulip 经典游戏可以 wine, 新鲜游戏都有 mac 版
如果需要保序,就用 chunk
例如
["0.0", "0.1", "1.2", "1.3", "0.2"].chunk(&:to_i).map &:last
#=> [["0.0", "0.1"], ["1.2", "1.3"], ["0.2"]] 最后的 0.2 不合并到第一项中去
Linux 技术
Debian?
C++ 的坑之一是 calling convention.
calling convention 是类似于协议的东西,函数是怎么调用的,被调用方是怎么获取参数的,参数放在哪个寄存器,是顺序还是逆序推到栈上都有约定。编译器往往有扩展,可以用 __cdecl
, __fastcall
等方式去指定一个函数的 calling convention.
C 没有函数重载,C++ 有函数重载,所以 C++ 不能用 C 的 calling convention 而是自己另外弄了一套。这就造成两个东西一模一样但是编译出来的东西却不一样... 下面是一个最简单的 ruby ext, 如果保存为 .c
就可以,保存成 .cxx
或者 .cpp
就编译不过去
#include <ruby.h>
VALUE helloworld(VALUE self) {
printf("hello world\n");
return Qnil;
}
void Init_helloworld() {
rb_define_method(rb_cObject, "helloworld", helloworld, 0);
}
如果在 C++ 里,就要声明这个函数是 C call:
...
extern "C" VALUE helloworld(VALUE self) {
...
或者用一个宏转换类型:
rb_define_method(rb_cObject, "helloworld", RUBY_METHOD_FUNC(helloworld), 0);
坑之二是自动生成析构函数调用,例如
{
std::vector<int> vec; // 一个 vector 对象, 会动态分配内存的
...
// 这里会在编译期自动生成 vec 的析构函数调用, 把 vec 动态分配的内存释放掉
}
如果在中间插入了 ruby 方的调用,会出现一个跳出去的 long jump
{
std::vector<int> vec;
rb_eval_string("raise 'hello world'"); // 跳出去了, 下面的代码包括自动析构也不会执行了
...
}
所以要用 rb_protect 之类的包装起来
{
std::vector<int> vec;
int state;
rb_eval_string_protect("raise 'hello world'", &state);
if (state) ...
}
坑之三是异常,ruby 出现严重错误还会列出一个 segfault 的报告,报告中会包含当前的调用栈可以帮助排除问题。但如果在代码中扔一个 C++ 异常但忘记捕获
throw std::runtime_error("hello world");
程序就会报一个 "libc++ abi error" 退出,其它什么都不说了... 除非用 ulimit -c unlimited
再用 gdb / lldb 打开 image, 否则是看不到异常栈的...
坑之四是 std::iterator 等模板对象没法在 gdb / lldb 中查看,因为 C++ template 是编译期的,debugger 在运行时不能知道最终生成的是什么...
for (auto i = vec.begin(); i != vec.end(); i++) {
// 你可以在这里插入一个断点, 但你看不到 i 是什么, 也不能对 i 做运算...
}
但往往这些坑必须去踩... C 并没有标准的数据结构/容器可以用,而 C++ 的标准库有各种实现,经常不得不去用,要么就是自己造一套或者是用一些让你不太放心的 ...
什么语言的语法最复杂变态?不是 C++, 是 Objective-C++ ...
坑之五... 就是 Objective-C++ 各种诱惑你去用...
Objective-C
id a = @"hello world";
id b = 3; // :(
Objective-C++
auto a = @"hello world";
auto b = 3; // (:
环境变量问题也可以 /bin/bash -l -c "..."
单独的脚本 sh bang 可以这么写:
#! /bin/bash -l
就可以直接执行各种免疫环境问题了
因为 -l 参数可以载入 bashrc
pg 装不上么?要先装 postgresql 然后
ARCHFLAGS="-arch x86_64" gem install pg -v '0.15.1'
再 bundle 应该就好了,和 rails 兼容没关系...
type git
看看
#4 楼 @sforce100 不知道... 查下 rails logger 的 api? 另外难道是部署工具写了 /etc/logrotate.d/ ?
nginx 可以用 http://wiki.nginx.org/HttpSslModule#ssl_client_certificate 启用客户端证书,合作公司间系统 API 交互调用之类可以用
这里 markdown 有点奇怪,加空格才行... " hello world "
1.9.0 时候有过一个 RHG の逆襲 ...
http://www.hakkaku.net/articles/20080513-204 http://www.nicovideo.jp/mylist/6648730
#20 楼 @bhuztez wsgi 只用到了 tcp 的一小部分啊,我还是觉得这本书好,一会就能看完,而且内容选择很小心 (里面没提到的都比较坑... 我昨天跟着 unix 网络编程写了个 descriptor sharing 的服务器,总是几千个请求后出现 EBADF 被坑到现在,再后来查到在 OS X 上用 sendmsg 传送 fd 的 faq 然后觉得要判断各种平台不实用,放弃了...)
话说刚看完 working with tcp sockets, 除了没提一些 sendmsg / recvmsg / ioctl 这种平台差异较大的函数,内容也挺全面的,比 unix 网络编程的 tcp 部分速成多了...
加个保存 hook, 调用一下 ruby -c
就行...