Author: Raymond

Archlinux更新时gcc-libs-multilib冲突问题解决方法

用64位Archlinux的童鞋大多都会装上gcc-libs-multilib吧,不然没法儿装上wine。不过最近在更新的时候发现了一个纠结的依赖关系问题。在执行pacman -Syu的时候会提示需要先更新pacman,如果选择先安装pacman的话则会告诉你需要安装gcc-libs, 而gcc-libs和已经安装的gcc-libs-multilib冲突。

按理说因为gcc-libs-multilib已经provide了gcc-libs这个包,在判断依赖关系的时候应该是被看作和gcc-libs等价的,但是为什么还会出这种问题捏?搜索了以下发现是pacman的一个bug。而解决的办法就是先手动把pacman更新,然后在执行整个系统的更新:

1
2
sudo pacman -S pacman
sudo pacman -Su

目前为止(12年4月中旬)这个bug仍然存在,需要用上述方法绕开这个问题。

Enhanced by Zemanta

为CMake添加预编译头支持

自己捣鼓的一个项目因为用到了Qt和其他一堆库文件,在我的笔记本上编译慢的不能忍了,搜索后分别找到了如何在CMake下实现在Visual Studio和GCC中处理预编译头的的方法。两者拼起来解决了点小bug以后就能用了,记录如下:

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
MACRO(ADD_PRECOMPILED_HEADER
    Target PrecompiledHeader PrecompiledSource SourcesVar)
  SET(_sources ${${SourcesVar}})
 
  # 判断编译器
  IF(MSVC)
    ADD_MSVC_PRECOMPILED_HEADER(${PrecompiledHeader}
      ${PrecompiledSource} _sources)
  ENDIF(MSVC)
 
  IF(CMAKE_COMPILER_IS_GNUCXX)
    ADD_GCC_PRECOMPILED_HEADER(${Target} ${PrecompiledHeader} _sources)
  ENDIF(CMAKE_COMPILER_IS_GNUCXX)
ENDMACRO(ADD_PRECOMPILED_HEADER)
 
MACRO(ADD_MSVC_PRECOMPILED_HEADER
    PrecompiledHeader PrecompiledSource SourcesVar)
  IF(MSVC)
    GET_FILENAME_COMPONENT(PrecompiledBasename ${PrecompiledHeader} NAME_WE)
    SET(PrecompiledBinary
      "${CMAKE_CURRENT_BINARY_DIR}/${PrecompiledBasename}.pch")
    SET(Sources ${${SourcesVar}})
 
    SET_SOURCE_FILES_PROPERTIES(
      ${PrecompiledSource}
      PROPERTIES COMPILE_FLAGS
      "/Yc\"${PrecompiledHeader}\" /Fp\"${PrecompiledBinary}\""
      OBJECT_OUTPUTS "${PrecompiledBinary}")
    SET_SOURCE_FILES_PROPERTIES(${Sources}
      PROPERTIES COMPILE_FLAGS
      "/Yu\"${PrecompiledBinary}\" /FI\"${PrecompiledBinary}\" /Fp\"${PrecompiledBinary}\""
      OBJECT_DEPENDS "${PrecompiledBinary}")
    # Add precompiled header to SourcesVar
    LIST(APPEND ${SourcesVar} ${PrecompiledSource})
  ENDIF(MSVC)
ENDMACRO(ADD_MSVC_PRECOMPILED_HEADER)
 
# 判断gcc版本是否支持预编译头
IF(CMAKE_COMPILER_IS_GNUCXX)
  EXEC_PROGRAM(
    ${CMAKE_CXX_COMPILER}
    ARGS                    --version
    OUTPUT_VARIABLE _compiler_output)
  STRING(REGEX REPLACE ".* ([0-9]\\.[0-9]\\.[0-9]) .*" "\\1"
    gcc_compiler_version ${_compiler_output})
  #MESSAGE("GCC Version: ${gcc_compiler_version}")
  IF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]")
    SET(PCHSupport_FOUND TRUE)
  ELSE(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]")
    IF(gcc_compiler_version MATCHES "3\\.4\\.[0-9]")
      SET(PCHSupport_FOUND TRUE)
    ENDIF(gcc_compiler_version MATCHES "3\\.4\\.[0-9]")
  ENDIF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]")
