Monday, April 30, 2007

Ruby で Suica を覗いてみる

以下を参考に Suica のデータを具体的に解析してみましょう。

最初の1バイトが 0x1B だとクレジット入金、0x07 or 0x08だと入金、0x46だとサンクスチャージの入金で、0x16が自動改札乗降、0xC7が購買のようです。5バイト目から2バイトが日付で、先頭から7ビットが年、4ビットが月、残り5ビットが日のようです。(ここが面倒でしたね。パズルみたい)7バイト目からの2バイトが入った駅、続く2バイトが出た駅がコードで入っています。駅のコードは、路線コード/駅コードの組合わせで、有志によるデータベースが公開されています。IC SFCard Fan DB Srevice このソフトではコードからの変換はしていません。12バイト目から2バイトが残金(リトルエンディアン)です。

160100020e98e376e37d2e2200008000 を例として詳しく見ていくと以下のようになります。

16 010002 0e98 e376 e37d 2e22 00008000
1 2-4 5,6 7,8 9,10 11,12 13-16
1 バイト(タイプ)
  • 1b クレジット入金
  • 07,08 入金
  • 46 サンクスチャージ入金
  • 16 自動改札乗降
  • c7 購買
2-4 バイト
不明。私の場合、すべて 010002 になっている。
5,6 バイト(日付)
0e98 を2進数表記にすると 0000 1110 1001 1000

年(7bit)/月(4bit)/日(5bit) なので 0000111 0100 11000 となりこれを10進数にして 7 4 24

年に2000を足すことで 2007年4月24日 という日付が求められる。

7,8 バイト(入場駅)
前半1バイトが 線区コード で後半1バイトが 駅順コード と言うらしい。

これは、IC SFCard Fan のページで調べられる。SOAP による Web Service公開されているのでこれを利用するとよさそう。

9,10 バイト(出場駅)
同上
11,12 バイト(残額)
リトルエンディアン(2e22)らしいのでビッグエンディアン(222e)に変換して10進数にすると 8750円 となる。
13-16 バイト(連番?)
15バイト目が 1 or 2 づつインクリメントしていることが確認できるが、それが意味するところは分からない。

これを Ruby で実装すると以下のような感じになります。

def Pasori.parse_suica_raw_value data
  d = "%016b" % data[8, 4].hex
  {
    :type => data[0, 2],
    :date => Time.local(d[0, 7].to_i(2) + 2000, d[7, 4].to_i(2), d[11, 5].to_i(2)),
    :in   => data[12, 4],
    :out  => data[16, 4],
    :yen  => data[20, 2].hex + (data[22, 2].hex << 8),
  }
end

こちらで作成したプログラムに上記関数を適用します。

dump_suica_2.rb
require 'pasori'
Pasori.felica_raw_values Pasori::POLLING_SUICA, Pasori::SERVICE_SUICA, true do |data|
    d = Pasori.parse_suica_raw_value data
    str = sprintf "%s %s %s %s %5s", d[:type], d[:date].strftime('%Y/%m/%d'), d[:in], d[:out], d[:yen]
    puts str
end

実行結果(dump_suica.rb)

% ruby dump_suica.rb
160100020e9bf101f20c661c00008e00
160100020e9bf102c5026a1d00008c00
160100020e9be37de532781e00008a00
160100020e9ae532e37d361f00008800
160100020e9ae37de532f41f00008600
160100020e99e532e37db22000008400
160100020e99e37de532702100008200
160100020e98e376e37d2e2200008000
1d0100020e98f102f104a62200007e00
160100020e98c502f102502300007c00
160100020e98f102c5025e2400007a00
160100020e98e37de5326c2500007800
160100020e97e355e37d2a2600007600
160100020e97e43ee3552a2600007400
160100020e97e355e43ee82600007200
160100020e97e37de37a062700007000
160100020e9625020102a62700006e00
160100020e9501022502462800006c00
160100020e95e37de37ae62800006a00
1b023f000e9500000000862900006800

実行結果(dump_suica_2.rb)

