Redmineでのメールの文字化けを直す!

Rubyユーザではないのですが、最近Redmineが素敵でしょうがないので、

社内のプロジェクト管理用に啓蒙しまくっています。


Redmineは設定も簡単で非常に快適に動く素敵なアプリなのですが、

送信されてくるメールに日本語が使われていると某Ou○loo○で文字化けしやすいという欠点がっ!

「これは他にも困ってる人がいるに違いない!」ということで他力本願で対策します。


さて、いつものようにGoogle先生にお伺いを立てると対策が見つかるのですが、

 Redmine 通知メールのエンコードをUTF-8からiso-2022-jpにする – 黒川仁の文具堂ブログ三昧

私の環境(Rails 2.3.2 + Redmine 0.8.4)では見事に・・・動きませんでしたorz

mongrel.logにはこんなエラーが出て動かず。GEM_HOME変数とかも効果なし。

〜〜中略〜〜
/usr/local/ruby/bin/mongrel_rails:19:in `load'
/usr/local/ruby/bin/mongrel_rails:19
Missing these required gems:
  gettext

You're running:
  ruby 1.8.7.174 at /usr/local/ruby/bin/ruby
  rubygems 1.3.4 at /.gem/ruby/1.8, /usr/local/ruby/lib/ruby/gems/1.8

Run `rake gems:install` to install the missing gems.

他にも対応されてる方は居ましたが

 メール通知をどうにかutf8をサポートしてないメーラーでも読めるようにする。 - ghostbass1.4β

んー、他力本願なので、あまりソースコードをいじるのは避けたい!


ということで視点を変えて、メール送信をやってるActionmailer部分の日本語化を探します。

 http://blog.imishin.com/projects/ruby/actionmailerja/

あった!入れるだけ!素晴らしい!

 # cd /var/www/redmine_install_dir
 # ruby script/plugin install git://github.com/kusakari/actionmailer_ja.git

Solaris10にgit環境を整えるほうが手間取ったのはアレとして、あっさりと文字化けメール解消です。

kusakariさんありがとうございます!

mysqlクライアントCUIコマンドで日本語入力が出来ない場合

確認するのは2点、

■configure時に[--with-readline]か[--without-readline]を付けること
いまいちわかりにくいと思いますが、両方ともreadlineを使うというオプションです。
「え?でもwithoutだよ?」って人、疑問はもっともです。

  • withのほうは、MySQLソースに同梱のreadlineを使うという意、
  • withoutのほうは、同梱を使わずにシステムにあるreadline(等)を使うという意

つまり両方ともreadlineを使うためのオプションだと思って結構です。
通常は--with-readlineをつけておけばだいたい大丈夫です。

両方ともつけない場合は、readlineではなくeditlineを使うようですが、
こちらは現在(MySQL5.0.51)まだバグでマルチバイトがうまく使えないようですね。


■.inputrcがきちんと書いてあること
「ちゃんとコンパイルしてるのに入力できないよぅ!」という人、.inputrcをちゃんと書いてみてください。
各ユーザのホーム(Sol10のrootユーザならデフォは/直下ですが)に.inputrcを作って、以下のような内容を書いてみましょう。

 set convert-meta off
 set meta-flag on
 set output-meta on

Google App Engine のSMS認証突破しました

自分の携帯「Vodafone 705T」ではどうやってもSMS認証が突破できず、
Gooele様側で解決してくれるまで半分あきらめかけていたのですが、
彼女が持ってた古い携帯「Vodafone 804SS」を使ったら突破できますた!

突破できる携帯でも[Japan]→[Vodafone(JP)]を選ぶと失敗する場合があるんで、
[Other]で送ってみましょう。



まあ近日中に解決する問題らしいので今更感満載ですがっ!

Solaris10で複数のシリアルポートからログインしたい

SolarisOSの制約で、複数のシリアルポートからコンソールログインが出来ません。

でもしたい。

ので、ポートモニターを使って実現してみます。

sol10(root)# sacadm -a -p mbmon -t ttymon -c /usr/lib/saf/ttymon -v `ttyadm -V` -y "TTY Ports a & b"
sol10(root)# pmadm -a -p mbmon -s a -f u -i root -v `ttyadm -V` -m "`ttyadm -i 'Terminal disabled' -l contty  -m ldterm,ttcompat -S y -d /dev/term/a -s /usr/bin/login`"
sol10(root)# pmadm -a -p mbmon -s b -f u -i root -v `ttyadm -V` -m "`ttyadm -i 'Terminal disabled' -l contty  -m ldterm,ttcompat -S y -d /dev/term/b -s /usr/bin/login`"


HPサーバのiLO2でライセンス無しでも使える[Remote Serial Console]をどうぞよろしくw



細かい説明はSunの素晴らしいドキュメントを読んでくださひ。

参考 http://docs.sun.com/app/docs/doc/805-1753/6j1n2iner?l=ja&a=view

MySQLを32bitのOSで使うときのメモリの制限

だいたいの32bitのOSでは、4GBまでがダイレクトに使えるメモリの上限量であることはご存知の方が多いと思います。
※このあたりの表現については詳しくないんで突っ込まないでください^^;


さて、MySQLを32bitのOSで使うときのメモリの制限ですが、結論から言うと「2GB」が上限です。

「え?4GBまで使えるんじゃないの?」と思った方、残念。me too, orz

MySQL側で制限されてるようなので、ソースをいじくれば解除できるのかもしれませんが、
7/23追記 32bit/Linuxglibcの問題でした。Sol10では関係ないかも・・・調査中
参考:MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.3 InnoDB の構成
それよりは64bitのOSに乗り換えたほうがいいのではないかと、個人的には思います。


メモリ割り当ての指標に関しては、KLabさんのblogが非常に参考になります。いつもお世話になります。m(__)m
参考:5分でできる、MySQLのメモリ関係のチューニング!


利用環境によって色々とあるとは思いますが、とりあえず私の設定値。

  • Linux CentOS5 32bit Mem4GB
  • MyISAMInnodbを両方とも使いますがメインはInnodb
  • 他にも多少は割り当てたいので少し余らす
  • MyISAMはインデックスがkey_bufferにのり、データファイルはOSのキャッシュにのるので注意
  • mymemcheckがすんばらしい :-)
global_buffers
  key_buffer_size                      67108864    64.000 [M]
  innodb_buffer_pool_size             805306368   768.000 [M]
  innodb_log_buffer_size                8388608     8.000 [M]
  innodb_additional_mem_pool_size      16777216    16.000 [M]
  net_buffer_length                       16384    16.000 [K]

thread_buffers
  sort_buffer_size                      4194304     2.000 [M]
  myisam_sort_buffer_size              16777216     2.000 [M]
  read_buffer_size                      2097152     2.000 [M]
  join_buffer_size                      1048576  1024.000 [K]
  read_rnd_buffer_size                  4194304     4.000 [M]

max_connections                             100

レプリケーションの遅延を計るシンプルな方法

MySQLレプリケーションをするときに、必ず気になるのが master-slave間の遅延だと思います。
そこで、先日のDeNAさんのテクノロジーセミナーで開示していただいたネタをもとに簡単な遅延監視方法を実装してみました。

  • MySQLバージョン 5.1.23
    • binlog_format=MIXED


まずmasterに以下のようなテーブルを作ります。databaseは適当に作ってください。

CREATE TABLE `replitimes` (
  `No` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `ldate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`No`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

