68user's page 掲示板

Prev< No. 4431〜4465> Next  [最新発言に戻る] [過去ログ一覧]
No. 4431 # まっちゅう@ペガサス流星拳 2005/12/21 (水) 14:11:13
こんにちは!!
HP-UNIXなんですが、どなたか教えてください。
lsコマンドのタイムスタンプを常に西暦を表示するようにしたいのですが
そのままls -l では直近6ヵ月未満までは西暦がでません。
該当するオプションがあるのでしょうか?
ちなみに-Tはだめでした。
よろしくお願いします。

No. 4432 # 68user 2005/12/22 (木) 13:15:43
>>4431 まっちゅう@ペガサス流星拳
HP-UX 標準の ls では無理だと思います。代案としては、
    - tar cf - ファイル | tar tvf -
    - sed で置換
    - perl などを使う
など。

No. 4433 # fan 2005/12/22 (木) 15:05:38
ありがとうございます。
運良くFinishedメッセージは解決できました。
その次のAppricationDataの暗号化で質問があるのですが、
SSLCompressedが良く分からないです。
もし、ご存知なら、教えていただけないでしょうか。
お願いします。お願いします。

No. 4434 # まっちゅう@ペガサス流星拳 2005/12/22 (木) 17:23:10
やっぱり無理ですか。。。。
代案までありがとうございました。

No. 4435 # hagu 2005/12/24 (土) 15:23:32
tarコマンドで、コマンドの実行ディレクトリからサブディレクトリも含めて、
ワイルドカードで指定したファイル、例えば、「*.txt」の様に指定して、
すべてのファイルを1つのアーカイブにまとめたいのですが、可能なので
しょうか。
ディレクトリも含めたかたちにしたいのですが。

tar -cvf aaa.tar *.txt だと、直下のファイルのみ
tar -cvf aaa.tar *.* だと、すべてのファイル

No. 4436 # zsh 2005/12/24 (土) 22:29:16
>>4435 hagu
いくつか方法はあると思いますが、
$ find . -name "*.txt" | xargs tar cvf outfile.tar
等とすればできます。

No. 4437 # hagu 2005/12/24 (土) 23:07:40
>> 4436

ありがとうございます。
試してみます。

No. 4438 # 68user 2005/12/25 (日) 22:17:24
>>4436 zsh
Solaris の xargs (だったような気がしますが) は、LINE_MAX の長さがかなり
短くて、たしか 10KB 程度しかなかったような気がします。この使い方だと
複数回 tar コマンドが実行された場合、最後の方しかアーカイブに含まれない
ので注意が必要です。

No. 4439 # DNS勉強中 2005/12/26 (月) 00:16:19
>>4408 68user
亀レスすいません。
DNS のプログラミングのアドバイスをしていただいたものです。
出張先の住まいがレオパレスでネット環境があると聞いていたので、
すぐに閲覧できると思いましたが、いろいろ問題があり今までかかりました。
今後は普通に対応できると思います。
よろしくお願いします。

No. 4440 # zsh 2005/12/26 (月) 10:44:00
>>4438 68user
ご指摘ありがとうございます。
確かに複数回実行された場合の考慮が漏れていました。
ちなみに、Solaris の LINE_MAX の値は 2KB のようです。

No. 4441 # hagu 2005/12/26 (月) 11:49:22
>>4438 68user
>>4440 zsh

試して見ました。
ご指摘の通りでした。

標準出力には、すべて出てきましたが、
最後の方しかアーカイブに含まれていませんでした。

どう対応すればよいのですか。

No. 4442 # とーりすがり 2005/12/26 (月) 22:08:58
>>4441 hagu

カナリ遅いですが.

cat /dev/null>outfile.tar && find . -name "*.txt" | while read F in; do tar rvf outfile.tar "$F"; done

No. 4443 # 不明5号 2005/12/26 (月) 22:55:20
サーバーアドレスの見方はどうすれば??教えてください!

No. 4444 # zsh 2005/12/26 (月) 23:37:46
>>4441 hagu
試してませんが、
$ find . -name "*.txt" | xargs tar rvf outfile.tar
でいけると思います。
(tar は r を指定すると追記になります。)

No. 4445 # 68user 2005/12/27 (火) 00:30:52
>>4439 DNS勉強中
宣言した「今月中」もあと残すところ 6日。一度言ったことは守れよ、と
自分にプレッシャーをかける毎日です。

