第一次在Github上合并Pull Request

我用Github也差不多两年了吧,大多上传一些自己无聊的代码而已。今天打开Github发现有个老外居然向我提交代码,没错是full_text_rss仓库-_-!!!。

full_text_rss最初是因为用Google Reader读到的RSS很多都没有全文输出,所以自己就在当时的VPS做了一个(详细见这里),后来忘了啥原因就把网站关了,把代码丢到Github上就没管了,到今天合并代码才想起来,让我这些老代码又焕发活力了:)。Github用到现在为止感觉不错,以后也要多多提交代码咯。

工作中发现的交流问题(X-Y Problem)

我很早就读过酷壳的这篇文章X-Y Problem,在工作中同事时常犯这种问题-_-!!!。

虽然我自己也不擅长沟通,但我在沟通时还是有意识的说的全面点,如果还不行的话就画图呗,一图胜千言啊。有时候说清楚一件事情是很难的。

按酷壳博主的意思X-Y问题如下:

1) 有人想解决问题X

2) 他觉得Y可能是解决X问题的方法

3)但是他不知道Y应该怎么做

4)于是他去问别人Y应该怎么做?

我遇到的X-Y Problem都是同事试图向我沟通不是他们专业的问题,在这种情况下人很容易的按自己的理解提出问题,但其实如果没有扎实的基础知识和经验,问题的假设前提往往是错的,更何况问题本来就很复杂,可能更本就没了解清楚问题。

说了这么多,举个典型例子吧:

某天同事A打电话来问我一个工作问题:

同事A:xxx设备如果能xxx相比xxx能不能提高速度?

…然后是一大堆解释和讨论…

然后我精疲力竭的弱弱问了一句:你为什么想这么搞,现在xxx设备速度还可以嘛,没必要搞啊?

然后同事A惊讶的喊:xxx设备不是很慢很慢吗,xxx指标都xxx了。

然后我-_-!!!说:xxx设备本来就没这个问题啊,你瞎想了…

然后就没然后了-_-!!!

如果事前能先说明一下原因,也不至于费这么多口舌和我的脑细胞啊,不说了,总之在说明问题前先说清楚自己的思路,你为什么这么想的理由,这样人家才能帮你吧。

修复RG100A的按键

我买RG100A路由器很久了,刷了OpenWRT后作为公司工作的主力路由器至今。因为我平时要调试很多不同网段的设备,全靠了OpenWRT的VLAN功能从而轻松解决。为了消除记忆IP地址麻烦就使用了mDNS,为了能把mDNS广播到各个子网,专门在OpenWRT上跑了个程序进行监听和转发mDNS(不过后来发现太占资源就去掉了,最主要是设备不多,Windows安装mDNS一直有问题,剩下的只有Ubuntu笔记本和虚拟机上跑的Ubuntu了)。但我一直不太满意的是RG100A后面的按键,三个按键(WPS、Wifi、Reset)OpenWRT不知为何不支持。最近几天闲来无事就想彻底解决这个问题。

首先就是找问题的根源了,这个除了看代码外别无他途了。从OpenWRT官网下载代码,我装的是老版的Backfire 10.03,内核是linux-2.6.32.27(之前试过编译最新的版本,但一烧进去要么网络有问题,要么就直接崩溃-_-!!!),编译了大半天,主要是下载各种软件包,幸亏网络给力(电信宽带马上要升到12M了:))。

