それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

laravel で通知(slack/mattermost)を試す。

laravel で通知(slack/mattermost)を試す。

laravel で slack に通知(メッセージ送信)をする。

slack 互換のapi がある、mattermostでも「内向きウェブフック」を使えば同じように通知が出来る。

準備

  • webhook incoming のアドレス(URL)
  • composer でパッケージインストール

作業の流れ

  • 通知クラスを作る
  • 通知テスト用コマンドを作る
  • 通知(メッセージ送信)を実行する

クラスを作る

php artisan make:notification MyFirstNotification
php artisan make:command SendNotifySlackSample

通知クラスを作る

<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Notifications\Messages\SlackMessage;
use Illuminate\Notifications\Messages\MailMessage;

class MyFirstNotification extends Notification {
  use Queueable;
  
  public function __construct () {
  }
  public function via ( $notifiable ) {// 通知経路を書く、利用可能名を登録
    return ['slack'];
  }
  public function toSlack($notifiable){// 内容を書く。通知'slack'指定時に呼びされる。
    $msg = new SlackMessage();
    $msg->content('Hello from Laravel');
    return $msg;
  }
  public function toArray ( $notifiable ) {
    return [];
  }
}

コマンドを作る

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Notification;
use App\Notifications\MyFirstNotification;

class SendNotifySlackSample extends Command {
  protected $signature = 'notify:slack';
  protected $description = '通知サンプル';
  public function handle () :int {
      // 第2引数に、内向きウェブフック(incoming webhook)で作成されたアドレスを指定
    Notification::route('slack','https://mm.example.com/hooks/od6h5kme1ixxxxxxxxxx')
      ->notify(new MyFirstNotification() );
    return 0;
  }
}

mattermost のときはslackのURLの代わりに、Mattermostで作成したアドレスを入れるだけである。互換性って便利。

Slack/mattermostにメッセージ送信

php artisan notify:slack

これで無事にSlackチャンネルに届くはずである。

うまく届かないとき

curl コマンドで Slack/Mattermostのアドレスが正しく動くかテストしておこう。

URL=https://mm.example.com/hooks/od6h5kme1ixxxxxxxxxx'
curl -i -X POST \
   -H "Content-Type: application/json"\
   -d "{\"text\": \"Hello, this is some text\nThis is more text. :tada:\"}" \
  $URL 

送信ができたら

laravel では、通知はさらに抽象化してパーツに組み合わせて利用する。

  • 通知をためておいてまとめて送信するキュー機能
  • イベント発生・イベントリスナを登録するイベント機能
  • ユーザーごとに通知先を設定するUserモデル機能

などがあるので、組み合わせて使っていく。

Laravelで通知(メール)を試す。

Laravelで通知(メール)を試す。

laravel でコマンドを作ってメールを送信する。

必要なもの

  • SMTP/S接続情報

作るもの

  • Notification クラス
  • 通知を送信するコンソール・コマンド

laravel 通知の流れ

laravel 通知では、Notificationを実装したクラスをapp/notification に設置し、通知内容を設定する。

同じ通知内容をmail/slack/sms など複数経路で通知するためであり、Userモデルごとに通知先をチョイスするなどを決めるためクラスに分割されている。

通知を通知経路・通知先・通知内容でわけて抽象化してある。

通知はEvent発生で実行されるため、通知とイベントは不可分の関係にある。通知ごとにクラスを作ってどこにどれだけ送信するかをクラスに書いておくわけだ。

artisan コマンドで作成

通知を実装するMyFirstNotification と、通知を送るコード記述場所(今回はコマンド SendNotifyMailSample )を作成する。

php artisan make:notification MyFirstNotification
php artisan make:command SendNotifyMailSample

コマンドのソースコード

このソースコードで、artisan notify:mail を実行時に takuya@example.com 宛にメールを送信する。

/app/Console/Commands/SendNotifyMailSample.php

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Notification;
use App\Notifications\MyFirstNotification;

class SendNotifyMailSample extends Command {
  protected $signature = 'notify:mail';// コマンド名を指定
  public function handle () { // コマンドの中身を書く
    Notification::route('mail','takuya@example.com')
      ->notify(new MyFirstNotification() );
    return 0;
  }
}

