term タグ別の記事一覧

PowerShellはじめの一歩

 ここ最近、自宅でのメインPCとしてWindows PCを使っています。WindowsのCUI環境と言えば長らくMS-DOSから続く「コマンドプロンプト」だったわけですが、昨今導入されたPowerShellは近代のシェルとして十分な機能を備えており、またWindows TerminalもCUIのためのインターフェイスとしてストレスなく常用できるレベルになっています。

 ということで、PowerShellを本格的に使ってみようということでまずは環境構築から始めてみました。なお、本記事はUNIX系OSで一般的なシェル(bash等)やWindowsのコマンドプロンプトについての知識を持っていることを前提として書いています。

PowerShellの最新版をインストールする

 PowerShellはWindows 7以降に標準搭載されており、Windows 11/10にはバージョン5.xが同梱されています。いっぽうで現在のPowerShellの最新バージョンはバージョン7系(本記事執筆時点では7.3.1)となっています。ということで、PowerShellを本格的に利用したい場合は、まず最新版のPowerShellをインストールしましょう。PowerShell最新版はMicrosoft Storeで配布されているので、Microsoft Storeアプリを起動して、「powershell」で検索しインストールします。ちなみにPowerShell 7系はPowerShell 5系とは別のバイナリとしてインストールされるため、共存が可能です。

 なお、バージョン5.1系と7系の違いはこちらの「Windows PowerShell 5.1 と PowerShell 7.x の相違点」ドキュメントにまとめられています。また、Microsoft的にはバージョン5系は「Windows PowerShell」、7系は「PowerShell」(「Windowsが付かない)という呼称になっているようです。

 ちなみに、実行中のPowerShellのバージョンは$PSVersionTableという変数に格納されています。

> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.22000.1335
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.22000.1335
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

 PowerShellでは「$」で始まる文字列が変数となり、変数をシェル上で評価するとその中身が表示されます。つまり、上記は「$PSVersionTable」という変数の中身を表示させていることになります。

スクリプトの実行セキュリティポリシー

 Windows 11/10に同梱されているPowerShell 5.1は、デフォルトではスクリプトの実行が一切できない設定になっています。これはセキュリティ強化のためと思われます。実際、Windows環境においてはマルウェアがPowerShellスクリプトを使って攻撃を行う事例が多数確認されています。そのため、PowerShell 5.1でスクリプトを実行させたい場合、明示的に実行ポリシーを変更する必要があります。いっぽう、Microsoft StoreからインストールしたPowerShell 7系はローカルマシン上にあるスクリプトについてデフォルトで実行可能な設定になっており、特に設定を変更せずに作成したスクリプトを実行できます(参考資料:about Execution Policies)。

Windows Terminalのデフォルトシェルを変更する

 前述のように、Microsoft StoreからPowerShell 7系をインストールしたあともPowerShell 5.1はシステムにそのまま残されています。そのため、Windows Terminalを起動した際にデフォルトのシェルとしてPowerShell 7系を利用するためには、Windows Terminalの設定を明示的に変更する必要があります。PowerShell 7系をインストールすると「PowerShell」というプロファイルがWindows Terminalに追加されるので、これを既定のプロファイルに設定しておきましょう。

「既定のプロファイル」設定

コマンドを確認する

 PowerShellでは、「動詞-ターゲット」というフォーマットでさまざまなコマンドが定義されています。たとえば利用できるコマンド一覧は、「Get-Command」というコマンドで表示できます。

> Get-Command

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           Add-AppPackage                                     2.0.1.0    Appx
Alias           Add-AppPackageVolume                               2.0.1.0    Appx
Alias           Add-AppProvisionedPackage                          3.0        Dism
:
:

 また、UNIX系OSにおけるmanコマンドに相当するのが「help」コマンドです。

> help Get-Command

NAME
    Get-Command

