‒⁨⁡⁞†‣‒⁛⁝⁧⁦⁦⁗⁤ ↝ᕓⅳஜС˺‫ۀ‬Ճ˟‒ ዻ‒↮→ⅾ↮ⅾ↙ ⁦⁩⁛⁦⁦⁗⁤ ⇕∏⇊⇈∙⇮≝ ⁛⁝⁧⁦⁦⁗⁤‒
mikutter ࢖ࣥࢫࢺ࣮ࣝ᪉ἲࠊmikutter ࣉࣛࢢ࢖ࣥไస᪉ἲ ➼Rateing: Teokurated㸦࡚࠾ࡃࢀ࣭࡚࠾ࡃࢀೃ⿵⏕௨እ㉎ධ࣭㜀ぴ⚗Ṇ㸧1௻ᴗ㺀Twitter ࢡࣛ࢖࢔ࣥࢺࡣά⏝ࡋ࡚ࡿ㸽㺁ЎᏛ⏕㺀ࡣ࠸㺁
Ў௻ᴗ㺀ࡌࡷ࠵ྡ๓᭩࠸࡚㺁ЎᏛ⏕㺀mikutter㺁Ў௻ᴗ㺀㺩㺽㺊㺏㺏㺏㺏㺏㺏㺏㺏㺏㺏㺏㹵㹵㹵㹵㹵㹵㺁@toshi_a , ᖹᡂ 23 ᖺ 11 ᭶ 30 ᪥ࡇࡢࠕⷧ࠸ᮏࠖࡢ┠ⓗ࣭mikutter ࡢṔྐࠊᑗ᮶ࠊmikutter ࡬ࡢពぢࠊ࡚࠾ࡃࢀ࡜ mikutter ࡢ࢝ࣥࢣ࢖ࠊ࡜ࡋ࠵ࡀ࢔࣊ࡿₔ⏬㍕ࡏࠊmikutter ࡢ࡚࠾ࡃࢀ࡞ࣁࢵࢸࣥ࡟㈨ࡍࡿ  ࡢࡀᮏ᮶ࡢ┠ⓗࡔࡗࡓࡼ࠺࡞ࠋ

mikutter ࡢⷧ࠸ᮏไసጤဨ఍ ⦅ ࠕmikutter ࡢⷧ࠸ᮏ vol.1ࠖࡢᴫせ࣭mikutter ࡜⚾࡜࡚࠾ࡃࢀ(p.3-4)
࣭ࡩ࠵ࡰࡼࡋ #NDWV\RVKL ࡟ࡼࡿ+RZ7R,QVWDOO0LNXWWHU" S ∝࡚࠾ࡃࢀ࡜ࡋ࠵ #WRVKLBD ࡟ࡼࡿ :ULWLQJPLNXWWHUSOXJLQ S 2

1.mikutter ࡜ࡣ
mikutter ࡜ࡣ ࡳࡗࡃࡳࡃ࡞ twitter ࢡࣛ࢖࢔ࣥࢺ࡛࠶ࡿࠋࡑ࠺ࠊࡑࡢ⾲⌧࡛࠸࠸ࡔࢁ࠺ࠋ
ୡࡢ୰࡟ࡣᫍࡢᩘ࡯࡝ࡢ twitter ࢡࣛ࢖࢔ࣥࢺࡀ࠶ࡾࠊࡑࡢ twitter ࢡࣛ࢖࢔ࣥ
ࢺࡢ୍ࡘ࡟㐣ࡂ࡞࠸ࠋ࡛ࡣఱᨾࡑࡢ mikutter ࡟ࡇࢀ࡯࡝㎾ഴಽࡋࠊⷧ࠸ᮏࢆฟ
ࡋ࡚ࡋࡲ࠺࡟⮳ࡗࡓࡢ࠿ࠋ඼ࢀࢆ⪃࠼࡚ࡳࡼ࠺ࠋ

࣭ࡳࡗࡃࡳࡃ࡛࠶ࡿࡇ࡜
๓㡫᭱ᚋࡢ URL ࢆぢ࡚㡬ࡅࡤศ࠿ࡿࡀࠊ࡝ࡇ࡟ࡳࡗࡃࡳࡃせ⣲ࡀ࠶ࡿࡢ࠿ࡕࡗ
࡜ࡶࢃ࠿ࡽ࡞࠸ࠋfaq ࡟ࡣࠕ䝭䜽せ⣲䛜䛒䜚䜎䛫䜣䛃䛂ហ䛛⪅䜑…▱䜙䛪▱䜙䛪䛾䛖䛱䛻⢭⚄䛜⼃䜎䜜䛶䛔䜛䛣䛸䛻䜒Ẽ䛵䛛䛺䛔䛸䛿…䚹 䛃㻌 ࡜࠶ࡿ࡯࡝ࠋ࡞ࡿ࡯࡝ࠊ
ఱࡶศ࠿ࡽ࡞࠸ࠋ
࡞ࢇ࡜ࠊᐇ㝿࡟౑ࡗ࡚ࡳ࡞࠸࡜ศ࠿ࡽ࡞࠸ࡳࡗࡃࡳࡃࢡࣛ࢖࢔ࣥࢺࠋ
ࡩ࠵ࡰ(Favorite:࠾Ẽ࡟ධࡾ࡟Ⓩ㘓ࡍࡿࡇ࡜)ࡽࢀࡓࡇ࡜࡛㏻▱ࡀ࡛ࡿࡤ࠿ࡾ࡛
࡞ࡃࠕࡩ࠵ࡰࡗ‫ࡀࢡ࣑࡜ࠖݜ‬ႅࡿࠋReTweetࠊReply ࡛ࡶྠࡌࡼ࠺࡟
ࡑ࠺ࠊ࠶ࡢึ㡢࣑ࢡࡀࠊྍឡࡽࡋࡃ㏻▱ࡋ࡚ࡃࢀࡿࡢࡔ㸟ึ㡢࣑ࢡ࡟ࡼࡾᑟ࠿ࢀࡓ࡚࠾ࡃࢀ㐩ࡀࠊࠕ▱ࡽࡎ▱ࡽࡎࡢ࠺ࡕ࡟ࠖࡼࡾ࡚࠾ࡃ
ࢀ࡚ࠊഴಽࡍࡿ࡯࠿࡞࠸≧ែ࡟㝗ࡿࡢ࡛࠶ࡿࠋ

