2008年08月11日

[Perl]リファレンスの使い方(変数編)

 自分の防備録として。

 リファレンスの使い方(変数編)です。関数編は未定。

 リファレンスというのは、変数などのメモリ上の位置を記録した情報のこと・・・らしい。
 Cプログラマには“ポインタのようなもの”と言えばわかる・・・らしい。

 で、どんなときに使うかと言えば、週末プログラマにとっては、やはりサブルーチンに複数の配列やハッシュを渡したいときでしょうか。あと、サブルーチンが複数の配列やハッシュを返すときにも使えます。
 サブルーチンに複数の配列を投げても、@_というひとつの配列としか受け取ってくれません。配列をデリミタでつないで無理矢理複数のスカラー変数として渡してしまう方法もなきにしもあらずですが、もっとスマートな方法がリファレンスを使うという方法。
 サブルーチンに配列そのものを渡すのではなく、配列が格納されているメモリ位置の情報(要は「メモリの何番から何番まで」という情報)をスカラー変数として渡せば、複数の配列・ハッシュをサブルーチンに投げられます。

 リファレンスを生成するには、元の変数の前に\(バックスラッシュ・円マーク)をつけます。
  例) $a = \$hoge; $b = \@number; $c = \%city;

 リファレンスに記録されたもとの値を参照するには、リファレンスの前に$@%の記号をつけます。
  例) $x = $$a; @y = @$b; $z = %$c;
  この場合、$$b[1]や$$c{'uji'}や$b->[1]や$c->{'uji'}の様な書き方も可能。

つける場所をよく忘れるので憶えておく。

追記に、挙動確認に使用したプログラムを置いておきます。

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

2008年07月26日

ChildTree HTMLタグの方針

 現在開発中のChildTree改造版。
 オリジナルではタグを許可するかしないかは掲示板管理者が選択するようになっていましたが……フォームへのHTMLタグの入力は全て禁止する方向で行きたいと思います。
 いや、XSSとかが怖いとかありますが、全部のタグを調べるのが面倒だ!というのが本音だったり。

 代わりに、現在動画サービスなどの埋め込みで使用している特殊タグを拡張して、利便性を図りたいと。
[[f:s=26pt;c=red;w=bold;st=italic;f=cursive;d=underline:フォント]]
↑こんな感じ。(「フォント」という文字が赤字斜体下線つきの26ptで表示されます。)
 どうせ文字列の修飾にしか使わないでしょ。(あとは画像の直リンクか)
