mikutterの投稿ボックスを強化するプラグイン: mikutter_shell_post

mikutter_shell_postとは

特定の宛先に向けたリプライをコマンドとして解釈し,実行するプラグインです.C++Haskellのコードをコンパイルして実行したりもできます.また,式展開機能もあるので,気軽に使えるプラグインでもあります.現在存在している中では,おそらく最も気持ち悪い部類のmikutterプラグインの1つでしょう.

インストール方法

下記のコマンドを実行するだけです.

mkdir -p ~/.mikutter/plugin
cd ~/.mikutter/plugin
git clone git://github.com/penguin2716/mikutter_shell_post.git

機能紹介

mikutterコマンドの実行

@systemに向けたリプライはmikutter内部で実行され,実行結果がシステムメッセージとしてタイムラインに流れてきます.

@system
10.times do |x|
  Plugin.call(:update, nil, [Message.new(:message => "count#{x}", :system => true)])
end
シェルコマンドの実行

@shellに向けたリプライはシェルコマンドとして認識され,シェルでの実行結果がシステムメッセージとしてタイムラインに流れてきます.

@shell uname -a

@shellに向けたコマンドには自動的にtimeout 10が先頭についているので,pingのようなコマンドをうっかり叩いてしまってもちゃんと終了します.これでは端末を開いたりするときに都合が悪くなるので,@shell_p宛のコマンドはtimeoutしないようになっています.

@shell_p urxvt
RubyPythonPerlの実行

@shell_rb,@shell_py,@shell_plに向けたリプライはそれぞれRubyPythonPerlのコマンドとして解釈されます.

@shell_rb
10.times do |x|
  puts "count #{x}"
end
@shell_py
for i in range(10):
  print "count%d" % i
@shell_pl
for ($i = 0; $i < 10; $i++) {
    print "count$i\n";
}
C,C++のコードの実行

@shell_cと@shell_cppにむけたリプライはC,C++のコードとして解釈され,コンパイル後に実行されます.

@shell_c
#include <stdio.h>
int main(int argc, char **argv)
{
	printf("Hello, world!\n");
	return 0;
}
@shell_cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv)
{
	cout << "Hello, world!" << endl;
	return 0;
}
任意のスクリプト言語の実行
@script 実行コマンド
コード...

の形式ですると,コードがファイルに書かれ,実行コマンドで実行されます.gnuplotの例では以下のようになります.

@script gnuplot -p
v0 = 0
g = 9.8
set yrange [0:10]
set xrange [0:2]
set xlabel "time [sec]"
set ylabel "height [m]"
set title "Free Fall"
unset key
plot v0 * x + 0.5 * (-g) * x **2 + 10 linewidth 2


任意のコンパイル言語の実行
@compile [保存するファイル名] [実行時のコマンド] コンパイルコマンド
ソース...

の形式で投稿すると,ソースがファイルに書かれてコンパイルされ,実行されます.実行結果はmikutterのシステムメッセージとしてタイムラインに流れてきます.

@compile [src.cpp] [timeout 10 ./a.out] g++ -O3 -march=native
#include <iostream>
using namespace std;
int main(void)
{
  cout << "Hello, world!" << endl;
  return 0;
}

ちなみに,コンパイルに失敗すると次のようなシステムメッセージがタイムラインに流れます.

src.cpp: In function ‘int main()’:
src.cpp:7:1: error: expected ‘;’ before ‘}’ token

JavaGUIを作ることもできます.

@compile [Hello.java] [java Hello] javac
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Hello {
  public static void main(String args[]) {
    JFrame frame = new JFrame("Java on mikutter");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new BorderLayout());
    frame.setSize(250,100);
    JButton button = new JButton("Exit");
    button.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        System.exit(0);
      }
    });
    frame.add(new JLabel("Java on mikutter"), BorderLayout.NORTH);
    JPanel panel = new JPanel();
    panel.setLayout(new FlowLayout(FlowLayout.CENTER, 20, 20));
    panel.add(button);
    frame.add(panel, BorderLayout.CENTER);
    frame.setVisible(true);
 }
}


Google検索とか

ブラウザとの連携もできます.Googleでmikutterを検索するには

@google mikutter

東京から京都までの電車を調べるには

@maps 東京から京都

特定のURLを開くには

@openurl http://bit.ly/teokure

のように入力してすると,ブラウザで目的のページが表示されます.

式展開機能

Rubyでは,文字列中等で#{...}のような括弧の中に式を記述すると,内部の式が先に評価されます.シェルスクリプトでいうバッククォートと似ていますね.このプラグインをインストールすると,式展開機能が使えるようになります.

次のように入力してしてみます.

2 ** 10 = #{2 ** 10}
2 ** 20 = #{2 ** 20}
2 ** 30 = #{2 ** 30}
2 ** 40 = #{2 ** 40}
2 ** 50 = #{2 ** 50}

すると,#{2 ** 10}が展開され,次のようになります.

2 ** 10 = 1024
2 ** 20 = 1048576
2 ** 30 = 1073741824
2 ** 40 = 1099511627776
2 ** 50 = 1125899906842624