ENDIF(CMAKE_COMPILER_IS_GNUCXX)
 
MACRO(ADD_GCC_PRECOMPILED_HEADER _targetName _input _sources)
  GET_FILENAME_COMPONENT(_name ${_input} NAME)
  GET_FILENAME_COMPONENT(_path ${_input} PATH)
  SET(_outdir "${CMAKE_CURRENT_BINARY_DIR}/${_name}.gch")
  IF(NOT CMAKE_BUILD_TYPE)
    SET(_output "${_outdir}/${CMAKE_BUILD_TYPE}.c++")
  ELSE(NOT CMAKE_BUILD_TYPE)
    SET(_output "${_outdir}/default.c++")
  ENDIF(NOT CMAKE_BUILD_TYPE)
 
  # 创建存储预编译头的文件夹,这样可以对一个头文件在不同的编译类型(debug, release)生成不同的预编译头
  ADD_CUSTOM_COMMAND(
    OUTPUT ${_outdir}
    COMMAND mkdir ${_outdir} # TODO: {CMAKE_COMMAND} -E ...
    )
  #MAKE_DIRECTORY(${_outdir})
 
  SET(_compile_FLAGS ${CMAKE_CXX_FLAGS})
 
  GET_DIRECTORY_PROPERTY(_directory_flags INCLUDE_DIRECTORIES)
 
  # 如果包含文件夹设置不对则给出错误
  SET(_CMAKE_CURRENT_BINARY_DIR_included_before_path FALSE)
  FOREACH(item ${_directory_flags})
    IF(${item}  STREQUAL ${_path} AND NOT
        _CMAKE_CURRENT_BINARY_DIR_included_before_path )
      MESSAGE(FATAL_ERROR
        "This is the ADD_PRECOMPILED_HEADER macro. "
        "CMAKE_CURREN_BINARY_DIR has to mentioned at INCLUDE_DIRECTORIES's argument list before ${_path}, where ${_name} is located"
        )
    ENDIF(${item}  STREQUAL ${_path} AND NOT
      _CMAKE_CURRENT_BINARY_DIR_included_before_path )
 
    IF(${item}  STREQUAL ${CMAKE_CURRENT_BINARY_DIR})
      SET(_CMAKE_CURRENT_BINARY_DIR_included_before_path TRUE)
    ENDIF(${item}  STREQUAL ${CMAKE_CURRENT_BINARY_DIR})
 
    LIST(APPEND _compile_FLAGS "-I${item}")
  ENDFOREACH(item)
 
  GET_DIRECTORY_PROPERTY(_directory_flags DEFINITIONS)
  LIST(APPEND _compile_FLAGS "-fPIC")
  LIST(APPEND _compile_FLAGS ${_directory_flags})
 
  SEPARATE_ARGUMENTS(_compile_FLAGS)
  #MESSAGE("_compiler_FLAGS: ${_compile_FLAGS}")
 
  # 拷贝头文件
  ADD_CUSTOM_COMMAND(
    OUTPUT  ${CMAKE_CURRENT_BINARY_DIR}/${_name}
    COMMAND ${CMAKE_COMMAND} -E copy  ${_input}
    ${CMAKE_CURRENT_BINARY_DIR}/${_name} # ensure same directory! Required by gcc
    )
  #MESSAGE("command : ${CMAKE_COMMAND} -E copy  ${_input}
  #  ${CMAKE_CURRENT_BINARY_DIR}/${_name}")
 
  # 添加生成与编译头的命令
  ADD_CUSTOM_COMMAND(
    OUTPUT ${_output}
    COMMAND ${CMAKE_CXX_COMPILER}
    ${_compile_FLAGS}
    -x c++-header
    -o ${_output}
    ${_input}
    DEPENDS ${_input} ${_outdir} ${CMAKE_CURRENT_BINARY_DIR}/${_name}
    )
  ADD_CUSTOM_TARGET(${_targetName}_gch
    DEPENDS ${_output}
    )
  ADD_DEPENDENCIES(${_targetName} ${_targetName}_gch )
 
  # 可以针对特定的源文件添加预编译头
  SET(_sourcesVar ${${_sources}})
  FOREACH(source ${_sourcesVar})
    SET_SOURCE_FILES_PROPERTIES(${source}
      PROPERTIES
      COMPILE_FLAGS "-include ${_name} -Winvalid-pch"
      OBJECT_DEPENDS "${_output}")
  ENDFOREACH(source)
