2010-07-30

ntpdate

前些日子 qhe 说我在 github 上的 commit 时间有点错乱,我看了一下果然如此。三台虚拟机中最离谱的是我笔记本上vmware workstation里跑的 ArchLinux,`date’ 命令的显示结果和真实时间差了几乎两天。

网上搜了一下,vmware 官方有份文档写的很赞:
Timekeeping in VMware Virtual Machines

我的解决方法很省事,直接用ntp吧:


yaourt -S ntpdate

sudo ntpdate pool.ntp.org

标签:

2010-04-26

I like AUR!

AUR(Arch User Repository) 是个社区驱动的仓库。Arch用户可以提交 PKGBUILD 文件供其他用户分享,而 PKGBUILD 文件就像菜谱一样,告诉 makepkg 怎样生成一个可以用 pacman 安装的程序包。类似Debian中的apt-src。

yaourt 是个前端脚本,除了查找标准的仓库如 core, community 以及 testing (默认不搜索)之外,还会搜索 AUR,这样用户可选的安装包种类可以算是五花八门,包罗万象了。安装了一个llvm-py,不过发现导入llvm.core的时候会失败,在Debian中安装 python-llvm 也是如此。最后发现是生成 so 文件的时候没有链接到 libffi,用 yaourt 安装 llvm-py, 过程中可以修改一下 PKGBUILD 文件,如下:

[sourcecode language="diff"]
--- a/PKGBUILD  Mon Apr 26 10:25:34 2010 -0700
+++ b/PKGBUILD  Mon Apr 26 10:25:56 2010 -0700
@@ -18,6 +18,7 @@
build() {
cd $startdir/src
svn co http://llvm-py.googlecode.com/svn/trunk/ llvm-py-${pkgver}
+  export LDFLAGS=`pkg-config libffi --libs`
cd llvm-py-${pkgver}
python setup.py install \
--prefix=/usr \
[/sourcecode]

这回果然OK了。

标签:

2010-04-09

Why I love Arch

$ sudo python bin/ps_mem.py  | sed 's/^/> /'
>  Private  +   Shared  =  RAM used     Program
>
>  76.0 KiB +  59.0 KiB = 135.0 KiB     agetty
>  92.0 KiB +  62.0 KiB = 154.0 KiB     init
> 112.0 KiB +  66.5 KiB = 178.5 KiB     crond
> 152.0 KiB +  68.5 KiB = 220.5 KiB     sed
> 196.0 KiB +  44.5 KiB = 240.5 KiB     dhcpcd
> 212.0 KiB + 513.5 KiB = 725.5 KiB     udevd (3)
> 832.0 KiB + 443.5 KiB =   1.2 MiB     syslog-ng (2)
>   1.2 MiB +  79.5 KiB =   1.3 MiB     bash
>   1.6 MiB +   1.1 MiB =   2.7 MiB     sshd (3)
> ---------------------------------
>                           6.9 MiB


# wget -c http://www.pixelbeat.org/scripts/ps_mem.py

标签:

2010-04-07

archlinux技巧一则

因为在家访问大部分USA的archlinux的镜像都比较慢,后来就改成了Japan的,不过还是比较慢,在LP用PPS的时候一般下载速度只有3KiB/s左右。于是就找了几个国内的,sync了一下后居然提示没啥好更新的(本来有30MB以上的文件需要下载),想来可能是国内这几个镜像未必是同步更新的缘故。

切换了回去以后发现已然如故,还是提示没有更新。今天sync的时候发现community有更新,然后便诡异的报告某些依赖无法解决,而在切换镜像之前这些都是好好的。可能是某些记录没有更新。

$ sudo find /var/lib/pacman/sync/ -type f \
-name .lastupdate -exec rm -f {} \;


重新 sudo pacman -Syu 即可。

标签:

2010-01-06

随机密码生成器

花了一天时间用Bash写了个生成随机密码的脚本。生成的密码符合以下条件:

  1. 长度为8~20个字符;

  2. 包含至少一个大写字母;

  3. 包含至少一个小写字母;

  4. 包含至少一个数字;

  5. 包含至少一个特殊字符。


总的来说,我还是比较喜欢这个脚本的,够简单也够简洁。
PW_LEN=$((8 + (RANDOM % 12)))
DIGITS='0 1 2 3 4 5 6 7 8 9'
LCHARS='a b c d e f g h i j k l m n o p q r s t u v w x y z'
UCHARS='A B C D E F G H I J K L M N O P Q R S T U V W X Y Z'
SCHARS='! @ # $ % ^ & ` ( ) { } [ ] ; : " , . < > ? / \ | ~'

