mamori017.log

歴史的クソブログ

Visual Studioのデバッグシンボルをローカルにキャッシュした

f:id:mamori017:20180607130838p:plain

某所からVisual Studioデバッグが遅いと言われたので確認してみたところ、 デバッグシンボルがローカルにキャッシュされるよう設定されていなかった。*1

これではデバッグの都度サーバーからシンボルを読み込むことになり効率が悪いので、デバッグシンボルをローカルにキャッシュするよう設定することにした。

設定方法

f:id:mamori017:20180607130833p:plain

  • ディレクトリパスを入力したら「すべてのシンボルを読み込む」をクリックする。 シンボルサーバーから読み込んだデータがキャッシュされる。

f:id:mamori017:20180607130836p:plain

  • シンボルの読み込みが終わったら[OK]をクリックする。

  • シンボルファイルの場所のリストに「Microsoftシンボルサーバー」が無い場合はサーバーの場所を指定する。

Microsoft シンボル サーバーの場所は、http://msdl.microsoft.com/download/symbols です。

シンボルを使用したデバッグ

*1:デフォルトでキャッシュされていた気がするが設定されてなかった。

ClickOnceアプリケーションの配布をGitHub Pagesでできないか試したら警告が来た

ClickOnceアプリケーションの配布はHTTPで更新ファイルを参照できさえすれば動作するはず。 それならGitHubリポジトリ上でも実現できるのではないかと思ったのでやってみました。

といっても既にGitHubでの運用を検討されている方はおられるわけで。 どうやらリポジトリにプッシュしたファイルを参照する場合、応答ヘッダが異なるため上手くいかないようです。

devadjust.exblog.jp

GitHub Pages

それなら、(多分大丈夫だろうと思いつつ)GitHub Pages上に配布ファイルを配置した場合の動作はどうなのか。

以前はリポジトリGitHub Pages用のgh-pagesブランチを切ったうえでHTMLファイルなりを配置する必要がありました。 この状態だとコードはmasterブランチ、ClickOnceで配布するファイルはgh-pageブランチへプッシュする必要があるのですが、 現在はmasterブランチ上でGitHub Pagesも管理できるようになっています。

masterブランチでGitHub Pagesを管理する方法

リポジトリのSettings→GitHub Pagesでmaster branchを選択し、リポジトリルートにdocsディレクトリを作成します。 この/docsディレクトリ配下にHTMLファイルなりを配置し、https://(user_name).github.io/(repository_name)にアクセスすると、リポジトリGitHub Pagesが表示されるようになります。

ClickOnceアプリケーションの配置

コードブランチとGitHub Pagesブランチを分ける必要が無いのであれば、ClickOnceの発行先を/docs配下に設定し、 ビルドとClickOnceのアプリケーション発行後にリポジトリにプッシュすれば大した手間もかからずアプリケーションの配布環境が構築できるはずです。

GitHub Pages用ディレクトリ(ClickOnceアプリケーションの配布環境)を含んだmasterブランチの構成を以下の状態にしてmasterブランチへプッシュしてみます。

/ClickOnceApp(master)
┝.git
┝/ClickOnceApp(アプリケーション)
┝/docs(GitHub Pages配置ディレクトリ・ClickOnce配布用)
|┝Application Files
|┝ClickOnceApp.application
|┗setup.exe
┝.gitattributes
┝.gitignore
┝ClickOnceApp.sln
┝LICENSE
┗README.md
GitHubから警告メールが届く

上記の構成でリポジトリにプッシュしたところ、ClickOnceでのアプリケーションアップデートを実施することができました。 ビルドついでに発行するだけなので手間にもならないしこれはこれで良いのではと思ったのですが、 リポジトリへのプッシュ直後にGitHubから警告のメールが届いていました。

GitHub Pagesでバイナリファイル公開しているならRelease機能を使いなさいとのこと。その通りなので何とも言えません。*1 ちなみに、リポジトリ内にバイナリファイルがあるとプッシュするたびに警告メールが届きつづけるみたいです。

The page build completed successfully, but returned the following warning for the master branch:
 
