Debian stretch で /lib を飛ばしてしまい困ったけどどうにか復旧

IMGP0010.DNG_DI4Y3X.ufraw

lxc-creates して失敗してから bash も他のアプリも起動しなくなってしまった.どうにか復旧できたのでメモ.

bash も ls も全部コマンドがないと言われる.すでに起動していた zsh では tab 補完で見つからなかったコマンドは出てくる.この状態で再起動すると recovary mode でも kernel panick に.SSD が死んだ?と戦々恐々としながら BIOS で USB 起動を有効にして USBメモリの Linux から起動して対象Disk を mount( LUKS + LVM + ext4 ) chroot しようとすると bash がないと言われる.ls すると矢張りちゃんとある.ldd ./bin/bash して ライブラリを確認しようとすると chroot 先の /lib が空!
lxc-create が host の /lib 消しちゃったぽい?

とりあえずこの状態で差分バックアップを取っておく. /home, /etc, /var, /opt あたり.バックアップログを見た感じこの辺は特に消えたりとかはしていないようだった.

多分 /lib が復活すれば治ると思う.ということで,前もって取ってあった dpkg --get-selections "*" のパッケージリストから /lib を含むパッケージを抜き出して apt-get download して,dpkg -x して出てきた ./lib/lib にcp してどうにか OS が起動するように.
その後 dpkg --configure -a とか apt-get install -f してパッケージ状態を正常な状態に.

そんなこんなでどうにか復旧しました.
思ったより時間かかってしまった.Debian Installer で起動して上書きインストールして dpkg --set-selections とかしたほうが速かったかもしれない.

多分 lxc-create でおかしくなった気がするのでこの辺ちゃんと調べたいところ.

