Linux下Mp3乱码问题的处理

在Linux下播放mp3的时候,经常碰到mp3的信息显示为乱码的问题。这是因为我们能找到的mp3文件标签大部分都是以GBK/GB18030编码的,而绝大多数的Linux(包括Linux系的手机系统)默认的编码是utf8,两者编码不同就会导致乱码问题的出现。

一个很好的解决方法就是安装Mutagen这个软件,用它来把mp3标签的编码统一转换为utf8。在Gentoo下可以通过以下命令安装:

emerge -av mutagen

装完后就可以通过以下命令来把目录下的所有mp3文件批量转换了:

cd /mnt/sda5/music   #转到音乐文件目录
find . -iname "*.mp3" -execdir mid3iconv -e gbk --remove-v1 {} \;
  • -e gbk 参数是代表把 GBK 编码的标签转换为 Unicode 编码,本身是 Unicode 编码的就不转换。如果需要转换其他编码的文件可以自行修改,如改为 Big5。
  • 不过它会同时用 Unicode 编码填满 D3v1, ID3v2, APEv2 标签,但是 ID3v1 又不支持中文的 Unicode 编码,所以转换后的 ID3v1 标签全是问号。所以最好加上 –remove-v1 参数,转换后删除 ID3v1 标签。

Gentoo下Java程序中文显示为方框的处理

最近在捣鼓Pre的时候碰到了一个问题:在我的Gentoo下,java程序的中文都显示为方框,如下图:
java程序中文显示错误图片"

最后,在网上找到了解决方法:在/etc/java-config-2/current-system-vm/jre/lib下面建立目录fonts/fallback

mkdir -p  /etc/java-config-2/current-system-vm/jre/lib/fonts/fallback

然后在这个文件夹里创建一个中文字体的链接:

ln -s /usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc  /etc/java-config-2/current-system-vm/jre/lib/fonts/fallback/

这样java程序就可以正常的显示中文了。
java程序中文显示正常图片

一些常用的iptables规则

最近折腾几个ubuntu和centos的服务器,接触了一些基本的iptable的规则,记录下来以备不时需。

iptables的基本语法格式是:

iptables [-t 要操作的表] <操作命令> [要操作的链] [规则号码] [匹配条件] [-j 匹配后的动作]

具体的参数可以参照帮助文档,下面是几个常用的例子:

让远程的计算机可以ssh连接到当前计算机(打开22端口)

iptables -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

让远程的计算机可以使用当前计算机提供的FTP服务(打开20、21端口)

iptables -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 20:21 -j ACCEPT

让远程的计算机可以使用当前计算机提供的网页服务(打开80、433端口)

iptables -A RH-Firewall-1-INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
iptables -A RH-Firewall-1-INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT

让远程的计算机可以使用当前计算机提供的数据库服务(打开3306端口)

iptables -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

Git从使用非默认SSH端口的远程仓库上克隆

这篇文章只是记录以防以后忘记。

假设,有台机子的SSH端口设置为3022(SSH默认的端口为22,不过为了安全,很多人都自己定义另外的端口)且有一个Git仓库,现在要把这个仓库克隆到本地,则可以用到以下命令:

git clone ssh://user@domain.com:3022/~/Projects/my_project

Rails3.1 invalid multibyte char错误处理

代码文件有中文字符,打开页面时报:invalid multibyte char (US-ASCII) 错误,造成这个错误是因为Ruby1.9默认用ASCII编码来读源码的,如果代码里有非ASCII字符,就会发生这个错误。解决的方法是在有非ASCII字符文件的首行指定encoding即可,如:

# encoding: utf-8
class ApplicationController < ActionController::Base
  protect_from_forgery
  ...........

话说每一个文件都要加是不是太麻烦点?就不能弄一个全局设定来吗?

Mysql乱码一例

前几天要把一个网站从服务器A转移到服务器B,原本以为这是一个很简单的事情,结果把网站程序复制过去之后,却发现有问题了:从数据库里读取出来的数据都变成乱码了!

初步认为是字符集的问题,但是看了导入的数据库的语句,都有指定了DEFAULT CHARSET=utf8,也没看出有什么问题啊。多次删除——重建——导入数据库结果都还是乱码,突然想到“会不会是建立数据库时默认的编码不同呢”? 马上输入sql命令查看:

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | latin1                     |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

