ネイティブモジュール非依存のマルチプラットフォームで音を鳴らすことのできるnode-moudleを作った

github.com

背景

Electronアプリで通知音を鳴らしたいが,音にまつわるモジュールがネイティブ絡んできて辛い. かつ,DOMのaudioを使いたくないという場面があった.

ネイティブが絡むと,node-gypを使ったりしてビルドが若干めんどくさくなるし, ちょっと音を鳴らしたいだけの時には重いモジュールが多いように感じた.

そこで,できるだけミニマムかつシンプルなモジュールを作成した.

利用方法

nodeのコードでは次のように使える.

var simplayer = require('simplayer');

var musicProcess = simplayer('/path/to/sound.mp3');

var musicProcess = simplayer('path/to/song.mp3', function (error) {
  if (error) throw error;
  console.log('end of song!');
});

require('simplayer') することで得られる関数を呼び出すとchild_processインスタンスが帰ってくる. なので,再生した音楽を監視したりするのであれば,child_processと同じように扱えば良い.

注意としては,windowsはwavフォーマットのみ対応 ということである. powershell というか, .NET の System.Media.SoundPlayer でmp3を再生する手段があれば教えていただきたい.

一応,cliも提供している.グローバルインストール後に,

simplayer /path/to/sample.mp3

すれば,実行できる.

実装

イデアは,openerを参考にした. openerは,各プラットフォームごとにファイルを開くコマンドをchild_processでspawnしているだけの シンプルなモジュールだ.macでいうopenや,windowsでいうcmdそものもが便利なのもあって非常に使いやすい.

openerと同じように各プラットフォームの音楽再生をするコマンドをよべば,音楽でも似たようなことが実現できる. ...と思っていたが,windowsには音楽を再生するコマンドはない.

そこで,このモジュールでは,powershellを使うことにした. powershellを通せば,.NETが提供している様々なものが使える. 今回は,System.Media.SoundPlayer を使って音を鳴らすことにした.

powershell.exe -NoExit (New-Object System.Media.SoundPlayer path\to\sound.wav).Play()

のようにすると,即席でwavファイルを再生できる.-NoExit オプションを付与している理由は, 音楽の再生が終了する前に,powershell.exeのプロセスが終了してしまうからだ.

他のプラットフォームは,macでは,afplay, linuxではaplay(ALSA) を用いるようにした.

作ってみて

30行程度の関数をモジュール化するのかどうか迷ったが,openerがものすごい利用されているのを見て, 公開しようと思った.

オレオレテキストドキュメント用プラグイン vim-tmngつくった

f:id:maxmellon:20151216004107p:plain

github.com

