SyntaxHighlighter

2016年8月30日火曜日

Windows Server の NTP クライアントをちゃんと設定する

Windows Server の NTP クライアントの設定方法について、ここにまとめておきます。

一部の設定は w32tm コマンドでも設定可能ですが、レジストリを直接いじらないと変えられない設定値もあるので、 全部レジストリをいじる前提で記載します。 なお、変更を反映するには Windows Time サービスの再起動が必要です。

対象 OS のバージョンは 2012 R2 です。それ以外のバージョンでは挙動やデフォルト値が異なる可能性がありますので注意してください。

前提

  • 組織内またはキャリアやプロバイダの NTP サーバを上位 NTP サーバとして参照する設計とします。 自分自身が最上位の NTP サーバとなったり、Windows 以外の OS から NTP サーバとして参照される想定ではありません。
  • 外部(上位) NTP サーバの FQDN を ntp1.example.net, ntp2.example.net として記載します。
  • シングルフォレスト、シングルドメイン想定です。
  • ドメインコントローラに余計なミドルウェアやアプリケーションは乗せていない前提です。
  • PDC エミュレータの FSMO を持つドメインコントローラは固定されている前提です。 頻繁に FSMO の移動を行うことが想定されている場合や、PDC の障害時に FSMO を移動して、復旧後も元に戻さない運用を想定している場合は、 ドメインコントローラ全てを「PDC 以外のドメインコントローラ」と考えて本文を読んでください。
  • 本文中の「必須」は文字通り必須の設定で、設定しないとまともに動作しません。
    「推奨」は私個人の推奨であり、私の所属する組織や、Microsoft や、その他の組織の推奨という意味ではありません。 また、設定しなくても最低限の時刻同期は行えます。 責任は持ちませんのでご了承ください。
  • 本文中に記載している数値のうち、0x 付きの数値は16進数、付いていないものは10進数です。
  • ある程度のスキルレベルを持った技術者向けに記載しています。 AD や NTP に関する基礎的な知識がない方や、 レジストリの編集方法やそのリスクをわかっていないとか16進数がわからないレベルの方は誤読により誤った設定になってしまう可能性があるので他サイトをあたってください。

まず、クライアントの種類を以下の通り分類します。それぞれで設定が異なります。

  1. ドメインコントローラ(PDCエミュレータ(以下単にPDCと記載))
    PDC エミュレータの FSMO を持つドメインコントローラです。管理ドメイン下の全ての Windows マシンのマスターソースになります。
  2. ドメインコントローラ(PDC以外)
    PDC 以外のドメインコントローラは、PDC から時刻を取得します。そして、メンバーサーバへ時刻を提供します。 デフォルト設定では PDC がダウンしたら終わりなので、この記事では PDC がダウンしている場合には外部 NTP サーバから時刻同期するよう設定します。
  3. ドメインのメンバーサーバ
    メンバーサーバはログイン時に使用したドメインコントローラ(PDCとは限らない)から時刻を取得します。
  4. ワークグループのサーバ
    ワークグループのサーバのデフォルト設定ははっきり言って使い物にならないのでメンバーサーバと同等の設定にします。

次に、設定項目について説明します。 説明はいいから結論を!という方はまとめへどうぞ。

参照先 NTP サーバの設定

参照先サーバを決定するレジストリ項目は2つ。両方ともキーの場所は HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters です。

まず、Type エントリ。このエントリの設定次第では、次の NtpServer エントリの設定は何の意味も持ちません。 クライアント種別ごとのデフォルト値と推奨値は以下の通り。

Type
クライアント種別デフォルト値推奨値
1. PDCNT5DSNTP(必須)
2. DCNT5DSAllSync(推奨)
3. メンバーサーバNT5DSNT5DS(推奨)
4. ワークグループNTPNTP(必須)

NT5DS はドメインの階層構造に従ってドメインコントローラから時刻を取得する設定です。この設定値になっている場合、次で説明する NtpServer の値は無視されます。 メンバーサーバは、例えドメインコントローラの時刻がずれていたとしてもドメインコントローラ以外と時刻同期するべきではありません。 ドメインコントローラとの時刻差が 5 分以上になると認証に問題が発生する可能性があるためです。 よって NT5DS のままにしておくことを強く推奨します。

NTP は次で説明する NtpServer に設定されているサーバから時刻を取得します。上位にドメインコントローラがいない、PDC とワークグループのサーバではこの値にすることが必須です。

AllSync は、ドメインコントローラと NtpServer に設定されたサーバの両方と時刻同期をする設定です。 PDC 以外のドメインコントローラは、平常時は PDC のドメインコントローラと時刻同期を行い、PDC と同期できない場合に外部 NTP サーバを参照するようこの値に設定します。

Type が NTP または AllSync の場合に参照されるのが NtpServer エントリです。

NtpServer
クライアント種別デフォルト値推奨値
1. PDCtime.windows.com,0x9ntp1.example.net,0x8 ntp2.example.net,0x8
2. DCntp1.example.net,0xa ntp2.example.net,0xa
3. メンバーサーバ設定不要
4. ワークグループPDCのFQDN,0x8 ntp1.example.net,0xa
ntp2.example.net,0xa
※スペースの都合で改行していますが実際には1行です

