Windowsバッチ(MS-DOS)

Windowsバッチ

Windows上の処理を自動化するプログラム
正確にはMS-DOS上の処理の自動化
Windowsの多彩な機能の操作はバッチコマンドでは実現できない
コマンドプロンプトにおけるMS-DOSコマンドをまとめて記述・保存しておく事で、まとめて実行できる
Linuxにおけるシェルスクリプト
MS-DOS、Linuxコマンドについては「バッチコマンド(Linux/DOS/PowerShell)」参照

コマンド

コマンド 機能
pause バッチ中断
exit コマンドプロンプト終了
@~ 画面非表示
timeout 待機

バッチ中断
pause

コマンドプロンプト終了
exit

画面非表示
@~
@echo、@if ~等

TIMEOUT /T 待機時間(秒)
TIMEOUT /T 60
TIMEOUT /T -1 ※無制限

コマンドパラメータ

パラメータ 機能
/E ファイルが存在しなくてもディレクトリごとコピー
/Y 同名のファイルが存在する場合、自動で上書き
/D コピー先に同名のファイルが存在する場合は更新日が新しいファイルのみコピー
/q 確認メッセージを表示しない
/p 確認メッセージを表示する

組込変数

変数 機能
%~dp0 実行ファイルが置かれているカレントディレクトリ
%0 実行ファイルパス
%~n0 ファイル名
%~x0 拡張子

起動パラメータ

受取

> test.bat 5 ABC ""
文字列は"で囲まない
※test.bat
set prm1 = %1
set prm2 = %2
set prm3 = %3

SQL*Plus実行時

> test.bat 5 ABC ""
※test.bat
sqlplus (接続情報) @C:\test.sql %1 %2 %3
起動パラメータをそのまま渡す

エラーハンドリング

%errorlevel%
ms-dos操作の結果が自動的に格納される組込み変数
明示的に値をセットする事も可能
parent.batからchild.batを呼び出す場合
※parent.bat

call c:\child.bat
child.batでの終了結果に応じて分岐

if %errorlevel% neq 0 goto NG
:OK
@echo OK
exit
*NG
@echo NG
exit
※child.bat

変数をクリア

set errorlevel =


errorlevelに正常(0)をセットして終了

exit /b 0


errorlevelに異常(1)をセットして終了

exit /b 1

SQL*Plusの戻り値

SQL*Plusを実行
更にPL/SQLを記述した外部スクリプトを実行する場合
> SQLPLUS (接続情報) @(スクリプトファイル名)
if %errorlevel% neq 0 goto NG

Oracle SQL*Plus使用方法」参照

制御文

For文
プログラム言語 制御文/For文

Windowsプログラミング

参考

Windowsはなぜ動くのか
Windowsの仕組み(.NET Frameworkとは?)
プログラム言語 外部プログラム連携

API

ApplicationProgrammingInterface
ソフトウェア部品が連携する際の仕様(規約・手順)
ソフトウェア開発側がデータ構造等を公開する事により他者が利用できる形にしている。
・WindowsAPI(Win32API)
・WebAPI(Google, Amazon等)
・ベンダーソフトのAPI

DLL

他プログラム、多言語から利用可能な部品化したプログラム。
DLL単体では動作できずEXEの実行時に、呼び出されてメモリ内に取り込まれる。
Windowsはなぜ動くのか」参照

OCX

OLE Control Extension
・OLEコントロール(ActiveXコントロールに名称変更)。
・ActiveXコントロール
等のUI部品のライブラリ。
DLLとほぼ同じだが前述の様にUI部品はOCXと分類される。

ActiveX

=ActiveXコントロール
OLEコントロールの拡張版。
Webサーバーからクライアントに送信され、Webブラウザ上で即時実行できるコントール部品。
フォームコントロールとは区別される。
外部との通信、マルチメディアファイルの再生等の多用な種類がある。

Win32API

Windowsの機能を他プログラムから呼び出せる形にしたプログラム。
関数として提供される。Cで作られている。

COMコンポーネント

ComponentObjectModel
多言語やネットワーク経由で利用可能にしたクラスライブラリ。
Win32APIの新しいバージョン。
多くはC++で作られている。
・ネットワーク経由で利用できるCOMをDCOM、
・UIを持つCOMはActiveX
に分類される。
また、
・UIを持つライブラリをActiveX
・UIを持たず機能だけを提供するライブラリをCOM
と呼ぶ分類方法もある。

COM+

COMの拡張版

