それマグで!

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

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

nextcloud 認証のダイアログが何度も表示される問題

認証のPrivilegeを求めるダイアログが何度も表示される問題に直面した。

Authentication required が連発して先に進めない。

f:id:takuya_1st:20171221183224p:plain

散々探し回ったら、時刻だった。

サーバーの時刻とクライアントの時刻にずれが大きかったことによるものだった、

ntpdate で修正して、 ntp.conf を見直して

時刻修正してrestart して、事なきを得た。

どんだけ誤差があるんだよ。。。さくらVPSUbuntuイメージってNTPd 入ってなかったのかな。

takuya@sakura:/etc/php/7.0/fpm$ ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 ntp-b3.nict.go. .NICT.           1 u    2   64    1   20.637    0.049   0.000
 ntp-b2.nict.go. .INIT.          16 u    -   64    0    0.000    0.000   0.000
 ntp-a3.nict.go. .INIT.          16 u    -   64    0    0.000    0.000   0.000

nextcloud / owncloud は認証APIが時刻

APIにログイン状態の問い合わせのレスポンスが時刻だった。時刻なのでサーバー時刻がずれてると認証がずれる。そりゃそうか。

apt list --upgradable  のパッケージを指定して個別アップグレード

指定したパッケージをアップグレードする。

アップグレード可能なパッケージは次のコマンドで解るのですが。アップグレード可能なパッケージをどうやって個別アップグレードするんだろうってずっと疑問だった。

apt list --upgradable

個別にアップグレードする方法

たとえば、openssh-serverを個別に指定してアップグレードする場合は次のようにする。

sudo apt install openssh-server --only-upgrade

--only-upgrade はなくてもいい場合が多かった。 ただinstall 指定したら、個別インストールしたフラグが立つ可能性もあるし、あんまりするべきではないかもしれない。

実際にやってみた例:

$ sudo apt list --upgradable
(略
openssh-client/stable 1:7.4p1-10+deb9u2 amd64 [1:7.4p1-10+deb9u1 からアップグレード可]
openssh-server/stable 1:7.4p1-10+deb9u2 amd64 [1:7.4p1-10+deb9u1 からアップグレード可]
openssh-sftp-server/stable 1:7.4p1-10+deb9u2 amd64 [1:7.4p1-10+deb9u1 からアップグレード可]
sqlite3/stable 3.16.2-5+deb9u1 amd64 [3.16.2-5 からアップグレード可]
(略

ここから選んだ一つだけ更新する。

takuya@:-winxp$ sudo apt install openssh-server
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  openssh-client openssh-sftp-server
提案パッケージ:
  keychain libpam-ssh monkeysphere ssh-askpass molly-guard rssh ufw
以下のパッケージはアップグレードされます:
  openssh-client openssh-server openssh-sftp-server
アップグレード: 3 個、新規インストール: 0 個、削除: 0 個、保留: 177 個。
1,150 kB のアーカイブを取得する必要があります。
この操作後に追加で 0 B のディスク容量が消費されます。
続行しますか? [Y/n] y
取得:1 http://debian-mirror.sakura.ne.jp//debian stretch/main amd64 openssh-sftp-server amd64 1:7.4p1-10+deb9u2 [39.5 kB]
取得:2 http://debian-mirror.sakura.ne.jp//debian stretch/main amd64 openssh-server amd64 1:7.4p1-10+deb9u2 [333 kB]
取得:3 http://debian-mirror.sakura.ne.jp//debian stretch/main amd64 openssh-client amd64 1:7.4p1-10+deb9u2 [778 kB]
1,150 kB を 0秒 で取得しました (1,158 kB/s)
changelog を読んでいます... 完了
パッケージを事前設定しています ...
(データベースを読み込んでいます ... 現在 306551 個のファイルとディレクトリがインストールされています。)
.../openssh-sftp-server_1%3a7.4p1-10+deb9u2_amd64.deb を展開する準備をしています ...
openssh-sftp-server (1:7.4p1-10+deb9u2) で (1:7.4p1-10+deb9u1 に) 上書き展開しています ...
.../openssh-server_1%3a7.4p1-10+deb9u2_amd64.deb を展開する準備をしています ...
openssh-server (1:7.4p1-10+deb9u2) で (1:7.4p1-10+deb9u1 に) 上書き展開しています ...
.../openssh-client_1%3a7.4p1-10+deb9u2_amd64.deb を展開する準備をしています ...
openssh-client (1:7.4p1-10+deb9u2) で (1:7.4p1-10+deb9u1 に) 上書き展開しています ...
systemd (232-25+deb9u1) のトリガを処理しています ...
man-db (2.7.6.1-2) のトリガを処理しています ...
openssh-client (1:7.4p1-10+deb9u2) を設定しています ...
openssh-sftp-server (1:7.4p1-10+deb9u2) を設定しています ...
openssh-server (1:7.4p1-10+deb9u2) を設定しています ...

参考資料

https://askubuntu.com/questions/44122/how-to-upgrade-a-single-package-using-apt-get

SpotLight検索からコマンドを実行する。(2018/08/17改編)

Alfred みたいにコマンドを実行できたら良いなと思ってた

多機能過ぎるものはあまり好きじゃないし、ぱっと作ってぱっと使えるものでいいかなと思っています

SpotLight の検索対象フォルダに入れるだけ

つまり、 SpotLight が検索しインデックス化出来るところに、コマンドを置いておけばいい。

たとえば、次のような場所

~/Document/bin/

ここはSpotlightが検索してくれないので実行できない。

/usr/local/bin

実行権限をつける

chmod a+x MyTesting

+x して実行権限をつければ準備完了。

あとは選べば実行される。

f:id:takuya_1st:20171209212147p:plain

ほんとコレだけ。

コレだけだけど、Document以下に置くという発送がなくて盲点だった。

Alfredを自慢されたけど

ぜんぜん羨ましくないんだからね。

Spotlightで出来ること

Appleさんは、アプリの機能をパクるので有名だからな。Alfred 出来たような、計算や辞書サーチは簡単にできる

WorkFlowを作るにはAutomator

Automator でワークフローを作っておけば、Spotlightからぱぱっと実行できて便利ですよね。

対象フォルダを入れるだと不十分だった

2018-08-17 HighSierraに新規インストールして気づいた。

Spotlight検索の対象にデベロッパのチェックがあって、これがデフォルトはオンです。

このデフォルトオンがないと検索されません。うっかりオフになっていると検索されないので注意が必要っぽい

f:id:takuya_1st:20180817033200p:plain

SSHをSFTPに制限して、ディレクトリを制限(chroot)した専用アカウントを作る

なぜSFTP専用アカウントなのか

SSHを解放するのはちょっと・・・ね

ssh でなんでも出来てしまうし、なんでも見れてしまうんで。指定したフォルダ以外にはアクセス出来ないようにしたい。

つまり、指定したディストリ=chroot したSFTP専用のアカウントを作ってみようと思った。

chroot 脱出は、、、まぁ出来るんだろうけど、不用意にファイルを見せない的な意味でSFTPに限定したアカウントがあれば便利だねって。

前提条件

SFTPのアカウントをChrootさせるには、いくつか前提条件があって。

  • ssh が起動している
  • アカウントがある。
  • sftp がサブシステムで有効になってる
  • chroot ディレクトリが root:root 755 になってる

SSHを起動してログインできるようにする

これは最初から付属して有効になってるだろうから割愛。

ufw などファイアウォールがあれば、それを使ってログインできるようにしておく

ユーザーの作成

SSHができるユーザーを作成しておく、これも adduser コマンドでなどで十分

複数ユーザーを作るときは、ファイルが共有できるように umask 0002 にして useradd -aG groupname でグループを整えておく

ユーザー名の保護

もし、ユーザー名をよくあるものにして、パスワードログインを許可するのであれば、ユーザー名に難解な文字列を付与しておくのがベターだと思います。

Mac の場合は、 sf-pwgen を使って読みやすいアルファベットの羅列を生成できます。

takuya@Desktop$ sf-pwgen -a memorable -a letters -l  15
itwitichyozcyic
tecelyuprakamui
nivoujicloipher
eweogozadgeerho
ausholdubiishai

www-adminwebuser などわかりやすい文字列の後ろに追記しておくと良いでしょう。

www-admin などは容易に攻撃対象になるので、ユーザー名を難解で憶測困難なものにしておくほうが良いでしょう。

今回は webuserに文字列を付けて webuser-ausholdubiishai としました。

SFTPを使う人相手に公開鍵認証を説明するのも面倒な話だし。パスワード認証を使いたいよねやっぱり。

sudo adduser  webuser-ausholdubiishai
sudo adduser  webuser-nivoujicloipher

グループも作っておきます。

sudo addgroup webusers
sudo usermod -aG  webusers webuser-ausholdubiishai
sudo usermod -aG webusers webuser-nivoujicloipher

共有するフォルダのパーミッションを、グループを強制しておきます。これで他ユーザーのファイルが消せないとかは減る。umask でもいいけど。

sudo chmod g+srwx /var/www/webusers

SFTPの設定

SFTP の設定をしたいユーザー名に次のような設定を書きます。

/etc/ssh/sshd_config

## currently only sftp user
Subsystem sftp /usr/lib/openssh/sftp-server
match user webuser-ausholdubiishai
  PasswordAuthentication yes
  X11Forwarding no
  AllowTcpForwarding no
  ForceCommand internal-sftp
  ChrootDirectory /var/www/

一つずつ見ておきます。

Subsystem sftp /usr/lib/openssh/sftp-server

これは、SSHの内部SFTPサーバーを有効にします。標準で入っています

match user

match user webuser-ausholdubiishai ユーザー名がマッチした時にそれ以降の設定を上書きします。

match group or match user name*

複数ユーザーがいるときは、Match Groupワイルドカードが便利です。

PasswordAuthentication yes

パスワードログインを許可します。

X11Forwarding ForceCommand AllowTcpForwarding

  X11Forwarding no
  AllowTcpForwarding no
  ForceCommand internal-sftp

ここでは、通常のSSHで出来るようなシェル機能を無効にしておきます。ログインしたら シェルとして sftp サーバーを起動するようにしておきます。

ChrootDirectory /var/www/

SFTPでアクセスしたときに Chroot を掛けて、指定のフォルダ以降のアクセスに限定します。

ディレクトリのアクセス制限

chroot したいディレクトリのパーミッションを root:root で 755 にします。

 ll -d /var/www
drwxr-xr-x 5 root root 4096 Dec  7 18:46 /var/www/

もしコレを忘れると、切断されて broken pipe などとエラーになったりします。

忘れた場合のログです。 /var/log/auth

Aug  9 04:00:29 acid sshd[6185]: fatal: bad ownership or modes for chroot directory
sudo chmod 755 /var/www/path/to/chroot
sudo chown root:root /var/www/path/to/chroot

こうですね。

最後に再起動

ssh をリロード(再起動)して終わりです。

systemctl reload ssh 

これで完了

まとめ

パーミッションにハマるとしんどい。最初に知っておけばよかった。

SFTPは各種ソフトが対応していてファイルの転送だけを考えれば、使いやすい。

ユーザー名とパスワードを考えるのが面倒なのでユーザー名自動生成でアルファベット的に読めるものを自動生成はうれしいですね。

あと、chroot は便宜的なもので過信してはいけない。

今時なら、SFTPを使わずCIまわして自動デプロイか自動docker なんだろうけどさ。

2018-08-09

エラー・メッセージを追記

Macのワイヤレス診断の使い方

Wireless diagnostics(ワイヤレス診断)にはメニューがある

いつも忘れるので、メモをしておく

Wireless diagnosticsを起動したら、ウインドウメニューを開く

f:id:takuya_1st:20171208182650p:plain

すると、各種メニューが出てくる

写真は、チャンネルごとにSSIDを閲覧する方法。

f:id:takuya_1st:20171208182822p:plain

他にも色々見られる

ノイズとRSSIの変化を見たり

f:id:takuya_1st:20171208183029p:plain

WiFIをスニッファモードにしたり

f:id:takuya_1st:20171208183131p:plain

いつも存在を忘れる。

WiFiが複数バンド(5/2.4GHz)で飛んでるときに、明示的に2.4GHz のssidに接続する

macWiFi接続で 2.4Ghz を強制してみた

CoreWLANで 同一SSIDで 2.4 / 5 GHz が飛んでいる場合に、2.4GHz に接続をしてみた。

人が多い時に、あきらかに5GHzが使われて、2GHz帯が空いてそうなので、一度接続してみたいなと思って。

接続しようにもMacが5GHzを使うので、選択できないなと。CoreWLANを読んでたら、明示的につなげそうだったので、繋いでみた。

//
//  main.m
//  WiFi-testing
//
//  Created by takuya on 20171130.
//  Copyright © 2017年 takuya. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <CoreWLAN/CoreWLAN.h>
int main(int argc, const char * argv[]) {
  @autoreleasepool {

    CWWiFiClient *cw = [CWWiFiClient sharedWiFiClient];
    CWInterface *ci = cw.interface;
    NSSet *set = [ci scanForNetworksWithName:@"00_MCD-FREE-WIFI" error:NULL];

    // 2,4GHz is wlanChannel.channelBand == 1
    NSPredicate *pred2 = [NSPredicate predicateWithFormat:@"wlanChannel.channelBand == 1 ",set];
    CWNetwork *target = [[set filteredSetUsingPredicate:pred2] anyObject];
    printf("\nThe target is %s\n", [target.bssid UTF8String]);
        for (CWNetwork *i in set) {
          printf("%25s %8s %s % 5ld % 5ld % 5ld % 5lddBm \n",
                 [i.ssid UTF8String],
                 //2=>5Ghz 1=>2.4Ghz
                 ((i.wlanChannel.channelBand==kCWChannelBand5GHz)? "5GHz" : "2.4GHz"),
                 [i.bssid UTF8String],
                 i.rssiValue,
                 i.wlanChannel.channelWidth,
                 i.wlanChannel.channelNumber,
                 i.noiseMeasurement
                 );
        }


    [ci disassociate];
    [ci setPower:YES error:NULL];
    [ci disassociate];
    [ci setWLANChannel:target.wlanChannel error:NULL]; //チャンネルのデフォルトを2.4GHzにする
    [ci associateToNetwork:target password:NULL error:NULL];

  }
  return 0;
}

一応つながる

f:id:takuya_1st:20171208180446p:plain

しかし、すぐに5Ghzにされる。

しかし、接続中に、Macに2.4GHz → 5GHz にされてしまう。

同一SSIDで5GHzが飛んでたらそっちへつなぎ替えるプロセスが居るらしい。どれだ。。。

なんな、launchd から起動されているDAEMONを止めないとダメっぽいぞ。

Javaで音を鳴らす

Java でサウンド再生

サウンド再生すればちょっと楽しいかなって思ってやってみた。

準備

WAV ファイルを作る

ffmpeg input.m4a output.wav

いまどきWAVファイルなんて扱ってる人は少ないだろうからメモしておく

Java でWAVファイルを使って音を鳴らす。

AudioStream を使えばぱぱっと出来る。

import java.io.*;
import sun.audio.*;


public class PlaySound{

  public static void main( String[] args)  throws Exception {
    
    String f_name = "/Users/takuya/sample.wav";
    System.out.println("Hello World.");

    InputStream in = new FileInputStream(f_name);
    AudioStream as = new AudioStream(in);

    AudioPlayer.player.start(as);

  
  }

}

これでも結構かんたんに音がなる。

コレもサンプルコードで見つけた。でもちょっとコードが古い。

import java.io.*;
import sun.audio.*;

import javax.sound.sampled.*;

public class PlaySound{

  public static void main( String[] args)  throws Exception {
    
    String f_name = "/Users/takuya/sample.wav";
    System.out.printf("playing %s \n", f_name);

    File f = new File( f_name );
    AudioInputStream ais = AudioSystem.getAudioInputStream(f);

    AudioFormat  af = ais.getFormat();
    DataLine.Info info = new DataLine.Info( SourceDataLine.class, af , AudioSystem.NOT_SPECIFIED  );

    SourceDataLine line = (SourceDataLine) AudioSystem.getLine( info  );

    line.open( af , AudioSystem.NOT_SPECIFIED );
    line.start();
    int buff_size = 1024*3;
    int bytes_read = 0 ; 
    byte[] data = new byte[buff_size];

    while ( bytes_read != -1 ){
      bytes_read = ais.read( data, 0, data.length  );
      if ( bytes_read > 0 ) {
        line.write(data, 0, bytes_read);
      }
    }

    line.drain();
    line.close();
  }

}

参考資料

ドコから持ってきたのか忘れた。

ubuntu のネットワーク設定が変わってる /etc/network/interfaces no longer used

ubuntu 17 入れたらネットワーク設定でつまづいた。

VirtualBoxでネットワーク・カードを追加したり消したりしたかったのに、DHCPからIPが振ってこない。 DHCPが有効じゃないのかとか、VBOXの設定を間違えたかとアレコレ時間を浪費したのでメモです。

DHCPからIPが取れない。

DHCPは有効になってるのに、IPアドレスが取れない ip link set DEV up も試したけどダメだった。

/etc/network/interface を書き換えても無駄だった。→使われない

ネットワークが systemd 管理下に置かれてる。systemd-networkd.service というサービスが制御をしていた。

検索結果を調べたらNetworkManagerが多いのですが、たしかに入ってる場合もあるとは思いますが、 ubuntu Server版 なので特に無いので、systemdの設定を直接する必要があった。

ググってみた結果。/etc/network/interfaces no longer used という恐ろしい文言を見かけた。

状態の確認

起動しているとか、有効になってるかどうかはまずはステータスを見れば解る。

systemctl status systemd-networkd

設定

設定は、/etc/systemd/network 次の場所に任意のファイル名にして書く。

設定例 /etc/systemd/network/25-enp0s8.network

[Match]
Name=enp2s0

[Network]
DHCP=ipv4

match も強引なマッチが書ける

[Match]
Name=enp*

[Network]
DHCP=ipv4

スタティックに静的IPを割り振るには

[Match]
Name=enp0s8

[Network]
DNS=8.8.8.8
Address=192.168.1.87/24
Gateway=192.168.1.254

DNSなどもここで指定する。

/etc/network/interace は何処へ・・・

Archなどもおなじなのですが。

ファイルを作成するのはアレコレ調べたら、やっぱりもう使われてない。systemd に入ってから、こんな所変えてどうするんだよ。。。

The package ifupdown and so /etc/network/interfaces are no longer used. Ubuntu 17.10 Server uses the package netplan instead, which configures systemd-networkd.

ああ、つらい。

ネットワークまわりを変えられるとトラブル多いよな

どうして変えちゃったの。 てか変えるなら /etc/neworking/interfaces のファイルに注意と書いといてよ。。。

/etc/resolv.conf お前もか

この変化で、DNSに関しても動かなくなってる。

唯一の救いは、ディストリ毎の差異が減ることかな

CentOSDebian系でネットワークの設定方法が異なったり、書式が異なったりすることに依る混乱には遭遇しないのは良いことかもしれない。

参考資料

0001docomo に複垢でつながらないのをCoreWLANで解決した話

0001docomo につながらない詰み状況を回避する

0001docomo は1アカウント(契約)につき、コネクションを1接続に限定される。

そこで、複数台を接続するには、家族や友人の使ってないWiFiアカウントを強奪したり、もう1つ契約すれば良いのですが。

複垢使い分けできないことがある。

iOS / Mac だと複垢を使い分けできない。

iPhone / iPad / Mac / iPad Pro と複数台でkeychains を共有していると 1台だけが0001docomoのWiFiに接続が可能になる。

もし複数契約を持っていた場合に、iPhone / iPad / Mac / iPad Proで利用するdocomoアカウントを切り分けようとしても、keychainsで共有されているために、使い分けができない。

キーチェーン同期・・・

どれか1台で接続設定をしてしまうと、残りの機器にKeychainsで同期されてしまう。 そして複数アカウントを設定してもすべてが同じKeychainsになってしまう。 結果として、複数アカウントを契約したとしてもキーチェーン共有の問題でアカウントの使い分けが出来なかった。この問題にもう3年以上苦しんでいた。

networksetup コマンドでも無理

networksetup コマンドには、802.1 の Enterprisze がない. 0001docomoは 802.1Xなのでこのコマンドではお手上げだった。

takuya@Desktop$ networksetup -a | grep 8021
103:networksetup -import8021xProfiles <service name> <file path>
104:networksetup -export8021xProfiles <service name> <file path> <yes no>
105:networksetup -export8021xUserProfiles <file path> <yes no>
106:networksetup -export8021xLoginProfiles <service name> <file path> <yes no>
107:networksetup -export8021xSystemProfile <service name> <file path> <yes no>
takuya@Desktop$ networksetup -a | grep Enter
takuya@Desktop$ networksetup -a | grep airport
53:networksetup -getairportnetwork <device name>
54:networksetup -setairportnetwork <device name> <network> [password]
55:networksetup -getairportpower <device name>
56:networksetup -setairportpower <device name> <on off>
takuya@Desktop$

CoreWLAN フレームワーク

ある日ふと思い立って、MacObjective-C で CoreWLANのAPIでなんとかなるんじゃないか。 networksetup コマンドでもお手上げだったので、802.1x のEnterprise認証を指定するAPIがあるんじゃないか

一縷の望みを託してAPIを読んでみたら、無事接続できたのでメモを残します。

コマンドを作って実行してみたら、Macからは無事に指定のEnterpriseユーザー情報で接続できた これで、無事にMaciPhoneで別のアカウントを使って同時に0001docomoを使えるようになった。

しんどい接続についても結構かんたんに解決したし、WiFiがナゼかつながらないっていう問題もなかった。

このコマンドにEnterpriseのパスワードを直書きしているが、まぁそこま置いていて。

サンプルコード

//
//  main.m
//  WiFi-testing
//
//  Created by takuya on 20171130.
//  Copyright © 2017年 takuya. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <CoreWLAN/CoreWLAN.h>
int main(int argc, const char * argv[]) {
  @autoreleasepool {

    CWWiFiClient *cw = [CWWiFiClient sharedWiFiClient];
    CWInterface *ci = cw.interface;

    [ci setPower:YES error:NULL];
    [ci disassociate];

    NSSet *set = [ci scanForNetworksWithName:@"0001docomo" error:NULL];

    CWNetwork *target;
    for (CWNetwork *i in set) {
      long l = i.rssiValue;
      NSLog(@"rssi=%ld", l);
      if ( i.rssiValue < target.rssiValue ){
        target = i;
      }
    }
    NSLog(@"%@", target);
    if ( target == NULL ){
        NSLog(@"SSID not found.");
        return 1 ;
    }
    NSError *err;
    BOOL ret = [ci associateToEnterpriseNetwork:target
                                       identity:NULL
                                       username:@"xxxxx-spmode@docomo"
                                       password:@"xxxx" error: &err];

    NSLog(@"%s", (ret? "YES":"NO"));
    if ( ! ret ){
      NSLog(@"%@", err);
      return 1 ;
    }
   return 0;

}

参考資料

https://developer.apple.com/documentation/corewlan

ツイキャス(twitcasting)のm3u8 を取り出して遊ぶ

ツイキャスのm3u8 のURLを見つけた

m3u8 に調べていたら、ツイキャスもhls のm3u8 で配信されていることがわかった。

フォーマット

http://twitcasting.tv/$twicas_username/metastream.m3u8

コレだけで再生出来るっぽいぞ。

もしかして Raspi で再生できる??

omxplayer --sid 2 http://twitcasting.tv/$twicas_username/metastream.m3u8

オモシロイね

twicas を取得してみた結果。

解像度や音だけのストリームもあるので、ミキシングして楽しめそう。

Input #0, hls,applehttp, from 'http://twitcasting.tv/XXXX/metastream.m3u8':
  Duration: N/A, start: 1355.776000, bitrate: N/A
  Program 0
    Metadata:
      variant_bitrate : 220000
    Stream #0:0: Video: h264 ([27][0][0][0] / 0x001B), none, 90k tbr, 90k tbn, 180k tbc
    Metadata:
      variant_bitrate : 220000
    Stream #0:1: Audio: aac ([15][0][0][0] / 0x000F), 0 channels, fltp
    Metadata:
      variant_bitrate : 220000
  Program 1
    Metadata:
      variant_bitrate : 88000
    Stream #0:2: Video: h264 ([27][0][0][0] / 0x001B), none, 90k tbr, 90k tbn, 180k tbc
    Metadata:
      variant_bitrate : 88000
    Stream #0:3: Audio: aac ([15][0][0][0] / 0x000F), 0 channels, fltp
    Metadata:
      variant_bitrate : 88000
  Program 2
    Metadata:
      variant_bitrate : 64000
    Stream #0:4: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, mono, fltp
    Metadata:
      variant_bitrate : 64000

参考資料

gist.github.com

radikoのjs / m3u8 / hls 化に併せてAuthtokenと再生URL取得をするサンプル

authtokenの取得方法が変更になってた

Radikoが、JSプレーヤーでHTML5になっていたので、ちょっとリクエストを追いかけて見てた続き

  • auth1 へリクエスト投げてauth_token を取得
  • auth2 でauth_token を有効化
  • m3u8にリクエストを投げる
  • 使い切りのchunklist の url が投げられるのでそこへリクエストを出す。

だいたいはコレで再生ができると思う。

python pip とか npm にしてやろうって人も居るだろうけど、radikoは年に1回にAPI変更することがあるので、メンテする覚悟がないとゴミをnpm に作ることになるよね。

コード書いた

gist.github.com

現在フォルダのファイルシステムのフォーマットを調べる(ext4 か btrfs かなど)

あれ?ファイルシステムがわからない。

このディレクトリが入ってるHDDのファイルシステムってなに?btrfs ? XFS ?それとも ext??

ファイルシステムのフォーマットのタイプを調べる方法が必要なので調べました。

df で調べることが出来る。

takuya@raspi3:/var/samba$ df -Th .
ファイルシス   タイプ サイズ  使用  残り 使用% マウント位置
/dev/sda       btrfs     58G   32G   25G   57% /var/samba

ちなみに、mac でできるよ。

brew で入れた df を使えば同じことが出来る

takuya@Desktop $ df -Th .
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/disk1     hfs   233G  199G   35G  86% /

おお! hfs って表示された。

ext4 の例

takuya@$ ssh mine 'df -Th ~'
Filesystem            Type  Size  Used Avail Use% Mounted on
/dev/mapper/home ext4   50G   26G   21G  56% /home

その他の選択肢なども

今回は、今いるディレクトリから調べたいってことなので、df を使いました。

ディスクが解るなら、lsblk や fsck を見ると良いかも

  • lsblk -f
  • fsck -N /dev/sda
  • blkid /dev/sda

参考資料

https://www.tecmint.com/find-linux-filesystem-type/

swap ファイルをswapon するとエラーになる。(btrfs)

2022/05/23 追記

Linuxカーネル 5.x から btrfs 内部にスワップファイル設置がサポートされてます。新しい方に書き直した。

新しい方法 → btrfs 内部にスワップ・ファイルを設置する - それマグで!

swap ファイルが作れない

takuya@raspi3:/var/samba$ sudo swapon out.swp
swapon: /var/samba/out.swp: swapon failed: 無効な引数です
takuya@raspi3:/var/samba$ LANG=c sudo swapon out.swp
swapon: /var/samba/out.swp: swapon failed: Invalid argument

btrfsにはswapが作れない

エラーメッセージがinvalidとしかでないのでわからなくなる

散々、検索して理由を探したけど見当たらなくて。すごく青ざめてパニックになってた。わかってしまうとなんだって感じ。

ext4 の中には swap file が作れるが
btrfs の中には swap file が作れない。

単純にswapon でマウントしようとしただけではinvaid エラーになって気づきにくい。っていうかしらないとハマる。

慌てて確認したら、btrfs ですね。。。

takuya@raspi3:/var/samba$ df -Th .
ファイルシス   タイプ サイズ  使用  残り 使用% マウント位置
/dev/sda       btrfs     58G   32G   25G   57% /var/samba

スワップファイルが作れない解決法

btrfs 上に直接作れないだけで。作成済みのファイルをloopback で接続すれば出来る。

dd if=/dev/zero of=swap.img count=512 size=1M
losetup swap.img /dev/loop1
swapon /dev/loop1

btrfs がinodeを管理しちゃったり場所を移すので出来ないんだと思う。まぁ不便だね

参考資料

https://www.linux.com/forums/lfs201-class-forum/lab-131-swapon-failed-invalid-argument

動画の再生時間を取得する。json にする。

動画の再生時間(何分の動画か調べる)

ffprobe を使うと瞬殺

もし忘れた場合、再生時間っていう表現が曖昧で検索しにくいの苦労しそうなのでメモ。

 ffprobe  -i input.mp4 -show_entries format=duration

サンプル

takuya@Desktop$ ffprobe  -i input.mp4 -show_entries format=duration -print_format json  -loglevel quiet  | jq .
{
  "format": {
    "duration": "302.736000"
  }
}