Xupeng's blog

圆外之大,心向往之

用Python实现http多线程下载

用Python写了一个HTTP的多线程下载程序,代码还很简单,连接错误处理、重试等还都没有写,晚上有时间再完善完善。

使用指南:好用的播放器mpd

使用指南:好用的播放器mpd
作者:Xupeng Yun <recordus@gmail.com>

mpd是目前我最喜欢的linux环境下的播放器,它跟常见的大多数播放器都很不同,比如它是c/s架构,mpd会作为一个守护进程运行在后台,通过各种各样的client软件来控制播放动作、播放列表等,从一开始使用我便喜欢上了这种方式。下面介绍一下它的使用方法和一些常见问题的解决方法。

一、安装
    我推荐使用最新的0.12.1版,因为我曾使用过0.11.5版,它对某些歌曲的长度识别有问题,而在最新的0.12.1中很正常,以下文字都是基于0.12.1版的。
    如果你跟我一样使用gentoo linux,那么你把portage更新到最新后emerge mpd就可以了:
    emerge –sync
    emerge mpd
    使用其他的发行版的用户可以检查一下软件仓库中是否已有mpd,比如debian/ubuntu用户可以:
    apt-get install mpd
    arch用户可以:
    pacman -S mpd
    如果你使用的发行版还没有提供0.12.1版的二进制包,你可以从mpd官方网站(http://www.musicpd.org/files.shtml)下载源代码进行编译安装。
    
    使用tar命令解开源代码包后进入源码目录:
    tar xf mpd-0.12.1.tar.gz
    cd mpd-0.12.1
    编译安装:
    ./configure –prefix=/usr
    make
    make install

二、mpd的配置
    mpd的系统级配置文件是/etc/mpd.conf,配置方法参见该文件,常用的配置选项有如下几个:
    user 指定用来运行mpd的用户,建议使用默认的mpd用户
    music_directory 指定存放mp3文件的目录,确保user指定的用户对该目录及其子目录、文件有读写权限。
    filesystem_charset 要和你系统使用的locale一致,比如我的:
    aiyi@devr ~ $ locale
    LANG=en_US.utf8
    LC_CTYPE=zh_CN.utf8
    LC_NUMERIC=”en_US.utf8”
    LC_TIME=”en_US.utf8”
    LC_COLLATE=”en_US.utf8”
    LC_MONETARY=”en_US.utf8”
    LC_MESSAGES=”en_US.utf8”
    LC_PAPER=”en_US.utf8”
    LC_NAME=”en_US.utf8”
    LC_ADDRESS=”en_US.utf8”
    LC_TELEPHONE=”en_US.utf8”
    LC_MEASUREMENT=”en_US.utf8”
    LC_IDENTIFICATION=”en_US.utf8”
    LC_ALL=

    因此我就设置该选项为”UTF-8”
    id3v1_encoding 指定mp3文件id3v1的编码,通常指定为”GBK”

    后两项的设置很重要,它关系到你的歌曲信息是否能够正确显示。

    对mpd配置完毕后要创建歌曲数据库,使用命令:
    mpd –create-db
三、mpd的使用
    启动mpd:
    一般安装mpd时会安装一个启动脚本,比如mpd在gentoo下安装的启动脚本为/etc/init.d/mpd。
    /etc/init.d/mpd start就启动了mpd
    mpd没有安装该脚本也无妨,直接运行mpd就可以了。

四、客户端软件的使用:
    我比较常用的客户端软件是mpc和gmpc,这些软件的安装都很简单,自行解决吧:)
    mpc的常用方式:
    mpc listall 可以列出所有的歌曲
    mpc search filename 可以按文件名查找
    mpc search artist 可以按歌手查找
    mpc search title 可以按歌曲名查找
    mpc add 添加歌曲到播放列表
    mpc listall|mpc add 可以把所有歌曲都添加到当前的播放列表
    mpc playlist 查看当前播放列表
    mpc play 播放
    mpc play 18 播放列表中第18首
    mpc pause 暂停
    mpc stop 停止
    mpc 查看当前播放歌曲的信息
    mpc的更多选项可以看mpc的帮助。

    gmpc是图形化的客户端,使用更加简单,就不废话了。

