CLI な podcast aggregator/downloader な podracer を試してみる

podcast aggregator に rhythmbox を利用しているのですが,たまにファイルが存在するのに何度やってもダウンロードに失敗したり NotePC で動かしているので容量の問題で古いのをファイルサーバに持って行ったりといった処理が面倒です.
CIL で動くものがあればファイルサーバで入手するようにして新しい物だけ手元に or ファイルサーバ経由で視聴するようにしら便利かもということで CLI で動く podcast aggregator が無いか探してみました.

$ apt-cache search podcast aggregator
gpodder - podcast client and feed aggregator
podracer - podcast aggregator/downloader

gpodder は GUI と CLI のセットで,podracer は CLI のみのようです.今回は podracer を試してみます.

導入

導入は apt 一発です.

$ sudo apt install podracer

設定ファイルの用意

~/.podracer/subscriptions というファイルに入手したいフィードを1フィード1行で書いておきます.# 行はコメントになるようです.

# 電脳空間カウボーイズ
http://feeds.feedburner.com/weblogs/csc
# backspace.fm
http://feeds.backspace.fm/backspacefm

実行

podracer コマンドを実行すると,~/.podracer/subscriptions からpodcast をダウンドードしてくれます.ダウンロードが完了すると自動的に終了します.

$ podracer

初回実行時には過去のものも入手するので時間が掛かるでしょう.特に画面には何も表示されないのでログファイル( ~/.podracer/podcast.log ) を確認するといいと思います.

$ tail -f ~/.podracer/podcast.log

取得した podcast は ~/podcasts 以下の日付ファイルの下に保存されます.この日付は実行日時です.