接下来是找相关的驱动代码,这里主要是三个驱动:input_gpio_button、input_polldev、button-hotplug。

  1. input_gpio_button负责低层读取按键的GPIO口状态转换成input event(我这里把把Wifi键映射成BTN_0, WPS键映射成BTN_1,没用Reset键)。这个代码在build_dir/linux-brcm63xx/linux-2.6.32.27/drivers/input/misc/gpio_buttons.c上。

  2. input_polldev是input system的input_dev,因为这三个按键的GPIO都不支持中断,所以只能采取轮询方式,这个input_polldev就是干这个事的。它不断通过input_gpio_button查询GPIO状态,然后发送input event。源码在build_dir/linux-brcm63xx/linux-2.6.32.27/drivers/input/input-polldev.c。

  3. button-hotplug是面向应用层接口的,把input_event转换成hotplug消息。这个主要是内核的hotplug机制(通过内核netlink技术广播对象消息,从而支持热插拔之类的)。OpenWRT用的是hotplug2,具体配置在/etc/hotplug.d下。如果要在应用层处理按键事件,就新建/etc/hotplug.d/button目录,写个测试脚本,用按键点亮前面板的WPS LED灯,参考这里。源码在build_dir/linux-brcm63xx/button-hotplug/button-hotplug.c。

    #!/bin/sh
    LED_NUM=24
    [ -e "/sys/class/gpio/gpio${LED_NUM}/value" ] || echo $LED_NUM > /sys/class/gpio/export
    [ -e "/sys/class/gpio/gpio${LED_NUM}/direction" ] && echo out > /sys/class/gpio/gpio${LED_NUM}/direction
    
    turn_on()
    {
        echo 0 > /sys/class/gpio/gpio${LED_NUM}/value
    }
    
    turn_off()
    {
        echo 1 > /sys/class/gpio/gpio${LED_NUM}/value
    }
    
    if [ "$ACTION" = "pressed" ]; then
        turn_on
    else
        turn_off
    fi
    

而出问题的驱动是input_gpio_button,它依赖平台board的GPIO按键配置,而我调试后发现board初始化给的button GPIO参数不对。这样要么改board初始化代码,要么在input_gpio_button 代码里手动指定GPIO参数。我不想重新编译整个内核,所以选择后者,下面是补丁:

--- ../linux-brcm63xx/linux-2.6.32.27/drivers/input/misc/gpio_buttons.c 2014-02-27 16:58:19.502642430 +0800
+++ gpio_buttons.c  2014-03-06 11:05:50.939708245 +0800
@@ -29,6 +29,31 @@

 #define DRV_NAME   "gpio-buttons"

