Shell のコマンド実行回数を数える
Posted by yoosee on Debian at 2008-04-19 22:00 JST1 Shell History | Weboo! Returns.
このネタは定期的に出てくるけど、自分では書いたことが無かった気がするので試しに。awk の切り出しは extended history で保存している都合で、切り出しカラムを $2 から $4 に変えている。直近1000回。
% history-all|tail -1000|awk '{a[$4]++ } END{for(i in a){print a[i] " " i}}' |sort -rn|head 95 lv 59 ls 51 edic 50 ruby 48 cd 43 rm 40 mv 38 sudo 33 jdic 32 w3medic, jdic はそれぞれ dic コマンドを 英和・和英 で起動するための alias。
普段使っているzshでは 横着プログラミング 第3回: 履歴マニア にあるように過去の履歴をひたすら蓄積しているので、その約2万回分でカウント。
% history-all|awk '{a[$4]++ } END{for(i in a){print a[i] " " i}}' |sort -rn|head 1431 lv 1212 google 1062 sudo 960 ls 860 edic 694 w3m 688 cd 657 rm 614 mv 569 grepなんだかやけに sudo が多いような…。
ちなみに google と言うのはコマンドラインから w3m に google 検索パラメータを投げるだけのプログラム。
#!/usr/bin/perl my $arg = join("+", @ARGV); my $q=`echo $arg | nkf -w`; system("w3m \"http://www.google.com/search?lr=lang_ja&q=$q\"");コンソール上で生活していると、これが意外と便利。
Linux上で日本語ファイル名をローマ字に変換する
Posted by yoosee on Debian at 2008-02-12 20:00 JST1 日本語ファイル名をローマ字に変換する ruby + kakasi script
Palm TX で使っている pTunes が例によってSDカード上の日本語ファイルを扱ってくれない(id3tagは大丈夫だがファイルリストに表示されない)ので、ディレクトリ名・ファイル名をローマ字に変換するスクリプトを書いた。引数にディレクトリを指定すると recursive に日本語ファイル名をローマ字に変換する。処理には libkakasi を使用して、前段では -w での分かち処理もしている。また空白はアンダーラインに変換。割と破壊的なので利用には注意を。#!/usr/bin/ruby require 'kakasi' require 'find' require 'nkf' def romanize_dir dir Find.find(dir) do |fpath| next if NKF.guess(fpath) == 5 && !/\s+/ =~ fpath # ascii or whitespace begin filename = Kakasi.kakasi('-w', NKF.nkf('-e',fpath)).gsub(/\s*\/\s*/, '/') filename_roman = Kakasi.kakasi('-Ha -Ka -Ja -Ea -ka', filename) filename_roman.gsub!(/\s+/, '_').gsub!(/\^/,'-') rescue puts "failed to convert string #{fpath} - #{$!}:#{$@}" next end begin File.rename(fpath, filename_roman) puts fpath + " to " + filename_roman rescue puts "failed to convert filename #{fpath} - #{$!}:#{$@}" end if(File.directory? filename_roman) puts " + into directory #{filename_roman}" romanize_dir filename_roman end end end dir = ARGV.shift romanize_dir dirWindows だと同様の用途には Flexible Renamer や Ganmigi と言ったものがあるみたい。試してはいない。
リモートサーバに ssh pubkey を登録するワンライナー
Posted by yoosee on Debian at 2008-01-08 13:00 JST1 リモートサーバに ssh pubkey を登録するワンライナー
そういうものが欲しくてちょっと試した。% cat ~/.ssh/id_dsa.pub | ssh remotehost "xargs echo >> .ssh/authorized_keys"で一応うまくはいった。もちろんこの時点では remotehost 側が PasswordAuthentication yes になっている必要はある。xargs を使うのが美しくない気がするが、他にいい手はあるだろうか。
Debian での terminal 環境 utf-8 移行に関する覚書
Posted by yoosee on Debian at 2007-12-29 14:00 JST1 Debian lenny/sid での utf-8 環境移行メモ
サーバを入れ替えたタイミングで、なんとなしに terminal 環境を今までの euc-jp 中心から utf-8 に切り替えたのだが、結構あちこち変更するハメになったので、まだ完璧ではないが設定を記録しておく。文字コードの問題はまだしも、East Asian ambiguous char width 周りの問題が鬱陶しい上にスマートで包括的な解決方法が無い。最新の環境にしたのに Bad Knowhow が増えるというのは困ったもんだ。locale: /etc/locale.gen に以下の行が無い場合は追加して locale-gen を実行
ja_JP.UTF-8 UTF-8zsh: .zshrc
export LANG=ja_JP.UTF-8 export OUTPUT_CHARSET=utf-8 export LV="-Ou8"screen: .screenrc
defencoding UTF-8vim: .vimrc
set termencoding=utf-8 set fileencodings=iso-2022-jp,cp932,utf-8,japan set ambiwidth=doubleemacs21 では mule-ucs パッケージを入れて un-define を require する。emacs22 では無くても utf-translate-cjk-mode があるので(CJKだけなら)一応使える。
emacs21/22: .emacs
(when (<= emacs-major-version 21) (require 'un-define)) (set-language-environment "Japanese") (set-terminal-coding-system 'utf-8) (set-keyboard-coding-system 'utf-8) (set-buffer-file-coding-system 'utf-8) (set-selection-coding-system 'utf-8) (setq default-buffer-file-coding-system 'utf-8) (prefer-coding-system 'utf-8)これで概ね問題ないが、ambiguous char width を回避するために Emacs22 + UTF-8 における文脈依存な文字幅の問題について のような設定を入れておく。
w3m
特に設定しなくても LANG(LOCALE) に追従して「表示用文字コード」が Unicode (UTF-8) になってくれた。しかし画面表示とカーソル位置がずれていたり画面にゴミが残ったり(再描画すると直る)と、鬱陶しいことになっている。
Gnome, gnome-terminal
特に設定しなくても .xsession から X を LANG=ja_JP.UTF-8 で起動したら対応した。ただ困ったことに、gnome-terminal で utf8 の EastAsian Ambiguous char width 問題の解決策が見当たらない。VTE_CJK_WIDTH を設定する方法は etch では機能せず。仕方がないので xterm -cjk_width ないし mlterm -a 2 の方を使う方針にする。mlterm の方が antialias が綺麗なんだけど、URL link 等の右クリックメニュー機能が無くなったのがちょっと痛い。
PuTTY on Windows
設定から Window > Transrations を [UTF-8] に、Treat CJK ambiguous character as wide をチェック。PuTTY Tray を使っているけどこれで特に問題は無い。CJK以外の多国語を使う場合・terminal の文字コードが混在する場合には問題が出るのかもしれない。
参考
w3m は terminal 上でも captcha 画像の文字が(多分)読める
Posted by yoosee on Debian at 2007-09-30 22:00 JST1 w3m + cacaview で captcha 画像の文字が読める
putty 上の w3m で某所 blog を読むに、コメント時に captcha 認証を求められ、X 上ならともかく画像が表示できない terminal 上で画像認証は鬱陶しいなと思ったが、なにげに cacaview (libcaca) がアスキーアートで十分可読な表示をしてくれた。ちなみに画像の表示は画像部分の上にカーソルを持っていき I を押す。libcaca は 動画の再生もこなしていたし、なんとも恐るべし。コマンドラインで日本語ファイル名を扱う際のジレンマ
Posted by yoosee on Clip at 2007-05-28 22:00 JST1 void GraphicWizardsLair( void ); // コマンドラインインターフェースとQWERTYキーボードは英語圏ユーザーには良いが、日本語を扱うのはまどろっこしい
最近の Linux, *BSD ならば utf-8 や euc-jp でファイル名を扱ってもさほどトラブルになることはないし、samba との関係や音楽ファイルの ripping でもファイル名を日本語にすることは昔に比べて増えていると思うのだけど、いざそうなって思うのはコマンドラインから日本語を入力してファイル操作することの繁雑さ。CLI 使いなら Tab(ないし何かのキー) でのファイル名補完は当然ながら常套手段と言う以上に指に染み付いたアクションだろうが、英語ファイルなら 1,2 文字 + Tab であらゆるファイルを候補に挙げられるのに対し、日本語ファイルでは「IMEをONにする」→「ファイル名の先頭を構成する漢字やかなを数文字入力」→「(漢字やカタカナの場合)変換」→「Tab」と言う非常に繁雑な手順を踏む必要がある。
ならば日本語ファイル名を使わなければいいという話なのだけど、単純に ls 等でファイル名を確認する場合には「ローマ字日本語」と「漢字かな日本語」の読みやすさの違いには当社比17倍くらいの差があるわけで、なかなか悩ましい。
現実解としては「日本語ファイル名」+「zsh の補完機能に migemo」と言う形が良さそうかと思うんだけど、誰かそうした実装ないし使い方をしている人はいないだろうか。
find 道は凄腕システム管理者への近道
Posted by yoosee on Debian at 2007-03-31 22:00 JST1 404 Blog Not Found:勝手に添削 - find(1)
find の話題が盛り上がっているようだが、「last-modified が30日以上前のファイルを特定ディレクトリに退避」なんて処理にはよく find を使う。特に spam や virus 等、一時保存してその後は破棄するようなデータには cron で仕掛けておいても便利だ。find .spam/cur/ -daystart -mtime +30 -exec mv \{\} ~/tmp/oldspam/ \;ファイル名検索には -name だけでなく -regex や -iregex で正規表現を指定するのも便利なことがある。また -exec に関しては、代わりに -ok を使うと exec 前に実行の確認が出来るので覚えておくと良い (RETだけだと処理がスキップされる)。
ところで find に限らず CLI のコマンドは、同じ事をやる方法が複数存在する事が多い。実際問題として「より効率的な専用手段を覚える」のと「効率は多少落ちてもより汎用的な手段を覚える」のどちらがいいかというのは、限られた時間の中で常に付きまとう問題だろう。個人的には汎用的な方法を覚えた上で専用手段に手を伸ばすのが良い道だろうと思う。とはいえファイル検索に関しては find 自体が「汎用性の高い手段」だというのも否めないので、特にシステム管理者は精通して損はない。例えばアカウント管理をする人は -uid -nouser -perm あたりの存在を覚えておくと便利な事もあるだろう。
2 zsh の履歴機能と補完機能を有効に使おう
上記のように、往々にして find の構文は複雑になる事が多いし、また似たようなことをしばらく経ってから再度やることも多い。そうした際に非常に役に立つのは過去の履歴なのは言うまでもない。zsh の場合、横着プログラミング第3回: 履歴マニア にあるように HISTSIZE と SAVEHIST を 100000 程度残しておくのは将来の自分の手間を軽減するという意味で非常に役に立つ。また zsh の compinit を使えば find -<tab> のようにオプション名の補完リストを出すことも出来る。3 余談: ls -l の結果を更新時間順(の逆順)に表示
これとは直接関係ないが、タイムスタンプを元にしてファイルを見つけ出す話関連で、しばらく前にどこかの blog で見かけた ls -l を last-modified 逆順に並べる alias を紹介。alias ll='ls -lAFtr'これで ll と叩くと、最近編集されたファイルがリストの一番下の方に出てくる。特にこれは /var/log なんていう、ファイルが大量で、かつ最新の更新があるファイルの重要度が高い場合に重宝する。例えば普通に ls -lF /var/log/ だと
# ls -lF /var/log/ .... -rw-r--r-- 1 root root 0 2007-02-05 14:12 uucp.log -rw-rw-r-- 1 root utmp 202752 2007-03-31 18:00 wtmp -rw-rw-r-- 1 root utmp 366720 2007-03-07 20:14 wtmp.1 -rw-r--r-- 1 root root 12063 2006-07-01 06:52 wtmp.report drwxr-xr-x 2 root root 4096 2007-02-05 13:58 xfer/となり、肝心の部分はスクロールで流れてしまう。だが ls -lAFtr ならば
# ls -lAFtr .... -rw-r----- 1 root adm 1867000 2007-04-01 00:54 messages -rw-r--r-- 1 root root 9217099 2007-04-01 00:59 spamd.log -rw-r--r-- 1 root root 246828 2007-04-01 01:05 sensord.rrd -rw-r----- 1 root adm 150206935 2007-04-01 01:08 mail.log -rw-r----- 1 root adm 33062997 2007-04-01 01:09 auth.log -rw-r----- 1 root adm 15799201 2007-04-01 01:09 syslog -rw-r----- 1 root adm 3486279 2007-04-01 01:09 daemon.logきっちり最近変更があったファイルが最後の方に出てくれる。
CLI 2.0 時代の到来
Posted by yoosee on Debian at 2006-12-11 23:42 JST1 Command Line Interface 2.0
Binary 2.0 あたりに触発されて、と言うかネタとして単語を思いついただけだけど。正直まわりを見ていると、未だに shell history の incremental search を使っていなかったり、tab による補完を効かせてなかったり、はたまた 1台のサーバ上で複数の shell を立ち上げるために TeraTerm を 5個も 6個も立ち上げていたりと言う人をエンジニアの中でも結構見掛ける。
Bad Knowhow だと言われようとも、ssh, screen, w3m, zsh, vim, emacs あたりの便利な使い方は確実に人生を豊かにしてくれる。その上、なんと コマンドラインはモテるのである。まさに時代は CLI と言えよう。Hacks になったら面白いかなと思ったけど、個々のノウハウが膨大かつ広範囲だから難しいかな。好きな人は多そうだけど、その分だけ収集もつかなさそう。
無駄に凄い libcaca のカラーアスキーアート動画再生
Posted by yoosee on Debian at 2006-03-20 23:42 JST1 カラーのアスキーアートライブラリ libcaca
しばらく前になるが、w3m で web を閲覧中、動画のリンクをクリックした際に、ダウンロードが開始することを期待していた目の前で、突如アスキーアートの動画再生が始まった。その時はその時で驚いたものだが、今日ふと話題に上がったので試してみると、今どきのアスキーアート動画再生はカラーで再生されるらしい → VLC で再生したアスキーアート動画を撮影したもの (Xvid 617KB)IRC で教えて貰ったところによると、画像の AA化で有名な aalib とは別の、libcaca - Colour AsCii Art library と言うものを使っているらしい。vlc では libcaca_plugin.so と言うプラグインで機能を取り込んでいるようだ。mplayer だと mplayer -vo caca として使える。