࣭Linux ࡛౑࠼ࡿࡇ࡜
Linux ࡞ࢇ࠿౑࠺ࡢ࡜ப࠺ࡢࡣᚚᑬࡶ࡞ពぢ࡛࠶ࡿࠋᐇ㝿ࠊᩥ⣔࡟ࡣṤ࡝ᒃ࡞࠸ࠋ↛ࡋ Linux ࢆ౑ࡗ࡚࠸ࡿே࡛࠶ࢀࡤ twitter ࢡࣛ࢖࢔ࣥࢺࡉ࠼᥈ࡍࡇ࡜࡟
ⱞປࡍࡿ࡯࡝࡟↓࠸ࠋ࢖ࣥࢫࢺ࣮ࣝ࡟ࡘ࠸࡚ࡣᚋ㏙ࡍࡿࠋ
Linux ࡛౑࠼ࡿࡤ࠿ࡾ࡛࡞ࡃࠊ࠸ࡲ࡛ࡣᵝࠎ࡞ࢹ࢕ࢫࢺࣜࣅ࣮ࣗࢩࣙࣥࠊOS ࡬࡜⛣᳜ࡉࢀ࡚࠸ࡿࠋ࡞ࡿ࡯࡝࣮ࣘࢨ࣮ࡀቑ࠼ࡿヂࡔࠋᩥ⣔࡟ከ࠸࡜⪃࠼ࡽࢀࡿ Windows ࡟ࡘ࠸࡚ࡣḟࡢ࣮࣌ࢪ࡟ࡕࡻࡇࡗ࡜᭩࠸࡚
࠾ࡃࠋ࣭ࢡࣛ࢖࢔ࣥࢺ〇స⪅ࡀ㠃ⓑ࠸ࡇࢀࡀ᭱ࡶ⌋ࡋ࠸ࡇ࡜࡛࠶ࡿࠋ twitter ࡛ @toshi_a (௨ୗࠊ࡜ࡋ࠵ࡉࢇ࡜࿧ࡪ)ࢆࣇ࢛࣮ࣟࡍࢀࡤ୍┠░↛ࠋᙼࡀ㠃ⓑࡍࡂ࡚ᾦࡀฟࡿࠋmikutter ࣮ࣘࢨ࣮ࡣ
mikutter ไస⪅࡛࠶ࡿ࡜ࡋ࠵ࡉࢇࢆᘝࡿࡇ࡜࡛ᴦࡋࡵࡿࠋࡇࢇ࡞ࢧ࣮ࣦ࢕ࢫࢆ
ᥦ౪ࡍࡿ࡜ࡋ࠵ࡉࢇࠊ㠀ᖖ࡟࡚࠾ࡃࢀࡔࠋ

3

