Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

PowerShellのPython3で文字列をおくりたいけど文字コードがcp932になっていて面倒なとき

最近は客先のWindowsで作業する事がおおくなりました。
PowerShellがソコソコ使えるので何とかなってますが、時折妙なクセがあったりしますね。
今回はそんな変なクセの一つ、Pythonの標準文字コードがなぜかSJISになってることと、その対処について。

実際のところ

PowerShell上のPythonで16進数を送ろうとしたところ、こんなエラーが。

> python3 -c "print('\x80\x00\x02\xfb...\x00\x02')" | yourprocess
Traceback (most recent call last):
  File "<string>", line 1, in <module>
UnicodeEncodeError: 'cp932' codec can't encode character '\xfb' in position 7: illegal multibyte sequence

cp932……ようはM$様のオレオレSJISにそんなコードはないというているのですが、こちらだってオマエなど指定した覚えはないんですよ。

Pythonのデフォがcp932になっているせいなので、お利口さんなら環境変数を直すところでしょう。
ただ、私は経験上Windows環境変数を弄って幸せになれた試しがないので、ここはオプションでかわそうとおもいます。
ここで活躍するのが"-X" utf8"オプション。
ヘルプによると、

-X utf8: enable UTF-8 mode for operating system interfaces, overriding the default
locale-aware mode. -X utf8=0 explicitly disables UTF-8 mode (even when it would
otherwise activate automatically)

とあり、OSの設定を上書きしてUTF-8で書いてくれるすぐれもの。
実際にワンライナーでやるとこんな感じ。

> python3 -X utf8 -c "print('\x80\x00\x02\xfb...\x00\x02')" | yourprocess

【読書メモ】運用☆ちゃんと学ぶ システム運用の基本

運用☆ちゃんと学ぶ システム運用の基本

運用☆ちゃんと学ぶ システム運用の基本

シス管系女子のおすすめ本にあったので併せて購入。
タイトル通り、システム運用の本なのですが、軽い目な表紙&挿絵&組版に反してイズムが濃い。
全体的なノリが、いい意味で技術書展の発行物みたいな感じ。

ちゃんとポリシーをもって運用しましょうね指示待ちはダメよ

【読書メモ】まんがでわかるLinux シス管系女子 2(日経BP Next ICT選書)

前に紹介したシス管系女子の続編。
内容はさらに踏み込んでシステム管理業務で実際あるあるな小ネタがそろってます。
定期的にscpでバックアップしたいとか、別々のサーバーにあるデータをよろしく回収するアプローチの考え方*1とか。

都度都度調べて覚えてきたクチなので、今回も知らないネタが結構ありました。

*1:集計と報告は各サーバーにやらせて、とりまとめサーバーが作業ディレクトリにあるやつを集計する

RasPi 3B+ とOpenCVによる色範囲の抽出 その1:HSV色空間のフィルタツールをやってみる

Raspberry Pi 3B+ とWaveshare社OV5648USBカメラをつかって、
MaixBit + MaixPyでやっていた事を再現するという目標。
shuzo-kino.hateblo.jp

実際のところ

公式の閾値サンプルをもとに、一枚の画像の閾値を弄るサンプルとして改編。

import cv2 as cv

max_value = 255
max_value_H = 360//2
low_H = 0
low_S = 0
low_V = 0
high_H = max_value_H
high_S = max_value
high_V = max_value
window_capture_name = 'Video Capture'
window_detection_name = 'Object Detection'
low_H_name = 'Low H'
low_S_name = 'Low S'
low_V_name = 'Low V'
high_H_name = 'High H'
high_S_name = 'High S'
high_V_name = 'High V'

def on_low_H_thresh_trackbar(val):
    global low_H
    global high_H
    low_H = val
    low_H = min(high_H-1, low_H)
    cv.setTrackbarPos(low_H_name, window_detection_name, low_H)

def on_high_H_thresh_trackbar(val):
    global low_H
    global high_H
    high_H = val
    high_H = max(high_H, low_H+1)
    cv.setTrackbarPos(high_H_name, window_detection_name, high_H)

