2007/02/13

[技術系]   mod_perlではファイルテスト演算子は不用意に使えない

at 21:48JST
http://memo.hirosiki.jp/article/33577109.html

「mod_perlで動いてる」なんて書いてたが、まっとうに動いてなかったよ岬くん。

if ( ( -r $rdffile ) && ( ( ( -M $rdffile )  * 24 * 60 ) < 15 ) ) { 
RedirectTo( $rdffile );
}


-M演算子は、指定したファイルがperlプロセスが起動した時点から見てどのくらい前に修正されたかを返すので、mod_perlで使うとほぼ無意味な動作をする。

したがって、ここは(スクリプトがキレイでスマートかどうかはぼくが書くものなのでともかくとして)
my( $m ) = ( stat( $rdffile ) )[9]; 
$m = time() - $m;
if ( ( -r $rdffile ) && ( ( $m / 60 ) < 15 ) ) {
RedirectTo( $rdffile );
}

としなくてはならない。

やっぱどんなくだらないスクリプトでも、ちゃんと精査しないとダメだわー…いや、それはぼくのレベルが低いから。

[技術系]   Subversion/TortoiseSVNでの実行パーミッションの保持

at 20:26JST
そんなに本格的に使ってるわけじゃないから、あれっ?てときがけっこうあるんだよな。SVN。

WindowsのTortoiseSVNでバージョン管理しているCGIスクリプトなどをUNIX側でチェックアウトしたとき、きちんと実行属性(パーミッション)がつくようにする、と。

たぶん、.plとか.cgiとかの拡張子はデフォルトで設定されているんだと思うけど、個人的にmod_perl用のCGIを.mcgiで管理しているので
「うぎゃー、どうやんだっけ」
と迷った。

・今後新規に作成するファイルに自動で実行属性をつけるには

適当なフォルダのコンテキストメニューから
「TortoiseSVN」→「Settings」
20070213svnmage2.png

「Subversion configuration file」の「Edit」をクリック。
20070213svnmage3.png

Subversionと書式は同じだが、
[auto-props] 
*.cgi = svn:executable
*.mcgi = svn:executable
*.pl = svn:executable
*.sh = svn:executable

とかしておく。

・もう作ったファイルに実行属性をつけたいんじゃぁ!というとき

そのファイルのコンテキストメニューから
「TortoiseSVN」→「Properties」
またはファイルプロパティの「Subversion」。
20070213svnmage4.png

「Add」。
20070213svnmage5.png

「Property name」に「svn:executable」を指定して「OK」。
20070213svnmage6.png


該当ファイルをコミットすると実行属性が反映される。

今後はUNIX側でチェックアウトしても、自動的にxパーミッションがつく。

SVNって、World Writableにする属性とかないのかねえ。
http://subversion.bluegate.org/doc/book.html#svn.advanced.props
ないわなあ…。

そうだ、思い出した。Vista RC2でTortoiseSVN入れたら、なんかローカルワーキングコピーの互換性がXPと取れなくなったんだった。なんでだろ。だから移行できないんだよな。忘れないようにしないと。

そしてUNIX側でのSubversionの設定ファイルがどこにあるのか忘れたので、
% strings `which svn` | grep config
とかやって必死で探し回ったが見つからず。svnって、ユーザーごとの
~/.subversion/config
しかないんだっけ? …もういい。どうせコマンドラインからはupdateしかしないから。

[雑記]   ちきゅうはねらわれている

at 19:29JST
どうも最近、フジ・サンケイグループに目を付けられているらしい。

fujimic.com(フジ系のSI)
fujisankei-g.co.jp(グループのサイト。こんなのあったんだ)

の社内向けサイトから飛んでくる人がいる。

…まあ、フジテレビのほうだったらそんなに怖い人いないかな。産経新聞から来るようになったら火の元に気をつけないとね。

[木鐸]   大阪市パリ事務所

at 18:01JST
(cache) NHKニュース
http://megalodon.jp/?url=http://www3.nhk.or.jp/news/2007/02/13/d20070213000102.html&date=20070213175656
大阪市によりますと、日本時間の12日午後6時ごろ、パリ市内のビルにある「大阪市パリ事務所」にフランスのホームレスの支援団体のメンバーや現地の日本人およそ20人が押しかけ、職員の制止を振り切って事務所の中に入りました。そして、窓から「大阪の野宿者と連帯を」と書かれた横断幕を掲げたあと、事務所に居座りました


