計算機関連の自分用メモ

Bash , Wnn/egg , Programing, kterm , Postscript, TeXmacs,rpm,xfig, VNC

localhost 以外からの imap 接続を禁止する.imaps 接続は,許可.
imap と imaps は,同じ imapd で動くので tcp wrapper では,無理. iptables を使う.
    [root]# iptables -A INPUT -s 127.0.0.1 -p tcp --dport 143 -j ACCEPT
    [root]# iptables -A INPUT -p tcp --dport 143 -j REJECT
    /etc/init.d/iptables save active

PostScript 関連
- 複数ページの PostScript file を page 毎に画像(png, jpg, etc)に変換
    convert -density 150x150 hoge.ps hoge%d.png
- convert で PostScript を変換する際に antialias を外す
    convert +antialias hoge.ps hoge.png
- fig2dev で .fig -> .ps(A4/center/portrait) に変換
    fig2dev -Lps -p0 -zA4 -c -P hoge.fig hoge.ps
- 1 Page からなる Postscript file が複数あるとき、それを一つの PDF file(A4) にしたい:
    cat A.ps B.ps C.ps ... > hoge.ps
    ps2pdf -g595x842 -r72 hoge.ps hoge.pdf
    ps2pdf -g4956x7014 -r600 hoge.ps
    ps2pdf -sPAPERSIZE=a4 hoge.ps

- A4 size: 210x297mm 8.26x11.69in 595x842pt(1in=72pt)
- Letter size: 216x279mm 8.5x11in 612x792pt(1in=72pt)

SMTP と直接お話
HELO ホスト名
MAIL FROM: 返信アドレス
RCPT TO: 受信者
DATA (Subject: とか書いたり、本文を書く。`.' でおわる)
QUIT

画像連結
- 1.gif 2.gif を縦に並べる場合
画像の size は、display, xv や gifsicle -I 等を使って調べておく。
  -> ImageMagick の identify で調べられる。(03/04/15)
convert を使って rgb 形式に変換
> convert 1.gif 1.rgb
> convert 2.gif 2.rgb
> cat 1.rgb 2.rgb > 3.rgb
> convert -size [width]x[height] 3.rgb 3.gif

- [2.gif][1.gif] の順で横に並べる場合。(01-Jul-2001)
> convert -rotate -90 1.gif 1r.rgb
> convert -rotate -90 2.gif 2r.rgb
> cat 1r.rgb 2r.rgb > 3r.rgb
> convert -size [height]x[new_width] -rotate 90 3r.rgb 3.gif

Emacs 20.x での文字コードの変更
buffer 内で M-x set-buffer-file-coding-system または、C-x RET f とした後に euc-jp とか iso-2022-jp
.emacs 内に記述する場合
(set-default-coding-systems 'euc-jp) -> 新しく作成する buffer の coding を euc-jp にする場合
(set-buffer-file-coding-system 'euc-jp) -> 現在の buffer を euc-jp にする関数
(prefer-coding-system 'euc-jp) -> default の coding を euc-jp にする

.emacs の設定

;
; BS (C-h) キーと DEL キーを入れかえます。
;
(load-library "term/bobcat")

;
; ショートカットキーの定義
;
(global-set-key "\C-cg" 'goto-line)

;
; C-x t で時刻を入れる (31-Mar-1999  といった文字列が挿入される)
;
(defun insert-time ()
  (interactive)
  (call-process "env" nil t nil "LANG=C" "date" "+%d-%b-%Y")
  (delete-char -1))
(define-key ctl-x-map "t" 'insert-time)

;
; バックアップファイル(*~) は、~/trash にまとめて作る。
;
(setq backup-by-copying t)
(defun make-backup-file-name (filename)
  (concat "~/trash/" (file-name-nondirectory filename) "~"))



kterm, xterm でのエスケープシーケンス
23-Sep-2000

○ Title bar の文字列を指定 ^[ は、ESC ( tcsh だと ^VESC )
echo '^[]2;STRING^G'

○ clear
echo '^[[2J'
○ position
echo '^[[y;xHstring'
x,y の位置に string を表示する。x,y は、左上が 1,1
○ color
^[[%dm
0 ... normal 30 ... black 34 ... blue
1 ... bold 31 ... red 35 ... magenta
4 ... underline 32 ... green 36 ... cyan
7 ... reverse 33 ... yellow 37 ... white
40-47 ... reverse color
○ characters
echo '^[(0%c^[(B'
` ... diamond
a ... hatched
jklmn ... ┘┐┌└┼
opqrs ... line ( heighest -> lowest )
tuvwx ... ├┤┴┬│
~ ... cdot

Bash

Link
Bourne Shell 自習テキスト

.bash_profile
PS1='\h:\w \$ ' -> yourHost:~/cwd $

Commandline argument
if [ $# = 0 ]; then
  echo "usage: ..."
  exit
fi

Option analysis
OPTIONS=""
while true
do
case "$1" in
-*) OPTIONS="$OPTIONS $1" ;;
*) break ;;
esac
shift
done
echo ${OPTIONS}

