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
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/Linuxのglibcの問題でした。Sol10では関係ないかも・・・調査中
参考:MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.3 InnoDB の構成
それよりは64bitのOSに乗り換えたほうがいいのではないかと、個人的には思います。
メモリ割り当ての指標に関しては、KLabさんのblogが非常に参考になります。いつもお世話になります。m(__)m
参考:5分でできる、MySQLのメモリ関係のチューニング!
利用環境によって色々とあるとは思いますが、とりあえず私の設定値。
- Linux CentOS5 32bit Mem4GB
- MyISAMとInnodbを両方とも使いますがメインは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なので、不必要なら元に戻しておきましょう。