def on_low_S_thresh_trackbar(val):
    global low_S
    global high_S
    low_S = val
    low_S = min(high_S-1, low_S)
    cv.setTrackbarPos(low_S_name, window_detection_name, low_S)

def on_high_S_thresh_trackbar(val):
    global low_S
    global high_S
    high_S = val
    high_S = max(high_S, low_S+1)
    cv.setTrackbarPos(high_S_name, window_detection_name, high_S)

def on_low_V_thresh_trackbar(val):
    global low_V
    global high_V
    low_V = val
    low_V = min(high_V-1, low_V)
    cv.setTrackbarPos(low_V_name, window_detection_name, low_V)

def on_high_V_thresh_trackbar(val):
    global low_V
    global high_V
    high_V = val
    high_V = max(high_V, low_V+1)
    cv.setTrackbarPos(high_V_name, window_detection_name, high_V)


cv.namedWindow(window_capture_name)
cv.namedWindow(window_detection_name)
cv.createTrackbar(low_H_name, window_detection_name , low_H, max_value_H, on_low_H_thresh_trackbar)
cv.createTrackbar(high_H_name, window_detection_name , high_H, max_value_H, on_high_H_thresh_trackbar)
cv.createTrackbar(low_S_name, window_detection_name , low_S, max_value, on_low_S_thresh_trackbar)
cv.createTrackbar(high_S_name, window_detection_name , high_S, max_value, on_high_S_thresh_trackbar)
cv.createTrackbar(low_V_name, window_detection_name , low_V, max_value, on_low_V_thresh_trackbar)
cv.createTrackbar(high_V_name, window_detection_name , high_V, max_value, on_high_V_thresh_trackbar)

while True:
  frame = cv.imread("image000.jpg")
  frame_HSV = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
  frame_threshold = cv.inRange(frame_HSV, (low_H, low_S, low_V), (high_H, high_S, high_V))
  cv.imshow(window_capture_name, frame)
  cv.imshow(window_detection_name, frame_threshold)

  key = cv.waitKey(25)
  if key == ord('q') or key == 27:
    cv.destroyAllWindows()
    break

起動した直後はこんな感じ
f:id:shuzo_kino:20200918210527p:plain

スライダーを動かすと……
f:id:shuzo_kino:20200918210727p:plain

参考もと

docs.opencv.org
pypi.org

TeraTermからX Windowポートフォワーディングを実行する

NIX系のSSHコマンドなら”-X”でいけます。
じゃあtera termではどうするか。
WindowsにX Server(今回はXming)をいれて、Tera TermからSSH転送をかける。

実際のところ

Tera Term側の設定

「設定」=>「SSH転送」

出てきた画面でローカルの転送をチェック
f:id:shuzo_kino:20200910221209p:plain

X server 「Xming」の導入。

みんな大好きchocolatelyで導入。

> choco install xming

実際にうごかす

Xmingが起動している状態(バックグラウンドでも可)で

X11についてるブラウザをためしに起動してみます。

$ x-www-browser
 --disable-quic --enable-tcp-fast-open --ppapi-flash-path=/usr/lib/chromium-browser/libpepflashplayer.so --ppapi-flash-args=enable_stagevideo_auto=0 --ppapi-flash-version=
...(しばらく待ち)...

ちょっと重めですが、動かすとこんなかんじ。
f:id:shuzo_kino:20200918135644p:plain

TeraTerm越しだと旨味がないですが、端末も動きます。

$ x-terminal-emulator

f:id:shuzo_kino:20200918140144p:plain

Chocolateyの本体/パッケージをアップデートする

Usage

choco upgrade [ ] []
cup [ ] []

NOTE: `all` is a special package keyword that will allow you to upgrade
all currently installed packages.

Skip upgrading certain packages with `choco pin` or with the option
`--except`.

実際のところ

本体/個別

choco upgrade chocolatey

全部

全部やるオプションも。
chocolatey経由でないVNC viewerもこれでアップデートされたのでパスでみてるのかも。
ROS windows版はされなかったので、何でもってわけにはいかなそうですが。

> choco upgrade all

参考もと

chocolatey.org