プリウス

 とある道路施設の軒先で夜なのに鳥の鳴き声がすると思ったらツバメの巣がありました。ヒナがだいぶ大きくなってピーピー鳴いているようです。ヒナが巣からはみ出すほど大きくなっているようですと次にここを通るときには巣立っている可能性が高いです。
ツバメの親子
持っていたスマートフォンZE520KLのカメラで撮ってみましたけど暗くてブレ気味でした。EXIF情報によるとf/2, 1/8sec, ISO-3200, f=4mmで小さなレンズの限界でしょうか。フラッシュを焚くわけにもいかず(たぶんLEDでは十分な明るさまで届かない)、高さがあって近づくのも難しいので集光能力が高いレンズを付けたカメラでなければ鮮明な画像を撮るのは難しいと思いました。

エレクトロニクス

 先月書いたXSERVERのaccess_log内IPアドレス欄をFQDNへ変換(サクラエディタ+logresolve編)(https://kadono.xsrv.jp/2018/06/06/4658)では一々面倒なのでPython3.6で動くスクリプトを作成しました。Windows10およびCentOS6.9(VirtualBox)上のPython3.6 (CentOS6.9は後から入れる必要あり)で動いています。入力がログファイルで標準出力に逆引き後のログが出てきます。ファイル入力のみでlogresolveとは異なり標準入力からのストリーム動作(?)には対応していません。XSERVERのログが日毎なので私はこれで問題ありません。また、ファイルを2回読みすることで最初は重複削除と逆引きだけ(Max.100スレッド逆引き)行い、2パス目で逆引き結果の文字列置換を行います。仮想ホスト名はこのサイトのURLで決め打ち、変換後のログからは削除しています。

 コードの大半はRuby, Pythonで並列に逆引きを行う(http://0xcc.net/blog/archives/000099.html)で公開されているPython用のマルチスレッド逆引きプログラムです。一部Python2向けの部分などを直しています。DNSの逆引き+タイムアウト待ち時間が処理時間の大半を占めるため、このマルチスレッド処理が無ければ普通にlogresolveを使ったほうが速いと思います。
マルチスレッド処理と結果を辞書で処理するアイデアはpythonでマルチスレッドで処理して各スレッドの結果を受け取る(https://qiita.com/komorin0521/items/c25cfcff89c0b1afe882)を参考にしています。
IPアドレスの重複削除についてはPython Tips:リストから重複した要素を削除したい(https://www.lifewithpython.com/2013/11/python-remove-duplicates-from-lists.html)を参考にしました。紹介されている内包表記など凝った書き方は勉強不足で十分理解できていないため使用していません。
また、IPアドレスの正規表現は5.2.3 IPアドレスのフォーマットチェック(正規表現)(http://www.geolocation.co.jp/learn/program/07.html)を多少変更(修正?)して使用しています。

 ほとんどGoogleで検索して組み合わせるだけでスクリプトが完成しているので大変楽になったと思います。

""" mt-logresolver """
# -*- coding: utf-8 -*-
# http://0xcc.net/blog/archives/000099.html
# https://qiita.com/komorin0521/items/c25cfcff89c0b1afe882
# https://www.lifewithpython.com/2013/11/python-remove-duplicates-from-lists.html
# http://www.geolocation.co.jp/learn/program/07.html
import re
import threading
import queue
import socket
import sys
def lookup(ip_address):
    try:
        return socket.gethostbyaddr(ip_address)[0]
    except socket.herror:
        return ip_address
def resolver(queue, lock, resolver_dict):
    while True:
        ip_address = queue.get()
        if ip_address is None:
            break
        host_name = lookup(ip_address)
        lock.acquire()
        try:
            resolver_dict[ip_address] = host_name
        finally:
            lock.release()
def logresolver(filename):
    queue1 = queue.Queue()
    num_threads = 100
    re_pattern_1 = re.compile(r"^kadono.xsrv.jp ((([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])) (.*)")
    resolver_dict = dict()
    ip_address_list = []
    fp = open(filename, 'r')
    for line in fp:
        pattern_1 = re_pattern_1.search(line)
        if pattern_1:
            ip_address = pattern_1.group(1)
            if ip_address not in ip_address_list:
                queue1.put(ip_address)
                ip_address_list.append(ip_address)
    fp.close()
    lock = threading.Lock()
    for i in range(num_threads):
        queue1.put(None)
        thread = threading.Thread(target = resolver, args = (queue1, lock, resolver_dict))
        thread.start()
    thread_list = threading.enumerate()
    thread_list.remove(threading.main_thread())
    for thread in thread_list:
        thread.join()
    fp = open(filename, 'r')
    for line in fp:
        pattern_1 = re_pattern_1.search(line)
        if pattern_1:
            print(resolver_dict[pattern_1.group(1)]+" "+pattern_1.group(5))
    fp.close()
if __name__ == '__main__':
    logresolver(sys.argv[1])

決め打ちにしている部分(最大スレッド数、仮想ホストURL)などまだまだ改良の余地はあると思います。しかし、先延ばしにしているといつ出せるかわからないので見切りで公開します。
※動作チェックはこのサイトのXSERVERログのみでnginxのログ全般で動くかどうかは未確認です。

後日追記)経験上100位ならば問題ないと思いますけど、num_threadsを大きくしてリソースが少ないマシンで走らせるとRuntimeError: can’t start new threadで止まることがあります。その場合はthread数を少なくすると動くようです。Python3.6デフォルトでの限界はPythonとRubyでthreadとfiberをいくつ作れるか検証して見た(https://qiita.com/yohm/items/32e5965cc7b561dc8e4e)によると2048のようです。

エレクトロニクス

 またしても3.2.2をスキップして一個飛びで3.2.3へのアップデートとなりました。仕様変更と機能追加があったようです。が、詳しく読んでいる暇もないのでリンクだけ置いておきます。
404 Not Found の設定機能 + 一部仕様変更 Luxeritas 3.2.3(https://thk.kanzae.net/dev/wp-themes/luxeritas/t9763/)
環境によって PWA でオフラインできない場合の対策を組み込んだ Luxeritas 3.2.2(https://thk.kanzae.net/dev/wp-themes/luxeritas/t9709/)
 一応ログを見た限り更新作業は1分以内で済んでいるので503 (Service Unavailable)になった方はいないはずです。ログを見るとブラウザのキャッシュが効いて無駄なデータ転送が省略されているのがよくわかります。あと、画像検索で高解像度画像だけ持っていった方とか…。

 一方で、404になっていたapple-touch-icon-*.pngって何だろう?(アクセス元IPを見る限り検索ロボではなさそうですが…)調べる暇が無いのでメモっておきます。

プリウス

 少し前に届いていたもののカバンに入れたきり持ち歩いていまいた。途中休憩で停めた駐車場で思い出して2017年版との入れ替えで2018年版をプリウスに載せました。

2018年版の表紙は定番の明石海峡大橋に戻ったようです。

エレクトロニクス

 またしてもZenfone3 ZE520KLのアップデートを行いました。気になったのでGoogleの
Android のセキュリティに関する公開情報(https://source.android.com/security/bulletin/)
を見たところ大量の重要度が高い脆弱性対策などが入っているようです。このページへは設定→端末情報→Androidセキュリティパッチレベルを選択していくとリンクで上記サイトへ飛びます。
アップデート完了時のメッセージによると1806.65になったようです。

プリウス

 先週、洗車していてボンネット内を見てふと思い出したのがスパークプラグの交換時期。

既に文字がかすれて読みにくく鳴っていますけど、3年以上前339872km(https://kadono.xsrv.jp/2015/04/11/3056)+10万kmがプラグの交換時期でした。完全に忘れていたため29496km超過してからの交換となりました。ハブベアリングのように騒音が酷くなったり燃費が極端(>5%)に落ちたりはしていません。ただ、気温や交通状況に埋もれる数%以下で悪化していた可能性はあります。
 また、入庫回数を減らすため他の整備ともタイミングを合わせてオイル+オイルフィルター交換、タイヤローテーションも同時に依頼しています。タイヤローテーションは現在のタイヤ(BluEarth AE-01F 4セット目)に変えてから2回目で累積の作業工賃だけでタイヤ1本分の買値を超えました。それでも、同じ場所に負荷を掛け続けて偏摩耗するのを避けるために依頼しています。
コストダウン(?)か交換時期シールは無くなりました。
近況。
 夕方、作業完了の電話を受けて京都トヨペットへ行き、軽く確認の試走をしました。

Prius ODD Meter 469296km. (入庫時)

エレクトロニクス

 過去記事の修正作業だけで手一杯で3.2.0と3.2.0.1の2つのバージョンをスキップして3.2.1へのアップデートとなりました。
 アップデート内容の詳細はWeb Font を設定してると AMP エラーが出る不具合修正 Luxeritas 3.2.1(https://thk.kanzae.net/net/wordpress/t7875/)を参照してください。3.2.0.1から3.2.1での変更はタイトルの一件だけのようです。
 3.2.0でPWA(Progressive Web Apps)に対応したとのことですけど、このサイトで新機能を設定する余裕など無いためデフォルト(無効)のままスルーです。どうやって使うのかを調べる余裕もありません。
 余裕がなくてもやらなければならないこともあるため以下を実施しました。
エックスサーバー社からのお知らせ推奨PHPバージョン変更のお知らせ(https://www.xserver.ne.jp/news_detail.php?view_id=3163)に基づき、PHP7.1.18からPHP 7.2へ切り替えました。
WrdPress のセキュリティ強化方法(https://thk.kanzae.net/net/wordpress/t7875/)を読んで変更をいくつか(記事への影響はありません。詳細は非公開です)。

エレクトロニクス

 対応が追いつかず3.1.4はスキップしました。早速アップデート用テーマの出番だと思ったので使用してみました。テーマ切り替えにより存在しないURLが検索結果に出る事を抑止できたかと思います。zipを展開してsftpで上書きするのとブラウザだけで作業が完結するのとどっちが確実で楽かは微妙なところです。
 nginxのログを確認したところ以下のようにチェックしにアクセスした私としつこいロボットが合計5回503になっていました。
GET / HTTP/2.0″ 503 371 …
 アップデート内容の詳細は開発元のカスタマイズの組み合わせによる不具合の修正とか Luxeritas 3.1.5(https://thk.kanzae.net/dev/wp-themes/luxeritas/t9613/)を参照してください。
 ver 3.1.4からIntersection Observer (画像の遅延ロード機能)に対応したそうなのですけど効果確認などをしている時間が無いためさしあたって設定は変えずdisableのままスルーします。

エレクトロニクス

 kadono.xsrv.jpに接続してこの記事を読めているということはTLS1.2に対応したブラウザを使用しているはずです。最近バタバタしていて放置状態だったethOSを起動して以下のコマンドで確認を行いました。コマンドはQiitaのcURL, OpenSSLコマンドでTLSのバージョンを指定する方法(https://qiita.com/Esfahan/items/53399964cb76cdb87e60)という記事を参考にしました。

$ curl --head -s -v --tlsv1.2 https://kadono.xsrv.jp > /dev/null
* Rebuilt URL to: https://kadono.xsrv.jp/
# 中略、URLの表記を直されました。
* SSL connection using ECDHE-RSA-AES128-GCM-SHA256
# 中略、TLS1.2指定ではデータが読み出せました。
$ curl --head -s -v --tlsv1.1 https://kadono.xsrv.jp/ > /dev/null
# 中略
* error:14077102:SSL routines:SSL23_GET_SERVER_HELLO:unsupported protocol
* Closing connection 0
$ curl --head -s -v --tlsv1.0 https://kadono.xsrv.jp/ > /dev/null
# 中略
* error:14077102:SSL routines:SSL23_GET_SERVER_HELLO:unsupported protocol
* Closing connection 0
$ curl --version
curl 7.35.0 (x86_64-pc-linux-gnu) libcurl/7.35.0 OpenSSL/1.0.1f zlib/1.2.8 libidn/1.28 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smtp smtps telnet tftp 
Features: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP

 TLS1.0, 1.1ではエラーになり1.2では接続できているので予告通りTLS1.0/1.1の無効化が実施済みのようです。
 ethOSにcurlが付いていたのは楽ですけど2014年1月リリースでバージョンが古く複数の脆弱性があります。最新版は今年5月リリースの7.60のようです。一方でOpenSSLはopenssl 1.0.1f-1ubuntu2.24で今年3月のpatchが当たっています。ただし、バージョン番号は1.0.1fのまま表示されます($ openssl versionも)。

エレクトロニクス

 朝の出勤途中に歩いていていきなり揺れだし揺れてからSHF32とZE520KLの緊急地震速報が鳴りました。出勤して少し落ち着いてから高槻の辺りが震源と聞いて驚きました。
 SHF32はauのVoLTE SIMが入っていてこれまで何度も緊急速報メールを受け取っています。ただ、今回SIMカード無し(MR05LNとBluetoooth接続)でこれまで一度もETWSが鳴ったことが無いZenfone3 ZE520KLも動いたことであれ?と思いました。少し落ち着いてから画面を見たところ以下の2つが表示されました。多くの方が書かれている通り、両方とも揺れる前には届きませんでした。


Android8へのアップデートで追加された機能のようです。しかし、今回のような直下型では備える時間など無かったためあまり役に立ちません。
 早めに仕事を切り上げて念のためプリウスにガソリンを給油しました。帰ってから確認したところ、自分の部屋で目立った被害は無く机や棚の上の書類など軽いものが落ちたり引き出しが出た程度でした。引き出しや戸棚には対策が必要かもしれません。

 なんだかんだの対応で疲れました。とりあえず、私は無事です。