Microsoft.VisualBasic.StrConvの戻り値が欠ける

Microsoft.VisualBasic.StrConvの戻り値が欠けるという怪奇現象でハマったので解決方法をメモ。

具体的な現象

StrConv("あいうえお", VbStrConv.Wide)
の戻り値が
”あい”
になる。
全角を全角に変換する無意味なコードであるが、”あいうえお”を戻してほしい。
他の開発機では”あいうえお”が戻る。

原因

ファイラーとしてX-Finderを使用しているのだが、これを互換モードで起動していたため。
X-Finder経由で起動したアプリケーション(VisualStudio含む)は全て同様の現象が発生する。
互換モードの指定を外せばOK。

パスに空白を含むファイルをgit archiveする

My Projcet/hoge

みたいなファイルがあるとき、git archiveするには

$ git archive --format=zip master My\ Project/hoge -o diff.zip

とすれば良い。

Gitで特定コミットのファイルだけをzipで納品するコマンド - atskimura-memo
をみて、自分でも差分のみをarchiveしようと考えて、

$ git archive --format=zip master `git diff --name-only HEAD..HEAD~` -o diff.zip

としてみたところ

fatal: pathspec 'My' did not match any files

と怒られた。

$ git diff --name-only HEAD..HEAD~

を実行してみると

My Project/hoge

と表示される。
スペースの前にバックスラッシュが必要なのか?
というわけでsedしてみる

$ git diff --name-only HEAD..HEAD~ | sed -e "s/ /\\\\ /g"
My\ Project/hoge

いいんじゃないかな…

$ git archive --format=zip master `git diff --name-only HEAD..HEAD~ | sed -e "s/ /\\\\ /g"` -o diff.zip
fatal: pathspec 'My' did not match any files

何故じゃ!!
分かる人がいれば教えてください。

Git開始3ヶ月くらいで見えてきた課題は……?

VSSしか使ったことのない人にブランチの概念、分散VCSの概念を効率よく理解してもらうにはどうしたらいいか?

つまり自分の理解が怪しいのです。
新メンバーが参入するときの障壁になりそうです。
なんとかフォローしたいのですが自分の理解が怪しく、日本語が不自由で難儀しています。
(自分は1週間くらいミッチリ触れたのでよいのですが、ミッチリ触らずに習熟できる方法はないものか……ないよね。。。)

DLL管理をやめたい(早くCIになりたい)

なぜかDLLがバージョン管理されています。管理されているDLLを参照してプログラムが成り立っており非常にツライです。
また、旧バージョンがコンパイルされたDLLがpushされていたりしてリリースが面倒極まりないです。
DLLを管理したところで差分の確認ができないので意味がないのです。
「動作確認したDLLをそのままリリースしたい」「過去にリリースしたものは再現確認用にとっておきたい」
という要求を満たして、かつCI的な動きをするには
リリースモジュール専用のリポジトリをこさえるのがよいのでしょうかね?
要はデプロイの運用が弱いのですが、巷に転がっているデプロイ情報はWebサービスのものが多くあまり参考になりません。。。


なんか愚痴っぽくなりましたね……

具体的にどんな運用にしたか

開発はWindowsクライアントアプリで、VB.NET 4.0製です。
開発機もWindowsだし、ファイルサーバなど各種サーバーもすべてWindowsです。

リモートリポジトリ

リモートリポジトリはファイルサーバーに作成することにしました。
リポジトリの共有方法はhttp、ssh、git などいろいろありますが、試行錯誤の結果普通にファイル共有することにしました。
Windowsで社内LANならば一番お手軽ではないでしょうか。sshとかめんどくさいし。
つまり、ファイルサーバーに共有ディレクトリを作成してリポジトリを入れておき、
開発者は //server-name/shared-directory/project-name.git にアクセスします。

リポジトリの単位

VSSで慣れ親しんだ形を優先して、ベースとなるバージョンで1つのリポジトリ+各ユーザーカスタマイズ版ごとに1つのリポジトリのような構成にしました。
Gitは、異なるリポジトリ間でもマージ処理ができるため今のところ問題ないです。
ベースのリポジトリで修正→各ユーザーカスタマイズリポジトリへマージ のように運用してます。

git-flow

git-flowがフィットしそうだったので導入しました。
何でもかんでもmasterにpushされると、リリースのタイミングが図れないのです。
プログラマはfeatureとhotofixだけ操作するような運用にしてあります。

GUIツール

GUIがないとプログラマが作業できない」と言われたので(orz)GUIツールを導入しています。
GUIはわかりやすそうなのでSoureceTreeを導入しました。
こいつはアホみたいにメモリを食うのでVisualStudioとの併用を考えるとそれなりのマシンスペックが必要です。
GitExtentionsも悪くないのですが、git-flowを導入したかったのでSourceTreeに決定しました。
git-flowに対応してるGUIがSourceTreeしかなかったのです。

コミットルール

