2014年11月9日日曜日

VS2013 でコマンドラインコンパイル

若干つまずいたのでメモ。

 boost で、いつの間にか新しいバージョン 1.57 が出ていたので、入れ替えようとしたら bootstrap.bat でエラーになり、コンパイルできませんでした。
 ログを見ると、"tlhelp32.h" というファイルがインクルードできないとのこと。
 探して見た所、ファイル自体は存在していて、ためしに IDE から新規プロジェクト作成して include してみても特にパスを追加することなくコンパイルは通る模様。 

 で、bootstrap.bat を実行しようとしていた DOS 窓で環境変数の INCLUDE と LIB をよくよく確認してみると、微妙にパス名が IDE と違っていました。
 うちは、Windows8.1+VisualStudio2013 環境なんですが、上の問題で必要なパスは

C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\

ところが、環境変数は

C:\Program Files (x86)\Windows Kits\8.0\Include\um\

となっていました。
 で、ふと DOS 窓のタイトルバーを見ると "VS2012 x64 Cross Tools" という文字が…。
 どうやら、スタートメニューにはなぜか VS2012 用のコマンドプロンプトが登録されており、僕はそれを起動していたわけです。VS2013 用のコマンドプロンプトはスタートメニューには直接登録されていないため、スタートメニューの "VisualStudio2013" グループの "Visual Studio ツール" でフォルダを開いて、そのフォルダにある VS2013 用コマンドプロンプトを使うのが正解だったようです。

 とりあえず、これでコンパイルはできるようになりましたが、なぜ VS2012 用のコマンドプロンプトが登録されていたのか…。うちは VS2012 は購入していないので、あるはずがないのです。VS2013 が VS2012 用の環境を互換性のために用意していたとか?(でも、上記のようにコンパイルできなかったわけですから、互換性ないですよね…) あるいは、Platform SDK とかもインストールしているので、それが勝手に作成したとか…?うーん、不明。

2014年11月8日土曜日

しばらく git 使ってみた

 最近、仕事で、とにかく Subversion だけは嫌、という話をしましたら git が導入されました。自分的には Mercurial 押しなんですが(というかそれまで git は使ったことがなかったんですが)、まあ似たようなものだろうとしばらく使ってみました。…結果、非常に大きな違いあり、苦労しました(汗

 何か作業をしてコミットして別のブランチに移動すると、コミットしたはずの内容が消えていました。もう、何がどうなっているのかさっぱりわからず、作業をやり直す羽目に。実際には、消えたわけではなく、ログから見えなくなっていただけだったんですが、気づくまで苦労しました。
 それで、なぜコミットが見えなくなっていたのか、ということなんですが、まず、git ではブランチに所属した状態でコミットしないと、そのコミットはどのブランチにも所属していないコミットとなり、ログから見えなくなってしまうんです。で、ブランチに所属した状態というのは、git では「ローカルブランチ」「先頭」にいる状態のことなんです。
 なので、ブランチの途中をチェックアウトしたり、または "origin/ブランチ名" という名前のついたブランチをチェックアウトすると(origin/ の名前がついたブランチはサーバにあるブランチであって、ローカルブランチではない)、ブランチに所属していない状態となり、コミットしてもそのコミットはどのブランチにも所属してないものとなってしまうのです。
 git を説明する人は、こういうルールをまず真っ先に書いておいて欲しい…マジで…。

ということで、git で作業する際のルール:

  • 基本的にチェックアウトは、ローカルブランチの先頭をチェックアウトする。
  • ブランチの途中や origin/ ブランチから作業を始めたい場合は、チェックアウトした後必ずその場で新しいブランチを作成する。

それと、上に書いたような見えなくなったコミットも消えてしまったわけではないので、復旧することは可能です。
コマンドラインから、
>git reflog
とすると、見えなくなっていたログも表示されます。この中から復旧したい場所のハッシュを控えておいて、
>git checkout ハッシュ
で、復帰します。ここで、新しくブランチを作成すれば、見えなくなっていた履歴がすべてこの新しいブランチに含まれた状態になります。

 ※git では、ブランチの作成は、作った時点から先が新しいブランチになるのではなく、リポジトリの先頭から作成した時点まですべてが新しいブランチに含まれる、という考え方のようです。これを利用して、後からブランチを作るということもできます。


 わかってしまえば問題はないんですが、やっぱり Mercurial の方が簡単でいいなあという印象です。他のコマンドについても、git はどうもわかりにくいというか、やってはいけないこともできてしまうという点で、かなり人には勧めにくいです。