NTP サーバを、複数の場合はスペースで区切って記載します。サーバの FQDN の末尾に , に続いて記載されている 16 進数の数値は動作モードを決定するフラグです。 優先的に使用するサーバには 0x8 を付与し、0x8 のサーバに接続できない場合にだけ使用するサーバに 0xa を付けます。

PDC の場合、上位 NTP サーバは今回の例だとどちらでも良いので両方に 0x8 を付けています。

PDC 以外の DC の場合は、PDC がダウンしている場合のみ外部 NTP サーバを利用するので両方に 0xa を付けています。 Type を AllSync にしていれば PDC には勝手に同期するのでこのエントリに PDC の FQDN を記載する必要はありません。

メンバーサーバは、前述した通り Type が NT5DS であればこのレジストリに何が設定されていても参照されないので、設定不要です。

ワークグループのサーバは、PDC を優先的に参照 (0x8) し、PDC がダウンしている場合には外部 NTP サーバを参照 (0xa) する設定です。 こちらは明示的に PDC の FQDN を記載してあげる必要があります。 ただ、PDC を参照することは必須ではないので、PDC と同期したくない(またはできない)場合は PDC 部分は消して、他サーバのフラグを 0x8 にしても全く問題ありません。

なお、フラグ部分を奇数にすると、等間隔での時刻同期を行うモードになります。 デフォルトに使われているのも 0x9 ですし、ワークグループ環境で GUI で参照先 NTP サーバを設定した場合にも自動的に 0x9 が付くし、 いろんなサイトでも 0x9 を付けるよう書いてあったりするしで、つい 0x9 にしてしまいたくなる人もいると思いますが、そこはぐっとこらえて 0x8 にしてください。 理由は次項で説明します。 0x8 でも等間隔で同期したければできますのでご安心を。

同期間隔の設定

前項の NtpServer の設定でフラグを 0x1 または 0x9 にしなかった場合(Type が NT5DS の場合も含む)、 同期間隔は MinPollInterval エントリ~ MaxPollInterval エントリの間になります。 キーのパスは HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config です。 初回は MinPollInterval エントリの間隔で同期を行い、安定していくにつれて MaxPollInterval エントリの間隔に収束していきます。 一定間隔で同期をしたければ、MinPollInterval エントリと MaxPollInterval エントリを同じ数値にすれば良いです。 数値は 2 のべき乗の数値(指数)で指定します。例えば 5 だったら 2 の 5 乗で 32 秒ということになります。 クライアント種別ごとのデフォルト値と推奨値は以下の通り。括弧内の数値はべき乗計算結果です。

MinPollInterval
クライアント種別デフォルト値推奨値
1. PDC0x6 (64s)0x4 (16s)
2. DC0x6 (64s)0x4 (16s)
3. メンバーサーバ0xa (1024s=約17分)0x6 (64s)
4. ワークグループ0xa (1024s=約17分)0x6 (64s)

MaxPollInterval
クライアント種別デフォルト値推奨値
1. PDC0xa (1024s=約17分)0x8 (256s=約4.2分)
2. DC0xa (1024s=約17分)0x8 (256s=約4.2分)
3. メンバーサーバ0xf (32768s=約9.1時間)0xa (1024s=約17分)
4. ワークグループ0xf (32768s=約9.1時間)0xa (1024s=約17分)

推奨値は、ドメインコントローラの2種に関しては、Min は設定可能な下限が 4 なので 4 にしました。 Max は、nict の FAQ に、1 時間に 20 回を超えるポーリングをしたいなら事前連絡が必須と書かれていたので、 事前連絡不要な範囲での最小値である 8 にしました(7 だと 2 分強間隔なので 20 回を超える)。 メンバーサーバとワークグループのサーバの推奨値は、Linux の ntpd のデフォルトの Min, Max に合わせました。 推奨といっても以上のような根拠なので、お好みで変えてください。 経験上、物理サーバーやオーバーコミットしていない仮想環境(負荷も低い)では、推奨値どころかデフォルト値のままでも問題になったことはありません(保証はしませんよ)。 逆にオーバーコミットしまくりの仮想環境では、推奨値ぐらいの設定にすることは必須かと思います。 場合によってはもっと間隔を狭めてもいいかもしれません。

個人的に非推奨ですが、NtpServer で奇数のフラグを使った場合は、上記の MinPollInterval ~ MaxPollInterval の間隔ではなく、 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient キーの SpecialPollInterval エントリに設定された間隔で同期されます。 この設定値は 2 のべき乗ではなく普通に秒数です。 デフォルト値は、ドメイン環境では DC かどうかに関わらず 3600(1時間)、ワークグループ環境では 604800(7日)です。
なぜ非推奨かというと、SPIKE 状態から復旧できないという不具合があるからです。 不具合の詳細については以下の公式情報を参照してください。
KB2638243
この記事の推奨通り、フラグに奇数を使わなければ SpecialPollInterval は使わないので不具合には該当しません。
また、時刻同期が行えているのかの確認で w32tm /query /status コマンドを実行すると思いますが、このとき表示される「ポーリング間隔」に、 SpecialPollInterval は反映されません。 NtpServer でフラグに 0x9 を指定して、SpecialPollInterval を 60 に設定した場合、1分ごとに w32tm /query /status コマンドを打てば、 ちゃんと1分間隔で時刻同期されていることが「最終正常同期時刻」を見ればわかりますが、「ポーリング間隔」は 60s ではなく MinPollInterval ~ MaxPollInterval の設定値が表示されます。 もちろんこれは試験時や運用時に混乱の元になります。これも奇数フラグと SpecialPollInterval が非推奨である理由の1つです。

