CentOS8にはOpenDKIMがないのでEPEL7から拝借

愕然。しかもググっても日本語情報がない。
このためだけにCentOS7に入れ直そうかと思っちゃった。

CentOS8になってsendmailが削除されたのだが(もともとpostfix推奨)、OpenDKIMはsendmail-develに含まれるmilter関係のコードが必須で、それも削除されちゃってるもんだから無いという理屈のようです。英語の掲示板ではOpenDKIMをソースから構築しようにもsendmail-develがねぇじゃんという書き込みがありました。

ならばOpenDKIMが含まれるCentOS7用のEPELから入れればいいじゃないかというので実施。
CentOS 8: Not Ready for Prime Time Mail Server for Us!

※CentOS8ですがまだ慣れてないのでyum使ってます
# yum remove epel-release
↑8.xが削除される
# yum install https://download-ib01.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
↑7用EPELを導入
# yum install opendkim
↑OpenDKIMを導入
# yum remove epel-release
↑7.xが削除される
# yum install epel-release
↑再度8用EPELを導入

警告も出るのでこれがそのまま使えるとは限りませんが、とりあえずOpenDKIM設定して起動はできたし署名もつきました。

ちょっと他のサーバーでは使いづらいな…

CentOS8で名前解決できない(RTX830の下)

新規環境でCentOS8を入れてみたら、名前解決ができない。
digコマンドをたたいてもFORMERRと出て解決できない。
mxが引けないのでメールが送れない…

LAN内でのIPv6が悪いのか?などと思ったが違った。
dig +noedns example.com と、+noednsをつければ引ける。

EDNS、EDNS0という拡張プロトコルで問い合わせをする方式。
digコマンドでは+noednsによってEDNSを使わないで問い合わせする。

つまり、このCentOS8の上位のネームサーバーがEDNSに対応していないことが問題だった。
となれば疑うは上位のルーター。今回はYAMAHA RTX830。

27.4 DNS サーバーを通知してもらう相手先情報番号の設定

ばっちり、ファームウェアアップデートでEDNS対応していた。
Windowsからtftpでrtx830.binを送ってやる。

アップデート完了後
dns server pp 1 edns=on
と設定し、CentOS8側でも名前解決できるようになりました。

NEC Lavieのレスキュー、リカバリ PC-LS150BS1TB

古いPCでも未だに使えている方はたくさんいらっしゃって、Windows7にOfficeでたまに文章を作りするだけならば10年前のパソコンでも十分だったりするのでしょう。
しかしセキュリティやらなんやらを考えたら、このへんの世代のPCなら非対応パーツもそんなにないでしょうし、Windows10にアップグレードして使い続けるのが良い選択しかもしれません。

で、私の手元に依頼されたPC-LS150BS1TB、LS150/Bという機種ですが、2010年6月発売。Windows7 Homeの32bitと64bitが選べる時代のもの。
Windows10にアップグレードして数日使っていたら、ブルースクリーン(Windows10のブルースクリーンはQRコードとか出るんですね!)で起動できず、ntfs.sysがおかしいとか出てくる。

こりゃHDDの故障かなーということで、このHDDは取り外し、リカバリすることに(NECはリカバリと言わずに再セットアップというらしい)。
しかし!持ち主はリカバリディスクを作成しておらず、そしてWindows10にアップグレードしてしまったPCは起動時にF11やら押してもリカバリモードに入れないのだとか!

240GBのSSD。今どき5千円もしない。

途中さまざまな試行錯誤をしたものの、最終的には下記の手順でレスキュー。
・新SSDを装着
・旧HDDのリカバリ領域の中身をコピー。Windows REとNEC-RESTOREの2つの領域があるので、どっちも
・急場しのぎの仮リカバリディスクを作成、工場出荷時に戻す
・ディスク作成ツールで本来の再セットアップディスクを作成
・リカバリ領域なしで全部Cドライブにして再セットアップ
・Windows10へアップグレード
・旧HDDのユーザー領域からデータをコピー、レスキュー

リカバリ領域から再セットアップディスクを作るまで

Windows RE領域もNEC-RESTORE領域も、普段は見えないのだが、これはドライブレターが割り当てられてないためにそうなっているようだ。
とりあえず読めれば良いので、USBメモリにUbuntuを入れてそこから起動、各パーティションの中身を他のUSBメモリにコピーして、別PCに持っていく。

再セットアップディスクはDVD-Rで4枚になるはずだが、とりあえず適当に分割。
disk1には boot、EFI、sourfces、TOOLS32、TOOLS64、bootmgr、BKW7_32.GHO、BKW7_64.GHOを入れておく。
disk2以降はGHSファイルだけ入れておき、最後のディスクにもsources、TOOLSは入れておく。
中身はノートンゴーストなんですねぇ。

Windows PEの起動ディスクを作るための環境を整える。Windows ADKをインストール。
Windows PE (WinPE) – Windows 10 hardware dev
「展開およびイメージングツール環境」を起動し、disk1を起動できるように作る。

Tools>oscdimg -u1 -bC:\LS150B\disk1\boot\etfsboot.com c:\LS150B\disk1\ c:\LS150B\recovery1.iso


OSCDIMG 2.56 CD-ROM and DVD-ROM Premastering Utility
Copyright (C) Microsoft, 1993-2012. All rights reserved.
Licensed only for producing Microsoft authorized content.
Scanning source tree
Scanning source tree complete (224 files in 24 directories)
Computing directory information complete
Image file is 2071724032 bytes
Writing 224 files in 24 directories to c:\LS150B\recovery1.iso
100% complete
Final image file is 2072229888 bytes
Done.

