雑な hinananoha

やさしいせかいをさがして三千里

コミックマーケット94にサークル参加します!!!!

C94、参戦

どうも、hinananohaです。

先日のRTX1210に関する記事でさらっと流しましたが、今回サークル参加することとなりました。

場所は 1日目 西も-39b 「嬉野ネットワークサービス」です。

何出すの?

今回、「会報 URESHINO 創刊準備号」と題しまして、現在私が作っているコミケ共同購入チェックリスト共有・管理システム「Funnel Advisor」に関する紹介本を出します。1部500円の予定です。

f:id:hinananoha:20180808000824p:plain

"Funnel Advisor" って何?

Funnel Advisorはコミケで複数人での共同購入の際にチェックリストを簡単に共有・集計ができたり、そのほかにも共同購入に便利な機能を提供するWebサービスです。

現在クローズドβで運用しておりますが、C95~C96あたりから一般公開する予定で現在開発を進めております。

構想自体はC90から進めており、C91から現在までクローズド環境で運用してきました。

ただ、類似のサービスがないことや、(私の周りで聞いている限り)需要がありそうなので、オープンサービスとして動かそうと決意し、この通り今回初サークル参加するに至りました。

少しでもご興味がございましたら是非1日目 西も-39b 「嬉野ネットワークサービス」にお立ち寄りください。

デモ公開します!!!

紹介冊子があるとはいえ、やはり実際に見てみないとわからないだろうということで、周りが落ち着くであろう午後1時頃から、実際にデモをお見せする予定です。

ぜひ見てみたいという方は午後1時以降にお越しいただければと思います。

また、私自身も買い物等で開会直後~午後1時頃までは売り子の方にお願いしておりますので、もし私に用があるという奇特な方がおりましたら、そちらも午後1時以降にお越しいただければと思います。

コミケ歴6年目にして初サークル参加

一般参加はかれこれ5年、合同誌に原稿を載せていただき始めてからも早4年近くとなるのですが、自分の個人サークルとしてサークル参加するのは初めてでございます。

初めて故いろいろとご迷惑おかけすることもあるかもしれませんが生暖かい目で見守っていただけると幸いにございます。

進捗いかがですか?

(大丈夫だったらこんなに告知が遅いわけないんだよなぁ)

告知遅くない?

告知遅くなってごめんなさい、気が付いたら直前も直前でした。

いつも「お品書き出すの遅い」とか言ってたことを激しく反省しております、ええ。

2018/08/09 追記

(皆さんご存知だとは思いますが)高額紙幣でのお支払いはお釣りをお返しできない可能性がございます(特に特に開会直後は)ので、ご理解ご協力のほどよろしくお願いいたします。

YAMAHA RTX1210でv6プラス対応HGW(PR-500MI)配下でのv6プラス接続(MAP-E)に成功した話

もう夏

こんにちは皆さん、hinananohaです。

すっかり熱くなってもはや夏といっても過言ではないですね。

我が家もついに(サーバ群のために)冷房24時間稼働の時期がやってきたようです。

今のアパートのエアコンは私が来た時に新品にしてもらったおかげで設定温度28℃でもなかなか冷えるので電気代にやさしいです。

YAMAHAルータv6プラス対応

cloud.watch.impress.co.jp

今か今かと待ち続けたYAMAHAルータでのv6プラス(MAP-E)がついに正式対応となりました。v6プラス自体は自分でアドレスを手計算すれば一応使えたらしいのですが、アドレス範囲が変更になった場合再計算になるとかなんとかまあ少し不便でした。

ところがです。

v6プラス対応機能

これをよく見るとこんなことが書いてあります。

ONU直下での動作を推奨しますが、「v6プラス」に対応しておらず配下にIPv6アドレスを配布するホームゲートウェイであれば動作が可能です。「v6プラス」に対応したホームゲートウェイの配下では動作しません。

我が家の機器はPR-500MI、ばっちりv6プラスに対応したHGWです。それでもどうにかならないかと様々思考錯誤はしたのですが……

villas-windmill.blog.so-net.ne.jp

この記事の通り、うんともスントも言いませんでした。ところが、いろいろあってv6プラス対応のHGWの配下で動作する方法を見つけました。

v6プラス対応HGW配下でRTX1210でのv6プラス接続を試みる

私が行った手順は以下の通りです。

  1. v6プラスオプションをいったん解約する
  2. IPv6接続オプションも一度解約する(※解約しないとv6プラスオプションが戻せなかったため)
  3. PR-500MIを初期化する
  4. 初期化後、「初期設定」ランプがオレンジ色に点灯(=未設定状態)していることを確認し、HGWの初期設定を行う。但しこの時、パスワードのみ設定して、ISPの設定を行わない
  5. 完了、再起動後、「初期設定」ランプが消え、「登録」ランプが点灯することを確認する
  6. 設定画面に入り、「詳細設定」の「IPv6 パケットフィルタ設定 (IPoE)」を「無効」にする
  7. v6プラスオプションを再契約と同時にRTX1210にMAP-Eの設定を投入(設定内容はRAプロキシの方)
  8. しばらくして、ISP側でIPv6 IPoEの設定が完了すると「初期設定」ランプがオレンジ色に点灯するとともに「オプション」ランプが緑色に点灯(=ONU機能のみ利用可)する
  9. しばらく待つとRTX1210のMAP-Eのtunnelがupしているのが確認できる

