ooooooo_qの日記

脆弱性の話とか

テストが通ったらニャーと鳴く

そんなmochaのレポーターを作ってみた。要するに保存するたびにテストしてニャーニャー言う。

node.jsから音声ファイルを再生する。

play.jsを使えればよかったのだけど、手元の環境では動かなかった。 仕方ないのでコマンドラインからなんとか再生できないか調べてたら、powershellからならいける様子。

というわけで書いてみた。

var exec = require('child_process').exec, script;

// Use COM objects to get filesystem information
script = '$c = New-Object Media.SoundPlayer(\'ファイル名\');$c.PlaySync()';

exec('powershell.exe -Command "' + script + '"', function(err, stdout, stderr) {
  console.log(stdout);
}).stdin.end();

でいけた。windows vista以降であれば、たぶんこれでできる。

参考

reporter書く

nyancatのreporterを参考にしながら、jsで書いていく。 成功時にnyaaa.waveを再生し、失敗したらnyeee.waveを再生する。

nyaaa.js

var exec = require('child_process').exec;

exports = module.exports = Nyaaa;

function Nyaaa(runner) {

  runner.on('pass', function(test){
      console.log('pass');
      play('nyaaa.wav');
  });

  runner.on('fail', function(test, err){
      console.log('fail');
      play('nyeee.wav');
  });

  runner.on('end', function(){
      console.log('end');
  });
}

function play( filename ){

  var script = '$c = New-Object Media.SoundPlayer(\''+__dirname +'/sounds/'+filename+'\');$c.PlaySync()';
  var command = 'powershell.exe -Command "' + script + '"\n';

  exec(command, function(err, stdout, stderr) {
    console.log(err);
  })
  .stdin.end();
}

参考

にゃーをつくる

猫の鳴き声の音声ファイルを作る。 手元に猫がおらず、また野良猫は目を合わせると大体逃げられるのでCeVIOさんに代わってもらった。 CeVIO(チェビオ)は文章を読み上げてくれてwavファイルで出力できる。元気いっぱいや悲しいといった感情を指定できる。

f:id:ooooooo_q:20130523201824p:plain

こんな感じのGUI

にゃーとそのまま入力すると求めてるものと、なんか違うなーという気分になる。読み上げ用のソフトだから、あまり猫っぽくはない。 にゃあああもにゃゃぁもなど試してみたが、結局「にゃあー」にして話すスピードを下げるのに落ち着いた。 成功時は元気いっぱいにし、失敗したときは悲しげにしてみた。

参考

ファイル配置

node.jsのモジュールがインストールされている場所を調べる。

>npm -g bin
C:\Users\ユーザ名\AppData\Roaming\npm
(not in PATH env variable)
/npm/node_modules/mocha/libs/reporters/
    ...
    nyaa.js
    ...
    /sounds
        nyaaa.wav
        nyeee.wav

ファイルをこんな構成で配置。reportersの中に作ったファイルを入れてやれば動く。 だけれどwavパス指定などにつまづいて、ここら辺調べるのに結構手間取った。

実行

mohca --reporter nyaa --watch ファイル名

これでファイルを更新するたびにニャーニャー鳴いてくれる。

やってみると、起動時からにゃーとなくまで2,3秒あるがちゃんと再生される。 テストが2,3個の時は、ほぼ同時に再生されるので合唱したように聞こえて、失敗が混じっていると不協和音になるので気づく。 10~ぐらいになってくると、再生されるタイミングがずれてくるのでにゃーにゃーいうようになる。

nyancatのレポーターってどうかかれてるんだろうという好奇心と、cevioいじって楽しかったのが混ざった結果こうなった。 mochaに自作のreporter追加してnpmに登録なんてこともできるようなので、もうちょっとちゃんと書き直したらやってみるかもしれない。

windowsでnode.jsをインストールしてcoffescriptとchaiとmochaでnyancatするまで。

f:id:ooooooo_q:20130508234718p:plain


メモも兼ねて。所要時間は10分ぐらい。

概要

  1. windowsにnode.jsをインストール
  2. coffeescript導入
  3. mocha導入
  4. nyancat

windowsでnode.jsインストール

http://nodejs.org/ からダウンロードする
2013/5/8時点での最新版は v.0.10.5
installのボタンを押すと、自動的に node-v0.10.5-x86.msi がダウンロードされる。
ダウンロードされたファイルを実行する。

設定がいくつか出てくるが特に何も変えずにnextを押し続ける。
インストールが終わったら、コマンドプロンプトからnodeで実行できることを確認する。

f:id:ooooooo_q:20130502081014p:plain

windowsではインストール時に、node.jsのパッケージマネージャであるnpmも一緒にインストールされる。
windowsと書いているけれど、他のOSでもそれほど変わらないはず。

node.jsはファイルIOや通信系など時間がかかる場所の処理は非同期になる。
この処理が終わった後にこっちの処理をしてほしい、といった場合はasyncなどのモジュールを使うと出来る。

coffeescript導入

コマンドプロンプトに下を貼り付けて実行

npm install -g coffee-script

必要なファイルがだーっと入る。成功したらパスが通る。

coffescriptのコンパイルと実行

sample.coffee

sum = (a, b)-> a + b
console.log sum 1,2

コンパイル

coffee -c sample.coffee

コンパイル結果 sample.js

// Generated by CoffeeScript 1.6.2
(function() {
  var sum;

  sum = function(x, y) {
    return x + y;
  };

  console.log(sum(1, 2));

}).call(this);

実行

node sample.js

または

coffee sample.coffee

結果

3

mochaとchai導入

javascriptのテストツールとしてjasmineとか色々あるけれど、とりあえずmochaとchaiを使う。

npm install -g mocha
npm install -g chai