2.mikutter ࡜⚾࡜࡚࠾ࡃࢀ
ࢃࡓࡋࡀ mikutter ࡟᥋ࡋ࡚ࡋࡲࡗࡓཎᅉࡣ▱ࡾྜ࠸ࡢ▱ࡾྜ࠸ࡢ▱ࡾྜ࠸ࡢ▱ࡾྜ࠸ࡀ࡜ࡋ࠵ࡉࢇࡔࡗࡓࡇ࡜ࡔࠋ
㛫࡟ Gentoo 㐵࠸࡜࠿ࡀᒃࡓࡼ࠺࡞㸦ờᙜ᫬ twitter ࢡࣛ࢖࢔ࣥࢺࢆ౑ࡗ࡚࠸࡞࠿ࡗࡓ⚾ࡔࡀࠊ࡜ࡋ࠵ࡉࢇࡀ㠃ⓑࡃ࡚௙᪉↓࠿ࡗࡓ㸦㸽㸧ࠋẁࠎ࡜ᙼࡢே᯶࡟㨩࠿ࢀࠊఱ᫬ࡢ㛫࡟࠿ᙼ࡜ኪࢆඹ࡟ࡍ
ࡿ௰࡟ࣁࢵࢸ࣭࣭࣭ࣥࠋᖹᡂ 24 ᖺࢆ࡜ࡋ࠵ࡉࢇ࡜㏄࠼࡚ࡋࡲࡗࡓࠋᒃ㓇ᒇ࡛ࠋ
mikutter ࣮ࣘࢨ࣮࡟ࡣ⊂≉ࡢ㞺ᅖẼࡀ࠶ࡿࠋࡲࡎࠊࡳ࡞ཱྀࢆᥞ࠼࡚ゝ࠺ࡢࡣࠕ࡚
࠾ࡃࢀ࡚࠸ࡿࠖࠋ͇࡚࠾ࡃࢀ͇࡜ࡣ࡞ࢇ࡞ࡢ࠿ࠋ
ࡇࢀ࡟ࡘ࠸࡚ࡣ࡜ࡋ࠵ࡉࢇࡢⓎゝࢆࡶ࡜࡟⪃࠼ࡿᚲせࡀ࠶ࡿࠋ௨๓᯾ே㸦⌧ᅾᙜヱ࢔࢝࢘ࣥࢺࡣ᢯ᾘࡉࢀ௚ࡢ࢔࢝࢘ࣥࢺ࡟⛣ࡗ࡚࠸ࡿ㸧ࡀࠊ࡜ࡋ࠵ࡉࢇ࡟ࠕ࡚࠾ࡃࢀࠖ࡜பࡗࡓࡇ࡜ࡀ➃⥴࡛࠶ࡿ࡜ࡉࢀࡿࠋ௨㝆ࠊ࡜ࡋ࠵ࡉࢇࡢᅛ᭷ྡモࡀࠕ࡚࠾ࡃࢀࠖ࡜࡞ࡾࠊࡲࡓᙼࡢసࡗࡓࢡࣛ࢖࢔ࣥࢺ͇mikutter͇ࡢ࣮ࣘࢨ࣮ࡶࡲࡓࠊ࡚࠾ࡃࢀ࡛࠶ࡿ࡜ࡉࢀࡿࠋ㎡᭩ࢆࡦ࠸࡚࠾ࡃࢀࠋࡑࡇ࡟ព
࿡ࡀ㍕ࡗ࡚࠸ࡿࡔࢁ࠺ࠋ
᪥ᖖⓗ࡟ࠕ࠶࠵ࠊ࡚࠾ࡃࢀࡔ࡞ࠖ࡜ᛮࢃࢀࡿ⾜ືࢆࡋࠊtweet ࢆࡍࡿࠋࡓࡔࡇࡢ
୍Ⅼ࡞ࡢ࠿ࡶࡋࢀ࡞࠸ࠋ
mikutter ࣮ࣘࢨ࣮௨እ࡟ࡶ࡚࠾ࡃࢀࡣᒃࡿࡋࠊmikutter ࣮ࣘࢨ࣮࡛ࡶ࡚࠾ࡃࢀ
࡛࡞࠸ே㛫ࡶᒃࡿࠋࡓࡔఱ࠿ࡋࡽ࡚࠾ࡃࢀ࡜ចࡁྜ࠺ேࡀࠕ࡚࠾ࡃࢀࠖ࡞ࡢࡔ
ࢁ࠺ࠋࡇࡢ෉Ꮚࡶ஦๓࡟ィ⏬ࢆ⦎ࡾ༑ศ࡞”㔞”࡜”㉁”ࢆᥦ౪ࡍࡿࡘࡶࡾࡔࡗࡓࠋ
↛ࡋ⌧ᐇ࡟ࡣዴఱࡔࢁ࠺ࠋࡲ࡜ࡶ࡞グ஦ࢆ᭩࠸ࡓࡢࡀ 2 ྡ㸦ᙼ➼࡟ࡣ㢌ࡀୖࡀࡽ࡞࠸ࠋ௒ᗘ࢝ࣛࢲ࡛ሗ㓘ᡶ࠸ࡲࡍ㸧࡛࠶ࡿࠋ௒ᗘ෉Ꮚࢆฟࡍࡼ࠺࡞ᶵ఍ࡀ࠶
ࢀࡤࡶࡗ࡜ࡲ࡜ࡶ࡞ࡶࡢ࡟௙ୖࡆࡓ࠸࡜ᛮ࠺ࠋ᫝㠀࡜ࡶḟ࡟ᮇᚅࡋ࡚࠾ࡃࢀࠋ

memo:mikutter ࢆ Windows ࡟ᑟධࡍࡿ࡟ࡣ
mikutterwindows ࠶ࡓࡾ࡛ࢢࢢࢀࡤࡑࢀ࡞ࡾ࡟᪉ἲࢆ♧ࡋࡓࡶࡢࡀฟ࡚ࡃ

ࡿ➻ࡔࡀࠊྲྀࡾᩒ࠼ࡎࠊ(ࣃࢯࢥࣥ࿘ࡾࡢ▱㆑ࡀ඲ࡃ࡞࠿ࡗࡓ)➹⪅ࡢࡸࡗ࡚࠸ࡿ
᪉ἲࢆ⡆༢࡟࣓ࣔࠋࡲࢃࡾ࡟ࡇࢇ࡞ࡇ࡜ࡸࡗ࡚࠸ࡿேࡶᒃ࡞࠸ࡽࡋ࠸ࠋ
1. Windows ࡟ VMware Player ࢆ install
2. Ubuntu ࡢ iso ࢖࣓࣮ࢪࢆ download
3. VMware Player ࡟࡚ Ubuntu ࢆ⏝࠸࡚௬᝿࣐ࢩࣥࢆ❧࡚ࡿ
4. mikutter ࢆ download
5. ࠶࡜ࡣ mikutter ࡢ ReadMe ࢆㄞࡵࡤ࠸࠸࡜ᛮ࠺ࡼࠋ


4How to Install Mikutter?
@katsyoshi

1 はじめにこの文書では，mikutter[1] をインストールし実行する方法について書いてあります．ここでは，Linux(2.2),

FreeBSD(2.3), Mac(2.4) におけるインストール方法について述べます．

2 インストール
インストール方法についてある程度まで実行できるようにします．

2.1 必須アプリケーション
mikutter を動かすためには，以下のアプリケーションが必要となります [2]．
• ruby-1.9.2 以上• x11• gtk2• Open SSL• Subversion
これらのアプリケーションは mikutter をインストールする前にインストールします．mikutter を動かすために必要ではないが，subversion をあげておく．この文書で mikutter は，基本的に trunk 版を推奨する．

Ruby はパッケージからでもインストールできますが，提供されてる Ruby のパッケージが 1.8 系となっているディストリビューションも多いので，ここでは，RVM(Ruby Version Manager) について 2.1.1 で述べます．

2.1.1 RVM:Ruby Version Manager
mikutter をインストールする前に Ruby の実行環境を RVM(Ruby Version Manager)[3] を用いて構築します．Linux の一部ディストリビューション，FreeBSD では必要ありませんが，ここでは，一応説明します．

RVM の公式サイトを参考に RVM をインストールし，Ruby の最新版をインストールします．
$ bash −s s t a b l e < <( c u r l −s \h t t p s : / / raw . g i t h u b . com/ wayneeseguin /rvm/ master / b i n s c r i p t s /rvm− i n s t a l l e r )$ rvm i n s t a l l 1 . 9 . 3 −−d e f a u l t

RVM をインストールするには，curl, gcc などが必要になりますので RVM の公式サイトを参考にインストー
ルしてください．

