波線を含むメールが文字化けする問題への対処

 メイドめーるでは日本語のメールを送信するために、
ヽ( ・∀・)ノくまくまー(07-31[長年日記])で書いていただいている、Iso2022jpMailerを使っています。
クラスを継承するだけでつかえるとてもいいアイデアだったのですが、たった一つ問題が。

IMGP8827.JPG

「~」が文字化けするのです。普通のアプリケーションだったら、まあ横棒でいいか、とか言えるし、実際メイドめーるも今日までそうやってごまかしてきたのですけど。萌え萌えなメイドさんがメールをくれるアプリケーションにおいて「~」がつかえないと言うことは、「おはようございます~」がつかえないことになってしまいます。
「おはようございますー」と「おはようございます~」は断じて違うのです!

とまあそんなわけで、技術的に追求した結果、一応「~」が出せるようになりましたのでご報告です。

IMGP8828.JPG

やり方としては、Iso2022jpMailer の

@mail.body = NKF::nkf('-j', @mail.body)

の部分を

@mail.body = NKF::nkf('-Wxm0 --oc=ISO-2022-JP-1', @mail.body)

に置き換えます。
ついでに、タイトルとかに「~」がはいることもあるだろうから、

text = NKF.nkf('-j -m0', text)

も、

text = NKF.nkf('-Wxm0 --oc=ISO-2022-JP-1', text)

にしちゃいました。

技術的な話

正直に言うと、なんでこれで化けないのか、最終的な理由は理解できていません。
ただ、あれこれやっているうちに、化ける時と化けない時があって、比較するとこうなっていることが分りました。

wave_on_jis.PNG

上がうまくいく場合で、下が駄目な場合です。日本語メールなのでJISコードでエンコードしてあります。
OKな時は1B 24 42で始まっていて、駄目な時は1B 24 48で始まる…、つまり、JIS X 0208-1983でエンコードしてあればOKで、JIS X 0212-1990だと駄目なことが分ります。
NKFのコマンド詳細を見ながら、irbでいろいろやってみると。

>> NKF::nkf('-jWxm0', "~").each_byte{|b| print b.to_s(16)+","};print "\n"
1b,24,28,44,22,37,1b,28,42,
=> nil
>>NKF::nkf('-Wxm0 --oc=ISO-2022-JP', "~").each_byte{|b| print b.to_s(16)+","};print "\n"
1b,24,28,44,22,37,1b,28,42,
=> nil
>> NKF::nkf('-Wxm0 --oc=ISO-2022-JP-1', "~").each_byte{|b| print b.to_s(16)+","};print "\n"
1b,24,42,21,41,1b,28,42,
=> nil
>> NKF::nkf('-Wxm0 --oc=ISO-2022-JP-3', "~").each_byte{|b| print b.to_s(16)+","};print "\n"
1b,24,28,50,28,37,1b,28,42,
=> nil

–oc=ISO-2022-JP-1の時だけ、ねらい通りの変換をしてくれるようです。ということで、Iso2022jpMailerにも、同じ引数を渡してあげると、「~」が出るようになった次第。
「ISO-2022-JP-1」って、JIS X 0212に対応させるための引数で。むしろ逆のような気がするし、なんでISO-2022-JP-3で駄目なのかも謎です。

[ruby]mextractor web apiのライブラリ

Mextractrに関する注目が集まっているので、自分が使っているライブラリを公開します。

mextractr_webapi.rb

#RubyForgeのプロジェクトは今申請中なので、gemはちょっとお待ちくださいませ。

使い方としては、APIキーを取得して、

$ script/console
Loading development environment (Rails 2.0.2)
>> require "mextractr_webapi"
>> mextractr = MextractrWebApi.new(MEXTRACTR_KEY)
>> res = mextractr.parse("11/27(木)、京都市中京区のはてな京都オフィスでShibuya Perl Mongersテクニカルトークのパブリックビューイングが開催されます。")
>> pp res
{"id"=>"20081127_0001",
"updated"=>"2008-11-27T10:05:38+09:00"
"response"=>
"\n\n  Mextractr WebAPI results\n  2008-11-27T10:05:38+09:00\n  \n    Mextractr\n  \n  20081127_0001\n  \n    \n    20081127_0001\n    extracted event metadata\n    \n      Mextractr WebAPI\n    \n    2008-11-27T10:05:38+09:00\n    11/27(木)、京都市中京区のはてな京都オフィスでShibuya Perl Mongersテクニカルトークのパブリックビューイングが開催されます。\n    \n    \n    \n  \n\n",
"content"=>
"11/27(木)、京都市中京区のはてな京都オフィスでShibuya Perl Mongersテクニカルトークのパブリックビューイングが開催されます。",
"where"=>
[{"georss:point"=>nil, "valueString"=>"木)、京都市中京区"},
{"georss:point"=>nil, "valueString"=>"京都"}],
"when"=>[{"valueString"=>"11/27(木)", "startTime"=>"2008-11-27"}],
}

