エレクトロニクス

 全くの別件で検索していてでてきた18 I2c通信で気圧,標高を取得しよう.(LPS331AP気圧センサ)(http://lumenbolk.com/?p=814)というページではたぶんセンサからI2Cでデータを取り出すところが中心と思います。が、公開されているPythonスクリプト中の2の補数計算(符号付き整数16進→10進変換)をベタ書きしているのを見て妙に気になりました(ページの本筋からは外れます)。補数計算をPython3で関数化するとどうなるか?気になったので作ってみました。私が実際に必要になったときにはまず忘れているのでここにメモしておきます。標準関数でありそうなのに無いらしい。
 符号をMSBから取り出すためにビット位置指定する方法はpythonのビット操作について(http://python-remrin.hatenadiary.jp/entry/2017/05/31/162927)を参考にしました。Pythonのビット演算は少し特殊?かと思いました。確認しながら組み立てていけば問題は無いと思いますが一度に長い処理を書くには慣れが必要かと思いました。
 スクリプトは以下の通りです。全パターンチェックしているわけではありません。たぶん、64bitぐらいまでは大丈夫ではないか?と思います。

""" 2の補数計算 """
# -*- coding:utf-8 -*-
#http://lumenbolk.com/?p=814
#http://python-remrin.hatenadiary.jp/entry/2017/05/31/162927

def calc_2s_complement(bitsuu, nyuuryoku):
    if nyuuryoku & pow(2, (bitsuu-1)): # MSB == 1 (負の数)
        nyuuryoku = -((nyuuryoku ^ (pow(2, bitsuu)-1))+1)
    return nyuuryoku

if __name__ == '__main__':
    print(calc_2s_complement(8, 0x00))
    print(calc_2s_complement(8, 0x01))
    print(calc_2s_complement(8, 0x7f))
    print(calc_2s_complement(8, 0x80))
    print(calc_2s_complement(8, 0xff))

    print(calc_2s_complement(16, 0x0000))
    print(calc_2s_complement(16, 0x0001))
    print(calc_2s_complement(16, 0x7fff))
    print(calc_2s_complement(16, 0x8000))
    print(calc_2s_complement(16, 0xffff))

    print(calc_2s_complement(24, 0x00_0000))
    print(calc_2s_complement(24, 0x00_0001))
    print(calc_2s_complement(24, 0x7f_ffff))
    print(calc_2s_complement(24, 0x80_0000))
    print(calc_2s_complement(24, 0xff_ffff))

    print(calc_2s_complement(32, 0x0000_0000))
    print(calc_2s_complement(32, 0x0000_0001))
    print(calc_2s_complement(32, 0x7fff_ffff))
    print(calc_2s_complement(32, 0x8000_0000))
    print(calc_2s_complement(32, 0xffff_ffff))

 おまけめも)さらに脱線するとPythonでは数値や文字列がimmutableという点にも違和感があったりします。なかなか慣れません。

エレクトロニクス

 大雨やらなんやらで詳細は見ていませんがとりあえずアップデートしました。こういう忙しい時に限って作業が増えるのはいつものことですけどどうしてでしょうか。
WordPress 4.9.7 Security and Maintenance Release(https://wordpress.org/news/2018/07/wordpress-4-9-7-security-and-maintenance-release/)
要望対応と細かい修正だけ Luxeritas 3.2.4(https://thk.kanzae.net/dev/wp-themes/luxeritas/t9785/)
 とりあえず不具合や脆弱な部分は減ったと思います。雨が振り続けているし過去記事でも直そうか…と作業していたところ、
不具合 1 件修正(条件に該当する方はアップデート推奨) Luxeritas 3.2.5(https://thk.kanzae.net/dev/wp-themes/luxeritas/t9809/)がリリースされましたので2連続テーマ差し替えを行いました。今日は私以外503無いようです。

プリウス

 とある道路施設の軒先で夜なのに鳥の鳴き声がすると思ったらツバメの巣がありました。ヒナがだいぶ大きくなってピーピー鳴いているようです。ヒナが巣からはみ出すほど大きくなっているようですと次にここを通るときには巣立っている可能性が高いです。
ツバメの親子
持っていたスマートフォン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になったようです。