b-shock. Fortress

Slack互換、トゥート用webhookを提供する小物ツール

拙作ツール tomato-toot を、バージョン2.0.0に アップグレードした。
Slack互換のAPIでトゥートが行えれば便利なのでは?というひらめきから、 急遽サーバモードを実装。 Slackだけでなく、webhookの仕様がSlackとそっくりなDiscord形式にも対応。

Slackにアラートを投げるツールは、きっと世にたくさんある。
手前味噌だが、拙作のものだとonionbot等も該当。 Chinachuでの録画開始・終了をトゥート出来る様になるという寸法。

BOTを設置してよいかはインスタンスの規約に従い、できれば管理人さんに許可ももらいましょう。
ご興味の向きはお試しの上、もしよかったら★つけてくださいw どうぞよろしく。

Xubuntu 18.04

Ubuntu 18.04 LTSがサーバ、デスクトップともリリースされ、順次更新していた。
愛用しているXubuntuも数日後にリリースされ、先ほど更新を適用した次第。

基本的な更新の手順

Ubuntu Server、Xubuntu共に、

1
sudo do-release-upgrade -d

で更新が可能。
-d をつけると、安定版だけでなく、開発中のものも更新先の対象になるらしい。
通常の用途で利用することは一見なさそうだが、何日経っても18.04へのアップグレードが 出来ず、やむを得ず -d をつけて実行した次第。 調べたが、 -d を使用するのは割と 一般的なセオリーではある様だ。

6環境試したうち1つだけ、更新が途中で止まったものがあった。
このようなことが稀にあるため do-release-upgrade をリモートで実行するのは慎み、 例えその必要がなくとも、極力実機の前で行う様にしようという話だと思う。

Ruby 2.5

sudo apt install ruby ってやったときに入るRubyのパッケージが、最新の2.5系になった。 ChefもSnesuも拙作のものも、相当数のツールがRubyで実装されており、影響は大きい。

通常であれば、

1
2
3
sudo apt-add-repository ppa:brightbox/ruby-ng
sudo apt update
sudo apt install ruby2.5

などとやる必要があったところ、今のところは最新の2.5がインストールできるため不要。
ただ、次のLTSが出るのは2年後。この頃まで2.5系のまま変わらない可能性は十分にあり、 brightbox/ruby-ngにお世話になる機会はまたいずれありそう。

CommandキーをCtrlキーにする

ここからは、MacBook Air 11に特化したXubuntuについての話題。

18.04にアップグレードすると、setxkbmapの設定が飛んでしまう。
過去記事に書いた通り の手順で復旧できる為、面倒だが再度実行。

トラックパッドの2本指スクロールの向きを上下逆に

これも過去記事と 同じ手順で再設定可能。

基本的な考え方は同じだが、今まで

1
xinput set-prop 12 287 -200 -200

だったところ、

1
xinput set-prop 12 288 -200 -200

に変更する必要はあった。

以上。

FreeBSD MySQL 5.7

FreeBSDでは訳あってMySQL 5.6を使っていたが、この度順次5.7への更新を始めた次第。

MySQLのアップグレード

以下実行。

1
2
3
4
5
6
su
service mysql-server stop
pkg install mysql57-server
service mysql-server start
gem install mysql2
mysql_upgrade -u root -p

mysql_upgradeのあとは、今までのrootパスワードを入力。
rootパスワードは変更はされていないので、安心していい。

ちなみに、インストール後にこんなメッセージが表示される。

1
2
3
4
5
6
7
Initial password for first time use of MySQL is saved in $HOME/.mysql_secret
ie. when you want to use "mysql -u root -p" first you should see password
in /root/.mysql_secret

MySQL57 has a default %%ETCDIR%%/my.cnf,
remember to replace it wit your own
or set `mysql_optfile="$YOUR_CNF_FILE` in rc.conf.

ふむなるほど。
新規導入の時は、 /root/.mysql_secret を読めという話ですな。

それにしても、以前5.6から5.7への更新を行った時は、InnoDBがそのままでは使えなかった。
どうやらSQLダンプからの再インポートが必要だった様だが、その後のバージョンアップで 改善されたのだろうか。

PowerDNSも使用している場合

PowerDNSをMySQLをストレージとして運用する場合、pkgコマンドからではなくportsから makeする必要がある為、MySQLをアップグレードした場合にはPowerDNSの再ビルドが必要。