>>4441 hagu
その他。
    - tar cf outfile.tar `find . -name "*.txt"`
        (長すぎると Argument list too long になるが、エラーかどうかがはっきり
          わかるので使えなくもない)
    - tar の、ファイル名一覧をファイルから取得するオプションを使う。

>>4443 不明5号
質問の意味がわかりません。

No. 4446 # 2005/12/28 (水) 00:16:05
>>4445 68user
>>4444 zsh

ありがとうございます。
試してみます。

>tar の、ファイル名一覧をファイルから取得するオプションを使う。
探して見たのですが、使い方がわかりませんでした。
使い方教えてください。

No. 4447 # hagu 2005/12/28 (水) 00:17:47
>>4445 68user
>>4444 zsh

ゴミすみません。
名前のところに”お”が入ったままで書いてしまった。

ありがとうございます。
試してみます。

>tar の、ファイル名一覧をファイルから取得するオプションを使う。
探して見たのですが、使い方がわかりませんでした。
使い方教えてください。

No. 4448 # 68user 2005/12/28 (水) 03:44:29
>>4447 hagu
http://x68000.q-e-d.net/~68user/cgi-bin/wwwboard.cgi?howtouse にあるように、
OS 名を明らかにすれば期待する回答が返ってくる可能性が高まると思われます。

No. 4449 # hagu 2005/12/29 (木) 09:27:24
>>4448 68user

すみません。
UNIXで、Solaris8 です。

No. 4450 # zsh 2005/12/29 (木) 11:07:56
>>4449 hagu
man tar で出てきますが・・・
http://docs.sun.com/app/docs/doc/816-3518/6m9ptvr58?l=ja&a=view

No. 4451 # 68user 2005/12/29 (木) 13:06:57
>>4449 hagu
具体的には
    % find . -name "*.txt" > filelist.txt
    % tar cf outfile.tar -I filelist.txt
てな感じで。手元に Solaris がないので動くかどうかはわかりません。

No. 4452 # 68user 2005/12/31 (土) 18:25:28
>>4404 DNS勉強中
> resolver-1.pl 互換を目指した Linux 版
> http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1160.zip
今月中にと宣言したのでレビューをしようとしたのですが、上記ファイルが
not found になっていて見ることができませんでした。

自宅のマシンには以前ダウンロードしたファイルがあるかもしれませんが、
今は出先なので見ることができません。もたもたしていてすみません。

とりあえず、1関数 1ソースはやめた方がよいとわたしは考えます。普通は
    プログラム全体 > モジュール > 関数 > ブロック
という階層構造があり、例えば変数については
    - グローバル変数にする
    - ファイル内で static としてそのソース内 (モジュール) からのみ参照できるようにする
    - 関数内のローカル変数にする
などの選択肢がありますが、1関数 1ソースだと、ここで言うモジュールという
選択肢がなくなってしまいます。

あとは Makefile を書くのがダルい、というデメリットもありますね。

No. 4453 # DNS勉強中 2005/12/31 (土) 23:36:08
>>4452 68user
すいません。
アップロードしなおしました。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1374.zip
ただこれは1関数1ソースバージョンです。
今出張先でこのソースバージョンしか持っていないです。
それと1関数1ソースのデメリット分かりました。
特にMakefileは書いてて同じ事を感じてました。

No. 4454 # DNS勉強中 2005/12/31 (土) 23:56:31
一応1ソースバージョンもアップロードしました。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1375.zip
ただこれは学校に提出したバージョンのため、>>4453のソースの1つ前のバージョンのソースとなります。

No. 4455 # 68user 2006/01/09 (月) 05:54:07
>>4453 DNS勉強中
> http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1374.zip
そろそろケチをつけるところもあまりなくて、重箱の隅的ではありますがいくつか。

> char *tc_search(int tc){
> static char tc_result[20];
> ...
> return tc_result;
> }
こういうふうにしてしまうと
      char *p = tc_search(tc_1);
      char *q = tc_search(tc_2);
という使い方ができなくなります (p が指す内容が上書きされてしまうため)。
スレッドセーフでなくなるのと、利用者のレベルが低ければ余計なバグを生む
危険性があります。

