XREAでkakasiを使う

Perl版Chasen/KAKASIの利用法

kakasi.cgi

#!/usr/local/bin/perl

use Text::Kakasi;
Text::Kakasi::getopt_argv('kakasi', '-kK', '-HK', '-JK');
@kata = ();

# PageReadingファイルパス指定
$fname = '/virtual/ACCOUNT ID/public_html/pukiwiki/cache/PageReading';

open(IN, $fname);
while (<IN>) {
	push(@kata, Text::Kakasi::do_kakasi($_));
}
close(IN);
Text::Kakasi::close_kanwadict();

open(OUT, "> $fname");
foreach $i (@kata) {
	print OUT "$i";
}
close(OUT);

print "Content-Type: text/html\n\n";

exit;

pukiwiki.ini.php

$pagereading_kakasi_path = '/cgi-bin/kakasi.cgid'; // URLを相対パスで

file.phpの604行目case 'kakashi'からcase 'none'までの間を次のように変更。

case 'kakashi':
	$tmpfname = CACHE_DIR . 'PageReading'; // PageReadingに固定
	$fp = fopen($tmpfname, "w") or
		die_message("Cannot write temporary file '$tmpfname'.\n");
	foreach ($readings as $page => $reading) {
		if($reading == '') {
			fputs($fp, mb_convert_encoding("$page\n", $pagereading_kanji2kana_encoding, SOURCE_ENCODING));
		}
	}
	fclose($fp);
	chmod($tmpfname, 0666);

	virtual($pagereading_kakasi_path);
	$fp = fopen($tmpfname, "r");
	foreach ($readings as $page => $reading) {
		if($reading == '') {
			$line = fgets($fp);
			$line = mb_convert_encoding($line, SOURCE_ENCODING, $pagereading_kanji2kana_encoding);
			$line = chop($line);
			$readings[$page] = $line;
		}
	}
	fclose($fp);

	unlink($tmpfname) or die_message("Temporary file can not be removed: $tmpfname");
	break;

case 'none':
  • XREAでChasenが使えるらしいのですが、うちで試してみてもNotFoundになります。どなたか使えているという方はいませんか? -- 2004-10-03 (日) 18:58:43
    • XREAでは、perlのモジュールで呼び出さないと行けないので一工夫が必要のようです。(やろうやろうと思っていてできてないことの一つですが) -- merlin 2004-10-05 (火) 19:52:45
  • PukiWiki/Namazuに書いてあるようなことはできませんか? -- 2004-10-28 (木) 17:03:57
  • http://sb.xrea.com/showthread.php?t=8557を見ると、/usr/local/php/bin/chasenか/usr/local/php/bin/kakasiでchasenとkakasiが使えるみたい。 -- 2005-02-04 (金) 00:31:22
    • どうも無理みたい。cgiからでないと読みが正しく出てこない・・・ -- 2005-04-23 (土) 23:07:27

質問箱から移動したもの

[XREA] Perl版Chasen/KAKASIの利用法

質問

表題の通り、私がPukiwikiを使ってるXREAではPerlでChasen/KAKASIが提供されているようです。
そこで、こいつを使いたいのですが単純にpukiwiki.ini.phpで利用するように設定してもNot Foundになってしまいます。
Perl版を使うには何か別の設定が必要なのでしょうか?