2.2 Linux
まず，Linux でのインストール方法について説明します．Linux では，Ubuntu Linux(2.2.1) と Gentoo

Linux(2.2.2) について説明します．
2.2.1 Ubuntu Linux
Ubuntu では，README の通りにいけますが，ここでは，RVM を用いてインストールします．そのまえにまず，必要なアプリケーションをインストールします．

$ sudo apt−g e t update$ sudo apt−g e t upgrade$ sudo apt−g e t b u i l d −dep ruby$ sudo apt−g e t i n s t a l l l i b g t k 2 .0− dev
必要なアプリケーションをインストールする前に OS を最新の状態にします．つぎに，Ruby をビルドするために必要なアプリケーションをインストールします．そして，libgtk2.0-dev をインストールします．これは，gem から ruby-gtk2 をインストールするために必要です．
RVM をインストールしてください (2.1.1)．RVM をインストール，ruby-1.9.3 のインストールが完了した
ら，つぎに gem から必要なライブラリをインストールします．

$ gem i n s t a l l gtk2
これで必要なものがインストールできました．

2.2.2 Gentoo Linux
Gentoo では，すでにパッケージが用意されてますので，コマンドを入力するとインストールできます．
$ emerge m i k u t t e r
でインストール終了です．

2.3 FreeBSD
FreeBSD も Gentoo(2.2.2) と同様に ports が提供されていますので，簡単にインストールできます．
$ cd / u s r / p o r t s / net−im/ m i k u t t e r# make i n s t a l l
でインストール終了です．

2.4 Mac
Mac では，Macports か Homebrew を用いて必要なライブラリをインストールします．ここでは，Homebrew と RVM を用いた方法について述べます．

まず，Homebrew から必要なライブラリをインストールします．

$ brew i n s t a l l gtk s u b v e r s i o n$ gem i n s t a l l gtk2
準備はこれで終わりですが，日本語入力用に MacUIM をインストールする必要 2.4.1 があります．

2.4.1 MacUIMMacUIM[4] は，Mac の X11 で日本語入力するためのアプリケーションです．MacUIM のインストールは，
公式サイトから最新版の dmg をダウンロードします．
公式サイトからダウンロードし，インストールが完了すると，つぎに MacUIM の設定を行ないます．

MacUIM を X11 でも使えるよう [5] にまず，X11 の/usr/X11/lib/X11/xinit/xinitrc を/̃.xinitrc へコピーします．コピーしたら，つぎの一行を追加します．

/ L i b r a r y / Frameworks /UIM . framework / V e r s i o n s / Current / b i n /uim−xim &これは，uim をバックグラウンドで起動します．つぎに，.MacOS ディレクトリを作成し，以下の内容でenvironment.plist を作成します．
<?xml v e r s i o n =”1.0” e n c o d i n g=”UTF−8”?><!DOCTYPE p l i s t PUBLIC ”−//Apple Computer //DTD PLIST 1 . 0 / /EN”
” h t t p : / /www. a p p l e . com/DTDs/ P r o p e r t y L i s t − 1 . 0 . dtd”>< p l i s t v e r s i o n =”1.0”><d i c t ><key>LANG</key><s t r i n g >j a J P .UTF−8</ s t r i n g ><key>GTK IM MODULE</key><s t r i n g >uim</ s t r i n g ><key>XMODIFIERS</key><s t r i n g >@im=uim</ s t r i n g ></ d i c t ></ p l i s t >最後に X11 起動時に UIM が起動するように/usr/X11/lib/X11/xinit/xinitrc.d/20-uim.sh を作成します．

IM=/L i b r a r y / Frameworks /UIM . framework / V e r s i o n s / Current / b i n /uim−xim[ −x $IM ] && $IM &これで Mac での日本語入力が可能となります．

2.5 mikutter のダウンロード
Gentoo Linux や FreeBSD を利用していない場合は，以下の SVN を用いて最新版 (開発版) をダウンロードします．

$ svn c l o n e svn : / / t o s h i a . d i p . j p / m i k u t t e r / t r u n c m i k u t t e r

3 実行
実行は，インストールした方法により変わってきます．Gentoo Linux や FreeBSD では，コマンドラインに mikutter と入力するだけで実行できます．RVM を用いた場合では，$ cd m i k u t t e r$ ruby m i k u t t e r . rbと入力することで実行することができます．

4 まとめ
mikutter のインストール方法について，簡単ですが述べてきました．mikutter を動作させるために，rubyなどの必要なアプリケーションのインストール，RVM を用いた Ruby のインストールについて説明をし，OSごとのインストール方法について書きました．
つたない説明で分かりずらいと思ますので，Twitter で@katsyoshi にリプライを投げてくださると反応す
ると思います．

参考文献[1] mikutter: http://mikutter.hachune.net[2] README: https://github.com/katsyoshi/mikutter[3] RVM: http://beginrescueend.com/[4] MacUIM: http://code.google.com/p/macuim/[5] 猫にルビー X11 上の日本語入力環境を構築する: http://catruby.blog83.fc2.com/blog-entry-10.html

Writing mikutter plugin@toshi a

はじめに

1

Ruby で mikutter を拡張する方法についてです。
mikutter はサードパーティの「プラグイン」を追加して、あとから機能を追加することができます。
本文章では、四つの事例を取り上げて、プラグインを作るための大まかな方法を説明します。
サンプルコードは、 https://github.com/toshia/writing-mikutter-plugin にこのドキュメントの最新版があるので、そこから取得してください。

1.1

プラグインの動かし方

mikutter のプラグインをインストールするには、 ˜/.mikutter/plugin の直下に拡張子 .rb で終わる
ファイルを置くか、プラグイン名のディレクトリを作成し、その中に プラグイン名.rb という名前のファイルを設置する方法があります。後者の方法を使うと、git などでプラグインごとにバージョン管理が容易になりますし、プラグイン自体を複数のファイルに分割することができます。
尚、 ˜/.mikutter/plugin は、最初は存在しないので、以下のようにして作成します。
$ mkdir ~/.mikutter/plugin