果然默认的字符集是latin1,难怪使用utf8来读取的时候会出现乱码。知道原因就比较好办了,修改/etc/mysql/my.cnf在相应的位置添加以下内容:

[client]
default-character-set=utf8

[mysqld]
character-set-server = utf8

然后重启mysql服务就可以应用新的设置了:

/etc/init.d/mysql restart

查看结果:

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.08 sec)

为什么同样是默认的配置(服务器A的mysql默认配置文件里也没有上面添加的那两条内容),在服务器A和服务器B的结果不一样呢,难道是因为两个服务器使用的发行版不同所以默认的参数也就不一样吗?(服务器A使用的Gentoo,服务器B使用的是Ubuntu)看来不同发行版会使用不同的默认参数这个问题以后要多多注意才行。

Gentoo Rails3.1 安装笔记

Rails3.1的预览版已经出来了,带来了Sass和CoffeeScript这两个另人向往的新特性,因此打算在我的Gentoo上也安装来体验一下。

rvm use 1.9.2@railspre --create
gem update --system
gem update rake
gem install rails -v ">=3.1.0rc"

Rails3.1 需要Ruby >=1.9.2、Gem >=1.8.5、Rake >=0.9.1,所以在安装Rails3.1之前要先检查一下这几个条件是否已经达到。另外,现在网上看到的很多文章都说安装Rails3.1只需要:

gem install rails --pre

但这个方法从6月1日起就不行了,所以现在要改用:

gem install rails -v ">=3.1.0rc"

当使用rvm转到Ruby1.9.2的时候,会有一个问题:

gem -v
<internal:lib/rubygems/custom_require>:29:in `require': no such file to load -- auto_gem (LoadError)
	from <internal:lib/rubygems/custom_require>:29:in `require'

这是因为gem还在使用系统的库文件,而系统里的Ruby版本还是1.8.*版的,所以就会有这个问题,解决的方法就是执行:

unset RUBYOPT

另外,使用Rails3.1的时候出现下面的错误:

ExecJS::RuntimeError
Could not find a JavaScript runtime</pre></p>
ExecJS::RuntimeError

这是因为系统里没有JS的运行环境,只要手动安装一个就可以了:

emerge nodejs

GNOME下MPC的notify脚本

前两天终于让GNOME3稳定的运行在我的本本上了,觉得它的notify机制很不错,就写了一个小脚本,当我使用快捷键切换mpc的播放状态时,通过notify来显示当前的播放状态和歌曲名。

#!/bin/bash
#
# nmpc 可以把mpc当前播放的歌曲标题通过notify形式显示出来的脚本
#
# Script by: Dachao Nong <ohosanna@gmail.com>

TIMEOUT=5000
ICONPATH='/usr/share/icons/Faenza'
PLAYINGICON=$ICONPATH/actions/32/audio-cd-new.png
PAUSEDICON=$ICONPATH/actions/32/gtk-media-pause.png
STOPEDICON=$ICONPATH/actions/32/gtk-media-stop.png
ERRORICON=$ICONPATH/status/32/error.png

err() {
   echo "$1"
   exit 1
}

usage() {
  echo "usage: nmpc [command]"
  echo
  echo "Commands:"
  echo "     play - Starts playing song."
  echo "     next - Starts playing next song on playlist"
  echo "     prev - Starts playing previous song."
  echo "     stop - Stops playing."
  echo "     toggle - Toggles between play and pause. If stopped starts  playing."
  echo "     -h, --help     - display this"
  exit
}

nmpc_play () {
  mpc play > /dev/null 2>&1
  MSGTITLE="MPC Playing: "
  MSGBODY="`mpc | sed -n '1p'`"
  MSGICON=$PLAYINGICON
}

nmpc_next () {
  mpc next > /dev/null 2>&1
  MSGTITLE="MPC Playing: "
  MSGBODY="`mpc | sed -n '1p'`"
  MSGICON=$PLAYINGICON
}

nmpc_prev () {
  mpc prev > /dev/null 2>&1
  MSGTITLE="MPC Playing: "
  MSGBODY="`mpc | sed -n '1p'`"
  MSGICON=$PLAYINGICON
}