SYNTAX
    Get-Command [[-ArgumentList] <Object[]>] [-Verb <string[]>] [-Noun <string[
    ]>] [-Module <string[]>] [-FullyQualifiedModule <ModuleSpecification[]>] [-
    TotalCount <int>] [-Syntax] [-ShowCommandInfo] [-All] [-ListImported] [-Par
    ameterName <string[]>] [-ParameterType <PSTypeName[]>] [<CommonParameters>]

    Get-Command [[-Name] <string[]>] [[-ArgumentList] <Object[]>] [-Module <str
    ing[]>] [-FullyQualifiedModule <ModuleSpecification[]>] [-CommandType {Alia
    s | Function | Filter | Cmdlet | ExternalScript | Application | Script | Co
    nfiguration | All}] [-TotalCount <int>] [-Syntax] [-ShowCommandInfo] [-All]
     [-ListImported] [-ParameterName <string[]>] [-ParameterType <PSTypeName[]>
    ] [-UseFuzzyMatching] [-UseAbbreviationExpansion] [<CommonParameters>]


PARAMETERS
    -All
:
:
ALIASES
    gcm

REMARKS
    Get-Help cannot find the Help files for this cmdlet on this computer. It is
     displaying only partial help.
        -- To download and install Help files for the module that includes this
     cmdlet, use Update-Help.
        -- To view the Help topic for this cmdlet online, type: "Get-Help Get-C
    ommand -Online" or
           go to https://go.microsoft.com/fwlink/?LinkID=2096579.

 一部のコマンドには短いエイリアスが設定されており、helpコマンドの出力結果の「ALIASES」でエイリアスを確認できます。たとえばGet-Commandの場合、「gcm」でも同じ処理が実行できます。

 helpコマンドに引数として与えた文字列に一致するコマンドが存在しない場合、その文字列を含むコマンド一覧が検索されて表示されます。

> help Get

Name                              Category  Module                    Synopsis
----                              --------  ------                    --------
Get-PSSessionCapability           Cmdlet    Microsoft.PowerShell.Core …
Get-PSSessionConfiguration        Cmdlet    Microsoft.PowerShell.Core …
:
:

PowerShellの起動時に処理を実行する

 UNIX系のシェルでは、起動時にあらかじめ指定しておいた処理を実行することができます。たとえばbashの場合、ホームディレクトリの「.bashrc」や「.profile」といったスクリプトが自動的に実行されます。PowerShellでも同様の仕組みがあり、実行されるスクリプトのパスは「$profile」変数に格納されています。PowerShell 7系のデフォルトではユーザーディレクトリ下の「Documents\PowerShell\Microsoft.PowerShell_profile.ps」に設定されています。

> $profile
C:\Users\hylom\Documents\PowerShell\Microsoft.PowerShell_profile.ps1

 デフォルトではDocuments\PowerShellディレクトリは存在しないので、必要に応じてこのディレクトリも作成する必要があります。具体的には、PowerShell上で次のように実行します。

> ni (Split-Path $profile -Parent) -ItemType Directory

    Directory: C:\Users\hylom\Documents

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2023/01/02     0:23                PowerShell

 「ni」は「New-Item」コマンドのエイリアスで、「-ItemType」オプションで「Directory」を指定することで、指定したディレクトリを作成できます。また、niに続く括弧は、bashにおける「$()」に相当するもので、これを利用して括弧内の実行結果を別のコマンドの引数として与えることができます。括弧内の「Split-Path」はUNIX系OSで言うところのdirnameコマンドやbasenameコマンドに相当するコマンドで、「-Parent」オプションを指定すると指定したパス文字列の親ディレクトリを返します。つまり、このコマンドは$profile変数に格納されているパスの親ディレクトリを作成する、というものになります。

 続いて次のようにniコマンドを実行してスクリプトファイルを作成し、続いて適当なエディタでファイルを編集します。

> ni $profile -ItemType file

    Directory: C:\Users\hylom\Documents\PowerShell

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---          2023/01/02     0:23              0 Microsoft.PowerShell_profile.ps1

PowerShellのショートカットキーを変更する

 bash等のUNIX系シェルでは、デフォルトではEmacs風のショートカットキーが利用できます。たとえばCtrl-hでbackspace、Ctrl-pやCtrl-nで履歴を遡ったり進んだりすることができます。一方、PowerShellのデフォルト設定ではまったく異なるショートカットキーが設定されており、UNIX系シェルに慣れた者としては非常に混乱します。

 PowerShellでは、「PSReadLine」というモジュールでコマンドライン編集を行っています(ドキュメント:about PSReadLine)。このPSReadLineの設定を変更することで、ショートカットキーやコマンドライン編集の挙動をカスタマイズできます。

 現在設定されているショートカットキー一覧は、「Get-PSReadLineKeyHandler」で確認できます。

