LVM つかっていない仮想マシン(virtualbox)のディスクを拡張する

LVM 使わずに作成した virtualbox 仮想マシンのディスクを、 ちょっとずつ必要に応じてサイズ拡張しているといつも手順を忘れるのでメモしておく。

vmdk 形式ではリサイズできないので vdi フォーマットに変換する

ファイルを作成するのでそこそこ時間がかかる

VBoxManage clonehd gentoo-disk1.vmdk gentoo-disk1.vdi --format VDI
作成した vdi ファイルの論理サイズを拡張する

実際にファイルサイズを拡張するわけではないので一瞬でおわる。 MB 単位で指定するので、ここでは 16 GB にしている。

VBoxManage modifyhd gentoo-disk1.vdi --resize 16384
仮想マシンの仮想ディスクを付け替える

新しく作成した vdi 形式のディスクへ付け替える。

f:id:nishikawasasaki:20131219003209p:plain

おなじ SATA ポートで ↓
つけかえる

f:id:nishikawasasaki:20131219003214p:plain

パーティションを拡張する

ディスクは拡張しても OS からわからないので、パーティションを拡張する。 fdisk コマンドで行うが、「拡張」オプションはないので消してから再作成する。

ディスク自体が拡張しているか確認する。

fdisk -l
Disk /dev/sda: 17.2 GB, 17179869184 bytes, 33554432 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x2147bbb1

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048      206847      102400   83  Linux
/dev/sda2          206848     4401151     2097152   82  Linux swap / Solaris
/dev/sda3         4401152    31457279    13528064   83  Linux

上の状態だと /dev/sda3 が拡張したい領域なので一度消す

fdisk /dev/sda
Command (m for help): d
Partition number (1-4): 3
Partition 3 is deleted

消えている

Command (m for help): p

Disk /dev/sda: 17.2 GB, 17179869184 bytes, 33554432 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x2147bbb1

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048      206847      102400   83  Linux
/dev/sda2          206848     4401151     2097152   82  Linux swap / Solaris

再作成

Command (m for help): n
Partition type:
   p   primary (2 primary, 0 extended, 2 free)
   e   extended
Select (default p): p
Partition number (1-4, default 3): 3
First sector (4401152-33554431, default 4401152): 
Using default value 4401152
Last sector, +sectors or +size{K,M,G} (4401152-33554431, default 33554431): 
Using default value 33554431
Partition 3 of type Linux and of size 13.9 GiB is set

確認

Command (m for help): p

Disk /dev/sda: 17.2 GB, 17179869184 bytes, 33554432 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x2147bbb1

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048      206847      102400   83  Linux
/dev/sda2          206848     4401151     2097152   82  Linux swap / Solaris
/dev/sda3         4401152    33554431    14576640   83  Linux

保存して終了

Command (m for help): w
The partition table has been altered!
ファイルサイズを拡張する

パーティションが拡張できたらファイルサイズを拡張して OS に認識させる。

resize2fs /dev/sda3
確認
df -h

設定したサイズに増えていれば完了。

ホストマシンのディスクを圧迫するので不要になった vmdk ファイルを捨てる。

VirtualBox の Gentoo で音を出す

サーバー監視と Emacs 用の Gentoo on VirtualBox でブラウザ起動したら 音を出るようにしていなかったので作業メモです。

基本的には

ALSA - Gentoo Wiki: https://wiki.gentoo.org/wiki/ALSA

を参考にして進めていけば良いです。

何点か補足するのが下記です。

1. ドライバがカーネルに組み込んであるか確認

なにはさておきドライバが無いと音は鳴りませんので、 上記の Gentoo Wiki の

Kernel You need to activate the following kernel options:

Kernel configuration

の部分を参考に設定されているか確認します。 もし Wiki のようになっていなければ設定を変更してカーネルをリビルドしましょう。

# root
genkernel --bootloader=grub --menuconfig all
2. OS 起動時に alsasound を起動する

alsa-utils を emerge したら、単純に