nmpc_stop() {
  mpc stop > /dev/null 2>&1
  MSGTITLE="MPC Stoped!"
  MSGBODY=""
  MSGICON=$STOPEDICON
}

nmpc_toggle() {
  mpc toggle > /dev/null 2>&1
  if [ "`mpc | grep playing`" = "" ]; then
    MSGTITLE="MPC Paused!"
    MSGICON=$PAUSEDICON
  else
    MSGTITLE="MPC Playing: "
    MSGICON=$PLAYINGICON
  fi
  MSGBODY="`mpc | sed -n '1p'`"
}

if [ "`ps -A | grep mpd`" = "" ]; then
  notify-send -t $TIMEOUT -i $ERRORICON -h int:transient:1 "Error" "Oooop!! Mpd not running!"
  exit 1
else
  if [ "`mpc | grep -o playing`" = "" ] && [ "`mpc | grep -o paused`" = "" ]; then
    mpc play > /dev/null 2>&1
  else
    case "$1" in
      'play')
	nmpc_play
      ;;
      'next')
	nmpc_next
      ;;
      'prev')
	nmpc_prev
      ;;
      'stop')
	nmpc_stop
      ;;
      'toggle')
	nmpc_toggle
      ;;
      *)
	usage
	exit 1
      ;;
    esac
    notify-send -t $TIMEOUT -i $MSGICON -h int:transient:1 "$MSGTITLE" "$MSGBODY"
  fi
fi

把上面的代码复制到$PATH目录下,就可以使用nmpc next | nmpc prev | nmpc play | nmpc toggle来控制MPC的播放了,可以把相应的命令绑定到快捷键上,很方便!

效果图
MPC notify by hosanna_cn, on Flickr

TODO:
现在这个脚本需要手动执行才会显示notify,下一步是打算让它在歌曲切换的时候自动把歌曲名显示,要实现这个可能用python|ruby|perl会容易一点。

Gentoo下ROR rails/cli (LoadError)的解决

想学习一下Ruby On Rail,结果安装完之后运行rails new demo新建新项目的时候出现以下错误:

/usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require': no such file to load -- rails/cli (LoadError)
from /usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:36:in `require'
from /usr/lib64/ruby/gems/1.8/gems/rails-3.0.3/bin/rails:8
from /usr/bin/rails:8:in `load'
from /usr/bin/rails:8

最后是通过

emerge -avD =dev-ruby/rack-mount-0.6.13 =dev-ruby/erubis-2.6.6 

把两个包降级后暂时解决这个问题,是新包有问题还是有其它的解决方法?

遭遇“黑客”

人说“常在河边走,哪有不湿鞋”,在“挨踢”界混了几年的老农终究还是遇到“黑客”了!

事情的是这样的: 早上某楚说他一个客户的网站打不开了,FTP上面看到有人上传了两个ASP和一个mp3文件,让我看一下是怎么回事。远程登录到服务器上,先查看这几个文件的创建日期,是4月12日创建的。OK,有了文件创建的时间,范围就小很多了!把那段时间的系统日志翻出来(Linux系统的日志默认是按一个星期打包一个文件的),一下子就找到了这几个文件上传时使用的FTP账号和IP地址!

再在网上找这个IP的所有人,发现是一个叫“上海科技网”所有,应该是有人在这个公司购买了接入服务之类。然后再在google上搜了一下这个IP相关的信息,发现这个IP的所有人还真的是专业骗子,涉入的业务包括(但不限于)植入木马盗取游戏账号、在淘宝上出售假考研试题等等。经常出没的网站是一些交友网站(连人也不放过??)和一个带有黑客性质的论坛(很基础那种)。甚至还有受害人公布了他的姓名、手机号、银行账号等信息,因为未经验证准确性,所以就不公布了。

看来这个所谓的“黑客”只是一个很菜很菜的菜鸟,应该是那种只会上网找一些现成工具做暴力破解。这点可以从他在一个Linux服务器上放一个ASP的木马就可以看得出来,囧…………

这个故事告诉我们:

  1. Linux的日志文件是很强大的。
  2. 现在的互联网是很强大的,不要以为你做了点什么坏事别人会不知道,我这么门外汉的都可以得到这么多信息,警察蜀黍真的有心查你的话,那还真的是很容易(虽然他们每天很忙,要斗地主没什么时间理你)。