サポンテ 勉強ノート

サポンテの勉強ノート・読書メモなどを晒します。

PHP を使って VBScript コードを作る(な、何を言っているのか...

背景

先ごろ VBS を使って2000行を超えるスクリプトを二つ作りました。しかしこの二つのスクリプトソースコードのうち 2/3 は同じです。

Visual Studio 2015 でデバッグとプロジェクト管理をしています。便利です。後ほどリンクをご紹介します。

開発環境には別の仕事の関係で PHP もインストールしてあります。

ソースコードの分割

VBS には include という概念がないため、一つのファイルに全ての処理を書かなければいけません。手軽に実行がモットーのスクリプトですから、これは制限というよりむしろ美徳です。しかし開発時はファイルが別々になっててくれた方がうれしい場合があるのも事実。二重管理しなくてすむし、再利用もしやすくなるしね。

include には下記の別の方法もあるにはありますが、やっぱり最終的な実行ファイルは一つにしたいです。

vbScriptでinclude文を使う - tekkの日記 C#,VB.NET

ユーザーに配るとき「これをダブルクリックしてね」と言うだけで済みますからね。せっかく Visual Studio を使っているので、「ビルド」として複数のスクリプトファイルを一つにまとめる処理を作ってみましょう。

手順1:プロジェクトの作成

メモ: Visual Studio を使って VBScript の開発を行う - 高東ソフトウェアサービス

まずはこれでプロジェクトを作ります。私の場合は 2008 と 2015 で同じ手順を行い、確認しました。VBS 開発もこれで IDE の恩恵を受けることができます。

リンク先の手順をざっくり書くと、以下のようになります。

  • Visual C++ のメイクファイルプロジェクトを流用して、VBScript 用のプロジェクトを作る。
  • 新規プロジェクトで「Visual C++」「メイクファイルプロジェクト」を選択する。プロジェクト名を決めたらウィザードはすぐに終了。
  • ソリューションエクスプローラーに表示される以下のものは不要。
    • ソースファイル
    • ヘッダーファイル
    • リソースファイル
    • readme.txt
  • Windows エクスプローラ上で VBSTest.vbs を作成し、ソリューションエクスプローラーにてプロジェクトに追加する。
  • プロジェクトのプロパティで以下の設定をする。
    • 「構成プロパティ」->「全般」->「構成の種類」を「ユーティリティ」に変更する。
    • 「構成プロパティ」->「デバッグ」->「コマンド」に「wscript.exe」を設定する。
    • 「構成プロパティ」->「デバッグ」->「コマンド引数」に「VBSTest.vbs //X」を設定する。

手順2:メインファイルの作成

手順1のリンク先にある手順の通りにプロジェクトを作ったものとして、プロジェクトのルートに VBSTest.vbs があるものと想定します。中身は空でかまいません。これをビルドのたびに書き換えるイメージです。

次に VBSTest.php を作成します。タイプミスではありません。拡張子は PHP です。 何を言っているのかわからねーと思 いますが、つまり PHP を VBS のプリプロセッサとして使用するのです。

PHP で VBS のプリプロセッサ

PHPプログラマーが知らないPHPの用法 | 株式会社きじねこ

PHP は Hypertext Preprocesser の略です。HTML のプリプロセッサという出自を持ちます。しかし PHP さんにとって PHP の外側の世界が本当に HTML なのかどうかは知ったこっちゃありません。つまり VBS でもなんでもいいのです。

VBSTest.php の中身は以下の通りです。

<?php
require_once 'classes/ApplicationEntry.vbs';
// require_once 'tests/HelloWorldTest.vbs';
require_once 'classes/HelloWorld.vbs';

見ての通り、ファイル内容を結合しているだけです。コメントアウト部分は後ほど説明します。

手順3:サブフォルダの作成

次に include する対象のクラスファイルを格納する「classes」フォルダを作成します。

そしてこれに対応するフォルダ「みたいなもの」をプロジェクトに作ります。ソリューションエクスプローラー上で右クリックして「追加>フィルター」を選択します。Visual Studio 上でフォルダ「みたいに」使えるのでこれでいいです。

手順4:クラスファイルの作成

次にこの「classes」フォルダの中に二つのクラスファイルを作ります。

以下のファイルは「集中例外ハンドラ」です。深い階層から Err.Raise したいときに便利で必ず作るので、この記事には関係ありませんが、備忘録としてここに書かせていただきます。

try~catchを実装するには - 城陽人の本棚

classes/ApplicationEntry.vbs です。

Option Explicit

Dim app
Set app = New ApplicationEntry

app.Start
WScript.Quit(0)

Class ApplicationEntry
    Sub Start()
        On Error Resume Next
        Call Me_Main() ' この後に何も行を書かないことで上の On Error Resume Next を集中例外ハンドラにできる。
    End Sub

    Private Sub Me_Main()
        On Error Goto 0 ' この行は Me_Main() 内部でのみ有効。

        Dim h
        Set h = New HelloWorld
        h.Greeting "Hello"
    End Sub

    Private Sub Class_Terminate()
        If Err.Number <> 0 Then
            WScript.Echo Err.Number & ":" & Err.Description & "@" & Err.Source
            WScript.Quit(Err.Number)
        End If
    End Sub
End Class

PHP はファイル末尾の改行を無視するので、最後は二つの改行で終らせるのがいいかもしれません。

次に HelloWorld クラスを記述します。classes/HelloWorld.vbs です。

Class HelloWorld
    Public Sub Greeting(ByVal msg)
        WScript.Echo msg & "World!"
    End Sub
End Class

手順5:ビルドバッチの作成

プロジェクトのプロパティで「構成プロパティ>ビルドイベント」を選択します。

コマンドライン」の欄に「Build.bat」を設定します。

次にその Build.bat をプロジェクトフォルダ直下に作成します。中身は以下の通りです。

@echo off
php -c C:\php\php-cli.ini VBSTest.php >VBSTest.vbs
type VBSTest.vbs
echo 0

type しているのは PHP の部分でエラーが発生した場合に、それをビルドエラーとして Visual Studio で検知できるようにするためです。後ほど実際にやってみます。

手順6:作成したファイルをプロジェクトに追加

作成したファイルを全て Visual Studio からプロジェクトに追加します。ソリューションエクスプローラー上で右クリックし「追加>既存の項目」を選択してスクリプトを追加します。

「classes/ApplicationEntry.vbs」「classes/HelloWorld.vbs」はもちろんフィルタ「classes」の下に、VBSTest.php と Build.bat はプロジェクト直下に追加します。

ビルド

これでプロジェクトの「ビルド」をすると VBSTest.vbs の中身が PHP によって作られるようになります。

手順7:デバッグ

その後は「デバッグなしで実行」するとデバッグもできます。何を言っているのかわからねーと思いますが、いや 先ほど紹介したリンク にもちゃんとそう書かれています。VBS をデバッグするためにはなぜか「デバッグなし」の方を選ばなければなりません。Visual Studioツールバーをカスタマイズして、こちらも直ぐにクリックできるようにしておきます。

ビルドエラーの検知

さて、PHP ファイルのコメントアウト部分を以下のように変更してリビルドしてみてください。

<?php
// require_once 'classes/ApplicationEntry.vbs';
require_once 'tests/HelloWorldTest.vbs';
require_once 'classes/HelloWorld.vbs';

「tests/HelloWorldTest.vbs」というファイルはまだ作っていないですからエラーが出てほしいです。Visual Studio の「エラー一覧」ペインを見ると、ちゃんとエラーが表示されていることが確認できると思います。PHP の出力するエラーを「ビルドエラー」のように見ることができます。

「tests/HelloWorldTest.vbs」を実際に実装すれば、クラスの単体テストを行うことができます。あるいは ApplicationEntry.vbs の中で WScript.Quit(0) しているので classes/HelloWorld.vbs の中に直接テストコードを埋め込んでしまってもいいでしょう(実行されないため)。個々のクラスファイルを指定すると単体テスト、ビルドして結合テスト、などができるようになります。

これでソースコードの管理や再利用が簡単になるだけでなく、 プリプロセッサの恩恵 にあずかることもできます。

集中例外ハンドラのファイル(classes/ApplicationEntry.vbs)にハードコーディングしている「HelloWorld」を PHP の変数にしてしまえば(例えば「<?=$className ?>」のように)再利用できます。

開発時にはトレースを出して、本番リリースのスクリプトでは__それをフラグ一つで無効化するのではなく__処理自体を削除するというようなこともできるようになります(単体テストしづらくなりますが)。

聞いただけでゲンナリする VBS の開発も、これでだいぶ楽になると思います。

参考文献

「完全独習 統計学入門(小島寛之 ダイヤモンド社)」 勉強ノート「第十八講」

はじめに

第十八講の勉強ノートです。標本分散と比例する統計量Wの作り方が書かれています。この講から何か核心に入っていく感じです。ワクワクします。

f:id:saponte:20170702204924p:plain

免責

ノートには著作権法に抵触しないよう、自主規制が入ります。

本の紹介

ピーターの法則 (ローレンス・J・ピーター, レイモンド・ハル ダイヤモンド社)

ピーターの法則 創造的無能のすすめ

ピーターの法則 創造的無能のすすめ

はじめに

またすごい本を見つけちゃったな、という印象です。

冒頭に出版の経緯が書かれていますが、推敲よりも世に出すことを急いだようです。 そのためかいくつか気になる点があります。

  • 体系化が甘い
  • 事例が少ない(普遍性が甘い)
  • 内容に古さを感じる(普遍性が甘い)

それでもなお、1969年に発表されたというこの本に書かれていることには刮目すべきものがあります。

内容

簡単にまとめると__ネタばれですが__以下のようになります。

有能な人間は抜擢され、その有能さを発揮できない地位まで昇進し、やがて社会全体が 「成熟」期を迎えると全てのポストが無能(有能さを発揮できない)人間で埋められる。

それを避けるためには「創造的無能」__つまり有能さを発揮しつつも昇進の価値がない 人間であると見せかける能力__を身に付けることが有効であり、ひいては世界を救うこと になる。

概ね上記の2点です。

体系化が甘い

内容が若干冗長なのか、読んでいて飽きが出てくるところが多いです。 また重要な文脈が流れるようにつながっているのではなく「散らばっている」ように感じます。

事例が少ない

上の「有能さを発揮できない地位」というのは、日本では「器」という言葉で計られます。 他の国では違うのかもしれませんが、それでもある程度のコントロールがなされている 可能性はあるでしょう。そうしたことに言及はされていません。

また昇進がなければ有能さを手に入れられなかった人もあるでしょう。地位が人を作る ということもあるはずです。そうしたことに対する言及は「危機に際したとき」くらい しか書かれていません。

世界には、そうした事例もあるかもしれませんが、そうした横方向の「事例の蓄積」が 少ないです。もっとも作者に言わせれば、そうした社会があるならそれはまだ「成熟」 の度合いが低いということかもしれません。

内容に古さを感じる

終身雇用制が一般的であったり、経済成長が一定であったりした時代であれば、昇進は 不可逆なものであったのかもしれません。しかし今日ではどちらも破綻、あるいは少なく とも普遍的ではないことが共有されています。

昇進したけれどしっくりこない場合に、あえて条件のよくない転職をして充実した社会 生活を選択するという生き方も、現在では珍しくありません。

出版年が古いためか出版を急いだためか、この本はそうした時代を経ることによって 得られる「事例の蓄積」が少ないです。縦方向の普遍性が甘いです。

著者が存命なら、このあたりを更に推敲して改訂版を出してくれたものとと期待されますが お二人とも既に他界されていることは残念です。

本の位置づけ

文章には「階層社会学」という単語が多く見受けられますが、あまりにも皮肉っぽい 書き方なのでどこまでが本気なのか計りかねます。

おそらくは出版を急いだために体系化があまくなった、と信じたいところです。

上記のような欠点はあるものの、この本はやはり読んでおいてよかったと思う本です。

成熟した社会の先へ

世界は、今日より明日、明日よりその先の未来へ、よりよいものになっていくと 私たちは信じています。

しかしながら、この本はそれが単なる幻想に過ぎないことを示唆します。 事実、連日のように信じられない不祥事や頑迷な官僚主義、目を覆いたくなる暴力への 無関心、安かろう悪かろうになっていく日用品など、その証拠がたくさん目に付く状況です。

ただ時間が過ぎ去るだけでは、より良い未来は手に入りません。それはやはり、 市井の人々の努力にかかっているのです。

本を読む人だけが手にするもの(藤原 和博 著 日本実業出版社)

はじめに

本の紹介です。

本を読む人だけが手にするもの

本を読む人だけが手にするもの

本を読むことは別の人生を歩むこと

序章で「成熟社会では本を読まない人は生き残れない」とあり、以降の章で、著者自身が本を読んでどう変わったか、また著者が調査した統計情報なども踏まえてその理由を詳説しています。

本の中の本の紹介で

またこの本の中で紹介されている書籍で ピーターの法則 というものがあります。

ピーターの法則 創造的無能のすすめ

ピーターの法則 創造的無能のすすめ

冒頭で紹介した序章のタイトルで「成熟社会」という単語が入っていますが、その言葉の定義について、その語感から得られるものと、 ピーターの法則 の中で展開される定義で大きな隔たりがあり、結構衝撃を受けています。

注意点

この本( 本を読む人だけが手にするもの )を読む際の注意点としては、イデオロギー的にやや偏りがあるので、その点、気をつけるべきかと思います。

その他の部分、冒頭で挙げた序章など、参考になるところは多いです。

多読するべきか

フォーカスリーディング 」や「 無理なく続けられる 年収10倍アップ勉強法 」ではむやみやたらに多読するのではなく、自分にとって真に身になるものに集中して読書するべきであると書かれています。この本では逆に多読を進めています。

そうしないと、自分にとって「良い本」と出会えないからだと言います。たしかに他人にとって良い本が自分にとっても良いとは限りませんからね。

この二つ(多読の是非)は正反対のことを言っているようで、どちらも正しいと感じます。大人になると一見矛盾するように見える二つの事柄も「どちらも真」と感じるようになりました。

「完全独習 統計学入門(小島寛之 ダイヤモンド社)」 勉強ノート「第十七講」

はじめに

第十七講の勉強ノートです。カイ二乗分布の相対度数を使って母分散を推定する方法について書かれています。

f:id:saponte:20170630213838p:plain

免責

ノートには著作権法に抵触しないよう、自主規制が入ります。

本の紹介

「完全独習 統計学入門(小島寛之 ダイヤモンド社)」 勉強ノート「第十六講」

はじめに

第十六講の勉強ノートです。標本分散の求め方とカイ二乗分布について書かれています。

統計学を知らなくても、その名前だけは何となく聞いたことがある憧れのカイ二乗分布です。

f:id:saponte:20170630213748p:plain

免責

ノートには著作権法に抵触しないよう、自主規制が入ります。

本の紹介

移動の多い仕事は早死にするか

人が作り出す繭のような空間

移動の多い人は早死にするという噂を聞きました。あくまでウワサで、なにも根拠がなく、一笑に付しても構わなかったのですが、なんとなく以下のようなイメージが沸きました。

人は一つところにとどまっていると、身体から「何か」を放出してその人にとって生きるために必要なエネルギーを節約したり、快適さを感じる「繭」のような場所を作り出したりするのではないかと。もちろん悪い場所にとどまっていては論外ですが。

移動が多いということは、その「繭」が作っては捨てられ、作っては捨てられ、身体が渇いたような状態になるのではないでしょうか。その人が長時間とどまるような場所、つまり自宅にいる際、そこはまさに「ホーム」なのに対して移動中はずっと「アウェイ」にいるような感じです。それが疲労に繋がるのではないでしょうか。

最近引っ越しをしたのですが新しい住居の中に居て、移った直後と1〜3週間後ではハッキリ異なる印象を受けています。今までも引っ越しは少なくない方だったので、このような考え方が突飛なものではないと、なんとなく感じることができます。

微生物群

人間の身体から放出されるその「何か」を、オーラと呼ぶのか、気と呼ぶのか、それはその人の哲学次第ではありましょうが、ひょっとしたら「微生物群」と呼んでもいいかもしれません。

この本は「火」「水」「風(空気)」「土」の4元素にまつわる料理を究めようとする著者の試行錯誤の記録です。この「土の料理」の部では「発酵」を取りあげていますが、人間はその「個体」ではなく、共生する微生物群を含めた「生態系」と見なす考え方が紹介されています。

ひょっとしたら、微生物群は人体表面を境にした内側に存在するだけでなく、一定程度「放射」されているのではないでしょうか。

微生物群が人間の住まう住居に自分たちと自分たちの宿主である人間にとって快適な場所を作り出そうとするのは当然かもしれません。逆に人間の方が、なじみ深い微生物群が多く存在する場所を好むという言い方もできます。きっとこれは相互作用なのでしょう。

「あらゆるものは、あらゆる場所に」。微生物たちは何処の場所でも同じ種類のものが存在していることが確認されていると、この本の中にあります。しかし種類が同じだから問題ないかというとそうではないでしょう。人それぞれ特徴があるように、共生する微生物群にも特徴があるはずです(もしかすると単に微生物種の含まれる「割合」かもしれませんが)。人と人に相性があるように、微生物群も、その人が生来持っている__あるいは今までの人生でその身に取り込んだ__ものが構成されるのが理想的であるはずです。

微生物群の好みと人の好み

人が共生する微生物群を引き連れて生活をしていると考える場合、先に「繭」と名付けたものは「コロニー」と呼ぶべきかもしれません。

微生物群がコロニーを作ろうと放射されつつ消費されていくと考えると、やはり移動に伴う疲労がイメージできます。

生まれた場所から遠くは慣れて生活する人が、実家なり郷里に帰ると落ち着いた気分になったりすることがあります。これは土着の微生物群が、生来の微生物群に近く、親しみのあるものだからかもしれません。家庭の味、ふるさとの味が、離れた場所で作ったものよりもとの場所で食べた方が口にあったりするのも、そうした理由なのかもしれません。「十里四方のものを食べる」という古くからの考え方も微生物群にダメージを与えないために納得の知恵です。

引っ越し先

とはいえ、人間の強みはひとえにその「柔軟性の高さ」です。赤道直下から極点の近いところまで人の文化が分布しているのはそれを裏付けます。

引っ越してから3週間ほどで、大分落ち着いた感じになりました。やがて慣れていくでしょう。

祖先が食べていたものと同じものを食べる。

自分又は親の出身地の料理を食べる。

自分の周りを殺菌しすぎない。

自分で発酵食品を作ってみる。

移動の多い生活の中では、自分と共生する微生物群を「意識的に」大切にすることが重要なのではないか。そう感じました。