トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

Linux のバックアップ(No.41)


Linuxを使う上でのメモ、技、コマンドなど


vimを使い倒す

vimエディタについてのメモ。
結局一番役に立つのは:helpを打つことだと学ぶ。しかし、あるコマンドが役に立ったこと自体を忘れるのでメモは必要なのである。
参考にさせていただいているサイト。ありがたや!
JVim3非公式ガイド

移動関係

Ctrl+f,Bも便利だが、Ctrl+u,dも重宝する。
画面のスクロールでは、カーソル位置から上下に画面を切り替えることのできるz(Return),z-が便利。

新しいタブでファイルを開く

以下のように

:tabnew [filename]

と打てば新しいタブを開ける。
タブの切り替えはgtとか:tabn,:tabpでいける。2番目のタブに移動したければ2gtとかすれば一発で移動可能。戻るときはgT。
タブを閉じるときは、:tabcloseでカレントタブ以外を閉じるときは:tabonlyでOK。:taboとかで省略可。

readで別ファイルの内容を流し込む

他のファイルをテンプレにしたいときに、まず今のファイルにコピーしたいときがある。そういうときは

:read [ファイルへのパス]

とすればOK。引数を与えないときには自分自身を挿入する。

このreadはたとえば次のように応用できる。

:read !ls

これでlsした結果がカレントポジションにコピーされる。

参考にさせていただいた場所。
名無しのvim使いさん

マルチウィンドウを使いこなす

こちらに記事があってわかりやすかった。
単純に違うファイルを開いてコピペするときに便利です!

コピペしたら行ずれまくりの対処

忘れそうなのでメモ。
viを使ってて、たまに他のところからコピーしたときに行がずれまくることがある。これはautoindentのせいで改行がくるたびにindentを入れていることが原因なので、

set noautoindent

でOK。その後autoindentを戻したければ

set autoindent

で戻る。実は次のように省略できる。

se noai
se ai

カンタン、カンタン!

まとめてコメントアウト

行頭にまとめて//を入れたいときとかはこうする。

Ctrl+v
移動
shift+i
入れたい文字
Esc

逆に行頭だけ消したいときは

Ctrl+v
移動
d

でOK!

範囲選択してインデント

vで文字ごと、Vで列ごとにビジュアル的に範囲選択できる。その後、>>でまとめて右シフト。
この右シフトの幅を変えたいときには

:set shiftwidth=2

などして変える。

いろいろカスタマイズ

こちらの記事が面白かった。
Ctrl+FとCtrl+Bのラクチンさは半端じゃないと思います。

ハイライトをEsc二回で消せる、という

nmap <Esc><Esc> :nohlsearch<CR><Esc>