step/slew の設定

以下の2つの条件式を両方とも満たす場合、slew で時刻同期され、どちらか片方だけでも満たさないと step で時刻同期されます。 英語の部分がレジストリで設定する値です。

  1. 時刻差 < MaxAllowedPhaseOffset
  2. 時刻差 < システムクロックレート ÷ 2 × PhaseCorrectRate × UpdateInterval

まず最初の条件式に出てくる MaxAllowedPhaseOffset について説明します。 キーのパスは HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config です。 値に設定する数値は秒数です。

MaxAllowedPhaseOffset
クライアント種別デフォルト値推奨値
1. PDC3002
2. DC3002
3. メンバーサーバ300変更不要
4. ワークグループ1300

DC は、自身が NTP サーバとなる存在なので、slew で同期することよりも信頼性の高い時刻を提供することが第一です。 デフォルト値の 300 秒のままでも、条件式2によって、マルチプロセッサで約 5.25 秒、シングルプロセッサで約 3.5 秒で step に切り替わりますが、 より短く 2 秒に設定することを推奨します。 2 秒の根拠は、うるう秒挿入で必ず発生する 1.α秒のずれ(0.α秒は通常発生する分のずれ)は slew で同期するほうがいろんなものへの影響が少ないと思うからです。

メンバーサーバとワークグループのサーバは、精度の高い時刻を維持することより、上に乗っているアプリに影響を出さないほうが重要なので、 できるだけ slew で時刻を合わせるほうが良いでしょう。 ただ、メンバーサーバは DC との時刻差が 5 分を超えると認証に問題が発生するので、300 秒を上限とします。 ワークグループもそれに合わせます。 300 秒を超えようとなんだろうと、絶対に step は NG!というアプリ要件があれば、slew で同期可能な時刻を増やすのではなく(無限にはできませんから)、閾値を超えたら時刻同期を行わない設定をします(後述)。

次に、条件式2についての説明です。

まずシステムクロックレートですが、これは正確には w32tm /query /status /verbose コマンドをうち、 表示される「クロック レート」を確認する必要があります。 マルチプロセッサでは約 15ms、シングルプロセッサでは約 10ms です。

PhaseCorrectRate エントリと UpdateInterval エントリのキーのパスはともに HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config です。

PhaseCorrectRate
クライアント種別デフォルト値推奨値
1. PDC7変更不要
2. DC7変更不要
3. メンバーサーバ12
4. ワークグループ12

UpdateInterval
クライアント種別デフォルト値推奨値
1. PDC100変更不要
2. DC100変更不要
3. メンバーサーバ3000020000(マルチプロセッサ)
30000(シングルプロセッサ)
4. ワークグループ36000020000(マルチプロセッサ)
30000(シングルプロセッサ)

DC の場合、条件式1のほうでより短い閾値にしているのでこちらは変更不要です。

メンバーサーバは、デフォルト値だとマルチプロセッサの場合で約225秒、シングルプロセッサの場合で約150秒が閾値になります。 上記の推奨値のように変更すると約300秒になります。 実際のシステムクロックレートは 15ms や 10ms ジャストではないので誤差は出ます(300 より大きくなる)が、 MaxAllowedPhaseOffset で 300 に抑えているので 300 秒が step への切り替わり閾値になります。

ワークグループの場合は、デフォルト値だとマルチプロセッサの場合で約45分、シングルプロセッサの場合で約30分が閾値になります。 300秒を超えているので変更しなくても良いのですが、UpdateInterval が長すぎて時刻同期に時間がかかりそうなのでメンバーサーバと合わせています。

時刻同期をしない閾値の設定

時刻差がどれだけあろうとも絶対に step では同期させたくないという要件がある場合、前項で説明した slew で同期される範囲内の時間に、 「これ以上時刻差がある場合、同期自体を行わない」という閾値を設ける必要があります。 キーのパスは HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config です。

MaxPosPhaseCorrection
クライアント種別デフォルト値推奨値
1. PDC0x0002a300(48時間)変更不要
2. DC0x0002a300(48時間)変更不要
3. メンバーサーバ0xffffffff(無期限)変更不要
4. ワークグループ0xd2f0(15時間)変更不要

MaxNegPhaseCorrection
クライアント種別デフォルト値推奨値
1. PDC0x0002a300(48時間)変更不要
2. DC0x0002a300(48時間)変更不要
3. メンバーサーバ0xffffffff(無期限)要件により 0x12c(300) 以下に設定
4. ワークグループ0xd2f0(15時間)要件により 0x12c(300) 以下に設定

MaxPosPhaseCorrection は、進めることのできる時間の閾値です。 通常、時刻が進む分には step でも問題は発生しないので変更不要と考えます。

MaxNegPhaseCorrection は、遅らせることができる時間の閾値です。 slew 設定の範囲内でないと、step で同期される、つまり時間の遡りが発生する可能性があるので注意してください。

なお、この項目は特殊な要件がある場合にのみ使用するのでまとめのほうには記載していません。

Windows Time サービスの自動起動の設定

