安装 Gentoo

最近组了一台电脑想用做 nas,配置为

  • 奔腾G2100T
  • 华擎 B75M-ITX 主板
  • DDR3 1600 2G 内存
  • 先马 230W 电源
  • 一块 64G SSD 加上另外三块从笔记本上拆下来的硬盘。

原本 CPU 想用赛扬的,但是看中的一块淘宝上缺货了,所以用奔腾G2100T替代。所有都装好后进 BIOS 对 CPU 降低电压,稳定在 0.8V。装好 Gentoo 后,开机差不多在 37W 左右,编译的时候 45W 左右。虽然,对于当 nas 来用,37W 还是有点高的,但是,平时还可以在上面做其他的事,那么还是可以接受的。

第一次用 Gentoo,根据 Gentoo 手册 http://www.gentoo.org/doc/en/handbook/handbook-amd64.xml?full=1 一步一步安装的,下面是安装过程中遇到的一些问题。

vim 快捷键映射和模式

以前在 vim 中映射快捷键时,不是网上看被人怎么写然后拷贝回来,要么直接用 ‘map’ 来映射,根本搞不懂 ‘map’, ‘noremap’, ‘nmap’, ‘vmap’ … 之间的区别到底是什么。

今天,上网 Google 了下,不过先要从 vim 的几种模式说起。

vim 中有六种基本模式:

  1. 普通模式 (Normal-mode)

    一般,启动编辑器之后就处于普通模式,除非你设置了 ‘insertmode’。也称为命令 (command) 模式。

  2. 可视模式 (Visual-mode)

    可视模式与普通模式相似,只是光标移动会扩展高亮的区域。而其它非移动命令会作用于高亮的区域。在普通模式下,可以通过 v 或 V 或 CTRL-V 进入。如果没有关闭 ‘showmode’ 选项,窗口底部会出现 “—VISUAL—“ 字样。

  3. 选择模式 (Select-mode)

    选择模式与 Windows 下其它编辑器的选择模式很像。选中字符后,键入一个可显示字符会删掉所有被选择的字符,并进入插入模式。一般,可以在普通模式下按 gh 进入,或在 gvim 中用鼠标拖选区域。窗口底部会出现 “—SELECT—“ 字样。

  4. 插入模式 (Insert-mode)

    插入模式下你键入的内容会插入到缓冲区。一般,在普通模式下按 i 或 a 进入插入模式。窗口底部会出现 “—INSERT—“ 字样。

  5. 命令行模式 (Cmdline-mode)

    命令行模式可以在窗口底部输入一行命令。可以用 “:” 执行命令,用 “?” 和 “/“ 来查找。

  6. Ex 模式 (Ex-mode)

    与命令行模式类似,只是执行完一条命令后,会继续停留在 Ex 模式。在普通模式下,按 Q 进入 Ex 模式。

Nodejs Addons

有时候仅仅用 javascript 并不能够实现我们想要的功能,比如说我最近买了一块 nokia 5110 的显示屏,想连在我的树莓派上显示一些有用的信息。而这块显示屏是 spi 接口的,树莓派上也是有 SPI 接口。但是我要对 SPI 接口写入信息传到显示屏上,就必须要用 c++ 来写,不是很方便。所以我就想写一个 nodejs 的 addon,最后可以实现 javascript 来与 SPI 总线进行通信。

所以,就要学习如何写一个 nodejs 的 addon,这篇文章完全参考 http://nodejs.org/api/addons.html

下面所有例子的代码可以从 https://github.com/rvagg/node-addon-examples 下载到。

Hello world

我们要写一个简单的模块,这个模块的 javascript 代码实现如下,目标是把他转换为 c++ 实现的 Addon。

1
exports.hello = function () { return 'world'; };

首先创建 hello.cc,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <node.h>
#include <v8.h>

using namespace v8;

/**
 * "Method" 的名字可以任取,可以换成 "Hello"
 * 来对应 exports 的名称
 */
Handle<Value> Method(const Arguments& args) {
  HandleScope scope;
  return scope.Close(String::New("world"));
}

void Init(Handle<Object> exports) {
  exports->Set(String::NewSymbol("hello"),
    FunctionTemplate::New(Method)->GetFunction());
}

NODE_MODULE(hello, Init)

所有的 Node addons 必须输出一个初始化函数:

1
2
void Initialize(Handle<Object> exports);
NODE_MODULE(module_name, Initialize)

openwrt 把包装到u盘上

买了个可以刷 openwrt 的路由器,但是路由器始终是路由器。ROM 大小只有 16M,想装个 python 包到上面显然有些不现实。不过也是有办法把包装到u盘上的,当然前提是路由器上有个 usb 口。

  • u盘查到路由器上,然后挂载u盘。

  • 在u盘上创建文件夹,用于安装包

1
mkdir /mnt/sdb1/packages
  • 创建 /opt 软连接
1
ln -s /mnt/sdb1/packages /opt

pep 8

简介

这篇是讲关于 python 代码风格的一些约定,主要用于 python 中标准库的代码风格的约定。关于 pep 8 这份文档网上也有很多翻译,但是为了自己便于记忆,大致的翻译记录一下。所以,对照原文可能是不完整的。

A Foolish Consistency is the Hobgoblin of Little Minds

总之一句话,就是保持代码的一致性。

代码排版

缩进

  • 每级缩进使用 4 个空格。

  • 如果和旧代码不一致,还是改为与旧代码相同的缩减方式。