特定の時間にツイートする

2

このセクションでは、特定の時間に定型文をツイートする、bot のようなプラグインを作成します。

2.1

コード例

# -*- coding: utf-8 -*# say "よるほー"# よるほーの例です。あくまで Reserver のデモンストレーション用に作りました。
# なので実戦投入はしないこと。よるほーは自分でタイミングを合わせることにこそ意義があるのです。

1

Plugin.create :yoruho do
def main
Reserver.new(nextyrhtime){
say_yoruho(Post.primary_service)
sleep 1
main } end# 次回のよるほー時間を取得
def nextyrhtime
now = Time.new
result = Time.local(now.year, now.month, now.day, 0, 0)
while result < now
result += 86400 end
result end# よるほーとつぶやく
def say_yoruho(service)service.update(:message => ’ ておほー’) end
main
end

解説

2.2

ほぼすべてのプラグインは、以下のテンプレートから作り始めることになります。

Plugin.create :プラグイン名 do(プラグインの定義)
end
Plugin.create は、プラグインをコアに登録します。また、ブロック内でプラグインを実装するための様々なメソッドを提供しています。この中で変数や関数を定義すれば外のスコープも汚さないので、基本的にはこのブロックの中だけでプラグインは完結させるべきです。
2.2.1

メソッドの定義

ブロックの中は、すぐに Plugin のインスタンスの中で評価されます。def でメソッドを定義して、メソッドの内外で呼ぶことができます。例では main と next yrh time と say yoruho を定義していますね。

2.2.2

文字列を投稿する• Post オブジェクト
自動投稿を実現するためには、Post クラスのインスタンスを得ます。Post クラスは、Twitter APIのラッパで、ログインしている Twitter アカウントの数だけインスタンスがあります。なので、プラグインがこのクラスを new することはありません。
これを書いている現在では、mikutter は１つのアカウントでしかサインアップできないということになっているので、以下のように書けば、Post クラスを得ることができると覚えておいてくだ
さい。

Post.primary_service
mikutter はそのうち複垢対応しますが、そうなったらこのメソッドは、現在アクティブな (選択されている) アカウントの Post を返します。
• update
Post#update で、ツイートが投稿されます。
Post.primary_service.update(:message => "ツイートの本文")
ツイートの投稿は非同期で行われるので、処理がここで止まるということはありません。

2.2.3

Reserver 予約実行

特定の時間に処理を実行したいことがあります。今回の場合だと、毎日 0:00:00 に、よるほーとつぶやくコードを実行したいわけです。そういう時は、mikutter が提供している Reserver を使います。
String, Time, Integer のいずれかの値を渡します。
String の場合は Time.parse() された値が使われ、Time を渡すと、その時刻になったら実行します。
過去の時刻を渡すとすぐに実行されます。

Reserver.new("10:00"){ 朝 10 時に実行 }Integer の場合は、その秒数待ってから実行します。
Reserver.new(30){ 30 秒後に実行 }Reserver.new(HYDE){ 156 秒後に実行 }今のところ、Reserver のブロックは、メインスレッド以外のスレッドで実行されます。非同期処理によるバグには気をつけてください。

特殊なタイムライン

3

現在の mikutter の UI は、以下のような構成です。

ウィンドウが一つ有り、その中にユーザは任意の個数のペインを作ります。ペインの中には１つ以上のタブがあり、タブの中身はプラグイン次第ですが、基本的にはタイムラインが入っているはずです。
このセクションでは、特殊な抽出条件を持ったタイムラインを作成します。タイムラインを用いたあらゆるプラグインに応用できる知識です。

3.1

コード例

# -*- coding: utf-8 -*# mikutter についてフォロイーが言及したら、しばらく TL に入れる
Plugin.create :gossip_detector do
EXPIRE = 300
main = Gtk::TimeLine.new()# 5 mingossip_users = {}# TL タブの登録
onboot do |service|
Plugin.call(:mui_tab_regist, main, ’Gossip Detector’, MUI::Skin.get("timeline.png"))end# ツイートの受信、振り分け
onupdate do |service, messages|
main.add message.select { |m|if m.to_s =~ /mikutter|みくった/
gossip_users[m.user] = Time.now + EXPIRE
true
else
gossip_users.has_key?(m.user) and gossip_users[m.user] > m[:created]
end
}
end
end

3.2

解説

このプラグインは、タイムラインをひとつ作って、フォロイーが mikutter について何か言及したら、そのツイートをそのタイムラインにも表示します。これだけだと、現在 mikutter に標準で入っている
extract plugin と同じですが、このプラグインはその人のツイートを、マッチしたツイートから 5 分間の間は、無条件にタイムラインに入れます。
最初に mikutter の名前を出して、あとでツイートを小分けにして mikutter について言及しているかもしれないからです。そんなことないかもしれませんが、こんな変なフィルタも書けるんだよというデモなので勘弁して下さい。

3.2.1

イベントの待受

ユーザや Twitter から何かしらの入力があれば、mikutter 内ではイベントが発生します。ほとんどのプラグインは、このイベントを受け取って何かを実行することで、目的を達成します。Plugin.create のブロック内に、以下のように書けば、イベント event が発生したときに 処理 が実行されます。その際、引数は params にセットされます。

onevent do |params|

# 処理
end
onevent は、 on event と書いても event を待ち受けます。イベント名が長いなど、つなげて書
くと読みづらい場合は、間にアンダーバーを入れるパターンを使ってもいいかもしれません。引数は、イベントによって異なります。 mikutter プラグインの開発にとってイベントはとても重要なものですが、数が多いので、このあと出てくるぶんについても逐一解説はしません。各イベントについて知りた
い場合は、RDoc のイベント・フィルタリファレンス http://mikutter.hachune.net/rdoc/Plugin.html
を参照してください。ただし、これが mikutter のすべてのイベントを網羅しているわけではありません。プラグインが新しい種類のイベントを定義することができるからです。
3.2.2