グローバル・アセンブリ・キャッシュ(GAC)

Global Assembly Cashe
とは、名前のとおりマシン全体でグローバルに参照可能なアセンブリの配置場所

Windowsはなぜ動くのか

概要

Windowsはなぜ動くのか
2002年、WindowsXP発売後の書籍。
「10年後も通用する基本を身につけよう」のコンセプトで出版された「なぜ~」シリーズ2作目。
CPUのアーキテクチャ、プログラムに対するメモリ管理、ウィンドウ管理、デバイスマネージャ、プロセス管理等、10年経った今でも有用な知識を学べます。
初心者向けを謳ってますが分かりやすく書いてあるものの十分深いです。
基本情報技術者資格等で出てくる仮想記憶等の技術について、
「これを勉強して何になるんだ?」
という疑問がこの本を読んで今更解消されました。
しっかりWindowsでも使われてました。
OS、デバイス、メモリ管理の話は非同期処理や排他処理、プログラム連携を行う際に有用です。
と言うよりここを理解している前提で技術書が書かれているので必須です。
古い本ですがもっと早くに読んでおけば良かったです。

オペレーティング・システムとは

システムコール(WindowsAPI)

OSが、OS上で動くプログラムの為に呼び出す命令。
・メモリの確保、解放
・プロセス、スレッドの切り替え
・入出力装置の制御
等、個々のプログラムが勝手に行うと問題がある処理についてOSに依頼してやってもらう。

ライブラリ

システムコールが動作する実行ファイル。

マルチタスクのふしぎ

メモリー管理

リロケータブル

単一のプログラムだけが動作する前提のOSでは、プログラム領域・データ領域の開始位置を固定していた。
これに対し、OS上で複数のプログラムを起動させる前提で、プログラム領域・データ領域の開始位置を動的にずらして動作させる仕組み。

セグメント

CPUが一度にアクセス可能なメモリ領域。
CPUの性能により大きさが違う。

(ローカル)ディスクリプタテーブル(LDT)

32bitCPU以降で利用されるメモリ領域。
プログラムがメモリ領域においてどこからどこまで使用するのか?
を記憶しておき、例えプログラムによって命令されたとしても範囲外の領域に書き込む事はできない構造になっている為、
マルチタスク環境における安定性が保障させる。
また、存在フラグによって仮想記憶も実現される。

仮想記憶

メモリ領域の不足に対して、ハードディスクをメモリとして扱う技術。
OS上で動作するプログラムが使用するメモリ領域の一部を仮想記憶へコピーし、必要になった場合にはまた戻す。
スワップ方式/ページング方式がある。

存在フラグ(P:Presentフラグ)

仮想記憶利用の為のフラグ。
本来のメモリ領域にはデータが無い場合、存在フラグはOFF。ある場合はON。
ON/OFFに応じて仮想記憶からのデータの復元が行われる。

セグメント不在割り込み

プログラムを実行する際、読み込み先メモリ領域にプログラムが無い場合(仮想記憶領域にページアウトされている場合)、
OSはセグメント不在割り込みを発生させ、あらゆる処理に優先してメモリ領域にプログラムを復元させる。

スワップ

(スワップイン/スワップアウト)
仮想記憶利用の方法。
プログラム(セグメント)単位でプログラムを仮想記憶領域に退避、復元する。
32bitCPUではセグメントが大きい為ページングが使用される。

ページング

(ページイン/ページアウト)
ページ(4KB)のメモリ領域単位で仮想記憶領域にプログラムを退避、復元する。
この際、プログラムにおけるどの部分をページアウトしているか?はページテーブルで管理する。

DLL

通常のコンパイル・リンク手順(StaticLinkLibrary方式)
・ソースファイル
↓(Byコンパイラ)
・オブジェクトファイル
・ライブラリ
↓(Byリンカ)
・実行ファイル
DLLを利用する手順(DynamicLinkLibrary方式)
・ソースファイル
↓(Byコンパイラ)
・オブジェクトファイル
・ライブラリ
・スタブ
↓(Byリンカ)
・実行ファイル
※DLLは実行ファイルとしては取り込まれない。
スタブを用いて参照経路を確保するだけで、実行時に(動的に)初めて取り込まれる。

スタブ

実行時にDLLを呼べる様に、リンクの際に作成されるプログラム。
オブジェクトファイルからDLLの呼び出しを仲立ちする。

マルチウィンドウ

ウィンドウハンドル