% ruby dump_suica_2.rb 
16 2007/04/27 f101 f20c  7270
16 2007/04/27 f102 c502  7530
16 2007/04/27 e37d e532  7800
16 2007/04/26 e532 e37d  7990
16 2007/04/26 e37d e532  8180
16 2007/04/25 e532 e37d  8370
16 2007/04/25 e37d e532  8560
16 2007/04/24 e376 e37d  8750
1d 2007/04/24 f102 f104  8870
16 2007/04/24 c502 f102  9040
16 2007/04/24 f102 c502  9310
16 2007/04/24 e37d e532  9580
16 2007/04/23 e355 e37d  9770
16 2007/04/23 e43e e355  9770
16 2007/04/23 e355 e43e  9960
16 2007/04/23 e37d e37a  9990
16 2007/04/22 2502 0102 10150
16 2007/04/21 0102 2502 10310
16 2007/04/21 e37d e37a 10470
1b 2007/04/21 0000 0000 10630

こちらで実行したものと同じような結果を得ることができるようになりました。あとは何とか駅名を日本語表示にしてみたいものです。

関連URL

Sunday, April 29, 2007

コーヒー飲みながら Vi を覚える

こんなの発見。via. Digg

Vi 覚えなければいけない新人さん向け。ちょっと欲しい。

WEB+DB 総集編 (1-36)

WEB+DB 総集編 1-36

すべてのWeb技術者必携。
しかも驚きの低価格。
全部読んだけど、これ買います。

商品の詳細を見る

手軽にハイバネーションさせるソフト DeepSleep

Mac にハイバネーションは無いの?と思って調べたことがあり、結果使えることはわかったのですが、手順が面倒で結局これまで利用することはありませんでした。

しかし、今回紹介するこのソフト。起動するだけで即座にハイバネーションさせることができます。つまり、アイコンをダブルクリックするだけ、Dockに入ってたらワンクリックです。

DeepSleep

ただし、これが利用できるのはセーフスリープに対応した機種だけですので気を付けてください。

スリープ時の微小な消費電力も気になる人には精神衛生上良いソフトです。

関連URL

Saturday, April 28, 2007

Macでインライン入力に対応したVim7(gvim)を作成するスクリプト(7.0.216)

普段 MacPorts 版の Vim7 を利用しているのだが、いつのまにか gvim がビルドされなくなっているようだ。

MacPorts 版 gvim はインライン入力に対応していなかったのだが、SKK 使いの私にとって skk.vim のおかげでさほど重要では無かったのだけれど、これを機にインライン入力対応版 gvim をビルドしてみることにした。

パッチ拝借元

必要なもの

  • gcc (Xcode をインストール)
  • wget (MacPorts の場合:sudo port install wget)
  • 7za (MacPorts の場合:sudo port install p7zip)
7za の実行に失敗する場合、以下を実行
% cd /opt/local/bin
% sudo rm 7za
% sudo ln -s /opt/local/lib/p7zip/7za

ビルドスクリプト

#!/bin/zsh

# http://mig-ration.blogspot.com/2007/04/mac-vim70-216.html

KAORIYA_REV=216

mkdir mac-vim70-$KAORIYA_REV
cd mac-vim70-$KAORIYA_REV

# Download vim7
wget ftp://ftp.vim.org/pub/vim/unix/vim-7.0.tar.bz2
wget ftp://ftp.vim.org/pub/vim/extra/vim-7.0-extra.tar.gz
wget ftp://ftp.vim.org/pub/vim/extra/vim-7.0-lang.tar.gz

# Download vim patches
wget http://www.kaoriya.net/testdir/vim7-daily-w32j.exe
wget http://2xup.org/repos/vim/configure.diff
wget http://iplab.naist.jp/member/mio-su/dist/vim/inline0.2.diff

perl -i -pe 's/vim70-inline/./g' inline0.2.diff

# Download vim patches (official)
mkdir vim70-patches
cd vim70-patches
wget ftp://ftp.vim.org/pub/vim/patches/7.0/7.0.{001..$KAORIYA_REV}

# Extract archives
cd ..
tar jxvf vim-7.0.tar.bz2
tar zxvf vim-7.0-extra.tar.gz
tar zxvf vim-7.0-lang.tar.gz
7za x vim7-daily-w32j.exe