UNIX のライブラリ関数でも、最初は localtime・ctime・strtok・gethostbyname などの
非スレッドセーフ版しかありませんでしたが、localtime_r・ctime_r・strtok_r・
gethostbyname_r などのスレッドセーフ版を用意する羽目になってしまいました。

承知の上でそうしておられるならば問題ないと思います。

> /* フラグ一覧を出力 */
> qr = (DNS_response.int_data[DNS_response.pos] & 0x80) >> 7;
> printf(" QR: (Query/Response): %s\n", qr_search(qr));
>
> opcode = ((DNS_response.int_data[DNS_response.pos] & 0x40) >> 6) * 8;
> opcode += ((DNS_response.int_data[DNS_response.pos] & 0x20) >> 5) * 4;
> opcode += ((DNS_response.int_data[DNS_response.pos] & 0x10) >> 4) * 2;
> opcode += (DNS_response.int_data[DNS_response.pos] & 0x08) >> 3;
> printf(" OPCODE: %s\n", opcode_search(opcode));
わかりやすい変数名を使うこと自体は非常によいのですが、同じ値を繰り返し
使用する場合は、

    int flag = DNS_response.int_data[DNS_response.pos];
    qr = (flag & 0x80) >> 7;
    printf(" QR: (Query/Response): %s\n", qr_search(qr));

    opcode = ((flag & 0x40) >> 6) * 8;
    opcode += ((flag & 0x20) >> 5) * 4;
    opcode += ((flag & 0x10) >> 4) * 2;
    opcode += (flag & 0x08) >> 3;
    printf(" OPCODE: %s\n", opcode_search(opcode));

などと一時変数に代入することをお勧めします。狙いは可読性向上と、変更時の
修正ミス防止です。わたしの場合は、

      for ( int i=0 ; i<length ; i++ ){
            struct *hoge_p = hoge_list.buf[x];
            printf("%s\n", hoge_p->foo);
            printf("%s\n", hoge_p->bar);
            printf("%s\n", hoge_p->baz);
      }

などと、ループ中でもよく一時変数に代入します。これは、ループ先頭の

      struct *hoge_p = hoge_list.buf[x];

で、

    このループ中で参照するのは hoge_list.buf[x] だけ。hoge_list.buf[x+1] を
    参照したりはしないよ。

というメッセージを送っているつもりです (効果があるかどうかは知りませんが)。

> DNS_query->data[0] = DNS_packet->id >> 8;
> DNS_query->data[1] = DNS_packet->id & 0xff;
> ...
> DNS_query->data[11] = DNS_packet->ARCOUNT & 0xff;
> for (i=12, j=0; i<12+domain_length; i++, j++)
> DNS_query->data[i] = DNS_question_record->Name[j];
この場合は、変更時の作業量削減とマジックナンバ排除のため一時変数を使うべきです。

      char *data_p = DNS_query->data;
      *(data_p++) = DNS_packet->id >> 8;
      *(data_p++) = DNS_packet->id & 0xff;
      ...
      *(data_p++) = DNS_packet->ARCOUNT & 0xff;
      for ( i=0; i<domain_length; i++)
              *(data_p++) = DNS_question_record->Name[i];


> FLAG flag_list[] = {{ /* 外側の中括弧は構造体の、内側の中括弧は配列の初期値を示す */
> 0,
> ...
> }};
>
> return ((flag_list->qr * 128 + flag_list->opcode * 8 + .... ));
FLAG flag = {
      0,
      ...
};
return (flag.qr*128 + flag.opcode*8 ... );

でよいと思います。あと、ビットシフトをしたい場合は乗算ではなく、>> や << で
表現した方が素直かなと思いました。