+static struct gpio_button my_all_buttons[] = {
+        {
+            .gpio = 34,
+            .active_low = 1,
+            .desc = "wifi",
+            .type = EV_KEY,
+            .code = BTN_0,
+            .threshold = 3,
+        },
+        {
+            .gpio = 37,
+            .active_low = 1,
+            .desc = "wps",
+            .type = EV_KEY,
+            .code = BTN_1,
+            .threshold = 3,
+        },
+};
+
+static struct gpio_buttons_platform_data my_buttons_datas = {
+    .buttons = my_all_buttons,
+    .nbuttons = 2,
+    .poll_interval = 100,
+};
+
 struct gpio_button_data {
    int last_state;
    int count;
@@ -55,6 +80,9 @@
    if (state != bdata->last_state) {
        unsigned int type = button->type ?: EV_KEY;

+        // I add
+        printk(KERN_DEBUG "type %d, code %d, active %d", type, button->code, state ^ button->active_low);
+
        input_event(input, type, button->code,
                !!(state ^ button->active_low));
        input_sync(input);
@@ -84,7 +112,8 @@

 static int __devinit gpio_buttons_probe(struct platform_device *pdev)
 {
-   struct gpio_buttons_platform_data *pdata = pdev->dev.platform_data;
+   //struct gpio_buttons_platform_data *pdata = pdev->dev.platform_data;
+   struct gpio_buttons_platform_data *pdata = &my_buttons_datas;
    struct device *dev = &pdev->dev;
    struct gpio_buttons_dev *bdev;
    struct input_polled_dev *poll_dev;
@@ -95,6 +124,15 @@
    if (!pdata)
        return -ENXIO;

+    // I add
+    printk(KERN_DEBUG "platform_data buttons: %d poll_interval: %d ", pdata->nbuttons, pdata->poll_interval);
+   for (i = 0; i < pdata->nbuttons; i++) {
+        printk(KERN_DEBUG "button gpio %d %s type:%d code:%d", pdata->buttons[i].gpio, pdata->buttons[i].desc, 
+                                                               pdata->buttons[i].type, pdata->buttons[i].code);
+    }
+
+    printk(KERN_DEBUG "platform_device name %s", pdev->name);
+
    bdev = kzalloc(sizeof(struct gpio_buttons_dev) +
               pdata->nbuttons * sizeof(struct gpio_button_data),
               GFP_KERNEL);
@@ -189,7 +227,8 @@
 static int __devexit gpio_buttons_remove(struct platform_device *pdev)
 {
    struct gpio_buttons_dev *bdev = platform_get_drvdata(pdev);
-   struct gpio_buttons_platform_data *pdata = bdev->pdata;
+   //struct gpio_buttons_platform_data *pdata = bdev->pdata;
+   struct gpio_buttons_platform_data *pdata = &my_buttons_datas;
    int i;

input_unregister_polled_device(bdev->poll_dev);

中间加了些调试信息,主要是那个gpio_buttons_platform_data my_buttons_datas,默认是platform_device *pdev指定的。这个在board init里指定,有兴趣的可以看看arch/mips/bcm63xx/board_bcm963xx.c,里面有很多板子,RG100A对应的板子是96358VW2,这个可以通过命令行dmesg | grep board看出来。

有关RG100A的GPIO参数,网上有公布,我只摘抄一些:

button gpio:
    gpio34 wifi
    gpio36 reset
    gpio37 wps

led gpio:
    gpio0 usb
    gpio4 power
    gpio8 net
    gpio22 dsl
    gpio24 wps

这样修改好后,载入驱动就可以通过按键控制RG100A前面板WPS灯了,不过暂时还想不出来可以用来干什么。我现在用RG100A的USB口可以驱动摄像头了,就搞了个远程拍照的东西,还不错,就是不太稳定-_-!!!。下一步细看linux的 input system,之前大概看了一些,了解了些原理,理解有误也说不定。要写的太多了写不过来了,就写这些吧。

春节过年中

越来越就得过年好无聊,各种烦恼不开心:(

Eric Carmen 的 All by Myself

When I was young
I never needed anyone
And makin' love was just for fun
Those days are gone

Livin' alone
I think of all the friends I've known
But when I dial the telephone
Nobody's home

All by myself
Don't wanna be, all by myself anymore
All by myself
Don't wanna live, all by myself anymore

Hard to be sure
Some times I feel so insecure
And love so distant and obscure
Remains the cure

gnu make有关建立目录

最近写代码想Makefile同时支持交叉编译器和主机编译器,所以要把不同编译器生成的目标文件放到不同的目录中。首先想到的是目录里要保留原来的源文件目录结构,这样就可以用隐式规则或静态规则推导出源文件,否则根本无法得到依赖关系。最后用了
隐式规则扣出源文件路径才勉强可用,照这个思路花了点时间写了个测试例子,准备把现有需要交叉编译的程序都转到这种模式:

ifdef HOST
    objdir:=obj_$(word 1, $(subst -, ,$(HOST)))
else
    objdir:=obj
endif

SRC_DIR:=. src
CFILES:=$(shell find $(SRC_DIR) -maxdepth 1 -name "*.c")
OBJS:=$(addprefix $(objdir)/,$(CFILES:%.c=%.o))
OBJDIRS:=$(addprefix $(objdir)/, $(SRC_DIR))
TARGET=main

all:$(OBJDIRS) $(TARGET)

$(TARGET):$(OBJS)
    gcc -o $@ $(OBJS)

$(objdir)/%.o:%.c
    gcc -c $< -o $@

$(OBJDIRS):
    @mkdir -p $@

clean:
    -rm -r -f $(objdir) $(TARGET)

.PHONY: clean all

还有就是查资料时发现了这个东东(order-only prerequisites),可惜没法用在我这里,因为用隐式规则我没法弄出目录依赖-_-!!!,下一步是把所有*.d文件也搞进目录中去。


gnu make的两种依赖关系(Prerequisites):

  1. 正常依赖(normal prerequisites)

    1)检查和重建依赖

    2)如果依赖更新,则要重建目标

  2. 顺序依赖(order-only prerequisites)

    1)检查和重建依赖

顺序依赖不会影响最终的目标的重建,这个适合与在makefile里建目录,因为目录作为目标有一个特性是目录里的文件改了,目录就更新了,导致一系列不必要的重建,用顺序依赖方式的话,就不回影响最终的目标了

Gnu make手册上给了个例子:

 OBJDIR := objdir
 OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o)

 $(OBJDIR)/%.o : %.c
         $(COMPILE.c) $(OUTPUT_OPTION) $<

 all: $(OBJS)

 $(OBJS): | $(OBJDIR)

 $(OBJDIR):
         mkdir $(OBJDIR)

http://www.gnu.org/software/make/manual/html_node/Prerequisite-Types.html http://cm.techwell.com/articles/weekly/making-directories-gnu-make

虾米播放器程序失效

之前写的一个虾米播放器最近一段时间无法运行,每次运行显示Stream not seekable!直接挂断。查看了URL,发现虾米升级了服务器导致的。

因为mplayer依赖HTTP协议的accept-range头,如果服务器没设置就报错退出,我抓包分析了虾米服务器的HTTP应答,没发现accept-range,应该是这个原因。这边还有人说是mplayer的一个bug,因为不是所有服务器都严格遵守的,应该给服务器个机会嘛:)。

