b-shock. Fortress

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で、他はほとんど見たことないんだけどね。

ではまた。

フィードエントリーをトゥートするツール。

このツールの初回コミット、記録をみる限りは10/27。
とっくに運用始めてたのに、2ヶ月弱経ってようやくの公開である。

タイトルの通り、RSS/Atomフィードの新着エントリーをMastodonにトゥートする ツール。同種のツールが見つけられなかったら、自作した。

Ruby 2.4(たぶん2.3でも可)が入ってるUNIX系OSを対象とする。
Windowsでも動く可能性が高いけど、正直知ったこっちゃないのでそのつもりで。 (Win環境への設置に関する質問には答える気ないです)

GitHub

tomato-toot

設置手順などは、リポジトリのページを参照。

なぜトマトなのか?
深い意味は全くないので、追求するのはやめて頂きたいw

「これを裏技と呼ぼう」

READMEに書いてない機能がひとつある。
ドキュメント書いてて力尽きたw 利用頻度も低いし、まぁ説明しなくてもいいだろと。 (おれ自身も結局使ってないし)
興味あるひとはソースでも読んでください。

免責

個人の管理者が多いMastodonでは、流量の多いBOTが迷惑行為となる可能性があることに 注意したい。
インスタンスによっては、規約でBOTを禁じている可能性もありうる。 明確にOKと謳っているのでなければ、管理者が個人である場合は特に、ひとこと断って ほしいと思う。

自己責任での利用をお願いしたい。
おれは、このツールを使った上でのトラブルに責任をとるつもりはないので。

Mastodon 2.1、及びカスタムテーマの更新

Mastodon 2.1.0が 今朝リリースされたので、早速導入した。新機能等に関してはリンク先を見て頂くとして。

Mastodon自体の更新の手順はいつも通りで問題ないので割愛。1点除いて、特にひっかかった点も なかった。
その1点とは、2.0の新機能だったカスタムテーマだ。2.0のカスタムテーマは2.1と互換性がない ケースがある。
カスタムテーマのエラーを放置すると、更新の手順の最後に行われる rake assets:precompile を終了させることができず、Mastodon自体の更新も完了しない。

エラーが出ている場合に、手っ取り早くMastodonの更新だけを行いたい場合

以下のいずれかの手順を行った後に、通常通り rake assets:precompile を実行。

カスタムテーマを無効にする

config/themes.ymlにカスタムテーマを登録しているはずと思うが、追記分をコメントアウトし、 defaultテーマ(設定画面上では、サイトテーマ「Mastodon」に該当)だけを残す。

variables.scssに$cjk-langsを追記

defaultテーマの配色だけを変更したテーマの場合、テーマのファイル構成は踏襲している だろうから、defaultテーマ同様にvariables.scssが存在するはずと思う。

variables.scssに$cjk-langsが存在しない場合は、 rake assets:precompile 時に以下の エラーが発生する為、

最終行にでも $cjk-langs: ja, ko, zh-CN, zh-HK, zh-TW; と追記する必要がある。 2.0のvariables.scssからコピーしている場合、この記述がないはず。

簡単なカスタムテーマを作成する手順

話のついでなので、おれがやってる手順のまとめ。

config/theme.yml に追記

defaultはもとからあるテーマ。その下にdefaultテーマをまねて追記。
以下、 bshock がテーマの名前であるとして。

ルートのscssファイルを作成

1
2
cd app/javascript/styles
cp applications.scss bshock.scss

Mastodon 2.1では、bshock.scssは以下の様な内容。

defaultテーマから、2行目だけを書き換えている。もともと2行目には mastodon/variables と書かれていたが、 bshock/variables と書き換えた。
配色以外の要素はデフォルトのままで良いなら、variables.scss以外のファイルはオリジナル のファイルをそのまま参照すれば良いと思う。(もっとも、本来この手順が適切とは思うのだけど、 今回2.1への更新では裏目に出てしまった)

variables.scssを修正

variables.scssをdefaultテーマからコピー。

1
2
mkdir bshock
vi bshock/variables.scss