また、portsからmakeする場合は、pkgコマンドから上書き出来ない様にロックするのが 普通と思う。
以下実行。

1
2
3
4
pkg unlock powerdns
portupgrade -f powerdns
pkg lock powerdns
service pdns restart

当方、portupgradeを使用している為に上記のような手順になってるけど、 他ツールをご利用の向きは読み替えて頂きたい。

PowerDNSの起動後、syslogに以下の様なログが出てればOK。

1
gmysql Connection successful. Connected to database 'pdns' on 'localhost'.

以上。

Dovecot 2.3への更新

FreeBSD Portsのdovecotパッケージが、2.3.1に更新された。

設定ファイルの書き換えが若干必要。
今どき、自分でPOP3/IMAPサーバを立てる需要がどれほどあるかは知らんけどw

ssl_protocolsディレクティブを削除

設定ファイルに以下の様な記述があったはずと思うけど。

1
ssl_protocols = !SSLv2 !SSLv3

ssl_protocols は非推奨になった。 加えて、 SSLv2 という値は廃止された。 (SSLv3 もついでに廃止して良かったはずと思うが)

同様の意味であれば、今後はこう書けとのこと。

1
ssl_min_protocol = TLSv1

この TLSv1 以上という指定は ssl_min_protocol の記述自体がないときのデフォルトだが、 書かれていないとWARNINGが出るので、明示的に記述するべき。

DHパラメータの設定

パッケージのインストール後に /var/db/dovecot/ssl-parameters.dat があることを確認し、 以下実行。

1
dd if=/var/db/dovecot/ssl-parameters.dat bs=1 skip=88 | openssl dhparam -inform der > /usr/local/etc/dovecot/dh.pem

実行後、設定ファイルに以下追記。

1
ssl_dh=</usr/local/etc/dovecot/dh.pem

これで ssl_dh に関するWARNINGは出なくなる。
service dovecot restart を実行。

設定ファイル全体

以上をふまえ、今個人的に使ってるのはこんなやつ。

plainやloginを許している以上、そろそろ非TLSの接続は廃止するべきだな。
(一応、認証の連続失敗で1週間のロックはしてる)

axiosで、application/x-www-form-urlencodedなPOSTを行う。

axiosなる、node.jsむけのこじゃれたHTTPクライアントを見つけた。

GitHub - axios/axios: Promise based HTTP client for the browser and node.js

先日、superagentの代わりに使ったのだが。
application/x-www-form-urlencodedでPOSTするという、ごく当たり前の処理に少々手間取ったので、 この記事はその備忘録。

デフォルトだと、POST時のデフォルトはapplication/jsonです。
このおしゃれさん!とでも言いたくなる。

expressで書かれてる想定の断片。
色々足りないですが、expressが本題ではないので勘弁して下さい。

どっかで見た処理だって?
こまけぇこたぁいいんだよ!!

Mastodon 2.3にアップグレードした。全文検索できるようになった。

2.3.0がリリースされた。
今回の目玉は何か。LDAP対応?ノンノン、全文検索に決まってんだろw

2.3へのアップグレード以外にもいくつか作業したので、以下にご報告する次第。

2.3へのアップグレード

いつもどおりの手順である。DBのマイグレーションと、アセットの再構築を含む。
特に補足することはない。

Node.js 9.xを適用

少し前から、管理対象サーバ上の古いNode 6.xを少しづつアップグレードしてたが、 Mastodonインスタンスだけが未対応だった。

FreeBSDでは、 pkg install node ってやるとなんと8.xを飛び越えて、 9.xがインストールされる。 9.xでもストリーミングAPIは正常に動作する模様。

以下、FreeBSDでNode 6.xから9.xへのアップグレードを行った手順。

1
2
3
4
5
su
pkg delete node6 npm3
pkg install node npm
cd ~mastodon
yarn upgrade

faviconを変更

Mastodonのfaviconは、かなり面倒な手順を踏まなければ変更できない様だ。
最近某所で仲良くさせて頂いているワイヤード・パンチ氏に教えてもらったまとめがこちら。

マストドンのインスタンスのfaviconを変更する方法。

めんどくさすぎだろw
faviconを作るところまではいいとして、その先はもっと簡単に済ませた。

即ち、nginxが直接返すようにすれば良いのである。
nginx.confにもともと以下の記述があったので、今回特に対応不要だった。

