I am LAZY bones? AN ancient AND boring SITE

分类: 'CLI软件' 的归档

实时磁盘使用情况分析──iotop

你是否有这样的经历: 电脑用着用着,硬盘灯开始狂闪,硬盘也发出咯咯的读盘声,但是你又不知道到底是那个进程出了问题?
这时候你也许就要用到 iotop 了,这个小小的命令行工具的功能,只要看名字就可以明白,不就是 IO 的 top 嘛!而且,用法也和top很像哦,直接执行iotop会每秒汇报各进程的磁盘读速度和磁盘写速度,排序好以后输出.甚至 -b -n 之类的选项都是和top命令一样的: 执行 iotop -bn1 会输出当前各进程的磁盘IO信息,并退出~
另外,值得自己编译内核的用户注意的是,iotop需要打开 CONFIG_TASKSTATS 和 CONFIG_TASK_IO_ACCOUNTING 这两个内核选项才能正常工作.

音频处理领域的瑞士军刀──SoX

SoX 是命令行下的一套音频处理组件,由于其功能强大,号称”音频处理领域的瑞士军刀”.
那么SoX到底有什么功能呢?它可以播放/转换/录制多种音频格式文件,包括但不限于mp3/wav/ogg/flac/avi/wmv/pcm/gsm等,要了解完整的支持格式,可以参见官网的介绍.
其中,播放/转换/录制 分别对应 paly/sox/rec 几个命令,没错,大名鼎鼎的play命令正是SoX的组件之一,哈哈,现在感觉到它的强大了吧?
下面用几个例子来进一步说明,由于工作关系,经常接触到PCM和GSM的音频,幸好有SoX.就以这些文件为例,mp3之类的常用文件格式就更轻松了:

播放wav文件:

play -t wav hello-world.wav

播放pcm文件,由于格式的不确定性,需要指定编码方式和码率,如果给的值不对,就会听到变调的声音了,哈哈:

play -t raw -r 8k -e a-law hello-world.pcm

播放gsm文件:

play -t gsm hello-world.gsm

把gsm文件转换成wav格式:

sox -t gsm hello-world.gsm hello-world.wav

把gsm文件转换成8k采样率A率的pcm格式:

sox -t gsm hello-world.gsm -t raw -r 8k -e a-law hello-world.pcm

把wav文件转换成8k采样率A率的pcm格式:

sox -t wav hello-world.wav -t raw -r 8k -e a-law hello-world.pcm

把声卡的声音录制成wav格式,默认应该是48k采样率16bit量化的双声道Signed PCM编码.这些参数都可以指定:

rec -t wav rec.wav

厉害吧~

