WordPressのバックアップ

プラグイン「All-in-One WP Migration」を利用してwordpressのバックアップを試してみました。エクスポートのメニューからバックアップされたのファイルのサイズは、400MB強でした(PCへダウンロード)。

手順:

  • バックアップしたファイルのリストアーを試すために、別のSDカードへ新規にWordpressをインストール。
  • バックアップファイルは大容量となるので、php.iniを修正してアップロードの上限を拡大
  • 新規にインストールしたWordpressへ「All-in-One WP Migration」プラグインだけをインストール。(コンテンツなし。テーマやほかのプラグインの追加・設定なし)
  • Backup元で「All-in-One WP Migration」プラグインを利用してバックアップ(エクスポート)
  • BackUp先で、「All-in-One WP Migration」プラグインを利用してバックアップしたファイルをインポート。

SplunkでWindos Defenderのログを解析

SplunkでWindowsのイベントログを閲覧できるまで設定が終わっていることを前提;

SplunkのAPP 「TA for Microsoft Windows Defender」をSplunkへ導入し、Windows側のUniversalForwarderのinputs.confに次を追加する。

[WinEventLog://Microsoft-Windows-Windows Defender/Operational]
disabled = false
blacklist = 1001, 1150, 2011, 2000, 2001, 2002, 2010

UniversalForwarderを再起動すると、Splunkのサーチでソースタイプとして”WinEventLog:Microsoft-Windows-Windows Defender/Operational”が見えるようになる。

Raspberry PiへUniversalForwarderをインストール

インストールの手順: https://www.splunk.com/ja_jp/blog/tips-and-tricks/how-to-install-universal-forwarder-01.html

DownloadのLINK: https://www.splunk.com/en_us/download/universal-forwarder.html

インデックスサーバへ転送するための設定:

indexerの設定(PORT 8089)

/opt/splunkforwarder/bin/splunk add forward-server <INDEXER_IP>:<INDEXER_PORT>

モニター対象のファイル設定

How to install Splunk Forwarder on Ubuntu

例:$sudo splunk add monitor /var/log/apache2/access.log

モニター用のコマンド
[sudo] $SPLUNK_HOME/bin/splunk add monitor <取り込みファイルorディレクトリパス> [-パラメータ 値]

OSの起動時にsplunkを起動する設定

/opt/splunkforwarder/bin/splunk enable boot-start

FAT32のUSBをUbuntuへマウントしてoutlookのメール(*msg)を解析する

必要なツールをインストール
$ sudo apt install mpack
$ sudo apt install libemail-outlook-message-perl libemail-sender-perl

/dev/sdb1 がFAT32のUSBで、/mnt/tmpへマウント
mount -t vfat -o defaults,utf8 /dev/sdb1 /mnt/tmp

msgファイルをemlへ変換
$ msgconvert *.msg

*emlファイルが生成されるので、emlファイルを解析
$ munpack *eml

raspberry piでマルチブートを試してみる

raspberryPiで利用できるマルチブートの環境として、PINN(PINN IsNotNoobs)Berrybootなどが知られている。

PINNでカスタムOSを利用する手順のリンク

結構煩雑な手順を踏む必要がある。

https://github.com/procount/pinn/wiki/How-to-Create-a-Multi-Boot-SD-card-out-of-2-existing-OSes-using-PINN

PINN用のカスタムOS設定に必要なファイル

https://sourceforge.net/projects/pinn/files/

BerryBoot用に設定されたOSイメージのダウンロードリンク

https://sourceforge.net/projects/berryboot/files/

PINNよりも公開されているカスタムOSの種類が多く、さらに導入手順も比較的容易。実際に試してみたところ、swapをONにする設定ができない模様。

その後の調査でBerryBootのファイルシステムはoverlayとなっていてることがswapを設定できない原因らしい。最近のRaspberry OSでは、swapの設定を/sbin/dphys-swapfileのスクリプトで実行しているが、こんな記事を発見。
[Solved] With overlay of root, swap does not work

解決方法として:

〇dphys-swapfileを利用しない。

〇swapとしてファイルではなく、(overlayとは別の?)デバイスを指定する必要があると理解。

次のように、SSDのパーティションにswap用に4GBを割り当ててみました。

evice     Boot    Start       End   Sectors   Size Id Type
/dev/sda1           2048    262143    260096   127M  e W95 FAT16 (LBA)
/dev/sda2       47955968 468860927 420904960 200.7G 83 Linux
/dev/sda3       39567360  47955967   8388608     4G 82 Linux swap / Solaris

swapファイルの指定は、昔ながらの(?)/etc/fstabに記述します。

/dev/sda3       swap swap defaults 0 0

その結果、4GBのswap領域を確保することができた。

$ free
              total        used        free      shared  buff/cache   available
Mem:        3798908      307284      579676       47612     2911948     3366744
Swap:       4194300           0     4194300

BerryBootでインストールした複数のOS毎に、以上のようにswap設定を変更することで、目的を達成!

ASI ZWOカメラをpythonで利用する

最初にASI_linux_mac_SDK_V1.21をインストール

ダウンロードのリンク 

Software and Drivers

ダウンロードして展開すると;

$ls ASI_linux_mac_SDK_V1.21
demo  doc  include  lib  license.txt
$ls ASI_linux_mac_SDK_V1.21/demo
Makefile  bin  main_SDK2_snap.cpp  main_SDK2_video.cpp  main_SDK2_video_mac  main_SDK2_video_mac.cpp  readme.txt

$cat readme.txt
Please install opencv2 at first, for example under Linux x86 OS, run:
make platform=x86
Below options is supported:
x86(Linux 32-bit)
x64(Linux 64-bit)
armv5
armv6
armv7
armv8
mac32
mac64
mac(32-bit and 64-bit)

If libASICamera2.so or (.dylib) can't be found at run time, resolve by delow two ways:
1.Add a .conf file that contains the path of the library to /etc/ld.so.conf.d/, run ldconfig.
2.Add compile option -Wl,-rpath=<library path>

raspberry pi4 64bit OSの場合 armv8

makeに先立って、demo/binの下へarmv8フォルダーを作る。

/usr/includeの下に、opencv2のファイル一式が必要。

root権限なしでカメラをアクセスできるようにするためのルールを追加

設定ファイル ASI_linux_mac_SDK_V1.21lib/asi.rulesをlib/udev/rules.d または/etc/udev/rules.dへCopyして、カメラを抜き差し。

$cd demo
$mkdir demo/bin/armv8
$make platform=armv8

$ ls demo/bin/armv8/
libASICamera2.so  main_SDK2_video_mac  test_gui2_snap  test_gui2_video

libASICamera2.so を参照できるよう、適切なフォルダーへ配置しldconfig

(あまり良い方法ではないが、/lib の下へlibASICamera2.soをCopy)

Pythonから利用できるようにライブラーをインストール

https://github.com/python-zwoasi/python-zwoasi

#!/usr/bin/env python

import argparse
import os
import sys
import time
import zwoasi as asi

env_filename = os.getenv('ZWO_ASI_LIB')

ZWO_ASI_LIBには、次のパスを設定

$ echo $ZWO_ASI_LIB
/home/pi/python-zwoasi/build/lib/zwoasi

$ ls /home/pi/python-zwoasi/build/lib/zwoasi

__init__.py の内容

"""Interface to ZWO ASI range of USB cameras.

Calls to the `zwoasi` module may raise :class:`TypeError` or :class:`ValueError` exceptions if an input argument
is incorrect. Failure conditions from within the module may raise exceptions of type :class:`ZWO_Error`. Errors from
conditions specifically from the SDK C library are indicated by errors of type :class:`ZWO_IOError`; certain
:func:`Camera.capture()` errors are signalled by :class:`ZWO_CaptureError`."""

import ctypes as c
from ctypes.util import find_library
import logging
import numpy as np
import os
import six
import sys
import time
import traceback


__author__ = 'Steve Marple'
__version__ = '0.1.0.1'
__license__ = 'MIT'


def get_num_cameras():
    """Retrieves the number of ZWO ASI cameras that are connected. Type :class:`int`."""
    return zwolib.ASIGetNumOfConnectedCameras()

Seleniumでスクレイピングの準備

$sudo apt-get update
$sudo apt install chromium-chromedriver
$sddo cp /usr/lib/chromium-browser/chromedriver /usr/bin
$pip install selenium
$pip install webdriver_manager

紛らわしい点:webdriver_managerとwebdrivermanagerの両方が存在し、機能が同じではない。webdriver_managerの方が良さそう。

Webサイトのタイトルを取得してみる。

from selenium import webdriver
import time

#---------------------------------------------------------------------------------------
# 処理開始
#---------------------------------------------------------------------------------------
# ブラウザをheadlessモード実行
print("\nブラウザを設定")
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome('chromedriver',options=options)
driver.implicitly_wait(10)

# サイトにアクセス
print("サイトにアクセス開始")
URL="https://rfsec.ddns.net/db/"
driver.get(URL)
time.sleep(3)
# driver.find_elements_by_css_selector("xxx") 的な処理を自由に
print("サイトのタイトル:", driver.title)

認証があるサイトの場合(中華製ネットワークカメラ)

import time
import base64
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

def get_auth_header(user, password):
    b64 = "Basic " + base64.b64encode('{}:{}'.format(user, password).encode('utf-8')).decode('utf-8')
    return {"Authorization": b64}

# Webdriver ManagerでChromeDriverを取得
driver = webdriver.Chrome(executable_path=ChromeDriverManager().install())

# Authorizationヘッダを付与
driver.execute_cdp_cmd("Network.enable", {})
driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {"headers": get_auth_header("admin", "")})
# Basic認証が必要なページにアクセス
driver.get('http://192.168.68.128')
time.sleep(5)