当然slaveにも同じものが作成されたと思います。作成されてない人は遅延監視とか以前の問題ですね^^;


次に、master側で以下のようなSQLを実行してみましょう。

master> INSERT INTO replitimes (ldate) value (sysdate());


次にslaveで以下のようなクエリを投げて見ましょう。

slave > select * from replitimes;
+----+---------------------+---------------------+
| No | date                | ldate               |
+----+---------------------+---------------------+
|  1 | 2008-04-11 17:57:12 | 2008-04-11 17:57:12 |
+----+---------------------+---------------------+
1 row in set (0.00 sec)

きちんと反映されたでしょうか?
さて、それでは遅延をわざと発生させてどう変化するか確かめてみましょう。

slave > stop slave;
master> INSERT INTO replitimes (ldate) value (sysdate());
〜数秒待ってください〜
slave > start slave;
mysql> select *,ldate - date as delay from replitimes;
+----+---------------------+---------------------+-------+
| No | date                | ldate               | delay |
+----+---------------------+---------------------+-------+
|  1 | 2008-04-11 17:57:12 | 2008-04-11 17:57:12 |     0 |
|  2 | 2008-04-11 18:02:15 | 2008-04-11 18:02:24 |     9 |
+----+---------------------+---------------------+-------+
2 rows in set (0.00 sec)

[date]にはmasterでnow()を実行したときと同じTIMESTAMP値が、[ldate]にはslaveでsysdate()が実行されたときの時間が記録されたかと思います。


sysdate()を使うのがコツです。理由はbinlogを眺めてもらえれば自明ですね。

bash3.0 # ./bin/mysqlbinlog /usr/local/mysql_64/data/mysql-bin.000018
〜色々と中略〜
# at 4988971
#080411 18:02:15 server id 1  end_log_pos 4989094       Query   thread_id=1     exec_time=0     error_code=0
SET TIMESTAMP=1207904535/*!*/;
INSERT INTO replitimes (ldate) value (sysdate())/*!*/;
DELIMITER ;
# End of log file


ここで一つ注意なのが、パラメータ[binlog_format]です。
5.1.23では、以下の3つが選べます。

  • MIXED(Default)
  • STATEMENT
  • ROW

これを ROW にして行ベースレプリケーション(RBR)にしてしまうと、今回の手法は使えません。
MySQL5.1.12以降では、標準で MIXED が設定されているので敢えて変えない限りはこの手法で遅延を検出できます。(STATEMENTでも同じ動作を得ることが可能です)。詳細は・・・まあマニュアルを読んでください。
5.0系はいまのところステートメントベースレプリケーション(SBR)であり、5.1系で言うところの STATEMENT と同じ状況なので、この手法が使えると思います。

レプリケーションが"LOAD DATA INFILE"後に再開できない件

Super-Smackをインストール後にレプリケーションが再開できないことに気がついた orz
負荷試験などの前にはレプリケーションをSTOP/STARTすることは良くあると思いますが、今回も試験前に[stop slave]でレプリケーションを止めていたのですが、以下のエラーが出てレプリケーションが再開できません。

bash3.0 # less /usr/local/mysql_64/data/slave.err
〜色々と略〜
080411 15:17:06 [ERROR] Error reading packet from server: error reading log entry ( server_errno=1236)
080411 15:17:06 [ERROR] Got fatal error 1236: 'error reading log entry' from master when reading data fr
om binary log

どうやら"max_allowed_packet"の制限に引っかかっている模様。
MySQLのバージョンはmaster、slaveとも5.1.23・・・binlog_formatがMIXEDなせいの問題かな?あとで検証してみよう。※検証した。STATEMENTでも発生。

とりあえず回避方法は以下。

slave > stop slave;
master> set global max_allowed_packet = 10484736; ←LOADした量に応じてサイズは変える
slave > set global max_allowed_packet = 10484736; 
slave > start slave;


my.cnfに max_allowed_packet を指定してもいいが、上記の方法なら再起動が要りません。デフォルトは1MBなので、不必要なら元に戻しておきましょう。