2008/05/25

Excel コード表にない値を見つけ出す VLOOKUP関数/COUNTIF関数

Exceで知っておくと便利な関数のご紹介。今回は表の整形ではなく、エラーチェック系のテクニックです。

Excelしか入っていない環境のときや、わざわざAccessにデータをいれるまでもない、といったときに便利でしょう。

その関数はVLOOKUP

アビバのCMでも紹介されている関数で、Excel使いの人の中ではメジャーな関数だと思います。一口で言うと、コード表から値を引っ張ってくる関数です。この関数が主に活躍するのは、CMにある通り、本来は入力シーンで、入力する画面ではコード入力、その隣の列にコードの値を表示する、といったものです。以下に、書式と引数のポイントを挙げます。特に引数で注意するべきなのは、範囲と検索の型だと思います。

書式
VLOOKUP(検索値, 範囲, 列番号, 検索の型)
検査値
入力するコード
範囲
いわゆるコード表。コードでソートをかけておくことが重要。ちなみにコードは範囲の中で一番左にくるように設定します。ちなみに大抵VLOOKUPは縦方向へドラッグして使うことが多いと思いますので、ドラッグしても参照する範囲がズレないように、「$」などをうまく使って、範囲を固定しましょう。
列番号
上記コード表の範囲で、何列目にあたる部分を表示させたいか。範囲の中で一番左にくる列番号は1になります。
検索の型
検索値 と完全に一致する値だけを検索するか、その近似値を含めて検索するかを、論理値で指定。この引数を省略すると、デフォルトはTrueに設定されているので、近似値をひろってきてしまいます。しかしコード入力する際、近似値などという厳密さのかけるものなど欲しくない場合が殆どなので、フツーFalseを設定して、コード以外のものが検査値にあれば、わざとエラーを見せる、といった使い方の方が多いのではないかと思います。このオプションのことをうっかり忘れていると、痛い目をみると思いますので、ご注意。なまじ省略可能な引数だからコワイんですよねー。

というわけで、入力シートへ仕込んでおくと便利なこの関数を、「即座にエラー表示となって間違ったコード入力を発見できてしまう」という捉え方をしている私は、後追いでのコードのイレギュラー値の抽出シーンなどでも多用しています。たとえば、Excelデータを渡されて、「A表にあって、B表にない行はどれかな?」とか頼まれるとき。

▲「範囲」はドラッグしてもズレないように、「$」を入れて工夫してください。

他人から咄嗟に渡されるものはExcelのものが殆どですので、列数がたくさんあって、Accessに入れるのも面倒くさいなぁ、と思えば、Accessのクエリの代用としてVLOOKUP関数を利用します。ExcelのA表のヨコにでも、B表のコード一覧にあるかないかのフラグを立ててあげれば、依頼人はそれなりに満足することが多いわけですから、既存のExcel表をそのままサクッと利用できるなら、その方がラクなわけですね。

Excelのまま、ちゃちゃっとB表をコード表に見立てて、B表のコードに当たるものをソートし、A表のコードを検査値と見立ててVLOOKUPを使います。そうした場合の検索の型は当然False設定で、わざとエラーを表示して、エラー表示をフラグ代わりに利用します。

計算式の結果は「フィルタ」機能で引っかかりますので「#N/A」で、エラーの行をピックアップすることも可能です。「#N/A」をそのまま表示するのは見栄えが悪いというのなら、「ISERROR」関数などで囲めば、論理値になります。

さらにVLOOKUP関数を知らないようなExcelの操作が危なそうな人に、調査結果を渡すときには「形式を選択して貼り付」で「値」オプションを選んで、値を固定化(参考)ておく、などの配慮をしておくと完璧でしょう。まぁわざとこのように値を固定化してExcelを渡すと、「ちょっと!俺、式も知りたいんだけど!」と言われることもありますが、そのときはそのときで、式の入ったモトネタを渡してあげればいいと思います。

ちなみに「コード表にない値を見つけ出す」という意味では、COUNTIF関数でも代用できるワザですね。、COUNTIF関数の引数として、B表のコードを範囲に指定して、A表のVLOOKUPでいうところの検査値を、検索条件として設定すれば、B表にないものはすべてゼロになるわけです。この「0」をフィルタにかけてあげれば、B表にないものの一覧は簡単に抽出できますね。COUNTIF関数も面白いと思いますので、いずれまた取り上げたいと思います。

いずれにせよこのテのワザのひとつをイディオムとして覚えておけば、役に立つでしょう。

mubmle→それにしてもこのテの作業の手伝いで「フラグ不要。色つけておいて」と頼まれることほど、萎えることはありません。「え。フラグ消しちゃっていいんですか?フラグが立っていれば、フィルタで抽出するの簡単ですよ?」と愕然として思わず念押しするわけですが、「『色をつける』って話になっているから、フラグはいらないや」とのお返事。

だーかーらー、色なんて飾りなんだってば!!

と思いつつも、そこまでハッキリ云われれば、単なるヘルプの身としては何も云えません。結構行数のある表だと、「どんな手作業をやるのか知らないけど、遅くて、不正確になるだろうなー」と想像もつくわけです。まーそれだけ要領の悪いことをやっているからこそ、Excel/Accessをちょっと使えば瞬殺の程度の作業を、部外者の私に頼んでくるわけですが。

2008/05/24

MSのWebサービス

23日にOffice Live Workspaceの日本語ベータ版が公開されたみたいですね。早速使っている方とかいるのでしょうか。使用感はどうなんでしょう(今のところ自ら人柱になる気なし。すいません)。

MSっ子と言っているわりに、Docsに対抗する(?)この話題を完全にスルーしていました。先週MS絡みのイベントへ行ったので、かろうじで意識していたくらいの感じです。「私ってMSのLive ID(!!ここにえびはらくんがいるとは…)絡みののネタに疎いんだなー」という自覚をもったのも、ごくごく最近のことですし…。そのことに気づかないほど、これまで完全にスルーしていたわけですね。

というわけで、Live IDは会社のアドレスでアカウントを取得したことがあるような気がするものの、「気がする」というコトバが端的にあらわしているように、マッタク使いこなしていない感じです。MS的には、Googleをヨコににらみつつ、多分、この辺に力を入れてきているであろうに、とことん無関心な私。うはは。ダメな感じですねー。私が…、というより、MSっ子でさえも、そんな感じにさせてしまっているWeb関連でのMSが。だからこそのYahoo買収騒動とかなんでしょうけれど。

そもそもWeb絡みでは、個人的にはMSとはビギナー時代からかなり無縁な感じでした。IE自体使うことが稀ですからね。VSユーザーではありますが本業ではWinフォームばかりを相手にしていますので、IEを使う必然もなく、ブラウザは自分の好みで使えたわけですね。というわけで、IE以外のブラウザとはなにかと相性の悪かったMSサイトへ行くのは億劫で、自然とWeb周りではMSのサービスは避けていたわけです。

