Category Archives: H_工作

迁移博客到Raspberry Pi上

之前博客host在amazon的服务器上,每个月15~16刀的支出着实不小。

现在有了Raspberry Pi了,基本上24小时开机,可以当一个小server用,所以想着把博客迁移到Pi上,反正访问量不大,肯定能承受得住。

Apache有点大,想想还是用nginx来跑wordpress吧。google一下,找到这篇文章:http://www.cnx-software.com/2012/08/03/wordpress-for-raspberry-pi-using-nginx-and-mysql/
基本上把在Pi上安装http server和部署wordpress的要点写清楚了。

不过我要的不是一个新的wordpress,而是迁移原来的博客,所以也在这里记录一下。因为是事后记录,可能有遗漏或者错误,仅供参考。

1. 安装nginx, php,mysql等

sudo apt-get update
sudo apt-get install nginx php5-fpm php5-cli php5-curl php5-gd php5-mcrypt php5-mysql php5-cgi mysql-server

2. 参考上面的link,把nginx和php的配置文件配好,因为我还要用https(防GFW),所以相比那篇文章里的配置,多了ssl的配置

# Upstream to abstract backend connection(s) for php
upstream php {
server unix:/var/run/php5-fpm.sock;
}
server {
## Your only path reference.
root /srv/www/wordpress;
listen          80;
listen          443 default_server ssl;
## Your website name goes here. Change to domain.ltd in VPS
server_name     mine260309.me;

ssl_certificate     /home/pi/cacert/mine260309.me.StartCom.cert;
ssl_certificate_key /home/pi/cacert/mine260309.me.key.pem;
ssl_protocols       SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers         HIGH:!aNULL:!MD5;
access_log      /srv/www/wordpress/logs/access.log;
error_log       /srv/www/wordpress/logs/error.log;

## This should be in your http block and if it is, it's not needed here.
index index.php;

location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location / {
# This is cool because no php is touched for static content
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
#NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
include fastcgi_params;
fastcgi_intercept_errors on;
fastcgi_pass php;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
}

记得创建对应的文件夹,否则nginx会访问失败:

sudo mkdir -p /srv/www/wordpress/
sudo mkdir -p /srv/www/wordpress/logs

3. 把备份的文件拷过来,恢复wordpress文件夹和数据库。

3.1 我的备份是这样的一个脚本,crontab每周跑一次,备份过的文件会自动被dropbox同步。(注意用户名和密码是自己设的mysql的用户名、密码)

#!/bin/sh
# Back my web with clear password!
mysqldump --add-drop-table -h localhost -u  --password= minewpdb | bzip2 -c > ~/Dropbox/MyWebs/blog.bak.sql.bz2
tar -czf ~/Dropbox/MyWebs/blog.bak.html.tar.gz /var/www/html

3.2 恢复的过程是:
a) 恢复mysql数据库

$ mysql -u root -p
mysql> CREATE DATABASE minewpdb;  #创建database,注意名字和之前用的一样
mysql> GRANT ALL ON minewpdb.* TO @localhost IDENTIFIED BY '';  # 创建一个myssql用户,方便起见,也和以前一样好了
$ mysql -u ec2-user -p minewpdb < /media/ent/blog.bak.sql # 恢复数据库

b) 恢复html文件夹,这个很简单,就是把blog.bak.html.tar.gz解压出来,放到/srv/www/wordpress目录就行了
然后就可以先在本地测试了,确认wordpress没有问题之后,就是域名了。

4. 域名DDNS

这一块还没玩过,只能做尝试了。

先测试了url forwarding,在dyndns.org有个免费域名mine260309.dyndns-at-home.com,这个是可以DDNS的,然后在GoDaddy里设置了forwarding,然而无论是设置成http://的还是https://的,ssl都有问题(我的博客用了WordPress HTTPS),上推去问,@wzyboy同学说可以用he.net的服务,去google了一下,果然是个好东西。参考http://www.bidon.ca/en/random/2011-06-16-using-dynamic-dns-feature-dnshenet

4.1 上dns.he.net,注册后,可以免费设置50个域名。
1) 添加mine260309.me;
2) Edit Zone -> New A -> Enable entry for dynamic dns
3) 点击”refresh”图标 -> Generate Key,记住这个key,以后给ddclient用
4.2 然后在pi上下载ddclient