タイムライン

タイムラインをタブに登録するには、タイムラインウィジェットを作成し、それを GUI プラグインに渡してやる必要があります。

• タイムラインウィジェット
タイムラインウィジェットを作成するのは簡単です。以下のように書きます。

timeline = Gtk::TimeLine.new
これで、表示するタイムラインの準備が出来ました。

• イベントを発生させる
タイムラインウィジェットは、確保したあと GUI プラグインに送らないと表示されません。GUI
プラグインにウィジェットを送るためには、mui tab regist イベントを発生させてやる必要があります。

GUI プラグインは、 mui tab regist イベントを監視していて、イベントが発生したら引数のタ
イムラインウィジェットをペインに追加するようになっています。
timeline = Gtk::TimeLine.new
Plugin.call(:mui_tab_regist, timeline, ’Title’, MUI::Skin.get("timeline.png"))
Plugin.call() は、イベントを発生させるためのメソッドです。第一引数のイベントを発生させ、第二引数以降は、イベントの引数です。このメソッドは即座に返ってきて、実際のイベントの起動
は、あとで処理の手が空いたときに行われます。

今回の範囲からは逸脱しますが、イベントを発生させる時、待ち受けるブロックを登録するときには、そのイベントが存在するかどうかは確認しません。つまり、プラグインが好きにイベントを作成することができる、ということです。この仕組を用いて、あなたの作成したプラグイン同士がイベントを使って通信することができますし、本来は別のプラグイン同士が通信する内容を受け取ることも出来ます。今回の mui tab regist は、GUI プラグインが独自に提供しているイベントです。

– タブのアイコン
例の中で使っている MUI::Skin.get() について、一応解説しておきます。
これは、タイムラインのアイコンのパスを返します。省略可能ですが、このように指定しておけば、ホームタイムラインと同じアイコンが表示されます。スキン機能が実装されたら、現在のスキンでのアイコンの絶対パスを返すようになりますが、現在は実装されていないので、デフォルトスキンの絶対パスを返しています。

• タイムラインにツイートを追加する作成したタイムラインを表示することは出来ました。次に、ツイートをタイムラインに追加する方法です。これは簡単です。

timeline.add(Message...)Gtk::TimeLine のインスタンスに Message のインスタンスか、それが入った配列を渡せば追加されます。
Message については、結構複雑なので後述します。今回の例では、Message#user を使って、ツイートしたユーザを取得しているのと、Message#[] の :created (投稿日時) を取得しています。
この情報を元に、mikutter の言及があれば今後 5 分間だけツイートを抽出するフィルタを実現できるわけです。少し実装を変えれば、他のツイッタークライアントではできないような複雑なフィルタを比較的簡単に実装することができるでしょう。

4

スマートなミュート機能

mikutter 標準のミュート機能は、すべてのタイムラインからツイートを非表示にします。このセク
ションでは、イベントが発生する前にその内容を編集・削除するためのイベントフィルタ機能、またそれを単体で使って、プラグイン間通信を実現する方法について解説します。

4.1

コード例

今回は、特定の単語の入ったツイートを非表示にします。

# -*- coding: utf-8 -*Plugin.create(:mute_word) do
exclude_words = ["政治","原発"] # フィルタする単語
filter_show_filter do |msgs|
msgs = msgs.select{ |m| not exclude_words.any?{ |word| m.to_s.include?(word) } }[msgs]
end
end

4.2
4.2.1

解説
イベントフィルタ

• イベントの引数を編集するツイートをプラグインに配送するためにイベントが使われることは前のセクションで触れました。
今回は、イベントの発生時にそれを捕まえて、引数を書き換えることができる「イベントフィル
タ」を使用します。
フィルタは、Plugin.create のブロック内で以下のように宣言します。

filter_update do |service, msgs|
msgs = msgs.select{ |m| not m.to_s.include?("政治") }[service, msgs]
end
イベントが発生すると、イベントと同じ名前のフィルタが登録されていないか確認して、登録されていたら先にフィルタを実行し、その戻り値を新たに引数リストにします。なので、普通のイベントと同じように引数を受け取り、加工した結果を返すことで、イベントの引数を変更できます。
この場合は、update イベントで配送されるツイートをすべて確認して、「政治」「原発」というキーワードが含まれたツイートを削除します。三行目が戻り値ですが、ここに注目してください。

end引数を配列で返しています。こうやって、加工した値を返してやることで、実際にイベントが発生する時には、該当するツイートが除外されるようになるわけです。
一つ注意しなければいけないのは、戻り値の配列は、必ず引数の数と一致しなければいけないということです。なぜなら、イベントの引数の数は、今のところ常に固定だからです。

• イベントフィルタを使ったプラグイン間の通信イベントを使えば、別のプラグインに情報を伝えることができるというのは前に紹介したとおりです。
しかし、イベントは受け取りたい方がイベントを待ち受けて、発信されるのを待つ必要があります。実際には受け取り側のリクエストに即座に答えるような通信をしたいことのほうが多いと思われますが、こういった用途にもイベントフィルタを使用します。
まず、イベントフィルタは、イベントが発生していなくても、単独で呼び出すことができます。

Plugin.filtering(:update, Post.primary_service, [Instance of Messages...])
この戻り値は、[Post, [Message. . . ]] のような、イベントフィルタの戻り値そのままです。
次に、イベントフィルタは、イベントが未定義でも作成できます。

filter_plus do |num|[num + 1]
end
つまり、直接呼び出されることだけを想定したフィルタを勝手に定義してしまえば、リクエストレスポンス型の通信が実現できるのです。

– mikutter から完全に排除するには
実は、update イベントのフィルタでは、ホームタイムラインから表示されなく成るだけで、他のタイムラインからはフィルタリングできていません。この実装のほうがいい場合もある
でしょうが、mikutter 上にそもそも表示されないようにしたい場合もあると思います。

