Confront my ignorance

寿司食べたい

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)

f:id:tenten0213:20141203011528j:plain

本題

Hubotスクリプト作った。

ライセンスはいろふ・ライセンス

npmにも上げているので、自分で作ったHubotのディレクトリでnpm install --save hubot-irofして、external-scripts.jsonhubot-irofを追加すれば使えるようになる。

コマンドはhubot irof meしかない。

f:id:tenten0213:20141203010630p:plain

いろふさんを召喚したい時とか、反応に困った時、なんとなく賑やかしに…ご利用ください。

5日目は…緊急参戦の@yy_yankさんのJavaプログラマーのはしくれダイアリー: マジ感謝ないろふさんに俺のライムを送るです!+(0゚・∀・) + ワクテカ +

PushbulletのBookmarklet登録したら捗った

休憩中にiPhoneで見ていたページを会社のPCで表示したりするのにPushbulletが便利で、よく使ってる。 ただ、見ていたページのリンクをコピーしてPushbulletのアプリを立ち上げてPushするのダルい。

なのでBookmarkletを登録して手間を省く。 自分で作ろうと思ったけど、以下のGistがあがっていたので利用した。

Gistをコピーして適当に"Pushbulletに送る"って感じでBookmarkletを登録する。

f:id:tenten0213:20141130233533j:plain

んで、見ているページでBookmarkletを実行するとタイトルと見ていたページのリンクが入力された状態でPushbulletが立ち上がるので、後はデバイスを選択してPushするだけ。

f:id:tenten0213:20141130234532j:plain

逆にPCで見ているページをiPhoneで見たいときはChrome拡張使うと便利。

来週からスマホ持ち込み禁止の案件に行くからイロイロ工夫しなきゃ。

HubotにZabbixのアラート通知するの作った

halkeye/hubot-jenkins-notifier · GitHubhipchat/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の再起動

f:id:tenten0213:20140331192154j:plain

エラーが出ました。参照元の記事と、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があがっていました。

対応としては同様にコードを修正してるっぽいです。

これ以上調べないでいいかなって思っていたのですが、後輩にpikも調べろやって感じの対応をされたので、pikのコードも見てみました。

おそらく…以下の49行目でglobalにインストールされたRubyに関するドキュメントを吐こうとしているものの、@global = {} の状態のまま書き込んでるから --- {} になってるんじゃないかと。

https://github.com/vertiginous/pik/blob/22a028c84a44088aa813bc8da1d0ae1a7a6597be/lib/pik/config_file.rb#L49

一応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に変えた。

f:id:tenten0213:20131115124514j:plain

一緒に勉強している後輩が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

SW1 SW2 設定モード
OFF OFF HHKモード(PC)
ON OFF Lite拡張モード(PC)
OFF ON Macintoshモード
ON ON 設定禁止


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}

AutoHotkeyVimキーバインド

以下のブログを参考に、AutoHotkeyVimキーバインドに設定する。(なにこれ凄い!) 設定についてはブログをみてもらえばわかる。単独で動くexeを実行するか、設定ファイルをコピペするか、ファイルを配置して読み込ませるかのどれかをすればいいだけなのでとても簡単。

Vim以外でVimする: Windows+AutoHotkey編 - rcmdnk's blog

あとは適宜、有効にしたいアプリの設定を追加する。

Emacs派には

XKeymacsがおすすめ。ちょっと前までは左Altを右Ctrlにして(左Ctrlは通常のCtrlとして活かす為)、EmacsキーバインドでメールとかExcel弄ってた。XKeymacsはアプリ毎に有効、無効やキーの設定を変更できるので、GVimなんかは当然無効にしたり、アプリのショートカットキーを活かしたい場合は設定を変更したりと柔軟に使うことができる。

まとめ

自分好みに設定を弄る必要があるところも含めてHHKBは楽しいキーボードだなと思った。打鍵感はRealforceと甲乙つけがたい(好みの問題)けど、手が小さいのでコンパクトなのはありがたい。US配列も最初は戸惑ったけど、Enterキーが近かったり、Spaceキーが広かったり、慣れると使いやすい気がする。

HHKBでコードをいっぱい書いて、キーボードに恥じないプログラマになりたい。

*1:結局Windowsキーを潰して変換、無変換キーに割り当てるのだけど

*2:会社ではセキュリティで保護されたログオンが有効になっている為、ロック解除時にCtrl + Alt + Deleteを押す必要がある。BSに変更した際にDeleteを押す方法が分からなくてログオンできなくてアワアワした。

Windows7潰してLinux Mint入れた

f:id:tenten0213:20131125225811j:plain

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に設定する。

Ubuntuへのzsh設定メモ

Zsh

zshは高機能のシェル。補完とかイロイロ機能があってステキ。

zshのインストール

$ sudo apt-get install zsh

デフォルトシェルの切り替え

$ chsh

変更するshellの入力を求められたらzshへのパスを入力する

/bin/zsh

ターミナルから抜け、再度入り直すとデフォルトシェルが変更される。

$ echo $SHELL
/bin/zsh

oh-my-zsh のインストール

$ curl -L https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh | sh

プラグインの利用(必要に応じて)

~/.zshrc の以下を

plugins=(git)

書き換える

plugins=(git ruby bundler rails )

テーマの適用

~/.zsh

ZSH_THEME="robbyrussell"

robbyrussell を 好みのテーマに置き換える

テーマは以下を参照

Gitコマンドの補完

git-completion.bashzshを取得(zshでもbashファイルに依存する為、両方必要)

$ mkdir ~/.zsh/completion/
$ cd ~/.zsh/completion/
$ curl -O https://raw.github.com/git/git/master/contrib/completion/git-completion.bash
$ curl -O https://raw.github.com/git/git/master/contrib/completion/git-completion.zsh

git-completion.zshを_gitにリネーム

$ mv git-completion.zsh _git

補完定義ファイルの読み込み

~/.zshrcに以下を追記

fpath=(~/.zsh/completion $fpath)

autoload -U compinit
compinit -u

zcompdumpをリビルド

$ rm -f ~/.zcompdump
$ compinit