apt-get install ddclient

#安装的过程中会有preconfig:

remote server: dyn.dns.he.net
username: mine260309.me
password:
domain: mine260309.me

service ddclient status

确认ddclient工作正常。

4.3 在GoDaddy的设置里把Forwarding关掉,然后手动设置Nameserver为ns1.he.net, ns2.he.net, …

最后测试,一切正常!

不过因为在墙内了,发完博客自动发推的功能木有了,当然这个可以用别的服务搞定就是了,以后再说~

Share

Bye Bye Moto

    随着Motorola Home部门正式被Arris收购,我也不再是moto员工了。作为一毕业就加入moto并一直干到现在的“老员工”,对于moto还是很有感情的。。。 所以,回顾一下我的moto生涯吧——
    05年大四开始找工作,拿到南摩的offer,很是开心——一方面是搞定了工作,另一方面,可以先开始intern,工资4k,其中1k交学校,剩下的都 归自己。当时每个月生活费也就几百,3k的纯收入真是笔巨款,而且住学校,吃住都很便宜,上下班还有班车,就停在学校边上的珠江路上,超级方便。
    06年毕业,本来可以带着intern的CoreId直接上班的,不过当时为了看世界杯,中间断了一段时间,结果入职时就换了CoreId,还损失了那几天的工资,后来觉得有点亏。
    那段时间主要在Terry的team里做Intel FDI文件系统,这是在Nor Flash上的一个私有文件系统,充分利用nor flash特性设计的文件系统。印象比较深刻的是当时有个老外帮忙用单片机做了一个专门用来做掉电测试的板子,随机地让手机开机、掉电,不停的循环,确保 文件系统不会坏。把一个文件系统做稳定之后还是小有成就感的。
    后来re-org,当时文件系统已经成熟了也不需要太多的维护,有机会转去做bootloader,想想有机会跟硬件、汇编打交道,蛮有意思的。
    moto的手机主要用TI和Qualcomm的芯片,当年还是TI很火的时候,TI很牛,也不给BSP,不过有之前的bootloader的base,换用新的芯片,也就是改些配置,把板子跑起来的事情,其实没有太大的挑战性。值得说的大概有两个事情。
      · 一个是在某个片子上只有32KiB的internal RAM,跑之前的code因为太大根本不行,只能想办法,改编译选项(-Os),找大的global变量,看看能不能缩减字库之类的,后来总算把最开始的 bootloader弄得足够小,然后去初始化DDR Ram,然后内存使用就豁然开朗了;
      · 另一个是关于flash速度的,当时用RSDLite烧机(现在俗称刷机)速度很慢,不但烧写慢,checksum也很慢,远远太不到flash的理论速 度。我正好之前做文件系统对flash很熟,知道怎么配置,怎么用burst read/write,改动一番后,flash的速度提高了很多。
    09年中的时候,上海的home部门在招人,当时正好想换个环境到上海去,就内部申请transfer了。内部电话面试一下,两边的老板同意就行了,这一点还挺人性化的,公司的HR也很专业,transfer的事情基本上都由HR搞好了。
    于是,在南摩工作了整3年之后(不包括intern的半年),我来到了上海摩托。
    这是个完全不一样的部门——
      不再是MobileDevice了,而是Home,专做机顶盒的软件;不再用Clearcase/ClearQuest了,而是用Bugzilla(不过 现在改用Jira了)/ SVN了;电脑变差了,没有免费饮料了,没有building了。。。 诸多变化,一开始还是挺不适应的。。。
    在这里,因为是scrum,做的事情很杂,经常几个月就换个方向做,于是,在上海摩托,做过这些东东:toi, bitband, viaccess, ekioh-webkit, dlna, dtcp,以及修过任何机顶盒会碰到的问题,hdmi啦,audio/video output啦,等等。
    做新的东西,是能学到不少东西,但很多时候项目就是在修bug,这个就很没意思了,在上海3年多,工作上更多的只是跟着项目走,真正深入地学到东西,很 少。有时候只能自己在业余的时候搞搞Android开发,玩玩自己的博客,翻翻墙,看看Twitter,看各种IT博客之类,收获倒是挺多。
    · 一方面,Linux玩多了,各种脚本,以及python,svn,git,玩得还都不错,也在Android市场上有两个评分都不错的app;
    · 另一方面,各种博客(以及StackOverflow!)看下来,真心能学到很多东西,并发编程、c/c++/java的某些细节,等等。佩服那些大牛小牛们,呵呵。Google Reader真是神器,可惜就要关了。
    这期间,经历了Moto的拆分,Google的收购,还始终算是moto的员工;经历了Twitter的崛起,饭否的成功、封杀与复活,新浪微博的ws, 微信的异军突起,从不怎么使用新技术新产品,到现在用着twitter, facebook, foursqure, ifttt, pocket, evernote, dropbox, amazon aws, godaddy, bitcoin等各种新玩意儿,算是积极的变化吧。
    然后,Arris的收购,然后,终于不再是moto人了。。。
    Bye Bye Moto
    —-
    谨以此文纪念在moto的岁月
    2013.05
