2012年3月5日月曜日

Tweet 読み上げスクリプト つぶやき Kyoko


Twitterタイムラインに届いた新着ツイートをリアルタイムにKyokoの声でつぶやきます。

以下からダウンロードできます。


<<動作環境>>
Mac OS X 10.7 以上、Twitter.app が必要です。
システム環境設定「スピーチ>テキスト読み上げ」で日本語音声読み上げの"Kyoko"、英語は"Alex"をあらかじめオンにしてください。

<<特徴>>
日本語のtweetは"Kyoko"で、英語は"Alex"で読み上げます。
tweet中のURLやハッシュタグは除外して読み上げます。
AppleScripエディタで「つぶやき Kyoko」のソースリストを参照できます。

<<修正履歴>>
12.03.05 いくつかのバグを修正し、アプリケーション名を「つぶやき Kyoko」に変更。
12.02.11 ツイート末のにあるハッシュタグやアドレスの最後の1文字を発音してしまうバグを修正。
12.02.10 Twiittererを公開

<<制作/著作>>
松本慧 satoshi@mac.com  Twitter:@cometheart http://cometheart.blogspot.com/

ソースリスト

property enableF : true
property intervalSec : 1
property lastUpdate : 0

on run
set intervalSec to 1
tell application "Twitter" to activate
delay 3
set enableF to true
end run

on idle
if enableF = true then
set enableF to false
idleMain() of me
set enableF to true
end if
return intervalSec
end idle

on idleMain()
tell application "Twitter"
set ca to count of every account
if (ca is greater than 0) then
tell account 1
repeat
set ht to a reference to home timeline
--set mt to a reference to mentions timeline
set now to last update of ht
if now is not lastUpdate then
set lastUpdate to now
set n to name of ht
set ss to a reference to (every status of home timeline)
set s to a reference to item 1 of ss
set t to full name of author of s
smartSay(t) of me
set t to text of s
set t to filter(t) of me
smartSay(t) of me
else
exit repeat
end if
end repeat
end tell
end if
end tell
end idleMain

on smartSay(s)
set len to length of s
set i to 1
repeat while (ilen)
if character i of s > "z" then
say s using "Kyoko"
return
end if
set i to i + 1
end repeat
say s using "Alex"
return
end smartSay

on filter(s)
set len to length of s
set t to ""
set i to 1
repeat while (ilen)
if i < len - 6 then
set substring to (characters i thru (i + 6) of s) as string
else
set substring to ""
end if
--display dialog text of substring
if substring is "http://" then
set i to i + 6
repeat while (ilen)
if character i of s > "z" then exit repeat
set i to i + 1
end repeat
else if character i of s is "#" or character i of s is "@" then
set i to i + 1
repeat while (ilen)
if character i of s > "z" then exit repeat
set i to i + 1
end repeat
else if character i of s is "…" then
set i to i + 1
else
set t to t & character i of s
set i to i + 1
end if
end repeat
return t
end filter



2011年12月12日月曜日

突然 Lionの起動が不安定になった...

半月くらいまえにLionをクリーンインストールして、徐々にいろいろなソフトをインストールしながら使っていた。

ところが、今朝そのLionの起動が、突如不安的に。。。

1)オートログインすると、Finderが「予期せぬ原因で終了」していまう。もう一度トライすると起動できるときもある。
2)オートログインをオフにしてログインウインドウを表示するようにして起動したら、ログインウインドウまではたどりつくが、パスワードを入力しようとすると、最初の一文字目で落ちてしまったり、入力できても、真っ白なスクリーンが現れてから、再度丸いプログレスインディケータのスクリーンに切り替わって、ログインウインドウがまた現れたりする。
3)2回目のログインウインドウが表示されてから、再度パスワードを入力すると、なぜか、だいたい起動できる。
4)クラッシュログのライブラリを覗いたら、何度もトライしたので以下のようなクラッシュレポートがいっぱいたまっていた。