另外,值得一提的是,由于libmagic包的故障,gentoo下的sox有时候不能根据扩展名来识别声音格式了,会报 no handler for detected file type `application/octet-stream; charset=binary’ 的错误,所以上述命令都加了-t参数直接指定格式,就没问题了.

一个命令把几千张照片压缩了

数码相机拍的照片,已经积累了很多个G了,于是就都备份到光盘里保存了,但是怎么处理硬盘上的数据呢?rm之觉得可惜,毕竟光盘没有那么方便,不能随时查看,但是放着又太大太浪费硬盘空间了,现在的相机一张都有3~4M的.我能想到的最好的办法,就是把每张照片压缩以后,把小图片留在硬盘上,这样即可以快速查看,又不是很浪费硬盘空间,于是有了这个命令:
注意此命令会删除当前目录及子目录下的所有jpg文件,最好是理解以后,再执行

find . -name '*.jpg' | while read i;do convert -resize 30% "$i" "${i%.jpg}_.jpg";rm "$i";done

把当前目录及子目录下的所有 xx.jpg 压缩成横竖分辨率都为原尺寸的30%的 xx_.jpg 文件.对于我的相机来说,压缩后的大约800*600的大小对于屏幕浏览来说已经足够了,而每张300K左右的尺寸也很经济.
没有convert命令的同学需要检查是否装了 imagemagick 包.
PS:真庆幸自己没在用windows了,如果是win下,估计又得上网找所谓的”绿色版图像批处理软件”了,问题是:即使找到了,能完全合我的心意吗?称心了,要找注册码吗?找到注册码了,确定不含木马病毒吗…Orz

转:lsof用法小结

lsof在我看来算是那类很少用到却功能强大的生僻命令.因为生僻,所以经常忘记参数,而且2~3千行的man页,也经常会让人发晕.所以,偶尔看到这用法小结,转载记录一下,以便日后查找.
原文链接

lsof是一个用来显示被打开的文件的强大而有用的工具。在Unix系统中,任何事物都是文件(everything is a file),pipe是文件,IP sockets是文件,unix sockets是文件,目录是文件,设备是文件,inodes是文件。
一些有用的例子:
当在lsof后边没有跟任何参数时,该命令将会列出当前系统中被所有进程打开的所有文件

lsof|nl     #nl命令打印出行号

下边这几个命令指出打开某文件的进程

lsof `which httpd`    #那个进程在使用apache的可执行文件
lsof /etc/passwd      #那个进程在占用/etc/passwd
lsof /dev/hda6         #那个进程在占用hda6
lsof /dev/cdrom        #那个进程在占用光驱

下边将会打印出占用httpd可执行文件的进程的进程号(仅仅是进程号,在编写shell脚本是有用)

lsof -t `which httpd`

显示出那些文件被以k打头的进程名的进程打开,以bash打头,和以init打头:

lsof -c k
lsof -c bash
lsof -c init

显示出那些文件被以courier打头的进程打开,但是并不属于用户‘zahn’

lsof -c courier -u ^zahn

显示被zahn和apache打开的文件

lsof -u apache,zahn

显示那些文件被pid为30297的进程打开:

lsof +p 30297

显示所有在/tmp文件夹中打开的instance和文件的进程。但是symbol文件并不在列

lsof -D /tmp

显示所有打开的端口

lsof -i

显示所有打开80端口的进程

lsof -i:80

显示所有打开的端口和UNIX domain文件:

lsof -i -U

显示那些进程打开了到www.akadia.com的UDP的123(ntp)端口的链接:

lsof -iUDP@www.akadia.com:123

—————————————————-
translated from @ www.akadia.com

thank 寂寞烈火 for the reason of http://bbs.chinaunix.net/viewthr … &extra=page%3D5
—————————————————–
lsof还有很多参数,如果能够熟练使用将会对日常的系统管理非常有用。希望大家把一些还知道得技巧加以补充

BotCalk

谢谢lerosua写的介绍,我就基本上抄现成的了,哈哈~

BotCalk是近来我和lerosua搞起的一个项目,目的是丰富jabber聊天室里的聊天环境。目前你也许能在 linuxcn@conference.jabber.org 里遇到一个叫 iBot 的家伙,就是它了.
当然也是个学习的过程。主程序改自gloox里的聊天室测试代码。botcalk把聊天室里的消息发送到一个管道,而有个脚本读取消息处理后再发送到另一个管道上。botcalk会循环读这个管道,然后把信息发送出去。
原理有些粗糙,目前就这么实现了发送链接读取网页标题的功能。但bug在于机器人登录后似乎导致聊天室不太正常,吃掉某些人发出的信息。
BotCalk 代码地址在 http://code.google.com/p/botcalk/ ,通过svn取得吧
编译botcalk需要gloox 1.0beta2以上版本,
需要的配置文件bot.conf:

$ cat  bot.conf
jid=xxxx@gmail.com
passwd=xxxxxxx
server=talk.google.com
port=5222
room=linuxcn@conference.jabber.org/myBot

然后执行目录下的bot.sh即可。

目前这个机器人还很粗糙,所以以上仅学习参考使用.

PS: lerosua兄还写了个连载的小说,大家一起去围观吧~

GAppProxy

其实这个好东西TX已经介绍过了,但是我还是想再罗嗦几句,就算是给好东西打打广告吧。
下载了python语言的源码,打开一看,出奇得简单,一共两个文件,连注释也才400行左右,不知该夸作者牛还是夸python强大,呵呵,其实肯定是两者皆是吧。
我目前在的教育网号称是不能访问国外的网站(残废啊。),但是不知道为什么,我这个cn域名的国内空间的blog也不能访问,于是只能找代理了,嘿嘿。这个的速度还是不错的。
需要的朋友在这里下载。

linux下架设个人电台的方法

两年前(基本上刚好是两年了),我还在用windows的时候,曾经写过一篇win下架电台的文章,后来不用windows了,基本上也就没搞过这个事情了,最近看到有个icecast,就忍不住试了一下,在这里汇报下结果。
首先用于广播的,不用说就是icecast了,安装也就不说了,emerge或者apt-get随便,反正不是难事。装完以后,稍微修改一下 /etc/icecast2/icecast.xml ,里面的内容基本上很好懂,是xml格式,注意 icecast–limits–clients 是最大用户数,按需修改;icecast–authentication–source-password是源密码,这里随便设置一个,后面要用到的;admin-user和admin-password是web管理的时候的用户名和密码,按需修改;listen-socket — port 默认是8000可以不用动,注意这个端口不仅是web管理的端口,也是音频源的连接端口。其他的基本上默认就没问题了。
然后是用于产生音频源的软件,有如下几个选择:

  • darkice :只能从声卡获得数据,还需要播放器支持。同时声卡要被占用,重采样以后可能会对音质有影响,我没有用这个。
  • ices 2.X :支持声卡模式和文件模式,但是文件只能打开ogg格式的声音,我这里ogg格式的不多,基本没用
  • ices 0.X :这个系列的倒是支持从mp3文件获取流,但是不管是gentoo还是ubuntu的源里都没有,需要自己编译。我下载了 ices 0.4 ,编译安装后,怎么配置都连不上源,而且软件包里面自带的文档居然有很多无效的内容,照着配是会出错的,还得我看源码才配置好,但是还是不能把数据送到icecast,出现了 socket error。。。
  • mpd :这个是我试成功的一个,mpd/mpc的用法可以自己google一把,这里就稍微提下不同点。

mpd用于icecast唯一的区别就是在 /etc/mpd.conf 里面,audio_output 那段要如下设置:

audio_output {
	type			"shout"           #必须
	name			"bones radio"     #随便起个名
	host			"localhost"       #icecast主机
	port			"8000"            #icecast端口
	mount			"/mpd"            #挂载点
	password		"xxx"             #icecast密码
	bitrate			"128"             #比特率
	format			"44100:16:2"	  #格式
	user			"source"          #icecast用户名
	encoding		"mp3"             #输出流编码方式
}

好了,配置完了以后,就
sudo /etc/init.d/icecast start
sudo /etc/init.d/mpd start
启动服务,再用你的mpc控制mpd播放,就可以对外广播啦。
收听广播,执行 mplayer http://your-IP:your-port/mpd 就行了。还可以用浏览器打开 http://your-IP:your-port 就可以看到当前播放的信息等,用之前说的web管理用户名和密码登录还可以看到更多信息和进行更多操作。

查询IP的脚本和增强的traceroute

查询IP的脚本不是我写的,是AutumnCat以前发在ubuntu-cn上的,用的数据库是纯真IP数据库,可以下载脚本放到PATH变量覆盖的目录,并下载数据库文件,解压后把脚本里的 DataFileName 一行指向数据库的真实位置,最终达到这样效果:

$ myip
211.155.225.207
$ cip 211.155.225.207
浙江省杭州市电信IDC机房
$ myip | cip -
浙江省杭州市电信IDC机房

然后就可以这样使用增强的traceroute了:

$ traceroute li2z.cn | awk -F"[()]" '{if($2~/[0-9\.]./){printf("%s |",$0);system("cip "$2);}else{print $0}}'
traceroute to li2z.cn (122.224.99.37), 30 hops max, 60 byte packets |浙江省杭州市电信
 1  192.168.4.1 (192.168.4.1)  0.163 ms  0.159 ms  0.296 ms |局域网对方和您在同一内部网
 2  211.155.224.1 (211.155.224.1)  0.675 ms  0.830 ms  0.920 ms |浙江省杭州市电信IDC机房
 3  61.130.4.201 (61.130.4.201)  0.761 ms  0.813 ms  0.862 ms |浙江省杭州市电信
 4  50.166.175.61.broad.hz.zj.dynamic.163data.com.cn (61.175.166.50)  1.161 ms  1.212 ms  1.232 ms |浙江省杭州市电信
 5  122.224.99.254 (122.224.99.254)  0.966 ms  1.034 ms  1.161 ms |浙江省杭州市电信
 6  122.224.99.37 (122.224.99.37)  0.992 ms  0.929 ms  0.916 ms |浙江省杭州市电信
$ traceroute google.com | awk -F"[()]" '{if($2~/[0-9\.]./){printf("%s |",$0);system("cip "$2);}else{print $0}}'
traceroute to google.com (74.125.67.100), 30 hops max, 60 byte packets |美国 CZ88.NET
 1  192.168.4.1 (192.168.4.1)  0.174 ms  0.165 ms  0.162 ms |局域网对方和您在同一内部网
 2  211.155.224.1 (211.155.224.1)  0.642 ms  0.809 ms  0.901 ms |浙江省杭州市电信IDC机房
 3  61.130.4.201 (61.130.4.201)  0.731 ms  0.770 ms  0.828 ms |浙江省杭州市电信
 4  61.164.3.93 (61.164.3.93)  1.650 ms  1.720 ms  1.824 ms |浙江省杭州市电信
 5  61.130.125.25 (61.130.125.25)  1.508 ms  1.551 ms  1.540 ms |浙江省丽水市电信
 6  220.191.158.253 (220.191.158.253)  1.206 ms  1.187 ms  1.173 ms |浙江省杭州市电信
 7   (202.97.47.30)  22.003 ms  24.931 ms  24.916 ms |中国电信广州节点
 8   (202.97.34.25)  22.040 ms  22.063 ms  22.053 ms |北京市电信
 9  202.97.60.142 (202.97.60.142)  22.474 ms  22.475 ms  22.465 ms |中国电信骨干网
10  202.97.61.46 (202.97.61.46)  26.196 ms  26.247 ms  26.232 ms |中国电信骨干网
11  202.97.62.214 (202.97.62.214)  60.140 ms  60.158 ms  60.217 ms |中国电信骨干网
12  209.85.241.58 (209.85.241.58)  59.982 ms  59.934 ms  59.825 ms |美国谷歌(GOOGLE)公司
13  209.85.250.120 (209.85.250.120)  60.237 ms  70.186 ms  60.217 ms |美国谷歌(GOOGLE)公司
14  209.85.250.87 (209.85.250.87)  60.708 ms  60.405 ms  60.680 ms |美国谷歌(GOOGLE)公司
15  216.239.43.212 (216.239.43.212)  143.525 ms  143.562 ms  143.632 ms |美国Google
16  209.85.250.126 (209.85.250.126)  146.837 ms  150.876 ms  146.755 ms |美国谷歌(GOOGLE)公司
17  209.85.242.255 (209.85.242.255)  212.969 ms  212.992 ms  212.880 ms |美国谷歌(GOOGLE)公司
18  209.85.254.249 (209.85.254.249)  211.795 ms  217.885 ms  211.812 ms |美国谷歌(GOOGLE)公司
19  64.233.174.46 (64.233.174.46)  218.950 ms 209.85.255.190 (209.85.255.190)  219.998 ms 64.233.174.46 (64.233.174.46)  218.934 ms |美国加利福尼亚州Google公司
20  gw-in-f100.google.com (74.125.67.100)  212.930 ms  212.912 ms  212.818 ms |美国 CZ88.NET

以上就是从我这里访问本blog和google的路由信息,很醒目吧,当然如果常用的话,可以保存成脚本更方便。
顺便纪念一下出来40个小时左右就被及.艾服.达不留掉的牛博国际网站:

$ traceroute bullogger.com | awk -F"[()]" '{if($2~/[0-9\.]./){printf("%s |",$0);system("cip "$2);}else{print $0}}'
traceroute to bullogger.com (70.86.20.26), 30 hops max, 60 byte packets |美国 CZ88.NET
 1  192.168.4.1 (192.168.4.1)  0.150 ms  0.142 ms  0.132 ms |局域网对方和您在同一内部网
 2  211.155.224.1 (211.155.224.1)  0.550 ms  0.640 ms  0.754 ms |浙江省杭州市电信IDC机房
 3  61.130.4.201 (61.130.4.201)  0.695 ms  0.683 ms  0.673 ms |浙江省杭州市电信
 4  61.164.3.89 (61.164.3.89)  1.610 ms  2.095 ms  2.164 ms |浙江省杭州市电信
 5  61.130.125.25 (61.130.125.25)  1.462 ms  1.445 ms  1.426 ms |浙江省丽水市电信
 6  61.164.9.185 (61.164.9.185)  1.053 ms  2.020 ms  2.106 ms |浙江省杭州市电信
 7   (202.97.47.46)  23.923 ms  23.165 ms  23.157 ms |中国电信广州节点
 8  * * *
 9  * * *
。。。。。。

SQLite简介

SQLite大致就是”SQL lite”,也就是一个微型的SQL解释器.它的赞助商和使用者包括mozilla,adobe,symbian等软件巨头,也算是来头不小了.
说它微型,那么它到底有多微型呢?我们可以看看它的可执行文件的大小,linux版本的打包文件是203.93 KiB,解压以后是350.88 KiB,是不是很微型呢?
除了微型之外,SQLite主要还要以下特点:

  • 无须配置: SQLite不需要安装,直接解压可执行文件即可运行.
  • 没有服务进程: SQLite无须通过TCP/IP等通信协议提交SQL到服务端,处理后再返回结果.
  • 单个数据文件: SQLite将用户数据存于单个普通文件里面.也就是说用户只要有数据文件的读权限,就可以读取所有数据;有写权限也能改变数据.
  • 数据文件可跨平台迁移: SQLite本身是跨平台的,它的数据文件同样也是跨平台的.数据文件和平台的字节序无关,也和CPU的位数无关.直接复制数据文件就可以实现数据迁移.
  • 紧凑: 如上所述,SQLite的运行环境非常小,如果在编译的时候去掉不需要的功能,可以减小至170KiB,用于嵌入式环境也是没问题的.
  • 松散数据类型: 不同于其他数据库的严格的数据类型检查,SQLite在尝试类型转换失败以后,允许在任何表的任何列里面插入任何类型的数据(一个例外是:整型的主键列里面只能存整型数据)
  • 变长的数据记录: 任何文本都是VARCHAR
  • 可读性很高的源码: 普通的程序员都能读懂,关键的变量和函数都有详细的注释.
  • SQL语句编译成虚拟机器语言: SQLite把SQL语句预编译成一种类似机器预言的代码,程序员可以方便得打印出代码及代码的执行结果,这样对debug很有好处.
  • 完全的公开: SQLite的源码可以任意下载使用,没有任何约束和版权(一些文档和测试代码是受开源license保护的).
  • SQL语言扩展: SQLite可以模块化地添加扩展,以增强其功能

说了这么多特点,那么,SQLite究竟怎么使用呢?
在一般的linux发行版下,安装 sqlite 这个包以后,就可以使用 sqlite3 这个命令来创建和处理数据库文件了.windows/DOS则下载这个文件解压到系统目录,mac则是下载这个文件.
安装完毕以后,就可以用

sqlite3 test.db

这个命令来创建一个空的数据库文件了.
然后,你可以用以下命令来建立一个含有两个列的表:

sqlite3 test.db "create table memos(text, priority INTEGER);"
sqlite3 test.db "insert into memos values('deliver project description', 10);"
sqlite3 test.db "insert into memos values('lunch with Christine', 100);"

然后可以这样查询出需要的数据:

sqlite3 test.db "select * from memos where priority>20;"
lunch with Christine|100

很简单吧~
下面展示一下,SQLite在C语言下的用法,同样用的是上面那个test.db,我们建立一个test.c,内容为:

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
#include <stdio.h>
#include <sqlite3.h>
 
static int callback(void *NotUsed, int argc, char **argv, char **azColName){
  int i;
  for(i=0; i<argc; i++){
    printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
  }
  printf("\n");
  return 0;
}
 
int main(int argc, char **argv){
  sqlite3 *db;
  char *zErrMsg = 0;
  char SQLbuffer[1024];
  int rc;
 
  if( argc!=2 ){
    fprintf(stderr, "Usage: %s num\n", argv[0]);
    return 1;
  }
  rc = sqlite3_open("test.db", &db);
  if( rc ){
    fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
    sqlite3_close(db);
    return 1;
  }
  sprintf(SQLbuffer, "select * from memos where priority > %s;", argv[1]);
  rc = sqlite3_exec(db, SQLbuffer, callback, 0, &zErrMsg);
  if( rc!=SQLITE_OK ){
    fprintf(stderr, "SQL error: %s\n", zErrMsg);
    sqlite3_free(zErrMsg);
  }
  sqlite3_close(db);
  return 0;
}

gcc -lsqlite3 test.c

进行编译,完成之后,执行

./a.out 30
text = lunch with Christine
priority = 100

怎么样,相当简单吧~

注: 文中部分内容翻译和参考自官方文档和man页.

新的dlmp3

两年多前,我写过一个自动下载百度mp3的脚本,后来百度曾经更换过几次页面结构,我也跟进维护了一段时间:,.
但再后来,由于觉得自动下的歌曲质量还是不如手工,加上已经有别人写的软件了,这脚本就丢那没管了.
直到昨天,收到 You Sheng 发来的邮件,说他还是比较喜欢那个脚本,百度改了页面之后又帮我修改了脚本,还写了个python来处理那凯撒加密,我觉得很感动,真的要谢谢他.
另外不禁感叹,难道这就是开源的力量?嘿嘿.
来自 You Sheng 的脚本可以在这里下载.