…ホームレスを追い出すことの是非はともかく、なぜ大阪市がパリに事務所をもっているのかがわからん。大阪とパリというと、豆腐と納豆くらいかけはなれた存在に思えるのだが。あれか? パリに大阪弁を普及させるとか、パリのバーゲンに行くおばちゃんの憩いの場所とか、そういう役割なんだろうか。

CITY OF OSAKA, PARIS OFFICE
http://www.osaka.fr/

パリ事務所を出すお金でホームレス支援をしたほうがいいと思う。

[雑記]   こぶたまん

at 17:34JST
サークルKサンクスにいって、こぶたをひきとってきた。

20070213mage004.jpg


サークルKサンクス 中華まん
http://www.circleksunkus.jp/special/chukaman/chukaman.html

二匹いたよ。もう食べちゃったけど。

20070213mage002.jpg


ちゃんとしっぽもある。

20070213mage003.jpg


味は…まぁふつうでした。生地の甘みがふつうより強いかも。ぼくはそのほうが好き。

[雑記]   ブラジャー検定

at 17:29JST
2月12日はウイングのブラの日
期間限定ブラジャー検定試験開催中!
http://www.wacoal.co.jp/products/wing/bra_days/bradays.html

ちっ。6問しか正解できなかった。

20070213mage1.png


まだまだ精進が必要だな…。

[雑記]   「エイリアス」地上波でやるぞ〜

at 13:12JST
テレ東のお昼、いま「CSI」を流してる枠で来週から
「エイリアス」
をやるって!



やったー! これ、NHK BSでしか放送してなかったからほとんど視てなかったんだよね。

でも、第一シーズンの第一回を視たときは本当にドギモを抜かれた。月並みな表現だが、とてもテレビドラマとは思えない。あと、すごい痛そう…>_<; これで全部視て全部録画できる。

来週まで生きてる理由ができた。

[技術系]   comment2rss

at 12:34JST
Seesaaのコメント通知機能がどこかで詰まってたので、どうせなら…と思って
「コメント管理画面を参照してRSSを吐く」
スクリプトを書いた。

+index.cgi =このスクリプト

+data/ =処理用ディレクトリ(0777)
  |
  +index.rdf=キャッシュ。ここにリダイレクトされる

というふうに。

キャッシュとかあとで考えたのでひたすら汚いけど。mod_perlで順調に動いているようだし、もうちょっとようすみたら一般公開しよう。

#!/usr/bin/perl 

# comment2rss.cgi

use strict;
use WWW::Mechanize;
# I need Crypt:SSLeay.

# install Crypt::SSLeay on Win32(ActivePerl):
# > ppm install http://theoryx5.uwinnipeg.ca/ppms/Crypt-SSLeay.ppd
# or on Fedora:
# % sudo yum install openssl-devel

my $site = 'サイトFQDN';
my $mailaddr = 'メールアドレス(アカウント名)';
my $password = 'パスワード';
my $blogid = 'blogのID';

my $URL_INIT = 'http://blog.seesaa.jp/pages/my/home/index';
my $DATA_DIR = 'data';
my $LOCK_DIR = "$DATA_DIR/lock";

my $rdffile = "$DATA_DIR/index.rdf";
umask 0;
$|=1;

die if ( ( ! -d $DATA_DIR ) || ( ! -w $DATA_DIR ) );

if ( ( -r $rdffile ) && ( ( ( -M $rdffile ) * 24 * 60 ) < 15 ) ) {
RedirectTo( $rdffile );
}

mkdir( $LOCK_DIR, 0777 )
or RedirectTo( $rdffile );

my $table;
if (
! (
$table = GetCommentTable(
$URL_INIT,
$site, $mailaddr, $password, $blogid,
)
)
) {
rmdir $LOCK_DIR;
RedirectTo( $rdffile );
}
my @entries = ParseComments( $table );
my $rss = CommentsToRSS( $site, @entries );

print <<"_EOF_RSS";
Content-Type: application/xml

$rss
_EOF_RSS

my $tmpfile = "$DATA_DIR/tmp.$$";
if ( !open( W, ">$tmpfile" ) ) {
rmdir $LOCK_DIR;
RedirectTo( $rdffile );
}
print W $rss;
close( W );

rename( $tmpfile, $rdffile );
rmdir $LOCK_DIR;
exit;