を真似した。すごく良い。 その他いろいろ参考になるページをみつけた。
エンジニア知識共有会
あと、挿入モード時のショートカット。Esc=Crtl+[に感動。 JVim3非公式ガイド
JVim3非公式ガイドtoppage

あとFirefoxの操作をVimライクにできるadd-onがある。馴れたらすごく便利だと思う。
Vimperator

powerdotのメモ

ぱわぽを買うお金がないので、無料でカッコよくスライドが作れないかなぁと探してみた。
TeXでスライドを書くためのclassがあるようで、powerdotといってこちらで公開されている。導入はここを参考にさせていただく。マニュアルもあるみたいで、日本語訳したものを入手した。ひとまず作ってみよう。

いわれるままに

powerdot
listings
enumitem 
xcolor

のstyファイルをdownloadしてくる。
自分環境でTeXのstyleファイルを設定したいので、自分/usr/sty/ディレクトリを作って、.cshrcに

setenv TEXINPUTS  自分/usr/sty//

を追記しておく。これで自分/usr/sty/以下のサブディレクトリまでstyファイルを探しに行ってくれる。
環境変数が通ったら、その場所でinsファイルなどからstyファイルを作る。

platex xcolor.ins

とかで一発OK。。。らしいが、そうはならない。
悩んでここを発見。docstripやxkeyval、pstricksを加えたりした。でもよく分からない。

platex aaa.ins

をしても、

* First type the extension of your input file(s):  *

とか、何やら不可思議なことを訊かれる。よくわからん。たぶん適当に答えればめでたくstyファイルをはき出してくれるんだろうけど、その適当が分からん。もしかして英語を読めてないだけ?

powerdotを使うには、xkeyval、pstricks、xcolor、enumitemのパッケージが必要となる ので、もしなかったらインストールしておいてください。
なお、上記の手順はProsperをインストールしてある前提で書いています。
powerdotを正常に動作させるには、CTANからダウンロードしたバージョン1.24以上prosper.clsが必要です。

とのことなので、prosperも追加。
colortblとextsizesもいるという噂が浮上。なんかよく分からなくなってきた。

もうだめだ…。 がんばれ未来の自分!
./usr/sty/以下にすべてあります。

shell memo

いろんなshell scriptの使いかたとかの備忘録。
bash,tcshellの場合があるので、注意すべし。

AWKについて

shellに入れて良いのか分からないど・・・スクリプトを書くときに、簡単な文字列処理や変数を使った計算を行いたいときに重宝する。
参考ページ...
AWKの第一歩
AWKの使い方

計算機のデータバックアップをとる

実験室のマシンのバックアップをとる。手法はディスクサーバーをautofsでマウントしておいて、定期的に

cp -a

を実行するだけ。
そのために

vi /etc/auto.master

を編集してマウント、crontabで定期的にスクリプトを実行する。
cpするときaliasで

cp -i

をきられているので、それを無視するために

\cp -a

とする。

findを使いこなす

バシャログさんの記事から。使えたらかなりよさそう。正直あんまり使いこなせてないので、どんどん楽したい。

DNSサーバーに問い合わせてIPアドレスを表示させる

そのまま。

nslookup www.google.co.jp

とすれば、一番近くのDNSサーバに聞きに行く。

同一ディレクトリ内の画像を結合してpdfファイルに出力する

スクリプトを書いてみた。
fileconvlife.sh
使い方は新しいディレクトリを作ってそこに結合したい画像ファイルをまとめて、たとえばその形式がbmpなら

. convlife bmp

でOK。
アルファベット順にページを作るので、順番は名前を変えてもらえばいいです。 サイズは適当に横だけで600指定しているけど、適当に変えてもらえればOKだと思います。
最後にpsファイルを全消去してしまうので、ディレクトリ内にpsファイルは置かないようにしましょう。

ちょっと改造。引数にファイル形式を指定するのを忘れるので、それをフォローするようなerrorと、あとpsファイル全消しの恐怖をぬぐうための対策。名前も変更。コマンドpathきって使ってます。以外と便利!
filemogrify2pdf

やっぱりサイズを調節したいので、第二引数にサイズを指定できるようにした。
filemogrify2pdf_2

usage:./mogrify2pdf [picture type] [output size(defalt=600)]


epsファイルはわざわざpsにしなくてもgsコマンドで変換できるし、そのほうが画質も良いので回避した。また、epsファイルとかがうまくgrepできなくて同じページが2つ出力されることがあったのを回避した。lsのときに-vオプションをつけて、数字が二桁になっても順番になるようにソートを最適化。
epsじゃないととにかく画質が悪いので、なんとかしたいなぁ・・・。あとページ配置が変なので、これを調節したい。
filemogrify2pdf_3

コマンドラインでディレクトリを指定してファイルブラウザを起動する

CentOSのファイルマネージャはNautilusを使っている。ので

nautilus パス

とするとGUI的に開ける。

ディレクトリ内の画像ファイルをまとめてconvert

したいなぁと思って、誰かやってるだろと思って検索してみたらやっぱりhitした。 PCバイクさん
けど、mogrifyというコマンドがあるんだって。
psファイルepsに変換したいときは、

mogrify -format eps *.ps

でOK!
UNIX入門さんのページに使い方があった。超便利!

cshスクリプトのメモ

コマンドやシェルスクリプトが終わったということを確認するための、終了コードというものがある。
終了コード

sftp

sshを利用した技のひとつにsftpがある。これはそのまま「secureなftp」の意味でリモートホストにいるような気分でローカルマシンに"download"もしくは"upload"できる。便利な技として、putとgetがある。

put コピー元のファイル名 コピー先のファイル名

でローカルホストからリモートホストにファイルをコピーする。

get コピー元のファイル名 コピー先のファイル名

でリモートホストからローカルホストにファイルをコピーする。 またlsでリモートホスト、llsでローカルホストに大してlsを行えたり、同じ要領でcdができたりもする。
使いこなせば便利そう。
このページが参考になった。SSHマニュアル

pdfimages

pdfファイルから画像ファイルのみを抜き出す技。
pdfimagesというシェルがあって、これで

pdfimages input.pdf output

と指定してやるだけで、output-○○という画像ファイルを作ってくれる。
またオプションを-jとすればjpgファイルとして出力される。
その他のオプションは次のとおり。

-f startpage# 抜き出し開始ページを指定
-l endpage# 抜き出し終了ページを指定
-j DCT(Discrete Cosine Transfer:離散コサイン変換)の画像をJPEG形式で出力
-opw パスワード オーナーパスワード(文書の印刷や編集などを制限するためのパスワード)を指定
-upw パスワード ユーザーパスワード(文書を開くためのパスワード)を指定

神ですか!

cdしたときに自動的にlsを実行する

Cシェル系で使える便利な技。.cshrcに

alias cwdcmd 'ls'

とすればディレクトリが変更されるたびにlsが実行される。llにしたら詳細も表示される。でも大量にファイルがある場合は嫌になるので、ファイルが多い場合はlsしない、とかシェルで書いたらヒーローになれるんじゃなかろうか…。でも僕はやりません。

cwdcmdとprecmdはそれぞれtcshの特別なエイリアスで、指定されている場合は自動的に実行されます。 デフォルトでは未定義になっています。詳細及びその他の特別なエイリアスはtcshのマニュアルに 書いてあります。

ということで(ここ参照)、Cシェルを使う場合には便利なaliasがあるみたい。

ターミナルを上げたときにメッセージを表示させる

すぐに忘れるので、コマンドライン端末を上げる(かsshでloginする)たびにメッセージを表示したいと思って.cshrcに

cat userdir/message.dat

としてみたが、なんとlessの表示がすべてmessage.datの内容になってしまった。
原因はlessの拡張機能であるLESSOPEN変数の中身のシェルコマンドがcshellを呼び出しているためで、tcsellを使う度に.csrcは実行されるから常にmessage.datが表示されていたと判明した。
tcshellを使う度にメッセージが出たのではかなりめんどくさい。ターミナルをあげるとき、一回だけメッセージを出したい。…と、やり方を探してみたが、全然みつからないので、シェルを使って無理矢理やる。.cshrcに

#message
set msfrag=`env | grep -c msfrag`
if ($msfrag == 0)then
cat userdir/message.dat
setenv msfrag 0
endif
unset msfrag

を書き足した。
やってることは、setでシェル変数msfragのなかに環境変数のmsfragという文字列の数を入れて、これが0ならcatでファイルを書き出す。もし書き出されたら環境変数msfragが設定されるので、今度からはシェル変数msfragは必ず1になる。のでif内は実行されない。なぜわざわざ環境変数にmsfragを作っているかというと、シェル変数のsetには前に実行されたシェルコマンドも残っているので、これがたまたま合うと不具合を起こす可能性があるため。念のため。
めんどくさい!何か賢い方法を知っている方は教えてください。。。

やっぱり.cshrcに書くのはあまりよくないみたい。scpをしたときに起動されて、出力をどう扱ったらいいかわからずに終了してしまう。
このままだと不便なので、.loginに書くが、やっぱりそうしたらloginしたときしか表示されず、「ターミナルをあげたときに表示したい」という当初の目的が達成できない。。
sshとかscpとかのscriptを読んでみるしか対策は立たんのか…。研究は続行していきます。

解決しました。
結果的に「ssh使ってるときに立つ環境変数で条件分岐」という手法でscpなどのときに起こる問題を回避した。
あるところにsshをしたときにSSH_CLIENTとSSH_TTYという環境変数が立っている。これがあるかないかで条件分岐をした。ちなみに少し賢くなって、

$?変数名

で変数が定義されたものなのか未定義なのかを調べることができる、という技を使って前の部分もスマートにした。.cshrcに書き加えるのは次の部分。

#message
if (! $?msfrag) then
 if (! $?SSH_CLIENT || $?SSH_TTY ) then
  cat ディレクトリ名/message.dat
  ls
 endif
 setenv msfrag 1
endif

これでOK!…なはず!

なんとまた問題発生!上のコードを書いておいたら、rebootしたあと起動しなくなった。
envで環境変数を見てみたら、msfragが立っていてだめみたい。ログインのどこかのタイミングで実行されて、ずっと残っているのか?
msfragをsetでローカルな変数にしても、if文には引っかからないみたいで、だめ。何か良い方法はないものか…。続く。

テキストベースのwebブラウズ

firefoxの調子が悪いので、他の方法を探す。探すとターミナル上でテキストブラウザを使ってwebに接続することができることが分かった。lynxとかいうアプリケーション。
lynxの簡単メモ

w3mとかいう技もあるらしい。emacsと併せて使えるとか。W3M

プリントの便利なテクニック

縮小・拡大の技。たとえばA4をA3にするなら次のようにする。

psresize -pa3 -Pa4 input.ps output.ps


2ページを一枚にまとめる場合は

psnup -2 input.ps output.ps

でOK。
psファイルを連結したいときは、

gs -q -sDEVICE=pswrite -dNOPAUSE -dBATCH -sOutputFile=output.ps input1.ps input2.ps

psmulti input1.ps input2.ps -o output.ps

コマンドでいける。ただ研究室環境では後者が無理っぽい。
→(10.11.29追記)前者も無理なことがある。そのときは以下の方が作ったpsjoinというスクリプトを実行すれば良い。psjoin
出力はテキストなので、適当にリダイレクトすればOK。
psファイルを分割したいときは、

psselect page# inputfile outputfile

で分割できる。
psselect参照

bashでtcshell的な(引数まで含んだ)aliasがしたい

bashではaliasは引数を扱ってくれない。そこでシェル関数を使う。たとえば、"aho"を"ssh aho"としてaliasしたいときには、.bashrcに

 function aho(){
    ssh aho
 }

とすればいい。めんどいが、引数などの扱い方が変わる場合には嬉しい…かもしれない。

nkf

文字コード変換の便利コマンド。
nkf-文字コードを変換する-

引数メモ

b  	バッファリング出力を行う
-u 	出力時にバッファリングを行わない
-j 	JISコードに変換する
-e 	EUCコードに変換する
-s 	シフトJISコードに変換する
-w 	UTF8コードに変換する
-i? 	JIS漢字を指示するシーケンスとして ESC-'$'-?を使用する
-o? 	1バイト英数文字セットを指示するシーケンスとしてESC-'('-?を使用する
-r 	ROT13/47の変換する
-T 	テキスト・モードで出力する
-l 	0x80-0xfeのコードをISO-8859-1 (Latin-1)として扱う。ただし,JISコードの時 のみ有効
-f? 	一行?文字になるように簡単な整形を行う
-Z 	X0208中の英数字と一部の記号をASCIIに変換する
-J 	JIS(ISO-2022-JP)と仮定して処理する
-E 	日本語EUCと仮定して処理する
-S 	シフトJISと仮定して処理する
-X 	シフトJISと仮定して処理する。ただし,X0201仮名があるものとする
-B 	壊れた(ESCが欠損した)JISと仮定して処理する。-B1の場合はESC-(およびESC-$)のあとのコードを問わない。-B2の場合は改行の後に強制的にASCIIに戻す
-x 	通常行われるX0201仮名->X0208の仮名変換しない
file 	変換元のファイルを指定する

lpr

【 lpr 】 プリンタで印刷する

UNIX環境ではネットワークプリンタはCUPSと呼ばれる印刷システムを用いる。設定defaultはだいたいport631。

a2ps

a2ps
a2psは普通のテキストファイルをpsファイルに変換するコマンド。これをパイプしてlprすればそのまま印刷できる。デフォルトで印刷先がプリンタになっている場合はそこに出力されるので、自動的に印刷されるときもある。
link先にオプションの説明があるので、超便利です。

文字コードはEUCを扱う。たとえば研究室の環境でemacsで日本語で文章を書いて、それを印刷したいときにはpipeして次のように記述すればOK!

nkf -e "filename" | a2ps --encoding=euc-jp | lpr -P "printername"


また、1ページで縦長に出したいときには

-R --columns=1

オプションをつければいい。