五、常见问题
    1、我的播放列表怎么有很多乱码?
    这个……要检查一下上面mpd的配置一节说过的两个选项:
    filesystem_charset
    id3v1_encoding
    看是否设置正确
    2、我确认配置没问题,还是乱码。
    这个可能是0.12.1新引入的问题,如果你的mp3文件有id3v2信息,那mpd会优先读取它而不管id3v1。
    解决方法:删除id3v2信息,再确认id3v1是否正确
    3、怎么删除id3v2信息?
    我推荐使用id3v2这个命令行软件:id3v2 -d mp3file
    4、能不能显示歌词?
    偶目前在写一个小程序,用与mpd环境下的歌词显示,基本上完成了,稍候放出。
    5、其他的问题
    我目前还没有遇到其他问题,如果你遇到了其他的问题请使用google,同时也欢迎和我联系:recordus at gmail.com
 

写了一个从百度下载Mp3的python脚本

google了一下,找到了一些用来从baidu下载mp3的软件,有win下的gui软件,也有linux下的shell脚本,还有python脚本, 但遗憾的是现在都已经无法用来下载mp3了,大概是因为百度mp3改版以后这些软件都没有修正吧,就顺手用python重写了一个,也算是练练手吧:)下载 功能: 用来从百度下载mp3,可以单独下载指定的歌曲,也可以批量下载百度新歌Top100,脚本所接受的参数如下:
Usage: /opt/bin/DownloadSong [OPTION]
Download mp3 file which matches given artist and/or title.