そのためには、タイムラインが表示前にフィルタを呼び出していれば、そこで削除することができますね。当然、mikutter はミュートを実現するために、表示する寸前に以下のようなコードでフィルタを呼び出しています。

Plugin.filtering(:show_filter, message)
つまり、前に書いた update フィルタは以下のように書き換えれば、すべてのタイムラインに影響するようになります。

filter_show_filter do |msgs|
msgs = msgs.select{ |m| not m.to_s.include?("政治") }[msgs]
end
show filter は、notify プラグインからも使用されていて、TL に表示されないツイートはポッ
プアップ通知や効果音も鳴らさないようになっています。こんなふうに、他のプラグインが他の用途のためのフィルタを使用したり、コールバックを登録することもできます。イベン
トとフィルタをうまく使えば、プラグインそれ自身に拡張性を持たせることができます。

STOT 形式でコピー

5STOT(ShareTwitterOnTumblr) は、ツイートを Tumblr に投稿するためのフォーマットの一つです。
様々なアプリケーションで使われていることもあり、この形式でツイートをコピーできると何かと便利です。このセクションでは、• ユーザが選択して呼び出せる任意の機能 (mikutter コマンド) の追加方法• ツイートの情報 (Message) とユーザ情報 (User) のオブジェクトの取扱方法について解説します。

5.1

コード例

# -*- coding: utf-8 -*Plugin.create(:copy_as_stot) dofilter_command do |menu|
menu[:copy_as_stot] = {:slug => :copy_as_stot,:name => ’STOT 形式でコピー’,:condition => lambda{ |opt|
true},:exec => lambda{ |opt|
message = opt.message
screen_name = message.user[:idname]
Gtk::Clipboard.copy("#{screen_name}: #{message.to_s} [http://twitter.com/#!/#{screen_name}/status/#{message.id}]")},:visible => true,:role => :message }[menu]
end
end

5.2
5.2.1

解説
STOT について

まずはじめに、STOT の一例を示します。

toshi_a: 会社でふぁぼるのたのしい [http://twitter.com/#!/toshi_a/status/1519474006
91449856]
こんなふうに、ユーザの screen name と本文、URL(ツイートの ID) の３つの要素が含まれています。
要は、この３つの要素だけ取得して、クリップボードに合成したテキストを送れば終わりです。

5.2.2

mikutter コマンド

この機能の呼び出し方法ですが、• ツイートを右クリックしたときに出るメニュー• ツイートを選択した状態で設定されたショートカットキーを押したときに実行されるの 2 つ方法で呼び出せるようにします。mikutter を使っていれば気づくかと思いますが、右クリックメ
ニューで選択できる項目はすべてショートカットキーに割り当てることができます。これは、どちらも登録された「mikutter コマンド」を参照しているからで、ここに一つ機能を追加するようにしておけ
ば、ユーザは右クリックメニューから使ったり、ショートカットキーに割り当てたり、好きに使うことができます。
サンプルコードでいうと、menu という連想配列に入れる内容がポイントです。以下のキーを持ったハッシュを入れます。

1. slug コマンドスラッグ。一意なコマンド名。Symbol。
2. name 表示名。コンテキストメニューに表示される内容。String。
3. description この機能の説明など。省略可能。

