Vimにおける Esc と Ctrl-cの違い。

はじめに

一般的なキーボードでは押しにくい位置にあるEscキーの代わりとして用いられているCtrl+c
Wikipediaにも

他のモード中に ESC か Ctrl-[ 、Ctrl-c を押すことでこのモードに移行できる。

http://ja.wikipedia.org/wiki/Vim#.E3.83.8E.E3.83.BC.E3.83.9E.E3.83.AB.E3.83.A2.E3.83.BC.E3.83.89

としか書かれていない。(お前が編集しろと言うのはおいといて)


しかしEscCtrl+cは挙動が違うので、代わりに使うのはやめましょう(言い過ぎ)という話。


ノーマルモードへの移行時の前置数値の扱い

インサートモード時にEscまたはCtrl+cを押すとノーマルモードへ移行するが、明確な挙動の違いがある。

  • 5 i - Esc
  • 5 i - Ctrl+c

この2つを試すと挙動の違いが確認できる。
前者(Esc)は5個の[ - ]が入力されるが、後者は1個の[ - ]しか入力されない。
これは、Escではノーマルモードに復帰し(コマンド入力が完了し)、数字の回数繰り返されたのに対し、Ctrl+cではインサートモードを失敗(強制終了)し、ノーマルモードに移行したと認識されたため、数字がキャンセルされ働かなかったためである。(多分ね)


まとめ

とはいっても、ほとんどの場合Ctrl+cは期待通りの挙動をしてくれるはず。現時点でCtrl+cに慣れている人はあまり気にしないのが賢明かもしれない。


・・・ちなみに私はCtrl+[
こちらはEscと全く同じ挙動をする

カレントディレクトリの全ZIPファイルを展開 / 全ディレクトリをzip圧縮

超やっつけ。

1. カレントディレクトリの全ZIPファイルを展開

find . -maxdepth 1 -mindepth 1 -type f -name "*.zip" -exec unzip {} -d {}.files \;


2. カレントディレクトリの全ディレクトリをzip圧縮

find . -maxdepth 1 -mindepth 1 -type d -exec zip -r {}.zip {} \;


追記
ちなみに、findにはexecオプションを複数指定可能で、左から順番に処理されるらしい。

たとえば、1でついでにzipファイルの削除を行いたい場合は

find . -maxdepth 1 -mindepth 1 -type f -name "*.zip" -exec unzip {} -d {}.files \; -exec rm {} \;

とすればいい。

また、-execオプションの代わりに-okオプションを指定すると、実行前に確認が行われる。
先ほどのスクリプトで削除の確認を行いたい場合は、

find . -maxdepth 1 -mindepth 1 -type f -name "*.zip" -exec unzip {} -d {}.files \; -ok rm {} \;

となる。速度を気にするならxargs使うべきだが。


追記2
[*.zip]の他に[*.ZIP]や[*.Zip]等も含ませたいときは -iname が使える。これは大文字小文字を区別しない事をのぞいて -name と同じ挙動をするオプションである。
もっと複雑なファイル名の指定をしたい場合は -regex や -iregex 等が良いだろう。詳しいfindのオプションはmanやココなどを参照。

玄箱Pro + Debian lenny + 2TB HDD 起動まで

現状

現在は、640GBのHDDにDebian etchが入っている。
2TBのHDDを新調したのでコレにlennyを入れることに。
容量が2TBなのが悪夢の始まりだった・・・。

エラーまで

参考にしたのは、このページ

HDD容量が2TB未満の場合はそのままでインストールできる。

ただし、このページは現在フラッシュからブート出来ているという前提で書いてあるので、etchが入っている環境ではフラッシュブートに戻さなくてはならない。

方法は簡単で、このページにある。

このページでは、シリアルコンソールを使って行っている。
シリアルコンソールが無くても可能かもしれないが調べていない。

フラッシュブート時は(変更していなければ)

user root
pass kuroadmin

でログインできる。

先ほどのページの手順ほぼそのままでOKだが、
時刻同期だけはそのままでは出来なかった。記事には、rdateを使うように書いてあるが、なぜかエラーで調整できなかったので、手動で同期。

date "120128452010" #date "MMDDhhmmYYYY"
hwclock -w

多少ずれてるくらいは問題ない(はず)。

。。。

さて、上記サイトに従って2TBのHDDにlennyをインストールした。
普通ならそのままブートできて終わりのはずだ。(実際試しに160GBのHDDに入れてみたら正常に起動した)

・・・が、起動しない。

シリアルで見てみると[Bad MagicNumber]とか出てくる。
どうやらHDDを正常に認識できていないようだ。

ここからが長かった。

いろいろ試したが、最終的に全部無駄だったと分かったので割愛。結論だけ。

エラーの原因

現在、HDDのフォーマット方法には、「MBR(従来方式)」と「GPT(最近出てきた)」の2種類がある。

これについては、Wikipediaが詳しかったので丸投げ

玄箱proのlennyはHDDをGPTでフォーマットする。

一方、玄箱proは基本的にGPTに対応しているので問題なく読み込める。

が、HDDが2TB以上の場合は何故か正常に処理できないようだ。
コレが全ての原因。

解決まで

GPT->MBR変換

GPTが読めないならMBRに変更すればいいじゃない!

ということでGPTをMBRに変更することに。

方法はいくつかあり、データをそのまま残して行う方法もあるようなので使うことにする。

無料ならコレとか有料でいいならコレとかがある。
他にもググればいくつか出てくる。残念ながらLinuxで動きそうなのはなかったが。

方法はソフトによって違うので割愛。

パーティションテーブルの順序の入れ替え

さて、MBRになったし、これで起動するはず!と重い、玄箱Proにセットし起動。

ブートした!→Kernel Panic・・・orz

というわけで、前進はしたがカーネルパニックで起動せず。
メッセージを見ると、/dev/sda1 (/boot) が /dev/sda2を起動しようとしてKernelPanicが起こってるようだ。

インストール時に

/dev/sda1 230M ext2  /boot
/dev/sda2 6.5G ext3  /
/dev/sda3 384M tmpfs tmp
/dev/sda4 1.8T ext3  /home

と指定したので、何が悪いのか分からなかったが、dfしてみると、

/dev/sda1 230M ext2  /boot
/dev/sda2 1.8T ext3  /home
/dev/sda3 384M tmpfs tmp
/dev/sda4 6.5G ext3  /

となっていた。

/home(にマウントされるはずの領域)からブートしようとしてカーネルパニックが起こっていたようだ。

おそらく、MBRに変換したときにずれたのだろうと思い、変更することに。
これを修正するには、fdiskコマンドを使えばいい。(参考)

fdisk /dev/sda

()
Command (m for help): x #特殊機能モードへ。
Expert command (m for help): f #領域の順序を適正化する
Expert command (m for help): w #適用して終了

これで、dfしてみると、正しい順番に直っていた。

起動!

再び、玄箱Proに接続し起動。

ブートした!→initキタ!→ログインキタ!!!

というわけで、長かった(丸2日)戦いも終わり。

現在はサーバの設定と格闘中。

おわり。

android に bash を入れる

参考サイト
http://lbdaberi.blogspot.com/2009/01/androidbash.html
http://d.hatena.ne.jp/shinichiro_h/20081226


ホストOSはUbuntu 9.04(ja)

デフォルトのシェルが使い辛いのでbashを入れることに。
手順は以下
1. クロスコンパイラをDL
ここからクロスコンパイラをダウンロード
>Target OS : GNU/Linux
>Download : IA32 GNU/Linux Installer
ファイル名は[arm-2009q1-203-arm-none-linux-gnueabi.bin]
今回はホームディレクトリにダウンロード


2. クロスコンパイラ導入

$ cd ~
$ ./arm-2009q1-203-arm-none-linux-gnueabi.bin

注)ここで失敗する場合はここを参考に /bin/sh を dash から bashに変更する。(shebang変更はうまくいかなかった)
インストーラが起動するのでインストール(デフォルトの設定で良い)

今回は[~/CodeSourcery] 以下にインストール


3. bashコンパイル

$ wget http://www.busybox.net/downloads/busybox-1.13.2.tar.bz2
$ CC=~/CodeSourcery/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-gcc CFLAGS=-static LDFLAGS=-static ./configure --prefix=/media/disk/system --host=arm-none-linux-gnueabi
注) CCはクロスコンパイラの実行ファイル, prefixはインストール先
$ make
注) 足りないパッケージは適宜入れる。自分の環境では[yacc]が入っていなかった。
$ make install