通知内容と通知先

通知クラスを作り、通知クラスがどこへ送信されるかを定義する

app/Notifications/MyFirstNotification.php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Notifications\Messages\SlackMessage;
use Illuminate\Notifications\Messages\MailMessage;

class MyFirstNotification extends Notification {
  use Queueable;
  public function via ( $notifiable ) {//通知先を指定
    return ['mail'];
  }
  public function toMail($notifiable){// 通知先がmail時に実行される
    $msg = new MailMessage();
    $msg->subject('Hello from laravel.')
      ->greeting('Hello')
      ->line('sample mail');
    return $msg;
  
  }
}

メール設定をする

メール設定をする。

メールに付いてのSMTP設定は .envファイルに記載する。

.env

MAIL_MAILER=smtp
MAIL_HOST=mailcow.exmaple.com
MAIL_PORT=465
MAIL_USERNAME=servie@example.com
MAIL_PASSWORD=xxxP@assWroooORDxxx
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="service@example.com"
MAIL_FROM_NAME="${APP_NAME}"

メールを送信する。

php artisan notify:mail

これで無事にメールが届くはずである。

メールが届かないとき

SMTPの設定が正しいかチェックする

どこでも使えるcurl コマンドなどでSMTPとの接続をテストしてから再トライ。

echo 'To: takuya@example.com
From: takuya@mydomain.tld
Subject: this is a test from 465

this is a test
using smtps
' \
| curl -v --ssl --url 'smtps://mailcow.mydomain.tld:465' \
   --mail-from service@mydomain.tld \
   --mail-rcpt takuya@example.com \
   --user "account@mydomain.tld:XXX_PASS_XXX" \
   -T -

通知の送信ができたら

Laravel では、通知を単体で使うことはない。

通知はイベントリスナ・イベントハンドラと組み合わせ、何かが起きたときに通知する。イベント機能とあわせて使っていく。

また、その場で通知を送信するとブロッキングIOになり、レスポンス性能が悪くなるので、キューにためておいて別サーバーでワーカから送信する。キュー機能とあわせて使う。

いろんな機能があるので、組み合わせて使っていく。

関連資料

https://takuya-1st.hatenablog.jp/entry/2021/03/15/165137

bitwardenのパスワード入力をサクッとやるキーボードショートカット

bitwarden のパスワード入力に手間が多い。

自動入力をONにすると、暴発するので不便だし、最近はログインID/パスワードを別画面にしているのでうまく発動しないことが多い。 また、PINロックなど再起動時にロックされていると解除・選択・入力とマウスに持ち替えて操作するのも不便だ。

なにより「拡張機能のアイコン・ボタン」はちいさくで推しづらい

小さすぎる

入力選択が面倒

キーボード・ショートカットがある。

実はキーボードショートカットがあって簡単に呼び出せるのです。

キーボード・ショートカットで呼び出した場合、自動的にフォーカスするのでEnter・Tabを押していればほぼ確実に入力できる。

確認と変更

キーボード・ショートカットは拡張機能の全体設定で拡張機能単位にショートカットキーを割り当てられている。便利です。

chrome://extensions/shortcuts

bitwarden 便利

キーボードショートカットを使うことで、Bitwardenがますます便利になりますね。

ubuntu / debian で wake on lan ( WOL ) を送信する

ubuntu / debianwake on lan ( WOL ) を送信する

wake on lan コマンド

wakeonlan  MAC_ADDR

インストール

sudo apt install wakeonlan

パッケージで提供されているのでサクッと使えます。

コマンドの実行例

sudo wakeonlan 70:85:xx:xx:e6:xx
[sudo] password for takuya:
Sending magic packet to 255.255.255.255:9 with 70:85:xx:xx:e6:xx

前提条件

  • 事前にMACアドレスがわかっておく必要がある。
  • 事前にWOLに応答するように設定しておく必要がある(だいたいは有効になってる)

MACアドレスの調査はルータを見たらだいたい分かる。

ルータのDHCPの割当一覧の例。ルータにだいたいでてる。

WOLの応答設定

設定の確認箇所は2つです。