SystemUIServer_2011-12-12-110203_matsumoto-satoshi-no-Mac-Pro.crash
TISwitcher_2011-12-12-110203_matsumoto-satoshi-no-Mac-Pro.crash
fontworker_2011-12-12-110202_matsumoto-satoshi-no-Mac-Pro.crash
Finder_2011-12-12-110153_matsumoto-satoshi-no-Mac-Pro.crash
talagent_2011-12-12-110142_matsumoto-satoshi-no-Mac-Pro.crash
talagent_2011-12-12-110131_matsumoto-satoshi-no-Mac-Pro.crash
fontworker_2011-12-12-110121_matsumoto-satoshi-no-Mac-Pro.crash
talagent_2011-12-12-110121_matsumoto-satoshi-no-Mac-Pro.crash
UserNotificationCenter_2011-12-12-110121_matsumoto-satoshi-no-Mac-Pro.crash
talagent_2011-12-12-110111_matsumoto-satoshi-no-Mac-Pro.crash
Dock_2011-12-12-110100_matsumoto-satoshi-no-Mac-Pro.crash
Finder_2011-12-12-110100_matsumoto-satoshi-no-Mac-Pro.crash
mdworker_2011-12-12-110100_matsumoto-satoshi-no-Mac-Pro.crash
SystemUIServer_2011-12-12-110100_matsumoto-satoshi-no-Mac-Pro.crash
talagent_2011-12-12-110100_matsumoto-satoshi-no-Mac-Pro.crash
fontworker_2011-12-12-102335_matsumoto-satoshi-no-Mac-Pro.crash
talagent_2011-12-12-102325_matsumoto-satoshi-no-Mac-Pro.crash
talagent_2011-12-12-102315_matsumoto-satoshi-no-Mac-Pro.crash
Dock_2011-12-12-102314_matsumoto-satoshi-no-Mac-Pro.crash
Finder_2011-12-12-102314_matsumoto-satoshi-no-Mac-Pro.crash
SystemUIServer_2011-12-12-102314_matsumoto-satoshi-no-Mac-Pro.crash
talagent_2011-12-12-102314_matsumoto-satoshi-no-Mac-Pro.crash
talagent_2011-12-12-101723_matsumoto-satoshi-no-Mac-Pro.crash
Dock_2011-12-12-101713_matsumoto-satoshi-no-Mac-Pro.crash
Finder_2011-12-12-101713_matsumoto-satoshi-no-Mac-Pro.crash
SystemUIServer_2011-12-12-101713_matsumoto-satoshi-no-Mac-Pro.crash
talagent_2011-12-12-101713_matsumoto-satoshi-no-Mac-Pro.crash
talagent_2011-12-12-101713-1_matsumoto-satoshi-no-Mac-Pro.crash
LCCDaemon_2011-12-12-100125_matsumoto-satoshi-no-Mac-Pro.crash

talagentというのがあるが、再起動で前回動作していたアプリを自動立ち上げる resume 機能と関係しているらしい。Lion: What is Talagent? - MacRumors Forums

5)別volumeのSnow Leopardからは全く問題なく立ち上がるので、ハードウェアの原因ではないようだ。また、Lionのドライブを検証してみても異常は見つからなかった。

6)ドライバ関係に問題あるかもしれないとおもい、先日インストールした Logicoolのコントロールセンター lcc351j をアンインストール。これがいちばん臭い。最初に落ちているのがこの LCCDaemon だ。しかし、現象は改善しない。アンインストーラーに問題があってアンインストールできていない可能性もあるか。

7)結局 Lionを再インストールすることに。オプションキーを押しながらMacの電源を入れて、起動ディスクの選択スクリーンから、"Recovery HD"を選択。Lionの再インストールを選択。「インターネットにつながっていないと」とおこられる。メニューバー右のWi-Fiアイコンを選択し、Wi-Fiのパスワードを入力し、無事、約1時間かかって Lionのインストールが完了。

8)Lionの再インストールで問題は解決したようだ。 Lionの"Recovery HD"を初めて体験した。とりあえず、めでたし。めでたし。かな。


2011年11月25日金曜日

Airtel SIM カードで「インド、どこでも iPhone4S」

せっかく Sim Free の iPhone4S をもっているので、インドで SIM カードを購入し、インターネット共有を ON にして、インドのどこからでも Mac からインターネットにアクセスできるようしよう。 インドの田舎でも使えるように、キャリアは携帯電話利用者数は国内1位の Airtel を選択。