# Apply patches
cd vim70
cat ../vim70-patches/7.0.* | patch -p0
cat ../vim7-daily-w32j/patches/* | patch -p0
cat ../configure.diff | patch -p0
cat ../inline0.2.diff | patch -p0

# Build and Install
./configure --with-features=big --enable-multibyte
make
sudo make install
sudo rm -rf /Applications/Vim.app/Contents/Resources/vim/runtime
sudo cp -R runtime /Applications/Vim.app/Contents/Resources/vim
ダウンロード:mac-vim70-216.sh

インストール方法

このスクリプトを実行すると /Applications/Vim.app が作成されます。

% chmod +x mac-vim70-216.sh
% ./mac-vim70-216.sh

途中パスワードの入力が求められる場合があります。(要管理者権限)

完成

関連URL

追記(2007.05.24)

こちらの方がお勧めです。
Macでいろいろ対応したVim7.1(gvim)のインストール

Thursday, April 26, 2007

overflow:auto で横スクロールバーが表示されない件(解決)

Blogger デフォルトスタイルシートの方で word-wrap: break-word;が定義されていたのが原因でした。

#main {
  float: left;
  width: 460px;
  margin: 20px 0 0 0;
  padding: 0 0 0 1em;
  line-height: 1.5em;
  word-wrap: break-word; /* fix for long text breaking sidebar float in IE */
  overflow: hidden;     /* fix for long non-text content breaking IE sidebar float */
}

ユーザー定義スタイルシートの方で word-wrap:normal;を指定することで解決。

pre {
  margin:3px;
  padding:3px 8px;
  overflow: auto;
  word-wrap:normal;
}
pre.term {
  background-color:#111;
  color:#EEE;
}
pre.code {
  background-color: #E5E5E5;
}

なーんだ。

関連URL

Wednesday, April 25, 2007

overflow:auto にしてるのに横スクロールバーが表示されない

Safari での現象。
以下のページでは横スクロールバーが表示されてます。

preへのスタイル指定

これと同じHTMLを以下に記述したんだけど、横スクロールバーが表示されないのです。

<div class="asamashi">

  <p class="image">
    <a href="http://www.amazon.co.jp/gp/redirect.html%3FASIN=4873110270%26tag=hail2unet-22%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/4873110270%253FSubscriptionId=08PWFCAAQ5TZJT30SKG2">
      <img alt="JavaScript" src="http://images.amazon.com/images/P/4873110270.09._SCMZZZZZZZ_.jpg" width="109" height="140" />
    </a>
  </p>

  <h4 class="title">
    <a href="http://www.amazon.co.jp/gp/redirect.html%3FASIN=4873110270%26tag=hail2unet-22%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/4873110270%253FSubscriptionId=08PWFCAAQ5TZJT30SKG2">JavaScript</a>
  </h4>

  <ul>
    <li>デイビッド フラナガン、 David Flanagan、 村上 列、 垰井 正雄、 安藤 進</li>
    <li>オライリー・ジャパン</li>
    <li>2000-12</li>
    <li>¥ 4,410</li>
  </ul>

</div>

どうして?教えて〜。

解決しました。

Ruby で PaSoRi 使ってみる

Ruby にはダイナミックリンカへのインターフェースが用意されているのでこれを利用してみます。

DL::Importable を利用しヘッダファイルを参考にしながらライブラリ関数に対してラッパーメソッドを定義していきます。

pasori.rb
require 'dl/import'

module Pasori
  extend DL::Importable
  dlload '/usr/local/lib/libpasori.dylib'

  typealias 'uint8', 'unsigned char'
  typealias 'uint16', 'unsigned int'
  #typealias 'uint16', 'unsigned short int'

  # libpasori.h
  extern 'pasori* pasori_open(char*)'
  extern 'void pasori_close(pasori*)'
  extern 'int pasori_send(pasori*,uint8*,uint8,int)'
  extern 'int pasori_recv(pasori*,uint8*,uint8,int)'

  POLLING_ANY = 0xffff
  POLLING_SUICA = 0x0003
  POLLING_EDY = 0xfe00

  SERVICE_SUICA = 0x090f
  SERVICE_EDY = 0x170f

  # libpasori_command.h
  extern 'int pasori_init(pasori*)'
  extern 'int pasori_write(pasori*,uint8,uint8)'
  extern 'int pasori_read(pasori*,uint8,uint8)'
  extern 'felica* felica_polling(pasori*,uint16,uint8,uint8)'
  extern 'int felica_read_without_encryption02(felica*,int,int,uint8,uint8*)'