DISPTB=(DIGITS LCHARS UCHARS SCHARS)
DISPTB_LEN=${#DISPTB[*]}

# randomly select one character from randomly selected char table
function random_select()
{
local table=${DISPTB[$((RANDOM % DISPTB_LEN))]}
local n_ele=
local clist=

eval clist=(\$$table) # clist contains char table
n_ele=${#clist[*]} # length of array `clist'

echo -n ${clist[$((RANDOM % n_ele))]}
}

function pwgen()
{
local passwd=

for ((cnt=0; cnt<PW_LEN; cnt++)); do
passwd=$passwd random_select
done

echo $passwd
}

# check whether given password conforms to policy
function is_valid()
{
local pw_len=$(expr length "$1")
local nr_lower=$(echo "$1" | fold -w1 | grep -c '[[:lower:]]')
local nr_upper=$(echo "$1" | fold -w1 | grep -c '[[:upper:]]')
local nr_digit=$(echo "$1" | fold -w1 | grep -c '[[:digit:]]')
local nr_schar=$((pw_len - nr_lower - nr_upper - nr_digit))

[ $nr_lower -eq 0 -o $nr_upper -eq 0 -o \
$nr_digit -eq 0 -o $nr_schar -eq 0 ] && return 1

return 0
}

while true; do
pw=$(pwgen); if is_valid "$pw"; then
echo "$pw"; exit 0
fi
done

标签: ,

2009-07-20

Ubuntu - The Killing App of Linux Platform

第一次正式接触的Linux发行版是RedHat 7.1,2002年。后来用的比较长时间的是RedHat 7.3,因为只有在那个版本我才能使我台式机的内猫正常工作。后来用奖学金买了RedHat 7.3/8.0,价格都是RMB 68,但基本上都是给同学安装了。实习后买了本本,开始装的SuSE,而放在老家的台式机上跑的是Debian 3.0。后来转向ubuntu,从5.10至今,一直apt-get dist-upgrade到Jaunty 9.04,基本没有出现任何问题。

当年TA问我为什么用ubuntu,是不是因为它polished,我说不是,只是用着比较方便、顺手 -- 我不想回到手工配置一切,到处找驱动的时代。实际上,过去的一年多我的本本里面就跑了个wmii,怎么看怎么原始,但是方便、快捷,还自我感觉有点酷。

前几天开机发现fsck,不放心,于是重新格式化硬盘,重装了系统。试了ArchLinux, Debian,最后还是用了ubuntu。装完之后才发现原来如今的ubuntu看上去已经如此养眼。有句话是这么说的:You can't sell a platform without a killing app on it.  Linux内核无论做的多么牛B,如果没有杀手级应用,那么也仅仅寥胜于无吧。用ubuntu作桌面系统无疑是让人快乐的,我又从wmii回到Gnome桌面。

标签:

2009-07-03

valgrind against glib

上午同事说valgrind在扫描基于glib的程序时有些明显的内存泄漏没有报过出来。有点不相信,因为之前每次怀疑valgrind的时候最终总是证明是自己的代码写的不对。于是,将信将疑之下用valgrind扫了一下下面的程序:
GList* list = NULL;
GList* i = NULL;

list = g_list_append(list, g_strdup("first"));
list = g_list_append(list, g_strdup("second"));

for(i = list; i != NULL; i = g_list_next(i)){
printf("%s\n", (char *)i->data);
}

令人难以置信的是,其结果居然是:
==6509== LEAK SUMMARY:
==6509== definitely lost: 0 bytes in 0 blocks.
==6509== possibly lost: 0 bytes in 0 blocks.
==6509== still reachable: 4,569 bytes in 10 blocks.
==6509== suppressed: 0 bytes in 0 blocks.


两次g_strdup()出来的内存显然没有释放,而且链表本身占有的内存也没有释放,但valgrind的definitely/possibly lost居然都是0!如果把上面的printf()函数换成glib里面的g_print()函数,结果又有所变化:
==6519== LEAK SUMMARY:
==6519== definitely lost: 0 bytes in 0 blocks.
==6519== possibly lost: 744 bytes in 3 blocks.
==6519== still reachable: 5,407 bytes in 18 blocks.
==6519== suppressed: 0 bytes in 0 blocks.


这次不但多了744字节的possibly lost,还多出了838字节的still reachable。Google了一把,发现这个问题似乎和glib的slice allocator有关系。参考这里。如果想让valgrind展现出正确的行为,请将环境变量G_SLICE设为always-malloc。


# G_SLICE=always-malloc valgrind --leak-check=yes ./foo
...
==6522== LEAK SUMMARY:
==6522== definitely lost: 12 bytes in 1 blocks.
==6522== indirectly lost: 25 bytes in 3 blocks.
==6522== possibly lost: 0 bytes in 0 blocks.
==6522== still reachable: 1,638 bytes in 9 blocks.
==6522== suppressed: 0 bytes in 0 blocks.

标签: ,

2009-07-02

X11 forwarding in Arch

ArchLinux里sshd的X11 forwarding默认似乎没有打开。嗯,那就修改一下/etc/ssh/sshd_config吧。
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes

标签:

2009-06-01

iwconfig

这几天网络常常莫名奇妙的会断掉,考虑到LP仍然能正常上网,这应该不是AP的问题。有点怀疑自己本本的无线网卡是不是大限将至。重载ipw2200后再重启网络,似乎一切又恢复正常。只是过段时间后,复又如是,莫名其妙。

刚突然想起,搬到新家后周围有个无线网络的essid和咱的一样,都是"TP-LINK" -- 懒人遇上懒人了。怀着“死马当活马医”的心理,把:
iwconfig eth1 essid "TP-LINK" key s:******


改成:
iwconfig eth1 ap 00:1D:0F:XX:YY:ZZ key s:******


暂时似乎一切OK.

标签:

2009-05-26

Linux和习惯

早已习惯了在GNU/Linux下工作,至于是哪个发行版,虽然不太重要,但是个人还是倾向于基于deb的系统。有段时间常玩FreeBSD,但终究因为习惯问题,还是放弃了 -- 留下两个最大的好印象:

  1. Port系统对Makefile的使用很是美妙;

  2. 其系统工具的源代码看起来都比较易读、工整(看GNU的源代码有时会有点摸不着头脑)。


最近LP开始接触vi,常抱怨其是多么的难用。
“那是方便、高效的编辑器,只是你还没有习惯而已。”

“有鼠标才高效呢!”

同时,借机教LP写脚本,鼓吹有了脚本世界是多么多么精彩。收效为零 -- “帮我装个vnc吧!在那个黑乎乎的窗口下我的脑子都是空白的。”

习惯会很容易的影响自己的行为方式和思维方式,很多时候它会成为吸取新知的阻碍。LP之于Linux或许正如我自己之于BSD,都以为自己手中现在的tool-chain是最棒的,虽然对另外一个世界还一无所知。

标签:

2009-04-13

git-svn

有段时间常用git,而公司采用的是svn,本人最爱的则是hg -- 用于管理平时和临时的一些代码。后来找到个工具:git-svn - 用git管理svn仓库。

克隆代码仓库:
# git-svn clone http://sample-project/trunk

抓取远程更新:
# git-svn fetch

上面的命令并不等同于 git-pull,我们还需要下面的命令更新本地仓库:
# git-svn rebase (或 git rebase git-svn)

签入修改到本地仓库:
# git-commit

将改动push到远程仓库:
# git-svn dcommit

标签:

2008-11-05

less is more

试着在desktop上把一个基本的archLinux一步步变成我习惯的系统后,我发现laptop中现在仅有的2.1GB其实并不大。于是也打消了把笔记本上的ubuntu变成archLinux的念头 -- 主要是比较喜欢apt系统。

GNOME已经完全干掉了,包括GDM,现在系统中只有一个库和GNOME有关,那就是libxml2。剩下libgtk2.0和libwxgtk2.6,算是最基本的必需品了。

一个比较有意思的现象:删掉GDM后,startx进入wmii,发现敲键盘没反应。搜索了一下,似乎和HAL以及DBUS相关。在X11的日志中可以发现如下典型信息:
(EE) config/hal: couldn't initialise context: (null) ((null))
要解决也不难,重新安装hal就行了。
# sudo apt-get install hal

hald启动了以后再startx,一切就OK了。

标签:

2008-11-04

df -h

``df -h''的结果告诉我系统中根目录已经占用了2.3GB空间,其中1.3GB占用情况如下:
43M stardict
62M emacs
65M plt
77M acroread
92M texmf
149M fonts
186M openoffice
200M GCC
216M texmf-texlive
223M doc (/usr/share/doc)

我想不出来还有什么比较占空间的东西,竟然一下子塞满了1GB。一个基本的系统一般也就500MB左右,那么剩下的500MB究竟是什么呢?开发库?

标签:

2008-10-31

underrun on pipe B!

将ubuntu升级到intrepid后Xserver似乎有点问题,这一点从GDM的闪烁可以看得出来。X11程序运行有点迟钝 -- 而本来我的wmii窗口管理器有运行如飞的感觉。网上随便一搜,果然这是intel集成显卡驱动的问题。典型的,在X的日志里面有如下信息:
(EE) intel(0): underrun on pipe B!

一直想把ubuntu换成archLinux,不过懒的折腾。将就着吧。

标签:

2008-09-21

wmii tips

wmii最酷的地方在于它的设计理念,从Plan 9 "偷"过来的:control via filesystem interface. wmii提供了一个虚拟文件系统,它可以通过9P协议的create, read, ls, remove, rm, write来访问,从而完成对wmii的各种配置。这种进程间通信方式完全独立于语言,并且极其简单。比如:
# wmiir ls /
client/
colrules
ctl
event
keys
lbar/
rbar/
tag/
tagrules

# wmiir read /rbar/status
RX: 5.2 MB TX: 1.1 MB | 0.16 0.17 0.22 | Sun Sep 21 21:25:28 CST 2008
1. wmii的配置文件
wmii的全局配置文件在 /etc/X11/wmii-x.y/ 下,下面有两个文件 rc.wmii,还有 wmiirc。但大部分时候后者才是有效的,在系统总存在Plan 9运行时的情况下则启用前者。吾开始没主意,屁颠屁颠的修改 rc.wmii,没有任何作用,甚为郁闷。

2. 为wmii添加命令
快捷键Modkey-a使得wmii列出wmii快捷命令,默认有exec, rehash, wmiirc等等。在任何一个wmii配置文件所在目录下放置一个可执行文件,都会使得系统中多一条命令,命令名即为可执行文件的文件名。比如我在 $HOME/.wmii-3.5/ 下放置了一个名为`lock'的脚本:
#!/bin/sh
# lock the screen

xscreensaver -no-splash &
xscreensaver-command --lock
这样modkey-a中便会列出`lock', 选中它执行之,便会锁定屏幕。

3.1 键绑定 - MODKEY
和多数TWM一样,wmii默认快捷键的主键是modkey,当MODKEY=mod1时,modkey-a便是`ALT-a',这是默认设置,设成mod1时在PC上很不方便,不妨将其设为mod4,也就是窗口键。

3.2 键绑定 - 添加绑定
为wmii添加键绑定同样相当直观且方便。在 wmiirc 文件中的 "key bindings"区域(100行左右)添加一条就是了。规则为:
Key keybinding
command
比如:
key $MODKEY-u
foobar
保存以下,modkey-a执行wmiir,使得配置生效,然后modkey-u便会执行命令`foobar'。

3.3 键绑定 - 音效键
用Gnome的时候笔记本上的音效键工作的相当完美。换到wmii后则仿佛回到刀耕火种,茹毛饮血时代。开始添加了一个命令到`alsamixer',感觉还是很不方便,于是我想着怎么让音效键也工作。其实,很简单 -- 步骤如下:
a) 运行 xev 找到音效键的键码,我的系统中是这样:静音(160),降低(174),增高(176)。
b) 运行 xmodmap 添加键盘布局设置。
# cat ~/.Xmodmap; xmodmap ~/.Xmodmap
keycode 160 = XF86AudioMute
keycode 174 = XF86AudioLowerVolume
keycode 176 = XF86AudioRaiseVolume
最后,在wmiirc下添加如下绑定:
Key XF86AudioLowerVolume
amixer -c 0 set PCM 2dB-
Key XF86AudioRaiseVolume
amixer -c 0 set PCM 2dB+
Key XF86AudioMute
amixer -c 0 set PCM toggle
4. 中文标题
默认wmii选用的字体是'fixed',这样应用程序的标题中如果含有中文则会显示为乱码,修改一下 wmiirc 就行了:
WMII_FONT='-misc-*-medium-r-normal--13-*-*-*-*-*-*-uni'
5. 标签规则
由于wmii是个TWM,这样打开任何应用程序的时候都会试图根据当前平铺模式将其铺满窗口,运行xeye则满屏是个大眼睛,不妥当。系统默认已经添加了mplayer的规则,我们可以添加xev的规则,使得事件测试窗口不铺满屏幕。在tagrules中添加一行:
/Event.*/ -> ~
6. 修改状态条
wmii的状态条有两个lbar, rbar。分别用来控制状态条的左、右面。左面是各个tag,右面则用来当前时间,系统负载:其实就是uptime和date的输出。当然我们可以很方便的加上网卡接收、发送数据的统计,稍微修改一下 wmiirc 脚本中的`status'函数即可。
# Status Bar Info
status() {
echo -n $(ifconfig eth1 | awk -F "[)(]" '/RX bytes/{print "RX:",$2}') \
$(ifconfig eth1 | awk -F "[)(]" '/TX bytes/{print "TX:",$4}') \
'|' $(uptime | sed 's/.*://; s/,//g') \
'|' $(date)
}

标签:

2008-08-02

signature

``sudo dpkg-reconfigure fontconfig-config''了一把,使得字体对LED屏幕优化,顺便又安装了文泉驿字体,现在系统的字体看起来很舒服。因为对字体的好奇,搜到一篇好文章,``The Beauty of LaTeX''. 按图索骥,我用LaTeX做了个signature:

重点不在于色彩,而是对`kerning'的演示。Kerning is the process of selectively adjusting the spacing between letters pairs to improve the overall appearance of text.

标签:

2008-06-20

dwm

从dwm-tools顺藤摸瓜,顺便关注了一下dwm,发现xmonad的快捷键设置和dwm完全一样。这是一个相当小巧的窗口管理器,4.7版本的源代码才2100多行,很值得仔细阅读之。

dwm一个比较另类的设计是,没有配置文件,所有配置需要修改源代码config.h,例如把默认的mod1Mask(alt键)改成mod4Mask(win键)。apt-get source抓下源代码,修改一下配置后dpkg-buildpackage便会创建新的deb包。

dwm原来所在站点是dwm.suckless.org,今天似乎不能访问。看了一下邮件列表,原来正在迁移到新的server。`suckless'这个域名很有意思,让我想起Mutt主页上的一句话:
"All mail clients suck. This one just sucks less." - me, circa 1995

没有最好,只有更好。做到suckless其实真的很不容易。

标签:

Xmonad

开始对自己的12.1寸小本有所抱怨,因为将屏幕垂直分割成两屏看代码时便显得有点拥簇。想来自己只需要三个窗口:Firefox, Emacs和Terminal。Firefox3的全屏功能非常棒,至于Emacs我也早已关掉menu-bar和tool-bar。作为一个习惯于全键盘操作的用户,Gnome的panel对我来说实在没有什么吸引力,于是去找键盘友好的窗口管理器。

早就在reddit上看见xmonad,于是apt-cache search了一把,居然命中。于是安装之。启动后Gnome桌面背景会消失,可以用xsetbg命令自己设置一个,要想每次登录后自动生效可以将该命令写在~/.xprofile文件中。

xmonad的默认功能键mod是alt键,这样用Emacs或者bash的时候都不怎么爽。可以把它改成win键,只要在~/.xmonad/xmonad.hs添加如下Haskell代码:

import XMonad

main = xmonad $ defaultConfig
{ modMask = mod4Mask }

注意的是,光有该配置文件还不够,它需要libghc6-xmonad-dev等等。要安装它实际上会一起安装ghc,比较主流的Haskell解释/编译器。重启,登录后配置便会生效。这时~/.xmonad/目录下会多出三个文件:xmonad.hi xmonad-i386-linux xmonad.o

如果确信自己不会再修改配置,可以把ghc等删除,只留下xmonad。这样会节省144MB硬盘空间。另外,一个不可不装的程序是dwm-tools, 有了它后,mod-p会启动dmenu。最后,因为没有了gnome-panel,看系统时间不方便,可以在Emacs的启动文件中添加一行:
(display-time-mode t)

更多键绑定,可以参考man xmonad。

标签:

2008-03-14

Free Software Easter Eggs

来源:http://www.freesoftwaremagazine.com/
  1. Firefox地址栏中输入:“about:mozilla”
  2. 如果你装了bsdmainutils,看看/usr/share/calendar/下的文件。
  3. 在vim的命令方式“:help 42”
  4. zenity --about,选中跳出来的信息框,然后敲入“zen”
  5. 如果装了OpenOffice,运行oocalc,然后输入“=STARCALCTEAM()”回车;还可以试试“=GAME("StarWars")”
  6. 在terminal中运行aptitude,然后按ctrl-t,有个“Play Minesweeper”
  7. 在Gnome下按alt-f2,然后输入“gegls from outer space”,回车之
  8. 命令行中输入“apt-get moo”

标签:

2007-01-19

Wine.Glibc.Mawk

这几天没有文字,因为生活得比较充实而没有多少无聊的时间。不过
无论如何,流水账总是还要记的。

前天得知阿福答辩通过后老大立马约我们出来喝酒,以示庆祝,并又
约好了下次再聚的大致时间。坦而言之,我对有阿奕这样的老大感到
非常幸运,而且我知道这种幸运甚至是别人无法理解的。仍旧是那条
双栅子街,还是那家"回头串串",此时的每一刻对于将来或许是一种
奢侈,因为岁月流逝以后找不回的往往是心态以及感觉。

昨天开始正儿八经地阅读glibc-2.4代码,并一边开始写笔记。老鄢
辛苦地挤出一点OT时间在他的Yspace上开了hg仓库,于是一起分析,
交流,然后共享用LaTeX整出来的笔记。再一次,我感觉到了幸运:
有一个志同道合的人一起做感兴趣的事,快亦快哉,夫复何求!

在ubuntu 6.10上编译glibc有点问题,源代码里面的文档建议用gcc
版本4,我用4.1.2。后来发现问题出自awk,ubuntu默认自带的其实
是mawk,后来用gawk取代之,很快就开始顺利编译了。还有一个问题
以前编译内核时碰到过,ubuntu的gcc 4.1.2默认打开了堆栈检查。
对于glibc-2.4,configure的时候--enable-shared能绕过该问题。

Google了一下,这里有比较好的信息:
https://wiki.ubuntu.com/GccSsp

标签: