hubot-irof作った
これはいろふ Advent Calendar 2014 - Adventarの4日目です。
3日目はid:sue445さんのいろふさんグッズを作った - くりにっきでした。
やばい、マグカップ欲しい。
いろふさんとの思い出
Twitter上ではちょくちょくやり取りしていたけど、インスタンスとはDevelopers Summit 2012 Kansaiで初めて遭遇した気がする(もしかしたら違う勉強会で会ってたかも?) 家に泊めてもらった時に見た技術書の量に衝撃を受けた記憶がある。
JJUG CCC 2014 Fall(11月15日開催) | 日本Javaユーザーグループで久々に会って、いろふさんが執筆者として参加したJavaエンジニア養成読本にサイン貰った。ありがたや〜(T人T)
本題
ライセンスはいろふ・ライセンス。
npmにも上げているので、自分で作ったHubotのディレクトリでnpm install --save hubot-irof
して、external-scripts.jsonにhubot-irof
を追加すれば使えるようになる。
コマンドはhubot irof me
しかない。
いろふさんを召喚したい時とか、反応に困った時、なんとなく賑やかしに…ご利用ください。
5日目は…緊急参戦の@yy_yankさんのJavaプログラマーのはしくれダイアリー: マジ感謝ないろふさんに俺のライムを送るです!+(0゚・∀・) + ワクテカ +
PushbulletのBookmarklet登録したら捗った
休憩中にiPhoneで見ていたページを会社のPCで表示したりするのにPushbulletが便利で、よく使ってる。 ただ、見ていたページのリンクをコピーしてPushbulletのアプリを立ち上げてPushするのダルい。
なのでBookmarkletを登録して手間を省く。 自分で作ろうと思ったけど、以下のGistがあがっていたので利用した。
Gistをコピーして適当に"Pushbulletに送る"って感じでBookmarkletを登録する。
んで、見ているページでBookmarkletを実行するとタイトルと見ていたページのリンクが入力された状態でPushbulletが立ち上がるので、後はデバイスを選択してPushするだけ。
逆にPCで見ているページをiPhoneで見たいときはChrome拡張使うと便利。
来週からスマホ持ち込み禁止の案件に行くからイロイロ工夫しなきゃ。
HubotにZabbixのアラート通知するの作った
halkeye/hubot-jenkins-notifier · GitHubと
hipchat/hipchat-cli · GitHubをパクって参考にして作った。
両方MITライセンスだったからMITにしたけど、大丈夫だろうか…
正直HipChatを使っているなら、hipchat-cliを使ったほうが色付けられたり出来るので、そっちの方が良い。
参考にしたり改変したときのライセンスをどうしたら良いのか判断するの難しい…
Intellij IDEAのRubyプラグインの有効化に失敗していたんですが、pikが原因でした→pikのconfig.yamlが原因でした
Intellij IDEAのRubyプラグインの有効化に失敗していたんですが、pikが原因でした なんて記事があがっていたけど、怒りにまかせてファイル消して対応したとか書いてあってモヤモヤしたので調べてみました。
動作環境
エラー再現
- 既にインストール済だったRuby pluginをIntelliJ IDEAからアンインストール
- pikをインストールし、ruby-1.9.2-p136をインストール
- 再度Ruby pluginをインストール
- IntelliJ IDEAの再起動
エラーが出ました。参照元の記事と、Rubyのバージョンが違うだけでエラー内容はほとんど同様です。エラー内容のテキストは記事の一番下にでも貼り付けておきます。
原因
どうやらpik関連のYAMLを読み込んだ際にエラーが発生しているようです。 %HOME%/.pik/にconfig.ymlといういかにもっぽい設定ファイルがあるので覗いてみると、以下のような内容になっていました。
--- "[ruby-]1.9.2[-p136]": :path: !ruby/object:Pathname path: C:/Users/tis302655/.pik/rubies/ruby-1.9.2-p136/bin :version: | ruby 1.9.2p136 (2010-12-25) [i386-mingw32] --- {}
エラーに出ている箇所が見事にありますね。
but found another document in 'reader', line 8, column 1: --- {}
まさにこのファイルのようです。 YAMLは「---」で区切ると1ファイルに複数のYAMLドキュメントを含めることができます。1ドキュメントだけ取得するはずが、別のドキュメントまで取得できてしまったからエラーになったようです。
対応
ということで、config.ymlの不要部分を削除し、以下のようにしてから
--- "[ruby-]1.9.2[-p136]": :path: !ruby/object:Pathname path: C:/Users/tis302655/.pik/rubies/ruby-1.9.2-p136/bin :version: | ruby 1.9.2p136 (2010-12-25) [i386-mingw32]
IntelliJ IDEAを再起動することで正常にプラグインを読み込むことが出来ました。
エラー内容はちゃんと読んで対応しなければいけませんね。
エラーの内容
Plugin 'org.jetbrains.plugins.ruby' failed to initialize and will be disabled. Please restart IntelliJ IDEA. expected a single document in the stream in 'reader', line 2, column 1: "[ruby-]1.9.2[-p136]": ^ but found another document in 'reader', line 8, column 1: --- {} ^ at org.yaml.snakeyaml.composer.Composer.getSingleNode(Composer.java:110) at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:120) at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:481) at org.yaml.snakeyaml.Yaml.load(Yaml.java:412) at org.jetbrains.plugins.ruby.ruby.RubyUtil.loadYaml(RubyUtil.java:106) at org.jetbrains.plugins.ruby.version.management.pik.PikSdkRefresher.parseConfig(PikSdkRefresher.java:133) at org.jetbrains.plugins.ruby.version.management.pik.PikSdkRefresher.getSdkInfos(PikSdkRefresher.java:60) at org.jetbrains.plugins.ruby.version.management.SdkRefresherBase.refreshSDKs(SdkRefresherBase.java:59) at org.jetbrains.plugins.ruby.version.management.SdkVersionManagerUtil.updateSDKs(SdkVersionManagerUtil.java:14) at org.jetbrains.plugins.ruby.version.management.ProjectSdkRefresher.initComponent(ProjectSdkRefresher.java:23) at com.intellij.openapi.components.impl.ComponentManagerImpl$ComponentConfigComponentAdapter$1.getComponentInstance(ComponentManagerImpl.java:548) at com.intellij.openapi.components.impl.ComponentManagerImpl$ComponentConfigComponentAdapter.getComponentInstance(ComponentManagerImpl.java:590) at com.intellij.util.pico.DefaultPicoContainer.getLocalInstance(DefaultPicoContainer.java:225) at com.intellij.util.pico.DefaultPicoContainer.getInstance(DefaultPicoContainer.java:212) at com.intellij.util.pico.DefaultPicoContainer.getComponentInstance(DefaultPicoContainer.java:199) at org.picocontainer.alternatives.AbstractDelegatingMutablePicoContainer.getComponentInstance(AbstractDelegatingMutablePicoContainer.java:75) at com.intellij.openapi.components.impl.ComponentManagerImpl.createComponent(ComponentManagerImpl.java:121) at com.intellij.openapi.components.impl.ComponentManagerImpl.a(ComponentManagerImpl.java:112) at com.intellij.openapi.components.impl.ComponentManagerImpl.init(ComponentManagerImpl.java:89) at com.intellij.openapi.project.impl.ProjectImpl.init(ProjectImpl.java:296) at com.intellij.openapi.project.impl.ProjectManagerImpl.a(ProjectManagerImpl.java:281) at com.intellij.openapi.project.impl.ProjectManagerImpl.access$300(ProjectManagerImpl.java:83) at com.intellij.openapi.project.impl.ProjectManagerImpl$9.compute(ProjectManagerImpl.java:569) at com.intellij.openapi.project.impl.ProjectManagerImpl$9.compute(ProjectManagerImpl.java:565) at com.intellij.openapi.progress.impl.ProgressManagerImpl$4.run(ProgressManagerImpl.java:240) at com.intellij.openapi.progress.impl.ProgressManagerImpl$TaskRunnable.run(ProgressManagerImpl.java:464) at com.intellij.openapi.progress.impl.ProgressManagerImpl$6.run(ProgressManagerImpl.java:274) at com.intellij.openapi.progress.impl.ProgressManagerImpl$2.run(ProgressManagerImpl.java:178) at com.intellij.openapi.progress.ProgressManager.executeProcessUnderProgress(ProgressManager.java:209) at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:212) at com.intellij.openapi.progress.impl.ProgressManagerImpl.runProcess(ProgressManagerImpl.java:171) at com.intellij.openapi.application.impl.ApplicationImpl$10$1.run(ApplicationImpl.java:645) at com.intellij.openapi.application.impl.ApplicationImpl$8.run(ApplicationImpl.java:419) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:724) at com.intellij.openapi.application.impl.ApplicationImpl$1$1.run(ApplicationImpl.java:149)
追記
関連するissueがあがっていました。
- unable to start RubyMine if pik configuration contains several yaml docs
- Ruby plugin becomes disabled while loading jruby on rails project
- PikSdkRefresher fails for Ruby 1.8.6
対応としては同様にコードを修正してるっぽいです。
これ以上調べないでいいかなって思っていたのですが、後輩にpikも調べろやって感じの対応をされたので、pikのコードも見てみました。
@tenten0213 えっ
— レッドキングわだ@もそもそ (@syobochim) March 31, 2014
おそらく…以下の49行目でglobalにインストールされたRubyに関するドキュメントを吐こうとしているものの、@global = {}
の状態のまま書き込んでるから --- {}
になってるんじゃないかと。
一応irbで簡単に試してみました。 @global = {}
のままだと確かに --- {}
になります。
irb(main):001:0> require 'yaml' => true irb(main):002:0> @global = {} => {} irb(main):003:0> YAML.dump(@global) => "--- {}\n"
rubyのバージョンも疑ってみましたが、1.8,1.9,2.0もほぼ同様の出力になったのでバージョン差異は問題ではなさそうです。(1.8は"--- {}\n\n"でしたが)
あとは、Ruby plugin側のコード変更でエラーが出るようになったことが考えられますが、調べるのが面倒なのでここらへんでおしまいにします。
また後輩に調べろやって言われないといいな。。。
Windows環境でのHHKB Professional2設定(IME設定 + AutoHotkey + Vim)
会社で使っているキーボードをRealforce91UからHHKB Professional2に変えた。
一緒に勉強している後輩がUS配列のMacを使っていて、教える時にウッてなって困ったのが悔しかったのと、憧れのHHKB使ってみたかったのが主な理由。
初めてのUS配列キーボードで無刻印は結構ツラかった…。まぁ慣れの問題だし、困ったら印刷した キー配列図 見ればなんとかなる。
WindowsでHHKBを好みのキーバインドで使う設定
会社ではWindows7を使っている。(ひと月前までXPだった)
仕事はプログラムだけじゃなくメールやドキュメントを書くことも多いので、そのへんも意識してキーバインドを整えた。
Mac(JIS配列)の英字、かなでIMEのオン・オフを切り替えるように左右の◇キーでIMEを切り替えられるようにした。また、そこまで利用頻度が高くないけど無ければ無いでちょっと困る感じのWindowsキーは 右Shift 右Altに割り当てた。
あと、Fn押しながらの上下左右が辛かったのでVimキーバインドにした。
以下設定手順
英字配列に切り替え
まずは英字配列への切り替え。以下よりHHKBキー配列切替ツールをダウンロードし、英字配列に切り替える。
http://www.pfu.fujitsu.com/hhkeyboard/tooldownload.html
切り替え後は再起動が必要。
DIPスイッチによるキーコード、モードの変更
HHKBは背面のDIPスイッチによりキーコードやモードを変更することができる。
http://www.pfu.fujitsu.com/hhkeyboard/leaflet/hhkb_backview.html
DIP SW | 機能 | ||
---|---|---|---|
状態 | キー | 機能 | |
3 | OFF | Delete | Delete |
ON | Delete | BS(BackSpace) | |
4 | OFF | 左◇ | 左◇ |
ON | 左◇ | Fn | |
5 | OFF | Alt | Alt |
◇ | ◇ | ||
ON | Alt | ◇ | |
◇ | Alt | ||
6 | OFF | Wake Up 無効 | |
ON | Wake Up 有効 |
Lite拡張モード
会社PCはWindowsなので、Windowsキーが無いと困ることがある(ような気がする)ため、SW1:ON
,SW2:OFF
にし、Lite拡張モードで利用する。*1
DeleteとBS入れ替え
DeleteよりBSの方が利用頻度が高いためSW3:ON
にし、DeleteをBSに変更する。Deleteを押すにはFn + ~を押せばいい。*2
IMEの設定
以下のブログを参考に、変換・無変換キーでIME有効・無効を切り替えるようにする。
無変換、変換キーでWindowsのIME有効無効をMac風に操作する | karakaram-blog
自分の場合は追加で、「入力文字なし」モードの「Henkan」時の振る舞いが「再変換」のままだと気持ち悪かったので「IME有効化」に変更した。
AutoHotkeyで左右の◇キーに変換・無変換キーを割り当てる
HHKBには変換・無変換なんてキーは無いので、AutoHotkeyで左右の◇キーに割り当てる。また、Windowsキーだった◇キーが変換・無変換キーに置き換わるので、あまり使いこなせていない 右Shift 右AltキーをWindowsキーに変更する。
RAlt::RWin LWin::Send,{vk1Dsc07B} RWin::Send,{vk1Csc079}
AutoHotkeyでVimキーバインド
以下のブログを参考に、AutoHotkeyでVimキーバインドに設定する。(なにこれ凄い!) 設定についてはブログをみてもらえばわかる。単独で動くexeを実行するか、設定ファイルをコピペするか、ファイルを配置して読み込ませるかのどれかをすればいいだけなのでとても簡単。
Vim以外でVimする: Windows+AutoHotkey編 - rcmdnk's blog
あとは適宜、有効にしたいアプリの設定を追加する。
Emacs派には
XKeymacsがおすすめ。ちょっと前までは左Altを右Ctrlにして(左Ctrlは通常のCtrlとして活かす為)、EmacsキーバインドでメールとかExcel弄ってた。XKeymacsはアプリ毎に有効、無効やキーの設定を変更できるので、GVimなんかは当然無効にしたり、アプリのショートカットキーを活かしたい場合は設定を変更したりと柔軟に使うことができる。
まとめ
自分好みに設定を弄る必要があるところも含めてHHKBは楽しいキーボードだなと思った。打鍵感はRealforceと甲乙つけがたい(好みの問題)けど、手が小さいのでコンパクトなのはありがたい。US配列も最初は戸惑ったけど、Enterキーが近かったり、Spaceキーが広かったり、慣れると使いやすい気がする。
HHKBでコードをいっぱい書いて、キーボードに恥じないプログラマになりたい。
Windows7潰してLinux Mint入れた
2年くらい使ってるASUSのネットブックのWindows7を潰してLinux Mint入れてみた。
理由
だんだん重くなってきていたのと、あまり使わないのにセキュリティソフトの更新にお金をかけるのがイヤだったのでOS入れ替えようと思った。 Linux Mintは使ったこと無かったのと、軽いと噂なので入れてみた。
USBメモリからLinux Mintをインストールする
isoファイルをDVD-Rに焼くにもドライブが無い。外付けのも壊れてる…のでUSBメモリからインストールすることにした。16Gで¥1,000ちょいとか安くなったなー。 ただisoファイルをUSBメモリにコピーすれば良いわけではなく、ISOイメージをUSBブートでインストールできるようにする必要がある。それをしてくれるのがUnetbootin。
UNetbootin
以下から実行ファイルをダウンロードし、実行する。
http://unetbootin.sourceforge.net/
すると↓の様な画面が出るので、isoファイルをココからダウンロードして指定する。自分はLinux Mint 15 OliviaのCinnamonを入れた。
UNetbootinでディストリビューションを指定してインストールすることも出来るけど、Linux Mintはno codecsの方を選ばないと違反っぽいのでisoダウンロードしてから指定するのが良いと思う。(日本国内で配布するのが問題で、インストールは問題では無い?どちらにせよ、不要であればno codecsで良い)
USBの準備が出来ると再起動を促されるので、大人しく従う。
BIOSからBootの順番を変更
起動時にF2(PCによって違うだろうけど)を押してBIOS設定画面を開き、USBメモリのBootの順番を一番上に変更する。
Linux Mintのインストール
Bootの順番を変更して起動すると、USBからLinux Mintが起動する。仮インストールみたいな状態なので、デスクトップ上にあるinstall LinuxMintを実行し、インストールを進める。
ソフトウェアのアップデート
インストール後再起動すると(USBメモリは抜いておく)、Linux Mintが立ち上がる。これでインストールは終わったが、ソフトウェアを最新の状態にする為に、メニュー - システム管理 にあるアップデートマネージャーを実行し、ソフトウェアを最新の状態にアップデートする。
これで重たいWindowsともおさらばだ!
追記
インストールしただけだと日本語入力が出来ないので、日本語入力用にibus-mozcをインストールする。
$ sudo apt-get install ibus-mozc
インストール後、メニュー - 設定 - 言語サポート からキーボード入力に使うIMシステムをIBusに設定する。