end

これで、libpasori で提供されている関数郡を Ruby から透過的に利用できるようになりました。

次に、lptest.c を参考に各値をパースして出力している部分を省略し、生データ(16バイト ビックエンディアン)で返す関数を書いてみます。

pasori.rb 続き
module Pasori
  class << self
    def felica_raw_values systemcode, servicecode, little_endian = false
      values = []
      b = Array.new(4).to_ptr
      psr = pasori_open ""
      pasori_init psr
      flc = felica_polling psr, systemcode, 0, 0
      i = 0
      while felica_read_without_encryption02(flc, servicecode, 0, i, b) == 0
        row = b.to_a('I')
        data = ""
        row.size.times do |j|
          if little_endian
            4.times { |k| data += sprintf "%02x", (row[j].to_i >> (8 * k)) & 0xff }
          else
            data += sprintf "%08x", row[j].to_i & 0xffffffff
          end
        end
        yield data if block_given?
        values << data
        i += 1
      end
      pasori_close psr
      values
    end
  end
end

これを利用し、データを表示するだけのプログラムを書いてみます。

dump_suica.rb
require 'pasori'
Pasori.felica_raw_values Pasori::POLLING_SUICA, Pasori::SERVICE_SUICA, true do |data|
    puts data
end

それでは、実際に PaSoRi に Suica / PASMO を置いてこのコードを実行してみましょう。

% ruby dump_suica.rb
160100020e98e376e37d2e2200008000
1d0100020e98f102f104a62200007e00
160100020e98c502f102502300007c00
160100020e98f102c5025e2400007a00
160100020e98e37de5326c2500007800
160100020e97e355e37d2a2600007600
160100020e97e43ee3552a2600007400
160100020e97e355e43ee82600007200
160100020e97e37de37a062700007000
160100020e9625020102a62700006e00
160100020e9501022502462800006c00
160100020e95e37de37ae62800006a00
1b023f000e9500000000862900006800
160100020e95e532e37d760200006700
160100020e94e37de532340300006500
160100020e93e376e37df20300006300
1d0100020e93f102f1046a0400006100
160100020e93d204e532140500005f00
160100020e92e001e0074a0600005d00
160100020e92e532e534e00600005b00

最新20履歴のデータが表示されました。
次回は、これを人間が見ても分かる表示にしていきましょう。

関連URL

Tuesday, April 24, 2007

Twitter + Widget = Twidget

なんだか最近流行中の Twitter できるウィジェット

Twitterしている人には便利そうだけどIMで十分か。私はやってない。

関連URL

Monday, April 23, 2007

SFTP や FTP をマウントするソフト MacFusion


ユーザスペースで動作するファイルシステム FUSE の Mac 版である MacFUSE を GUI で手軽に扱えるようにしたソフト。

The GUI for MacFUSE

これを利用することで、SFTP/FTP をディスクイメージと同様に手軽にマウント/アンマウントすることができます。

利用するためには、予め Google MacFUSE Core をインストールしておかなくてはならないのですが、MacPorts で検索(port search fuse)したら libfuse なるものを発見。
インストールして試したところこれでも問題無く動作しました。
もちろん、お勧めは Google MacFUSE Core の方ですよ。


メニューバーに MacFusion のアイコンが登場するので、マウント作業はそちらで行います。

マウントに成功すると、CD/DVD やディスクイメージをマウントした時と同様にマウントアイコンが登場し、アンマウント作業も同様に行うことができます。

よく使う接続先は以下のようにお気に入りとして設定しておくことも可能です。
今までは Cyberduck を利用していたのですが、もう必要無くなるかも知れません。

関連URL

Sunday, April 22, 2007

Google Reader の外観をゴージャスにする

日々愛用させて頂いている Google Reader 、サービス開始当初は使い難いUIで有名でしたが、現在ではかなりまともなものになりました。

個人的にはこれで満足なのですが、さらにゴージャスにする方法についての記事をDigg経由で見つけたので紹介します。

Google Reader Theme

これを利用すると上の画像は以下のようになります。

Firefox/Camino/Safari/Omniweb/Opera など幅広いブラウザにも対応しています。

Safariの場合、SafariStand が必要になります。

スタイルシートをカスタマイズするだけで、これだけ印象を変えられるのはすごいですね。