という具合です。
res[‘when’][0][‘startTime’]とか、res[‘where’][0][‘valueString’]という具合で各値を取り出すことが出来ます。

あと、MextractrWebApi.new(MEXTRACTR_KEY)の二つ目の引数にloggerを渡すと、取得してきたatomの内容とかを見ることが出来るので、挙動がおかしい時に犯人を突き止める一助になります。

[メイドめーる]メタデータ賞をいただきました

Drecom Award on rails 2008において、メイドめーるメタデータ賞を受賞しました。

もともとメタデータさんのMextractr WebAPIを見て作り始めたアプリケーションなので、もしかしてとれるかなぁ、と思っていたのですが、その通りになるとやっぱり嬉しいです。

メタデータの野村さんがブログにメッセージを書いてくださっています。

[mashup] メイドめーる その2 【表彰式!】 [mextractr] – 野村直之の日記: IT – とくにメタデータ – , 音楽
3分間ほど講評させていただいた中で、
・エンタープライズシステムの近未来を見せてくれている(!)
など申し上げました。これは、メイドめーるに対する正直な感想です

えええぇ~っ!?
そんな大それたアプリケーションではないのですけどね(汗)

[css]idとclassの覚え方

CSSを書いていると、「id要素の頭はシャープだっけドットだっけ」というのが思い出せなくてときどき検索する羽目に陥ります。
不必要に物事暗記しない主義なのですが、さすがにこれは効率が悪い。

  • idは、ユニークさを表すidだから、順番を表す#がつく。
  • classは、プログラミング言語のclassと一緒だから、this.getValueみたいにドットがつく。

これで覚えられるかな?なんか他にいい方法があったら教えてください。

[news]ケータイが執事になる、ドコモの新サービス「iコンシェル」が発表

うわぁ。携帯キャリアとまさかの正面衝突。

iコンシェルでは、羊のキャラクター「ひつじのしつじくん」が待受画面に現れ、プッシュで送られる情報が画面に表示されるので、それにアクセスすることで詳細情報が得られる仕組み。
ケータイが執事になる、ドコモの新サービス「iコンシェル」が発表 | 携帯 | マイコミジャーナル

ヒツジの執事は….
夢夢色TOWN | ひつじ執事さん
←ボクが先月お願いして描いていただいていたイラストです。
電話番号入れたら住所引っ張ってくる機能とか、ボクが思っていたものそのまま…orz

先を越されたのは悔しいです。でも、つまり自分の見ていた方向性は間違っていなかったと言うことだし。もし自分が作っていたら、アドレス帳に勝手に情報追加とかはとても出来なかったはずなので、キャリアさんがやるというのであれば、楽しみに見ていようと思います。

[mysql]Table ‘mysql.procs_priv’ doesn’t exist

mysqlをアップグレードしたらば。

mysql> FLUSH PRIVILEGES;
ERROR 1146 (42S02): Table 'mysql.procs_priv' doesn't exist

こういうエラーが出るようになった。

たぶんmysqlを4→5にアップグレードしちゃったことが原因。yum一発アップグレードは怖いなぁ。

ともあれ、Table ‘mysql.procs_priv’ doesn’t existでググったら、

MySQL Bugs: #9934: DROP USER fails if mysql.procs_priv doesn’t exists
というのが出てきて、冷たいことを言われた末に、

If you encounter this after an update, run mysql_upgrade_shell command: it will create the missing table.
(アップグレード後にこのエラーが出たんだったら、mysql_upgrade_shellコマンドを走らせろ。それで欠けてるテーブルが作成されるから)

ということになっている。

(当然バックアップをとってから)やってみた。

[furukawa@www ~]$
sudo mysql_upgrade_shell --verbose --datadir=/var/lib/mysql --user=root --password=****
Running /usr/bin/mysqlcheck  --password=**** --check-upgrade --all-databases --auto-repair --user=root
expressionengine.exp_actions
error    : Table upgrade required. Please do "REPAIR TABLE `exp_actions`" to fix it!
expressionengine.exp_captcha
error    : Table upgrade required. Please do "REPAIR TABLE `exp_captcha`" to fix it!
expressionengine.exp_categories
error    : Table upgrade required. Please do "REPAIR TABLE `exp_categories`" to fix it!
expressionengine.exp_category_field_data
:(略)
mysql.time_zone_transition_type                    OK
mysql.user                                         OK
This script updates all the mysql privilege tables to be usable by
the current version of MySQL
done

REPAIR TABLEする必要があるらしい。

[furukawa@www ~]$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 82
Server version: 5.0.68 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> use expressionengine;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> REPAIR TABLE `exp_actions`;
+---------------------------------+--------+----------+----------+
| Table                           | Op     | Msg_type | Msg_text |
+---------------------------------+--------+----------+----------+
| expressionengine.exp_actions    | repair | status   | OK       |
+---------------------------------+--------+----------+----------+
1 row in set (0.00 sec)
:(略)

以下、この調子でテーブルを片っ端からREPAIRしていく。

