あっきぃ日誌

鉄道ブログのような技術系ブログのようななにか

Debian(どれかは知らない)/Ubuntu 18.04のApache2.4でproxy_wstunnelが動いてない

自宅Webサーバー環境でMastodonを立てるにあたり、すでにUbuntu 18.04+ApacheのサーバーからMastodonサーバー(別のサーバーでDocker運用)にリバースプロキシーするようにしていたのですが、なんかストリーミングが動いていない。ログを漁ったらApacheがエラーを出していました。

AH01144: No protocol handler was valid for the URL /api/v1/streaming/public/local (scheme 'ws'). If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.

proxy系のモジュールは有効になっているはずですが。

# a2query -m | grep proxy
proxy_wstunnel (enabled by site administrator)
proxy_http (enabled by site administrator)
proxy (enabled by site administrator)

設定もサンプル通りなので、はて。それにを入れてもエラーになります。なにそれ。

     ProxyPass "/api/v1/streaming/" "ws://192.168.29.14:4000/"
     ProxyPassReverse "/api/v1/streaming/" "ws://192.168.29.14:4000/"

ぐぐると、どうもUbuntuのアップストリームであるところのDebianでバグ報告が1年半ほど放置されているのを見つけました。まあ多分これでしょう。腐ってやがる。

#880195 - apache2: Trying to use ws:// in proxy results in "No protocol handler was valid for the URL /ws .... " - Debian Bug report logs

いくつかWorkaroundは書かれていますが、mod_rewriteの方法は私がクソなせいで設定がループしてしまう状態。ちなみにバグレポートの「RewriteCond %{HTTP:Connection } Upgrade [NC]」はこれはこれでなんかエラーになったので別のところからそれっぽいのを拾ってきてます。要はHTTP:Upgradeにwebsocketが入ってたらOKということっぽい。

   # これは動かない
   RewriteEngine On
   RewriteCond %{HTTP:Upgrade} =websocket [NC]
   RewriteRule /api/v1/streaming/(.*) ws://192.168.29.14:4000/$1 [P,L]
   ProxyPass /api/v1/streaming/ http://192.168.29.14:4000/
   ProxyPassReverse /api/v1/streaming/ http://192.168.29.14:4000/

いまのところ、CentOS 7を選んでいればよかったのか……というお気持ちです。誰か助けてー。

# cat /etc/issue
Ubuntu 18.04.2 LTS \n \l
# apache2ctl -v
Server version: Apache/2.4.29 (Ubuntu)

Workaround

あるじゃん!!!動いたじゃん!!!!ありがとう!!!!

nacika.com

半日以上かえして

レトロアーケード マッピ―を買った

アメリカで発売されているミニアーケード筐体型レトロゲームシリーズのうちナムコからいくつか有名なタイトルが日本でも発売されたそうで、Engadgetで紹介されていたのを見て即買いしました。

japanese.engadget.com

レトロアーケード <マッピ―>

レトロアーケード <マッピ―>

予約になっていたのではていつ来るやらと思ってたら割とすぐ来たので発売日が近かったようです(気にしてなかった)。同じ筐体で中身を入れ替えて売り出しているようですが、パッケージはきちんとマッピー。タイトルごとにちゃんと作ってあるようです。すてき。

f:id:Akkiesoft:20190325104221j:plain:w640

取り出した様子。動作は単3電池4本か、MicroUSB。まあUSBですかね。画面は動作中のものではなく画面保護シール。これを剥がして電源を入れる必要あり。電源ボタンは"足元"のコイン投入口を模したボタンを押します。

f:id:Akkiesoft:20190325104227j:plain:w640

これがプレイ中の画面。ボーナスステージですな。

f:id:Akkiesoft:20190325104234j:plain:h640

アーケード型なのでゲームもアーケード版を期待したかったところですが、残念ながらFC版でした。私はサウンドで気づきましたが、ステージが6段じゃなくて5段というところで気づいた方もいるようでした。あと、サウンドもFC版よりちょっと音程が高めのような。電圧のあれか?