関連URL

Saturday, April 21, 2007

Cocoaセミナー 開催のご案内

Xcode 触ってたら Cocoa に興味が湧いてきた。
勢いで Cocoaセミナー のすべてに申し込んだ。
今は後悔していない。

libpasori の共有ライブラリ化

libpasori 共有ライブラリ化なんて、gcc のオプションをちょこっと変更してあげればOKでしょ?くらいに思っていたんだけど、何だか Mac の gcc はちょっと勝手が違うらしい。

Using static and shared libraries across platforms

共有ライブラリの拡張子も libhoge.so じゃなくて libhoge.dylib なんだそうだ。いままで気が付かなかった。gcc のオプションいろいろ試してみるがなかなかうまくいかない。もういいやと諦めかけたころ、ふと Xcode の存在を思いだした。Mac Switch 歴 10ヶ月、いままで全く使ったことは無かったし必要も無かったけれども、これを機会に試してみよう。

MacPorts を使うため Developer Tools は導入済み。

Xcode を起動し、ファイル -> 新規プロジェクト... を選択。

それらしいプロジェクト発見!

こんな画面が開きます。

libpasori のソースコードを追加しましょう。

左ペイン「グループとファイル」にある、Source を右クリック -> 追加 -> 既存のファイル... を選択します。

以下のファイルを選択し、追加します。

ディスティネーショングループのフォルダに項目をコピーするをチェックします。

こんな感じになります。

プロジェクト -> プロジェクト情報を編集 -> ビルド にてビルド設定できるようです。

何を設定すべきかは、libpasori 添付のビルドスクリプトを参考にしましょう。

buildline-libusb.sh
#!/bin/sh
gcc -o lpdump `libusb-config --cflags` -D__LIBPASORI_WITH_LIBUSB lptest.c libpasori_command.c libpasori_com_libusb.c libpasori_polling.c `libusb-config --libs`

バッククォートの部分を実行してみます。

% libusb-config --cflags
-I/opt/local/include
% libusb-config --libs
-L/opt/local/lib -lusb -Wl,-framework -Wl,IOKit -Wl,-framework -Wl,CoreFoundation -Wl,-prebind

これらを参考にして、以下のように設定します。

必要ライブラリ・フレームワークを追加します。

プロジェクト(pasori) を右クリック -> 追加 -> 既存のファイル... から以下のファイルを追加します。

/opt/local/lib/libusb.dylib

プロジェクト(pasori) を右クリック -> 追加 -> 既存フレームワーク... から以下のフレームワークを追加します。

/System/Library/Frameworks/IOKit.framework
/System/Library/Frameworks/CoreFoundation.framework

すると、こうなります。

それではビルドしてみましょう。金槌アイコンクリックです。

無事完成したようです。

これで Ruby から libpasori を利用する準備は完了です。

関連URL

Ruby で PaSoRi を使いたい

libpasori に付属している Suica の情報を読み取るサンプルプログラム lptest.c 等によると、一件の履歴情報は16バイトに収められているらしい。

あとはこの情報を解析したりファイルやDBに保存したり駅コードから駅名を調べるためにネットに接続したりしていきたいのだが、これらをCで書くのは面倒くさいので、FeliCaから各16バイトの情報を読み取る部分だけをC(libpasori)にやらせて、あとの処理はLightWeightな言語で扱えるようにしていきたい。

ということで、ますは libpasori を共有ライブラリ化し、それをRubyで利用する方向で実現していこう。

関連URL

Thursday, April 19, 2007

Google Analytics を手軽に確認できるウィジェット Dashalytics

Dashalytics: A Google Analytics Widget For Your OSX Dashboard

Google Analytics の情報をお手軽に確認できるウィジェット

Hourly / Weekly / Monthly のグラフと数値リストを見ることができる。グラフをクリックすると数値リストが展開されます。

関連URL

Tuesday, April 17, 2007

Mac で PaSoRi

それでは早速、libpasori の動作確認をしてみる。

まず、libusb に依存しているのでこれを導入する必要がある。 ソースをダウンロードする前に MacPorts での存在チェック。

% port search libusb
libusb                         devel/libusb   0.1.12       Library providing access to USB devices

おお、あった。一応オプションも確認。

% port variants libusb
libusb has no variants