1
2
3
location ~ \.(html|png|gif|xml|ico|json|svg|txt|ogg|mp3)$ {
root /usr/local/www/mastodon/public;
}

全文検索の導入

公式にある、この手順の通りであるが。

Elasticsearch Guide

aptコマンドを操作する手順、多分Ubuntuのものだろう。Debianでも動くのかは知らない。
FreeBSDでは当然、全く手順が異なる。

1
2
3
su
cd /usr/ports/textproc/elasticsearch6
make install clean

上記手順で、依存パッケージであるopenjdk8も一緒にインストールされる。

引き続き、以下実行。
必要なら /usr/local/etc/elasticsearch/elasticsearch.yml を編集するが、 通常は不要と思う。

1
2
sysrc elasticsearch_enable="YES"
service elasticsearch start

起動したら、一応、 curl http://localhost:9200 で動作確認を。

Elasticsearchの正常動作を確認したら、Mastodonを全文検索に対応させる。
.env.productionに、以下追記。

1
2
3
ES_ENABLED=true
ES_HOST=localhost
ES_PORT=9200

追記したら、以下実行。

1
2
cd ~mastodon
RAILS_ENV=production bundle exec rails chewy:deploy

このrakeタスクでインデックスの作成なんかも行う様だが、かなり時間がかかる。 5,000トゥートほどある弊インスタンスでは、16分ほど要した。

終了後、Mastodonの再起動。

全文検索の使い方

今まであった検索窓にワードを投入するだけ。
以前は間違いなくヒットしなかった、すごく古いトゥートもヒットするようになった。

この機能、クライアント側の対応が必要な模様。
Kurotodon では動かなかったが、他のクライアントの分をあとで試してみようかと。以上。

MacBook AirをXubuntuとのデュアルブートにした。

USキーボード原理主義

人生で最初に所有したパソコンはNEC PC-9801 RXだが、こいつを卒業したあとはずっと Macユーザーだった。
この頃のMac、キーボードはUS配列だった。それまでキューハチユーザーだったおれが 最初にUSキーボードに触ったときは戸惑ったものだが、のちのち慣れるとJIS配列より 合理的であると知り、以降20年は断然US配列派である。
生産性にも大きな影響があり、ここは一切譲れない。

ところで、日本でUS配列のPCを利用するならデスクトップ機、さもなければMacなのでは ないか?
おれはもう今後、デスクトップPCを購入することはないだろうから、選ぶPCは必然的にMacという ことになる。それがたとえ、WindowsやLinuxデスクトップという用途であっても。

余談だが、USキーボードのノートPC。軽く調べた感じ、国内メーカーは全滅に近い。
macOS用途でなければ、MacBook以外であっても当然選択肢にはなりうる。 もちろん良いものであればの話だけど。
Apple以外で、安定してUSキーボードのマシンを供給しているのはLenovoだが、このメーカーは セキュリティに大きな懸念があるので敬遠。 (Windowsにへんなスパイウェア入れてることが多いみたいなので、興味あるひとはググって)
USキーボードにこだわるなら結局Macに行き着くという持論だけど、良いメーカーを ご存じの方は是非教えていただきたい。

ヤフオクにてMacBook Air 11を落札

そんなわけで、つい先日落札した。

  • MacBook Air Mid 2012 11インチ
  • Core i7 2GHz
  • 8GBメモリ
  • SSD 256GB
  • USキーボード

どうです。割といけてるでしょ。こいつを、懲りもせずXubuntuマシンにするのである。
やったことは大体、このブログに書いたこと。自分の備忘録にもなり、やっててよかった 個人ブログ。
本稿では、あえてMacにXubuntuをインストールしたことにより、今回初めて行った対応 について述べる。

デュアルブート

まずはXubuntuでブートできなければ始まらないのであるが。
当初、macOSとのデュアルブートの必要はないと考えていたが、一部の設定はmacOSからしか できない可能性がある。
30GB程度で良いので、macOSのパーティションも切っておくのがリスクヘッジというもの。 そう思い直した。

用意するものがある。

  • Xubuntuのインストーラ入りUSBメモリ
  • macOSのインストーラ入りUSBメモリ

macOSのUSBメモリは必須ではないが、あると便利。
Command+Rを押しながらのリブートで代用できる機種が多いが、万一出来ないときの為に。