# root
rc-update add alsasound boot

するだけです。忘れてたので……。

3. audio グループに自身のユーザーを追加する

この時点で root ユーザーは alsamixer コマンドで音量設定等出来るはずですが root 以外のユーザーで alsamixer を実行すると

cannot open mixer: No such file or directory audio group

と表示されて失敗してしまいます。

これを解決するためには audio グループに自身の一般ユーザーを追加します。

# root
gpasswd -a 追加するユーザー名 audio

usermod -G するとうっかりしがちなので gpasswd -a の方が良いと思います。

追加後はさらにログアウト・ログインも必要ですので注意。。

4. 確認

あとは alsamixer で音量調整をしながら

speaker-test -t wav -c 2

で音が出ることを確認して完了です。

fish shell と percol で良く利用するディレクトリに飛ぶ

なんとなく fish に移ってみました。

これまでよく使うディレクトリに移動するために zsh + autojump で j として使っていたのですが、 fish のタブ補完では j 入力後にどんな候補があるのか補完してもらえず どうしたものか考えていました。

コマンド履歴の補完は mooz さんの percol

mooz/percol https://github.com/mooz/percol

を使って

bpinto/oh-my-fish https://github.com/bpinto/oh-my-fish

の中にあった percol_select_history を利用することにしました。

じゃあということで fish で percol を使って 良く利用するディレクトリに飛べるよう function を作ってみました。

zsh 用は

percol で z / autojump のようにディレクトリ高速ジャンプ - Slip Ahead Logging http://stillpedant.hatenablog.com/entry/percol-cd-history

にありますのでこれを fish 用に改造して

set CD_HISTORY_FILE $HOME/.cd_history_file # cd 履歴の記録先ファイル
# percol を使って cd 履歴の中からディレクトリを選択
# 過去の訪問回数が多いほど選択候補の上に来る
function percol_cd_history
  sort $CD_HISTORY_FILE | uniq -c | sort -r | sed -e 's/^[ ]*[0-9]*[ ]*//' | percol | read -l percolCDhistory
  if [ $percolCDhistory ]
    # commandline 'cd '
    # commandline -i $percolCDhistory
    echo 'cd' $percolCDhistory
    cd $percolCDhistory
    echo $percolCDhistory
    commandline -f repaint
  else
    commandline ''
  end
end

# キーバインドの追加 ############################################
function fish_user_key_bindings
  bind \cx percol_cd_history
  # 以下他のキーバインド
end

加えて cd 系のコマンドで return する前に

echo $PWD >> $CD_HISTORY_FILE # percol_cd_history 用

してやると、ひとまずやりたいことが出来るようになりました。

cd コマンド実行時に移動先のパスを $CD_HISTORY_FILE へ書き出して保存しています。 cd した後に ls してほしいので

commandline -f repaint

が無いとキーバインドから実行した場合に画面が止まるようでした。

また、上の function では percol で選択するとすぐに cd していますが、 if 文の中のコメントアウトを逆にすると 入力だけしてくれて cd を実行するにはエンターが必要なように変わります。 履歴から補完して入力後に編集する機会が多いのであれば こちらを利用した方が便利なように思います。

    commandline 'cd '
    commandline -i $percolCDhistory
    # echo 'cd' $percolCDhistory
    # cd $percolCDhistory
    # echo $percolCDhistory
    # commandline -f repaint

Keysnail のプロンプトなどで自動的に日本語入力をオフに(E4X 廃止対応版)

以前は .keysnail.js 中で

style.register(<><![CDATA[
  #keysnail-prompt-textbox *|input {
  ime-mode : inactive !important;
  }
]]></>);

のようにしてたのだけれど、Firefox 21 から E4X を廃止(予定)、 20 からはデフォルト利用不可にしたのでこのままではエラーが出るようになりました。

E4X | MDN https://developer.mozilla.org/ja/docs/E4X

ということで

style.register(['#keysnail-prompt-textbox *|input {',
'ime-mode : inactive !important;',
'}'].join("\n"));