bshock/variables.scssは、以下の様な内容。

上記は実際には、defaultテーマから // Values from the classic Mastodon UI (9行目) 以下にある4つの変数だけを書き換えたもの。

$classicから始まる4つの変数は、カスタムテーマが実装された2.0よりずっと前から あったものみたい。
$classic-base-color などでググれば、1.6以前の記事でも参考にできる配色があると 思われるので、ありがたく拝借すればよいだろう。
配色のことは、デザインセンスのないおれに聞かないで頂きたいw

全て終わったら、エラーがないことを神に祈りつつ、いつもの rake assets:precompile を実行し 再起動。(もっと速い手順がありそうとも思うが、念の為おれはこの手順でやってる) うまくいけば、各ユーザーはデフォルトのMastodonテーマと別に、bshockテーマも選べる様に なるはず。
うまくいかなかったら…確か、PostgreSQLのsettingsテーブルを開いて、theme値をごちゃごちゃ やる必要があったはず。そうはならない様、各位の健闘を祈るw

次回予告

先日、自宅鯖にMastodonインスタンスを引っ越した。
この時メモした作業手順を踏まえ、FreeBSDでの構築手順を書く予定。
FreeBSDでMastodonなんて地雷じゃね?などと言う人もいるだろうが、地雷ばかりじゃない。 ZFSイイ!以上。

Ubuntu Server 16.04 LTSにOracle 11g XEを入れてみる。

↓主に参考にした記事はこれ。(ありがとうございます)

Ubuntu 16.04 へ Oracle 11g Express Edition を入れてみた

同じUbuntu 16.04LTSであるにも関わらず、当方の環境では微修正が必要だった。 こちらではVMware Fusion(Mac)とKVM(Xubuntu)で試したけど、あんまり関係ないよね。謎だ。

本稿は一見、元記事と変わらないけど(記事の名前もよく似てるしw)、修正後の手順と その後の後処理を反映させてる。パクリっぽいけど、一応違うからw

依存パッケージのインストール(元記事を微妙に修正)

1
sudo apt install alien libaio1 unixodbc unzip bc

bcは、元記事の指示にはなかったもの。
まっさらなUbuntu Serverには入ってないが、実際には必要。

debパッケージの生成

Oracle Database Express Edition 11g Release 2

Linux x64版をダウンロード。Oracleのアカウント(無料)が必要なので、持ってなければ作ること。
ダウンロードしたファイルを設置先サーバに置いて、以下実行。

1
2
3
unzip oracle-xe-11.2.0-1.0.x86_64.rpm.zip
cd Disk1/
sudo alien --to-deb --scripts oracle-xe-11.2.0-1.0.x86_64.rpm

alienの実行には、かなり時間かかります。

debをバラす(元記事を微妙に修正)

1
2
3
4
mkdir tmp_deb
cp oracle-xe_11.2.0-2_amd64.deb tmp_deb #rpmから変換したdeb
cd tmp_deb
ar x ./oracle-xe_11.2.0-2_amd64.deb

このdebに入っているのは、以下の3つ。

  1. control.tar.gz
  2. data.tar.xz
  3. debian-binary

ファイル 1. と 2. は、内容を修正する必要あり。

data.tar.xzをバラして修正

1
2
3
4
mkdir tmp_data
cd tmp_data
tar axvf ../data.tar.xz .
vi ./etc/init.d/oraccle-xe

awkのパス(53行目)を、 /usr/bin/awk に修正。

1
if [ -z "$AWK" ]; then AWK=/usr/bin/awk; fi

/var/lock/subsys/ を /var/lock/ に置き換え。

1
:%s/subsys\///gc

シェバン(1行目)の下に、以下挿入。

1
2
3
4
5
6
7
8
### BEGIN INIT INFO
# Provides: OracleXE
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Oracle 11g Express Edition
### END INIT INFO

control.tar.gzをバラして修正

1
2
3
4
5
cd ..
mkdir tmp_control
cd tmp_control
tar axvf ../ccontrol.tar.gz .
vi ./postinst

