68user's page 掲示板

Prev< No. 2114〜2214> Next  [最新発言に戻る] [過去ログ一覧]
No. 2114 # 68user 2001/08/28 (火) 06:58:35
>>2110 /tk
> 余計なような足りないような…
確かに。補足どうもです。

>>2112 moz
> 質問するかもしれませんので、そのときは、どうか
> よろしくお願いします。
ぜひ回答する側にもまわって下さい :-)

>>2113 スナフキン
> そのCGIでデータを受け無い時(readしない場合)って、そのデータは
> どうなるのでしょう?
実装依存です。TCP 的に言えば、相手側がプロセスが read してくれないと相
手側の OS のバッファにたまります。それがいっぱいになったら書き込み側が
ブロックします。つまり
    print SOCKET "....";
を実行したままずっと止まってしまうということです。

ちゃんと調べたわけではありませんが、一般的にPOST データを全部受け取っ
て CGI に渡す web サーバが 多いような印象を受けます。あくまで印象なの
で、試したわけではありません。

もし
    int sock;
    bind(...);
    listen(...);
    sock = accept(...);
    ... ヘッダ読み込み ...

    if ( fork() == 0 ){
        char *args[]={"/home/user/public_html/cgi-bin/foo.cgi", NULL};
        dup2(sock, 0);
        execvp("cgi", args);
    } else {
        int status;
        wait(&status);
    }
のように、直接ソケットを CGI プロセスの標準入力に渡すような
実装ならば、CGI プロセスが read しないと書き込み側がブロック
するわけですね。

apache の実装がどうなっているかわかったら僕にも教えて下さい。

