Hatena::Grouparaistudy

czk-htnの日記

2009-09-27

[] WindowsXP に adiary をインストールする その3(5.10 + mod_perl2編) 10:00

HTML5な日本製CMS/ブログ/Markdown/はてな記法/TeX/超高速 - adiary official website

adiaryをActivePerl 5.10とmod_perl2で動かした。ついでにURLに"adiary"が見えないようにmod_rewriteの設定も行った。

環境

ActivePerl + mod_perl

参考:

C:\> ppm-shell
ppm> search mod_perl
ppm> install 1
ppm> exit

(ここでWindows再起動しないとApachemod_perl.soを読み込んでくれない)

adiary

  • adiary-2.09.tar.gz を解凍する
  • adiary-2.09 ディレクリを C:\Program Files の下へ
  • adiary.conf.cgi を(サンプルをコピーして)作成する

adiary Satsuki/Base.pmの修正

  • mod_perl2環境でのエラーを回避するためlib/Satsuki/Base.pm を修正する
# 1059行目に行を追加する
+ if (substr($file, 1, 2) eq ':/') { return $file; }

adiary の .htaccess

RewriteEngine  On
# /blog/ 以下へのリクエスト時のみ書き換えを行う
RewriteBase    /blog/
# リクエストされたファイルが存在しない場合のみRuleを適用する
RewriteCond    %{REQUEST_FILENAME}  !-f
# リクエストされたパスをadiary.cgiにパラメータとして渡す
RewriteRule    ^(.*)$               adiary.cgi/$1  [L]

apache

- #LoadModule rewrite_module modules/mod_rewrite.so
+ LoadModule rewrite_module modules/mod_rewrite.so
LoadModule perl_module modules/mod_perl.so

# LoadFileは5.8の時のみ必要(5.10の時は不要)
#LoadFile "C:/Perl/bin/perl58.dll" # for 5.8.x
#LoadFile "C:/Perl/bin/perl510.dll" # for 5.10.x

<IfModule mod_perl.c>
  #AddHandler perl-script .cgi

  # mod_perlをApache::Registryで動かす(Apache::PerlRunで動かすることも出来る)
  PerlHandler ModPerl::Registry
  #PerlHandler ModPerl::PerlRun

  # HTTP応答ヘッダの先頭に"status 200 OK"を自動的に追加する
  PerlSendHeader On

  # @INCディレクトリ内にあるファイルの変更を自動的に判断する
  #PerlInitHandler Apache::Reload

  # httpdを再起動した時に前の状態を捨てる (mod_perl1 only)
  #PerlFreshRestart On

  #パスは8.3形式でないと認識しない
  #PerlSwitches -I"C:/Program Files/adiary-2.09/lib"
  PerlSwitches -IC:/PROGRA~1/adiary-2.09/lib
</IfModule>

# URLから adiary を隠す
Alias /blog "C:/Program Files/adiary-2.09"
<Directory "C:/Program Files/adiary-2.09">
  <Files *.cgi>
    # ハンドラの関連付け
    SetHandler perl-script
    #AddHandler cgi-script .cgi
    
    # CGIで実行する
    Options +ExecCGI
  </Files>
  Order allow,deny
  Allow from all
  AllowOverride All
</Directory>

動作確認

トラックバック - http://araistudy.g.hatena.ne.jp/czk-htn/20090927

2009-09-26

[] WindowsXP に adiary をインストールする その2(CGI編) 10:00

adiaryがmod_perl2で動かなかったのでCGIで動かしてみた。

(追記:2009-09-27)上記は誤り。mod_perl2で動作確認できた。詳しくはその3参照。

apache

Alias /adiary "C:/Program Files/adiary-2.09"
<Directory "C:/Program Files/adiary-2.09">
  <Files *.cgi>
    # ハンドラの関連付け
    AddHandler cgi-script .cgi
    
    # CGIで実行する
    Options +ExecCGI
  </Files>
  Order allow,deny
  Allow from all
</Directory>

adiary

  • adiary.cgi の1行目(Perlのパス)を修正する
#!/usr/bin/perl

#!C:/Perl/bin/perl
トラックバック - http://araistudy.g.hatena.ne.jp/czk-htn/20090926

2009-09-23

[] WindowsXP に adiary をインストールする その1(mod_perl編) 10:00

HTML5な日本製CMS/ブログ/Markdown/はてな記法/TeX/超高速 - adiary official website

環境

  • Windows XP Home Edition SP3
  • ActivePerl 5.10.1 Build 1006 ppmmod_perlが5.10非対応?
    • (追記:2009-09-27)上記は誤り。5.10で動作確認できた。詳しくはその3参照。
  • ActivePerl 5.8.9 Build 826
  • Apache 2.2.13
  • mod_perl 2.0.4
  • adiary 2.0.9

ActivePerl + mod_perl

参考:

C:\> ppm-shell
ppm> search mod_perl
ppm> install 1
ppm> exit

(ここでWindows再起動しないとApachemod_perl.soを読み込んでくれない)