> int make_question_record(struct DNS_Question_Record *DNS_question_record,
> int argc, char *hostname, char *type, char *class){
> /* 照会タイプが何も入力されていなければデフォルトの A を代入する */
> if (argc >= 4)
> strcpy(query_type, type);
> else
> strcpy(query_type, "A");
ここまで argc を引っ張らず、もっと上位の関数で query_type を設定すべきと
思います (preprocessing あたりで)。

argc を引っ張りすぎると、もし引数のインタフェースを変更した場合、ソース
全体を調べて argc 関連の部分を修正することになってしまいます。

> /* DNS_response_before_conv->recv_bufはchar型なので、
> その中に格納されている数字は+127(0000007e)までしか表現できない */
しょーもないことですが、複数行のコメントは

    /* DNS_response_before_conv->recv_bufはchar型なので、
      * その中に格納されている数字は+127(0000007e)までしか表現できない
      */

などと書けば、grep したときにその行がコメントであることが一目でわかります。

> goto comp2;
再起であれば、これまでの状態を脳内スタックに積んで、新たに呼ばれた関数の
引数と戻り値だけを考えればいいですが、こういう goto は覚えておかなくては
ならない状態が多すぎるので、こういう goto はわたしは使いません (というか
頭が混乱してしまうので使えません)。

わたしは、エラー発生時の脱出以外で goto を使わない派です。


1ヶ月以上引っ張ってしまったわりに、たいしたレビューができませんで
申し訳ないです。

No. 4456 # 68user 2006/01/09 (月) 06:03:21
新版 UNIX 由来/読み方辞書
    http://X68000.q-e-d.net/~68user/unix/unix-term-dic.html
なるものを作ってみました。

元々あったオリジナルが 200個、わたしが追加したのが 60個程度です。
オリジナルの記述を読んでると時代を感じますね…。

No. 4457 # Netboy 2006/01/09 (月) 19:35:41
a.outでtypo指摘っす

> 実態にそぐわなかくなったが

No. 4458 # 68user 2006/01/09 (月) 20:11:54
>>4457 Netboy
ありがとうございます。今晩修正します。

追加ネタメモ。
abbrev
yum
xargs

No. 4459 # 68user 2006/01/10 (火) 01:14:20
>>4457 Netboy
修正いたしました。ご指摘ありがとうございました。

No. 4460 # mkt 2006/01/10 (火) 23:54:21
このサイトにはいろいろお世話になっております。
UNIX 用語 由来/読み方辞書 も一気に読ませていただきました。
気になった点をいくつか:

・fgrep と Gimp の解説文が途中で切れてしまっているように
    思います。
・記号の 2 項目め(「"」の項と思われる部分)の見出し行が
    抜け落ちてしまってます。

ついでに(思いっきり重箱の隅ですが)、この掲示板の [使い方]
ページにある「敬省略」っていうのも気になります…

No. 4461 # mkt 2006/01/11 (水) 00:05:00
>>4460 mkt
あれ? 全角空白が &nbsp; 4 個に置換されてる…。

No. 4462 # 2006/01/11 (水) 00:13:09
シェルで、2行を1行にする方法につてい教えてください。

cat file.txt

dn: nm=yamada.taro,o=tokyo,o=test.
  co.jp
nm: nm=yamada.taro
o: o=tokyo
o: o=test.co.jp

dn: nm=yamada.hanako,o=oosaka,o=test.
  co.jp
nm: nm=yamada.hanako
o: o=oosaka
o: o=test.co.jp



dn: nm=yamada.taro,o=tokyo,o=test.co.jp
nm: nm=yamada.taro
o: o=tokyo
o: o=test.co.jp

dn: nm=yamada.hanako,o=oosaka,o=test.co.jp
nm: nm=yamada.hanako
o: o=oosaka
o: o=test.co.jp

のようにしたいのですがどうすればいいのですか。
改行となっている次の行の頭は、半角スペースで始まっています。
また、空白行を消したくないのです。
空白行までを、1ブロック(かたまり)として扱いたいのです。

環境
    Solaris8
    Bシェル

No. 4463 # 68user 2006/01/11 (水) 14:56:38
>>4460 mkt
> ・fgrep と Gimp の解説文が途中で切れてしまっているように
> 思います。
ありがとうございます。Gimp は「Gimp の開発中にできたのが Gtk」、fgrep に
ついては「"Fast GREP" は違うでしょ」と書こうとして、そのままになってしまい
ました。とりあえず今晩書きかけの部分を削除したいと思います。

> ・記号の 2 項目め(「"」の項と思われる部分)の見出し行が
> 抜け落ちてしまってます。
これは HTML 生成スクリプトの修正が必要ですので、少し時間がかかります。


fgrep についてメモ。オリジナル版には

    "Fast GREP" または "Fixed string GREP" の略。

とありますが、

    http://www.nurs.or.jp/~asada/FAQ/UNIX/section1.3.html
        fgrep は、長さが決まっている文字列を検索します。"f" は "fast" という意味では
        ありません。事実、"fgrep footbar *c" の速さは、普通、"egrep footbar *.c" の
        速さより遅いのです

    http://www.bsddiary.net/doc/hierarchy.txt
        熟練者: 誰かが速いと言ったのでfgrepを使っている
        ハッカー: 自分で時間を測った結果egrepを使うことにした

などの他の有名な文献と矛盾しています。

    http://minnie.tuhs.org/TUHS/archive_sites.html
を見ると fgrep・egrep が現れたのが V7 で、V7 と 2.10 BSD のソースはほぼ
同じでした (ソースは別)。4.4BSD Lite2 では grep・fgrep・egrep のソースが
一本化されていました。それをふまえた上で man の記述を見ると、
    V7:
        Fgrep patterns are fixed strings; it is fast and compact.
        http://www.freebsd.org/cgi/man.cgi?query=grep&apropos=0&sektion=0&manpath=Unix+Seventh+Edition&format=html

    2.10 BSD:
        Fgrep patterns are fixed strings; it is fast and compact.
        http://www.freebsd.org/cgi/man.cgi?query=grep&apropos=0&sektion=0&manpath=2.10+BSD&format=html

    4.4BSD Lite2:
        The fgrep utility is quick but can handle only fixed strings
        http://www.freebsd.org/cgi/man.cgi?query=grep&apropos=0&sektion=0&manpath=4.4BSD+Lite2&format=html

    FreeBSD 1.0〜6.0:
        Fgrep is the same as grep -F.
        http://www.freebsd.org/cgi/man.cgi?query=fgrep&apropos=0&sektion=0&manpath=FreeBSD+1.0-RELEASE&format=html

    SunOS 4.1.3:
        In general, egrep is the fastest of these programs.
        http://www.freebsd.org/cgi/man.cgi?query=fgrep&apropos=0&sektion=0&manpath=SunOS+4.1.3&format=html

というわけで、fgrep が "Fast GREP" であるという認識があったとすれば、古代の
man の "fast" という記述が原因ではないかと考えます。

あとは、この時代の fgrep が grep・egrep と比べて fast であるかが気になる
ところですが、これは調査する時間と力量がないのでパスということで。

参考:
    http://groups.google.co.jp/group/fj.questions.unix/browse_thread/thread/e8ea37b4d0dd6372/235ce238f717f19c
    http://katsu.watanabe.name/grep/efgrep.html
    http://katsu.watanabe.name/grep/ohpcontents.html


オリジナル版に関わった方々がそうそうたる面子なので、調べずに突っ込みを
いれるわけにもいかず、なかなか大変です。

> この掲示板の [使い方] ページにある「敬省略」っていうのも気になります…
これまで思いっきり「敬省略」だと思っておりましたが、「敬称略」だったのですね。
ひとつ賢くなれました。これも今晩修正予定です。

>>4461 mkt
全角入りソースをコピペしやすいよう、半角空白に置換しています。

No. 4464 # hagu 2006/01/11 (水) 15:55:55
>>4451 68user

返事送れて申し訳ありません。
Solarisで動きました。

No. 4465 # 68user 2006/01/11 (水) 15:57:57
>>4462
sed で何とかできるのかもしれませんが、わたしは sed をよく知らないので、
sh でやるならこんな感じで。

    IFS=''
    buf=''
    use_buf=0

    cat file.txt | while read -r line; do
        case $line in
        " "*)
            tmpline=`echo -n $line|sed 's/^ *//g'`
            buf="$buf$tmpline"
            use_buf=1
            ;;
        *)
            if [ "$use_buf" = "1" ]; then
                echo "$buf"
            fi
            buf="$line"
            use_buf=1
            ;;
        esac
    done

    if [ "$use_buf" = "1" ]; then
        echo "$buf"
    fi

と思ったのですが、最終行が出ません。sh もよくわかってないわたしには解決
できませんでした (GNU bash, version 3.00.14(1)-release (i386-redhat-linux-gnu))。

perl を使ってよいなら
      perl -e 'undef $/; while (<>){s/\n +//g; print}' file.txt
あたりで。

Prev< No. 4431〜4465> Next  [最新発言に戻る] [過去ログ一覧]