No. 2115 # 68user 2001/08/28 (火) 07:19:15
>>2114 68user
なんかいろいろとアレなので、書き直し。
    int sock;
    int pipes[2];

    bind(...);
    listen(...);
    sock = accept(...);
    ... ヘッダ読み込み ...

    pipe(pipes);

    if ( fork() == 0 ){
            char *args[]={"cgi", NULL};
            dup2(sock, 0);
            dup2(pipes[1], 1);
            execvp("/home/user/public_html/cgi-bin/foo.cgi", args);
    } else {
            char buf[256];
            int len;
            int status;
            while ( len=read(pipes[0], buf, sizeof(buf) ){
                  write(sock, buf, len);
            }
            wait(&status);
    }
ソケットのデータを CGI プロセスの標準入力に渡し、
CGI プロセスの標準出力を受け取り、そのままブラウザに
返す web サーバもどきです。

No. 2116 # CCIE [E-mail] 2001/08/29 (水) 12:43:34
こんにちは。又お邪魔させてもらいました(^^;)
この前はありがとうございます。うまくできました\(^o^)/
今回は、Perl/Tkなんですがアドバイスよろしくお願いします。m(__)m
リストはこんな感じなんですが・・・
use Tk;

$mw = MainWindow->new;
$mw->title("gifgraph");

$can = $mw->Canvas(-width=400,

No. 2117 # CCIE [E-mail] 2001/08/29 (水) 12:52:25
すみません↓ tabで形をそろえようとしたら送信のところにいっちゃってenterおしちゃいました(^^;; ヒヤアセ
で、リストは
use Tk;

$mw = MainWindow->new;
$mw->title("gifgraph");

$can = $mw->Canvas(-width=>400,
                                      -height=>300)
        -pack();

for(;;){
$gif = $mw->Photo(-format=>'gif',
                                    -file=>"graph.gif");

$can->createImage(200,150,-image=>$gif);

$mw->after(4000);
}

画像が更新されるのでfor文で何度も画像を読みこませたいんですが、ウィジェットすら開かないんです。for文をはずせば今ある画像が表示されるんですが、なぜなんでしょうか?

No. 2118 # 68user 2001/08/29 (水) 16:35:02
>>2117 CCIE
Perl/Tk は久しくやってないので忘れてしまいましたが、
    $can->createImage(200,150,-image=>$gif);
    $mw->after(4000, \&change_image);
    MailLoop;
    exit;

    sub change_image {
          $gif が変わっていたら $can をいじる
    }
じゃないですかね。

No. 2119 # CCIE [E-mail] 2001/08/30 (木) 17:48:48
参考にさせていただきました。
少し手を加えてなんとか表示できました。それで、
GDモジュールとGIFgraphモジュールでgifを作って
for(;;){
    ・・・・・・
}
の中に入れたんですが
$my_graph=new GIFgraph::lines();
・・・・・
見たいな感じでGIFgraphを定義させました。
for文の外にこう言う定義は書いたらいいんですが、このモジュールの仕様?(バグ)で中に入れてどんどん作らないと更新されないんで中に書きました。
でもそうすると何度も定義するのでメモリがどんどん食われていくんです。メモリの制御を除いてもメモリが増えていってました。
前に定義したものが残っているのでそれを破棄するってことはできるんでしょうか?

No. 2120 # スナフキン 2001/08/30 (木) 20:15:47
>>2115 68user
そうですか実装依存ですか。それが判っただけでもOKです。
ありがとうございます。
perl側では、あまり意味がないという事になりますかね。

しばらくApache関連の情報も探しましたが、今の所該当する
情報は見つかりません。

わざわざ例題(cですよね?)まで書いてもらいましたが、
よく判りませんでした。m(_ _)m
cが解かればソースを見て何とかなるかもしれませんが、
まだ不勉強なので…

何か見つけたら報告します。

>>2105 ふくし
>ところで、1.1 をお使いですよね?
いえ、B20でした・・・って最近使っていないのがバレバレですが(笑)
自分は、DOS上では面倒な処理をする必要がある場合ぐらいしか
使ってません。普通は本物の環境で作業しています。
Cygwin でシンボリックリンクまで対応している事を知ったのも、
最近です(笑)

No. 2121 # 木島 透 [E-mail] 2001/09/04 (火) 17:18:02
すいませんヘルプです。
SUN SPARC ServerUitra5にモデムをつけようとして
ttyポートを書き変えたらディスプレイが
見えなくなってしまいました。

モデムから入りエミュレータ−から見るととプロンプトのところに?<クエスチョンマーク>がでてこんな事になってます。
ok の後に ls−a をやって見ました。

ls -a
f006cd5c SUNW,UltraSPARC-IIi@0,0
f005f2f8 pci@1f,0
f004cd88 virtual-memory
f004c7a8 memory@0,10000000
f002ccf0 aliases
f002cc80 options
f002cb48 openprom
f002cadc chosen
f002ca6c packages
ok
ディスプレイを復活させるためには
どうすれば良いのでしょうか?

No. 2122 # 68user 2001/09/11 (火) 02:12:31
とっても今さらですが、

>>2119 CCIE
> 前に定義したものが残っているのでそれを破棄するってことはできるんでしょうか?
最小限のスクリプトを見せてもらえればわかるかもしれません
(し、わからないかもしれません)。

>>2121 木島 透
すいません、わかりませんです。


ところで、また UNIX の部屋のカウンタが壊れているなぁ。
    http://X68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/public_html/count/countup.pl?rev=HEAD&content-type=text/x-cvsweb-markup
で怪しそうなところと言えば、
    sub counter_increment {
          ...
          myopen(OUT,"> $countdir/count.$ARGV[0]") || exit;
          print OUT "$num\n";
          close(OUT);
    }
ここらへんでブラウザが中断されて SIGPIPE 受けた、くらいしか
思い付かない。

ちなみにこのサーバは行儀の悪いロボットのせいか、しょっちゅう
    file: table is full
となります。この前は apache が落ちた形跡があるし。うーむ。

No. 2123 # マイ [E-mail] 2001/09/14 (金) 23:47:56
みなさん、はじめましてこんばんわ。
IPなど、とっても私にとっては難しい事なのですが、今困っていて、ここを探しました。
    実はいつも行くHPの掲示板などに、荒らしがヒドイんです。
管理人さんは、海外にいるとか、何とかで・・・。管理されていないんですよね。元々は、すごく雰囲気がよくて、みんなが楽しめていた掲示板だったんですが・・・。荒らしが多すぎて、無視して、カキコミしてたら、ほんの数時間前にカキコミしたのが、消えてしまっている・・・その位、ひどいんです。
    どうにか出来ないものでしょうか?記事の削除などは、管理人さんしか出来ないですよね?でも、管理人さんが管理をしないので・・・。
    困ってしまって・・・。そしたら、IPで、拒否できるっていう情報を聞きました。それも、管理人さんじゃないと出来ない方法なのでしょうか?
    無知すぎる自分も悪いんですが・・・一日も早く、荒らしがいない掲示板に戻ってほしいと思っています。なにか、いい方法があるかたは、教えていただきたいです。
    長々と申し訳ありませんでした。

No. 2124 # 68user 2001/09/15 (土) 01:15:26
>>2123 マイ
> 記事の削除などは、管理人さんしか出来ないですよね?
そうです。第三者には出来ません。

> IPで、拒否できるっていう情報を聞きました。それも、管理人さん
> じゃないと出来ない方法なのでしょうか?
これも管理人が特定の IP アドレスを拒否するようにしないと
いけません。

結局のところ、現在の掲示板をそのまま生かすなら、
    ・管理人にちゃんと管理してくれ、と頼む
    ・管理人からパスワードを教えてもらうなどして、管理者の権限を譲り受ける
        (それを許さないようなプロバイダの規約があるかもしれませんので、ご注意あれ)
のどちらかしかないでしょう。

IP アドレスの制限については、掲示板の形態がわからないと
何とも言えませんが、CGI プログラムを使っているのならば
    http://www2s.biglobe.ne.jp/~cru/library/zddbbs/zddbbs0.html
が使えると思います。

No. 2125 # RUB 2001/09/19 (水) 13:46:11
みなさまはじめまして。
場違いな質問かもしれないのですが、
皆様ご親切なので質問させていただきます。
ただいま、当方、UNIXCにて、プログラムを作っております。
そこで、telnetやTeraTermを起動した時に
ユーザID、パスワードの認証があると思うのですが、
それと同様のことを、Cのプログラムの中で行ないたいのです。
<例>
ユーザ名を入力してください → USERA
パスワードを入力してください → (キーボードを入力しているが出力されない)
このような設定(記述)のしかたをご存知の方いらっしゃいますでしょうか?
また、この時に入力されたフィールドをscanfで読み取ることは可能なのでしょうか?
もし、ご存知な方がいらっしゃったら教えていただきたいです。

宜しくお願いいたします。

No. 2126 # 68user 2001/09/20 (木) 06:08:20
>>2125 RUB
UNIX と言ってもいろいろあるので、ちゃんと環境を書きましょう。
以下、FreeBSD と仮定して説明しますが、Solaris でも同じはずです。

> パスワードを入力してください → (キーボードを入力しているが
> 出力されない)
    http://www.jp.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/gen/getpass.c?rev=1.9
の getpass が参考になるでしょう。

要は、tcgetattr して、ECHO を落として (NOECHO にする)、
tcsetattr することで、tty ドライバの echo back を OFF
にできます。より詳しい情報は termios(4) をどうぞ。

もっとお手軽にやりたいなら、
    http://X68000.startshop.co.jp/~68user/net/ftp-5.html
の stty の部分を読んでください。

No. 2127 # つちだ [E-mail] 2001/09/20 (木) 19:12:03
お世話になります。
土田@アグレです。

今、ブラウザの変わりになるCOM++のDLL(つまりTCP/IPのブラウザプログラム)
を作成しています。
HTTPサーバがWebLogic5.1なのですが、電文そのものはあっているのに、最初から
「HTTP 1.1 400」のエラーが帰ってきてしまいます。
ソケットのコネクションに問題があるのではと考えているのですが、わかりません。
どなたかお知恵を拝借させていただければ幸いです。
ちなみにコーディングは以下のとおりです。


    int AuthSocket::connectAgent(SOCKET sock, long *iPort, long *iRetry,
sockaddr *sockAddr)
{
          struct sockaddr_in sockAddrIn;
          int res, i;

          memset(&sockAddrIn, 0x00, sizeof(struct sockaddr_in));
          sockAddrIn.sin_family=AF_INET;
          sockAddrIn.sin_addr.s_addr=inet_addr("127.0.0.1");
          sockAddrIn.sin_port=htons((unsigned short)*iPort);
          sockAddr=(struct sockaddr *)&sockAddrIn;

          res=ECCOM_SUCCESS;
          for (i=0; i<=*iRetry; i++) {
            if (SOCKET_ERROR==connect(sock, sockAddr, sizeof(struct sockaddr_in)))
{
                      res=ECCOM_FAILURE;
            } else {
            res=ECCOM_SUCCESS;
              break;
            }
          }
  return res;

よろしくお願いします。}

No. 2128 # 68user 2001/09/21 (金) 01:52:40
>>2127 つちだ
> 電文そのものはあっているのに
これはどうやって確かめましたか? 具体的に何を送っていますか?

400 Bad Request が返ってくるなら、やはりまずはリクエストを
疑うべきだと思います。

No. 2129 # 福助 2001/09/21 (金) 13:37:53
初めて投稿させていただきます。

突然の質問なのですが、SolarisでGNUを使わずに前日の日付を取得する方法というものはあるのでしょうか?

No. 2130 # 68user 2001/09/21 (金) 14:14:11
>>2129 福助
env TZ=JST-15 date がお手軽でしょうか。
  

No. 2131 # 68user 2001/09/21 (金) 14:59:54
>>2130 68user
違った。env TZ=JST+15 date でした。

No. 2132 # ふくし [E-mail] 2001/09/24 (月) 17:53:49
すいません、HTML で質問です。
charset ですが、
西ヨーロッパ語(ISO-8859-1)と
日本語(Shift_JIS 希望)を一枚の Web ページで共存できるでしょうか?

以下の方法はいずれもダメでした。

・font face でフォント名を指定
・meta タグを2個書く

もしご存知でしたらご教示ください、、。

No. 2133 # へにか [URL] 2001/09/24 (月) 19:14:24
>>2132 ふくし
http://henika.virtualave.net/untitled.htm
みたいのでよければ、
http://www.ne.jp/asahi/minazuki/bakera/html/reference/charref
(最後にスラッシュはつけない)
を参考に、文字実体参照を使用すれば可能かと思います。

それ以外の方法は、unicodeぐらいでしょうか?

No. 2134 # ふくし [E-mail] 2001/09/24 (月) 19:57:18
>>2133 Mr.
おおっ文字参照、忘れていました。ありがとうございます!
(ちなみに IE6 では見えますが、NC4.75 では見れない、、)

結局 charset は仕様上ページ単位で混在させられない、
ということなんでしょうかねー。

No. 2135 # ふくし [E-mail] 2001/09/24 (月) 19:58:08
>> 2133 へにかさん
掲示板のウラをついて敬称をつけようとして失敗しました ;;;
すいません。

No. 2136 # ふくし [E-mail] 2001/09/25 (火) 14:14:45
教えてくんで申し訳ありません。
会社の FreeBSD に telnet していたのですが、
急に ssh を使えということになり、
愛用の TeraTerm に TTSSH を組み込もうとして苦戦中です。
いろんな Web を参考に、したことは以下の通り。

・TTSSH のバイナリ−を展開して TTERMPRO ディレクトリに入れた
・空のテキストファイルを作って ssh_known_hosts と名づけて
    TTERMPRO ディレクトリに入れた
・TTSSH.exe を起動し、とりあえず接続しないで環境設定へ
・[Setup]-[SSH] で [SSH Known Hosts] の [Read/Write Files] に
    ssh_known_hosts をいれて [OK]
・[Setup]-[Save setup] を実行し、普段使っている teraterm.ini を指定
・teraterm.ini に [SSH] セクションが加わっており、その中に、
    KnownHostsFiles=ssh_known_hosts という行があるのを確認
・同じセクションの Enabled= をなんとなく 1 に
・再び TTSSH.exe を起動
・[Host] を正しく指定し、[port] を 22 番にし
    (ssh のポートが 22 番であることは管理者に確認済み)
    [Service] を SSH にして [OK] をクリック
・メッセージが出る。

SECURITY WARNING
There is no entry for the server "正しいサーバー名" in
your list of known hosts. The machine you have contacted
may be a hostile machine pretending to be the server.


If you choose to add this machine to the known hosts list
and continue, then you will not receive this warning again.

        □ Add this machine and its key to the known hosts list」
    ・チェックボックスをチェックして [Continue] をクリック
    ・メッセージが出て終了。

TTSSH
The host and its key cannot be added, because no known-hosts file has been specified.
Restart Teraterm and specify a read/write known-hosts file in the TTSSH Setup dialog box.

All the encryption algorithms that this program and the server both understand have been disabled.
To comunicate with this server, you will have to enable some more ciphers
in the TTSSH Setup dialog box when you run Teraterm again.
This connection will now close.

・再び TTSSH.exe を起動し、接続せず、[Setup]-[SSH] を見ると、
    [Read/Write Files] には何も入っていない。

・ssh_known_hosts のプロパティは「読み込み専用」にはなっていない。

こういう状況です、、。

No. 2137 # ふくし [E-mail] 2001/09/25 (火) 16:04:02
もうしわけありませんでした、状況が変化しました。
Windows 2000 Server と Windows 95 OSR 2.1 を使っているのですが、
下の現象は 2000 でのものでした。
95 を使ったら状況が変化しました。
下の現象(ssh_known_hosts が作られず、つくっても認識しない)は置きませんでした。
たぶん Program Files 配下のフォルダのアクセス権の違いだと思います。

Windows 95 で TSSH.exe で入ろうとすると、
またキーをつくるかと言われたのでチェックしたら、
次回からは聞かれなくなり、
TTERMPRO フォルダの下に ssh_known_hosts が自動的にでき、
その中にホスト名と「公開鍵」が入りました。

それはいいのですが、入ろうとすると、RCA 秘密鍵を指定する方法しか選べません。
FreeBSD に Telnet で入って ssh-keygen で identity を作って
それを TTERMPRO フォルダにコピーし、指定したのですが、
Authorization Failed になって入れない状態です。

以上とりあえずのご報告でした。
あせって情報が整理されないままにポストしてしまい申し訳ありませんでした。

No. 2138 # ふくし 2001/09/25 (火) 20:47:22
ひとりで騒いでてすみません。
だいぶわかりました。
・ファイルがあるのに「エントリがない」と怒られ、
    「追加してくれ」と言ったらさらに怒られて終了する件は、
    ssh ログインと同時に同じ Teraterm をもう1個起動しているときと
    わかりました。(^^;
・TTERMPRO/ssh_known_hosts は、なくても勝手に作ってくれ、
    管理者が定めたリモートホストの公開鍵を自動的に取ってきてくれると
    わかりました。
・あとは自分用の公開鍵と秘密鍵のセットを何らかの方法で作り、
    秘密鍵を TTERMPRO に入れて [Setup]-[SSH Authorization]-[Use RCA Key to login] で
    指定し、
    公開鍵をリモートホストの ~/.ssh/authorization_keys という名前で保存すればいい、
    らしい。
・うちのリモートホストは RCA 暗号鍵必須らしい。
    (ログインするとき Use plain password.. がグレイアウトするので)
ということがわかりました。

が、依然ログインできません。
正しいパスフレーズを入力してるはずなのに Authorization に失敗します。

No. 2139 # 2001/09/25 (火) 22:56:01
書き込みは2回目です。
プログラムというよりはアイデアの問題かも知れませんが,どなたか教えて下さい。
プロバイダのサーバ(UNIX)にPerlで書いたプログラムを送ってCGIを動かしています。よろしくお願いします。
質問1:
フレームで区切られたhtmlのページからsubmitボタンでCGIに飛びます。
CGIではprint "Location: $str\n\n";を使って別のhtmlページへ飛ぶようにしています。
この時,そのフレーム部分だけが別のhtmlページへ飛びますが,
ウィンドウ全体(親ウィンドウ)を別のhtmlページ

No. 2140 # 2001/09/25 (火) 22:59:35
すみません,文が途中で切れてしまったので,再投稿させていただきます。
−−−−−
書き込みは2回目です。
プログラムというよりはアイデアの問題かも知れませんが,どなたか教えて下さい。
プロバイダのサーバ(UNIX)にPerlで書いたプログラムを送ってCGIを動かしています。
質問1:
フレームで区切られたhtmlのページからsubmitボタンでCGIに飛びます。
CGIではprint "Location: $str\n\n";を使って別のhtmlページへ飛ぶようにしています。
この時,そのフレーム部分だけが別のhtmlページへ飛びますが,
ウィンドウ全体(親ウィンドウ)を別のhtmlページへ飛ぶようにできないものでしょうか。
質問2:
FORMから入力された文章中の半角カタカナを全角カタカナに変換したいのですが
半角カタカナを(文字化けしないで)半角カタカナとして
CGIで受け取る方法はあるでしょうか。
FORMから入力された文章をEUCでconvertする前に文字化けしてしまうので(?),
jcodeのh2z_eucを使っても上手くいきません。

No. 2141 # 2001/09/25 (火) 23:03:58
あ,UNIXにもいろいろあるのですね。
ソフトはFreeBSDです。

No. 2142 # 68user 2001/09/26 (水) 11:55:33
>>2138 ふくし
うーん、TTSSH は使うこともありますが、いつも plain password で
やってるのでわかりませんです。すいません。

>>2140
> ウィンドウ全体(親ウィンドウ)を別のhtmlページへ飛ぶように
> できないものでしょうか。
多分 Location ではどうにもならないと思うので、CGI で
    Content-type: text/html

    <html><body onload="document.myform.submit()">
        <form name=myform action="hoge" target="fuga" method="get">
        </form>
    </body></html>
てな HTML を吐くのはどうでしょうか (最近ちょっと Javscript を
覚えた)。

> 半角カタカナを(文字化けしないで)半角カタカナとして
> CGIで受け取る方法はあるでしょうか。
普通、何もしなければ文字化けはしません。perl は扱っている
データが半角カナかどうかを意識しませんので。

具体的にどういう処理を行って、どううまくいかないのですか?

No. 2143 # ふくし [E-mail] 2001/09/26 (水) 15:23:57
>68user さん
いつもお世話になっております!
結局、
・TTSSH は RSA 暗号鍵しかサポートしていず、
    一方うちの FreeBSD は DSA 暗号鍵しかサポートしない
    (%ssh -V の結果は
        OpenSSH_2.5.2p2, SSH protocols 1.5/2.0, OpenSSL 0x...)
ということらしいです??? よくわかりませんが、、。
ということで、
・DSA をサポートする Windows SSH クライアントで、
    ぼくがしたいこと(Emacs を使って Perl をいじったり
    Mew でメールを読んだりする)ができるものを探す
・Cygwin を使う(と、出来るらしい)
・DSA をサポートする Windows SSH クライアントで接続し、
    別マシンの Telnet ポートをポートフォーワーディングして
    Telnet で使う
・会社のマシンを RSA にしてもらう
などの認識でいいのか、検討中です。

ところで、本掲示板の趣旨は理解しているのですが、
ちょっと事情があってあせっています。
(来週にも Telnet 禁止になるらしい、、、)
ココ以上の掲示板が見つかるかわからないのですが、
場合によっては同趣旨の質問を別の場所に
マルチポストしていいでしょうか?
ずうずうしいですが非常時ということでご検討お願いします、、。

No. 2144 # 福助 2001/09/26 (水) 17:04:47
先日はありがとうございました

今回もまた質問で恐縮なのですが、cshのシェル変数のstatusのようなものはbshにはないのでしょうか?スクリプトを作る際、2種類のファイルを比較しそのファイルに違いがあればエラー処理ということを実行したいのですが・・・。何卒よろしくお願いいたします

No. 2145 # にゃ 2001/09/26 (水) 17:36:56
> ふくしさん

~/.ssh/authorization_keysではなくて、~/.ssh/authorized_keysということではないですか?
openssh_2.3から2.9にして使ってますがどちらもRSAが使えないということはありませんでした。
もしくはビルドする際のオプションが違うとか。

No. 2146 # 68user 2001/09/26 (水) 19:03:14
>>2143 ふくし
> (来週にも Telnet 禁止になるらしい、、、)
おすすめしているわけではありませんが、ssh の plain password で
運用するのはダメですか?

> 場合によっては同趣旨の質問を別の場所にマルチポストしていいでしょうか?
どうぞ。結論が出たら教えて下さい。

>>2144 福助
> 先日はありがとうございました
上の「使い方」を読んでください。で、結果を報告するようにして下さい。
もしそれが面倒でしたら、申し訳ありませんが掲示板の使用はご遠慮下さい。

> cshのシェル変数のstatusのようなものはbshにはないのでしょうか?
$? です。

No. 2147 # ふくし [E-mail] 2001/09/26 (水) 19:40:23
68userさん>
(plain password の件)
    TTSSH の初期画面で、plain password の部分が
    (というか、RSA 鍵の使用以外の部分が)
    すべてグレーで使用不可になっているんです。
    たぶん接続先の ssh の設定だと思います。

(マルチポストの件)
    ありがとうございます。
    でもその必要なくなりました。

にゃさん>

すいませんその通りだったようです、、、;;;;;;
ということで開通しました!
わーんこれで来週も生きられる、、
(Teraterm/Emacs/Mew 依存症なだけなんだけど、、)

No. 2148 # 2001/09/26 (水) 22:20:27
>>2142 68user
御返事ありがとうございました。
Javascriptはよくわからないので,まずはそのままprintでCGIに入れてみましたが
Internal Server Error……と言われてしまいました。
どの部分かは書き換える必要があるのでしょうか。
ジャンプ先のURLはどこに入るのでしょうか。
Javascriptに解決方法がありそうということであれば,
そちらを勉強してみてそれから再度報告しますが,
今回の件を解決する上で勉強上のポイントがあれば教えてください。
お願いばかりですみません。

> 具体的にどういう処理を行って、どううまくいかないのですか?
ウェブページ上のフォームに半角カナで入力してsubmitボタンで送り,
受け取ったCGIで,「=」で$key,$valにsplitした後に%inに入れて

while (($key,$val) = each %in) {
                jcode::convert(\$key, 'euc');
                jcode::convert(\$val, 'euc');
                if ($val eq 'http://') { $val = ''; }
                $val =~ s/\r\n|\r|\n//g;
                $val =~ s/,/,/g;
                $in{$key} = $val;
}

なんてことをやっています(途中の置換は今回の件とは関係ないと思いますが……)。
この後,CGI上でhtmlを書き出して$valをウェブページに表示させると文字化けします。

例えば,半角カナで「アイウエオ」と入れると「竺軸宍雫七」となりました。

No. 2149 # にゃ 2001/09/26 (水) 23:34:03
> ふくしさん

よかったですね。
protocol versionsを2だけに制限されるところもあると思うので気になってました。
公開鍵暗号の認証の方がssh-agentを使えるので慣れば楽だと思います。
TTSSHだと関係ないですがCygwinからなら使えますし。

あと、何か変なことがあったら、
ssh -v
で挙動を調べると原因がわかることが多いです。

> Teraterm/Emacs/Mew 依存症なだけなんだけど、

OSを変えてしまった方が楽の様な気が・・。

No. 2150 # 2001/09/26 (水) 23:47:08
>>2122 68user
> ところで、また UNIX の部屋のカウンタが壊れているなぁ。
ご存知だったらすみません。
受け売りですが,カウンタ記録ファイルを2つ用意するといいみたいです。
単純な方法ですが,効果抜群とか……。
自分はそんなにアクセスが集中するページを持っていないので,
効果の確認はできていませんが……。

↓自分がデータベース用に使っているPerlのスクリプトです。

@file1 = stat($logfile1);
@file2 = stat($logfile2);
if ((@file1[9]) > (@file2[9])) {
                $rfile = $logfile1; $wfile = $logfile2; }
else{
                $wfile = $logfile1; $rfile = $logfile2;
}

&lockwait; #←ファイルロック用のサブルーチンです。
if (!open(DB,"$rfile")) { &error('データベース読取エラー','復旧をお待ちください。'); }
@lines = <DB>;
close(DB);
rmdir($lockfile);

No. 2151 # 68user 2001/09/27 (木) 02:18:44
>>2148
> そのままprintでCGIに入れてみましたが Internal
> Server Error……と言われてしまいました。
Javascript はブラウザ側で解釈するものなので、Internal Server
Error が起きたということは CGI 側の問題です。perl -c などで
文法チェックをしてみて下さい。おそらくは
    print "<html><body onload="document.myform.submit()">\n";
などと、" の中に " をそのまま書いたか、Content-type ヘッダの
先頭に空白を入れたか、というところではないでしょうか。

> ジャンプ先のURLはどこに入るのでしょうか。
form の action です。

> 「竺軸宍雫七」
それは perl や jcode.pl 的には化けていません。EUC-JP の半角カナの
「アイウエオ」は
    8e b1 8e b2 8e b3 8e b4 8e b5
です。一方、Shift_JIS の「竺軸宍雫七」は
    8e b1 8e b2 8e b3 8e b4 8e b5
です。つまり全く同じコードであって、同じバイト列を EUC-JP と解釈するか、
Shift_JIS と解釈するかで表示が違う、ということになります。

で、エンコーディングを解釈するのはブラウザの仕事なので、
ブラウザが誤認しないように
    print "Content-type: text/html; charset=EUC-JP\n\n";
と適切なエンコーディングを指定してやればよいです。

> jcodeのh2z_eucを使っても上手くいきません。
この件は具体的に書いたスクリプトを提示して下さい。

>>2150
> カウンタ記録ファイルを2つ用意するといいみたいです。
なるほど。ただその手法は壊れる確率は低いけど正確なカウントは
できないように見えるので、ある意味「逃げ」かなぁとは思います。
完璧な排他ができないはずはないと思っていますので。

このページは自己満足のためにあるのでその手法は選びませんが、
仕事となればそういう解もありだとは思いますので、全面的に
否定しているわけではありません。

No. 2152 # /tk 2001/09/27 (木) 02:46:39
>>2140
> フレームで区切られたhtmlのページからsubmitボタンでCGIに飛びます。
であれば, submit が含まれている form の target に "_top" を
指定すれば良いだけに思えますが・・・

> EUCでconvertする前に文字化けしてしまうので(?)
というのは, どのように確認されましたか?

>>2150
> if ((@file1[9]) > (@file2[9])) {
スライス?

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 2153 # /tk 2001/09/27 (木) 02:49:20
>>2152 /tk
ありゃ?
3点リーダって駄目なのか。

すいません。以後気をつけます。

No. 2154 # /tk 2001/09/27 (木) 02:58:48
連続ですいません。

>>2153 /tk
単にウチのIMEが3点リーダでは無く
半角中黒3つに変換していただけでした。

No. 2155 # 68user 2001/09/27 (木) 03:31:48
>>2061-2071
なぜ HELO や EHLO を送るのかという話ですが、http://www.sk-jp.com/book/javamail/
の本には
    helo は、Sender MTA んもホスト名を記述することになっている。
    しかし、現在はここに何を書いても意味をなさないようになって
    いる。なぜなら、現在ではクライアントがグローバルなホスト名を
    持たないことが多いので、記述すべき内容がない & 正しいかどうかを
    検証する手段もない。
というようなことが書いてあります。なので、歴史的な事情、というのが一点。

さらに
    http://djbdns.jp.qmail.org/djb/smtp.html
にあるように、EHLO のレスポンスにより、その SMTP サーバで使用可能な
コマンドがわかるので、MUA はこれを読んで適切なコマンドを送るように
すべき、というのが一点。

…でどうでしょうか? (そんなことはわかっておられるような気が
とてもしますが)

ちなみにこの本、JavaMail (Java 用 POP・SMTP・IMAP の API) を
使う人なら文句なくおすすめです。

>>2140
> であれば, submit が含まれている form の target に "_top" を
> 指定すれば良いだけに思えますが・・・
ああ、なるほど。ごもっともです。

No. 2156 # Nira 2001/09/27 (木) 20:38:06
始めまして。
C言語のネットワークプログラミング参考にさせて頂いて
おります。m(_ _)m
一つ質問なんですが、httpsのサイトを取得する時、
プロキシー経由の場合はどのようになるのでしょうか?
google等で検索してみたのですが、分かりませんでした。
最初にプロキシーに対して、
CONNECT **.com:443 HTTP/1.0
HOST: **.com
って感じでやるのかなぁって所まで分かったのですが、、
ご存知の方いらっしゃいましたら、ヒントだけでも頂きたい
です。宜しくお願い致します。

No. 2157 # 2001/09/27 (木) 21:45:08
長文ですみません……。

>>2115 68user
> " の中に " をそのまま書いた
その通りです。うっかりしてました。

> form の action です。
htmlと同じなのですね。
strはよく見るのですが,hogeとかfugaは知らなかったので……。
よければ意味を教えて下さい。

> つまり全く同じコードであって、同じバイト列を EUC-JP と解釈するか、
> Shift_JIS と解釈するかで表示が違う、ということになります。
なるほど。

> print "Content-type: text/html; charset=EUC-JP\n\n";
> と適切なエンコーディングを指定してやればよいです。
やってみましたが,同じ結果でした。うーん……悩む……。
ちなみにこうする前は,
Content-type: text/html\n\n

<META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=x-euc-jp">
を入れていました。

> > jcodeのh2z_eucを使っても上手くいきません。
> この件は具体的に書いたスクリプトを提示して下さい。
require 'jcode.pl';
jcode::convert(\$str, 'euc');
jcode::h2z_euc(\$str);
です。

> なるほど。ただその手法は壊れる確率は低いけど正確なカウントは
> できないように見えるので、ある意味「逃げ」かなぁとは思います。
> 完璧な排他ができないはずはないと思っていますので。

そうですね。
私は「累計」を正確にカウントすることに意味があるのか疑問なので
(カウンタは目安だと思っているので)気にしていないのですが,
プログラム的にはつきつめる価値はあると思います。

>> 2152
> であれば, submit が含まれている form の target に "_top" を
> 指定すれば良いだけに思えますが・・・
formにtargetが使えることを知りませんでした。
やってみたら上手くいきました。ありがとうございました。

> > EUCでconvertする前に文字化けしてしまうので(?)
> というのは, どのように確認されましたか?
いえ,確認できていないので(?)を付けています。
ただ,convertした後に半角カナを拾い出すスクリプトを入れていて,
文字化けした後の文に含まれている半角カナは拾うことができているので,
なんとなくそうなのかな……と思いました(根拠になっていませんね)。
例)半角カナで「明アイウエオ」とすると「フタ竺軸宍雫七」(フタ:半角カナ)に
文字化けし,「フタ」を拾い出すことができています。

> スライス?
すみませんが,意味がわかりませんでした。
ちなみに,このやり方は本屋で買った書籍から知りました。

No. 2158 # 68user 2001/09/30 (日) 20:33:52
>>2157
> hogeとかfugaは知らなかったので……。
hoge の意味ですか? ならこちらを。
    http://www.selab.tutkie.tut.ac.jp/~yoshida/hoge.html

> require 'jcode.pl';
> jcode::convert(\$str, 'euc');
> jcode::h2z_euc(\$str);
それで正しいと思います。

それでも化けるなら、文字列処理をしている全ての処理
    - ブラウザから渡された「%8e%b1%8e%b2」というような URL エンコード
        された文字列
    - & で split した文字列
    - = で split した文字列
    - URL デコードした文字列
    - EUC に変換した文字列
で、print 文でデータを出力してみて下さい。そしたらどこで化けて
いるかわかるでしょう。また、フォームが書いてある HTML の文字
コードが何になっているかも調べて下さい。

わからなかったら、最小限まで切り詰めたソースを見せて下さい。

>>> if ((@file1[9]) > (@file2[9])) {
>> スライス?
> すみませんが,意味がわかりませんでした。
$file1[9] が正しい、ってことでしょう。

> ちなみに,このやり方は本屋で買った書籍から知りました。
$file1[9] や (@file1)[9] なら正しいですが (わざわざ後者の書き方を
する必要はありませんが)、@file1[9] は誤りです。本当にそう書いてあるなら
その本は捨てましょう。

>>2156 Nira
> CONNECT **.com:443 HTTP/1.0
> HOST: **.com
ここまでは正しいと思います。その後は暗号化したリクエストを
送りますが…暗号化まで自力でやろうとしておられます?

No. 2159 # Nira 2001/10/01 (月) 12:23:45
>>2158 68user
ご返答ありがとう御座います。

>ここまでは正しいと思います。その後は暗号化したリクエストを
>送りますが…暗号化まで自力でやろうとしておられます?

CONNECTメソッドまでは正しいですか。
暗号化を自分でやるだけの知識は無いです。(--;)
CONNECTした後は、サンプル通りのにやっているのですが、
SSL_connect()で0が返ってきます。
方法が正しいなら他の部分のバグかもしれないっすね。

そういえば、httpsの取得に良いサイトを発見しました。
https://www2.ggn.net/cgi-bin/ssl
です。http://www.moxienet.com/lynx/ssl-testから
リダイレクトされるサイトで、LynxでSSLが使用できる
かどうかをチェックするためのサイトらしいです。

No. 2160 # Nira 2001/10/01 (月) 13:29:18
>>2158 68user
ありがとう御座いました。

理由はわからないのですが動くようになりました。
SSL_load_error_strings();
の後に
  ERR_load_crypto_strings();
  ERR_load_SSL_strings();
  OpenSSL_add_all_algorithms();
を追加してみたら、難なく動きました。(--;)
http://www.openssl.org/docs/crypto/BIO_f_ssl.html
のサンプルを見てたら、上記3つの関数を呼んでいたので
真似してみました。

お騒がせ致しました。m(_ _)m

No. 2161 # あやの 2001/10/02 (火) 15:08:46
はじめまして
最近CGIを作りはじめたして、問題が・・・

サーバはUNIXでCGIの処理を行なった後に作られたファイルの所有権がすべてnobodyになってしまっていて、その作られたファイルの操作が全くできなくなってしまいました。所有権の変更も出来ないんです。
だれか助けて下さい。。
おねがいします。

No. 2162 # 68user 2001/10/02 (火) 16:51:17
>>2159 Nira
> そういえば、httpsの取得に良いサイトを発見しました。
ありがとうございます。このページをサンプルとして載せておきます。

>>2161 あやの
> その作られたファイルの操作が全くできなくなってしまいました。
    #!/usr/bin/perl
    system("rm -f ファイル");
    print "Content-type: text/plain\n\n";
    print "File removed.\n";
というような CGI スクリプトを作って、ブラウザから CGI に
アクセスすれば消せます。

> 所有権の変更も出来ないんです。
普通ファイルの所有者を変更できるのは root のみです。
# 設定次第でできる OS もありますが。

よって、
    - 事前にファイルを作成しておき、nobody が中身を変更できる
        ようにパーミッションを設定する。
    - ファイルの所有者は nobody とし、他のユーザがそれを
        参照・変更できるようにパーミッションを設定する。
    - ファイルの所有者を nobody 以外とする。
            サーバ管理者に suExec や cgiwrap を入れてもらうか、
            自分で suid なプログラムを作る。
            # http://x68000.startshop.co.jp/~68user/webcgi/permission.html
のいずれを選ぶ、ということになります。

No. 2163 # けんじ 2001/10/02 (火) 18:37:28
はじめまして、こんばんはっす。
突然ですがシェルスクリプトをつかってファイルを
書き換えようとしてるのですが
"ディレクトリースタックの番号指定が深過ぎます."
とコメントされ動いてくれません。どういうことなんでしょうか?
ちなみに このシェルスクリプトです。
わかるかたがいたら教えて下さい。
#!/bin/tcsh
set d=1
while(d<=16){
  cat -n invar3_$d.dat > ninvar3_$d.dat
  d++}
end

No. 2164 # 68user 2001/10/02 (火) 19:48:51
>>2163 けんじ
突っ込みどころがたくさんありすぎて書ききれないので、とりあえず
動くものを置いておきます。
    #!/bin/tcsh
    set d=1
    while ( $d < 16 )
        cat -n invar3_$d.dat > ninvar3_$d.dat
        @ d = $d + 1
    end

まずはマニュアルか、初心者向けの csh プログラミングの本を
読んで下さい。よい本が見付からなければ sh で書くのも手です。
sh なら結構な種類の本が出ています。

No. 2165 # けんじ 2001/10/03 (水) 14:29:33
すいません、丁寧に教えていただき
ありがとうございます。
はい、もっともっと勉強していきます!

ただ、perlやshではうまくいってくれるのですが
なぜかcshでは教えてくださったようにしても
"デレクトリースタックの番号指定が深過ぎます."
といって動いてくれません。

特になにも変更等していないのですが、、、、。
なにはともあれありがとうございました!

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 2166 # かな 2001/10/03 (水) 18:44:11
とても長いCGI処理がしたくてforkで子プロセスに処理を投げてあげたときは、ブラウザがすぐ開放されることは分かったんです。でも、処理中にエラーとか発生したときは見た目で分からなくなっちゃうんですよね??
エラーのときはなんか表示させたいのですが良い方法はあるのでしょうか?
それとも長い処理はもっとfork以外の違う方法があるんですかね??

よろしくおねがいします。。。

No. 2167 # 68user 2001/10/03 (水) 20:49:31
>>2165 けんじ
> ただ、perlやshではうまくいってくれるのですが
perl と sh と csh は全く別物ですけど、それは理解されてますか?

> 特になにも変更等していないのですが、、、、。
という文章は、sh で動いたものをそのまま csh でも動かそうと
しているように見受けられます。

> "ディレクトリースタックの番号指定が深過ぎます."
$d<=16 を d<=16 と書けばそうなります。


>>2166 かな
掲示板の一番上にある「使い方」を全く読んでいませんね。
# http://www.parkcity.ne.jp/~chaichan/qanda/qa1999.htm?01-10-03-19-11

No. 2168 # 2001/10/03 (水) 22:54:06
>>2158 68user
> print 文でデータを出力してみて下さい。そしたらどこで化けて
> いるかわかるでしょう。また、フォームが書いてある HTML の文字
> コードが何になっているかも調べて下さい。
やってみたら,どこで化けているかわかりました。
jcode::convert(\$str, 'euc');
で化けていて,これを削除したら化けなくなりました。
なぜでしょうか?
フォームが書いてあるHTMLの文字コードはeucにしています。
その場合は,コンバートする必要がないということでしょうか?
とりあえず解決したみたいなのですが(?),
気になるのでぜひ教えて下さい。

> $file1[9] が正しい、ってことでしょう。
あ,確かに。
本からそのまま写して問題なく動いていたので
全然気付きませんでした。
人に見せると恥ずかしいので,早速,修正しました。
ありがとうございました。

> その本は捨てましょう。
あはは(^^;
確かに,少なくとも私のような初心者は
正しい記述の本で勉強した方がいいでしょうね。
私でも気付くような間違いがあちこちにあることは確かです。
でも,プログラミングのアイデアというかミソというか
参考になる点もたくさんあって,結構重宝してます。

No. 2169 # ジュン [URL] [E-mail] 2001/10/04 (木) 01:33:36
とても初歩的な質問だと思いますが、教えて下されば幸いです。
掲示板を最近設置したのですが、サーバがアメリカにあるため
時差があるタイムスタンプをします。この時間を 16 時間早めたいのですが
どのような記述をすればいいのか、わからないのです。恐らく下記の一行が関係するのだと思います。

$TimeDiff = 0;

よろしくお願いいたします。また、過去ログを一応見ましたが既出の質問であった場合はお詫び申し上げます。

No. 2170 # 68user 2001/10/04 (木) 01:48:25
>>2168
> なぜでしょうか?
なぜでしょうね? 正確なところは各部分で
    s/([^-_a-zA-Z0-9])/sprintf("%%%02lX",unpack("C",$1))/eg;
として URL エンコードした結果を見ないとわかりません。

> フォームが書いてあるHTMLの文字コードはeucにしています。
> その場合は,コンバートする必要がないということでしょうか?
NN4, NN6, IE4, IE5 あたりなら、フォームの書いてある HTML と
同じエンコーディングで、フォームデータを送ってきますので、
フォームの書いてある HTML と、処理するデータのエンコーディングが
一致しているなら jcode::convert は必要ありません。

ただし、これは規格として明文化されているわけではないので、
あくまでも NN と IE がそういう挙動をする、ということです。
もし Shift_JIS や ISO-2022-JP で送ってくるブラウザがいた
場合は化けます。


>>2169 ジュン
> この時間を 16 時間早めたいのですが
言語は何ですか? 以下は perl だと仮定して…。

$TimeDiff をどのように利用しているのかわからないと
なんとも言えませんが、秒数なら $TimeDiff = 60*60*16、
時間なら $TimeDiff = 16 でしょうか。

localtime を使っているなら、その前の行に $ENV{TZ}='JST-9'; と
書いておけばうまくいくかもしれません。

No. 2171 # スナフキン 2001/10/04 (木) 01:59:50
> その本は捨てましょう。
う〜ん、ここは68userのボードなので構わないのですが、
なんか、2ch化しているようでちょぴりショックだなぁ(^^ゞ

多分typeでしょう、本当にその様に書くことを勧めているのであれば
68userさんと同じ意見ですが…
だけど、椎さんがコマンドの本来の項を読まずに、理解しようとしないで
コピーしているだけであれば、椎さんの手抜きでしょうけど(^^ゞ
まあ、自分もはじめはそうだったので人の事を言えませんが(笑)

ちなみに、テストの為にコンバートした短い文字列を表示していませ
んか?昔のネスケでの挙動ですが、短い文字列の場合はブラウザで文字
コードの判別がつかずに化ける場合があります。
その場合はそこそこの長文を表示すると、うそのように表示される場合
が有りました。
原因はSJISとEUCの文字コードが一部かぶる為です。(自分のスクリプ
トはSJISで記述の為)

あと、よくやるのがEUCでコンバートして出力していながら、CGIの他の
表示部分で違うコードを出力していたり(結構気付かなかったりします)
プログラマーな人は、この様な無駄なトラブルを減らす為にALL EUCで
作る人が多いようですね。

>プログラミングのアイデアというかミソというか
自分の場合は、他人のスクリプトを解析することでいろいろ覚えました。
リファレンス以外はこの手法が一番お勧めです。
無駄を省いたルーチンは誰が作っても大体同じようなものになるはずです。
この掲示板のソースだってかなり勉強になるはずですよ(^^ゞ

>>2166 かな
「使い方」を読むどころか、コピー文章ですね(^^ゞ
ここまで典型的なのもはじめて見ました(笑)


ところで、最近JAVAに嵌まっているようですが、JAVAはJavaScriptと
perlとどちらに近い印象でしょうか?>68userさん
敬遠していたJAVAも覚えた方がいいかなぁ、と思う今日この頃(^^ゞ

No. 2172 # /tk 2001/10/04 (木) 02:02:53
>>2168
> jcode::convert(\$str, 'euc');
> で化けていて,これを削除したら化けなくなりました。
> なぜでしょうか?
とりあえず, getcode 関数の戻り値を確認してみましょう。
http://www.mikeneko.ne.jp/~lab/kcode/jcode.html#h2-1
http://www.din.or.jp/~ohzaki/perl.htm#JP_Code

>>2157
>> スライス?
> すみませんが,意味がわかりませんでした。
ありゃ。すみません。
>>2158 68user
> $file1[9] が正しい、ってことでしょう。
という意味でしたが, 断言する自信が無いのと
もし, 意図的にやっている事ででしたら
その理由が聞きたかったもので…

ちなみにスライスについては
http://www.context.co.jp/perlnews/bn/perl-newsletter-0010.html
http://www.context.co.jp/perlnews/bn/perl-newsletter-0013.html
が参考になると思います。

No. 2173 # ジュン [URL] [E-mail] 2001/10/04 (木) 02:21:11
>68userさん

素早い回答と、明確のお答えありがとうございます。

使っている言語はperlで、秒数の設定により解決しました。ありがとうございました。

No. 2174 # 2001/10/04 (木) 21:46:47
>>2170 68user
> 一致しているなら jcode::convert は必要ありません。
必要ないということは,あってもいいのでしょうか。
つまりeucをeucにコンバートする処理をしても問題はないんですよね?
そうだとしたら,今回の問題はまだ解決できていないということですね。

>>2171 スナフキン
> コピーしているだけであれば、椎さんの手抜きでしょうけど(^^ゞ
ええ,その通りです。まだわからないことが多いので,とりあえず(^^;

> そこそこの長文を表示すると、うそのように表示される場合
> が有りました。
そうかもしれません。ただ,短い文字列を入力するようにしていますので,
根本的に解決しないとダメですね。

> CGIの他の表示部分で違うコードを出力していたり
イメージできないんですが,具体的にどんな場合でしょうか。
エディタでeucで保存するようにしているのですが,
これだけではeucにならないものでしょうか。

> この掲示板のソースだってかなり勉強になるはずですよ(^^ゞ
機種依存文字の検出のところなど,参考にしたいなと思っていました。
とはいえ,今日初めてソースを見たのですが,
理解するのに,かなり時間がかかりそうです。

>>2172 /tk
> とりあえず, getcode 関数の戻り値を確認してみましょう。
おお,これは使えそうですね。やってみます。

> ちなみにスライスについては
なるほど〜。よくわかりました。
必要がないのにスライスを使っていたことになるわけですね。
意図的でなくて申し訳ない感じです。

No. 2175 # TOM 2001/10/04 (木) 23:17:10
こんにちは、はじめましてTOMです。
初級アマチュアプログラマーです。
ちょっと自分で解決できなかったので質問を聞いてください。

・モジュールAに、ライブラリlib30.soをリンクしています。
・モジュールBに、ライブラリlib40.soをリンクしています。
・さらに、ライブラリlib40.soの中で、ライブラリlib30.soの中の関数Func09が
    使用されています。
ライブラリlib30.soの中の関数Func09が修正されました。
再コンパイル、再リンクは、
全て(モジュールA・モジュールB・lib30.so・lib40.so)
行わなければならないのでしょうか?
よろしくおねがいします。

No. 2176 # 68user 2001/10/05 (金) 11:59:17
>>2175 TOM
Func09 の引数の数や、引数の型、戻り値の型を変更しましたか?
また、Func09 から他の部分のグローバル変数を参照するところ
を変更しましたか?

いずれの変更もしてないなら、ライブラリ利用側の再コンパイル・
再リンクは不要です。

引数や戻り値を変えた (=インタフェースを変えた) なら、
再コンパイル・再リンクのし忘れを防ぐため、メジャー番号を
    lib30.so.1 -> lib30.so.2
などと上げた方がよいでしょう。


>2174
>> 一致しているなら jcode::convert は必要ありません。
> 必要ないということは,あってもいいのでしょうか。
あってもよいです。僕は必ず jcode::convert は付けます。

> つまりeucをeucにコンバートする処理をしても問題はないんですよね?
本来問題ないのですが、Shift_JIS の半角カナと EUC-JP を正確に
判別することはできないので、EUC-JP な半角カナを Shift_JIS の
文字列だと誤認してしまい、EUC-JP に変換しようとする、ということは
あります。

一応 jcode.pl がエンコーディングを自動判別する際は、「Shift_JIS と
して解釈できる部分の長さ」と「EUC-JP として解釈できる部分の長さ」を
比較して長さが長い方を採用しますが、もちろんこれでも完璧では
ありません。

# たしか両方の長さが一致したら、EUC-JP とみなされたと思う。

> 必要がないのにスライスを使っていたことになるわけですね。
いいえ、@a[0] はスライスを使っているわけではありません (よね?)。
perl がおせっかいなので @a[0] -> $a[0] という読み替えをしている
だけです。
    % perl -we '@a=(100,200);print "@a[0]\n"'
    Scalar value @a[0] better written as $a[0] at -e line 1.
    100


>>2171 スナフキン
> ところで、最近JAVAに嵌まっているようですが、JAVAはJavaScriptと
> perlとどちらに近い印象でしょうか?>68userさん
うーん、どっちも遠いですねぇ…。でもまぁ僕がやってるのは
サーバサイドの方なので、どちらかと言えば perl ですか。
でも、perl とは似てないですね。

とにかくクラス設計が楽しいです。

No. 2177 # かな 2001/10/05 (金) 13:34:44
すいませんでした。
以後気を付けます。。

No. 2178 # SA [E-mail] 2001/10/05 (金) 14:54:15
はじめまして。

ネットワーク関係の関数でちょっと質問なのですが。

inet_aton(hostname)になっていますがこれをinet_aton (ipaddres)
にしても問題はないのでしょうか?

hostnameが解決されていない場合、IPアドレスをそのまま
使用してみたのですが表面上問題はでていませんが、
内部的にどうかまで分からなかったので。

どなたか教えて下さい。

分かり難い内容の書き込みになってすみません。

No. 2179 # /tk 2001/10/06 (土) 00:15:42
>>2176 68user
> # たしか両方の長さが一致したら、EUC-JP とみなされたと思う。
一致した場合は undef では?

> いいえ、@a[0] はスライスを使っているわけではありません (よね?)。
> perl がおせっかいなので @a[0] -> $a[0] という読み替えをしている
> だけです。
http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
を読んだうえでの僕の解釈は

@a[0] はスライスです。
但し, 要素数が 1 のリストであり, スカラー値ではありません。
たまたま @a[0] をスカラーで評価したときに, その最後の要素である
$a[0] が返されただけです。

となるのですが
例によって勘違いしている可能性大です。

No. 2180 # TOM 2001/10/06 (土) 01:37:19
>>217668user
68userさん
インターフェイスの変更は、ありませんので
ライブラリ利用側を再コンパイル・再リンクせずに利用できました。

回答ありがとうございました。

No. 2181 # 2001/10/06 (土) 12:31:57
/tkさんが教えてくれた↓のページを読むと,
> http://www.mikeneko.ne.jp/~lab/kcode/jcode.html#h2-1

・convert()は内部ではgetcode()を自動的に呼び出し文字コードを判断する
・getcode()では,半角カナは文字コードの自動認識の判断対象からはずされる

とあります。また,スナフキンさんが
> そこそこの長文を表示すると、うそのように表示される場合が有りました。

と言われたように,私の場合も半角カナ以外の文字をある程度以上追加すると
文字化けしないことがあります。
例)アイウエオ(半角)         →竺軸宍雫七(全角)
        アイウエオ(半角)あいうえお(全角)→アイウエオ(半角)あいうえお(全角)

これらのことから,今回の文字化け現象の原因は,convert()が
(正確にはgetcode()が)半角カナの文字コードを
正確に判別できていないことのようです。

これを調べるためにコンバートの前後でgetcode()をかけてみました。

$code1 = &jcode::getcode(\$str);
jcode::convert(\$str, 'euc');
$code2 = &jcode::getcode(\$str);

その結果,次のようになりました。

$str = 'あいうえお'     → $code1 = 'euc',$code2 = 'euc'
$str = 'アイウエオ(半角)' → $code1 = 'sjis',$code2 = 'euc'

つまり,getcode()は半角カナの「アイウエオ」をsjisと判定して
sjisをeucに変換する処理をしていたのです。

長々と書きましたが,68userさんが書かれたように,
> Shift_JIS の半角カナと EUC-JP を正確に
> 判別することはできないので、EUC-JP な半角カナを Shift_JIS の
> 文字列だと誤認してしまい、EUC-JP に変換しようとする、ということは
> あります。

ということのようです。

で,ここでどうするかというプログラム上のアイデアが問われるのですが,
(残念ながら例の本には載っていません・笑)
今は,「$strに全角文字を数個追加して,コンバート後にそれを除く」ということを
考えています。
ただ,自分でもかっこ悪いなぁと思うので,他にアイデアがあれば教えて下さい。


>>2176 68user
> いいえ、@a[0] はスライスを使っているわけではありません (よね?)。

私は/tkさんが教えてくれたページを読んでスライスを覚えたので
No.2179の/tkさんと同じ解釈をしたのですが,
この解釈の違いによって,使い方とその結果が変わるということが
ないのであれば,あまり本質的な問題ではないような気がします。
68userさんが正しい知識を教えようとしてくれる気持ちはとてもありがたいです。

No. 2182 # シイ 2001/10/06 (土) 13:36:53
シイ

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 2183 # shii 2001/10/06 (土) 13:43:10
すみません。下の書込は私,椎です。
今回のことがあって,名前のような文字数が少ないフォームへの
日本語の記入に抵抗を感じたので,
これから椎はやめてshiiにしようと思います。

No. 2184 # 68user 2001/10/08 (月) 00:53:21
>>2178 SA
> inet_aton(hostname)になっていますがこれをinet_aton (ipaddres)
> にしても問題はないのでしょうか?
問題ないと思います。FreeBSD では inet_aton と inet_addr は同じ
関数になってます。
# http://www.jp.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/net/inet_addr.c?rev=1.12.2.1

>>2179 /tk
> @a[0] はスライスです。
ん〜、(@a)[0] とは違うということですか?

>>2179 /tk
> 一致した場合は undef では?
>>2181
> ・getcode()では,半角カナは文字コードの自動認識の判断対象からはずされる
そうでしたっけ…。昔 jcode.pl を読んだときはそうじゃなかった
ような気がしますが、読み違えていたのかもしれません。

> 今は,「$strに全角文字を数個追加して,コンバート後にそれを除く」と
> いうことを考えています。
追加する全角文字のエンコーディングを EUC-JP にするか、Shift_JIS に
するかが問題です。どちらか決めるためには追加対象文字列のエンコーディングを
自動判別しなきゃいけません。で、それが正確にはできないので…と堂々めぐりです。

まぁ、元のフォームが EUC-JP であるということなので、
    /([\x00-\x7F]|[\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\xA1-\xFE])*/
にマッチすれば EUC-JP として解釈できる文字列である、ということですから
無変換、でいいと思います。
# jcode.pl は汎用ライブラリですからそうもいきませんが。

> すみません。下の書込は私,椎です。
名前の部分にカーソルがある状態で Enter を押しても書き込み
しないようにすればよいのかな? (どうやるのかさっぱりわかりません)

No. 2185 # shii 2001/10/08 (月) 09:10:35
>>2184 68user
> 追加する全角文字のエンコーディングを EUC-JP にするか、Shift_JIS
> にするかが問題です。
半角カナ「アイウエオ」の場合,後ろにスペースを3つ追加するだけで
上手くいきました。多分,全角文字なら判別対象になるので,
それをある程度の長さで追記すればいいのかなと思いました。そこで,
html側で別に送った全角文字を追加して判別するつもりでした。

ただ,こちらの掲示板では短い半角カナの「シイ」を判別できたので,
jcode.plのせいではないようです(私の方ではシイも化けました)。
cgi-lib217.plを使っているせいかも……?

人様のプログラムの改造から使い始めたPerlですが,
以前に比べればいろいろなことがわかってきました。
上述のことを確かめる意味でも,
自分が理解できる範囲で1から作り直してみることにします。
(jcode.pjは深く考えずに使いますが……(^^;)
それを検証できたらまた報告しますね。

No. 2186 # スナフキン 2001/10/09 (火) 01:43:48
>>2174
>イメージできないんですが,具体的にどんな場合でしょうか。
すみません、よく読んでいませんでした。
CGIで出力するページソースの中の日本語コメントがSJISでEUCに変換
した日本語を同時に出力と言うケースでしたが、shiiさんの場合は
まったく違うようですね。


>>2176 68user
サーバーサイドという事は常駐システムですね。
さすが68userさん(笑)

自分も先日初心者用のCD付き本を買ってきて、JDKをインストールして
みましたが、いきなりサンプルの Hello! が動かないトラブルで、
既にめげています(笑)

ざっと見た感じでは、関数類を覚えれば特に難しく無さそうな感じも
しますが、甘いかな?(^^;
もしよければ、お勧めの初心者向けサイトを教えてくれると嬉しいです。

>2184
>名前の部分にカーソルがある状態で Enter を押しても書き込み
こういう事でしょうか?

<HEAD〜内
<SCRIPT LANGUAGE="JavaScript">
<!--
function submit_check(){
  if(!document.FORM.elements.MESSAGE.value){
    alert("メッセージを記入してください。");
    return;
  }
  if(!document.FORM.elements.NAME.value){
    alert("名前を記入してください。");
    return;
  }

  document.FORM.submit();
}
//-->
</SCRIPT>

<FORMへ
<FORM METHOD=POST ACTION="$script_name" NAME="FORM" OnSubmit="submit_check();return false;">
外してます?

No. 2187 # SA [E-mail] 2001/10/09 (火) 08:46:43
>68userさん

ありがとうございました。
IPアドレスで使用していきます。

No. 2188 # shii 2001/10/09 (火) 22:42:19
cgi-lib217.plを使わずにreadで読んでやってみましたが
やはり文字化けしました。引き続き調査中です。

No. 2189 # ふくし [E-mail] 2001/10/10 (水) 15:13:48
すいません、また怪奇現象が起こったのでお力をお貸しください。

Excel のワークシートを単純に <a href> タグでリンクすると
クリックすると中が見えてしまう(文字化けの文書として開こうとする)ので、
いぜん別の場所で教えてもらった方法をアレンジして
下のような CGI スクリプトで行っています。

--- download.cgi ---
#! perl

$arg = $ENV{'QUERY_STRING'};
$arg =~ /name=(.*)/;
$excelfile = $1;

$pwd = `pwd`;
chomp($pwd);

unless (open (FL, $excelfile)) {
        print "Content-type: text/plain\n\n";
        print "error opening $excelfile because $! at $pwd";
        exit;
};

print <<HEAD;
Content-type: application/octet-stream
Content-disposition: attachment;filename="$excelfile"

HEAD

print <FL>;
close(FL);
-------------------

これを、
<a href="http:.../cgi-bin/download.cgi?name=test.xls">ここをクリック</a>して xls ファイルを、、
のように呼び出そうという寸法です。

これが、場所によって挙動が異なるのです。

project
| cgi-bin
| | download.cgi
| subproj1
| | aaa.html
| | xxx.xls
| subproj2
| | subdir
| | | bbb.html
| | | yyy.xls


ここで、
http://org/~project/subproj1/aaa.html として見える aaa.html の中に、
<a href="http://org/~project/cgi-bin/download.cgi?=xxx.xls">XXXをダウンロード</a>
と書くとうまくいくのですが、
http://org/~project/subproj2/subdir/bbb.html の中に、
<a href="http://org/~project/cgi-bin/download.cgi?=yyy.xls">YYYをダウンロード</a>
と書くと、
error opening yyy.xls because No such file or directory at /.../project/cgi-bin
と表示されます。
パスが何らかの理由で見えないのかと思って
<a href="http://org/~project/cgi-bin/download.cgi?=../subproj2/subdir/yyy.xls">YYYをダウンロード</a>
と書くと、なんと download.cgi という名前でファイルを保存しようとします。
保存して中を開けてみると、中身はなんと yyy.xls!

1回目の実験は xxx => yyy の順番で行ったので、
何らかのキャッシュが行われているのかと思い、yyy => xxx の順で行っても同じです。

ということでよろしくお願いします。
サーバー側は FreeBSD 2.2.8-RELEASE+Apache(Apache のバージョンの見方がわかりません、、)、
クライアント側は Windows2000 Server+NC4.51 および IE6 です。

No. 2190 # ふくし [E-mail] 2001/10/10 (水) 16:15:59
↓下の件ですが、Apache は 1.2.5 だと管理者からメールが来ました。

No. 2191 # 68user 2001/10/10 (水) 18:03:20
>>2185 shii
そうですか、できましたか。どうも僕だけ話をわかってなくて
間違ったことばかり言っているようです。すみません。


>>2189 ふくし
download.cgi が実行されたときのカレントディレクトリは、download.cgi のある
ディレクトリになっているはずです。

よって、cgi-bin/xxx.xls も cgi-bin/yyy.xls もないので両方失敗するはずです。
なのに xxx.xls だけ成功するということは、cgi-bin/ の下に xxx.xls だけファイルが
置いてあったとか、シンボリックリンクが張ってあったとかいうオチではないかと
思うのですが、いかがでしょうか。


>>2186 スナフキン
> サーバーサイドという事は常駐システムですね。
うーん、CGI を常駐システムと呼ばないのと同じで、Java Servlet も
常駐システムとは呼ばないと思います。

> ざっと見た感じでは、関数類を覚えれば特に難しく無さそうな感じも
> しますが、甘いかな?(^^;
いや、そんなもんじゃないですか? 標準クラスライブラリを組み合わせて
パズルのようにプログラムを組み上げて行く感じです。

書き込みミスをした原因は
>>2184 68user
> 名前の部分にカーソルがある状態で Enter を押しても書き込み
> しないようにすればよいのかな?
のせいですか?>shii さん

もしそうなら
>>2186 スナフキン
> <FORM METHOD=POST ACTION="$script_name" NAME="FORM" OnSubmit="submit_check();return false;">
を組み込みます。

No. 2192 # ふくし [E-mail] 2001/10/10 (水) 19:34:53
>68user さん

すいません、、xxx.xls がなんかのはずみで cgi-bin に
入ってました、、いつもすいません、、。

../ で cgi-bin に遡れないんですね。
(download.cgi として yyy.xls が保存できたのがわからんが、、)
cgi-bin の下に project に対するシンボリックリンクを張って
解決しました。

No. 2193 # shii 2001/10/10 (水) 21:23:39
>>2191 68user
> そうですか、できましたか。どうも僕だけ話をわかってなくて
> 間違ったことばかり言っているようです。すみません。
え。何も間違ってないですよ(と,思うのですが)。
私の書き方がわかりにくかったらすみません。
というか私が無知で,68userさんが書いていることを理解できて
いないような気がします。

> 書き込みミスをした原因は
申し訳ないと思いつつ,半角カナを試させていただいたのです。
ですから書き込みミスではありません。すみません。
プログラム上は同じ事をやっている気がするのに,
どうしてこちらの掲示板では半角カナを判別できるのか
が現在の謎です。
ちなみに,
私のCGIでは「シイ(半角)」が「鴫」と化けます。
有名なTeaCupの掲示板でも同じように化けました。

私がこちらのソースを見ただけでは,わからなかったのですが,
コード判別で何か特別なことをされていますか?

私のjcode.plのバージョンはv 2.3 1997/02/23ですが,
バージョンのせいってことがあるのかな……?

No. 2194 # shii 2001/10/10 (水) 21:50:52
大ショックです。
jcode.plを最新版(v 2.13 2000/09/29)に入れ替えたら
半角カナを認識しました。それだけのことだったのです。
大解決です。ここまでたどりつけたのも皆様のおかげです。
ありがとうございました。
それから,いろいろと変なことを書いたりやったりして
すみませんでした。

ちなみに下に書いた私が使っていたjcode.plのバージョンは,
中に書いてあった記述をそのままコピーして貼ったのですが,
ちょっと変ですね(^^;

No. 2195 # shii 2001/10/10 (水) 22:06:43
思わず,半角カナを認識したと書きましたが,正確には違うようです。
半角カナのsjisとeucは判別しようがないですよね。

中の説明には特に書かれていないようですが,
判別不能な場合の処理として,
古いバージョンではsjisと判断していたところを
eucに判断するようにしたのではないでしょうか。

No. 2196 # shii 2001/10/10 (水) 22:14:31
どうやら,2.3から2.6にバージョンアップしたときに
修正されたようです。以下,引用です。
(バージョンの記述が変だったというのは私の勘違いでした。)
−−−−−−−−−−−−−−−−−−−−−
jcode.pl-2.6 をリリースしました。

    ftp://ftp.iij.ad.jp/pub/IIJ/dist/utashiro/perl/jcode.pl-2.6

2.3 からの変更点は、以下の通り。

    - &jcode'tr の中で JIS コードの認識方法をちょっとだけ変更
    - JIS X 0208-1990 のシークエンスを認識するように変更
    - &jcode'getcode のバグを修正して、説明を追加

--utashiro

No. 2197 # 玉中 2001/10/11 (木) 15:50:55
はじめまして。玉中と申します。
突然の投稿で失礼致します。

1台のパソコンにネットワークカードが複数枚ささっており、それぞれにIPアドレスが割り当てられている場合に、それら全てのIPアドレスを取得するにはどのようにすればよいのでしょうか。言語は C/C++ です。

NIC が1枚だけの場合は、gethostname() と gethostbyname()
で取得できるのですが、複数の場合の取得方法が分かりません。

つまりは、ifconfig コマンドのようなことをやりたいのですが、
どなたか方法をご存知ありませんでしょうか。

よろしくお願い致します。

No. 2198 # SA [E-mail] 2001/10/11 (木) 18:45:51
UDPクライアントをPerlで作成したいのですが
なかなか上手く行きません。

特定のポート番号(例 NTPの123)にメッセージをなげて
そのポート番号が存在するかしないかを確かめたいのですが・・・

どなたか詳しい方いらっしゃいませんか?

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 2199 # 68user 2001/10/12 (金) 01:01:12
>>2198 SA
> 特定のポート番号(例 NTPの123)にメッセージをなげて
送るだけなら、多分こんな感じだったかと。
    use Socket;
    my $iaddr = inet_aton("10.0.0.1");
    my $sock_addr = pack_sockaddr_in(123 ,$iaddr);
    socket(SOCKET, PF_INET, SOCK_DGRAM, 0);
    send(SOCKET, "hoge", 0, $sock_addr);

ただし、
> そのポート番号が存在するかしないかを確かめたいのですが・・・
UDP なので、送ったデータが相手側に到達したかどうかは
判別できません。

>>2197 玉中
> つまりは、ifconfig コマンドのようなことをやりたいのですが、
ioctl & SIOCGIFCONF でやるか、BSD 系なら getifaddrs(3) ってのが
使えるはずです (OS 名くらい書きましょう)。どちらも
    http://www.mmjp.or.jp/pearsoned/washo/network/wa_net28-j.html
の16章に載ってます。

あとは ifconfig のソースなどを参考にして下さい。
    http://www.jp.FreeBSD.org/cgi/cvsweb.cgi/src/sbin/ifconfig/

No. 2200 # /tk 2001/10/12 (金) 01:03:28
>>2184 68user
>> @a[0] はスライスです。
> ん〜、(@a)[0] とは違うということですか?
どちらもスライスだと思うのですが
@a は配列のスライスで, (@a) はリストのスライスかと…
ただし, どちらも一般的には「配列スライス」で括られると思います。

要は, 単数であっても配列やリストの添え字であった場合には
スライスと呼べるだろうという個人的解釈です。

# ↑突っ込み大歓迎モード

No. 2201 # AGE 2001/10/12 (金) 18:37:47
AGEと申します。
Red Hot Linux 7.0J を使用しています。

「ntp-4.1.0.tar.gz」をインストールしてみました。
しかし、rpm のものがあったのでアンインストールしたいのですが
インストールされたファイルを知る方法はあるのでしょうか?
よろしくお願いいたします。

No. 2202 # スナフキン 2001/10/12 (金) 23:29:55
>>2191 68user
ServletもCGIと同じくリクエスト毎に起動するのですか?
不勉強でした。セッション管理ができると言うので常駐するものと
勘違いしていました。

>パズルのようにプログラムを組み上げて行く感じです。
そのパズルが難しそう(^^;

>>2201 AGE
>インストールされたファイルを知る方法はあるのでしょうか?
man rpm をどうぞ。
ntpってRHLに標準で入っている(はず)の xntpdとは別物なんですね。

No. 2203 # AGE 2001/10/12 (金) 23:52:20
>>>2202 スナフキン

>man rpm をどうぞ。

すいません。言葉足らずでした。

xntp はインストールされてなかったので、
ntp はソースから make install しました。
その場合のインストールされたファイルを知りたかったのです。

ntp を削除して、管理しやすい xntp(ntp-4.0.99-15〜.rpm)を
インストールしようとおもってます。

No. 2204 # shii 2001/10/13 (土) 12:17:44
ええと,結局,最新版jcode.plでも半角カナは文字化けしました。
たまたま「シイ」はOKでしたが「アイウエオ」はNGでした。
こちらの掲示板でもたぶん化けると思います。

そこで,前に書いた方法をスクリプトにしてみました。

尚,送信ページには,↓この1行が入っています。
<INPUT TYPE="hidden" NAME="assist" VALUE="     ">
VALUEは,全角スペース5個です。
−−−−

# コード判別補助文字列名(送信ページと統一,半角英数字に限る)
$assi = 'assist';

read(STDIN,$input,$ENV{'CONTENT_LENGTH'});
@parts = split(/&/,$input);

# コード判別補助文字列$ASSIST0の取得
foreach(@parts) {
    ($key0,$val0) = split(/=/); # 最初の=で分離
    $key0 =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
    if ($key0 eq "$assi") { $ASSIST0 = $val0; }
}

foreach(@parts) {
    ($key,$val) = split(/=/); # 最初の=で分離
    $val =~ tr/+/ /; # trは1文字単位の置換
    
    # コード判別補助文字列の追加
    if ($key ne "$assi") { $val = $val.$ASSIST0; }

    $key =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
    $val =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
    jcode::convert(\$key,'euc');#---- from jcode.pl
    jcode::convert(\$val,'euc');#---- from jcode.pl
    
    if ($key eq "$ass") { $ASSIST = $val; }
    $val =~ s/($ASSIST)$//g; # コード判別補助文字列の除去
    $key =~ s/\r\n|\r|\n//g; # gはマッチする文字全て
    $val =~ s/\r\n|\r|\n//g;
    $key =~ s/,/,/g; $val =~ s/,/,/g;
    $key =~ s/</</g; $val =~ s/</</g;
    $key =~ s/>/>/g; $val =~ s/>/>/g;
    $key =~ s/"/”/g; $val =~ s/"/”/g;
    $key =~ s/&/&/g; $val =~ s/&/&/g;
    $in{$key} = $val;
}
−−−−
これで「ア」などという1文字の半角カナもコード判別できているようです。
もうちょっとスッキリできればいいのですが……。

No. 2205 # ナナシサソ 2001/10/13 (土) 20:40:22
>>2204 shii
http://www.din.or.jp/~ohzaki/perl.htm#JP_Code

っていうかそのコードには
気になる点がいろいろと・・・

No. 2206 # shii 2001/10/13 (土) 21:24:57
>>2205 ナナシサソ
リンク先はPerlメモのgetcode関数のところですね。
できれば気になる点を具体的に指摘していただけると
とてもありがたいのですが。

No. 2207 # 68user 2001/10/13 (土) 21:45:30
>>2204 shii
考え方はよいのですが、もちっとスマートにやるなら、
    「あ」の文字コードを調べるスクリプト
        require 'jcode.pl';
        $_="あ";
        jcode::convert(\$_, 'euc');
        s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;
        print "あ in euc-jp: $_\n";
        $_="あ";
        jcode::convert(\$_, 'sjis');
        s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;
        print "あ in shift_jis: $_\n";
        $_="あ";
        jcode::convert(\$_, 'jis');
        s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;
        print "あ in jis: $_\n";

    実行結果:
        あ in euc-jp: %A4%A2
        あ in shift_jis: %82%A0
        あ in jis: %1B%24B%24%22%1B%28B # これは他のパターンも有りうるかも
を踏まえて、
    <input type="hidden" name="assist" value="あ">
としておき、
      read(STDIN,$input,$ENV{'CONTENT_LENGTH'});
      
      ($assist_code) = $input =~ s/(^|&)assist=(.*?))($|&)//;

      if ( $assist_code =~ m/^\%A4\%A2$/i ){
          $input_encoding = 'euc';
      } elsif ( $assist_code =~ m/^\%82\%A0$/i ){
          $input_encoding = 'sjis';
      } elsif ( $assist_code =~ m/^\%1B\%24B\%24\%22\%1B\%28B$/i ){
          $input_encoding = 'jis';
      }

      @parts = split(/&/,$input);
      foreach(@parts) {
              ($key,$val) = split(/=/);
              $key =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
              $val =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
              jcode::convert(\$key,'euc', $input_encoding);
              jcode::convert(\$val,'euc', $input_encoding);
      }
くらいがよろしいかと思います (動作確認はしていません)。

>>2203 AGE
> ntp はソースから make install しました。
> その場合のインストールされたファイルを知りたかったのです。
もし Makefile に uninstall とか deinstall とかいうターゲットがあるなら、
    # make uninstall
    # make deinstall
ですが、なさそうならば
    # make -n install
して、インストールされるファイルをメモって、手動で rm ですね。

>>2202 スナフキン
> ServletもCGIと同じくリクエスト毎に起動するのですか?
いいえ、しません。そういう意味では常駐していますね。

しかし、CGI を使うときも apache が常駐していますが、「常駐
システムを開発している」という意識は僕にはありません。それと
同様に、Servlet コンテナが常駐していても「常駐システム」とは
呼ばないんじゃないなぁ、ということです。まぁ、ここらへんの
感覚は人によって違うのかもしれません。

>>2200 /tk
> どちらもスライスだと思うのですが
えっと、@a[0] と (@a)[0] は違うんですよね? ということです。

要は、
    「@a[0] は文法エラーのところを perl があえて $a[0] に読み変えている」
とこれまで思っていたのですが、
    「@a[0] は文法的には正しいけれど、$a[0] の方が適当なので
        perl があえて警告するようにしている」
ということでしょうか?

> @a は配列のスライスで, (@a) はリストのスライスかと…
perl に配列とリストという区別はあるんでしたっけ。

No. 2208 # shii 2001/10/14 (日) 09:24:30
>>2207 68user
おお,なるほど!ありがとうございます。
ダミーを送るのなら,それをわざわざ対象文字列に結合しなくても
いいわけですね。私が間抜けでした。

文字コードを調べるスクリプトが面白いですね(勉強になります)。

今回の件を自分のCGI向けに最小限にカスタマイズした(つもりの)
スクリプトが下記です。

#---------------------------------------------------------
read(STDIN,$input,$ENV{'CONTENT_LENGTH'});
@parts = split(/&/,$input);
foreach(@parts) {
    ($key,$val) = split(/=/);
    $val =~ tr/+/ /;
    $key =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
    $val =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
    
    $code = &jcode::getcode(\$key);
    jcode::convert(\$key,'euc',$code);
    jcode::convert(\$val,'euc',$code,"z");
    
    $val =~ s/\r\n|\r|\n//g;
    $val =~ s/,/,/g;
    $in{$key} = $val;
}
#---------------------------------------------------------

入力項目名に半角カナ以外の日本語を使用することが前提なので,
汎用性はありません。
getcode関数を全項目に使っているところが余分なのですが,
見た目は,以前に比べてすっきりしました。

ところで,
> ($assist_code) = $input =~ s/(^|&)assist=(.*?))($|&)//;
ここはassistの中身のみを残して残りを消す作業だと思うのですが,
($assist_code)にカッコがついている理由と,
正規表現内のカッコの数が合わない理由を教えてください。

・「行の先頭」または「&の直後」にある「assist=」
・「任意の1文字の0回以上の最短マッチ」
・「行の終わり」または「&の直前」

と,部分的にしか理解できませんでした。

No. 2209 # ナナシサソ 2001/10/14 (日) 18:02:18
>>2208 shii
おいらはこう書くべきと思うけどな
my ($assist_code) = $input =~ /(?:^|&)assist=([^&]*)/;
どうせassist=なんじゃら、なんて残ってたって関係ないし。

> 正規表現内のカッコの数が合わない理由を教えてください。
ミスだねこれは

だいたい、これだと
> ($assist_code) = $input =~ s/(^|&)assist=(.*?))($|&)//;
$assist_codeに入るのは(^|&)の部分になっちゃう

No. 2210 # AGE 2001/10/15 (月) 12:29:41
>2207 68user

>もし Makefile に uninstall とか deinstall とかいうターゲットがあるなら、
> # make uninstall

これでうまくいきました。ありがとうございました。

No. 2211 # ぷよ丸 2001/10/16 (火) 22:17:43
メールを送るCGIについて。

フォームに入力されたメールアドレスに対して、Sendmailを使って
CGI(Perl)からメールを送る時のことです。

ユーザやホスト名などが間違ったメールアドレスを入力しても、外部の
サーバ宛てなら、正常にCGIが終了し、エラーメールが戻ってきます。

ここまでは良いのですが、CGIやSendmailがあるサーバと同じサーバ
宛てにメールを送る場合、アドレスが正しければもちろん正常にCGI
は終了し、メールは届きますが、UserUnknownになるようなメールアド
レスを指定して送ると、正常にCGIは終了せず、サーバエラーになっ
てしまいます。

このようなサーバエラーを回避する方法はあるのでしょうか?

どなたか教えて下さい。よろしくお願いします。

No. 2212 # pearl 2001/10/18 (木) 00:37:49
初めましてpearlともうします
以下のことで大変困っておりこの掲示板にたどり着きました
どうぞアドバイスをよろしくお願いします

NTサーバーのあるディレクトリ(aaa)以下の
複数のサブディレクトリ(x1,x2,x3...)にある全てのファイルを
階層構造を保ったままSolarisのあるディレクトリにそっくり
移動(転送)したいのです操作できるのはSolaris側のみで
シェルスクリプトによる自動実行を目指しております
当初はftpのオプションで簡単に出来ると思っておりましたが・・。

また不定期にサブディレクトリおよびファイルの追加があり
出来得るならば初回以降は差分ファイルの転送だけ行いたい
のですが実現可能な方法をどなたかご教示願えませんか?

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 2213 # 68user 2001/10/18 (木) 01:36:38
>>2209 ナナシサソ
> おいらはこう書くべきと思うけどな
そうですね、僕の書いたコードではうまく動きませんでした。

>>2211 ぷよ丸
要はエラーを無視できればよいのですか? 何もエラー処理を
考えずに書けば無視できるのではないかと思うのですが、
具体的にどのように sendmail を実行していますか?

>>2212 pearl
おそらくは rsync を使うのがベストではないかと思います (使った
ことはありませんが)。それがダメなら wget かなぁ。あるいは
Solaris に sharity-light を入れて SMB しゃべれるようにして、
NT 側は共有フォルダ (って言うのかな) にしておくとか (これも
使ったことはありません)。

No. 2214 # ぷよ丸 2001/10/18 (木) 23:29:26
「エラー処理を無視できれば・・・」で、ひらめいて、エラーログ
を見ながらいろいろとやってると解決できました。
つまり、sendmailでメールを送るときに、同一サーバ宛てのメー
ルアドレスが間違っていると、標準出力にUserUnknownのエラーが
書き出され、HTML出力前にそうなるから、エラー(BadHeader
のエラーかな?)になっていたんですね。
それが分かったので、HTMLを先に出力してから標準出力を閉じ、
sendmailでメール送るという順序にすることで解決しました。
これだと、sendmailの実行時にエラーが出てもCGIからは無視し
た感じになりますものね。

めでたしめでたしで解決したので報告します。

コメントありがとうございました。
これからもよろしくお願いします。

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