読者です 読者をやめる 読者になる 読者になる

つらねの日記

プログラムの進捗やゲームをプレイした感想などを書き連ねる日記。

uncrustifyが死んだ

c++

本記事は,brew updateをしたらuncrustifyが死んだので,頑張って復活させるまでの奮闘記です.

余談ですが,Atomのエラーウィンドウみたいなのを,キーボードから消す方法を探しています.{}の数がずれていたりすると毎回それが出て,バツボタンポチーするのが面倒でならないの.

序章

死体発見

Atom Beautifyのuncrustifyを多様して適当すぎるインデントやフォーマットを綺麗に整えてもらいながら,C++競技プログラミングをしているわけだが,先日,唐突にUnexpected ')' for 'ANGLE_OPEN'とかいう謎のエラーで死んだ.

ほぼテンプレートの展開しかやっていなかったような状態だったのに唐突に死んだのに,完全に意味が不明😇 ANGEL_OPENってなんだ,天使〜〜〜〜〜😇😇って思ってたけどよくよくみたらangleだった. まぁ,角度開きも十分意味がわからないけれどもさ.

まとめ

眼科にいこう

本章

死因の特定

他殺の場合,出血箇所がどこなのかによって問題は解決することがある.不慮の自己でmulti byte charとかが入ってしまった場合とか,猫によってDELETE KEYが押されて文字が気付かないうちに消えていただけな場合には場所がわかれば,そこを直せばいいだけだ.

昔ACしたようなソースコードですら死ぬようになっていたので,どの部分が原因になって死んでいるのか特定することにした.

とりあえず,一行ずつコメントアウトしていくと以下の二行を消すと,死ぬことがなくなった.

#define FOR(i, a, b) for(int i = (int)(a); i < (int)(b); ++i)
#define REP(i, n) for(int i = 0; i < (int)(n); ++i)

なんだ,これらを使わなければいいだけか.

いや,無理.

これらは最も使うといっても過言ではないマクロだし,これ無しでやるなんて,しゃもじ無しでご飯をよそうみたいなものだよ.

まとめというか後記

ちなみにRFORが死んでいなかったので,何故だと思って一文字ずつ調査していったら,以下のように=を付けたら,蘇った.

#define RFOR(i, a, b) for(int i = (int)(b - 1); i >= (int)(a); --i)
#define FOR(i, a, b) for(int i = (int)(a); i <= (int)(b) - 1; ++i)

凶器の特定

死因がわかったところでなにも進展がなかったので,何によって殺されたのか調べることにした.AtomのPackageは頻繁に更新してるから,設定が変わっていて,デフォルト値とかが変わったのかもしれない.

というわけで,そっち方面で調べてたのだけれど,Atom Beautifyのissueだかでコマンドのuncrustifyを呼んでるだけだし,そっちに原因ないか調べてみてや.って言ってるのがあった.

そういえば,Pythonを書いているときに全く問題なく実行できるのに,pylintがErrorを吐き続けるってときにもpylint自体が既に死体になっていて,しょうがなくignore moduleに設定したきがする.

ということでいままでちゃんと出来たはずのソースにたいしてやってみたら,案の定死んでいた.

$ uncrustify 16D.cpp -c ~/.uncrustifyconfig
Output suffix: .uncrustify
Parsing: 16D.cpp as language CPP
16D.cpp:7 Error: Unexpected ')' for 'ANGLE_OPEN', which was on line 7
16D.cpp:8 Error: Unexpected ')' for 'ANGLE_OPEN', which was on line 8

まあ,こういうのは大体一回再インストールすれば直るもんだ.って思った記憶があるけど.コマンドの結果を復元するのが面倒なのでhistoryから抜粋.

2016-06-30 18:45  uncrustify 16D.cpp -c ~/.uncrustifyconfig
2016-06-30 18:46  brew update uncrustify
2016-06-30 18:46  brew uninstall uncrustify
2016-06-30 18:47  brew install uncrustify
2016-06-30 18:47  uncrustify 16D.cpp -c ~/.uncrustifyconfig
2016-06-30 18:47  brew uninstall uncrustify
2016-06-30 18:48  brew install uncrustify

あとよくよく見たら,ANGLE_OPENの行数書いてあったし,死因を一行ずつ確認する必要なかった.

まとめ

凶器はAtomではなく,uncrustifyそのものの方にあったから再インストールとかしてみたけどだめだった.