どちらも定番の作業で作成できるので、説明はしない。
以降はざっくり、以下の手順で行う。(このへんの一連の手順、いいページがたくさん あるはずだからググってw)
以下、注意点だけ。

GUIDでパーティションを切る

macOSのUSBメモリはここで使用。
macOSのパーティションは、最新のHigh Sierraであっても30GBもあれば十分。 残りはすべてXubuntuに。
ここでファイルシステムに何を選んでも、結局はあとでAPFSとext4になる。なんでもいい。

小さな方のパーティションにmacOSをインストール

手順割愛。

rEFIndをインストール

インストール前に、SIPを切っておく必要あり。
Command+Rを押しながらリブートし、ターミナルから csrutil disable を実行。 直後に、再度Command+Rリブート。

Command+Rでリブートしたあとは、APFSボリュームはマウントされていない。 ターミナルを実行する前にディスクユーティリティでmacOSのパーティションをマウント しておくのをお忘れなく。
しかる後に、rEFIndをインストール。

インストール後は再度Command+Rで起動し、 csrutil enable でSIPを元に戻すのを忘れずに。

大きな方のパーティションにXubuntuをインストール

特別な手順は不要なので割愛。いつものPCでの手順でOK。
GRUBをXubuntuのパーティションに入れることだけ忘れない様に。

ここまでの作業で全てのデバイスを認識し、素晴らしいのだが、いくつかやることがある。

Commandキーをctrlキーにする

マカーには、この手順が意味するところの説明は不要だろう。
macOSの大半のショートカットキーは、Commandキーとのコンビネーションである。

実際の手順は、↓ここを参考にすれば良い。

Ubuntu 16.04のキーボード設定をMacBook向けにしてみる

但し、要アレンジ。Xubuntuではdconfの設定を行っても無駄。
「セッションと起動」にて、

1
/usr/bin/setxkbmap -option "ctrl:nocaps" -option "altwin2:cmd_n_ctrl"

をログイン時に実行するようにする。

  • ctrl:nocaps は、capsキーをctrlに変える定番設定。
  • altwin2:cmd_n_ctrl は、上記ページに書かれている、Commandをctrlに変更する設定。

複数の設定をsetxkbmapに適用する際は、この様にoptionを重ねて指定する。

トラックパッド、2本指スクロールの向きを上下逆に

↓このページ参考に。但しこちらも、要アレンジ。

XPS13 Ubuntu 12.04 でナチュラルスクロールを有効にする

ウチでこのページの手順を実行した結果、

1
xinput set-prop 12 287 -200 -200

を実行すればよいとわかった。
後ろの-200、負の数値であればなんでもいいみたい。移動量を数値で指定するものと思っていたが、 何を指定しても動作は変わらないっぽい。
こいつも先程同様、「セッションと起動」にてログイン時に実行するように。

pm2をsyslog対応に。

作成の経緯

MirakurunがNode.js 6.xの サポートを打ち切り、8.xでの動作が推奨になった為、昨日、録画鯖のNode 環境を8.9.4にアップグレードした。

ChinachuもMirakurunも、 pm2でデーモン化する導入手順。
今までは、これらをsyslog対応にする為にpm2-syslog を使用していたが、

  • syslogd側でUDPを開く必要あり。
  • タイムスタンプがUTC。

と、あまり使いやすいものではなかった為に、この機会に自作したという経緯。
syslogならOSのローテーションツールが使えたり、RDBをストレージにできたり、 便利だよ。アプリのログは極力syslogに流す派。

設計

…という程大層なものじゃないがw
素直にloggerコマンドを叩く実装が使いやすいはずと感じた。

syslogのクライアント自身がUDPを開けて通信する必要はあるのか?
仮にリモートのsyslogサーバに集約する用途でも、そのルーティングは syslogdがするべきではないか?と思うのだけど、いかがか。

通常時とエラー時に実行すべきコマンドライン例を、以下に示す。

1
2
logger -p user.info -t mirakurun-server hogehogehoge  #通常時
logger -p user.error -t mirakurun-server hogehogehoge #エラー時

何故ファシリティがuserなんだ?手抜きかよ?
いやいや、プログラム名(-t)さえ設定してあれば、rsyslogとかなら フィルタリングできるんだし。 ファシリティなんて前時代的な仕組みは使わんでいいだろ。と思った。