あとは

adb shell

で入って実行すれば良い

vimで行頭に行番号を付加

SQLに入力するデータを作成中に行の最初にPrimaryKeyとなる連続した数値がほしくなった。
どこかで見たと探してたらmixiVimコミュで発見

:%!cat -n


Win(KaoriYa版)で動いた
行頭(行番号の前)に不要なスペースが入ったけど

:%s/^[ ]*//g

でOK


Linuxでは動かなかったorz
要調査(まぁLinuxだと普通に[cat -n]でいけるだろうけど。)

ドライブ数について

すごくどうでもいい話。


http://itpro.nikkeibp.co.jp/article/COLUMN/20090214/324765/?ST=lin-os&P=1
Linuxでは

sda, sdb・・・sdz

まで使いきった後は、

sdaa, sdab・・・

となる。
kernel2.6.27までは sdzzz までの 1万8278台(26+26^2+26^3) まで
kernel2.6.28以降は 100万台まで使用できる(ただし標準では1万8278台に制限されてる)


//どうでもいいけどもう少し読みやすいソースコードにできないものか・・・




おまけ
http://d.hatena.ne.jp/teamrar/20080621/p1
windowsではZドライブの次が無いらしい。
認識はされるけどドライブレターが割り振られないのかな?
まーそんなに使うやつはそうそういないだろう。たぶん。


//タグに初めてwindowsがついたよ!

Linux + Vimperator2.x で hint時にIMをオフにする

Vimperator 2.x 系では hints 時に前回のIMを起動させる
IMがオンのときはタイプしても飛んでくれない・・・

というわけで、IM をオフにする方法

環境
OS Ubuntu9.04 日本語版
ブラウザ Firefox 3.0.x
Vimperator Vimperator 2.1
IM scim 1.4.6

1. IM側でオフにするショートカットを設定
上記環境の場合、
[SCIM入力メソッドの設定] -> [フロントエンド] -> [ホットキー] -> [終了]
で設定可能。
今回はControl + Shift + space を設定
直には触らないだろうから適当に。。。


2. xvkbd を入れる

# apt-get install xvkbd

今回は Ver3.0 が入った。


3. Vimperatorの設定

noremap <silent> f :!xvkbd -text "\\[Control]\\[Shift]\\[space]"<cr>f

以上でfを押したときにIMがオフになるはず。
ダブルコーテーションの中身は適当に読み替えて。

  • -

javascript

io.system(':!xvkbd -text "\\[Control]\\[Shift]\\[space]"')

を送っても同じなんだけどjavascriptの知識は皆無なんで・・・
誰かお願い。。。