HTTP Signatureをlolipopレンタルサーバーで作成
ActivityPubでPOSTするには電子署名が必要。
というエントリを書いたけど、WEBでサーバー同士でやりとりしたり、WEBサービスのAPIを利用したり、電子署名が必要なのはActivityPubに限らず。
ちらほら書いてきたように、lolipopレンタルサーバーにはperlで電子署名をする時によく使われるモジュール「Crypt::OpenSSL::RSA」がインストールされていない。
ということは。lolipopではHTTP Signatureを作ることができない「Cryptが使えないんじゃ話にならない」ということになる。
しょうがないんで、ローカルにcpanから「Crypt::OpenSSL::RSA」をインストールして、ActivityPubにPOSTする時はローカルのスクリプトを使う、という急場しのぎ。
これはこれで、投稿するのにひと手間あった方が事故も起こさなくていいかな、と思ってやってたんだけど、やっぱりサーバー上だけでやれるならラクちんなことは確か。
なもんで、グーグル先生にお願いしてみたら
「Crypt-Perl-0.38」https://metacpan.org/pod/Crypt::Perl
↑pure perlのCryptモジュールがあった。
インストール時にコンパイルが必要なモジュールはOSやファイル構成、環境に依存するけど、PurePerlというのはperlだけで作られているので、perlさえあればサーバーにそのままアップロードして使える。
さっそくダウンロードして展開。テストスクリプトで試したところ、依存関係で必要なモジュールがあったのでそいつらもダウンロードして展開。
Class-Accessor-0.51
Bytes-Random-Secure-Tiny-1.011
Convert-ASN1-0.34
Crypt-Format-0.12
(あと、たぶん以前amazonのAPIがらみでインストール済みのpure perlのDigest::SHAも必要)
当然ながら(?)これらのモジュールもpure perlなので、コンパイル不要、展開するだけで使える。
サーバーの適当なところ、例えば「lib」というディレクトリを作って展開したファイル群をアップロードするだけ。
lib/Bytes/
lib/Class/
lib/Convert/
lib/Crypt/
スクリプトで use lib 'lib'
などとやればlolipopレンタルサーバーでもCrypt RSAが使えるようになる。
いや。ぶっちゃけ。これらモジュールの作者のみなさんには大感謝。大袈裟じゃなく狂喜乱舞小躍りだった。ほんとうにありがとうございます。
マジperl使いすげー。perl話者が減ってるだろう昨今、凄腕のperl使いはワシントン条約で保護すべき存在。
使い方は「 RSAモジュールで公開鍵と秘密鍵 」とほぼ同じ。
秘密鍵を使う
my $privatekey = Crypt::Perl::RSA::Parse::private($private-pem);
公開鍵を使う
my $publickey = Crypt::Perl::RSA::Parse::public($public-pem);
Signatureを作る。
my $sign = $privatekey->sign_RS256($sign-str);
encode_base64($sign, "");
Signatureを検証する。
my $decoded = decode_base64($sign);
$publickey->verify_RS256($sign-str, $decoded);
あとは。
こうすると、思いつきから投稿放流までが直結するので、事故を起こさない自制心が必要となるです、はい。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
xyzzyのバッファを書き出す
PDFのデータをWEBの管理ページにコピペという単調なワープアIT軽作業。
ぺたぺた貼りつけるだけならいいんだけど、PDFのデータは印刷のことを考えて(?)半角数字などの両側に半角のスペースが入ってたりするし、改行があるとWEBで表示すると半角程度空白になってしまう。
・PDFからエディタにコピペ
・無駄な半角スペースと改行を削除
・エディタから管理ページのフォームにコピペ
という作業。
毎度毎度エディタに貼りつけ置換して…いちいち同じ作業にむかついてきたので、調べてみた。
xyzzyというWINDOWSのエディタを10年以上使っていて、以前はマクロ(lisp)が面白くていろいろいじくってた。でも、もうすっかりびっくり忘却の彼方。lispは手強い。
とりあえず。xyzzyの編集中のバッファをperlに渡して処理させて、その結果を編集中のバッファに書き出して、クリップボードにコピーしてくれればいいや、と久しぶりにxyzzyのlispを調べた。
・カレントバッファをtmpファイルに書き出す
・外部コマンドでtmpファイルを開いて処理をして、その結果をカレントバッファに書き出す
・クリップボードにコピーする
perlを使えば何でもできるしなあ。
…て、「_xyzzy.tmp」とファイルを仲介してるんだけど。バッファを標準出力に出してそれを標準入力でperlが受けとるのが本来あるべきスマートな姿。Windowsだと無理、かなぁ…。
以下、外部コマンド実行でハマったのでメモ。
外部コマンドを実行するための関数「execute-shell-command」があって、xyzzyのリファランスを見ると
外部プログラムを実行します。結果だけをxyzzyに取り込みます。
COMMAND : 実行するコマンドをオプション付で指定します。
INFILE : 標準入力を使用する外部プログラムであれば入力ファイル名を指定します。
OUTPUT : 標準出力を出力するバッファを指定します。
ENVIRON : 設定する環境変数を連想リスト形式で渡します。
(("HOME" . "C:/applications/xyzzy/")
("TOPDIR" . "C:/spool/"))
DIRECTORY : 実行するディレクトリを指定します。
ところが、INFILEにtemp-fileを指定しても、ファイル名が引数になってない=指定のファイルを開けない。
具体的には
(execute-shell-command "_xyzzy-tmp.bat " t temp-file (selected-buffer))
INFILEにtemp-fileを指定すればバッチファイルの引数に渡されると思ったらダメだったので、perlのスクリプトの中で$f='_xyzzy.tmp'とファイル名を固定で指定してた。
これは超ダサイ。
なもんで、
(execute-shell-command (concat "_xyzzy-tmp.bat" " " temp-file) t (selected-buffer))
↑COMMANDにtemp-fileを入れたコマンドライン文字列を作って入れたところ、バッチファイルでtemp-fileを受けとることができた。
system関数にsprintfでコマンドを作って実行させる、ようなものだ。
うーん、でもきっとINFILEを使った方がいいんだろうなあ。
とはいえ、目先、今月8月も残り10日を切ってるんで、不細工でもこいつで作業してやっつけてしまわんと。時間がかかればかかるほど単価がアレになってしまうんで、〆切一ヶ月前倒し進行!
[08/31 19:48:13]追記。
て、optionalのところ、nilだtだじゃなく、ここにINFILEを書けばいいだけの話だった。誤情報すみません。
ちなみに、xyzzyでは「filter-buffer」というのがあって、「Ctrl+x #」と叩くと、外部コマンドを実行するための1行バッファが現われる。
ここに外部コマンドを入力すると、編集中のバッファ(カレントバッファ)を外部コマンドに渡してくれる。
単純なものならperlのワンライナーでやりたい放題だし、スクリプトを実行させるためのバッチファイルでもOKだ。
超手強いlispを避けて、普段使い慣れてる処理系で書けるのは本当に助かる。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
DBD::Excelとか麻布十番納涼祭りとか
朝から毎月定例の内科。今日は採血されて結果は来月。
帰ってから、ちょっとperl。
毎週ルーチンで、60個前後のエクセルファイルを開いてcsvに保存する、という実に馬鹿馬鹿しい低脳作業がある。こんなもの人間のやる仕事じゃない。腐れエクセルには1mmも触りたくない。
複数人が並行で入力しているんだけど、さいわい、シートの名前に規則性があるんで、以前ちらっとここで触れたDBD::Excelを、本稼動させてみた。
ディレクトリにあるxlsファイルを開いて、特定のシートをcsvに吐き出す
#!/usr/local/bin/perl
use strict;
use Encode;
use utf8;
binmode OUT=>':cp932';
use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::FmtJapan;
my $oFmtJ = Spreadsheet::ParseExcel::FmtJapan->new(Code =>'cp932');
my $sheet = shift(@ARGV);
my $orig_dir = 'xls/';
foreach my $d ( @{ $section_dir } ){
opendir(DIR, $orig_dir) || die;
my @files = grep(/.xls/, readdir(DIR));
closedir(DIR);
foreach (@files){
my $xls = $orig_dir . $_;
my $oBook =
Spreadsheet::ParseExcel::Workbook->Parse( $xls, $oFmtJ);
my $ws; my $wc;
for(my $i = 0; $i < $oBook->{SheetCount}; $i++){
$ws = $oBook->{Worksheet}[$i];
if( $ws->{Name} =~ m!$sheet! ){
printf qq{XLS:%s Sheet:%sn}, $xls, $ws->{Name};
for(my $r = $ws->{MinRow}; $r <= $ws->{MaxRow}; $r++ ){
my @buf;
for(my $c = $ws->{MinCol}; $c <= $ws->{MaxCol}; $c++ ){
$wc = $ws->{Cells}[$r][$c];
my $value = $wc ? $wc->Value : ''; $value =~ s/,//g;
push(@buf, $value );
}
print join(',', @buf), "n" if @buf;
}
}
}
}
}
これだけ。
今日は、ヨメと昼前には麻布十番納涼祭りに出かける予定だったので、時間がないかな、と思ってたのに、20分もかからずスクリプト完成。あとは現物合わせな例外処理だの作りこめば実戦投入できる。
いやもう、ほんと便利で、DBD:Excelの作者には大感謝!糞エクセルからまた一歩離れることができたゼ。ざまみろ。って、休みに仕事なんぞしてちゃいかんだろ、おれ。
大盛況おお賑わい大混雑の麻布十番納涼祭り。今年こそは国際バザールでちゃんと食おうと、開店前に並ぶ気合。ヨメはドイツ、わたしはブラジルに並び、フランクとシュラスコをがっつり食う。比較的すいていたラオスでおじいさんとおばあさんが上げていたスパイシーチキンまで堪能できた。ちなみに、3時開店のときにはもう行列となっていた。どれも美味でありました。大満足。
その後麻布十番側にいって、うろつく。オリオンビールとか赤ワインとか純米酒とか、馬肉ソーセージとか。しかし、今日の暑さ、人ごみにバテバテ。面白かったんだけど、ちょっと余裕がなかった、かも。
あとは、部屋でのたのた転がるかしらん。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
入力formをAjaxにすると
状態が変わった場合に、同じページのほかのコンテナの表示も変えないといけないケースがけっこうあるぞ。ページごと移るなら話は単純だけど。
ううむ。気づいてなかった。入力した、もしくは削除したのに、ページ内の表示が変わらないのはマズイ、ていうか、そんな腐ったページはありえない。
なにかアクションを起こしたら、必ずそれがわかる、てのが世の中の大原則、いわば等価交換だ(by フルメタルアルケミスト)
Ajaxを使った入力formでデータの状態を変えたら、データを表示しているコンテナに反映させるためのRequestも必要ってこと。んでなんでAjaxかというと非同期だから。…これで、たぶん、まぬけにハマる。
new Ajax.Requestあれこれ
この時点で、デフォルトだと、返事が帰ってくる前に別の処理を始められるのがAjaxというやつ。これがチョー便利なんだけど(初老のおっさんが「チョー」はない)、だけど、今回の入力formとその反映を考えると返事を待たなきゃいけないぢゃん。
Ajax.Requestを複数仕込む時に。
new Ajax.Request あれこれ
new Ajax.Request あれこれして変更されたデータを取得
最初のpostするRequestはデフォルトを同期に変更して、次のgetするRequestは非同期。てことでイケる…ような気がしてきたぞ。週末にでもちょっと試してみるか。だめならperlの側でsleepをいれてごまかす、というのもありだな。
にしても、案の定、というか無知なままのJavascriptなんかを使うんでハマりまくりだ。でも、Ajaxは流行だし、わたしは流行に弱いミーハーだし(あれ?もしかして、ミーハーも死語かな)
まだ先は長かった、か。とほほ。
夕方のスコールが続いたかと思ったら、いきなり涼しい都心だ。
[08/22 23:23:39]
なんか今日もこき使われてへとへとの図。牛馬だぜ、やれやれ。こんなじゃ青空所属も近いな。と、ぶちぶち言ってもしょうがない。
で、検索してみたらやっぱり、Ajax.Requestで「非同期」じゃなくて、同期通信の要望・ノウハウがちらほら。そりゃそうだよなあ。更新系がすんでから、それを閲覧、というのが普通だ。その一方で、
サーバー側がコケるとクライアントが固まるから、同期通信は「推奨」されない、てのももっともな話。
うううむ。非同期でやると、サーバー側perlにsleepさせるしかないけど、sleep時間が短かいと確実じゃないし、長すぎると連打されて簡単に負荷がかけられる。クライアントを固めるようなことになっても、更新系がからむところは同期でいくほうがいいよなぁ。どっちにしてもあちこち見直しが必要だわ。ふうう。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
ネットも激戦だ
同じパラパラ漫画・スライドショーでもフラッシュとGIFアニメを一緒にしちゃいかん。画像をちょっと加工した以外たいしたこともせず、イベントに追加していっただけみたいなものを作った。プロパティを開いて少しエフェクトをつけて、写真提供者の名前をテキストで張り込んでみたら、初めて作ったにしてはそれなりのものになったぞ。…いや、昭和のセピアがかった写真=素材がとてもいい感じだったからなんだけど。
今日のように、素材がよければ、せっかくなのにもっとうまく見せられないものかと欲もでてくる。ううむ。マクロメディアの本家ソフトをどうにかするかなぁ。6万弱、自分に投資するかしらん。って、増えて戻るから投資というのであって、どうなるかわからんのに金を突っ込むのはギャンブルでさえ無い、か。
フラッシュとPHPには完全に出遅れた。
フラッシュは素材が作れなきゃ不要だと思ってたし、PHPはperlより使えるとは思えないし。PHPはまだビミョーに信用しきれないけど、フラッシュに関しては、もはやこいつを使えなきゃ金の取れるコンテンツが作れないという状況っぽい。
んで、今さらだけど、ヤフーとかぐーぐるとかどこで儲けてるんだろう、と。多分、間違いなく企業広告なんだろうけど。
企業が自分のページを検索エンジンのトップあたりに持ってくるために、コンサルタント会社に金を払ってるのはもう常識。それだけ市場が膨らんで、そのコンサルタント会社のように目端の効く連中が隙間でも儲かるようになった、てことなんだろうか。てことは、寄らば大樹の陰という構図か。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
だるい一日、ひきこもる。
夕べは駅前のやるき。ポイントが少し貯まってたので一杯はタダ。…やるき茶屋って会社の連中の認識だと学生が使う店、らしい。言われてみれば、都心部のやるきは学生のコンパ御用達。だけど、小金井あたりは学生のコンパももちろん、町内会や家族連れ、ひとりサラリーマンの晩飯、と多様な客層なのだ。ひとりでカウンターにいても妙に落ちつける。
今日は朝から身体の芯がモヤっとしてすっきりしない。歯茎も少し疼くし、体調不良の予兆というか、体調不良真っ只中というか。
なもんで、洗濯をしてあとはダラダラ。マクドのセットで昼飯を済ませてしまうほど無気力無体力だ。ついでに給料前で金も無い。
生協でゴーヤ128円を買って、晩飯にゴーヤチャンプルーを作ってみる。美味。だけどだるさは抜けないんだよなぁ。
明日からの一週間は押せ押せ確実だから、シャキっとせんといかんっちゅーのに。
風呂入って早めに寝ます。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」