SLP内のvimmerは,Star or Contribute してほしいな(チラチラ.star1つですごくモチベーションにつながる

vim-tmngとは

SLPや研究室の議事録でよく使われるドキュメントフォーマットである”TmngDocument(たまねぎドキュメント)” を Syntaxハイライトするvimプラグインです. TmngDocumentの特徴としては,■, ●,◎,○などのマーカーを多用します.

SLPとは、香川大学工学部のプログラミングサークルである

対象ユーザー

  • 主に僕
  • SLP内のひよっこvimmerからベテランvimmerまで.
  • TmngDocument形式で大量のドキュメントを書く必要のあるゼミ生

背景

ほんとは,markdownとかそういうかんじのナウでヤングなフォーマットのドキュメントが書きたかった. でも,我らボスの意向や,過去のドキュメントの関係からフォーマットを変更することはムズいとのことだ. なら,そのフォーマットに合わせて便利ツールつくればいいじゃん! エンジニアのひよっこなんだから,見のまわりを便利にするツールくらい自作したい!

最低限の機能要求

  • とりあいず色
  • テンプレートの生成
  • ,.の置換
  • 80文字以内での折り返し

現状,この要求は満たしている

demo

f:id:maxmellon:20151216005050p:plain

こんな感じで色つきます,スペースが全角だったり,入ってなかったりしていると色がきえるので,TmngDocument形式を覚えていないSLP1年生にも優しいです!

こだわりポイント

docment

僕はすごく英語が苦手だ.なので英語はできるだけ書きたくないし自信もない. だけど,vimのためなら英語でドキュメントが書けた.これはすごいことだ.vimはプログラミングの勉強にもなるし,開発も円滑にするし,英語の勉強にもなる.しかも,就活で話すネタにもなる.vimって最高だよね.

test,lint

微量ながら単体テストのコードを書いている.テスティングフレームワークには,vimspecを利用している. vimspecを採用した理由は,非常にシンプルで提供しているものが非常に少なくミニマルなものだからだ.機能をたくさん提供するプラグインではないので,これで十分だった. 一応,TravisCI上でもテストしている.

いまは,関数のテストしかできていない.syntaxハイライトが付いているかどうかをテストする方法や,テスティングフレームワークがあれば,教えてほしい. 将来的には,vim-vspec などに乗り換えたい

testだけではなく,vint というlintツールを使ってお行儀のよいプラグイン作りを目指している. ツールがたくさんあってすごくべんり.

今後の課題

  • TmngDocument→課題ページ

僕がほしい.(課題ページとは,研究室内で数年後の後輩のためや,データを蓄積を目的としたHTML静的ページの集合)

  • vim内からのPOST

ドキュメントを管理するAPIサーバーを用意してvim-tmngから叩いてPOSTできるようにとうにとかしてみたい.

  • tmng-lint

このプラグインとは直接は関係がない.けどほしいもの.

TmngDocumentは,先輩の添削が推奨されている.しかしセンパイもいつも暇なわけではない. lintがあれば,後輩たちはある程度最低限フォーマットを整えた状態にすることができる. そうすれば,後輩もdocumentを書きやすくなるし,先輩も添削する時間が少なくてすむ.

つくってよかったこと

vimプラグインがどうやって作られているか深く理解することができた. 自分の成長とともにvimも成長していくのがすごく嬉しい. 苦手な正規表現や英語にも,vimを通せばガンガン勉強できる.さいこうだ

初めて作ったプラグインとしては,個人的には非常に満足できるものとなった. 引き続き拡張を続けていきたい.

あと個人的に良かった(すごくすごく)ことは,大学に入ってプログラミングを知った学部1年生が,Contributeしてくれたことです.

僕が学部1年のときは,gitやgithubどころかプログラミング言語を授業でしか書いたことがなかった.しかもC言語だけ.

そう考えるとほんと感動的

Let's VIM Life !!!!

人類はもっとvim本来の機能を使うべきだった

反省

自分は、vim本来の機能を使いこなす前にpluginの力に染まってしまった。 そのことを強く後悔している。デフォルトのmappingを潰し,vimrcをメタボ化させ... そういったvimmerが今後増えないように,今回はこのアドベントカレンダーを通して vim本来の素晴らしさを伝えたいと考えている. vim本来の機能に詳しくなることは,vimrcのダイエットにも繋がる.

はじめに

所属サークルにいるvimmerが使っていなさそうな機能に焦点を当てているので, 若干紹介している機能に偏りがある恐れがあります. vim本来の機能について網羅して知りたい人は,vim-helpを熟読しましょう.

あ,SLP KBIT アドベントカレンダー2015 12日目です

www.adventar.org

便利機能

  • <C-o> : 直近のジャンプポイントへジャンプする.

まずjumpのvim help を見てみよう. (vimmerググる前にvim helpを見るべし)

==============================================================================                                                                                
8. ジャンプ                                     jump-motions                                                                                                  
                                                                                                                                                              
「ジャンプ」とは次のコマンドのどれかを意味します: 新しいファイルの編集を始める                                                                                
コマンドと、"'", "`", "G", "/", "?","n", "N", "%", "(", ")", "[[", "]]",                                                                                      
"{","}", ":s", ":tag", "L", "M", "H" です。これらのコマンドのうちのどれかを                                                                                   
使ってカーソルを「ジャンプ」させた場合、ジャンプする前のカーソルの位置は覚えて                                                                                
おかれます。その位置を含む行を削除したり変更したりしていなければ、"''" と                                                                                     
"``" コマンドを使ってその位置に戻ることができます。

helpを見たとこで私が実際に使用するタイミングを紹介したいと思う. 例えば,javaソースコードvimで書いていたとしよう.その際,おそらく不要なimport文の削除や, import文の追加,package名の修正がしたい時が来るだろう.そのとき, gg でページトップに 行くとする.ggで1行目に移動したものの十中八九,その作業を終えたあとは,前の位置に戻りたいだろう. そこで <C-o> をタイプする.そうすると,前回編集した場所に移動することができる. jumpするポイントは :jumplist で確認することができる. jump地点の登録は,"'", "`", "G", "/", "?","n", "N", "%", "(", ")", "", "",
"{","}", ":s", ":tag", "L", "M", "H"を利用した時に登録される

とりあいず少し前の位置に戻りたいときは押して見る.使っていくうちにどこに飛ぶかがわかってくると思います. <C-o>も数字と組み合わせることができます. 3<C-o>だと,3つ前のジャンプポイントに移動します. vimマッピングは組み合わせの幅がとても広いので積極的に使っていきましょう.

  • gf : カーソル位置の文字列をパスとみなして,そのファイルを編集する

たとえば,C言語を編集していたとする.その時に自分で作成したヘッダファイルをインクルードするとする. そうした時,よくヘッダーファイルを編集したい時が出てくる.そういった時,このマッピングの出番だ.

#include "../path/to/hea■er.h"  

このとき,にgfをタイプすることで,ヘッダファイルに移動することができる. これは,ファイルだけではなく,URLにも適用できる. markdownにリンクを埋め込むとき,ちょっとサイトを確認したい時にも活用できるのでぜひ覚えておこう.

  • <C-^> : 直前のバッファに移動する

これは,gf と組み合わせると非常に強力です. gfして移動したファイルの先で,<C-^>をタイプすることで直前のバッファつまり移動前のファイルに移動することができます.

  | file A |   gf ----------->  | file B |
               <---------- <C-o>
  • オペレータ,テキストオブジェクト

vimの各種mappingは,オペレータとテキストオブジェクトの組み合わせで出来ています. オペレータ,テキストオブジェクトについて知らないサークル生も居るかもしれませんが, ひとまず一覧を見てみましょう.

オペレータ一覧 ※1

マッピング 動作
c 変更する
d 削除する
y yankする

※1 他にもたくさんのオペレータがありますが,ここでは多用するこの3つにしぼります.

マッピング 範囲
aw iw word
a( i( a) i ) () ※2
a" i" ""
a' i' ''

※2 括弧の種類を変更すると対応した括弧に

これらを組み合わせることで,直感的にテキストを編集することが出来ます. 例えば, ciw としましょう. 覚えかたは, change inner word です. ちなみに,cawだと単語の外側の空白を含めて削除します.

Normalモードで以下のカーソル位置でciwすると

i am a hogep■ge
i am a ■

となります.

vimにおける,オペレーターcは,削除してインサートモードに入るを指します. すなわち変更するということですね.

ciwfoobarと入力することで

i am a hogep■ge
i am a ■
i am a foobar

となることがわかります. ciw,ci" di" ci' di' yiw 当たりはほんとによく使うので覚えておいて損はないです.

ここからは,上級生もあんまり使ってなさそうな機能を紹介していきたいと思います.

  • QuickFix

まずは,helpを見てみる.

=============================================================================
1. QuickFixコマンドの使い方                     quickfix Quickfix E42

Vimには編集-コンパイル-編集のサイクルを加速するための特別なモードがある。これ
はAmigaのManx's Aztec C compilerのquickfixオプションにインスパイアされた。Cコ
ンパイラから出力されたエラーメッセージをファイルに保存し、Vimでそのエラーにジャ
ンプするというアイディアである。エラーメッセージを全部覚えておかなくても、それ
ぞれの問題を検証し、修正することができる。

QuickFixコマンドはより一般的に、ファイル中の位置のリストを作成し、ジャンプする
ために使うことができる。例えば、:vimgrepはパターンにマッチした位置をリストす
る。スクリプト中でgetqflist()を使ってこれらの位置を参照することができる。
そのため、編集・コンパイル・修正のサイクル以外にも多くの事に利用できる。

AmigaでManx's Aztec C compilerを使っているなら、Vimと連携させる方法について
quickfix-manxを見よ。別のコンパイラを使用するならば、エラーメッセージを一度
ファイルに保存してVimを "vim -q filename" で起動する。これをする簡単な方法の1
つはコマンド:makeである (後述)。各コンパイラからのエラーメッセージを解釈させ
るためには、オプション 'errorformat' をセットする (下のerrorformatを参照)。

QuickFixは,makeやgrepの出力をwindowに出すことができ,表示された行の上で, <Enter>をタイプすることで,該当ファイルの該当行にジャンプすることができるというものだ.

よくあるのが,vimを一旦閉じ,コマンドラインagしてその結果を目で見て, ファイルを一つ一つ開き,再度vimを開き :行数 で該当箇所に移動している例. これ,vimgrepQuickFixを使えば,vimを閉じずに高速で同じことが出来ますよ!

f:id:maxmellon:20151211032418g:plain

他にも,makeやコンパイルの結果をQuickFixに出力することも出来ます. エラー位置一覧が出るので,すぐに修正が可能です!(多分名前の由来はここから)

f:id:maxmellon:20151211033136g:plain

QuickFix-windowを自動的に使う場合には以下の設定を追加します.

augroup QuickFixCmd
  autocmd!
  autocmd QuickFixCmdPost *grep* cwindow
augroup END

ctags

==============================================================================
5. タグファイルの書式                           tags-file-format E431

                                                ctags jtags
tagsファイルは "ctags" のような外部コマンドによって生成される。それはそれぞれ
の関数へのタグを含んでいる。"ctags" のあるバージョンでは "#defined" マクロや
typedef、enumなどに対してもタグを作ることができる。

コマンドラインctags -R .でタグを作成することができ, vim内で<C-]>をタイプすることで定義元にジャンプすることが出来ます. tagsfileの生成を自動化するプラグインもありますが, まずはvimの機能のみの状態で使うことをおすすめします.