[[link:http://cgi-bin.jp/;CGI-BIN.JP;_blank]]
でリンクとかもしたいけど、これはまだ未実装。
posted by 鯖缶 at 11:44 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年07月23日

配列からランダムに任意の要素をピックアップするサブルーチン

 普段からPerlを使ってる人には「そんなん知ってるわJK」と突っ込みが入りそうですが、自らの防備録を兼ねて。

 ピックアップしたい数と配列を投げると、ランダムに指定数を選び取って配列で返してくれるサブルーチンです。

続きは「ソース読む」からどぞ

(ソース読む)
タグ:Perl
posted by 鯖缶 at 16:18 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年07月14日

GD::SecurityImage::Magick

 GD::SecurityImage::Magick というPerlモジュールがCPANにあるらしい。
 ChildTree改造版のCaptchaは、現在Image::Magickで書いていますが、ノイズを乗せるのが精一杯でラインを引いたりとかはできなかったので「ん〜、いまいち」とか思っていたわけです。

 drk7.jpのエントリを眺めていたら、GD::SecurityImageというモジュールがあるというので試しにCPANで入れてみました。
 中身を見てみると、GD::SecurityImage::Magickというのも一緒に入っており、マニュアルを眺めると「GD::SecurityImage::Magick - Image::Magick backend for GD::SecurityImage.」とのこと。Image::Magickを使ってCaptcha画像を生成できるようです。

 Image::Magickは、サムネイル画像を生成するのに使用中です。これに加えてGDも必要となると、いろいろ導入障壁が高くなりそうだったのでありがたい話かも。
 まだChildTree改造版には実装していませんが、とりあえずメモメモ。
 ただ、最近はCaptchaも「人間でも読めない」という意見が多いので、いわゆるなぞなぞ認証に似たものを実装する必要もあるかもしれません。
posted by 鯖缶 at 10:26 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年06月13日

Encodeモジュールについて

 現在開発中のものは基本的にJcode.pmを使って文字コードの変換をしています。
 Perl5.8からはEncodeモジュールも使えるのですが、Jcodeを使っていました。なぜかと言えば、UTFフラグがよくわからないから。

 で、今日配信のあったメールマガジンのWeb版。
http://e8y.net/mag/015-encode/

 ああ、そういうことだったんだねと。
 だからuse utf8したら化け化けになったのかと。

 あとは、変換元の文字コードを自動で判別する方法を見つけて、JcodeからEncodeに乗り換えようと思います。
posted by 鯖缶 at 12:45 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年05月19日

ChildTree改造版のサンプル

現在開発中のChildTree改造版のサンプルを公開しました。

http://cgi-bin.jp/cbbs/cbbs.cgi?id=test

いろいろ紹介したいけど、もう眠いから記事を3つ載せただけでまた明日・・・
posted by 鯖缶 at 02:14 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年04月23日

ChildTree本体でやることリスト

タイトルの通り。
 今後、ChildTree本体でやることをリストアップし、とっとと設定ツールの作成にかからねば。

1.設定ファイル形式の変更
2.はてブ、ヤフーブックマーク等のアイコンを表示できるように
3.出力するソースコードの見直し


 1は、現在はPerlの命令文をそのまま書いてrequireしているけれども、色々危なかったり動かなかったりする原因になりかねないので、ハッシュ(%USER)を用意し、全て置き換える。($USER{'color'}など)

 2については、はてブだけにしてブックマーク数を表示できるようにしてもよいかも(勿論管理者の選択制)

 3は、HTMLチェックを通すと結構エラーを吐く。HTML4.01あたりで整える必要有り。
posted by 鯖缶 at 16:13 | Comment(2) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年04月10日

開発室をオープン

 cgi-bin.jpは、開発室を本日から公開しました。
 開発室では、cgi-bin.jpの成果物であるプログラムやライブラリをダウンロードしたり、現在開発中のプログラム・サービスを見ることができます。

 第一弾として、sendmailコマンドを使わずに直接SMTPサーバと通信するPerlライブラリを公開しています。SMTP-AUTH over SSLにも対応していますので、Gmailのアカウントを利用してメールを送信することもできます。

cgi-bin.jp開発室
 http://cgi-bin.jp/dev/
posted by 鯖缶 at 20:35 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年03月24日

YT*Tをアップデート

 YouTubeのデータ・サムネイルをニコニコ動画っぽく表示するサービス、YT*Tをアップデートしました。

 アップデート箇所
  各種色指定をできるようにしました。

YT*T http://cgi-bin.jp/api.php
posted by 鯖缶 at 01:23 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年02月23日

YouTubeサムネイルを(ry アップデート

 ニコニコ動画っぽくYouTubeのサムネイルを表示するサービスですが、いくつかバグ修正・アップデート。

【再生時間】
 再生時間の秒の部分を強制的に2桁表示にしました。
  今まで2:6 → 修正2:06

【広告表示】
 タイトルの上の広告表示スペースを、完全固定のものからランダム表示するようにしました。

【コメント数と取得】
 YouTube Data APIの仕様なのかバグなのか、コメント数が多くなると0を返すようなので、返ってきた値に関わらず必ずコメントフィードを取得するようにしました。
 コメントフィードでも、多すぎる場合は100を返すようなので、そのようにしました。
  実際のコメントが166ある場合:
  今まで コメント数:0 → 修正 コメント数:100以上
posted by 鯖缶 at 16:51 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年02月20日

いろいろな経過報告

ValueCommerceウェブサービスの件
→XMLの解析を正規表現からXML::TreePPで書き直して動作確認できました。
 XML::TreePPのやっかいなところとしてはparseした時に、例えば同じ階層にが複数あった場合は配列を作成するけど、一つしかない場合は直でハッシュを作る。決めうちできないときは、何らかの方法で判定して処理を分岐させる必要がありそう。
 でも、やっぱこれ(モジュール)使うとソースがスッキリする。

ChildTree改造の件
→ちょっとさぼり気味。RSS配信つけたいとか考える前に、とりあえずリリースできる状態にしろと。

YouTubeサムネイル作成ニコ動風味
→未だに正式な名前を考えてなかったりする。
 呼び出しURLの後に「&u=YouTubeのURL」とか、呼び出しをもっと簡単にしたいけど、YouTubeのURL内に「?=&」といった厄介な文字が入っていたり、そもそもURLエスケープされていない文字を貼り付けさせていいものか・・・。
 あ、実はひっそりと投稿日時とデータ更新日時をJSTで表示するようにしました。YYYY-MM-DDThh:mm:ss.sssTZ形式のデータを一回GMTのシリアル値に直して再度JSTで返しているんですが、その辺のサブルーチンも作ってあるんで気が向いたら公開・・・と

ライブラリとかソースのDL
→ダウンロード用ページ作らなくちゃなとか思ってはいるのですが。
 SMTPサーバを直接叩くメール送信ライブラリも、それなりの体裁ではできているのですがね。

cgi-bin.jpのリニューアルとサーバ更新
→重要なものが一番最後 :)
 いや、ChildTree完成とともに華々しくサーバ入れ替えなんてことを目論んでいたんですけどね、ChildTreeの開発が遅れてるんでいい加減先行してこっちをリニューアルしてもよろしいんじゃないかと。そもそもPen4マシン動かすのは電気代かかるんで。
 教訓:人は期限を切られないと動かない
posted by 鯖缶 at 01:17 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年02月18日

YouTubeのデータをニコニコ動画っぽく表示する

 YouTubeの動画データをYouTubeAPIで取得して、ニコニコ動画のIFRAMEみたいに表示するサービスを作りました。

↓↓こんなかんじ




 とりあえず、β版として公開を始めました。
  (http://cgi-bin.jp/api.php
 ソースコードも公開予定ですが、それ用のページをまだ作ってないんでもうちょっと待ってください。

 半日で終わると思ったけど、結局1日かかってしまった・・・。
posted by 鯖缶 at 03:38 | Comment(0) | TrackBack(1) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年02月14日

ChildTreeの経過とValueCommerce

 ChildTreeの挙動(SpeedyCGI実行下)が変な件。
 フォームデコードの部分をCGI.pmで書き直した。
 
ソースの頭の方はこんな感じ。
#!/usr/bin/speedy -- -t300

use strict;
use Fcntl;
use Jcode;
#use LWP::Simple;
use LWP::UserAgent;
use HTTP::Request;
use CGI;
use File::Basename;
#use CGI::Lite;
use Image::Magick;

LWP::UserAgentの方使います。
CGI::LiteやめてCGIの方使います。URLエンコードはモジュール使わずに何とかした。

更にメール送信ライブラリで
Net::SMTP、Net::SMTP::SSL、Net::POP3
も呼び出していたり。
モジュール使いすぎ、CPAN様々です。


閑話休題。
気がついたらValueCommerceウェブサービス(←100の質問とかの広告に使ってます)から取得したXMLの解析がnullになってた。
なんかバージョンアップして微妙に返値が変わったぽい。
Amazonみたいにバージョン指定できればいいのに。

XML::TreePPを見つけたので、こっちで書き直すことに。
とりあえず変数内容をDumpしながら挙動を探ってます。

それまでは一部の方は広告なしです。←バグです。仕様ではありません。
posted by 鯖缶 at 02:12 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年02月01日

Child Treeの改造

 フォームデコード部分でSpeedyCGIがひっかかってるっぽいことまでわかったのが前回。

 CGIモジュールを使ってフォームデコード部分を置き換えてみました。
 ちょっと動作が怪しかった部分もあるけれど、動いた。SpeedyCGIもエラー吐かない・・・と思ったら管理者モードから記事が削除できない OTZ

 グローバル変数なんてキライだー

 コードの解析は明日に回すとして、今後の方針をそろそろ考えなければ。
 管理者モードで削除フラグ立てている変数が見つかればいいが、そうでなければどうするか。

1.元のスクリプトをApache::PerlRunで動かしてみる。
2.新しく書く。

1・・・毎回コンパイルされたんじゃ意味ないじゃんとか思いつつ、実は今までの作業が一番無駄にならない。

2・・・中身すっきりで自分好みなスクリプトが書けるが、いきなりツリー掲示板作るのはロジックが…。


妥協点:
ChildTreeはmod_perl位で留めておいて、ファイルアップロード掲示板は別に作成?
posted by 鯖缶 at 02:15 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年01月29日

ChildTreeをSpeedyCGIに対応させる?

 SpeedyCGI下で記事をポストするとエラーログにPremature end of script headersを吐いて処理が止まる件。

 フォームデコードルーチンの終了直前にデバッグ用トラップを仕掛ける → エラー
 フォームデコードルーチンの開始直後にトラップ → エラーにならない

フォームデコードルーチン内にSpeedyCGI下で悪さする何かがありそう。

・・・って、変数が入り乱れていてわけがわからない。
CGIモジュールで置き換えますか。
(この変数、どっかで再利用していないよな・・・)
posted by 鯖缶 at 01:50 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年01月11日

Child Tree バグ?とり

 昨日の続き。
 とりあえず、別のサーバ(Vine)で動いているちょっと前まで書いていたコードを持ってきて、ファイル関係のパスのみ直して新サーバ(Debian)にアップ。

 なんかいろいろFTP絡みでトラブル。
 apt-getでSpeedyCGIをremove&install。
 単純なスクリプトは問題なく動いた。ChildTreeも表示までは問題なし。
 新規投稿しようとすると“Premature end of script headers”。なんでやねん。
 フォームのデコードあたりででもトラブっているのか?Vineで動いていたのは偶然かSpeedyCGIのバージョンが古かったのか(w

 選択肢は3つ。
 1.りゅういちさんの書いたコードをひたすら辿ってTry & Error
 2.元コードのフローは参考にしながら、strictなコードに書き直す
 3.SpeedyCGIは捨てる

 1→終わりが見えない作業になりそう。明日終わるかもしれないし、1ヶ月かかるかもしれない
 2→車輪の再発明?でも、CPANモジュール達を使えばスマートにいくかも
 3→ファイルサイズ自体かな〜りでかいスクリプトなんで、複数起動は自殺行為かも

 『2』が一番妥当かな・・・。はじめに表示系のルーチン書いて、そのあとPOST対応を確認しながら追加かな。
 原作はグローバル変数があちこちに飛び交っているけど(そういう時代)ファイルアップロードもCGIモジュール使ったりすれば、グローバル変数は最小限に抑えられる・・・かも。(ユーザ設定ファイルの中身だけとか)

 ・・・POST絡みでなんかまずそうなところがある気がするんだけど、フォームでコードルーチンの中にグローバル変数が入り乱れていてCGIモジュールへの置き換えを躊躇してしまう。いや、期が萎えるというか。
posted by 鯖缶 at 02:17 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年01月10日

SpeedyCGIでエラー&文字コード関係

 開発中のChild Tree 改造版のお話。
 純なPerlだと問題なく動くのだけれど、SpeedyCGIを噛ませると「新規投稿」に限ってエラー(Premature end of script headers)を吐きます。

 メール送信系でバグがあるのか、変数の宣言でどっか変なのか??
 幸い今度の週末は世間並みに三連休なので、ライブラリにしたサブルーチンも全部戻して検証ですか・・・

 あと、いろんなウェブサービスをXMLで呼び出したら、だんだんソースが無駄に長〜くなってきました。正規表現での解析にこだわらず、素直にXML系モジュール使った方がいいかな。
posted by 鯖缶 at 01:59 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2008年01月05日

メール送信ライブラリ

#この記事で紹介しているコードについては、cgi-bin.jp開発室で最新版を配布しています#

 Child Tree(原作)のメール送信部分は、サーバ内のsendmailコマンドをパイプを通して叩いて送ってますが、融通が利かない部分があります。(Return-Pathがcgiの実行ID@サーバ名になったり)
 あと、新しく稼働させるサーバでテストしたところ、sendmail互換Postfixの挙動がいまいちつかめなかったので、外部のSMTPサーバと通信することにしました。

 とりあえず、単純なSMTP・POP before SMTP・SMTP Auth・SMTP Auth over SSL に対応できるようになります。GmailはGmail内の設定を適切にしてやればSMTP-AUTH over SSLでメール送信できます。
 最近流行(?)のOB25には未対応ですんで、そんなISPにサーバたててる人(いるのか?)は、同じネットワーク内にSMTPサーバを立てるか、Gmailにでもアカウントを取る必要があります。

 結構時間かかったけど、原因はソース書くことよりモジュールの依存関係で手こずってたため。

 誰の役にたつかはわかりませんが、とりあえず追記にソース置いておきます。CGIにようにHTMLヘッダは吐かないので、コマンドラインから実行してみてください。
 モジュール(一番の難関)関係は、webminやCPANで自己解決してください。(追記あり)
posted by 鯖缶 at 04:11 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2007年12月29日

ChildTree開発状況

 もう師走も大詰めです。

 ChildTree改造で前回のPOST以降今までやったこと。
 ・AmebaVisionに対応(APIでいろんな情報を持ってこれます)
 ・RESTするためのモジュールをLWP::SimpleからLWP::UserAgent&HTTP::Requestに変更(なんかGETメソットだけじゃなくてPOSTする必要も出てきそう)
 ・掲示板そのものの「キーワード」設定項目追加

 とっとと、設定ツール作らなければ。

#AmazonのXMLソースをキャッシュする部分なんですけど、解析した結果をリストにしてキャッシュするか、XMLそのものをキャッシュするかお悩み中です。
 当然、解析結果をキャッシュした方が次回からのアクセス時には負荷は減るんですが、どうせキャッシュ期限は1時間だし・・・とか思ったり。だったら、あとからいろいろ使い回しできるオリジナルをキャッシュしといた方が汎用性があっていいかなとも思ったり。正規表現をグルグル回すのって、どれくらいの負荷なんだろう?
posted by 鯖缶 at 14:36 | Comment(0) | TrackBack(0) | ただいま開発中 | このブログの読者になる | 更新情報をチェックする

2007年11月20日

Child Tree改造::スパム対策

 たまには今書いている機能の紹介などを。

cbbsed.png 画像を見てもらえればわかるように、投稿の際画像を人間の目で読み取ってそのまま入力するフォームとその判別ルーチンを作っています。この画像は読み込みの度に変わります。
 ちなみに、画像の表示にはGIFカウンタみたいにあらかじめ用意したファイルをくっつけるのではなく、Image::Magickでパスファイルから書き出しています。(理論上は漢字も出力可能ですが、パスコードを作るのに難儀しそうなんで半角英数だけ)
 CGIに渡すのは、キーのみになりますので、正しいパスコードは(.htaccessをきちんと設定していれば)サーバをハックされない限り機械的に読み取るのは難しいかと。

 ちなみにパスコード表示に使っているフォントは、「たれフォント」です。再配布も許可してくれる非常に太っ腹なところなので、スクリプト完成の暁には同梱しようかと思います。

たれフォント計画 => http://maktak.hp.infoseek.co.jp/


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

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