sub RedirectTo {
my( $file ) = @_;
my $basepath =
'http://'
. $ENV{'HTTP_HOST'}
. ( ( $ENV{'SERVER_PORT'} != '80' ) ? ":$ENV{'SERVER_PORT'}" : '' )
. $ENV{'SCRIPT_NAME'}
;
$basepath =~ s#[^/]+$##;
print "Location: $basepath$file\n\n";
exit;
}

# コメントテーブル取得
sub GetCommentTable {
my( $URL_INIT, $site, $mailaddr, $password, $blogid ) = @_;

my $mech = WWW::Mechanize->new( autocheck => 1 );
$mech->agent_alias( 'Windows IE 6' );

# 初期画面
$mech->get( $URL_INIT )
or return undef;

# ログイン
$mech->submit_form(
fields =>
{
'member__email' => $mailaddr,
'member__password' => $password,
}
) or return undef;
while (
$mech->response()->header('refresh') =~ /url=([^\s;]+)/i
) {
$mech->get( $1 )
or return undef;
}

# 「コメント一覧」
$mech->follow_link(
url =>
"/pages/my/blog/home/?blog_id=$blogid" .
"&goto=/pages/my/blog/comment/edit/list"
) or return undef;

my $table = $mech->content();
$table =~
s#^.*<table[^>]+class="list-table">(.*)</form>.*$#$1#s;
return $table;
}

# コメント取得
sub ParseComments {
my( $table ) = @_;

my @t = localtime();
my $year = $t[5]+1900;
my $month = $t[4]+1;

my @entries;
foreach my $i ( $table =~ m#<tr>.*?</tr>#sg ) {
my( $id, $name, $date, $comment, $url, $art ) =
( $i =~ m|
<td[^>]+>.*?value="(.*?)"></td>
#id
\s+
<td[^>]+><a\s+href[^>]+>(.*?)</a></td>
#name
\s+
<td[^>]+>.*?</td>
\s+
<td[^>]+>.*?</td>
\s+
<td[^>]+>(.*?)</td>
#date
\s+
<td[^>]+>(.*?)</td>
#comment
\s+
<td[^>]+>.*?</td>
\s+
<td[^>]+>
<a\shref="(.*?)"
#url
.*?title="(.*?)"
#art
.*?</td>
|sx );
next if ( $id < 1 );

$name =~ s/<.*?>//;
my( $mm, $dd, $tt ) =
( $date =~ m#(..)/(..)\s+(.*)# );
my $thisYear = $year;
$thisYear-- if ( $mm>$month );
$date = "${thisYear}-${mm}-${dd}T${tt}:00+09:00";

push( @entries,
{
entry => "$url?$id#comment",
url => "$url#comment",
date => $date,
title => "$name on $art",
description => $comment,
}
);
}
return @entries;
}

sub CommentsToRSS {
my( $site, @entries ) = @_;

my $rss = <<"_EOF";
<?xml version="1.0" encoding="Shift_JIS"?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns="http://purl.org/rss/1.0/"
>
<channel
rdf:about="http://$site/"
>
<title>$site</title>
<link>http://$site/</link>
<description>Comments on $site</description>
<dc:language>ja</dc:language>
<items>
<rdf:Seq>
@{[ do {
my $t;
foreach my $h ( @entries ) {
$t .= <<"_EOF_toc";
<rdf:li rdf:resource="$h->{entry}"/>
_EOF_toc
}
$t;
} ]}
</rdf:Seq>
</items>
</channel>
@{[ do {
my $t;
foreach my $h ( @entries ) {
$t .= <<"_EOF_entries";
<item
rdf:about="$h->{entry}"
>
<link>$h->{url}</link>
<title>$h->{title}</title>
<description>$h->{description}</description>
<dc:date>$h->{date}</dc:date>
</item>
_EOF_entries
}
$t;
} ]}
</rdf:RDF>
_EOF
return $rss;
}

さらに過去の記事
2009/04 (1)   2008/12 (3)   2008/11 (9)   2008/10 (10)   2008/09 (20)   2008/08 (2)   2008/07 (23)   2008/06 (16)   2008/05 (22)   2008/04 (11)   2008/03 (21)   2008/02 (20)   2008/01 (21)   2007/12 (32)   2007/11 (37)   2007/10 (46)   2007/09 (63)   2007/08 (33)   2007/07 (41)   2007/06 (81)   2007/05 (173)   2007/04 (168)   2007/03 (113)   2007/02 (123)   2007/01 (92)   2006/12 (111)   2006/11 (185)   2006/10 (20)  

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。