Windows上で各ウィンドウを識別する為の番号
厳密には一つのウィンドウ内でもボタンやメッセージ領域等で別の数字が割り当てられおり、
これにより各オブジェクト、各イベントに応じたイベントハンドラを発生させる事が可能になる。

イベントハンドラ

ボタン押下やマウスクリック等、ユーザーの操作に対してプログラムする特定の処理。
イベントが発生する度に処理を分岐させるのではなく、イベント発生前にイベント毎に処理内容を登録しておく。
=ウィンドウ・プロシージャ

イベントドリブン

イベントハンドラを実行するに当たって、プログラムがユーザーの操作を常に監視する必要はない。
マルチタスク実行中で、他のプロセスが実行中であっても、
自プロセスに対する操作があればイベントを検知するのはOSの仕事。
OSが検知が行う事を前提にしたシステムやプログラミング言語の事をイベントドリブン型、イベント駆動型言語等と呼ぶ。

ハードウェア・サポート

I/Oポートアドレス

Windows上で各ハードウェアを識別する為の数字
プラグ&プレイにより重複しない番号が自動で割り振られる。

デバイスドライバ

OSが行う、ハードウェアに対する操作を仲介するソフトウェア。
本来ハードウェア毎に仕様が異なり、これを操作する為には個別の操作プログラムが必要になるが、
ハードウェアメーカーが、OSの操作命令に対応するプログラムを作成・提供する事によってOS側はプログラムを変更する事なくハードウェアを操作できる。

プラグ&プレイ

ハードウェアをOSに接続した際に自動でOSから操作可能にする機能。

プログラム連携

プロセス間通信

別々のプロセス同士が自プログラムのデータ領域以外のメモリ領域を使ってデータ連携を行う事。
プロセスはプログラム領域に加えデータ領域を持ち変数やスタックに利用する。
しかし他プロセスからデータ領域にアクセスする事はOSにより禁止されている。

ファイルマッピング

プロセス間通信の一手法。
他OSでは共有メモリと呼ばれる。
ファイルをメモリ上に作成(マッピング)し、プロセス同士でこのファイルにアクセスする事でデータを連携する。
例:クリップボード

名前付きパイプ

プロセス間通信の一手法。
他OSではメッセージ・キューと呼ばれる。
ネットワークを介して他コンピュータからも共有されるメモリ領域。
ファイルの様にCreate/Read/Write/Close命令を用いてアクセスでき、Closeすると消滅する。
匿名パイプもあるがOSによって自動的にランダムなパイプ名が付けられるだけで仕組みは同じ。
パイプが勝手に消えたり、他アプリケーションによって上書きされたりする事が無い。
共用メモリー方式より少量のデータを連携する場合、プロセス間で同期を取る必要がある場合に使用。

ミューテックス

プロセス間通信の一手法。
CreateMutex()関数でメモリ空間にミューテックスオブジェクトを作成。
この際、所有者名、オブジェクト名を引数として渡す。
外プロセスから同名のミューテックスオブジェクトが作成されている場合、
OSは既存のミューテックスオブジェクトを探して所有者情報を返すので同名のオブジェクトが複数作られる事は無い。
OpenMutex()
所有者情報を取得
WaitForSingleObject()
所有権が空くまで待機。
ReleaseMutex()
所有権を離す。

セマフォ

プロセス間通信の一手法。
ミューテックスが1プロセスの所有しか認めないのに対し、複数の所有が認められる。
複数のプロセスの同時処理は可能だが、負荷を軽減する為にその数を制限したい場合等に使用。
制限数を1にしてミューテックスと同機能の使い方も可能。
作成、開始、待機、終了はミューテックスとほぼ同じ
CreateSemaphore()
OpenSemaphore()
WaitForSingleObject()
ReleaseSemaphore()

ネットワーク

ポート番号

ネットワーク上でコンピュータを識別するIPアドレスに付加するサブアドレス
IPアドレス+ポート番号をソケットと呼び、コンピュータ上の各アプリケーションを区別する。
Windows上で起動するアプリケーションはデフォルトで使用するポート番号が決まっている。
※メールサービス:110等
起動時に別のアプリによってその番号が使用されている場合は空いている別の番号を使用する。

Windowsのネットワークの種類

ホームネットワーク

家庭内LAN:ホームグループに参加できる
自他端末の参照機能:ネットワーク探索を有効にできる

社内ネットワーク

家庭内LAN:ホームグループに参加できない
自他端末の参照機能:ネットワーク探索を有効にできる