Windows Time サービスにはデフォルトでトリガーが設定されていて、 ワークグループ環境では常時起動されません。 トリガーを削除し、スタートアップの種類を「自動」に設定する必要があります。 コマンドで実行する方法もありますが、ここでは他と合わせてレジストリで説明します。

まずトリガーを削除するには、以下のサブキーをキーごと削除します。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TriggerInfo

スタートアップの種類を「自動」にするには、以下のキーの「Start」の値を「0x3」から「0x2」に変更します。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time

なお、ドメイン環境ではトリガーで自動起動するので特に設定する必要はありません。

まとめ

推奨設定をまとめておきます。なお、どんな環境でも必須なものに◎、強く推奨するものに○を付けていますので参考にどうぞ。

1. ドメインコントローラ(PDC)

  • 上位 NTP サーバとして ntp1.example.net と ntp2.example.net を同じ優先度で参照
  • 時刻同期間隔は 16s ~ 256s
  • NTP サーバとの時刻差が 2s 以上ある場合 step モードで同期
キー:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters

-データ
TypeNTP
NtpServerntp1.example.net,0x8 ntp2.example.net,0x8

キー:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config

-データ
 MinPollInterval0x4
 MaxPollInterval0x8
 MaxAllowedPhaseOffset0x2
 PhaseCorrectRate0x7 ※デフォルト
 UpdateInterval0x64 (100) ※デフォルト

2. ドメインコントローラ(PDC以外)

  • PDC との同期ができない場合に限り ntp1.example.net と ntp2.example.net を同じ優先度で参照
  • 時刻同期間隔は 16s ~ 256s
  • NTP サーバとの時刻差が 2s 以上ある場合 step モードで同期
キー:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters

-データ
TypeAllSync
NtpServerntp1.example.net,0xa ntp2.example.net,0xa

キー:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config

-データ
 MinPollInterval0x4
 MaxPollInterval0x8
 MaxAllowedPhaseOffset0x2
 PhaseCorrectRate0x7 ※デフォルト
 UpdateInterval0x64 (100) ※デフォルト

3. ドメインのメンバーサーバ

  • 参照 NTP サーバはデフォルト設定
  • 時刻同期間隔は 64s ~ 1024s
  • NTP サーバとの時刻差が 300s 以上ある場合 step モードで同期
キー:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters

-データ
TypeNT5DS ※デフォルト
 NtpServertime.windows.com,0x9 ※デフォルト

キー:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config

-データ
 MinPollInterval0x6
 MaxPollInterval0xa
 MaxAllowedPhaseOffset0x12c(300) ※デフォルト
 PhaseCorrectRate0x2
 UpdateInterval20000(マルチプロセッサ)
30000(シングルプロセッサ) ※デフォルト

4. ワークグループのサーバ

  • Windows Time サービスを自動起動するように設定
  • 上位 NTP サーバとして PDC を優先的に参照、次点で ntp1.example.net と ntp2.example.net を同じ優先度で参照
  • 時刻同期間隔は 64s ~ 1024s
  • NTP サーバとの時刻差が 300s 以上ある場合 step モードで同期
キー:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time

-データ
Start0x2

・HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TriggerInfo キーを削除

キー:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters

-データ
TypeNTP
NtpServerPDCのFQDN,0x8 ntp1.example.net,0xa ntp2.example.net,0xa

キー:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config

-データ
 MinPollInterval0x6
 MaxPollInterval0xa
MaxAllowedPhaseOffset0x12c(300)
 PhaseCorrectRate0x2
 UpdateInterval20000(マルチプロセッサ)
30000(シングルプロセッサ)

その他の注意事項

  • NTP の設定がどうであろうと、OS 起動時は BIOS から時刻が取得されますので、 BIOS の時刻を正しい状態に維持しておくことは非常に重要です(電池切れ注意)。
    仮想環境の場合は、ESXi ホストから時刻を取得するので、ESXi ホストの時刻もきちんと NTP 設定して正確に維持しておくこと。
  • 仮想環境の場合。VMware Tools による定期的な時刻同期はデフォルトで無効になっており、あえて有効にしない限りは時刻同期されませんが、 実はその設定を有効にしていなくても、vMotion 実行時やスナップショット作成・削除時などのイベント時に勝手に時刻同期されてしまいます。 ESXi ホストの NTP も OS の NTP もきちんと設定されていて正確な時刻を維持できているなら特に問題は発生しないはずですが、 そういったイベント時でも同期されないよう設定しておいたほうが無難かもしれません。設定方法は以下の VMware の KB を参照してください。
    時刻同期の無効化 (2076744) | VMware KB

他のサイトの説明との食い違いについての覚書