このisoイメージをDVDに焼いて1枚目とする。2枚目以降はただのファイルコピーなのでisoにする必要はない。

この仮ディスクでSL150/Bを起動すると、再セットアップが始まった。
途中で何度かディスクの入れ替えを要求されるが、中のファイルが見つからない場合は全てのディスクで試してみれば、そのうち当たる。


最後のディスクにTOOLSが必要なのは、ノートンゴーストを起動するためなんだろうなぁ。

HDDからSSDでスピードアップするとまだ全然使える気にになりますね!
ということであとは特にトラブルなくインストールが進みました。

Windows7インストール用USBメモリを作る

Windows7機のリカバリの際にWindows7のインストールが必要になり、手元にISOはあれどDVD-Rが無い、ということでUSBメモリからインストールすることに。

Windows 7のインストールUSBメモリを作る(Windows 7 USB/DVD Download Tool編):Tech TIPS – @IT
作成自体は参考記事の通りでできる…はずなのですが、最後に「bootsectを実行できませんでした」とエラーが出でしまう。

Windows 7 のUSBインストーラ作成 ( Windows ) – Web備忘録 – Yahoo!ブログ
bootsect.exeをツールと同じフォルダに置けば良いということだが、やはりうまくいかない。

コマンドプロンプトを管理者権限で起動して、そこからbootsectを実行する。/helpで内容を見れば使い方が書いてある。今回はWindows7(64bit)のインストーラを作成しているので/nt60で

bootsect /nt60 E:

これで無事起動できました。

それにしてもUSBメモリは人に貸したりしてるうちにどっかに行ってしまうもので。
16GBぐらいのメモリはOSインストールにお手頃なので複数買いしておきました。

WebSocketをPHPで使う、ループ処理も

webブラウザにリアルタイムに変化する情報を表示したいなーと思ったら、既存の頭ではAjax通信をSetIntervalするなりして取得する感じでありましたが、なんかHTML5の世はWebSocketなる仕組みが大体のブラウザでサポートされるに至ったようです。

というわけでWebSocketを使って何か作ろうと思い立ちましたが、サーバー側はNode.jsとかを使うのが主流のようで、もう脳内がPHPになっちゃってる人に新規習得させるのもちょっとコストだな、ということでPHPで作ります。クライアント側はJavaScriptだからjQueryでもなんでも良い。

PHPでWebSocketというとRatchetというのが出てきますので素直にソレを使います。というかRatchetしかないよね。

そんなわけでPHP Ratchetで検索するといろんなQiitaとかblogが出てきます。そのままコピペするとバージョン違いで死ぬので参考程度にしておいて、ちゃんと本家のドキュメントでInstallationとHello Worldまで追いかけましょう(英語だけど)。私は孫引きして2時間ぐらい遠回りしました。
Ratchet – What is a WebSocket?

手順的にはcomposerを用意して、ratchetを取得、使うところでrequireしてやります。

# composerの取得
curl -sS https://getcomposer.org/installer | php

# composerの設定
# vi composer.json
{
"autoload": {
"psr-4": {
"MyApp\": "src"
}
},
"require": {
"cboden/ratchet": "^0.4"
}
}
# 0.4にしなくても * 指定で最新指定のようです

# ratchet取得
php ~/composer.phar require cboden/ratchet

あとはとりあえずHelloWorldからコピペして作ります。
telnetで通信するバージョンと、WebSocketで通信するバージョンができますので、違いを学ぶと良いです。
シリアルポートやSocketの通信をしたことがある方はあっさりと理解できると思います。要はSocket通信がWeb上でできるということですので。

server.php側は手続き型のPHPなのにイベントドリブンな書き方になるのでちょっと戸惑いますが、監視ループで処理していく以上はそうなります。

で、HelloWorldではメッセージの送受信が発生して、それに伴う処理を行うところまではできましたが、サーバー側で何かを監視して、サーバー側発でメッセージを送りたい場合はどう書くのか。ググってもなかなか出てきません。

Hello World的には無名関数を即時生成しています

<?php
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat;

require dirname(__DIR__) . '/vendor/autoload.php';
$server = IoServer::factory(
new HttpServer(
new WsServer(
new Chat()
)
),
8080
);
$server->run();

onほげほげメソッド以外に常に何か動かしたい場合、ループ処理の中で実行するコードをChatクラスの中に定義し、$serverに定期的に実行させれば良いのです。

この辺は日本語ソース見つからず、stackoverflowで見ました。
web services – How do I access the ratchet php periodic loop and client sending inside app? – Stack Overflow

<?php
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat;

require dirname(__DIR__) . '/vendor/autoload.php';
$chat = new Chat();
$server = IoServer::factory(
new HttpServer(
new WsServer(
$chat
)
),
8080
);
$server->loop->addPeriodicTimer(5, function () use ($chat) {
$chat->someMethod();
});
$server->run();

$chatを複数箇所で指定する必要があるので、事前にnewしておきます。
$serverのloopにaddPeriodicTimerを使って繰り返し処理を作成、別途Chatの中に呼び出すメソッドを作っておけばOKです。
addPeriodicTimerは小数も設定できるので、ミリ秒単位で実行することもできるみたいですが、正確にミリ秒にはならないかも。
とりあえず0.01秒ごとにmicrotime()の結果をクライアントにだらだと流してみましたが、飛び飛びな感じでした。実機・VMなどの環境にもよるだろうなぁ。

今回、PHPは7.0で実行しました。