-h --help         Show this help message.
-1 --100          Download Baidu Top100 new songs.
-a --artist       songer
-t --title        song name
-v --version      show version info
使用范例:
DownloadSong -1 下载百度Top100中的所有歌曲(是数字1,不是字母l)
DownloadSong -a 后弦 -t 昆明湖 下载歌手后弦的昆明湖一曲
DownloadSong -a 后弦 -t 昆明湖 -t 九公主 下载后弦的昆明湖和九公主(可以跟多个-t参数,但只能有一个-a参数)
DownloadSong -t 我想我是海 下载我想我是海
备注: 该脚本调用axel命令进行多线程下载,因此需要系统中已安装有axel(http://wilmer.gaast.net/main.php/axel.html) 目前还只能在linux环境UTF-8 locale下使用,在其他locale下使用文件名可能会乱码,我目前只在gentoo linux下测试过。

遭遇gentoo的循环依赖(circular dependencies)问题

前几天要装gnome时就遇到了这个问题,当时手头有别的事情就给搁下了,几天要装sun-jdk时又遇到了同样的问题:
osr usr # emerge -pv sun-jdk

These are the packages that would be merged, in order:

Calculating dependencies... done!
!!!
Error: circular dependencies:

ebuild / net-libs/gnutls-1.4.4-r1 merge depends on
   ebuild
/ dev-libs/lzo-2.02-r1 merge (hard)
ebuild / media-libs/alsa-lib-1.0.13 merge depends on
   ebuild
/ app-doc/doxygen-1.4.7 merge (hard)
ebuild / app-text/ghostscript-gpl-8.54 merge depends on
   ebuild
/ net-print/cups-1.2.4 merge (hard)
ebuild / net-print/foomatic-filters-3.0.20060720 merge depends on
   ebuild
/ net-print/cups-1.2.4 merge (hard)
   
ebuild / virtual/ghostscript-0 merge (hard)
ebuild / app-doc/doxygen-1.4.7 merge depends on
   ebuild
/ virtual/ghostscript-0 merge (hard)
ebuild / virtual/ghostscript-0 merge depends on
   ebuild
/ app-text/ghostscript-gpl-8.54 merge (medium)
   
ebuild / net-print/cups-1.2.4 merge (soft)
ebuild / sys-apps/dbus-0.62-r1 merge depends on
   ebuild
/ app-doc/doxygen-1.4.7 merge (hard)
ebuild / dev-lang/nasm-0.98.39-r3 merge depends on
   ebuild
/ virtual/ghostscript-0 merge (hard)
ebuild / dev-libs/lzo-2.02-r1 merge depends on
   ebuild
/ dev-lang/nasm-0.98.39-r3 merge (hard)
ebuild / dev-java/sun-jdk-1.5.0.08 merge depends on
   ebuild
/ media-libs/alsa-lib-1.0.13 merge (medium)
ebuild / net-print/foomatic-filters-ppds-20060720 merge depends on
   ebuild
/ net-print/foomatic-filters-3.0.20060720 merge (medium)
   
ebuild / net-print/cups-1.2.4 merge (soft)
ebuild / net-print/cups-1.2.4 merge depends on
   ebuild
/ sys-apps/dbus-0.62-r1 merge (hard)
   
ebuild / net-libs/gnutls-1.4.4-r1 merge (hard)
osr usr #

起初怀疑罪魁祸首是gnutls,安装sun-jdk需要安装它,它又依赖别的包,最终别的包又依赖gnutls早成了死循环以至无法安装,在linuxsir上发了帖子描述这个问题,一边又自己折腾起来。

上面的输出可以看出是cups依赖gnutls造成了循环,于是我编辑cups的ebuild去掉了它对gnutls的依赖,再次emerge -pv sun-jdk,依然是循环依赖,不过跟上次已经大不一样了,这次造成循环的是doxygen,doxygen是一个文档系统,我想起来我的make.conf中有doc这个USE,不会是它的问题吧,试试看,去掉make.conf中的doc USE,再试试,晕,一切正常,没有可恶的循环依赖了。

看来真正的罪魁祸首是doc这个USE,使用全局的USE还是要小心啊,同样遇到循环依赖问题的gentoo lovers可要引以为戒了,遇到这样的问题多看看自己的USE吧,没准就是这样的一粒沙子坏了走远路的脚了,呵呵。

在LFS下安装qemu和kqemu

qemu是一个很好的模拟器,就不多说了,LFS也很不错,所以我希望在LFS下使用qemu,呵呵。

首先到http://fabrice.bellard.free.fr/qemu/download.html下载qemu和kqemu的源代码,我使用的版本是qemu-0.8.2.tar.gz和kqemu-1.3.0pre9.tar.gz,不同的版本差别应该不大。

首先安装qemu:
root@LFS qemu # tar xf qemu-0.8.2.tar.gz
root@LFS qemu # cd qemu-0.8.2
由于使用gcc4编译qemu可能会有问题,这个在直接使用./configure时也会有提示,所以使用gcc3来编译:
root@LFS qemu-0.8.2 # ./configure –cc=/opt/gcc-3.3.6/bin/gcc –host-cc=/opt/gcc-3.3.6/bin/gcc –enable-alsa –enable-system –enable-user –prefix=/usr
Install prefix          /usr
BIOS directory       /usr/share/qemu
binary directory     /usr/bin
Manual directory   /usr/share/man
ELF interp prefix    /usr/gnemul/qemu-%M
Source path          /root/qemu/qemu-0.8.2
C compiler             /opt/gcc-3.3.6/bin/gcc
Host C compiler     /opt/gcc-3.3.6/bin/gcc
make                     make
install                    install
host CPU               i386
host big endian     no
target list              i386-user arm-user armeb-user sparc-user ppc-user mips-user mipsel-user i386-softmmu ppc-softmmu sparc-softmmu x86_64-softmmu mips-softmmu mipsel-softmmu arm-softmmu
gprof enabled       no
profiler                  no
static build            no
SDL support          yes
SDL static link       yes
mingw32 support  no
Adlib support        no
CoreAudio support no
ALSA support         yes
DSound support    no
FMOD support        no
kqemu support      yes
Documentation      yes
root@LFS qemu-0.8.2 # make
root@LFS qemu-0.8.2 # make install

ok,keqmu安装完成了,测试一下:
下载一个freedos的qemu镜像,把下载的镜像解压缩:
root@LFS qemu # bunzip2 freedos.img.bz2
使用qemu运行:
root@LFS qmeu # qemu -hda freedos.img
呵呵,看到了freedos的运行吧,说明qemu已经成功安装并能正确运行了。

不过现在还没有kqemu加速,接下来安装kqemu,kqemu的安装比较简单:
root@LFS qemu # tar xf kqemu-1.3.0pre9.tar.gz
root@LFS qemu # cd kqemu-1.3.0pre9
root@LFS kqemu-1.3.0pre9 # ./configure
Source path         /root/qemu/kqemu-1.3.0pre9
C compiler           gcc
Host C compiler   gcc
make                   make
host CPU             i386

kernel sources    /lib/modules/2.6.16.27/build
kbuild type          2.6
root@LFS kqemu-1.3.0pre9 # make
root@LFS kqemu-1.3.0pre9 # make install
好了,kqemu已经安装
root@LFS qemu # modprobe kqemu major=0

至此,qemu和kqemu已经安装完毕,为了每次系统启动后能够使用kqemu,可以把modprobe kqemu major加到/etc/rc.d/rc.local中。