driver.close()
driver.quit()

数独の問題サイトから問題を取得して、解く。

#  ここからがseleniumのコード
#  問題サイト http://numberplace.net/
#
from selenium import webdriver
import time
import numpy as np

def disp(results):
    msg=""
    for r in results:
        for y in range(9):
            for x in range(9):
                c = r._values[y][x]
                c = str(c)
                d = row2[y][x]
                if d != 0:
                    msg=msg+'('+ c + ') '
                else:
                    msg=msg+'-'+ c + '- ' 
            msg=msg+"\n"
    print(msg)

#---------------------------------------------------------------------------------------
# 処理開始
#---------------------------------------------------------------------------------------
# ブラウザをheadlessモード実行
print("\nブラウザを設定")
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome('chromedriver',options=options)
driver.implicitly_wait(2)

# サイトにアクセス
for num in range(5):
    URL="http://numberplace.net/?no="+str(num+1)
    print("サイトにアクセス開始:",URL)
    driver.get(URL)
    time.sleep(2)
    lines= driver.page_source.splitlines()
    for line in lines:
        if 'toi' in line:
            q = line.split(' ')[3].replace("'","").replace(";","")
            q=list(q)
            #print(q)
            qi = [int(s) for s in q]
            #print(qi)
            q2 = np.array(qi)
            row2=np.array(q2).reshape(-1,9).tolist()
            grid = solver.Grid(row2)
            print(grid)
            results = solver.solve_all(grid)
            disp(results)
            break
