Confront my ignorance

寿司食べたい

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

VirtualBoxに入れたUbuntuにssh接続する

UbuntuのNetworkを選択

f:id:tenten0213:20131015225902p:plain

Port Forwardingを選択

f:id:tenten0213:20131015230247p:plain

Port Forwardingの設定を追加

f:id:tenten0213:20131015230549p:plain

名前、ホストポートは適当でOK

繋いでみる(失敗)

VirtualBoxUbuntuを起動し、sshで接続を試みる…

ssh tenten0213@localhost -p 2222
ssh_exchange_identification: Connection closed by remote host

エラーになった…

Ubuntuにopenssh-serverのインストール

/etc/init.d/ssh が無かったので、openssh-serverをインストールする。

sudo apt-get install openssh-server

起動

sudo service ssh start

繋いでみる(できた)

% ssh tenten0213@localhost -p 2222
tenten0213@localhost's password:
Welcome to Ubuntu 13.04 (GNU/Linux 3.8.0-31-generic i686)

 * Documentation:  https://help.ubuntu.com/

Last login: Tue Oct 15 23:18:26 2013 from 10.0.2.2

参考

VirtualBox上にインストールしたUbuntuにSSHで接続する〜ポートフォワーディング編 | トリコロールな猫

windowsのコマンドプロンプトだって、おしゃれに設定したら愛せる気が…しなかったのでConsole2×Nyaosで愛されターミナルを構築する

windowsのコマンドプロンプトだって、おしゃれに設定したら愛せる気がするんだ。 - そこに仁義はあるのか(仮) を読んでも、コマンドプロンプトは愛せないなって思いました(´・_・`)

むかしConsole2とNyaosでそこそこ快適な環境を整えたので、女子力を意識しつつ再構築し直してみる。(1年半くらい経ってて色々進化してた)

console2

http://sourceforge.net/projects/console/
タブ型のターミナルで、背景色や透明度、フォントなど色々設定できる。

日本語対応

インストールするだけでは日本語入力が出来ないので、以下から日本語IME対応パッチを取得し、Console.exeを置き換える。
http://sourceforge.net/projects/ishimoto.u/files/console2-ime/b148/

過去にインストールしたことがある人で、save settings to user directoryで設定を保存していた場合は過去の設定が残っている場合がある。自分の場合は以下を削除した。

C:\Users\tenten0213\AppData\Roaming\Console\console.xml

Nyaos

UNIXライクな日本語拡張コマンドラインシェル。
以下から最新版をインストール。

http://www.nyaos.org/

Cosole2のEdit-Settings...からConsoleのShellをNyaosに設定。

f:id:tenten0213:20130930231956j:plain

MinGW

GNU ツールチェーンのWindows移植版。

Nyaosの_nyaに以下を追記する。

set GWBIN=C:/MinGW/bin
set MSYSBIN=C:/MinGW/msys/1.0/bin
set PATH+=$GWBIN
set PATH+=$MSYSBIN
set HOME=$USERPROFILE

alias ll $MSYSBIN/ls.exe -agoFh --time-style=+"%Y/%m/%d %H:%M" --color=always --show-control-chars
alias vi $MSYSBIN/vim.exe
alias grep grep -ni --color
alias ls $MSYSBIN/ls.exe

参考: http://upinetree.hatenablog.com/entry/2013/03/06/220800
※参考の方がしっかり書いてあるので、そちらを見てください。

女子力!

女子力向上の為に、背景をパステルピンクに。
solarized-light をベースに、背景だけ修正した。

女子力

フォントは手書きが女子力高いよねってことであずきフォントにしてみた。
http://azukifont.com/

結果

こんなんなった。

f:id:tenten0213:20131001003820j:plain

iconは @syobochim のtwitterアイコンを使用。

こいつよりは愛せる!

コマンドプロンプト http://syobochim.hatenablog.com/entry/2013/09/16/234321

と、環境を整えてみたけど、家のWindowマシン調子悪いしもうターミナルを開く日は来ないかもしれない…