このような感じでMAPルールが取得出来ていることが確認できます*1

# tunnel select 1
# show status tunnel
TUNNEL[1]: 
説明: nifty
  インタフェースの種類: MAP-E
  IPv6: ****:**:****:****:**:****:****:****
  トンネルインタフェースは接続されています
  開始: 2018/07/02 00:41:54
  通信時間: 2日17時間18分19秒
  受信: (IPv4) 2251499 パケット [2601399207 オクテット]
        (IPv6) 0 パケット [0 オクテット]
  送信: (IPv4) 1168271 パケット [667896650 オクテット]
        (IPv6) 0 パケット [0 オクテット]
# show nat descriptor address
NAT/IPマスカレード 動作タイプ : 2
参照NATディスクリプタ : 300, 適用インタフェース : LAN3(1)
Masqueradeテーブル
    外側アドレス: primary/192.168.0.14
    ポート範囲: 60000-64095, 49152-59999, 44096-49151   1 セッション
  -*-    -*-    -*-    -*-    -*-    -*-    -*-    -*-    -*-    -*-    -*-
      No.       内側アドレス    セッション数  ホスト毎制限数         種別
       1         192.168.2.2               1           65534         dynamic
---------------------
参照NATディスクリプタ : 1000, 適用インタフェース : TUNNEL[1](1)
Masqueradeテーブル
    外側アドレス: map-e/***.***.***.***
    ポート範囲: ****-****, ****-****, *****-*****, *****-*****, *****-*****, **
***-*****, *****-*****, *****-*****, *****-*****, *****-*****, *****-*****, ***
**-*****, *****-*****, *****-*****, *****-*****   156 セッション
  -*-    -*-    -*-    -*-    -*-    -*-    -*-    -*-    -*-    -*-    -*-
      No.       内側アドレス    セッション数  ホスト毎制限数         種別
       1     ***.***.***.***             135         65534         dynamic
       2     ***.***.***.***              11          65534         dynamic
       3     ***.***.***.***               4           65534         dynamic
       4     ***.***.***.***               2           65534         dynamic
       5     ***.***.***.***               1           65534         dynamic
       6     ***.***.***.***               1           65534         dynamic
       7     ***.***.***.***               1           65534         dynamic
       8     ***.***.***.***               1           65534         dynamic
---------------------
有効なNATディスクリプタテーブルが2個ありました

考察:どのような条件下でv6プラス対応HGW配下でも成功するか

v6プラス対応HGW配下でRTX1210等でMAP-E接続に成功させる条件は以下だと思われます。

  • 一旦「v6プラス」オプションを解約し、フレッツ・ジョイントで降ってきたソフトウェアとの接続を無効化する
  • HGWをリセットし、接続情報を削除したのちにそれを設定しない

それぞれについて見ていきます。

その1: v6プラスの解約とフレッツ・ジョイント

v6プラス対応HGWは「フレッツ・ジョイント」と呼ばれる仕組みを用いてこれを実現しています。

www.ntt-east.co.jp

どうやら前のリンクも含めて察するに、この「フレッツ・ジョイント」によってv6プラス関連ソフトウェアが入ってしまうとどうにもならなさそうということが分かります。

これはルータ部分だけの話ではなさそう、というのも、PR-500MIにはONU部分と思われる場所の背面に謎の「蓋」があり、そこを開けると内部でLANポートに上から伸びているLANケーブルが刺さっているのは皆さんご存知だと思いますが、ここから無理やりLANを引っ張って試しても成功しないためです。

通常であればルータ部分を回避しているわけですから、成功すると思うのですが……ここに関しては謎が多いです。個人的には

  • 例のソフトウェアはルータ部分だけでなくONU部分にも何らかのソフトウェア的制御が入る
  • フレッツ・ジョイントでの接続に成功するとMAPサーバへの接続が当該ソフトウェアからのみの取得以外は受け付けなくなる

あたりが理由かと推察しております。

特に後者については、v6プラス申し込み時に@niftyから送られてくるメールからもその可能性を示唆しております。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ ご利用までの流れ(v6プラス単体でお申し込みいただいたお客様)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
《1:v6プラスご利用可否の確認》
  (中略)

《2:v6プラス開通のご連絡》
 v6プラスご利用開始通知メールが届きましたら、ご利用可能となります。

 [▼](※)v6プラス対象コース、詳細は以下よりご確認ください。
 http://csoption.nifty.com/ipv6/

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ v6プラス対応ブロードバンドルーターでのv6プラスお申し込みについて
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 お客様ご自身で用意されたv6プラス対応ブロードバンドルーターでv6プラス
 をお申し込みいただいた場合、手続きが完了しますと「IPv6接続オプション」
 のご利用開始メールが送信されます。メールを受信されましたら、ブロード
 バンドルーターの設定をv6プラスに変更して接続を行ってください。

  [▼]サポートページ
   https://faq.nifty.com/app/answers/detail/a_id/21282/

実際、最初にv6プラスを契約したとき(=フレッツ・ジョイントで降ってきたとき)は「v6プラスご利用開始通知」が、そして今回は「IPv6接続オプション ご利用開始通知」が届きました。

これらからも、「フレッツ・ジョイントでv6プラスが有効化された場合」とそれ以外で挙動が異なる可能性は十分にあると思われます。

そのため、例えフレッツ・ジョイントの設定で停止したとしても配下の端末でMAP-EのMAPサーバへの接続ができないのでは、と思います。

その2:HGWのリセットと接続情報未設定

その1でフレッツ・ジョイントで降ってきたv6プラス関連ソフトウェアとの紐づけは解除されたのですが、再契約時にどのような挙動をするかわからないため、リセットは必要かと思われます。

但し、重要なのはそこよりも「HGWに接続情報を設定しないこと」です。

どうやらフレッツ・ジョイントでのHGWへのソフトウェアの流し込みにはIPv4 PPPoE接続によるISPとの接続が最初に必要なようです。

そのため、ここでHGWに接続情報を設定しないことでそもそもフレッツ・ジョイントのソフトウェアが入らないようにすることができるのではないかと思われます。

まとめ

というわけで、

v6プラス対応HGW配下でRTX1210等でv6プラス接続を行うには

  1. 一旦v6プラスを解約して
  2. HGWをリセット
  3. HGWには接続情報を投入せず
  4. そして再度v6プラスを再契約してHGWとのMAPサーバ接続争奪戦に勝つ

という結果が出ました。

情報募集中

もし試してみて「この作業は不要だった」若しくは「この作業も重要っぽい」、また様々に詳しい方からの「おそらく理由はこれだろう」などの情報がございましたらTwitterなりコメントなりで情報をください。

よろしくお願いいたします。

最後に:コミケに出ます

最後に宣伝をば。コミケ初サークル参加です🎉🎉🎉🎉*2

現在「大規模即売会における共同購入補助サービス」として Funnel Advisor というサービスを開発中です。

実は2年前くらいから身内向けに作ってたのですが、各所から評判が良かったので今年の冬のオープンβを目指して現在頑張っております。

それに関する解説本や与太話などをする本を出そうかなと思っておりますので、ご興味がございましたら是非1日目 西も-39bまでお越しください。

また直前になったら記事を書きます。……多分。

*1:NATディスクリプタ300はバックアップ回線の物です

*2:要出典

起動時とシャットダウン時にメールを飛ばしてくれるPowershell スクリプト

お久しぶりです

どうもお久しぶりです。こんな記事書くの久々なhinananohaです。
なんかTwitterアカウントが新しく?なりましたのでよろしくお願いします。

twitter.com

Introduction

我が家はメインサーバとしてWindows Serverを動かしているのですが、唐突に以下の機能を実装してみたくなりました。

  • シャットダウン時とスタートアップ時にメールを飛ばす
  • スタートアップ時は前回のシャットダウンに関する情報を提供する

こんな感じです。
ただメール飛ばすだけは実は簡単なのですが、後者の場合はイベントログを取得する必要があるため、まあどうしようかな、みたいな気持ちになっていました。

実際に作ってみた

作ったもの

まずさっそく結果から。この通りになります。

シャットダウン時にメールを飛ばすスクリプト

$mail = @{
    from = "";
    to = "";
    smtp_server = "";
    smtp_port = 587;
    user = "";
    password = "";
}
$date = Get-Date -Format R
$subject = "[THANATOS]System Shutdown Start."
$body ="
THANATOS System Shutdown is received.
System is shutdown at $Date .

This mail is auto-sent from Windows Server.
"

$client = New-Object Net.Mail.SmtpClient($mail["smtp_server"], $mail["smtp_port"])

# GmailはSMTP + SSLで送信する
$client.EnableSsl = $true

# SMTP Authのため、認証情報を設定する
$client.Credentials = New-Object Net.NetworkCredential($mail["user"], $mail["password"])

$msg = New-Object Net.Mail.MailMessage($mail["from"], $mail["to"], $subject, $body)

$client.Send($msg)

スタートアップ時にメールを飛ばすスクリプト

function CheckConnectivity($times) {
    $return = 0
    try{
        $Result = Get-NetConnectionProfile -IPv4Connectivity Internet -erroraction stop
    }catch [System.Management.Automation.ActionPreferenceStopException]{
        Start-Sleep -s 10
        $times = $times + 1
        if($times -eq 30){
            return 1
        }
        $return = CheckConnectivity($times)
     }
     return $return
}


function SendStartupMail {
    $check = CheckConnectivity(0)
    $startup_start_date = Get-Date -Format R ([DateTime](Get-EventLog -LogName System -InstanceId 12 -Newest 1 | Select-Object ReplacementStrings).ReplacementStrings[6])
    $startup_finish_date = Get-Date -Format R
    $last_shutdown_status = (Get-EventLog -LogName System -InstanceId 20 -Newest 1 | Select-Object ReplacementStrings).ReplacementStrings[0]
    if($last_shutdown_status -eq 'true'){
        $last_shutdown_time = Get-Date -Format R ([DateTime](Get-EventLog -LogName System -InstanceId 13 -Newest 1 | Select-Object ReplacementStrings).ReplacementStrings[0])
        $last_shutdown_info = (Get-EventLog -LogName System | Where-Object{$_.EventID -eq 1074} | Select-Object -First 1 | Select-Object ReplacementStrings).ReplacementStrings
        $reason = $last_shutdown_info[2]
        $reason_code = $last_shutdown_info[3]
        $reboot = $last_shutdown_info[4]
        $comment = $last_shutdown_info[5]

        $body ="
THANATOS System is start and connect network.
System startup start at $startup_start_date .
System startup completed at $startup_finish_date .

Last Shutdown Status: $last_shutdown_status ($reboot)
Last Shutdown Time : $last_shutdown_time
Reason : $reason ($reason_code)
Comment : $comment


This mail is auto-sent from Windows Server.
"
    } else {
                $body ="
THANATOS System is start and connect network.
System startup start at $startup_start_date .
System startup completed at $startup_finish_date .

Last Shutdown Status: $last_shutdown_status
Last Shutdown is Bad status. You must set reason.


This mail is auto-sent from Windows Server.
"
    }
    if($check -eq 0){
        $mail = @{
            from = "";
            to = "";
            smtp_server = "";
            smtp_port = 587;
            user = "";
            password = "";
        }
        $subject = "[THANATOS]System Start"

        $client = New-Object Net.Mail.SmtpClient($mail["smtp_server"], $mail["smtp_port"])

        # GmailはSMTP + SSLで送信する
        $client.EnableSsl = $true

        # SMTP Authのため、認証情報を設定する
        $client.Credentials = New-Object Net.NetworkCredential($mail["user"], $mail["password"])

        $msg = New-Object Net.Mail.MailMessage($mail["from"], $mail["to"], $subject, $body)

        $client.Send($msg)

    } else {
        Start-Sleep -s 300
        SendStartupMail
    }
}

SendStartupMail
        


コードが汚い気がしますが気のせいです
これでメールを飛ばすと、こんな感じになります。(スタートアップ時)



ではどんな感じで作ったかを書いていきます。

Powershellでメールを飛ばす

これはいろいろな需要がある関係で各所に記事が転がっています。
我が家はSMTP over SSL/TLSなので、「Gmailにメールを送りたい」と同じ奴を見ればだいたいわかります。という事でこちらの記事を参考にさせていただきました。

thinkami.hatenablog.com

この中の System.Net.Mail の方を使いました。

シャットダウン時・スタートアップ時にPowershellスクリプトを実行

グループポリシー(gpedit.msc)で設定します。
グループポリシーの コンピューターの構成 -> Windowsの設定 -> スクリプト(スタートアップ/シャットダウン) で設定できます。
わざわざPowershellスクリプトを実行する専用のタブがあるのでそちらで設定ができます。

以上です。

Powershell スクリプトでイベントを取得し、必要な情報を取得する

イベントログを取得するPowershellコマンドは Get-EventLog です。
Get-EventLog そのものの使い方や、それをわかりやすくまとめた記事は以下の通りです。

gallery.technet.microsoft.com

www.atmarkit.co.jp

これらを用いて、必要なイベントを取得します。

前回のシャットダウンに関するイベントを取得し、そこから必要な情報を取得する

これが面倒くさい(というよりはこれが理解できるまで時間がかかりました)です。
まず、前回のシャットダウンに関する情報でほしいものは以下の通りです。

  1. 前回のシャットダウンは正常だったか (STOPエラーや強制終了、電源喪失などによるものではない)
  2. もし前回のシャットダウンが正常であれば、いつシャットダウンしたか
  3. 前回のシャットダウンは「シャットダウン」だったのか、「再起動」だったのか
  4. 前回のシャットダウンの理由は何だったのか (Windows Serverはデフォルトで「シャットダウンのイベント追跡ツール」が有効になっている)

このあたりです。では、実際のイベントログを見ながら、起動時のイベントログがどういう形になっているのか見ます。

起動時に発生するイベントログの解析

( この項目はただひたすらイベントログを解析する話なのでコードを見たい方は飛ばして構いません )

今回見るイベントログはイベント ビューアーの「Windows ログ」 -> 「システム」のログです。

まず、Windowsが起動して一番最初に記録されるイベントは 「Windowsの起動開始時刻」に関するイベントです。

ログの名前 システム
ソース Kernel-General
イベントID 12
オペコード 情報

内容はこんな感じです。

オペレーティング システムはシステム時刻 2018-01-31T05:41:44.498537000Z に起動しました。

次に(場合によっては仮想化ベースのセキュリティに関するログが出ることもありますが)ブートオプションのログが出ます。(おそらくセーフモードとかに関するものだと思います)
その次にbootmgrのユーザ入力待ちに関するログ、そしてその次にお待ちかね、「前回のシャットダウンのステータス」に関するログが出ます。

ログの名前 システム
ソース Kernel-Boot
イベントID 20
オペコード 情報

内容はこんな感じです。

前回のシャットダウンの成功状態は true でした。前回のブートの成功状態は true でした。

このログが終わると、ブートの種類、ブートメニューポリシー、FWからのブートメトリックの報告が終わって、いろいろなものが起動し始めます。

さて、次にシャットダウン時の情報を取得します。

シャットダウンの情報に関するイベントログの解析

次に、シャットダウン時に関する情報を探します。

シャットダウンに関する一番最初のログは、一部の例外を除いて一番最初に記録されるのは「シャットダウンのイベント追跡ツール」によるものです。
これは、有効になってない場合も、また、Windows Updateなどによる強制的なシャットダウン|再起動の場合も適当な理由で記録されます。

ログの名前 システム
ソース User32
イベントID 1074
オペコード 情報

内容はこんな感じです。

次の理由で、プロセス C:\Windows\System32\RuntimeBroker.exe (THANATOS) は、ユーザー THANATOS\Administrator の代わりに、コンピューター THANATOS の 再起動 を始めました: アプリケーション: メンテナンス(計画済)
 理由コード: 0x84040001
 シャットダウンの種類: 再起動
 コメント: 

C:\Windows\System32\RuntimeBroker.exeはいわゆる一般的なユーザの操作によるシャットダウン・再起動を行うときに呼び出されるものです。
例えば、Windows Updateから再起動をかけるとこうなります。(※Windows Server 2016の場合)

次の理由で、プロセス C:\Windows\system32\svchost.exe (THANATOS) は、ユーザー NT AUTHORITY\SYSTEM の代わりに、コンピューター THANATOS の 再起動 を始めました: オペレーティング システム: Service pack(計画済)
 理由コード: 0x80020010
 シャットダウンの種類: 再起動
 コメント: 

他にも、デバイスドライバのインストール後に再起動を要求されたりすると、こんな感じになります。(※Windows 10 Pro build 1709の場合)

次の理由で、プロセス msiexec.exe は、ユーザー NT AUTHORITY\SYSTEM の代わりに、コンピューター FARAWAY の 再起動 を始めました: この理由のタイトルが見つかりません
 理由コード: 0x80030002
 シャットダウンの種類: 再起動
 コメント: 'Sound Blaster Z-Series' の構成を完了または続行するために、Windows インストーラーによりシステムの再起動が実行されました。

これを使えばシャットダウンの理由はわかりそうです。

さて、ここから様々シャットダウンが行われます。すべてのシャットダウンが終わり、いちばん最後に記録されるのは、シャットダウン完了に関するログです。

ログの名前 システム
ソース Kernel-General
イベントID 13
オペコード 情報

内容はこちら。

オペレーティング システムはシステム時刻 2018-01-31T19:32:45.977382500Z にシャット ダウンします。

これでログが出そろいました。次にこれをPowershell スクリプトで取得して情報を得る方法です。

Powershell スクリプトで特定のイベントの一番新しいログの中の特定の情報を取得する

まず、Powershell スクリプトで特定のイベントを取得するのに使うのは「イベントID」です。これを使ってイベントを抽出します。
この方法は2種類あります。なぜか(もしかしたら私の解釈が間違っているのかもしれない)前者の方法で取得できない時があるので、その時は後者の方法を試してください。

Get-EventLog -LogName <LogName> -InstanceId <ID> -Newest 1
Get-EventLog -LogName <LogName> | Where-Object{$_.EventID -eq <ID>} | Select-Object -First 1

< LogName > にはログの名前、 < ID > にはイベントIDを入れます。例えば、シャットダウンに関する情報を表示するログはこのように出力されます。

PS C:\Windows\system32> Get-EventLog -LogName System | Where-Object{$_.EventID -eq 1074} | Select-Object -First 1

   Index Time          EntryType   Source                 InstanceID Message
   ----- ----          ---------   ------                 ---------- -------
    8968 2 01 04:32    Information User32                 2147484722 次の理由で、プロセス C:\Windows\system32\winlog...

さて、ではここからイベントログの中にある情報を取得します。特定のイベントログに関係する詳細な情報を出すときは、Format-List *でできます。

PS C:\Windows\system32> Get-EventLog -LogName System | Where-Object{$_.EventID -eq 1074} | Select-Object -First 1 | Format-List *


EventID            : 1074
MachineName        : FARAWAY
Data               : {}
Index              : 8968
Category           : (0)
CategoryNumber     : 0
EntryType          : Information
Message            : 次の理由で、プロセス C:\Windows\system32\winlogon.exe (FARAWAY) は、ユーザー NT AUTHORITY\SYSTEM の代わりに、コンピューター FARAWAY の 電源を切る を始めました: この理由のタイトルが見つかりません
                      理由コード: 0x500ff
                      シャットダウンの種類: 電源を切る
                      コメント:
Source             : User32
ReplacementStrings : {C:\Windows\system32\winlogon.exe (FARAWAY), FARAWAY, この理由のタイトルが見つかりません, 0x500ff...}
InstanceId         : 2147484722
TimeGenerated      : 2018/02/01 4:32:38
TimeWritten        : 2018/02/01 4:32:38
UserName           : NT AUTHORITY\SYSTEM
Site               :
Container          :

ほしいのはMessageの中ですが、ここから情報を取得するのは骨が折れます。そこで、特にシステム系のイベントの場合は、ReplacementStringsという項目を見ます。
この項目は、該当のログにおいて特に個々のイベントで置き換わりそうな情報が記されているっぽいです。試しにその情報を取得してみます。

イベントログの中から特定の項目を取り出すときはSelect-Objectを使います。

PS C:\Windows\system32> Get-EventLog -LogName System | Where-Object{$_.EventID -eq 1074} | Select-Object -First 1 | Sele
ct-Object ReplacementStrings

ReplacementStrings
  ------------------
{C:\Windows\system32\winlogon.exe (FARAWAY), FARAWAY, この理由のタイトルが見つかりません, 0x500ff...}

このように表示されます。さて、この項目なんですが、実は「PSCustomObject」と呼ばれる、その名の通り、オブジェクトです。(詳細は省きますので知りたい方はぜひ調べてみてください)
なので、このようにすると中身が出てきます。

PS C:\Windows\system32> (Get-EventLog -LogName System | Where-Object{$_.EventID -eq 1074} | Select-Object -First 1 | Sel
ect-Object ReplacementStrings).ReplacementStrings
C:\Windows\system32\winlogon.exe (FARAWAY)
FARAWAY
この理由のタイトルが見つかりません
0x500ff
電源を切る

NT AUTHORITY\SYSTEM

そして、この項目、実は配列になってます。型を取得するとSystem.String[]と出てきますので、添え字をつけて取得することができるわけでございます。

PS C:\Windows\system32> (Get-EventLog -LogName System | Where-Object{$_.EventID -eq 1074} | Select-Object -First 1 | Sel
ect-Object ReplacementStrings).ReplacementStrings[0]
C:\Windows\system32\winlogon.exe (FARAWAY)

このように。さて、これで準備はできました。あとはもうコードを書くだけです。

インターネットにつながっているか確かめる

ここまで読んだ方は「スタートアップ時にメールを飛ばす」ほうのコードによくわからん関数が入ってることに気が付くと思います。

これは、インターネットにつながっていない状態でこのスクリプトが実行されたとき、「送れなかったーすまん」って言って何もしないで終わることを防ぐためのものです。

ここでインターネットにつながっているかどうかを確認して、つながっていなかったら10秒待って再確認する……というのを30回繰り返してます。
さらに、30回繰り返しても(=5分)つながらない場合は5分間待ってもう一回SendStartupMail関数を呼び出し、接続状態を確認する……というのをこいつは延々と繰り返してます。

これに関してはGet-NetConnectionProfileで調べてみてください(投げやり)

今後やりたいこと

これで最低限のことはできるようになったのですが、いろいろ調べていくうちに、実はシャットダウン時の地点ですでにそのシャットダウンに関する情報が取得できるんじゃないかとか、電源ボタンを押すタイプのシャットダウンは挙動が違うとか、まあいろいろと見つかりまして、さらに良い感じのスクリプトを作りたいですね

久しぶりにこんなに長い記事書いた

なんかアウトプットしなければ(使命感)となったのと、この手の記事が見つからず……
ぜひ試してみてください!

引越の話

この記事はUEC Advent Calendar 2016の19日目の記事です。

www.adventar.org

昨日の記事は2_sacさんで『UECコミュニケーションミュージアムっていう素敵な場所』でした。私は申し訳ないことにキャリア(以下略)で一回行ったのみですね。

 

引越しました

まだ契約があと3~4カ月くらい残って居ましたが引っ越しました。理由はDentoo.LTとかいうやつの一番新しいやつを見ればもしかしたら何か分かると思います。

そんなわけで、引っ越した理由とか物件選びとかその辺の話は長くなるので、今回は引っ越しをして思ったことをつらつらと書き連ねていきます。

引っ越し業者の見積もり

引越をするとき、選択肢として自力(及び友人に手助けをもらいながら)で運ぶという選択肢と業者に頼むという選択肢があります。私は主にでかい書斎机と大量の本、そして死にかけの腰の保護のために業者に投げることにしました。

おそらくこの記事を読んでいる方は何か自宅にネット回線を引いているはずです。フレッツ光だと、回線の移転手続きと併せて一括見積をかけられ、尚且つ引っ越し代金が少し安くなったりします(ステマ)。のでそれを使って見積もりを出すことに。

その結果、5社中3社から返答があり、1社は「単身は電話見積もり」ということで電話見積もり、そのほか2社が実地見積もりに来ることになりました。その結果ですね。

 

A社営業「すごい荷物量ですね。物件サイズと荷物量が釣り合ってませんね。これは……2tロングじゃないと無理ですね。単身パック?何を仰る」

 

B社営業「はぁ……本がすごく多いですね。ざっと……本だけで(段ボール)30(箱)はありそうですね。これはトラック2台ですかね。単身パック?寝言は寝て言ってくれ」

 

※少しフランクにしてあります。実際は多少オブラートに包まれております

 

というわけで。

単身パック断られました!!!!!

わかるよ、わかる。厳しい。

さらに、引っ越し前の物件が6畳一間だったわけですが、そんな荷物量、自分で梱包したら生活スペースがなくなります。結果、梱包込みのプランを契約することとなりました。お値段は5~6万くらいとなりましてまあ高い高い。(注:普通は3万くらいで収まります)

なお、電話見積もりの場合、電話で料金を言われても、実際に引っ越しの作業をしてみないと値段が分からないので、見積もりより高くなる話はよくあるそうですので皆様お気を付けを。

 

ちなみに、契約後、契約を結んだ会社の営業さんに、「もし今後また引っ越すことがあったら絶対電話見積もりで取っちゃだめですよ、この量の荷物は電話口ではわかりませんから」とアドバイスをいただきました。ありがとうございます。

 

計算機は自分で運んだの巻

よし、引っ越しということで、梱包込みのプランなので私は当日まであまりやることがありません。但し。計算機は自分で運びました。

理由としては、引越時の補償制度にあります。

PCは万が一引っ越し時に物理的破損をした場合は当然補償してもらえますが、データの分は補償してもらえません。しかも大抵の引っ越し業者の方が「PC」と言われて想定するのはメーカー製の少し大きなPC。

まさかHDDが5台も載ってるミドルタワーPCなど想像もしないだろう。

簡単に言うと「危ない」という事です。彼らは引っ越しのプロであって物流のプロではありませんので、そんなへんてこPCなど見たことないはず。というわけで

f:id:hinananoha:20161219220331j:plain

こんなステッカーをレンタカーにつけて運びました。自分がこんな車見たら絶対近づきたくない

フォントに見覚えがある方は仲良くなれそう。

業者に梱包お任せプランはよほどのことがない限りは使わないほうがいい

まあよほどのことだったので今回使ったのですが。

私は親の仕事の都合で引っ越し自体は10回近くしていたのですが、自分のみの単身引っ越しはこれが初めてです。(こっちに来るときは親の車に乗せて来たのでちょっと事情が違う)

で、いつもなら梱包は自分でやってるのですが、梱包後の部屋がこんな感じになるので

f:id:hinananoha:20161219220823j:plain

(完全に風呂とトイレと台所のある倉庫状態)

業者に梱包をお願いしました。ただこれ、一つ穴がありまして。

梱包作業は当然、私が見てる前でやるのですが、いかんせんどこに何を入れたかわからなくなる。

業者の方にとっては文庫もハードカバーも新書もラノベもコミックス単行本も雑誌も同人誌も全部『本』なのですが、それをすると開梱作業の時に死にます(死にました)

当然シリーズや出版社・作者の概念なんてないのであっちゃこっちゃに箱が飛び散ります。

別に業者の方が悪いわけではありません。箱にきれいに詰めようとすればそうなります。

ただ、そういうのが気になる方は可能な限り自身で梱包されたほうがいい、という事を学んだ経験でした。

 

物件サイズが広くなると家具が増える

何を言ってるんだお前というそこのあなた。そのうち分かります。

部屋が狭いと無理矢理物を置くので家具ってあんまり増えないんですよ。

でも、広くなると、無理やり置けなくなるんです。どういうことかというと、無理やり置くために詰めたくても詰められないので何らかの家具を設置しておくしかないという事なのです。(床に電子レンジとか置いてあっても平気な方はこの項目は読まなくていいです)

その結果、家具の買い足しだけで50k近く吹き飛びました。すげぇ財布が寒い。

ちなみに、物件サイズが広くなる場合もですが、以下の場合も家具が増えます。

  • 洗濯機がない(共用等)物件から洗濯機が必要な物件に引っ越した時(※洗濯機そのものは考えないとする)
  • 風呂トイレ一緒の物件から風呂トイレ別の物件に引っ越す時
  • 1Rでキッチンと部屋が直結していた部屋から1K以上のキッチンが分離されるタイプの物件に引っ越した場合

これらのパターンの場合、必要とされる家具が全然違うので、増えます(若しくは処分費用が嵩みます)。

今回の引っ越しは1Rから2DK(!?)へ引っ越して、しかも洗濯機が前の物件は共用で尚且つ風呂トイレ一緒だったのが今回は洗濯機が必要となり、風呂トイレ別となりましたので、見事全部当てはまりました。

家具が増えるのは想定外でしたが、いい勉強になりました。

 

まとめ

何の話をしたかったのかよくわからんですがまあこういう感じです。

部屋も広くなり、周囲も静かで、圧倒的優勝みの深いオタクライフが暮らせそうです。

 

おまけ

ちなみにおまけですが、この物件、お風呂が『バランス釜を無理やり外しましたwwwww』って感じの物件です。皆さんバランス釜ってご存知ですか?あのハンドル回しながら点火するやつです。と書こうとしたら最近のバランス釜はコンロみたくつまみを回すだけで点火するらしく、年齢的には若いはずなのに謎のジェネレーションギャップを感じずにはいられませんでした。

昔(小学校及びそれより前時代)住んでいたマンションがかなりぼろかったお陰で割とそういった経験を全部しており、不動産屋にも「こんな渋い(オブラートに包んだ表現)物件で大丈夫ですか?」と言われたのですが全然平気です。優勝できます(?)

 

 

明日はEtheldreda_33rさんで『勤労学生という選択肢』です。

皆さん確定申告はしていますか?私は毎年しています。勤労学生、わかりますという感じです。

 

 

dentoo.lt #14 その後

dentoo.lt #14

登壇しました(今更)

atnd.org

話した内容

dentoo.ltの発表をご覧になってない方はこちらのスライドをぜひご覧ください。

www.slideshare.net

www.slideshare.net

LT中の事故

LTをご覧いただいてた方はご存知かと思いますが、実は実演中に某書籍(表紙で女子高生二人が並んで中指を突き立ててる本)で試したところ、Amazon APIで取得できないという事故が発生しました。

当初は「あの本はきっと竹○房の陰謀で消されたのだ」と言ってましたが、その後原因が発覚しました。

ISBNコードはユニークであるがしかし……

上のLTでもお話しましたが、ISBNコードは例外なくユニークなため、1つのISBNコードで複数の書籍が引っ掛かることはまずありません。これは、日本図書コード管理センター発行の「ISBNコード/日本図書コード/書籍JANコード 利用の手引き」にも記載があります。

⑵出版者記号は流通上及び書誌管理上、特定の出版者名称と密接なつながりを持ち、取引情報や書誌情報の信頼性を保持するために重要な要素として扱われます。

(中略)

すでに当センターに ISBN 出版者記号を登録済みの出版者と同一の「出版者名称」を使用しての登録は、避けていただいております。

 

第三部②「出版社記号に関するルール」より一部引用

(3)発行済の書籍出版物に一度でも付与したことのある ISBN コードは、たとえその書籍が絶版扱いとなったとしても、あるいは未来永劫に増刷・重版をする予定がない場合でも、新たに発行する別個の書籍出版物に対して重複して付与することはできません。

 

第三部③「書名記号に関するルール」より一部引用

 つまり、これだけを見れば、ISBNコードで書籍を検索して、複数のデータが引っ掛かるわけがない。つまり、Amazon APIでの蔵書検索の結果はISBNコードがデータにあるかで判定ができる、ということでそれで判定を行っていました。

しかし、Amazonでは1つのISBNコードで紙の書籍とKindle本の両方の情報が返答されていることが発覚しました。

f:id:hinananoha:20160622224724p:plain

このような返答が帰ってきたわけです。この時、私は取得したXMLから情報を抽出するPHPコードを以下のように書いていました。

function returndata(blog)

この時格納されるのは1つ目のItem、つまりKindle本の方ということになります。

そして上のXMLをご覧いただくと、Kindle本の方にはEAN(ISBN)が存在しない。これによって「本がない」と判定されていたわけです。

判定が必要

というわけで、このような場合に(複数のItemが返された場合)Kindle本でなくちゃんと書籍を判定して返す必要があるわけです。

……という続きの話は今度また次のdentoo.ltでやるか、記事を書こうと思います(できたっちゃぁできた)

 お前最近記事全然書いてなかっただろ

ごめんなさい、いろいろと立て込みましてね……今度はちゃんと書きますから、勘弁してください。

 

 

OpenLDAP+freeradius+Sambaのアレの続き(雑)

何の話ですか

ご存知ない方はまずこちらをどうぞ

blog.estel-freesia.moe

要はUbuntuでfreeRadiusとOpenLDAPSambaを使ってWPA2-Enterprise(PEAP/MS-CHAPv2)な認証サーバを構築しようというアレです。

Samba、いらなくね?」

この構築をしたのは完全新規環境(LDAPもこれから構築するよーみたいな)を想定していたのでこんな感じで書いていたのですが、その後、既存環境に新たに追加する案件が発生して、そこで出たあれです。

実はこのsmbldap-toolsとSamba+LDAPなあれ、本来はActiveDirectoryを構築するためのもので、MS-CHAPv2に使うにはちょっと過剰設定だったかなとは思っていたのですが、sambaNTPasswordを作るにはこれしかないしなぁと思っていたのです。

ところが。

???「sambaNTPassword、rubyで作れるぞ」

との。……あれ、これSambaいらなくね?

落ち着け、まだ慌てるような時間じゃない

そんなわけで、OpenLDAP+freeradiusな環境でLDAPに追加されたSamba特有の項目のうち、何が必要なのかを精査しました。その結果、

必要だったのはSID(これはsambaSamAccountの必須項目)とsambaNTPasswordだけだったとか言うすっとこどっこいな結末。

その挙句SIDなんてぶっちゃけなんでも大丈夫と言う結末になり、もはや何が何だか。

Sambaもsmbldap-toolsもいらなかったんや!!

いやー、まさかのどんでん返しですよ。うそやん、お前何言ってんのという感じです。

通常のLDAPにユーザを追加するldifにsambaSamAccountの項目と上の二つの項目をいい感じに設定したらできるとか……私の時間返してくれ……

悔しいので

rubyちょっと勉強してrubyでNTPassword作るアレの構造がわかったらまた記事書こうかなとか。なんか本当悔しいですよ、はい。

尊さを補給したい

最近尊さをいくら補給しても足りないので、尊さを直接静脈注射して補給したいなとか思ってますのでどなたか知見をください。

ファイルシステムのお話をするとは言ってない

最初に言っておきますが別に専門的なことをお話するわけではないです

このサイトは「雑な」ことをつぶやくだけですので、まあTwitterの文字が多くなった版みたいな感じで。

今日の話はこれ

NT File System - Wikipedia

はい、みなさんご存知、NTFSです。そもそもなぜこんな話になったかと言うとですね……

これです。

 なるほど、そんなものがあったのか、とか思いながらいろいろ調べてたわけですよ。そしたら。

他のOSからNTFSを「安全確実に」読み書きすることは事実上不可能

えっそれまじ!?え、でもlinuxで"mount -t ntfs"ってできるやん!!とかそう思ったのですが、どうやらあれは有志のおかげで不完全だけどできるようになってるだけだよーとのこと。

はえ―知らなかった―。

 

……はい、それだけです

人、それをネタ切れという

そうだよ(真顔)

近況報告としては昔販売をやってた頃は疲れは比例関数的な増加だったはずなのですが、最近疲れが指数関数的に増加するようになって、修復するのに土曜日1日ダラダラ過ごさないとできないようになってしまいました。

後は腰の痛みが慢性化してきました。誰か腰の痛みを直す方法を教えてください。