非難する目的ではなく、自分用に、惑わされないように記録を残しておきたいという意図で記載しています。

  • ドメイン環境での時刻同期間隔がデフォルトで1時間であるという情報が多々ありますが、 SpecialPollInterval のデフォルト値が1時間であることから誤解が広まっているものと思われます。 実際にはデフォルトでは MinPollInterval ~ MaxPollInterval で、詳細は本文参照ですが少なくとも1時間ではありません。
  • ドメイン環境での step 閾値がデフォルトで5分であると書いてあるサイトがありますが、 条件式1のことしか認識していないものと思われます。
  • ドメイン環境の MinPollInterval と MaxPollInterval のデフォルト値を 6, 10 と書いてあるサイトがありますが、 実際には DC とメンバーサーバでは異なっていて、DC が 6, 10 で、メンバーサーバはワークグループと同じ 10, 15 です。
  • NtpServer に付けるフラグで、0x8 は 2008 から無くなったと書いているサイトがありますが、 公式情報としては見つけられず、公式以外の情報もそのサイト以外には見つかりませんでした。 使ってもエラーにならないし、デフォルトで設定されている NtpServer の値も time.windows.com,0x9 のままだし、 GUI で設定した場合も自動的に 0x9 が付与されるので、気にせず使ってよいと考えています。 (0x9 は 0x1 + 0x8 という意味なので、0x8 が廃止されたのであれば 0x9 が設定されるのはおかしい)

おまけ1:設定用スクリプト

この記事のおすすめ設定を適用する PowerShell スクリプトです。 ファイルを開いて、先頭付近の設定項目を編集(最低限参照先 NTP サーバを記載)して実行してください。 メンバーサーバとワークグループサーバでは自動的にシステムクロックレートを取得して最適な UpdateInterval にしてくれます。 あんまりがっつり試験してないのでご利用はくれぐれも自己責任で。改変自由。ただし再配布は基本禁止で。 使ってみて何かバグを見つけたらフィードバックもらえると嬉しいです。

win2012r2_setntp_scripts_1.0.zip

おまけ2:確認用 w32tm コマンド

時刻同期できているか確認する
w32tm /query /status
クロックレートなどより詳細を表示したい場合
w32tm /query /status /verbose
NtpServer に設定されている全ての NTP サーバとの通信状況を確認する
w32tm /query /peers
設定を確認する
w32tm /query /configuration

2016年8月14日日曜日

GAIT

GAIT受験しました。
https://www.gait.org/

どんな試験かは上記の公式ページを見てください。 今後受ける方のために差しさわりのない程度にアドバイス的なものを書いてみます。

まずは問題に対する対策です。
公式問題集が出ていますが、現在は絶版のようです。 古書で手に入れることは可能かと思いますが、Amazonのレビューを見ても、実際受けてみた感じからしても、わざわざ買う価値があるのかは非常に疑問です。 公式ページにサンプル問題があるので、参考程度ならそれで充分。 基本的に、広く浅く聞かれます。 汎用的な問題は、ITパスポートレベルの簡単なものがほとんどという印象。 製品知識やプログラミングの知識についても、各ベンダ試験の一番簡単なレベルの試験で聞かれるような内容が多くて、一部マニアックな問題も出るといった感じ。 ただ、それが非常に幅広いジャンルについて出題されるので、多分どんなに勉強しても満点は絶対取れない。
本来は、この試験のスコアを伸ばすための勉強っていうのはする必要なくて、日々の業務とか、他の物のための勉強とかを通してどれぐらい成長したかをスコアで示すような使い方をする試験だと思います。
でも会社で評価に使われる場合とか、ちょっとでも点を上げたいのであれば、勉強方法としては以下のようなものが有効なんじゃないかと思います。

  • 公式のサンプル問題の中でわからないものがあれば、答え丸暗記ではなく選択肢全ての意味や周辺知識までしっかり学習する。
  • 経済産業省の情報処理技術者試験(以下IPA試験と記載)の午前問題を大量に解く。時間がかかる計算問題は飛ばしてOK。マネジメント、ストラテジー系も不要。
  • それぞれのカテゴリの代表製品の入門資格をとる。

2つ目に書いた点からも類推できると思いますが、IPA試験を定期的にコツコツ受けているような人は有利です。勉強しなくてもそれなりの点がとれます。 受けていない人で、GAITのスコア伸ばしたい人は、基本情報あたりから受けてみることをおすすめします。そのための勉強がGAITのスコアアップにも繋がって一石二鳥です。

その他のコツ的なものとしては、とにかく時間が足りないので、数秒以内に解けないと思ったらすぐどれかに適当にチェックを入れ、マーキングして次に行くこと。 そして、マーキング自体も、わからないもの全てではなくて、見直せば、もしくは時間をかければわかりそうなものに限ること。 わからないもの全てにチェックを入れていくと、多分大量にマーキングすることになるので、折角時間が余っても見直しに時間がかかり、全てのマーキング問題を見直す前に時間が切れます。