adiary

  • adiary-2.09.tar.gz を解凍する
  • adiary-2.09 ディレクリを C:\Program Files の下へ
  • adiary.conf.cgi を(サンプルをコピーして)作成する

apache

LoadModule perl_module modules/mod_perl.so
LoadFile "C:/Perl/bin/perl58.dll"

<IfModule mod_perl.c>
  AddHandler perl-script .cgi

  # mod_perlをApache::Registryで動かす(Apache::PerlRunで動かすことも出来る)
  PerlHandler ModPerl::Registry

  # HTTP応答ヘッダの先頭に"status 200 OK"を自動的に追加する
  PerlSendHeader On

  # @INCディレクトリ内にあるファイルの変更を自動的に判断する
  #PerlInitHandler Apache::Reload

  # httpdを再起動した時に前の状態を捨てる (mod_perl1 only)
  #PerlFreshRestart On

  #パスは8.3形式でないと認識しない
  #PerlSwitches -I"C:/Program Files/adiary-2.09/lib"
  PerlSwitches -IC:/PROGRA~1/adiary-2.09/lib
</IfModule>

Alias /adiary "C:/Program Files/adiary-2.09"
<Directory "C:/Program Files/adiary-2.09">
  <Files *.cgi>
    # ハンドラの関連付け
    SetHandler perl-script
    #AddHandler cgi-script .cgi

    # CGIで実行する
    Options +ExecCGI
  </Files>
  Order allow,deny
  Allow from all
</Directory>

動作確認

  • http://localhost/adiary/adiary.cgi?loginアクセス
  • 以下のエラーが出力される
  • どうも lib/Satsuki/Base.pm の get_filepath がおかしなパスを返してくるのが原因っぽいが詳細まで追っていない(追記:get_filepathを修正したらmod_perlでも動いた)
Perl interpreter error (exit)

File can't read 'C:/Program Files/adiary-2.09/__cache/adiary.conf.cgi.cache' (in Base.pm line 1095 (in Base.pm line 1075 (in Base.pm line 522 (in Base.pm line 427 (in Base.pm line 678 (in Base.pm line 100 (in (eval 10) line 30)))))))
File can't read 'C:/Program Files/adiary-2.09/adiary.conf.cgi' (in Base.pm line 1095 (in Base.pm line 1075 (in Base.pm line 457 (in Base.pm line 678 (in Base.pm line 100 (in (eval 10) line 30))))))
File can't write 'C:/Program Files/adiary-2.09/__cache/adiary.conf.cgi.cache' (in Base_auto.pm line 244 (in Base_auto.pm line 40 (in Base.pm line 463 (in Base.pm line 678 (in Base.pm line 100 (in (eval 10) line 30))))))

対応

mod_perlでなくCGIなら動く。

(追記:2009-09-26)対応

  • lib/Satsuki/Base.pm を修正する
# 1059行目に行を追加する
+ if (substr($file, 1, 2) eq ':/') { return $file; }
トラックバック - http://araistudy.g.hatena.ne.jp/czk-htn/20090923

2009-06-06

[] 局所変数をサブルーチンに渡して書き換える 06:45

まずはコードを。1から10までの数字のうち3の倍数を合計して出力している。

以下はサンプルであって、コードでやっていることそのものに意味はないし、もっとわかりやすい書き方がある。問題はサブルーチン部分の書き方。

use strict;
use warnings;

{
  my $sum = 0;
  my $params = { sum => \$sum };
  foreach my $num ( 1..10 ) {
    unless ($num % 3) {
      p( { %$params, num => $num } );
    }
  }
  p( $params );
}

sub p {
  my $params = shift;
  ${$params->{sum}} += $params->{num} if defined $params->{num};
  printf "%d\n", ${$params->{sum}};
}

$sum と $num という2つの局所変数を渡し、$sumはサブルーチン内で書き換えたいとした時、スカラーリファレンスを渡すため呼び出し側は上記のようなコードになると思う。対してサブルーチン側では、扱う値がリファレンスで渡されたのか値のコピーで渡されたかを意識してあげないといけない。これって不便じゃね?

サブルーチンの引数をハッシュに入れなければ、

sub p {
  my $sum_r = ref $_[0] ? $_[0] : \$_[0];
  my $num_r = ref $_[1] ? $_[1] : \$_[1];
  $$sum_r += $$num_r if $$num_r;
  printf "%d\n", $$sum_r;
}

こんな書き方もできるけど、引数は名前つきで渡したい。


さて、どうする?(引数を全部リファレンスにしてハッシュに格納でもするか?)

トラックバック - http://araistudy.g.hatena.ne.jp/czk-htn/20090606

2009-05-11

[] 100以下の素数 06:45

#!/usr/bin/env perl

use strict;
use warnings;

my(@arr) = (1 .. 100);
while (my $p = shift @arr) {
  next if $p == 1;
  printf "%d\n", $p;
  @arr = grep { $_ % $p } @arr;
}
トラックバック - http://araistudy.g.hatena.ne.jp/czk-htn/20090511