趣味のプログラム工房

php、cgi作成メモ

UPnP ControlPoint(コントロールポイント) WEBインターフェース

LinuxマシンにてPT2で録画サーバ、MiniDLNAにてメディアサーバを立てたのですが、これを簡単にTVに出力する方法はないかということで、
WEBインタフェース作ってみました。
(というか、意外とこういうソフトってないんですね。。。)

Perlで「Net::UPnP」というライブラリが見つかったので、それを使って作成しました。
本当はPHPのほうがよかったのですが、使えるライブラリがなかったので断念。
gupnpというのが見つかりはしたのですが、インストールができなかった。


PerlのNet::UPnPを使えばそれなりに苦労せず目的は達成できましたが、
もうちょっと使いやすくなるとうれしい。
毎回毎回、「Net::UPnP::ControlPoint」の「search」でUPnPデバイスを取得しないといけないのは正直パフォーマンスが悪いです。
ページ遷移が発生するたびにこれでは、時間がかかりちょっとイラッとする。
ネットで検索した例だと↓のようなものばかりですが、

$upnp->search(st => 'upnp:rootdevice', mx => 3);

そのほか、オプションとして、hostでIPアドレスやIP:ポートが指定できるようです。
参考:http://nazuna.sakura.ne.jp/software/upnp/get_device.html


ちなみに、UPnPのサービス名やパラメータを調べるのに、
Linuxに入っていた「GUPnPユニバーサルコントロールポイント」が大変便利でした。


2015年02月24日


PHP mb_strimwidthで文字化け!

「ウェブでワイン管理」
http://wine-cellar.sites-mall.com/
のページでいつの間にか文字化けが発生するようになっていたので、そろそろ直そうかと。

