MATLABで計算終了時にハレルヤを流す&メールを送る&Twitterにつぶやく

MATLABで計算終了時にハレルヤを流す&メールを送る&Twitterにつぶやく

概要

シミュレーションや最適化など,時間のかかる重い計算が終わるのをPCの前に張り付いて待っていませんか? わたしの場合,終了したらすぐにつぎの作業に移りたいので,こちらのようなテクニックを使っています:

需要があるのか単にハレルヤがおもしろかったのかわかりませんが,微妙にウケたので記事にしておこうと思います. ハレルヤを流すほかにも,メールを送ったり,Twitterでつぶやいたりできるので,そちらも紹介したいと思います.

対象としているバージョンは R2015a 以降ですが,Twitterでつぶやくやつ以外はそれ以前のバージョンでもできます.

ハレルヤで知らせる

みんな大好き sound コマンドを使います. 以下のコードを計算終了後の部分に記述しておけば,終了時にハレルヤがきわめてカジュアルに流れます.

load handel.mat; sound(y,Fs);

副作用に注意

ただし,このままではプログラム本体にもし yFs が定義されていた場合,load コマンドによって上書きされてしまいます. ちょっとバッドノウハウな感じが出ますが,つぎのようにすることでこの問題を回避できます.

structfun(@(y)sound(y,8192),load('handel.mat','y'))

load('handel.mat','y')y の入った構造体を返すので,structfun で引っぺがしてから sound コマンドに投げています. この変更によって,音声再生の前後でプログラム本体の y が変化することはなくなりました.

ハレルヤ関数をつくる

さらに,関数ハンドルを使うとこの処理をわかりやすくラップすることができます.

hallelujah = @()structfun(@(y)sound(y,8192),load('handel.mat','y'));

とファイル冒頭でしておけば,あとは

hallelujah();

とするだけでハレルヤが流れる,ハレルヤ関数が完成します.

音を止めたい

音を止める際は clear sound を実行しましょう.

参考: How to stop sound in MATLAB? - Stack Overflow

ハレルヤ以外の音で知らせる

audioread 関数を使えば,wavやmp3などの主要な形式の音声ファイルをMATLABに取り込むことができます.

[y,Fs]=audioread('filename'); sound(y,Fs);

Fs の値が分かっている場合は副作用なしの方法として以下のコードが使えます.

sound(audioread('filename'),Fs);

これだけで,様々な音声ファイルを再生できます.

ちなみに handel.mat のほかにも,chirp.mat, gong.mat, mtlb などがサンプル音声として標準インストールされています. 特に mtlb は,Signal Processing Toolbox 生みの親である Loren Shure の声っぽい音声で味があります.

メールを送る

sendmail 関数を使ってMATLABからメールを送信できます.

sendmail('mail@example.com', 'subject', 'message');

こちらは実際に送信できるかどうか試してから使用したほうが良いでしょう. SMTPサーバの情報がシステムから取得できない場合は送ってくれないので,手動でサーバの情報を設定する必要があります. 詳しくはドキュメンテーションを参照してください.

MATLABにつぶやかせる

MathWorksが提供しているThingSpeakというサービスを利用します. ThingSpeakのThingTweet Appは,TwitterのAPIのうちつぶやくだけの処理をラップしてRESTful APIとして提供してくれるものです. これを利用すると,MATLAB R2015a から導入された webwrite 関数を使うことで簡単にMATLABからTwitterに投稿することができます. (セキュリティ的に若干どうなんだろうという面も無きにしもあらずなので,専用アカウントの作成をおすすめします.)

ThingSpeakアカウントの登録

MathWorksアカウントのメールアドレスとパスワードでログインして,規約に同意すれば完了です.

ThingTweet APIキーの取得

基本的にはここを参考にすればおっけーです.

参考: ThingTweet App - MATLAB & Simulink - MathWorks 日本

ThingSpeakにログインしたら,画面上のメニューから “Apps” を選択し,“Link Twitter Account” をクリックしてTwitterアカウントへのアクセス権限をわたします.

APIキーが発行されます

APIキーが発行されるので,これをコピーしておきます.

MATLABからツイートするコード

コピーしたキーを以下のコードに貼り付けてください.

url = 'https://api.thingspeak.com/apps/thingtweet/1/statuses/update';
api_key = '(ここに取得したキーを入力)';
data = '@tokoro10g MATLABからツイート';
data = ['api_key=',api_key,'&status=',data];
response = webwrite(url,data);

今回は自分にシミュレーションが終わったことを通知したいので,data に “@tokoro10g” を入れています. 各自のアカウントに書き換えましょう.

以上をMATLABで実行すると,こちらのようになります.

投稿元情報を見ると “via ThingTweet” となっています.

応用例

音を鳴らす場合と違い,文字を使った通知の場合は補足情報の付加が簡単にできます. 先ほどのコードの data 変数に対して,たとえば tic, toc を使って

tStart = tic;
% 〜〜〜
% 重いシミュレーションや計算の処理をここで行う
% 〜〜〜
tEnd = toc(tStart);

url = '...';
api_key = '...';
data = ['@tokoro10g 所要時間: ' sprintf('%d分%f秒',floor(tEnd/60),rem(tEnd,60))];
response = webwrite(url,data);

と書けば,シミュレーションの所要時間をつぶやかせることができます.

まとめ

  • MATLABはいいぞ
Share Comments