2009年12月16日星期三

ccache

有意思的工具,就只有一个可执行的文件 ccache,其功效在于通过 hash 减少重复编译的模块。

现在的用法是将其放到某个 bin 下面,并将 gcc、g++ 等连接通过它做一个符号链接。感觉很神奇,但是现在没有东西有那么大 -,-b

2009年12月10日星期四

skypeproxy

这个工具临时找到的,就是使用 skype 创建 tunnel,需要双方同时使用这个工具。也很简单,命令行上面用 listen 或者 send 连接到对方的 skype 即可。

文件也不多
/usr/share/man/man1
/usr/share/man/man1/skypeproxy.1.gz
/usr/share/doc
/usr/share/doc/README.txt
/usr/share/doc/COPYRIGHT
/usr/share/doc/License.txt
/usr/bin
/usr/bin/skypelisten
/usr/bin/skypeforward
/usr/bin/skypeproxy

2009年10月20日星期二

mdbtools

mdbtools 是为了方便大家使用 MS access 数据库设计的命令行工具,含有下面一些东西:
/usr/bin/mdb-ver
/usr/bin/mdb-hexdump
/usr/bin/mdb-array
/usr/bin/mdb-parsecsv
/usr/bin/mdb-schema
/usr/bin/mdb-prop
/usr/bin/mdb-export
/usr/bin/mdb-header
/usr/bin/mdb-sql
/usr/bin/mdb-tables
/usr/share/man/man1/mdb-ver.1.gz
/usr/share/man/man1/mdb-tables.1.gz
/usr/share/man/man1/mdb-schema.1.gz
/usr/share/man/man1/mdb-sql.1.gz
/usr/share/man/man1/mdb-export.1.gz
/usr/share/doc/mdbtools/HACKING.gz
/usr/share/doc/mdbtools/AUTHORS
/usr/share/doc/mdbtools/changelog.Debian.gz
/usr/share/doc/mdbtools/copyright
/usr/share/doc/mdbtools/README
/usr/share/doc/mdbtools/NEWS.gz
/usr/share/doc/mdbtools/changelog.gz
/usr/share/doc/mdbtools/TODO
其中,mdb-ver 返回 mdb 文件的版本信息,mdb-schema 产生 schema,mdb-sql 用 SQL 查询 mdb,mdb-export 将 mdb 转换成为 CSV 文件,mdb-tables 返回一个 mdb 文件里面的表。

2009年9月4日星期五

sdl-ball

这个游戏就是那传统的敲砖头的 SDL 版本,花得不行啦。


在 debian 里面是 sdl-ball 和 sdl-ball-data 两个 package,
/usr/games/sdl-ball
/usr/share/applications/sdl-ball.desktop
/usr/share/doc/sdl-ball/copyright
/usr/share/doc/sdl-ball/changelog.Debian.gz
/usr/share/doc/sdl-ball/changelog.gz
/usr/share/pixmaps/sdl-ball.png
/usr/share/pixmaps/sdl-ball.xpm
/usr/share/man/man6/sdl-ball.6.gz
/usr/share/menu/sdl-ball
这里我们可以看见很简单的结构,一个是 /usr/share/application 里面放的 .desktop 文件其实是所谓的快捷方式,比如 gnome 里面在桌面上创建的 launcher 就是这类文件。另外就是在 /usr/share/menu 里面的,这是放在 gnome 的菜单里面的?不过似乎里面有个 Games/Action,在 GNOME 里面没看这么细的分类...

很简单,蓝的绿的赶紧捡,红色的不能要,特别是骷髅头,可以用鼠标和键盘,感觉鼠标好用点...

2009年8月23日星期日

GNUWin32

这是一个致力于把 Linux 下面一些常用的程序及其库 port 到 Win32 环境下面的项目,原来在 sourceforge 上只能每个程序分别下载,想过把瘾很难,一般只下载最需要的程序,比如 wget,现在有了一个自动下载的程序那是爽快多了,其实主要的方法还是 wget。

这个项目也应验了一个使用 C/C++ 编写程序面临的最大问题,那就是 dll hell,在 Windows 里面这个问题显得格外的突出,因为到现在为止,尚未找到有类似 Linux 下面的 deb 或者 rpm 的包管理系统。因此即便对现在的项目,我们下载了那些程序也不能保证其依赖关系没有冲突。下面我们选择这些项目里面比较有意思的学习一下,其实从另外一个侧面了解 Linux 下面那些优秀的命令行工具如何 work 的。

这个项目的绝大部分程序应该是使用 mingw32 这种原生的 C/C++ 编译器获得的,比起在虚拟机上运行的程序,性能自然是不必多说了。为了更好地了解这些程序,下面我们将它们进行分类。

格式转换
  • a2ps 将文本等格式转换成 ps,或者将 ps 输出到打印机。似乎不很好玩...
  • ascii_chart 将数据转换成为柱状图,支持多种图片格式。太简单了,也许生成 CGI 图片还可以...
  • barcode 将字符串用条形码编码,输出是一个 ps 文件,这个挺不错的,支持多种编码方式,记得原来上机用的那个卡就是用很简单的条形码做的,这个要用了就能做出别人的条形码了 orz
  • bm2font 估计是很古老的将图片转换成为 TeX font 的程序了...
  • bmp2png 言简意赅...
  • deroff 将 roff 文件格式中的一些关键字去掉
  • dvidj 打印 dvi 文件
  • enscript 文本转换为 ps
  • fax2png 这也很明显了... 其实是 tiff 和 png 的转换
  • gd 不知道是做啥的 -,-bbb
  • grap 将某种格式的 graph 描述转换成 LaTeX 的 pic 格式。
  • gri 做图程序,也是写个程序画图...
  • hp2xx 是把 hpgl 转换成矢量图形的程序。
  • imgtops2 将图片转换成为 ps 文件。
  • imgvtopgm 将 pilot image viewer 格式和 pgm 互相转换,提供相关文件信息。
  • jbigkit 提供 jbg 到 pbm 的转换。
  • jpeg2ps 提供 jpg 到 ps 的转换。
  • nenscript 将 ASCII 转换成为 ps。
  • netpbm 处理 pbm 格式的工具。
  • pbmadd 还是 pbm 的工具。
  • pdflib-lite 提供的是图片转换到 pdf 的功能以及多个 pdf 合并。
  • piechart 画饼图。
  • plotutils 一些作图的基本工具,如样条、字符等。
  • pngutils 一些跟 png 相关的小工具。
  • polyglotman 将 man 转换成其它格式。
  • psmark 在 ps 文件边上竖写一行字。
  • psutils 提供一些 ps 处理的常用命令。
  • scribe2latex,将 scribe 格式转换成 latex 代码。
  • sgitools 提供了一堆图形转换的工具。
  • t1lib、t1utils 提供处理 type 1 字体的程序。
  • ttf2pt1 提供将 ttf 字体转换成 type 1 的功能。
  • unrtf 将 RTF 格式转换成为其他格式。
  • urt 提供 ULE 文件格式的转换、操纵能力。
  • wv 提供将 doc 文件转换成为其他类型(如 PDF )的能力。
  • xpdf 提供了处理 PDF 文件的一般功能,但是可惜没有 Linux 下面的那个浏览器。
  • xpm2wico 将 xpm 转换成为 ico 文件。

