Archive for the ‘Hack?’ Category

復帰。

月曜日, 12月 19th, 2005

サーバのperlのバージョンあげた影響でMovableTypeがちゃんと動かなくなってた(ちと特殊な環境なので)んですが、動くように修正が先日完了したのでちょっと書き込みをば。
しかし、よくよく見たら去年の7月ですか、最後のエントリ(汗

mixiもなんか人数ふえすぎて、はっきりいってピンポイントでしか活動してないのでこっちをメインに復帰ということで。

年末年始に予定ないしから書くことないけどなッ……orz

徒然

水曜日, 8月 10th, 2005

会員数100万人突破とか聞いて、そろそろmixiどうでもいいなぁという気分がかなりあるんですが、うっかり自サイトのMovableType(以下MT)を動かなくしてしまったので、適当な思い付きをこっちに書き散らすことにします。最近やってること。[RagnarokOnline(以下RO)]ROをはじめて以来、初の支援プリ(INT=VIT>DEXのSW10/サンク7型予定)を育成中。[ウェブ関係]ROの現所属ギルドのメンバー専用サイト開発。で、開発完了の実装済み機能一覧1.メンバー管理機能(基本認証情報を一括管理)2.経費処理機能(申請画面、支払い状況&費用管理)3.装備品のレンタル状況4.やっつけ仕事の掲示板(オマケ)全部、Perl5.8.4+CGI+DBI(DBD::SQLite)で作成のCGI。いちいち考えるのがかったるいから文字コードはUTF-8。とりあえずレンタル状況は改良しようと思っている。あとは何がいるかなあ。……そだ、出席予定表つくってみっかな。#かんぺき独り言だな、これ。

4年前(?)のプログラムを作り変える

火曜日, 10月 12th, 2004
えー、早速ですがソースがどこ行ったか謎です。(ていうか探す気ゼロ)機能としてはディレクトリ内のファイルの一覧つくって、且つ全ファイルの先頭行をHTMLのテーブルに整形し、ファイルとして吐き出すっていう小さいプログラムです。ちなみにC言語でつくった。先日、こいつを内部的に呼び出してたシステムがバージョン変わったので同機能のものを融通の利くものに置き換えるべくごにょごにょ中ってことです。はい。現行のバイナリの処理を見てると、どうやらファイルを出力するディレクトリをハードコーティングしてる(まあ、つくってたときはそれでよかったからなあ)なので、あとあとハードコーティングしてた事でなかされるのはヤなので、こんかいはPerlで作成してしまうことにする。インタプリタはメンテが楽でよろしい。んで、移植作業中なわけですが、Windows上だとstat関数てファイルハンドルじゃないと情報取れない?ファイル名渡してもうまくいかないんだけど。

WSHで端末管理

木曜日, 10月 7th, 2004
なんか管理してるPCが数十台とかなってるので一元管理しないとヤバイ雰囲気になっております。特にIPアドレスとMACアドレスを把握してないと事業所のネットワーク運営の人に怒られちゃうぞ。
ちまちま一台ずつ情報収集してまとめたのがつい数ヶ月前だというのに部内のPCをさらっと見渡すと、すでに半分くらい新しいPCに変わっている……。(いつのまに俺そんなにセットアップしたんだろうな<待て)
しばし、管理用のデータベース(てか、単なるExcelファイルだったりしますけど。Accessのファイルで作ってもいいけどオーバースペックやし)を作らねばと考えるも……。
ダメだ、何をするにもまずは”さくっと”PCの情報集められるツールがないと話にならん。
というわけで午後のティータイムも程ほどにWMIの勉強開始。

……

………

あー……VBScript、かったるいー。
(そういやサーバにもActivePerl入ってるからPerScriptで書いてもよかったのか……<独り言)
とか思いながらも、WSHはいくつか過去に作ってきてるので、ときどき苦戦しつつもコンピュータ名、OSバージョン+SPバージョン、NIC、IPアドレス、MACアドレス、インストール日を取得するWSHがまず完成。
CSCRIPT /NOLOGO
が勝利のカギだ(?)

よし、次のステップだってことでコイツの拡張を考える。
とりあえず作成できたプログラムだと指定されたPC1台の情報を取得することができるだけなので一気に複数台を処理できるように改造をおこなう。

○ ワ ン ポ イ ン ト ○
同一ドメインに参加してる全コンピュータはドメインコントローラであるWindowsServerのAdministratorで情報をWMIで取得することができる。

な の で、

この状況を有効活用すれば管理が相当お気軽にできるわけだ。
ドメインに参加しているコンピュータ名のリストを格納したテキストファイルを作成。
このテキストファイルを読み込んで情報を取得するPCを指定できるように……

できたー。

あ、バグあるし……。
あ、定時だし……。
んー。
帰ろ。
明日はバグ取りをしようっと……。

RSSリーダは何がいいんだろう。

木曜日, 10月 7th, 2004

と、思ったので探してみる。動機はRSSが提供されてて更新があったか確認できるんだから有効活用しますか、ってことです。サイトをうろうろしていると「bulknews.jp」にRSS取得に使用されているユーザエージェントのランキング50位があったのでこれを参考にすることに。データは9月26日の15時のものだそうです。1位、2位で独走してる「RabbitTicker」というソフトが目立ちますね。よく見るとバージョン違いも何気にランクインしてるので、実質これがRSSリーダとしてスタンダードとなっているのでしょう。3位のMozillaはThunderbird(Mozillaのメールクライアント)のRSSリーダ機能だと想像するんですが違うかな。あと、気づくところといえば、curlとかPHPとかlibwww-perlとかJavaとかプログラムを作ってRSS取ってきて利用してる人が何気に多いですね。これは、RSSはまだ技術者系の人がどう取り扱っておもしろく(一般的な意味では有用に)していくかの段階なのかなーと感じなくも無い。とりあえず、シェアからして定番と思われるRabbitTickerをしばらく使ってみようかな。#と、いいつつThunderbirdを今ダウンロードしてるんですけど。

1. RabbitTicker (2372: 18.6%)2. RabbitTicker-iMi (1946: 15.3%)3. Mozilla (865: 6.8%)4. RssBar (837: 6.6%)5. Desktop Sidebar v1.04.75.0 (657: 5.2%)6. Headline-Reader [t] (www.infomaker.jp) (376: 3.0%)7. SharpReader (320: 2.5%)8. ParabolicMini (318: 2.5%)9. Miech (313: 2.5%)10. curl (295: 2.3%)11. Samurize Client Script http: (289: 2.3%)12. RabbitTicker-SEGA (239: 1.9%)13. glucose (237: 1.9%)14. Headline-Deskbar(www.infomaker.jp) (231: 1.8%)15. NetNewsWire (213: 1.7%)16. RabbitTicker-Seesaa (194: 1.5%)17. MagpieRSS (187: 1.5%)18. Opera (185: 1.5%)19. RSSGate (161: 1.3%)20. NewsFire (151: 1.2%)21. NewzCrawler (138: 1.1%)22. RThReader (127: 1.0%)23. PHP (122: 1.0%)24. Desktop Sidebar v1, 04, 63, 0 (91: 0.7%)25. RssReader (88: 0.7%)26. Heimdallr 1.05a (83: 0.7%)27. Desktop Sidebar v1, 04, 66, 0 (80: 0.6%)28. RSSReader (78: 0.6%)29. FeedDemon (77: 0.6%)30. Microsoft-ATL-Native (72: 0.6%)31. Desktop Sidebar v1, 04, 59, 0 (65: 0.5%)32. lwp-trivial (63: 0.5%)33. PukiWiki (57: 0.4%)34. Desktop Sidebar v1, 04, 68, 0 (54: 0.4%)35. Java (51: 0.4%)36. Desktop Sidebar v1.04.74.0 (49: 0.4%)37. mt-rssfeed (47: 0.4%)38. KNewsTicker v0.2 (47: 0.4%)39. Heimdallr 1.05 (41: 0.3%)40. HepCat: http: (39: 0.3%)41. RabbitTicker-fj (37: 0.3%)42. Snoopy v1.01 (34: 0.3%)43. libwww-perl (33: 0.3%)44. Wget (33: 0.3%)45. RssBandit (31: 0.2%)46. Feedreader (30: 0.2%)47. Mynews (27: 0.2%)48. Snoopy v0.94 (26: 0.2%)49. RabbitTicker-bk1 (24: 0.2%)50. Desktop Sidebar v1.04.72.0 (24: 0.2%)

すっきり解決してなくてもどかしい

水曜日, 9月 8th, 2004
DBD::OracleをActivePerl(5.6.1系)で使ったプログラムがある。それをActivePerl(5.8.4系)で動かそうと思ったらppmにDBD::Oracleが無くて自力でモジュールを作るか見つけなくちゃいけなくなった。一応、海外サイトに5.8.2、5.8.3なら配布してるところを見つけのだけど5.8.4入れちゃったから今さらだなあとスルー。使ってるPCにはVisualStudioが入ってるので、こうなりゃmakeしてしまえとCPANからDBD::Oracleのアーカイブを拾ってくる。が、perl Makefile.PLで詰まる。見た感じライブラリが足りないぽいのでちょっと保留。
しゃあない。Oracle使うって言ってもSELECT文で引っ張ってくるだけだし、DBD::ODBCでお茶を濁すか。ってことでコイツで作ったらALTER SESSIONが反映しない……ふぅーん……。

手間考えるとやっぱり5.6.1系に戻れってことかなあ。
5.8.4系だとアイコンがコモドドラゴンってところには惹かれるのだが。

無理矢理解決。w3mでのコメント投稿

月曜日, 8月 30th, 2004

WWW::Mechanizeを利用することで日記の新規投稿は解決を見た。(対症療法的なのは仕方ない……)こうなるとやはりコメントの投稿も解決したいなあと。軽い気持ちでつくり始めたんですが、処理自体はあっさり完成したのでアップしてしまいます。プログラムの基本部分は、塚本さんが公開されています日記投稿プログラムを参考にさせていただきました。どうやらコミュニティへの投稿もちょっといじればできる雰囲気なのでそのうちやろうかな。日記のコメントは日記のid単位で処理をしないといけないので、そこをどう解決するか。という課題があったんですが、これはプログラムに日記ページのURLを渡して処理をすることで対応。で、w3mの外部ブラウザにこのプログラムを指定すると任意の日記ページを閲覧中にMを押下すればコメントの投稿ができてはっぴー(私的に)。注意として、投稿を実行する前にcomment.txtを作成するという手順は守る必要がありますけどね。そんなわけで私の今の運用はこんな感じになっております。w3mで日記閲覧→^Zでw3mをバックグラウンドに→comment.txt作成→fgでw3mに戻る→M押下して投稿実行ソースですが、mixiの仕様でインデントがばっさり落とされるので、邪道だけど全角スペースでインデント。実際に試してみようという奇特な方はvim上で開いて「%s/ /\t/g」とかしてください。あと、$mailと$passは言うまでも無く、修正必須。


#!/usr/bin/perl
# comment.pluse strict;
use WWW::Mechanize;
use Data::Dumper;
$Data::Dumper::Indent = 1;
my $url = 'http://mixi.jp‘;my $diary_url = $ARGV[0];my $mail = ‘yourmail’;
my $pass = ‘yourpasswd’;
$diary_url =~ /view_diary.pl?id=([0-9]+)$/;
my $diary_id = $1;
sub message{ print @_ }sub abort{ message(@_);
exit 8}if( $diary_id !~ /[0-9]+/ ){ abort(”日id記が指定されていません\n”);}
my $comment_file = ‘./comment.txt’;
abort(”$comment_fileがありません”) unless (-f $comment_file);
message(”$comment_file読み込み中\n”);
open(IN,$comment_file);
my $comment;
read(IN,$comment,-s $comment_file);
close(IN);
# トップページの取得
message(”トップページ取得中\n”);
my $mech = WWW::Mechanize->new();
my $res = $mech->get( $url );
abort(Dumper($res)) unless ($mech->success);
# ログイン
message(”ログイン中\n”);
$mech->form_number(1);
$mech->set_fields(’email’ => $mail, ‘password’ => $pass);
$res = $mech->submit;
abort(Dumper($res)) unless ($mech->success);
while( $res->header(’refresh’)){ my $refresh = $res->header(’refresh’);
 message(”リフレッシュ$refreshの処理中\n”);
 if( $refresh =~ /url=([^\s;]+)/){  $res = $mech->get(URI->new($1,$mech->uri));  $refresh = $mech->uri; }else{  $res = $mech->reload; } abort(Dumper($res)) unless ( $mech->success);}
# コメントする日記ページに移動
message(”指定idの日記ページへ移動中\n”);
$res = $mech->get(URI->new($diary_url, $mech->url));abort( Dumper($res)) unless ($mech->success);
# コメント本文をセットして確認画面へ
# 自分の日記の場合は削除機能部分を考慮
message(”コメント送信中\n”);
if( !defined( $mech->form_number(2)) ){ $mech->form_number(1);}
$mech->set_visible($comment);
$res = $mech->submit;abort(Dumper($res)) unless ( $mech->success);# 投稿message(”コメントを投稿中\n”);$res = $mech->form_number(1)$res = $mech->click_button(’value’ => ‘ は い ‘);abort(Dumber($res)) unless ($mech->success);# 終了message(”終了\n”);

苦肉の策。WWW::Mechanize

日曜日, 8月 29th, 2004
w3mからの投稿は改行の問題があるのどうしたものか。
と思ってたところ、WWW::Mechanize利用して日記を投稿できるPerlスクリプトを塚本さんがwikiの方で公開されてましたので利用させてもらうことに。
この投稿もソレを使って投稿してます。でもって↓のもです。
まあ、日記のコメントに関してはあきらめの方向で。
(いや拡張して対応できるかとは思うんですがね……)

で、最近はCPANモジュールのリリースとか追っかけてなかったのでWWW::Mechanizeの存在とか知りませんでした……(^^;
丁度いい機会なんでここぞとばかりにいじってみましたけど、面白いですねこのモジュール。かなり悪質なこともできてしまうので使い方を問われる一品という面もありますが。
個人的にラグナロクオンラインのBOT通報フォームが数多く投稿するのをできないように意図的に作ってあってむかついたのでWWW::Mechanizeを利用してもっと簡単に一度に複数の通報をできるページを作ろうかと考え中。ソロでローグをプレイしてるとそれだけでBOT扱いされるので、さすがに耐えれなくなってきたのです。

Poor man’s aws.pl

火曜日, 3月 30th, 2004

ってことで。Pmaws.plの動作確認。ついでにprocestags.plも同時に導入。はてさてうまくいきますかね。

なんとなくマトリックスレボリューションズを例題に。
画像呼び出し(サムネイル)

” border=”0″>
< $MTPmawsProductName$>

ぶっちゃけたはなし↑買うんだったら↓買うな俺なら。安くなったし(笑)

” border=”0″>
< $MTPmawsProductName$>

続 aws.pl

火曜日, 3月 30th, 2004

さすがに悪戦苦闘するのイヤになったのでXML関連のモジュール使わないのを結局、作った。
コンセプトは「ASINサーチが使えればそれで良いや」ですので機能は貧弱貧弱ゥなプラグイン。MTの日本語パッチ(UTF8版)動いてれば動くでしょう。
[code]
# Poor man’s aws.pl
# (C)2004 MDR
# patched MovableType 2.661(Japanse utf-8)
# this plugin doesn’t need XML::* modules.
# ASIN search
# amazon.co.jp

package MT::Plugin::Pmaws;
use MT::Template::Context;
use LWP::Simple;
use Jcode;

my %q;
$q{’dev-t’} = “Your Developer’s token”
$q{’t'} = ‘objblo-22′;
my @pmaws_tags = qw(url ImageUrlSmall ImageUrlMedium ImageUrlLarge ProductName Asin Manufacturer Availability ListPrice OurPrice );

MT::Template::Context->add_container_tag( Pmaws => \&pmaws );
foreach my $tag ( @pmaws_tags ){
MT::Template::Context->add_tag( ‘Pmaws’.$tag => sub { my $ctx = shift; detail($ctx, $tag)});
}
MT::Template::Context->add_tag( PmawsAssociateUrl => \&associateurl );
sub pmaws
{
my $ctx = shift;
my $arg = shift;
my $res = ”;
my $builder = $ctx->stash(’builder’);
my $tokens = $ctx->stash(’tokens’);
my %detail;
$q{keyword} = $arg->{keyword};
$q{mode} = $arg->{mode};
my $url = ‘http://xml.amazon.co.jp/onca/xml3?’;
$url .= sprintf(”t=%s&dev-t=%s&AsinSearch=%s&type=lite&f=xml&locale=jp”,$q{’t'}, $q{’dev-t’}, $q{’keyword’}, $q{’mode’} );
my $xml = LWP::Simple::get($url);

my $f=0;
foreach my $line ( split /\n/, $xml ){
if( $line =~ /

/ ){ $f=1; %detail->{’url’} = $1;}
if( $f == 1){
if( $line =~ / (.*)< \/ProductName>/ ){ %detail->{’ProductName’} = $1 }
if( $line =~ /([0-9A-Z]+)< \/Asin>/ ){ %detail->{’Asin’} = $1 }
if( $line =~ /(.*)< \/ImageUrlSmall>/ ){ %detail->{’ImageUrlSmall’} = $1 }
if( $line =~ /(.*)< \/ImageUrlMedium>/ ){ %detail->{’ImageUrlMedium’} = $1}
if( $line =~ /(.*)< \/ImageUrlLarge>/ ){ %detail->{’ImageUrlLarge’} = $1}
if( $line =~ /([0-9\/]+)< \/ReleaseDate>/ ){ $detail->{’ReleaseDate’} = $1;}
if( $line =~ /(.*)< \/Manufacturer>/ ){ $detail->{’Manufacturer’} = $1;}
if( $line =~ /(.*)< \/Availability>/ ){ $detail->{’Availability’} = $1;}
if( $line =~ / (\\[0-9, ]+)< \/ListPrice>/ ){ $detail->{’ListPrice’} = $1;}
if( $line =~ /(\\[0-9, ]+)< \/OurPrice>/ ){ $detail->{’OurPrice’} = $1;}
if( $line =~ /(.*)< \/Author>/ ){ $detail->{’Authors’} .= $1.’,';}
}else{;}
if( $line =~ /< \/Details>/ ){$f = 0;}
}
foreach my $tag ( @pmaws_tags ){
$ctx->stash($tag, $detail{$tag});
}
if($q{t}){$ctx->stash(’AssociateUrl’,”http://www.amazon.co.jp/exec/obidos/ASIN/$q{keyword}/$q{t}”)};
defined( my $out = $builder->build( $ctx, $tokens )) or return $ctx->error($ctx->errstr);
$res .= $out;
return $res;
}

sub detail
{
my $ctx = shift;
my $key = shift;
return $ctx->stash($key);
}

sub associateurl
{
my $ctx = shift;
return $ctx->stash(’AssociateUrl’) || ”;
}

1;
[/code]
使い方ー。
$q{dev-t}にDeveloper’s tokenを書き込んで保存。
Pmaws.plとしてpluginディレクトリに入れればOK.
で↓みたいにテンプレートに書く。でRebuild
[code]

< $MTPmawsProductName$>
Posted in Hack? | No Comments »