インストール手順

1
sudo pm2 module:install pm2-syslog-logger

詳しくはGitHubページ を参照のこと。(そんな大層なもんじゃないけど)
え、READMEは英語で書けって?勘弁してくださいよ…

利用範囲

録画鯖にはもちろんだけど。
MastodonのストリーミングAPIにも、pm2化すれば使えるよ。
てゆうか使ってる。

expressで書いたツールって、pm2化出来るのか?
これも試してみたい。

未実装機能

loggerコマンドは通常パイプで起動し、 echo hoge|logger みたいに、標準入力から 流し込む様な使い方をするのが本来。
録画鯖程度のログ流量なら今のままで問題ないけど、流量が大きくなることを 想定し、近々この形に修正したい。

その他

GitHubページとか npmページとか 見てください。恥ずかしいけどw

GDで透過PNGを扱う。

久しぶりの記事だが、何事もなかったかのように進めていく。

経緯

PHPで画像を扱う為には、

  • GDを使ったもの
  • ImageMagickを使ったもの

の主に2種類があると思うけど、今日の話題はGDのほう。

透過色(アルファチャネル)を含んだPNG画像のリサイズ(縮小)を行うと、透過色が失われて しまう現象に悩まされていた。

今回、アプリ本体はPHPで書かれているが、他言語から利用することも想定し、画像リサイズAPI (picon)はNode.jsで実装されている。
当初、この問題はAPI側の不具合と考えていて、Node.jsやImageMagickのことばかり調べていた が、実際にはAPI側は無関係だった。

画像リサイズAPIのクライアント(PHP)は、APIにファイルをPOSTしている。
このPOSTすべきファイルが、既にアルファチャネルを保持していなかったというわけ。

GDで透過PNGを扱う。

PHPの imagesavealpha 関数を実行し、 アルファチャネルを有効にする必要がある。
また、 imagealphablending を実行して、アルファブレンディングを解除する。

ひと通り書くと、以下の様な感じ。

このスクリプトと同じ階層に、 sample.png がある想定で。

おまけ

この修正を行ったクラスは、実際には以下の場所にある。
オレオレフレームワークのクラスのうちひとつ。

Image.class.php
241行目

以上、ご参考まで。

password_hash.php

おれ、自分ではPHPerのつもりなんだが、実はPHPの記事を書くのは初めてという。 なんというグダグダw。

基本的な使い方

パスワードのハッシュにpassword_hash使ってますか?下手にmd5()だのsha1()だの使う ぐらいなら、断然これ使いましょう。
何も考えずに標準の関数使っとけば幸せ、一見安易に見えて実はベストプラクティスであるという、 実にPHPらしい関数。
以下、ハッシュの生成手順。

1
2
3
4
<?php
$cost = 10; //コスト
$password = 'YOUR_PASSWORD'; //平文パスワード
$hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => $cost]);

認証はこんなかんじ。

1
2
3
4
5
6
7
<?php
$password = 'YOUR_PASSWORD'; //ユーザーが入力したパスワード
if (password_verify($password, $hash)) {
//認証成功時の手順
} else {
//認証失敗時の手順
}

ラクすぎる。各関数の詳細はこちら。

ハッシュ生成ツール

で、これが本題。
管理者パスワードなんかのハッシュ生成に使えるツールを書いたです。

こんなふうに使う。

1
2
3
4
5
6
7
8
% ./password_hash.php YOUR_PASSWORD
{
"source": "YOUR_PASSWORD",
"hash": "$2y$10$d1SJDVqus8OvKeRrdnv8wuQk2TjD1QIuzBjoTEraJFGJ4M9VHge2m",
"algo": "bcrypt",
"cost": 10,
"verify": "OK"
}

YOUR_PASSWORDが、ハッシュ生成の対象となるパスワード。
必要なのは、出力されたJSONの hash 要素だけ。この内容をアプリの設定ファイルに控えて おけばよい。
あ、出力されるのはJSONだから、一部の記号(スラッシュとか)がエスケープされるので要注意。

処理内容は、ソースを見ての通りw
コスト7から始めて、0.05秒以内にハッシュ生成が完了する間はコストを1ずつ繰り上げていく。 当然、コストが高いほど強度の高いハッシュとなる。
今までほぼ毎回コスト10で、他はほとんど見たことないんだけどね。

ではまた。