鉴行志

A blogging framework for hackers.

导入本地代码到github

| Comments

最近把本地得一个项目导入到github,下面是将代码嵌入github得过程。

  1. 在github中创建一个项目,获得类似这样得url git://github.com/youruser/somename.git 如果您本地得项目已经使用git管理,请忽略2-3步。

  2. 在本地项目得根目录,运行git init ,并在.gitignore中写入排除的文件或目录。

  3. 将本地代码加入版本库(可以执行以下代码git add . git commit -m ‘initial commit comment’)。

  4. 添加远程得地址 git remote add origin [第一步得地址]

  5. 推送代码道远程分支中: git push origin master

Redis Webdis Install

| Comments

今天在ubuntu上安装redis(redis.io) 和 webdis(webd.is)。redis和webdis安装都很简单之需要make一下,执行生成代码就可以。软件依赖很少,编译安装很方便。

init 脚本配置

Vs2010 加速

| Comments

这几天机器换系统,重装了VS2010 ,笔记本在编译是速度很慢,硬盘灯一直是亮的。VS2010调整下可以加快VS的速度。

  1. 关特效,关不必要的智能

  2. 加内存,现在内存是白菜价,加一条内存可以起到很好的效果。如果没加内存,可以使用个U盘开启readboost。

  3. 编译过程中会在硬盘写大量文件,如果系统中安装了杀毒软件,杀毒软件会扫描文件。如果对相应目录设置不被扫描,速度会有很大提高。

  4. 换固态硬盘,这个调整最明显,花钱有点多,现在SSD成本在10元/1G还是有点贵。

Happy New Year

| Comments

今天是2012年的第一天,

还算不错的2010年过去了,2012年愿望:

  1. 今年把自己的个人问题解决,今年把婚结了,我们都稳定下来。结婚意味着跟多的责任,两个人都要融入对方家庭。像女朋友说的,今后就是两个爸爸妈妈,要好好照顾。

  2. 工作要好好搞,有目标,有追求,改变目前被动的状态。

  3. 爱我的和我爱的人都好好的,保重身体,幸福生活。我会好好的。。。

EOF

Blog 迁移到 Octopress

| Comments

很久没有写blog了,这次是我的aws一周年试用到期了,准备换一个空间继续写。wordpress使用了一年左右,还是感觉不爽,不够geek。原来是先写rst格式文件,生成html然后再到Wordpress中发布,主要还是有洁癖,不喜欢所见即所得编辑器生成的html代码,相当凌乱。在v2ex上看到讨论jekll模版引擎来写文章,mrakdown我不熟悉,blog发布的原理与movbletype。当年我就想,如果有一个blog程序,有movable type的静态文件生成能力,又能不用写html发布,那就完美了。octopress刚好能满足这种需求,足够简洁, 静态文件发布,爱不失手。

主要改变:

  1. wordpress 迁移到otcopress,原来文件进行了迁移。

  2. 熟悉git ,原来是使用hg,主要原因是bitbucket当时不支持git.git使用起来真是相当爽,比hg还好用.相比git ,svn、tfs这类简直没法用.

  3. 域名服务器从godaddy转到国内的dnspod,更改生效的时间相当快,改域名后很短时间内就可以生效。

  4. 使用github 的pages服务,并设置了CNAME映射,blog.xiangjian.info就映射到xiangjian.github.com.

使用supervisor和nginx发布tornado程序

| Comments

tornado先天对异步(no-bolocking)处理能力,非常适合作为Web服务。tornado在linux平台使用epoll来实现异步事件的处理,性能非常好。但是python做为一个脚步语言,单进程执行,无法利用多CPU,对当今的多核CPU是一个很大的浪费。为提高性能,提高CPU利用率,一般会将tornado程序允许cup*n个。
怎样才能放便启动多个tornado程序呢,我们可以用supervisor来管理多个tornado应用。supervisor安装非常方便,easy_install supervisord就可以。
以下是supervisor的配置,我在一台服务器上配置了四个tornado服务。

config

 
; supervisor.
[group:gisapp]
programs=gis-8001,gis-8002,gis-8003,gis-8004
 
 
[program:gis-8001]
command=python /home/gis/gis/gisserver.py --port=8001
directory=/home/gis/gis/
autorestart=true
redirect_stderr=true
stdout_logfile=/home/gis/gis/logs/gis_server-8001.log
stdout_logfile_maxbytes=500MB
stdout_logfile_backups=50
stdout_capture_maxbytes=1MB
stdout_events_enabled=false
loglevel=warn
 