パブリックネットワーク

自他端末の参照機能:ネットワーク探索が無効になる

OSと.NetFramework

bit数によるCPUの分類

・16bitCPU
・32bitCPU
・64bitCPU
がある。
それぞれのbit数分CPUは一度に処理できるので高速。
更にbit数が上がると高度な命令が使える様に設計されているので高性能。

CPUに応じたWindowsのエディション

・16bitCPU:MS-DOS、~Windows3.1
・32bitCPU:Windows95~
・64bitCPU:WindowsXP~
64bitCPUに32bitOSをインストール&動作は可能
32bitCPUに64bitOSをインストール&動作は不可

.NetFramework

複数の4種類のバージョンをインストールできる。
(1).NetFramework1.0
(2).NetFramework1.1
(3).NetFramework2.0/.NetFramework3.0/.NetFramework3.5
※どれか1つ
(4).NetFramework4.0/.NetFramework4.5
※どちらか1つ

WindowsOSにインストール可能な.NetFrameworkのバージョン

WindowsXP:1.0/1.1/2.0/3.0/3.5/4
WindowsVista:1.1/2.0/3.0/3.5/4/4.5
Windows7:2.0/3.0/3.5/4.0/4.5
Windows8:2.0/3.0/3.5/4.5

Windowsの仕組み(.NET Frameworkとは?)

Windowsの仕組み(.NET Frameworkとは?)

概要

Windowsアプリケーションの開発&実行ソフトウェア。
.NET Framework対応のアプリケーションは.NET FrameworkがインストールされているOS上で動作可能。
Windowsはなぜ動くのか
プログラム言語 他言語プログラムの呼び出し

マネージ/アン・マネージコード

net_framework1

マネージコードとは?

.NET Frameworkの管理下にあるアプリケーションのこと。
.NET Frameworkに含まれる「CLR」における、ガーベージコレクション等の機能により、
アプリケーションのセキュリティと安定性がはかれる。
更にアプリで問題があってもOSも守られるという利点もあり。

アン・マネージコードとは?

.NET Frameworkの管理下にないアプリケーションのこと。
.NET Framework以前のWindowsアプリケーション。
ActiveX、Win32API等を用いて作られている。

CLRとは?

実行エンジン
.NET Frameworkの命令をWin32/64命令へ変換、OSへ伝える役割を果たす。
(1)実行前:VB.NET、C#、C++等で書かれたソースを中間言語(MSIL)へコンパイルする。
(2)メタデータを生成する。
(3)実行時:MSILを各種CPUに合わせて機械語にコンパイル&実行する。
CLR管理下のプログラムは、
・メモリ管理(ガベージコレクション)
・型とアセンブリの管理
・スレッド管理
・例外処理
・セキュリティ
等の機能を利用できる。

フレームワーク

アプリケーションの雛形
それぞれのフレームワーク毎に処理の流れが決められている。
開発者は流れの中で必要とされる部分だけを作る。
.Net Frameworkでは、図にある通り、
・Winフォーム
・Webフォーム
・MVC
の内、1つを選択する。
他のフレームワークとの併用できない。

net_framework2

基本クラスライブラリとは?

CLRから利用可能な標準ライブラリ
言語仕様。型等。

クラスライブラリとは?

CLRから利用可能なライブラリ。
関数やオブジェクト。
追加や継承を繰り返し、どんどん拡張される。

コンパイル

・ソース(C#、C++、VB等)
↓ ←(言語コンパイラ)
・MSIL
・メタデータ
↓ ←JITコンパイラ
・機械語

MSIL

MicroSoftIntermediateLanguage
言語コンパイラによって作成される中間言語。

メタデータ

データのデータ
・クラス情報(型、メンバー、引数、戻り値)
・クラスから呼び出されるクラス
MSILを補足し、JITコンパイラが機械語に翻訳する際の再チェックに使用される。
これによりアプリケーションの安全性が高まる。

JITコンパイラ

JustInTimeコンパイラ
MSILを機械語にコンパイルする。
ブラウザ等ではインタプリタ方式のコンパイラでないと動作しない為に、これが用いられる。
デスクトップアプリ等でも同様の方式でコンパイルされる。
JITコンパイラによってコンパイルされた機械語の実行速度は、通常のコンパイラと同等。
ただしコンパイル完了までの時間は余分にかかる。メモリ消費量も大きい。
CLRによって各プラットフォームに応じたJITコンパイラが用意される。