Windowsの場合は、いくつか設定箇所があります。デバイスマネージャーで見ればいいでしょう。

バイスマネージャーで「このデバイスでコンピュータのスタンバイを解除できるようにする」をチェック入れていればいいです。

ちなみに、Wake on LAN/Magic Packetに限定しない(チェックを外す)とRDP/SSHなど通信を受けた時点で電源が入ります。

関連資料

https://takuya-1st.hatenablog.jp/entry/2022/01/27/144513

Windows Proのリモートデスクトップ許可・拒否するグループとユーザーを設定する

リモートデスクトップのセキュリティ

Windows Proでもリモートデスクトップのユーザーごとの制限ができる。

Windows ServerとADがあればもっと別な方法があるのだろうが。自前PCなら、ローカル・セキュリティポリシとPro版で十分であると思う。

グループポリシー(ローカル)を起動する

gpedit.msc

Win-R を押して gpedit.msc を入力してEnter

グループポリシーが起動したら「ユーザ権限の割当」

次の順にたどります。 - コンピュータの構成 - Windowsの設定 - セキュリティの設定 - ローカルポリシー - ユーザー権利の割当

リモートデスクトップを使ったログオンの許可

許可設定でリモートデスクトップを使ったログオンを許可するグループが設定されています。

AdministratorsグループとRemote Desktop Users *1が許可されています。

リモートデスクトップを使ったログオンの拒否

リモートデスクトップでログインさせたくない、ユーザやグループを列挙します。

RDPのセキュリティはユーザ単位で

RDPの設定は、セキュリティ単位をIPアドレス制限にしてしまう個人ブログが見られるが、基本的には、ユーザーグループ単位で許可するのが基本。それをやったうえで、IPアドレス制限にするといい。

っていうか、IPアドレス制限やユーザー制限をやりたいと考える場合、個人所有PCの場合は、パスワードを入力したくない欲求があるんじゃないだろうか。「パスワードの単純化」のために行っているとしたらそれは暴挙である。Google HomeAmazon Echoなどデバイスが家庭内にあふれ、IPv6が家庭内に割り当てられている現代において、パスワードなしや単純なパスワードでRDPを許可するなど恐ろしいことです。

*1:たしかWin7以降は使わない歴史的経緯

nginx設定の config でhtmlを直接書き出す(return)

昨日、echoモジュールに付いて記事を書いたら

直接 return できるよって教えてもらった。

nginx設定 で 直接HTMLを書き出す。echo モジュール。 - それマグで!

直接 return 200 &quot;&lt;!DOCTYPE html&gt;&lt;h1&gt;It works.(nginx)&lt;/h1&gt;&lt;/html&gt;&quot;; するのはどうでしょう..?

2022/08/16 16:19
b.hatena.ne.jp

昨日、nginxから直接コンテンツを書き出す方法を調べてechoモジュールを利用する記事を書いたら、コメントでもっとシンプルでモジュールがいらない方法を教えていただいた。

早速試してみた。

default に書いた

/etc/nginx/sites-enabled/default

  location /world {
     add_header Content-Type "text/html";
     return 200 "<h1>It works.(nginx)</h1>";
  }

リロードして動作させる。

sudo nginx -t  && sudo nginx -s reload

HTMLが表示された。

404 も試してみる

  location /not_found {
     default_type text/html;
     return 404 "<h1>It works.(nginx)</h1>";
  }

404 を返しつつHTMLが表示された。

設定がシンプルになりました。

echo モジュールを使わなくても良くなったので完璧だ。tmyk_kymさん、ありがとうございます。

これで、デフォルトサーバーが変なコンテンツを返却しなくて済むし、nginxの設定だけで完結する。

nginxの設定ファイルから直接HTMLやテキストを書き出しておけば設定がとてもシンプルでいいですね。フォルダへの依存が排除できて最高です。

参考資料

nginx設定 で 直接HTMLを書き出す。echo モジュール。

2022-08-17 追記

return 200'message' を使ったほうがスッキリします → https://takuya-1st.hatenablog.jp/entry/2022/08/17/161838

echo モジュールでHTMLを応答する。

