Linux下Nvidia显卡双屏设置

这两天给实验室的电脑加了一个显示器,发现装好gnome的archlinux不能自动识别,因此折腾了一下双显示器的配置问题。对于Archlinux下的Xorg的双屏设置,默认情况下只会使用第一个显示器。如果想要使用双屏,最直接的办法是使用Xorg的Xinerama扩展
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Section "ServerLayout"
    Identifier     "DualSreen"
    Screen       0 "Screen0"
    Screen       1 "Screen1" RightOf "Screen0" #Screen1 at the right of Screen0
    Option         "<span class="zem_slink">Xinerama</span>" "1" #To move windows between screens
EndSection
 
Section "Monitor"
    Identifier     "Monitor0"
    Option         "Enable" "true"
EndSection
 
Section "Monitor"
    Identifier     "Monitor1"
    Option         "Enable" "true"
EndSection
 
Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    Screen         0
EndSection
 
Section "Device"
    Identifier     "Device1"
    Driver         "nvidia"
    Screen         1
EndSection
 
Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "Monitor0"
    DefaultDepth    24
    Option         "TwinView" "0"
    SubSection "Display"
        Depth          24
        Modes          "1280x800_75.00"
    EndSubSection
EndSection
 
Section "Screen"
    Identifier     "Screen1"
    Device         "Device1"
    Monitor        "Monitor1"
    DefaultDepth   24
    Option         "TwinView" "0"
    SubSection "Display"
        Depth          24
    EndSubSection
EndSection

只需要把上述内容保存在/etc/X11/xorg.rc.d/10-monitor.conf就可以开启双屏输出了。但是不知道为什么我使用这个方法配置的时候两个屏幕的内容会出现重叠,屏幕分辨率也有问题,尝试了各种配置都没有完全解决。使用Xinerama扩展来双屏输出还有一个问题就是不能支持composition。

因此我转向使用nvidia提供的另外一个方法:使用nvdia显卡驱动的twinview扩展,最简单的方法就是运行

1
sudo nvidia-xconfig --twinview

这会生成一个/etc/X11/xorg.conf,并且会忽略/etx/X11/xorg.rc.d/10-monitor.conf中的设置。使用twinview方式显卡驱动会将两个显示器拼成一个显示器–这意味着你在gnome, kde的显示器设置中只会看到一个显示器,它的分辨率是两个显示器之和。因此在xorg.conf中也只需要配置一个显示器,具体配置文件的用法可以参考这里,你可以在配置文件里面手动指定两个屏幕的分辨率等等。用这个方法的好处是可以有桌面特效加速,但是用ATI显卡的同学就不能这么用了。

自动生成的配置有一个问题:显卡的第二个接口连接的显示器分辨率最多只能上到640X400,解决的方法也很简单,只需要把Monitor中的HorizSync和VertRefresh注释掉就可以了:

1
2
3
4
5
6
7
8
9
Section "Monitor"
        Identifier      "Monitor0"
        Option          "Enable"   "True"
        VendorName      "Unknown"
        ModelName       "Unknown"
        #HorizSync      28.0 - 33.0
        #VertRefresh    43.0 - 72.0
        Option          "DPMS"
EndSection

如果你已经可以启动图形界面的话,可以用管理员权限运行nvidia-settings来用nvidia驱动自带的GUI程序对双屏幕进行设置,设置会自动保存到xorg.conf中。

Multi-Monitor Unity Demo

Multi-Monitor

Enhanced by Zemanta

OpenVPN配置

最近一直用的OpenVPN服务到期了,然后自己在VPS上面搭建了一个OpenVPN服务,发现速度还不错。看Youtube HD毫无压力。将配置记录如下。

首先需要的是制作证书。服务器端必须生成证书和密钥,而客户端可以选择使用证书或者是密码验证的方式。这里给出的配置是使用证书验证的方法。

生成证书

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 这里使用easy-rsa工具来生成证书
$cp /usr/share/openvpn/easy-rsa/ ~/easy-rsa
$cd $_
 