[program:gis-8002]
command=python /home/gis/gis/gisserver.py --port=8002
directory=/home/gis/gis/
autorestart=true
redirect_stderr=true
stdout_logfile=/home/gis/gis/gis_server-8002.log
stdout_logfile_maxbytes=500MB
stdout_logfile_backups=50
stdout_capture_maxbytes=1MB
stdout_events_enabled=false
loglevel=warn
[program:gis-8003]
command=python /home/gis/gis/gisserver.py --port=8003
directory=/home/gis/gis/
autorestart=true
redirect_stderr=true
stdout_logfile=/home/gis/gis/gis_server-8003.log
stdout_logfile_maxbytes=500MB
stdout_logfile_backups=50
stdout_capture_maxbytes=1MB
stdout_events_enabled=false
loglevel=warn
[program:gis-8004]
command=python /home/gis/gis/gisserver.py --port=8004
directory=/home/gis/gis/
autorestart=true
redirect_stderr=true
stdout_logfile=/home/gis/gis/gis_server-8004.log
stdout_logfile_maxbytes=500MB
stdout_logfile_backups=50
stdout_capture_maxbytes=1MB
stdout_events_enabled=false
loglevel=warn

怎么让四个端口同时提供服务呢?可以使用web服务神器nginx,nginx自带了负载平衡功能,
可以让这4个服务同时提供服务。

nginx config

 
    upstream gisserver{
            server 127.0.0.1:8001;
            server 127.0.0.1:8002;
            server 127.0.0.1:8003;
            server 127.0.0.1:8004;
    }
location /tile/ {
    proxy_pass        http://gisserver;
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_pass_header Set-Cookie;
}

更新:

上述配置可以精简,supervisord配置可以使用变量表示

 
; supervisor.
[group:gisapp]
programs=gis-web
 
 
[program:gis-web]
command=python /home/gis/gis/gisserver.py --port=80%(process_num)02d
directory=/home/gis/gis/
autorestart=true
redirect_stderr=true
stdout_logfile=/home/gis/gis/logs/gis_server-80%(process_num)02d.log
stdout_logfile_maxbytes=500MB
stdout_logfile_backups=50
stdout_capture_maxbytes=1MB
stdout_events_enabled=false
loglevel=warn
numprocs-4
numprocs_start=1

对不同的服务器,之需要调整numprocs值就可以。

32位系统充分使用多余的内存

| Comments

我的T410i很久以前就升级了4G内存,但是32位系统使用不了全部的内存,单位的网络准入系统又不支持64位系统。内存一直都没有充分利用,其实可以做一个内存盘把一些暂存的内容放到这个上面来。有几个好处:
1.速度快,本来这块内存是用不到的,内存的速度比硬盘快很多。
2.重启系统这一块内容会消失,可以做临时存储。如totalcommand解压缓存。

ramdisk我使用的是ramdisk 效果还不错。
VS2010额编译速度一直不是太快,把编译内容放到ramdisk中可以显着提高速度.配置方法可以参考asp.net ramdisk配置

程序员犯的可乐错误

| Comments

上周五,reddit programming区有人贴出了个一段代码的code review,引发了大家讨论,堪称是github.com网站最热烈的讨论。一个程序的升级脚本中写了如下一段代码:

rm -rf /usr /lib/nvidia-current/xorg/xorg

这个很小但是非常致命的错误,当用户执行升级脚本,他的/usr 目录就会被删除,至少有三个用户中招。
在这个讨论 地址 ,人民群众正在进行各种有趣的讨论^_^。

前一段时间,我编译mapnik 需要occi支持,发了我差不多两周的时间,怎么编译都通不过,后来没有办法给mapnik作者发邮件,很快作者说是个bug,已经改好,让我编译试试。我下载最新代码,果然编译没有问题。好奇心驱使我看到了作者 fix 修改了什么东西,居然是写代码时少写个分号,害我编译了好久,换了不少环境。

昨天早上看到台机启动有一个错误,但是启动太快,没看清是什么错误。我上网查了下,说要在/etc/rc.conf 中加入一行代码,我想也没想就添加了一行代码。重启机器怎么也进不了系统,也进不了console界面。没有办法我只能使用u盘进rescue系统,删除那一行文件,重启后一切恢复恢复正常。

测试对程序来说是致命的,没有经过测试的程序可能会导致很严重的问题。希望这样的问题会少点,程序员在写程序时尽量多做点测试,少出点这种错误。

