プログラミングのためのTIPS Edit

よく忘れるチョイネタは、しっかりとメモしておこう。

Fortran Edit

unformattedなsequentialの入出力 Edit

  • 衝撃の事実! unformattedでsequential なアクセスの場合、データのカタマリごとにアクセスが行われる。
    要は、カタマリの間には8バイトのスペース(?)が入って、一回のアクセスがカタマリの大きさに対してどうであろうと、次のアクセスは次のカタマリに行っちゃう、ということだ。
    たぶん、いまさら気づいているのが遅いんだろうけど、今までDirect Accessが多かったからしかたないのだ。

formattedなsequentialの入出力 Edit

  • いまさらでいうと、formattedの自由書式(*)のとき、入力は,(カンマ)も区切り文字として認識するみたいだ。知らなかった(恥)。

iargc() Edit

引数の数。

if (iargc().ne.3) then
 write(6,*) 'Usage: xxxxxx'
 stop
end

とか入れておくと、すっかり忘れたプログラムが何をするものか思い出されやすい。

C Edit

めちゃ初心者です。

コマンドライン引数 Edit

main()の括弧部分にargcと*argv[]を定義する。下は、入力ファイルと出力ファイルをコマンドラインから入力するコマンドの例。

int main (int argc,char *argv[]) {
 FILE *ifile, *ofile;
 char ifname[30],ofname[30];
 sscanf(argv[1], "%s", &ifname);
 sscanf(argv[2], "%s", &ofname);
 ifile = fopen (ifname,"r");
 ofile = fopen (ofname,"wb");
 if (ifile==NULL || ofile==NULL) {
   printf ("Error opening files\n");
   return;
 }

Shell (sh,csh,tcsh,bash) Edit

互換しない組み込み関数 Edit

shではexport, cshではsetenv。

変数名に変数は使えない??→使える。 Edit

例えば

#!/bin/sh -f
VAR1="aaa"
VAR2="bbb"
VAR3="ccc"
NUM=1
while [ $NUM -le 3 ] ; do
 echo VAR${NUM}
done

なんてことはできない

Sさんから情報提供があり、できることがわかりました。上の例でいうと、このようにやります。

#!/bin/sh -f
VAR1="aaa"
VAR2="bbb"
VAR3="ccc"
NUM=1
while [ $NUM -le 3 ] ; do
VAR=\$VAR$NUM
VAR=`eval echo $VAR`
echo $VAR
NUM=`expr $NUM + 1`
done
exit

メモ書いていて良かった~。

非互換構文 Edit

  • ${XXX:-xxx} (bash)
    • XXXという環境変数が定義されていない場合、xxxをXXXとして定義する。
    • マイナスの代わりにプラスを用いると、xxxを強制する。
    • マイナスの代わりにイコールを用いると、xxxに数字が使える。

リダイレクト Edit

しょっちゅう忘れる。

  • sh/bash では "> file 2>&1"
  • csh/tcsh では ">& file"

awk Edit

書式(printf) Edit

Cと同じ。小数%f、指数%e、整数%i。改行用の\nも忘れるな。%A.Bfで、A:総文字数、B:小数点以下桁。%A.Biの場合、Bの位まで0が埋められる。

awk '{SUM=SUM+$1}END{printf("%f\n",SUM/NR)}' list
echo 1 | awk '{printf("%2.2i\n",$1+1)}'

正規表現 Edit

  • ファイル名:FILENAME
  • 行:NR
  • フィールド数:NF
  • フィールド全部:$0

文字列と数値列 Edit

数値列として入力しているつもりが文字列と認識され、思ったとおりいかないときがある。特にshellスクリプトの中で、shell変数を呼んだときに起きやすい。たとえばshellのなかで、

VAL=50
echo 100 | awk '$1 < "'"${VAL}"'" {print "awk think "$1" < ""'"${VAL}"'"} \
           awk '$1 > "'"${VAL}"'" {print "awk think "$1" > ""'"${VAL}"'"}

を実行すると、

awk think 100 < 50

と出力される。これは、要するに文字列としては1より5の方が序列が早いから。

ここで数値列をはっきりさせたいときは+0などを追加すればよい。たとえば、

VAL=50
echo 100 | awk '$1 < "'"${VAL}"'"+0 {print "awk think "$1" < ""'"${VAL}"'"} \
           awk '$1 > "'"${VAL}"'"+0 {print "awk think "$1" > ""'"${VAL}"'"}

とすればよい。

参考:http://aoki2.si.gunma-u.ac.jp/Hanasi/Algo/letsawk/ValueOrString.html

sed Edit

置換 Edit

  • 全ての/ (スラッシュ)を (空白)に置換
    sed -e s/"\/"/" "/g sample.txt
  • Change all capital letters to lowercase
    sed -r "s/[A-Z]+/\L&/g" sample.txt
    or
    sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/" sample.txt
  • Change all lowercase letters to capital
    sed -r "s/[a-z]+/\U&/g" sample.txt
    or
    sed "y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/" sample.txt

その他のコマンド Edit

tar Edit

  • その場の隠しファイル隠しディレクトリだけtarする。ホームディレクトリのバックアップ時など。
    $ tar cvf hiddenfile.tar .[^.]*
    一段下がって、ディレクトリ名を指定すれば隠しファイルもすべてtarされる。(/home/keiをtarしたいときは、cd /home ; tar cvf tarfile kei )

.htaccess Edit

  • netmask
    • deny from XX.XX.XX.YY/ZZ とするとXX.XX.XX.YYを含む2^(32-ZZ)個のIPがアクセス禁止。よく使うZZと個数の関係:24(256個)、26(64個)、28(16個)、30(4個)など。
  • mod_rewrite

改行コード Edit

  • Mac -> Unix
    $ tr \\r \\n <mac.txt >unix.txt
  • Windows -> Unix
    $ tr -d \\r <windows.txt >unix.txt
  • Unix -> Windows
    $ perl -p -e 's/\n/\r\n/' <unix.txt >windows.txt

wget Edit

  • To copy all contents in a http directory;
    $ wget -r -l1 --no-parent http://xxxx/xx/x/
  • If you want to specify only gif files;
    $ wget -r -l1 --no-parent -A "*.gif" http://yyyy/yy/y/

rsync Edit

SSH Edit

  • Multiple-step login
    • Add those lines in .ssh/config (permission 600). Of course you have to prepare authorized_keys, known_hosts, id_rsa.pub, etc. with your own policy and risk.
      Host rainbow
        HostName rainbow.iis.u-tokyo.ac.jp
        ServerAliveInterval 30
        IdentityFile ~/.ssh/id_rsa
      
      Host isotope2
        Hostname isotope2.aori.u-tokyo.ac.jp
        IdentityFile ~/.ssh/id_rsa
        User kei
        ProxyCommand ssh rainbow nc %h %p
    • So that you can login directory to isotope2 only by "ssh -X isotope2" (no domain).
    • You can use scp, rsync, etc. with similar manner.
  • Link