操作性は意外にも良くて、快適に楽しめました。電源入れっぱなしにしてデモ画面を流しておくのも良さそうです。

あと、このゲーム機、やはりというか分解レポートも上がっていて、海外のブログでは基板のショートするパターンを切り替えれば他のゲームが動いたという報告が上がっていました。DIPスイッチで切り替わるようにしたりいいかもね、とのこと。いつか飽きた頃に挑戦してみるか……🤔

www.instructables.com

PC電源ON時にスイッチがオンだったらGrubでWindowsを選んでくれるPro Micro

ラズピッピ以外のボード工作、気がついたら今日はもう一個作ってました。

うちのPCはLinuxとWindows10のデュアルブートで、デフォルトはLinuxでありつつ利用頻度は半々といった感じで運用してます。どちらもSSHかRDPで接続するので、Windowsを起動するときはディスプレイの入力を切り替えずに電源ボタンを押して、10秒後のGrubが起動したであろうタイミングで挿しっぱなしにしてあるキーボードのカーソルキーを連打してWindowsを選択して起動しています。

日中工作をしている途中、引き出しをあさっていたらPro Microが出てきたので、Windowsを起動するときの作業をこいつにやらせることにしました。起動してPro Microの通電が始まった時、スイッチがショートしていたらWindowsモード(10秒くらい待ってカーソルキーを連打してEnter)になります。キーを押し終えたかLinuxモードのときはデバイスをスリープモードにして終わらせています。エコい。

雑にフリスクケースに打ち込んでサクッと完成。

f:id:Akkiesoft:20190323225131j:plain:w640

設置も雑にやりましたが、やりたいことはできるようになったので良いのではないでしょうか。

f:id:Akkiesoft:20190323225145j:plain:w640

めでたし。

以下コード。終了時に消せるLEDを消しとくコードはここのを参考にしました。

www.electronicsweekly.com

#include <HID-Project.h>
#include <HID-Settings.h>
#include <avr/sleep.h>

const int buttonPin = 2;
const int RXLED = 17;
const int TXLED = 30;

int buttonState = 0;

void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(RXLED, OUTPUT);
  pinMode(TXLED, OUTPUT);
  buttonState = digitalRead(buttonPin);
  if (buttonState == LOW) {
    Keyboard.begin();
    delay(11000);
    for (int i=0; i < 4; i++){
      Keyboard.press(KEY_DOWN_ARROW);
      delay(10);
      Keyboard.release(KEY_DOWN_ARROW);
      delay(10);
    }
    Keyboard.press(KEY_RETURN);
    delay(10);
    Keyboard.release(KEY_RETURN);
  }
  digitalWrite(LED_BUILTIN, LOW);
  digitalWrite(RXLED, HIGH);
  digitalWrite(TXLED, HIGH);
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_mode();
}

void loop() {
  delay(1000);
}

ESP-WROOM-02でトイレの電気がつけっぱなしだったらZabbix経由で通知する

インターネットに繋がってないのでIoTじゃないです(前置き)

前にAitendoでESP-WROOM-02を買ったんですが、つなぎ方がよくわからず放置していました。部屋の隅でブレッドボードにブスブス刺されまくって宙に浮いてたのを、片付けるついでに活用してみました。というはなし。

開発ボードだとリセットとかのボタンがあったりプルアップ抵抗がついてたりしますが、Aitendoのブレイクアウトボードはそのへんが何もついておらず、そのへんが必要というのもあまり理解してなかったので、最初は3V3とGNDだけつないで動かないなあとか言ってました。いろいろ読んで回った結果、EN-3V3、GPIO2-3V3、GPIO15-3V3はとりあえず常時10KΩでプルアップして良さそうということがわかったので、ブレッドボードでぐちゃぐちゃつないでいましたが、今回は思い切ってブレイクアウトボードに用意入れていたパターンに抵抗を直接取り付けました。

f:id:Akkiesoft:20190323135944j:plain