#修改vars文件中的下面那几个变量,这些都会显示到证书里面的,建议还是修改下
# export KEY_COUNTRY="CN"
# export KEY_PROVINCE=""
# export KEY_CITY=""
# export KEY_ORG=""
# export KEY_EMAIL=""
$ vim vars
 
#初始化变量
$ source ./vars
 
#初始化
$ ./clean-all
 
#制作CA证书
#最后会在keys目录下生成 ca.crt(根证书文件) 和 ca.key(根证书私钥文件)
$ ./build-ca
 
#制作服务器端证书
#最后会在keys目录下生成 server.crt(证书文件) 和 server.key(私钥文件)、server.csr(证书请求文件)
$ ./build-key-server server
 
#制作客户端证书
#最后会生成客户端使用的证书
$ ./build-key client1
 
#如果某个客户端证书不需要用了,可以注销客户端证书
$ ./revoke-full client1
 
#创建Diffie Hellman参数
$ ./build-dh

然后将服务器的证书拷贝到/etc/openvpn下面,客户端证书拷贝到客户端配置文件同一个目录下。

OpenVPN配置

服务器端配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 服务器的端口
port 1194
 
# 使用udp还是tcp协议,选啥都一样
proto tcp
;proto udp
 
# tap和tun二选一,没有特殊需求不用变
;dev tap
dev tun
 
# 指定证书、密钥
ca ca.crt
cert server.crt
key server.key  
dh dh1024.pem
 
# 服务器在vpn连接中的地址
server 10.8.0.0 255.255.255.0
 
ifconfig-pool-persist ipp.txt
 
# 转发客户端的数据
push "redirect-gateway def1 bypass-dhcp"
# 告诉客户端换成8.8.8.8的dns服务器
push "dhcp-option DNS 8.8.8.8" 
 
# 是否允许同一个证书的多个客户端登陆,注释掉的话后登陆的客户端会把前面一个挤掉
duplicate-cn
 
keepalive 10 120
 
# 使用数据压缩
comp-lzo
 
persist-key
persist-tun
status openvpn-status.log
verb 3

将该配置文件保存为/etc/openvpn/server.conf,然后再重启openvpn服务就可以了:

1
 sudo /etc/init.d/openvpn restart

 

客户端配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
client
 
;dev tap
dev tun
 
proto tcp
;proto udp
 
# 指定服务器地址
remote server.com 1194
 
resolv-retry infinite
 
nobind
 
persist-key
persist-tun
 
;mute-replay-warnings
 
# 指定客户端使用的证书和密钥
ca ca.crt
cert client1.crt
key client1.key
 
ns-cert-type server
 
comp-lzo
 
verb 3
 
;mute 20
 
redirect-gateway
route-method exe
route-delay 2
route-up "net stop dnscache"
route-up "net start dnscache"
route-up "ipconfig /flushdns"
route-up "ipconfig /registerdns"

配置数据转发

为了能够让服务器真正将数据转发出去,还需要一点点配置:

1
2
$ sudo iptables -t -nat -A POSTROUTING -s $LOCAL_NETWORK -o eth0 -j MASQUERADE
$ cat 1 > /proc/sys/net/ipv4/ip_forward

Kindle Touch破解、更换字体

UPDATE:
豆瓣上现在有人放出了自动更换字体和汉化的破解脚本,可以移步这里下载。如果想要看看如何用ssh进kindle内部偷窥的话可以接着往下看。