$ ls ~/podcasts
2016-01-27  2016-01-28
$ ls -lA ~/podcasts/2016-01-28
合計 59408
-rw-r--r-- 1 mk mk        0  1月 28 14:03 2016-01-28-podcasts.m3u
-rw-r--r-- 1 mk mk 60833627  1月 28 14:02 jlEV91AshKrq
$ file  ~/podcasts/2016-01-28/*
/home/mk/podcasts/2016-01-28/2016-01-28-podcasts.m3u: empty
/home/mk/podcasts/2016-01-28/jlEV91AshKrq:            Audio file with ID3 version 2.3.0

後は各種プレイヤーで再生できます.

$ mplayer ~/podcasts/2016-01-28/jlEV91AshKrq

ファイル名は podcast 提供者の物のままで同じディレクトリに格納されてしまうので名前が衝突したら多分新しい方で上書きされてしまいます.それとこのままではどのファイルがどの podcast なのかとかわからないですね.オプションも特に無いようなので沢山の podcast を保管しようという用途で使うのには向いていないかもしれません.
毎日実行して今日の分をまとめて再生して消してというように使う感じなのかもしれません.

追記)プレイリストの不具合?

podracer 実行時に 2016-01-28-podcasts.m3u のようなプレイリストが作られますが,mp3/ogg/m4a/m4b 以外の拡張子は登録されません.こんな感じで作り直すと良さそう.

$ ls -1A ~/podcasts/2016-01-28 | grep -v \.m3u$ > ~/podcasts/2016-01-28/2016-01-28-podcasts.m3u

この方がいいかな

$ ls -1A ~/podcasts/`date +%F` | grep -v \.m3u$ > ~/podcasts/`date +%F`/`date +%F`-podcasts.m3u

podracer 自体を修正してもいいかも.雑いけどこんなとか.
これだとサムネイル画像なども含まれてしまう.

$ diff -u /usr/bin/podracer podracer
--- /usr/bin/podracer   2015-07-04 22:39:26.000000000 +0900
+++ podracer    2016-01-28 18:34:40.317391930 +0900
@@ -415,10 +415,7 @@
                then
                (
                cd "$poddir"
-               find . -name \*.mp3 > "$m3u"
-               find . -name \*.ogg  >> "$m3u"
-               find . -name \*.m4a  >> "$m3u"
-               find . -name \*.m4b  >> "$m3u"
+               find . -name \* -type f | grep -v "$m3u" > "$m3u"
                )
        fi
 fi

追記2)
上の修正だとサムネイル画像なども登録されてしまう.
以下はその他のファイルを file command で調べて audio という文字列が入っていたら登録するもの.

$ diff -u /usr/bin/podracer ./podracer
--- /usr/bin/podracer   2015-07-04 22:39:26.000000000 +0900
+++ ./podracer  2016-01-28 19:12:31.980446668 +0900
@@ -419,6 +419,7 @@
                find . -name \*.ogg  >> "$m3u"
                find . -name \*.m4a  >> "$m3u"
                find . -name \*.m4b  >> "$m3u"
+               find . | egrep -v "\.mp3$|\.ogg$|\.m4a$|\.m4b$" | xargs file | grep -i audio | cut -f1 -d: >> "$m3u"
                )
        fi
 fi

awk 製 3Dシューティングゲーム awkaster で遊んでみた

awk 製 3Dシューティングゲームがあると聞いて遊んでみました.

遊ぶには GNU awk 4.0.0 以上が必要です.Debian だと gawk というパッケージです.とりあえず遊んでみるにはこんな感じで.

$ sudo apt install gawk
$ wget https://raw.githubusercontent.com/TheMozg/awk-raycaster/master/awkaster.awk
$ awk -f ./awkaster.awk

操作はこんな感じです.

  • 1234 画面表示切り替え
  • WASD 移動
  • JL 回転(16回で1回転)/Shiftを押しながらで高速回転(8回で1回転)
  • SPACE 攻撃
  • X エレベーターに乗る(ゲームクリア)
  • Q 終了

以下は遊んでいる様子です.

asciicast

3Dシューティングというとスターフォックスを思い浮かべたのですが,単純な 3D RPG 的な感じです.Wolfenstein 3D と doom に触発されたそうです.Wolfenstein 3DWolfenstein 3D は知らないのですが確かに doom みたいな感じです.
ターン制?なので敵の赤球が出てきても慌てず操作できます.

敵に触れるとHPが減っていって0になるとゲームオーバーでこんなメッセージが出ます.

GAME OVER! YOU LOSE!
Credits: Fedor 'TheMozg' Kalugin
https://github.com/TheMozg/awk-raycaster
Gameplay testing - Alex 'Yakojo' & Danya 'bogych97'
Go away!

うまいことエレベーターに到着して X を押すとゲームクリアです.
但し ELEVATOR COMING0 になっている必要があります.これは初め 1000 で1操作で1カウントダウンされます.ゴールのエレベーターの場所は見た目わかりません
敵が沢山居るところの辺りにあるので探してみて下さい.
(私は判んなくて結局 source 読んでクリアしましたorz)

YOU WIN! YOUR SCORE: 4900
Credits: Fedor 'TheMozg' Kalugin
https://github.com/TheMozg/awk-raycaster
Gameplay testing - Alex 'Yakojo' & Danya 'bogych97'
Go away!

ちなみにそこそこ広い領域が必要です.領域が狭いと画面に収まりきらずずれてしまいます.フォントサイズを小さくするなどして列と行を確保しましょう.
GNU screen 上でも Rasbian jessie 上でも問題なく動きました.

昔こんな3D迷路とかをポケコンBASIC で作っていたのを思い出しました.最近のマイコンやRaspberry Pi でこういうゲームを作ってみるのも楽しそうですね :)
(Arduboy とか POCKETC.H.I.P. とか )

デジモノステーション2016年2月号付録の0SIMをRaspberry Piで試す

デジモノステーション 2016年2月号に0SIM by So-net というものが付録で付いてきて一部で流行っています.
雑誌「デジモノステーション」最新号 – DIGIMONO!(デジモノ!)

IMG_20151229_022627IMG_20151229_022636

これはこの雑誌を買って付いてきた付録のSIMを使うと雑誌代(620円)だけで開通手続き手数料無料で月あたり500MB迄無料で利用できるというもの.勿論他にSIMを刺す端末は必要です.

【0SIM by So-net】 詳細
形状:nanoSIM 規格:0SIM by So-net 種類:データ通信専用
データ量と料金(2段階定額)
0MB~499MB:0円
500MB ~ 2047MB:100円~1500円
2048MB ~:1600円
速度制限:なし(ただし5GBまで)/ NTTドコモ 4G LTE(下り最大225Mbps)
開通期限:2016年2月24日

上限もあるのでうっかり使いすぎても安心感があります.ちなみに上限をよく超えるようだと別のプランにしたほうがお得です.
一人で複数契約は出来ないのでたくさん買って500MBごとに差し替えて使うと言ったことは出来ない,3ヶ月利用しないと自動解約されるようなので寝かせておくことも出来ないよう.
普通に使うとあっという間に500MB超えちゃうでしょうけど使いようによっては便利に使えそう(気象センサのデータを送るとかなら余裕).ということで試してみたかったのですがここは鹿児島.都内から最低でも2日遅れなので試せないでいました.昨日やっとコンビニで入手出来たので試してみました.

ちなみにAmazonでは売り切れでマーケットプレイス扱いの物しか無いようです.その中で安いものはSIMなしと書かれているので注意しましょう.

今回はUSBモデムとして以前500円ほどで買った Docomo L-02C を Rasbian jessie を導入した Raspberry Pi 2B に接続して wvdial で接続しました.このモデムは結構電気を食うらしく電源がある程度大容量でないととても不安定になります.今回は秘密結社オープンフォース河野総統謹製の RaspberryPot という GPIO 経由での電源を利用しました.RaspberryPot は現在恐らく入手出来ません.Raspberry Hubu の電源部分を切り出したものなので Raspberry Hubu でも同じことが出来ます.
#ちなみに Pi で動かす前に Debian testing stretch amd64 な NotePC でも同様の設定で動くのを確認しています.Debian oldstable 以降なら全部同じ手順で行けると思います.


RaspberryHabu – FABLIB Wiki – FABLIB – OSDN
秘密結社オープンフォース

IMG_20151229_071104

開通手続き

次のページから開通手続きを行います.開通手続きの期限は2016年02月24日.
http://lte.so-net.ne.jp/r/0sim/a/

ログイン情報はSIMの台紙に書かれています.
IMG_20151229_022855

必要なソフトウェアの導入

$ sudo apt update && sudo apt upgrade
$ sudo apt install cu wvdial usb-modeswitch

<追記>
※必要なソフトウェアの導入にusb-modeswitchパッケージを追加
</追記>

利用ユーザ pidialout グループへの登録

この手続きをしないと,ダイヤル時など毎回 sudo しないといけません.

$ sudo addgroup pi dialout

※反映には要ログインしなおし

Docomo L-02C への APN登録

モデムへの接続と動作確認

/dev/ttyUSB2 部分は dmesg|tailなどとして確認して下さい.モデムの他に何も接続していなければ ttyUSB0~ttyUSB3 の4つのデバイスが確認できるはずです.

% cu -l /dev/ttyUSB2 -s 115200
Connected.
atz
OK

現在のAPN確認

AT+CGDCONT?
+CGDCONT: 1,"IP","mopera.net",,0,0,0
+CGDCONT: 11,"IP","mopera.net",,0,0,0

OK

APN(so-net.jp)を設定

AT+CGDCONT=1,"IP","so-net.jp"
OK

※次のようにして複数のAPNを設定することも可能

AT+CGDCONT=2,"IP","lte.nttplala.com"
OK
AT+CGDCONT=3,"IP","mineo-d.jp"
OK

APNが登録できたか確認

AT+CGDCONT?
+CGDCONT: 1,"IP","so-net.jp",,0,0,0
+CGDCONT: 11,"IP","mopera.net",,0,0,0
OK

設定の書き込み

ATZ0
OK

モデムから切断

~.

Disconnected.

ダイヤルアップのために wvdial の設定

/etc/wvdial.conf に以下を追記.

[Dialer 0sim]
Modem Type = Analog Modem
Phone = *99***1#
Carrier Check = no
Auto Reconnect = yes
Stupid Mode = yes

ISDN = 0
Init1 = ATZ
Init2 = ATH
Init3 = AT+CGDCONT?
Init4 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Dial Command = ATD
Modem = /dev/ttyUSB2
Baud = 115200

Username = nuro
Password = nuro

接続

$ wvdial 0sim

接続確認

$ w3m -dump http://ifconfig.me/all
ip_addr: 118.241.XXX.XXX
remote_host: XXXXXXXXXX.ap.nuro.jp
user_agent: w3m/0.5.3+debian-19
port: 44286
lang: ja;q=1.0, en;q=0.5
connection: 
keep_alive: 
encoding: gzip, compress, bzip, bzip2, deflate
mime: text/html, text/*;q=0.5, image/*, application/*, audio/*, video/*, x-scheme-handler/*, x-content/*, inode/*
charset: 
via: 
forwarded: 

利用状況確認

対のページからログインして利用状況が確認できます.また,400MB を超えるとメールでお知らせも来るらしいです.
ユーザWebメインメニュー

20151229_07:12:50-10076

ということで暫く試してみたいと思います.

※Amazonで雑誌を買う場合はSIMなしのものもあるのでよく確認して購入しましょう.

関連URL

<追記>

Twitterで/dev/ttyUSBnが見つからないという書き込みを見て導入パッケージが足りなかったのに気づきました.これが足りないとUSBモデム接続時のdmesgで以下のようにCD-ROMのsr0デバイスが出て来てttyUSBnは出てきません.

$ dmesg | tail
[417400.989925] usb 2-1.1: Product: docomo L02C
[417400.989927] usb 2-1.1: Manufacturer: NTT DOCOMO, INC.
[417400.989928] usb 2-1.1: SerialNumber: 353168046719530
[417400.990982] usb-storage 2-1.1:1.0: USB Mass Storage device detected
[417400.991062] scsi host11: usb-storage 2-1.1:1.0
[417401.988387] scsi 11:0:0:0: CD-ROM            LG       Autorun          2.00 PQ: 0 ANSI: 0
[417401.988771] scsi 11:0:0:0: Attached scsi generic sg2 type 5
[417401.999991] sr 11:0:0:0: [sr0] scsi-1 drive
[417402.000001] cdrom: Uniform CD-ROM driver Revision: 3.20
[417402.000257] sr 11:0:0:0: Attached scsi CD-ROM sr0

この時のベンダーID:プロダクトIDは1004:61ddです.

$ lsusb|grep LG
Bus 002 Device 027: ID 1004:61dd LG Electronics, Inc. 

この場合usb-modeswitchパッケージを導入して,

$ sudo apt install usb-modeswitch

USBモデムを接続し直すと出てきます.

$ dmesg | tail
[417994.525827] usb 2-1.1: Product: docomo L02C
[417994.525830] usb 2-1.1: Manufacturer: NTT DOCOMO, INC.
[417994.527296] option 2-1.1:1.0: GSM modem (1-port) converter detected
[417994.527511] usb 2-1.1: GSM modem (1-port) converter now attached to ttyUSB0
[417994.527807] option 2-1.1:1.1: GSM modem (1-port) converter detected
[417994.527997] usb 2-1.1: GSM modem (1-port) converter now attached to ttyUSB1
[417994.528217] option 2-1.1:1.2: GSM modem (1-port) converter detected
[417994.528346] usb 2-1.1: GSM modem (1-port) converter now attached to ttyUSB2
[417994.528597] option 2-1.1:1.3: GSM modem (1-port) converter detected
[417994.528741] usb 2-1.1: GSM modem (1-port) converter now attached to ttyUSB3

プロダクトIDも61ddから618fに変わりました.

$ lsusb|grep LG
Bus 002 Device 029: ID 1004:618f LG Electronics, Inc. Ally/Optimus One

何故CD-ROMデバイスが出てくるかというとWindows環境などでのツールやドライバ導入のためです.このCD-ROMデバイス中にツールやドライバが入っていて簡単に導入が出来るというものなのですが,Linux版のツールやドライバは入っていないです.usb-modeswitchパッケージはCD-ROMからUSBモデムへのデバイスの切り替えをしてくれます.

</追記>

フレームバッファで焼かれるあひるを録画する(あひる焼き Advent Calendar 2015)

この記事は あひる焼き Advent Calendar 2015の12月15日分の記事です.
#2度めですが1週間ほど空きがあったので.


🔥

以前こんな記事を書きました.

この時は

#terminal をフレームバッファも含めて動画でスクリーンショットとる方法が解らず今回は仮想マシンで実行してキャプチャしました.だれか端末のフレームバッファも含めての動画でのスクリーンショットのとり方を知ってる人が居たら教えて下さいo

という感じでフレームバッファの動画の録画方法が解らず,別のカメラで画面を録画していました.調べたら方法が見つかったので今回はその手順を紹介したいと思います.

といっても avconvffmpeg でフレームバッファを指定するだけです.
#Debian stretch からはまた libav から FFmpeg に戻るようです. > libav and FFmpeg: switch over

$ avconv -f fbdev -i /dev/fb0 fb.mp4
$ ffmpeg -f fbdev -i /dev/fb0 fb.mp4

これで録画したのがこちらです.

これで画面をカメラで録画したりしなくても焼かれるあひるが録画できるようになりました :)

Linux 環境での Raspberry Pi 向け OS 書き込みTips

このエントリは Raspberry Pi Advent Calendar 2015 の12月08日分です.
昨日は @2box2boさんの RaspberryPiと公式タッチディスプレイでマインクラフトするお話 | 流連荒亡 でした.公式ディスプレイ欲しいです…….

最近 Raspberry Pi はサブPC 的に使っててネタがない(普通に Linux Desktop なので……)ので紙製ケースの紹介でもしようかと思っていたのですが,Raspberry Pi に OS を書き込むのによく使う dd 関連のネタが少し溜まっているので今回はこれを紹介しようと思います.(NOOBS だとほぼ関係なくコピーするだけでいいんですが……)
Rasbina jessie / Debian stretch で検証していますが,Linux なら導入手順以外同じだと思います.Mac OS X / UNIX 系の OS でも使えると思います.

– 紙ケースの一例 –

dd(dataset definition) は GNU Coreutils の中に入っているのでほとんどの GNU/Linux だと標準で導入されていると思います.とても便利だけど使い方を誤るとシステムやデータをいとも簡単に壊してしまえます.注意して実行しましょう.

進捗状況確認

dd で sd 書き込み中にどのくらい進んだのだろうと確認したくなることがあります.

kill -SIGUSR1

dd のプロセスに対して SIGUSR1 シグナルを投げると進捗が確認できます.

dd のプロセス番号を確認

$ ps -ef|grep dd
   :
root      9273 32218  0 17:57 pts/1    00:00:00 sudo dd of=/dev/sdz bs=4M
root      9276  9273  9 17:57 pts/1    00:00:00 dd of=/dev/sdz bs=4M

9276 なので以下のように

$ sudo kill -USR1 9276

で,こんな感じに表示されます.

0+243258 レコード入力
0+243258 レコード出力
1224679424 バイト (1.2 GB) コピーされました、 17.2794 秒、 70.9 MB/秒
0+302681 レコード入力
0+302681 レコード出力
1532985344 バイト (1.5 GB) コピーされました、 20.8063 秒、 73.7 MB/秒

なのでこんなとか

$ sudo pkill -SIGUSR1 ^dd

こんな感じで叩くと良い感じだと思います.

% watch -n30 'sudo pkill -SIGUSR1 ^dd`

pv(Pipe Viewer)

pv(Pipe Viewer) というパイプの状況を確認できるプログラムがあります.dd の間にこれを挟んで進捗状況を確認できます.

導入

$ apt install pv

利用例

% zcat 2015-11-21-raspbian-jessie.zip | pv | sudo dd of=/dev/sdz bs=4M
5.81GB 0:06:12 [15.2MB/s] [                           <=>                      ]

-N で 名前の,-c でクラスタオプションになります.これを活用すると複数のパイプの監視もできます.

$ zcat ./2015-11-21-raspbian-jessie.zip | pv -cN zcat | xz | pv -cN xz | dd of=./2015-11-21-raspbian-jessie.xz
     zcat: 8.41MB 0:00:05 [1.09MB/s] [   <=>                                   ]
       xz: 3.96MB 0:00:05 [1.06MB/s] [   <=>                                   ]

GNU ddrescue / ddrescue

dd じゃないけど dd の代わりに GNU ddrescue を利用するとプログレスが表示されます.

$ sudo apt install gddrescue
$ sudo ddrescue /dev/zero /dev/null --force
GNU ddrescue 1.19
Press Ctrl-C to interrupt
rescued:     2969 MB,  errsize:       0 B,  current rate:     354 MB/s
   ipos:     2969 MB,   errors:       0,    average rate:     742 MB/s
   opos:     2969 MB, run time:       4 s,  successful read:       0 s ago
Copying non-tried blocks... Pass 1 (forwards)

でも標準有力入力を受け付けないようです.

$ zcat ./2015-11-21-raspbian-jessie.zip | sudo ddrescue - /dev/sdz --force
ddrescue: Can't open input file: No such file or directory

類似の ddrescue だと標準入力もOKなようです.こちらの場合のコマンド名は dd_rescue です.

$ sudo apt install ddrescue
$ zcat ./2015-11-21-raspbian-jessie.zip | sudo dd_rescue - /dev/sdz
dd_rescue: (warning): input  file is not seekable!
dd_rescue: (warning): Illegal seek
dd_rescue: (warning): Don't use sparse writes for non-seekable output
dd_rescue: (info): ipos:     91136.0k, opos:     91136.0k, xferd:     91136.0k
                   errs:      0, errxfer:         0.0k, succxfer:     91136.0k
             +curr.rate:   144981kB/s, avg.rate:   144776kB/s, avg.load: 38.4%

ddすると重い/固まる

環境によって dd 実行中にとても重くなってマウスカーソルさえカクカク動くようになり並行して別の作業ができないようにます.

ionice

ionice を使って dd の優先度を下げることができます.

% zcat ./2015-11-21-raspbian-jessie.zip | sudo ionice -c2 -n7 dd of=/dev/sdz

pv -L

pv コマンドの -L オプションでパイプの帯域制限ができます.

   -L RATE, --rate-limit RATE
          Limit the transfer to a maximum of RATE bytes per second.  A suffix of "k", "m", "g",  or  "t"  can  be
          added to denote kilobytes (*1024), megabytes, and so on.
% zcat cros.img.gz | pv -L 8192k | sudo dd of=/dev/sdz

cgroup

リソース管理の cgroups で書き込み帯域制限をしてみます.以下は dd というグループを作成し,自分のシェルをそこに登録.SD Card のデバイスを書き込み制限 1k で設定し,dd で動作確認をしました.想定通り 1kB/s しか出なかったようです.

$ sudo mkdir /sys/fs/cgroup/blkio/dd
$ echo $$ | sudo tee -a /sys/fs/cgroup/blkio/dd/tasks 
26041
$ ls -l /dev/sdz
brw-rw---- 1 root disk 179, 0 12月  6 18:42 /dev/sdz
$ echo "179:0 1024" | sudo tee -a /sys/fs/cgroup/blkio/dd/blkio.throttle.write_bps_device 
179:0 1024
$ sudo dd if=/dev/zero of=/dev/sdz bs=4k count=10
10+0 レコード入力
10+0 レコード出力
40960 バイト (41 kB) コピーされました、 40.0136 秒、 1.0 kB/秒

書き込み速度が遅い

ブロックサイズ変更

dd コマンドはブロックサイズが 512バイトと小さいです.このサイズを変更することで1度に処理する容量が多くなり速度が改善されます.このサイズは bs オプションで設定できます.規定値と同じ 512バイトの場合は, bs=512.1MB の場合は bs=1M というようにして容量の単位(Yまで!)も指定できます.最近の私は 4~16M を指定しています.

$ zcat 2015-11-21-raspbian-jessie.zip | sudo dd of=/dev/sdz bs=4M

GNU ddrescue

GNU ddrescue は効率のいい処理を自動的に行うそうです.効率の良いブロックサイズを探すよりこれを導入したほうが早いかもしれません.

パーティション情報の削除

OS イメージをこれまで使っていた SD に上書きすると古いデータが残ってしまうことがあります.パーティション情報を削除してから書き込むと綺麗に行くようです.

Windows/Mac OS X の場合は SD Assosietion がフォーマッタを提供しているのでこれを利用すると良いと思います.

dd

dd コマンドでパーティション情報が入っているであろう先頭部分を消します.以下の例では 1M を 1回なので先頭の 1M が 0 で埋められます.2行目の hdparm はおまじないで kernel に書き換わったよと教えてあげています.最近は即時反映されるような感じですが,以前はこれを叩かないとうまく反映されないことが多かったです.(いちいち抜き差ししてみたり)

$ sudo dd if=/dev/zero of=/dev/sdz bs=1M count=1
$ sudo hdparm -z /dev/sdz

以下のように count を指定しない場合は全領域書き込みます.時間はかかるけど確実?

$ sudo dd of=/dev/zero of=/dev/sdz bs=10M

全領域書き込む場合は shred -z /dev/sdz でも良いですね.

wipefs

wipefs はパーティション情報の wipe をしてくれるツールです.一瞬で動作するし便利です.
util-linux パッケージ内の wipefs です.

デバイスだけ指定して実行すると現在のパーティションの状況が確認できます.-a オプションでパーティション情報が削除されます.便利.

$ sudo wipefs /dev/sdz
offset               type
----------------------------------------------------------------
0x1fe                dos   [partition table]

$ sudo wipefs -a /dev/sdz
/dev/sdz: 2 bytes were erased at offset 0x000001fe (dos): 55 aa
/dev/sdz: calling ioctl to re-read partition table: 成功です
$ sudo wipefs /dev/sdz

mount中のファイルシステムに書き込もうとすると終了するscript

dd は便利ですが,書き込み先を間違えるとシステムやデータを破壊してしまいます.私もつい一昨日やってしまいましたorz
#何故か /dev/mmcblk0 が /dev/sda へのシンボリックリンクとなっていた.
600GB の 先頭 1.5GB だからデータはほとんど救出できるだろうと思ったのですが,LUKS で暗号化していたのでメタデータが破壊され復旧は無理そうです.幸いデイリーバックアップがあるのでそちらから復旧中です.
(復旧中なのにどうやって書いているかというと Raspberry Pi 2 B にキーボードマウスモニタ取り付けて ReText で書いています.Web は midori でも重いので ssh -CY してファイルサーバのブラウザを使っています.使い慣れないキーボードが不便です><)

こういう悲しいことが起こらないようにできないものかと mount 中のデバイスに書き込もうとすると失敗させることができればいいのでは?と思ったのですがそういったオプションなどが見当たりませんでした.
それっぽいscript を書いてみました.

利用方法は,/usr/local/bin/dd としてこのスクリプトを用意して実行権をつけておいて通常の dd コマンドのように使うだけです.

$ wget -O - https://gist.githubusercontent.com/matoken/e051cefb78594520038d/raw/9ac20f31c590a043f1774f82068a99846ab7c4bb/dd.sh | sudo tee /usr/local/bin/dd
$ sudo chmod +x /usr/local/bin/dd
$ which dd
/usr/local/bin/dd
$ sudo which dd
/usr/local/bin/dd

マウント状態で書き込もうとすると失敗する.

$ sudo dd if=/dev/zero of=/dev/sdz
/dev/sdz seems to specify the file system in the mount.
Force Quit.

アンマウントして再実行すると dd が開始される.

$ sudo umount /dev/sdz1 
$ sudo dd if=/dev/zero of=/dev/sdz1

あまりテスト出来ていないので何かあったら教えてもらえると助かります.

おわり

ということで Raspberry Pi や kobo の SD Card に何度も書き込んだ時の Tips まとめみたいなものでした.ここ間違ってるよとかもっといい方法あるよとかおしえてもらえると助かります.(特に誤って書き込まないようにする方法)

JOSMにJava8を使うように言われたのでJavaを変更する

JOSM を起動するとスプラッシュ画面に次のようなメッセージが><

JOSM – Java OpenStreetMap エディタ

このバージョンのJavaはもうすぐサポート対象から外れます。 Java 8以上にアップグレードしてください!

現在利用している Java は Debian stretch のパッケージで導入した Oracle Java 7 です.OpenJDK 7 でも同じメッセージが表示されます.
ディストリビューションがサポートしている間は脆弱性とかは修正されるだろうけど JOSM 側でサポート打ち切る可能性もあるので Java 8 を使えないか確認してみます.

% where java
/usr/bin/java
% /usr/bin/java -version
java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b15)
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)
% dpkg -l oracle-java7-jdk|grep ^ii
ii  oracle-java7-jdk 7u25         amd64        Java(TM) JDK, Standard Edition, Oracle(TM)

Oracle Java は未だパッケージにないけど OpenJDK 8 は存在するよう.

% apt-cache search oracle-java
oracle-java7-jdk - Java(TM) JDK, Standard Edition, Oracle(TM)
% apt-cache search openjdk-8  
openjdk-8-jre-jamvm - Alternative JVM for OpenJDK, using JamVM
openjdk-8-dbg - OpenJDK ベースの Java ランタイム (デバッグシンボル)
openjdk-8-demo - OpenJDK ベースの Java ランタイム (デモおよびサンプルファイル)
openjdk-8-doc - OpenJDK 開発キット (JDK) ドキュメント
openjdk-8-jdk - OpenJDK 開発キット (JDK)
openjdk-8-jre - OpenJDK Java ランタイム - Hotspot JITopenjdk-8-jre-headless - OpenJDK Java ランタイム - Hotspot JIT(ヘッドレス)
openjdk-8-jre-zero - Zero/Shark を用いた OpenJDK 用の代替 JVM
openjdk-8-source - OpenJDK 開発キット (JDK) ソースファイル

OpenJDK 8 を導入してこのシステムの規定値に設定します.

% sudo apt install openjdk-8-jre
% sudo update-alternatives --config java
alternative java (/usr/bin/java を提供) には 4 個の選択肢があります。

  選択肢    パス                                          優先度  状態
------------------------------------------------------------
  0            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      自動モード
  1            /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java   1061      手動モード
  2            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      手動モード
  3            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1069      手動モード
* 4            /usr/lib/jvm/jdk-7-oracle-x64/jre/bin/java       317       手動モード

Press <enter> to keep the current choice[*], or type selection number: 3
update-alternatives: /usr/bin/java (java) を提供するためにマニュアルモードで /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java を使います
% where java
/usr/bin/java
% /usr/bin/java -version
openjdk version "1.8.0_72-internal"
OpenJDK Runtime Environment (build 1.8.0_72-internal-b05)
OpenJDK 64-Bit Server VM (build 25.72-b05, mixed mode)
% /usr/bin/java -jar ~/bin/josm-latest.jar

無事起動して,警告メッセージは表示されなくなりました :)

https://www.flickr.com/photos/119142834@N05/23418744202/in/dateposted-public/

もし,他の Java アプリケーションが OpenJDK 8 を嫌がる場合はそちらを優先して JOSM は以下のようにして起動するようにしてもいいかもしれません.

% /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -jar ~/bin/josm-latest.jar

あひる焼きfortune

この記事は あひる焼き Advent Calendar 2015 – Adventar の12月05日分の記事です.

みんなでまったり #あひる焼き すればええんじゃないかなと思います。

ということで最近焼いたあひるの話を.

発端

fortune というフォーチュンクッキーのような格言をランダムに表示するプログラムがあります.様々な辞書データが存在していて自作も出来ます.

pi@raspberrypi ~ $ sudo apt install fortunes            # fortuneの導入
pi@raspberrypi ~ $ fortune                              # fortuneの実行
Some of us are becoming the men we wanted to marry.
                -- Gloria Steinem
pi@raspberrypi /tmp $ cat <<__EOF__> data               # fortuneのデータ作成
テスト
%
1行目
2行目
%
__EOF__
pi@raspberrypi /tmp $ strfile data                      # データ変換
"data.dat" created
There were 2 strings
Longest string: 16 bytes
Shortest string: 10 bytes
pi@raspberrypi /tmp $ ls data*
data  data.dat
pi@raspberrypi /tmp $ fortune data                      # 自作データを利用
1行目
2行目
pi@raspberrypi /tmp $ fortune data
テスト

その辞書データに @ahiru3netさんのあひる焼きに対するmentionを使うと楽しいかもしれないと思いました.でもデータを集めるのが面倒だなとつぶやいたところ @shimadahさんにGitHub を教えてもらいました.

それを元にコネコネして……うまくいかないところに@ahiru3netさんの助言.

焼けた

やってることはahiru_yakunaプラグインのmentionのデータをもらってきて乱暴にfortuneで利用できる形式に変換して~/.zshrc に登録してログイン時に台詞を出すようにしています.

mkdir ~/.fortune;wget -O - https://github.com/Na0ki/ahiru_yakuna/raw/master/config.yml|grep ^\-\ \" | sed 's/^-\ \"//'| sed 's/"$/\n%/' | sed 's/\\n/\n/g' > ~/.fortune/ahiruyaki && strfile ~/.fortune/ahiruyaki ~/.fortune/ahiruyaki.dat && echo fortune ~/.fortune/ahiruyaki >> ~/.zshrc

これでログインのたびに以下のようにメッセージが表示されるようになりました :)

焼いちゃうのか?!本当に焼いちゃうのか?!
pi@raspberrypi ~ $

もっと焼く

でもメッセージだけだとちょっとさみしいです.
そこで cowsay を使ってみます.cowsay はアスキーアートで書かれた牛などのキャラクタに指定した台詞を喋らせることの出来るプログラムです.都合のいいことに選択できるキャラクタの中にあひるがいます.あひるに喋ってもらいましょう!

pi@raspberrypi ~ $ sudo apt install cowsay                  # cowsay 導入
pi@raspberrypi ~ $ cowsay hello cow                         # cowsay 実行
 ___________
< hello cow >
 -----------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
pi@raspberrypi ~ $ cowsay -f duck hello duck                # あひるに喋らせる
 ____________
< hello duck >
 ------------
 \
  \
   \ >()_
      (__)__ _
pi@raspberrypi ~ $ cowsay -f duck あひる焼き                 # 日本語を喋らせる
 _______
< あひる焼き >
 -------
 \
  \
   \ >()_
      (__)__ _

日本語を喋らせると吹き出しがずれてしまいます.あひる焼きの台詞の殆どは日本語なのでこのままではまずいです.調べてみるとバグレポートされていました.

中国語?もやっぱりずれちゃうみたいです.
文字数と見た目のキャラクタの文字数のズレから起こっているようです.とりあえず日本語だけでも動くように出来ないかと euc-jp に変換して文字数を確認してといったダメな修正をしていたところGoogle+の以下の投稿のコメントで +Masakazu Takahashiさんがさくっとパッチを作ってくれました!

このパッチは報告しましたが,取り込まれてもstretch以降でしょう.ということでDebianだと以下のようにしてソースを入手してパッチを当てることが出来ます.

pi@raspberrypi ~/src $ sudo apt install libtext-charwidth-perl      # 必要なパッケージの導入
pi@raspberrypi ~/src $ apt-get source cowsay                        # cowsay の source 入手
pi@raspberrypi ~/src $ cd cowsay-3.03+dfsg1                         # ディレクトリ移動とパッチ適用
pi@raspberrypi ~/src/cowsay-3.03+dfsg1 $ wget -O - https://gist.githubusercontent.com/emasaka/639a9168c6a9ddba044f/raw/1a55ec58ded59b3181f1721dbbe814a38d5ea4cb/cowsay-mbswidth.patch | patch -i -
patching file cowsay
pi@raspberrypi ~/src/cowsay-3.03+dfsg1 $ ./cowsay -f duck あひる焼き
 ____________
< あひる焼き >
 ------------
 \
  \
   \ >()_
      (__)__ _

~/bin 辺りにコピーして使ったり,以下のような感じで既存のパッケージを置き換えてしまってもいいかもしれません.

pi@raspberrypi ~/src/cowsay-3.03+dfsg1 $ vi debian/control
- Depends: ${misc:Depends}, ${perl:Depends}
+ Depends: ${misc:Depends}, ${perl:Depends}, libtext-charwidth-perl
pi@raspberrypi ~/src/cowsay-3.03+dfsg1 $ dpkg-buildpackage -b
pi@raspberrypi ~/src/cowsay-3.03+dfsg1 $ sudo debi

さて,fortuneのことを忘れてしまいそうですが以下のようにしてあひる焼きfortuneの結果をあひるに喋らせます.

pi@raspberrypi ~ $ cowsay -f duck `fortune ~/.fortune/ahiruyaki`
 ______________
< ヒッヒッヒッ >
 --------------
 \
  \
   \ >()_
      (__)__ _

いい感じです :)

~/.profile 辺りに登録しちゃいましょう.aliasも設定してみます.

pi@raspberrypi ~ $ echo 'alias a="fortune ~/.fortune/ahiruyaki | cowsay -f duck"' >> ~/.profile 
pi@raspberrypi ~ $ echo a >> ~/.profile

これでlogin時や a と入力することで実行されます.

Last login: Fri Dec  4 23:32:05 2015 from 192.168.2.210
 ________________________________________________________________________________
/ あひる焼きというものには鮮度があります。焼けば焼くほどに、あひる焼きとは廃れて \
\ いくものなのです。                                                             /
 --------------------------------------------------------------------------------
 \
  \
   \ >()_
      (__)__ _
pi@raspberrypi ~ $ a
 ________________________
< バーニング通帳!!!! >
 ------------------------
 \
  \
   \ >()_
      (__)__ _

Xでも焼く

GUI の X 版のcowsayも存在します.こいつも試してみましょう.

pi@raspberrypi ~ $ sudo apt install xcowsay
pi@raspberrypi ~ $ xcowsay `fortune ~/.fortune/ahiruyaki`

https://www.flickr.com/photos/119142834@N05/23490968856/in/dateposted-public/

なかなか特徴的なcowが喋りました.せっかくなのであひるに喋らせましょう.吹き出しの向きと位置を変えてあひる画像を指定しています.

pi@raspberrypi ~ $ wget https://github.com/Na0ki/ahiru_yakuna/raw/master/ahiru240.jpg -O ~/.fortune/ahiru240.jpg
fortune ~/.fortune/ahiruyaki | xcowsay -l --bubble-at=0,-60 --image=$HOME/.fortune/ahiru240.jpg

https://www.flickr.com/photos/119142834@N05/23434841661/in/dateposted-public/

背景がちょっと邪魔なので透過処理をしてみます.

https://www.flickr.com/photos/119142834@N05/23149788589/in/dateposted-public/

いい感じです :)
例によってaliasにしておきます

pi@raspberrypi ~ $ echo alias xa='fortune ~/.fortune/ahiruyaki | xcowsay -l --bubble-at=0,-60 --image=$HOME/.fortune/ahiru240.png' >> ~/.profile

そんなこんなでみんなのおかげであひるがいい感じに焼けるようになりました.@shimadahさん, @ahiru3netさん, @emasakaさんありがとうございました!

#そうそう,以前はフレームバッファでもあひる焼きしてました.

Let’s Encrypt を使った https 設定

Let’s Encrypt に以前メールアドレスを登録していたのですが,

Let’s Encrypt Closed Beta Invite

とうことでメールが届いていたので試してみました.

ちなみに Let’s Encrypt は DV(Domain Validation)証明書が無料で取得できるサービスで,経路の暗号化はされるけど組織の実在確認まではしないレベルの物.

早速試してみます.
実行環境は Debian jessie amd64 + Apache httpd 2.4(2.4.10-10+deb8u3)

Let’s Encrypt のツールを入手して実行する.

$ git clone https://github.com/letsencrypt/letsencrypt.git
$ cd letsencrypt
$ ./letsencrypt-auto --agree-dev-preview --server https://acme-v01.api.letsencrypt.org/directory auth
Bootstrapping dependencies for Debian-based OSes...
[sudo] password for user:

とすると,必要なパッケージを自動的に導入し始めます.
質問がいくつか来るけど,メールアドレス(Let’s Encrypt 登録時のもの)とコモンネームにApache とそれ以外の選択くらい.これで自動的に Let’s Encrypt のサーバと通信を行い証明書の取得ホト損までしてくれます.
そして,最後にこんな注意書きが表示されました.

IMPORTANT NOTES:
 - If you lose your account credentials, you can recover through
   e-mails sent to user@example.org.
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/example.org/fullchain.pem. Your cert will
   expire on 2016-02-02. To obtain a new version of the certificate in
   the future, simply run Let's Encrypt again.
 - Your account credentials have been saved in your Let's Encrypt
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Let's
   Encrypt so making regular backups of this folder is ideal.

/etc 以下はデイリーでバックアップ取ってるので大丈夫なはず.24時間以上経ったけどメールは未だ届いていないよう.
そして,自動的に /etc/apache2/sites-available/009-example.conf を元に /etc/apache2/sites-available/009-example-le-ssl.conf が作られていました.
※このファイルは letsencrypt-auto を再実行すると消えて実行完了後再生成(以下の修正も必要)されたのでちょっと嫌.多分オプションとかで回避できると思うけど未確認.

以下の2行だけ修正して,

SSLCertificateFile /etc/letsencrypt/live/example.org/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.org/privkey.pem

a2ensite して restart で

$ sudo a2ensite 009-example-le-ssl
$ sudo service apache2 reload

とりあえず動いた

% openssl s_client -connect example.org:443
CONNECTED(00000003)
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X1
verify return:1
depth=0 CN = example.org
verify return:1
---
Certificate chain
 0 s:/CN=example.org
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X1
 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X1
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIE/TCCA+WgAwIBAgISAbbh6Bp+aXaatBj/TJ7lkyyZMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMTAeFw0xNTExMDQxNjQ4MDBaFw0x
NjAyMDIxNjQ4MDBaMBYxFDASBgNVBAMTC2thZ29sdWcub3JnMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzb79Wux4LWzC+ZKTRRXN53+/IRraso2AZRrt
/wesf4EBEIl8i6Iu4Dl0FjLoomxZUCN0T7C5iJ4aPy629UkWDZrawFWGkXYT00ed
UziOKTXpYYTM9BBp9Qx1aw/CT8XY6TjOtaJ21AjcIXZBZ8EPnf6fWcHEFCsNYLKk
7U/e59WJ1B1ciXowS7nMwDy1c3rvu7tlzGRuO/xSx/hu0R5DYL8zyPlLwGZyfVv/
UYYtY6Wf8ItzgthpzltqtbMv4Kuohwu2mPwKQJ73MJoOghUD4p6oxiJ3nsgLY8DO
mIlW6ScXihlZ/pWfzjWaohKsvWM+qgnQpWNUQoaXNj0ES34m4QIDAQABo4ICDzCC
AgswDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcD
AjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQH4Pb+Brg5Q0PWhEZ7CEdAkxWKxzAf
BgNVHSMEGDAWgBSoSmpjBH3duubRObemRWXv86jsoTBwBggrBgEFBQcBAQRkMGIw
LwYIKwYBBQUHMAGGI2h0dHA6Ly9vY3NwLmludC14MS5sZXRzZW5jcnlwdC5vcmcv
MC8GCCsGAQUFBzAChiNodHRwOi8vY2VydC5pbnQteDEubGV0c2VuY3J5cHQub3Jn
LzAWBgNVHREEDzANggtrYWdvbHVnLm9yZzCCAQAGA1UdIASB+DCB9TAKBgZngQwB
AgEwADCB5gYLKwYBBAGC3xMBAQEwgdYwJgYIKwYBBQUHAgEWGmh0dHA6Ly9jcHMu
bGV0c2VuY3J5cHQub3JnMIGrBggrBgEFBQcCAjCBngyBm1RoaXMgQ2VydGlmaWNh
dGUgbWF5IG9ubHkgYmUgcmVsaWVkIHVwb24gYnkgUmVseWluZyBQYXJ0aWVzIGFu
ZCBvbmx5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgQ2VydGlmaWNhdGUgUG9saWN5
IGZvdW5kIGF0IGh0dHBzOi8vbGV0c2VuY3J5cHQub3JnL3JlcG9zaXRvcnkvMA0G
CSqGSIb3DQEBCwUAA4IBAQBa5DjWSE/d6alvGUDNW4guiJauqvxB3B+YULzRTseb
0kXGyu46u16F4av+Ate0Jxq3NnZdOpy8OTiL/wGQeWOWs33zdlxii5o8R12pMMTS
/NWFxawiCkJnzpWkhdLQGv3RNUUQn0w5yXDSY/4wK8nZYJiHXJyNQen2V6vkRPUA
U+u24R4iytsrCXW08bGa+B3F9VIadBa8Br3bbJxV5hxCC2nCE6J8C9jRERc3GKTG
YBuSlM/gaLFopgFjRIDHY5IY5tCB3P8YFbbahqNHCXkh3Ilnlbmn3WW3sOXGOJDT
2s4AbSyzJHdAk3OqtMUoVl/7fk2a70mFiQi0JWotcsoa
-----END CERTIFICATE-----
subject=/CN=example.org
issuer=/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X1
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 3171 bytes and written 441 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256
    Session-ID: 21463ABE9EDCAF2B93E782CC2C4252E8CAA9A98B6B0036F957218C42A81419CE
    Session-ID-ctx:
    Master-Key: 0B652E199D83894F04BEAB5E268EEA8806F0DAB300AA4F5AA26C3B6361D57766FE5ACF08353DAD07781960A95BDFB7BB
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - be 38 de da a3 27 cf 1e-be 39 ee df 1c f0 2e e3   .8...'...9......
    0010 - 47 4e a1 ad 15 8f 43 3c-89 2b 1b 1f ea ef 46 a1   GN....C<.+....F.
    0020 - 09 d3 1b 0d c6 09 9a 99-e1 c2 d7 22 fd e0 b7 6f   ..........."...o
    0030 - 08 cb ba 73 d8 cb 3a 82-55 59 ee 5f 05 56 9c d6   ...s..:.UY._.V..
    0040 - bc 80 1a b3 b0 8c 87 16-2f fc 69 e2 03 0c a2 7f   ......../.i.....
    0050 - 9d e2 1f 2b d3 14 fb b7-78 28 22 48 3b ff 28 52   ...+....x("H;.(R
    0060 - 5e 89 bd cd 9f 3d 4f 26-aa 1d 2d bb af 4a 84 cf   ^....=O&..-..J..
    0070 - ce 3c 20 ac 55 84 33 56-10 6c 19 1a d3 15 ce 30   .< .U.3V.l.....0
    0080 - 7e e7 0b 6f f9 31 ef 92-c0 11 7f 95 de a6 fa 80   ~..o.1..........
    0090 - c1 5d 46 92 d6 b5 0c 5a-78 75 92 ad 1f bb 6f c0   .]F....Zxu....o.
    00a0 - 7f 35 ac 07 41 07 0a c7-a5 f5 5b 3f 16 ca b7 4e   .5..A.....[?...N
    00b0 - d7 7f c1 68 dc 28 e8 15-f9 95 d9 e1 a7 bf d0 c4   ...h.(..........
 
    Start Time: 1446664204
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
 
% cat cer
-----BEGIN CERTIFICATE-----
MIIE/TCCA+WgAwIBAgISAbbh6Bp+aXaatBj/TJ7lkyyZMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMTAeFw0xNTExMDQxNjQ4MDBaFw0x
NjAyMDIxNjQ4MDBaMBYxFDASBgNVBAMTC2thZ29sdWcub3JnMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzb79Wux4LWzC+ZKTRRXN53+/IRraso2AZRrt
/wesf4EBEIl8i6Iu4Dl0FjLoomxZUCN0T7C5iJ4aPy629UkWDZrawFWGkXYT00ed
UziOKTXpYYTM9BBp9Qx1aw/CT8XY6TjOtaJ21AjcIXZBZ8EPnf6fWcHEFCsNYLKk
7U/e59WJ1B1ciXowS7nMwDy1c3rvu7tlzGRuO/xSx/hu0R5DYL8zyPlLwGZyfVv/
UYYtY6Wf8ItzgthpzltqtbMv4Kuohwu2mPwKQJ73MJoOghUD4p6oxiJ3nsgLY8DO
mIlW6ScXihlZ/pWfzjWaohKsvWM+qgnQpWNUQoaXNj0ES34m4QIDAQABo4ICDzCC
AgswDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcD
AjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQH4Pb+Brg5Q0PWhEZ7CEdAkxWKxzAf
BgNVHSMEGDAWgBSoSmpjBH3duubRObemRWXv86jsoTBwBggrBgEFBQcBAQRkMGIw
LwYIKwYBBQUHMAGGI2h0dHA6Ly9vY3NwLmludC14MS5sZXRzZW5jcnlwdC5vcmcv
MC8GCCsGAQUFBzAChiNodHRwOi8vY2VydC5pbnQteDEubGV0c2VuY3J5cHQub3Jn
LzAWBgNVHREEDzANggtrYWdvbHVnLm9yZzCCAQAGA1UdIASB+DCB9TAKBgZngQwB
AgEwADCB5gYLKwYBBAGC3xMBAQEwgdYwJgYIKwYBBQUHAgEWGmh0dHA6Ly9jcHMu
bGV0c2VuY3J5cHQub3JnMIGrBggrBgEFBQcCAjCBngyBm1RoaXMgQ2VydGlmaWNh
dGUgbWF5IG9ubHkgYmUgcmVsaWVkIHVwb24gYnkgUmVseWluZyBQYXJ0aWVzIGFu
ZCBvbmx5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgQ2VydGlmaWNhdGUgUG9saWN5
IGZvdW5kIGF0IGh0dHBzOi8vbGV0c2VuY3J5cHQub3JnL3JlcG9zaXRvcnkvMA0G
CSqGSIb3DQEBCwUAA4IBAQBa5DjWSE/d6alvGUDNW4guiJauqvxB3B+YULzRTseb
0kXGyu46u16F4av+Ate0Jxq3NnZdOpy8OTiL/wGQeWOWs33zdlxii5o8R12pMMTS
/NWFxawiCkJnzpWkhdLQGv3RNUUQn0w5yXDSY/4wK8nZYJiHXJyNQen2V6vkRPUA
U+u24R4iytsrCXW08bGa+B3F9VIadBa8Br3bbJxV5hxCC2nCE6J8C9jRERc3GKTG
YBuSlM/gaLFopgFjRIDHY5IY5tCB3P8YFbbahqNHCXkh3Ilnlbmn3WW3sOXGOJDT
2s4AbSyzJHdAk3OqtMUoVl/7fk2a70mFiQi0JWotcsoa
-----END CERTIFICATE-----
% openssl x509 -in cer -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            01:b6:e1:e8:1a:7e:69:76:9a:b4:18:ff:4c:9e:e5:93:2c:99
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X1
        Validity
            Not Before: Nov  4 16:48:00 2015 GMT
            Not After : Feb  2 16:48:00 2016 GMT
        Subject: CN=example.org
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:cd:be:fd:5a:ec:78:2d:6c:c2:f9:92:93:45:15:
                    cd:e7:7f:bf:21:1a:da:b2:8d:80:65:1a:ed:ff:07:
                    ac:7f:81:01:10:89:7c:8b:a2:2e:e0:39:74:16:32:
                    e8:a2:6c:59:50:23:74:4f:b0:b9:88:9e:1a:3f:2e:
                    b6:f5:49:16:0d:9a:da:c0:55:86:91:76:13:d3:47:
                    9d:53:38:8e:29:35:e9:61:84:cc:f4:10:69:f5:0c:
                    75:6b:0f:c2:4f:c5:d8:e9:38:ce:b5:a2:76:d4:08:
                    dc:21:76:41:67:c1:0f:9d:fe:9f:59:c1:c4:14:2b:
                    0d:60:b2:a4:ed:4f:de:e7:d5:89:d4:1d:5c:89:7a:
                    30:4b:b9:cc:c0:3c:b5:73:7a:ef:bb:bb:65:cc:64:
                    6e:3b:fc:52:c7:f8:6e:d1:1e:43:60:bf:33:c8:f9:
                    4b:c0:66:72:7d:5b:ff:51:86:2d:63:a5:9f:f0:8b:
                    73:82:d8:69:ce:5b:6a:b5:b3:2f:e0:ab:a8:87:0b:
                    b6:98:fc:0a:40:9e:f7:30:9a:0e:82:15:03:e2:9e:
                    a8:c6:22:77:9e:c8:0b:63:c0:ce:98:89:56:e9:27:
                    17:8a:19:59:fe:95:9f:ce:35:9a:a2:12:ac:bd:63:
                    3e:aa:09:d0:a5:63:54:42:86:97:36:3d:04:4b:7e:
                    26:e1
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage:
                TLS Web Server Authentication, TLS Web Client Authentication
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Subject Key Identifier:
                07:E0:F6:FE:06:B8:39:43:43:D6:84:46:7B:08:47:40:93:15:8A:C7
            X509v3 Authority Key Identifier:
                keyid:A8:4A:6A:63:04:7D:DD:BA:E6:D1:39:B7:A6:45:65:EF:F3:A8:EC:A1
 
            Authority Information Access:
                OCSP - URI:http://ocsp.int-x1.letsencrypt.org/
                CA Issuers - URI:http://cert.int-x1.letsencrypt.org/
 
            X509v3 Subject Alternative Name:
                DNS:example.org
            X509v3 Certificate Policies:
                Policy: 2.23.140.1.2.1
                Policy: 1.3.6.1.4.1.44947.1.1.1
                  CPS: http://cps.letsencrypt.org
                  User Notice:
                    Explicit Text: This Certificate may only be relied upon by Relying Parties and only in accordance with the Certificate Policy found at https://letsencrypt.org/repository/
 
    Signature Algorithm: sha256WithRSAEncryption
         5a:e4:38:d6:48:4f:dd:e9:a9:6f:19:40:cd:5b:88:2e:88:96:
         ae:aa:fc:41:dc:1f:98:50:bc:d1:4e:c7:9b:d2:45:c6:ca:ee:
         3a:bb:5e:85:e1:ab:fe:02:d7:b4:27:1a:b7:36:76:5d:3a:9c:
         bc:39:38:8b:ff:01:90:79:63:96:b3:7d:f3:76:5c:62:8b:9a:
         3c:47:5d:a9:30:c4:d2:fc:d5:85:c5:ac:22:0a:42:67:ce:95:
         a4:85:d2:d0:1a:fd:d1:35:45:10:9f:4c:39:c9:70:d2:63:fe:
         30:2b:c9:d9:60:98:87:5c:9c:8d:41:e9:f6:57:ab:e4:44:f5:
         00:53:eb:b6:e1:1e:22:ca:db:2b:09:75:b4:f1:b1:9a:f8:1d:
         c5:f5:52:1a:74:16:bc:06:bd:db:6c:9c:55:e6:1c:42:0b:69:
         c2:13:a2:7c:0b:d8:d1:11:17:37:18:a4:c6:60:1b:92:94:cf:
         e0:68:b1:68:a6:01:63:44:80:c7:63:92:18:e6:d0:81:dc:ff:
         18:15:b6:da:86:a3:47:09:79:21:dc:89:67:95:b9:a7:dd:65:
         b7:b0:e5:c6:38:90:d3:da:ce:00:6d:2c:b3:24:77:40:93:73:
         aa:b4:c5:28:56:5f:fb:7e:4d:9a:ef:49:85:89:08:b4:25:6a:
         2d:72:ca:1a
-----BEGIN CERTIFICATE-----
MIIE/TCCA+WgAwIBAgISAbbh6Bp+aXaatBj/TJ7lkyyZMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMTAeFw0xNTExMDQxNjQ4MDBaFw0x
NjAyMDIxNjQ4MDBaMBYxFDASBgNVBAMTC2thZ29sdWcub3JnMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzb79Wux4LWzC+ZKTRRXN53+/IRraso2AZRrt
/wesf4EBEIl8i6Iu4Dl0FjLoomxZUCN0T7C5iJ4aPy629UkWDZrawFWGkXYT00ed
UziOKTXpYYTM9BBp9Qx1aw/CT8XY6TjOtaJ21AjcIXZBZ8EPnf6fWcHEFCsNYLKk
7U/e59WJ1B1ciXowS7nMwDy1c3rvu7tlzGRuO/xSx/hu0R5DYL8zyPlLwGZyfVv/
UYYtY6Wf8ItzgthpzltqtbMv4Kuohwu2mPwKQJ73MJoOghUD4p6oxiJ3nsgLY8DO
mIlW6ScXihlZ/pWfzjWaohKsvWM+qgnQpWNUQoaXNj0ES34m4QIDAQABo4ICDzCC
AgswDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcD
AjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQH4Pb+Brg5Q0PWhEZ7CEdAkxWKxzAf
BgNVHSMEGDAWgBSoSmpjBH3duubRObemRWXv86jsoTBwBggrBgEFBQcBAQRkMGIw
LwYIKwYBBQUHMAGGI2h0dHA6Ly9vY3NwLmludC14MS5sZXRzZW5jcnlwdC5vcmcv
MC8GCCsGAQUFBzAChiNodHRwOi8vY2VydC5pbnQteDEubGV0c2VuY3J5cHQub3Jn
LzAWBgNVHREEDzANggtrYWdvbHVnLm9yZzCCAQAGA1UdIASB+DCB9TAKBgZngQwB
AgEwADCB5gYLKwYBBAGC3xMBAQEwgdYwJgYIKwYBBQUHAgEWGmh0dHA6Ly9jcHMu
bGV0c2VuY3J5cHQub3JnMIGrBggrBgEFBQcCAjCBngyBm1RoaXMgQ2VydGlmaWNh
dGUgbWF5IG9ubHkgYmUgcmVsaWVkIHVwb24gYnkgUmVseWluZyBQYXJ0aWVzIGFu
ZCBvbmx5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgQ2VydGlmaWNhdGUgUG9saWN5
IGZvdW5kIGF0IGh0dHBzOi8vbGV0c2VuY3J5cHQub3JnL3JlcG9zaXRvcnkvMA0G
CSqGSIb3DQEBCwUAA4IBAQBa5DjWSE/d6alvGUDNW4guiJauqvxB3B+YULzRTseb
0kXGyu46u16F4av+Ate0Jxq3NnZdOpy8OTiL/wGQeWOWs33zdlxii5o8R12pMMTS
/NWFxawiCkJnzpWkhdLQGv3RNUUQn0w5yXDSY/4wK8nZYJiHXJyNQen2V6vkRPUA
U+u24R4iytsrCXW08bGa+B3F9VIadBa8Br3bbJxV5hxCC2nCE6J8C9jRERc3GKTG
YBuSlM/gaLFopgFjRIDHY5IY5tCB3P8YFbbahqNHCXkh3Ilnlbmn3WW3sOXGOJDT
2s4AbSyzJHdAk3OqtMUoVl/7fk2a70mFiQi0JWotcsoa
-----END CERTIFICATE-----

後はコンテンツを全部 https に設定して http から転送するようにしないといけないですね.

とりあえず無料で使える StartSSL,安めの Rapid SSL,キャンペーンや乗り換えで一定期間無料とか色々ありますが,そのくらいのレベルであれば代替になるかなと思います.それ以上は大抵 EV になるでしょうし.ただ CNしか無かったり期間が短いのが気になりますね.

Node.js製 Slack クライアントの plaidchat を試してみる

ということで plaidchat も少し試してみました.

導入は特に苦労はなくページに書いてあるとおり npm install で一発でした.

Slack 製の物に比べると機能は少ないです.多分1プロジェクトのみの対応です.でもリソースの省比量は大分少なくメインウィンドウを隠すことも出来ます.
About が後ろに行って複数出せてしまったり,窓の中が真っ白になったり未だこなれてない感じです.これからに期待です.

20150928_08:09:00-13716

% ps aux | grep -i plaidchat | awk '{print $6}' | xargs echo| sed -e 's/\ /\+/g' | bc
326480

RAM 消費量が少ないとはいってもそこそこ消費するので今度は Slack IRC GW なども試してみたいです.

Slack の Linux版公式クライアントを試してみる

サポートディストリビューションも多そう!ということで試してみました.
Twitter の画像ではたくさんのディストリビューションのロゴがあったのですが,ダウンロードページに行くとこんだけでした><

20150924_10:09:57-20642

ダウンロードして Debian testing stretch amd64 環境で展開して試してみると特に問題なく動きました.

ダウンロードしたパッケージはこんな感じ

% dpkg --info ~/Downloads/slack-desktop-1.2.2-amd64.deb          
 新形式 debian パッケージ、バージョン 2.0。
 サイズ 45815918 バイト: コントロールアーカイブ = 446 バイト。
     473 バイト、   12 行      control              
 Package: slack-desktop
 Version: 1.2.2
 Depends: gconf2, gconf-service, libgtk2.0-0, libudev0 | libudev1, libgcrypt11 | libgcrypt20, libnotify4, libxtst6, libnss3, python, gvfs-bin, xdg-utils, apt-transport-https
 Suggests: libgnome-keyring0, gir1.2-gnomekeyring-1.0
 Replaces: slack (<< 1.2.1~)
 Breaks: slack (<< 1.2.1~)
 Section: misc
 Priority: optional
 Architecture: amd64
 Installed-Size: 134268
 Maintainer: Slack Technologies <feedback@slack.com>
 Description: Slack Desktop

とりあえず実行.( dpkg -i でインストールしてもとりあえず動いています.)

% ar x ~/Downloads/slack-desktop-1.2.2-amd64.deb
% tar xf ../data.tar.xz
% ./usr/bin/slack

20150924_10:09:08-13152

日本語のリソースファイルぽいものもあるけど日本語が表示されないなと思ったのですが,中身は他の言語も含め全て空でした.この辺はこれからのようですね.

% ls -l ./usr/share/slack/locales/ja.pak 
-rw-r--r-- 1 mk mk 0  9月 23 14:42 ./usr/share/slack/locales/ja.pak

起動すると ブラウザと同じような感じでログインできます.
20150924_11:09:35-26588

タスクトレイのメニューはこんな感じでした.タスクトレイからウィンドウを開いた後タスクトレイへの格納は出来ないようです.
20150927_07:09:20-30617

複数の team にも対応しています.
20150927_07:09:15-1275

日本語の表示や入力も問題なく行えました.
と,ここまではいい感じかなー.と思っていたのですが起動に時間がかかるのはともかくメモリ消費量が大きいです.

% ps aux| head -1                                                           
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
% ps aux| grep -i slack                                                     
mk        2463  0.1  0.5 1331200 40756 ?       Sl   01:48   0:09 /usr/share/slack/slack
mk        2497  0.0  0.1 313440  8020 ?        S    01:48   0:00 /usr/share/slack/slack --type=zygote --no-sandbox
mk        2597  0.0  0.5 581152 44584 ?        Sl   01:48   0:04 /usr/share/slack/slack --type=gpu-process --channel=2463.0.1022154471 --no-sandbox --supports-dual-gpus=false --gpu-driver-bug-workarounds=2,14,43 --disable-accelerated-video-decode --gpu-vendor-id=0x8086 --gpu-device-id=0x0046 --gpu-driver-vendor --gpu-driver-version
mk        2648  0.1 11.4 2024760 909348 ?      Sl   01:48   0:16 /usr/share/slack/slack --type=renderer --force-device-scale-factor=1 --no-sandbox --enable-deferred-image-decoding --lang=ja --node-integration=true --enable-plugins --subpixel-font-scaling=true --enable-pinch-virtual-viewport --enable-delegated-renderer --num-raster-threads=2 --enable-gpu-rasterization --use-image-texture-target=3553 --disable-accelerated-video-decode --channel=2463.1.1087300934
mk        2750  0.3 13.5 2102980 1082316 ?     Sl   01:49   0:37 /usr/share/slack/slack --type=renderer --force-device-scale-factor=1 --no-sandbox --enable-deferred-image-decoding --lang=ja --guest-instance-id=1 --node-integration=false --enable-plugins --preload=/usr/share/slack/resources/app.asar/static/ssb-interop --enable-pinch-virtual-viewport --enable-delegated-renderer --num-raster-threads=2 --enable-gpu-rasterization --use-image-texture-target=3553 --disable-accelerated-video-decode --channel=2463.2.1767621685
mk        3127  0.0  0.0  13700  2224 pts/2    S+   04:25   0:00 grep -i slack
% ps aux | grep -i slack | awk '{print $6}' | xargs echo| sed -e 's/\ /\+/g' | bc
2087260
% pstree 29317
slack─┬─slack─┬─slack─┬─{Chrome_ChildIOT}
      │       │       ├─2*[{CompositorTileW}]
      │       │       ├─{Compositor}
      │       │       ├─{HTMLParserThrea}
      │       │       ├─{handle-watcher-}
      │       │       └─5*[{slack}]
      │       └─slack─┬─{Chrome_ChildIOT}
      │               ├─2*[{CompositorTileW}]
      │               ├─{Compositor}
      │               ├─{HTMLParserThrea}
      │               ├─{ScriptStreamerT}
      │               ├─{handle-watcher-}
      │               └─{slack}
      ├─slack─┬─{Chrome_ChildIOT}
      │       └─{Watchdog}
      ├─{AudioThread}
      ├─3*[{BrowserBlocking}]
      ├─5*[{CachePoolWorker}]
      ├─{Chrome_CacheThr}
      ├─{Chrome_DBThread}
      ├─{Chrome_FileThre}
      ├─{Chrome_FileUser}
      ├─{Chrome_IOThread}
      ├─{Chrome_ProcessL}
      ├─{IndexedDB}
      ├─{NSS SSL ThreadW}
      ├─{NetworkChangeNo}
      ├─{gdbus}
      ├─{gmain}
      ├─{handle-watcher-}
      ├─{inotify_reader}
      ├─{sandbox_ipc_thr}
      ├─5*[{slack}]
      └─{threaded-ml}
% free
              total        used        free      shared  buff/cache   available
Mem:        7971864     6427012      245032      344740     1299820     1111572
% kill 29317
% free
              total        used        free      shared  buff/cache   available
Mem:        7971864     4251376     2457392      306516     1263096     3325500

この作りだと Chrome/Chromium を併用している場合 Chrome アプリケーションにしてもらったほうがリソース食わないんじゃないかなと思ったりも.

ちなみに Hipchat には以前から Linux Client は存在していてこんな感じです.Slack に比べると大分軽いです.

% ps aux | grep hipchat 
mk        1953  2.4  1.6 2584884 128724 ?      Ssl  08:23   0:01 /usr/bin/hipchat
% pstree 1953
hipchat.bin─┬─{QProcessManager}
            ├─2*[{QQmlThread}]
            ├─{QXcbEventReader}
            ├─{Qt HTTP thread}
            ├─{Qt bearer threa}
            └─5*[{hipchat.bin}]

Node.ja で作られた plaidchat というクライアントもあるようです.これも試してみようと思います.