如果是这样的话就没法用mplayer了,得想其他办法了,初步只能用wget拖回整个专辑,然后慢慢放了-_-!!!,不过幸好mms电台不受影响,可以用mplayer放。

翻译Dewey的最后一篇游记

前篇说道Dewey的最后一篇游记追到了xiujuan,那我就试试翻译一下,说不定很有趣:),英语水平很烂,各位少安毋躁。

下文翻译自David Dewey Stories of my travels through China and the adventures I had along the way的最后一篇,[Xiujuan] Finally getting the Girl

BTW: Xiujuan我不知道真实姓名,暂时写作秀娟吧。

沙子作为礼物

到了晚上我去秀娟的宿舍去看她,但很难说服她下来见我。 我发短信告诉她我有些东西给她,但不管怎么样她说不想要。

最终过了一小时她下来了。我原以为她会怪我让她下楼来见我,但她最终跳着走到我身边并对我笑脸相迎。她说她并不知道我在这里等她,管她呢,我咳嗽着跟她讲话,并给她我从内蒙古沙漠里收集的沙子。她确实被我意想不到的礼物和我收集沙子的经历感动了。然后,她帮她的室友买了些冰淇淋就回宿舍了,但她说可以在第二天早上9点来看我,并要我帮她指导英语功课。

那天晚上我的朋友Alex从西雅图打电话给我,我和他聊了很长时间。星期天早上,我到秀娟的宿舍去接她,但我手机坏了,好像是与Alex打电话把我的手机话费用完了。所以我用宿舍楼的电话打电话给秀娟,希望他不要对直接打电话给她感到生气,因为在中国手机话费很贵,但短信费则便宜很多。

秀娟下来了,我试图用英语跟她说话,我认为应该这样,因为我今天本来应该教她英语的嘛。我试图降低语速并尽量用简单语句,但她还是无法理解我说的话并拒绝同我说英语,最后我放弃了尝试。晓娟已经学习英语9年了,但她的英语会话能力少的可怜,她英语几乎只学了读和写。

我们去教室学习,但我们不能说话,因为周围都是同样学习的学生。我建议我们去外面学习,但她不想去。她平时很喜欢去外面学习,而且今天天气很好,可能她担心去外面我的感冒会加重。我只能建议去我住的旅馆学习。

一旦到了旅馆,我们就用功的学习英语。她想通过一个高年级英语考试(译著:senior-year应该是四级英语吧),可是学习用的文章对她而言太难了,里面夹杂着许多生词和许多她不懂的复杂语法。因为她不理解所有这些语法和单词所以就更无法理解这些文章了,也就意味着她无法正确的回答这些多选题。