やっぱり眼科にいけ.

死亡時刻とついでに犯人の特定

最後に正常に動作したのは,二日だったはず.その間になにかをしでかしてしまったらしい. なにもやっていないのにパソコンが壊れたっていう人は自分がなにをやったかを覚えていないだけだったりする.

uncrustifyに関係するなにかをしてしまったなら,たぶんターミナルでだろう.ということで,historyを見てみることにした.こういうときにhistoryに日付と時刻が付いていると便利だ.

なにかいつもやっていないことでやったことを目で探してみると,brew upgradeが目にとまった.pythonopencvを入れようとしたときに,全然importできなかったのでので,よくわからないけれど,更新してみるかって思ったんだった.

2016-06-29 18:20  pip install cv2
2016-06-29 18:20  brew tap homebrew/science
2016-06-29 18:20  brew install opencv
2016-06-29 18:37  open .
2016-06-29 19:25  python -V
2016-06-29 19:29  atom .
2016-06-29 19:36  python test.py
2016-06-29 21:45  pip list
2016-06-29 21:46  exec $SHELL -l
2016-06-29 21:46  pip list
2016-06-29 21:47  brew list G opencv
2016-06-29 21:47  atom .
2016-06-29 21:48  exec $SHELL -l
2016-06-29 21:49  brew upgrade
2016-06-29 21:54  pyenv versions
2016-06-29 21:55  pyenv install 2.7.11
2016-06-29 21:57  pip list
2016-06-29 21:58  pyenv global 2.7.11
2016-06-29 21:58  pip
2016-06-29 21:58  pip list
2016-06-29 21:58  pip install --upgrade pip

貴様か?

恐らく,古いバージョンのuncrustifyでは動いていたのだが,brew updateによって新しくなって死んだのだろう.

まとめ

brew updateによって2016-06-29 21:49に殺された.

終章

蘇生の道は既に途絶えた

じゃあ,古いバージョンにすればいいじゃんってことで,旧バージョンのuncrustifyをinstallするべく,我々は調査に向かった.

http://stackoverflow.com/questions/3987683/homebrew-install-specific-version-of-formula

brew swich

brew switchすると,旧バージョンのものに切り替えることができるらしい.なるほど.

$ brew switch uncrustify 0.61
Error: uncrustify does not have a version "0.61" in the Cellar.
Versions available: 0.63

なんかそういえば uncrustify 0.61 are still installed.とかいわれたので.「一旦,完全に消してくれるわ!!」ってやったきがする.

やっちまったぜ.

brew search

brew searchすると,ものによっては旧バージョンも公開されているらしい.

$ brew search uncr
uncrustify ✔
Caskroom/cask/uncrustifyx

人生そんなに甘くはなかった.

git checkout

git checkoutによってバージョンを戻すことができるらしい.

$ cd /usr/local/Library/Formula/
$ git log uncrustify.rb
* e731da8 - uncrustify: update 0.63 bottle. (5 weeks ago) <BrewTestBot>
* 93f8118 - uncrustify 0.63 (5 weeks ago) <Jerzerak>
* d61b8d0 - uncrustify: update 0.62 bottle. (2 months ago) <BrewTestBot>
* 5e514bd - uncrustify 0.62 (2 months ago) <Yun Liaw>
* a3c7a21 - (grafted) stanford-parser: fix java dependency (3 months ago) <Jacob Zimmerman>
$ git checkout 5e514bd uncrustify.rb

なんか,0.62までしかなかったけど.とりあえず0.62にしてもういっかいフォーマットテストしてみよう.

$ uncrustify 16D.cpp -c ~/.uncrustifyconfig
Output suffix: .uncrustify
Parsing: 16D.cpp as language CPP
16D.cpp:7 Error: Unexpected ')' for 'ANGLE_OPEN', which was on line 7
16D.cpp:8 Error: Unexpected ')' for 'ANGLE_OPEN', which was on line 8

だめみたいですね…

まとめ

アンインストールは慎重にやろう.

死者蘇生

from Caches

そういえば,インストールするときにCachesからインストールしている気がする. 0.61がCachesに残っていたりするのではないかと考えだ.