前段时间从米国通过转运公司买了一个Kindle touch,拿到手里面以后发现中文显示非常蛋疼,会出现中文笔画粗细不一的问题。买Eink图的就是显示效果好,字体有问题自然是不能忍的。多看不知道什么时候才会出Kindle touch的版本。不过对于看书而言换多看的意义也不是太大。在网上搜索了一下更换字体的流程,将整个过程整理如下:

  1. 破解
    下载kindle-touch-jailbreak-1.0,里面有一个jailbreak.mp3。连上KT以后将KT中的Music目录清空,把jaillbreak.mp3拷贝进去。弹出KT以后在KT的menu->Experimental->Music Player。然后在屏幕下方会看到“Press to Jailbreak”,点击这个按钮,重启以后就破解完成了
  2. 安装ssh
    下载simple_usbnet_1.1,将解压出来的update_simple_usbnet_1.1_install.bin放到KT根目录下。弹出KT以后选择menu->Settings->menu->Update your kindle。这时候KT上就安装好ssh服务了。
    在KT的搜索框里面输入”;un”(不包含引号)就可以启动或者停止KT的ssh服务。在搜索栏中输入”;un password PASSWORD“来设置root的初始密码,PASSWORD替换成你的密码。
  3. PC端安装驱动
    如果你是Linux系统可以直接跳过这一步,如果是win7连上电脑以后应该会出现一个找不到驱动的设备。在设备管理器中找到这个设备,手动选择驱动程序。在选择驱动程序的时候选择 网络适配器-> Microsoft Copration-> Remove NDIS Compatible Device就可以了。Win7会提示不推荐安装这个驱动,但是其实是没问题的。
  4. 更换字体
    ssh用root用户远程登录到 192.168.15.244。运行mntroot rw来去掉文件系统的只读限制。这样你就可以用WinSCP之类的软件来把字体文件上传到KT中了(你要是嫌麻烦也可以直接把字体拷贝到KT中,然后从ssh替换掉原来的文件)。你只需要把你想要的字体替换掉 /usr/java/lib/fonts下面的MHeiM18030_E.ttf ,MHeiM18030_E_Bold.ttf和code2000.ttf这三个字体就可以了,正文貌似是用的code2000.ttf,推荐使用黑体。更换完了以后记得看一眼字体的权限,必须是644权限才可以。
    然后就是下载这个local文件,解压以后放到/etc/fonts下替换原来的文件。
  5. 重启
    大功告成

nginx配置备忘

安装

在ubuntu 10.10里面还没有专门的fastcgi包,必须通过lighttp里面附带的fastcgi加上自定义的脚本来启动fastcgi进程。但是在ubuntu 11.10里面有了一个php5-fpm的包专门用来处理fastcgi,免去了自己倒腾脚本的麻烦。把这一堆包装上安装就算是完事了:

1
sudo apt-get install nginx php5 php5-fpm mysql-server mysql-client

配置

配置也很简单,直接在/etc/nginx/sites-avalable里面添加一个自己的配置文件,然后创建一个到/etc/nginx/sites-enabled/的软链接即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
server {
        listen   80; ## listen for ipv4; this line is default and implied
        root /path/to/root/;
        index index.php index.html index.htm;
 
        # Make site accessible from http://localhost/
        server_name _;
 
        location / {
                # 找不到页面的时候返回到index.html
                try_files $uri $uri/ /index.html;
        }
 
        # 将错误页面重定向到制定的文件
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
                root /usr/share/nginx/www;
        }
 
        # 处理php文件
        location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                include fastcgi_params;
 
                # 在使用wordpress必须要有这个rewrite,否则访问rss的时候会出现404错误
                if( !-e $request_filename)
                {
                        rewrite ^/wordpress/(.+)$ /wordpress/index.php?q=$1 last;
                }                        
        }

北航毕业论文latex模板

最近更新了一下北航的硕士毕业论文latex模板,在texlive的xelatex下面编译。整个项目放在了这里:

http://code.google.com/p/buaalatex/

在Google里面搜索了一下发现居然根本搜索不到这个项目页面,大班群里面还好多人在找模板找不到,因此决定放上来说一下。

另外这个项目里面还还有Grissom做的本科毕设xelatex模板,以及Philips Bai做的ctex版硕士模板。需要的童鞋可以关注下。

喜添新丁

puppy1

家中喜添新丁,两个多月大。长的倒是很讨人喜欢,眼神忧郁,发型拉轰。只是体毛太重,小小年纪就浑身是毛~

veer上手玩

img_20111028_120014

前两天twitter上面不断听说有人在买veer来玩,去淘宝上看了一下价格发现只有650块。加上我已经被手上的HTC Magic卡到天荒地老的状态折腾的不行,于是乎当即决定跑到淘宝上面去入了一个。用了将近一周,算是有点发言权。