ここからは単に感想的なものですが。合否ではなくTOEICのようにスコアでスキルを測るというのは面白い考えだと思います。
もちろん、スコアが低いからと言って、仕事ができないとは全然言えないと思います。 ある特定の分野で尖ったスキルを持つスペシャリストでも、他の、ある意味仕事的にはどうでもいい分野の知識が無ければハイスコアを取ることはできないからです。 ただ、この試験で問われる知識は、前述した通りそんなに深いものではありません。 なので、本職のジャンル以外の分野についても、この試験で問われるぐらいの知識を持っておくことは全然無駄じゃないし、理想としては持っておくべき、つまりトータルとしてのハイスコアを目指すべきだと思います。 例えば本職がDBAで、DBのスペシャリストだとします。DBのことには詳しいが、他はさっぱり、というSEと、DBのことに詳しいうえに、そのDBを利用するアプリ開発や、DBが乗るサーバやストレージ、仮想化技術、ネットワークのこともある程度理解していてそれらのスペシャリストとの意思疎通がスムーズにできるSE、どちらが理想的か、言うまでもありませんよね。
GAITは990点満点。7分野だそうですから、きれいに割り切れないですが1分野は約140点です。専門分野で130点、残りの6分野で半分の70点ずつ取れば550点。これぐらいの点は30代以上のエンジニアなら最低限取ってもらいたいと思うんですけど、アセスメントサマリーでは年齢までは分からないので実際どうなのか・・・。コンサルの平均点が飛び抜けて高いのはさすがですね。
というわけで、ハイスコアなSEが優秀なSEである可能性は高いと思います。一部のベンダ試験のようなものとは違って、一夜漬けのような勉強では高得点を取ることは不可能であることもその信頼性を高めています。逆にロースコアなSE(尖ったところすらないSE)は未熟なSEである可能性が高いと言えます。
中間ぐらいのスコアは評価が難しいですね。同じスコアでも仕事上の実力はピンキリなので、人事評価に使う場合は注意が必要かと思われます。まぁGAITのスコアだけで全ての評価が決まるなんて会社はないでしょうからどうでもいいか。
他の試験は通常分野別に分かれてしまっているので、評価に使う場合はそれぞれの試験の難易度というのを考慮に入れる必要があり、その難易度を正しく評価することの難易度が高いという問題がありますが、GAITであれば単一の試験で全SEのトータルスキルを測れるので、いろんなSEを抱えている一般的なIT企業にはそれなりに良い指針になりうるのではないかと思います。

2016年8月10日水曜日

グループポリシーでIEのホームページを設定する3つの方法

グループポリシーでIE(11)のホームページを設定する方法は以下3つあります。(もっとあるかもしれないけど知らない)

  1. [ユーザーの構成]-[基本設定]-[コントロールパネルの設定]-[インターネット設定]
  2. [ユーザーの構成]-[ポリシー]-[管理用テンプレート]-[Windowsコンポーネント]-[Internet Explorer]-[ホームページの設定の変更を許可しない]
  3. [ユーザーの構成]-[基本設定]-[Windowsの設定]-[レジストリ]

それぞれ挙動は以下のようになります。

  1. [ユーザーの構成]-[基本設定]-[コントロールパネルの設定]-[インターネット設定]
    これで設定した場合、ユーザーがインターネットオプションを開いた際のホームページの設定部分は編集可能な状態です。 ただし、デフォルトではグループポリシーが適用されるたびにグループポリシーで設定した内容に上書きされます。 なので、ユーザーからしてみると、「あれ?設定したはずなのにいつの間にか元に戻ってる!」ということになります。 [共通]タブの[1度だけ適用し、再適用しない]にチェックを入れれば、初回のみホームページ設定が入り、二度と上書きされないので、ユーザーによる変更が維持されます。 「追加のホームページを設定するのは自由だけれども、トップのホームページだけは変更させたくない」という要件にはこの項目は使えません。
  2. [ユーザーの構成]-[ポリシー]-[管理用テンプレート]-[Windowsコンポーネント]-[Internet Explorer]-[ホームページの設定の変更を許可しない]
    IE10以降のGPOでの設定といえば[基本設定]というイメージですが、この[Windowsコンポーネント]-[Internet Explorer]にも設定項目がいくつかあります。 この[ホームページの設定の変更を許可しない]でホームページを設定することができます。そして、文字通りユーザーが変更することはできなくなります。 インターネットオプションのホームページの設定欄がグレーアウトされて操作できない状態となります。 同じ階層に[セカンダリホームページ設定の変更を無効にする]という項目があり、未構成の状態では[いいえ]なのですが、そのままでも、明示的に[無効]にしても、少なくともインターネットオプションではホームページを追加することはできません。レジストリをいじれば追加できるのかもしれませんが、そこまでして追加のホームページを設定しようとするユーザーはいないでしょうから、実質的にはこの設定で「ホームページは特定のページに固定する。ユーザーによる変更は許可しない。」という要件を、ユーザーを混乱させずに実装できます。逆に、ホームページは固定しつつ追加のページ設定を許可したい場合には使えません。
  3. [ユーザーの構成]-[基本設定]-[Windowsの設定]-[レジストリ]
    この項目自体はIEと直接関係なく、単に任意のレジストリを設定する項目です。この項目で、IEのホームページ設定を行うレジストリを指定します。 キーのパスが[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main]、値の名前が[Start Page]の項目の、値のデータにURLを設定すればホームページに設定することができます。インターネットオプションのホームページの設定欄は1と同様に編集可能状態になります。[共通]タブの[1度だけ適用し、再適用しない]のチェック有無による挙動は、ここにチェックを入れた場合は1と同じですが、入れなかった場合は、ここで設定したホームページだけは維持されるけれども、ユーザーが追加で設定したホームページについては上書きされないという挙動になります。

つまりホームページの設定自体はどの方法でもできますが、ユーザーによる変更をどう扱うかの要件によって使用すべきポリシーがおのずと決まってきます。