f:id:maxmellon:20151211034536g:plain

関数の定義元にジャンプしたいときは,とても多くかなり作業効率を上げます. ctagsを使うことによってIDEにも負けない大胆な移動が出来ます.

まとめ

  • vim本来の機能だけですごく高機能.
  • pluginをよく理解せずに導入するのは危険,よくない.
  • /*連打を 多用するのではなく,vimgrepを使おう.
  • うちのサークルには,QuickFixを使うvimmerがほとんど居ない.もったいない.
  • もっとhelp読もう

この記事では,一部を除いて移動に関する機能を中心に紹介を行いました. サークルメンバもjを連打して移動するvimmerではなくて,少ないタイプ数で効率よくエディットできる,vimmerを目指しましょう!

Let's Vim Life !!!!!

参考サイト

http://www.infiniteloop.co.jp/blog/2011/11/vim-operator/

150日連続Contribute達成した.

f:id:maxmellon:20151108145658p:plain

githubのアカウントを作成(リニューアル)して,丁度今日で1年が経った. github上のContributionStreakも150日を達成した. 毎日コミットすることを意識してから,とても技術力が高まったように感じている.

150日前に出来なかったことで,今できるようになったことがとてもたくさんある.

などなど.

これからも毎日コミットすることを心がけていきたい.

毎日プログラミングすることで,自分自身の時間が少なくなっているのではないかと 思われがちだが,毎日コミットすることで開発力,開発速度が高まり, 逆に自分自身の時間も増えているように最近は感じている.

365日までに頑張りたいことは,今温めているWebアプリケーションを,完成まで持っていくことと, 新しく,electronを用いたクライアントアプリケーションの作成に挑戦したいと考えている.

最終的には,1000dayくらい目指したい.

リクルートのインターン行ってました

f:id:maxmellon:20150925151046p:plain

概要

recruit-jinji.jp

株式会社リクルートホールディングス サマーインターン2015のEngineerコースに参加しました.今回のインターンでは,興味のあるプロジェクトを予め選択し,そこでインターンを行うというものでした. 期間は,2015.08.19-09.19で,実務(最大)20日間というものでした.

この記事では,いろいろ迷った結果,最終報告会や懇親会で触れることのなかった僕の思いをつらつら ぽえむ していこうと思います.

良かった所とか

配属先

僕は,リクルートの中でもMTLというところに所属することになった.

mtl.recruit.co.jp

MTLは様々な方がいて様々な考え方があって,それに触れることが出来たのが良かった. 自分のメンターの方とその周りの方が,非常に個性的な考え方を持っている方が多くて かなり影響を受けた.メンターの方には,謙虚さと卑屈さの違いや,自信の持ち方など技術的な面以外でも多くのことを教わった.そして,メンターさんの指摘やアドバイスが的確ですぐに問題が解決してしまったり,すぐにフィードバックして取り組みたくなる力を引き出すのがすごくうまくて,やる気がすごい沸いた.

僕が気がついた点は,ものを教えるときに,ダメな点を指摘するのではなく,まず良い点をピックアップしてそれを引き立てるにはどうすればいいか,というスタンスで考えてくれていること.そのおかげで,すごく指摘を受けていて気持よかった.指摘を受けて気持ちがいいというのは初めての感覚だった.

隣のビルの地下には,カフェがあるのにも驚いた.そこは,ミーティングはもちろん,作業スペースでもあり,ふかふかのソファーがあった.ふかふかのソファーは眠くなるのであんまり使わなかった.

出勤時間

僕は,会社というものは必ず08:30に出勤して,09:00から働くものだとばかり思っていた.それ自体は,特に悪いことではないし単純に僕の思い込みであった. インターン初日に,自分の中では少し遅めの09:00を希望したら,驚かれて逆に僕がとても驚いた.10:00前後に出勤して,なんとなく観察していたけど本当に自由なんだなーと.

インターン生との出会い

僕は,普段東京に住んでいないので初めは都会の方と馴染めるかどうかすごく不安であった. しかも,周りの方が僕より圧倒的に賢いので頓珍漢なことをいいそうで怖かった.

結果としては,仕事中には一切関わることがないのに,めちゃくちゃ仲良く出来たのではないかと思う.こうやって仲良くできたのも,人事の方の企画のおかげなのかなって思いました.

時には,偶然すれ違ってクラフトビール飲みに行ったり,

時には,3人でクラフトビール飲みに行ったり,

時には,金曜日の深夜に二人でいきなり飲みに行ったり,

時には,ぎろっぽんの前でクラフトビール飲んだり.

すっかりクラフトビールにハマってしまった.

東京

最初はめちゃくちゃ怖かった. 神田駅からホテルに行くまでに,5分で到着するはずが45分迷ったり, 人が多いし,コンビニの店員はどこも外国の人. ちょっと遅い時間だと,キャッチ(?)に絡まれてあわあわするし. そういう都会ぐらしを30日間行ったことで,キャッチにはビビらないし,方向音痴はちょっと直ったと思う.強くなったのだ.たぶん.

話は変わって昼食.

職場が銀座にあった.しかも嬉しいことに,かなりの頻度で昼食を連れて行ってもらえるとか.それがとても美味しいかったです. おいしいだけではなく,様々な方とご飯に行けたのがとても良かったです. 毎日,書いていた日報に食レポを混ぜたくなるぐらいには.

f:id:maxmellon:20150925153354j:plain

f:id:maxmellon:20150925153520j:plain

f:id:maxmellon:20150925153647j:plain

人生で初めて食べるものもかなり多かった.

実際にやったこと

一人で,クラウドとアプリサーバーを繋ぐための画像サーバーAPIの構築をしました. 初めての言語PHP,初めてのフレームワークLaravel5,初めての環境(MacBook, USキーボード)で初めてだらけだったけど なんとかなりました.僕が好きなUMLを活かせたのが何より良かったです. PHPでも,意外とオブジェクト指向にちゃんとかけて,mix-inを実現するためのtrait等があったり,マジックメソッドとしてアクセサやコンストラクタを共通化できたりして,世の中で叩かれているイメージほど悪い言語ではないと感じました. 習得できて良かったです.

心残りとしては,deploy用のansibleのレシピを作るところまでやりたかったなぁと思っています.

感想

みんなもインターンに行こう!

zshでzの結果をpecoって爆速でディレクトリ移動する

記事書きました.

qiita.com

zがなんとなく使いにくいなあと思っていて, pecoと組み合わせたら便利そう!ってなりました.

なんだかんだで一番使うコマンドは,エディタの立ち上げorディレクトリ移動なので,かなり便利です.