それマグで!

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

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

nkfでフォルダ内のファイルをぱぱっとShiftJIS(CP932)からUTF-8に変換する

cp932まだ絶滅しない。

CP932はいつまで生き残るんですかね。。。ファイル名だけならまだ我慢するけどファイルの中身もとなると結構しんどいですよね・

フォルダ内の txt ファイルの文字コードを表示する

$ ls  **/*.txt | xargs -I@ nkf -w -g @
Shift_JIS
Shift_JIS
Shift_JIS
Shift_JIS
CP932
Shift_JIS
Shift_JIS
Shift_JIS
Shift_JIS

あー、、、もうね・・・

全部まとめてUTF-8にする

$ ls  **/*.txt | xargs -I@ nkf -w --overwrite @

できた

 ls  **/*.txt | xargs -I@ nkf -g @
UTF-8
UTF-8
UTF-8
UTF-8
UTF-8
UTF-8
UTF-8
UTF-8
UTF-8

うん、楽ちん。nkf 楽だわー

関連資料 nkf 使い方

文字コード変換コマンドの nkfの使い方と実例をまとめました。 - それマグで!

radikoの地域判定がオカシイので、SSH経由で再生する

radikoのIPベースの地域判定が残念

MBSラジオを聞きたいのの、東京判定されちゃって悲しいときは結構ある。 WiFi借りてたり、テザリングしてたりすると特に・・・・スマホで聴くのは不便だし

そうだよ。SSH経由で再生しちゃえば楽じゃん

ssh myserver 'rtmpdump アレコレ --output - ' | mplayer - -cache 128

ssh 経由なら確実だ。

自宅に置いておいたSSHサーバーは地域判定をそう簡単に失敗しないので、これでいけるよね。SSHのパイプ転送便利!

VPNとか面倒くさいもんね。

mac で手っ取り早くm3u8を再生する(らじる)

Safari起動するのも面倒くさい

Safariでm3u8を開くのはQuickTimeを起動するようなものなので*1

open -a 'QuickTime Player'  'https://nhkradiolkfm-i.akamaihd.net/hls/live/512097/1-fm/1-fm-01.m3u8'

として、open コマンドで直接叩けば良いんだよ。

ほかにも VLCが対応してるので

open -a 'VLC'  'https://nhkradiolkfm-i.akamaihd.net/hls/live/512097/1-fm/1-fm-01.m3u8'

などとすれば、ぱぱっと再生できる。あとはこれをaliasにでもしておけば、タブ専有されなくて楽ですよね。

地上波NHKも、とっととm3u8で配信してほしいものだ。

*1:AVFoundationに丸投げする的な意味で同じかなーって思う

pythonのリスト内包表記でネスト

list comprehensions で ネストしたい

for for をしたいなと思った。

data = [[ 3 ], [4] ]
[ e for row in data  for e in row ]

ネストと if 文

data = [[ 3 ], [4] ]
[ e for row in data  for e in row if e %2 ==0  ]

楽しい。 filter も map も要らない。list comprehensions 便利。

radikoの再生スクリプトを書き直した(python3.6)

radiko の再生スクリプトをマルっと書き直した

レポジトリはこちら

github.com

python3.6 でフォーマット文字列が導入されたので、ようやくPythonをシェルコマンド呼び出しに使って使いやすくなったので、ガンガン書き直した。

注意点とか

python3.6 で書き直した。

python 3.6の導入とか

pyenv を使う

git clone https://github.com/pyenv/pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
./pyenv/shims/bin/pyenv rehash
pyenv install 3.6.2
pyenv global 3.6.2
pyenv rehash
hash -r 

pyenv の準備ができたら

python play_radiko.py abc 

ABC*1 を再生

再生しながら録音、タイムフリー

ストリーミングを保存、タイムフリーの取得、再生、再生しながら保存などもついでにヤッておいた

rtmpdump は ffmpeg だけでもできるし、mplayerffmpeg 使ってるし、相当に冗長なんだけど、とりあえずraspi で 動けばいい的な

過去の関連資料

Radikoの再生&録音スクリプトをPythonで書きなおした - それマグで!

http://takuya-1st.hatenablog.jp/entry/2014/09/28/051532

Raspian(raspberryPi)でRadikoを聴く - それマグで!

コマンドからRadikoを録音する。 - それマグで!

*1:abc はradikoを運営してくれてる母体となった会社です。感謝。

Raspian(raspberryPi)でRadikoを聴く

Raspi でラジオを聞きたい

オーディオジャックから、ラジオを垂れ流したい。散々やってきたけど、Raspi ZeroからRaspi3に変えたので、オーディオジャックが使えるようになった

raspi のオーディオジャックでラジコを聴く

rtmpdump は必要。

rtmpdump -v -r rtmpe://f-radiko.smartstream.ne.jp\
  --app ABC/_definst_\
  --playpath simul-stream.stream\
  -W http://radiko.jp/apps/js/flash/myplayer-release.swf\
  -C S:"" -C S:"" -C S:"" -C S:${authtoken}\
  --live --stop 5400 \
| omxplayer -o local  --hw --timeout 30s  --no-keys pipe:0

omxplayer が rtmp には対応してるけどキーを送れないのと、rtmpe は出来ないっぽい。この辺はそのうちもう少し調べたい。もしキー送信できたら omxplayer だけで完結するので。

--hwつけたら、ハードウェアデコードしてくれるらしいが、、効果あるんだろうか

omxplayer にパイプ

omxplayer に pipe でデータを渡すには --no-keys をつけて pipe:0 を指定する

この辺は過去資料にある。→ raspberry pi の omxplayer を標準入力でパイプして使う。 - それマグで!

コレだけの設定で、結構楽ちんに野球中継を垂れ流す事ができて幸せな感じある。

ちなみにタイムフリーは

ffmpeg を使うしか無い。omxplayer で m3u8 は再生できるが、CookieUA以外の、HTTPヘッダを追加できないみたいなので。

ffmpeg  -y \
   -headers 'X-Radiko-AuthToken: ${authtoken}'\
     -i 'https://radiko.jp/v2/api/ts/playlist.m3u8?station_id=${channel}&ft=${start}&to=${end}'\
     -loglevel panic -acodec copy -  \
| omxplayer -o local --timeout 30s  --no-keys pipe:0

タイムフリー楽しい。

Raspian(raspberryPi)でらじる★らじるを聞く

らじる★らじる を raspi で聴ければ

Raspberry Pi にスピーカー繋いで、ラジオを流せればとっても楽ちんだと思いません?

omxplayer だけでいけます。

2017-09から、らじる★らじるが m3u8 に変更になっているので HLS のm3u8 を指定するだけなのでとても簡単

omxplayer --timeout 60s -o local https://nhkradiobkr1-i.akamaihd.net/hls/live/512291/1-r1/1-r1-01.m3u8

たったこれだけ。

timeout がデフォルトの10s だとakamai の仕様で接続が切れるらしいので、 --timeout で長めに設定する必要がある。

-o は アウトプットを オーディオジャックに指定している。raspi は alsa とか設定するより omxplayer を使うのが一番ラクですよね。

心配なら --audio_queue を付けても良いかもしれない

omxplayer が rtmpe と ヘッダ追加 に対応してくれたらradikoもrtmpdump 無しでいけるのになぁ。

Debian のバージョンと名前を確認する。

バージョン番号

takuya@raspberrypi:~ $ cat /etc/debian_version
8.0

バージョン名などの各種情報

takuya@raspberrypi:~ $ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 8 (jessie)"
NAME="Raspbian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
takuya@raspberrypi:~ $

ぱぱっと見て使えるファイル名は

  • /etc/os-release
  • /etc/debian_version

これで、バージョン番号と名前が確認できます。

他にもいろいろありますが。この方法が手軽だと思う。

今回は raspberry pi の raspbian で確認しました。

2018/12/03

記述を追加

Raspian(raspberry Pi)のアップグレード(jessie→stretch)

raspi の stretch があるので、アップグレードします。

方法は、通常の debian アップグレードと同じでいいですね。

事前準備

できるだけ最新版にしておく。

sudo apt-get update &&  sudo apt-get upgrade -y

jessie の記述を探す。

grep jessie /etc/apt/ -R 

名前を置換する

Debianのアップグレードと同じように、/etc/apt でバージョン名を指定する

sudo sed -i 's/jessie/stretch/g' /etc/apt/sources.list
sudo sed -i 's/jessie/stretch/g' /etc/apt/sources.list.d/raspi.list 

自動更新してたので念の為にコレも。

sudo sed -i 's/jessie/stretch/g' /etc/apt/apt.conf.d/50unattended-upgrades

名前が置換されたのを確認

takuya@raspberrypi:~ $ sudo grep jessie /etc/apt/  -R
takuya@raspberrypi:~ $

コレだけが置換された。

takuya@raspberrypi:~ $ sudo grep stretch /etc/apt/  -R
/etc/apt/apt.conf.d/50unattended-upgrades://   n,codename      (eg, "stretch", "stretch-updates")
/etc/apt/apt.conf.d/50unattended-upgrades://   ${distro_codename}      Installed codename (eg, "stretch")
/etc/apt/apt.conf.d/50unattended-upgrades://      "o=Raspbian,n=stretch";
/etc/apt/sources.list:deb http://mirrordirector.raspbian.org/raspbian/ stretch main contrib non-free rpi
/etc/apt/sources.list:#deb-src http://archive.raspbian.org/raspbian/ stretch main contrib non-free rpi
/etc/apt/sources.list.d/raspi.list:deb http://archive.raspberrypi.org/debian/ stretch main ui
/etc/apt/sources.list.d/raspi.list:#deb-src http://archive.raspberrypi.org/debian/ stretch main ui

更新する。

sudo apt update

更新が終われば、アップグレードしたいけど・・・

もし心配なら、シミュレーターでシミュレーションする。

apt --simulate upgrade 
apt --simulate dist-upgrade 

パッケージを余りたくさん入れてなかったり、httpdサーバーの設定を変えてなかったり、smb.conf とかサーバの設定を変えてなければ、ほとんどなにも起きないのでシミュレーターは必要ないと思う。

アップグレード

sudo apt dist-upgrade

アップグレードが終了

takuya@raspberrypi:~ $ cat /etc/debian_version
9.0

子孫プロセスも含めて殺す。Kill children and ancestors

プロセスの子孫を消したいなーって

絶対、車輪の再発明になるので検索させていただきました。

再帰で殺す

kill コマンドとppid をきっちり使いこなせば、ちゃんと理解できるんだろうけど、それを説明するのはかったるいので、再帰呼出しがイメージしやすいのではなかろうか。

killtree.sh
#!/usr/bin/env bash


killtree() {
    local parent=$1 child
    for child in $(ps -o ppid= -o pid= | awk "\$1==$parent {print \$2}"); do
        killtree $child
    done
    kill $parent
}


killtree $@

参考資料

https://stackoverflow.com/questions/392022/best-way-to-kill-all-child-processes

Chromeがキーチェインを使う条件

chrome が keychain のダイアログを聞いてきた!?

chrome ってキーチェイン使わないとおもってたら、キーチェインのダイアログを聞いてきたのであたらためて調べてみた

chrome が キーチェインを使う条件

Chromeはキーチェインを「読み込み専用」で使うようです。

chrome のパスワードの使い方(読込

  • Chromeの内蔵パスワードを調べる
  • なかったら、キーチェインを調べる。

の OR 条件になっているようです。

Chromeのパスワードの利用法(書込み

書込みは、内蔵パスワード保存のみのようです。 更新もないようです。

chrome でパスワードの使い方

いったん、Safari起動して保存してからChromeで開くと良いようですね。

でも昨日は

あきらかに、ChromeがKeychainsに新規項目追加したと思うんだけど。なんで新規項目追加されたのかちょっとつい調査したい。

chrome のDNSキャッシュを消す方法

dns 書き換えてると chromeDNSキャッシュが邪魔

PC/MacDNSキャッシュを消しても、なんかダメだなと思ったら、どうやらChromeDNSキャッシュがあるようで。

DNS触ってnginx を切り替えてるときに、chromedns cache はうざい。

chromeDNSキャッシュの確認と削除

chromeDNSキャッシュは chrome-urls からアクセスできる。 → chrome://net-internals/#dns

chrome://net-internals/#dns

f:id:takuya_1st:20170908002307p:plain

DNS はちゃんとキャッシュ見ましょう。

ほんとうはDNSのキャッシュ設定を変えれば良いんだろうけど。キャッシュ消すのが一番早い

DNS浸透待ちはしないでね。浸透言うな警察が来るよ。cacheにも注意しよう

2021-01-14

cache で検索しても出てこないのでキーワードを見直し

python の shlex でコマンドに渡す字句を分割する

コマンドを Popen に渡すときに

コマンドを組み立てた文字列を配列で渡すなら、split が便利だけど、shlex.split ならさらに安全に渡せるらしい。

    self.prcs = Popen( shlex.split(cmd), shell=False )

たしかに文字列をsplit すると暴走するものね。

また shlex.quote もあるのでこちらも便利そう

Shell経由させないほうが孫プロセスを作らなくて楽なイメージ有る。

関連資料

takuya-1st.hatenablog.jp

参考資料

https://docs.python.org/3.6/library/shlex.html

MariaDB のユーザー認証をPAM経由にする。

mariaDB にしました。

mariaDB に変えたので、PAMによる認証連携は、最初から付属してます。便利!

mariadb でPAM Authをするには

mysql の管理者(root) で ログインしてプラグインを有効化する

INSTALL SONAME 'auth_pam';

これでほとんど完了。あー楽。

PAM経由するユーザーを追加する

mysql にユーザーを追加する。

CREATE USER takuya identified via pam

これでいい。楽ちん。

MySQLがPAMを参照できるよにする。

ここは何もしなくて良さそう。auth を使うみたい。以前に mysql + pam であれこれ設定してるので、パーミッションとかは省略して動いた。

もし、mysqlmariadb といった名前でPAMに書きたい場合(たとえば www-data や apachepostgresql などと共通名にしたいとか)

ユーザーできたので、プラグインがPAMに認証を丸投げできるように、PAM側で受け取れるように設定する。

CREATE USER takuya identified via pam USING 'my-pam-name' # 

MySQLの場合

以前はこっちをやってた。

http://takuya-1st.hatenablog.jp/entry/2015/03/16/164719

brew で upgradable/アップグレード可能なパッケージを一覧する

apt には apt list –upgradable がある

同じことを homebrew の brew コマンドでやるにはどうすればいいか

outdated を使う

brew outdated

これで、新しくなってる brew のパッケージの一覧が取得できる。

参考資料

https://stackoverflow.com/questions/12946505/how-can-i-tell-which-homebrew-formulae-are-upgradable