chaiはテストするときのassertion。テスト結果と期待値を比較するために使う。
mochaはテストをまとめるために使う。

テストサンプル

テストするファイル sum.coffee

exports.sum = (a, b)-> a + b

exportsに関数などを渡してやると、他のファイルからも読み出せる。
詳しくはこの辺りを参照 http://nodejs.org/api/modules.html

テストコード test.coffee

chai = require 'chai'
assert = chai.assert
put = require './put'

describe 'mocha test', ->
	it 'sum', (done)->
		assert.equal put.sum( 1, 2 ) , 4
		done()

最初に必要なファイル読み出す。
describeのなかにitを書いてその中にテストを書く。
done()が実行されるとテストが終了する。書かないとテストが終了せず、実行され続ける時間切れで失敗になる。

テスト方法

mocha --compilers coffee:coffee-script test.coffee

cofffescriptのファイルをテストする際には--compile:coffee-scriptが必要
コンパイルをしなくても自動でcoffescriptでテストしてくれる。

nyancatでテスト方法
mocha --reporter nyan  --compilers coffee:coffee-script test.coffee

watchをつけると、ファイルが保存されるたびにテストされる。

mocha --watch  --reporter nyan --compilers coffee:coffee-script test.coffee
テストが通った時

f:id:ooooooo_q:20130508004316p:plain

テストが失敗した場合

f:id:ooooooo_q:20130508004518p:plain

ファイルが保存されるたびに一喜一憂してくれるようになる。
テストが増えるとアニメーションのように動いてくれる。

気をつける点

'--watch'をつけていると、テスト実行時にコンパイルに失敗してた時、テストコードないでエラーが発生した時に-watch自体が落ちる。エラー自体が出力されないこともあるので、原因が特定しづらいがその場合は'--watch'を付けずにテストを実行する。

nyancat以外の出力

nyancatは見ていて楽しいけれど、どこでテストが駄目だったか把握したいときは不便。
mochaの出力一覧はこちら。いつもはspecを使っている。
出力は自作することもできる。エラーがあったら音が出るようにすると楽しいかもしれない。

モジュールを扱う

package.jsonを使う。
npm init

でpackage.jsonがつくられる。
使用するモジュールなどを書く。

npm install

package.json内で指定しているモジュールが自動的にインストールされる。

現在何がインストールされてるか見たい場合は

npm list

coffe-scriptやmochaなどは-gをつけていれたもだけみたい場合は、npm -g listで見ることができる。

使わないものをアンインストールするときは

npm uninstall モジュール名

詳しくはこの辺り
https://npmjs.org/doc/json.html

gruntを使う

ファイルが保存された時に自動実行したい操作などをまとめて設定できるので便利らしい。
まだ使ったことがないので、そのうちやってみる。

リンク

node.js
http://nodejs.org/

npm
https://npmjs.org/

CoffeeScript
http://coffeescript.org/

chai
http://chaijs.com/

mocha
http://visionmedia.github.io/mocha/

何かわからないところあったらググるかstackoverflow、またはQiita。
node.jsとcoffee-scriptは日本語の資料も多い。


node.jsはなんとなく扱いやすいので楽しい。javascript書いてる感覚でcoffeescript書いてたら結構コンパイルエラーに引っかかった。
lint系の機能を使うか、IDEつかえばそんなでもないはず。
あとwindowsのコマンドプロンプトで色の設定面倒だしあんまり綺麗にならない。



5/19
タイトルがchaiではなく、chatになっていたので訂正。
sample.coffeeにconsole.logがなかったので追加

はてなブログの独自ドメイン

f:id:ooooooo_q:20130402223902p:plain
 はてなブログを作成するときに、ドメインをooooooo_q.*にしたかったけどアンダーバー使えなかったので諦めた。この間ハイフンが使える事を知り、ooooooo-qで取ればよかったなと後悔。
というわけで、ついでに調査したメモ。

はてなブログのドメイン

ブログを作成 - はてなブログ から作成できるドメインを確認できる。
使用出来る文字は英数字とハイフン。

punycode

詳細はPunycode - Wikipediaを。
ざっくりかけば、ドメイン中に日本語が使える。
日本語JPドメイン名のPunycode変換・逆変換 - 日本語.jp での変換結果によれば はてな.jp は xn--m9jin.jp に変換される。

というわけではてなブログのドメインの指定にハイフンが使えるなら、punycode使えるのではと試してみた。

xn--m9jin.jpで試してみたところ、

使用できない文字が含まれています。英数字で始まり、ハイフンと英数字が続く必要があります。
とのエラーが出た。他いくつか試してみたが同じエラーが表示される。
xn--やxn--abcなどpunycodeとして逆変換されないものはエラーが出ないようだった。実際に作成できるかまでは試していない。

使用できない文字列

loginやlogoutなど管理ページなどと誤解されやすいものは禁止ワードとして扱われるようだった。ただそれぞれ扱いに違いがあった。

  • hatenaはドメイン中に存在すると駄目。xhatenaやhatenaxはだめ
  • loginはだめだが、xlogin,loginx,1oginx,loqinはok。logoutも同様
  • registerはok(幾つかはすでに作られている)
  • jkondoはだめ。xjkondoはあり
  • nintendoも使用できない。xnintendoなどもだめ。
既存のサービスや固有名詞

google,iphoneはすでに全部のドメインで作成されている。
facebooktwitter,apple,mac,andoroidはいくつかのドメインであれば空いている。
microsoft,windowsはどのドメインでも作られていない。

文字数

100文字ほど入力してみるとエラーが出た。

ブログIDは2〜32文字の半角英数字を入力してください

何故かこのエラーメッセージにはハイフンがない。
最小が2文字。aaやxxは空いてないがiiとかだったら空いてる。