(注意)Softbank の iPhone4S は SIM ロックがかかっているので Softbank 以外の SIM は使えません。超高い定額海外ローミングで我慢するか、脱獄して SIM ロックを解除する必要があります。

1)日本での準備:あらかじめ出発前に SIM カードを購入するときに必要な以下の書類を揃える。
   パスポートの写真のページのコピー
   パスポートのインドのビザのページのコピー
   パスポートサイズの写真1枚

2)インドに到着したら以下の情報も購入に必要になる。
滞在先のホテルの住所、電話番号、部屋番号

3)携帯ショップへ行き上記の書類を提出し SIM カードを購入する
今回は チェンナイの Spencer Plaza というショッピングセンター3F にある携帯 Shop で購入。店の対応も基本的に親切だった。最初 こちらの働いている会社の証明書が必要などと言われたが、上記の1)2)の書類で購入できることが店のひとにも解って購入できた。でも、それがわかるまでいろいろ問い合わせしていたので、30分くらいかかった。

4)Airtel の SIM を20ドルをだして購入した。以下がそのときのレシート。金額はルピーで表示されている。今回はリチャージ分の250ルピーが追加されている。追加しなければ15ドルくらいか。SIM カードのカット代185ルピー(350円くらい)がちょっと高いかも。





5) 店のひとにセットするしてもらうまえに、iPhone の言語環境を 設定>一般>言語環境で「英語」にしておく。

6) 店のひとに日本で使っていた日本通信の SIM から Airtel の SIM に入れ替えてもらう。(帰ったときに、成田で日本通信の SIM に戻すために、SIM を取り出すためのピンを持参することをおすすめする)

7) 以上でとりあえず音声通話は可能になる。電話番号「*123#」にかけると以下のように現在のチャージ残量を参照できる。なおアカウント情報は「*121#」で確認できる。




2012年1月6日まで99ルピー、2014年8月18日まで181.24ルピーとある。250ルピー追加したはずなのに、181.24ルピーしか表示されなかったので店の人に文句を言ったら、そうゆうものらしい(納得は行かなかったが)。また、リチャージの追加分が表示されるのには 開通してから30分くらいかかった。

8)データ通信のためにまず、Phone の 「設定>一般>リセット>ネットワーク設定をリセット」でネットワーク設定をリセット。

9) APNナンバーをセットしようとして「設定>一般>ネットワーク>モバイル通信ネットワーク」をひらこうとしたが「モバイル通信ネットワーク」の項目がない!! うーむ。店の人に聞いてみても iPhone4S ははじめてなのでよくわからないという。これでは肝心のデータ通信ができないではないか!!

10) 店のひとが Airtel のサポートに問い合わせたが解決せず。あとで、サポートから返事が iPhone に SNS で送られてくるということで、とりあえずそれを待つことに。


11) とりあえず店からでて、いろいろ試しているうちに、突然データ通信ができるようになった。とうやら、iPhone4S の Airtel の場合は APN 番号は自動的にセットされてユーザーが入力する必要がないようだ。
データ通信でできるようになるまで2時間くらい待つことが必要らしい。

12)以上で、インドで iPhone4S で Airtel の SIM を使ってデータ通信が無事できようになった。めでたし、めでたし。

<<注意>> 店のひとによると、AirtelのプリペイドSIMは、今回2014年8月16日までの期限があるものの、6ヶ月に1回はアクセスしないと契約がクリアされて使えなくなってしまうらしい。アクセスは日本からでもいいので、最低半年に1回はこのSIMを使ってどこかにアクセスする必要がある。「*123#」とか「*121#」へ電話をかけるといいかも。


2011年11月1日火曜日

Xcode 3.2.6 インストール 顛末記

Snow Leopard, Xcode 3.2.5 で正規表現のライブラリ OgreKit を更新しようと思って、OgreKit最新版をダウンロード。

 OgreKit:http://web.me.com/oasis/ogrekit/About.html 

トラブル1: buildエラー 

