e-Taxで個人の確定申告

 確定申告の時期ですが、今年はe-Taxで申告しました。という訳で今回はそのレポート。
いきなり結論ですが、個人の確定申告の場合、e-Taxは便利かと思います。特に良いところは、いちいち手で書かなくてもよく、ほとんど自動で転記してくれるので手間がかかりません。また今年(?)まで、初めてe-Taxで申告する方は、5,000円の税額の控除があります。いくつか準備が必要ですし、こういう話もありますが、準備は1回ですみますし、それを補ってあまるぐらい便利でしたので、今からでも間に合いますのでよろしければご参考にしていただければと思います。
もっとも、今まで確定申告をご自身でやったことない方(税理士等にまかせっきりで内容を確認していないとか初めての確定申告とか)はちょっと厳しいかと思いますのでそのあたりは充分にご検討された方がよろしいかと思います。
 
※注意! 私と当局の方とはまったく関係がございません。本ページの記載内容はあくまでも個人が試した結果であり、間違い等がありましても著者は一切責任を取りませんのであらかじめご了承ください。
 
■必要(使った)なもの
 ・ICカードリーダー(私が使ったもの
 ・住民基本台帳カード
 ・電子証明書(住民基本台帳カードにインストールする)
 
ICカードリーダーは3千円で購入しました。住民基本台帳カードと電子証明書は役所で入手できます。手数料は、それぞれ5百円(計千円)掛かりました。カードと証明書は、即日発行できるところや2週間程度かかるところ、住民基本台帳カードのみ取り扱うところとかありますので役所のホームページで確認した方がよろしいでしょう。今からでしたらぎりぎり間に合うかと思います。
  

■環境の構築(事前セットアップ)
 詳しくはe-Taxのページを読んで頂くことになりますが、事前にソフトウェアをインストールする必要があります。ちなみに私はWindows7 64bit ulitimateで環境を構築しましたが正常に動作しました。
 
■私がはまったところ
 詳しい使い方は、e-Taxのページを見ていただければと思いますが、数年間に渡りいろいろバージョンアップを重ねたようで個人の確定申告に関してはだいぶ使いやすくなったかと思います。通常の給与所得者の申告もできますし、青色申告にも対応しています。
一応私はソフトウェア関係のプロですし、確定申告も何回かやっているので要領はわかっているつもりですが、それでもいくつかはまりました。以下、私がはまった点を紹介します。

  • 番号取得時(初回)のリンクと、作成再開のリンクが異なる - 当たり前かもしれませんが、初回のリンクと作成再開のリンクが異なります。この画面の大きなボタンの『作成開始』というのが初回にクリックするボタンで、『作成再開』が2回目以降にクリックするボタンです。ちなみに、2回目以降に使用するというのは入力処理を中断して再開する場合を指し、その際にデータを保存しておく必要があります。
     
  • カードリーダー周りのトラブル - カードリーダー周りで2つ程、軽微なトラブルがありました。1つは事前セットアップ後に、プログラムグループの『公的個人認証サービス』から『ICカードリーダライタ設定』を実行しておく必要があるがその説明がFAQにしかないのでカード読み込み時にエラーになる点と、もう1つは、設定後でもカードリーダーが上手く読み込めないことがありその場合に一旦「戻る」をクリックし画面を戻し、もう一度進めると上手くいくことがありました。
     
  • ヘルプデスクの担当者について - 2回程電話をしましてあくまでもその範囲内での意見ですが、ヘルプデスクの人に当り外れがあります。確定申告の規則がややこしいので全部を覚えきれないのでしょうが、いい加減と受け取れる回答をする方がいらっしゃいましたのでその場合は、1.『そんなはずはない』と言って上の人に調べてもらう(エスカレーションしてもうらう)か、2.かけ直して知っていそうな方に当たるまでがんばるか、しましょう。
     
  • 間違えて申告した場合 - 一旦送付した後に間違いに気づいたのですが、ヘルプデスクに確認しましたところ電子申告自体は何度でもでき、最後に申告したものが有効になるとのことで、そのままもう一度申告しました(データを保存していたので修正して電子申告しました)。
     

 
とまぁ、こんなところで私と嫁の確定申告が2時間半で終わりました(去年は半日かけました)。
 

MVCの議論でみるプログラミングパラダイムに対する距離のとり方

OpenBlocks600の記事で紹介しましたブログビューアーですが、その後、バグ修正やRSS関係の対応をしてから1週間経ち、apacheのエラーログにもエラーが出ていないので、そろそろリリースしようかなと思いソースを眺めていたのですが、あまり教示的なソースでなく『公開すべきか、せざるべきか・・・』と悩んでおったのですが、こういうときは他人はどうしているのかと、最近のWEBアプリの動向でも探ろうかとネットを検索しましたところ、面白い記事を見つけました。
 
http://satoshi.blogs.com/life/2009/10/rails_mvc.html Ruby on Railsの「えせMVC」の弊害
 
http://satoshi.blogs.com/life/2009/10/ormappingmvc.html O/Rマッピング技術の進化が皮肉にも助長している「えせMVC症候群」
  
ブログ主(Satoshi Nakajimaさん)の主張ですが、要するにモデルとコントローラの役割はきちんと分けようねということで、『ビジネスロジックをコントローラに書くのはNG』とのことのようです。
ちなみに私ですが、ちょい書きのアプリだとまぁコントローラでビジネスロジックどころか、SQLを書いたりします。またブログビューアーの構造も思いっきりMVCモデルから逸脱しているので・・・という訳でブログビューアーを書き直そうかなとか思ったのですが、もう少し調べてみようということで、以下、Rubyの作者のまつもとさんの記事を見つけました。
 
http://itpro.nikkeibp.co.jp/article/COLUMN/20080610/307218/ まつもと直伝 プログラミングのオキテ 第20回 MVCとRuby on Rails
 
この記事の7ページ目の表2にRailsのMVCということで従来のMVCとの比較がありますが、その表から2パラグラフ目の説明を引用しますと
 

 一方,HTTPの性質によってUI部分の複雑さはWebブラウザに任せてしまっているWebアプリケーションでは,相対的にUI層が薄くなります。コントローラ相当はほぼ汎用品で十分ですし,モデルとビューのインタラクションも不要です。ですから,モデルをデータベース層とビジネス・ロジック層に分割して,下層をモデル,上層をコントローラと呼ぶようにしたのでしょう。

  
ということで、まつもとさんの説によるとビジネス・ロジック層はコントローラに記述することになるようです。
かの有名なRubyの作者のまつもとさんが、このように言っておられるのでこの勝負は『Railsでは、ビジネス・ロジック層はコントローラに記述する』で軍配が上がりそうですが、実は先のブログ主さん(Satoshi Nakajimaさん)も知る日とぞ知る方で、過去にマイクロソフト社に勤務されておりWindows95の開発では、Windows3.1との互換性を保つために尽力されたらしく、そのあたりの話はこちらで参照できます。また先の主張は、実際にRuby on Railsを使ったプロジェクト通して行き着いたようでしてそれなりに説得力があります。
 
このように著名なエンジニアの見解が異なる場合、どのように解釈すればよいのか悩ましいところですが、実行速度についてとか明確に白黒つく場合のように客観的に測定できる事実が無い場合、
『どちらでも良い』
というのが私の経験から来る見解になります。
この手の議論はエンジニアを引き付けるものがあり、熱くなったりするのですが、議論してもみのりは少なかったりします。
私も過去にこの手の議論に巻き込まれたことがあるのですが、特に個々のエンジニアが持つバックグランドが異なる場合、あまり前向きな議論にならなかったです。
今はインターネットがあるので様々なエンジニアの見解を比較することができるので、このように『他の人はどう考えているか?』というのをわざわざ議論しなくても解るので改めていい時代になったと思います。
 
というわけで、まぁブログビューアーは作り直さずに公開したいと思います。

[ADP開発日誌]0.61リリース OpenBlocks600D対応+WOL(Wake On Lan)

以前に、ADPをOpenBlocks600Dに対応させた話を書きましたが、予告(?)どおりADP 0.61のリリースを行います。ブログビューワーの方は後ほどということで・・・必要な方はコメント欄にほしいとリクエストください(気持ち急ぎます)。
 
OpenBlockS600Dのバイナリ版を実行させる場合は以下のパッケージがインストールされている必要があります。

  • libboost-regex1.35.0
  • openssl
  • unixodbc

場合によっては(ソースからコンパイルされる方は)さらに以下のパッケージが必要です。

  • libboost1.35-dev
  • libssl-dev
  • unixodbc-dev

 
ちなみにWindows版のバイナリは、特に依存関係はないので、そのまま実行できます。
 
0.60でパフォーマンスを上げたのですが、バグがぼろぼろ出まして修正しました。だいぶ品質が向上したかと思います。もっとも、もっと本格的なテストプログラムを記述しないとダメだと思いますが・・・そのノウハウの蓄積は今後に期待ですね・・・。
ただ一部の修正(メモリの管理関係)でパフォーマンスが下がったのでこのあたりはまた変更する必要があります。オープンソース&マイナープロジェクトの良いところはバグを恐れずにガシガシ修正できるところですね、お金を頂戴するプロジェクトではここまで冒険はできません・・・。
 
また、今回のリリースではwol(Wake On Lan)述語(関数)も追加しています。文字通りWOLパケットを送出する述語です。
何でこんな述語を追加したのかと言いますと、前回の記事のとおり最近モバイル環境を構築したのですが、これに加えてVPNを構築すると外部からイントラ環境にログオンすることができ、そうするとリモートディスクトップで私のマシンにログオンしたくなるのですが、ログオンするためには電源が入っていなければならず、とは言っても何時ログオンするかどうか解らないマシンの電源を入れっぱなしにする訳にもいかない、という訳でWOLで電源を入れることになり述語を追加しました。
WOLを送信するマシンは、LED電球並の消費電力のOpenBlocks600Dにすればよろしいでしょう。外部からはウエブから入るようにします。つまりブログビューアと同様にADPでWEBページをホストします。
というわけで、以下、WOLのコードになります。
 
wol.awp

#!/bin/adp -
<%;
+keycode("password");	# パスワードを指定
+machines("00-11-22-33-44-55", "machine1");	# MACアドレスとマシン名(適当でよい)を指定
+machines("66-77-88-99-aa-bb", "machine2"); # 複数あるときは同じように複数行にわたって記述する
+baddr("192.168.1.255"); # ブロードキャストアドレスを指定
,query("KEY").keycode, $mac =query("MAC"), wol($mac, =baddr);
%>
<html>
<head>
<meta http-equiv="Content-Language" content="ja">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>ネットワークブート</title>
</head>
<body>
ネットワークブート
<%,query("MAC",$mac),%><%=$mac%>BOOT中<%;%>
<br>
<form action="wol.awp" method="post" OnSubmit="return confirm('起動しますか?')">
キーコード:<input type="text" name="KEY" value=""><br>
起動マシン:
<select name="MAC">
	<%,machines($mac, $name) ,%>
		<option value="<%=$mac%>"><%=$name%>
	<%,next;%>
</select>
<input type="submit" value="boot">
</form>
</body>
</html>

※2012/05/21 Ver 0.81のリリースにあわせて更新
 
ファイル名はwol.awpとします。form actionの引数を変えればファイル名自体はなんでも構いません(まぁ解らないようにした方がよい)が、拡張子はawpにする必要があります。
awpとは「Adp Web Page」の略で、ADPでWEBページをホストするモード(AWPモード)の拡張子になります。
Ver0.61では、拡張子がawpまたはcgiのみAWPモードになります。
 
これをApacheでcgiスクリプトとして、ホストすればOKなのですが、その前にスクリプト使い方の説明を、
先頭の3行目から6行目が設定になります。最低限のセキュリティということで、
パスワードの指定(3行目)と起動対象のマシンのMACアドレスと名前(4,5行目)と
起動対象のマシンがあるブロードキャストアドレスを指定(6行目)になります。
 
スクリプトの動作環境の設定ですが、PerlやPHPのCGIと同様にセットアップして頂けれたよいのですが、以下、apacheでのセットアップを簡単に説明します。
adpの実行ファイルを、/bin に保存します。/binがダメな方は、上記のスクリプトの1行目でadpのパスを指定します。
apacheのconfファイルですが、DirectoryのOptionsにExecCGIを追加し、AddHandlerで .awpを追加します。
以下、サンプルを載せます。

    <Directory "/var/www/html">
        Options FollowSymLinks ExecCGi +Includes
        DirectoryIndex index.html index.php index.awp
        AddHandler  cgi-script .awp
        AddHandler  cgi-script .cgi
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>

Windows+IISでも動作可能です・・・設定方法は・・・まぁがんばってみて下さい。
(ご要望がありましたら設定方法を記載します・・・)

[海外旅行]台北(2) T1028

台北旅行の続きです。
MRTの忠孝新生駅にある光華数位新天地に行ってまいりました。このあたりは台北の秋葉原といいた感じでパソコンショップが軒を連ねています。
 

 
光華数位新天地は、さしずめ秋葉原のヨドバシカメラのような感じの大きなビルですが、その中に小さなショップが入っています。
あいにく時間があまり無かったのでざっと回っただけになりましたが、値段は、円高の今をもってしても、残念ながらあまり安いという印象は無かったです。2GのSO-DIMMが1500円程度とかモノによっては安いものもありますが・・・。
それでも、せっかくなので低価格のノートPCとネットブックに焦点を当てて探してみました。メーカーは、Lenovo MSI ASUS 東芝が目に付きました。また意識してみていたわけではないので、一概にはいえないのですが、mac(ipad)があまり目に付かなかったので日本ほどブームになっていないのかもしれません。売れ筋はネットブックとそれより少し上のノートブックのようでした。
ちょっと戸惑ったのが商品に値札が貼っていなくお店に人に値段を聞くスタイルのお店が割と多かったです。特にネットブックに多かったのです。
どうやらそこから値引き交渉するようですが、私は20年程前に京都に暮らしていたときは、大阪の日本橋で値引きをしたのですが、17程前に東京へ来て秋葉原で値引きをして店員さんに嫌われて以来、値札で買うという習慣がついてしまったので、久しぶりのことで戸惑いました。それと言葉の壁もあいまってあまり買い物を楽しむということはできませんでした。まぁ次回にリベンジしたいです。
 
それでも、一応台北のパソコンショップをコンプリートしたく、台北駅にあるNOVA資訊広場にも寄ってみましたところ、GIGABYTE社のT1028が2Gバイトのメモリ付きで10,500元(約3万円ちょっと)で売っていたので買ってみました。日本ではもう終息したようですがPC Hotlineによると2009年6月で約6万円で売っていたようです。巷ではiPhoneやiPadが流行っておりネットブックは流行遅れになったので値崩れを起こしたのでしょうか、1年半で半額とは価格の下落が大きいです。
以下スペックを
 
■スペック
ATOM N280 1.66GHz
メモリ 2GB
HDD 250GB
解像度 1024×600
OS Windows7 Startar(32ビット)
 
液晶部が回転するので、タブレットPCにもなる。キーピッチが少し狭い程度でタイプはしやすい。好みもあるかと思うが、ASUSとかAcerとかのネットブックと比べてもキーボードの作りは良いかと思います。
残念なのがディスプレイの解像度が1024×600と低い点で、上位モデル(T1028X)で1366×768のものもあります。こちらを使ってみたい気もしますが、最近、眼精疲労に悩まされているので、私としてはこれ以上、ドットピッチが細かくなると目に悪いので、割り切って使う分にはよいかもしれない。実際、IEを全画面表示で使うとか工夫していますが、あまり不自由は感じていないです。
 
■エクスペリエンスインデックス
プロセッサ 2.4
メモリ 4.6
グラフィックス 2.4
ゲーム用グラフィックス 3.0
プライマリハードディスク 5.7

CPUとグラフィックのスコアが悪いがモバゲーのガンダムブラウザウォーズをする分には問題ない程度です(少し遅い程度)。もちろん普通にブラウザを使っている分にもあまり困らない。

キーボードは、中国語の刻印があり、来るべき時代に対応できそうです(って中国語はまったくできないのだが・・・)。キーボードの写真を載せますがパット見た感じ日本語のような雰囲気があります。

今まで使っていたノートPCはB5といえども大きくかつバッテリーが1時間持たなかったので持ち歩いていませんでしたが、T1028はバッテリーが4時間持つので、これと光ポータブルとイーモバイルに入り、外出先から会社のメールが受信できるようになり、遅ればせながら私のモバイル環境も充実してきました。

ちなみに、GIGABYTE自体は日本にも代理店があるようですが修理となると直接台湾のサポートにアクセスしないとダメなようで、値段のことを考えてもあまり海外でパソコンを買うのはお勧めしません。今回は、まぁ私の自己満足のレポートということで・・・

[海外旅行]台北(1)

年明けからいろいろネタがあったので後回しになりましたが、最近ですが、ちょいと台北(台湾)へ行ってまいりました。
 
ブログをやっているのと一応通訳案内士を目指している関係で、旅行記事でも書いてみます(と命令されました)。まぁこういう記事は慣れていないので、その点はご了承下さいませ。
 
■ 台北(台湾)

  • 国  中華民国
  • 首都 台北
  • 通貨 台湾元(2011年1月で、ざっくりしたレートは1台湾元=3円)
  • 時差 1時間(日本の方が進んでいる)
  • アクセス 羽田空港から台北(松山空港)へ行きは約4時間帰りは、約3時間
  • 台北の交通 
  • 国鉄以外にも、地下鉄(MRT)があり、乗り換えに気をつけないといけないが、市内を便利に行き来ができる

 
■ 訪ねたところ

 
■ 故宮博物館
 詳しくは他に譲りますが、世界四大博物館の1つといわれている博物館、台湾にあるが中国の各王朝の美術品が見られる。かなり大きな博物館で11:00~17:00とたっぷり6時間にわたって中国4千年の歴史を堪能しました。
行った時が悪かったのか、中国本土(?)の博物館なのであまりないのか不明ですが、台湾自体の展示物が少なかったのが残念でした。
博物館とは関係ないのですが、帰りにお茶屋さんに遭遇し『お茶を飲ませる。送って行く。』といわれてそのままお茶屋さんに行きました。そこで阿里山というお茶を試飲し、買いました。大変おいしかったので私にとっては買う価値があるかと思うのですが、それなりに高いお茶なので、こういう商法がおきにめさない方は最初のお誘いから断った方がよろしいかもしれません。(繰り返しになりますが、味は大変おいしいのとおそらく日本で買うよりも安い(100g 800元 – 2,400円)ので、買い物としては悪くはないかと思います。)

 
■九分と金瓜石黄金博物園
 九分といえば、『千と千尋の神隠し』のモデルと言われている、確かにそんな雰囲気を持った町でした。長い商店街のある町でそれなりに楽しめそうでしたがあいにくの雨で残念でした。

金瓜石黄金博物園ですが、日本の統治時代から続いた金山の跡地で、日本の宿舎や鉱山を見物してきました。
これまた、金瓜石とは関係ないですが、トイレ休憩の時に大きな像が見えたので「あれは何?」とガイドさんに尋ねたら関羽さんとのことで、記念に一枚撮っときました。

 
■夜市
 夕食は夜市で食べました。台北には夜市と呼ばれる屋台村のようなところがいくつかあり、士林饒河夜市で食べました。士林の方は1箇所のフードセンターに各お店が入っており、饒河夜市の方は道路に露店が出ているようです。大雑把に言えば中華料理なのですが、私は士林の夜市のはずれのお店で食べたチャーハンが気に入りました。

■その他
 台湾の方から見れば私は同族か中国本土の人のように見えるらしく、よく中国語で話かけられました。もっとも観光客は日本人より中国人の方が多いようなのでそのせいかもしれません。
あまりにも中国語で話しかけられるので、最後の方は『I am Japanese.』が口癖になりましたが、皆さん悲しそうな顔をされたので、次はもう少しなにかしゃべれるようにと(一瞬)思いました。

OpenBlockS 600

Windows7,2008R2に引き続き、これまた1年越しの作業になりましたが、我がohfuji.nameをホストするマシンをOpenBlockS 600(正確にはOpenBlockS 600D相当)に置き換えました。
 
OpenBlockS 600とは、ぷらっとホーム社さんが製造・販売しているマイクロサーバーで、こちらが製品情報になります。ちなみに2月現在キャンペーンをやっておられます。
 
OpenBlockS 600自体の解説はいろいろな場所で行われているので、そちらにおまかせしますが、特質すべきは、抜群の低消費電力で、私がエコワットで測定した結果は9Wでした。またファンレスでストレージはコンパクトフラッシュを使うので音が出なくてかつ障害に強く、商業利用はもちろん、自宅サーバーとしても重宝するかと思います。
 
OSですが、OpenBlockS 600はSSD Linuxがプリインストールされています。また600DはDebianがプリインストールされています。メモリは1GB積んでいますのでDNSサーバーやメールサーバーとしては申し分ないスペックです。
難点が、CPUにPOWER-PCを使用しているところで、私のようなプログラミングをする人間にとっては開発環境を別途用意しないといけないのと、さらにそのCPUの動作周波数が600MHzとお世辞にも速いと言えないところで、Apacheで静的なページを運用するならともかく動的なページは難があるかと思います。特に普通のサーバーでも重たいWordpressをOpenBlockS 600で運用するのは厳しいかと思います。
 
では、このブログ(Wordpressなんですが・・)はどうしているのかと言いますと、このページはADPで作成したブログビューアーで表示しています。我がADPもOpen BlockS 600Dに移植しまして、このとおり動作しておる次第です。このページを頻繁に訪問される方は気がついておられたかと思いますが、最近Wordpressが重くなっていたので、どげんかせんといかんと思っておったところです。このような厳しい条件を克服するのはソフトウェアエンジニアとしてロマンを感じたりします。
しばらく運用してみてOKであれば、OpenBlockS 600D版のADPと共にブログビューアー(Adp WorPdress bLOG viewer - AWPLOG)のソースを公開しようかと思っております。

2011/06/23 追記:節電の為、自宅サーバー類は仮想マシンとして別のサーバーに集約しましたので、現在このサーバーはOpenBlocks 600D上では動作していません。

自作機向けWindows7のKernel-Power 41病対策

Kernel-Power 41病というのは、Windows 7に特有の現象で、突然PCが再起動しイベントビューアにID:41の『システムは正常にシャットダウンする前に再起動しました。』というログがはかれる現象を指します。
 
私はWindows7を使いだしてから1年になるのですが、それまではKernel-Power 41病というのがあるとは知らなかった(つまりブルースクリーンやら突然のリセットを見ていなかった)。
社内のPCをWindows7に入れ替えた後、社長のPC(自作機)が、たまに(2,3日に一度)リセットがかかり、いろいろ調べた結果、結構有名であることを知る。
 
一応マイクロソフト社さんのWEBページでサポート情報が上がっています。
 
社長のPCは、当初、シナリオ1でグラフィックドライバの不具合のような振る舞いをみせましたが、グラフィックカードを換えると、今度はシナリオ3の現象が発生しました。
ネットを検索しますと省電力機能の不具合により電力不足が発生することが原因らしいとのことで、それならと電源を換えて、メモリとグラフィックカードの端子を接点復活剤を使って掃除したところ、それから1週間経ちますが Kernel-Power41は発生しなくなりました。
電源を安物から少し良いものに換えたのでこれがあやしいのですが、ただ、現在その電源は私が使っているPC(これも自作)で使用していますがKernel-Power41は発生していませんので、接点復活剤の可能性もあります。今まで接点復活剤は気休めに使っていてあまり効果を実感したことがないのですが、今回は役にたったかもしれません。
巷では、省電力設定を無効にする(プロセッサの電源管理、最小のプロセッサの状態を100%にする。USBの省電力設定を無効にするとか)が有効らしいですが、それでもダメな方や省電力設定を切りたくないかたは、成功したらラッキー程度にご参考にして頂ければと思います(もちろん自己責任で)。

[ADP開発日誌]SQL(JOIN)の実行パフォーマンスについて2011

以前に書いたこの記事に関してコメントをもらいちょうど記事にしようかと思っていたところでしたので、ADPのキャッシュ機能を使い、この記事の実験をADPでやったらどうなるかみてみます。
 
SQLでjoin(結合)と言えばSQLに慣れた方にとっては馴染み深いものですが、初心者にとっては一種の登竜門のようで、joinを避けたコードを見かけたりすることがあります(まぁ私も十数年前にはこのような理由でjoinを避けたコードを書いた記憶があります)。また、O/Rマッパーではテーブル毎にクラスを対応させる関係で、joinの取扱がややこしかったりします。
それ以外でも、私の場合になりますが、過去にパフォーマンス上の理由からjoinを行わなかったことがあります。
今回は、前回の実験と同様に
・SQLでjoinさせる。
・ADPでjoinさせる。
でパフォーマンスの違いについていくつかの実験を行い計測します。

実験環境

JOINのパフォーマンス実験環境はこちらに記述しています。
 

実験1 素直にSQL側でjoinをさせたものを実行

例により、SQLで素直にjoinさせてみます。以下のようなコードになります。

,$db = "DSN=Trade"
,$str = "SELECT Price.CODE, RDATE, OPEN, CLOSE, NAME FROM Price "
        "INNER JOIN Company ON (Price.CODE = Company.CODE)"
,sql@($db,$str,[]).csv.prtn,next;

 
少しコードの説明を、
1行目の、$db=~ の部分は、ODBCの接続文字列を指定します。上記のコードは、ODBCのデータソース名Tradeを指定している接続文字列になっています。
2,3行目の、$strの部分はSQL文を変数$strに代入しています。本来は1行で書けますが、wordpressで見やすいように2行で書いています。
4行目の
,sql@($db,$str,[]).csv.prtn,next;
sqlは組み込みの述語で、「ODBC-APIを使いsqlを実行し、結果を配列(@)で受け取り、csvに変換し、prtnで画面に出力し、nextで全ての結果を出力する」というコードになります。
自画自賛になりますが、必要最低限の情報だけで簡単にSQLが発行できているので、ADPの開発目標の一つである「SQLとの親和性が高い言語を目指す」を具現している例だと思います。
 
実行時間ですが、

D:\>adp -t sql_test_1.p > sql_test1.txt
time is 119192ms.

 
で、約119秒となりました。
 

実験2-A ADP側でjoin(ネステッドループ)

続いて、ADP側でネステッドループjoinさせてみましょう。
 

,$db = "DSN=Trade"
,$price = "SELECT CODE,RDATE,OPEN,CLOSE FROM Price"
,$company = "SELECT NAME FROM Company WHERE CODE = ?"
,sql( $db, $price, [], @rec)
 ,sql( $db,$company, [$rec[0]], $name)
  ,csv($rec,$name).prtn,next;

 
ADPのDBライブラリは、前に紹介しましたODBCライブラリがベースになっていますので、ODBCのパラメータクエリが使えます。
5行目のコードがパラメータクエリを使っています。

実行時間ですが、

D:\>adp -t sql_test_2.p > sql_test2.txt
time is 1717284ms.

 
で、約1717秒となりました。実験1と比べて約14倍の実行時間です。
 

実験2-B ADP側でjoin(ネステッドループ&キャッシュ)

さらに続いて、ネステッドループjoinをADPのキャッシュ機能を使って高速化をはかります。
 

,$db = "DSN=Trade"
,$price = "SELECT CODE,RDATE,OPEN,CLOSE FROM Price"
,$company = "SELECT NAME FROM Company WHERE CODE = ?"
,sql( $db, $price, [], @rec)
 ,sql$( $db,$company, [$rec[0]], $name)
  ,csv($rec,$name).prtn,next;

 
呼び出し述語名の後ろに$をつければキャッシュ機能がONになります。上記のコードでは5行目の sql$ がキャッシュ機能を使用しています。
では、実行時間をみてみましょう。
 

D:\>adp -t sql_test_2.p > sql_test2.txt
time is 116770ms.

 
で、約117秒となりました。
実験2-Aと比べるとかなり高速化がはかられたかと思います。キャッシュのこのような使い方は、かなり有効だとうことが解るかと思います。繰り返しになりますが、ADPならお手軽にキャッシュ機能を使うことができます。

実験3 ADP側でjoin(事前にマップ作成)

ちなみに、ADPでも事前にマップを作成し、joinを行うことができます。
以下、コード例です。

,$db = "DSN=Trade"
,@tbl = {}
,sql($db, "SELECT CODE,NAME FROM Company",[], @r)
 ,@tbl = @tbl + [ $r["CODE"] | $r["NAME"] ]
 ,next
,sql($db, "SELECT CODE,RDATE,OPEN,CLOSE FROM Price",[],@rec)
 ,$key == $rec["CODE"].str
 ,csv($rec,$tbl[$key]).printn,next;

 
前回の記事ではC++でハッシュjoinを行うと書いたので『ハッシュJOINを言語で再開発するのは非効率』とコメントをもらいました。
コードを良く読んで頂ければ解るかと思いますが、実はC++の例でもjoin自体はプログラミング言語(ライブラリ)の機能を使っており、取り立てて複雑なことはしていません。 
やっていることを説明しますと、マスターテーブル用のマップを事前に作成し、それを使ってjoinを行っています。慣れていない人にとっては難しいかもしれませんが、古くはperlの連想記憶、最近(これも古いが)の例ではVBScriptのディクショナリに相当します。DBMSを使わないで日常的にファイル処理を行っている方にとっては日常的なコードかと思います。
 
ちなみに、ADPのコード例ですが非常にすっきりとしているかと思います。C++の例と比べると本来やろうとしていることが明確になっているかと思います。
実行時間は、
 

D:\>adp -t sql_test_3.p > test3.txt
time is 110988ms.

 
で、約111秒とやはり実験1より速くなっていることが解ります。
こうしてみると、実験2-Bが思いのほか速くなっていないと思わるでしょう。
これはSQLの実行回数に関係しています。
 
各実験のSQLの実行回数を見てみましょう。

SQLの実行回数
実験1 1回
実験2-A 約470万回(Priceテーブルの行数+1)
実験2-B 約2000回(Companyテーブルの行数+1)
実験3 2回

 
になります。実験2のコードではテーブルの行数に比例した数だけSQLを実行することになります。実験2-Bが実験2-Aより速いのは、Priceテーブルの行数よりComapnyテーブルの行数が圧倒的に少ないから、つまり1対nの結合を行っているからで、仮に1対1の結合では速くならないということになります。
 
実験3がなぜ実験1より速いかですが、DBMS側から転送されるデータ量が違います。
以下、CSVファイルの先頭5行を表示します。
 

1717,2005-05-10 00:00:00.000,21251,3522,明豊ファシリティワークス(株)
1717,2005-05-11 00:00:00.000,21251,3522,明豊ファシリティワークス(株)
1717,2005-05-12 00:00:00.000,21251,3522,明豊ファシリティワークス(株)
1717,2005-05-13 00:00:00.000,21251,3522,明豊ファシリティワークス(株)
1717,2005-05-16 00:00:00.000,21251,3522,明豊ファシリティワークス(株)

 
企業名の『明豊ファシリティワークス(株)』が重複して余分なデータとなっています。実験1のコードではDBMSから言語側にこのように重複したデータが来ます。各実験で転送されるデータ量を見てみましょう。
 

結果データの転送量(CSVファイルベース)
実験1 約256MB
実験2-A 約256MB
実験2-B 約184MB
実験3 約184MB

 
実は、DBMSから言語側へ転送されるデータ量自体は、実験1より実験2-Bの方が少なくなります。そのような関係で、実験1より実験2の方が早くなっています。SQLの実行回数(実験1の方がよい)とデータ転送量(実験2の方がよい)になりますが、このあたりはハードウェアの環境やDBMSによって結果が変わってくるでしょう。
この2つのデータから実験3は、なるべく少ないSQLの実行回数で少ないデータ量を転送しているということが解るかと思います。

追記:コメント欄での指摘およびテスト再現性を考慮してテスト環境を整備して再度計測しています。