print('Done.')

OCRをマルチプロセスで処理

参考にしたサイト

multiprocessing — プロセスベースの並列処理 を参考に試す

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    with Pool(5) as p:
        print(p.map(f, [1, 2, 3]))

時間がかかっているOCR処理のコードを抜きだして関数化。一文字の画像を入力(peace)として、文字認識を行い、結果の数字を返す。高速化のために、事前に数字が入っていないと思われる画像については、OCRせずに、ゼロを返す。また、OCRの結果、数字以外として認識した場合も、ゼロを返す。

def ocr(peace):
    global p_max
# 画像イメージの総和が事前に計算したp_maxより小さい場合にOCRを呼び出す
    if np.array(peace).sum()<p_max: 
        conf='-l eng --psm 6  outputbase digits'
        txt=pytesseract.image_to_string(peace, config=conf)
        txt=remove_control_characters(txt)
        if txt.isdigit():
            ret=int(txt)
        else:
            ret=0
    else:
        ret=0
    return ret

multiprocess導入前のコード

画像81個(=9×9)をfor ループで一枚づつOCRを実行していた。peacesは画像81個のデータ。peaceは画像1個のデータ

my_bar = st.progress(0) # 時間の経過がわかるようにプログレスバーを設定
for peace in peaces:
        t = p_size[n]
        if t<p_max:
            txt=pytesseract.image_to_string(peace, config=conf)
            txt=remove_control_characters(txt)
            try:
                 ans=int(txt)
            except:
                 ans=0
               st.write('Error at:',n,'(',txt,')')
            else:
                 ans=0
            row.append(ans)
            my_bar.progress(int(100*n/80))
            n=n+1

