初めまして。初めてなのに、こんな事を書くのはあつかましいとも思うんですけど、どうにもならないのでフ゜ロク゛ラムを教えて欲しいんです。 実は、課題がでたんですけど分からないので。 内容ですが Cのフ゜ロク゛ラムファイル(sourse.c)の英小文字をすべて英大文字に変換し、他のファイル(trans.c)に書き出す。 と言う物です。 それで、 #include <stdio.h> #include <stdlib.h> main(int argc, chr*argv[]) { int i; FILE *fin; char ss[256]; if(fin=fopen("sourse","r") == NULL){ printf("オーフ゜ン出来ない.\n"); exit(1); } char( までは出来ました。それから先が全くわかりませんので、宜しくお願いします! |
>>2373 68user >その POP3 サーバのバグ その通りです。 しかも、今回の件には、まるで関係ない話みたいですね。失礼しました。 >>2377 ARGUN >Cのフ゜ロク゛ラムファイル(sourse.c)の英小文字をすべて英大文字に変換し、他のファイル(trans.c)に書き出す。 ならば、 cat sourse.c | tr a-z A-Z > trans.c で良いのでは? |
>>2376 わたなべ > 試してみましたが、状況は変わりませんでした。 ほほぅ、そうですか。それは困りましたね。 > qmailだそうです。 qmail 付属の qmail-pop3d かな? djb モノがそんな挙動を するのはあまり考えにくいですが、telnet ではできている のですから、怪しいのは改行コードです。 現在は sysread で読んでいるのですから、受け取ったデータは 即座に表示されるはずです。ということは、何も表示されない= 送ったリクエストが正しく解釈されていないということなので、 print SOCKET "LIST\r\n"; を print SOCKET "LIST\n"; にしてみたり、いろいろ試してみて下さい。 どうにもならなかったら、試したスクリプトを見せて下さい。 >>2377 ARGUN > Cのフ゜ロク゛ラムファイル(sourse.c)の英小文字をすべて英大文字に変換し、 > 他のファイル(trans.c)に書き出す。 まずは、sourse.c の内容を trans.c にコピーするところから やってみては。 |
>>2364 わたなべ > LISTので止まっているようです。 うちのサーバが qmail + vpopmail だったのでテストしてみたところ 同様の現象が再現しました。 うちの場合 print SOCKET "LIST\r\n"; の直前の行に sleep 1; を挿入したらうまく動きましたので 試してみてはいかかでしょう。 |
>>2380わたなべ /tkさんのアドバイスどおりに sleep 1; を入れたら無事に動きました。 本当に有り難うございました。 大変お騒がせしましたが、これで落ち着いて眠れます。 今後ともよろしく御願いします。 |
68userさん。Kuwさん。有難うございます。 でも、長く入院してたせいで冗談抜きで全く分からないんです。 コピーってどうやるんですか? 甘えだとは思うのですが、迷惑でしょうがプログラム載せて貰いたいのですがおねがいします。聞けるような仲間がいないので。 |
>>2382 ARGUN > プログラム載せて貰いたい --- a2A.c ここから --- main () { system("tr a-z A-Z < sourse.c > trans.c"); } --- a2A.c ここまで --- a2A.c をコンパイルしてできた実行ファイルを、 sourse.c と同じディレクトリにコピーして実行してみてください。 運が良ければ、お望みの trans.c が作成されます。 とりあえず、課題はこれで良いとして、本気でプログラムの勉強を したいのならば、68user さんのアドバイスを参考にがんばってください。 あとは、 >>2230 68user > - 課題だからといって、問題をそのまま掲示板に書き込んでも反感を買うだけ、 > ということを書き込む前に推測できるようになる。 > - 仮に課題だとしても、そうは見えないようにうまくカムフラージュ > できるような文章力を身につける。努力しているという姿勢を > アピールする。 という金言も参考にされると良いでしょう。 |
>>2382 ARGUN google で「C言語 ファイル コピー」などと検索すれば、 サンプルプログラムなんてたくさん見付かります。 「C言語 小文字」だってたくさん見付かります。 http://pc.2ch.net/test/read.cgi/tech/1007902384/l50 で質問するのもよいでしょう。 ここで回答をもらえることを期待するよりもそっちの方が早いです。 >>2380 /tk > sleep 1; うーむ、改行コードは大外しでしたか。ということはその POP サーバは リクエストを 1行だけ読んでいるのではなく、select か何かでバッファに たまっているリクエストを全て解釈しようとしていた、ということですかね? 本来 USER 送って +OK を受け取って、PASS 送って +OK を受け取って、その後 LIST を送らねばならないところを、一気に USER、PASS、LIST を送って、その後 リプライを受け取るという手抜きをしていたからまずかった…と。 |
こんにちは。 環境は OSはSolaris 2.6、printerはEPSON LP8200PS2(PSプリンタ)です。 質問は、 lpコマンドで印刷用紙のサイズを指定したいのです。 HELPなどを見てもそれらしきoptionがないのですが、用紙サイズを A4とかB4とかに任意に設定するoptionはありませんか? よろしくおねがいします |
はじめまして。最近cgiの勉強をはじめたんですが、なかなかうまくいきま せん。 さっそく質問ですがローカルでcgiの動かし方がわからないんです。一通り 関連サイトを回ってみたのですがどうしても駄目なんです。例えば hello-worldを実行すると #!C:/Perl/bin/perl print "Content-type: text/html\n\n; print ""; print "Hello world.; print "; こうなってしまうんです。プロバイダがcgiの使用を許可してないので それが原因なのでしょうか?もしそうならなにか方法を教えてください。 よろしくお願いします。 |
ちなみに環境は windows98,internetexplorer5,プロバイダはocnです。 よろしくお願いします |
>>2386 cgi超初心者 >プロバイダがcgiの使用を許可してない のは全く関係ありませんので安心してください。 ローカルでCGIの動作確認をする方法を初心者向けに説明したサイトを紹介しておきます。 http://members.tripod.com/~tyanko/s_mokuji.html |
>>2385 hiro lp -f で できませんでしたっけ。 |
つかぬ事をお伺いしますが、perlで <+ でファイルオープン時に、開こうとする ファイルが存在しないとエラーとなりますが、以下の様な処理をしました。 が、どう見てもカッコ悪い(笑)のでこんなケースにはどんな処理をしているか お聞きしたいのですが・・・ if(!-e $dat_file){# 存在しない時に作成 if(!open(DAT, ">$dat_file")) { &error('オープンエラー', "データファイルの生成に失敗しました。[$dat_file]");} close(DAT); } #改めて開きなおし if(!open(DAT, "+<$dat_file")) { &error('オープンエラー', "データファイルのオープンに失敗しました。(1)");} while(<DAT>){ chomp; push(@record, $_); } |
>>2390 スナフキン open(DAT, "+<$dat_file") || open(DAT "+>$dat_file") || &error('..'); while(<DAT>){ .. } ってのはどうでしょうね。 あと、perlopentut(1) に参考になることが書いてあるかも (書いてないかも) しれません。 |
ウチのマシンの perl はバージョンが古く(5.004_04)なので perlopentut の情報は見つけられませんでした。 しかしキーワードを検索するといろいろと情報を得る事が出来ました。 if(!open〜 は自分なりの書式なので良く使っていましたが、perlで 杓子定規に覚える事にはあまり意味が無いですね(笑) いままで使った事の無い sysopen もいろいろ試してみます。 的確なキーワードありがとうございます。 参考になったURL http://www.wingworld.co.jp/forum/cgi/messages/1931.html う〜んバージョンを新しくしなければ・・・ |
>>2384 68user > select か何かでバッファに たまっているリクエストを > 全て解釈しようとしていた、ということですかね? この辺の仕様(というか実態)は知りませんが サーバにどのようなリクエストが実際に渡ったのかを 調べるのが、原因究明の早道となるような気がします。 # 実際どのようにすれば, それを調べられるかは分かっていません。 今回の件に関しては, なんとなく > 一気に USER、PASS、LIST を送って、その後 リプライを受け取る のが原因かな。 と特に根拠も無くアタリをつけてテストをしました。 別に sleep である必要は全然無いのですが 個別にリプライを受けて -ERR だったら再入力な スクリプトを書くの面倒だったので… (あと環境が Windows でしたので) >>2390 スナフキン > こんなケースにはどんな処理をしているか 実際にファイルが存在していないのですから オープンエラーで困る事は無いのだし むしろエラーになってくれなくては困るという 考え方をしています。 …↑ゴミレスですね。すみません。 |
UNIX プログラミング FAQが以下に移転しています。 http://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_toc.html http://www.adl.nii.ac.jp/~moro/ 暫定っぽいですが(^^; |
Cクラス(HP UNIX版)ハードDiskをBクラス使用するとき何か 設定必要でしょうか ? 教えって下さい。 |
access.logは下記のようなもの。$1はエポックタイム (1970/1/1 00:00:00からの経過秒数)で$3はアクセスした端末のIP。 1009379443.542 20 192.168.16.17 TCP_HIT/200 1694 GET http://www.al4a.com/images/911.gif - NONE/- image/gif 1009379443.604 24 192.168.16.17 TCP_HIT/200 10159 GET http://www.al4a.com/honor.gif - NONE/- image/gif 1009379444.170 11683 192.168.16.17 TCP_REFRESH_HIT/200 59687 GET http://www.al4a.com/links.html - DIRECT/www.al4a.com text/html 1009379446.523 2979 192.168.16.17 TCP_HIT/000 11027 GET http://www.al4a.com/images/al4av2.jpg - NONE/- - 1009379446.526 1472 192.168.16.17 TCP_MISS/000 0 GET http://counter7.tracker.com/c5/id/0/104406 - DIRECT/counter7.tracker.com - 1009379447.026 63 192.168.16.17 TCP_HIT/200 15976 GET http://www.al4a.com/banners/gf1.gif - NONE/- image/gif 1009379447.364 16 192.168.16.17 TCP_HIT/200 10159 GET http://www.al4a.com/honor.gif - NONE/- image/gif 1009379448.331 967 192.168.16.17 TCP_MISS/200 9626 GET http://counter7.tracker.com/c5/id/0/104406 - DIRECT/counter7.tracker.com image/gif 1009379449.997 1504 192.168.16.17 TCP_HIT/200 20456 GET http://www.pornleo.com/banner/pussy10-29.gif - NONE/- image/gif 1009379450.256 3056 192.168.16.17 TCP_HIT/200 15679 GET http://www.al4a.com/images/al4av2.jpg - NONE/- image/jpeg 1009379453.262 148 192.168.16.17 TCP_HIT/200 7049 GET http://www.al4a.com/banners/fc1.jpg - NONE/- image/jpeg 1009379453.301 38 192.168.16.17 TCP_HIT/200 9328 GET http://www.al4a.com/banners/am1.gif - NONE/- image/gif 1009379454.056 1963 192.168.16.17 TCP_HIT/200 21921 GET http://al4a.free6.com/free6.gif - NONE/- image/gif これを集計して date time user数 ---------------------- 2001/12/28 00:00 0 2001/12/28 00:30 0 2001/12/28 01:00 5 2001/12/28 01:30 6 のようにしたいのです。awkファイルは3つあり、それをshellに記述して 一括処理しようとしています。 #syukei.sh #!/bin/sh ./syukei1.awk access.log|./syukei2.awk|./syukei3.awk > file #syukei1.awk #!/bin/gawk -f { hour=strftime("%H",$1);minute=strftime("%M",$1);second=strftime("%S",$1) base=$1-(hour*3600+minute*60+second) for(i=1;i<=48;i++){ if((base+1800*(i-1) <= $1) && ($1 < base+1800*i)){ print strftime("%Y/%m/%d %H:%M",base+1800*(i-1)),$3,1 } } } #syukei2.awk #!/bin/gawk -f { sum[$2,$3] += $4 } END { for(item in sum){ split(item, t, SUBSEP ); printf("%s %s %s %d\n",$1,t[1],t[2],sum[item]); } } #suykei3.awk #!/bin/gawk -f { if(length($2) > 0){ kazu[$2] ++; } } END{ for(i in kazu){ print $1,i,kazu[i] } } といった感じです。syukei1.awkで 2001/12/28 00:00 192.168.1.2 1 2001/12/28 00:00 192.168.1.1 1(とりあえずエポックタイムを現在時刻に変換し、秒の項はprintしない。あとはIPaddressを取る) のように加工します。(最後の1は捏造したもの。後々この数をカウントするので) syukei2.awkで↑の$4を集計。 2001/12/28 00:00 192.168.1.2 5 2001/12/28 00:00 192.168.1.1 6 : 2001/12/28 00:30 192.168.1.1 2 2001/12/28 00:30 192.168.1.2 4 のように加工します。(userごとに30分刻みで何回アクセスしたか) 最後にsyukei3.awkで↑の$3を集計。 2001/12/28 00:00 2 2001/12/28 00:30 3 のようにdate time user数という形で出力したいんです。 ただ、ここで今問題になっているのが、例えば2001/12/28 01:00〜2001/12/28 01:30の間に一度もアクセスがなかった場合、 その行が表示されません。アクセスがない場合は2001/12/28 01:00 0 0のように表示したいのですが、 どのようにすればいいでしょうか。また、3つファイルがあるんですが、これを一まとめにすることって可能なんでしょうか。 長くなりましたが、ご教授宜しくお願いします。 |
あけましておめでとうございます。 今年もよろしくお願いします。 >>2396 hogehoge さん:はじめまして cronで30分に1回httpを叩くクライアントを作っておいて、 そいつ1回しかアクセスしなかったら0アクセス、 そいつも含めてn回アクセスがあったらn-1アクセスではだめですかねー。 |
あ…、明けましておめでとうございます。 ふくしさんはじめましてです。 今まではcronを使って30分ごとに集計をとる方法でした。 でも、処理に時間がやたらとかかってしまいまして。 それが1日48回もあるかと思ったら…。 それでプログラムの改善と一括処理に切り替えることにしたんですが。 どうにかならないもんですかね…。ふぅ。 |
>>2398 hogehoge さん:Perl ですいません。こんなんでできそうです。 要は、 ファイルの各レコードについて、 0:00〜0:30、0:30〜1:00、1:00〜1:30、、の各ゾーンに入っているか調べ、 そのゾーンに入っていたら ゾーン、IP アドレスをキーに持つ2次元ハッシュの値を1にし、 全件調べた後に各ゾーンごとにいくつ IP がたまっているかを出力しています。 ろくにテストしていませんがバグっていたらすみません。 #! perl -w use Time::Local; # timelocal 関数を使うために必要なモジュールの宣言 (undef,undef, undef, $mday, $mon, $year, undef, undef, undef) = localtime(time); # 今日が何日か $step = 30 * 60; # 30分刻み $next = timelocal(0, 0, 0, $mday, $mon, $year); # 今日の0時0分0秒の時刻(epoch からの秒数) $start = $next - 60 * 60 * 24; # 昨日の0時0分0秒の時刻 %result = (); while(<DATA>) { ($now, undef, $ip) = split; for ($from = $start; $from < $next; $from += $step) { # $from は計算開始の時刻 $to = $from + $step; # $to は計算終了の時刻 if ($from <= $now and $now < $to) { $result{$from}{$ip} = 1; } } } for ($from = $start; $from < $next; $from += $step) { $num = keys %{$result{$from}}; ($sec, $min, $hour, $mday, $mon, $year) = localtime($from); $year += 1900; $mon++; print "$year/$mon/$mday $hour:$min:$sec $num\n"; } |
すいません、<DATA> でなくて <STDIN> にして標準入力を渡すか、 ファイルハンドルをオープンしてつかってください。 テスト用のコードを修正しわすれました。 |
ふくしさんありがとうございます。 Perlをそのまま使うことができないのがとても残念ですが、 まだawkも始めたばっかりで、アルゴリズムの解釈なんかが 多々間違っていると思われ、とても参考にさせて頂きたいと思います。 なんとか、awkに変換、反映させてみたいと思います。 とりあえず、このスクリプトがうまくいったら、次は Perlをやってみたいと思っています。ありがとうございました。 また何かあったら教えて下さいね。 |
>>2401 hogehoge see http://pc.2ch.net/test/read.cgi/unix/1000303370/130-132n and http://x68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?howtouse |
いつもお世話になります。 CGI.pm でファイルのアップロードをするときの質問です。 html で <html> <body> <pre> アップロードするファイルを指定してください。 ファイル名は半角英数字で、空白を含まないでください。 </pre> <form action="fileup.cgi" method="POST" ENCTYPE="multipart/form-data"> ファイル名:<input type="file" name="fname"><br> <hr> <input type="submit" value="OK"> </form> </body> </html> というフォームを作って、 #! perl -w # fileup.cgi use CGI; my($form) = new CGI; print $form->header("text/html"); my($filename) = $form->param('fname'); $filename =~ m|([^\\]+)$|; # Windows のフルパスから基底ファイル名を取り出す $newfile = "./gooddir/$1"; # gooddir の下に入れる。 open (OUTFILE,">$newfile") or die "Can't make serverside file because $!\n"; while ($bytesread = read($filename,$buffer,1024)) { print OUTFILE $buffer; } print <<EOD; <pre> アップロードが終了しました。ファイル「$filename」は $newfile としてアップロードされました。 </pre> EOD という CGI を呼び出すとうまくいくのですが、 同じ CGI を、呼び出し側のフォームも CGI.pm で作って #! perl -w use CGI; use strict; my $title = 'ファイルをアップロードしてください'; my $q = new CGI; print $q->header(); print $q->start_html(); print $q->start_form(-method=>'form', -action=>'./fileup2.cgi', -enqtype=>'multipart/form-data'); print $q->h2($title); print '変換するファイルを指定し、[実行] をクリックしてください。<br>', '(空白のあるファイル名、日本語のファイル名は避けてください)<br>', $q->filefield(-name=>"fname"), '<br>'x3; print $q->submit(-name=>'submit',-value=>'実行'); print $q->endform; print $q->end_html(); とやると、空ファイルが作成されるだけでうまくアップロードできません。 エラーログには何も出ません。 なにがおかしいのでしょうか? 何かおわかりでしたらご教示願います。 |
ん〜、 >>2403 ふくし > -method=>'form' post? > -enqtype=>'multipart/form-data' enctype? とか? |
>>2404 68user さん、本年もよろしくお願いします。 ん〜、ほんとにそれだけのことでした。;;; 恥の掻き初め(寒)ですね。 最初、-enctype を指定していなかったんです。 そうすると start_form がデフォルトで application/x-www-form-urlencoded を取るので 失敗していたようです。 (その場合 start_multipart_form を使えばデフォルトが multipart/form-data になるようですね) method も post がデフォルトなので書いていなかったのですが、 html と最大限あわせようと思って質問の直前に書いて、 それで失敗していたのでした。 ハッシュによる名前付け編集の渡しは、 存在しないキーを渡しても無視されるのはなんかわかりますけど、 存在するキーに定義されてない値を渡しても怒られないのは ちょっと CGI.pm が不便だなあと思いました。 いずれにしても、これらのケースでエラーを出して欲しいです。 (出す方法あったりして、、) とまれ、ありがとうございました&すいませんでした。 本年もよろしくです。 |
proxy サーバに接続後、 strcpy(request, "CONNECT www2.ggn.net:443 HTTP/1.1\r\n" "Host: www2.ggn.net\r\n" "\r\n"); write(s, request, strlen(request)); とする。そしたら proxy サーバが HTTP/1.0 200 Connection established(CRLF) (CRLF) などと返してくるので、 read_size = read(s, buf, BUF_LEN); write(1, buf, read_size); でレスポンスを読み取る (↑これは手抜き)。その後は SSL_load_error_strings(); して、普通におはなし。 >>2160 Nira では ERR_load_crypto_strings(); ERR_load_SSL_strings(); OpenSSL_add_all_algorithms(); を追加する必要がある、ということでしたが、FreeBSD 4.4-RELEASE では 付けても付けなくてもうまくいきました。 お仕事では、Windows+Borland C++ Builder 5.0 でやらなきゃ いけないのが欝です (C++ 知らんし、Windows でプログラムを 組んだことがないし)。HTTP 用モジュールは用意してあるみたい だけれど、使い方がさっぱりわからんなぁ。 >>2405 ふくし > 存在するキーに定義されてない値を渡しても怒られないのは > ちょっと CGI.pm が不便だなあと思いました。 perl 5.005_03 付属の CGI.pm を見る限りでは、エラー検出する 方法はないようですね。 > 本年もよろしくです。 こちらこそよろしくお願いします。 |
>>2406 68user う、一行目が欠けてしまって意味不明に。 一行目は 「お仕事で proxy サーバ経由の SSL 通信を行う必要があったので、メモメモ。」 でした。 |
UNIXを勉強したい人ってはじめは何をすれば良いか教えてください! ほんとにくだらない質問をしてすいませんが、おねがいします!! |
>>2394 Ka23 > UNIX プログラミング FAQが以下に移転しています。 遅くなりましたが反映しました。ありがとうございました。 >>2408 ぶちお > UNIXを勉強したい人ってはじめは何をすれば良いか教えてください! 本屋に行ってインストール記事の載っている雑誌か、 インストール本を買うか、あるいは Turbo Linux とかの 商品 (1万程度) を買うのがいいんじゃないですかね。 その後はネット環境を整えたり、プログラミングしたり 好きなことをすると。 |
68userさんありがとうございました!!助かりました!また質問するときがあると思いますがそのときはよろしくおねがいします!! |
こんにちは。 私はWindowsにActivePerlを入れてCGIやっています。 今回、PPMを使おうと思って、DOS窓でppmと入力したら、 下のようなメッセージが出てきました。 Failed to load PPM_DAT file Can't use an undefined value as a SCALAR reference at C:/Perl/site/lib/PPM.pm line 1586, <DATA> line 36. なんかエラーが出てるようなのですが、PPM.pmというのはいじった 覚えがないし、他のファイルもいじった覚えはなし、上のエラーが 何を意味するのかよく分からないし、Googleなどで検索かけてもみ たのですが、同じ様な事例は見つからず困っています。 どなたか分かる方いましたら、どうすればいいのか教えてください。 お願いします。 Win98,ActivePerl5.6.0(Binary build 623) |
>>2411 ぶぶ さん、こんばんは。 めったに ActivePerl は使わないのですぐにはわからないんですが 手もとの環境では C:/Perl/site/lib/PPM.pm の 1586 行目近傍は以下のようになっていました。 1584:if (defined($location)) { 1585: if ($location =~ /[^\/]$/) { $location .= "/"; } 1586: $package = $location . $package . ".ppd"; 1587:} もしぶぶさんの環境でも同じであれば、 とりあえず 1586 行目の直前に warn "location: $location package: $package\n"; とでも入れてみて、 $location と $package の値を見てみたらいかがでしょうか。 でも、うちの環境(同じ Windows98)で ppm と入れたら その現象が再現できなかったので、 再インストールでもいいかなという気もしますが。 |
>>2412 ふくし 自己レスれす。(寒 >とりあえず 1586 行目の直前に >warn "location: $location package: $package\n"; これ、自分でもやってみましたけど、 C:\> ppm と打っただけではココは通らないみたいでした。 ぶぶさん、 PPM.pm の 1586 行目はぼくと同じですか? (バージョン、レベルは同じなんだけどなァ) あと、ほんとに C:\> ppm と打っただけで怒られます? それともなんか実のあること(パッケージのインストールとか)を やろうとしてます? 後者の場合は入れたコマンドを教えてください。 |
たびたびすいません!!今学校でパソコン同士のデータのやり取りを、Cプログラムでなんとかやろうとしているのですがわからんのですー!先生はfopenとか使えばできるだろー!!というのですが本を見てもかいてないようなかんじで(_m_!)なにしろ未熟者でわからんのですー!よろしければおしえてもらえますか? |
>>2414 ぶちお > 今学校でパソコン同士のデータのやり取りを、Cプログラムで > なんとかやろうとしているのですがわからんのですー! さて困ったものですね。あまりにもひどい質問の仕方です。 http://x68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?howtouse は読んでいただけましたか? パソコンって何ですか? UNIX ですか? Windows ですか? それ以外ですか? 具体的な OS 名とそのバージョンは? データのやり取りって具体的に何をしようとしていますか? フロッピーからデータを読み込むことですか? LAN 経由で ファイルを読むことですか? RS-232C 経由でデータを やりとりすることですか? 今後、こういう調子の質問を続けるつもりでしたら、僕は お相手を致しかねますのでよろしく。 |
ふくしさん、お返事ありがとうございます。 PPM.pmの1586行目付近は、下のようになっていました。 1577:unless ($PPDfile && $$PPDfile) { 1578: foreach (keys %repositories) { 1579: my $location = $repositories{$_}{'LOCATION'}; 1580: if ($location =~ /[^\/]$/) { $location .= "/"; } 1581: $$PPDfile = $location . $package . ".ppd"; 1582: return %PPD if (%PPD = getPPDfile('package' => $$PPDfile, 1583: 'parsertype' => $parsertype, 'PPDfile' => \$$PPDfile)); 1584: undef $$PPDfile; 1585: } 1586: return unless $$PPDfile; 1587:} ちょっと違うみたいですよね。こちらの方が行が短いのでしょうか。 ちなみにDOS窓に入力したのは、 C:\>ppm これだけです。 PPM のシェルでパッケージのinstallをしようと思っているのですが、 とりあえずPPMを起動するため、入力しているのはppmという文字だけ です。そして、ppmとだけ入力すると、例のエラーが出るのです。 少ない情報ですが、何か分かりますでしょうか? やはりActivePerlを入れ直してみた方が良いのでしょうか? よろしくお願いします。 |
>>2416 ぶぶ 先ほど、Windows2000 に ActivePerl を入れる必要が あったので試してみたのですが、ppm とだけ 打つと PPM interactive shell ... と出てエラーは出ませんでした。 インストールしたのは最新の build 631 (perl-5.6.1) です。 再インストールは悪くない選択肢ではないかと思います。 |
>>2416 ぶぶ さん: いま会社で ActivePerl の環境がないのでテストできませんが、 >return unless $$PPDfile; ここで >>Can't use an undefined value as a SCALAR reference (スカラーの参照として、未定義値は使えません) ですよね。 $$PPDFile というのは、 $PPDFile というスカラー変数に スカラーへの参照(別のモノを指し示すもの)が入っていると考えて、 そのスカラーの値を返そうとしているわけですが、 そのとき $$PPDFile に undef が入っているのでくだんのエラーが 出ています。 たぶん $PPDFile という変数にもっと上の方でスカラーへの参照を セットすることを期待して動いていたのですが、 その期待が裏切られているようです。 (その上でいろいろしているのも、$$PPDFiles つまり $PPDFiles が指し示すスカラーメモリに対してで、 $PPDFiles にどのような論理で何が入っているかは 下のコードからは不明です) ・・・という風にさかのぼって研究しても勉強になると思いますが、 (意外ともうちょっとでパキッとわかったりして) いずれにせよこんなアンフレンドリーなメッセージが出て中断するのは 作者の意図と違う動作なので、再インストールでもいいと思います。 |
ふくしさん、68userさん、お返事ありがとうございます。 build631をインストールしてみましたら、何の問題もなくPPMの シェルが起動しました。 インストールしてから、PPM.pmを覗いてみると、1586付近は、 ふくしさんが書かれたものと同じになっていました。 前に入れていたものがおかしかったのでしょうか。入っている pmファイルがおかしいとは夢にも思わなかったので再インスト ールを試さずに質問してしまってごめんなさい。 これでやっとパッケージのinstallができます。ありがとうご ざいました。 PS. ふくしさん、エラーに関する説明ありがとうございます。 エラーの出る仕組みがよく分かりました。 |
ボーランドC++コンパイラーでC言語のCGIを作ろうと思っているのですがどうしたら良いのでしょうか? bcc32 -o CGI名 ソース名 でいけるのでしょうか? よろしくお願いします |
>>2420 初心者 > …でいけるのでしょうか? 試してみた結果どうなりましたか? |
メール受信時に"newaliases"コマンドを実行したいのですが、上手くいきません。 方法としては、特定のアドレスにメールが届いた時点でシェルスクリプトを実行するようエイリアスファイルにて設定しており、シェルスクリプトにはsudoで"newaliases"を実行するよう書いています。 また、sudoersにて"newaliases"コマンドをroot権限で実行できるようにも 設定しています。 "newaliases"コマンドではなく、他のコピーコマンド(cp)などは動作するのですが、"newaliases"コマンドは動作しません。 同じような方法を取られている方がいらっしゃいましたら 設定方法を教えていただけませんでしょうか。 宜しくお願いいたします。 |
申し訳ありません。環境を全く書いていませんでした。 RedHat Linux7.1.J、Sendmail8.11.5 です。 宜しくお願いします。 本文↓ メール受信時に"newaliases"コマンドを実行したいのですが、上手くいきません。 方法としては、特定のアドレスにメールが届いた時点でシェルスクリプトを実行するようエイリアスファイルにて設定しており、シェルスクリプトにはsudoで"newaliases"を実行するよう書いています。 また、sudoersにて"newaliases"コマンドをroot権限で実行できるようにも 設定しています。 "newaliases"コマンドではなく、他のコピーコマンド(cp)などは動作するのですが、"newaliases"コマンドは動作しません。 |
>>2423 橋本 どのユーザが「newaliases を root 権限で実行できる」ような 設定になっていますか? また、sudo のログには何と記録されていますか? |
>>2424 68user だけでは情報が不十分かな…。 sudoers に書いた内容と、「特定のメールアドレスにメールが 届いたらコマンドを実行する」というのをどうやって実現して いるか (/etc/aliases とか /home/foo/.forward とか) も 書いてください。 |
>>2424 68user newaliasesをroot権限で実行できるユーザは"deamon"に設定しています。 理由は、メール受信時に実行されるシェルスクリプトが一体どのユーザで 実行されるか分からなかったため、シェルスクリプト内にメールを送信 するコマンドも記述したところ、"deamon"という送信者名でメールを送信 したため、deamonでシェルスクリプトは実行されると思い設定しました。 ですが、実際はdeamonが実行しているようではないようです。 >>2423 にてcpコマンドなど他のコマンドは動作する。 と記述しましたが、私の勘違いで動作していませんでした。 申し訳ありません。 また全てのユーザに"newaliases"、"cp"コマンドをroot権限で 実行できるよう設定したところ、正常に動作しました。 ですが、全てのユーザに許可してしまうわけにはいかないので、 どうにかして特定のユーザにのみ許可して動作するようにしたいのですが ・・・。 以下設定ログ・設定内容です。 ●メール受信時のログ↓ Jan 21 18:20:16 test sudo(pam_unix)[19079]: authentication failure; logname= uid=0 euid=0 tty= ruse r= rhost= user=daemon Jan 21 18:20:23 test sudo(pam_unix)[19079]: 2 more authentication failures; logname= uid=0 euid=0 t ty= ruser= rhost= user=daemon Jan 21 18:20:23 test sudo[19079]: daemon : 3 incorrect password attempts ; TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/newaliases ●sudoersに追加↓ deamon ALL= NOPASSWD: /usr/bin/newaliases deamon ALL= NOPASSWD: /bin/cp ●メール受信時に動作するシェルスクリプト↓ #!/bin/sh sudo cp /etc/mail/123.txt /etc/mail/456.txt sudo newaliases mail -s test mailuser@****.co.jp < /etc/mail/456.txt exit 長文で申し訳ありませんが宜しくお願いします。 |
>>2425 68user 「特定のメールアドレスにメールが届いたらコマンドを実行する」は、 (/etc/mail/aliases)に mailuser :"|/etc/mail/mail-program" と記述しています。 よろしくお願いします。 |
>>2427 橋本 > ●メール受信時に動作するシェルスクリプト で /usr/bin/id > /tmp/id.result などとすれば、どの権限で 動いているのかがわかります。 一般的には、/etc/mail/aliases に mailuser :"|/etc/mail/mail-program" とあるなら、/etc/mail/mail-program というファイルの権限で動きます。 例えば % ls -l /etc/mail/mail-program -rw-r--r-- 1 hoge wheel 46632 Sep 19 02:30 /etc/mail/mail-program ならば hoge 権限で動く、ということです。 |
>>2428 ですが、 mail-programの権限は以下のようになっています。↓ -rwxr-xr-x 1 root root 165 1・21 19:55 mail-program また /usr/bin/id > /tmp/id.resutl の結果は以下になりました。↓ uid=2(daemon) gid=2(daemon) groups=2(daemon),1(bin),4(adm),7(lp) やはり"deamon"で実行されているようです。sudoresにも正しく設定して いるつもりなのですが、シェルスクリプトは動作しません。 deamonに関してはsudoが使えないのでしょうか。 何かよい方法ありましたら教えてください。 宜しくお願いします。 |
>>2429 橋本 …ふむ。 deamon でなく daemon です。sudoers を修正してみて下さい。 |
>>2429 橋本 どうもありがとうございます。 deamonではなく"daemon" に修正したところ上手くいきました! とてもお恥ずかしいですが、すごくうれしかったです。 ありがとうございました。 |
こんにちは。ヒサブリに質問です。 下のような CGI で euc、sjis の文字列をブラウザに表示します。 #! perl -w # ~/public_html/cgi-bin/moji.cgi use CGI; use Jcode; my $q = CGI->new; print $q->header(); print $q->start_html(); print $q->start_form(-action=>'./answer.cgi'); $str_euc = 'こんにちは'; $str_sjis = $str_euc; Jcode::convert(\$str_sjis, 'euc', 'sjis'); print "euc: $str_euc <br>"; print "sjis: $str_sjis <br>"; print "unpacked euc: ".unpack("H10", $str_euc)."<br>"; print "unpacked sjis: ".unpack("H10", $str_sjis)."<br>"; print "eq:".($str_euc eq $str_sjis)."<br>"; コード自体は EUC で書きました。 ブラウザの設定を EUC にすると、 当然のように、EUC 部分は正しく、sjis 部分は文字化けになります。 (本当は sjis 部分は半角カナになりました) (http://www/~fukushi/cgi-bin/moji.cgiの表示) euc: こんにちは sjis: 、ウ、・ヲヒ、チ、マ unpacked euc: a4b3a4f3a4 unpacked sjis: 8ea48eb38e eq: これ、ブラウザの設定を sjis にすると、 euc も sjis も文字化けになります。 これはなぜでしょう? (http://www/~fukushi/cgi-bin/moji.cgiの表示) euc: 、ウ、・ヲヒ、チ、マ sjis: 痔宍痔・ヲ射痔蔀痔煮 unpacked euc: a4b3a4f3a4 unpacked sjis: 8ea48eb38e eq: で、下のように出力する文字列を URL から取得します。 #! perl -w # ~/public_html/cgi-bin/moji.cgi use CGI; use Jcode; my $q = CGI->new; print $q->header(); print $q->start_html(); print $q->start_form(-action=>'./answer.cgi'); $str_euc = $q->url_param('greeting'); $str_sjis = $str_euc; Jcode::convert(\$str_sjis, 'euc', 'sjis'); print "euc: $str_euc <br>"; print "sjis: $str_sjis <br>"; print "unpacked euc: ".unpack("H10", $str_euc)."<br>"; print "unpacked sjis: ".unpack("H10", $str_sjis)."<br>"; print "eq:".($str_euc eq $str_sjis)."<br>"; こうすると、ブラウザの設定を euc にすると、 なんと、euc も sjis も正しく表示されます。 (http://www/~fukushi/cgi-bin/moji.cgi?greeting=こんにちは の表示) euc: こんにちは sjis: こんにちは unpacked euc: a4b3a4f3a4 unpacked sjis: 8ea48eb38e eq: ブラウザの表示を sjis にすると、euc 部のみ正しく表示されます。 (http://www/~fukushi/cgi-bin/moji.cgi?greeting=こんにちは の表示) (http://www/~fukushi/cgi-bin/moji.cgiの表示) euc: こんにちは sjis: 、ウ、・ヲヒ、チ、マ unpacked euc: a4b3a4f3a4 unpacked sjis: 8ea48eb38e eq: これはなぜでしょう? サーバーの OS は FreeBSD 2.2.8-RELEASE、 言語は jperl5.005_03-990612 EUC Version(Latin モードで使用)、 クライアントの OS は Windows 2000 server、 ブラウザーは Netscape Navigator 4.75 です。 |
今日は。 Awkで {AA [$1]++} END {for (BB in AA) ...........} とやると、AAの中に有る同じ名前のものが幾つあるか数えてくれると思うの ですが、Perlではどうやったら同じことが出来ますか? 例えば @array=(9, 9, 9, 3, 3, 3, 2, 2, 1) とすると、 9は3個、3は3個、2は2個1は1個あるので、 9=3 3=3 2=2 1=1 としたいのですが、宜しくお願いいたします。 |
>>2433 ミング さん: なんとなく似せて書くと #! perl @array = (9,9,9,3,3,3,2,2,1); for (@array) { $array2{$_}++; } for (reverse sort keys %array2) { print "$_=$array2{$_}\n"; } とか。 「ハッシュ」の機能を使っています。 @array の順番には関係なく、 常に大きな数字から出力していますがいいでしょうか。 (ハッシュを使うと、順不同になるので、、) |
>>2432 ふくし > Jcode::convert(\$str_sjis, 'euc', 'sjis'); 逆ですよー。 Jcode::convert(\$str_sjis, 'sjis', 'euc'); |
だれか、solaris8intel_platformをAT互換機で動作する、LANカードを 知っている方いらっしゃいますか? |
>>2435 68user あ、ほんとだ、、すみませんいつもいつも、、(_ _) で、 #! perl -w use CGI; use Jcode; my $q = CGI->new; print $q->header(); print $q->start_html(); print $q->start_form(-action=>'./answer.cgi'); $str_euc = 'こんにちは'; $str_sjis = $str_euc; Jcode::convert(\$str_sjis, 'sjis', 'euc'); print "euc: $str_euc <br>"; print "sjis: $str_sjis <br>"; print "unpacked euc: ".unpack("H10", $str_euc)."<br>"; print "unpacked sjis: ".unpack("H10", $str_sjis)."<br>"; print "eq:".($str_euc eq $str_sjis)."<br>"; だと euc モードで、どっちの「こんにちは」も正しく表示されるのは なぜでしょうか? |
>>2436 Bourbon どの程度「使える」資料なのかは知りませんが、 ハードウェア互換リスト (HCL) http://soldc.sun.com/support/drivers/hcl_ja/ というのがあります。 |
>>2437 ふくし > euc モードで、どっちの「こんにちは」も正しく表示されるのは > なぜでしょうか? http://x68000.startshop.co.jp/~68user/tmp/moji.cgi を見ても「こんにちは」が正しく表示されますか? もしそうなら、Netscape4 が自動変換しているのでしょう。Netscape4 は、 文字単位か行単位か知りませんが、ファイルの一部についても自動認識/ 自動変換を行っています。 FreeBSD+Netscape4、FreeBSD+Mozilla nightly build で上記 URL を 見ると、必ず片方は化けています。 |
68userさん HCLは知っていましたが、見落としている部分がありました。 じっくり読んでみます。ありがとうございます。 |
たびたびお世話になります。 おかげさまで、この前使えるようになったPPMで、ImageMagickモジュ ールをinstallして、使おうと思ったら、何にも反応なしで困っていま す。いろいろサイトを見て回りましたが、類似問題は見あたらず・・・。 環境は、Perl5.6.1(build631) Windows98です。 この環境に、PPMで、install Image-Magick してImageMagickを入れ ました。 C:\>ppm PPM>install Image-Magick です。 その結果、c:\perl\site\libにはimageディレクトリができていて、 その中にはちゃんとMagick.pmというのもあるようです。 それで、下のを実行してみたのです。 use Image::Magick; $i = Image::Magick->new; $i->Read('test.jpg'); $i2 = $i->Clone(); $i->Scale(width=>100, height=>100); $i->Write('test2.jpg'); すると、Perlそのものは正常に終了する(エラーは出ない)のですが、 test2.jpgはできてないのです。 ちなみに下のようなのも実行してみました。 use Image::Magick; $img = Image::Magick->new; $img->Read('test.jpg'); ($w,$h) = $img->Get('width','height'); print "Content-type: text/html\n\n"; print "<html><head><title>TEST</title></head>\n"; print "<body bgcolor=\"\#ffffff\">\n"; print "$w / $h\n"; print "<br></body></html>\n"; exit 0; こちらも、$wも$hも空でした。 test.jpgは存在しているし、どうしてうまく行かないのか、まった く見当もつかないので、これだけの情報では不足かもしれませんが、 何か分かる方おられましたら、ご指導ください。どうかよろしくお 願いします。 |
>>2439 68user さん、どうも。 たしかに両方化けずに見えています。 FreeBSD 版では片方化けるんですね。 なるほど、Windows 版 NC はファイルの一部も自動変換、、 しかもブラウザーが渡す URL の文字列は必ず sjis。 これがわかんなくてホボ一日ハマりました。 パラメタはあらかじめ変換しておくのを原則にすればよかったのですが、 表示を見て正しく EUC で入ってくるものと思い込んでいたのです。 |