buildしようとしたら以下のエラーを先頭に500以上ものエラーメッセージの嵐にみまわれた。

 error: can't exec '/usr/bin/make' (No such file or directory) 

たしかにそのpathにはmakeは存在しない。
どうも以前XcodeをインストールしたときにUnix Toolをインストールしなかったのが原因らしい。

トラブル2:iTunesが原因でインストールが完了できない 

そこで、 Xcode 3.2.5を再インストールしようと思ったが、Xcode3.2.6もでているので、Xcode3.2.6をインストールすることにした。

インストーラがもうすぐ終了というところで、以下のメッセージがでた。

quit iTunes 

しかしiTunesを止めても上記のメッセージはでたままで先にすすまない。
しかたなく、cmd+option+ESCでインストーラを強制終了。

システムを再起動し、こんどは iTunesが動いていないのを確認してインストーラを起動。ところが、iTunesが動いていないのに、またおなじ

quit iTunes 

のアラート。うーむ。Googleで調べたら iTunes Helperというプログラムがバックグランドで動作していることが原因らしいことがわかり、

ユーティリティ>アクティビティモニタ

で、 iTunes Helperを強制終了したらインストールが完了した。

トラブル3:Xcodeが起動しない。 

さて、Xcodeを起動すると、こんどは以下のエラーでXcodeが強制終了してしまう。

Exception caught: Couldn't load plug-in 'com.apple.Xcode.iPhoneSupport' 

うーむ。

googleで同じようなトラブルを探すと iTunes を再インストールすると直るらしい。 そこで、Apple のページから iTunes 10.5をダウンロードして iTunes を再インストール。

 http://www.apple.com/jp/itunes/download/

 iTunes をインストール後、マシンを再起動し、おそるおそる Xcodeを起動。
今度は Xcode が無事起動し、目的のOgreKitも正常にbuildできた。 

めでたし、めでたし。


2008年4月23日水曜日

Leopard の日本語 Help メニュー

Leopard からは、Spotlight メニューのようにヘルプメニューに直接文字列を入力して検索できるようになりました。

プログラムの開発側からは、メニューバーに Help というタイトルを作れば自動的にシステムで検索メニューを付加してくれます。日本語の場合は「ヘルプ」というメニューがあるばそこに検索メニューが付加されます。

ところが拙作のソフトで、英語モードでは問題ないが、日本語モードのときにどうしても検索メニューが表示されないという症状にぶつかってしまいました。

約半日の試行錯誤の結果、以下のことが判明しました。

・メインメニューの「ヘルプ」の後になにか(例えばプラグインなど)のメニューを追加すると検索メニューが消えてしまう。
・この現象は、日本語モードときにおき、英語モードのときは発生しない。

というわけで、Leopardではへプルメニューの後にメニューを追加してはいけません

また、Leopardでは、メニューアイテムに任意のNSViewをセットすることができるようになりましたが、残念ながらNSTextFieldやNSTextViewなどのキーボードイベントが必要なViewは動作しません。

ところが、Helpメニューのなかでは、キーボードイベントを受けてとることができ、NSTextFieldやNSTextView などのメニューアイテムも正しく動作します。

2007年9月14日金曜日

lighttpd/RubyOnRails の SSL化

RubyOnRailsでは、Webサーバーとして動作が高速なlighttpd(ライティ)がよく使われる。

lighttpdはSSLもサポートしているのだが、SSL化のためのキチンとした資料が見つからずSSL化ではまってしまったがなんとかできた。(^^)


そこで、SSL化の手順をまとめてみた。

・SSL化するサイト
http//shop.sample.co.jp → https//shop.sample.co.jp


・SSL認証
費用がやすいグローバルサイン社をつかうことに

・RubyOnRailsのアプリケーションディレクトリ
~/jstore

参考URL Generate a CSR for an SSL Certificate for Lighttpd


-------------------------------
グローバルサイン社の以下のページを参照しなならCSRを生成する
-------------------------------

グローバルサイン社 CSRの生成



1) ssl関係のファイルの格納ディレクトリ~/jstore/ssl の作成



$ cd jstore
$ mkdir ssl