$ brew install uncrustify
==> Downloading https://homebrew.bintray.com/bottles/uncrustify-0.63.el_capitan.bottle.tar.gz
Already downloaded: /Users/turane_gaku/Library/Caches/Homebrew/uncrustify-0.63.el_capitan.bottle.tar.gz
==> Pouring uncrustify-0.63.el_capitan.bottle.tar.gz
🍺  /usr/local/Cellar/uncrustify/0.63: 17 files, 724K
$ cd /Users/turane_gaku/Library/Caches/Homebrew/
$ l G uncr
-rw-r--r--    1 turane_gaku  staff   263K  5 31 01:56 uncrustify-0.63.el_capitan.bottle.tar.gz

さすがにだめみたい.

Download old tar.gz

でも,ダウンロードのアドレスが書いてあるっていうことはそこのバージョンを変えてあげれば持ってこれるのでは????? それをインストールしよう.ちょっとこの辺は結果を復元するのが面倒なので,historyで. たぶんDownloadingとか入っちゃってるのは上からコピーしたからだろうなぁ

2016-07-02 03:29  wget Downloading https://homebrew.bintray.com/bottles/uncrustify-0.61.el_capitan.bottle.tar.gz
2016-07-02 03:31  brew uninstall uncrustify
2016-07-02 03:31  brew install uncrustify
2016-07-02 03:31  brew uninstall uncrustify

だめだったみたいですね. たしか結局63がインストールされた気がする.

rename and install

ならrenameしてインストールだ.

2016-07-02 03:32  mv uncrustify-0.63.el_capitan.bottle.tar.gz uncrustify-0.63.el_capitan.bottle.tar.gz_
2016-07-02 03:32  brew install uncrustify
2016-07-02 03:36  mv uncrustify-0.61.el_capitan.bottle.tar.gz uncrustify-0.63.el_capitan.bottle.tar.gz
2016-07-02 03:36  brew install uncrustify
2016-07-02 03:36  brew install uncrustify
2016-07-02 03:37  brew install uncrustify -f

だめだったみたいですね. たしかsha256が違うよみたいに言われたような記憶がある.

change sha

どっかにメモってあるはずのハッシュ値を書きかえてしまえば良いのでは???

Homebrewの公式サイト

Homebrew はすべて Git と Ruby で動いているので、あなたが既に持っている知識で簡単に変更できます。

$ brew edit wget # opens in $EDITOR!

とあるので,これを使うっぽい.

2016-07-02 03:44  shasum -a 256 uncrustify-0.61.el_capitan.bottle.tar.gz
2016-07-02 03:44  brew edit uncrustify
url "https://downloads.sourceforge.net/project/uncrustify/uncrustify/uncrustify-0.63/uncrustify-0.63.tar.gz"
sha256 "dffbb1341a8d208e0c76b65209750e34e75b29c5a0e9a5d5a943df58bfdc2ae3"

head "https://github.com/uncrustify/uncrustify.git"

bottle do
 cellar :any_skip_relocation
 sha256 "387c422d75c6f1ca680cc4a0b8541dda9aeb40cd7b3fcf685efddbf1f29ea2d6" => :el_capitan
 sha256 "9e2c5d484dc6cc7a9eaa26b3b26ebeafaa9974144e43fcb6fedcae4196f0a654" => :yosemite
 sha256 "7bbc100632b13c81d2ec3ab897629f49effbb5dc76f991c4abde65566742b868" => :mavericks
end

なんかsha256がいっぱいある.

とりあえず0.63を0.61に変えて一番上のsha256を書き換えてみたけど,駄目だったので,sha256の行を全部コメントアウトしてやった.

$ brew install uncrustify
Warning: Cannot verify integrity of uncrustify-0.61.tar.gz
A checksum was not provided for this resource
For your reference the SHA256 is: 0d6c1d92a813e4a27140bf85e5f859749573b715c73c77f1efb381f95b304f47
==> ./configure --prefix=/usr/local/Cellar/uncrustify/0.61
==> make install
🍺  /usr/local/Cellar/uncrustify/0.61: 17 files, 720K, built in 25 seconds

万歳~~~~~😂😂!!!! なんか確認できないみたいなWarningでてるけどまぁいいや!!

まとめ

brewは神

正しい蘇生法

もうハッシュ値を書き換えることしか頭になかったから,全然見えてなかったけど,たぶん正しい蘇生法はsha256の行をコメントアウトするとかじゃなくて,

$ brew create ./uncrustify-0.61.el_capitan.bottle.tar.gz
$ brew install uncrstify

とかなんだろうなぁと思いました.試してはいません.

全体のまとめ

眼科に行け