chrome app を linux でコマンドから起動する

うにてぃ使ってる人はchromeアプリランチャーを入れたらいいんだろうけど,使ってない人なので起動スクリプトを作ってパス通して,xmobarから呼び出せるようにしておかないと生きていけない.
app-idとかは,windowsでchrome appをタスクバーに登録して,ショートカットのオプションを見るのが一番てっとり早い.

$ chromium-browser --profile-directory=Default --app-id=***************************

profile directory は,変更してたら変更してるやつを書く.
app id は,~/.config/chromium/Default/Extensions/* のどれかなので,かかりそうなキーワードでgrepしても,見付けられるかも.

ubuntuの差分バックアップ

ubuntu は deja-dup が標準で入っているので,使われていることが多いと思うが,NW越しにパスワードをかけて保存しようとすると,うまくいかないことがある.
で,deja-dupが呼び出しているduplicityを直接叩くことにする.
あと,うちの環境では何故かsmb経由では保存がうまくできなかったので,FTP経由にした.
これで保存したバックアップは,deja-dupから読み込むことができるけど,リストアスクリプトも用意してみた.

ちなみに,deja-dupが呼び出す時のオプションは,適当なバックアップを手動で走らせている間に,$ ps aux | grep duplicityで見ると良い.

設定ファイル,定期バックアップスクリプト,古いバックアップの削除スクリプト,リストアスクリプトの例.

# 保存するディレクトリリストをスペース区切りで
DIRS='/home/USERNAME /MYDIR'

# 連想配列の宣言
declare -A INCLUDE
declare -A EXCLUDE

# duplicity は include/exclude に合致するディレクトリが実際にないとエラーを吐くので,
# ターゲットディレクトリ毎に指定する必要がある
# deja-dup がここを include に入れていた..cacheをexcludeしつつ,このファイルだけincludeしたりできる.
INCLUDE['/home/USERNAME']='/home/USERNAME/.cache/deja-dup/metadata'
# 半角スペース入りのディレクトリは後ろのfor loopでどうしても分割されてしまうので,半角スペース抜きに設定を変更するのが楽(vboxとか)
EXCLUDE['/home/USERNAME']='/home/USERNAME/mountedvolumes /home/USERNAME/Dropbox /home/USERNAME/Downloads /home/USERNAME/.cache /home/USERNAME/.rnd /home/USERNAME/VirtualBoxVMs'

INCLUDE['/MYDIR']=''
EXCLUDE['/MYDIR']='/MYDIR/lost+found'
#!/bin/bash

. ~/bin/duplicity_dirs.conf

# environment variables
# パスワードとかコマンドにもスクリプトにも入れたくない場合は,読み込むしかない
USER=$(cat /home/USERNAME/username)
# GnuPGに渡されるパスフレーズ
export PASSPHRASE=$(cat /home/USERNAME/passphrase)
# FTPログイン時に使用されるパスワード
export FTP_PASSWORD=$(cat /home/USERNAME/password)

# command
CMD=/usr/bin/duplicity

# バックアップ保存先
# destination
DESTADDR=192.168.1.200
DESTPATH=/BackupDirectory
# FTPの場合
DESTSRV=ftp://${USER}@${DESTADDR}/array1${DESTPATH}
# LinkStationの場合,array1が間にはさまることに注意

# options
# 1ヶ月ごとにフルバックアップを取る
OPTIONS='--volsize=100 --gpg-options=--no-use-agent --archive-dir=/home/USERNAME/.cache/deja-dup --tempdir=/tmp --full-if-older-than 1M'

# include オプションの生成
COMBINE_INC() {
    RESULT=""
    for STRING in $*
    do
        RESULT="${RESULT} --include=$STRING"
    done
}

# exclude オプションの生成
COMBINE_EXC() {
    RESULT=""
    for STRING in $*
    do
        RESULT="${RESULT} --exclude=$STRING"
    done
}

# loop for all target directories
for DIR in $DIRS
do
    echo backup $DIR
    # include
    COMBINE_INC ${INCLUDE[$DIR]}
    INC_OPT=$RESULT
    # exclude
    COMBINE_EXC ${EXCLUDE[$DIR]}
    EXC_OPT=$RESULT
    # command
    echo $CMD $INC_OPT $EXC_OPT $OPTIONS $DIR ${DESTSRV}$DIR
    $CMD $INC_OPT $EXC_OPT $OPTIONS $DIR ${DESTSRV}$DIR
done

export PASSPHRASE=""
export FTP_PASSWORD=""
#!/bin/bash

. ~/bin/duplicity_dirs.conf

# environment variables
# パスワードとかコマンドにもスクリプトにも入れたくない場合は,読み込むしかない
USER=$(cat /home/USERNAME/username)
# GnuPGに渡されるパスフレーズ
export PASSPHRASE=$(cat /home/USERNAME/passphrase)
# FTPログイン時に使用されるパスワード
export FTP_PASSWORD=$(cat /home/USERNAME/password)

# command
CMD=/usr/bin/duplicity
SUBCMD=remove-older-than # 経過時間を条件に削除するモード

# バックアップ保存先
# destination
DESTADDR=192.168.1.200
DESTPATH=/BackupDirectory
# FTPの場合
DESTSRV=ftp://${USER}@${DESTADDR}/array1${DESTPATH}
# LinkStationの場合,array1が間にはさまることに注意

# options
PARAM=6M  # 6ヶ月より古いものを消す
OPTIONS='--force'

# loop for all target directories
for DIR in $DIRS
do
    echo clear $DIR
    echo $CMD $SUBCMD $PARAM $OPTIONS ${DESTSRV}$DIR
    $CMD $SUBCMD $PARAM $OPTIONS ${DESTSRV}$DIR \
        && echo "clear old data for $DIR" \
        || echo "some error may happen in the process for $DIR"
done

export PASSPHRASE=""
export FTP_PASSWORD=""
##!/bin/bash

. ~/bin/duplicity_dirs.conf

# environment variables
# パスワードとかコマンドにもスクリプトにも入れたくない場合は,読み込むしかない
USER=$(cat /home/USERNAME/username)
# GnuPGに渡されるパスフレーズ
export PASSPHRASE=$(cat /home/USERNAME/passphrase)
# FTPログイン時に使用されるパスワード
export FTP_PASSWORD=$(cat /home/USERNAME/password)

# command
CMD=/usr/bin/duplicity
SUBCMD=restore

# バックアップ保存先
# destination
DESTADDR=192.168.1.200
DESTPATH=/BackupDirectory
# FTPの場合
DESTSRV=ftp://${USER}@${DESTADDR}/array1${DESTPATH}
# LinkStationの場合,array1が間にはさまることに注意

# 入力処理 - バックアップのURLを特定する
# ターゲットディレクトリに部分一致があれば,DIRに値が入ったままbreakする仕組み
for DIR in $DIRS
do
    [ "${1#$DIR}" != "$1" ] && break
    DIR=""
done

[ "$DIR" == "" ] && exit

# 対象ファイルの相対化
# duplicityは,バックアップ先のディレクトリからの相対パスが必要
RELPATH="${1#$DIR/}"
OPTIONS="--file-to-restore $RELPATH"

# リストアしたファイルを格納するテンポラリファイル
# 直接書き戻すこともできるけど,リスキーだからやめた方が良い
TARGET=~/restore
mkdir -p $TARGET
TARGET="${TARGET}/${RELPATH}"

echo restore $1
echo $CMD $SUBCMD $OPTIONS ${DESTSRV}$DIR $TARGET
$CMD $SUBCMD $OPTIONS ${DESTSRV}$DIR $TARGET \
    && echo "files are restore into ${TARGET}" \
    || echo "some error may happen in the process for ${TARGET}"

export PASSPHRASE=""
export FTP_PASSWORD=""

個人的には,バックアップをdaily,削除をmonthlyで回すくらいがオススメ.

tmux でコマンドライン履歴のスクロールバックとコピペ

tmux使用中にShift+PageUpしても画面がスクロールしていってしまって,tmuxの中の履歴を参照できず困っていた.
これは,tmuxのコピーモードを使えば解消するらしい.

実は,tmux の部分は全部 man tmux に載ってる.

プレフィックス(デフォルトでC-b)をPrefixと表記する.

キーバインド(viモードの場合)

key binding explanation
Prefix+[ コピーモード開始
q コピーモード終了
Space Start selection
Enter Copy selection
Prefix+] Paste the most recently copied buffer of text

X Window system clipboardとの連携

$ sudo apt-get install xsel
bind-key > save-buffer ~/.tmux-buffer \; run-shell 'xsel -b -i < ~/.tmux-buffer' \; display-message "Copied to clipboard"
bind-key < if-shell 'xsel -b -o > ~/.tmux-buffer' 'load-buffer ~/.tmux-buffer ; paste-buffer'

python3 で seaborn を使うまで

python3系でvenvを使う想定.

ubuntuとかだとpython3は入っているので,他にいりそうなものを入れる.

$ sudo apt-get install python3-dev python3-venv python3-tk tk-dev

python3-devはnumpyとかのコンパイルに,venvはpipとかをローカルで使うために,tk系はmatplotlibでプロットするウィンドウをコンソールから起こすために使う.

venvで環境を整える.
どこでもいいけど,私は ~/.py3 に環境を作っている.

$ cd
$ pyvenv-3.4 .py3
$ source ~/.py3/bin/activate

source ~/.py3/bin/activateはaliasにしといた方が良いと思う.
以降,source ~/.py3/bin/activateした状態を,(.py3) $と表記する.

必要なパッケージをインストールする
pipでパッケージを入れるが,もしかしたらディストリのパッケージのうち,必要なものが抜けているかも知れない.
build-essentialとかgfortranとか…エラーが出るはずなので,その時に検索すること.
ともかく,以下でpython上の依存関係は入る.

$ pip install seaborn
matplotlibの設定ファイルを変更
(.py3) $ python -c 'import matplotlib;print(matplotlib.matplotlib_fname())'
/home/USERNAME/.py3/lib/python3.4/site-packages/matplotlib/mpl-data/matplotlibrc

で場所を見付けて,backend と書かれた行が agg だったら,tkaggに変更する.

sudo した時,zsh がエラーを出すようになった

エラーはこんな感じ.

zsh compinit: insecure directories, run compaudit for list.
Ignore insecure directories and continue [y] or abort compinit [n]?

compinitが食べてるpathを片っ端からchmod g-wしてみたけど,消えない.
zshenvでcompinit -uしてるしなぁと思ったものの,zshが起動する時に読み込む設定ファイルを片っ端から調べてみたら,エラーの回数だけ -u が外れているものを見付けた.
私の場合,

  • ~/.zsh/.zshrc
  • /etc/zsh/zshrc

昔は出てなかったので,何かのタイミングに切り戻されたりアップデートされたりしたのやも知れん.
ともかく解決して良かった.

virtualbox on ubuntu で USB 機器が認識できなくなった

少し前まで,ホストマシンにUSB接続しているScansnapのフタを開けば,ubuntu の上の virtualbox で仮想化している windows から自動的に見えるよう設定していたのであるが,ある日突然,認識しなくなっていた.

切り分け

フィルタは有効か?
設定は残っている.試しに消してみて,追加し直そうとしてみたところ,追加すべきデバイスが見付からない様子であった.
VboxからUSBデバイスは見えているか?
$ VBoxManage list usbhost
Host USB Devices:

<none>

のように,認識していない.

デバイスはホストOSから認識しているか?
$ lsusb
(略)
Bus 001 Device 004: ID 04c5:1096 Fujitsu, Ltd fi-5110EOX
(略)

のように,認識している.

vboxmanageグループにローカルユーザは所属しているか?
$ grep vbox /etc/group
$

!?
そもそもvboxusersグループがないやーん!

対処

単にグループ作るだけでうまくワークするか分からんかったので,vboxの再インストール.
設定消えたりすると面倒なので,remove/installで.

$ sudo apt-get remove virtualbox-5.0
$ sudo apt-get install virtualbox-5.0
$ grep vbox /etc/group
vboxusers:x:125:
$ sudo gpasswd -a USER vboxusers

動作確認→まだ認識しない!

$ groups
USER adm cdrom ... # vboxusersがない!

多分,起動し直して,/etc/groupを読み直してもらえばいいのでは?

$ sudo reboot

再起動後…!! 復活!!

uim-skk で カンマやピリオドを句読点の代わりに使うなど

これではダメだった→UIM-skk の句読点をカンマ・ピリオドに. - 落書き、時々落学

ので,これで(anthyとなっているけど,skkでもいける)→uim-anthy で句読点をカンマドットに変える - Qiita

ちなみに,「z+」で全角スペースを入力する場合,
input:「z 」(z+
next:(何も入力しない)
output:「 」(全角スペース)
とすると良い.

input:z
next:「 」(半角スペース)
output:「 」(全角スペース)
とすると,全角スペースの後ろに半角スペースが入る.

rxvtでuimを使って漢字変換をしようとすると真っ白になる現象の対処

環境
ディストリ:ubuntu 14.04
ウィンドウマネージャ:xmonad
ターミナル:rxvt-unicode

現象
uim-skkを使用してurxvt上で日本語入力をする時、かな入力は問題ないが変換モードで入力しようとすると入力した文字列が背景色・文字色とも白となり文字を視認できない
入力を確定すると、ターミナルのフォントで日本語文字が入力され、視認できる

対処
以下の設定があれば、消す。
または、24とする。
何故かは不明。

- urxvt.depth: 32
+ urxvt.depth: 24

xmonad環境でxmobarの設定をホスト名で振り分ける

gitとかで設定ファイルを管理して,新しいマシンではgit clone hogehogeし,ホームディレクトリにシンボリックリンクを張るだけでいつもの環境になって欲しい.
この時,shの設定は簡単に振り分けられるが,馴染のないhaskellで書かされるxmonadの設定とxmobarの設定をどう振り分けるのか困るのであった.

haskellを普段使いしている人には何のことない話なんだけど…

import System.Posix.Unistd

main = do
    host <- fmap nodeName getSystemID -- ホスト名を host にセット
    -- どれが良いか分からんので,上手くいかない時は以下も試してみる
    -- or host <- nodeName `fmap` getSystemID
    -- or host <- nodeName <$> getSystemID  -- 要 import Control.Applicative
    myStatusBar <- spawnPipe $ "xmobar ~/.xmonad/.xmobarrc_" ++ host -- 文字列の連結

ibusのステータス(現在使っているIME)をxmobarに表示する

ibus のエンジンをコマンドラインで引けるので,簡単に出せるのだった

Config  { commands = [ -- (略)
                     , Run Com   "/usr/bin/ibus" ["engine"] "MyIME" 10
                     -- (略)
                     ]
          , template " XXXXX  %MyIME% XXXXX"
        }

私の環境だと,skkとか出る.
時々,IMEがバグってenとかに陥っている時とかに,ここで確認できることを期待して表示させている.

今回,ibusの状態を可視化することによって,skkが落ちているのではなく,C-jを受け付けない状況にい陥ってるのだと判明.
ibus-daemonの再起動 (ibus-daemon –drx) で直ることも判明.