update-rc.dへ書き換え。(114行目)

1
update-rc.d oracle-xe defaults 80 01

debファイルに戻してインストール(元記事を微妙に修正)

1
2
3
4
5
6
7
8
9
10
11
cd ..
rm data.tar.xz
rm control.tar.gz
cd tmp_control
tar acvf ../control.tar.gz ./
cd ../tmp_data
tar acvf ../data.tar.gz ./
cd ..
ar d ./oracle-xe_11.2.0-2_amd64.deb data.tar.xz
ar r ./oracle-xe_11.2.0-2_amd64.deb data.tar.gz control.tar.gz
sudo dpkg -i oracle-xe_11.2.0-2_amd64.deb

インストール(dpkgコマンド)もかなり時間かかります。

インストールスクリプトを修正(元記事にない手順)

以下のファイルについて、要修正。

  1. /u01/app/oracle/product/11.2.0/xe/dbs/init.ora
  2. /u01/app/oracle/product/11.2.0/xe/config/scripts/init.ora
  3. /u01/app/oracle/product/11.2.0/xe/config/scripts/initXETemp.ora

これらのファイルについて、 memory_target= から始まる行をコメントアウトする必要あり。
“=” の後ろに値が入っていないケースがあり(MacのFusionではそうだった)、その場合は インストールスクリプト実行時にシンタックスエラーになる為、 memory_target=1G 等と 修正せよと案内している記事もある。

ウチでは結局、行自体をコメントアウトする必要があった。(その旨を案内するログメッセージ も出てた)
ファイル 1. への修正は不要だったかもしれない。ちょっと自信ない。

インストールスクリプトを実行

1
sudo /etc/init.d/oracle-xe configure

最後にパスワードを聞かれるはずなので、入力したものを控えておく。
事前に無作為なパスワードを、apg等で用意しておくこと。

環境変数の設定

環境変数の設定を行う為に、 /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh を実行する 必要がある。~/.profile 等に、このファイルを実行するよう追記。
シェルごとに手順が若干異なるので、各自お好みのシェルの手順で対応して頂きたい。

接続テスト

1
sqlplus

ユーザー名は system 、パスワードは先ほど控えたもの。
ここまでで設置の手順は終わり、元記事もここで終わっているが。

ユーザー作成(元記事にない手順)

このあとの手順はOracle使いには自明のことの様だけど、自分への備忘録を兼ねて。

デフォルトで作成されるsystemユーザーは、SYSTEM表領域を使用する等、通常の利用に適さない。
たとえ普段からDBA権限が必要であっても、systemではないユーザーを登録して普段はそちらを使うべき。

1
2
3
CREATE USER your_id IDENTIFIED BY "your_password" DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp;
GRANT DBA TO your_id;
GRANT UNLIMITED TABLESPACE TO your_id;

下2行、ほんとに実行するかどうかは用途によるだろうけど、テスト環境なら問題ないはず。
以下のクエリーで、登録状況を確認。

1
SELECT username, default_tablespace, temporary_tablespace FROM dba_users;

Oracleインスタンスを立てた目的

少々訳あって、Oracle Master Bronzeが必要になった。
「なんだブロンズかよ、しょぼ!」とか言うなw 以上。

Mastodonインスタンスのメモリが湯水のように使える様になれ。

状況

mstdn.b-shock.orgのメモリがひっ迫し、ピンチなのである。 以下、Sensuによるスワップ容量の監視状況。

平常時のswapinfoはこんな感じ。

1
2
Device          1K-blocks     Used    Avail Capacity
/dev/vtbd0p3 1572864 798660 774204 51%

平常時で既にスワップしてて、しかも使用量が50%を越えているのは感心しないが、 それはそれとして。Mastodon本体にチューンの余地はあると思うが(スレッド減らしたりとか)。
調査したところ、一番メモリを食っているのは1時間ごとに実行しているpg_dumpらしい。 ちなみに、gzipする前のダンプファイルの大きさは以下の様な具合。383MBとのこと。