% sudo lxc-create -t /usr/share/lxc/templates/lxc-busybox -n busybox01
lxc_container: No such file or directory - Failed to make / rslave to run template
lxc_container: Continuing...
warning : busybox is not statically linked.
warning : The template script may not correctly
warning : setup the container environment.
chmod: `/usr/local/var/lib/lxc/busybox01/rootfs/bin/passwd' 
setting root password to "root"
Failed to change root password
lxc_container: unknown key lxc.haltsignal
lxc_container: Failed to parse config: lxc.haltsignal = SIGUSR1
lxc_container: _recursive_rmdir_onedev: failed to delete /usr/local/var/lib/lxc/busybox01/rootfs/lib
lxc_container: _recursive_rmdir_onedev: failed to delete /usr/local/var/lib/lxc/busybox01/rootfs
lxc_container: Error destroying rootfs for busybox01
lxc_container: Error creating container busybox01
precmd:2: command not found: basename

端末をリアルタイムに Web で共有できる GoTTY

以下のアニメーションでだいたい解ると思いますが,端末を Webブラウザで公開することのできるアプリケーションです.Go で書かれているようです.

端末の内容を公開するだけでなく, -w オプションを付けると入力でもできるので普通に端末操作が Webブラウザから可能です.

導入例

~/usr/local/go 以下に導入している.

% GOPATH=~/usr/local/go go get github.com/yudai/gotty
% ~/usr/local/go/bin/gotty top

この状態で http://localhost:8080/ にアクセスしてみると top コマンドが表示されます.色々試してみましたが, Nyancat は遅延なく動きましたが,cacademo は表示されませんでした.ブラウザは Chromium / midori を試しましたがどちらも変わらず動いているようです.

gotty bash とかすればみんなでひとつの端末を触れるのかな?と思ったのですが,ブラウザでアクセスするごとにセッションが作られるようでうまくいきませんでした.

2015/08/23 14:47:42 Server is starting with command: bash
2015/08/23 14:47:46 New client connected: 127.0.0.1:36194
2015/08/23 14:47:46 Command is running for client 127.0.0.1:36194 with PID 28469
2015/08/23 14:48:56 New client connected: 127.0.0.1:36208
2015/08/23 14:48:56 Command is running for client 127.0.0.1:36208 with PID 29315

README.md に以下のような記述が,

Sharing with Multiple Clients

Gotty starts a new process when a new client connects to the server. This means users cannot share a single terminal with others by default. However, you can use terminal multiplexers for sharing a single process with multiple clients.

For example, you can start a new tmux session named gotty with top command by the command below.

$ gotty tmux new -A -s gotty top
This command doesn't allow clients to send keystrokes, however, you can attach the session from your local terminal and run operations like switching the mode of the top command. To connect to the tmux session from your terminal, you can use following command.

$ tmux new -A -s gotty
By using terminal multiplexers, you can have the control of your terminal and allow clients to just see your screen.

ということで gotty tmux new -A -s gotty で実現できました.GNU Screen でも出来ないかとセッション名を同じように gotty にして multiuser on にしてみましたがこれだけではうまく行きませんでした.GoTTY 本体に手を入れる必要があるかもしれません.

ただ,何も考えずに使うとプロトコルは http なので盗み見もできるでしょうし誰でも操作できるしで危険です.一応ランダムURL や Bashic AUTH のオプションはありますが十分ではないでしょう.

ドキュメントでは,Docker を利用する例が載っています.

Playing with Docker

When you want to create a jailed environment for each client, you can use Docker containers like following:

$ gotty -w docker run -it --rm busybox

Fw の内側で社内や,勉強会などの内輪で一時的に公開して公開後はイメージを破棄するくらいが良いのかもしれません.

そういえば勉強会サーバも作っていたのでした.GoTTY も入れてみようと思います.

awesome wm を久々に使おうとしたら設定ファイルが使えなくなっていたので再設定

screenFetch-2015-08-22_12-22-58

Debian stretch 環境の awesome を久々に起動すると awesome のバージョンが新しくなっていて設定ファイルの互換性が失われていました.jessie で使っていた頃入れたので恐らく以前のバージョンは 3.4.15 で,今は 3.5.6 です.

とりあえず規定値の設定で起動してくるのですが使いにくいので最低限ですが設定をやりなおしました.

設定ファイルとテーマファイルの差し替え

既存の古い設定ファイルとテーマファイルを差し替えます.

$ cp /etc/xdg/awesome/rc.lua ~/.config/awesome/
$ cp /usr/share/awesome/themes/default/theme.lua ~/.config/awesome/

これで規定値と同じになりました.テーマは /usr/share/awesome/themes 以下に3種類あるのでお好みで.私は今は明るい sky( /usr/share/awesome/themes/sky/theme.lua ) を利用しています.

設定変更

  • 設定ファイル修正( ~/.config/awesome/rc.lua )

    • テーマファイル変更(3.4と同じ)

      -beautiful.init("/usr/share/awesome/themes/default/theme.lua")
      +beautiful.init("~/.config/awesome/theme.lua")
      
    • 端末アプリ変更(3.4と同じ)

      -terminal = "x-terminal-emulator"
      +terminal = "mate-terminal"
      
    • スクリーンショット設定(3.5)
      以前行っていた以下の設定ではうまく行かなかった.
      Linux/WindowManager/awesome – matoken’s wiki.
      以下のファイルを用意して,

      % cat ~/script/ss-root.sh
      #!/bin/sh
      import -window root ~/Pictures/`date +%Y%m%d_%H:%m:%S-$$.jpg`
      % cat ~/script/ss-window.sh
      #!/bin/sh
      xwininfo |grep '^xwininfo: Window id:' | awk '{print $4}' | xargs -I{} import -window {} ~/Pictures/`date +%Y%m%d_%H:%m:%S-$$.jpg`
      % cat ~/script/ss-area.sh
      #!/bin/sh
      import ~/Pictures/`date +%Y%m%d_%H:%m:%S-$$.jpg`
      

      -- Standard program の前か後ろ辺りに以下を追加.

      -- bind PrintScrn to capture a screen
      awful.key({                   }, "Print", function () awful.util.spawn("/home/mk/script/ss-root.sh",false)   end),
      awful.key({ "Mod1"            }, "Print", function () awful.util.spawn("/home/mk/script/ss-window.sh",false) end),
      awful.key({ "Shift"           }, "Print", function () awful.util.spawn("/home/mk/script/ss-area.sh",false)   end),
      

      この script はパスを通してあって,3.4 では script名だけで動いていたのですが 3.5 ではフルパスでないと動かないようでした.

    • 音量ボタン設定(3.5)
      以下のようなミュートとアンミュートを行うscript audiomute.sh を用意して,

      #!/bin/sh
      
      MUTE=`amixer -c 0 get Master|tail -1|cut -d '[' -f 4|sed s/\]//`
      if [ $MUTE = "on" ] ; then
        amixer -q -c 0 set Master mute
        echo "mute!"
      else
        amixer -q -c 0 set Master unmute
        echo "unmute!"
      fi
      
      amixer -c 0 get Master|tail -1|cut -d '[' -f 4|sed s/\]//
      

      <追記>
      これだとアンミュートがうまく行かなかったです.次のエントリを参照して下さい
      Awesome wm でボリュームコントロール | matoken's meme
      </追記>

      -- Standard program の前か後ろ辺りに以下を追加.

          -- Audio Controle
          awful.key({                   }, "XF86AudioMute", function () awful.util.spawn("/home/mk/script/audiomute.sh",false) end),
          awful.key({                   }, "XF86AudioRaiseVolume", function () awful.util.spawn("amixer -c 0 set Master 2dB+",false) end),
          awful.key({                   }, "XF86AudioLowerVolume", function () awful.util.spawn("amixer -c 0 set Master 2dB-",false) end),
      

      これもやはりフルパスで script を書かないと動かない.amixer は動いているのでパスがうまく渡っていないのかも.awesome 起動後にパスが設定されてうまく動いていないという感じだと思います.

    • 自動起動アプリ指定(3.4と同じ)
      -- {{{ Autostart application
      -- "Autostart - awesome"
      -- http://awesome.naquadah.org/wiki/Autostart
      awful.util.spawn_with_shell("~/script/run_once.bash nm-applet")
      awful.util.spawn_with_shell("~/script/run_once.bash synergy")
      awful.util.spawn_with_shell("~/script/run_once.bash clipit")
      awful.util.spawn_with_shell("~/script/run_once.bash owncloud")
      awful.util.spawn_with_shell("~/script/run_once.bash xchat")
      awful.util.spawn_with_shell("~/script/run_once.bash pidgin")
      :
      -- }}}
      

      この項目は設定内にないので末尾に追加しました.
      ~/script/run_once.bash は以下のようなもので,アプリケーションの2重起動を回避するために利用しています.

      #!/bin/bash
      pgrep $@ > /dev/null || ($@ &)
      

      Autostart – awesome

  • テーマファイル修正( ~/.config/awesome/theme.lua )

    • 壁紙変更(3.5)
      -theme.wallpaper             = "/usr/share/awesome/themes/sky/sky-background.png"
      +theme.wallpaper             = "~/Pictures/wp/futur_by_takaju-d60mg7y.png"
      