> Get-PSReadLineKeyHandler

Basic editing functions
=======================

Key              Function            Description
---              --------            -----------
Enter            AcceptLine          Accept the input or move to the next line
                                     if input is missing a closing token.
Shift+Enter      AddLine             Move the cursor to the next line without a
                                     ttempting to execute the input
:
:

 また、ショートカットキーの変更は「Set-PSReadlineKeyHandler」コマンドで行えます。

Set-PSReadlineKeyHandler -Key '<設定するキー>' -Function <割り当てる挙動>

 たとえばC:\Users\<ユーザー名>\Documents\PowerShell\Microsoft.PowerShell_profile.ps1ファイルに次のように記述すれば、カーソル移動や履歴移動、コピー&ペーストなどをEmacs風のキーバインドで実行できるようになります。

Set-PSReadlineKeyHandler -Key 'Ctrl+b' -Function BackwardChar
Set-PSReadlineKeyHandler -Key 'Ctrl+f' -Function ForwardChar
Set-PSReadlineKeyHandler -Key 'Ctrl+d' -Function DeleteChar
Set-PSReadlineKeyHandler -Key 'Ctrl+h' -Function BackwardDeleteChar
Set-PSReadlineKeyHandler -Key 'Ctrl+p' -Function HistorySearchBackward
Set-PSReadlineKeyHandler -Key 'Ctrl+n' -Function HistorySearchForward
Set-PSReadlineKeyHandler -Key 'Ctrl+a' -Function BeginningOfLine
Set-PSReadlineKeyHandler -Key 'Ctrl+e' -Function EndOfLine
Set-PSReadlineKeyHandler -Key 'Ctrl+k' -Function ForwardDeleteLine
Set-PSReadlineKeyHandler -Key 'Ctrl+y' -Function Paste
Set-PSReadlineKeyHandler -Key 'Ctrl+w' -Function Cut

 (以下、2023-01-14 追記)PowerShellはTabキーによる補完に関しても挙動をカスタマイズ可能です。デフォルトではTabキーで最初に見つかった補完候補を自動入力する(タブを連打することでほかの候補に次々とトグルされる)という挙動で、またCtrl+Spaceでメニューを表示して補完候補を選択する、という挙動になっています。

 Tabキーでbashのように補完候補を表示する挙動に変更するには、次のコマンドを上記のファイルに追加します。

Set-PSReadlineKeyHandler -Key Tab -Function Complete

 また、次のように設定することでCtrl+Spaceのメニュー式補完をTabキーで呼び出すことができます。

Set-PSReadlineKeyHandler -Key Tab -Function MenuComplete

Visual StudioのDeveloper PowerShellをバージョン7系にする

 Visual Studioをインストールしていると、Windows Terminalのプロファイルとして「Developer PowerShell for <Visual Studioのバージョン>」というものが自動的に追加されます。これはその名の通り、Visual Studioの各ツールを利用するための設定がされた環境でPowerShellを起動するためのプロファイルですが、PowerShell 7系をインストールしても、デフォルトではこのプロファイルはPowerShell 5系を引き続き利用するようです。

 このプロファイルでPowerShell 7系を利用するには、まずPowerShell 7系のプロファイルから「コマンドライン」(「“C:\Users\<ユーザー名>\AppData\Local\Microsoft\WindowsApps\Microsoft.PowerShell_8<ユニーク文字列>\pwsh.exe”)文字列をコピーし、Develper PowerShell用プロファイルのコマンドライン文字列内の「powershell.exe」をこの文字列で置き換えればOKです。

「Developer PowerShell」のコマンドライン設定

Windows環境でのRubyのSSLエラー対策(Windowsが管理するルート証明書を使う)

 Windows環境でRubyを使う際、以下のようなエラーが出る場合がある。これはSSLアクセスに利用できる適切なルート証明書がないために発生する。