一方、Googleの方との付き合いは検索に始まり、メールもgmail、DocsやNoteなどを愛用、ブログまでついでにBloggerという状況です。gmailアカウントを一旦とってしまうと、他のGoogleのサービスのアカウント取得も敷居が低いですから、興味本位でごちゃごちゃ試している間に、日常ツールの一つとして気がつけば使いまわしているわけですね。結果として、わざわざMSでアカウントをとってどうこうする気にもならなずに、第二の「悪の帝国2.0」が提供してくる環境に、すっかり入り浸りなGoogleライフが展開されてゆくという次第(…これはこれでヤバいっス)。

「ExcelラブならSpreadSheetsじゃなくて、Office Live Workspaceへ乗り換えろ!」と突っ込まれそうですが、既にDocsを使っている身としては、Excelにラブはあっても(MS信者ではないですが、Excelには苦いも辛いも含めて自分の中にラブがあることは確か)、正直なところかなりビミョーだなと。Office製品群を抱えているMS的にはSoftware Plus Serviceというスタンスをとらざるを得ないのでしょうが、Bookをダイナミックに加工したいときには、ローカル環境のExcelで加工してからSpreadSheetsへアップロードすればいいだけの話なので、SpreadSheetsユーザーとしては特に不足を感じていないわけです。VBAこそ使えませんが、SpreadSheetsではExcelで仕込んだ関数なども一応使えますしね。

イシカワさんには「MSっ子ならば、ストイックにMSを極めて」とからかわれていますが、こちらとしては結果としてMS製品に囲まれていただけで、なにかとMSを叩く人々の存在に対するからかい半分・自虐半分くらいで、MSっ子と云っているだけですので。実質はスタンドアローン的にはMS、Web関連はGoogle、といった単なる新旧「悪の帝国」使いです。あしからず。

とはいえ、迫っているビル・ゲイツの第一線の引退には、一抹の寂しさも感じています(この辺の心情は、MSっ子?)。ビル・ゲイツというギーク率いるMSが、なにかと巨人扱いされて、後続のギークたちにやたらと目の敵にされていた時代。これはこれで結構いい時代だったんじゃないかな?とも思いますし。これだけ目の敵にされる「巨人」も、なかなか今後は出づらいんじゃないかという気もしますしね(Googleもいまや巨人ですけど、気がつくと「隣人」みたいなキャラですからね…)。まーアンチMSの方々がどう思われているのかは知りませんが、「アンチMS!!」と騒いでいた時代はそれはそれで、巨人の姿がハッキリとしていて、結構楽しくはなかったですか?

2008/05/18

軽量Linux

B00186NCQY
特集1 デスクトップ徹底解説-X Windowの基本から最新KDEまで/特集2 Puppy Linuxならサクサク-軽量Linuxのススメ/特集3 Windows対抗馬の実力を探る-エンタープライズLinux最前線/付録-DVD-ROM

アスキーのUbuntu特集のムック本を買おうと思って本屋へ行ったのに、結局別の雑誌を買って帰ってきてしまいました。

Ubuntuで遊んでいるうちに、廃棄予定のノートPCに、試しにLinuxを入れてみようと思いついた私(我ながらすぐこういうことだけは、夢見だすわけなんですなー)。とはいえ、ハード関連に疎く、設定各種に自信はありません。それ故の惜しげのない廃棄予定のマシンなわけですが、廃棄予定マシンはかなりの低スペックマシンです。ゴージャスなUbuntuを入れると相当モッサリとした動きになるであろうことは火をみるより明らか。なにかもっと軽量なディストリビューションを探さなければ…、とモヤモヤしていたわけです(でもGUI環境を手放す気はナシ)。

そこへこの雑誌の「軽量Linuxのススメ」の特集タイトルが飛び込んでくれば、当然立ち読みモード。低スペックマシンを蘇らせる内容は、まさに今の私にどんぴしゃり。→即、購入という流れ。

雑誌を参考にしつつ、軽量Linux──それがどんなものなのかVirtualBoxでまずはあれこ試してみることにしました。

Puppy3.01の日本語版をVBOXに入れてみる

雑誌でもプッシュされていたので、試したわけですが、即効、挫折です。

Puppy3.01の日本語版をVBOXにインストールしようとすると、bootの後、Loading、という文字が出たまま、音沙汰ナシ。

UbuntuのときはVBOX用のイメージを落として使っていたので、大してVBOXの使い方では迷わなかったわけなんですが。

ISOからのVBOXのインストールは、実はこれが初めてだったんですね。「自分のVBOXでの手順が間違っているのかしら」と思ってかなり悩みました。

というわけで、VBOX使い方の検証がてら、Slaxや本家のPuppy4を入れてみました。

Slax(slax-ja-6.0.6-2008042201.iso)と本家のPuppy4(puppy-4.00-k2.6.21.7-seamonkey.iso)をVBOXに入れてみる

これらはあっさりVBOXで起動できました。つまり私のVBOXの設定自体は、そう間違ってはいないハズなんですね。

というわけで、以下は私なりの手順書(ライブCDとして起動しています。仮想化で単にライブCDを使うそこに意味はあるのかい…?という気もしますが、まぁ焼かなくて良いので)。VBOXのVersionは 1.6.0 Editionになります。

  • [新規]→[名前]で、OSとバージョンとかわかるものをつける、[OS]はPuppy3.01の場合、Linux2.6ですよね…。[次へ]
  • [メインメモリのサイズ]512MB
  • [起動ディスク]→[新規]→[可変サイズのイメージ]
  • [イメージファイル名]わかる名前を→[イメージのサイズ]可変で5GBでいきました。→[完了]

で、今度はISOの設定をするわけですよね。

  • [設定]→[CD/DVD-ROM]
  • [CD/DVD-ROMのマウント]にチェック
  • [ISOイメージファイル]をチェックして、落としたISOを設定→[OK]

これでVBOXの設定はおしまいで、あとは起動すればいいだけです。

なのに日本語版Puppyはうまくいきません。背景黒のDOSっぽい画面でpuppyの文字が表示され、Loadingに入るとそのまま音沙汰ナシ!!うーん、なんででしょー。雑誌にはインストーラーが壊れているっぽいみたいなことも書いていましたが、CDブートだしそれ以前の気配が濃厚ですね…。うーむ。

Ω Ω Ω

ちなみに検証がてら入れてみたSlaxと本家Puppyについてのファーストインプレッション…。

▲Slax:左バーでカテゴリわけされているんですが。いかがなものか…。

Slax

Slaxはホントにアッサリ入りました。日本語版ですし、キーボードの設定等も聞かれずラクラクです。ネット環境も勝手に設定してくれていました。でも画面サイズがなんだか大きすぎです(スナップショットをとるまで、画面からはみ出したパネルの存在に気がつきませんでした)。どうやって変更・設定すればいいのかわからずじまい。仮想化環境だからいいようなものの、どこで設定するのでしょうか。

