いっしょにSatsuBatsu#2に参加していたid:hitode909がyharaボタンを作ってたので,それを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 ');';