4. icon アイコンがあれば。今のところ使われない。Gdk::Pixbuf とか String(ファイル名) を指定しましょう。
5. condition 実行条件。これの値と===で引数（後述）が比較されます。引数にもよりますが、Proc、Regexp、String などを指定できます。
6. exec 実行される本体。:condition と同じ引数を受け取るが、:condition が false になった場合はそもそもこれは呼ばれない。
7. visible コンテキストメニューに表示するかどうかのフラグ。false なら表示されない。これは例
えば、「ひとつ上のつぶやきを選択」のように、右クリックメニューに表示する必要のないものに使う。
8. role コマンドを実行できる環境。たとえば、つぶやきを右クリックすると、ここに:message が指定されたもののうち、:condition が true なものだけが実行又はコンテキストメニューに表示される。指定できるもののバリエーションは後述。
:condition や :exec の「引数」というのは、 :role に何を設定したかによって変わります。
1. message つぶやきにフォーカスがあるとき。以下のような構造体を引数に呼び出されます。
Struct.new(:event# Gdk::Event or nil,:message# Message,:timeline# Gtk::TimeLine,:miraclepainter # Gdk::MiraclePainter)2. messages message とほぼ同じだが、ツイートの複数選択に対応しています。ツイートの数だけ構造体を含んだ配列が引数として渡されます。
3. message select message の時で、なおかつテキストが選択されているとき。引数も同じ。
4. timeline タイムラインで右クリックされたとき。基本的に message と同じタイミングだけど、引数は Gtk::TimeLine しか受け取らないという点がちがう。
5. postbox つぶやき入力欄。今のところ、ショートカットキーにしか対応していない。引数としてGtk::PostBox を受け取ります。
こういうふうに、わりと簡単に mikutter コマンドを新しく追加できます。mikutter コマンドの話については、mikutter 開発日記の mikutter コマンド http://mikutter.blogspot.com/2011/05/mikutter.html
でも触れています。

5.2.3Message

次に、前のセクションでも出てきた Message について触れます。御存知の通り mikutter 上で一つのツイートを表すオブジェクトです。Message はプラグインから作ることはまずありません。現在のところ、一つのツイートにつき必ず一つだけ Message のインスタンスが生成されることが保証されています。実はキャッシュ機能や他のツイートを探索する機能も持っているのですが、今回は圧倒的に使用頻度が高いと思われる、ツイートの内容を取得するところに焦点を絞って紹介します。

• 用意されているキー
次のキーで、ツイートの情報の取得はできます。例えば、 m に Message のインスタンスが格納されているとしたら、 m[:id] で、ツイートの ID が取得できます。
また、いくつかの情報はインスタンスメソッドでも取得できます。キーを指定する方法なら正直に今持っている値を返しますが、メソッドを呼んだ場合はできるだけ正確に値を返そうとします。
例えば、 m[:reply to] は、返信先のツイートが読み込まれていない場合はツイート ID を数字で返す可能性がありますが、m.receive message は、そういう場合、データベースのキャッシュ
や、場合によっては Twitter サーバに API リクエストを発行して返します。
キー

id
entitymessageuser
receiverreplytoretweetsourcegeo
createdmodified

意味

ツイートの ID(数字)エンティティ情報 (後述)
ツイートの本文
ツイートを投稿したユーザ (User)
このツイートを宛てられたユーザ (User)
このツイートの返信先の Message
これがリツイートなら元の Message
投稿したクライアント情報
ジオタグ
投稿時刻
更新時刻

他の方法

m.to im.links, m.entity
m.bodym.to userm.receiverm.receive message

詳しいメソッドの一覧は、http://mikutter.hachune.net/rdoc/Message.html を参照してください。

5.2.4

User

User クラスと Message クラスはともに Retriever のサブクラスで、機能はほとんど同じです。ただし、当然持っている情報のキーに違いがあります。
• 用意されているキー

キー

id
idnamenamelocation
detailprofile image url
url
protected
followers countstatuses countfriends count

意味

ユーザの ID(数字)スクリーンネーム
名前(プロフィールの) 現在地
プロフィール本文 (bio)
アイコン画像の URL
Web ページ（プロフィールで設定された）
非公開ユーザ (鍵垢) なら真
フォロワーの数
ツイート数
フォロイー (フォローしている人) の数

他の方法

u.to iu.idname, u.to s

専用メソッドはほとんど用意されていませんが、例えばこのユーザが「自分」かどうかを判定する
is me? のような便利なメソッドがいくつかあります。詳細は、http://mikutter.hachune.net/rdoc/
User.html を参照してください。

6

あとがき

mikutter は、ほとんどすべての機能がプラグインで実装されていることからも分かる通り、プラグインで柔軟に機能が追加できるようになっています。今回は、４つの例をとおして、簡単なプラグインを実装する方法を紹介しました。これらを組み合わせれば、ある程度いろんなプラグインを作成できるでしょう。
今まで書いてきた内容も、現在では古くなっている可能性があります。日々進化しつづける mikutter
ですが、時にはどうしても後方互換性が取れないような変更をしなければいけない時もあるからです。
また、今まで冗長だった書き方も、スマートな方法が提供される場合もあります。最後に、最新の情報
へのポインタを幾つか示しておきます。
RDoc http://mikutter.hachune.net/rdoc/index.html を見れば、trunk で、どういったクラスやメソッドが使用できるか確認することができます。完璧ではありませんが、主要なものや最近書かれたものについては、ドキュメントが存在します。
Redmine http://dev.mikutter.hachune.net/ を参照すれば、最近どんな変更が加わったのかを知ることができます。
mikutter 開発日記 http://mikutter.blogspot.com/ は、ある程度まとまった情報を取得するのに便利です。
最後に、「Writing mikutter plugin」の最新版は、https://github.com/toshia/writing-mikutter-pluginに公開されています。最新バージョンに対応していますし、冒頭にも書いたとおり、サンプルコードを取得することも出来ます。

࠶࡜ࡀࡁヰࢆࡋࡼ࠺ࠊ࠶ࢀࡣ௒࠿ࡽ 36 ୓࣭࣭࣭࠸ࡸ 4 ⟠᭶๓ࡔࡗࡓ࠿ࠋ
ࡲ࠵࠸࠸ࠋ⚾࡟࡜ࡗ࡚ࡣࡘ࠸᫖᪥ࡢฟ᮶஦ࡔࡀࠊྩࡓࡕ࡟࡜ࡗ࡚ࡣከศ…௒᪥
ࡢฟ᮶஦ࡔࠋ
ᙼ࡟ࡣ 72 ㏻ࡾࡢྡ๓ࡀ࠶ࡿ࠿ࡽࠊ࡞ࢇ࡚࿧࡭ࡤ࠸࠸ࡢ࠿ࠋ
☜࠿᭱ึ࡟఍ࡗࡓ࡜ࡁࡣࠊ…࡚࠾ࡃࢀࠋࡑ࠺࠶࠸ࡘࡣ᭱ึ࠿ࡽ࡚࠾ࡃࢀ࡚࠸ࡓࠋ
⚾ࡢゝ࠺࡜࠾ࡾ࡟ࡋ࡚࠾ࡅࡤ࡞ࠊࡲ࠵࠸࠸ࡸࡘࡔࡗࡓࡼ

࡞ࢇ࠿ᢏ⾡᭩ࡳࡓ࠸࡟࡞ࡗࡓ࠿ࡽ mikutter ࣮ࣘࢨ࣮ࡢࡳ࡞ࡉࢇࡣࡼࢁࡇࢇ࡛ࡃ
ࡔࡉࡿ࠿ࡋࡽࠋ

࡯ࢇࡌࡷࡲࡓࠋtwitter ࠿࡝ࡇ࠿࡛࠾࠶࠸ࡋࡲࡋࡻ࠺ࠋዟ௜Ⓨ⾜᪥㸸 ᖺ ᭶ ᪥ ึ∧ SGI ∧ Ⓨ ⾜㸸PLNXWWHU ࡢⷧ࠸ᮏไసጤဨ఍
Ⓨ⾜⪅㸸#EUV\ZHす➃ࡢᨺ㏦ᒁෆႚⲔᐊ㛗㐃⤡ඛ㸸EUV\ZH#KRWPDLOFRMSࡈពぢࠊࡈឤ᝿ࡣ࠾Ẽ㍍࡟࡝࠺ࡒࠋ
Price㸸᫬౯ᗈ࿌

http://mikutter.hachune.net/