錯誤試行

PCや生活の試行錯誤の成果を報告するブログ

UbuntuでBluetooth経由で聴いているSpotifyのCMをミュートする


不快なCMをミュートしたい

音楽ストリーミングサービスのSpotifyを、Linux用のPCクライアントアプリ(Spotify for Linux)を使ってBluetoothヘッドホンで聴いている。
ショートカットキーで再生/停止や曲送り、ミュートができるように設定したところ、好みでない曲をすぐスキップできたり、しつこく繰り返されて聞きたくないCMを素早くミュートすることができたりと快適になった。

そのように快適に利用していたが、だんだん特定のCMが不愉快になってきた。
そのCMは、ささやくような呼び掛け声から始まるのだが、この声がCMの開始と同時に、不意打ちのようにヘッドホンで聴いている耳元にささやきかけられるので、びっくりするとともにギョッとして不愉快になる。
そして悪いことにこのCMが一番多く流されてくるので、何度も何度も不快な不意打ちをされることになった。

しばらくは手動でミュートしていたが、この不意打ちが不愉快でたまらず精神衛生上好ましくないため、このCMが入りしだい音声をミュートにする方法を調査した。
OSはUbuntu 16.04で、前提としてbluezパッケージがインストールしてあり、Bluetooth経由で音楽を聴いていることが条件。

シェルスクリプトで対応

調べてみると、シェルスクリプトで対応する方法があるようだった。
参照サイトに挙げたページのスクリプトを改変して、以下のスクリプトを作成した。

#!/bin/bash
dbus-monitor "type='signal',path='/org/mpris/MediaPlayer2',member='PropertiesChanged'" | 
while read -r line ; do
    # 広告文字列の有無を判定
    if ! [[ ${line} == *'000000000track-id-here0000000000'* ]]
    then
        # 広告文字列なし
        # ミュートがオフでなければミュートを解除する
        if ! [[ ${mute} == '0' ]]
        then
            echo 'mute off'
            num=`pactl list sinks short | grep bluez`; pactl set-sink-mute ${num:0:2} 0
               mute='0'
        fi
    else
        # 広告文字列あり
        echo 'mute on'
        num=`pactl list sinks short | grep bluez`; pactl set-sink-mute ${num:0:2} 1
        mute='1'
        # 広告文字列が見つかったらループを抜ける
        break
    fi
done
# 広告が終わるまで待つ
sleep 1.3
# このスクリプトを再実行する(無限ループ)
exec $0

