煙と消えるその前に

一服してるうちに忘れる、自分のための備忘録。とかとか

git bad default revision 'HEAD' に困ったので手動修正したけど不安しか残らなかった

VirtualBox上のCentOSで開発をしていて、ある日VMがフリーズしたので渋々強制再起動したらローカルリポジトリが壊れた。
表題のエラーが出たのでとりあえず修復したが、完全に直っているか不安で結局リポジトリをcloneし直したという記録。

gitコマンドが軒並み失敗する

$ git status
fatal: bad default revision 'HEAD'

$ git log
fatal: bad default revision 'HEAD'

!?
どういうことやと思ってHEADの中身を見てみる

$ cat .git/HEAD
ref: refs/heads/mybranch

よしよし、直近で作業してたブランチのままだ
ブランチのファイルを念のため確認

$ find -name *mybranch*
./.git/refs/heads/mybranch
./.git/refs/remotes/origin/mybranch

ファイルはあるなー
中身どうなってんだろ

$ cat .git/refs/heads/mybranch
(空)
$ cat .git/refs/remotes/origin/mybranch
(空)

あー何も無い
HEADコミットのSHAが取れないからエラーになってるのかな
リモートからブランチの最新コミットを見つけて手動で埋めてみる

$ git ls-remote origin mybranch
リモート上の最新SHA	refs/heads/mybranch

$ echo -n "リモート上の最新SHA" > .git/refs/heads/mybranch

とりあえずこれで動くようにはなったけど...
VMフリーズの影響で一部ファイルが壊れていたようで、他にも影響が残っている可能性があるし、
手動でファイル書き換えているので完全に直っている保証もないんだよなー
で、結局不安だらけだったのでリポジトリをcloneし直した。

あれこれ終わってから気づいたけど、せめてファイルが編集状態のまま残っているか確認して退避させればよかった
気持ち悪いからと、後腐れなく削除した後だった...

Railsでrender前に共通処理を入れたくて

一覧表示をする際に、ログインユーザに応じて一覧をカスタマイズしたかった。
複数コントローラで同じ処理が必要だったのでafter_actionで実装してみたけど期待通りに動かない!なんでさ!
と思ったら、renderの後にafter_actionが実行されるというオチでした。
で、render前に処理を入れる仕組みないんだっけ?と調べたんだけど、結局自前実装するオチに。

renderをオーバーライド

ぱっと思いついてセルフ却下。
アクション判定しないといけないしイケてないよなーと思ったから。

class IndexCustomizedController < ApplicationController
  def customize
    ...
  end

  def render(*args)
    customize if @_action_name == "index"
    super
  end
end

before_render

あーこれこれ、やっぱりあるよね。
Rails5系の情報が見つからなかったけど参考にできそう。

思いとどまって自前実装

いやでもちょっと待てよ
フレームワークに手を入れてまでやることか...?と思いとどまった。
(AOP的にはrender前もフックポイントと認識されるんだろうか?)
しかもbefore_renderがあると、コードを読むときにその存在を覚えて読まないといけないので*_actionとは違って可読性も落ちそう。
ということで結局moduleを定義することにした。

class MyController < ApplicationController
  def index
    ...
    custom_data = IndexCustomizer.costom(user, data)
    ...
  end

  ...
end

VS+C#:1プロジェクト内で同一ライブラリの複数バージョン利用する

なぜか最近C#と付き合うことになった僕です。
WindowsもVisualStudioも馴染みがない僕です。
これまで主にvimを使っていたんですが、VisualStudio(使い慣れたらたぶん)便利ですね!さすがIDEって感じ。
で、参照の追加でMvvmLightToolKitを入れたんですが、もし複数バージョンを同時に使いたくなったらどうするんだろ?と興味本位で調べてみました

複数バージョンのアセンブリをプロジェクトの参照に追加する

仮にMvvmLightToolKit 5.2と5.3を入れたいとすると、以下の感じでできました。

  • 5.3はNuGetで普通にインストール
  • 5.2はアセンブリをDLしてインストール

- こちらからDLしてMVVM Light Toolkit - Home
- vsixをunzipして、さらに中身のpackageファイルもunzipするとdllが出てくる
- 出てきたdllをGalaSoft.MvvmLight52.dllにrenameしておく
- dllのファイル名が5.3と同一になっているため、参照の追加でエラーになったため
- dllをVSの参照の追加から追加する

ソースコード内で両バージョンのアセンブリを利用する

以下のような感じでaliasを張ってやることで解決しました

- 例えば、5.2系の方のアセンブリにMvvmLight52という名前をつけます。

  • 利用するコードは以下のような感じでいけました。
extern alias MvvmLight52;
using GalaSoft.MvvmLight;

namespace MyAPP
{
    // 5.2のViewModelBaseを利用
    class MyClass : MvvmLight52.GalaSoft.MvvmLight.ViewModelBase
    {

    }

    // 5.3のViewModelBaseを利用
    class MyClass2 : ViewModelBase
    {

    }
}