ファームウェアは前回(ブログに書いてない)MicroPythonを書き込んでいたので、3V3とGNDをつなぐだけで動かせるようになりました。本当はGPIO0から10KΩを挟んでGNDにプルダウンする必要があるようですが、動いてるのでいいか。ファームウェアを書き換えるときはGPIO0から10KΩを挟んで3V3にやれば良いようです。こう言う切り替えがあるところこそブレッドボードでやりましょうかね。

(参考) マイコンの実験:ESP-WROOM-02でWiFi通信の実験1

さて、MicroPythonでこんなコードを作成。WiFiに接続するだけなんですけど。ファイルの転送はampy(https://github.com/pycampers/ampy)を使うと便利です。boot.pyとしてESP-WROOM-02に転送しました。

import machine
import network

wlan = network.WLAN(network.STA_IF)
if machine.reset_cause() != machine.SOFT_RESET:
  wlan.active(True)
  wlan.ifconfig(('192.168.xx.xxx', '255.255.255.0', '192.168.xx.1', '192.168.xx.1'))

if not wlan.isconnected():
  wlan.connect('<SSID>', 'パスワード')
  while not wlan.isconnected():
    machine.idle()

電源は3.3Vが必要なので、まあとりあえずUSBシリアル変換のボードを使用。

f:id:Akkiesoft:20190323141739j:plain

これをトイレに設置。電源もだいぶ前から用意してたんですが特につなぐものがなく放置していたものをいよいよ活用!

f:id:Akkiesoft:20190323143526j:plain

この電源、照明を消すと同じく落ちるので、照明がついている間だけESP-WROOM-02が起動するということになります。

つまり、あとはZabbixでping監視すればトイレの照明がつけっぱなしかどうか見られますね。pingを30秒ごとに確認するようにしたので、トリガーは10分(直近20回)のあいだに0(消灯)が0回だったら警告として通知するようにしました。

{toilet:icmpping[<ESPのIPアドレス>,4].count(#20,0)}=0

今のトイレはLED電球で、常夜灯程度の消費電力で光るのでそんなにガッツリ監視しなくてもいいんですけどね。あとは家を出る前に消し忘れをチェックできるようになると良さそうです。

いやでもねえ、もうちょいいい使い方したい気もするよね🤔

東急2000系2002Fデハ2252のプレートを買った

f:id:Akkiesoft:20190321110213j:plain:w640

東急2000系のうち陸送で廃車になった車両とサハ8976の部品販売が東急の通販で先週末ありました。恩田で改番になった車両は入ってなかったようでした。車番プレートは開始数分で完売していましたが、優先席のつり革はわりとしばらく残ってるようでした。

私が10時のスタートと同時にポチポチー!!って押して確保したのはデハ2252の車内プレート。2と5しかねえみたいな面白みのない?番号ですが、朝の通勤は2002Fが来たらデハ2202かデハ2252に乗ってたのでこれを選択しました。ホントはよく乗ってたデハ2202がほしかったんですけど、前述の通り恩田の分はなかったので次の機会を狙っていきましょう、あるのか知らんけど。あと車外プレートはすでにサハ9812のがあるので小さい車内プレートでがまん。

f:id:Akkiesoft:20190321112211j:plain:w640

裏面。あ、凹凸があるのか。

f:id:Akkiesoft:20190321112221j:plain:w640

飾り付けはサハ9812の隣に。数字だらけの部屋になってちょっとやべー感じになってしまった、かも。今更ておくれか!ガハハ。

f:id:Akkiesoft:20190321112235j:plain:w640

ところで、先日9023Fに変わったあとの元2003Fにやっと乗れてウキウキしてたんですが、いざ乗ったら加速が突然止まってガタッ!と揺れたり、ATCの速度超過みたいな挙動とともにEBでもなさそうなブレーキ具合なのに「急停車します」の自動放送を連発して昔の音MADみたいなことになってたりして、正直乗っててこわい感じでした。途中から作業員が乗り込んでいたのですぐに確認が入っているようでしたけど、大丈夫なのかちょっと不安になったのでした。デハ9223の竜巻インバーターいいですね。デハ9323-9423と音が違って混在してるのもまたよし。

f:id:Akkiesoft:20190321115532j:plain:w400