雑な hinananoha

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

起動時とシャットダウン時にメールを飛ばしてくれる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日ダラダラ過ごさないとできないようになってしまいました。

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

授業の板書考えるの大変なんだなぁと

唐突にどうした

某所で順番に講義みたいなことをすることになりまして。弊学の学生ならおそらくそういう時はスライドを作って……という感じなんですが、「スライド禁止、黒板を使う事」とのお達し。他の方々は、ちょこちょこ必要な図をメモ的な感じで黒板に書くのですが、理解が進まないし、何しろそれだとあまりにもさらっと流しすぎて良くない。そう思って自分のときは授業よろしくかっちり板書書いてやろう、そんなことを考えました。その結果の感想です。

90分できれいに終わらせかつ内容を理解してもらう

山ほど時間があるのであれば、超ゆっくり黒板書きながらそれこそ全部書けばいいのですが、時間は90分、だけど内容は理解できるように。何だったら黒板を写しただけでもある程度板書の体裁が成り立つように、となるとこれが難しい。私は教職課程などは受講してないので、自己流で

  • ルーズリーフ何枚で何分相当なのか
  • 何を書いて何を口頭だけで説明するのか
  • 図はどれくらいのスペースを取るのか
  • ここからここまでは同時に黒板にいてほしい

みたいなことを考えながら作ろうと思ったのですがまあ難しい。一番わからないのが時間配分。たくさん書いたはいいけどこれ時間以内に終わるのかなぁという。

実は結果、すごくきれいにぴったり90分で終わり、我ながら完璧だなぁとなったわけですが偶然です。

話し方自体は販売員時代の経験などでそこそこ自身はあったのですが、さすがに黒板を使って板書を書きながらだとはたしてどうなのだろうという感じでしたね。

授業の板書考えるの大変なんだなぁ……(再帰

まあ、そういうわけです。

皆さんも機会があればぜひ一度やってみてください。

いつもにもまして雑な感じ。

今日は華金だ!!!

めでたく禁酒からも解放されたのでサッポロ黒ラベルでも飲んで一週間のヤダを流して良さを高めていきたい。

 

Windows 10に関して思うこと

強制アップグレードで大騒ぎしてますね

ここのところずっと騒がれていたWindows 10への強制アップグレード(?)ですがついに強硬手段に出た、とだいぶあちらこちらで大騒ぎされていますね。

gigazine.net

このことについてこう中々ご賛同はいただけないけどいつも思うことがありつつというかんじなのでまあせっかく雑な何かなので垂れ流そうかなと

Windows XP 騒動を覚えてますか

2014年4月9日に、延長に延長を重ねていたMicrosoft Windows XPのサポートが終了し、かなり大騒ぎになりました。その時期、私は某家電量販店で携帯販売をしていたのですが、大体家電量販店においては携帯電話コーナとPC販売コーナは隣接、及び近いところに配置されていることが多いです。理由はここでは割愛しますが、その関係で私のところにもお客様から「XPが使えなくなるってどういうこと?」みたいな質問がたくさん来ました。

我々情報系の人間であれば、古いOSを使い続ける危険性はもちろん理解してるとは思いますが、特に日本は「古いものを長く大事に使う=良い事」とする方が多くいます。そういった人たちのせい、とまでは言いませんが、そういったことがあのXP騒動に一役を買っていたのも事実かなと思います。XPの次のOSであるVistaが残念な子だったのも理由には上がりそうですが、その次の7が出てからもだいぶたってますので、正直それは理由としては弱い気もします。

で、まあ家電量販店ですらだいぶあの問い合わせで結構対応が大変だったのです、当然大元Microsoftにも(正確には日本マイクロソフト)大量の問い合わせや、恐らくクレームのようなものもたくさんあったと思われます。

Microsoftは慈善事業でOSを出しているわけではない

XP騒動のとき、「サポートが切れて使えなくなるっていうなら無料で新しいのを使わせるべきだ」とか「サポートが切れるなんて聞いてない」という意見を多々耳にしましたが、私はいつも思っていたのはこれです。Microsoftは別に慈善事業でOSを出しているのではありません。あくまで商売として、出してるわけです。そこには企業の収益なども当然考慮しなければならず、古いOSをいつまでもサポートさせるのは当然、古いOS特有のセキュリティホールなども多々あり、それらに対応させるための開発の人員などが必要になるわけです。無茶言うなって話ですね。その結果が……

「OSのサポート打ち切って文句言われるならいっそ無理やりアップグレードさせて新しいの使わせよう」

……まあこうなりますよね。というよりなっても仕方がないっすよね。

正直当然の帰結かなぁと。まだ「サポートいついつまでって言ったけどごめんな、早く切るわ」とバサバサッと切らないだけましかなとか。

恐らくMSは次にWindows 7のサポート終了のときに同じことが起こることを想定したのでしょう。それならその人たちに最新OSを使わせればいい。だけど有料だとたぶんいつまでもやってくれないから期限を切ってやらせよう。

むしろ1年間も無料期間を作ったのすげぇなとか思ってたり。これで引っかからない人たちは何か止むに止まれぬ理由で使わざるを得ないに違いない、そういう人たちはちゃんと自分でその辺の対処をするだろう。そういうことなのだろうなと。

なのでむしろ我々とすれば「今まではウン万円払わなければいけなかったのにタダになった!やった!!」と喜ぶべきなのです(?)

……まあ、全部私の勝手な想像なんですけどね

勝手な想像です、はい。別に中の人に聞いたわけでもありません。

少なくとも、誤ってアップグレードされてしまったなどの事故やアップグレードしたけど重要なソフトが互換性がなかった、というためにアップグレードしてから1か月はもとに戻せるようにしている分だいぶ親切かなと。どっかのリンゴが欠けた会社と違って

まあ、そんなわけで、「勝手にアップグレードするな!!!ふざけるな!!」というのは、正直それの回避もできないような人は言う資格ないんだなとかそんなだいぶアレなことを思ったり。

 

まあ、そんな雑なつぶやきです。

 

もう一度言いますが、これは私の勝手な想像、というよりもはや妄想かもしれない?ことです。このシナリオを信じるかどうかは、あなた次第です。

 

それにしても駄妹は尊い

駄妹ってなに?という人はぜひGoogle先生に聞いてみよう。