Linux 系统动态链接库引

| Comments

最近要编译一个mapnik2,其中安装依赖环境icu和boost这两个东西费尽周折。最后总算弄明白了linux下的动态链接库是怎么管理的?动态链接库多版本会不会冲突?

linux支持unix中的动态链接库方法,使用export LD_LIBRARY_PATH= 这各方式。linux的动态链接库引用是通过ldconfig来实现的。
linux 动态链接库使用ldconfig命令来查找系统动态链接库,并生成缓存方便系统引用。编译代码时,软件依赖一般是从ldconfig的cache中查找。下面主要说下linux如何管理动态链接库

ldconfig 有以下几个配置文件:

/etc/ld.so.conf
/etc/ld.so.conf.d/*

在文件中说明了引用动态链接库的路径,与export的效果着不多。指定路径后,只需要运行ldconfig即可重建动态链接库索引。

使用 ldconfig -p 可以查询系统中注册的dll文件。

另外还有个查看程序引用的动态链接库在系统中是否存在,使用ldd 加动态链接库地址就可以查看。例如,查看mapnik postgis插件引用的动态链接库在系统中是否存在可以使用

ldd /usr/lib/mapnik2/input/postgis.input

linux-vdso.so.1 => (0x00007fff3791f000)
libpq.so.5 => /usr/lib/libpq.so.5 (0x00007f00c0306000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f00bfffc000)
libm.so.6 => /lib/libm.so.6 (0x00007f00bfd79000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f00bfb63000)
libc.so.6 => /lib/libc.so.6 (0x00007f00bf805000)
libssl.so.1.0.0 => /usr/lib/libssl.so.1.0.0 (0x00007f00bf5a8000)
libcrypto.so.1.0.0 => /usr/lib/libcrypto.so.1.0.0 (0x00007f00bf1ec000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007f00befcf000)
/lib/ld-linux-x86-64.so.2 (0x00007f00c0791000)
libdl.so.2 => /lib/libdl.so.2 (0x00007f00bedca000)
libz.so.1 => /usr/lib/libz.so.1 (0x00007f00bebb2000)

linux 中编译程序或移植环境经常会使用到这两个命令解决实际问题。

Redhat使用yum安装程序

| Comments

最近,要给一台redhat4服务器安装mapnik,在我自己工作的台机使用的是archlinux上,使用ABS安装环境那是相当方便,这台机器安装让人大伤脑筋。rpm包依赖要一个个找,而且,经常要自己编译源代码。

在centos系统中使用yum安装一点都不折腾,redhat4和centos算是同源,可以使用centos来做rh的更新。下面是安装yum的步骤。

安装 yum

方便在redhat 系统中安装软件包,现在的系统是redhat4企业版本,可以使用centos的软件包管理器

你可以用yum和rpm文件更新,其实很简单.

  1. 用wget下载yum

  2. # wget http://packages.sw.be/yum/yum-2.4.2-0.4.el4.rf.noarch.rpm

    1. 安装此rpm文件

    2. # rpm -ivh yum-2.4.2-0.4.el4.rf.noarch.rpm

    3. 配置 /etc/yum.conf 使用兼容的更新源(这里使用搜狐源,这个比较快。)

    4. [main]

      cachedir=/var/cache/yum

      debuglevel=2

      logfile=/var/log/yum.log

      pkgpolicy=newest

      distroverpkg=redhat-release

      tolerant=1

      exactarch=1

      [base]

      name=CentOS-$releasever – Base

      baseurl=http://mirrors.sohu.com/centos/4/os/i386/

      gpgcheck=1

      [updates]

      name=Red Hat Linux $releasever – Updates

      baseurl=http://mirrors.sohu.com/centos/4/updates/i386/

      gpgcheck=1

      [dag]

      name=Dag RPM Repository for RHEL5

      baseurl=http://mirrors.sohu.com/dag/redhat/el5/en/$basearch/dag/

      enabled=1

      gpgcheck=1

      gpgkey=http://mirrors.sohu.com/dag/RPM-GPG-KEY.dag.txt

    5. 安装CentOS的GPG Key:

    6. # rpm --import http://mirrors.sohu.com/centos/RPM-GPG-KEY-CentOS-4

    7. 测试yum是否正常(下面是更新所有的rpm):

    8. # yum update //更新系统

    9. 建立缓存:

    10. #yum makecache

      下篇写mapnik的编译安装。