基本的にどう動けばいいのか、わかりづらいUIですね。Winでいうところのエクスプローラーみたいな画面ですべて統一的に扱おうとしているのかな?という気はしましたが、使い勝手はビミョー。慣れていないだけ、とも云えますが、Winの使い勝手とは距離があります。

本家Puppy

▲Puppy:このフォルダは…。どうにかなりませんか。

本家PuppyはSlaxより、レイアウト自体はわかりやすいと思います。しかしここでもエクスプローラー的な役割を果たしているfile機能は何事?と思うくらい、ヒドいですね。自分が今どこにいるのか、パスも表示されません。端末でパスを書くことが多いので、パスは表示された方が便利ですよね。どこかにレイアウトを変える機能などがあるのでしょうか?ちなみにネット環境は自動で取得してくれず、手動設定でした。

起動時の犬の声だとか、PETファイルだとか、その辺のユーモアはかなり好みです。

その他、ライブCDならではのモヤモヤなのかもしれませんが…。

ファイルのセーブの仕方が、イマイチわかりませんでした。とほほ。

CDにセーブしますか?とかなんとかPuppyの場合、終了間際に訊かれます。Slaxの場合は問答無用で、初期化されます(これはこれでヒドイ…)。

CD-Rになんか記録しないから!!(というより仮想化環境なので、CD-Rとか云われても、どうやってライブCDのISOと、「メディア」にあたるものを差し替えればいいのか、わけがわからない…)仮想のCDからブートして仮想のHDDにファイルだけでもキープしてくれればいいのに…、と思うわけですが、なんだかわからず、にっちもさっちもゆかない。多分仮想HDDを認識していないくさい…。

というわけで、Puppyの方は雑誌のHDDへのインストールの仕方を参考に、仮想のHDDへインストールしてみました。

仮想HDDへライブCDからインストール

ざっくりと手順を振り返ると、
  • ライブCDに入っているGPartedとやらで、パーテッションとかを作成。
  • メニューからPuppyのインストールツールを起動して、そこからOSのインストール

まぁこんなものです。GPartedの使い方はこの辺をみてやりました。ただこのテの知識に疎いので、意味とかよくわかってなくて非常に不安です…(ext3とかlinux-swapってナニ?バランスとかわかりません)。

で、結局トータルのHDDがどれくらい食われているのかも、よくわかっていません。Winだとドライブと空き容量の関係が一目瞭然ですけど、Linuxにもきっとそういう画面があるハズですよね。Linuxの場合、ドライブの感覚がないようなのでちょっと違うのかなぁ?とは思いますが、でも物理的な容量は超えられないわけですから、物理的容量と、食っているファイルサイズを表示するような画面はどこかにあるハズ。

ちなみにPuppyの場合、ライブCD起動の際、Xorgでインストールすると落ちてしまったので、Xvesaで起動せざるをえませんでした(この辺は雑誌記事のThinkPadと一緒でした)。せっかく仮想HDDへインストールしたのだからここら辺も編集してやろうと思って、xorg.confを見てみたんですが…。私にはハードルが高すぎました。呪文をどう書き換えればいいのか、さっぱりわかりません…。というわけでXvesaのまま利用していて、動作は意外ともっさり気味です。いつか私にもこのファイルを書き換える知識を手に入れることができるのでしょうか。

日本語フォントと格闘

Puppy4は本家のものなので、日本語フォントも当然入っていません。というわけで、日本語サイトは豆腐の嵐です。

mixfont-mplus-ipa-TrueType-20060520p1.tar.bz2をゲットしてきて、user/share/fonts/defaultの下にあるTTFとType1のフォルダに、解凍したfontsの中身を全部コピーしたら、ネットサーフィンしても日本語を表示してくれるようになりました。

でもいまだに日本語入力の仕方はわかりません。これはIMEみたいなパッケージを自分で入れる必要がありそうですね…。

パッケージあれこれ

ブラウザはやっぱりFireFoxでなくちゃ…、というわけでPuppyにFireFoxのパッケージをインストールしたものの、起動の仕方がわかりません。試しに端末で「firefox」でEnterしたら起動しましたが、毎回そんな起動はやってられませんね(しかも端末を終了させると、FireFoxも一緒に落ちる…)。パネルのようなところへコマンドを打てばいいんだろうな、という察しはつくものの、メニューにもアイコンがないし、フォルダの中をかなり探しましたが、一体、このコはどこにインストールされているのやら……、という大捜索状態でいまだに遭難中です(Search機能とかも一体どこにあるんだ!!フツー、エクスプローラーとセットじゃないんですか?「目」みたいなアイコン押したら、隠しファイルが出てくるし、あーもー)。

Ω Ω Ω

こんな具合に、軽量Linuxについてはペットの方に振り回されている感じなわけですが…。

ちなみにライブCDつながりで云うなら、雑誌付録のKNOPPIXにはトライ済みです。結果:なんだか起動しませんでした(号泣)。

あろうことか、ディスプレイを認識してくれないようで、途中までいったところで真っ黒になって音沙汰ナシ。

省スペースマシンの宿命として、私のマシンのマルチドライブは、無理やりメディアを押し込むタイプなんですよ(お皿をお置くところが出てこない)。ただでさえ、その取り扱いになれずにビクついているのに、うんともすんともいわなくなって、どうやってメディアを取り出そうかとビビリまくりでした。

長押し→電源を落とす→再起動した瞬間、DVDブートが入る前ににサッとメディアを取り出す、みたいな…。一度の失敗で挫けまくりです。

ライブCDって気楽にOSを楽しめて…、と云われているけれど、VBOXに入れる方が気楽ですねー。あーでもKNOPPIXのゴージャス画面をみてみたい。でもVBOXに入れるのは、DVDに入っているものでいかにも容量が大きそうだからイヤだ…。

2008/05/17

XFCE

デスクトップ環境をXfceへ変えてみました。

▲超・地味!!

GNOMEは「BigBoard」というサイドバーがあるんだっけ?──とGoogle依存症ライフを送っている私はそわそわしていたんですけど、Fedra8や9には入っていても、Ubuntuにはまだ導入されていないのか、というところで諦めがつきました。

で、Xfceですが。個人的にはGNOMEより好感触。右クリックでランチャーみたいにメニューがさーーっとでてきて、便利ではないですか。動作も軽いようですし。

Xfceのパッケージをインストールして、GNOME→Xfceへの移行は特に問題ありませんでした。

ちなみにデフォルト状態は、超地味!!

というわけで、テーマをDLして、少し派手にしてやろうと、ごそごそやっていたのですが。変更できずに悪戦苦闘…。

DLしたものを/usr/share/themesへフォルダごとおきさえすれば、[設定]→[設定マネージャー]→[インタフェース]や[ウィンドウマネージャー]などから選べるらしい、というところまではわかったものの、/usr/share/themesへフォルダを移動させてもうまくいかないわけですよ。

しかもフォルダの名前も末尾に「theme-pack」とかがついていて、ヘンな名前だし…。と思っていたら、たまたま私のDLしたテーマのファイルの構造が二重のフォルダ構造になっていて、さらにその下を展開させたフォルダをゲットしなければならなかった、というオチでした。