てっきりDBとのなにかしらの絡みで発生しているのかと思ったら、phpの「mb_strimwidth」関数が原因でした。
mb_strimwidthの引数に文字コードを渡してあげれば解決です。
$str = mb_strimwidth($str, 0, 10, \"…\", utf8);


で、DB(mysql)とのインタフェースでは、
mysql_query(\'set character set utf8\');
を指定すると文字化けが発生しなくなるのですが、最近は、この方法も非推奨らしく、今は、
$db->set_charset(\'utf8\');
で設定するらしいです。

私は、mysql_queryを使ってるけど、めんどくさいからそのままー

2013年11月24日


Perl用エディタについて

Perlのコーディング用エディタについてですが、ズバリお勧めは、「改造版JmEditor2」でしょう。

以前、エディタから直接Perlスクリプトが実行できるものがほしく、導入したのですが、かなり使い勝手がよく気に入っています。
エディタからスクリプトが実行できるのもいいですが、左側のパネルでお気に入り(ファイル)の管理ができるのがいいです。
私の場合、編集するスクリプト(使うスクリプト)はほぼ固定なので、かなり便利です。
スクリプトの出力ファイルとかを登録しておくのもすぐ結果をみれて便利です。


マジおすすめ。

2013年01月07日


IIS7.5でPerlを実行【Windows2008R2】

大人の事情で、IIS+Perlの環境でプログラムを動かすことになりました。
そのための検証を行ったのですが、意外にメンドクサイ。


IISのインストールは、ISAPI拡張だけあればよさそう。
CGIはおそらく不要です。(必要ならインストールして)


続いて、ActivePerlのインストールですが、64bitOSであっても32bit版のほうがよさそうです。


インストールが完了したら、あとはIISPerlのマッピング。

『ハンドラーマッピング』の設定から、スクリプトマップの追加を行います。
そこで拡張子「*.cgi」にたいし、「perlis.dll」(デフォルトのままだと、C:\perl\binの下にある)を指定します。
ここで、perl.exeは指定しないこと!

マッピングが追加できたら、念のため、「機能のアクセス許可の編集」を選び、実行にチャックが入っていることを確認。


これで、Perlが使えるようなっているはずです。

ただし、注意点として、どうもIISが出力するヘッダがおかしいらしく、perlスクリプトに手を入れる必要があります。

具体的にはヘッダの出力前に、下記の文字列を返す必要があります。何故か。
print "HTTP/1.1 200 OK\n";


この修正が面倒な場合、マッピングとして「perl.exe」を使う方法もありますが、こちらの場合、スクリプト内で呼んでいるライブラリやデータファイルなどのパスを絶対パスで書く必要あります。
おそらく、ヘッダ出力の書き換えより影響範囲が広いと思われるため、私としては、perlis.dllを使うのがお勧め。

あと、perlEx30.dllを使う方法もありますが、こちらも、パスがうまく通らないっぽいです。

2012年09月14日


Cache::SizeAwareFileCacheについて(3) キャッシュ実装で高負荷

キャッシュを使い始めたらキャッシュを探す処理でかなりの負荷が掛かっているらしく余計遅くなってしまいましたorz
ということで、キャッシュサイズの調整が必要です。大きければいいわけでもないらしいです。

と、思っていたのですが、どうやら別の可能性が出てきました。
Cache::FileCacheにはキャッシュの生存時間を制限する機能(default_expires_inで指定した時間)があるのですが、期限の切れたキャッシュを削除するメソッドとして Purge()があります。
どうやらこのPurge()メソッドを毎回動かしていたのが高負荷の原因の可能性が高いです。
また、max_sizeの指定についても負荷が高いらしく、より、負荷を下げたいのであれば、max_sizeは指定せずに、定期的にlimit_size()メソッドを使用するのがいいみたいです。
(max_sizeを指定するとキャッシュを使用する度にlimit_sizeメソッドを実行するようなものなので指定しない方が低負荷なのは当たり前ということですね。)

2011年03月21日


Cache::SizeAwareFileCacheについて(2) xreaで利用

Cache::SizeAwareFileCacheを使おうと思ったのですが、私の使っているXreaサーバでは残念ながらモジュールが入っていないようです。
そこで、自前でperlのモジュール(pmファイル)をダウンロードしてきてxreaサーバにアップロード。

activeperlの場合
ppm install Cache::FileCache
でローカルにインストールできます。
インストールされたモジュールは、perlのインストールフォルダの下\site\libにあります。(Cacheフォルダ)
該当のフォルダをサーバへアップロードします。


アップロードしたモジュールを使うには
xreaの場合の例
use lib qw(/virtual/ユーザID/public_html/module);
とします。(moduleフォルダの下にCacheモジュールを入れた場合)
あとはモジュールをuseすればOK
これで使えるはずです。


2011年03月21日


Cache::SizeAwareFileCacheについて(1)

楽天ウェブサービスのレスポンスキャッシュするためにCache::SizeAwareFileCacheを使用し始めました。
Cache::SizeAwareFileCacheはCache::FileCacheの拡張版でキャッシュサイズの制限をかけることが出来ます。
通常のCache::FileCacheは時間だけ。

使用例
use Cache::SizeAwareFileCache;
my $cache = new Cache::SizeAwareFileCache({
'namespace' => 'MyNamespace',
'default_expires_in' => 60*60*6,#6時間
'max_size' => 10000,'cache_root' => 'res_cache'
});

cache_rootフォルダの中にnamespaceフォルダを作ってその中にキャッシュが保存されます。


2011年03月21日


UTF-8で書いたperlが動かない。500エラー

メモ帳などでUTF-8でPerlのプログラムを作り、FFFTPでアスキーモード・無変換でアップしてもプログラムが動かない。
どうやら、仕様らしい。

調べてみると、メモ帳でUTF-8で保存するとBOMというフラグがついてしまうみたいです。
そのため、うまく動かないらしい。
メモ帳だけでなく、他のソフトでも動かないことも多々あるので他にもいろいろと原因があるきもしますが…
とりあえず、確実に動かす方法としては「文字コード変換ツール」を使います。
これで、UTF-8のBOM無しに変換してからアップすればプログラムにエラーがなければ動くはずです。
Unix系だとnkfというツールがある。

2011年03月21日


phpでOpenID実装

自分のサイトの認証にOpenIDを利用しようと、ライブラリを導入しました。
今回使用したのは、、、『lightopenid』という物です。

phpでOpenIDだと、一般的には、「PHP OpenID Library(JanRain PHP OpenID)」が使われるみたいですが、うちで使っているサーバのXREAでは何故か対応していないため、使えず。
というわけで、『lightopenid』を使っているわけです。
が、『lightopenid』では、yahooが実装しているAEでのユーザ情報が取得できないのですorz
説明にはサポートしてるとあるので使い方が悪い可能性も大なのですがw



まあ、なんとか「PHP OpenID Library」を使いたいのですが、XMLのライブラリに問題があるとか、MD5の乱数の生成部分に問題があるなど、、、色々試した結論として、XREAのサーバで使うのは無理でした。(複数の問題有り)


というわけで、XREA・coreserverでOpenIDを導入しようとしている方の参考になればとメモメモ。


ちなみに、ライブラリ自体はlightopenidの方が使いやすい印象。


2011年01月13日


2.Amazonアフィリエイト タグ改造


今回はAmazonアフィリエイト タグの改造です。

アマゾンの下記のようなAmazonライブラリリンクをよく使っているのですが、サイトのデザインとの相性とかもありデザインが気に入らなかったりします。

とくに、横幅とかがサイトのデザインとあわないなど。


そこで、改造です。







タグをみるとわかるように、これはiframeになっています。で、実際にアクセスされるページは




こちらにアクセスしても同じ表示がされるはずです(もともとアクセスするたびに商品がかわるリンクなので商品は若干かわりますが)。



さらに、こちらのページだとソースまでみることができます。

つまり、このソースをいじることができれば、アフィリエイトタグの改造ができるという訳です。

で、実際にはどうするかというと、

1,元となるアフィリエイトのタグを取得します。(iframeの)

2,そこに含まれる実際に表示されるページのURLを取得します。

3,2、で取得したURLにアクセスしそのページをGETして同じページを表示するようなCGIを作成。

4,3、のCGIの中でソースの置換などの改造を行う。

5,iframe等で3、のCGIにアクセスすれば4で改造された内容が表示されます。



簡単ですね♪

ただし、アマゾンのロゴやプライバシー云々のリンクをいじると確実に規約違反となるのでやめましょう。

また、3、においてスタイルシートのファイルも適当なフォルダにコピーしておかないとスタイルが崩れて同じように表示されないので注意してください。

2010年12月02日


次へ