nginx設定 で 直接HTMLを書き出す。echo モジュール。

まるで、古(いにしえ)の技術のCGIのように、HTMLをecho で作成できる。

設定例

location /hello {
     default_type text/html;
     echo "<!DOCTYPE html><h1>It works.(nginx)</h1></html>";
 }                   

実行例

準備

この、nginxの location に記述したecho から直接レスポンスを返すには、echoモジュールが必要である。

echo モジュールは github で配布されている。(https://github.com/openresty/echo-nginx-module#echo)

ubuntu の場合、apt パッケージで提供されている

apt list libnginx-mod*
apt install libnginx-mod-http-echo

設定例

設定は、echoするだけでいい。ただし、octet-streamになってしまい、ブラウザでみるとダウンロードになってしまう。そこで、text/plain を指定して閲覧可能にする。

location /hello {
    default_type text/plain;
    echo "It works.(nginx)";
}                   

text/htmlの例

HTMLを配信できる🚗。

location /hello {
    default_type text/html;
    echo "<h1>It works.(nginx)</h1>";
}                   

活用方法

これを一体、何に使うのかと思うだろうが、実はとてもいい使い方がある。

server _defaultのデフォルトサーバーとともに使うととてもいい。

nginx ではサイトのドメイン名ごとにvirtual hostを設定していくと思うが、デフォルトサーバーの設定を忘れて、変なページが見えてしまうミスが多い。存在しないドメイン名で呼ばれたときに、404 を返しつつ、なにかメッセージを出したいとき、/var/www/default/htmlなどとフォルダを用意するのがとても不便である。自動化スクリプトを書いてると、nginxのデフォルトのwelcome to nginx を削除するのすらも面倒だよね。

デフォルトサーバーの設定が、nginxの設定だけで完結してスッキリした。

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    listen 443 ssl http2 default_server;
    ## 404 をそのまま返す
    location / {
        echo_status 404;
        default_type text/html;
        echo "<h1>It works</h1><p>but not found Domain Name.(nginx)</p>";
    }
}

これで、存在しないドメイン名を指定されたら404を返し、HTMLでメッセージもだす。

いちいちファイルを作らなくていいのが快適です。

実行例は、この様になる。

注意点

nginx には、apacheのような<IfModule>ディレクティブがないみたいなので、シンタックスエラーになる。libnginx-mod-echoがないとnginx -t やリロードでサーバーが停止するので注意が必要

参考資料

故障したSSDを保証申請して、交換してもらった。

nvme のSSDが死んだので保証申請した。

今回、故障したSSDはこちら XPG SSD M.2 512GB SX8100 シリーズ Type2280 PCIe3.0x4 NVMe 3D NAND DRAMバッファ 5年保証 ASX8100NP-512GT-C

購入後、半年程度で故障したわけです。

ADATA に問い合わせた。

ADATAに問い合わせたところ、販売代理店の経由でしか交換保証は受け付けないとこのこと。

Amazon co jp の保証申請を問い合わせた。

この商品は、「販売: アマゾンジャパン合同会社」から購入した。

前回の故障では、Crucial製品でのマケプレの失敗で保証を申請できずに泣いた。マケプレと気づかずに買ってしまい、並行輸入品だった。マケプレの販売業者と連絡がつかないし、Amazonに泣きついたが、マケプレに連絡がつかなかった。その反省から、アマゾンが販売する商品を買ったのだ。

アマゾンのカスタマーサポートに聞くと、アマゾンジャパンでは、故障などの保証を行わないとのこと。

悪夢再来かとと青顔になった。

が、話を進めると、アマゾン販売のPC関連商品は、アーキサイトの仕入れになっており、保証申請はアーキサイトを経由して行うとのこと。

アーキサイトに連絡を取った。

アーキサイトのホームページから、保証申請について問い合わせた。

翌日で返答があった。

故障した商品とAmazonの領収書を送付すると、保証が受けられるとのこと。良かった。

アーキサイトに送付した

NVMe のSSDと、Amazonレシートを印刷したもの、問い合わせ番号を封入し、郵送にて送付した。