此外,所有晓娟要学的文章都是从西方的资料上摘抄下来的,都关于英美文化、地理、政府、政治等等。就算晓娟的英文能力再好,她也可能不能理解这些文章,因为她不熟悉这些西方的东西。比如,她不懂基督信仰、盎司、呼气测试、福利,这些都在那些文章里有所涉及。雪上加霜的是她的英文水平远远不够,理解那些文章对她来说是个噩梦。我关心的是她确实需要帮助,我会尽我所能一点一点的帮她理解每篇文章的背景。幸运的是秀娟是个超级聪明的女孩,她学的很快。我确信她如果在美国待几个月就能学会说流利的英语。

手机卡

那天晚上我试着充值手机卡,但不成功。这涉及到一些复杂的因素:我有一个非本地手机号码并且欠费了,但为了拨通手机卡充值号码,我必须手机上有卡 ,因为要漫游。我被告知必须用本机打充值电话,所以我被困住了。我买了个新的北京号码和手机卡。

我花了很长时间写下我的手机里的号码并放到新的卡上。我发现我买的新卡有点烂,一旦涉及到卡的flash读写将会死机。我怀疑手机店里的人利用了我作为一个无知的老外这点卖给我不想要的烂卡。应该有其他方法充值不是本地的手机卡,或许他们不想告诉我。我没时间想这些,我一门心思都在想秀娟。

现在我的手机又好了,我发了个短信给秀娟。我跟她说我病的很厉害(这些都是真的which is all too true),并告诉她应该来看我照顾我。第二早上(星期一早上)她带着给我的一包食物来看我,还带了些感冒药。接下来我们在我的旅馆房间了学习英语,最终耗费了几个小时的时间。

接下来她就到Minqi家教中文去了。她回来后我发短信给她,但她说今天晚上太晚了,不能去看我了。

月亮和火星

星期二我再次跟她一起学英语,她晚上必须去Minqi的朋友那里教中文。晚上的晚些时候,我就去了她的宿舍找她,但碰到了她的室友,她说她认识我,我却不认识她。当你是广大中国人中唯一的外国白人时,我猜很容易被记住。她说秀娟可能不在,但她上楼去看了看,不久秀娟就高兴的下来了。我带她回我的旅馆,我们拥抱并亲吻了一会儿,但秀娟不习惯跟一个男人躺在床上,所以睡不着。旅馆的房间有两张床,所以我就让她睡在旁边那张床上了。

星期三晚上秀娟发短信给我,让我去外面看月亮和火星,因为在一万年中两者之间的距离在今天是最近的。我正在睡觉,但还是起来到外面去看。她又发短信过来,问我看到月亮是否想家。我说没有,只是让我想你了。接下来她第三次发短信过来, 问我,是什么事情使我这么爱他。我误解了,以为她怀疑我对她的爱,就像她一贯如此的那样。所以我回了条短信,告诉她算了睡觉吧。令我惊奇的是,显然这使她感到不快,或许这是个好兆头。她一定是开始喜欢我了,否则她是不好这么在乎我的。

中秋节

9月11号星期四是中秋节,那晚我去了秀娟那里,我们去了外面,坐在草地上欣赏月亮,这是原本中秋节该干的事情。我们拥抱在一起谈了好一阵子话。接下来我肚子就饿了,我们去了通宵营业的小店买了些小吃。我明白今天没月饼可吃了,这原本应该中秋节吃的,但我们就是找不到月饼,月饼全都买完了。最终,过了午夜,吃月饼已经太迟了,我们回了旅馆,秀娟跟我待了一晚上。这次我们一起睡在一张床上。

第二天我们见面继续学英语,但她不想学,而且她给我带了个月饼。她在读一本她最喜欢的中国小说家的传记,里面包含了许多那个小说家写给他妻子的情书,秀娟一边看书,一边说我永远不会给她写这些情书,因为我的中文水平不够。我没法反驳她。她想回她的宿舍,并想跟我永远的分别。

