换来换去

过去一直以为

foo | bar

bar <(foo)

是一样的,但最近才知道并非如此.

看以下两个命令的输出区别:

bigsnake-net@bigsnake-host:~$ echo <(echo foo)
/dev/fd/63
bigsnake-net@bigsnake-host:~$ echo foo | echo
(a new line)

查了bash的man,发现原来是这样:

<(foo)

就是在一个子shell中运行foo,并用括号中命令的stdout的文件标识替换<(foo),换句话说,这是一个参数替换.

这个代码可以更清楚的显示这一点:

bigsnake-net@bigsnake-host:~$ cat - <(echo bar)
foo(press Enter here)
foo(press Ctrl-D here)
bar

此外还有很多这一类的替换

替换成 foo 的 stdin 标识符:

>(foo)

替换成 foo 的 stdin 输出,跟`foo` 差不多,但可以嵌套:

$(foo)

如果是

$(cat file)

那么等价的

$(< file)

会更高效

加上某些特别命令的帮助我们可以让输入输出流跑来跑去,例如用tee可以将一个标准输入发送到多个命令:

bigsnake-net@bigsnake-host:~$ cat report | tee >(file - > a ) | tee >(wc -l > b ) | tee >(grep '0' - > c ) |cat > /dev/null
bigsnake-net@bigsnake-host:~$ cat a
/dev/stdin: UTF-8 Unicode text
bigsnake-net@bigsnake-host:~$ cat b
41
bigsnake-net@bigsnake-host:~$ cat c
              0 如果X不需执行
如果操作串数量比较小,这个方法可行.但操作串数目最多达100000,所以要作优化
实际上,此图极其稀疏 ( 500000/(10000*10000)=0.005 ),幸运的是,题目数据只给出了可行的路

IRSSI - 功能完善的CLI IRC客户端

近日从XChat转到了IRSSI,命令行真是强大...

有消息时响铃,设置 beep 和 bell 的相关选项
awaylog功能可以在你unaway时打出你away时收到的信息
支持滚屏,log,自动登录,高亮等等

详情参看http://irssi.org/


XMMS2

很长时间以来我都在使用xmms这个短小精悍的播放器,虽然有乱码的情况但也不难解决.最近心血来潮尝试了它的第二代:XMMS2.发现虽然没有XMMS这个老东西成熟,但也是很不错的.

XMMS2的源码deb包很容易就Google到,这里就不详述安装了.

由于XMMS2是个C/S程序(音乐播放器弄成C/S..是不是有点变态了),所以有很多的客户选择,但尝试了几个,觉得还是自带的CLI客户端好用,这里是几钟最常用的命令

播放:    xmms2 play
停止:    xmms2 stop
列出列表: xmms2 list
加入列表: xmms2 add <path>
退出:    xmms2 quit

其他的就自己man吧

xmms2有个addpls的加载列表功能,但是并不好用(在我这里出错,可能是某些我不知道的问题),我就用这个来代替:

cat playlist | xargs -I '{}' xmms2 add "{}"

花花提供了另一种方法..分割行很有用:

cat playlist | while read e; do xmms2 add "$e"; done

更多的设置可以使用

xmms2 config <key> <value>

例如我就改了这些设置项

playlist.repeat_all = 1
playlist.repeat_one = 0
output.buffersize = 65536

更多设置项可以用xmms2 config_list查询

此外xmms2虽然有循环播放的功能(playlist.repeat_all = 1),但我找不到乱序播放的选项,虽然有 xmms2 shuffle 的打乱列表命令,但只能手动执行,所以我又写了个脚本:

#!/bin/bash
#
# xmms2-shuffle, shuffle the playlist of xmms2 automatically.
#

while [[ "" != $(ps -e|grep 'xmms2d') ]] ; do
    xmms2 shuffle;
    #(date;xmms2 list)>> /home/bigsnake-net/MyMusic/xmms2shu.log ; # debug code
    $(xmms2 list|tail -1|tr -d ' '|awk -F: '{ print "export Total_Hour="$2 " Total_Minute="$3}');
    Total_Minute=$((60 * ${Total_Hour} + ${Total_Minute}));
    if ([[ ${Total_Minute} 

然后在在xmms2的启动脚本(~/.config/xmms2/startup.d/)和退出脚本(~/config/xmms2/shutdown.d/)加入相应的启动和杀死脚本即可:

.config/xmms2/startup.d/xmms2-shuffle-start.sh

#!/bin/sh

exec ~/bin/xmms2-shuffle

.config/xmms2/shutdown.d/xmms2-shuffle-kill.sh:

#!/bin/sh

killall -9 xmms2-shuffle

用 if..else 实现选择结构的隐蔽问题

看这段代码:

                if maxmin[i]<maxmin[ord(caplist[1])] then
                begin
                        caplist:=chr(i);
                end;
                if maxmin[i]=maxmin[ord(caplist[1])] then
                        caplist:=caplist+chr(i);

程序的本意是维护一个最优值列表,两个if语句貌似是不可能都执行的,但事实并非如此.
当进入第一个if,caplist被修改后,maxmin[i]=maxmin[ord(caplist[1])]明显成立,所以也会进入第二个if.
问题在于if块中的操作可能会改变判断的条件,因此,遇到这种情况时最好加上else,保证不会进入到多个if块.

                if maxmin[i]<maxmin[ord(caplist[1])] then
                begin
                        caplist:=chr(i);
                end else
                if maxmin[i]=maxmin[ord(caplist[1])] then
                        caplist:=caplist+chr(i);

把终端模拟器换成rxvt了

不满gnome终端太慢,安装了rxvt

sudo apt-get install rxvt-unicode-ml

配置文件 ~/.Xresources

rxvt.scrollBar_right: True
rxvt.geometry:        80x32
rxvt.font:            xft:Courier:size=10,xft:NSimsun:size=12
rxvt.background:      black
rxvt.foreground:      white
rxvt.cursorBlink:     true
rxvt.saveLines:       10000
rxvt.color12:         #AAAAFF
rxvt.cursorColor:     orange
rxvt.termName:        rxvt