単に、展開ソフトの扱い方に慣れていなかった私が気づけなかっただけのようです。しょんぼり。

そうこうしてキリのいいフォルダ名をゲットして、/usr/share/themesへフォルダ単位で移動させるとうまくゆきました。なーんだ。わかってみれば簡単。

というわけで、テーマの変更の仕方は以下の通り。

  • XFCE-LOOK.orgからThemesを選んでDL。
  • 展開(キリのよいフォルダ名になるハズです。そのフォルダの直下には、[gtk-2.0]フォルダがいるハズなんですよ)。
  • 展開したテーマのフォルダまでcdで移動。
    sudo mv [テーマのフォルダ名] /usr/share/themes
    
    で、テーマを移動させます。/usr/share/へは権限をもっていないと移動できないようですね。

アイコンも似たような感じで、

mv [アイコンのフォルダ名] /usr/share/icons

で、移動させればOK。

▲色々妙に遠回りして苦労した気が…。そして意図せず、FireFoxは3Beta版です。色々アドオンが足りません。

でも何故かデスクトップのアイコンのデザインは私の場合DLしたものには変わりませんでした。デフォルトで入っているアイコンは、きちんとファイルマネージャーで表示されているアイコンと連動して変更されるのですが、落としたものは何故かダメ。とほほ。

まー今となってはXfceのデフォルルトについているランチャのようなメニューが妙に便利で、結局デスクトップのアイコンはすべて消ししまったので、どうでもいいことではありますが。

あれこれやっているうちにコマンドも少しは覚えてきました。めでたい。

2008/05/11

Ubuntu7.01→8.04アップグレート

4797327421
林 晴比古
Linux/UNIXの活用に必要となる基本的な機能を詳細に解説。起動メカニズム,ジョブやプロセスの管理など,Linux/UNIXがOSとしてどのようなしくみで動いているのかを理解することもできる。Linux/UNIXの全ユーザー必携の1冊。

さっそく前々から狙っていた「新Linux/UNIX入門」を購入してきました。

Ubuntuのデスクトップのくせになんでそんなコマンドラインな本を?──というツッコミが聞こえてきそうですが、GUIはWinに慣れている私にとっての窓口みたいなものなので。まぁ「X端末」からコマンドをうてる環境は手に入れたので、ざっくり動作確認をしながらLinuxの思想が掴めれば、勘も働こうか思ったわけですね。それだけの為には、ちと高くて太い本ですが…。でもわかりやすいことはわかりやすいです。

Ω Ω Ω

さてVirtualBoxにいれたゲストOSのUbuntuですが、7.01→8.04へアップグレートしました。

8.04へアップグレートするとデフォルト画面の背景が変わりました。背景画像の他は7.01とどこが変わったのかよくわかりませんが(7.01とは1日に満たない短い付き合いでしたから)、相変わらずスッキリとしていますね。

今回のバージョンアップでサウンドの設定はVBOXの問題なので、設定しなおす必要はありませんでした。しかし画面サイズの設定はやりなす必要がありました。昨日と同じGuest Additonsをインストールして完了です。

それでは昨日からの活動記録です。ほとんどアップグレートと、他色々無駄な徒労に費やされたわけですが…。

Hostキー

▲VBOXを入れたくても入れられない2000なイシカワさんのためにVBOX設定画面。
ちょっとだけよ…?(笑)

VBOXのメニューを使おうとするとき、HOSTキーというコトバが出てくるのですが、これはなにかというと、VBOXの[ファイル]-[環境設定]-[入力]-[ホストキー]にかかれているキーボートの組み合わせです。デフォルトでは、おそらく「Right+Control]で設定されていますね(右側のCtrlです)。これをHostキーと言っているらしく、私がよく使う組み合わせは、[Host+F]です。これでゲストをフルスクリーンモードに切り替えることができ、ホストの画面を呼び出したいときは再び[Host+F]で戻ってこれるわけですね。ディスプレイが近頃私も折角ワイドになりましたので、Ubuntuのようなデスクトップ的なOSですと、フルスクリーンにしたくなるわけです。

ファイルの共有にいたるまで。

ネットワークに参加させる必要があるのかと思ってかなりウロウロしていたのですが、別にネットワークのことはなにも考えなくても、ホストとゲストのフォルダ共有はできました。とりあえず以下は、ホスト=XP、ゲスト=Ubuntuの場合。

▲VBOXの共有フォルダ設定画面

1.VBOXの共有機能の設定
VSBOXのゲストOSの[設定]-[共有フォルダ]-右側の+つきフォルダアイコンをクリック→[フォルダのパス]にホストであるWinの共有にしたいフォルダのパス、[フォルダ名]フォルダパスの愛称をつける。
2.ゲストOSで共有フォルダを作成
ゲストOSを起動して、ゲストOSなりに共有するフォルダをまずは作成します。
3.ゲストOSからの呪文
[端末]から次のような呪文を唱えるらしい。
sudo mount -t vboxsf [VBOXで設定した共有フォルダの愛称] [ゲストOSで作成した共有フォルダのパス]
このコマンドがうまくいくと、パスワードを訊いてくるので、そのまま入力。うまくいくとゲストOSで作成した共有フォルダのパス]にデータを入れると、Winからでもデータがみることができます。Winで保存したデータも見れます。

早速、共有フォルダ機能を使って、キャプチャとテキストデータを共有してみたわけですが。Shareフォルダ内のファイルをを上書き保存しようとすると、エラーになり、保存できないようです。共有フォルダ以外の場所においてあるファイルは上書きできますので、これはきっと「共有」設定にしているフォルダへ保存しようとするが故におきている現象なのでしょうね。ホストもゲストもユーザーは私一人っきりなので、ここはひとつ、上書きして欲しいところではあるのですが、理屈はなんとなく了解です。

で、後から気がつきましたが。Shareフォルダのマウントって、ゲストOSを再起動する度にやってあげないと、ゲストからみた感じは、カラッポになってしまうんですね!!!(要はゲストで指定したパスと、VBOXでキープしている共有フォルダが、1度ゲストを落とすと初期化されて、マッピングされていないみたいな感じ?)

なんとなくマウントの知識はあるのでうすらぼんやり現状の意味はわかっているのですが…。これってきっとマウントの設定をキープしておく方法がどこかにあるハズですよね。……頑張ります!!

Ubuntu 7.10 on VirtualBox

XP ProへVirtualBoxを入れて、Ubuntu 7.10(日本語ローカライズのVirtualBox用仮想マシン用データ)を入れてみました(8.04へはアップデート機能でどうにかなりそうなので、今後ヒマをみてアップデートする予定です)。これまで私はずーーーーーーーっとWinでしたので、備忘録も兼ねて、Ubuntuトライの雑感なども少々UPしていこうかと思います。