と書き直してやれば問題なくなります。

変換にはこちらを利用いたしました、ありがとうございます!

http://logroid.blogspot.jp/2012/10/javascript-cdata-converter.html

git push での容量制限エラー

発端

とある大きな内容を git push しようとすると 見慣れないエラーで失敗しました。

error: RPC failed; result=22, HTTP code = 411
fatal: The remote end hung up unexpectedly
fatal: recursion detected in die handler

解決策1

411 なので送信量の指定がきちんとされていない?と思いつつ、 調べてみると gitlab のフロントにいる nginx が受けつけられる サイズの最大量を超えてしまっていたよう。

これを解決するために nginx の gitlab 用設定に

client_max_body_size 100M;

を一時的に追加しました。

解決策2

しかしそれでも同じエラーが発生していたのでさらに調べたところ、 git が送信するファイル量が多すぎるとこのエラーが発生しするとのこと。 解決策は、送信するファイルのバッファ総量を変更することだそう。 この総量の設定値はローカルリポジトリ毎にもっているので

git config --global  http.postBuffer 524288000

として変更しました。 いくつかのリポジトリで発生したため global を付けて設定しています。

こんな設定値があるのかーと思ったので備忘録として書いておきます。

参考にしたページ

eshell 便利

eshell でリモートサーバに入って作業をしていると

/

からディレクトリを辿りたくなることがあります。 深い作業ディレクトリから /etc 下のファイルを見に行きたい時などです。

ここで

cd /

としてしまうと、リモートの / ではなくて 当然、自マシンの / へ移動してしまいます。

かといって相対パスで ../../../ なんてやるのも面倒なので リモートサーバの / まで移動する eshell 用コマンド "cd/"を 適当 に作っておきました。

;; リモートホスト / へ移動
(defun eshell/cd\/ ()
  (interactive)
  (let* ( (host-name (concat
                     (car (split-string (eshell/pwd) ":/"))
                     ":/")))
    (eshell/cd host-name)
    ))

// ( を2つ続けると、はてなの markdown で注釈になるのか。。

ちなみに eshell で helm を使うととても便利です。

helm-eshell-history を使うと eshell のコマンド履歴を helm で絞り込み → 入力できます。

コマンドを一部入力した状態で実行すると、 入力した部分に一致する候補が絞り込まれた状態で helm が起動するので便利です。 eshell 標準の eshell-previous-matching-input-from-input と同じような機能ですが、 helm で絞り込みが効くのでより便利だと思います。

helm-esh-pcomplete を使うと pcomplete の補完を helm で選択して入力することができます。 pcomplete をそのまま使うよりもはるかに便利だと思います。 pcomplete を使っているので、リモートサーバの上でも補完が可能です。

ちなみに helm-esh-pcomplete で補完を行うと相対パス絶対パスに変換されて入力されます。 これにより、 eshell の cd を使った移動履歴を helm-eshell-history で絞り込む際に 履歴が全て絶対パスで記録されているため カレントディレクトリを意識せずに cd の履歴を再利用することができます。

"cd " と入力して helm-eshell-history を実行することで、 eshell は autojump 無しで移動したことのあるディレクトリに どんどん移動することができます!!

よく使うので eshell-mode-hook で