ENDMACRO(ADD_GCC_PRECOMPILED_HEADER)

使用的时候只需要像这样:

1
ADD_PRECOMPILED_HEADER(Framework "Common.h" "Common.cpp" FrameSourcesCpp)

在用gcc进行预编译头的时候,gcc要求与编译头得到的二进制文件要和头文件在同一个目录下。而CMake在编译的时候通常中间文件都是放在和源文件不一样的地方的。解决这个问题的办法是把预编译头文件拷贝一份到输出中间文件的目录,然后把该目录添加到c/c++包含目录的前面。这样源文件在include这个头文件的时候会找到cmake的build文件夹中的头文件,并自动引用预编译头:

1
2
3
4
5
INCLUDE_DIRECTORIES(
  ${CMAKE_CURRENT_BINARY_DIR}
  ${CMAKE_CURRENT_SOURCE_DIR}
  # other include directories here
  )

把玩三星Focus

Windows Phone Marketplace on Samsung Focus

Samsung Focus

前段时间从美国亚马逊上面花120美元入手了一个翻新的三星Focus,花了将近50的运费用百通转运到了北京,然后又在淘宝上花了30买了一个激活码来解除ATT的SIM卡锁定,总共花了800左右的样子。刚才查了一下淘宝上面的Focus价格普遍在1200-1300左右,而且据说这个已经停产的机器国内卖的绝大多数都是翻新的。这样看来这次买还是很划算的。

头一次买亚马逊上面的翻新机器,心里还是比较忐忑。拿到手以后发现除了USB口会有一些灰尘以外,外观上是看不出来是个二手机器的。原本觉得应该会找到一些划痕,但是最后发现和新的一样。

硬件上因为微软的强硬规定,应该大家的WP7手机都差不多的样子。Focus算是WP7中比较薄的机型,配置了1G CPU, 500万的相机和一块不错的800*480的4寸屏幕。充满电的情况下一直3G随便玩大概能12小时左右(也许还不到),所以还是得额外搞一块电池。

WP7自带软件都是中规中矩的东西,因为使用了Matro设计,所以很多软件界面就像是一个没有用CSS的朴素网页。短消息的操作和Android以及iOS的一样,是聊天一样的气泡风格。邮箱的则就是简单的文字堆起来的邮件条目。联想到最近新发布的Window Logo设计,微软你是要打着简洁的名义让学平面设计的童鞋们没饭吃么囧。

令人感觉很有意思的是XBox Live的设计。所有已经安装的游戏会在XBox Live这个应用里的列表中,而不会作为一个单独的应用出现在应用列表里面。如果你设置了自己的虚拟形象,还可以在XBox Live的界面中看到这个虚拟形象时不时的出来晃悠一下。和苹果的游戏中心一样,XBox Live兼具排行榜和游戏交友的功能。考虑到它现在不到2%的市场占有率,找到一个同样用WP7玩游戏的人很难啊。

之前用的是一个Android手机,还在想是不是倒腾联系人会很麻烦。输入了我的Gmail用户名和密码以后原本以为只是下载邮件下来,没想到系统很快就把我的所有联系人信息都下载下来了,整个过程快速无痛。联想到之前给WebOS导入联系人的纠结过程,觉得至少WP7是在这个细节上用心了的。

应用市场

想用WP市场一个比较纠结的问题就是在3月之前市场还不支持中国地区,为了用上市场必须在电脑的控制面板里面把区域选择为美国或者香港,手机上也要设置成一样的地区。坑爹的是手机重新设置区域会导致整个手机重置掉!这是坑爹呢?

目前看来在Android下面用的常见应用在WP7上大多都有,包括微博、人人、豆瓣电台等等都找到了对应的WP7版本。当然这些应用的界面都换成了WP7的Metro风格,只是很多应用功能上都会有缩水。