当初はMSっ子の意地で(うそ)、Virtual PC 2007に最新のUbuntu 8.04 LTS(Desktop版)の組み合わせでトライしていたのですが、失敗。落としたUbuntuのバージョンが新しすぎて、ググっても解決方法が探せず、断念しました。「7での解決方法でうまくいくかなー?」と思ったわけですが、インストールメニューなどもよく見ればコッソリ異なっていて、エラーの様子も違っているのです。ド素人の私には乗り越えられない壁でした。

そんなわけで、自信喪失状態の私は、Ubuntuサイトで予めVirtualBox用と銘打っているデータを落としなおして、そっちでトライしてみることにしました。しかしVirtualBoxにしてからも、MSの嫌がらせ(?)は続き、VirtualBoxをXPへインストール中、「システムの動作が損なわれたり、不安定になるなど重大な障害云々」の不穏な警告メッセージがポコポコ表示されました。

そんなのはただの嫌がらせです!(?)僕が一番MSをうまく使えるんだ!!!(もう何が何だかわかりせん…)──親のココロ子知らず。MSっ子としてはあっさり忠告を無視して、インストールを完了しました。Ubuntu 7.10のインストール自体は、存外あっさりと終わります(ただデフォルト状態でサクサク行ったら、どこになにがセーブされているのかマッタク私としては無自覚で、あとから探しました…。HDDの容量も標準の20GBになっていて後から真っ青だったのですが、問答無用でHDDを20GB確保していった様子はなく…。どうやら自動でその都度HDDを侵食していくようです)。

大方サクサクすすんだとはいえ、当初、画面サイズがヘンで、サウンド機能も使えませんでした。

画面サイズの方は、Guest Additonsをインストールしてなおりました

[デバイス]→[Guest Additonsのインストール]を選択するとデスクトップにCD-ROMのアイコンが出現します(※[Guest Additonsのインストール]でCD-ROMのアイコンが出てこないときは、VBOXの[デバイス]→[CD/DVD-ROMのマウント]→CD/DVD-ROMの仮想イメージでVBoxGuestadditions.isoを選択してマウント)。このCD-ROMを開いて、VBoxLinuxAdditions.runのパスを調べます。今回の場合、[/media/cdromO]でしたので、[アプリケーション]-[アクセサリ]-[端末]を起動。

cd /media/cdromO
sudo sh ./VBoxLinuxAdditions.run

という感じで入力して、インストール完了。

ゲストOSを再起動して[仮想マシン]→[ゲストOSの画面を自動リサイズ]で、ワイド画面に対応しました。

サウンドの有効の仕方はホストOS(=Win)のオーディオドライバを使うことで解決するようです。

ゲストOSの[設定]→[オーディオ]→[オーディオを有効にする]にチェック→[ホスト オーディオドライバ]で[Windows DirectSound]を選択。

これで音も鳴るようになりました。

Ω Ω Ω

MSっ子の私は、当然、初Linuxなわけなのですが。Ubuntuというのはだいぶマルチメディア関係に強いみたいですね(←勉強しながら、いじっている感じで、インストしてから、へーそーなのか状態)。ubuntu studioなどのマルチメディアクリエイター向けのディストリビューションもあるようです。とはいえ、そもそも個人的にはあまり興味のないジャンルなので(マルチメディアのクリエイトはやる気ゼロ。センスないのでー)、その辺に関しては個人的には、ふーん、といったところではあるのですが。

でもUbuntuそのものはなんだか面白いですね。私はWin以外のOSはこれまでまともに触ったことがないので、もの珍しく、かなり興味津々です。

デスクトップを複数作れるあたりにもココロ惹かれました。特に会社マシンで案件ごとにデスクトップを変えられたら、なんか便利かも…、とか夢見ちゃったり。

Linuxをメインに使うという選択肢はありだなぁ、とはからずも思ってしまいました。ハードウェアの部分では、苦労しそうな気はしますけど。私の場合、UIなどは、思いっきりGUIで入れましたので、存外すんなり受け入れられました。

ハードウェア等の環境さえ整っていれば、もしも私がMSと無縁の開発者だったら、VBが母国語とかじゃなければ、或いは…、という感じです。余計なソフトがあまり入っていないとか、その辺のシンプルさも好印象ですね。

デスクトップ環境も色々選べるようですね。ディストリビューションごとにある、とうより、ディストリビューションをまたいで、デスクトップ環境があるという感じなのでしょうか?私が受けたざっくりとした印象を素直に並べてみると

KDE
見た目派手ー。重め?レイアウトがWinに似ているので、入れればすぐに馴染めそう。
GNOME
見た目Mac寄り?なんでしょうかね。デフォルトでこれが入っていました。動作は、ファイルサイズから察するとKDEとXubuntuの中間…というより、KDEと似たような感じなのでしょうかね。
Xubuntu
低スペックでもサクサク動くようで、これは魅力的ですね。でも上記2つに比べて、無線LANを勝手に発見してくれないとか、ド素人の私には敷居は高めのようです。
Ω Ω Ω

私の場合、普段から「サーバー」とは関係が薄いので、メインデスクトップとしてのGUI的な使い方ばっかりに目が言ってしまうわけですが、Winにはない面白さがあるなぁ、と、ワクワクしてきました。

それとは別に、少しUbuntuに慣れて、使うソフトなども絞れてきたら、USBメモリにOSを入れることにもトライしたいですね。今はUSBメモリもかなり安いですし…。「いつでもどこでもマイOS」というテーマにはかなり興味があります。

海外のネットカフェでは、この数年の間に殆どのマシンのOSはXP以上なので、日本語入力できるマシンの方が多いわけですが(1台のマシンで何カ国がずつ担当していて、ユーザーの希望で、マシンを割り振って各国語に対応しているお店が多いような気がします。でも、都市部はともかく田舎だとあまり選択肢もありませんので…)。店が混雑していたりして、日本語割り当てのマシンからはずれると、英文入力しかできないわけです。そんなときマイOS環境が持ち歩けたら…(妄想モード)。

とはいえ、冷静にネットカフェでの状況を思い起こすと、カフェのマシンにはタイマーソフトなどが仕込まれており、時間によって課金されたりするわけで…。勝手にUSBメモリでブートしたら、確実に怒られますね。そういう意味では今のところ「いつでもどこでもマイOS」夢想は非現実的ですね…、しょんぼり。でも「モバイルしなくても、いざというとき出先でマイOS環境が…」というテーマには妙に惹かれてしまうわけですね(笑)。

で、未練タラタラでサーフィンしていたら、こんなテクニックを発見しました。USBメモリにOSを入れる場合、USB Deviceが1st Bootにする必要があるわけですが。それよりもCDブートの方が現実的な環境ですよね。というわけで、CDブート用に徹したCD-RとUSBメモリに保存したOSでの組み合わせテクニックが下記になるわけです。

Ubuntu7.04をUSBメモリにインストールしてみた

Ubuntuじゃなくても使えそうなテクニックですね。ミニCD-RとUSBメモリが欲しくなってきました。ま、これはなんだか妙にウキウキするネタなので、いずれトライすると思います(笑)。

2008/05/09

