2009年02月10日

utfフラグの挙動

UTFで保存しているソースコードで、
use utf8;
とするとそのスコープ中で書かれた非ASCII文字にはUTFフラグがつきます。

例:
use utf8;
my $str = 'ほげほげ';

↑の$strに入っている文字列は、UTFフラグつき。

この場合、requireで外部ソースを読み込んだ場合、読み込むファイルでも use utf8;が必要です。


例:読み込まれるファイル(hoge.pl)

use utf8;
sub hogehoge{
my $str = "文字コード";
return($str);
}
1;



読み込むファイル(sample.pl)

use utf8;
require 'hoge.pl';
my $string = 'UTF8な';
## ↑これはフラグつき
my $exfile = &hogehoge;
## ↑これもフラグつき
$string .= $exfile;
## ↑これもフラグつき



use utf8されていない(そして中で非ASCII文字を扱う)ライブラリ等をrequireする場合は、ライブラリ側でuse utf8するか、返ってきた結果を利用する前にEncode::decodeする必要がある……みたいな感じ。

いや、1時間ほど嵌りました
posted by 鯖缶 at 16:05 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

半角カナの変換

ちょっと必要なんでメモ。

PerlでJcode.pmを使わずに半角カナを全角に変換する方法。

●Encode::JP::H2Z::h2z を使う。
use Encode::JP::H2Z;
$str = 'ハンカク';
Encode::JP::H2Z::h2z(\$str);

※Perl5.7.3からコアモジュール
 utf8では変換されない

●Unicode::Japanese を使う。
use Unicode::Japanese;
$str = 'ハンカク';
$str = Unicode::Japanese->new($str)->h2zKana->get;

※コアモジュールではない。
 CPANのサイトからソース落としてきて、実行ファイルからみてUnicode/Japanese.pmに保存したら何か動いた。(コンパイル不要?)
 隠しコマンドがある(半角全部変換とか半角カナだけ変換とか)
 どうやらUTFフラグは落とすようだ。

参考にしたサイト:
 Encodeで全角半角変換 - くれすのPerl日記
 半角←→全角変換,Unicode::Japanese に未公開機能が… - daily dayflower
posted by 鯖缶 at 12:44 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2009年01月25日