压缩与解压缩
arc, arj, bsdtar, gzip, lha, mscompress, shareutil(编码二进制文件以便通过 email 发送), tar(打包), unrar(解压 rar), unzip(解压 .zip 文件), zimg, zip
compface 似乎针对某种图像的,没玩过...

获取信息
  • attr 获得 NTFS 文件系统的信息,似乎没啥用 -,-bb
  • bc 原来在这里也介绍过,是个简易计算器,嗯,不喜欢用鼠标点 Windows 的 calc 的同志可以考虑。
  • calc 语法和 C 接近的计算器,似乎比 bc 友善和强大。
  • cpuid 获得 cpu 信息,看起来比一般的测试 cpu 信息的程序都小很多...
  • dmidecode 用来解码 bios 信息的工具。
  • freetype 处理字体的工具,不过似乎在 Windows 下面不好用?
  • gcal 获得日历。
  • hodie 打印 latin 格式的日期。
  • id-utils 建立文件的 id 数据库?不知道具体怎么用...
  • jwhois 是一个 whois 的 client。
  • texinfo 是建立 info 帮助系统和浏览的工具。
  • units 提供单位转换功能。
  • x86info 提供 x86 系统信息,如 CPU 等。


编程
  • autoconf, automake 似乎就是 shell 脚本
  • awka,把 awk 程序翻译成 C 程序,这个比较好玩,简单的正则表达式可以容易的写成 C 程序了
  • bison 是兼容 yacc 的 parser,搞编译器的人应该都知道
  • btyacc 另外一种 yacc
  • cpp 和 cppi 都是 C 的预处理程序相关。
  • cproto 产生 C 的函数原型,估计可以用来自动生成 .h?
  • diffutils 一个是 diff 一个是 patch。最常用的看修改过什么的工具了...
  • fdlibm 是一个 C 的数学库。
  • flex 是个词法分析器。
  • gdbm 是 GNU 的数据库管理
  • gettext 就是著名的多语言支持的库以及支撑程序了。
  • giflib/libungif 是一个用来处理 GIF 图片格式的 C 语言库,包括一些 GIF 的小工具,比如裁剪、提供相关信息,转换文件格式等等。
  • gperf,嗯,提供程序执行的性能的程序,优化程序的时候使用。
  • groff 写 man page 的东西。
  • gsl 就是 GNU 科学计算库。
  • hello 似乎是写程序的示例程序,虽然说很简单,但是可以被初学者用来学者维护代码之类的使用。
  • help2man,帮助建立一个简单的 man page,从程序的 --help 输出。
  • hex2bin 和 hextools 提供将二进制文件转换到 hex 格式,然后逆向转换功能,这个跟 ultraedit 的二进制文件编辑功能类似,只是用两步进行的。
  • indent 将 C 程序代码进行缩进。
  • jpeg 是 libjpeg 一个 C 的 jpeg 库。
  • libart 是一个矢量作图的库,似乎是 GNOME 里面的一个项目
  • libconfig 提供一个统一的存储配置的方案。
  • libgw32c... 不知道干啥的。
  • libiconv、libintl 是 gettext 的一部分。
  • libopennet 处理 URL 的库。
  • libpaper 打印使用的纸张配置。
  • libpng 处理 png 文件的库。
  • libtool 提供 libtool 工具。
  • libutf 提供 C 语言的 utf8 支持。
  • libwmf 提供对 wmf 格式的支持。
  • libxmi 提供渲染 2D 对象的 C/C++ 接口。
  • libxml2 是一个 xml 的 parser。
  • libxslt 是一个 xslt 的库,用于对 xml 进行转换。
  • m4 是宏语言 m4。
  • make 提供了 GNU make。
  • openssl 提供了 openssl 命令及其相关的库。
  • patch 提供了给程序打补丁的功能。
  • pdcurses 是一个 terminal 的库。
  • popt 提供解析命令行参数的 C 库。
  • re2c 将 RE 转换成 C 代码。
  • readline 这是一个标准的用来和用户交互的库,有历史记录等功能。
  • regex、rx、rxspencer 就是正则表达式。
  • sunrpc 产生实现 RPC 的 C 代码的程序。
  • termcap 是编写 terminal 程序的库。
  • tiff 处理 tiff 格式的库和相关工具。
  • troff 和 groff 类似。
  • xpm 提供 xpm 处理的 C 库。
  • zlib 压缩用的库。