当我们回到她宿舍时,我情不自禁的抱着她哭了。我猜她也对我感到难过,所以又跟我回到了旅馆房间,而不是回宿舍。但她马上要和她的朋友去听音乐会,所以我又陪她回宿舍,在那里她再次说她不属于我。我又哭了起来并跟她道别。我感到很糟糕,我意识到我必须尽量用英语跟她沟通,她可能感到她在跟一个三岁小孩约会,因为我的中文就那个水平,而且我一直都用中文跟她说话。

忘记钥匙

当我回到旅馆时,欣喜的发现秀娟忘记钥匙了。这给了我完美的再约她见面的机会。所以我用英文发了条关于钥匙的短信给她,并且用了些难懂的词汇,这样确保她无法理解。我认为这样就可以反驳她抱怨我的烂中文了。那天深夜我去她的宿舍找她,我发现她还没从音乐会回来,但很快她出现了。我告诉她我给她带来了她的钥匙。她跟她的朋友说了再见,所以我让她坐自行车后面带她转了一圈。我们坐在长凳上谈了很多事情,我告诉她所有我爱他的理由,并恳求她做我的女朋友,但这都是徒劳。

最终我们回到了旅馆房间,她又跟我度过了一个晚上。由于我的疏忽,我没把窗户关牢,房间里满是蚊子。我把蚊帐覆盖在我们身上,但我愚蠢的在黑暗中盖了一下,但蚊子早就钻进了蚊帐,早上醒来,它们都吸饱了我们的血。

给男孩的信

接下来的晚上,我给秀娟买了朵玫瑰,去她宿舍找她。可是她宿舍那里有大群人,有些男生在给所有女生唱歌。秀娟拒绝下楼见我,我发了很多不同的短信给她,并固执的等了她三个小时。最终一些女孩在阳台上跟我说话,并扔给我个折成纸飞机的信,信是用荧光笔写的,而且用的是英文:

嗨, 小子:

中国女孩可不吃这套的,你今晚最好回去睡觉了。

事实上这幢楼内的所有女孩对你所做的都很感动,但是继续待在这儿确实不是个好办法,听懂了吗?

或许你可以慢慢来,给她些时间来接受你。

祝你好运 : )

这封信写的很好, 但这不适用与秀娟。我了解她,我知道如果我做了些貌似很傻的事,比如说整晚站在外面等她下来,她会很感动的。我知道她爱我,但她在试探我,确信我是否忠于她。

我对晓娟让我在外面整整等了3个小时感到恼火,所以我回去了。她答应第二天带我去吃早餐,并跟我一起学习英语。我发了条短信给她,她第二天早上开手机时应该会看到,在这条短信中我说她辜负了我的心,我决定忘了她。

最后一天

第二天早上,她早早的用短信叫醒了我,她对我前天晚上发的短信感到生气。我道了歉,我们在吃早餐时见了面。那束玫瑰现在看起来有点破败不堪了,但我不管怎么样还是给了她。她并不想要,但我坚持着让她拿着,她被感动到了。我告诉了她等她3小时的事情,她原本希望我会生气,但我告诉她我爱她以至于能原谅她所有事情。那确实是真的,我太爱她了,以至于见到她的瞬间我就忘了所有她对我的伤害。我了解秀娟,她喜欢听这些话,确实是这样的。这天接下来的时间里她对我难以置信的好,她用双手牵着我的手去逛街。在我在中国的最后24小时里,她紧紧的跟着我。

我那天晚上只睡了一个小时,因为必须起来打包准备我的行李。我们临晨4点离开旅馆直奔机场,到机场时发现太早了,她在大庭广众之下毫无羞涩的吻了我,这至少在北京很少见。不幸的是她还没答应做我女朋友,但我一旦回美国就会打电话或者写信、email给她做她的思想工作。

我进入检票区后,秀娟在后面很远的站着看我。她给我的手机发了些温暖的短信,接下来我就登机了,我对我们的未来很有希望。

回到美国