row2=np.array(row).reshape(-1,9).tolist() # 結果を 9x9の形に
st.success(row2)

multiprocess導入後のコード

with Pool(int(CORE)) as p: # COREはセレクターで選んだ数 1,2,4,8,10,12,16,32
     ans=(p.map(ocr, peaces))

row.append(ans)
row2=np.array(row).reshape(-1,9).tolist()
st.success(row2)

結果 Pi4 Ubuntu20.04

$ uname -a
Linux ubuntu 5.4.0-1047-raspi #52-Ubuntu SMP PREEMPT Wed Nov 24 08:16:38 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux
------------------------------
Pool 経過時間
1	  17.721517086029053
2	  12.919192552566528
4	  12.035958051681519
8	  10.886781454086304
12	 10.22145414352417
16	 10.279670715332031
32	 11.4353609085083

rock pi(6 core)

$ uname -a
Linux rock 4.4.154-110-rockchip-gcef30e88a9f5 #1 SMP Mon Jun 22 07:37:10 UTC 2020 aarch64 aarch64 aarch64 GNU/Linux
------------------------------
Pool 経過時間
1	  10.592926979064941
2	  7.96256422996521
4	  5.769669532775879
8	  5.157710552215576
12	 5.265762567520142
16	 5.468385457992554
32	 6.696927785873413

i7-10700K/Windows11/WSL2(8 core 16 thread)

$ uname -a
Linux DESKTOP-P8UNEDG 5.10.60.1-microsoft-standard-WSL2 #1 SMP Wed Aug 25 23:20:18 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
------------------------------
Pool 経過時間
1	  1.669569969177246
2	  0.8932185173034668
4	  0.5116889476776123
8	  0.4094092845916748
12	 0.35788488388061523
16	 0.4156327247619629
32	 0.38041210174560547

----VirtualBOX
1: 2.208763360977173
2: 3.9075162410736084
4: 3.83050274848938

---WSL2 windows11 再インストール後
1: 1.7535254955291748
2: 0.9307124614715576
4: 0.5294575691223145

i7-8750H Windows10/WSL2( (6 core 12 thread)

Linux DESKTOP-NI63ODB 5.10.60.1-microsoWindows11/WSL2(ft-standard-WSL2 #1 SMP Wed Aug 25 23:20:18 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
-----------------------------------
1: 4.477121353149414
2: 2.522892475128174
4: 1.4394028186798096
8: 1.1422605514526367

Core(TM) i7-3770/WSL2(4 core 8 thread)

Linux mars-PC 4.4.0-19041-Microsoft #1237-Microsoft Sat Sep 11 14:32:00 PST 2021 x86_64 x86_64 x86_64 GNU/Linux
----------------------------------
1: 10.84971809387207
2: 6.165481805801392
4: 4.313432216644287
8: 4.449507713317871