2) 秘密鍵ファイル shop.sample.co.jp.key を生成する

$ openssl genrsa -out shop.sample.co.jp.key 1024
Generating RSA private key, 1024 bit long modulus
........................++++++
..............++++++
e is 65537 (0x10001)

3) 生成された秘密鍵ファイルのpermissionを変更

$ chmod 600 shop.sample.co.jp.key


4) CSR shop.sample.co.jp.csr を生成する

$ openssl req -new -key shop.sample.co.jp.key -out shop.sample.co.jp.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Kanagawa
Locality Name (eg, city) []:Yokohama
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Sample Inc
Organizational Unit Name (eg, section) []:-
Common Name (eg, YOUR name) []:shop.sample.co.jp
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:


-----------------
Country Name 国を示す2文字のISO略語です。 JP
State or Province Name 組織が置かれている都道府県です。 Kanagawa
Locality Name 組織が置かれている市区町村です。 Fujisawa
Organization Name 組織の名称です。 Sample Inc
Organization Unit Name 組織での部署名です。
※指定がない場合は - (ハイフン)を入力してください。 -
Common Name ウェブサーバのFQDNです。shop.sample.co.jp
Email Addres 入力不要です。
※指定がない場合は項目自体を作成しないでください。 -
A challenge password 入力不要です。 -
An optional company name 入力不要です。 -
------------------


以下の内容のCSRファイル shop.sample.co.jp.csr が生成される

$ cat shop.sample.co.jp.csr
-----BEGIN CERTIFICATE REQUEST-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxx
-----END CERTIFICATE REQUEST-----


5) グローバルサイン社にサーバー証明書を申請する

https://system.globalsign.com/direct/directdvhigh.do

上記を開き購入するする証明書を指定し「注文する」ボタンを押す

次に企業情報の入力画面で自社の企業情報を入力

最後に上記のCSRを所定フィールドにCOPY&PASTEして申請する。
CSRは、破線の行も含めてコピーすること。


申請して数分くらいでグローバルサイン社からサーバー証明書のある
URLがメールで送られてくる。

-----BEGIN CERTIFICATE-----
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzzzzzzzz
-----END CERTIFICATE-----


6) 上記の内容を shop.sample.co.jp.crt ファイルとして保存する。

7) shop.sample.co.jp.key と shop.sample.co.jp.crt とを合体
して、shop.sample.co.jp.pem ファイルを作成する。


$ cat shop.sample.co.jp.key shop.sample.co.jp.crt > shop.sample.co.jp.pem
$ chmod 600 shop.sample.co.jp.pem



8) lighttpd のデフォルトインストールでは、ssl に非対応なのでインストールし直す。

lighttpd を オプション--with-opensslをつけて再コンパイル


$ cd ~/src/lighttpd-1.4.15
$ ./configure --prefix=/usr/local --with-pcre=/usr/local --with-openssl
$ make
$ sudo make install


9) lighttpd.conf にsslのためのパラメータを指定

以下の4行を ~/jstore/config/lighttpd.conf に追加する

#### SSL engine
ssl.engine = "enable"
ssl.pemfile = CWD + "/ssl/shop.sample.co.jp.pem"
ssl.ca-file = CWD + "/ssl/dvcacert.cer"


ファイル dvcacert.cer は、グローバルサインからダウンロードした中間CA証明書
中間CA証明書のダウンロード先はグローバルサイン社からのメールに表示されている。

この中間証明書がないと「認証局不明」の警告がでてしまう。

10) lighttpd を起動し、完了!!

覚書:jstoreの開発経緯

ようやくシェアウエア・ライセンスキーの即時発行システム jstore が完成した。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
これまでのシステム
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

レンタルサーバー付属のショッピングカート(Perl)をベースに2001年に作成
ショッピングカートからの注文データ(CSV形式)を、オフラインでデーリーに回収し、ユーザー管理データベース(FileMaker)へ取り込み、登録コードを計算しユーザーへ登録メールを発送。取り込み/メール発送部分はアップルスクリプトで自動化。支払い方法はクレジットカードと銀行振込をサポート。クレジットカードの認証/代金回収はZEUS社を利用(手数料約5%+)。ZEUS社が英語ページ・海外クレジットカードに対応していないので、海外からの注文には、Kagi.comを利用(手数料10%+)