SSD自体は、暗号化デバイス(Bitlocker)で使っているので特に消去する必要も感じなかった。そもそも故障しているので初期化しようがないので。そのまま送付した。暗号化ディスクは安心ですね。SSD故障で消去困難になっても、チップから強制的なデータ読込がされて、データ漏洩の心配がないので、暗号化は本当に安心ですね。

数日で新品が届いた

佐川急便から、交換品が届きました。

良かったです。

アーキサイト様、ありがとうございます。

月曜日に送付して、木曜日には交換品が届いたので本当に仕事が早い。

改めて、パッケージを確認すると、保証など連絡先は「アーキサイト」にとステッカーが貼付してある。なるほど問い合わせる前にパッケージを確認すればよかったのですね。

SSDの保証についての注意

購入元が国内正規代理店の経由の商品であり、領収書が確保でき、メールで自分で問い合わせできる事が必要。

レシート・領収書の保存

購入年月日を証明する資料は残しておく。

マケプレは、負けプレになる可能性がある。

アマゾンで購入したSSDの5年保証は、必ず受けられるとは限らない。販売者に連絡がつかないことがある。アマゾンで購入する場合は販売元に留意する。保証申請で手間取らない販売店から購入する必要がある。

アマゾン購入の前に、販売元を確認する。連絡が取れる販売者から購入する。

一言で言えば、ホームページを持っており住所やサポートが確認できる販売者であること確認する。

予備の入手可能性とバックアップ

SSDの故障は、自分の作業が完全に止まってしまうのでバックアップと予備のSSD/HDDを持っておく必要がある。

データバックアップ大事。あまりに格安を求めて保証もサポートもない丸腰生活はちょっと怖いな。 論文締め切り間際でパソコン故障とか毎年ツイッターで見かける事故ですからね。

いまは、Amazonで即日に別個体のSSDを入手可能なのでそこまでダメージはデカくないけどね。知り合いに聞くとPCの故障はPCショップが近くにないと即死ダメージだったので本当に苦労したらしい。

暗号化は重要

ディスクは暗号化しておきましょう。SSDが動作不能になって、メーカに送付することになっても、データ漏洩のリスクは極めて低いです。安心して送付できます。日頃からディスクは暗号化しておきましょう。

WindowsにNodeJS環境を作る/scoop

NodeJSのインストール。by scoop

scoop の準備

scoop を入れるために、リモートコードを許可する。

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

scoop をインストールする

Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')

scoopのインストール先

scoop は /User/takuya/scop にインストールをします。

nodejs インストール

scoop で nodejs(LTS) を入れる

nodejs/npm/npx をインストール

scoop install nodejs-lts

実行画面。

実行するとこんな感じ。

Scoop でnodejs を入れると

scoopで入れると PATH設定をやってくれる。これが楽。

インストール時に必要はPATH設定が同時に実行されるため、特に何も考えず、コマンドが使える。

このため、コマンド関連はscoopでインストールが便利

nodejs をインストールした場合のPATH

次のコマンドがPATHに追加されている。

PS C:\Users\takuya> $env:path.split(";")
C:\Users\takuya\scoop\apps\nodejs\current\bin
C:\Users\takuya\scoop\apps\nodejs\current
C:\Users\takuya\scoop\shims

chocolatey より便利な場合が多い

choco だとパッケージが多かったり、最新版が来なかったりするし、管理者ユーザーでかんりするひつようがるが

scoop なら初期設定がユーザ空間で、ユーザーインストールされるので、サクッと使うには便利かもしれない。

WSLと共存はめんどくさい。

ただし、WSLと共通のコマンド(npm/node)を入れてしまうと。PATHが競合して面倒が起きる。

対応するには、PATHの優先順位を逆順にするなどいくつか対応が必要です。

echo $PATH | \
    sed -e 's/:/\n/g'  | \
    awk ' { if ( $1 ~ /mnt/ ) print length(),$0 ; else print length()+1000, $0 } ' | \
    sort -nr  | \
    cut -d ' ' -f 2- | \
    paste -sd ':'

たとえば、/mnt/ が含まれるPATHエントリを優先度下げるとか。WSL側でWindowsに設定された同じコマンド( python, pip / node , npm / php )でPATHの競合が起きないよう、優先順位を配慮した設定が必要になると思われます。