shell 相关
  • chsuf 用于批量修改文件后缀
  • coreutils 这里也介绍了,最实用的系列程序
  • cpio 传统程序,没用过 -,-b
  • crypt 用于产生那个 shadow 里面的 hash 结果。
  • cygutils 包括几个 cygwin 里面的小工具,如 dos 和 unix 格式转换,打印 ascii 字符表等。
  • diction 似乎是做某些输入规则的检查。
  • doschk 检查文件名的 dos 兼容性
  • ed 和 edll 两个文件编辑器,功能... 如果你喜欢 Unix 的话...
  • file 检测文件类型。
  • filetype 似乎还不如 file。
  • findutils 提供 locate、find 和 xargs。
  • gawk 提供 awk。
  • gengetopt 为 C 程序生成一个命令行参数的 parser,使用的 GNU libc 的那个 getopt 系列的实现的。
  • grep 这个就不用说了,著名程序之一。
  • gsar,和 grep 类似,但是是将所有文件当作二进制来处理的,允许进行替换。
  • less 是一个 pager。
  • libarchives 提供 bsd 的 tar 和 cpio 命令。
  • mawk、nawk 提供了 awk 的一个变体。
  • minised 提供了一个 sed 的简化版。
  • mktemp 创建临时文件夹。
  • ntfsprog 一些 NTFS 的工具。
  • pcregrep 提供了一个和 perl 的 RE 一样的 grep。
  • rpl 使用 RE 进行多文件的替换。
  • sed 就是那个著名的流编辑器、
  • sgrep 还是 grep。
  • src-highlite 代码高亮,与 page 一起用。
  • tre 是一个类似 grep 的东西,提供的是近似匹配。
  • tree 获得树状目录结构。
  • util-linux 提供一些常用的 Linux 命令,如 whereis 等。
  • wget 命令行下载功能。
  • which 提供 which 命令。

游戏
chess 国际象棋的计算引擎。
crafty 另一个国际象棋引擎。

2009年2月28日星期六

GNU octave (Part I)

最近用了一次 octave 感觉很不错,和 Matlab 越来越像了,图形也做的很顺手了。加上它小巧(相对于 Matlab 而言),对 Matlab 的了解使我能很容易上手。顺便找了一下,manual 写的很详尽(我看的 3.1 版本的接近 600 pages),常用的功能都有。扫了一下主页,感觉还是很活跃的,于是下定决心好好研究一下,正好和 Matlab 比较促进我对 Matlab 的进一步了解。