EmEditor Professional7

Newマシン導入に伴い、この度、たまたまEmEditor Professionalの7を入れたわけですよ。

EmEditorはご存知の通り、もともと機能が豊富にあり、このエディタの機能をフルで使いこなしているわけでもない私としては、これまでこのエディタのバージョンアップに、そこまでの熱意はなかったわけなのですが…(旧バージョンでわりと満足しちゃっているタイプだったわけです)。

ver6→ver7へのバージョンアップは、もしかして、かなり激変の世界ではないですか?(それともver6を私が使いこなしていなかっただけなのでしょうか?)完全にアリゴリズムとか違いますよね?UIこそ同じですが、在る意味、別物に近い、オドロキの世界です。

まず目を引くのは、最大248GBのファイルを少ないメモリでスムーズに開けるようになったことでしょうね。メモリ依存ではなくなった──遅延ロード機能搭載ということですね。巨大ファイルを扱う人には、これはかなり嬉しいことなのではないでしょうか。少なくとも私は、今も昔も、バッチ処理することが多いので、かなり嬉しかったです。

バッチ処理そのものをエディタで行うわけではありませんが、インプットにしろアプトプットにしろ、ファイルの中身を確認したくなることは多いわけで、その際にこの遅延ロード機能の有無が重要だと思っていたわけですね。特に新人時代はポンコツ・マシンで、それなりのサイズのファイルを開かなくてはならなかったので、かなり苦労しました。EmEditorと、フリー版でも遅延ロード搭載だったCoolMintあたりを、併用していた時期もあります。その当時の記憶が強烈で、マシンスペックがあがり、メモリ依存のエディタでも大抵のファイルが開けるようになった今でも、EmEditorに遅延ロードの機能がないことについて、多少の危惧はもっていたわけです。ですから、そんな私にとって今回の機能搭載は、「もうこれ1本でどんなに巨大なファイルがきても大丈夫」と思えるものすごい安心感…、プラス、驚きの高速機能という仕上がりで、感動することしきりの体験だったわけです。

遅延ロードだから、パッとみた感じが速いだけでしょ?ホントの100%のロードは暇がいるんでしょ?──とあなどるなかれ。100%表示するまでの時間を見積もってみても、これがなかなかに高速なんですね。7の特徴ページにも書いてありますが、

(1) ファイルの読み込み時間

ver6: 3分54秒 / ver7:13秒

(2) 正規表現を使用してすべての置換にかかった時間

ver6: 9分   / ver7: 1秒

なわけですよ。自分自身では計測していませんが、この速さの違いは、ファイルの読み込みにしろ、検索や置換機能ひとつをとっても、体感できるほどの激変なのです。

さらに私が気に入ったのは、単語補完機能。

まー、私はMSっ子なので、普段それなりに恵まれたIDEを使っていますので、「エディタでコーディングしているわけじゃないんだから、このテのエディタの機能は君にはあんまり関係ないだろう」と突っ込まれそうではありますが。インテリセンス機能に慣れきっているからこそ、このテの機能搭載(プラグインですが、7をインストールしたら、プラグインも既に入っていました)は、なんだか妙に嬉しいわけですね。

さらにおまけ的ではありますが、HTML バーもついたみたいですし…。私の場合、タグはなんとなく昔から手入力派なのですが、色ばっかりはどーも覚えられず、色の表を見て決めるか、別ソフトを使って入力していたわけですね。しかしこれからはEmEditorひとつで済んでしまうわけですね。らくちん(環境設定が…)。

他に大きい機能としてはUSB メモリにインストール可能になったことでしょうか。ローカルにインストールしたEmEditorの[ツール]→[インポートとエクスポート]→[USB ドライブなどのリムーバブル ドライブをセットアップしてすべての設定をINIファイルにエクスポートする]で、そのままローカルにインストールしたEmEditorが、そのポータブル用となってexeから設定ファイルにいたるまで、USBメモリなどへエクスポートできてしまうわけです。このサービスは凄いですねぇ。

あとはこれに自作のマクロファイルをUSBへコピーしておけば、いつでもどこでも自分環境のEmEditorですよ。ベンリーーー。

EmEditorの回し者ではありませんが、毎日使っているものですから、愛着もあり…。特にver4~6までを既に持っている方ですと、ver7へのアップグレードは無料ですので、このアップグードはちょっとプッシュしたいですねー。

2008/05/07

CurrentProject.Connectionの謎

再びAccessVBA教本ネタから。今回はADOの接続部分についてです。

Dim cn As ADODB.Connection
Dim rst As ADODB.Recordset

Set cn = CurrentProject.Connection
Set rst = New ADODB.Recordset
rst.Open "SELECT * FROM TB_ログ ORDER BY ログID", cn, adOpenForwardOnly, adLockReadOnly
Do Until rst.EOF
    rst.MoveNext
Loop
rst.Close
cn.Close

Set rst = Nothing
Set cn = Nothing

なんだかこのサンプルソースを見ていて違和感を感じたわけですね。違和感の部分はConnectionで、オブジェクト変数cnについて注目してください。まず、

Set cn = CurrentProject.Connection

自分自身の接続のインスタンスをSetでcnに渡している──この部分はいいでしょう。既にmdbファイルという自分自身は実体化しているわけですから、改めてNewして、インスタンスを生成する必要性は感じません。

さらにいうならば、CurrentProject──自分自身のことですから、既に接続がOpenされ済みとみなしていいわけで、改めて接続をOpenする必要がないという理屈もナットクできます。

そういう解釈で、上記ソースを眺めていると、Loopの後、

cn.Close

に違和感を感じるわけです。OpenしていないのにCloseしている、という部分で「あれ?」と思って立ち止まったわけですが、Openしていない理由(=CuurentProjectの接続だから)を考えると、CurrentProjectなのに、cn.Closeしちゃっていいいのだろうか?──という疑問も沸いてくるわけです。

CurrentProjectなのだから、CloseせずにそのままSet cn = Nothingするものだと予測しながらソースを読んでいたのに、Closeする必要があるというのはどういうことなんだろう(SetでNothingすること自体には疑問は持っていません。Setはメモリアドレスの代入にすぎませんから、「オブジェクト変数cnに入ったメモリアドレスをNothingするんだろうなぁ」というくらいのものです)。

過去の自分のソースをみても、CurrentProject.Connectionでセットされたオブジェクト変数は皆ちゃんとCloseしているので、教本サンプルソースのミスというわけでもなさそうです(証拠のソース。ちなみにこれを書いていたときは踏襲元も思い出せないくらいのはるか過去からの踏襲/慣習で、なーんにも考えていなかったんです)。

ちなみにmdbが複数個存在していて、別のmdbからもうひとつのmdbの接続するときや、VB6.0からAccessへADO接続する際には、

Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Password='';User ID=admin;Data Source=" & MDB_PATH
cn.Open

で接続して(MDB_PATHは接続したいMDBのパスの入った変数だとします)

cn.Close
Set cn=Nothing

