もぐてっく

人は1つ歳をとるたび、1ビットづつ大きくなれると信じてた。

mikutter Advent Calendar 7日目 プラグイン書くの楽しいです( º﹃º` )

mikutter Advent Calendar 2013(http://www.adventar.org/calendars/120)7日目でございます。

早いもので、後少し寝れば 年末の納期がぁぁ!あの機能まだ人のアサイン決まって無いprz... 2013年も終わりですね。


思い返せば、2013年も色々ありました。

  • MacBook Air買ってmikutterを動かしたら組織から命を狙われたり。
  • 仕事の合間を縫ってOSCに薄い本を買いに行くも京都駅で遭難して夢潰えたり。
  • mikutterのプラグインを猿の様に書きまくったり。


こんな充実した(?)mikutterライフの結果、僕の愛娘は現在こんな感じになってます。

f:id:moguno:20131207004651p:plain:w250

はい、「シンプル」の意味を完全に取り違えてます。我ながらておいっす。

今回はこんな重病に至る過程で見つけた、ちょっとしたプラグイン作成Tipsをご紹介します。

メッセージをageる。

Messageにはcreatedとmodifiedって言う2つの日時を格納するフィールドがあります。
createdは投稿日時表示に使われる物で、modifiedはメッセージの並びを制御する物になります。

このmodifiedにnowを設定すると、メッセージをTLの一番上に持ってくる事が出来ます。

modifiedには未来の日時を設定する事も出来ます。
この場合は、TL上部にメッセージを一定時間張り付ける事が出来ます。
通知領域みたいに使えますね。

  def pin(msg, pinning)
    if pinning then
      # メッセージを5分間TL上部に張り付ける
      msg[:modified] = Time.new + 5 * 60
      msg[:pinned] = "pinned" # (※1)
    else
      msg[:modified] = Time.new
      msg[:pinned] = nil
    end

    # メッセージ変更をコアに通知する。
    Plugin::call(:message_modified, msg)

    msg
  end

ちなみに、Messageには任意のフィールドを追加する事が出来ます(※1)
後続のフィルタで自プラグインが処理したメッセージの背景色を変えたいときとかの目印に使えて便利です。

  filter_message_background_color { |message, color|
    if message.message[:pinned] then # ※1のフィールドが存在するなら背景色変更
      color = UserConfig[:gosunkugi_background_color]
    end

    [message, color]
  }

ステータスバーにボタンを追加する

バージョンアップの度に季節感のあるメッセージが表示されるステータスバー。
実はここ。ツールバーになっていて、デフォルトのネギレンチの他にもボタンを追加する事が出来ます。

f:id:moguno:20131207093523p:plain


やり方は簡単。
 roleが:windowなCommandを作るだけです。

  command(:open_my_profile,
          name: 'プロフィール',
          condition: lambda{ |opt| true },
          visible: true,
          icon: Service.primary.user_obj[:profile_image_url],
          role: :window) do |opt|
            Plugin.call(:show_profile, Service.primary, Service.primary.user_obj) end

GTKプラグインを操作する。

mikutterは0.2辺りからUIとコア部分の明確な分離が提唱されました。

それにより、UIプラグインの実装はコアから隠匿され、コアとUIは抽象化されたAPIで会話するようになりました。

その結果、標準のGTKプラグイン以外のUIプラグインが生まれてきました。

現在ではmikutter デーモンモードの様なUI不要な使い方や、Luna等の今となっては非力なワークステーションでも動作するCUIなインターフェースなどが登場しています。

一方、別のプラグインがGTKプラグインのオブジェクトを直接操作する事は出来なくなった・・・と思ってたら、ひっそりとインターフェースが存在してました。

:gui_get_gtk_widgetフィルタを使えば、抽象化GUIオブジェクトi_window、i_tab、i_timelineなどを引数にして、対応したGTKオブジェクトが取得出来ます。

  on_window_created do |i_window|
    begin
      # メインウインドウを取得
      window_tmp = Plugin.filtering(:gui_get_gtk_widget,i_window)

      if (window_tmp == nil) || (window_tmp[0] == nil) then
        next
      end

      # windowはGtk::Windowのインスタンス
      window = window_tmp[0]

      # 後はお好きに。

さいごに

ここで紹介したTipsを使った拙作プラグインはGitHubに置いてあります。
活用頂けたら幸いです。

https://github.com/moguno

タイトルバーを隠すmikutterプラグインを作ったよ。

なにこれ?

タイトルバーってなんでタイトルとウインドウいじるボタンしか無いくせに常時画面に居座ってるの?ピクセルの無駄ですよね。

と言う訳で登場です。タイトルバーを消して空間を無駄無く使うmikutterプラグイン。

f:id:moguno:20130910002341p:plain:h400

はい。何か締まりのない画面ですね。

どっちかと言うと、こうやって画面端に常駐してる風に配置する事を想定しています。
タイトルバーの分表示出来る情報が増えて良いです。

f:id:moguno:20130910003727p:plain:h400

使い方

インストールすると即座にタイトルバーが消えて、ステータスバーに三つのボタンが追加されます。
ボタンの機能は左からこんな感じです。

ウインドウ移動

ボタンを押した状態でマウスを動かすとウインドウを移動出来ます。

ウインドウを閉じる

ウインドウを閉じます。ておくれてる人は使う機会は無いでしょう。

ウインドウ最大化

ウインドウを最大化します。

ウインドウ最小化

ウインドウを最小化します。ておくれ(略

インストール

お好きなプラグインディレクトリにて、以下のコマンドでインストール出来ます。

git clone http://github.com/moguno/mikutter-hide-titlebar

Alcohol52%のイメージファイルmdf + mdsをwav + cueに変換する

前回めでたく成功したbin + cue→wav + cue変換。

bin + cueをwav + cueに変換する - もぐてっく

でも、うちのライブラリはbin + cueじゃなくてAlcohol52%ネイティブのフォーマットであるmds + mdfファイルなのよね。

ひとつずつ再変換しても良いんだけど、超面倒だよね。うん。面倒だ。

まぁ、mdfとbinは完全互換なのは調査済みだから、後はmdsファイルを適当にパースしてcueファイル作れば良いんじゃね?

(mdsファイルをテキストエディットで開く)

バババ、バイナリィィィィィィィィィィィィィィ!?


バイナリファイルでした(泣)。


でも、こんなことではめげません。めげずに調べます。


mdsファイルのデータ構造はここにドキュメントがあるのですが、所々計算が間違っててどうも怪しいです。

http://developer.berlios.de/docman/display_doc.php?docid=840&group_id=2545

なので、大変参考にしつつ(ありがとうございます)hexdumpとにらめっこしながらそれっぽい構造体を作ってみました。


これでmdsファイルの中身が読めるようになりました。
でも、それだけではダメでした。ダメダメでした。

mdsのdata_blockに格納されてる値でcueファイルを作ると、全体的に2秒ずれてしまいました。単純に2秒引けば良いんですけど、なにかとてもきもち悪いから調べてみました。


なんでも、CD-DAは「きかくじょう」、トラック1の前に2秒(150フレーム)の無音区間(プリギャップ)が必要なのだそうです。

そして、その2秒の無音区間は無駄なので、mdfファイルからは削られてます。

でもでも、mdsは2秒のプリギャップを削る前のタイムスタンプを保持しているので、件のズレが発生します。

多分ヘッダのpregap_corrに入ってる-150が削ったプリギャップだと思うので、これを75で割って引き去るようにしました。


はい。これで出来ました。

moguno/mdsmdf2cuewav · GitHub

第一引数にmdsファイルを指定すると、同じフォルダにcueファイルとwavファイルが出来ます。


これで本気でWindowsが捨てられる準備が出来ましたv