飞机轻松的到了东京,我坐在一个靠窗的位置,那里可以看到所有下面的小船和很多漂亮的云,韩国的大城市,日本的工厂、公园、高尔夫球场、高速公路、房子。在从东京飞西雅图的航班上我座位不靠窗,但飞机靠门的方向上有个座位没人,因为那个人在飞机起飞前没有出现。这恰好是个很好的座位,远离747巨大的机翼。因此,在坐之前我问航班服务员是否可以坐那里,她同意了。我很高兴找了个靠窗的位子。一旦飞过了太平洋,在西雅图着陆之前,我飞过了San Juan Islands, Dungeness spit, Sequim, Port Townsend和华盛顿大学,我看得很清楚。

回美国三个月后,我最终说服了晓娟当我的女朋友。再一个月后我的学习申请被北京师范大学接受,我将在2004年2月2号回北京。

2004年10月更新: 我现在生活在中国浙江省杭州市,晓娟现在已经是杭州这里的高中中文老师了,而且我和我的好朋友开了个公司,ChinaForge.com有限公司。感谢ChinaForge赞助这个网站,谢谢晓娟,作为这个世界上最特别的女孩,也是最好的中文老师。

读老外游记意外收获

我对老外之类游中国之类的游记很有兴趣,在龙腾网上发现这么一篇游记杜大威游中国,看起来Dewey还是比较单纯的人。到了第二篇游记,Dewey已经显示显露出对xiujuan的暗恋了-_-!!!。读到最后,对他和xiujuan的旅游我到不太关心了,我最关心的是他俩以后的事情,毕竟这个游记大概写于2003年(根据这里判断),xiujuan好像还是大二或大三的学生。

OK,按奈不住好奇心寻到了Dewey的游记博客,总共15篇游记,龙腾上只翻译了两篇,所有的游记英文在这里。Dewey与xiujuan分开后独自旅游了很多地方,这些我暂时没工夫看,最最关键的是最后一篇[Xiujuan] Finally getting the Girl。看来Dewey最终抱得美人归了:),有空我试试翻译这篇,我看的很有意思,有点感动。

Dewey的游记博客有点旧了,无意中有找到了比较新的日常博客,从中我知道Dewey在杭州与朋友合伙创业开公司(好熟悉啊),好像是做模具外包的,xiujuan也来到了杭州做了老师。2006年他俩结婚了,这中间有很多波折,你可以自己去看那些博文。我想现在结婚压力都这么大,何况是老外呢,文化差异、工作、手续问题,特别是xiujuan父母有点反对(他们想至少也的嫁个有房有车的小伙吧-_-!!!),但最后他俩熬过来了,皆大欢喜,end story :)。

BTW: Dewey是美国西雅图人,xiujuan是湖州人,他俩的照片去Dewey博客里找吧:),我是不是太八卦了啊-_-!!!。

令人困惑的单位:kB和KiB

ubuntu 12.04目前ls -l 默认是1024为单位的KiB、MiB和GiB(显示K、M、G):

SIZE may be (or may be an integer optionally followed by) one of fol‐lowing: KB 1000, K 1024, MB 10001000, M 10241024, and so on for G, T, P, E, Z, Y.

而且有个选项–si可以显示以1000为单位的,-s显示文件占的块数(4KiB)。

但是我亲自试了一下,发现ls显示大小的小数部分貌似不是正常的四舍五入。--!!! 终于发现规律了,不是四舍五入,而是精确到位数后再加一,把剩下的小数进一,确保不小于原来大小(可以大,但不能小--!!!)。

例如:

$ls -l
-rw-rw-r--  1 xx xx  604066417  xx xx xx OpenWrt-xxx
$ll
-rw-rw-r--  1 xx xx  577M  xx xx xx OpenWrt-xxx

所以直接就进位了:

604066417 byte = 576.0826272964478 MiB = 577MiB

听说ubuntu 13.04要调整成1000为单位的KB、MB、GB。

http://forum.ubuntu.org.cn/viewtopic.php?f=49&t=401481

http://askubuntu.com/questions/465/is-it-true-that-ubuntu-will-no-longer-measure-file-size-unit-as-byte-megabyte

https://wiki.ubuntu.com/UnitsPolicy

http://en.wikipedia.org/wiki/Mebibyte