NakamuraYoichiのblog

プログラマー NakamuraYoichi のアウトプット欲を満たすためのブログ。(iwanao さんの tweetにインスパイアされてこのブログを作りました。)

ソース管理プロバイダを自動判別する呪文 'SAK' の VS2003.NET 用マクロ

SAK の魔法を埋め込む VS2003.NET の .vcproj 用のマクロを作りました。 SAK とは、どのソース管理プロバイダーを経由してソースを取得しても、いい感じでソース管理に接続してくれるおまじないです。

以前、 VS2010 等の .vcxproj 用のマクロは作っていたのですが、今度は .vcproj 用のが必要になったのです。プロジェクト ファイルの項目 Scc〜 に文字列 "SAK" と設定するだけです。各項目は、 .vcxproj ではエレメントだったのですが、 .vcproj ではアトリビュートなので、そこを変えなければ...

...そこを変えるだけかと思ったら、ダメだったんです。

.vcxproj のときは、XmlDocument で開いて変更して Save するという手順でした。ところが、 .vcproj でそれをやると、改行やインデントが変わってしまうのです。 .vcproj は VS2003.NET が独自のルールでフォーマットしているんですね。仕方がないので、 StreamReader / StreamWriter で開いて、該当行があったら差し替えつつ、書き戻す、という作戦にしました。

マクロを記述する VB.NET での水平タブの書き方が分からなかったりしました。正解は vbTab ですね。

もうひとつ、日本語の文字化けにも遭いました。 shift_jis と指定して扱わなければいけません。普段のコーディングでは、デフォルトで MBCS で、気にしたことなんてほとんどなかったので、ちょっとあわてました。 .vcproj の中で日本語なんか出てくるのかよ、というツッコミもありつつ :p

Imports EnvDTE
Imports System.Diagnostics

Public Module SAK2003
Public Sub Execute()

Dim projs As System.Array
projs = DTE.ActiveSolutionProjects()

If (0 < projs.Length) Then 'selected projects
MsgBox("選択されているプロジェクトをSAKります。")
Dim i As Integer
For i = 0 To projs.Length - 1
Dim proj As Project
proj = projs.GetValue(i)
ExecuteTextProject(proj)
Next i
Else 'all projects of current solution
MsgBox("ソリューションの全てのプロジェクトをSAKります。")
Dim sln As Solution
sln = DTE.Solution()
Dim i As Integer
For i = 0 To sln.Projects.Count() - 1
Dim proj As Project
proj = sln.Projects.Item(i + 1)
ExecuteTextProject(proj)
Next i

End If

MsgBox("SAKりました。")

End Sub

Public Sub ExecuteTextProject(ByRef proj As Project)

'read all
Dim sr As System.IO.StreamReader
sr = New System.IO.StreamReader(proj.FullName, System.Text.Encoding.GetEncoding("shift_jis"))
Dim src As String
src = sr.ReadToEnd()
sr.Close()

'open string reader 1st
Dim stringReader As System.IO.StringReader
stringReader = New System.IO.StringReader(src)

Dim needToConvert As Boolean 'indicate need to convert
needToConvert = False

Dim existsSccProvider As Boolean 'indicate exists SccProvider
existsSccProvider = False

While True
Dim line As String
line = stringReader.ReadLine()
If line Is Nothing Then
Exit While
End If

'check SccProjectName
If line.IndexOf("SccProjectName=""SAK""") > 0 Then
ElseIf line.IndexOf("SccProjectName=") > 0 Then
needToConvert = True
End If

'check SccAuxPath
If line.IndexOf("SccAuxPath=""SAK""") > 0 Then
ElseIf line.IndexOf("SccAuxPath=") > 0 Then
needToConvert = True
End If

'check SccLocalPath
If line.IndexOf("SccLocalPath=""SAK""") > 0 Then
ElseIf line.IndexOf("SccLocalPath=") > 0 Then
needToConvert = True
End If

'check SccProvider
If line.IndexOf("SccProvider=""SAK""") > 0 Then
existsSccProvider = True
ElseIf line.IndexOf("SccProvider=") > 0 Then
existsSccProvider = True
needToConvert = True
End If
End While

'close string reader 1st
stringReader.Close()

If needToConvert Then

'open writer
Dim writer As System.IO.StreamWriter
writer = New System.IO.StreamWriter(proj.FullName, False, System.Text.Encoding.GetEncoding("shift_jis"))

'open string reader 2nd
stringReader = New System.IO.StringReader(src)

While True
'read line
Dim line As String
line = stringReader.ReadLine()
If line Is Nothing Then
Exit While
End If

'insert SccProvider
If (Not existsSccProvider) And (line.IndexOf("ProjectGUID=") > 0) Then
line = line + vbCrLf + vbTab + "SccProvider=""SAK"""
End If

'convert SccProjectName to SAK
If line.IndexOf("SccProjectName=""SAK""") > 0 Then
ElseIf line.IndexOf("SccProjectName=") > 0 Then
If line.Chars(line.Length - 1) = ">" Then
line = vbTab + "SccProjectName=""SAK"">"
Else
line = vbTab + "SccProjectName=""SAK"""
End If
End If

'convert SccAuxPath to SAK
If line.IndexOf("SccAuxPath=""SAK""") > 0 Then
ElseIf line.IndexOf("SccAuxPath=") > 0 Then
If line.Chars(line.Length - 1) = ">" Then
line = vbTab + "SccAuxPath=""SAK"">"
Else
line = vbTab + "SccAuxPath=""SAK"""
End If
End If

'convert SccLocalPath to SAK
If line.IndexOf("SccLocalPath=""SAK""") > 0 Then
ElseIf line.IndexOf("SccLocalPath=") > 0 Then
If line.Chars(line.Length - 1) = ">" Then
line = vbTab + "SccLocalPath=""SAK"">"
Else
line = vbTab + "SccLocalPath=""SAK"""
End If
End If

'convert SccProvider to SAK
If line.IndexOf("SccProvider=""SAK""") > 0 Then
existsSccProvider = True
ElseIf line.IndexOf("SccProvider=") > 0 Then
If line.Chars(line.Length - 1) = ">" Then
line = vbTab + "SccProvider=""SAK"">"
Else
line = vbTab + "SccProvider=""SAK"""
End If
existsSccProvider = True
End If

'write line
writer.WriteLine(line)
End While

'close string reader 2nd
stringReader.Close()

'close writer
writer.Close()

End If

End Sub

End Module

(解決済) Project を入れたら SharePoint の Office ファイルを開けなくなった

Microsoft Project 2013 をインストールしたら SharePoint 上の Excel ファイルや Word ファイルを開けなくなってしまう、という現象に遭いました。解決できたのでメモを残しておきます。

ググった結果。

「プログラムと機能」から Microsoft Project 2013 を「修復」して、「Microsoft SharePoint Foundation サポート」を削除すればいいようです。

RepairProject2013

Office のバージョンの混在は特に問題ではないようです。

DNSがオカシイとき、どの端末からどのコマンドを打つべきか~ipconfigとnslookupのまとめ画像~

...でしょうが、自分用にまとめた図を作りました。

Resolving_IP_Address

記事検索
  • ライブドアブログ