備考
  • スクリプト中5行目の「000000000track-id-here0000000000」はダミー文字列。これをtrackidの値に置き換える(trackidについては以下を参照)。
  • 確認していないが、12・18行目のbluezをalsaにすれば、有線接続のスピーカーで聴いている場合にミュートできるようになるはず
  • 2行目のdbus-monitorコマンドを実行しておくと、曲が開始されたときにメタデータが出力される。
    くだんのCM以外のCMについては通常通り音声が流れて構わないので、メタデータに含まれるtrackidというキーを使って件のCMだけをミュートする。
    件のCMが流れた際のtrackidの値を確認しておき、5行目の広告文字列の有無の判定(「000000000track-id-here0000000000」の箇所)に指定した。

    ミュートできない場合があり確認したところ、件のCMに振られているtrackidが一つだけではないのが原因だった。件のCMが流れた際のtrackidをしばらく確認したところ、2つのtrackidを使って広告が配信されているようなので、5行目の広告文字列の有無の判定を以下のように2つのtrackidを指定するよう変更したところ、問題なくミュートされるようになった。

        if ! ([[ ${line} == *'000000000track-id1-here000000000'* ]] || [[ ${line} == *'000000000track-id2-here000000000'* ]])
    

    まとめ

    CMが嫌なら有料プランを契約しろという話だが、特定の広告が不愉快なだけなのでミュートで対応することにした。
    あくまで、不愉快で耐えがたいCMに対処するための一時的な措置と考えている。

    金銭的な余裕がある場合は、素直に有料プランにすればこうした手間もなく、スマホアプリで楽曲を指定した再生もでき、曲をダウンロードしてスマホの通信容量を消費せずに再生(オフライン再生)できたり、外出先や移動中でも好みの楽曲が聴けるようになるのは大きなメリットなので、サブスク契約を検討したい。

    参照サイト

    Ubuntu(Linux)でMicrosoft Wordファイル(.doc/.docx)やpdfファイルの文書内容をコマンドラインから検索する

    Ubuntu(Linux)でpdfやwordをはじめとしたさまざまな文書ファイルの中身の文字列を横断検索するには「Recoll」を使うのが簡単だが(複数pdfを横断検索する方法の検討 - 錯誤試行を参照。Windows版・Mac版もあり)、事前にRecollにディレクトリを登録してインデックスを構築しておく必要がある。

    普段は検索しないが今回に限り検索したいディレクトリがある、という場合に、いちいちRecollに登録するのも手間がかかる。そこで、特定のディレクトリ以下にあるMicrosoft Wordファイル(「.doc/.docx」)やpdfファイルの中身をコマンドラインから検索する方法を調べたのでメモしておく。
    (Recollでインデックスに登録したpdfをコマンドラインから検索するには「Recoll(端末から検索する)」を参照)

    最初に「catdoc」「docx2txt」「poppler-utils」パッケージをインストールする。

    sudo apt-get install catdoc docx2txt poppler-utils
    

    • 「.doc」ファイルの中身を検索する
      カレントディレクトリとサブディレクトリ以下にある「.doc」ファイル名と「ほげ」という文字列を含んだ箇所を表示する(行番号を付けて、ヒットした行の前後3行を表示)。

      find . -name "*.doc" | while read LINE; do echo "-----`ls "$LINE"`-----"; catdoc "$LINE" | grep -n -A 3 -B 3 "ほげ"; done | less
      

    • 「.docx」ファイルの中身を検索する
      カレントディレクトリとサブディレクトリ以下にある「.docx」ファイル名と「ほげ」という文字列を含んだ箇所を表示する(同上)。

      find . -name "*.docx" | while read LINE; do echo "-----`ls "$LINE"`-----"; docx2txt "$LINE" - | grep  -n -A 3 -B 3 "ほげ"; done | less
      

    • pdfファイルの中身を検索する
      カレントディレクトリとサブディレクトリ以下にあるpdfファイル名を表示し、「ほげ」という文字列を含んだ箇所を表示する(同上)。
      pdfファイルが多いとだいぶ時間がかかるので、素直にインデックス登録型のデスクトップ検索ソフトを利用した方がよい。
      (Recollでインデックスに登録したpdfをコマンドラインから検索するには「Recoll(端末から検索する)」を参照)

       find . -name "*.pdf" | while read LINE; do echo "-----`ls "$LINE"`-----"; pdftotext "$LINE" - | grep -n -A 3 -B 3 "ほげ"; done | less
      

    • 「.docx」ファイルの中身を検索する(pandocコマンドを使用)
      pandoc」というコマンドでも「.docx」ファイルの検索ができるが、上記の「docx2txt」の方が「.docx」ファイルに特化しているためか検索速度が速いのでおすすめ。なお、pandocコマンドは残念ながらpdfファイルの読み込みはできない。pdfファイルが読み込みできれば、docxとpdfファイルを一度に検索できて便利だったのだが。

      sudo apt-get install pandoc
      find . -name "*.docx" | while read LINE; do echo "-----`ls "$LINE"`-----"; pandoc "$LINE" -t plain | grep -n -A 3 -B 3 "ほげ"; done | less 
      

    関連サイト

    UbuntuでTwitterクライアントmikutterを使う

    マルチペインで表示できるPC用Twitterクライアントを探していて見つけたmikutter*1Ubuntuに導入した際のメモ

    目次

    結論

    前提として、Twitterの開発者サイトで英語での申請が必要で手軽には使い始められない。
    それさえできれば、AppImageのバージョン3.9.8を使えば最も簡単に使うことができる。詳しくは以下のサイトを参照。

    導入

    • APIの利用申請が必要
      事前にTwitterの開発者サイト(Use Cases, Tutorials, & Documentation | Twitter Developer Platform)でAPI利用の申請が必要。さらに、mikutterでTwitterを使うためのプラグインTwitter API v1.1までの対応のため、最初の申請で利用できるようになるAPI v2.0ではプラグインを使うことができず、API v1.1が利用できる「Elavated」の申請が重ねて必要になる(2021年12月時点)。申請方法は検索すれば出てくる。最初の申請は名前を入力したり選択項目から選ぶだけでよく、申請直後からAPIを利用できるようになったが、「Elavated」の申請では使用目的などを英語で、指定の文字数(100文字/200文字)以上になるようフォームに入力しなくてはならず、また申請は承認制で、承認の結果が分かるまで時間がかかるようだった。使用目的の英文作成はとてもハードルが高く感じたが、端的な文章を規定の文字数を何とかクリアする程度に多少盛って、DeepLやGoogle翻訳で翻訳したもので問題なかった。内容としては「API v1.1にしか対応していないTwitterクライアントを使用したい」「大量の処理は行わない」旨を記載し、回答内容が重複する質問項目については、同じ文章をコピー&ペーストした。
      申請後、Twitterから承認の可否を知らせるメールは特に届かず、申請してから3日後にTwitter開発者サイトにアクセスしたところ、API v1.1が使える「Elavated」が承認されていた。
    • Twitterプラグインを用意する
      GitHub - mikutter/twitter_bootstrap: The most popular Twitter client for mikutter plugin, teokure first projects on the Linuxとか desktop.を参照してTwitterプラグインをインストールして、Twitter開発者サイトで入手したAPIキーをセットする。
    • mikutter公式サイトでAppImage版(バージョン3.9.8)をダウンロード
      プラグインのエラーは出るが動作した。
    • ソースからインストールする場合
      記事作成時点の最新版(バージョン4.1.7)はruby2.5以上対応となっていた。bundle installを実行し、何か足りないと言われたらgem installでインストールする。
      Debian stretch に mikutter 3.6 を入れてみた | Q3がソースからのインストール方法をまとめてあり助けになった。
    • Twitterプラグインを動かすにはsnap版やバージョン4以降のAppImage版ではダメ
      同梱されているrubygems(Rubyのライブラリ)にtwitter-textというgemが入っていなくてエラーになる(以下)。

      /tmp/.mount_mikuttWurcOc/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_ \
      require.rb:54:in `require': cannot load such file -- twitter-text (LoadError)

    使い方などのメモ

    • 新しいタブの出し方
      右クリックや「Ctrl+t」で出すのではなく、設定の「抽出タブ」(後述)でツイートを表示する条件を設定すると新しいタブが表示される。
    • ペインについて
      抽出タブを右クリックして「新規ペインへ移動」すると、ウィンドウの一番左にペインが作成されてそこにタブが移動する。タブはドラッグ&ドロップすることでペイン間を移動できる。ペインをたくさん増やしても横スクロールバーは出ず、1ペインの表示領域が狭まっていく。
      抽出タブで表示するタイムラインが一画面に収まる範囲なら、複数のペインを作って表示すると一覧性が良いが、画面に収まらない数のタイムラインを見たいならタブを切り替えて閲覧する。
      手元の環境では、ペインは2つにして左側にHomeタイムライン(「t」の表示のタブ)、右側に抽出タブを表示するようにした。
    • フォント設定とツイートの表示
      フォントサイズを大きくし過ぎると(15以上ぐらい)、ツイートの文章が1ツイートに割り当てられている表示領域に収まらず文字が欠けてしまう。1ツイートの表示領域を広げるような設定は見当たらないので、表示領域に収まるようにフォントサイズを小さくするしかない。
    • 過去のツイートをさかのぼって取得できない
      mikutterの起動時、タイムラインには起動する前の一定時間内(3〜6時間程度)のツイートのみ表示される。下までスクロールしてもそれより前のツイートは表示されず、Twitter公式サイトのように延々とタイムラインを下りていくことはできないので、過去にさかのぼってたくさんツイートを読みたいときは物足りなさを感じる。
      使い方の提案

      一方で、過去にさかのぼれないということは読み切ることができるということで、起動後にしばらく放置しておいて、読みたくなったらEndキーで一番下まで移動して、起動後から現在までのツイートまでを「全消化」する(した気になれる)という使い方を提案したい。ツイートが際限なくロードされるのは延々と読める一方で、延々と読みたくないときにはキリなく感じられてくる。読みたくなければ読まなければいいのだが、それはそれとして、日々ツイートをたくさん読んでいて食傷気味だという場合は、終わりがあることでツイートを読むのが心理的に楽になるかもしれない。

    • 画像リンク
      クリックするとウィンドウがポップアップして画像が表示される。キーボードショートカットで開く方法は無いようだ。プラグイン(GitHub - moguno/mikutter-subparts-image: mikutterで画像をインライン表示するプラグイン)を入れれば、Twitter公式サイトのようにタイムライン内に画像を表示できる。これは便利なので入れておきたい。プラグインのインストールは、プラグインを解凍したものを~/.mikutter/pluginに置いてmikutterを再起動すればよい。
    • タイムラインにプラグインのエラー表示が出る
      TwitterプラグインのいくつかがGTK3対応版にアップデートされているが、mikutter本体がまだGTK3に対応していないのが原因とのこと(GTKとは*2 )。GTK3に対応させるにはmikutter GTK3対応(1) 〜とりあえず動かしてみる〜 - tsutsuiの作業記録置き場を参照。GTK3対応を試みたが、手元の環境ではエラーが出て起動しなかったため、Mikutter · GitHubからエラーの出ているプラグインを探してGTK3に対応する前のコミット(だいたいは最初のコミット)にcheckoutして元のものと差し替えると、プラグインのエラー表示が消えて、エラーの出ていたプラグインが使えるようになったが「list_settings」プラグイン(リストの管理機能)だけは動作しなかった。
    • ツイートの詳細(「message_detail_view」プラグインを最初のコミットに戻したもの)の背景色は変更できなかった
      ツイートの詳細画面の背景が真っ白で目が痛いので背景色を変えたかったが、設定からさまざまな項目の背景色を変更しても、ツイートの詳細の背景色は変更できなかった。(mikutterの実行ファイルディレクトリ)/core/userconfig.rbの「mumble_basic_bg」の定義を直接書き換えれば変更できそうだったが変化しない。~/.mikutter/settings/setting.ymlに設定してもダメだった。

    設定

    注記が必要そうなところ

    • 表示
      「タブの位置」
      標準だとタブの見出しが横に表示される。公式サイトのアプリ画面例のようにタブの見出しを上に表示するには「上」を選択する。
    • 抽出タブ
      複数のユーザーのタイムラインを表示したいなどの場合は、ここで予め抽出条件を設定すると、その条件で抽出されたツイートが表示されるタブが出現する。設定してもすぐにはタイムラインは表示されず、しばらく放置しておくか再起動するとタイムラインが表示される。
      抽出条件にリストを指定する際は、自分がフォローしているリストがフォロー先のアカウント名で表示される。自分のアカウントのリストは表示されない。リストによっては少し時間を置かないと表示されない場合もある模様。
    • ショートカットキー(キーカスタマイズ)
      デフォルトではほぼ設定されていないので、自分の好みに応じて設定する。みんなのmikutterショートカット - Togetterに設定例があり参考になる。viライクなキーバインドにも設定できる。起動直後はペインを移動するキーが利かなかったが、一度タブキーやマウスで移動させてやると動くようになった。
    • フォント・背景色
      設定した後、再起動するか該当箇所を選択してフォーカスが当たると設定が反映された
      • リツイートした引用ツイート
        リツイートの背景色の設定項目が「背景色」→「コメント付きシェア」と「コメント付きシェア 背景色」で重複して存在しており、後から設定した方が有効になる。
        左のヘッダの設定項目が無く、黒で固定になっている。右のヘッダも、どの設定項目の「ヘッダ(右)」を変えても変化せず、これも色が固定である模様。デフォルトの背景色に設定している色との兼ね合いで、背景色を「#2B2B4D」に設定して少し見やすくなった。

    不具合

    • ショートカットの「開く」が「ブラウザで開く」の動作になる
      「開く」を実行すると、ツイートがmikutter内のタブで開かれずにブラウザで開かれる。プラグインの「message_detail_view(ツイートの詳細を表示)」がGTK3にしか対応していないのが原因らしい。
      GitHub - mikutter/message_detail_view: 単一のツイートの詳細な内容を表示するタブを追加するからクローンして最初のコミット(GTK2版)に戻したものに差し替えたところ、mikutter内でツイートの詳細タブが開いた。ただ、タブの背景色が真っ白で目が痛くなるため変更したいが、設定から変更することができない。しかし、別にツイートを改めて別タブで表示する必要もないかもしれない。
    • ショートカットの「リンクを開く」が動かない
      https://dev.mikutter.hachune.net/issues/1243を参照して(mikutterの実行ファイルディレクトリ)/plugin/command/command.rbを修正したところ動作した。

    まとめ

    • 導入と設定が大変・開発者向き
      Twitter公式ウェブアプリのTweetDeckが、タイムラインをマルチペインで表示できてとても便利だったので、さらに痒いところに手の届きそうなネイティブのクライアントでマルチペイン表示ができ、Linuxで動くTwitterクライアントを探していたので導入してみた。
      本来、TwitterAPIで開発をするような人のためのTwitterクライアントであり、またTwitterAPI v1時代からの「枯れた」Twitterクライアントなこともあって、現行のインストール方法や設定方法を手引きした初心者向けの解説がなかなか見当たらず、導入や設定はだいぶ大変だった。
      使ってみた感想としては、自分のような一般ユーザーがデフォルトのまま使っているぶんには、TweetDeckの方が簡単・便利で画面もリッチで高機能と感じられた。特にタイムラインを下って過去のツイートをずっと読み進められない点が残念。しかしその一方で、ネイティブアプリの打てば響くクイックな動作や、後述するようにキーボードショートカットによる操作が快適で、個人的にはそこがTwitterクライアントを選ぶ上で重要なポイントだったので、TweetDeckよりも愛用するようになってきている。

      ただし、そもそもmikutterはプラグインでその真価を発揮するものらしく、しかしながらプラグインを開発できるような技術力を全く持ち合わせないこのブログでは、その辺について全く言及できないので、プラグインでmikutterを活用したいというパワーユーザーはまた別サイトの記事を参考にしてほしい。Wikipediamikutterのページには以下のように作成できるプラグインの例が挙げられており、何だかとても便利そうである。プラグインを自分で作れるユーザーなら、機能追加が自由にできるmikutterはとても魅力的なのではないだろうか。一般ユーザーでも比較的簡単に使えてカスタマイズできるような便利なプラグインが増えてくればありがたい。

    • タイムラインのツイートをユーザ独自のデータベースに保存
    • ソケットを利用して通信を行い、外部から制御
    • あらかじめ用意された情報を自動的にツイート*3

      mikutter - Wikipedia
    • キーボードショートカットで操作ができて快適
      Twitterの各種操作がキーボードからできるのが快適。設定すれば「j」「k」のワンキーでツイートを上下移動したり、「Ctrl-f」でいいねや「Ctrl-r」でリツイート、「Ctrl-o」でツイートのリンクを開いたりと、ホームポジションから手を離さずにさまざまな操作が可能となる。
      Twitter公式サイトにもキーボードショートカットの機能は存在するが、キーカスタマイズはできないし、マルチペインでタイムラインを表示することはできない。マルチペインで表示できるTweetDeckでは、ツイートやカラムの移動が矢印キーでしかできず、*4ツイート移動がスムーズスクロールするためまどろっこしい上読みにくい*5。mikutterならマルチペイン表示で、ホームポジションに手を置いたままで操作することができ、クイックなツイート移動も含め打てば響く動作で自分のニーズを満たしてくれる。
      マウス操作や矢印キーでの操作がまどろっこしく感じる自分としては、この点だけでも、苦労してmikutterを導入した価値があった。キーボードベースでの操作にこだわりがあるユーザーにオススメしたい。
    • リプライの除外ができて快適
      抽出タブを使い、さまざまなTwitterアカウントのタイムラインを表示させて使っているが、そのアカウントのツイートのみを表示してリプライは表示しないようにできるのが快適だった。
      Twitter公式サイトの各アカウントのページにある「ツイートと返信」タブのように、そのアカウントのリプライツイートが目に入ってくるのは、電車の中で携帯電話で話しているのを端から聞かされるようなもので、そのリプライ先が知っているアカウントだったり、リプライの内容がそのTwitterアカウントの特色に関連した話題だったらいいのだが、そうでなければノイズにしか感じられない。
      リプライがさほど多くなければ気にしないが、多くなってくると本来読みたいコンテンツであるそのアカウントのツイートを読む邪魔になってくる(多過ぎるリツイートも同様)。
      同じくマルチペインであるTweetDeckには、各カラムからリプライを除外するような設定が存在せずそこが不満点だったが、mikutterではこれが除外できるのが良かった(まさに「痒いところに手の届く」機能)。
    • TweetDeckのバックアップとしても有効
      先日、TweetDeckが日本を含めた地域で限定的にダウンしたことがあった。複数のアカウントのタイムラインを一覧してチェックしたい場合に、TweetDeckダウン時のバックアップとしても有用で、確保しておきたいツールといえる。

    関連サイト

    *1:正確には、mikutterは現在はMastodon専用クライアントになっており、Twitterプラグインを導入することで、Twitterクライアントとして利用することができるようになっている。

    *2:GTKとは「GUIツールキット(=GUIを構成する部品の集まり)」のこと ウィジェット・ツールキット - Wikipediaより

    *3:この機能は「予約投稿」という用途については公式Twitterに追加されてはいるものの

    *4:訂正:TweetDeckのショートカットキーのヘルプには記載がないもののhjklによる上下左右移動が可能なのだが、キーバインドを変更する拡張機能を使っているせいでそれが無効化されていただけだった

    *5:さらに下端でのツイート読み込み時に現在位置をロストすることがあるのも煩わしい

    mps-youtubeが何だかうまく動かない(解決)

    コマンドラインからyoutubeが見られる(もしくは聴ける)mps-youtubeというツールがある。ながら聞きに便利なので、久しぶりに使ってみようとしたところ、色々とエラーが出て動かなかったので、Github公式ページのIssuesを見て対応した。

    不具合と対応

    対応した内容は以下。

    • 再生しようとすると「KeyError: 'dislike_count'」というエラーが出てクラッシュする

      Exception in thread Thread-1:
      Traceback (most recent call last):
      # ---------- 省略 ----------
        File "/home/username/.local/lib/python3.6/site-packages/pafy/backend_youtube_dl.py", line 54, in _fetch_basic
          self._dislikes = self._ydl_info['dislike_count']
      KeyError: 'dislike_count'
      

      「KeyError: 'dislike_count'」と出ているように、Youtubeで低評価が表示されなくなったアップデートが原因。
      ひとまずはsite-packages/pafy/backend_youtube_dl.pyの54行目をコメントアウトすれば良いようだ。手元の環境では、上記にエラーの出ている通り~/.local/lib/python3.6/site-packages/pafy/backend_youtube_dl.pyを修正した。

              self._likes = self._ydl_info['like_count']
      #        self._dislikes = self._ydl_info['dislike_count']
              self._username = self._ydl_info['uploader_id']
      

      KeyError: 'dislike_count' in pafy · Issue #1180 · mps-youtube/mps-youtube · GitHub

    • 再生を実行しても再生が開始しない
      再生しても画面下部に再生時間やプログレスバーが表示されず、動画ID・ファイル形式・ファイル容量(一桁数字+Mb)が表示されたままで画面が止まってしまう(以下のような状態)。

      qMfVmQf7UOPM; webm 113.137k; 8 Mb 
      

      本来であれば、以下のようにプログレスバーと再生時間が表示される。

      BUUxNsOONzI; m4a 129.472k; 53 Mb; 00:14:00 [30%]    [============================>
      

      「set」を実行してオプションの値を見ると、「ここに何々を設定する」的な説明文がセットされているキーがあったため「set playerargs」のようにしてこれらのキーの内容をクリアしたところ、正常に再生されるようになった。
      不具合時のオプション設定の状態は以下(該当箇所のみ抜粋)。

      Key                 Value
      ---------------------------------------------------------------------------------
      playerargs        : <args> - use specified arguments with player
      columns           : <columns> - select extra displayed fields in search results:
      download_command  : <command> - type help dl-command for info
      lastfm_username   : <username> - scrobble to this Last.fm userprofile
      

    • 「Problem playing last item: [Errno 2] No such file or directory: '<notifier'」というエラーが出る
      「set notifier」を実行してnotifierを「None」にセットする。
    • 「ValueError: time data '20xx-xx-xxTxx:xx:xxZ' does not match format '%Y-%m-%dT%H:%M:%S.%fZ'」というエラーが出てクラッシュする
      「userpl hoge」(指定したユーザーのプレイリストを表示)したところ発生した。
      /usr/local/lib/python3.x/dist-packages/mps_youtube/util.pyの315行目と325行目を以下のように直せばよいとのこと。

      time_obj = time.strptime(yt_date_time, "%Y-%m-%dT%H:%M:%SZ")
      

      ValueError: time data does not match format '%Y-%m-%dT%H:%M:%S.%fZ' · Issue #1086 · mps-youtube/mps-youtube · GitHub

    • 「Problem playing last item: unconverted data remains: Z」と言われる
      曲一覧から「i 1」(曲の情報を取得)したところ発生した。
      /usr/local/lib/python3.x/dist-packages/mps_youtube/commands/misc.pyの253行目を以下のように書き換えるとのこと。

      pub = datetime.strptime(str(p.published), "%Y-%m-%d %H:%M:%SZ")
      

      Problem playing last item: unconverted data remains: Z · Issue #1101 · mps-youtube/mps-youtube · GitHub

    • 「urllib.error.HTTPError: HTTP Error 403: Forbidden」が出て起動しない
      同エラー表示に続けて「pafy.util.GdataError: Youtube Error 403: The request cannot be completed because you have exceeded your quota.」というエラーも出現した。
      「~/.config/mps-youtube/cache_py_*」を消したら直った(以下引用リンクに記述あり)。

      Problem playing last item: HTTP Error 403: Forbidden · Issue #1071 · mps-youtube/mps-youtube · GitHub

    • (番外)set api_keyしてもInvalid key or quota exceededと言われる
      これはmps-youtubeの問題ではなかった。
      作成したapiキーをコピペして入力しているのにエラーが出る。mps-youtubeのバージョンを下げたり、別のパッケージ管理ツールからインストールしてみてもダメ。
      対応として、Google Cloud Platformでプロジェクトを作り直し、apiキーを作り直したところ解決した。
      以下Githubコメントの通り、APIキーは、ある程度使わないでいるとプロジェクトやらキーやらが無効になることが原因であるらしい。確かに、mps-youtubeをしばらく使っていなかった。

      (翻訳)
      「無効なキーまたはクォータを超えました」というエラーが発生した場合、APIキーは保存されないため、代わりに元の開発者キーが使用されます。
      Google Developers Consoleで新しいプロジェクトと新しい認証情報を作成し、Youtube Data APIを追加して、そのAPIのみに制限する必要があります。理由は100%わかりませんが、キーをしばらく使用しないと、プロジェクトが無効になるか、プロジェクトの背後にあるIDが削除される場合に発生するようです。

      Polluted by AIzaSyCIM4EzNqi1in22f4Z3Ru3iYvLaY8tc3bo API key. · Issue #1061 · mps-youtube/mps-youtube · GitHub

    対応できない不具合

    • 再生が止まったりクラッシュしたりする
      検索結果やプレイリスト上では表示されているが、実際に再生すると以下のようなエラーが出て再生が止まってしまう動画がある。連続再生していると、たびたびこうしたエラーで再生が止まってしまうので、できればこれらのような動画はmps-youtubeが自動でスキップしてほしいところ。
      回避するには、予め確実に再生できる動画だけをプレイリストに追加して再生すればよい(個人的には、その作業が面倒なのでmps-youtubeの使用頻度が落ちている)。
      • 「Forbidden」で再生できない場合
        検索結果に表示されていても、以下のエラーが出て再生できない場合がある。

        Problem playing last item: HTTP Error 403: Forbidden 
        

      • 「ERROR: Video unavailable」でmps-youtubeがクラッシュする
        Youtubeのライブラリ上で「利用できない動画」として非表示になっている動画が、userplコマンドなどで表示されるプレイリスト上では表示されてしまい、この動画を再生しようとした際に動画が読み込めないので発生している模様。mps-youtubeでも「利用できない動画」を除外して表示してくれればよいのだが…(「KeyError: 'xxxxxxxxxxx'」の「xxxxxxxxxxx」が非表示になっている動画のビデオID)。
        公式GitHub IssuesのApplication crashes when video is unavailable · Issue #847 · mps-youtube/mps-youtubeでバグとして認識はされている模様(ただし2018年に不具合が報告されてから未だ解決されていない)。

        ERROR: Video unavailable
        This video is not available
        # ---------- 省略 ----------
        youtube_dl.utils.ExtractorError: Video unavailable
        This video is not available
        During handling of the above exception, another exception occurred:
        
        Traceback (most recent call last):
          File "/usr/local/bin/mpsyt", line 8, in <module>
        # ---------- 省略 ----------
          File "/usr/local/lib/python3.6/dist-packages/mps_youtube/player.py", line 186, in stream_details
            cached = g.streams[song.ytid]
        KeyError: 'xxxxxxxxxxx'
        

    fonモバイルルータをレンタルしたメモ

    目次

    ネット回線に困り、モバイルルータを借りてみた

    ネットがもはやインフラの昨今に、固定回線が利用できない状況になり、大部不便にしていたが、世の中にはモバイルルータのレンタルサービスがあることを思い出したので、kakaku.comで調べてみた。
    しかし時期が悪いのか、ランキング上位として表示されているショップはどの端末も「在庫切れの可能性があります」と表示されていた。料金に引かれて見に行ったらレンタルできない、となると面倒なので、そうした表示が無い以下のショップからレンタルすることにした。

    WiFiレンタルならFon Rental Wi-Fi

    fonと言えば、ずいぶん昔にユーザー間での無線LANシェアサービスで有名だったが、今もサービス中なのだろうか。

    届くまでの日数や料金

    サービスの内容を読むと、平日14時までで当日出荷、地域によるが翌日には届くとのこと。往復の送料は無料で、端末保証の有無を選択できるようになっている。
    最低使用日数は2日からで、レンタル料金は使う日数と機種によって料金が変わる。

    今回は、一週間ほどの間、せいぜい1日1GB程度使えれば良いので、一番安価なSoftBank 801ZTs(税込1,870円)という端末をレンタルすることにした。
    端末のスペックは、4G通信の最高下り速度112.5Mbpsで通信容量5G/月、8.5時間連続通信となっている。

    詳しく(クリック・タップで開く)

    kakaku.comやサイトの料金表示を見る限りでは、1日いくらで借りられるのかと思ったがそうではなくて、利用期間が2日間〜8日間、9日間〜15日間、16日間〜22日間、23日間〜31日間、32日間〜…のように使用日数に応じて段階的に料金が上がるようだ。

    今回借りたSoftBank 801ZTsは、通信容量が小さいからか31日間までの利用までは、基本料金の1,870円のままでレンタルすることができた。

    料金システムはショップによって様々になっていて、料金が1日刻みになっていたり、1ヶ月を固定料金としてその後1日ごとの料金が取られたり、利用期間が短いと1日の料金が上がったり、端末により最低利用期間が決まっていたりする模様。

    端末保証は、外に持ち歩くわけではないので付けないことにした。なお、保証に入らずに壊したり無くしたりしてしまうと44,000円の請求となるようなので注意したい。保証に入っていれば11,000円で済むとのこと。詳しくはサイトのよくある質問オプションサービスのページを参照。

    土曜の早朝にレンタルを注文したところ、18時頃に発送済みの連絡が来て、日曜の昼に端末が到着した。

    レンタルした端末


    起動した直後に「Pocket Wifi」の表示が出た。ずいぶん昔にPocket Wifiのみで通信をまかなっていたことがあったが、この端末はどうもその子孫らしい。

    端末のオプションで設定すると、画像のように、使用した通信容量を表示でき残量を確認できる。通信容量の上限はスペック上では「5GB/月」となっていたが、端末のディスプレイ表示ではなぜか「(使用した量)/7GB」と表示されている。

    実際に7GBまで使えるのだろうか?と疑問に思ったが、サイトのよくある質問によると「一部端末は初期表示されているデータ通信量の分母が《月7GB》となっておりますが、ご契約プランに準じたご利用が可能でございます。」とのこと。

    端末の裏面にはSSIDや接続パスワードが印刷されている。

    通信速度

    Amazonのトップページを開いてみると、トップスピードで700KB/s(5.6Mbps)程度出た。
    YoutubeでHD動画を再生してみると、トップスピードで1.7MB/s(13.6Mbps)ほど出ており、一般的なブロードバンド回線に比べたら遅いかもしれないが、視聴に全くストレスは無かった。

    有線LANしか無いPCでもスマホを介して使える


    別にfonのモバイルルータに限った話ではないのだが、有線LANしかないPCでの利用について。
    メインで利用しているデスクトップPCは有線LANしか無いのでどうしようかと思ったが、スマホWifiで受信した通信を、USBテザリングでPCに中継することで通信できた。

    ただし、USBケーブルを介してなので、USBテザリングで接続できるのは1台のPCに限られる。
    UbuntuでのUSBテザリングの方法はUbuntu16.04 LTSにAndroid端末をつないでUSBテザリングする - 錯誤試行を参照。

    radikoで地域外のラジオが聴けた


    radikoを開くと首都圏のラジオ局が表示されていて、聴くことができた。
    Google Mapを開くと、アクセスポイントの関係なのか、初期位置が首都圏になったり関西になったり九州になったりしたので、このためだろうか。

    端末の返却


    端末と一緒に同封されてくるレターパックを使う。レンタル終了日の「翌日」の消印が有効とのことで、余裕を持って返却できる。

    レターパックの宛先と、送られてきた封筒の差出人の名前が「荷捌き所」となっていたので、相当大規模で、大量の在庫を持っているのではないだろうか。

    速度規制について

    上限の5GBを超えて利用したところ、6.5GB前後で速度規制が掛かった。
    Google Mapを開いてみると25〜120kbps程度で通信をしている。さすがになかなか地図が表示されず、表示されても移動や拡大、縮小したりするとまた地図が真っ白になってしまい、実用的に使えるとは言えない。

    Youtubeで適当な動画を再生してみると、こちらは最低品質(144p)だが動画が何とか再生できた。
    その後、日付を回る前の23時頃になったところ速度規制が解除されたが、翌日さらに使用したところ再度速度規制が入った。この時点でデータ使用量は8.9GBだった。

    その翌日になったところ、再び速度規制は解除された。格安SIM回線よりは速度規制が緩めになっているようだ。

    まとめ

    レンタルした端末とサービスは、今回の自分のニーズを満たしていたので特に問題ないという感想だった。
    無制限のプランは無かったものの、長時間に渡る動画視聴やオンラインゲームなどの大容量通信を連日続けるのでなければ、不都合なく使えるのではないのではないかと思う。

    今回は一週間の利用だったが、一ヶ月使うとすれば、最高下り速度612Mbpsで通信容量50GB/月(2G/日)の601HWという端末を選んだだろう。税込5,800円/月となっており、他ショップや固定回線の料金と比べてもそこまで割高ではない。
    端末ラインナップがシンプルで、どれを選べばいいか迷わずに済む。

    他ショップで端末が在庫切れになっていて借りらずに探し回ったり、多数の端末の中から比較検討するより、楽なのではないだろうか。

    通信量把握のすすめ

    通信ツールを使って、自分の通信量を把握することをおすすめしたい。
    自分が1日や1月に使う通信量を把握していれば、ブロードバンドやスマホ契約の際に必要充分なプランを選ぶのに役立ったり、今回のようにモバイルルータのレンタルをする際に、人気の高いショップで在庫の少ない端末を奪い合わなくてもよくなるかもしれない。

    Windows10なら、設定→ネットワークとインターネット→データ使用状況で過去30日のデータ通信量が表示される。
    Ubuntuなら、vnstatというコマンドを使うか、システムモニターから通信量を把握することができる。
    スマートフォンなら、機種によって違うだろうが設定→ネットワーク→データ使用といったメニューから確認できるだろう。

    人は令和のネットを通信規制されたテザリング回線で戦えるのか

    目次

    IIJmioで通信規制がかかる

    通信手段が格安SIMであるIIJmioテザリングしかないが、月の容量を使い切り、クーポンOFF低速回線での3日間366MB制限もオーバーして通信規制が掛かってしまった。

    通信規制の速度はどのくらいか


    ツールで通信速度を見てみると5KB/s前後しか出ていない(赤枠「RECEIVED」の列)。5MB/s(40Mbps)ではなく、5KB/s(40kbps)である。実にアナログモデム(56kbps)でインターネットをしていた時代のレベルである。

    通信規制されるとどんな感じになるのか

     
    シンプルなページとして、Googleと、あるWebサービスのサイトの画像を貼り付けた。シンプルなサイトですらこの状況で、実に昔のインターネットという感じである。

    この速度で令和のウェブページは辛過ぎで、スタイルシートjavascriptが読み込まれなかったり、待てど暮らせど反応が帰って来なかったり、そのまま読み込みがどこかへ行ってしまったりする。

    昔のソフトなら何とかなる

     
    こんな時に役に経つのがネット回線が細かったいにしえの時代のアプリで、w3m(正確にはemacs-w3m)というテキストブラウザを使用した。

    先ほどのフルブラウザと比べると、ページが表示されるまでの時間がだいぶ早い。
    今度は何とか実用的なネットサーフィンが可能となった。文章が読めれば一応、用は足りる。

    ページが重過ぎて読み込めないGmailの読み書きは、ThunderbirdEmacsWanderlustを、同じく重過ぎて読み込めないTwitterEmacsのtwittering-modeを使った。
    専用クライアントを確保してあれば、重たいウェブアプリを開かなくても、少ない通信量で表示できる。

    まとめ

    ネット回線がアナログモデムだった時代からあるソフトを使えば、戦えるかどうかは知らないが、回線が細くてもやっていくことはできる。ただし、表示されるインターネットも昔の時代に戻されることになる(テキストブラウザjavascriptが動かないので、はてブもできない)。

    Youtubeが見られないのはどうしようもないので、手持ちの音楽や動画で乗り切ることにした。こうして最低限の文化的生活は守られたのだった。
    同じく通信規制に苦しむネット回線難民は参考にしてみてはいかがだろうか。

    おまけ(Youtubeを無理矢理表示)

     
    試しにYoutubeを無理矢理表示してみたところ。トップページは表示されるまで8分かかった。動画ページは6秒の動画を再生するのに3分を要した。クリックしてみると、アドレスバーが進捗していて、止まっていないのが分かってもらえると思う。

    Tridactylのキーカスタマイズ(モード別に変更など)

    FirefoxキーバインドVim風に変更するアドオンの「Tridactyl」(Tridactyl – 🦊 Firefox (ja) 向け拡張機能を入手)を使用してみたところ、コマンドラインモードがあり、他のVimキーバインド変更アドオンよりも、かつて愛用していたVimperatorに近くて使いやすかった。が、キーバインドに少し不満を感じた。

    一つは、タブ移動にC-nとC-pが使えないこと。これは以前の記事のFirefox Quantumでカスタマイズできないデフォルトショートカットキーを変更する - 錯誤試行や外部のキーカスタマイズツールで解決できる。
    もう一つは、コマンドラインモードの上下がTabでの移動になっていて操作しづらいこと。これもC-nやC-pで上下移動させたいが、そうすると上記の方法ではタブ移動とキーバインドがバッティングしてしまう。

    Tridactylで何とかできないかと思っていたところ、以下の記事が見つかった。

    • 「C-n」「C-p」でタブを左右に移動する
      以下をコマンドラインモードに入力すればよいが、事前に以前の記事(Firefox Quantumでカスタマイズできないデフォルトショートカットキーを変更する - 錯誤試行)のようにして、omni.ja内のbrowser.xhtmlでC-nとC-pを無効にしておく必要がある。

      bind --mode=normal <C-n> tabnext_gt
      bind --mode=normal <C-p> tabprev
      

    • コマンドラインモードで「C-n」「C-p」で一覧を上下移動する
      「C-n」については、上と同様の対応が必要。

      bind --mode=ex <c-n> ex.next_completion
      bind --mode=ex <c-p> ex.prev_completion
      

    • コマンドラインモードの「C-f」を「カーソルを右へ移動」に割り当てる
      「C-f」がデフォルトで「コマンド履歴からの入力補完」に割り当てられていたが、それよりも、現在表示しているページのURLを編集してページ移動(「O」キー)したいというときに、URLの編集をする際に矢印キーでカーソルを右に移動しなければならないのが不便に感じたので、「右へ移動」を割り当てることにする。
      unbind --mode=ex してもデフォルトの割り当てが解除されなかったので、以下のように一旦適当なキーで上書きしてやったところ、割り当てが変更された。

      bind --mode=ex <C-f> <RightArrow>
      unbind --mode=ex <C-f>
      

    • Google日本語版サイト(google.co.jp)の検索結果ページでページナビによる移動を有効にする
      コマンドラインモードから以下を実行すると「]]」で検索結果の次のページへ、「[[」で前のページへ飛ぶことができる。これは結構便利なので設定をおすすめしたい。
      google.comだと動作しないが、google.co.jpなら動作する。

      set followpagepatterns {"next": "^(next|newer)\\b|»|>>|more|>|次へ", "prev": "^(prev(ious)?|older)\\b|«|<<|<|前へ"}
      

    • はてなブックマークの各記事のエントリページの「人気コメント」タブと「新着コメント」タブを切り替える
      はてなブックマークの各記事のエントリページには「人気コメント」タブと「新着コメント」タブがあるが、ヒントモードからこれらのタブを選択して切り替えることができず不便だった。そこで、コマンドラインモードから以下を実行すると「;f」で選択できるようになった。

      bind ;f hint -c [class="js-bookmarks-sort-tab"]
      

    • クイックマークでブックマークレットを実行する(「goo」とタイプしてはてブコメントを見る)
      以下をコマンドラインモードで実行すると、「goo」とタイプするだけで、今開いているページの、はてなブックマークの記事エントリページ(コメントページ)を開くことができて大変便利。オススメしたい。

      quickmark o javascript:location.href='http://b.hatena.ne.jp/entry/'+escape(location.href);
      

      説明すると、「go」はクイックマークで登録したページを開くTridactylのショートカットキーで、クイックマークとは「M」の後に何かキーを押すと、そのキーに現在表示しているページが登録され、「go」+「(登録したキー)」をタイプするとそのページに飛べるというもので、良く開くページを登録しておくと便利な機能。このクイックマークの登録は、コマンドラインモードからもでき、上記はブックマークレットを登録したもの。

    • 右手だけではてなブックマークの記事エントリページを開く
      以下を実行すると「;o」ではてなブックマークの記事エントリページが開く。本来「;o」は「f」と同じでヒントモードに設定されているが、使わないので置き換えた。結局、すぐまた両手を使わなくてはいけないのだが、少しの間ズボラができる。

      bind --mode=normal ;o open javascript:location.href='http://b.hatena.ne.jp/entry/'+escape(location.href);
      

    参照サイト