It looks like you're using GitHub Pages to distribute binary files. We strongly suggest that you use releases to ship projects on GitHub. Releases are GitHub's way of packaging and providing software to your users. You can think of it as a replacement to using downloads to provide software. We found the following file(s) which may be a good candidate for releases: package/setup.exe. For more information, see https://help.github.com/articles/about-releases/.
 
For information on troubleshooting Jekyll see:
 
https://help.github.com/articles/troubleshooting-jekyll-builds
 
If you have any questions you can contact us by replying to this email.

結論

ClickOnceのアプリケーション配布自体は可能だったのですが、GitHubが推奨する使用方法ではないのでやるべきではないです。

配布するアプリケーションバージョン管理が必要になったら、CodeCommitからS3にデプロイするのが現実的に考えて楽なのかなと思っています。何となく。

dev.classmethod.jp

警告でアカウントがBANされても困るのでGitHubのサポートにメールで謝っておきました。

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

わかばちゃんと学ぶ Git使い方入門〈GitHub、Bitbucket、SourceTree〉

わかばちゃんと学ぶ Git使い方入門〈GitHub、Bitbucket、SourceTree〉

*1:rawgitというサービスを使えばReleaseにアップしたデータを参照できるらしい。

DataGridView上のデータを絞り込み表示する

DataGridViewに表示されているデータに対して、絞り込み条件を指定し表示させたい場合は BindingSourceクラスのFilterプロパティが使用できる。

BindingSource.Filter プロパティ (System.Windows.Forms)

手順
  1. DataGridViewにバインドしたDataSourceをDataTableとして取得する。
  2. DataTableをBindingSource.DataSourceプロパティにセットする。
  3. BindingSource.Filterプロパティに絞り込み条件を設定する。
  4. Filterに設定した条件で絞り込みされた結果がDataGridViewに表示される。

フォーム上のテキストボックスに入力された値がDataGridViewに対しての絞り込み条件としたとき、 TextChangedイベントが発生するたびにフィルター処理を呼ぶようにハンドラを追加する。 見かけ上分かりやすかったのでTextChangedをイベントに指定しているが、このイベント自体は別に何でも良い。

''' ロード時の初期設定
Private Sub Form_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    ' テキストボックスに変更があった場合のイベントハンドラを追加する
    AddHandler txt_Condition.TextChanged, AddressOf DataGridViewFilter
End Sub

テキストボックスがTextChangedイベントを発生するたびに呼び出される関数上で、 絞り込み条件の記述を整形し、BindingSourceにデータと絞り込み条件を設定する。

Private Sub DataGridViewFilter()
    Dim objBind As BindingSource
    Dim objData As DataTable
    Dim strFilter As String

    ' DataGridViewにバインドしたデータをDataTableとして取得する
    objData = CType(DataGridView1.DataSource, DataTable)

    ' データが存在する場合
    If IsNothing(objData) = False Then
        objBind = New BindingSource
        ' バインドするデータソースにDataTableをセット
        objBind.DataSource = objData
        ' DataGridViewの表示内容を絞り込むための条件式を設定する
        strFilter = "Color like '%" & txt_Condition.Text & "%'"
        ' データソースにフィルターをセット
        objBind.Filter = strFilter
    End If
End Sub

DataGridViewが以下の状態で表示されている場合、

Seq Month Day Color
1 8 1 Orange
2 4 17 Blue
3 9 19 Light Pink
4 3 4 Yellow
5 9 21 Pink
6 7 13 White
7 1 1 Red
8 2 10 Green
9 6 13 Purple

テキストボックスにPinkと入力があった場合、DataGridViewに対する絞り込み条件はColor like '%Pink%'となる。 あとはこの条件式をBindingSourceにセットすることでDataGridViewの表示状態は以下のように変更される。

Seq Month Day Color
3 9 19 Light Pink
5 9 21 Pink

記述した内容だと入力の都度TextChangedイベントが発生してしまう。 絞り込みの条件句を部分一致にしているので、Pと入力した時点でTextChangedイベントが発生し、 Light PinkPinkPurpleの3件が表示される。 このあたりの振る舞いは別のイベントで制御するほうがスマートかもしれない。*1

この記事は今度書き直す。

*1:とはいえEnterキーとか検索ボタンをトリガーにしたくないという要望があってこのまま実装した。