市场不仅是买应用,还可以下载音乐和Podcast。对于音乐市场有一个很有吸引力的无限制下载套餐,交一定数量的money就可以随便下载音乐,但是这项服务仅限美国用户,再一次泪奔。Podcast则很好用了,有很多像Ted这样的优质内容,而且下载速度貌似也比App Store要好很多。

Zune software for Windows PCs showing the Zune...

Zune

Zune

Zune的作用和苹果的iTunes非常相似,可以管理手机上面的应用,同步音乐视频到手机上(和苹果的手机一样,不通过一个步骤繁琐的破解,你是无法直接往WP7上面拷贝文件的)。但是有点让人以外的是离线安装包居然有两百多兆。如果你是从Zune官网链接给出的地址下载的话只能下载下来一个一百多兆的安装包,安装的时候还得等安装程序在线下载一百多兆的东西。这让我等教育网用户情何以堪。

相比较iOS和Android,Zune有一个很有用的功能就是,当你开着Zune并连上手机的时候,手机可以通过电脑的网络来上网。对于没有Wifi而且还在用龟速GPRS的人而言是个福音啊。很奇怪为什么没有在Android上面见到这样的功能。

不足之处

脑残的应用列表

微软是在赤果果的偷懒么?居然把所有应用都放到了一个列表里面,要想找到一个程序必须从上往下滚动,或者是输入名字搜索。我要是像用我的Xoom那样狂装程序的话估计为了找到一个程序得抓狂掉。

木有VPN

WP7的设置菜单里面东西很少,看来看去也没有找到VPN在哪里设置。稍微搜索了一下发现居然是不支持的!而且微软在计划里面也完全没有考虑让WP7支持VPN。国内的苦逼用户们又一次泪奔了,至少Facebook和Twitter的各种功能整合式没法儿用了。

界面单调

也许这是一个见仁见智的问题,但是我觉得这些个方块看时间长了以后绝对会审美疲劳的,何况很多人不一定觉得是在审美。你能对界面自定义的就是Metro方块的颜色以及锁屏时候显示的图片,大家的WP7都是一模一样。说好的自定义主题捏?

Enhanced by Zemanta

Linux下Nvidia显卡双屏设置

这两天给实验室的电脑加了一个显示器,发现装好gnome的archlinux不能自动识别,因此折腾了一下双显示器的配置问题。对于双屏幕的设置有Xinerama, Twinview, randr等方法。

Xinerama

对于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         Xinerama "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。

Twinview

因此我转向使用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中。

针对Wine的设置

如果使用Twinview方式设置双屏的话,wine下运行的程序会不正常–在我的机器上如果是两个分辨率不一样的屏幕左右排列,右边个屏幕上的wine程序就会有一块是白板。如果是运行游戏的话鼠标会被限制在一个小范围中,不能点到整个屏幕。

解决这个问题的折衷办法是在twinview的分辨率模式中为wine下面的游戏添加一个模式–让主显示器用正常分辨率,把另外一个显示器关掉:

1
2
3
4
5
6
7
8
9
10
11
12
13
Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "Monitor0"
    DefaultDepth    24
    Option         "TwinView" "1"
    Option         "TwinViewXineramaInfoOrder" "CRT-1"
    # 第一个模式是自动匹配最佳分辨率,第二个是在运行游戏的时候关掉一个显示器
    Option         "metamodes" "nvidia-auto-select,nvidia-auto-select;NULL,1440x900"
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection

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
3
# iptables -t nat -A POSTROUTING -s $LOCAL_NETWORK -o eth0 -j MASQUERADE
# cat 1 > /proc/sys/net/ipv4/ip_forward
# iptables -A INPUT -i tun0 -j ACCEPT

iptable的设置在重启以后会丢失,可以用如下命令将它们保存下来:

1
# rc.d save iptables

同时可以编辑/etc/sysctl.conf中的设置:

1
net.ipv4.ip_forward=1

这样重启以后只需要直接启动openvpn的daemon就可以了

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版硕士模板。需要的童鞋可以关注下。

喜添新丁

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

veer上手玩

前两天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的大甩卖行为这些开发者也应该挣了些零花钱。

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