awesome は軽くてサクサクで結構好きです.ただこのように設定は自分で書かないといけないのでとっつきにくいかもしれません.キーバインドも覚えないといけませんし.でも2,3日使っていると主要な物は覚えられます.
ちなみに,3.4 でもあって 3.5 でも治っていない問題として,ブラウザ等でファイルを開くとかなりの確率でアプリが落ちてしまいます.ブラウザでファイルを添付するときにすごく困ります.最近のGoogle+ や Flickr などドラッグ&ドロップで添付できるような場所はいいのですが…….

  • マウスを使わないでキーボードで快適に生活する方法(GNU Screen/tmux/byobu/awesome)
  • Linux/WindowManager/awesome – matoken's wiki.
  • H-II B F5 / HTV 5 の打ち上げを見た

    とはいっても家のすぐ側の射場から 100km ほど離れた場所からです.鹿児島に住んでいるので晴れていれば見晴らしのいい場所でなら大抵見られます.日中打ち上げで福岡で H-II A を見た人も居たはず.

    とはいえ家は山に囲まれているので出来れば佐多岬かせめて太平洋沿岸まで出たいと思っていたのですが,日が暮れてから雨が降ってきたので今回は観測できないかなーと思って家でゴロゴロしていました.打ち上げ30分位前に外に出てみると星が見えます.これは行けるか?ってことで慌てて家の側の丘になっている場所へ移動.地理院地図を見るとここは標高 210m ほどのようです.
    見学場所に付いたの打ち上げ1,2分前.これはカメラの準備は無理か?と思いなが三脚立てたりしてました.三脚にカメラ乗せてこっちかなーと真南あたりに向けていたのですが,思ったよりずっと東の方角が明るく.慌ててカメラの角度を変えて撮影開始.とりあえず 24mm(35mm換算36mm) のコシナのレンズに Pentax K-5 で F2.4 ISO6400 露出5秒で撮影.インターバルはレリーズ接続が間に合わなかったので手動で…….三脚の足場や固定が甘い&手動でシャッター切ってたのでブレブレでしたorz

    雨が降った割には雲も少なく肉眼では噴射炎の形や何かが分離して分離したものが暫く光っているのが見えたり(時間的に SRB-A だと思う)しましたがこの撮り方では写らず.24mm は適当に手持ちのを選んだのですがちょうどいい感じでした.少なくとも肉眼で見えなくなるまでの画角は賄えました.
    (雲があるとあっという間に見えなくなって悲しいのですよね……)

    次回はビデオと一眼レフx2 とかで狙ってみたいところです.

    これは比較明合成してみたもの
    H-IIBF5_比較明

    こちらはアニメーションにしてみたものです.

    これは打ち上げ後に10分ほど星景を撮ったもの.飛行機と衛星らしきものが横切っていきます.こういうのだと24mm は物足りないですね.
    星景比較明合成20150820

    合成方法はこの辺りを(最近この辺りは調べてないのでもっといいものがあるかもしれません.)

    参考URL

    Wuala サービス終了のお知らせが届く

    IMGP0036

    スイス生まれのセキュアで Linux Client もあるオンラインストレージサービスの Wuala というものが会ったのですが,そちらからメールが.なんだろうと確認するとサービス終了とのこと.

    17 August 2015    No further renewals or purchase of storage
    30 September 2015    Wuala service will transition to read-only
    15 November 2015    Wuala service terminates and all data stored in the Wuala cloud will be deleted
    
    • 08/17 有料アカウントの購入更新停止
    • 09/30 読み取り専用に
    • 11/15 サービス終了

    残念.
    似たようなものだと AeroFS(ローカルP2PでAeroFS自体には保存されない) / SpiderOrk(暗号化後転送) くらいですかね.自分のサーバや回線が用意できるなら ownCloud もいい感じです.私は最近 ownCloud メインになっています.

    コミックマーケット88 報告

    コミックマーケット88 ブースに来てくれた方ありがとうございました.私を訪ねて来てくださった方も居たようですが今回私はお留守番でしたorz

    新刊は「端末で遊ぼう」でした.例えば以下のような感じで遊んだりする本でした.Wiki の方で最近アクセスが多いのでまとめてみたのですが部数を少なめにしても10冊ほど売れ残ったようです.デモをしたり表紙を凝ったり本文に写真入れるとかすればもう少し行けたかもなぁとも思ったり.
    IMGP7664

    C87既刊の「Raspberry Pi で遊ぼう!」は搬入分は全て捌けたようで手元にも在庫はありません.以下のお店で数冊ずつ残っているようです.興味のある方はぜひ.

    小江戸らぐ工作部の「ラズパイライフ」も完売です.増刷などの情報が判ったら追記します.

    さて次回の c89 ですが,次回もちょっと参加は難しいと思うので次回は申し込みを見送るつもりです.お友達のサークルとかで書かせてもらったりできるといいなと思っています.
    #電書に手を出すのもありかな?

    GVfs のマウントポイントを探す

    Android などでよく使う USB の mtp プロトコルですが,GVfs で自動マウントされます.ファイルマネージャの Nautilus などでアクセスできますが,途中で失敗することがあります.そこで端末上から rsync コマンドを使って失敗しても失敗した部分だけ再試行できるようにしていました.今回 Debian stretch amd64 + Gnome-shell 環境だと以前のマウントポイントの ~/.gvfs にはマウントされなくなっていました.

    % ls -lA ~/.gvfs 
    合計 0
    

    Nautilus のロケーションは次のようになっていますがこれも端末からはアクセスでき無さそう. mtp://[usb:001,009]/

    Nautilus で umount して,fuser mount して rsync してみようと思ったのですが, mtpfs も jmtpfs 失敗してしまいました.

    % mtpfs fuse/mtp
    Listing raw device(s)
    Device 0 (VID=1004 and PID=631c) is a LG Electronics Inc. LG-E610/E612/E617G/E970/P700.
       Found 1 device(s):
       LG Electronics Inc.: LG-E610/E612/E617G/E970/P700 (1004:631c) @ bus 1, dev 6
    Attempting to connect device
    Android device detected, assigning default bug flags
    Error 1: Get Storage information failed.
    Error 2: PTP Layer error 02fe: get_handles_recursively(): could not get object handles.
    Error 2: Error 02fe: PTP: Protocol error, data expected
    Listing File Information on Device with name: LGL22
    LIBMTP_Get_Storage() failed:-1
    % ls -la /home/mk/fuse/mtp
    合計 8
    drwxr-xr-x 2 mk mk 4096  8月 17 17:19 .
    drwxr-xr-x 8 mk mk 4096  8月 17 17:19 ..
    
    % jmtpfs fuse/mtp
    Device 0 (VID=1004 and PID=631c) is a LG Electronics Inc. LG-E610/E612/E617G/E970/P700.
    Android device detected, assigning default bug flags
    % ls -la /home/mk/fuse/mtp
    ls: /home/mk/fuse/mtp にアクセスできません: 入力/出力エラーです
    % fusermount -u /home/mk/fuse/mtp
    

    Nautilus で右クリックして 端末で開く から確認することが出来ました.

    Screenshot from 2015-08-17 18-19-43

    Screenshot from 2015-08-17 18-26-02

    どうも GVfs のマウントポイントは ~/.gvfs から /run/user/1000/gvfs に変わったようです. 1000 は ユーザの UID でしょうね.

    ということで,rsync でデータコピーが出来ました.

    % rsync -av /run/user/1000/gvfs/mtp:host=%5Busb%3A001%2C009%5D/内部ストレージ/DCIM /export/Photo
    

    その後 man gvfsd-fuse に発見.

       gvfsd-fuse is normally started by gvfsd(1). In this case, the mount point is $XDG_RUNTIME_DIR/gvfs or $HOME/.gvfs.
    

    確認すると一緒ですね.

    % echo $XDG_RUNTIME_DIR/gvfs
    /run/user/1000/gvfs
    

    しかし,gvfs-* 系のツールでも確認できそうなんですがうまく行かないですね…….

    % gvfs-mount -h
    用法:
      gvfs-mount [オプション...] [LOCATION...]
    
    ロケーションをマウントします。
    
    ヘルプのオプション:
      -h, --help                      ヘルプのオプションを表示する
    
    アプリケーションのオプション:
      -m, --mountable                 マウント可能としてマウントする
      -d, --device=DEVICE             デバイスファイルでボリュームをマウントする
      -u, --unmount                   アンマウントする
      -e, --eject                     取り出す
      -s, --unmount-scheme=SCHEME     指定されたスキームですべてのマウントを解除する
      -f, --force                     Ignore outstanding file operations when unmounting or ejecting
      -a, --anonymous                 Use an anonymous user when authenticating
      -l, --list                      リスト表示する
      -o, --monitor                   イベントを監視する
      -i, --detail                    その他の情報を表示する
      --version                       Show program version
    % gvfs-mount -l
    Drive(0): INTEL SSDSA2CW600G3
      Type: GProxyDrive (GProxyVolumeMonitorUDisks2)
    Drive(1): ST932032 0AS
      Type: GProxyDrive (GProxyVolumeMonitorUDisks2)
      Volume(0): 320 GB ボリューム
        Type: GProxyVolume (GProxyVolumeMonitorUDisks2)
        Mount(0): 320 GB ボリューム -> file:///media/mk/555bf630-0ca8-4282-9a79-7acfd6355a0a
          Type: GProxyMount (GProxyVolumeMonitorUDisks2)
    Volume(0): LGE Android Phone
      Type: GProxyVolume (GProxyVolumeMonitorMTP)
      Mount(0): LGE Android Phone -> mtp://[usb:001,009]/
        Type: GProxyShadowMount (GProxyVolumeMonitorMTP)
    Mount(1): mtp -> mtp://[usb:001,009]/
      Type: GDaemonMount
    % gvfs-info -f 'mtp://[usb:001,009]/'
    属性:
      standard::type: 2
      standard::name: [usb:001,009]
      standard::display-name: LGL22
      standard::icon: multimedia-player
      standard::content-type: inode/directory
      standard::size: 0
      standard::symbolic-icon: multimedia-player-symbolic
      access::can-read: TRUE
      access::can-write: FALSE
      access::can-execute: TRUE
      access::can-delete: FALSE
      access::can-trash: FALSE
      access::can-rename: FALSE
      filesystem::size: 38238453760
      filesystem::free: 12884361216
      filesystem::type: mtpfs
      gvfs::backend: mtp
    

    追記)
    mount コマンドで確認できるよと教えてもらいました.この時は mount コマンドや /etc/motd も確認したけど見当たらないと思っていたのですが,再確認したらちゃんと見えました.アイコン上は mount してるけど中が見えないという状態がよく起こるのですがそのタイミングで確認したのかもしれません.ちなみにその時は USB 抜き差しでも症状変わらず Android 側で PTP / MTP と切り替えると見えるようになりました.

    
    % mount|grep gvfs
    gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
    % cat /etc/mtab|grep gvfs
    gvfsd-fuse /run/user/1000/gvfs fuse.gvfsd-fuse rw,nosuid,nodev,relatime,user_id=1000,group_id=1000 0 0
    

    コミケ88のお知らせ

    もう明日からコミックマーケット88 ですね.
    今回 matoken’s meme は 日曜日 東地区 “P” ブロック 13b に配置されました.

    頒布物は,以下の2種類と

    • 新刊「端末で遊ぼう」 A5 20p
      (端末で生活を試みたりする本)
    • C87既刊「Raspberry Pi で遊ぼう!」B5 52p
      (Raspberry Pi の tips集 + モニタリングポストの記事)
      terminal-0pi-0

    小江戸らぐ工作部の「ラズパイライフ」です.
    file_1

    残り少ない Debian SuperKey sticker も配布予定です.
    IMG_20131120_021411

    是時遊びに来て下さい.

    追記)
    中の人は金欠で行かれてません.小江戸らぐ工作部の方々にお願いしています><

    端末操作を Web で共有出来る asciinema

    asciinema ちょっと面白い.端末の操作を gyazo や pastebin みたいにお手軽にwebで公開みたいなイメージ.ttyrec とかもあるけどお手軽にWebで見られるのがいい.ぱっと見動画みたいだけどコピペも出来る.

    Web への埋め込みも出来て,画像のリンク形式と
    asciicast
    直接再生できるプレイヤー形式が選べる.

    色だけでなく日本語もいけるけれど w3m-img とかの画像は見えない.以下は録画時には w3m-img で画像が出ていた.

    クライアントコマンドを使うのだけどRaspberry Pi とかも狙っているのか armv6/armv7 もあるのが便利.

    case "$(uname -s).$(uname -m)" in
        Linux.x86_64) platform=linux-amd64;;
        Linux.i?86) platform=linux-386;;
        Linux.armv6l) platform=linux-arm;;
        Linux.armv7l) platform=linux-arm;;
        Darwin.x86_64) platform=darwin-amd64;;
        Darwin.i?86) platform=darwin-386;;
        *) echo "Sorry, there is no asciinema binary available for your platform. Try building from source." >&2; exit 1;;
    esac
    

    導入例

    $ curl -sL https://asciinema.org/install > install
    $ lv install
    $ sh install
    Downloading asciinema v0.9.9 for linux-arm...
    ######################################################################## 100.0%
    Warning: you may be asked for administrator password to save the file in /usr/local/bin directory
    Installing to /usr/local/bin/asciinema...
    Success.
    
    Start recording your terminal by running: asciinema rec
    

    オプションは少ない

    $ asciinema 
    usage: asciinema [-h] [-v] <command> [command-options]
    
    Record and share your terminal sessions, the right way.
    
    Commands:
       rec            Record terminal session
       auth           Assign local API token to asciinema.org account
    
    Options:
       -h, --help     Display help message
       -v, --version  Display version information
    
       Run "asciinema <command> -h" to see the options available for the given command.
    

    認証

    認証しなくても使える.未認証の時にUpしたものも認証後認証ユーザのものになった.

    $ asciinema auth
    Open the following URL in your browser to register your API token and assign any recorded asciicasts to your profile:
    https://asciinema.org/connect/8025b685-d45e-4631-8dcf-xxxxxxxxxxxx
    

    録画

    rec option で録画できる.exit で録画終了で,その後 Enter でアップロード,Ctrl+c でキャンセル.

    $ asciinema rec
    ~ Current terminal size is 178x49.
    ~ It may be too big to be properly replayed on smaller screens.
    ~ You can now resize it. Press <Enter> to start recording.
    
    ~ Asciicast recording started.
    ~ Hit Ctrl-D or type "exit" to finish.
    pi@raspberrypi~ $ 
    pi@raspberrypi~ $ 
    pi@raspberrypi~ $ exit
    ~ Asciicast recording finished.
    ~ Press <Enter> to upload, <Ctrl-C> to cancel.
    
    https://asciinema.org/a/16372
    

    Web にアクセスすると録画されたものが閲覧できる.アップロードにはプライベートになっていて公開するには公開設定が必要.この動きは Account settings で設定変更が可能.テーマの選択やトークンの管理もここで出来る.

    #このエントリ公開していたつもりが公開できていなかった><

    フレームバッファであひる焼き(fbterm の 背景画像の設定)

    一部の楽屋ネタ的なものですが,Twitter であひるを焼く人たちがいます.

    libcaca というライブラリのデモで cacafire というものがあるのですが,これがアスキーアートで炎の燃える様子が動画で表現されるので楽しいです.これであひるを焼くように見せかけないだろうかと思いました.

    フレームバッファを使えばきっと出来るなーと.そしてfbterm 1.5 からバックグラウンドイメージのサポートが入っていて,デモ用に fbv というものがあります.これを組み合わせればいけるだろうと試してみました.

    が,試してみたところ libgif まわりで少し嵌ったのでメモ.

    環境

    • Debian stretch amd64 or Debian jessir amd64

    関連パッケージを導入

    $ sudo apt install build-essential libpng-dev libjpeg-dev libgif-dev
    

    source 入手 & build

    $ wget http://s-tech.elsat.net.pl/fbv/fbv-1.0b.tar.gz
    $ tar tvf fbv-1.0b.tar.gz
    $ tar xf fbv-1.0b.tar.gz
    $ cd fbv-1.0b
    $ ./configure --help
        :
    $ ./configure --prefix=$HOME/usr/local
    $ make
    

    ここで問題発生.

    % ./configure
    checking for libungif presence... no
     :
    % make
    gif.o: In function `fh_gif_load':
    gif.c:(.text+0x111): undefined reference to `DGifOpenFileName'
    gif.c:(.text+0x12a): undefined reference to `DGifGetRecordType'
    gif.c:(.text+0x156): undefined reference to `DGifGetExtension'
    gif.c:(.text+0x189): undefined reference to `DGifGetExtensionNext'
    gif.c:(.text+0x1b0): undefined reference to `DGifCloseFile'
    gif.c:(.text+0x1c4): undefined reference to `DGifGetImageDesc'
    gif.c:(.text+0x2dc): undefined reference to `DGifGetLine'
    gif.c:(.text+0x409): undefined reference to `DGifCloseFile'
    gif.c:(.text+0x45b): undefined reference to `DGifGetLine'
    gif.o: In function `fh_gif_getsize':
    gif.c:(.text+0x5df): undefined reference to `DGifOpenFileName'
    gif.c:(.text+0x5f8): undefined reference to `DGifGetRecordType'
    gif.c:(.text+0x61a): undefined reference to `DGifGetExtension'
    gif.c:(.text+0x631): undefined reference to `DGifGetExtensionNext'
    gif.c:(.text+0x654): undefined reference to `DGifCloseFile'
    gif.c:(.text+0x674): undefined reference to `DGifGetImageDesc'
    gif.c:(.text+0x68d): undefined reference to `DGifCloseFile'
    collect2: error: ld returned 1 exit status
    

    libungif が見つからずエラーになっています.パッケージ内にはそれらしいものは存在しますが実体が無さそうです.

    % dpkg -L libgif-dev|grep ungif
    /usr/lib/libungif.la
    /usr/lib/libungif.so
    /usr/lib/libungif.a
    % ls -l /usr/lib/libungif.so
    lrwxrwxrwx 1 root root 15 12月  8  2013 /usr/lib/libungif.so -> libgif.so.4.1.6
    $ ls -l /usr/lib/libgif.so.4.1.6
    ls: cannot access /usr/lib/libgif.so.4.1.6: No such file or directory
    

    libungif/libgif の違いはなんだろうと調べてみるとUnisys社のLZW特許問題を回避するためのものが libungif だったようです.2004年に特許は切れているので現在は libgif になってる感じ?

    gif ファイルを使わないようにして回避

    configure option で gifを使わないようにして回避します.これでもほぼ問題ない気もする.

    ./configure --without-libgif
    

    configure script を書き換えて libgif を使うようにする

    ちょっと乱暴ですが, configure script の libungif を libgif に一括で書き換えてしまいます.

    % sed -e "s/ungif/gif/g" ./configure-org > ./configure
    % ./configure
    % make
    

    シンボリックリンクを貼って逃げる

    現在こんな感じなので,

    % ls -la /usr/lib/lib*gif*
    lrwxrwxrwx 1 root root  8 Dec  8  2013 /usr/lib/libungif.a -> libgif.a
    lrwxrwxrwx 1 root root  9 Dec  8  2013 /usr/lib/libungif.la -> libgif.la
    lrwxrwxrwx 1 root root 15 Dec  8  2013 /usr/lib/libungif.so -> libgif.so.4.1.6
    

    こんな感じでシンボリックリンクを貼ってあげる.

    % sudo ln -s /usr/lib/x86_64-linux-gnu/libgif.so /usr/lib/libgif.so.4.1.6
    

    後はそのままbuild

    あひるの表示

    fbv で画像を表示してみます.

    $ fbv ahiru.png
    

    以下のページに fbv で背景を設定して fbterm を起動する script があります.

    これを少しいじってこんな感じに

    #!/bin/bash
    # fbterm-bi: a wrapper script to enable background image with fbterm
    # usage: fbterm-bi /path/to/image fbterm-options
    clear
    echo -ne "\e[?25l" # hide cursor
    fbv -ciuke "$1" << EOF
    q
    EOF
    shift
    export FBTERM_BACKGROUND_IMAGE=1
    exec fbterm "$@"
    

    いじったのはゴミが残る場合があるので初めに clear を実行.fbv で縦横比虫をしないように -r option を消しました.

    あひる焼き

    もう少しで焼けます.
    あひるは用意出来たので今度は炎の用意です.cacafire の含まれている caca-utils パッケージを導入します.

    % sudo apt install caca-utils
    

    焼きます

    % cacafire
    

    #terminal をフレームバッファも含めて動画でスクリーンショットとる方法が解らず今回は仮想マシンで実行してキャプチャしました.だれか端末のフレームバッファも含めての動画でのスクリーンショットのとり方を知ってる人が居たら教えて下さいo
    ##文字だけなら ttyrec とか asciicast が,1枚の画像だけであれば fbgrab があるんですけどね……・

    実用性?

    今回のは完全にネタですが,切替器で1つの KVM で複数端末を使う場合はそれぞれ別の壁紙を設定しておくと間違いが起こりにくくなっていいかもしれません.しかし今回の方法だと login しないといけないのでいまいち.login 以前に壁紙を設置する方法も調べてみたいと思います.

    関連URL