サポンテ 勉強ノート

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

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

免責

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

本の紹介