回答

  • Perlスクリプトが必要かと。次のようなスクリプトがシェルで動くのでしょうか?試してみてください。ニホンゴノブンショウ と出ればいいのですが。 -- さばぞう 2004-10-05 (火) 20:50:32
    use Text::Kakasi;
    
    Text::Kakasi::getopt_argv('kakasi', '-kK', '-HK', '-JK');
    print Text::Kakasi::do_kakasi('日本語の文章');
    Text::Kakasi::close_kanwadict();
  • 実行方法も書いたほうがよかったですね。上記を例えばkatest.plというファイル名で保存して、XREAへアップし、シェル上でperl katest.pl。 -- さばぞう 2004-10-05 (火) 21:46:21
  • 残念ながらシェル上でのperlの実行が制限されているようです(cdすらも・・・) -- Lick 2004-10-06 (水) 16:09:02
  • では名前をkatest.cgiとし、ファイル先頭に#!/usr/local/bin/perl(XREAのPerlのパスに合わせる)を追加し、実行属性にするとどうなるでしょう。 -- さばぞう 2004-10-06 (水) 21:21:26
  • その通りやってみると、きちんと「ニホンゴノブンショウ」と表示されました。 -- Lick 2004-10-06 (水) 22:45:02
  • おぉ。では次のようにすれば動くのかな。 -- さばぞう 2004-10-07 (木) 00:52:58

    kakasi.cgi

    #!/usr/local/bin/perl
    
    use Text::Kakasi;
    
    Text::Kakasi::getopt_argv('kakasi', '-kK', '-HK', '-JK');
    while (<>) {
    	print Text::Kakasi::do_kakasi($_);
    }
    Text::Kakasi::close_kanwadict();

    pukiwiki.ini.php

    $pagereading_enable = 1;
    $pagereading_kanji2kana_converter = 'kakasi';
    $pagereading_kakasi_path = 'kakasi.cgi';  // 絶対パスがいいかも

    lib/file.php 402行あたり

    $kakasi = "$pagereading_kakasi_path < $tmpfname";
  • 動い・・・たようなんですが、肝心の漢字が全て「記号」として扱われてます。 -- Lick 2004-10-07 (木) 01:19:12
    • それは 単にエラーになっておらず、ブランクが帰って来ているだけです。-- merlin 2004-10-07 (木) 16:20:03
  • それでは 動きません。XREAのPHPは、SAFE MODEですので、popenが使えないんです。 -- merlin 2004-10-07 (木) 07:46:08
    safe_mode                  On
    safe_mode_exec_dir      /usr/local/php/bin
    safe_mode_gid             Off
    http://jp.php.net/manual/ja/features.safe-mode.functions.php
    • virtual で perl script 動かして POST/GET でやり取りするしか無いのかな? -- merlin 2004-10-07 (木) 08:00:37
  • CGI版でインストールすると言う手を使うのがいいのかな? -- merlin 2004-10-07 (木) 16:20:03
  • むぅ残念。結構な改造が必要そうですね。 -- さばぞう 2004-10-08 (金) 08:44:45
  • やはり簡単にはいきませんですか。 -- Lick 2004-10-08 (金) 10:42:52
  • cgi としてInstall すれば safe mode でないので使えますね -- merlin 2004-10-08 (金) 11:03:02
  • 一応、virtual版も作ってみました。ローカルマシンのWindows環境でしか試していませんが、なんとか動いているようです。ファイルの受け渡しがわからなかったので、キャッシュディレクトリにPageReadingというテンポラリファイルを作るようにしてます。 (^^; -- さばぞう 2004-10-11 (月) 00:51:49

    kakasi.cgi

    #!/usr/local/bin/perl
    
    use Text::Kakasi;
    Text::Kakasi::getopt_argv('kakasi', '-kK', '-HK', '-JK');
    @kata = ();
    
    # PageReadingファイルパス指定
    $fname = '../htdocs/pukiwiki/cache/PageReading'; # XREAのパスに要修正
    
    open(IN, $fname);
    while (<IN>) {
    	push(@kata, Text::Kakasi::do_kakasi($_));
    }
    close(IN);
    Text::Kakasi::close_kanwadict();
    
    open(OUT, "> $fname");
    foreach $i (@kata) {
    	print OUT "$i";
    }
    close(OUT);
    
    print "Content-Type: text/html\n\n";
    
    exit;

    pukiwiki.ini.php

    $pagereading_kakasi_path = '/cgi-bin/kakasi.cgi'; // URLを相対パスで

    file.phpの388行目case 'kakashi'からcase 'none'までの間を次のように変更。

    case 'kakashi':
    	$tmpfname = CACHE_DIR . 'PageReading'; // PageReadingに固定
    	$fp = fopen($tmpfname, "w") or
    		die_message("Cannot write temporary file '$tmpfname'.\n");
    	foreach ($readings as $page => $reading) {
    		if($reading == '') {
    			fputs($fp, mb_convert_encoding("$page\n", $pagereading_kanji2kana_encoding, SOURCE_ENCODING));
    		}
    	}
    	fclose($fp);
    
    	virtual($pagereading_kakasi_path);
    	$fp = fopen($tmpfname, "r");
    	foreach ($readings as $page => $reading) {
    		if($reading == '') {
    			$line = fgets($fp);
    			$line = mb_convert_encoding($line, SOURCE_ENCODING, $pagereading_kanji2kana_encoding);
    			$line = chop($line);
    			$readings[$page] = $line;
    		}
    	}
    	fclose($fp);
    
    	unlink($tmpfname) or die_message("Temporary file can not be removed: $tmpfname");
    	break;
    
    case 'none':
    • をぉ、試してみたら動作しました(cgiからcgidに変更はしましたが)。ありがとうございました。 -- Lick 2004-10-12 (火) 22:03:22
  • そっかぁ tempファイル作ってやりとり. あと PageReadingファイルパス指定は絶対パスで指定した方が良さそうですぅ -- merlin 2004-10-12 (火) 22:18:52
  • 順調に稼働しているように見えましたが、ページが追加されるとそのページの読みが取得されず、そのままPageReadingに追加されてしまいます。また、その時kakasi.cgiの実行結果が一覧ページの上に表示されてしまいます(1度表示されるだけで2度目以降は表示されない)。これは何故でしょうか。 -- Lick 2004-10-16 (土) 08:12:46
  • いろいろと試してみた結果、どうやらPageReadingを作成する際、644で作成されることに問題があるようです。予め同名ファイルを666で作成しておくと問題なく読みが取得されました。
    ので、file.phpの
    unlink($tmpfname) or die_message("Temporary file can not be removed: $tmpfname");
    の部分を削除すればいいのでしょうか。 -- Lick 2004-10-17 (日) 17:27:20
    • それだとキャッシュがクリアされないからどんどんファイルサイズがでかくなってしまう罠。素直に作成時に666で作るようにする方がよいかと。 -- 2004-10-18 (月) 11:08:36
  • file.phpの最初のfcloseの後ろに次を追加してください。 -- さばぞう 2004-10-18 (月) 15:46:47
     fclose($fp);
    +chmod($tmpfname, 0666);
    
     virtual($pagereading_kakasi_path);
  • http://melfina.org/archives/2004/11/04_1256.html に書かれているように、Chasen/KAKASIのあるパスの記述を書き換えるだけで良いのかな。。 -- たれ込み? 2004-11-16 (火) 11:08:04

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-06-24 (火) 09:04:50
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.481 sec.

OSDN