設定例

サクッと書いてみた設定例。

## PATH 変数をソートする
## windowsの空白文字なディレクトリだと誤作動する。
## /mnt/c のPATHはWindowsコマンドなので優先度を下げる。
function sort_path_env {
  path=$*
  # path=${path//:/ }
  path=$( echo $path | sed 's/:/\n/g' | awk '{ if( $1 ~ /mnt/ ) print length(),$0 ; else print length()+1000, $0 } ' | sort -nr  | cut -d ' ' -f 2- | paste -sd ':' )
  echo $path
  return 0
}
export PATH=$(sort_path_env $PATH)

Orange pi は熱がやばい。

orange pi zero / armbian を使ってみたのですが。

とにかく、熱い。燃える。これは一歩間違えば火事かもしれない。

冬場ならともかく、年中に常時起動するのは無理だろう。

Raspi zero の代用にはなるし、実験用にはいいけど、常時ONには向かない。

NTTひかり電話をwireguard経由で使って外出から固定電話で電話番号認証をする

NTT ひかり電話VPN経由で使う

10年遅れかよって話なんだけど、いまさらながら、NTTひかり電話スマホで使えるようにした

NTTのホームゲームにルーティングを書く

ルーターに経路を書く

通常はNATで転送し、NTTのHGW宛だけNATせずに直接パケットをAccept(転送)するように書いた。

もっと具体具体的にUDP 4000/5600 やらSIPやら指定してもいいかもしれないけどめんどくさいのでざっくり指定

Wiregaurdを入れた

WireguardでスマホグローバルIPにつないだ。

設定のポイント NATしない。

SIPのNAT転送はできないので、パケットを単純Acceptで別のNICに流すだけ。

iphone --<4G/5G/internet> -- router --  ntt-hgw -sip

わたしは、NTTのホームゲートウェイでPPPoEやv6をやらず、ルータを設置しているのでGWルータにWireguardをいれて、そこへ接続。あとはパケットを許可して経路を変えるだけ。NATはしない。そのためNTTのホームゲートウェイがパケットの帰途先がわからなくなるので、ルータ(192.168.100.2)あてに静的ルートを書いてある。

なんで?今更?

なんでいまさら、と思うかもしれないが、イラッと来たのである。

ゆうパック」と 「電話番号認証」が原因

みどりの銀行の電話番号認証がゴミ

銀行が電話番号に受電してくる、または電話番号から架電するという、クソみたいな認証を採用している

WEBアプリケーションに電話番号なんていう古代遺産を使われたので、しかも登録している番号が実家の固定電話ときたもんだ。 もう仕方ないので、私も、古代遺跡からSIPのリモート利用という古代アーティファクトを発掘して使うことにした。

電話番号認証とか滅びればいいのに

ゆうパックの再配達フリーダイヤルを使えない

ゆうパック」から不在で着信があったが、掛け直すとコレクトコールである。有料電話番号である。0570である。困った。

固定電話からは、0120のフリーダイヤルが提供されているが、携帯電話から0570(有料)である。

我々がかけ放題にせっかく加入しているのに0570である。ひどい。

だったら、私も固定電話経由で掛けられるようにするまでだ。

このご時世なんだから、電話番号ではなく、LINEリンクやSkype Me(古い)を用意しておいてくれたいいのだ。

なんでVoIPの技術が山ほどあるのに金銭発生させて架電しなくちゃならないのか。

こういうところだぞ総務省

デバッグ

デバッグメモ

488 Not Acceptable Here コーデックに高品質を指定した場合によくおきる
           NTTホームゲートウェイが非対応で怒ってる
SIP/2.0 401 Unauthorized なんかわからんが、いつも出るので気にしない
SIP/2.0 403 Forbidden 禁止 ID/PWと内線番号が一致しないときにでる
SIP/2.0 INVITE sip:090123456789@192.168.100.1 SIP/2.0 架電開始

macで接続中のWifiのSSIDを取得するコマンド

networksetup コマンド

接続中のWifiSSIDを取得する

コマンド

networksetup -getairportnetwork en0

実行例