要件:一旦ホームページ設定を配布するが、変更は自由に行って良い。
[ユーザーの構成]-[基本設定]-[コントロールパネルの設定]-[インターネット設定]でホームページを設定し、[共通]タブで[1度だけ適用し、再適用しない]にチェックを入れる。
要件:ホームページ設定を配布し、変更は許可しない。
[ユーザーの構成]-[ポリシー]-[管理用テンプレート]-[Windowsコンポーネント]-[Internet Explorer]-[ホームページの設定の変更を許可しない]でホームページを設定する。
要件:ホームページ設定を配布し、配布した設定は維持させるが、追加のホームページ設定は許可する。
[ユーザーの構成]-[基本設定]-[Windowsの設定]-[レジストリ]で[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main]の[Start Page]にホームページを設定し、[共通]タブの[1度だけ適用し、再適用しない]にはチェックを入れない。

2016年8月8日月曜日

クライアントでグループポリシーの結果セットを見る

クライアント側で、自分に適用されているグループポリシーの結果セットをGUIで確認する方法。
ファイル名を指定して実行で、rsop.msc
超便利!

2016年3月28日月曜日

Fess 10.0 ポート変更

公式にはポートの変更方法が無かったので書いておきます。 バージョン 10.0.2 で動作確認しています。 バージョンが異なると方法も異なる可能性があるので注意してください。

Fess の zip を展開してできたフォルダ内にある「bin」フォルダの中にあるファイルの中にある 8080 という数字を変更したいポートに書き換えます。 単発起動(Windows)の場合は fess.bat、サービスの場合は service.bat、Linux の場合 fess.in.sh です。 他には特に編集すべきものはありません。

2016年3月27日日曜日

Fess 10.0 導入メモ

オープンソース全文検索サーバーFessの設定メモ。公式はこちら。
http://fess.codelibs.org/ja/
一応ドキュメントあるのですが、古いバージョンの記載のままで間違っていたりするので辛い。 導入してみましたので記録をば。

Fessのバージョンは10.0.2、Windows Server 2012 R2で動かしました。Javaのバージョンは8u77。
想定したのは、部内ファイルサーバーの全文検索システムを構築するという状況。 ファイルシステムクロールです。Webクロールは他のサイトでも紹介しているところが結構あると思うのでそちらを参照してください。 部内ファイルサーバーは以下の4つの共有フォルダがあるとします。

全員用
部員全員が閲覧可能な場所。
偉い人用
偉い人だけが閲覧可能な場所。
1課
1課のメンバーと偉い人だけが閲覧可能な場所。
2課
2課のメンバーと偉い人だけが閲覧可能な場所。
本当はActiveDirectoryと連携したかったのだけれども、現状の公式のドキュメントではその方法がわからなかったので、Fessに登録したアカウントとロールで権限を制御します。

まずインストール。Java8のJDKをインストールします。JREではないので注意。現時点での最新、8u77 をインストールしました。
その後、システムの環境変数の設定をします。環境変数の設定画面は、「コントロールパネル」→「システム」→「システムの詳細設定」→「環境変数」ボタンで出てきます。 「システム環境変数」→「新規」で「変数名」に「JAVA_HOME」、「変数値」に「C:\Program Files\Java\jdk1.8.0_77」を設定。Javaのバージョンが違う場合は勿論その部分は合わせてください。 次に、既に登録されている「Path」という環境変数をダブルクリックして、「変数値」の末尾に「;%JAVA_HOME%\bin」を追加します。
FESSを公式からダウンロードします。zip形式のもの。それを展開して、適当な場所に配置します。とりあえず起動してみるだけであればどこでもいいですが、運用するつもりであれば専用のパーティションを切ってその中に置いたたほうがいいと思います。
インストールはこれで完了。

単発で起動するなら、FESSのzipを展開してできたフォルダ内の「bin」フォルダ内の「fess.bat」をダブルクリックすればOKです。コマンドプロンプトが自動的に起動します。このコマンドプロンプトを閉じるとFESSも終了します。正常に起動していれば、ブラウザで http://IPアドレス:8080/ にアクセスするとFESSの画面が表示されます。ちなみに他のマシンからアクセスする場合、Windowsファイアウォールがデフォルト設定だとブロックしてしまうので除外設定する必要があります。
サービスとして登録したい場合は、コマンドプロンプトを起動して、同じ「bin」フォルダ内の「service.bat」を「install」引数付きで実行すると、表示名「Fess 10.0.0-SNAPSHOT (fess-service-x64)」で登録されます。登録したては手動起動になっているので、自動起動したい場合はプロパティで変更してください。

無事起動したら設定をしていきます。管理画面のURLは http://IPアドレス:8080/admin です。管理者アカウントは admin、初期パスワードも admin です。ちなみに IE だとダッシュボードの表示が崩れます。他の画面は大丈夫そうでした。
最初にロールを作成します。左のメニューから「ユーザー」→「ロール」でロールを作成します。ロール名は英字で。 今回は、1ka, 2ka, erai, zenin という4つのロールを作成しました。ロールを作成したら、一覧に表示されたそれぞれのロール名をクリックして、「新しいクローラ用ロールの作成」で、それぞれ同名のクローラ用ロールも作成しておきます。
次に左メニューの「ユーザー」→「ユーザー」でユーザーを作成します。今回は、1kauser, 2kauser, erai の3ユーザーを作成しました(各権限ごとの共有アカウントとして利用する想定)。1kauser には 1ka と zenin のロールを割当て、2kauser には 2ka と zenin のロールを割り当て、erai には erai と zenin のロールを割り当てます。ロールの複数割り当ては、コントロールキーを押しながらクリックすることで可能です。
次にラベルを作成します。これは必須ではないですが、偉い人は何もかも見えてしまうので、範囲を絞りたいこともあるかなと思って作成しています。左メニューの「クローラ」→「ラベル」をクリックし、「新規作成」ボタンをクリックします。「名前」はユーザーに見えるラベルになるので、わかりやすい名前にしましょう。日本語OKです。「値」はユーザーには見えない内部的なものです。英字にしてください。「対象とするパス」「除外するパス」は空欄でOK。「ロール」はそのラベルを表示させる対象のロールを選択します(コントロールキー押下で複数選択可)。「表示順序」はラベルの表示順序です。今回はデフォルトのままとしました。