問題点

1)オフラインの登録コード処理のため、登録コードの発送が1日遅れになってしまう。
2)連休、年末年始、夏季休暇のときは発送が休日明けになってしまい、その間の売り上げがダウン。
3)国内売り上げと海外売り上げが異なった処理方法になり煩雑。

いまどき登録コードを即時発行できないシステムは、ユーザーからの苦情が多く、もう限界に達していた。。。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
新システムを模索
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

kagi.com や esellerate を使えば登録キーの即時発効は可能だが
・ユーザーへのメールが日本語に対応していない
・手数料が高すぎる 10%超
・即時発効の登録コード生成ルーチンを先方へ渡してしまうのは不安
・macsbなどのメーリングリスト書き込みをみると、kagi.com離れが進んでいる(?)

国内にはベクターがあるが
・英語に対応していない
・手数料がさらに高い 15%!!
・なんとなくダサイ (^^;

そんななかで今年からPayPalが完全日本語化された。
PayPalを使えば
・海外と国内の売り上げを統一して扱える
・手数料も 3.4% + $0.30 と安い
・cgiインターフェースもあるので登録キーの即時発効もできそう。

2007年6月末、登録キー即時発効システム PotionStore の存在をmacsbで知る。
http://www.potionfactory.com/potionstore


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
PotionStore 概略
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

・KagiやEsellerateなどのサービスを使わない、Mac OS X デベロッパーための登録キー即時発行システム
・Open source で、Ruby On Rails アプリケーション
・PayPal か Google Checkout にマーチャントアカウントがあれば簡単に自分の登録キー発行システムを構築できる

主な特長
・PayPal Website Payments Proをサポート
・PayPal Express Checkout support(PayPalアカウントなしでの支払い)をサポート
・Google Checkout をサポート
・Admin(管理者)インターフェースもサポート
・クーポンの生成と受け入れをサポート
・ライセンスキー問い合わせをサポート

ライセンス

Creative Commons Attribution-Share Alike 3.0 License.
http://creativecommons.org/licenses/by-sa/3.0/deed.ja

あなたは以下の条件に従う場合に限り、自由に
  作品を複製、頒布、展示、実演することができます。
  二次的著作物を作成することができます。
あなたの従うべき条件は以下の通りです。
  表示. 原著作者のクレジットを表示しなければなりません。
  継承 二次的著作物は配布するときは同じ条件で配布しなければなりません。

システム構成

・言語: Ruby
・フレームワーク: Ruby On Rails
・Security: 要SSL
・データベース: PostgreSQL


Ruby On RailsとSSLが利用できるサーバーであれば、レンタルサーバーでも動作可能。
PotionStoreのページで、導入した人の書き込みをみると4日間ほどで稼働したとのこと。

ーーーーーーーーーーーーーーーーーーーーーー

で、PotionStoreをダウンロードして実際に試してみた。

Unixコマンドにうとく、PostgreSQLも初めて、Rubyも初めて、Ruby On Rails も初めてという状態。

まずは、システムのインストールから。。。

OSXにRuby on Rails環境をインストールする方法
http://d.hatena.ne.jp/dtocos/20060304

PostgreSQL のインストール
PostgreX PostgreSQL Easy Installer for Mac OS X
http://www.magic3.org/postgrex/


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
PotionStore は 日本で使えるのか?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

実際にPotionStoreをインストールして以下のことがわかった。

1)PotionStoreで利用してる支払いシステム PayPal WebPayment Pro、Google Checkout が日本ではサポートされていない。
2)Webページやメールのバイリンガル(英語、日本語)化が必要

というわけで、そのまま(configファイル、ライセンス生成ファイルの修正だけ)では、とても使えないということが判った。