C:/Ruby23-x64/lib/ruby/2.3.0/net/http.rb:933:in `connect_nonblock': SSL_connect
returned=1 errno=0 state=error: certificate verify failed (OpenSSL::SSL::SSLErro
r)

 対策としてはルート証明書を用意すれば良いのだが、ネットから安易にダウンロードしたくないという場合、「certmgr」というツールでWindowsが管理するルート証明書をエクスポートし、opensslコマンドでRubyが扱える形に変換して利用すれば良い。

 まずスタートメニューの「プログラムとファイルの検索」に「certmgr.msc」と入力してEnterキーを押す。certmgrが起動するので、左ペイン内の「信頼されたルート証明機関」-「証明書」を選択する。

 すると証明書一覧が表示されるので、右ペインをクリックし、Ctrl-A等を入力してすべての証明書を選択する。続いて右クリックしてコンテキストメニューの「すべてのタスク」-「エクスポート」メニューを選択する。「証明書のエクスポート ウィザード」が開くので、指示に従って進める。「エクスポートファイルの形式」では「PKCS #12」を選択し、「すべての拡張プロパティをエクスポートする」にチェックを入れておく。エクスポートされたファイルは.pfxという拡張子が付く。

 続いてこのファイルを引数に指定して次のようにopensslコマンドを実行する。Windowsにはデフォルトではopensslコマンドが含まれていないので、別途インストールするか、適当なLinuxマシンにエクスポートした.pfxファイルをコピーして実行しよう。

$ openssl pkcs12 -in <エクスポートしたファイル(.pfx)> -out <適当なファイル名.pem> -nodes

 これでRubyで扱える.pemファイルが出力される(参考:@ITの「*.pfxファイルからPEM形式で証明書や秘密鍵を取り出す」)。

 このファイルを適当な場所に保存し、SSL_CERT_FILE環境変数にそのパスを指定する。たとえばC:\Users\hylom\windows.pemとして保存した場合、以下のようになる。

$ set SSL_CERT_FILE=C:\Users\hylom\windows.pem

国産のWindowsフリーソフトにオープンソースのものは少ない気はするが実はそんなことはない

 日本では無料のソフト全般を「フリーソフト」と呼んでいるが、その中にはオープンソースのものと、非オープンソースのものがある。Windows向けのフリーソフトはやまほどあるが、そのなかでオープンソースのものとなると、その数は決して多くない。

 たとえば、窓の杜の2012年9月第1週・ソフトウェアダウンロードランキングトップ30を見てみると、オープンソースソフトウェアとみられるものは「Apache OpenOffice」「FFFTP」「CrystalDiskInfo」「Tera Term」「CrystalDiskMark」「IP Messenger」「Audacity」「MP3Gain」の8つ。このうち、国産のものが5つ、海外産のものが3つだ。

 また、ランキングに上がっている30本のソフトのうち、国産のソフトは17本で海外産ソフトは13本。ということで、国産ソフトも海外産ソフトも、ランキングに入るような人気のものについてはオープンソースである割合はさほど変わらないという結果だ。

 ただし、これはランキングに入るような人気ソフトウェアに限った調査なので、ランキングには入らないけどそこそこ人気のある中堅フリーソフトなどを加えると状況は変わってくるかもしれない。

Windows Azureメモその1

最近Windows Azureを触っているので備忘録的にはまったポイントをメモ(その1)。

SDKのバージョン

Windows AzureはSDKのバージョンアップとともに機能が増えたり仕様が変わっているため、古いバージョンのドキュメントを参照していると現状では仕様が変わっていたりしてハマる。特に1.3ではIIS周りの仕様変更など大きな変更点があったので、1.3未満のドキュメントを参照している場合注意が必要。特にFull IISあたり。

参考:Windows Azure 1.3の新機能の概要 - @IT

ディレクトリ構成

Windows Azureにデプロイした際、アップロードしたファイルがどのドライブに保存されるかは不定のようだ。E:の場合もあればF:の場合もある。WebRoleの場合、これらのドライブの、「¥approot¥」以下と「¥siteroot¥0¥」以下にファイルが展開される。¥approot¥と¥siteroot¥0¥以下には同じものが展開されるが、HTTPサーバーのルートとなるのは¥siteroot¥0¥のほう。

Web配置

Web配置では¥siteroot¥0¥以下が更新され、¥approot¥側は更新されない。

スタートアップタスクとその実行フォルダ

IISの設定を変更したい場合、スタートアップタスクとしてバッチファイルを実行するよう指定して処理するのが定石。スタートアップタスク実行時のカレントディレクトリは明言されていないが、Windows Azure環境では¥approot¥bin¥以下になる模様(エミュレータ上ではまた別のディレクトリになるので注意)。スタートアップタスクとして実行したいファイルのプロパティで「出力ディレクトリにコピー」を「常にコピーする」などに設定すると、そのファイルがこのディレクトリに配置される。サブディレクトリ以下にあるファイルはbin以下にそのサブディレクトリが作成されて配置される。

「ビルドアクション」の設定

ビルドアクションが「なし」のファイルはapprootおよびsiteroot以下に配置されず無視される。必要なファイルは「コンテンツ」に設定しておけばよい。

バッチファイル

Visual Studioでテキストファイルを作成するとBOM付きUTF-8エンコードのファイルができるのだが、これをバッチファイルとして実行しようとするとBOMが認識されずにエラーとなる。

エミュレータと実環境の違い

ディレクトリ配置が異なる。本番環境で¥approot¥bin¥に配置されるディレクトリは別の場所に配置される。

リモートデスクトップ

Azure SDK 1.6以降では発行時のウィザードでロールへのリモートデスクトップ接続の設定を行えるが、ここで「自動」を選択しないと、なぜかリモートデスクトップ接続もWeb配置もできなくなることがある(体験談)。前者はロールの再起動でなぜかできるようになったが、後者はリモートデスクトップが可能になった状態でもなぜかできなかった……。

あと、リモートデスクトップについてはWindows以外のクライアントもあるが、接続にウィザードで作成した証明書が必要なので、発行に用いたWindows環境以外から接続したい場合は証明書関係の設定が必要。ということでMacやLinuxから接続できるかは不明。

Emacs 23.2導入

 今までWindows環境での物書きにはNTEmacs JPプロジェクトがリリースしている<a href=https://sourceforge.jp/projects/ntemacsjp/releases/“>Emacs 22ベースのWindows向けバイナリを使っていたわけですが、最新安定版であるEmacs 23系ではマルチバイト文字の扱いを含めた色々な改善が加わっているとのことで、移行してみることに。

 NTEmacs JPプロジェクトではEmacs 23ベースのWindows向けバイナリをリリースしていないのですが、Gnupackというプロジェクトで日本語関連(というかIME)のパッチが適用されたEmacs 23.2のバイナリが公開されているので、そちらを利用。プロジェクトページはこちらNTEmacs 23.2はこちらからダウンロード可能。

 フォントなどの基本的な設定方法はEmacs 22系と同じ模様で、たとえばMSゴシックを使うには下記のような設定を.emacsに記述すればOK。

; 「msgochic」という名前で新たなフォントセットを定義
; 英字フォントとしてMS ゴシック、14ポイントを使用
(create-fontset-from-ascii-font
 "-outline-MS ゴシック-normal-r-normal-normal-14-*-*-*-*-*-iso8859-1"
 nil "msgochic")

; myfont-msgochicの日本語フォントとしてメイリオを使用
(set-fontset-font "fontset-msgochic"
                  'japanese-jisx0208
				  '("MS ゴシック" . "jisx0208-sjis"))

; myfont-msgochicのカタカナフォントとしてメイリオを使用
(set-fontset-font "fontset-msgochic"
                  'katakana-jisx0201
                  '("MS ゴシック" . "jisx0201-katakana"))

; 定義したフォントセットを登録
(add-to-list 'default-frame-alist
			 '(font . "fontset-msgochic"))

 あと、とりえあず様子見とのことでmule-ucs関係はすべて外してみましたが、今のところ問題は見られません。コピペで全角チルダ(~)が波ダッシュ(〜)になってしまう問題も解決されている模様。NTEmacs 22とは別のフォルダにインストールすることで共存も可能なので、ひとまずこれで様子見。

システムファイルの所有権問題でハマる on Windows Vista

 テスト用にVistaのhostsファイル(C:\Windows\System32\drivers\etc\hosts)を書き換えようとしたんだけど、このファイルはシステムファイルなので、当然一般ユーザー権限では書き換えられない。そこで、管理者権限でコマンドプロンプトを実行し、vimで編集したわけなんだが、このときvimは「編集後のファイルを別のファイルに保存→オリジナルのファイルに置き換え」というステップを踏んでくれていたためにファイルのパーミッションが変わってしまうという問題発生。

 編集後のファイルは、自分のみ「フルコントロール」、「Everyone」と「None」にファイル属性の読み取りのみ許可、というパーミッションになっていて、そのためシステムがhostsファイルにアクセスできなくなり、hostsに何を書いてもそれが適用されない状況に。結局、問題がパーミッションにあることに気付いたのは10数分後……。

 公式には「hostsファイルの編集には管理者権限で起動したメモ帳を使え」と言われているのですが、他のエディタを使うとこういうトラブルになるよ、ということで。しかし、「SYSTEM」のパーミッションがないと本当にシステムもアクセスできないのね>NTFSのパーミッション仕様。

MSys&MinGWをインストール

  MinGW でのビルドを前提とされたツールをCygwin上でビルドするのが面倒だったので全力で MSys とMinGWをインストールした。MSysGitも入っているので環境汚れまくり。

  SourceForge.JP のミラーからMinGW 5.1.4.exeとMSYS-1.0.11-rc-1.exeをダウンロードしてそれぞれインストール。MSYSは結構下の方(MSYS Base Systemの中)にあるので探す。

 それぞれインストール後、「C:\msys\1.0\etc\fstab.sample」を同じディレクトリに「fstab」という名前にコピー、下記のようにMinGWとActivePerlをインストールしているディレクトリに対応付ける。

c:/MinGW		/mingw
c:/Perl	/perl

 あとはスタートメニューの「MinGW」?「MSYS」?「MSYS」などからシェルを起動。gccがエラーを日本語で吐いてくれるのだがWindowsのコマンドプロンプトだと化けるのでexport LANG=Cを適宜設定。

GCC 4.4系を使う

 GCC 4.4系を使うには別途インストールが必要。「gcc-4.4.0-mingw32-notes.txt」に解説があるが、下記をMinGWのインストールディレクトリで展開すればよい。

GMP Runtime [REQUIRED]
gmp-4.2.4-mingw32-dll.tar.gz
MPFR Runtime [REQUIRED]
mpfr-2.4.1-mingw32-dll.tar.gz
POSIX Threads for Win32 Runtime [REQUIRED]
pthreads-w32-2.8.0-mingw32-dll.tar.gz
Core (C) [REQUIRED]
gcc-core-4.4.0-mingw32-bin.tar.gz、gcc-core-4.4.0-mingw32-dll.tar.gz
C++ [OPTIONAL]
gcc-c++-4.4.0-mingw32-bin.tar.gz、gcc-c++-4.4.0-mingw32-dll.tar.gz

 なお、ドキュメントにはgcc-full-4.4.0-mingw32-bin.tar.lzmaに全部入っていると書いてあるが、GMPとMPFRとPOSIX Threadは入っていなかった……(汗)。

cl.exeの主要コマンドラインオプションメモ

 最近、Visual C++をいじっているのでメモ。昔はVisual StudioでGUIでビルド設定してましたが、最近はもうmakeを使う方になれちゃったんだよね……。

  <th>
    意味
  </th>
</tr>

<tr>
  <th colspan="2">
    最適化
  </th>
</tr>

<tr>
  <td>
    /O1
  </td>
  
  <td>
    コードを最小化
  </td>
</tr>

<tr>
  <td>
    /O2
  </td>
  
  <td>
    コードを最速化
  </td>
</tr>

<tr>
  <td>
    /Ob{0|1|2}
  </td>
  
  <td>
    インライン展開方法を指定
  </td>
</tr>

<tr>
  <td>
    /Od
  </td>
  
  <td>
    最適化を禁止
  </td>
</tr>

<tr>
  <td>
    /Oi
  </td>
  
  <td>
    組み込み関数を使用
  </td>
</tr>

<tr>
  <td>
    /Ox
  </td>
  
  <td>
    最大限の最適化
  </td>
</tr>

<tr>
  <td>
    /GL
  </td>
  
  <td>
    プログラム全体の最適化を使用
  </td>
</tr>

<tr>
  <td>
    /arch:{SSE|SSE2}
  </td>
  
  <td>
    SSE/SSE2を使用
  </td>
</tr>

<tr>
  <th colspan="2">
    作成するコード
  </th>
</tr>

<tr>
  <td>
    /MD
  </td>
  
  <td>
    DLL版ランタイムライブラリを使用。/MDdとするとデバッグバージョンを作成
  </td>
</tr>

<tr>
  <td>
    /MT
  </td>
  
  <td>
    スタティック版ランタイムライブラリを使用。/MTdとするとデバッグバージョンを作成
  </td>
</tr>

<tr>
  <td>
    /LD
  </td>
  
  <td>
    DLLを作成。/LDdとするとデバッグバージョンを作成
  </td>
</tr>

<tr>
  <td>
    /Fe<ファイル名>
  </td>
  
  <td>
    出力するEXEファイル名を指定
  </td>
</tr>

<tr>
  <td>
    /Fo<ファイル名>
  </td>
  
  <td>
    objファイルを出力する
  </td>
</tr>

<tr>
  <td>
    /Zi
  </td>
  
  <td>
    デバッグ情報を生成
  </td>
</tr>

<tr>
  <th colspan="2">
    そのほか
  </th>
</tr>

<tr>
  <td>
    /D<シンボル>
  </td>
  
  <td>
    シンボルを定義(#defineと同等)。値を指定する場合は/D<シンボル>=<値>とする
  </td>
</tr>

<tr>
  <td>
    /I<パス>
  </td>
  
  <td>
    追加インクルードディレクトリを指定
  </td>
</tr>

<tr>
  <td>
    /X
  </td>
  
  <td>
    標準インクルードパスを無視
  </td>
</tr>

<tr>
  <td>
    /w
  </td>
  
  <td>
    ワーニング出力を無効にする
  </td>
</tr>

<tr>
  <td>
    /Wall
  </td>
  
  <td>
    すべてのワーニング出力を有効にする
  </td>
</tr>

<tr>
  <td>
    /link
  </td>
  
  <td>
    リンカにオプションを渡す
  </td>
</tr>
cl.exeのコマンドラインスイッチ
スイッチ
  <th>
    意味
  </th>
</tr>

<tr>
  <td>
    /DEBUG
  </td>
  
  <td>
    デバッグ情報(PDBファイル)を作成
  </td>
</tr>

<tr>
  <td>
    /DEF:<ファイル名>
  </td>
  
  <td>
    モジュール定義ファイルを指定
  </td>
</tr>

<tr>
  <td>
    /DLL
  </td>
  
  <td>
    DLLを作成
  </td>
</tr>

<tr>
  <td>
    /EXPORT:entryname[&#44;@ordinal[&#44;NONAME]][&#44;DATA]
  </td>
  
  <td>
    エクスポートする関数を指定
  </td>
</tr>

<tr>
  <td>
    /LIBPATH:<パス>
  </td>
  
  <td>
    追加のライブラリパスを指定
  </td>
</tr>

<tr>
  <td>
    /LTCG
  </td>
  
  <td>
    リンク時のコード生成を有効化。/GLを指定してコンパイルしたオブジェクトファイルのリンクに必要
  </td>
</tr>
link.exeのコマンドラインスイッチ
スイッチ

IE8のテキストエリア内テキストを外部エディタで編集

 Internet Explorer 8がかなり軽快なので、最近はFirefoxと併用している。Firefoxの場合、Google Readerを使って大量のタブを開くと結構な確率でブラウザが落ちるのだが、IE8はそれがないので、最近はGoogle ReaderはIE8で見るようにしているのが大きい。

 ただ、問題なのがテキスト編集。テキストエリアでそこそこの長さのテキストを入力/編集するのはしんどいので、Firefoxでは「 It’s all text 」という拡張を使っている。これをインストールするとテキストエリアの周辺に「編集」ボタンが表示され、これをクリックするとテキストエディタが起動してそこでテキスト編集ができて非常に便利である。

 これに相当するものがIEにもないかと探したところ、 AreaEditor というものがそれに当たるようだ。ということで早速インストールしたところ、IE8でも利用できた。ただ、AreaEditorではテキストをエディタで開いたあと、1回目に保存したものしか反映されず、2回、3回と変更→上書き保存を繰り返した場合は変更内容がブラウザ側に反映されないようだ。自分は1パラグラフを入力したら手癖により勝手にファイルを上書き保存するため、この仕様だととても使いづらい。結局、最後にコピー&ペーストでテキストを流し込んだりしている(汗)。そのほかにもAreaEditorはIt’s all textと比べると劣っているところが多々見られるのが残念。自分で作れということか?

図:AreaEditorの設定画面。Webブラウザからは起動できず、スタートメニューから起動しなければいけないのも面倒くさい