とくに無いようなのでそのままインストール。

% sudo port install libusb
--->  Fetching libusb
--->  Verifying checksum(s) for libusb
--->  Extracting libusb
--->  Configuring libusb
--->  Building libusb with target all
--->  Staging libusb into destroot
--->  Installing libusb 0.1.12_0
--->  Activating libusb 0.1.12_0
--->  Cleaning libusb

もちろん、libusb からソースダウンロード&コンパイルでもOK。

次に、ライブラリパスを登録しなければいけないのだが、Mac版 ldconfig は無いのかな?本流の作法が分からないがLD_LIBRARY_PATH的環境変数を設定することにする。

Mac では DYLD_LIBRARY_PATH DYLD_FALLBACK_LIBRARY_PATH というのがあるらしい。

「DYLD_LIBRARY_PATH」はここにライブラリがあったらデフォルトのパスよりも優先して使う、「DYLD_FALLBACK_LIBRARY_PATH」はデフォルトのパスにライブラリが見つからない場合ここを探して見つかれば使う、という意味。詳細は Manual Page For dyld(1) を参照のこと。

ということらしいので、ここでは DYLD_FALLBACK_LIBRARY_PATH を設定する。

% export DYLD_FALLBACK_LIBRARY_PATH=/opt/local/lib

これで準備環境なので、libpasori の動作を確認してみよう。

サンプルプログラムが二つ添付されているので、それぞれ実行してみる。

まずは、lpdump

% tar jxvf libpasori02.tar.bz2
% cd libpasori/src
% ./buildline-libusb.sh
% ./lpdump
# lpdump : Tue Apr 17 05:36:34 2007
# --- IDm info (FeliCa) ---
# Manufacture Date = 2001/2/7
#               SN = 15938
# Manufacture Code = 0101
#      Equip. Code = 0105
# FELICA SYSTEM_CODE = 0003
# card IDm = xxxxxxxxxxxxxxxx
# card PMm = xxxxxxxxxxxxxxxx
... snip ...

まさにダンプデータで中身は理解不能。

次に、lptest

% cp buildline-libusb.sh buildline-libusb-lptest.sh
% perl -i -pe 's/lpdump/lptest/g' buildline-libusb-lptest.sh
% ./buildline-libusb-lptest.sh
% ./lptest
lptest : start
read test
[00] : 08 03 00000E81 E3-3E -> 00-00      0000 -     0 Yen        00013E00
[01] : 16 01 00020E81 E3-55 -> E3-5D      0A00 -    10 Yen        00013D00
[02] : 1A 06 000E0E81 F0-3A -> F0-3A      C800 -   200 Yen        00013B00
[03] : 16 01 00020E81 E3-7D -> E3-7A      C800 -   200 Yen        00013900
[04] : 16 01 00020E7F F2-06 -> F2-0A      6801 -   360 Yen        00013700
... snip ...

あ、0円。こちらは、比較的分かり易いSuicaの利用履歴となっています。

ただ、日付や入出場駅名がコード化されているようなので、これを解析する必要があります。

そこらへんは、以下を参考に。

Suicaのデータは残金や通番など一部のバイトの並びが逆(リトルエンディアン)です。最初の1バイトが 0x1B だとクレジット入金、0x07だと入金、0x46だとサンクスチャージの入金で、0x16が自動改札乗降、0xC7が購買のようです。5バイト目から2バイトが日付で、先頭から7ビットが年、4ビットが月、残り5ビットが日のようです。(ここが面倒でしたね。パズルみたい)7バイト目からの2バイトが入った駅、続く2バイトが出た駅がコードで入っています。 駅のコードは、路線コード/駅コードの組合わせで、有志によるデータベースが公開されています。IC SFCard Fan DB Srevice このソフトではコードからの変換はしていません。12バイト目から2バイトが残金(リトルエンディアン)です。

とにかく、Mac でもなんとか利用できることは分かりました。
次は、これを活用できるようにしていきたいと思います。

関連URL

Monday, April 16, 2007

PaSoRi 購入

SONY RC-S320

Suica/Pasmo の履歴データを保存したい。

http://libpasori.sourceforge.jp/

これ使ってなんとかなりそう。

商品の詳細を見る

migration from Hatena

http://d.hatena.ne.jp/mig50/