manを実行すると以下のようなエラーになることがある。
XXX XXX WARNING: old character encoding and/or character set XXX
いろいろ調べた結果、libiconvが悪さしていた。/usr/bin/iconvではなく、/usr/local/bin/iconvを見に行っていたのが原因だった。/usr/local/bin/iconvのファイル名を変更したら治った。
manを実行すると以下のようなエラーになることがある。
XXX XXX WARNING: old character encoding and/or character set XXX
いろいろ調べた結果、libiconvが悪さしていた。/usr/bin/iconvではなく、/usr/local/bin/iconvを見に行っていたのが原因だった。/usr/local/bin/iconvのファイル名を変更したら治った。
前から使ってたけど今はあまり使ってないデスクトップ、最近主力のMacBook、たまに使うLet’s NoteとうちにはPCが3台ある。あとGentooサーバー。全部の環境からmp3を共有したかったので、GentooでiTunesサーバーをたてて共有することにした。
まずはデスクトップからごっそり外付けHDDにmp3をコピー。1万曲超、60GBくらいあった。これをGentooにぶっさして、とりあえず放置。Gentooで環境構築。
wget http://www.porchdogsoft.com/download/howl-1.0.0.tar.gz tar zxf howl-1.0.0.tar.gz cd howl-1.0.0 ./configure && make && sudo make install && cd sudo emerge libogg sudo emerge libvorbis sudo emerge mt-daapd sudo cp /etc/mt-daapd.conf.example /etc/mt-daapd.conf
confは適当にmp3の入った外付けHDDのmount先を指定したりweb_rootのパスワード指定したりする程度。これであっさり行くと思ったら、まずこのままではmt-daapdが起動しない。なぜか知らないが/etc/init.d/mt-daapdで、depend()部分が間違ってるのが原因。mDNSResponderをmDNSResponderPosixに修正、mDNSResponderPosixを起動してから再度動かすと動いた。
これでとりあえず動いたものの、MacのiTunes上からは文字化けの嵐。WindowsのiTunesでは問題ない。つまり文字コードの問題だな。ここは先人の知恵を借り、ググってみるとwindows上で変換しるとよいことが判明。HDDを一旦デスクトップにつないで、iTunesで曲を全部選択して「ID3タグを変換」→「Unicodeを元に戻す」。何故かうまく行かないで化けちゃうのがあるので、個々に探して同様に変換したら直った。とりあえずこれでタグは問題なくUnicodeになったので、再度Gentooにつないでmountしてmt-daapdのキャッシュをクリアしたらok。ちなみにmountするときには、mount -o noauto,users,umask=000,iocharset=utf8とか言ってやらないと正しくGentoo上で日本語が読めない。
これでokかと思いきや、やっぱり文字化けは解消せず。色々調べてみたら、パッチを当てれば解決することが判明。
sudo emerge -C mt-daapd wget http://nchc.dl.sourceforge.net/sourceforge/mt-daapd/mt-daapd-0.2.4.2.tar.gz tar zxf mt-daapd-0.2.4.2.tar.gz cd mt-daapd-0.2.4.2 wget http://www.kzsoft.to/~kazu/mt-daapd/patch/mt-daapd-0.2.4-cp932.patch patch < mt-daapd-0.2.4.2.tar.gz
parser.cのパッチでこけるので、手動でパッチした。とりあえずdiffを残しておく。
--- src/parser.c.orig 2008-04-20 04:44:54.000000000 +0900
+++ src/parser.c 2008-09-23 17:16:15.000000000 +0900
@@ -132,8 +132,18 @@
#define AGO 287
#define INTERVAL 288
+#define USE_CP932
-
+#ifdef USE_CP932
+ #define UNKNOWN_STR "UNKNOWN"
+ #ifndef FILESYSTEM_CES
+ #define FILESYSTEM_CES "CP932"
+ /*
+ #define FILESYSTEM_CES "UTF-8"
+ #define FILESYSTEM_CES "EUC-JP"
+ */
+ #endif
+#endif
/* Copy the first part of user declarations. */
#line 1 "parser.y"
@@ -167,6 +177,11 @@
#include <string.h>
#include "playlist.h"
+#ifdef USE_CP932
+ #include <iconv.h>
+ #include <errno.h>
+#endif
+
#define YYERROR_VERBOSE 1
extern int yyerror(char *msg);
@@ -1828,6 +1843,43 @@
#line 174 "parser.y"
+#ifdef USE_CP932
+#define MAX_ICONV_BUF 1024
+
+typedef enum {
+ ICONV_OK,
+ ICONV_TRYNEXT,
+ ICONV_FATAL
+} iconv_result;
+
+static iconv_result do_convert(const char* to_ces, const char* from_ces,
+ char *inbuf, size_t inbytesleft,
+ char *outbuf_orig, size_t outbytesleft_orig) {
+ size_t rc;
+ iconv_result ret = ICONV_OK;
+
+ size_t outbytesleft = outbytesleft_orig - 1;
+ char* outbuf = outbuf_orig;
+
+ iconv_t cd = iconv_open(to_ces, from_ces);
+ if (cd == (iconv_t)-1) {
+ return ICONV_FATAL;
+ }
+ rc = iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
+ if (rc == (size_t)-1) {
+ if (errno == E2BIG) {
+ ret = ICONV_FATAL;
+ } else {
+ ret = ICONV_TRYNEXT;
+ memset(outbuf_orig, '\0', outbytesleft_orig);
+ }
+ }
+ iconv_close(cd);
+
+ return ret;
+}
+#endif
+
PL_NODE *pl_newintpredicate(int tag, int op, int value) {
PL_NODE *pnew;
@@ -1867,7 +1919,25 @@
pnew->op=op;
pnew->type=T_STR;
pnew->arg1.ival=tag;
+#ifdef USE_CP932
+ if (!strcasecmp(FILESYSTEM_CES, "UTF-8")) {
pnew->arg2.cval=value;
+ } else {
+ char* iconv_buf = (char*)calloc(MAX_ICONV_BUF, sizeof(char));
+ if (iconv_buf) {
+ iconv_result rc = do_convert("UTF-8", FILESYSTEM_CES, value, strlen(value),
+ iconv_buf, MAX_ICONV_BUF);
+ if(rc == ICONV_OK) {
+ pnew->arg2.cval = iconv_buf;
+ } else {
+ pnew->arg2.cval = strdup(UNKNOWN_STR);
+ free(iconv_buf);
+ }
+ }
+ } // if utf-8
+#else
+ pnew->arg2.cval=value;
+#endif
return pnew;
}
こけるのは#ifdef USE_CP932から#endifまでなので、まぁ手動で当てても特別問題はないだろう。あとは普通にconfigureしてmake && make installなんだが。このままだと/etc/init.d/mt-daapdが使えないので、適当に以下のように編集する。
PIDFILE="/var/run/mt-daapd.pid"
CONFFILE="/etc/mt-daapd.conf"
depend() {
need net
need mDNSResponderPosix
}
start() {
ebegin "Starting mt-daapd DAAP server"
/usr/sbin/mt-daapd -c ${CONFFILE} &
eend $?
}
stop() {
ebegin "Stopping mt-daapd DAAP server"
kill `cat ${PIDFILE}`
eend $?
rm -f ${PIDFILE}
}
とりあえず今あるものを共有する、という意味ではこれで万事よいのだが、俺の環境ではまだ問題があった。実は外付けHDDは元々Windowsで使っていたものなので、当然フォーマットはNTFS。でもmountしてるのはGentooなわけなので、普通にmountしたのではどうがんばってもリードオンリーになってしまう。これでは新しく曲を追加したり出来ない訳で、これは困る。メインはMacBookなので、samba経由で書き込めないと困ってしまう訳だ。色々試行錯誤したんだけど、ntfs-3gとかいうのを使ったらすげーあっさりと書き込みできるようになった。
sudo emerge ntfs3g sudo update-modules sudo su - echo "/dev/sdb5 /mnt/usbhdd ntfs-3g noauto,users,umask=000,iocharset=utf8 0 0" >> /etc/fstab logout sudo mount /dev/sdb5 /mnt/usbhdd
あとは/etc/mt-daapd.confで、rescan_intervalを適当な値に設定しておいてやればok。
基本的にCFW導入のためにはパンドラバッテリー(ジグキックバッテリー + マジックメモリースティック(MMS))が必要。で、PSP-2000でジグキックバッテリーは作成できず、CFW導入済みのPSPがないといかん。つーことで終了なんだが、諦めるのはまだ早い。
PSP 2000対応 Tool Service Mode Battery (PSP新機種対応)
これをamazonさんで購入すればよい。あとはメモステとUSBケーブルがあれば、新型PSPのみでCFW(カスタムファームウェア)導入を参照してその通りにやるだけ。注意する点としては、作業前に購入したTOOLバッテリーをちゃんと充電すること。1時間半くらい。ACアダプタ刺さってると当たり前だけどバッテリーは使われないので、自動起動しないのでね。
3.71M33入れたら3.80M33に手動でアップデートし、後はネットワークアップデートで3.90M33-3へ。これで持ってるUMDをISO化して遊べるな。電池持ちも良くなるし、読み込みも早くなるし。
あ、当然なんだけど、これやると保証は受けられなくなるので自己責任で。
前回のwordpressのformatterがキモいタグを生成するので、どうにかするはME2.2.3以外でpatchすると、管理画面で激しくwarningが出てエライことになる。ので、v2.3.3用のpatch。
--- www/wp-includes/formatting.php.orig Thu Feb 28 16:37:29 2008
+++ www/wp-includes/formatting.php Thu Feb 28 16:39:27 2008
@@ -63,7 +63,7 @@
$pee = $pee . "\n"; // just to make things a little easier, pad the end
$pee = preg_replace('|<br />\s*<br />|', "\n\n", $pee);
// Space things out a little
- $allblocks = '(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|map|area|blockquote|address|math|style|input|p|h[1-6]|hr)';
+ $allblocks = '(?:code|table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|map|area|blockquote|address|math|style|input|p|h[1-6]|hr)';
$pee = preg_replace('!(<' . $allblocks . '[^>]*>)!', "\n$1", $pee);
$pee = preg_replace('!(</' . $allblocks . '>)!', "$1\n\n", $pee);
$pee = str_replace(array("\r\n", "\r"), "\n", $pee); // cross-platform newlines
@@ -88,6 +88,10 @@
if (strpos($pee, '<pre') !== false)
$pee = preg_replace_callback('!(<pre.*?>)(.*?)</pre>!is', 'clean_pre', $pee );
$pee = preg_replace( "|\n</p>$|", '</p>', $pee );
+ $pee = preg_replace('| {4}|', str_repeat(' ',4), $pee);
+ $pee = str_replace('\\', '\\\\', $pee);
+ $pee = preg_replace('|<code>.*?</code>|se', "str_replace(array('<p>', '</p>'), array('', '<br /><br />'), '$0')", $pee);
+ $pee = StripSlashes($pee);
return $pee;
}
<p></code></p>とかいう謎タグが生成されて激しく気持ち悪いので、phpに手を入れる。As You Like It ? Blog Archive ? WordPressのエディタとの付き合い方を参照して、その通りに書き換えるだけ。patchにしとく。
--- formatting.php.org Fri Feb 22 18:23:52 2008
+++ formatting.php Fri Feb 22 18:21:16 2008
@@ -55,7 +55,7 @@
$pee = $pee . "\n"; // just to make things a little easier, pad the end
$pee = preg_replace('|<br />\s*<br />|', "\n\n", $pee);
// Space things out a little
- $allblocks = '(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|map|area|blockquote|address|math|style|input|p|h[1-6]|hr)';
+ $allblocks = '(?:code|table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|map|area|blockquote|address|math|style|input|p|h[1-6]|hr)';
$pee = preg_replace('!(<' . $allblocks . '[^>]*>)!', "\n$1", $pee);
$pee = preg_replace('!(</' . $allblocks . '>)!', "$1\n\n", $pee);
$pee = str_replace(array("\r\n", "\r"), "\n", $pee); // cross-platform newlines
@@ -80,6 +80,13 @@
if (strpos($pee, '<pre') !== false)
$pee = preg_replace('!(<pre.*?>)(.*?)</pre>!ise', " stripslashes('$1') . stripslashes(clean_pre('$2')) . '</pre>' ", $pee);
$pee = preg_replace( "|\n</p>$|", '</p>', $pee );
+ $pee = preg_replace('| {4}|', str_repeat('&nbsp;',4), $pee);
+ $pee = str_replace('\\', '\\\\', $pee);
+ $pee = preg_replace(
+ '|<code>.*?</code>|se'
+ , "str_replace(array('<p>', '</p>'), array('', '<br /><br />'), '$0')"
+ , $pee);
+ $pee = StripSlashes($pee);
return $pee;
}
そろそろ見てくれを変えてやろうと思って、そのついでにwordpressのバージョンアップ+文字コードの変更。今時eucってのもあれなんで、ついでにutf-8化。
mysqldump -uroot -p -hHOST -q DATABASE > ./dumped.sql
nkf -w --overwrite ./dumped.sql
mysql -uroot -p -hHOST DATABASE < ./dumped.sql
こんだけかと思いきや、権限周りが壊れてログイン不能になったので「WordPress標準ガイドブック」サポートサイト ? capabilities.phpのエラーが表示された場合 を参照してパッチを当てる。
自分用メモ。
基本的にはGentoo distcc ドキュメント・DistCC クロスコンパイルガイド、この2つのドキュメントの通り行う。気をつけなきゃいけないのは、「資源を借りる側」と「資源を貸す側」で若干設定が異なる点。ここでは借りる側はi686(192.168.0.4)、貸す側はamd64(192.168.0.3)とする。
貸す側と借りる側で、gccのバージョンは同じであること。3.3.x同時はOKだが、3.3.xと3.2.xは混ぜないこと。
また、資源を借りる側は一方的に借りるだけで、相互に助け合わない設定とした。これは、貸す側はサーバなので24時間稼働しているが、借りる側はノートなのでそうした。
emerge distcc crossdev
vi /etc/make.conf
MAKEOPTS="-j8" #(CPUの数+1)*2 ここは全体じゃなくてサーバ単体で計算すべきなのかも。詳細不明…もしかしたら-j6が当たりなのかも?
FEATURES="distcc"
DISTCC_DIR="/var/tmp/.distcc"
PORTDIR_OVERLAY="/usr/local/portage"
distcc-config --set-hosts "localhost 192.168.0.4"
vi /etc/conf.d/distccd
DISTCCD_OPTS="${DISTCCD_OPTS} --allow localhost --allow 192.168.0.4" #--allow 192.168.0.0/24でも可
/etc/init.d/distcc start
rc-update add distcc default
crossdev -t i686
emerge distcc
vi /etc/make.conf
MAKEOPTS="-j8" #(CPUの数+1)*2
FEATURES="distcc"
DISTCC_DIR="/var/tmp/.distcc"
vi /etc/conf.d/distccd
DISTCCD_OPTS="${DISTCCD_OPTS} --allow localhost" #相互に助け合いたい場合は--allow 192.168.0.3を足すか--allow 192.168.0.0/24にする
cd /usr/lib/distcc/bin
rm c++ g++ gcc cc
echo '#!/bin/bash' > i686-pc-linux-gnu-wrapper
echo 'exec /usr/lib/distcc/bin/sparc-unknown-linux-gnu-${0##*/} "$@"' >> i686-pc-linux-gnu-wrapper
chmod a+x i686-pc-linux-gnu-wrapper
ln -s i686-pc-linux-gnu-wrapper cc
ln -s i686-pc-linux-gnu-wrapper gcc
ln -s i686-pc-linux-gnu-wrapper g++
ln -s i686-pc-linux-gnu-wrapper c++
/etc/init.d/distcc start
rc-update add distcc default
export CC="i686-pc-linux-gnu-gcc"
借りる側から何か(それなりに時間のかかりそうなものを)emergeし、貸す側でtopコマンドで見てみる。distccというUSERでdistccやcc1というプロセスが見えれば成功している。当たり前だがコンパイルは速くなるが、configureやアーカイブのunpackは速くならないのであしからず。また、貸す側ではデフォルトでnice -15で実行されている。これは /etc/conf.d/distccdのDISTCCD_NICEで設定されているので、貸す側が暇なマシンなら変更してもいい。
インストールまでは上手くいったけど設定に嵌って酷い目にあった。
以下のものが必要。
さくっとemergeするわけだが、USEフラグに注意。cactiにはapache2/snmp、phpにはapache2/snmp/sockets/mysqlあたりが必要(gdとかxmlも必須なのか?よくわらかんがこの辺は/etc/make.confでデフォルトで付けている)。
cacti用のデータベースとユーザを作成し、付属のスクリプトでテーブルを作成する。
mysqladmin -u root create cacti -p mysql cacti -u root -p > /var/www/localhost/htdocs/cacti/cacti.sql mysql -u root mysql -p -e"GRANT ALL ON cacti.* TO cactiuser@localhost IDENTIFIED BY 'p4ssw0rd'" mysql -u root mysql -p -e"flush privileges"
次にphpのconfigファイルを、今設定したものに合わせて書き換える。
vi /var/www/localhost/htdocs/cacti/include/config.php $database_username = "cactiuser"; $database_password = "p4ssw0rd";
useradd -g apache -d /dev/null -s /bin/false -c cacti cacti
ホームディレクトリを/dev/null、ログインシェルを/bin/falseにすることで、cactiというユーザでログインできないようにする。この辺は適当に手を抜いてrootでやったりすると怖いので忘れずに。次にcactiユーザでデータの読み書きするためにパーミションを変える。
chown -R cacti:apache /var/www/localhost/htdocs/cacti
全部変えちゃったけどrraとlogディレクトリだけでいいかも。未検証。
適当なタイミングでスクリプトをブン回す。とりあえず5分間隔に設定。
vi /etc/crontab */5 * * * * cacti /usr/bin/php /var/www/localhost/htdocs/cacti/cmd.php > /dev/null 2>&1
ブラウザから http://hostname/cacti/ にアクセス。デフォルトのユーザとパスワードはadmin/admin。ウィザードが始まるがNext押していけばいい。adminのパスワードは適当なものに変更する。
色々設定するところがあるが、一番下にある参考URLらへんを参照。
ここでrrdtoolからACCESS DENIEDと言われてグラフが上手く表示されなかった。よくわからんがcactiでadminじゃなくてcactiというユーザを作り、User Management→cacti→Graph PermissionsでDenyをAllowにお変更してSave。Graph Managementからなんかグラフを選んで、右上の*Turn On Graph Debug Mode.をクリックするとログが見えるようになるので押してみる。今度は’rra/localhost_load_1min_5.rrd’: No such file or directoryとか怒られる。
見てみると確かにrraの下が空っぽなのでダメらしい。/var/www/localhost/htdocs/cacti/cmd.phpを実行してもエラーらしきものは出ておらず。しばらくココで嵌ったが、/var/www/localhost/htdocs/cacti/poller.phpを実行すればOKだった。1回目は前のデータがないので怒られるが、もう1度やると問題なく実行された。そのあとcactiからはちゃんと見えるようになった。
Recent Comments