GROUPエンジニアブログです。GROUP新卒エンジニアの井手上です!今回の記事はSkypeテキストチャットのためのコマンドラインインターフェースを作ろうという内容です。皆さんは仕事でのコミュニケーションにどのようなツールを利用していますか?事業部にもよりますが、私の所属するadingoプラットフォーム本部ではSkypeインスタントメッセージ(テキストチャット)を利用しています。Skypeの良い点は、やはり多くのプラットフォームで利用できるところです。WindowsやMac、Linux等のOSにとらわれずに誰でもチャットに参加できるのでエンジニアだけではなく、業務に関わる全員と効率的なやり取りが可能です。Skypeを活用するようになって出てきた問題が2点あります。黒い画面が恋しい私のSkypeのグループを見てみると、業務関係のグループであったり、エンジニアがプログラミングの話をするグループであったり、同期が集まってワイワイするグループであったりと、小さなものから大きなものまで多くのグループがあります。グループが多くなると、あるグループで会話が進んでいる裏で、別のグループでも進んでいるという状況が多くなり、カーソルでグループをポチポチ選択してから切り替える必要があります。このような場合はSkypeの画面を並べてチャットの一覧性を高めたくなりますね。(2)については好みによりますが、エンジニアの中には端末とかターミナルなどと呼ばれる黒くて地味な画面を愛してやまず、一瞬でも長く黒い画面と付き合いたい方が一定数います(自分調べ)。確かに操作がキーボードのみで完結しますし、zshのようなシェルを使用すると単語レベルでのカーソル移動ができたりと、Skypeのチャット入力画面よりも編集能力は高いかもしれませんね。長くなりましたが、結局下の図のようにテキストチャットを利用したいわけです。このさいきょうのSkypeを実現するために以下のことができる必要があります。コマンドラインからチャットを読んだり発言できたりする画面を分割できる(2)の「画面を分割できる」ですが、iTermやscreenの画面分割機能を使用すれば実現できそうです。(1)についてはこれといったものが見つからないのでオレオレSkypeコマンドラインインターフェース(CLI)をサクッと作っちゃいましょう。eventでアプリケーションと通信CLIを作るためのプログラミング言語は何であれ、Skypeアプリケーションにコマンドを送信してチャットの情報を取得したり発言する方法が必要です。eventを利用するとプロセス間通信でアプリケーションと対話できます。eventを利用した例です。RECENTCHATS"に注目してください。この例ではSkypeアプリケーションに"最近のチャットを探してください"というコマンドを送信しています。すると以下のようなメッセージが帰ってきます。#user2/user1;bc0710cb4a32bdc2CHATS以降、カンマで区切られた文字列は最近のチャットのIDを表します。あるチャットでの会話を取得したい場合は、"IDがXXのチャットの会話をください"とSkypeアプリケーションにまたコマンドを送信します。他にもいろいろなコマンドが用意されており、リファレンスが公開されています。http://dev.skype.com/desktop-api-reference発言したりメッセージを取得するだけでなく、電話もできるようですね。CLIをGitHubに公開しています。skype_chat-0.0.1.gemインストールするとskyというコマンドが利用できます。listと実行するとチャットの一覧が表示されます。トピック名があればトピック名が表示され、チャットに参加しているユーザーも最大3名まで表示しています。最初に"e4"や"86"と表示されている文字はチャットのIDになり、他のコマンドで利用できます。e4とチャットIDを渡すと、会話の内容が表示されます。e4とすると、新しいメッセージが投稿されたらそれを表示し続けます。こんにちは〜sendコマンドで発言を投稿できます。応用する会話を表示しているだけなのでgrepでフィルタリングしたりすることもできます。botを作ってみるのも良いかもしれませんね。"`date`"ぼくがかんがえたさいきょうのSkypeを実現するため、画面分割にはtmuxを使用しています。使用するとコマンド一発で設定しておいた画面構成にしてくれるので便利です。ここまで読んでいただきありがとうございました。Framework力を強化中です。Frameworkはサーバの設定を自動化するためのフレームワーク(chef、puppet)の事となります。本記事ではvagrantで作成した仮想環境に対して、chefでサーバ設定を行いSymfony2のwelcome画面を表示する事を行います。serverspecでテストが失敗する事を確認した後にサーバ設定を行い、テストが成功する事を確認するというテスト駆動的な手法を試してみました。vagrantの準備vagrantは仮想サーバ(virtualbox等)を操作するツールです。virtualboxとvagrantのインストールを行います。sandboxをonにします。vagrantに接続するためのsshの設定を行います。~/.ssh/config下記コマンドで仮想環境に接続できるようになっていれば成功です。serverspecのインストールと実行serverspecはサーバテスト用の機能を追加したrspecの拡張です。用意されたMatchersを利用する事でサーバのテストを簡潔に記述する事ができます。現在のバージョン(0.4.9)に用意されている機能は下記となります。cronエントリのテストコマンド実行結果のテストファイル/ディレクトリのテストLinuxカーネルパラメータのテストネットワーク設定のテストパッケージのテストポートのテストSELinuxのテストサービスのテストユーザ/グループのテスト仮想環境にログインしていなければログインしてください。仮想環境にserverspecをインストールします。git仮想環境でチェックアウトしたserverspec用ディレクトリに移動し、テストを実行するとテストが失敗する事を確認できます。手動でサーバ設定を行う事でserverspecのエラーを解消します。手順的な物を下記に用意しました。(めんどくさかったら飛ばしてください!)https://github.com/taka512/techblog20130523/blob/master/shell/install.txtエラーが解消すると下記のようになります。failuresURLにアクセスすると画像のような画面が表示されれば成功です。chefからのサーバ設定chefを利用したサーバ設定を行います。chefは大規模向けのchef-serverと中小規模向けのchef-soloの2種類が存在します。今回はchef-soloの方を利用します。仮想環境から抜けて下記コマンドを実行し、仮想環境を手動でのサーバ設定前の状態に戻します。rollback仮想環境にログインして環境がロールバックしてテストがエラーになる事を確認します。exit仮想環境を抜けてmacにchef-soloの実行環境を準備します。knifeはchefの管理コマンドでリモートでchefを実行するために必要なコマンドです。devなんということでしょう。環境が構築されてしまいました。まとめserverspecを使ってみるとサーバ設定のユニットテスト的な使い方に良さげで扱いやすかったです。アプリ側も昔(5~10年ぐらい前)はテストを記述するのが当たり前という風潮ではなかったと思いますが、今は小学生でもテストを書くよね!って風潮になってきていると思います。DevOpsと言いつつもインフラエンジニア任せになってしまっている現状があるかなと思います。requestでの修正取込等でDevOpsを進めやすくなると思います。今後、弊社でも取り組んでみたいなと思いました。参考kayacでは新卒研修で取り入れているらしく、今回はその話に感化されて試してみました。https://github.com/kayac/newbie-trainingその他参考下記も参考にしました。