2008年11月アーカイブ
メイドめーるでは日本語のメールを送信するために、
ヽ( ・∀・)ノくまくまー(07-31[長年日記])で書いていただいている、Iso2022jpMailerを使っています。
クラスを継承するだけでつかえるとてもいいアイデアだったのですが、たった一つ問題が。
「~」が文字化けするのです。普通のアプリケーションだったら、まあ横棒でいいか、とか言えるし、実際メイドめーるも今日までそうやってごまかしてきたのですけど。萌え萌えなメイドさんがメールをくれるアプリケーションにおいて「~」がつかえないと言うことは、「おはようございます~」がつかえないことになってしまいます。
「おはようございますー」と「おはようございます~」は断じて違うのです!
とまあそんなわけで、技術的に追求した結果、一応「~」が出せるようになりましたのでご報告です。
やり方としては、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)
にしちゃいました。
技術的な話
正直に言うと、なんでこれで化けないのか、最終的な理由は理解できていません。
ただ、あれこれやっているうちに、化ける時と化けない時があって、比較するとこうなっていることが分りました。
上がうまくいく場合で、下が駄目な場合です。日本語メールなので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で駄目なのかも謎です。
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要素の頭はシャープだっけドットだっけ」というのが思い出せなくてときどき検索する羽目に陥ります。
不必要に物事暗記しない主義なのですが、さすがにこれは効率が悪い。
- idは、ユニークさを表すidだから、順番を表す#がつく。
- classは、プログラミング言語のclassと一緒だから、this.getValueみたいにドットがつく。
これで覚えられるかな?なんか他にいい方法があったら教えてください。
うわぁ。携帯キャリアとまさかの正面衝突。
iコンシェルでは、羊のキャラクター「ひつじのしつじくん」が待受画面に現れ、プッシュで送られる情報が画面に表示されるので、それにアクセスすることで詳細情報が得られる仕組み。
ケータイが執事になる、ドコモの新サービス「iコンシェル」が発表 | 携帯 | マイコミジャーナル
ヒツジの執事は....
夢夢色TOWN | ひつじ執事さん
←ボクが先月お願いして描いていただいていたイラストです。
電話番号入れたら住所引っ張ってくる機能とか、ボクが思っていたものそのまま...orz
先を越されたのは悔しいです。でも、つまり自分の見ていた方向性は間違っていなかったと言うことだし。もし自分が作っていたら、アドレス帳に勝手に情報追加とかはとても出来なかったはずなので、キャリアさんがやるというのであれば、楽しみに見ていようと思います。
こういうエラーが出るようになった。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コマンドを走らせろ。それで欠けてるテーブルが作成されるから)
(当然バックアップをとってから)やってみた。
REPAIR TABLEする必要があるらしい。[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していく。[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) :(略)
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)
おかげさまで、メイドめーるの登録者は、今朝の段階で1400名に到達しました。
使っていただくうちに問題点も見えてきたので、緊急度の高いものから順次対応させていただいております。
機能追加と不具合修正
ユーザー登録削除できるようにしました。
→ログイン後、「ユーザー登録情報を削除(退会)する」で削除できます。範囲指定の予定があった場合に朝のメールが届かないことがあった
→ちゃんとメールできるように修正を行いました。複数予定があった時のメールが見にくかった
→改行入れました(単純ミスです。ごめんなさい。)また、開始時刻でソートして表示するようにしました。
お問い合わせと回答
あと、ブログなどでメイドめーるを見た方からいただいた感想、あと、メールでいただいた問い合わせのうち、公開した方が良さそうなご意見などをまとめました。
なんでメイドなんだ
萌えは大事な日本の輸出産業ですっ!
パスワードを忘れた
パスワードリマインダは必須ですね。今追加しているので、ちょっとお待ちくださいませ。
今ログインできなくて困っている方については、メールいただけたら個別に対応させていただいております。
なお、先週前半、登録に失敗する不具合の際に、複数ユーザーアカウントが出来てしまってログインできない方が出現しました。
これについては、すでに解決済みなので、先週ログインできなくてあきらめてしまった方、もう一回試していただけるととても嬉しいです。
メイドじゃなかったら使うのに
執事が欲しい/ツンデレが欲しい
やっぱり(笑)
そういうご要望があることは把握しているので、ちょっとお待ちくださいませ。
メールを送った時のタイトルについて
文章にwhat(~が)があるとタイトルとして使うようにしているのですが、あんまり意図通りにならないことが多いみたいです。
改善考えているので、これもちょっとお待ちくださいませ。
メールを送った時の時刻について
今のところ、日付はとれても時刻がとれないので、メタデータさんに機能追加をお願いしているところです。
sqlite> select "abc"||"def";なんでそんな変な記号を選んだかなぁ...
abcdef
Re: [sqlite] CONCAT in SQLite (was Re: [sqlite] correct syntax for CASE.
先日書いた「はてな流大規模データ処理」を見てきたに大量のブックマークをいただきました。どうもありがとうございます。
勝手に分析すると、関西で行われるイベントだったので首都圏の人があまり見に来られない状態で、みんな大好きはてなのお話、という条件がおいしかったかな、と思っております。
技術的にも大変興味深かったし。
ところで、東京にいた頃大変お世話になっていたOBII 大手町ビジネスイノベーションインスティテュートの関西発のイベント「第11回OBIIミーティング「はてなブックマークPR大作戦」」が11/29に開催されます。
OBII 大手町ビジネスイノベーションインスティテュート: 第11回OBIIミーティング「はてなブックマークPR大作戦」
関西で行われるはてなのイベント、ということで二匹目のドジョウの条件がそろっておりますので、興味のある方は是非どうぞ。
先日公開したメイドめーるですが、GIGAZINEさんに取り上げていただいたおかげで、想定を上回るユーザーさんに登録いただいております。
毎朝メイドさんからGoogleカレンダーの予定がメールで届く「メイドめーる」 - GIGAZINE
ところが、101人目以降のユーザー登録に失敗してしまうバグがあったため、たくさんのユーザーさんが、登録できないでエラーになっちゃっているようです。ごめんなさい。
この不具合は、先ほど修正されました。
登録しようとしてエラーになった方は、中途半端に登録が完了した状態になってしまっているので、お手数ですが、以下の手順で登録し直していただくようお願いいたします。
1. メイドめーるにアクセス。
メイドめーる
2. 登録したユーザー名とパスワードでログイン
3. 「ユーザー登録情報を削除(退会)する」をクリック
以下、確認画面で「削除」を押すと登録情報が削除されるので、再度ユーザー登録していただくことが出来るようになります。お手数おかけしてしまって申し訳ないですが、よろしくお願いいたします。
メイドめーるというアプリケーションを公開します。
メイドめーる
メイドめーるは、Googleカレンダーの予定を毎朝、携帯電話にメールしてくれるサービスです。
メールに返信することで、新しい予定を登録することも出来ます。決まったフォーマットでなくても、打ち合わせのメールをそのまま転送すればOK。


ユーザー登録しなくても、メールの内容の解析だけ試してみることが出来るので、よかったら試してみてください。
試してみる - メイドめーる
(2008-11-11 21:06:05追記)
naoya さんが資料を公開してくださいました。
KOF 2008 の発表資料 - naoyaのはてなダイアリー
(追記おわり)
(2008-11-19 19:25:24追記2)
Codegineにレポートがあがりました。
「実現したいことを計算機の問題に置き換えることが『技術力』」、伊藤CTOが"はてな流"大規模データ処理の極意を語る:CodeZine
(追記おわり)
KOF2008:関西オープンソース2008というイベントに来ています。
はてなのnaoyaさんの講演があったので、講演メモを公開。
#ボクがメモした内容であって、100%言ったとおりに書いてあるわけじゃないので、参考としてご覧ください。
(続き)
神戸でWebについて語るイベント、ウェブテコの第二回に行ってきました。 前回のExpressionEngineに続いて今回は、透過pngについてお話ししてきました。 IEpngFix.pdf
簡単な方として説明したIEpngFixはこちら。
ユンサンの/융상의/YungSang's: 透過PNG と IE と IE7 まとめ
高機能版のIE PNG FIX v2
IE PNG Fix - TwinHelix
あと、懇親会の時に、透過pngを使ったサイトの例をもっと見てみたいとのご意見をいただきました。軽くググってみると、こういうまとめを発見。
透過をきれいに使ったウェブデザインいろいろ - DesignWalker
参考にしてくださいませ。