Share

用dmalloc调试memory leak的一点使用经验

用c/c++开发的程序,不可避免地会遇到memory leak的问题。在俺们的项目里自己的code基本上已经boost::xxx_ptr了,但是用上第三方的库,总还是得用raw pointer,于是会有各种诡异的memory leak问题。

Dmalloc可谓这方面的神器,它功能很多,不过这里只记录一下怎么用它来找memory leak。

  • 环境: Fedora 11, gcc 4.4.1
  • 准备:
    1. Get dmalloc from http://dmalloc.com/ (latest version 5.5.2)
    2. Patch cxx return value, 如果没有这个patch,dmalloc log里c++的函数地址似乎有问题
    3. make && make install, 注意还需要额外make cxx, threads, install也一样
    4. 设置环境变量,我们只需要打印log信息,所以
    dmalloc runtime -p print-messages
    然后设置相应的环境变量就ok了
  • 调试:
    放两个例子。(相关code在这里 dmalloc_share.tar.gz

    1) 最简单的例子 basic_usage

    $ ./basic_usage
    1361264794: 6: Dumping Chunk Statistics:
    1361264794: 6: basic-block 4096 bytes, alignment 8 bytes
    1361264794: 6: heap address range: 0x7f7840c63000 to 0x7f7840c69000, 24576 bytes
    1361264794: 6:     user blocks: 3 blocks, 11216 bytes (45%)
    1361264794: 6:    admin blocks: 3 blocks, 12288 bytes (50%)
    1361264794: 6:    total blocks: 6 blocks, 24576 bytes
    1361264794: 6: heap checked 0
    1361264794: 6: alloc calls: malloc 4, calloc 0, realloc 0, free 2
    1361264794: 6: alloc calls: recalloc 0, memalign 0, valloc 0
    1361264794: 6: alloc calls: new 0, delete 0
    1361264794: 6:   current memory in use: 2000 bytes (2 pnts)
    1361264794: 6:  total memory allocated: 3600 bytes (4 pnts)
    1361264794: 6:  max in use at one time: 2000 bytes (2 pnts)
    1361264794: 6: max alloced with 1 call: 1200 bytes
    1361264794: 6: max unused memory space: 1072 bytes (34%)
    1361264794: 6: top 10 allocations:
    1361264794: 6:  total-size  count in-use-size  count  source
    1361264794: 6:        1200      1        1200      1  ra=0x400ede
    1361264794: 6:        1200      1           0      0  ra=0x400eb3
    1361264794: 6:         800      1         800      1  ra=0x400e9b
    1361264794: 6:         400      1           0      0  ra=0x400e70
    1361264794: 6:        3600      4        2000      2  Total of 4
    1361264794: 6: Dumping Not-Freed Pointers Changed Since Start:
    1361264794: 6:  not freed: '0x7f7840c63008|s1' (1200 bytes) from 'ra=0x400ede'
    1361264794: 6:  not freed: '0x7f7840c65c08|s1' (800 bytes) from 'ra=0x400e9b'
    1361264794: 6:  total-size  count  source
    1361264794: 6:        1200      1  ra=0x400ede
    1361264794: 6:         800      1  ra=0x400e9b
    1361264794: 6:        2000      2  Total of 2
    1361264794: 6: ending time = 1361264794, elapsed since start = 0:00:00
    

    很明显,地址0x400ede 0x400e9b这两个地方有memory leak,用addr2line看一下:

    $ addr2line -e ./basic_usage 0x400ede
    /xxx/basic_usage.cpp:18
    $ addr2line -e ./basic_usage 0x400e9b
    /xxx/basic_usage.cpp:12
    

    就很清楚了

    2) tricky_usage, 稍微有点tricky的调试方式,稍微解释一下:
    a. 注册SIGHUP和SIGINT的handler;
    b. 收到一次SIGHUP,调用dmalloc_mark(),标志一下当前的内存使用情况;
    c. 再收到一次SIGHUP, 调用dmalloc_log_changed(),记录从上次mark之后的内存变化;
    d. 收到SIGINT,调用 dmalloc_log_unfreed() 打印所有没有被free的内存

    $ ./tricky_usage&  # get the pid
    $ kill -1 pid  # mark, and call testFunc()
    $ kill -1 pid  # log_changed memory
    Asking dmalloc to log changed
    1361264378: 5: Dumping Not-Freed and Freed Pointers Changed Since Start:
    1361264378: 5: not freed: '0x7f67d2384808|s1' (1200 bytes) from 'ra=0x4010ab'
    1361264378: 5: not freed: '0x7f67d2386c08|s1' (800 bytes) from 'ra=0x40105b'
    1361264378: 5: freed: '0x7f67d2389e08|s2' (400 bytes) from 'ra=0x401046'
    1361264378: 5: total-size count source
    1361264378: 5: 1200 1 ra=0x4010ab
    1361264378: 5: 800 1 ra=0x40105b
    1361264378: 5: 400 1 ra=0x401046
    1361264378: 5: 2400 3 Total of 3
    

    注意”not freed”和”freed”,很明显吧 🙂
    多kill -1几次,可以观察到每一次freedAndNew这个变量会在下一次被free掉,这个并不算leak,真正的leak是notFreed这个变量。

    然后kill -2看看结果。

    $ kill -2 pid  # log all unfreed variables
    1361264409: 18: dumping the unfreed pointers
    1361264409: 18: Dumping Not-Freed Pointers Changed Since Start:
    1361264409: 18: not freed: '0x7f67d2383808|s1' (1200 bytes) from 'ra=0x4010ab'
    1361264409: 18: not freed: '0x7f67d2386408|s1' (800 bytes) from 'ra=0x40105b'
    1361264409: 18: not freed: '0x7f67d2386808|s1' (800 bytes) from 'ra=0x40105b'
    1361264409: 18: not freed: '0x7f67d2386c08|s1' (800 bytes) from 'ra=0x40105b'
    1361264409: 18: total-size count source
    1361264409: 18: 2400 3 ra=0x40105b
    1361264409: 18: 1200 1 ra=0x4010ab
    1361264409: 18: 3600 4 Total of 2
    

    不解释了~
    想真正杀掉这个测试进程,kill -9吧

    总结:
    1) 设置dmalloc的环境变量,link libdmallocxxx,运行完程序会有dmalloc的分析数据;
    2) dmalloc_mark() 和 dmalloc_log_changed() 可以用来分析某一次事件或一段时间内的内存变化情况;
    3) dmalloc_log_unfreed() 可以打印当前所有没有free掉的变量

Share

Back to work

实习结束后,基本上算是放了半个月的假,期间认真的毕了一次业。
6月30号,我正式报到,上班了,纪念一下:)
现在住的房子3室两厅,3间房被中介分别出租,我租了其中一个小间;在江宁房租都要450,有点贵,不过还好,有彩电(有AV接口,能玩PS2)、有空调、有公用的热水器、有共享的宽带,知足了。住了几个晚上后,我居然有了买房的冲动——毕竟和陌生人住同一间房子,而且在江宁很偏僻的地方,比较孤独,也不自在,那感觉不怎么好的说。不知何年何月,让我做房奴吧…… 🙂
世界杯还有剩下的几场比赛,我支持葡萄牙,支持C·罗~
说说鲁尼,埃里克松把他当中锋用,中场支持又太少,怎么会有好结果?我觉得打442,鲁尼在中锋后面,有空间让他冲起来,情形可能会好很多。
跑题了,打住,work work~~
Share