1
-rw-------   1 root   pooza   383M 12月  9 13:51 mastodon_2017-12-09.sql

スワップ容量をデフォルトのまま少なく設定してしまった(1.5GBほど)ことに まずは問題があり、運用を始めてしまってからでも出来る対策として スワップファイルの作成を試みた。
この対策は一見うまくいったかに見えたが、スワップファイルからの読み込みがスワップパーティション より遅い為に?VPSではエラーが発生して使い物にならなかった。

ちなみに、スワップを使い切っていよいよヤバいと、カーネルがこんなログを吐く。

1
2
3
2017-12-08T23:14:50.615180+09:00 dodok kernel: swap_pager: out of swap space
2017-12-08T23:14:50.615724+09:00 dodok kernel: swap_pager_getswapspace(6): failed
2017-12-08T23:14:50.816012+09:00 dodok kernel: swap_pager_getswapspace(2): failed

このログが出るとdmesgにも同様の出力がされるので、監視の対象になってる。
アラートが発生したら、出先からでもMastdonインスタンスのVPSをリブートしてる。 カジュアルにリブートができるのは、おひとりさまインスタンスだからだが。

対策

  1. スワップ領域を大きく取る為、OSのインストールから構築をやり直す。
  2. VPSのプラン変更。(1G→2G or 4G)
  3. 自宅鯖への撤退。

通常であれば1.か2.(又はその両方)が妥当だが、現在1Gのプランを2Gに上げたところで やはり将来不足する様に思われた。一方、物理PCなら、メモリ8GB程度ものでも非常に安価に 入手できる。
以前、自宅鯖をインターネットに晒すのは極力よそうと思い立ち、その後は大半のサービスを VPS化した。現在は、やむを得ない理由でsshを開けているだけ。(自宅のIPアドレスは 固定している 。たとえサーバを立てるわけでなくても、業務上必要なので)

自宅鯖にWebサービスを立てるのは、個人的な感情では「撤退」だ。
上で述べたような自宅鯖自体の是非もそうだし、また、おれ自身は「少しでも腕におぼえがあれば誰でも、 月額1,000〜2,000円程度の出費でMastodonインスタンスを立てられるんだから、もっとカジュアルに インスタンスを立てよう!」という立場だった。
月額2,000円を超えるVPS(又は自宅鯖)という条件は、気軽にお勧めできるラインを越えていると 感じる。

気を取り直して、今回買ったのはこれ。

DELL OptiPlex 7010 中古

届いたら、今回は記録をとりながら構築していく予定。既に多くの手順をChef化しているので、 手作業は多くないはずと思ってるが。
世にあまり出回っていない、FreeBSDでの構築記事が書けるのではないかと、そこは期待してる。

PowerDNS Recursorの導入

経緯

FreeBSDのpkgngに、PowerDNS 4.1の更新が来た。
いつもどおりChefレシピを走らせて更新したら、どうやら動かなくなってしまっていた様だ。 こんなログを吐いていた。

1
2017-12-05T06:38:11.652799+09:00 dev3 pdns[50216]: Fatal error: Trying to set unknown parameter 'recursor'

従来のPowerDNSにはフォワードの機能があり、pdns.confに recursor=8.8.8.8 なんて 書いておけば、自分自身が知らないゾーンのクエリーをGoogleに丸投げすることができた。
設計思想上これはアリなのか?と思わないこともなかったが、コンテンツサーバとキャッシュサーバの いいとこどりで、LAN向けのネームサーバで使う分には悪くないと思って使ってたのだが。

ログをすぐみてわかった。ああ、recursor機能が使えなくなったのだなと。 公式にはご丁寧にも、こんなドキュメントまで用意されていた。

Migrating from using recursion on the Authoritative Server to using a Recursor

セキュリティ上、この仕様変更が必要だったことは理解するけど、メジャーバージョンアップでも ないところにこんな影響範囲が大きな修正、普通入れるか?ちょっとアレだなぁと思ったよ。

