本記事は,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
が目にとまった.pythonにopencvを入れようとしたときに,全然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 はすべて Git と Ruby で動いているので、あなたが既に持っている知識で簡単に変更できます。
とあるので,これを使うっぽい.
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
とかなんだろうなぁと思いました.試してはいません.
全体のまとめ
眼科に行け