避難所名簿リスト化プロジェクト
知恵袋のアドバイス - OYAJI
2011/03/18 (Fri) 13:56:14
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail.php?qid=1257858202
こちらでアドバイスを戴いている件に関して
知恵袋上では1往復しかやりとりが出来ないので
アドバイスを受けるためのコーナーです。
◆サーバー環境
ロリポップレンタルサーバー
CGIやPerlの動作はたぶんOK
1)とりあえず http://oyaji3.com/311k/ というフォルダを作成。
2)../311k/ このフォルダにご回答のアドバイスに従い、
テスト的にcsv形式(カンマ区切り)の data.txt を作成。
3) アドバイスに従い以下の4つのファイルをアップロード
jcodeSE2.pl
retrieval.cgi
retrieval2.cgi
data.txt
◆現時点で私がよく判らない部分。
【疑問1.】
根本的な疑問なのですが、通常、PCや携帯からWebサイトを見るためには
index.html ←のような、HTMLファイルが無ければ
アクセス出来ないのでは無いのでしょうか?
上の4つのファイルをアップロードして
http://oyaji3.com/311k/ にアクセスしてもエラーとなります。
戴いたご回答には、HTMLファイルに関する記述が無かった。
【疑問2.】
retrieval.cgiファイルの中身は
2行目の #!/usr/local/bin/perl ←この部分からコピペして
</html> ←ここまでで良いのか?
それとも
EOF
exit; ←ここまでの内容が必要なのか?
【疑問3.】
retrieval2.cgi の内容に関しても、上記と同様で
>#!/usr/local/bin/perl ←この行から、
↓
↓
$in{$na}=$val;
} ←ここまでのコピペで良いのか?
#ここまでは、formで送られてきたデータを取得しています。
#jcodeSE2.plは日本語を扱うためのものです ←ここまでコピペするのか?
【疑問】
それとも根本的に勘違いしていて、
retrieval2.cgi の中身は、
#!/usr/local/bin/perl ←この行から、
↓
↓
</html>
EOF
exit; ←ここまでの行のコピペが必要なのか?
>少しでも役立てたらいいと思います。
【それと、これから先の問題点】
当初は、Picasa 上にアップされた名簿写真のコメント欄に
テキスト起こし隊の皆様が書いてくれたコメント(=名簿上の氏名など)
を、そのままメモ帳にコピペして txtファイルとしてサーバーにアップして
それを利用出来ないか?と考えていましたが、
やはり検索させるとなると、氏名ごとに個別レコードを作成し
CSV形式などにしなければならない。
この手間が非常に厄介であり時間がかかる。
で、その上、協力者がいなければとてもじゃないけど無理そう・・・。
Re: 知恵袋のアドバイス - OYAJI
2011/03/18 (Fri) 14:18:56
経過報告
ご回答戴いた内容から
http://oyaji3.com/311k/index.html
を作成しアップロード。
データサンプル(data.txt)は
http://oyaji3.com/311k/data.txt
こちらですが、名前を検索欄に入れて検索しても
エラー表示になってしまう・・・(つД`)
◆追記◆
そうか!検索結果の体裁は
retrieval2.cgi の中にあるHTMLをアレンジして
各変数(=csvの項目)を付けたしていけばいいんだ
・・・という所までは理解した ←今ここ
でも検索結果はエラーのまま。
氏名データに半角のスペースが入ってるのがダメなのか?
Re: 知恵袋のアドバイス - OYAJI
2011/03/18 (Fri) 14:40:51
retrieval2.cgi の中身です。
間違いがあればご指摘下さい。
#ここから
if($ENV{'REQUEST_METHOD'} eq'POST'){
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
}
else{
$buffer=$ENV{'QUERY_STRING'};
}
@buffer=split(/&/,$buffer);
foreach(@buffer){
($na,$val)=split(/=/,$_);
$val=~tr/+/ /;
$val=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
&jcode::convert(*val,'sjis','','z');
$val=~s/</</g;
$val=~s/>/>/g;
$val=~s/"/"/g;
$val=~s/\r\n//g;
$val=~s/\r//g;
$val=~s/\n/<br>/g;
$in{$na}=$val;
}
#ここまでは、formで送られてきたデータを取得しています。
#jcodeSE2.plは日本語を扱うためのものです
print <<"EOF";
<html>
<head>
<title>避難所名簿リスト検索</title>
</head>
<body bgcolor='#ffffff'>
EOF
open(IN,'./data.txt');
@DATA=<IN>;
close(IN);
foreach(@DATA){ #一行ごとに実行します
($name,$name2,$address,$sex,$message,$harea1,$hadd,$htel,$hmap,$hurl,)=split(/,/); #ここは、コンマ区切りのデータを、各変数に代入しています。
if($name=~/$in{'name'}/){
print "<b>氏名$name ふりがな$name2</b>性別$sex<br>メッセージ$message <br>
避難所名$harea1<br>避難所住所$hadd 避難所住所TEL $htel <br>避難所MAP $hmap<br>名簿写真URL $hurl"; #検索結果を表示しています。
}
}
print <<"EOF";
</body>
</html>
EOF
exit;
---ここまで---
Re: 知恵袋のアドバイス - Ghost X
2011/03/18 (Fri) 17:53:48
dragonquestlot_s_crestです。
index.htmlは既に存在するかと思い、
あえてretrieval.cgiを作りました;
色々と言葉足らずで、申し訳ないです><
ロリポップということなら、大丈夫です。
まず、index.htmlのformタグ内のactionをretrieval.cgiにして下さい。
そして、retrieval2.cgiをretrieval.cgiにして下さい(まだretrieval.cgiが残っている場合は、それを削除してから行って下さい)。
#!/usr/local/bin/perl
ここから、
exit;
ここまでのコピーでお願いします。
また、プログラム内の#以降の文字は、コメントアウトというものです。
#以降の文字はコメントとして解釈され、無視されます。
よって、#以降の文字や、#自身は削除しても構いません。
また、cgiファイルはパーミッションを755にする必要があります。
変更方法は分かりますか?
もし、FFFTPなら、サーバー側の、パーミッションを変更したいファイルの上で右クリックをし、「属性変更(A)...」をクリック。
そして、「現在の属性」のところに755と記入をしてOKを押すか、
~~~~~~~~~~
・オーナー
呼出
書込
実行
・グループ
呼出
実行
・その他
呼出
実行
~~~~~~~~~~
これらにチェックを入れて、OKを押してください。
Re: 知恵袋のアドバイス - OYAJI
2011/03/18 (Fri) 20:58:35
Ghost X様
表示レイアウトはともかく、とりあえず出来ました!!
(動作確認しました)
感謝申し上げます。
http://oyaji3.com/311k/retrieval.cgi
検索キーの例→ 相沢 光秋
甘えついでで申し訳ありませんが、
PC上からではエンターキークリックで
検索実行されますが、
携帯からでは、ボタンのようなものを付けないと
クリック出来ないのですが、
それに関してのヒントや解説サイトをご存知でしょうか?
あと、表示されるURLをハイパーリンクにするためには
data.txt ←こちらのほうにHTMLタグ記載しなければならないのでしょうか?
それとも、retrieval2.cgi のほうに何か編集が必要なのでしょうか?
何度も申し訳ありません。
Re: 知恵袋のアドバイス - Ghost X
2011/03/18 (Fri) 22:20:56
<form action='./retrieval2.cgi' method='POST'>
名前:<input type='text' name='name'>
</form>
を、
<form action='./retrieval2.cgi' method='POST'>
名前:<input type='text' name='name'>
<input type='submit' value='送信'>
</form>
にして下さい。
そして、ハイパーリンクにするには、
print "<b>氏名$name ふりがな$name2</b>性別$sex<br>メッセージ$message <br>
避難所名$harea1<br>避難所住所$hadd 避難所住所TEL $htel <br>避難所MAP $hmap<br>名簿写真URL $hurl"; #検索結果を表示しています。
のなかにハイパーリンクしたい文字列を<a>文字列</a>のようにし、href属性で、リンク先を指定して下さい。
この、print "~";は、HTMLを表示する、と思って頂いても構いません。
なので、
print "<b>氏名$name ふりがな$name2</b>性別$sex<br>メッセージ$message <br>
避難所名$harea1<br>避難所住所$hadd 避難所住所TEL $htel <br>避難所MAP $hmap<br>名簿写真URL <a href='$hurl' target='_blank'>$hurl</a>";
でOKです。
target='_blank' を消すと、現在のページでそのまま表示します。
===以下オマケ(?)===
print ""; の中に、「"」を使いたい場合には、エスケープして下さい。
例:print "\""; #\~で、~をエスケープする
逆に、 ''だったら、''の中の'はエスケープして下さい。
例:print '\'';
\自体を表したい場合には、\\とします。
そして、''の中では、変数が展開されません。
例:print '$name'; #$nameがそのまま表示
""の中や、書かなかった場合には、変数展開されて表示されます。
文字列の連結は、. または、+ で行います。
例:
$a='test';
print "$aです。";
例2:
$a='test';
print $a.'です。';
Re: 知恵袋のアドバイス - Ghost X
2011/03/18 (Fri) 22:31:04
あ、あと、
print <<"EOF";
~
EOF
というのがありますが、これはヒアドキュメントというもので、複数行書きたいときに、便利です。
print <<"EAT"; #EATだけの行までを表示するということです
~
EAT
また、「"」をダブルクォーテーション、「'」をシングルクォーテーションと言います。
で、先ほどのように、
print <<'EOF'; #$textが表示
$text
EOF
このようにシングルクォーテーションで囲むと、変数展開されず、
print <<"EOF"; #変数$textには何も入っていないので、何も表示されない
$text
EOF
ダブルクォーテーションで囲むと、変数展開されません。
Re: 知恵袋のアドバイス - Ghost X
2011/03/18 (Fri) 22:43:17
多少便利にするために、次の個所を以下に示すように、変更して下さい。
名字と名前の間の空白が、全角でも半角でも検索できるようにするためです。
open(IN,'./data.txt');
@DATA=<IN>;
close(IN);
foreach(@DATA){ #一行ごとに実行します
($name,$name2,$address,$sex,$message,$harea1,$hadd,$htel,$hmap,$hurl,)=split(/,/); #ここは、コンマ区切りのデータを、各変数に代入しています。
if($name=~/$in{'name'}/){
print "<b>氏名$name ふりがな$name2</b>性別$sex<br>メッセージ$message <br>
避難所名$harea1<br>避難所住所$hadd 避難所住所TEL $htel <br>避難所MAP $hmap<br>名簿写真URL $hurl"; #検索結果を表示しています。
}
}
の部分を、↓
$in{'name'}=~s/(\s|\ )+/\s/g; #一文字以上の全角空白・半角空白を一つの半角空白に。
open(IN,'./data.txt');
@DATA=<IN>;
close(IN);
foreach(@DATA){ #一行ごとに実行します
($name,$name2,$address,$sex,$message,$harea1,$hadd,$htel,$hmap,$hurl,)=split(/,/); #ここは、コンマ区切りのデータを、各変数に代入しています。
$name=~s/(\s|\ )+/\s/g; #一応。
if($name=~/$in{'name'}/){
print "<b>氏名$name ふりがな$name2</b>性別$sex<br>メッセージ$message <br>
避難所名$harea1<br>避難所住所$hadd 避難所住所TEL $htel <br>避難所MAP $hmap<br>名簿写真URL $hurl"; #検索結果を表示しています。
}
}
にして下さい。
また、完成した場合には、コメント(#を含む#以降の文字)を削除して下さい。
Re: 知恵袋のアドバイス - OYAJI
2011/03/19 (Sat) 05:15:06
Ghost X 様
懇切丁寧に、本当に感謝申し上げます。
私の知識不足ゆえ、せっかく教えて戴いている事を
まだまだ一部しか理解出来て無い部分もありますが、
(一つ一つ、理解していってる最中です。なにぶんcgiの知識は0なので・・・)
現状で、私が理解出来る範囲のアレンジを行ってみました。
http://oyaji3.com/311k/ ←こちらから
高橋や浅野、阿部などのキーで検索してもらえれば
その結果の表示確認が出来ます。
(元データは→ http://oyaji3.com/311k/data.txt )
それと、data.txt上でわざわざリンクタグを入力しなくとも
retrieval2.cgi のほうで変数の前後にタグを入れとけば
ハイパーリンクになる件についても、
data.txtへの入力作業が非常に楽になりますのでめちゃくちゃ助かりました。
残念ながら、まだデータ作成の協力者様の申し出がありませんが
(たまたま見つけましたが)
https://spreadsheets.google.com/ccc?key=0AsJzUGmXonIXdDAtUUcyQURUbkgzM1FiT0FiallYR2c&hl=ja#gid=0 ←こういう形で
名簿データをエクセル化されている方もいらっしゃるようなので
そういう皆様を見つけて、協力要請&「フォーマットの統一要請」が
出来れば、このプロジェクトの促進にも光明が見えてきた感じがしております。
※ただ、データ量によるサーバー負荷がどの程度なのかが予測出来ないので
たとえばその地域ごとに、サーバー提供していただける有志の方などのご協力があれば
サーバー負荷の分散化なども可能かと思うのですが
このアイデアに、どこかのネット運営企業が乗ってきて戴ければ(サポート戴ければ)
ありがたいのですけどね・・・
Re: 知恵袋のアドバイス - OYAJI
2011/03/19 (Sat) 05:29:15
Ghost X様のアドバイスに従って作成した
retrieval2.cgi ←の内容を記載しておきます。
※現時点の問題点
・以前は 「苗字+空白+名前」で検索ヒットしたが
現在の状態では、たとえば「相沢 光秋」で検索すると
表示が真っ白になってしまう。
・現在は、「苗字のみ」や「名前のみ」で検索した場合だと
ちゃんと検索結果が表示される。
---- retrieval2.cgi のソース ここから----
#!/usr/local/bin/perl
print "Cache-Control: no-cache\n";
print "Pragma: no-cache\n";
print "Content-Type: text/html;charset=Shift_JIS\n\n";
require 'jcodeSE2.pl';
if($ENV{'REQUEST_METHOD'} eq'POST'){
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
}
else{
$buffer=$ENV{'QUERY_STRING'};
}
@buffer=split(/&/,$buffer);
foreach(@buffer){
($na,$val)=split(/=/,$_);
$val=~tr/+/ /;
$val=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
&jcode::convert(*val,'sjis','','z');
$val=~s/</</g;
$val=~s/>/>/g;
$val=~s/"/"/g;
$val=~s/\r\n//g;
$val=~s/\r//g;
$val=~s/\n/<br>/g;
$in{$na}=$val;
}
print <<"EOF";
<html>
<head>
<title>避難所名簿リスト検索</title>
</head>
<body bgcolor='#ffffff'>
<p><a href="http://oyaji3.com/311k/">Topに戻る</a></p>
<p> </p>
EOF
$in{'name'}=~s/(\s|\ )+/\s/g;
open(IN,'./data.txt');
@DATA=<IN>;
close(IN);
foreach(@DATA){
($name,$name2,$address,$sex,$message,$harea1,$hadd,$htel,$hmap,$hurl,)=split(/,/);
if($name=~/$in{'name'}/){
print "<p>
ふりがな:<b>$name2</b><br>
氏 名:<b>$name</b><br>
性別: <b>$sex</b><br><br>
メッセージ: <b>$message</b><br><br>
避難所名: <b>$harea1</b><br><br>
住所: <b>$hadd</b> <br><br>
TEL: <b>$htel</b> <br><br>
<b>避難所MAP: <a href='$hmap'>$hmap</b></a><br><br>
<b>名簿写真URL</b> <a href='$hurl'>$hurl</a><br><br></p>"
;
}
}
print <<"EOF";
<p> </p>
<a href="http://oyaji3.com/311k/">Topに戻る</a>
</body>
</html>
EOF
exit;
---- retrieval2.cgi のソース ここまで----
Re: 知恵袋のアドバイス - Ghost X
2011/03/19 (Sat) 12:44:26
申し訳ないです;
以下の部分を変更して下さい。
$in{'name'}=~s/(\s|\ )+/\s/g;
open(IN,'./data.txt');
@DATA=<IN>;
close(IN);
foreach(@DATA){
($name,$name2,$address,$sex,$message,$harea1,$hadd,$htel,$hmap,$hurl,)=split(/,/);
if($name=~/$in{'name'}/){
print "<p>
ふりがな:<b>$name2</b><br>
氏 名:<b>$name</b><br>
性別: <b>$sex</b><br><br>
メッセージ: <b>$message</b><br><br>
避難所名: <b>$harea1</b><br><br>
住所: <b>$hadd</b> <br><br>
TEL: <b>$htel</b> <br><br>
<b>避難所MAP: <a href='$hmap'>$hmap</b></a><br><br>
<b>名簿写真URL</b> <a href='$hurl'>$hurl</a><br><br></p>"
;
}
}
正しくは、↓ です。
$in{'name'}=~s/(\s|\ )+/ /g;
open(IN,'./data.txt');
@DATA=<IN>;
close(IN);
foreach(@DATA){
($name,$name2,$address,$sex,$message,$harea1,$hadd,$htel,$hmap,$hurl,)=split(/,/);
$name=~s/(\s|\ )+/ /g;
if($name=~/$in{'name'}/){
print <<"RESULT";
<p>
ふりがな: <b>$name2</b><br>
氏 名: <b>$name</b><br>
性別: <b>$sex</b><br><br>
メッセージ: <b>$message</b><br>
<br>
避難所名: <b>$harea1</b><br>
<br>
住所: <b>$hadd</b><br>
<br>
TEL: <b>$htel</b><br>
<br>
<b>避難所MAP: <a href='$hmap'>$hmap</a></b><br>
<br>
<b>名簿写真URL: </b><a href='$hurl'>$hurl</a><br>
<br>
</p>
RESULT
}
}
です。
尚、表示する際に全角空白を入れて表示していましたが、文字化けの原因となるため、半角空白( )二つで対応して下さい。
また、以下の点を修正しました。
タグを閉じる順番をご確認ください。
<b>避難所MAP: <a href='$hmap'>$hmap</b></a>
↓
<b>避難所MAP: <a href='$hmap'>$hmap</a></b>
Re: 知恵袋のアドバイス - Ghost X
2011/03/19 (Sat) 12:55:18
おっと;;
「苗字名前」(空白なし)、「苗字 名前」(半角空白)、「苗字 名前」(全角空白)
これらに対応させるために、↑のレスのソース(プログラムの事)を少し変更して下さい。
$in{'name'}=~s/(\s|\ )+/ /g;
↓
$in{'name'}=~s/(\s|\ )+//g;#全角空白、半角空白削除
$name=~s/(\s|\ )+/ /g;
↓
$name=~s/(\s|\ )+//g;#同じく。
これら二つの作業によって、data.txtの氏名は、以下のどの形式でも検索が可能です。
苗字名前
苗字 名前
苗字 名前
苗字 名前
苗字 名前
……
また、「ふりがな」からも検索したい場合には、以下のようにします。
$name=~s/(\s|\ )+//g; #(上記変更内容を実行後。)
if($name=~/$in{'name'}/){
の部分を、↓
$name=~s/(\s|\ )+//g;
$name2=~s/(\s|\ )+//g;
if($name=~/$in{'name'}/ || $name2=~/$in{'name'}/){
にします。
Re: 知恵袋のアドバイス - OYAJI
2011/03/19 (Sat) 13:40:47
Ghost X様、何度もありがとうございます。
ただ、最後の3行の部分、元々
---ここから---
<b>名簿写真URL</b> <a href='$hurl'>$hurl</a><br><br></p>"
;
}
}
print <<"EOF";
<p> </p>
<a href="http://oyaji3.com/311k/">Topに戻る</a>
</body>
</html>
EOF
exit;
----ここまで----
・・・としてた部分を、ご指摘のように
---ここから---
<b>名簿写真URL</b> <a href='$hurl'>$hurl</a><br><br></p>"
;
RESULT
}
}
<p> </p>
<a href="http://oyaji3.com/311k/">Topに戻る</a>
</body>
</html>
EOF
exit;
---ここまで---
・・・としてしまうと、動作しなくなってしまいました。
なので、現在は下記のようなソースで動いてはいますが・・・
---- 現在のretrieval2.cgi のソース ここから----
#!/usr/local/bin/perl
print "Cache-Control: no-cache\n";
print "Pragma: no-cache\n";
print "Content-Type: text/html;charset=Shift_JIS\n\n";
require 'jcodeSE2.pl';
if($ENV{'REQUEST_METHOD'} eq'POST'){
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
}
else{
$buffer=$ENV{'QUERY_STRING'};
}
@buffer=split(/&/,$buffer);
foreach(@buffer){
($na,$val)=split(/=/,$_);
$val=~tr/+/ /;
$val=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
&jcode::convert(*val,'sjis','','z');
$val=~s/</</g;
$val=~s/>/>/g;
$val=~s/"/"/g;
$val=~s/\r\n//g;
$val=~s/\r//g;
$val=~s/\n/<br>/g;
$in{$na}=$val;
}
print <<"EOF";
<html>
<head>
<title>避難所名簿リスト検索</title>
</head>
<body bgcolor='#ffffff'>
<p><a href="http://oyaji3.com/311k/">Topに戻る</a></p>
<p> </p>
EOF
$in{'name'}=~s/(\s|\ )+/ /g;
open(IN,'./data.txt');
@DATA=<IN>;
close(IN);
foreach(@DATA){
($name,$name2,$address,$sex,$message,$harea1,$hadd,$htel,$hmap,$hurl,)=split(/,/);
if($name=~/$in{'name'}/){
print "<p>
ふりがな<b>$name2</b><br>
氏 名:<b>$name</b><br>
性別: <b>$sex</b><br><br>
メッセージ: <b>$message</b><br><br>
避難所名: <b>$harea1</b><br><br>
住所:<b>$hadd</b> <br><br>
TEL:<b>$htel</b> <br><br>
<b>避難所MAP:<a href='$hmap'>$hmap</a></b><br><br>
<b>名簿写真URL</b><a href='$hurl'>$hurl</a><br><br></p>"
;
}
}
print <<"EOF";
<p> </p>
<a href="http://oyaji3.com/311k/">Topに戻る</a>
</body>
</html>
EOF
exit;
---- 現在のretrieval2.cgi のソース ここまで----
これで実際に http://oyaji3.com/311k/ で動作確認をしてみると
下記の4例での検索では、正常動作するようになりましたが
例1.浅野 千明(苗字+全角スペース+名)=動作OK
例2.浅野 千明 (苗字+半角スペース+名)=動作OK
例3.浅野 (苗字のみ) =動作OK
例4. 千明(名のみ) =動作OK
姓名をつなげた状態 → 浅野千明 =検索ヒットしない・NG
の場合は、検索にヒットしなくなってしまいました。
これは解決する事は出来ないでしょうか?
むしろそれならば、半角空白や全角空白を入れずに検索させる方向で
組み立てるほうが良いのでしょうか?
何度も申し訳ありませんが、よろしくご教授下さい。
Re: 知恵袋のアドバイス - OYAJI
2011/03/19 (Sat) 13:54:11
Ghost X様、ありがとうございます!!!
投稿が前後したようですね。
以下のようにすれば、希望通りの動作になりました。
---- 現在のretrieval2.cgi のソース ここから----
#!/usr/local/bin/perl
print "Cache-Control: no-cache\n";
print "Pragma: no-cache\n";
print "Content-Type: text/html;charset=Shift_JIS\n\n";
require 'jcodeSE2.pl';
if($ENV{'REQUEST_METHOD'} eq'POST'){
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
}
else{
$buffer=$ENV{'QUERY_STRING'};
}
@buffer=split(/&/,$buffer);
foreach(@buffer){
($na,$val)=split(/=/,$_);
$val=~tr/+/ /;
$val=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
&jcode::convert(*val,'sjis','','z');
$val=~s/</</g;
$val=~s/>/>/g;
$val=~s/"/"/g;
$val=~s/\r\n//g;
$val=~s/\r//g;
$val=~s/\n/<br>/g;
$in{$na}=$val;
}
print <<"EOF";
<html>
<head>
<title>避難所名簿リスト検索</title>
</head>
<body bgcolor='#ffffff'>
<p><a href="http://oyaji3.com/311k/">Topに戻る</a></p>
<p> </p>
EOF
$in{'name'}=~s/(\s|\ )+//g;
open(IN,'./data.txt');
@DATA=<IN>;
close(IN);
foreach(@DATA){
($name,$name2,$address,$sex,$message,$harea1,$hadd,$htel,$hmap,$hurl,)=split(/,/);
$name=~s/(\s|\ )+//g;
$name2=~s/(\s|\ )+//g;
if($name=~/$in{'name'}/ || $name2=~/$in{'name'}/){
print "<p>
ふりがな<b>$name2</b><br>
氏 名:<b>$name</b><br>
性別: <b>$sex</b><br><br>
メッセージ: <b>$message</b><br><br>
避難所名: <b>$harea1</b><br><br>
住所:<b>$hadd</b> <br><br>
TEL:<b>$htel</b> <br><br>
<b>避難所MAP:<a href='$hmap'>$hmap</a></b><br><br>
<b>名簿写真URL</b><a href='$hurl'>$hurl</a><br><br></p>"
;
}
}
print <<"EOF";
<p> </p>
<a href="http://oyaji3.com/311k/">Topに戻る</a>
</body>
</html>
EOF
exit;
---- 現在のretrieval2.cgi のソース ここまで----
・・・申し訳ありません。最後のワガママです・・・。
検索ヒットしなかった場合に、
現状では空白表示(上下にHTMLで貼ったTopへのリンクのみの表示)
になってしまうのですが、
「ヒットしませんでした」←みたいな表示を出す方法は
どうすれば良いのでしょうか?
Re: 知恵袋のアドバイス - Ghost X
2011/03/19 (Sat) 14:24:16
ヒットした場合には、$hitの値を1にすることで、あとで$hitに値があるか確認し、なかったら、ヒットしませんでしたと表示するようにしました。
------retrieval2.cgi------
#!/usr/local/bin/perl
print "Cache-Control: no-cache\n";
print "Pragma: no-cache\n";
print "Content-Type: text/html;charset=Shift_JIS\n\n";
require 'jcodeSE2.pl';
if($ENV{'REQUEST_METHOD'} eq'POST'){
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
}
else{
$buffer=$ENV{'QUERY_STRING'};
}
@buffer=split(/&/,$buffer);
foreach(@buffer){
($na,$val)=split(/=/,$_);
$val=~tr/+/ /;
$val=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
&jcode::convert(*val,'sjis','','z');
$val=~s/</</g;
$val=~s/>/>/g;
$val=~s/"/"/g;
$val=~s/\r\n//g;
$val=~s/\r//g;
$val=~s/\n/<br>/g;
$in{$na}=$val;
}
print <<"EOF";
<html>
<head>
<title>避難所名簿リスト検索</title>
</head>
<body bgcolor='#ffffff'>
<p><a href="http://oyaji3.com/311k/">Topに戻る</a></p>
<p> </p>
EOF
$in{'name'}=~s/(\s|\ )+//g;
open(IN,'./data.txt');
@DATA=<IN>;
close(IN);
foreach(@DATA){
($name,$name2,$address,$sex,$message,$harea1,$hadd,$htel,$hmap,$hurl,)=split(/,/);
$name=~s/(\s|\ )+//g;
$name2=~s/(\s|\ )+//g;
if($name=~/$in{'name'}/ || $name2=~/$in{'name'}/){
print <<"RESULT";
ふりがな<b>$name2</b><br>
氏 名:<b>$name</b><br>
性別: <b>$sex</b><br><br>
メッセージ: <b>$message</b><br><br>
避難所名: <b>$harea1</b><br><br>
住所:<b>$hadd</b> <br><br>
TEL:<b>$htel</b> <br><br>
<b>避難所MAP:<a href='$hmap'>$hmap</a></b><br><br>
<b>名簿写真URL</b><a href='$hurl'>$hurl</a><br><br></p>
RESULT
$hit=1;
}
}
if(!$hit){
print "検索ワード「$in{'name'}」では、ヒットしませんでした。";
}
print <<"EOF";
<p> </p>
<a href="http://oyaji3.com/311k/">Topに戻る</a>
</body>
</html>
EOF
exit;
------ここまで------
ところで、この検索システムを紹介しても宜しいでしょうか?
リンクと紹介文を載せたいです><
Re: 知恵袋のアドバイス - Ghost X
2011/03/19 (Sat) 14:33:11
おまけです。
ヒアドキュメントは変数にも代入できます。
-----Example-----
$HERE_DOCUMENT=<<"END";
This is a here document test.
END
print <<"EOF";
テスト~<br>
$HERE_DOCUMENT<br>
テスト~
EOF
-----End of Example-----
Re: 知恵袋のアドバイス - OYAJI
2011/03/19 (Sat) 14:46:21
dragonquestlot_s_crest様、
本当に長い間、ありがとうございました。
もちろん、このシステムをどんどんご紹介して戴いて構いませんし
一番の問題である「元データをどう集めるのか?」の問題も、
それを広めていただく事によって、どなたかが助け舟を出してくれる可能性
もあります。
一応、似たようなシステムで、すでに携帯検索を可能にしている
http://ganbare.takyam.com/ ←こちらの作成者さんにも
アポイントをとってみたのですが(まだ返事はありませんが)
こちらの方の取得データを使わせてもらえるならば
かなり凄いシステムになる可能性もありますし、
もちろん、他の方にどんどん利用して頂いて
被災地の皆様にお役立て戴いたら嬉しいです。
ともかくも、data.txt のデータを集める方法を考えなければなりません。
本当にありがとうございました。
凄く勉強になりました。
Re: 知恵袋のアドバイス - Ghost X
2011/03/19 (Sat) 15:37:56
大切なことを忘れてました;
ので、修正したファイルをおいておきます。
http://kioku.mods.jp/fh/download/retrieval2.txt
一応完全版ですので、不具合等の修正、インデント(ソースを見やすくすること。インデントには、タブキーを使用します。)をしておきました。
Re: 知恵袋のアドバイス - Ghost X
2011/03/19 (Sat) 16:12:18
あ、文字化け><;;
http://kioku.mods.jp/fh/download/retrieval2.txt
修正しました。
上記ページを開いた後に、F5を押して、ページ内容を更新してからコピー→貼り付けして下さい。
Re: 知恵袋のアドバイス - OYAJI
2011/03/19 (Sat) 16:59:58
dragonquestlot_s_crest様
うぉ~!!素晴らしい!!!
ありがとうございます!感謝です!!
そうこうしている間にも、
https://picasaweb.google.com/tohoku.anpi
こちらには山ほどファイルが溜まっていってますが(汗;
なんとかそれらのデータが有効に活かせる様に
このdragonquestlot_s_crest様が作って下さったツールを
有効利用していきたいと思っております。
Re: 知恵袋のアドバイス - Ghost X
2011/03/19 (Sat) 17:04:22
こちらこそ、利用していただいて、ありがとうございます^^
頑張ってください~
また何かありましたら、メールでも送っていただけると幸いです。
では~
Re: 知恵袋のアドバイス - Ghost X
2011/03/23 (Wed) 17:43:24
今更ですが、一つのファイルにデータをまとめなくても、特定のディレクトリ(フォルダ)内にある拡張子がtxtのファイルを検索する、ということも可能です。
もうご存知かもしれませんが、画像から文字を得る、OCRというものがあります。
http://search.yahoo.co.jp/search?p=OCR%20%E3%83%95%E3%83%AA%E3%83%BC%E3%82%BD%E3%83%95%E3%83%88&rs=1&aq=-1&ei=UTF-8&fr=top_ga1_sa
こちらを使うと、データ入力が更に早く行えるかもしれません。
2011/03/24 (Thu) 16:23:07
2011/03/23 (Wed) 17:43:24 Ghost X 様
アドバイスありがとうございます。
それって、txtファイル内の文字列(避難者名簿の氏名)を
携帯電話から検索して表示出来るのでしょうか?
そこが一番知りたい部分なのです。
それが出来れば、Person Finderの入力ボランティアさんが
たとえば
https://picasaweb.google.com/tohoku.anpi/2011_03_24_1138_name_list#5587143410062075490
このように、「テキスト起こし」をされている名簿を
単にTXTファイルにコピペ→サーバーにアップ する作業だけで済むので
ずっとその方法を探しているわけです。
TXTファイル名のみを検索するだけでは、意味が無く、
探したい人の氏名で検索→ヒットさせて表示する事が
重要だと思っていますので(もちろんガラケーからです)
膨大な量のある氏名データを1つ1つレコード化する必要がなくなるので
非常に楽になると思うのですけど・・・。
Re: 知恵袋のアドバイス - Ghost X
2011/03/24 (Thu) 19:49:23
>それって、txtファイル内の文字列(避難者名簿の氏名)を
>携帯電話から検索して表示出来るのでしょうか?
可能です。
ただし、データの形式は必ず統一しなければいけません。
たとえば、
名前:[名前],年齢:[年齢]
や、
名前<>年齢
や、
名前,年齢
や、
名前'年齢
や
名前!年齢
や
名前-年齢
や
名前 年齢
や
名前@@年齢
など、形式が揃っていれば、ケータイでもなんでも大丈夫です。
>単にTXTファイルにコピペ→サーバーにアップ する作業だけで済むので
上記のように、フォーマット形式が整っていれば、特定フォルダの中にアップするだけで、検索が可能です。