就我观察,octave 不同版本号之间差异比较大,我现在说的 3.1 应该是和 Matlab 最接近的,而 2.x 还离得很远,这里我先就一些基本的问题说明一下。debian 里面 octave 一般分成下面几个 package,
  • octave*.*,这是 octave 的主程序(还有一个汇报 bug 的程序)所在,常用的函数一般有二进制版本(称为 built-in 函数)放在 /usr/lib/octave/version/oct/arch/*.oct。
  • octave*.*-common 里面主要是常用工具箱,m 文件多在 /usr/share/octave/version/m/toolbox-name/*.m。
  • octave*.*-doc 里面是文档,我现在就使用的 3.1 系列的文档。
  • octave*.*-htmldoc 还是文档。
下面这些类似于 toolbox 的东西来自 octave-forge 项目,
  • octave-ad 自动前向微商。
  • octave-audio 处理音频。
  • octave-bioinfo 处理生物信息学。
  • octave-combinatorics 组合学。
  • octave-comminiations 信号处理、通信。
  • octave-control 控制理论。
  • octave-data-smoothing 数据平滑化(似乎是用 Tikhonov regularizer?)。
  • octave-econometrics 度量经济学。
  • octave-epstk 生成 eps 文件。
  • octave-financial 金融工具箱。
  • octave-fixed 计算 fixed point。
  • octave-ftp 在 octave 里面使用 ftp。
  • octave-ga 就是遗传算法。
  • octave-general 广义函数。
  • octave-graceplot 原来 octave 调用 gnuplot 绘图,这个包用 grace。
  • octave-gsl 提供 GSL 的支持。
  • octave-ident 提供 system identification。
  • octave-image 提供图像处理的功能。
  • octave-informationtheory 提供信息论方面的函数。
  • octave-io 提供输入输出支持。
  • octave-irsa 提供 irregular sampling analysis。
  • octave-linear-algebra 线性代数。
  • octave-miscellaneous 一些杂七杂八的函数,如输出到 latex 等。
  • octave-missing-functions 搜索 octave 里面没有的 matlab 函数。
  • octave-nan 提供处理 NaN 的能力。
  • octave-nnet 前馈神经网络。
  • octave-netcdf 处理 NetCDF 数据。
  • octave-octgpr 散乱数据插值(看起来像 Gaussian process regression)。
  • octave-odebvp 线性常微分方程边值问题。
  • octave-odepkg 常微分方程初值问题。
  • octave-optim 优化工具箱。
  • octave-optiminterp 最优插值。
  • octave-outliers 发现 outlier。
  • octave-parallel 并行计算。
  • octave-pfstools 使用 octave 处理 HDR 图片。
  • octave-phisicalconstants 物理常量。
  • octave-plot 额外的作图工具。
  • octave-plplot 对 PLplot 库的支持。
  • octave-signal 信号处理。
  • octave-sockets 提供 socket 的接口。
  • octave-sp 半定规划。
  • octave-specfun 特殊函数。
  • octave-splines 样条。
  • octave-statistics 统计函数。
  • octave-strings 字符串处理。
  • octave-struct 对结构体的支持。
  • octave-symbolic 符号计算,基于 GiNaC 和 CLN。
  • octave-time 日期时间处理。
  • octave-tsa 时间序列分析。
  • octave-vrml 虚拟现实工具箱。
  • octave-senity 可能和 guide 类似。

以上可见 octave 并不比我们常用的 matlab 缺少很多功能,而且我们相信随着贡献者越来越多,一般科学研究需要的计算可以转交给 octave 来实现。我现在一些小的计算,懒的打开 Matlab,就会用 octave 来处理。数值计算的教学,我觉得有理由离开 Matlab 这个商业软件了。如果说 Scilab 并不顺手,那么 octave 已经不存在这个理由了。

不过,我们在这里还是列举一些 octave 和 Matlab 不同之处(参考这里),
  • 搜索路径应使用 addpath,而不是老版本直接对 LOADPATH 变量赋值。
  • Matlab 不支持 logical array 的 prod,但是 octave 支持。
  • Matlab 不支持对 nargin 赋值,但是 octave 支持。
  • Matlab 启动的时候执行 startup.m,octave 执行 /etc/octave*.conf。
  • Matlab v6 的 mat 文件可以被 octave 读取。v7 的可以被 2.9 之后的读取。
  • 不同长度的字符串在老版本的 octave 里面允许 vercat,而 matlab 不允许。
  • Matlab 允许 ! 开头表示系统调用,octave 只允许使用 system 函数。octave 里面 ! 和 ~ 都表示取反。
  • Matlab 不允许一个字符串和一个字符比较,但 octave 允许。
  • hist.m 函数在 octave 里面有一个 normalization,matlab 没有。
  • 老版本的 octave 通过环境变量 OCTAVE_VERSION 获得版本信息,matlab 和新版的 octave 使用 ver。
  • cell array 和 struct 的显示方是不同。
  • 函数 datastr 曾非常不一致。
  • Matlab 的 load 和 octave 的 load --force 等价。
  • Matlab 可以 load 读取空文件,octave 不允许。
  • Matlab 没有 printf 只有 fprintf 和 sprintf,octave 都有。
  • Matlab 的转置运算符和操作矩阵之间不允许有空格,octave 允许。
  • Matlab 一行分割成几行需要用 ...,octave 可以省略或者用 \ 也行。
  • 逻辑运算里面 Matlab 只允许 & 和 |,octave 允许 && ||(返回标量),和 & | (返回矩阵)。
  • Matlab 用 ^ 表示指数运算,octave 还允许用 **。
  • Matlab 的字符串用 ',octave 还可以用 "。
  • Matlab 结构控制语句都用 end 结束,octave 还允许 end if/for 等。
  • Matlab 调试 dbstep in 在 octave 为 dbstep、dbstep 在 octave 为 dbnext。
  • Matlab 广义特征值用 eig(A, B),在 octave 为 qz( A, B)。
  • Matlab 注释使用 %,octave 还可以使用 #。
  • Matlab 不允许对立即矩阵取 index,即 [ 1 2 3 4]( 3 ) 是不合法的,octave 允许。
  • Matlab 没有 += 这种类型的运算,octave 支持,并还支持 ++ --,和 C 一致。
  • Matlab 在新版本里面实现了 exception handling 和 octave 的 unwind protect 不同。
  • Matlab 实现 OOP 的风格不被 octave 接受。
  • Matlab 使用 private 子目录不被 octave 接受。

后面,我们开始更进一步学习 octave。

2009年2月25日星期三

impressive

impressive 在我的 debian 里面已经 0.10.2r-2 了,现在就连我的破显卡也没什么问题了(当然不是说可以用显卡的 Open GL 加速了,而是说交给了软件 mesa 去渲染了,所以很慢,总比不能渲染好,呵呵)。
/usr/bin/impressive-gettransitions
/usr/share
/usr/share/impressive
/usr/share/impressive/impressive.py
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/impressive.1.gz
/usr/share/man/man1/impressive-gettransitions.1.gz
/usr/share/doc
/usr/share/doc/impressive
/usr/share/doc/impressive/demo.pdf
/usr/share/doc/impressive/impressive.html
/usr/share/doc/impressive/copyright
/usr/share/doc/impressive/demo.tex.gz
/usr/share/doc/impressive/changelog.Debian.gz
/usr/share/python-support
/usr/share/python-support/impressive.dirs
/usr/bin/impressive
这个 python 写的程序很小,主文件就是那个 py,另有一个 impressive-gettransitions 是用于从 beamer 的 tex src 里面提取 info 生成我们需要的配置的。

说起来想法很简单,使用 PyOpenGL 使得在 python 中可以调用 OpenGL,PyGame 是 SDL 库(快速显示),PIL(Python Imaging Library)处理图片,Xpdf 或 GhostScript 渲染 PDF,pdftk 获取 PDF 元信息、xdg-utils 用于呼叫外部的程序(如 Email)以及 MPlayer 播放声音视频。

启动非常方便,直接 impressive ur.pdf 就可以了,这里先介绍特色:
  • overview,按 tab,在回答问题的时候快速定位所需位置
  • hightlight box,鼠标拖动,立即看到高亮区域,右键点击去掉
  • spot light,轻按 enter,追光灯效果,+- 调整圈的大小
  • 黑白屏,B/W
  • L 返回浏览顺序的前一页(不是物理上的前一页)
  • S 保存高亮框、快捷键到 info。
  • T 显示 timer,R 重设 timer。
  • Z 进入 200% 放大,可用鼠标邮件 panning。
  • [] 调整 gamma,{} 调整 black level。
  • Fn 和 Shift+Fn,用于跳转到某页、记住某页。

更多的操纵来自命令行参数,
  • -a 指定自动翻页的时间间隔。
  • -A 指定 render 时候的比例(对宽屏)。
  • -b 不在后台 caching,而在一开始就处理完。
  • -B hightbox 等 fade 的时间。
  • -c 使用 caching 的方式,none 不进行,memory 在内存里,disk 使用一个临时文件,persistent 使用固定的文件。
  • -C 指定 cursor。
  • -d 指定一个 presentation 的长度(将显示一个 progress bar 在下面)。
  • -D 指定 mouse 隐藏的 idle 时间。
  • -f 全屏或者非全屏。
  • -g 指定 render 出来的大小,如 800x600。
  • -G 调整 Gamma 等。
  • -i 开始的页面编号。
  • -I 指定 info。
  • -l 列出所有的 transition。
  • -L 指定 OSD layout。
  • -M 显示 timer 用 minite 做单位。
  • -o 产生文件渲染输出的路径。
  • -O 选择 overview 自动选择模式,off 关闭,first 选择第一页,last 选择最后。
  • -p 指定起始和终止页。
  • -r n 转动 n 个 90 度。
  • -s 缩放图片。
  • -S OSD 字体大小。
  • -t or -T transition 时间,使用的类型。
  • -u poll 使用的 pdf。
  • -w 到尾页回头。
  • -Z zoom 的时间。
  • --cachefile 指定 cache 文件。

更加细腻的控制来自 .info 文件。主要分 PageProps 和一些全局的,稍微重要一点的就是指定 title(显示在 overview 里面)、transition(可以用更花的渐变)、transtime(单独设定渐变时间)、overview(是否显示在 overview)、skip(presentation 时跳过)、boxes(highlight box 的坐标)、timeout(设定停留时间)、comment(显示时的注释)、sound(音频文件)、video(视频文件)、progress(进度条显示否)、reset(是否重置 timer)、rotate 和通过一些事件(OnEnter、OnLeave、OnEnterOnce、OnLeaveOnce)和按键(key)触发 python 函数。

2009年2月24日星期二

几个音频相关的程序

Linux 下面为了规避一些专利,经常会开发一些很好的替代产品,比如 gif 曾经是专利保护的,Linux 下使用很可能涉及到这种很让人 Orz 的专利勒索,结果不能没图片用啊,于是出现了 png。音频处理里面也是,因为 mp3 是专利保护的,为了避免官司,Linux 下面也出现了一些替代 mp3 的格式。这里就从一些这方面东西说起。

谈论到音质,似乎大家最认可的是 CD,CD 和普通的数据光盘的格式是不一样的,上面没有文件系统,如果想做成光盘镜像,dd 是无法实现的。一般用到的工具就是 cdda2wav(现在改用 icedax 了),就是直接从 CD 的音轨转换成 wav。比较高级一点的工具是 cdrdao,这个相当于是整碟拷贝,不过产生的那个 bin/cue (其实一开始生成的是 toc,然后转换)似乎在 Linux 里面没法直接用,倒是 Windows 里面那个 daemon-tools 可以挂载。

CD 有一个编号,可以使用 CDDB 数据库查询获得关于 CD 的很多信息,这个很多相关的程序可以调用。可以用 cddb 这个包提供的命令行接口玩玩。

Linux 里面对付 bin/cue 有一个叫 bchunk 的东西,可以转换成为 ISO 或者 wav/cdr 格式,audio cd 只能转换成为音频文件。使用 cdrdao 的一个好处可能是避免 jitter,另外有一个 paranoia 的工具据说比 cdda2wav 强大也是可以避免 jitter。

下载下来的音乐,存放为 wav 显然比较不合适,一般有有损和无损两种解决方案。FLAC 就是无损的解决方案,就我们实验看来,压缩比在 40-70% 之间,跟文件内容有关系(纯噪声基本压不了),所以最后一张 700Mb 的 CD 就变成 300Mb+ 了。FLAC 提供了存储 CDDB 信息的结构。值得一提的是 FLAC 可以用 OGG 作为容器(oga),这可以用来做 streaming。另有一个 MAC 中用的 Mokey's audio file 格式(.ape),也是无损的,比 FLAC 稍好。

有损的方案里面,比较流行的就是 MP3,这是使用 lame 实现压缩的(其实是 MPEG layer 1 和 2,layer 3 被专利保护了),支持两种可变 bit 编码。开源世界里面的 MP3 的替代品就是 OGG,这在 vorbis-ogg 里面提供了编码解码的工具,现在绝大多数的播放器也支持 OGG,甚至有的 MP3 USB 也支持。OGG 在 -q 3 的时候实现的 110kbps 的编码音质和 MP3 128kbps 编码音质接近,但是体积更小,压缩比接近 10%。使用 -q 0 可以获得更小的码率(50kbps),但是作为通话使用应该是绰绰有余了。OGG 和 MP3 类似也提供了存储 CDDB 信息的结构,也就是传说中的 ID tags。

faad 是 Linux 里面 MP4 的解码程序,但仅仅提供了解码(编码对应为 faac 不知道为啥 debian 里面没有)。sox 是一个音频格式的转换、处理程序,类似有一个视频的转换程序就是大名鼎鼎的 ffmpeg 了。

2009年2月22日星期日

xserver-xephyr

Xephyr 是一个 Xnest 的替代产品,因为 Xnest 不提供现代 X server 的一些高级特性,比如图形加速的支持。简而言之,Xephyr 是一个 X server,但是它执行在一个存在的 X server 里面,这个可以用来做很多事情,比如需要通过 XDMCP 连接到另外一台主机,那么不需要另外打开一个新的 X server;又比如正在写一个 window manager,那么在一个 X server 里面打开的 X server 里面调试,将会比直接在现有的 X server 里面替换现有的 window manager 方便很多。对于热衷于更换自己的 window manager 的狂热爱好者,Xephyr 提供了绝佳的试验环境。

x.org 的 Xephyr 带有下面的东西,
/usr/share/doc/xserver-xephyr/README
/usr/share/doc/xserver-xephyr/copyright
/usr/share/doc/xserver-xephyr/changelog.gz
/usr/share/doc/xserver-xephyr/changelog.Debian.gz
/usr/bin/Xephyr
我们可以直接运行 -help 获得帮助,基本的使用方式是 Xephyr :n -options。这里 :n 是 DISPLAY 的值,Xephyr 本身是一个 X client,也是一个 X server,它是 client 通过环境变量 DISPLAY 设置显示的 X server,这里的 :n 指定的是它作为 X server 的序号,也就是说 X client 可以通过 -display 或者更改环境变量。我们这里简单介绍一些其他的参数,如 -query 和 -indirect 可以用来向打开了 XDMCP 的主机发送连接请求,-screen 指定屏幕大小,-fullscreen 全屏。

比如我们想玩玩 aewm,就可以
$ Xephyr :1 -screen 800x600
$ export DISPLAY=:1.0
$ aewm &

2009年2月19日星期四

gnupg2

前面介绍了 GnuPG,这里介绍她新的版本,新旧之间并非完全不兼容,只是新的版本里面使用了模块化的设计,把一些东西拿出来形成了几个库,下面是相关的程序介绍,
  • gnupg2 主要的命令行程序。
  • gpgsm 实现了和 X.509 相关的命令行程序。
  • gpg-agent 含有 agent(可以用于 1.x)。
  • pinentry* 主要提供一个安全输入 passphrase 的界面,有 gtk2、qt4 和 curses 的版本。
  • libgcrypt 实现了多数对称加密、不对称加密、签名算法。
  • libgpg-error 定义了 gpg、gpgme(一个 C 的库)、gpgsm、gpg-agent 等公用的出错信息。
  • libassuan 是 IPC 的库(进程通讯)。
  • libksba 是 X.509 的库。
  • dirmngr 是目录查询的服务器,主要是 X.509 应用的一部分。

这是 gnupg2 里面的几个命令行程序,
  • kbxutil 用于列出、导出、导入 Keybox 数据。
  • gpg2 主要的命令行程序,跟 gpg 类似。
  • gpgv2 主要用于验证,和 gpgv 类似。
  • gpgconf 用于处理配置文件(~/.gnupg/),如 gpg.conf、gpg-agent.conf、girmngr.conf、gpgsm.conf。
  • watchgnupg 读取 agent 的日志。
  • addgnupghome 用于创建 .gnupg 目录。

这是 gpg-agent 里面几个命令,
  • gpg-agent 就是 agent 本身了。
  • gpg-connect-agent 用于和运行起来的 agent 交互。
  • symcryptrun 调用对称加密程序。

下面我们看看如何使用 agent 完成需要的功能。如果使用 gdm 等 X session manager,可以不必配置,一般都会在 /etc/X11/Xsession.d 里面添加 gpg-agent 启动信息。如果使用 startx 脚本,则可以在 .xinitrc 里面添加一行,
exec gpg-agent --enable-ssh-support --daemon fvwm
启动自己的 window manager。这样在如 kmail 里面调用 gpg 签名的时候,会使用 pinentry 程序(如 pinentry-qt4)提供一个输入框。这里 --enable-ssh-support 的作用是使得 gpg-agent 越俎代庖,行使 ssh-agent 的任务。不过比较搞的是,我用 ssh 从来不设置 passphrase,就是嫌麻烦才只用 key 而不用 password 的,结果这下好了,gpg-agent 要把 ssh 密钥加密,必须设置密码。网上也有人 yy,说那好了啊 gpg 足够安全,那可以不可以对 sudo 这种程序认证啊,有人觉得应该有 PAM module 可以做到,但似乎现在还没有一些实现出来。

dirmngr 似乎就是为了更新维护一个吊销证书列表,以便用户能够及时获得哪些密钥已经失效了。

2009年2月18日星期三

gstm

这是一个 ssh tunnel manager,其实一直想 putty 继承一个类似的东西,最后发现,干脆自己创建快捷方式算了,其实还快些。这个东西基本上就跟快捷方式差不了多少了,汗...
/usr/bin/gstm
/usr/share/pixmaps/gstm/STMbanner.png
/usr/share/pixmaps/gstm/gSTM.png
/usr/share/pixmaps/gstm/gSTM.xpm
/usr/share/pixmaps/gstm/green.xpm
/usr/share/pixmaps/gstm/red.xpm
/usr/share/pixmaps/gstm/yellow.xpm
/usr/share/pixmaps/gSTM.png
/usr/share/applications/gstm.desktop
/usr/share/doc/gstm/copyright
/usr/share/doc/gstm/changelog.Debian.gz
/usr/share/doc/gstm/changelog.gz
/usr/share/menu/gstm
/usr/share/man/man1/gstm.1.gz
用起来很简单,搞明白 ssh 里面 -D、-L 和 -R 基本就会用了。就是比较 sb,因为其实是个 frontend,它会调用 ssh去干活的。

2009年1月15日星期四

xboard/winboard

这是一个 chess 的 frontend,后者是前者的 Win32 port,不过有一些功能比如和 cmail 协同工作是没有实现的。这个 frontend 现在可以用来做三件事情,一个是使用它调用 chess engine 用来人机对战或者机机对战;一个是连接到 Internet Chess Server (以下简称 ICS)参加网上的游戏;还可以用来查看棋局。

由于我对 chess 不算特别了解,所以现在写的比较偏技术化,而不是偏棋局功能。既然 xboard 是个 frontend,那么势必有一个所谓的 backend 亦即 chess engine 作为后台计算程序,常见的 backend 有 gnu chess 或者 crafty 等,他们使用类似的协议与 frontend 通信,这也就使得我们可以用不同的 backend 互较高下,作为比试谁的 engine 牛,同时也使得算法、界面分离开来。类似的 frontend 还有 eboard 等。

xboard 含有如下的内容,
/usr/games/xboard
/usr/games/zic2xpm
/usr/games/cmail
/usr/games/pxboard
/usr/share/man/man6/pxboard.6.gz
/usr/share/man/man6/xboard.6.gz
/usr/share/man/man6/zic2xpm.6.gz
/usr/share/info/xboard.info.gz
/usr/share/doc/xboard/changelog.gz
/usr/share/doc/xboard/zippy.README.gz
/usr/share/doc/xboard/READ_ME
/usr/share/doc/xboard/FAQ.gz
/usr/share/doc/xboard/NEWS.gz
/usr/share/doc/xboard/FAQ.html
/usr/share/doc/xboard/ToDo.gz
/usr/share/doc/xboard/copyright
/usr/share/doc/xboard/changelog.Debian.gz
/usr/share/doc/xboard/ChangeLog.2.gz
/usr/share/menu/xboard
/usr/share/games/xboard/bitmaps.xchess
/usr/share/games/xboard/bitmaps.xchess/b108o.bm
...
/usr/share/lintian/overrides/xboard
/usr/share/man/man6/cmail.6.gz
主要程序包含 xboard、zic2xpm、cmail 和 pxboard,分别是主程序、将 zic 格式转换成为 xboard 可以读取的格式、从 email 里面读取和玩 chess、将一个局通过管道送给 xboard 在上面玩。

如果我们想进行人机对战,可以用 -fcp/-scp 指定两个 engine,-st/-depth 指定搜索时间或者搜索深度;如果是联网,则可以 -ics,并用 -icshost/-icsport 指定服务器,这是还需要一个 helper 程序 -icshelper,用于登录发出命令和服务器交互(如 freechess.org 用 timeseal、而 chessclub.com 用 timestamp);-lgf 可以从文件里面读取牌局。

连接到 ICS 上可以用下面的命令,如 help 获得帮助,who 列出用户,games 列出现在的局,比较有用的是邀战 match id time inc,其中 id 是对方的注册号,time 是每方使用的时间(分 lightening,blitz 和 standard),inc 是每下一步增加的时间(常用方法是 time = 10,inc = 0 这样限制每盘时间,或者 time = 2,inc = 12,这样相当于最长思考时间不能超过 2min,每一步平均大约是 12s)。提出这个请求后,可以 accept 或者 decline。finger id 可以获得某人的比分情况。vars 列出自己的 configuration,可以用 set 设置。可以用 observe id/game id 观战。examine 可以获得最近进行那盘棋的信息。比较常用的命令是 getgame,这个会匹配自己的时间什么的自动获得一盘棋局。这里有一个入门介绍,以及详细的命令指南

我们下面看看 gnuchess 这个 engine,
/usr/games/gnuchess
/usr/games/gnuchessx
/usr/share/doc/gnuchess/README
/usr/share/doc/gnuchess/TODO
/usr/share/doc/gnuchess/README.Debian
/usr/share/doc/gnuchess/copyright
/usr/share/doc/gnuchess/NEWS.gz
/usr/share/doc/gnuchess/changelog.Debian.gz
/usr/share/doc/gnuchess/changelog.gz
/usr/share/menu/gnuchess
/usr/share/man/man6/gnuchess.6.gz
/usr/share/man/man6/gnuchessx.6.gz
其实 gnuchess 就是一个文本下面的 chess,但是用户必须对表达方式比较熟悉,如使用坐标之类的。类似的,crafty 也是这样的东西,
/usr/games/crafty.bin
/usr/games/crafty
/usr/share/crafty/crafty.hlp
/usr/share/doc/crafty/read.me.gz
/usr/share/doc/crafty/changelog.Debian.gz
/usr/share/doc/crafty/README.Debian
/usr/share/doc/crafty/copyright
/usr/share/doc/crafty/changelog.gz
/usr/share/doc/crafty/crafty.doc.gz
/usr/share/doc/crafty/crafty.faq.gz
/usr/share/man/man6/crafty.6.gz
/usr/share/man/man5
/usr/share/man/man5/crafty.rc.5.gz
/usr/share/lintian/overrides/crafty
/usr/share/doc-base/crafty
/usr/share/menu/crafty
/var/lib/crafty/book.lrn
/var/lib/crafty/position.lrn
/var/lib/crafty/TB
/etc/crafty.rc
/usr/share/man/man6/crafty.bin.6.gz
这里可以看见比 gnuchess 复杂了不少,还有专门的 rc 控制其行为。

和 xboard 类似,还有 eboard,
/usr/games/eboard
/usr/bin/eboard-config
/usr/bin/eboard-addtheme
/usr/share/applications/eboard.desktop
/usr/share/pixmaps/eboard.xpm
/usr/share/man/man1/eboard-config.1.gz
/usr/share/man/man1/eboard-addtheme.1.gz
/usr/share/man/man6/eboard.6.gz
/usr/share/games/eboard/classic.png
/usr/share/games/eboard/ghouls.png
/usr/share/games/eboard/plastic.png
/usr/share/games/eboard/eboard_themes.conf
/usr/share/games/eboard/NAG.en.txt
/usr/share/games/eboard/eboard.cs.dict
/usr/share/games/eboard/eboard.de.dict
/usr/share/games/eboard/eboard.es.dict
/usr/share/games/eboard/eboard.fr.dict
/usr/share/games/eboard/eboard.hu.dict
/usr/share/games/eboard/eboard.it.dict
/usr/share/games/eboard/eboard.ja.dict
/usr/share/games/eboard/eboard.pl.dict
/usr/share/games/eboard/eboard.pt_BR.dict
/usr/share/lintian/overrides/eboard
/usr/share/doc/eboard/Crafty.txt
/usr/share/doc/eboard/DGTboard.txt
/usr/share/doc/eboard/FICS-Timeseal.txt
/usr/share/doc/eboard/GNUChess4.txt
/usr/share/doc/eboard/GNUChess5.txt
/usr/share/doc/eboard/Makefile
/usr/share/doc/eboard/Scripts.txt
/usr/share/doc/eboard/Sjeng.txt
/usr/share/doc/eboard/Themes.txt
/usr/share/doc/eboard/copyright
/usr/share/doc/eboard/changelog.gz
/usr/share/doc/eboard/README.gz
/usr/share/doc/eboard/changelog.Debian.gz
/usr/share/menu
/usr/share/menu/eboard
功能上似乎允许直接用 LAN 联机。

2009年1月10日星期六

alsa-oss

很多老程序都是用 OSS 做声音驱动的(如 mp3blaster),ALSA 为这些程序提供了一种解决方案,这就是 alsa-oss
/usr/lib/libalsatoss.a
/usr/lib/libalsatoss.so.0.0.0
/usr/lib/libossredir.la
/usr/lib/libaoss.a
/usr/lib/libossredir.a
/usr/lib/libaoss.la
/usr/lib/libalsatoss.la
/usr/lib/libaoss.so.0.0.0
/usr/bin/aoss
/usr/share/lintian/overrides/alsa-oss
/usr/share/man/man1/aoss.1.gz
/usr/share/doc/alsa-oss/copyright
/usr/share/doc/alsa-oss/changelog.gz
/usr/share/doc/alsa-oss/changelog.Debian.gz
/usr/include/oss-redir.h
/usr/lib/libalsatoss.so
/usr/lib/libaoss.so
/usr/lib/libaoss.so.0
/usr/lib/libalsatoss.so.0
可以看出来,这里提供了一个命令而已,那么是怎么实现的呢?可以很容易发现 aoss 本质上只是一个 bash script,其内容如下:
#!/bin/sh

# A simple script to facilitate the use of the OSS compatibility library.
# Usage:
# aoss

if [ -d /proc/asound ]; then
prefix=/usr
exec_prefix=${prefix}
LD_PRELOAD=${exec_prefix}/\$LIB/libaoss.so${LD_PRELOAD:+:$LD_PRELOAD} exec "$@"
else
exec "$@"
fi
exit 1
可以看出来在存在 /proc/asound 时(有 ALSA 驱动),该 script 就会在程序执行前提前载入 libaoss.so,这个动态链接库将把调用 OSS 发声程序需要的函数用 ALSA 实现。这是一个非常有意思的技术,也正因为如此,才使得制作 OSS 的 wrapper 成为可能。比如执行 mp3blaster,就可以直接 aoss mp3blaster 了。

esound

Linux 世界里面总是存在着千奇百怪的产品,ESD 算是一个了吧。早期让 Linux 用声音简直是痛苦极了,现在有了 ALSA,还是好了很多,一些遗留下来的工具还在发挥着余热。

ESD 简单说就是一个混音器,但是它允许用户从网络上进行访问(network transparent),这意味着你可以在一台机器上打开播放器,另外一台机器的喇叭响了。这也是采用了 CS 构架的原因。之后有很多类似的项目用来取代 ESD,有的已经停止了开发比如 aRtsD,有的尚还在开发(RoarAudio)或者已经比较完整(如 JACK Audio Connection Kit、NAS 和 PurseAudio),有的和 ESD 类似也是 network transparent,有的不是。

debian 里面服务器在 esound 里面,
/usr/bin/esd
/usr/share/man/man1
/usr/share/man/man1/esd.1.gz
/usr/share/doc/esound
客户端在 esound-clients 里面
/usr/share/man/man1/esddsp.1.gz
/usr/share/man/man1/esdfilt.1.gz
/usr/share/man/man1/esdloop.1.gz
/usr/share/man/man1/esdmon.1.gz
/usr/share/man/man1/esdplay.1.gz
/usr/share/man/man1/esdrec.1.gz
/usr/share/man/man1/esdcat.1.gz
/usr/share/man/man1/esdctl.1.gz
/usr/share/man/man1/esdsample.1.gz
/usr/lib/esound/libesddsp.so.0.2.39
/usr/lib/mime/packages/esound-clients
/usr/bin/esdcat
/usr/bin/esdctl
/usr/bin/esddsp
/usr/bin/esdfilt
/usr/bin/esdloop
/usr/bin/esdmon
/usr/bin/esdplay
/usr/bin/esdrec
/usr/bin/esdsample
/usr/share/doc/esound-clients
/usr/lib/esound/libesddsp.so.0
另外一部分在 esound-common 里面,
/etc/esound/esd.conf
/usr/share/doc/esound-common/TIPS
/usr/share/doc/esound-common/TODO
/usr/share/doc/esound-common/html
/usr/share/doc/esound-common/html/x66.html
/usr/share/doc/esound-common/html/r311.html
/usr/share/doc/esound-common/html/r313.html
/usr/share/doc/esound-common/html/x296.html
/usr/share/doc/esound-common/html/x299.html
/usr/share/doc/esound-common/html/x179.html
/usr/share/doc/esound-common/html/x241.html
/usr/share/doc/esound-common/html/x302.html
/usr/share/doc/esound-common/html/index.html
/usr/share/doc/esound-common/html/x305.html
/usr/share/doc/esound-common/html/x119.html
/usr/share/doc/esound-common/html/c250.html
/usr/share/doc/esound-common/html/x308.html
/usr/share/doc/esound-common/html/x26.html
/usr/share/doc/esound-common/html/c76.html
/usr/share/doc/esound-common/html/x259.html
/usr/share/doc/esound-common/html/x265.html
/usr/share/doc/esound-common/html/c19.html
/usr/share/doc/esound-common/html/x268.html
/usr/share/doc/esound-common/html/c271.html
/usr/share/doc/esound-common/html/x47.html
/usr/share/doc/esound-common/html/a346.html
/usr/share/doc/esound-common/html/x277.html
/usr/share/doc/esound-common/html/x211.html
/usr/share/doc/esound-common/html/c32.html
/usr/share/doc/esound-common/html/x281.html
/usr/share/doc/esound-common/html/c285.html
/usr/share/doc/esound-common/html/c290.html
/usr/share/doc/esound-common/README
/usr/share/doc/esound-common/NEWS.gz
/usr/share/doc/esound-common/README.Debian
/usr/share/doc/esound-common/AUTHORS
/usr/share/doc/esound-common/copyright
/usr/share/doc/esound-common/changelog.gz
/usr/share/doc/esound-common/changelog.Debian.gz
/usr/share/doc-base/esound
其实使用 ESD 很简单,一般或者有某些程序的 module 支持 ESD 输出,可以通过命令行参数 -s server:port 指定或者设定 ESPEAKER 环境变量。

配置文件 /etc/esound/esd.conf 就是 ESD 的 daemon 启动的配置文件了,esd 参数不多,主要就是选择链接类型(-unix 还是 -tcp),指定端口 -port(默认是 5001),指定设备(-d),是否打开时候 beep(-nobeeps)等。可惜必须用 root 启动该进程。

clients 里面提供给我们一些命令,如 esdctl 用来控制 esd 的状态,esdrec 从 server 录下来一段,然后可以用 esdcat 发送给 ESD 播放,esdplay 相当于把一个已有的声音文件如 wav 从 ESD 播放,esdsample 允许播放的时候重采样,另外还有 esdloop 等不是很清楚实际作用。

那么如何使得本地的 mic 可以直接把声音播放到远程主机呢?一种想法就是利用管道,使用 arecord 或者 rec 等程序进行录制,通过管道送给 esdplay。可是实验发现 esdplay 不支持管道...