yharaボタン+LDRの挙動を say.cgiとGreasemonkeyで再現

いっしょにSatsuBatsu#2に参加していたid:hitode909yharaボタンを作ってたので,それをSatsuBatsu#2の合間に適当に作ったsay.cgiとGreasemonkeyを使って再現してみた.

準備1: say.cgi

Mac OS Xにはデフォルトでsayというコマンドが使える.このコマンドは,

$ say hello

とかやると,Macがしゃべってくれるので楽しい.これをJavaScriptから使えるようにするために,CGIでラップする.この記事の最後にソースコードをおいたので,それを保存して/Library/WebServer/CGI-Executablesにsay.cgiという名前で置く.say.cgiに実行権限を与えた後,http://localhost/cgi-bin/say.cgi?msg=hello&voice=Alex にアクセスするとMacがしゃべる.

準備2: LDR with say - Greasemonkey Script

このsay.cgiを使うuserscriptを http://userscripts.org/scripts/show/17231 からダウンロードしてインストールする.

実行:

http://reader.livedoor.com/reader/ でjとkキーをリズミカルに押して楽しむ.

say.cgiはなぜかJSONP形式になっているけれども,特に意味はありません.say.cgiに重大なセキュリティホールがあったり,sayやperlのプロセスが上がりまくってたいへんなことになっても,当方では一切責任は持ちません :P

付録: say.cgiのソースコード

#!/usr/bin/perl

use strict;
use warnings;
use List::Util qw(shuffle);
use CGI;


my @VOICES = shuffle (
    'Alex',
    'Bruce',
    'Fred',

    'Ralph',

    'Agnes',
    'Kathy',
    'Princess',
    'Vicki',
    'Victoria',

    'Albert',
    'Bad News',
    'Bahh',
    'Bells',
    'Boing',
    'Bubbles',
    'Cellos',
    'Deranged',
    'Good News',
    'Hysterical',
    'Pipe Organ',
    'Trinoids',
    'Whisper',
    'Zarvox',
);


my $q = CGI->new;

my $voice    = $q->param('voice') || $VOICES[0];
my $msg      = $q->param('msg');
my $callback =  'callback';
if ( $q->param('callback') =~ qr{^[a-zA-Z0-9\.\_\[\]]+$}xms ) {
    $callback = $q->param('callback')
}

if ($msg) {
    system('say', '-v', $voice, $msg) == 0 
        or die "say failed: $?";
}

print $q->header(-type => 'application/json');
print $callback . '(';
print '{status: "ok"}';
print ');';