インストール型ブログ
セキュリティコード
GoogleSitemapsジェネレータ
サイト探索
ActivePerl
Perlドキュメント(和訳)
Perlデータ構造
Apache JP
Apache 中核機能
| Movable Type(ムーバブルタイプ) シックス・アパート社 |
www.movabletype.jp (日本) www.movabletype.org (米国) |
|
| ライセンス | 非商用利用は無料、商用利用は有料 | |
| DB | 不要(MySQL利用可) | |
| 言語 | Perl | |
| Nucleus(ニュークリアス) The Nucleus Group |
japan.nucleuscms.org (日本) nucleuscms.org (米国) |
|
| ライセンス | フリー (GPL) | |
| DB | MySQL | |
| 言語 | PHP | |
| tDiary | www.tdiary.org (日本) | |
![]() |
ライセンス | フリー (GPL) |
| DB | MySQL利用可 | |
| 言語 | Ruby | |
| GsBlog Web Application Factory |
www.waf.jp/contents/download/gsblog (日本) | |
| ライセンス | 非商用利用は無料、商用利用は有料 | |
| DB | MySQL | |
| 言語 | PHP | |
| P_BLOG P_BLOG Proj |
pbx.homeunix.org/p_blog (日本) | |
![]() |
ライセンス | フリー (GPL) |
| DB | MySQL必須 | |
| 言語 | PHP | |
| 華式(Kshiki) 流之進 |
ryunosin.hp.infoseek.co.jp/KshikiSetup.html (日本) | |
| ライセンス | フリー (GPL) | |
| DB | 不要 | |
| 言語 | Perl | |
| Blogn(ぶろぐん) R・ONEコンピューター |
www.blogn.org (日本) | |
| ライセンス | 非商用利用は無料、商用利用は有料 | |
| DB | 不要(MySQL利用可) | |
| 言語 | PHP | |
| rNote Woody-Rinn |
rinn.e-site.jp/rnote (日本) | |
| ライセンス | 使用制限なし | |
| DB | 不要 | |
| 言語 | PHP | |
| Serene Bach sb開発研究所 |
serennz.cool.ne.jp/sblog/ (日本) | |
| ライセンス | 非商用利用は無料、商用利用は有料 | |
| DB | 不要 | |
| 言語 | Perl | |
| COREBlog Webcore Corp |
coreblog.org (日本) | |
| ライセンス | 使用制限なし(?) | |
| DB | 不要 | |
| 言語 | Python(Zope) | |
| blosxom Rael Dornfest |
www.blosxom.com | |
| ライセンス | 使用制限なし | |
| DB | 不要 | |
| 言語 | PHP or Perl | |
| bBlog Eaden McKee |
www.bblog.com | |
| ライセンス | フリー (GPL) | |
| DB | MySQL | |
| 言語 | PHP | |
| WordPress | wordpress.org | |
![]() |
ライセンス | フリー (GPL) |
| DB | MySQL | |
| 言語 | PHP | |
| Serendipity Blog s9y |
www.s9y.org | |
| ライセンス | フリー (BSD License) | |
| DB | MySQL or PostgreSQL | |
| 言語 | PHP | |
| teeter totter solo.design |
solodesign.jp/tt | |
| ライセンス | 非商用利用は無料、商用利用は有料 | |
| DB | 不要 | |
| 言語 | Perl | |
| stereolog マツオ (tar100mg) |
tar100mg.com/stereolog | |
| ライセンス | 使用制限なし | |
| DB | 不要 | |
| 言語 | PHP | |
| PwBlog 株式会社CATWALK |
www.pwblog.com | |
| ライセンス | 非商用利用は無料、商用利用は有料 | |
| DB | PostgreSQL | |
| 言語 | Perl | |
| lily | www.mikihoshi.com/lily | |
| ライセンス | フリー (GPL) | |
| DB | 不要 | |
| 言語 | Ruby | |
では、[1]から検証
HTML,JavaScript,Flash,CGIを使ったサンプル![]()
以下のファイル(4+1)をまとめたものをダウンロードできます
File: secur_code.zip
ほとんどがFlash(code.swf)を引数つきで呼び出すだけのタグです
Code: download
- <h1>セキュリティコード認証のテスト</h1>
- <form action="check.cgi" method="POST">
- <fieldset><legend>Regist Form</legend><br />
- <h2>登録するユーザ名を入力してください(半角英数字20文字以内)</h2>
- Name : <input type="text" name="name" size="20"><br /><br />
- <h2>右側の画像に表示されている、文字列を入力してください</h2>
- Code : <input type="text" name="code" size="10">
- <script>
- var rand = Math.floor(Math.random()*10000000000);
- document.write('<OBJECT classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '+
- 'codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" '+
- 'width="90" height="25" id="code.swf" align="middle"><param name="allowScriptAccess" value="sameDomain">'+
- '<param name="quality" value="high"><param name="bgcolor" value="#000000">'+
- '<param name="movie" value="code.swf"><param name="FlashVars" value="code=' + rand +'">'+
- '<embed src="code.swf" quality="high" bgcolor="#000000" width="90" height="25"'+
- ' name="code.swf" align="middle" allowScriptAccess="sameDomain" FlashVars="code=' + rand + '" '+
- 'type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer">'+
- '</object><input type="hidden" name="ccode" value="'+rand+'">');
- </script>
- <noscript><h2>JavaScriptを有効にしてください</h2></noscript><br /><p><input type="submit" value="送 信"></p>
- </fieldset></form>
- <h3>* 画像が見えにくい場合は、<a href="./">読み込みなおして</a>ください</h3>
- <h3>* 送信後、確認画面を表示します</h3>
1行目で、書き込み用のCGIまでのパスを指定
Code: download
- cginame = "ccode.cgi?code=";
- inval = _root.code;
- lv = new LoadVars();
- lv.onLoad = function() {
- tfCount.text = this.secure_num;
- };
- lv.load(cginame + inval);
今回表示する文字列は、数字に限定しました(0〜9)
Code: download
- use CGI qw(:standard);
- $code_file = 'code.txt';
- $limit = 7200;
- $incode = (param('code') =~ /\d+/) ? param('code') : die;
- $rand_code = sprintf("%d%d%d%d%d", int(rand(10)),int(rand(10)),int(rand(10)),int(rand(10)),int(rand(10)));
- $time = time;
- open(CODE, "+< $code_file") or open(CODE, ">$code_file");
- flock(CODE,2);
- while(<CODE>) {
- $date = (split("\t",$_))[2];
- chomp($date);
- next if (($time-$date)>$limit);
- push @out, $_;
- }
- push @out, "$incode\t$rand_code\t$time\n";
- seek(CODE, 0, 0);
- print CODE @out;
- truncate(CODE, tell(CODE));
- close CODE;
- print "Content-type: text/plain\n\nsecure_num=$rand_code";
3行目は、データ保存ファイル名を指定
Code: download
- use CGI qw(:standard);
- $code_file = 'code.txt';
- $limit = 7200;
- $re_date = time;
- $que = param('que');
- $in{code} = param('code');
- $in{ccode} = param('ccode');
- $in{name} = param('name');
- $secur = sprintf("%d%d%d%d%d", int(rand(10)),int(rand(10)),int(rand(10)),int(rand(10)),int(rand(10)));
- open(FH, "+< $code_file") or die "Can't open $code_file: $!";
- flock(FH,2);
- while(<FH>) {
- chomp;
- my($ccode,$code,$date,$dmy) = split("\t");
- if(($ccode eq $in{ccode}) && ($code eq $in{code}) && (($re_date-$date)<$limit)) {
- push @out, qq($ccode\t$code\t$re_date\t$secur\n);
- $flag = 1;
- $ok_code = $code;
- $save_rand = $ccode;
- $save_time = $date;
- $now = $re_date;
- }
- elsif(($re_date-$date)>$limit) {
- next;
- }
- else {
- $flag = 2 if ($ccode eq $in{ccode});
- push @out, "$_\n";
- }
- }
- seek(FH,0,0);
- print FH @out;
- truncate(FH, tell(FH));
- close(FH);
- if($flag == 1) {
- $sec_code = qq(セキュリティーコードが一致しました) }
- elsif($flag == 2) {
- $sec_code = qq(セキュリティーコードが一致しません) }
- else {
- $sec_code = qq(セキュリティコードの有効期限が過ぎているか無効です) }
- print <<HTML;
- Content-type: text/html\n\n
- <html><head>
- <title>test - check</title></head><body>
- <h1>セキュリティコード認証のテスト - 確認</h1>
- <br />
- <h2>$sec_code</h2>
- <table width="400" border="1" cellspacing="0" cellpadding="3">
- <tr><td>ユーザ名</td><td>$in{name}</td></tr>
- <tr><td class="col">保存されているセキュリティーコード</td><td class="col">$in{code}</td></tr>
- <tr><td>表示されたセキュリティコード</td><td>$ok_code</td></tr>
- <tr><td class="col">保存されている乱数</td><td class="col">$save_rand</td></tr>
- <tr><td>JavaScriptで生成された乱数</td><td>$in{ccode}</td></tr>
- <tr><td class="col">保存されていた日付</td><td class="col">$save_time</td></tr>
- <tr><td>現在の日付(書き換えた日付)</td><td>$now</td></tr>
- </table>
- <br />
- <h3>* 通常はここで確認ボタンを表示してメール送信画面に進みますが省略</h3>
- <br />
- <p><a href="javascript:window.close()">閉じる</a></p>
- </body></html>
- HTML
前回のサイト探索からの続きで
Google Sitemaps用のXMLファイルを出力するスクリプトを作ってみた(コマンド編)
強調されている行番号は前回(サイト探索)からの変更点
Code: download
- use LWP::Simple qw(get head);
- use HTML::LinkExtor;
- use strict;
- my(%seen,%mod_time,%out,$site,$top_url,$freq,$priority);
- $freq = 'weekly';
- $priority = '1.0';
- $top_url = 'http://sieg.xeong.com/';
- $top_url = "http://$top_url" unless $top_url =~ /^https?\b/;
- ($site = $top_url) =~ s/^(http:\/\/.+\/).*$/$1/;
- $site .= "/" unless ($site =~ /\/$/);
- &print_xml_head;
- linker($top_url);
- &print_xml_foot;
- sub linker {
- my $base_url = shift;
- my $parser = HTML::LinkExtor->new(undef, $base_url);
- $parser->parse(get($base_url))->eof;
- my @links = $parser->links;
- for my $linkarray (@links) {
- my @element = @$linkarray;
- my $elt_type = shift @element;
- while(@element) {
- my ($attr_name, $attr_value) = splice(@element, 0,2);
- if( $attr_name eq "href" && $attr_value->scheme =~ /\b(https?)\b/ && $attr_value =~ /^$site/
- && ($attr_value =~ /\.xml?$/i or $attr_value =~ /\.s?html?$/i or $attr_value =~ /\.php.*$/i or $attr_value =~ /\.cgi.*$/i)
- ){
- $attr_value =~ s/^(.+)#.*$/$1/;
- next if(defined $seen{$attr_value});
- my @heads = LWP::Simple::head($attr_value);
- if(@heads) {
- $seen{$attr_value}++;
- my @date = $heads[2] ? gmtime($heads[2]) : gmtime(time);
- $mod_time{$attr_value} = sprintf("%04d-%02d-%02dT%02d:%02d:%02dZ", $date[5]+1900, $date[4]+1, @date[3,2,1,0]);
- }
- }
- }
- }
- for (sort keys %seen) {
- my $mod = $mod_time{$_};
- s/^(.+\.cgi).*$/$1/i;
- s/^(.+\.php).*$/$1/i;
- if(defined $out{$_}) {
- next;
- } else {
- $out{$_} = 'true';
- print_xml($_,$mod);
- linker($_);
- }
- }
- }
- sub print_xml_head {
- my %in_url = @_;
- my @date = gmtime(time);
- my $mod_time = sprintf("%04d-%02d-%02dT%02d:%02d:%02dZ", $date[5]+1900, $date[4]+1, @date[3,2,1,0]);
- print <<XML;
- <?xml version="1.0" encoding="UTF-8"?>
- <urlset xmlns="http://www.google.com/schemas/sitemap/0.84"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.google.com/schemas/sitemap/0.84
- http://www.google.com/schemas/sitemap/0.84/sitemap.xsd">\n
- <url>
- <loc>$top_url</loc>
- <lastmod>$mod_time</lastmod>
- <changefreq>$freq</changefreq>
- <priority>$priority</priority>
- </url>\n
- XML
- }
- sub print_xml {
- print qq(<url>\n<loc>$_[0]</loc>\n<lastmod>$_[1]</lastmod>\n</url>\n);
- }
- sub print_xml_foot {
- print qq(\n</urlset>\n);
- }
使い方
6行目で、内容の更新頻度("always", "hourly", "daily", "weekly", "monthly", "yearly", "never")を指定
7行目で、同じサイト内の他のページと比較した優先度(0.0〜1.0)
8行目で探索するURLを指定
Windowsではコマンドラインから、これを実行するとGooglSitemaps用のXMLを表示する
WindowsコマンドプロンプトでのXMLファイル(sitemap.xml)への出力例
perl -w xmlgen.pl > sitemap.xml
Google Sitemaps ジェネレーターを作るにあたり、ネットワークから
サイト内のリンクをたどり、同一サイト内のURLを抽出するスクリプトを作ってみた
Code: download
- use LWP::Simple qw(get head);
- use HTML::LinkExtor;
- use strict;
- my(%seen,%mod_time,%out,$site,$top_url);
- $top_url = 'http://sieg.xeong.com/';
- $top_url = "http://$top_url" unless $top_url =~ /^https?\b/;
- ($site = $top_url) =~ s/^(http:\/\/.+\/).*$/$1/;
- $site .= "/" unless ($site =~ /\/$/);
- linker($top_url);
- sub linker {
- my $base_url = shift;
- my $parser = HTML::LinkExtor->new(undef, $base_url);
- $parser->parse(get($base_url))->eof;
- my @links = $parser->links;
- for my $linkarray (@links) {
- my @element = @$linkarray;
- my $elt_type = shift @element;
- while(@element) {
- my ($attr_name, $attr_value) = splice(@element, 0,2);
- if( $attr_name eq "href" && $attr_value->scheme =~ /\b(https?)\b/ && $attr_value =~ /^$site/){
- # && ($attr_value =~ /\.xml?$/i or $attr_value =~ /\.s?html?$/i or $attr_value =~ /\.php.*$/i or $attr_value =~ /\.cgi.*$/i)){
- $attr_value =~ s/^(.+)#.*$/$1/;
- next if(defined $seen{$attr_value});
- my @heads = LWP::Simple::head($attr_value);
- if(@heads) {
- $seen{$attr_value}++;
- my @date = $heads[2] ? gmtime($heads[2]) : gmtime(time);
- $mod_time{$attr_value} = sprintf("%04d-%02d-%02dT%02d:%02d:%02dZ", $date[5]+1900, $date[4]+1, @date[3,2,1,0]);
- }
- }
- }
- }
- for (sort keys %seen) {
- my $mod = $mod_time{$_};
- # s/^(.+\.cgi).*$/$1/i;
- # s/^(.+\.php).*$/$1/i;
- if(defined $out{$_}) {
- next;
- } else {
- $out{$_} = 'true';
- print qq($_ - $mod\n);
- linker($_);
- }
- }
- }
使い方
6行目で探索するURLを指定
Windowsではコマンドラインから、これを実行するとリンクリストとUTC時間を表示する
Windowsコマンドプロンプトでのテキストファイル(link.txt)への出力例
perl -w linkgen.pl > link.txt