とくに設けませんでした。まずはGitに慣れることが一番優先であると考えたためです。
ただし、redmineへ連携したいのでコメントにチケット番号を入れることだけはupdateフックで強制してあります。
いきなりpush時に怒られると可哀想なので、commitフックにも同様のチェックを入れて配布しました。
人によっては1つの作業のコミットログがいくつもあってログが見づらいですが、とりあえず気にしないことにしてます。

修正差分の確認

プログラマが作業した結果を確認するのですが、魔法の呪文

git difftool master... -d

を広めました。Git導入してよかったでしょ?

リリース

差分だけリリースしているため、魔法の呪文

git archive --format=zip --prefix=archive/ HEAD `git diff --name-only HEAD HEAD~1` -o archive.zip

を広めました。Git導入してよかったでしょ?
Windowsアプリで差分リリースって何?→DLLが多いのでコンパイル済みのDLLをGit管理してます。。。。。(助けて)

VSSをいきなりGitへ切り替えてみた

最近の仕事では基盤となるバージョンを1つ持って、ユーザーさん毎にカスタマイズして提供するようなことをしています。
ずーっとVSSでソース管理をしていたわけですが、さすがに限界。
redmineは何年か前に運用を始めていたんだけども、VCSがダメだとドウシヨウモナイです。
VSSのサポートなんかとっくに切れてますし。

というわけで、7月くらいにスパッとGitへ移行しちゃいました。
技術的な話はそこらにいくらでも転がってるので、運用面について書いておきます。

VSSの何がダメか

まず、VSSを切り捨てる理由を挙げていろんな人を納得させなきゃなりません。

  • ユーザーごとのカスタマイズ管理がしにくい(ブランチ機能はあるけど、マージがクソなので実質的に不可能)
  • 遅い/落ちる(システムがなかなか大規模なのでソースを全部取得するのに30分くらいかかります。途中で誰かがチェックインするとお亡くなりになります。
  • ブランチを使う気になれないので、リリース時期じゃない修正もとりあえずチェックインしちゃう。(リリース作業が阿鼻叫喚)

Gitでクリアできるのか

VSSのダメなところはまだまだありますが、とりあえずこれくらいにしておきます。Visual Source Shredder なんて渾名がすべてをあらわしています。
で、こいつらをGitで解決できるんか?って話ですが、

  • ブランチ管理が比較的簡単
  • 高速だし、途中で誰かがpushしてもpullやcloneが死んだりしない

ということで、すべてカバーできそうです。
すでに他のプロジェクトで実績のあるSVNって手もありましたが、

  • 大規模開発では速度面で不満
  • ブランチ切りまくる運用には不向きそう
  • 個人的興味(内緒)

ってことでGitを推したところ、めでたく通りました。

数値に見えるものをCOUNTIFすると不正確になる

A列 B列の数式 B列の値
10060022100000025 =COUNTIF($A$1:$A$3, $A1) 3
10060022100000026 =COUNTIF($A$1:$A$3, $A2) 3
10060022100000027 =COUNTIF($A$1:$A$3, $A3) 3

A列の値は全て違うはずなんだけど…。
A列の文字列が全て数字であるため、Excel的には数値として扱われるようです。
で、数値の精度が15桁であるために先頭15桁のみを比較して「一致」としているらしいです。

A列 B列の数式 B列の値
10060022100000025 =SUMPRODUCT(($A$1:$A$3=$A1)*1) 1
10060022100000026 =SUMPRODUCT(($A$1:$A$3=$A2)*1) 1
10060022100000027 =SUMPRODUCT(($A$1:$A$3=$A3)*1) 1

のようにSUMPRODUCTで何とかなります。

IVSSCheckoutsのItemを取得するためのIndexは?

いまどきVSSなんか使ってる人は少ないと思いますが、今の仕事では現役です。
デフォルトのUIでは賄えないニッチな作業をするときには「SourceSafeTypeLib」を使って何やらしてます。

で、チェックアウト中の情報を取得する IVSSCheckouts インターフェイスというのがあるのですが
名前が示す通りチェックアウト情報のコレクションになってます。
日本語のMSDNにはイテレート処理するサンプルしかありません。
とりあえず1件目を見たいときはどうするのだろう…? Indexの型はObjectだしさ…

調査の結果 何故か日本語の情報は見当たらず。
Microsoft Visual SourceSafe OLE Automation

IVSSCheckouts methods

HRESULT Item ([in]VARIANT sItem, [out,retval]IVSSCheckout **ppICheckout);

Retrieves one particular checkout record.
The item may be specified in one of two ways: either by using an integer (which represents a one-based index into the collection)
or by naming a user name (which returns the checkout record, if any, for that particular user).

一つの特定のチェックアウトのレコードを取得します。
項目は、次のいずれかの方法で指定できます。どちらの整数を(これはコレクションに1から始まるインデックスを表します)を使用するか、
ユーザー名を(もしあればどれがその特定のユーザのために、チェックアウトのレコードを返します)命名によって。

1から始まるIndexってのは久しぶりにであった気がします。