2)はなんとかなるとしても、とくに1)はプログラムの構造そのものの変更が必要になり致命的。(^^;

日本のPayPalでサポートしている API は、WebPayment Proでなく、それより古いタイプのWebPayment Standard。


PayPal がサポートしてる支払いシステム一覧
https://www.paypal.com/us/cgi-bin/webscr?cmd=_merchant-outside

・WebPayment Standard
・WebPayment Pro
・Email Payment


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
WebPayment Pro
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
https://www.paypal.com/us/cgi-bin/webscr?cmd=_wp-pro-overview-outside

・米国でのみサポート
・マーチャントページで顧客の氏名、住所、クレジットカードの情報を取得し、それらの情報をPayPalのWebサービスに送信、決済を依頼する。Webサービスから正常リターンなら、登録コードを顧客に開示しメールを送る。
・WebPayment Standardに比べてプログラムが単純化できる。
・顧客にはPayPalのページは一切表示されないので、顧客にとってもシンプルで判りやすいインターフェースになる。
・クレジットカード情報をマーチャント側で行うので、SSLが絶対に必要、かつそのクレジットカード情報の取り扱いには細心の注意が必要。


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
WebPayment Standard
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
https://www.paypal.com/us/cgi-bin/webscr?cmd=_wp-standard-overview-outside

・米国以外(日本)でも利用可能
・PayPalのWebページのなかで決裁する必要があり、マーチャントページからPayPal ページへリンクし、PayPal内で決済が終わったら、マーチャントページへまた戻る形になる。
・決済がマーチャントページだけで終わらないので、顧客にとっても複雑なインターフェースになってしまう。
・マーチャントページのなかでクレジットカード情報を扱わないのでマーチャントとしては気が楽。SSLも絶対必要ではない。
・PDT(Payment Data Transfer)と IPN(Instant Payment Notify)の2種類のAPI がサポートされている。
・PDTと IPN の2つのインターフェースを実装する必要があり、プログラムとしては複雑になる。

PDT(Payment Data Transfer)

PDT の主要機能は、買い手が支払い完了時に自Paypalのサイトから自サイトに自動的にリダイレクトされた時に、支払い取引の詳細を表示することです。つまり、Paypalと自サイトの処理は同期型です。(ここがポイント!)なので、PDTによってコールバックされる情報を元にバックエンドと統合を行うことが可能になります。

[参考] PHPでWebPayment Standardを利用したときの解説
http://blog.katsuma.tv/2007/06/paypal_pdt_ipn_intro.html


PayPalサイトで決済が正常終了すればこちらのサイトにリターンされ、Thank you ページを表示し登録キーを開示、登録キーお知らせメールを発送する。

しかし、顧客がPayPal内で支払いを完了したと同時にWebブラウザを終了してしまうと、Thank you ページの表示が行われなくなってしまう。結果として、支払いが発生しても登録キーが顧客に渡らなくなってしまう。

それを防ぐために、次のIPNとの併用が必要。

IPN(Instant Payment Notify)

IPNは、PDTと(ほぼ)同じデータがPaypalから自サイトにPOSTされますが、そのタイミングは支払いが終了したとき、また支払い状態が「Pending」の場合において決済されたとき、失敗したとき、拒否されたときにも別の通知を受け取ることになります。つまり、コールバックされるタイミングはWebのフローとは非同期に行われます。(これがPDTと違う大きなポイント!)PDTとは独立してWebフローとは非同期に自サイトへPOSTされてきます。

IPN では、顧客がPayPal内で支払いが完了すれば自動的にマーチャント側へ通知されるので、顧客がWebブラウザを閉じてしまっても問題ない。

jstore(今回作成したPotionStoreの日本語版)では、PDTとIPNの両方をサポートし、さきに発生したほうのイベントで登録キー生成、送信、DB更新を行うようにした。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
jstore (PotionStoreの日本語版)について
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

アートマン21のjstoreのアドレス
https://support.artman21.co.jp:8080/

オリジナル(英語版)からの変更・追加

・WebPayment Standard (PDT & IPN)をサポート
・銀行振込み(国内のみ)をサポート
・日本語と英語の2言語をサポート
・製品価格を円とドルの2種類をサポート
・アップグレードの際の登録キーチェックをサポート


今後の予定

・9月中旬から実際の運用を開始
・数ヶ月実績をみて、問題なければ年末あたりにOpenSourceとして公開するかも