次回作構想

 インフルエンザA型で本業も副業もお休みの鯖缶です。ゲフンゲフン

 次はクイズ出題スクリプトを作ってみようかと。はてな人力検索を見ていて思いつきました。(→http://q.hatena.ne.jp/1232879008
 この手の質問って、なんか定期的にあがっているような気がするんですが、需要ってあるんでしょうか。

 Perlでならささっと組めそうだけれども、Rubyで挑戦してみるのも面白いかも。
 いや、ChildTreeの改造版早く完成させろよと。
(でもね、人の作ったプログラム(それも時代の違う)を弄るより一から自分で書いた方が楽って事もあるのですよ)
posted by 鯖缶 at 21:35 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年12月11日

LinuxでO_EXLOCK使えない

 ChildTreeのファイル操作部分(ロック含め)を見直しています。
 ラクダ本を読んでいたら、sysopen関数に、O_EXLOCK,O_SHLOCKという便利なオプション(それぞれ排他ロック・共有ロック)があるのを発見しまして、「ああ、flock使わないで済むな」などと思いましたがテストスクリプトを書いてみたところ“Your vendor has not defined Fcntl macro O_EXLOCK〜”。

 グーグル先生に聞いてみたところ、LinuxのFcntlではO_EXLOCKはサポートしていないらしい。BSD系はOKらしいけど。
参考:
http://www.lingr.com/room/gauche/archives/2006/11/02
http://practical-scheme.net/wiliki/wiliki.cgi?Lingr%3a%e3%81%be%e3%81%a8%e3%82%81#H-6z2dr0

 結局、sysopenのすぐ後の行でflockしなければならないということですか。極稀だけど、その間に割り込まれる可能性があります。
posted by 鯖缶 at 01:50 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年12月04日

YouTubeのサムネイルとコメントを表示するYT*Tをバージョンアップ

 YouTubeのサムネイルやコメント一覧をインラインフレームで表示する「YT*T」が地味にバージョンアップなのです。

●fmt=22の例


●fmt=18の例
(追記あり)
posted by 鯖缶 at 00:16 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年11月06日

[Perl]リファレンスの使い方(サブルーチン編)

 備忘録を兼ねて、Perl5での無名サブルーチンのリファレンスの作り方と使用法。
 ChildTreeで「やっぱflock使えるなら使いたいよね」とか思いつつソース追ったらflock関数使ってない……。
 そんなわけで(まだ)ソースを書き換えているんですが、一部「ロック」→「ファイル読み込み」→「ロック解除」→「処理」→「ロック」→「ファイル書き込み」→「ロック解除」でロックが分断されるところがあるんですよ。処理している間に新たな書き込みがあったら、先に処理していた方が反映されなくなってしまいます。で、そんな部分がいくつかあってみんな処理が違うと。ちまちま書いていけばいいんだけど、ディレクトリトラバーサル対策のファイル名チェックとか色々やっているわけですよ。同じような処理はサブルーチンにまとめたいというわけで、異なる処理を引数にしてサブルーチンに投げてしまえってことです。(ファイルロックについては とむねこのページ > Web&Mail&Mac講座 > Perlの排他制御も参照)

(続きあり)
タグ:Perl
posted by 鯖缶 at 22:57 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年10月27日

SQLデータベース

 ちょっとChildTree改造から離れて……

 今だから(何がだ)告白しますが、SQLの使い方も知らなければPerlでのアクセス方法も知りません。これまではログファイルは全部CSVなりTSVなりで管理してきました。
 でもいい加減、MySQL位勉強しようかと。

 ChildTreeを弄っていて気付かされたのですけど、基本的にこういう掲示板(特にツリー構造とか持つもの)というのはログファイルを1行ずつ読み込みます。つまり簡単に言えば10MBのログファイルがあったら10MBのメモリをくいます。ログファイルの上から何番まで表示するなんてのであれば違うのでしょうが、ツリー掲示場は一旦全部のデータを読み込まなくてはなりません。
 ……だったらDB使えばいいじゃん。別マシンに待避できるかも知れないし。

 DBにはDBの難点があるかと思いますが、選択肢を多く持っておくに越したことはないと思うので。
posted by 鯖缶 at 16:21 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年10月24日

ChildTree細かいとこ修正

 ChildTree改造版の話題です。未だに本体弄っています。
 上部にテーブルとスタイルシートで「ヘッドバー」なるものをつけました。はてなブックマークのアイコンとか、Google Adsenseのキーワード広告とかの小物を置けます。色はユーザが自由に決めてもよろしいのかも知れないが、GoogleADの色が動的に指定できないので、いくつか作っておいて選ばせるという方法に。Flashとか使えばRSSティッカーなんかも出来るんだろうけど、Flashわかりません。
 あと、動画サイトの埋め込みに、eyeVioを追加しました。

 あと、細かいバグ(アイコン周り・CAPTCHAもどき周り)を修正。いや、今までアイコンがあることそのものを忘れていました。
 書き込み状況をRSSとかにもしたいんだけど、いい加減ツールの制作に取りかからないと……既に開発2年目だし。

P.S.
 MConv.pmを使っていて、UTF7周辺で“Prototype mismatch: sub Encode::Unicode::UTF7::decode〜”って感じのwarningが出て嫌だなあって人。UTF7.pmのバグっぽいので、このへんを参考にEncode::Unicode::UTF7.pmに修正を加えると幸せになれるかも。
posted by 鯖缶 at 11:54 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年10月06日

ChildTreeの広告表示部分がほぼ完成

 「まだ管理ツールに取りかかっていなかったんかい」というお叱りが飛んできそうですが、まだ本体の話題です。
 今まで、VCで検索→はてな連想ワードで再検索 でも関連商品が出てこなかったり、そもそもキーワードを入れていなかった場合はとりあえず“NO DATA”としていたのですが、そこに固定の広告をランダムで差し込むようにしました。
 Googleアドセンスの1画面3つまで制限にも対応しています。アマゾンのおまかせリンクなどはカラーコードが指定できますが、設定ファイルの内容を差し込むこともできます。

 ……あ、はい。管理ツールも作り始めますってう゛ぁ
posted by 鯖缶 at 03:05 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年10月03日

ChildTreeのディレクトリ構造をちょっと改造+α

 改造中のChildTree。もう10月になってしまいましたよ

 ユーザデータの置き場所を実行ディレクト直下からちょっと奥まったところに。ユーザが増えた場合にディレクトリ数がとっても鬱陶しいことになりそうだったんで。


 バリューコマースの広告表示部分。
 先週とかチェックしていたら記事の呼び出しがなんかもっさりしていて、ちょっと置いてからに再読込するとすぐに表示される。ええ、バリューコマースからのレスポンスを待っている間、固まるんですね。かと思って先ほど試したら今度は最初からサクサク。(キャッシュファイルは消してあります)
 問い合わせ先のサーバのレスポンスに極力依存しないためには、やっぱりIFRAMEで埋め込んだ方がいいのかも。
 とりあえず、もうしばらくモニターしてみます。
posted by 鯖缶 at 01:52 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年09月23日

エンコードライブラリをアップデート

 エンコードライブラリをアップデートし、エンコードラッパーモジュールとして公開しました。

変更点
 ・ライブラリからモジュールへ
 ・メール送信(MailHeader,MailText)でISO-2022-jp以外も指定できるように

ChilTree改造版でもこちらを使います。
タグ:mime encode Perl
posted by 鯖缶 at 01:13 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年09月18日

今後のやることを整理

ちょっとやることをまとめておく

ChildTree関係
  本体はほぼ完成、文字コード変換もJcode.pmからの置換が成功。デバッグ用の表示部分を消す。
 本当は変数のスコープを極力狭めたいがちょっと心が折れる。
  設置・設定変更スクリプトの作成にかからなければ。

メール送信ライブラリ
  バージョンを上げるにあたり呼びだし方法を根本から変えた。
 現在のドラフト版では、呼びだしルーチン内でメゾットを指定しているが、ライブラリファイルを走査して自動で行えるようにしたい。
  ……ドキュメントも書かなければ。
タグ:Perl
posted by 鯖缶 at 12:00 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年09月09日

エンコードライブラリを公開

 半分というか8割方自分用ですが、Encode.pmでUTFフラグや文字コード変換を行うPerlライブラリを公開しました。(http://cgi-bin.jp/dev/encode.php
 ええ、まあ業務でPerlを使っているような方はもうご自分で作っているでしょうが、Jcode.pmやjcode.plでないと文字コード変換ができないという方はどうぞ。

◆UTFフラグの付加
◆UTFフラグの除去
◆文字コードの変換
◆URLエンコード
◆URLデコード
◆メールヘッダ用エンコード(ISO-2022-JP&MIME Base64)
◆メール本文用エンコード(ISO-2022-JP)

ができます。
Perl5.8以上です。コアモジュールだけで動きます。

……さて、ChildTree改造版でJcode使っているところを書き換えなければ。
posted by 鯖缶 at 01:18 | Comment(0) | TrackBack(1) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年08月28日

Jcode.pmの自動判別で困ったこと

 今日、ChildTreeに機能を追加していて気付いたこと。
 ChildTree改造版では、文字コードの変換にJcode.pm(実質Encode.pmへのWrapper)を使用しており、投稿フォームから送られてきた内容について文字コードを自動判別してUTF8に変換しています。

 今日の追加機能を試すため、題名に「黒板.in」と入れたところ文字化けが……。
 全部全角で入れると化けないため、どうやらJcodeが判別する際にサンプルが少なすぎて誤判定を起こしている模様。

 どうしようもないっちゃないんですが、対策としてはいくつか。
 ・Jcode::getcode()でタイトルより長いであろう本文の文字コードを取得し、それをタイトルにも適用
 ・送信元のフォームにhidden属性で文字コード(utf8)を仕込み、その情報をもとに変換
 ・もうあきらめて変換を行わない
 ・レアケースとして切り捨てる

 どれも一長一短です。

(これを機会にEncodeモジュールに全て置き換えるという手も←根本的な解決になっていない)
posted by 鯖缶 at 18:56 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年08月25日

ChildTree改造 広告表示部

 久々(?)にChildTree改造のお話。
 個別記事の広告表示部分を次のように変えました。

 1.アマゾンからバリューコマースに
 2.キーワードから3つランダムで選び出して商品を検索
 3.選んだキーワードにマッチするものがなかったら連想検索してキーワードを補完

 2は、バリューコマースではOR検索ができないため、OR検索をしたかったらその回数だけクエリをしなければなりません。かつキーワードが何十個とあったら大変なことになるのでリミッタ。
 3は、選んだキーワードにマッチするものがなかったら1回だけはてなダイアリーキーワード連想語API(又はYahoo!デベロッパーネットワークAPI)にアクセスして連想語を拾ってきてもう一度商品を検索します。

http://cgi-bin.jp/cbbs/cbbs.cgi?id=test&mode=one&namber=8&space=0&no=
↑↑こんな感じで動いています。

まだ価格に通貨単位がついていなかったり、発売日がなんか変なのがありますが(VCのマニュアルには発売日ではなく供給開始日とありますが)、そもそもキーワードがなかったりするとNO DATAと表示されたりしますが、その辺の調整は後ほど。
posted by 鯖缶 at 04:24 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年08月24日

はてなダイアリーキーワード連想語APIとXMLRPC::Liteでハマった

 はてなダイアリーキーワード連想語APIを使用しようとして、日本語処理でハマったので書いておきます。
 はてなダイアリーキーワード連想語APIそのものについては、リンク先を見ていただくとして、サンプルプログラム(Perl版)をとりあえずそのまま動かしてみました。
 結果、検索対象がASCIIならば動くが、日本語だと結果が返ってこない

 あっちこち調べていたら、次のことがわかりました。
  1.XMLRPC::LiteにUTFフラグ付きの文字を渡すと怒られる(そのくせ結果はフラグ付きで返してくる
  2.XMLRPC::Liteにマルチバイト文字をbyte列(≒UTFフラグなし)で渡すと勝手にBASE64エンコードする
  3.はてなダイアリーキーワード連想語APIはBASE64エンコードされた文字列の入力に対応していない

//続きは追記で//
(追記あり)
posted by 鯖缶 at 03:32 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年08月22日

ValueCommerceの解析ルーチン

 バリューコマース・ウェブサービスで取得したXMLの解析サブルーチンです。例によってまた正規表現です。

 ソースは追記を見ていただくとして簡単な解説。
 XMLを受けたら、エラーが発生していないかチェックして、ひたすらハッシュに格納します。
 全部終わったら、ハッシュへのリファレンスを返します。

 アマゾンではハッシュのキーにASINを使っていましたが、バリューコマースではマーチャント,サブショップ,商品名を::でつないだものをキーにしています。
 そのせいで、Dumpの結果が非常に汚いものになっていますが、こうした理由は別エントリで。

(追記あり)
posted by 鯖缶 at 21:12 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年08月19日

AmazonAWSの分離(ChildTree)

 昨日書いていた、ChildTreeのアマゾン広告表示部分ですが、結局分けることにしました。
 で、いまゴリゴリ書いています。

 折角だからXML::Simpleとかで解析かけようかとやってみたのですが……UTFフラグうざすぎ。
 強制的にフラグくっつけてくれるモジュール使うなら、最初からそれを念頭に置いて書かないとだめっぽいです。

 というわけで、結局正規表現でごりごり。だって、早いって言うし。(→Perl で XML の処理はどれが速いかベンチ : NDO::Weblog

解析部分のソースはこんな感じ。(追記に書いています)(追記あり)
タグ:Amazon
posted by 鯖缶 at 03:13 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年08月18日

ChildTree改造の続き

 ああ、もうすぐお盆休みが終わってしまう。

 ChildTree改造(本体部分)について、いくつか追加工事。
  ・いろんな特殊タグ機能を追加(サンプルをチェック)
  ・管理機能から「ログコンバート」機能を削除
  ・管理画面にライブラリのバージョンを表示

これで本体完成にするか、アマゾンAWCの部分をライブラリとして分けるかちょっと考える。
posted by 鯖缶 at 00:44 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年08月13日

ChildTreeの改造 検索スクリプト

 ChildTreeのログ・過去ログ検索スクリプト(srch.cgi)についても変数宣言をきっちりやってSpeedyCGIに対応させました。
 本体(cbbs.cgi)とは分量が段違いに少ないので、今回は頭から追っていってour宣言は極力少なくしています。
posted by 鯖缶 at 02:21 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする
×

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