takuya@~$ networksetup -getairportnetwork en0
Current Wi-Fi Network: Takuya's iPad 6

これで、SSIDを取得することができる。SSIDをテキストでコピペしたいときに便利です。

テキストでコピペするときとは、SSIDを指定して接続する際に他人に教えるとき

SSIDを指定して該当SSIDのときだけVPNを接続するなどです。

SSIDもランダムで複雑化していたり、文字種が指定されていたりします。

手作業で、目視で複写するのは回避すべきですね。

github actions は自動停止される

github actions 無敵じゃなかった

Github Actions で定期的にスクリーニングをやっていたが、先日次のような警告が。

意訳

60日以上利用がないレポジトリでの自動実行は停止されます。

(個人的な解釈)

github にコミットするとき用のActionなので、開発してないコミットしない連中はお断りだ。

対処法

Actions内部で commit を自動コミットをすることに。

対応した。が、ぜったいこのような方法は、対策されてできなくなりますよね。

jobs:
  update_and_push:
    runs-on: ubuntu-latest
    steps:
      - name: checkout
        uses: actions/checkout@v2
      - name : update lists
        shell: bash
        run : |
          date -I > last-update.txt
          date -I >> update.txt
      - name: push updated lists
        uses: stefanzweifel/git-auto-commit-action@v4.2.0
        with:
          commit_message: update-lists

やっぱりクラウドサービスって怖いですよね。いつどこで停止されるかもわからないサービスに依存するのは怖い。

ffmpeg/mplayer で認証が必要な m3u8 を開く(Radiko)

ffmpeg でhttpを開くときHEADERが送信できる

ffmpeg ではHTTPヘッダを送信できる

ffmpeg -i http://example.com/a.m3u8 -headers 'Authentication: XXXXX' 

もちろん ffplay でも同じように

ffplay -i http://example.com/a.m3u8 -headers 'Authentication: XXXXX' 

mplayer 側でも対応している

mplayer でもhttp-header への対応は完了してる。

mplayer -http-header-fields 'X-Radiko-AuthToken: xxxx'

radikoの場合

radikoは旧のAPIがまだ生きている(たぶん、Google Home などの旧ハードウェアを切り捨てないため)

そのため、次のように掛けば再生ができる。

mplayer の場合

token=XXXXX
channel=MBS
URL='https://radiko.jp/v2/api/ts/playlist.m3u8?station_id={$channel}&l=15&ft=20200419210000&to=20200419211500'
mplayer -http-header-fields 'X-Radiko-AuthToken: {$token}'  $URL

何も考えなくて良くなったのは本当に楽。

mplayerを使うとコンソールからボリュームの上げ下げやスキップができるのでタイムフリーを聞くときに便利

ffplay の場合

token=XXXXX
channel=MBS
URL='http://f-radiko.smartstream.ne.jp/{$channel}/_definst_/simul-stream.stream/playlist.m3u8'
ffplay -i $URL -nodisp -vn -sn   -headers 'X-Radiko-AuthToken: {$token}'"

ffplay のほうがキャッシュの扱いがきれいでバッファリングをうまく制御してくれますね。

token の取得

探せば山ほどあるので割愛。

curl コマンドでリクエスト送るだけ。

http header 送信できる

ffmpeg / mplayer は http ヘッダを直接送信できるので認証をうまく制御できるので各種プレイリストの再生が捗る。

視聴者(ユーザー追加)プライム・ビデオの視聴履歴を分離する

amazon プライム ・ビデオに視聴者を追加する

視聴者を追加すると、視聴履歴を分離できます。FireTVやタブレットを使わせる場合にはこちらを活用したほうが良いでしょう。

キッズ向けの制限を加えることや不用意なコンテンツへの課金・アクセス制御など、ペアレンタルコントロールがある程度使えるようになっています。

家族と共有

また、家族とコンテンツ課金を共有する場合にスマートテレビ(AndroidTV)なども、視聴者機能で分離できます。

プライム家族会員は歴史的経緯からでしょうか、送料無料系しかありません。アマゾンのデバイスが多数発売され月額課金も増えています。このあたりの課金を整理をしてほしいところです。