で終了するわけです。OpenとCloseをセットで使っていますし、この記述に対する疑問は特にはありません。

問題なのはCurrentProjectの接続です。Openせずに、Closeする。Openしない理由は予測できるとして、接続をCloseしてもCurrentProjectに影響しないAccessの接続って一体、どーなっているんだ?──と思って、今回改めてじっくりとヘルプを調べてみました。

すると、Connection プロパティのメモに

Connection プロパティは、実際にはアクティブなデータベースに対する ActiveX データ オブジェクト (ADO) 接続のコピーへの参照を返します。このため、Close メソッドを適用したり、Connection オブジェクトのメソッドやプロパティを使って接続を変更しようとしても、カレント データベースとの接続を保持する Access の実際の接続オブジェクトに影響を与えることはありません。

と書いているではありませんか。

接続のコピー!!

そうだったのかー。

CurrentProjectの一意の接続そのものではなく、その複製を受け渡していただけなんですね。しかもおそらく接続をOpenしたままでの複製です。だからOpenせずに、CloseしてもOKなんですね。「複製の受け渡しとは安全設計なんだなぁ、そもそもConnectionプロパティはReadOnlyだし、かなり用心部深いよね。でも考えてみればここまで用心するのも、道理といえば道理だな」──と一人でナットクしつつ、すっかり習慣化して、いまやとくに疑問にも思わずスルーしていた自分に打ちのめされました。足元のこと、わかってないわ…。

2008/05/06

VBAのわかりにくさ

故あってAccessVBAの基礎編ネタを見直しいるのですが…。改めてAccess単体で見直すと、わっっっかりにくいですねぇ、やっぱり。

Access的にはユーザーに優しくするために色々なことを「隠蔽」しているのでしょうが、「隠蔽」しているが故に、「実はこれもこれも根っこは一緒なんだよねー」という原則ルールが見えづらい。

私の場合、クラスを理解するまで、いろいろな事が「謎」でした。VB.NET(VS2003)へ移行してから初めて、それまで「お作法」として捉えていたSetなんかの意味もようやくナットク、色々なことが一気にスッキリ、シンプルに見えてきたんですね。

そんなこんなでVBAユーザーからスタートしている自分を振り返ってみると、VBAでは「クラス」を隠蔽しているから、VBAからはじめるユーザーはいろいろな事がわかりづらいだろうな、と思うわけです。

たとえば他のクラスモジュール(Accessの場合、FormやReportとかしかありませんが)や標準モジュールから開いているフォームを操作したいときに、

Forms!フォーム名!コントロール名

とか

Form("フォーム名").Controls("コントロール名")

とかで突然表現しちゃうのってどーなのヨ?

Accessだって、Formクラスを継承して、新しいフォームクラスをユーザーが定義して、インスタンス生成をいるのに過ぎないだろうに、その辺のあれこれが、VBAの場合、すべて隠蔽されちゃっているわけです(これはVS2005にも当てはまりますね。私はVS2003をいじって、「Formって、Formクラスを継承したこーゆークラスを定義していたってコトだったのか」と、とても腑に落ちたのですが、2005からはVB6.0ライクになってこの辺が隠蔽されるようになりましたからねー…)。

Accessの場合、FormやReportオブジェクトについては、暗黙のインスタンスの生成をAccess側で勝手にやってしまっているのでしょうが、VBAがスタート地点で、コード先にありきだと、この辺が見えてこなくて、混乱の元になっていくんですよね。

自分を振り返ってみても、制御構造類などは見ればわかるものはいいですが、「こう書けばこう動くらしい」というみようみまねで書いていたオブジェクト変数の類は、長らく一種の不思議ボックス状態でした。あわせてSetステートメントもわかりづらい「呪文」でしたね。

DAOやADOなどでSetを使うこと──特にRecordsetなどの、自分でNewと書いているSetのイメージは、何度となく書いているうちに、自分なりにイメージは形成されてはいました。とはいえ、その「理解」も、今思えば、「New」の部分の「インスタンスが生成される」という感覚・イメージの部分だけで、Setの「メモリアドレスをオブジェクト変数に代入している」という役割の部分は、わかっていなかったわけですが…(この辺、我ながらホントに大混乱/未整理状態ですよねー。こんな状態でよく書いていたなー…)。

というわけで「お作法的」にしか飲み込めていなかった私にとって、かなりビミョーだったのが、NewをしないSetステートメント の存在です。Access単体で使うADOで云うならばCurrentProjectだとか。既に開いているFormやReportなどもそうですね。

Dim frmF_001 As Form
Set frmF_001 = Forms!F_001

frmF_001.txtData = "01"

Set frmF_001 = Nothing

というようなオブジェクト変数へ参照させる書き方は、当初、躓いていました。

F_001が開いたタイミングで「暗黙のうちにインスタンスが生成されている」とは明確に考えておらず、「Setステートメントなのに、なんでNewしないんだろ…?」と不思議だったわけです。いろいろな事が悲しくなるくらい、つながって見えていませんでした。

まーそれでも間違った書き方をしていればデバッグでエラーが出るので、デバッグ機能にダメ出しをくらい数をこなしているうちに、「ダメな理由をぼんやりイメージ/理屈を考える」積み重ね、Recordset等で書いているNewとの差を考えてみた結果、「mdbやフォームが既に開いているからには、CurrentProjectやFormなんかは、新しくNewしちゃいけないんだろうな」という感覚程度ならありましたけどね。

当然、継承関係も明確にはわかっていませんでしたので、

Dim frmF_001 As Form_F_001
Set frmF_001 = Forms!F_001

frmF_001.txtData = "01"

Set frmF_001 = Nothing

こうも書けるカラクリもイマヒトツわかっていませんでした(「Form_F_001」という型は、インテリセンス機能で出てくるので、そういう型が存在していること自体は、Accessをいじっているうちにわかるわけです)。断片的な情報から「Formという型がForm_F_001の親玉なんだろうな」というザックリとしたイメージはもってはいましたが、長らく「理論よりもコード先にありき」な状態だったので、それらはコードから自分なりに読み取ったイメージ/予測/解釈にすぎません。

VBAからはじめたユーザーにとっては、親切設計がすぎるがゆえに、いろいろな事が唐突な変形にしか見えないんですよね。フォームのことを「クラスモジュール」と呼ぶことは知っていても、自分がクラスの一部分を書いているという自覚も当時はありませんでしたし…。

これがclassの書き方を知ってからは、それまでのモヤモヤしたイメージ/理屈が、劇的に自分の中では一気に鮮明になったわけですね。

「クラス」と「インスタンス」の関係を知ったときの私の感想といえば、プラトンのイデア論に似ているなぁ、というものなのですが(洞窟の中で焚き火をして、その後ろで踊っているのがイデアで、洞窟の壁にうつる影法師は人間の住む世界だ、というあれですね。周囲からは同意を得ることはできませんでしたが、その関係性は似ていますよね???)。クラスが隠蔽されているVBAの世界は、私にとって影法師のみを見せられているようなものでしたね。