愚痴は程々にして、上記ドキュメントで案内している通り、仕方なくPowerDNS Recursorを導入する ことにした。
ウチの構成だとLAN内と開発環境に各1、都合ふたつのキャッシュサーバが必要。 開発環境向けのものをFreeBSDに、LAN向けのものをUbuntu Server(先日構築した録画サーバと同居) に構築していく。

Ubuntu Serverに導入

53/udpが競合する為、事前にsystemd-resolvedとかいうへんなのを止める必要あり。

1
2
sudo systemctl disable systemd-resolved
sudo service systemd-resolved stop

止めたらRecursorをインストール。

1
2
sudo apt install pdns-recursor
sudo systemctl enable pdns-recursor

systemctlを叩いたら怒られたので(以下)、

1
2
Synchronizing state of pdns-recursor.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable pdns-recursor

指示通り以下を実行。

1
sudo /lib/systemd/systemd-sysv-install enable pdns-recursor

/etc/powerdns/recursor.confはこんな感じにした。

  • local-addressを0.0.0.0に設定しないと、ローカル(127.0.0.1)からしか接続できない。
  • allow-fromは見ての通り。これを指定しないと、ローカルアドレス全てを許可してしまう。
  • forward-zonesは、ゾーンとコンテンツサーバの関係を記述。

キャッシュサーバと、LANのゾーン情報を!レッツらまぜまぜ!って感じです。
recursor.confを書き換えたら、Recursorを再起動。できあがり!

1
sudo service pdns-recursor restart

FreeBSDに導入

引き続き同様に、Mac内にあるFreeBSDの仮想環境にRecursorを導入する。
MacのホストOS、全てのゲストOSがこのキャッシュサーバを参照して名前解決を行い、 外出中でも開発環境上での作業を円滑に進められるようにする。
さきほどUbuntuに導入したものと構成は似ており、開発環境のゾーン情報を持ったPowerDNSの コンテンツサーバをRecursorでラップし、外の名前解決も可能とする構成。

まず、既存の/usr/local/etc/pdns/pdns.confを修正する。

注目すべきはlocal-addressとlocal-port。
local-addressはともかく、53/udpがこの後インストールするRecursorと競合する為、 ポートをずらす対応は必須。ここでは10053にしている。
設定したらPowerDNSを再起動。

1
2
su
service pdns restart

ここまでお膳立てを整えたら、早速Recursorをインストールする。

1
2
3
su
pkg install powerdns-recursor
sysrc pdns_recursor_enable="YES"

先ほどと同様、/usr/local/etc/pdns/recursor.confを作成。

  • さきほどのLAN(192.168.100.1/24)に加え、開発環境(192.168.101.0/24)からのアクセスも許可。
  • LANのゾーン情報に加え、開発環境のゾーン情報も追加。

複数のフォワードを行うときは、この様にカンマで区切ることが出来る。
また、先ほどのPowerDNSのポートを10053にずらしたが、この場合は :10053 と書き加えて ポートを明示的に指定する。
以前は、このフォワードに相当する機能を実現する為にゾーン転送を行っていたが、今後は この様な大仰な対応は不要。関連する設定を削除している。この点ではシンプルになった。

キャシュサーバと!LANのゾーン情報と!開発環境のゾーン情報を!レッツらまぜまぜ! (もういい)

iTunesのNow Playing情報をクリップボードに納める。

スクリプトエディタを開いて、こいつ↓をアプリケーションとして保存。
ダブルクリックで実行!

てきとうに改造して使って頂けばよいと思う。

当然ながら、Macにしか対応しません。
WindowsのiTunesって色々問題あると聞いてて、母艦が不要になったいまのiOSでは 使ってる人あんまりいないんじゃないかな。

ほんとは、こいつをトゥートするところまでやりたかったけど、AppleScriptでBOTを 書く手順を調べるのがダルすぎた。
クリップボードに納めるところまでで手を止めたおかげで、Twitterにも使えると思います。 Twitterのことなど正直どうでもいいいが。

以上、めちゃ久々にAppleScriptを書いた話。
実は、High SierraにまだAppleScriptサポートがあったことにびっくりしたw