(define-key eshell-mode-map (kbd "M-p") 'helm-eshell-history)
(define-key eshell-mode-map [(tab)] 'helm-esh-pcomplete)

と割り当てて使っています。

auto-complete での eshell 補完も設定しているので 簡単な移動は auto-complete で、 リモートなどへの遠い移動や履歴からの補完は helm でと使い分けています。

eshell 便利です。

// とは言うものの、素直に zsh 使った方が良いことが多いですが……

Ensime が標準の auto-complete 設定を無視するのを防ぐ

Scala 用の Ensime には auto-complete(AC) が同梱されています。

デフォルトだと Ensime 同梱の AC が有効になっています。 そのため自分で AC をインストールしていても、 ensime-mode が有効になると同梱の AC によって 自分でインストールした AC の設定が全て無視されてしまいます。

これでは他の scala-mode のバッファからの補完などが効かず少し鬱陶しいため、 下記の設定の + の部分を加えてください。

(require 'ensime)

+ ;; ensime 同梱の auto-complete を使おうとするのを止める
+ (setq ensime-ac-override-settings nil)

(add-hook 'scala-mode-hook 'ensime-scala-mode-hook)

上書き設定するかどうかが設定可能なので、 上書きしない "nil" をセットするだけです。

Emacs で同名のバッファがあった時の uniquify の設定

Emacs で同名のバッファがあった時には uniquify を使うと パスの一部をバッファ名に付与して表示してくれるので見分けが付くようになります。

例えば、

  • aaa/bbb/test
  • 111/bbb/test

というパスでファイルがあったとします。

これは通常

  • test<1>
  • test<2>

と表示されますが、 uniquify を使って

(setq uniquify-buffer-name-style 'forward)

とやると

f:id:nishikawasasaki:20130203024040p:plain

といった感じです。

区別のためのディレクトリ表示を test<111>のように <> 囲みで表示するのは

(setq uniquify-buffer-name-style 'post-forward-angle-brackets)

と設定してやります。

と、この設定は良くみるのですが、 この状態だと間の bbb が省略されてしまいます。

"..." のような省略記号があるとまだ分かりやすいのですが パス表示の中間部が無かったことのように表示されてしまうため、 個人的には分かりにくいのです。。

これを解決するには

(setq uniquify-strip-common-suffix nil)

としてやります。

これでパス風表示の場合は

f:id:nishikawasasaki:20130203024846p:plain

<> 囲みの場合は

f:id:nishikawasasaki:20130203024153p:plain

と全て表示されてわかりやすく、そして helm/anything で絞り込みの対象になります。

深いディレクトリになった時おそろしいことになりそうだけれど、 とりあえずはこっちの方が好み!

Facebook で Keysnail の jk を無効にする

facebook がキーボードの j/k で移動出来るようになって Keysnail とぶつかってしまう。。

仕方ないのでKeysnail側で site-local-keymap を使って

local["^https?://www.facebook.com/"] = [
    // navigation
    ['k', null],
    ['j', null]
];

しといた。。

追記

そんなことしないでも、KeySanil プラグインの KKK を使って Facebook の用意したキー操作全部無効化してしまえば良いことに気がつきました。

plugins.options["kkk.sites"] = ["^https://([0-9a-zA-Z]+\\.)?github\\.com/",
                                "^https://([0-9a-zA-Z]+\\.)?facebook\\.com/",
                                "^https://([0-9a-zA-Z]+\\.)?google\\.co\\.jp/",
                                "^http://([0-9a-zA-Z]+\\.)?tumblr\\.com/"];

ついでにいろいろ追加しています。 これですっきりです。

multiple-cursors.el を使おう

年の瀬ですね。 来年、良い年になると良いですね。

さてちょっと話題となった multiple-cursors.el の紹介です。 github のドキュメントや動画できちんと使い方が説明されていますので そちらもご覧ください、というか是非元ドキュメントにあたってください。

magnars/multiple-cursors.el · GitHub
    https://github.com/magnars/multiple-cursors.el
    git://github.com/magnars/multiple-cursors.el.git

動画はこちら

Emacs Rocks! - http://emacsrocks.com/e13.html

multiple-cursors.el ってなに?

その名の通り、カーソルキーを複数作成することが出来ます。 この説明だけでは何が嬉しいのか分かりにくいですが嬉しいことです。

まずこんなテキストがあったとします。

f:id:nishikawasasaki:20121231090431p:plain

"cd" という文字列を一気に修正したくなった場合に、 "cd" をリージョンに入れます。

f:id:nishikawasasaki:20121231090839p:plain

ここで multiple-cursors.el の mc/mark-all-like-this を実行します。

f:id:nishikawasasaki:20121231090943p:plain

リージョンと一致する要素、ここでは全ての "cd" がリージョンに入り、 "cd" の後ろにカーソルが追加されました。

リージョン選択されている状態ですので、 このまま文字を入力すると全てのリージョンに入力が行われて 一気に編集することが出来ます。 "cd" を "hogehoge" に編集するとこんな感じです。

f:id:nishikawasasaki:20121231091309p:plain

ここまでであれば magnars 氏が別に用意されている mark-multiple.el でも可能です。 しかし multiple-cursors.el はここからが本領発揮です。 マルチカーソルというくらいですので C-a して行頭に移動してそれぞれの行に文字列を追加したり……

f:id:nishikawasasaki:20121231091505p:plain

そのまま C-e して行末に追加することも可能です。

f:id:nishikawasasaki:20121231091603p:plain

もちろん、行頭行末でなくても C-f や C-b で全てのカーソルを1文字ずつ移動することも可能ですし、 C-n や C-p も出来てしまいます。

用意されているコマンド

multiple-cursors.el には、どのようにカーソルを追加するかが 異なるコマンドが定義されています。 その内よく使いそうなものをピックアップしてみます。

mc/mark-next-like-this と mc/mark-previous-like-this

リージョン状態で実行すると、リージョンと同じ内容の位置にカーソルを追加します。 next の方で現在行より下の候補を、previous で上の候補です。

リージョンが存在しない場合は、現在のカーソル位置の丁度上下に新たなカーソルを追加します。 文字列の置き換えをしないのであれば、リージョン選択せずにカーソルを増やして一括編集が可能です。

行頭と文頭のインデントのスペースを一括で取り除く場合に 矩形選択して削除という方法が考えられますが、 行頭にカーソルを置いて mc/mark-next-like-this で下の行に次々カーソルを追加すれば あとは C-d で全ての行のインデントを1つずつ消していけますね。

こんな風に設定しています。

;; リージョンと一致する箇所で現在行より下にあるもの1つを追加
(global-set-key (kbd "C->") 'mc/mark-next-like-this)
;; リージョンと一致する箇所で現在行より上にあるもの1つを追加
(global-set-key (kbd "C-<") 'mc/mark-previous-like-this)

mc/mark-more-like-this-extended

上の項目の拡張版です。 矢印キー↑↓を使ってリージョンと同じ内容へのカーソル追加が行えます。

← で要素を1つ飛ばしでカーソルを追加出来ます。 ところどころ編集したく無い要素がある場合に便利ですね。

もし間違えて要素を追加してしまった場合は → キーで直前の追加をキャンセルして戻ることが出来ます。 何度も可能です。

mc/mark-all-like-this

上記の例で紹介済みですがリージョンに一致する項目全てにカーソルを追加します。 リファクタリングで変数名を変えたり……なんて場合に便利です。

mc/mark-sgml-tag-pair

HTML などで、対応するタグにカーソルを追加します。 開始タグで mc/mark-sgml-tag-pair すれば閉じタグに、 閉じタグで mc/mark-sgml-tag-pair すれば 開始タグにカーソルが追加されますので 対応するタグを一緒に編集することが出来ます。

mc/mark-all-like-this-dwim

DWIM、良い感じにカーソルを追加してくれます。 通常時は mc/mark-all-like-this のように動作し、 タグ上で使うと mc/mark-sgml-tag-pair のように動作するスマートな子です。

その他

multiple-cursors.el でカーソルを追加中はモードラインに何箇所追加したかが "mc:n" (n は整数)で表示されています。

また、表示している領域外にある要素の追加を確認したい場合 C-v と M-v で通常の画面送りではなく、要素をひとつずつ確認することが出来ます。

ちなみに リージョン選択が便利になる er/expand-region との併用が作者からオススメされています。

おわりに

どうでしょうか。 使いこなす方に頭を使いそうな気がする elisp ですが 状況によっては大変便利だと思います。

それでは良いお年を、また来年!!