columns_priv以降のテーブルはmysqlデータベースに入っている。

mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> REPAIR TABLE `columns_priv`;
+--------------------+--------+----------+----------+
| Table              | Op     | Msg_type | Msg_text |
+--------------------+--------+----------+----------+
| mysql.columns_priv | repair | status   | OK       |
+--------------------+--------+----------+----------+
1 row in set (0.00 sec)
:(略)
mysql> exit
Bye
[furukawa@www ~]$
sudo mysql_upgrade_shell --verbose --datadir=/var/lib/mysql --user=root --password=****
mysql_upgrade already done for this version
This script updates all the mysql privilege tables to be usable by
the current version of MySQL
done
[furukawa@www ~]$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 84
Server version: 5.0.68 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

これでいいらしい。あんまり自信がないのだけれど、エラーメッセージでググった時に日本語の情報が出てこなかったので、とりあえずブログにあげておきます。

[メイドめーる]反響とお問い合わせへの回答

Secretary bird by Lip Kee

 おかげさまで、メイドめーるの登録者は、今朝の段階で1400名に到達しました。
使っていただくうちに問題点も見えてきたので、緊急度の高いものから順次対応させていただいております。

機能追加と不具合修正

ユーザー登録削除できるようにしました。

→ログイン後、「ユーザー登録情報を削除(退会)する」で削除できます。

範囲指定の予定があった場合に朝のメールが届かないことがあった

→ちゃんとメールできるように修正を行いました。

複数予定があった時のメールが見にくかった

→改行入れました(単純ミスです。ごめんなさい。)
 また、開始時刻でソートして表示するようにしました。

お問い合わせと回答

あと、ブログなどでメイドめーるを見た方からいただいた感想、あと、メールでいただいた問い合わせのうち、公開した方が良さそうなご意見などをまとめました。

なんでメイドなんだ

 萌えは大事な日本の輸出産業ですっ!

パスワードを忘れた

 パスワードリマインダは必須ですね。今追加しているので、ちょっとお待ちくださいませ。
今ログインできなくて困っている方については、メールいただけたら個別に対応させていただいております。

なお、先週前半、登録に失敗する不具合の際に、複数ユーザーアカウントが出来てしまってログインできない方が出現しました。
これについては、すでに解決済みなので、先週ログインできなくてあきらめてしまった方、もう一回試していただけるととても嬉しいです。

メイドじゃなかったら使うのに

執事が欲しい/ツンデレが欲しい

 やっぱり(笑)
そういうご要望があることは把握しているので、ちょっとお待ちくださいませ。

メールを送った時のタイトルについて

 文章にwhat(~が)があるとタイトルとして使うようにしているのですが、あんまり意図通りにならないことが多いみたいです。
改善考えているので、これもちょっとお待ちくださいませ。

メールを送った時の時刻について

 今のところ、日付はとれても時刻がとれないので、メタデータさんに機能追加をお願いしているところです。

[紹介]第11回OBIIミーティング「はてなブックマークPR大作戦」

先日書いた「はてな流大規模データ処理」を見てきたに大量のブックマークをいただきました。どうもありがとうございます。

「はてな流大規模データ処理」を見てきた

勝手に分析すると、関西で行われるイベントだったので首都圏の人があまり見に来られない状態で、みんな大好きはてなのお話、という条件がおいしかったかな、と思っております。
技術的にも大変興味深かったし。

ところで、東京にいた頃大変お世話になっていたOBII 大手町ビジネスイノベーションインスティテュートの関西発のイベント「第11回OBIIミーティング「はてなブックマークPR大作戦」」が11/29に開催されます。

OBII 大手町ビジネスイノベーションインスティテュート: 第11回OBIIミーティング「はてなブックマークPR大作戦」

関西で行われるはてなのイベント、ということで二匹目のドジョウの条件がそろっておりますので、興味のある方は是非どうぞ。

[メイドめーる]登録に失敗するバグを修正

GIGAZINEに載った!
先日公開したメイドめーるですが、GIGAZINEさんに取り上げていただいたおかげで、想定を上回るユーザーさんに登録いただいております。
毎朝メイドさんからGoogleカレンダーの予定がメールで届く「メイドめーる」 – GIGAZINE

ところが、101人目以降のユーザー登録に失敗してしまうバグがあったため、たくさんのユーザーさんが、登録できないでエラーになっちゃっているようです。ごめんなさい。

この不具合は、先ほど修正されました。

登録しようとしてエラーになった方は、中途半端に登録が完了した状態になってしまっているので、お手数ですが、以下の手順で登録し直していただくようお願いいたします。

  1. メイドめーるにアクセス。
    メイドめーる

  2. 登録したユーザー名とパスワードでログイン
    login.PNG

  3. 「ユーザー登録情報を削除(退会)する」をクリック
    config.PNG

以下、確認画面で「削除」を押すと登録情報が削除されるので、再度ユーザー登録していただくことが出来るようになります。お手数おかけしてしまって申し訳ないですが、よろしくお願いいたします。