2008/05/05

Basicのお誕生日

5/1はBasicの44歳のお誕生日だったらしいですね。

私が最初に触れたプログラム言語も、学生の頃にちらっと触れる機会のあったBasicといえばBasicです。授業の内容は殆ど覚えてはおらず、妙に地味な印象しか残っていません。毎週のように課題が出され、なにがしかレポートにし、計算とグラフくらいしか描いていないような…。

うーん、どんな言語だったっけ?──と思って本棚をみたら、ちゃんと当時の授業のレポートがごっそりでてきました…(照)。久しぶりに当時のレポートに載せているBasicのコードをみてみると(レポートは課題の出題内容、考察とコード、および結果出力で構成されているので、レポートだけで大体なにをやろうとしたのかはわかります。言語の仕様は教科書がないのでコードから読み取るほかありませんが)、

  • インデントがなく、全部大文字(小文字やインデントはなかったんでしょうかね?)。
  • 配列の変数宣言ではDIMとか書いてありますが、数値型等では明示的な変数宣言もせず、型宣言もしていませんね。
  • FOR NEXTの呼応はあるようですが、IF文はEnd IfがなくTHENの後には、いきなりライナンバ(驚)。
  • IF文も含めて、GOTO文やGOSUB文など、ラインナンバが必須みたいな言語だったんですねぇ。
  • ところでこのラインナンバ、番号がぽんぽん飛んでいるので、エディタ機能ではないようなフシがありますが、もしかすると手入力だったのでしょうか?(手打ちでもしないと、切番などへは調子よく飛べませんからねー。ありうる)

いまのVBにこれらの面影あるか?と云われると、多少あることはあるような気もしますが、かなり変身したものですね。別物といえば別物だし、でもCの系譜にある言語よりは、1行ずつのセンテンスでみれば近いようなところもあるし…。

いずれにせよ、コマンド等も少なく、言語としてやけにシンプルだなぁという印象です(教師の方がマトを絞っていただけなのかもしれませんが。多少のアリゴリズム等をやらせたかったのではないかという形跡もありますし…)。

手元に残っているレポートに載っている範囲では、数値型と文字列型オンリーなのでクラス/オブジェクトのようなものも登場してきませんし、行番号でどーにかしようということ自体、わりとあり得ない感じの驚きはありましたが(←見事に綺麗さっぱり忘れていました…)。

VBはこの辺が始祖なんだなぁ、と思うと、VBユーザーとしては歴史も感じてちょっと面白いレポートです。

2008/05/03

変数のスコープと有効期限

故あってAccessのVBAの講習会へ参加したことのある同僚から、講習会本を借りて、このテの教材はどんなものかなーとちょっと読んでいたわけですが、講習会って、スゴイんですね。「VBAだしなー」と甘く見ていたら、言語の基礎を思った以上にかなりがっつり網羅している。…今思うと、VBA/VB6.0をいじっていた当時、単に私がなにがなんだかわかっていなかっただけなのですが(理屈はわからず「お作法」的に覚えたクチ。VB6.0ユーザーには多いのではないでしょうか)、基本という意味では、VBAの基礎本といえどもそれなりに網羅しているんだなぁ、と妙に感心。普段通いなれた安全な道しか使わない方なので、「そーいえば…」というものも出てきて、勉強/復習になります。

そんなこんなでテキストをみながら、「あぁこのネタにはハマったことがあるなぁ…」と思い出したり発見することも多い今日この頃なのですが、そのひとつが正直に告白しますと、変数のスコープと有効期限です。…基本中の基本ですね!!

VBAにはブロック・レベルのスコープはありませんが、VB.NETにはブロック・レベルのスコープがあります。

「スコープ」についてはブロックの外でブロック内で宣言した変数を呼び出そうとしてもエラーになるので、「あぁこれは使えないんだな」ということがハッキリわかるわけですが、「有効期限」はちょっとわかりにくいですよね。…そうでもないですか?

無教養な私の場合、「スコープ=有効期限」のように思いっきり錯覚していたわけですが、スコープと有効期限は別物なんですよね。VB.NETでのブロック・レベルのスコープでいうなら、変数の有効期間は、プロシージャ全体の有効期間です。

…で、その辺いい加減な理解をしていた私が何をやったかというと、お察しの通り、ブロック内で変数宣言した構造体を、自分で初期化せずに、使ってしまったわけです。当然、「宣言したところで初期化されている」という思い込み、プラス、有効期限もブロック内だという勘違いを前提を元にコーディング。その結果、恐ろしいデータができたので、すぐさまスコープと有効期限の違い、自分の勘違いにも気がつき、「とりあえず、なんでも自分の思うタイミングで初期化しておけば間違いない」というとても初歩的な教訓は自ら体験して得たわけなんですが。基礎本をちゃんと読めばそんなことは書いてあるのに、書いてあることがうまくつながらずに読んでいるとこうなるわけですね。

「スコープ/有効期限といえば、そんなこともやったっけなぁ」と我ながらイタイ思い出を振り返りながらテキストを読んでいると、Accessの場合、「標準モジュールに書いたPrivate変数の有効期限は、MDBを閉じるまで」と書いてあるではないですか。ひょええぇ…。これって、VB.NETでも同じことなんでは?

これまでVBA/VB6.0でいうところのクラスモジュール、およびインスタンス生成のクラスではPrivate変数宣言は使っていました。この場合「フォーム/レポートが開いている間は有効」、「インスタンス生成してそのクラスが生きている間は有効」ということで、迷うほどのこともなくわかりやすく特に問題はありませんでした。でも標準モジュールの類では、私は変数/プロシージャーを含めてPublicなものしか使ったことがなかったんでよね。故にあまり考えたことがなかったということもできますが、スコープ/有効期限は大事、と思いながら、標準モジュールの宣言セレクションで宣言したPrivate変数の有効期限をロクに認識していなかったとは、どーゆーことでしょう。

VB.NETでは標準モジュールにあたるModuleもありますし、それと同等の役割を果たすSharedを宣言しまくりのクラスの場合も、この辺の理屈は一緒の筈です。それなのにこれまでこの辺をロクに認識していなかったとは……。VBA/VB6.0時代同様、このテの場面ではPrivateで変数宣言をしようと思ったことがないので、幸いバグったことはありませんが。あああああ、足元で思いっきり躓いた感じでショックです。痛い、あまりにも痛い…。

モジュールみたいな場所でずっと値の生きているPrivate変数というのは、使いづらそうなので、今後も個人的にはあまり使う場面はイメージできないのですが(インスタンス生成のクラスでカプセル化した方が安心…)、言語の仕様はきっちり読んでいないと怖いですねぇ。自分の使ったことのない新ネタは使う前に仕様は確認はする方ですが、基礎がないと仕様を読む際のポイントもわからないですからねぇ。そしてワナにハマって「あの意味はこれだったのか!」と気がつく。…ときどきこうして基礎本を読んで振り返るのは、なんであれ、まだまだ勉強になります。