从外形和尺寸上说veer应该是很精致很讨女生喜欢的类型,从图里面可以看到veer基本上就和我的手掌差不多大。如果不推开键盘的话打电话都感觉不是很握的住。原本以为这么小巧的手机单手玩会很轻松,结果发现在输入的时候一只手是完全没办法按键盘的,还是得两只手操作。整个手机的边缘都是圆圆的,加上外壳又是有点滑的材质,让人感觉很容易这个小不点儿很容易就会从手里面非出去的样子(事实上昨天晚上就把它扔出去两米远,不过居然一点伤痕都没有)。手机的滑盖还比较紧,如果是尝试一只手推开的话会容易拿不住手机往外滑,结果还是得两个手。当然如果你不用输入仅仅是触屏操作看看网页的话一个手还是没问题的。

在这么小的机身上生生的塞进去一个全键盘,手指粗大的同学肯定会痛苦的要死,平时用肯定得用手指甲来点,否则很容易误操作。不过用了一段时间以后感觉这个键盘输入虽然不算是很快,但是肯定是比触屏的全键盘输入要快的。考虑到平时触屏平时都使用九宫格输入法打字,veer输入中文肯定会慢一些,但是输入英文就肯定是占优的。

系统的话是传说中的WebOS 2.1.2。见识过了这个评价颇高的系统之后感觉果然还是很不错的,除了基本没有应用。卡片式的多任务管理很方便好用,开很多个程序也没出过什么问题,仍然运行的很流畅(不过也得考虑到现在WebOS上面也只有一些简单应用)。很有意思的是整个系统可以下载到很多的补丁来改变系统的行为,比如说可以在屏幕右上角的菜单里面添加3G的开关等等。稍微研究了一下发现居然连系统界面都是用html+javascript的方式来做的,居然能够做到这么流畅你让Android那卡卡的java情何以堪啊。系统的手势区很好用,直接点手势区切换多任务比android的长按home键好太多了。另外滑动删除信息、通知的功能也很好使。在功能手机上你可能需要进选项,删除,确认这好几步操作,android上面也得用那个蛋疼的长按操作。WebOS上面只用潇洒的一滑就好了。

应用程序有国内第三方开发的QQ,网易新闻,街旁等不超过10个软件。而HP官方的商店里面的东西基本上都是没啥用的垃圾软件。比较意外的是居然有愤怒的小鸟,不知道是不是第三方移植的。不过WebOS有一个有意思的功能就是能把一个网站作为一个应用保存起来,这类似与Chrome的应用的概念。本质上就是一个书签,不过如果对于专门对手机优化过的网站而言体验并不差。我一直习惯在公交上读Google Reader,这段时间一直用网页版,发现并不比Android原生的应用差多少。

逛了逛WebOS的论坛,国内有一两个论坛上面研究WebOS,会有很少的几个自制软件、ROM。发现一个有意思的现象就是,因为WebOS的中文软件真的很少,因此论坛里面仅有的几个中文软件基本上都是收费的。虽然价格都不贵,但是估计因为最近HP的大甩卖行为这些开发者也应该挣了些零花钱。

总体而言这个手机做工精致,如果能够体积放大一半儿,待机时间能再长一些就很不错了。不过鉴于它目前的价位,还是非常适合买一个用来哄妹子的,妹子们对这个造型的手机都比较没有防御力。

处理Emacs中的行号和空白字符

做过开源项目的童鞋可能会知道,在很多开源项目中会有专门的脚本来检查代码风格。其中包括行尾是否有多余的空白字符,是否使用使用tab,每一行是否超过了指定的宽度等等。这些问题通常在敲代码的时候并不容易看出来,等到要提交代码的时候才发现问题。稍微搜索了一下发现在emacs中有一个很有用的whitespace插件可以解决这个问题。

whitespace可以针对设置的规则对上面提到的问题进行高亮显示,效果如下:

WhiteSpaceOnLight

whitespace具体可以找到的问题包括tab, 空格混用;行尾多余的空白字符;文件结束前的空白字符;超过指定长度的行等等。可以通过设置whitespace-style来指定需要提示哪些问题。在我的配置中使用了如下配置:

1
2
3
4
5
6
7
;; deal with white spaces
(require 'whitespace)
(global-whitespace-mode)
(setq whitespace-style
      '(face trailing tabs lines lines-tail empty
        space-after-tab space-before-tab))
(add-hook 'before-save-hook 'delete-trailing-whitespace)

默认的whitespace-style把整个buffer被搞得有点乱糟糟的,因此我把不是很需要的部分都去掉了,只剩下检测行尾空白、tab等少数几个问题。对于行尾的多余字符而言,一个个删除也是很麻烦的事情。所以我直接用delete-trailing-whitespace在保存的时候把它们都干掉了。

不过在这里whitespace会和行号有一点点冲突。通常为了显示行号都会打开linum-mode,行号会是右边对其的数字。whitespace会认为行号前面的空白字符是问题字符而高亮显示,搞得非常难看。为了解决这个问题可以用下面代码对linum进行设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
;; Show line number
(require 'linum)
(global-linum-mode t)
(setq column-number-mode t)
(setq line-number-node t)
(setq linum-format "%5d ")
(add-hook 'linum-before-numbering-hook
          (lambda ()
            (let ((w (+
                      (length
                       (number-to-string
                        (count-lines (point-min) (point-max))
                        ))
                      2)
                     ))
              (setq linum-format
                    `(lambda (line)
                       (propertize (concat
                                    (truncate-string-to-width
                                     "" (- ,w (length (number-to-string line)))
                                     nil ?x2007)
                                    (number-to-string line))
                                   'face 'linum))))))

这是从emacs wiki上面抄过来的一段代码,用了一个特殊的unicode字符x2007来设置行号的格式,既能达到右端对其的效果又不会被whitespace误杀。

Emacs中处理日志文件

最近写的东西会将信息输出到一个日志文件中去,每次调试的时候log文件内容都会刷新。每次都手动revert-buffer比较烦人,查了一下发现有一个auto-revert-mode可以自动刷新。下面的配置可以实现对于.log文件调用auto-revert-mode:

1
2
3
4
5
6
7
8
9
10
11
;; auto revert log files
(add-hook 'find-file-hook
          (lambda ()
            (if (string-equal
                 ".log"
                 (substring (buffer-file-name)
                            (search "." (buffer-file-name))))
                (progn
                  (setq auto-revert-mode t)
                  (message "Enabling auto-revert-mode for log file")))
            ))

如果是比较长的日志文件,并且日志使用追加内容的方式添加上去的话,可以将上面的(setq auto-revert-mode t)换成(setq auto-revert-tail-mode t)以提高效率。

STL中的红黑树

平时用STL通常只是顺手把vector, map之类常用的类拿来用用就完了,也没有想到去仔细研究里面都有些什么东西。这两天有一个算法程序需要将一堆对象排序,并且会非常频繁的插入删除,对效率的要求极高。原本想用priority queue,但是发现它是对一个数组进行堆排序的方式来操作,效率并不高。在STL的文档里面找了找发现居然没有红黑树,google了一下才知道set, map底层都是用红黑树实现的,只是这个红黑树没有暴露出来给人用。

也不知道是出于什么考虑,性能优秀的红黑树虽然标准库里面有,但是却遮遮掩掩不直接提供给大家用。值得注意的是,因为红黑树是内部使用的类,各个STL实现中的红黑树还不一样。

在VC的实现中红黑树是在xtree文件中的_Tree类,用法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include 
#include 
#include 
 
using namespace std;
 
typedef _Tree&lt; _Tset_traits, allocator, false &gt; &gt; rb_tree;
 
int main()
{
    rb_tree* tree = new rb_tree( less(), allocator() );
    for(int i=35; iinsert(i);
 
    printf(&amp;quot;output: %d &amp;quot;, *tree-&gt;begin() );
}

gcc中的实现则是在bits/stl_tree.h文件中,而且类的名字和用法都不一样:

1
2
3
4
5
6
7
8
9
10
11
12
#include 
 
typedef _Rb_tree,
                 less &gt; rb_tree;
typedef rb_tree::iterator rb_tree_iter;
 
int main()
{
    rb_tree queue;
    queue._M_insert_unique( int );
    printf("size: %d", queue.size() );
}