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

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


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

powerdotのメモ
shell memo
...cshスクリプトのメモ
...sftp
...pdfimages
...cdしたときに自動的にlsを実行する
...ターミナルを上げたときにメッセージを表示させる
...テキストベースのwebブラウジング
...プリントの便利なテクニック
...bashでtcshell的な(引数まで含んだ)aliasがしたい
...nkf
...lpr
...a2ps

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の場合があるので、注意すべし。

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

コマンドでいける。ただ研究室環境では後者が無理っぽい。

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

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