Function
func () { ... }
call は、 func arg1 arg2 で行なう。call は、function の define の後でなければならない。
argument は、$#, $1..$n ($0 は、function name ではなくて command name)

制御構文
if [ cond ]; then
com1
elif [ cond ]; then
com2
else
com3
fi
[ cond ] || com1 -> if cond is false then com1
[ cond ] && com1 -> if cond is true then com1
array="elm1 elm2 elm3 end elm4 elm5"
for idx in ${array}; do
...
done
i=0
while [ $i -lt 10 ]; do
i=`expr $i + 1`
echo $i
[ $i -gt 5 ] && break
done

# loop forever
while true; do
echo -n "*"; sleep 1
done

# continue
for x in $@; do
echo "${x}"
[ ${x} = 5 ] && continue # ${x} が 5 なら次の処理をとばす
echo "${x} done."
done
cat [file] | while read line; do echo ${line} done
case "$1" in
1*) echo "1*" ;;
*1) echo "*1" ;;
*) echo "default" ;;
esac
比較
文字列: =, !=
数値: -eq, -ne, -lt, -gt, -le, -ge

計算
expr 1 + 1
$[1+2] -> bash only
a=1; echo $[$a+2] -> bash only

file 記述子
echo "stderr" 1>&2 ( stderr に出力 )
exec 2>errs.out ( stderr を errs.out に出力 )
exec > /dev/null 2>&1 ( stdout & stderr を /dev/null に流す )