名前ロール
1課1ka1ka, erai
2課2ka2ka, erai
偉いeraierai
全員zeninzenin
次にクロールの設定です。左メニューの「クローラ」→「ファイルシステム」をクリック、「新規作成」ボタンをクリックします。 「名前」は日本語OK、わかりやすいものに。「パス」にクロール対象とする共有フォルダのパスを以下の形式で記載します。
smb://サーバー/パス/
パスの部分、日本語であってもURLエンコードせずにそのまま記載してOKです。最後の / が非常に重要です。 これがないとクロールしてくれません。 「ロール」で検索させたいロールを選択(コントロールキー押下で複数選択可)し、「ラベル」で付けたいラベルを選択(コントロールキー押下で複数選択可)します。 他のオプションはデフォルトのままとしました。
名前パスロールラベル
1課smb://xxx.xxx.xxx.xxx/1課/1ka, erai1課
2課smb://xxx.xxx.xxx.xxx/2課/2ka, erai2課
偉い人用smb://xxx.xxx.xxx.xxx/偉い人用/erai偉い
全員用smb://xxx.xxx.xxx.xxx/全員用/zenin全員
次に認証の設定です。左メニューの「クローラ」→「ファイル認証」をクリック、「新規作成」ボタンをクリックします。 「ホスト名」を、クローラのパスに設定した smb:// の後ろに記載した通り(上記の例だと xxx.xxx.xxx.xxx)に記載します。 「ポート」「スキーム」「パラメータ」はデフォルトのままでOKです。 「ユーザー名」はドメイン環境であれば「ドメイン名\アカウント名」と記載します。 「ファイルクロール設定」でクロール設定を選びます。ここは1つしか選べないので、認証情報が共通であってもクロール設定数分作成する必要があります。面倒ですが頑張って作りましょう。
これでやっと準備が整いました。左メニューから「システム」→「スケジューラ」をクリックし、表示された一覧の中から 「Default Crawler」をクリック、「今すぐ開始」ボタンをクリックするとクロールが始まります。 負荷がかかりますので、「今すぐ開始」できない場合はジョブ実行されるのを待ちましょう。 デフォルトでは毎日0時に実行されるようになっています。変更したい場合は「編集」で「スケジュール」欄をいじる。
結果は左メニューの「システム情報」→「ジョブログ」で確認できます。 ただ、この画面では、設定ミスによるエラーについてはジョブのエラーとは見なされないので結果OKになっています。 「システム情報」→「クロール情報」でより詳細な情報を確認可能です。 「セッションID」をクリックすると、そのクロールセッションで収集対象となった文書の情報が見れます。 ここで「一致する情報は見つかりませんでした。」と出る場合は、クロールパスの設定か認証の設定かを間違っている可能性大です。 左メニューの「システム情報」→「ログファイル」で「fess-crawler.log」を見てみると何かエラーが出ているはず。

ここまでうまくいったら、後は検索してみるだけなのですが、その前に「システム」→「全般」で「ログインが必要」にチェックを入れて「更新」しておきましょう。そうしないとデフォルトでは認証なしの Guest ロールでの検索になるので、今回の設定では何も検索結果に出てきません。
検索画面は http://IPアドレス:8080/ です。管理画面を開いているのと同じブラウザで開くと admin でログインした状態なので、いったんブラウザを落とすか、ページ上部のアカウント名が表示されている部分をクリックしてログアウトしてください。 1kauser, 2kauser, erai それぞれでログインして検索してみて、意図した通りの出しわけになっていることを確認して完了です。

2016年2月14日日曜日

CentOS7 に vSphere SDK for Perl をインストール

CentOS7 に vSphere SDK for Perl をインストールしようとしたらマニュアル通りの方法ではインストールできなかったのでメモ。 CentOS のバージョンは 7.2-1511、Minimal。vSphere SDK for Perl は 6.0。

# yum install perl
# yum install open-vm-tools
# yum install e2fsprogs-devel libuuid-devel
# yum install glibc.i686
# yum install perl-XML-LibXML
# yum install openssl-devel
# yum install perl-CPAN
# yum install perl-YAML perl-Devel-CheckLib libxml2-devel
# yum install gcc
# cpan -i JSON::PP
# cpan -i Fatal
# cpan -i Env
# cpan -i Class::MethodMaker

open-vm-tools は VMware Tools なので既に導入済みであれば無視してください。
後は vSphere SDK for Perl をダウンロードしてきて解凍し、./vmware-install.pl を実行。 ライセンスに同意し、RHEL用のパッケージを入れるか聞かれるのでそれには NO と返答。 CPAN がエラーっぽいものを吐いて続けるかどうか聞いてきますがそれには YES と返答。