shell 変数
undef= -> 変数を undefined にする。
echo ${undef:-not_defined} -> 後ろを表示
echo ${undef:=def} -> 後ろの値を代入
echo ${undef:?variable not defined} -> stderr に表示
echo ${def:+varialbe def has some value} -> define されていたら表示
echo ${var} has ${#var} charactors. -> strlen と同じ

fpath=foo/var/baz
echo ${fpath%/*} -> 後ろから match する min 部分を削る。 -> foo/var
echo ${fpath%%/*} -> 後ろから match する max 部分を削る。 -> foo
echo ${fpath#*/} -> 前から match する min 部分を削る。 -> var/baz
echo ${fpath##*/} -> 前から match する max 部分を削る。 -> baz

etc
status は、$? (csh なら $status)
$( shell command; command2 ) 子shell で実行,結果の文字列を返す
{ command1; command2; } current shell で複数実行

外部コマンドを実行して,結果を変数に取り込む
var=$( expr 5 - 2 ); echo ${var}
外部コマンドを実行して,結果をスペース区切りで配列として変数に取り込む
var=( $(ls -l ~/.bashrc) ); echo ${var[4]}

Bash で連想配列
# perl や ruby における hash={ JAN=>31, FEB=>28, MAR=>31 ... }

dollar='$' # <- $ を用意
hash_JAN=31 # <- 連想配列の定義
hash_FEB=28
hash_MAR=31

#var=JAN # <- key を与えて
var=FEB

res=`eval echo ${dollar}hash_${var}` # <- key に対応した value を返す
echo $res


cshの場合

:r 拡張子を削る
:h パスの部分を取り出す
:e 拡張子を取り出す
:t パスの部分を削る

# set fpath = foo/hoge/aaa.txt
# echo $name:r -> foo/hoge/aaa
# echo $name:h -> foo/hoge
# echo $name:e -> txt
# echo $name:t -> aaa.txt


Wnn+Egg メモ

QWERTYキーボードなら、
z+
1 2 3 4 5 6 7 8 9 0 − = `
○ ▽ △ □ ◇ ☆ ◎ ¢ ♂ ♀ 〜 ≠ ´
 q w e r t y u i o p [ ] ¥
 《 》 ぜ 々 〆 zy ず じ ぞ 〒 『 』 \
  a s d f g h j k l ; ’
  ざ ヽ ゝ 〃 ‐ ← ↓ ↑ → ゛ ‘
   z x c v b n m , . /
   zz :- 〇 ※ ° ′ ″ ‥ … ・
z+ Shift+
! @ # $ % ^ & * ( ) _ +  ̄
● ▼ ▲ ■ ◆ ★ £ × 【 】 ∴ ± ¨
 Q W E R T Y U I O P { } |
 〈 〉 zE 仝 § zY zU zI zO ↑ 〔 〕 ‖
  A S D F G H J K L : ”
  zA ヾ ゞ → ― zH zJ zK zL ゜ “
   Z X C V B N M < > ?
   zZ :-)℃ ÷ ← ↓ 〓 ≦ ≧ ∞
boiled-egg で nn で終る単語で Wrong argument: integerp, nil という error が出る場合。
 .emacs の (load "boiled-egg") の後ろに

(defun its:simulate-input (i j  input map)
  (while (< i j)
    (setq map (get-next-map map (sref input i))) ;
    (setq i (+ i (char-bytes (sref input i))))) ;
  map)

と入れるとうまくいくかも。

「。」「、」の代わりに「.」「,」を使う場合。
Freewnn の場合
    (setq use-kuten-for-period nil)
    (setq use-touten-for-comma nil)
tamago 4.0.6 の場合 ;; .emacs の文字コードを iso-2022-jp でセーブする
  (custom-set-variables
   '(its-hira-enable-double-n t)
   '(its-hira-comma ",")
   '(its-hira-period "."))
  (custom-set-faces)

Wnn7 で boiled-egg
http://www.chibutsu.org/AIC/elisp/boiled-egg7.html
Wnn7 で kinput2 (Vine2.6CR)
kinput2 -wnn -jserver localhost -wnnenvrc6 /usr/lib/wnn7/ja_JP/wnnenvrc

port forwarding を使って jserver に接続
hostB から port 22273 が途中経路で塞がれている場合に hostA で動いている jserver に access する方法.ssh の port forwarding を使う.
   hostB: ssh -L 22273:hostA:22273 hostA
これで hostB の 22273 port への access は,途中経路は,22 port に変換されて hostA に接続され,hostA での 22273 prot への access になる.
Settings for egg on XEmacs 21.4
(setq default-input-method "japanese-egg-wnn")
;; "nn" で「ん」を入力
(setq enable-double-n-syntax t)
;; "." で「.」、"," で「,」を入力。
(setq use-kuten-for-period nil)
(setq use-touten-for-comma nil)

Programing

Date command を使って Default の Random seed を生成する
date +%s
とすると seconds since 00:00:00, Jan 1, 1970 が得られる。ただし、この機能は GNU extension なので GNU の date command が必要。Linux の場合は、OK.

Fortran でコマンドライン引数を使う

      program test
      integer iargc
      character*80 string

      print *, iargc()
      call getarg(1,string)
      print *, string
      end


CPP

#if X == 1
...
#elif X == 2
...
#else /* X != 2 and X != 1*/
...
#endif /* X != 2 and X != 1*/



C で関数を変数に代入する方法
int func1(int x, int y) // 引数を二つとる関数その1
{
return x+y;
}
int func2(int x, int y) // 引数を二つとる関数その2
{
return x-y;
}
int main()
{
int (* func)(int, int); // 関数へのポインタ型の変数の宣
func=func1; // 関数へのポインタの代入
printf("%d\n", func(2, 1));
}

C で Fortran 的な配列の使いかた 16-Nov-2002

一次元配列の場合
int bb[201];
int *b= &bb[100];
とすれば、b[-100] .. b[100] での参照が可能。

二次元の場合は、
int aa[201][201];
int (*a)[201] = (int (*)[201])&aa[100][100];
とすれば、a[-100][-100]〜a[100][100]のように参照できる。


C と FORTRAN での memory 上での配列のつまり方 14-Nov-2002
C: a[2][3]
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
FORTRAN: a(2,3)
a(1,1) a(2,1) a(1,2) a(2,2) a(1,3) a(2,3)

C での多次元配列の引数渡し 14-Nov-2002
int func(int a[][3][2]) // このように受ける
{
a[0][2][1]=4;
}

int main()
{
int qq[4][3][2]; // 多次元配列の定義
func(qq); // 呼び出し
}


C utility functions
loren4.c ローレンツ変換
strSplit.c AWK like な文字列分解 "  xxx, yyy  , zzz www  ; comment" -> "xxx", "yyy", "zzz", "www"


Perl

Script の先頭に書くおまじない
#!/bin/sh
exec perl -Sx $0 "$@"

#!perl

ファイルハンドルをサブルーチンに渡す方法
open(fh, "file");
flock(fh, LOCK_SH); # <- 読み込みのみ共有を許したロック
subroutine_name( *fh, arg2, arg3, ... );
close( fh );
fopen( *fh );
while (<fh>) {
print $_;
}
close(fh);

sub fopen {
my $fh=shift;

open( $fh, "test.txt" );
}

sendmail を使ったメールの出し方
open(MAIL,"| $sendmail -t");
print MAIL <<EOF;
To: $mailto
From: $mailfrom
Subject: $subject
MIME-Version: 1.0
Content-type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

$content_in_jis
EOF
close(MAIL);

crypt
perl -e 'print crypt("string", "salt(2byte)")."\n"'

時間
perl -e 'print "".localtime(time())'
# UTC -> readable
use Time::Local;

# Source of information:
# > perldoc -f localtime
# 0 1 2 3 4 5 6 7 8
# ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
# localtime(time);

$time=$ARGV[0];

@ltime=localtime($time);
($sec,$min,$hour,$day, $mon, $year)=@ltime[0,1,2,3,4,5];
$year+=1900;
$mon+=1;
print "$time -> $year.$mon.$day $hour:$min:$sec\n";

---
# Tomorrow
use Time::Local;

($year, $mon, $day)=(2001, 02, 28);
$time = timelocal(59,59,23,$day,$mon-1,$year-1900);

@ltime=localtime($time+1);
($day, $mon, $year)=@ltime[3,4,5];
$year+=1900;
$mon+=1;
print "$year.$mon.$day\n";
sort
   
sort {$a cmp $b} @array  : 文字列、昇順(default)
    sort {$b cmp $a} @array  : 文字列、降順
    sort {$a <=> $b} @array  : 数値、昇順
    sort {$b <=> $a} @array  : 数値、降順


Ruby

Script の先頭に書くおまじない
#!/bin/sh
exec ruby -S -x $0 "$@"

#!ruby

ruby でPoisson 分布の確率を計算する(exp=31で 0..39をobserveする確率の総和)
ruby -e 'exp=31; p=0; n=1; (0..39).each{|i| n*=(i==0 ? 1: i); p+=(exp**i)*2.7182818285**(-exp)/n; print "n=#{i} sum_p=#{p} n!=#{n}\n"}'


TeXmacs 関連


rpm

パッケージの中身をみる

rpm -ql -p <filename.rpm 複数可>

tcsh だと
foreach a ( /mnt/cdrom/.../RPMS/*.rpm )
echo "----------- $a:t"
rpm -ql -p $a
end

bash だと
(for idx in /mnt/cdrom/.../RPMS/*.rpm; do
   echo "----------- ${idx##*/}";
   rpm -ql -p ${idx};
done) > /tmp/vine2.6cr.plus.rpmlist.txt

rpm -ivh PACKAGE_FILE    パッケージファイルをインストールする。
rpm -ivh --nodeps PACKAGE_FILE    依存関係を無視して、パッケージファイルをインストールする。
rpm -e PACKAGE    パッケージをアンインストールする。
rpm -qpi PACKAGE_FILE    未インストールのパッケージファイルについて、情報を表示する。
rpm -qi PACKAGE    インストール済みのパッケージについての説明を表示する。
rpm -ql PACKAGE    パッケージに関し、インストールされた個々のファイルを表示する。
rpm -qa    インストール済みのパッケージ名をすべて表示する。
rpm -qf FILE    FILE がどのパッケージに含まれているかを表示する。

spec file 関連
  http://www.ns.musashi-tech.ac.jp/~inoue/Pages/Linux/rpm-packaging.howto.html

JF:
  RPM-BUILDING-HOWTO
  RPM-HOWTO

xfig
Link http://www.xfig.org/

xfigpad --- Tiny pad to support drawing mathematical equations in xfig. [screenshot]
  Required softwares:
    ruby - http://www.ruby-lang.org/
    lout - http://savannah.nongnu.org/projects/lout/
    pstoedit - http://www.pstoedit.net/pstoedit
    gs

VNC
server側で
vncpasswd
vncviewer [:X]

ssh SERVER -L 590X:SERVER:590X
vncviewer :X
twm をkill して gnome-session &

cygwin



Back