2014年7月14日月曜日

Visual Studio 2013 SDK で拡張機能を作りたい その7

拡張機能の設定方法を調べてみる。

  1. メニューバーに、新しく項目が追加される。
  2. ツールメニューに、新しく項目が追加される。
  3. ツール→オプションに、新しく項目が追加される。

1と2は、設定画面も作らなくてはならないので、パス。
(そんなスゴイものを作るわけでもないし)
というわけで、3の方法をage

まずプロジェクトに、新しいクラスを追加する。
namespace Company.VSPackage7
{
    using Microsoft.VisualStudio.Shell;

    public class MyOptionPage : DialogPage
    {
        public bool MyProperty { get; set; }
    }
}

つぎに、拡張機能でオプションページを使う宣言を追加する
namespace Company.VSPackage7
{
    using System;
    using System.Diagnostics;
    using System.Globalization;
    using System.Runtime.InteropServices;
    using Microsoft.VisualStudio.Shell;
    
    [PackageRegistration(UseManagedResourcesOnly = true)]
    [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
    [ProvideOptionPage(typeof(MyOptionPage), "MyOption", "General", 0, 0, true)]
    [Guid(GuidList.guidVSPackage7PkgString)]
    public sealed class VSPackage7Package : Package
    {
        public VSPackage7Package()
        {
            Debug.WriteLine( ...
        }

これだけで、オプションページが表示されるようになる。

PropertyGridと同じ属性が使えるようだ
namespace Company.VSPackage7
{
    using System.ComponentModel;
    using Microsoft.VisualStudio.Shell;

    public class MyOptionPage : DialogPage
    {
        [Category("なにか")]
        [DisplayName("なにかのON/OFF")]
        [Description("なにかをON/OFFします。")]
        public bool MyProperty { get; set; }
    }
}


もちろん、親のインスタンスにもアクセスできる
(MyOptionPageのインスタンスは、勝手に作られて勝手に消えるので、アクセス出来ないと困る)
    public class MyOptionPage : DialogPage
    {
        public override void LoadSettingsFromStorage()
        {
            var obj = GetService(typeof(VSPackage7Package)) as VSPackage7Package;
            if (obj != null)
            {
                // 読込処理
            }
            
        }

        public override void SaveSettingsToStorage()
        {
            var obj = GetService(typeof(VSPackage7Package)) as VSPackage7Package;
            if (obj != null)
            {
                // 保存処理
            }
        }

2014年7月3日木曜日

Visual Studio 2013 SDK で拡張機能を作りたい その6

VisualStudioの起動と同時に、インスタンスが生成されるようにしてみた。

    [PackageRegistration(UseManagedResourcesOnly = true)]
    [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
    [ProvideAutoLoad(VSConstants.UICONTEXT.NoSolution_string)]
    [ProvideAutoLoad(VSConstants.UICONTEXT.SolutionExists_string)]
    [ProvideAutoLoad(VSConstants.UICONTEXT.SolutionHasMultipleProjects_string)]
    [ProvideAutoLoad(VSConstants.UICONTEXT.SolutionHasSingleProject_string)]
    [ProvideOptionPage(typeof(Properties), "DteEventView", "General", 0, 0, true)]
    [Guid(GuidList.guidVSPackage5PkgString)]
    public sealed class VSPackage5Package : Package
    {

多少、力技な気がしなくもないが・・・

拡張機能は、基本的には使うとき(呼ばれた時)にインスタンスが生成される。
そうでなければ、VisualStudioの起動が重くなる。
しかしイベントハンドラは、最初に登録しないと、他にやるタイミングがないよな。

2014年6月25日水曜日

Visual Studio 2013 SDK で拡張機能を作りたい その5

前回に引き続き、サンプルプログラムと実行結果

[PackageRegistration(UseManagedResourcesOnly = true)]
[InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
[ProvideAutoLoad(VSConstants.UICONTEXT.SolutionExists_string)]
[Guid(GuidList.guidVSPackage4PkgString)]
public sealed class VSPackage4Package : Package
{
    /// <summary>Default constructor of the package...</summary>
    public VSPackage4Package()
    {
        var dte2 = Package.GetGlobalService(typeof(DTE)) as EnvDTE80.DTE2;

        var myOutWin = dte2.ToolWindows.OutputWindow.OutputWindowPanes.Add("ほげ");
        myOutWin.OutputString("♪ふが♪");

        Debug.WriteLine(string.Format("Entering constructor for: {0}", this.ToString()));
    }


どうやって動かすのか、一番悩んだ。



Visual Studio 2013 SDK で拡張機能を作りたい その4

実は、マクロとアドインとSDKの違いを知らなかった。

マクロ 既に廃止されたので知らない
アドイン DTEというCOMを相手にする・・・VS2013では非推奨
(新しいプロジェクト>その他のプロジェクトの種類>機能拡張>Visual Studio アドイン)
VSPackage
(SDK)
MEFで注入!DTEも使える
(新しいプロジェクト>その他のプロジェクトの種類>機能拡張>Visual Studio Package)

アドインは、VSPackageに変換できるようだ。(msdn: アドインを VSPackage に変換する)
というわけで、DTEから攻めることにする。

EnvDTE80(DTE2)

*EnvDTE80は、EnvDTE(_DTE)のすべてを含む。

ActiveDocument アクティブドキュメントを取得します。
ActiveSolutionProjects 現在選択されているプロジェクトの配列を取得します。
ActiveWindow 現在アクティブなウィンドウ、または他にアクティブなウィンドウがない場合は最前面に表示されたウィンドウを返します。
AddIns 現在使用できるすべてのアドインを含む AddIns コレクションを取得します。
Application インフラストラクチャ。マイクロソフト内部でのみ使用します。
CommandBars 開発環境のコマンド バーへの参照を取得します。
CommandLineArguments コマンド ライン引数を表す文字列を取得します。
Commands Commands コレクションを返します。
ContextAttributes ContextAttributes コレクションを取得します。このコレクションを使用すると、オートメーション クライアントは、[ダイナミック ヘルプ] ウィンドウで現在選択されている項目に新しい属性を追加し、追加した属性のコンテキスト ヘルプを表示できます。
Debugger デバッガー オブジェクトを取得します。
DisplayMode 表示モード (MDI またはタブ付きドキュメント) を取得します。
Documents 開発環境で開いているドキュメントのコレクションを取得します。
DTE トップレベルの機能拡張オブジェクトを取得します。
Edition 環境のエディションの説明を取得します。
Events Events オブジェクトへの参照を取得します。
FileName インフラストラクチャ。マイクロソフト内部でのみ使用します。
Find グローバル テキスト検索処理を表す Find オブジェクトを取得します。
FullName オブジェクトのファイルの完全パスと名前を取得します。
Globals ソリューション (.sln) ファイル、プロジェクト ファイル、またはユーザーのプロファイル データに保存できるアドイン値を格納する Globals オブジェクトを取得します。
IsOpenFile インフラストラクチャ。マイクロソフト内部でのみ使用します。
ItemOperations ItemOperations オブジェクトを取得します。
LocaleID 開発環境を実行しているロケールの ID を取得します。
Macros Macros オブジェクトを取得します。
MacrosIDE マクロ IDE のオートメーション モデルのルートを取得します。
MainWindow メイン開発環境ウィンドウを表す Window オブジェクトを取得します。
Mode 開発環境のモード (デバッグまたはデザイン) を取得します。
Name _DTE オブジェクトの名前を設定または取得します。
ObjectExtenders ObjectExtenders オブジェクトを取得します。
Properties [ツール] メニューの [オプション] ダイアログ ボックスで使用できるすべてのカテゴリとサブカテゴリを表す Properties コレクションを返します。
RegistryRoot Visual Studio レジストリ設定のルートへのパスを含む文字列を取得します。
SelectedItems 環境で現在選択されている項目を含むコレクションを取得します。
Solution 現在の環境のインスタンスで開いているすべてのプロジェクトを表し、ビルド オブジェクトにアクセスできる Solution オブジェクトを取得します。
SourceControl オブジェクトの背後にあるファイルのソース コード管理の状態を操作できる、SourceControl オブジェクトを取得します。
StatusBar メイン開発環境ウィンドウのステータス バーを表す StatusBar オブジェクトを取得します。
SuppressUI オートメーション コードの実行中に、UI を表示するかどうかを示す値を取得または設定します。
ToolWindows ツール ウィンドウを検索するためのショートカットとして使用されている ToolWindowsオブジェクトを取得します。
UndoContext グローバル UndoContext オブジェクトを取得します。
UserControl 環境がユーザーまたはオートメーションのどちらによって起動されたかを示す値を設定または取得します。
Version ホスト アプリケーションのバージョン番号を取得します。
WindowConfigurations 使用できるすべてのウィンドウの構成を表す WindowConfigurations コレクションを取得します。
Windows オブジェクトで表示されるウィンドウを含む Windows コレクションを取得します。

EnvDTE90

Debugger3 Debugger3 を使用すると、デバッガーの状態やデバッグ中のプログラムの状態を問い合わせたり、操作したりできます。 Debugger3 は、Debugger2 インターフェイスおよび Debugger インターフェイスよりも優先されます。
ExceptionGroups デバッガーの初回例外のダイアログで使用可能なトップレベルのグループを表します。
ExceptionSettings ExceptionSetting オブジェクトのコレクションです。各オブジェクトは、デバッガーの例外設定のセットを表します。
HTMLWindow3 Visual Studio 統合開発環境 (IDE: Integrated Development Environment) の HTML ドキュメント ウィンドウを表します。
Module デバッグ中のプロセス内のモジュールを表します。
Modules デバッグ中のプロセスで使用可能なモジュールのコレクションを表します。
Process3 Process3 オブジェクトは、プロセスのチェックおよび操作に使用されます。 Process3 オブジェクトは、Process2 オブジェクトおよび Process オブジェクトよりも優先されます。
Solution3 統合開発環境 (IDE: Integrated Development Environment) のすべてのプロジェクトとソリューション全体のプロパティを表します。 Solution および Solution2 に代わるものです。
Template 統合開発環境 (IDE: Integrated Development Environment) の現在のインスタンスで使用できる Visual Studio テンプレートを表します。
Templates 現在のプロジェクトにあるすべてのテンプレートを表します。
Thread2 Visual Studio アプリケーション内のスレッドを表します。
ToolBoxTab3 [ツールボックス] のタブとそのタブに含まれるすべてのオブジェクトを表します。 ToolBoxTab3は、ToolBoxTab インターフェイスと ToolBoxTab2 インターフェイスに代わるものです。

EnvDTE100

Debugger5 Debugger5 を使用して、デバッガーの状態やデバッグ中のプログラムの状態を問い合わせたり、操作したりできます。 Debugger5 は、Debugger4 インターフェイスよりも優先されます。
Expression2 Expression2 オブジェクトには、式の評価で返されたアイテムをチェックするプロパティが格納されます。
Solution4 統合開発環境 (IDE: Integrated Development Environment) のすべてのプロジェクトとソリューション全体のプロパティを表します。 Solution , Solution2 および Solution3 よりも優先されます。

長くなったので、ここまで。

2014年6月20日金曜日

Visual Studio 2013 SDK で拡張機能を作りたい その3

前回のウィザードで作ったプロジェクトは、まったく取っ掛かりがないので、今度はメニューコマンドにチェックを入れて、プロジェクトを作ってみた。プロジェクト名は、VSPackage2だ。

実行すると、メニュー~ツールに「My Command name」というメニューが増えている。

メニューを選択すると、こんなダイアログが出た。

ダイアログのメッセージを参考に、ソースを検索してみると、VSPackage2Package.csの、MenuItemCallbackが呼ばれている。
今度は、MenuItemCallbackで検索すると、VSPackage2PackageクラスのInitializeメソッド内で、メニューを登録しているようだ。

VSPackage2PackageクラスのVSPackage2Package, Initialize, MenuItemCallbackの3箇所にブレークポイントを張ってみると、メニューをクリックしてから、VSPackage2Packageのインスタンス生成がはじまる。つまり、メニュー登録の処理は、メニューをクリックしてから始まっている??

どうやら、VSPackage2.vsctのXAMLっぽい書式で、メニューに表示する内容とか、メニューに紐付けられたパッケージが記述されているようだ。

要するに、

  1. Visual Studioの起動時にパッケージが読み込まれ、VSPackage2.vsctで定義された内容を、メインメニューに追加する。
  2. メニューをクリックしたら、(まだ無ければ)Packageのインスタンスを生成し、Initializeメソッドを呼ぶ。
  3. Initializeメソッドは、コマンド機能テーブルに、コマンド番号とコールバックを登録する。
  4. コールバックが呼ばれて、ダイアログが出る。

こんな感じだな。

コレクションの初期化 Repeat or Range

参照型のコレクションを、インスタンス込みで初期化したい時がある。

なんか動きがおかしいので、デバッグしていたら、以下の様なことがわかった。

    int numOfFoo = 3;

    // newが1回だけ実行され、その結果が3回使われる。
    // コレクションの要素数は3だが、全て同じインスタンスが入っている。
    var listX = Enumerable.Repeat(new Foo(), numOfFoo).ToList();

    // newが3回実行される。
    // コレクションの要素数は3で、別々のインスタンスが入っている。
    var listO = Enumerable.Range(0, numOfFoo).Select((x) => new Foo()).ToList();

配列の初期化にRepeatを使っていたので、同じように書いたらダメダメだった。
気をつけよう。

2014年6月19日木曜日

Visual Studio 2013 SDK で拡張機能を作りたい その2

出力ウィンドウに割り込みたいので、まずは調査から。

This example shows how to parse a standard build message for errors, and add an item to the Error window, if appropriate, before the message is sent to the Output window.
この例では、エラーの標準のビルドメッセージを解析し、適切な場合には、メッセージが出力ウィンドウに送信される前に、エラーウィンドウに項目を追加する方法を示しています。

void OutputTaskItemStringExExample(string buildMessage,
    IVsOutputWindowPane buildPane, IVsLaunchPad launchPad)
{
    uint[] priority = new uint[1], lineNumber = new uint[1];
    string[] fileName = new string[1], taskItemText = new string[1];
    int[] taskItemFound = new int[1];

    // buildMessageにエラーが含まれているかどうかを判断する
    launchPad.ParseOutputStringForTaskItem(
        buildMessage, 
        priority, 
        fileName, 
        lineNumber, 
        taskItemText, 
        taskItemFound);


    // buildMessageにエラーがある場合は、エラーウィンドウと[出力]
    // ウィンドウの両方に送信します。
    // そうでなければ、唯一の[出力]ウィンドウに送信します。
    if (taskItemFound[0] != 0)
    {
        buildPane.OutputTaskItemStringEx(
            buildMessage, 
            (VSTASKPRIORITY)priority[0], 
            VSTASKCATEGORY.CAT_BUILDCOMPILE, 
            null, 
            0, 
            fileName[0], 
            lineNumber[0], 
            taskItemText[0], 
            null);
    }
    else
    {
        buildPane.OutputString(buildMessage);
    }

    buildPane.OutputString("\n");
}

でも、どうやって動かすのか、検討もつかない・・・orz

Visual Studio 2013 SDK で拡張機能を作りたい その1

Microsoft Visual Studio 2013 SDKをインスコすると、機能拡張のプロジェクトが作れるようになる。



言語はC# を選択する。


空のプロジェクトを作りたいので、何も選択しない。

とりあえずなので、ユニットテストも不要

ソリューションができたので、実行してみる。

VisualStudioがもうひとつ起動すればOK

今日はここまで。

2014年6月13日金曜日

NET Framework のバージョンを表すシンボル定義

色々探したが、よい物が見つからなかった。
なので、作ってみた。

<None Include="App.config" />
  </ItemGroup>
  <Import Project="$(SolutionDir)NetFrameworkVersion.targets" />
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <PropertyGroup>
  <PreBuildEvent>

これで、以下のシンボルが定義される。

  • NET_20
  • NET_30
  • NET_35
  • NET_40
  • NET_45
  • NET_451
  • NET_20_OR_GREATER
  • NET_30_OR_GREATER
  • NET_35_OR_GREATER
  • NET_40_OR_GREATER
  • NET_45_OR_GREATER


このファイルを、ソリューションフォルダに置くのを忘れずに。
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    
    <!-- NET Frameworkのバージョンに関する定数を定義する。 -->
    <!-- NET_20, NET_30, NET_35, NET_40, NET_45, NET_451, -->
    <!-- NET_20_OR_GREATER, NET_30_OR_GREATER, NET_35_OR_GREATER, NET_40_OR_GREATER, NET_45_OR_GREATER -->

    <!-- メジャーバージョン、マイナーバージョン、ビルド番号の結果を入れる -->
    <VerMajor>0</VerMajor>
    <VerMinor>0</VerMinor>
    <VerBuild>0</VerBuild>

    <!-- Pos1:最初のピリオドの位置 / Pos2:次のピリオドの位置 / Pos1n,Pos2nは、それぞれのPosに+1している -->
    <Pos1>-1</Pos1>
    <Pos1n>-1</Pos1n>
    <Pos2>-1</Pos2>
    <Pos2n>-1</Pos2n>

    <!-- v4.5.1とかv2.0とか入っているので、まずは'v'を除去 -->
    <Tmp>$(TargetFrameworkVersion.Replace('v', ''))</Tmp>

    <!-- ピリオドがなければPos1に-1が入るので、Pos2に突入させない-->
    <Pos1>$(Tmp.IndexOf("."))</Pos1>
    <Pos1n>$([MsBuild]::Add($(Pos1), 1))</Pos1n>
    <Pos2 Condition="0 &lt;= $(Pos1)">$(Tmp.IndexOf(".", $([MsBuild]::Add($(Pos1), 1))))</Pos2>
    <Pos2n>$([MsBuild]::Add($(Pos2), 1))</Pos2n>
    
    <!-- 最初のピリオドがあれば、そこまでを VerMajor にする。ピリオドがなければ、全てを VerMajor にする。-->
    <VerMajor  Condition="0 &lt;= $(Pos1)">$(Tmp.SubString(0, $(Pos1)))</VerMajor>
    <VerMajor  Condition="0 &gt;  $(Pos1)">$(Tmp)</VerMajor>

    <!-- 次のピリオドがあれば、 最初のピリオドから次のピリオドまでを、VerMinorにする。なければ、残りをVerMinorにする-->
    <VerMinor  Condition="0 &lt;= $(Pos2)">$(Tmp.SubString($(Pos1n), $([MsBuild]::Subtract($(Pos2), $(Pos1n)))))</VerMinor>
    <VerMinor  Condition="0 &gt;  $(Pos2) And 0 != $(Pos1n)">$(Tmp.SubString($(Pos1n)))</VerMinor>
    
    <!--2つ目のピリオドがあれば、そこから後ろを VerBuild にする-->
    <VerBuild  Condition="0 &lt;= $(Pos2)">$(Tmp.SubString($(Pos2n)))</VerBuild>

    <!-- VerMajor,VerMinor,VerBuildを用いて、定数を作成する。 -->
    <DefineConstants>$(DefineConstants);NET_$(VerMajor)$(VerMinor)$(VerBuild)</DefineConstants>
    <DefineConstants Condition="2 &lt;= $(VerMajor)">$(DefineConstants);NET_20_OR_GREATER</DefineConstants>
    <DefineConstants Condition="3 &lt;= $(VerMajor)">$(DefineConstants);NET_30_OR_GREATER</DefineConstants>
    <DefineConstants Condition="3 &lt;= $(VerMajor) And 5 &lt;= $(VerMinor)">$(DefineConstants);NET_35_OR_GREATER</DefineConstants>
    <DefineConstants Condition="4 &lt;= $(VerMajor)">$(DefineConstants);NET_40_OR_GREATER</DefineConstants>
    <DefineConstants Condition="4 &lt;= $(VerMajor) And 5 &lt;= $(VerMinor)">$(DefineConstants);NET_45_OR_GREATER</DefineConstants>

  </PropertyGroup>

</Project>

csproj (MsBuild) のデバッグ

csprojファイルをいじるときに、他の人はどうやってデバッグしているのだろうか?

サンプルとして、TargetFrameworkVersionの先頭に"NET_"をつけて、TestPropertyに入れて、DefineConstantsに追加した。
  <None Include="App.config" />
  </ItemGroup>
  
  <PropertyGroup>
    <TestProperty>NET_$(TargetFrameworkVersion.Replace("v","").Replace(".",""))</TestProperty>
    <DefineConstants>$(DefineConstants);$(TestProperty)</DefineConstants>
  </PropertyGroup>
  
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <!-- To modify your build process, add your task inside one of the ta .... 
       Other similar extension points exist, see Microsoft.Common.targets.
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="AfterBuild">
  </Target>
  -->
  <Target Name="Build">
    <Message Text="テストプロパティ = $(TestProperty)" />
    <Message Text="ビルド定数       = $(DefineConstants)" />
  </Target>
</Project>

このように、Visual Studioのコマンドプロンプトから、MsBuildを実行すると、Messageタスクが出力される。


このNET_45というシンボルは、ちゃんとVisualStudioで使える。


今度はターゲットフレームワークをNet4.0にすると、シンボル名もNET_40になる。

当然、NET_45シンボルは無いので、#if で括った部分は無効になる。

2014.06.18追記
csprojで使えるメソッドとかの説明
http://msdn.microsoft.com/ja-jp/library/dd633440.aspx

2014年6月4日水曜日

Collection クラス

コレクションの雛形なんだけど、実はC# 2.0からあったんだね。

/// <summary>上限付きコレクション</summary>
public class LimitedCollection<T> : Collection<T>
{
    private int limit = int.MaxValue;

    public int Limit
    {
        get
        {
            return this.limit;
        }

        set
        {
            this.limit = value;
            this.CheckLimit();
        }
    }

    private void CheckLimit()
    {
        if (this.Limit <= this.Count)
        {
            throw new InvalidOperationException();
        }
    }

    protected override void SetItem(int index, T item)
    {
        this.CheckLimit();
        base.SetItem(index, item);
    }

    protected override void InsertItem(int index, T item)
    {
        this.CheckLimit();
        base.InsertItem(index, item);
    }
}

Visual Studio 2013の拡張機能

やっとVisual Studio 2013のExpressEditionを卒業したので、拡張機能を入れて遊んでいる。
ちなみにTechNetが9月で終わるので、Visual Studio Onlineで月々2000円を3ヶ月間使い、MSDNを申し込む予定。

まずは定番の、Productivity Power Tools 2013
ColumnGuidesは、Indent Guidesを使うのでOFF
Middle-click scrollingはなんだかわからないのでOFF
Organize VB ImportとStructure Visualizerは使わないのでOFF

あと、Align AssignmentsをONにするとは、エディタの設定を変更する。
これは、代入文とかのイコールを揃える機能なので、
エディタの設定を変えておかないと、せっかく揃えた部分が、
ソース整形により、元に戻ってしまう。

ほかには、こんなものを入れている。
  • Resource Translator
  • VSColorOutput
  • Indent Guides
  • Snippet Designer

ReSharperを更新するかはビミョーだな。
むしろ、OpenCover UIの出来によっては、
DotCoverを買うほうがいいかもね。

2014年5月26日月曜日

匿名型を返す

無理矢理に書いてみたが、

public class Foo
{
    public T Bar<T>(T valType)
    {
        return (T)Activator.CreateInstance(valType.GetType(), new object[] { "Bar", 17 });
    }
}

呼び出す側で、匿名型を作らなくてはならない。
static void Main(string[] args)
{
    var obj = new Foo();
    var result = obj.Bar(new { name = "", age = 0, });
    Console.WriteLine("name={0}, age={1}", result.name, result.age);

しかも、匿名型の型が違うとCreateInstanceで例外になるので(名前はOK)、
事前にチェックをしなくてはならない。
valType.GetType().GetConstructor(new Type[] { typeof(string), typeof(int) } );

もし、BarメソッドのGetConstructorで、エラーを検出したとして、どうする?
例外を投げる?・・・使いづらいな。

やはり、別途クラスを宣言するほうがよさそうだ。
Tupleも微妙に使いづらいんだよね。

2014年3月18日火曜日

2014年3月14日金曜日

windowsでRedmine (bitnami) バックアップとリストア

bitnami Redmienが2.5.0にバージョンアップしたので、実験用マシンをアップデートした。
  1. サービスの停止
    インスコフォルダのmanager-windows.exeで、MySQL以外を停止する。

  2. データベース名、ユーザ名、パスワードを調べる
    {インスコフォルダ}\apps\redmine\htdocs\config\database.yml
    production:
      adapter: mysql2
      database: bitnami_redmine
      host: 127.0.0.1
      username: bitnami     ← ユーザ名
      password: XXXXXXXX    ← パスワード
      encoding: utf8
    

  3. データベースのバックアップ
    インスコフォルダのuse_redmine.batでコマンドプロンプトを使う。
    $ mysqldump -u bitnami -pXXXXXXXX bitnami_redmine > d:\redmine_backup

  4. 添付ファイルのバックアップ
    {インストフォルダ}\apps\redmine\htdocs\filesをコピーする。

  5. サービスのアンインスコ
    MySQLを停止してから、serviceinstall.batを実行する。

  6. 念のため、現在のインスコフォルダをリネームしておく

  7. 新しいバージョンのインスコ

  8. サービスを止める
    インスコフォルダのmanager-windows.exeで、MySQL以外を停止する。

  9. データベースのリストア
    $ mysql -u bitnami -pXXXXXXXX bitnami_redmine < d:\redmine_backup
    ※再インスコしたらパスワードが変わっているので、手順2で確認すること!

  10. 添付ファイルのリストア
    手順4のフォルダを書き戻すだけ。

  11. サービスの起動
    すべてのサービスを起動する。

2014年2月15日土曜日

Visual Studio Expressで、StyleCopを使う [改良版]

前回の方法だと、毎回StyleCopが走ってうざい。
とくに、実装中やデバッグ中のコードスタイルを指摘されるとキレそうになる。
だいいち、ワーニングとか見づらいし。

なので、Releaseビルド時のみチェックを走らせるようにした。

<Import Condition="Exists('$(ProgramFiles)\MSBuild\StyleCop\v4.7\StyleCop.targets') and '$(Configuration)' != 'Debug'"
        Project="$(ProgramFiles)\MSBuild\StyleCop\v4.7\StyleCop.targets" />

これで、デバッグ中はスッキリするようになった。

2014年2月12日水曜日

かっこいい電卓を3分で作る方法

こんな電卓をWPFで作ってみた



まず、WPFプロジェクトを作成し、NuGetでExtended WPF ToolKitを追加する。


次に、MainWindow.xamlに以下の行を追加する。

<Window x:Class="Calculator.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:wpftoolkit="http://schemas.xceed.com/wpf/xaml/toolkit"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <wpftoolkit:Calculator/>
    </Grid>
</Window>

貼り付けただけで、作ってないな。

2014年2月11日火曜日

Extended WPF Toolkit 無料版 (Community Edition)

どんなコントロールがあるのか φ(..)メモメモ
例によってグーグル先生に聞いてみた。括弧内はWindows.Formsのコントロールに対応

  • AvalonDock (要はIDEみたいなドッキングウィンドウ)
  • AutoSelectTextBox (要はフォーカス時に選択状態になるTextBox)
  • BusyIndicator (要はProgressBar)
  • ButtonSpinner (要はNumericUpDown)
  • Calculator (要は電卓)
  • CalculatorUpDown (要は電卓とNumericUpDownの合体)
  • CheckComboBox (要は複数選択可能なComboBox+CheckListBox)
  • CheckListBox (要はCheckListBoxそのもの)
  • ChildWindow (要は中身を自由に作れるMessageBox)
  • CollectionEditor (要はPropertyGridのコレクションエディタ)
  • DataGrid (要は高速DataGrid)
  • CollectionControlDialog (要はPropertyGridのコレクションエディタのダイアログ版)
  • ColorCanvas (要はペイントツール等の色をつくる画面)
  • ColorPicker (要はColorDialogの中身の高機能版)
  • DateTimePicker (要はDateTimePickerのカレンダーが出た状態)
  • DateTimeUpDown (要はUpDownで日付時刻が変更できるDateTimePicker)
  • DecimalUpDown (要はDecimal?対応NumericUpDown)
  • DoubleUpDown (要はDouble?対応NumericUpDown)
  • DropDownButton (要はPanelのドロップダウンなボタン)
  • IntegerUpDown (要はInt?対応NumericUpDown)
  • Magnifier (要はルーペ機能)
  • MaskedTextBox (要はMaskedTextBox)
  • MessageBox (要はMessageBox)
  • MultiLineTextEditor (要はドロップダウンなTextBoxのMultiLineをTrue)
  • Pie (要は円弧のシェイプ)
  • PrimitiveTypeCollectionEditor (要はドロップダウンなコレクションエディタ??)
  • PropertyGrid (要はPropertyGrid)
  • RichTextBox (要はRichTextBox)
  • RichTextBoxFormatBar (要はRichTextBoxのツールバー:フォントや右寄せ)
  • SplitButton (ドロップダウンでパネルを表示するベースクラス??)
  • SwitchPanel
  • RandomPanel
  • WrapPanel
  • TimelinePanel (要は日付時刻に添ってレイアウトするパネル)
  • TimePicker (要はDateTimeUpDown の時間専用版)
  • WatermarkTextBox (要は入力して欲しい内容を薄く表示するTextBox)
  • WindowContainer (要は何だろ?)
  • Wizard (要はWizardを単一フォームで実現)
  • Zoombox (要は)

2014年2月5日水曜日

Visual Studio Expressで、StyleCopを使う

ソリューションエクスプローラで、プロジェクトをアンロードすると、右クリックメニューでプロジェクトファイルを編集できる。

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Condition="Exists('$(ProgramFiles)\MSBuild\StyleCop\v4.7\StyleCop.targets')" 
Project="$(ProgramFiles)\MSBuild\StyleCop\v4.7\StyleCop.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

こんなんを用意して、スニペットに登録すると楽だよ
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippet Format="1.0.0" xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<Header>
<Title>ExpressでStyleCop</Title>
<Author>Jun</Author>
<Description>Ver4.7系に限定!あらかじめStyleCopのインスコが必要です。</Description>
<SnippetTypes>
<SnippetType>SurroundsWith</SnippetType>
<SnippetType>Expansion</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Code Language="XML">
<![CDATA[<Import Condition="Exists('$$(ProgramFiles)\MSBuild\StyleCop\v4.7\StyleCop.targets')" 
Project="$$(ProgramFiles)\MSBuild\StyleCop\v4.7\StyleCop.targets"/>
]]>
</Code>
</Snippet>
</CodeSnippet>

2014年1月26日日曜日

PostSharp Expressは使えるか2

お試しビルドしようと思ったら、アクチ方法がわからない
と思ったら、visual studio expressでは、使えなかった(ノω・、)・・・

Is it possible to use PostSharp 3 with Visual Studio Express?

早くProfessional Editionに戻りたいよぉ

2014年1月25日土曜日

PostSharp Expressは使えるか1

とりあえず機能一覧を並べてみた。例によってgoogle先生の翻訳だが。
(http://www.postsharp.net/purchase)

ライセンスは、商用利用可能、再配布可能、仕様期限なし、なので問題ない。

E: Express (Free) 使える機能を青文字にした
P: Professional (€329)
U: Ultimate (€589)

CORE ASPECT FRAMEWOR
  1. (E/P/U) Exception Handling
    Catch exceptions before they get passed to the client code with OnExceptionAspect.
    これらはOnExceptionAspectとクライアントコードに渡される前に、例外をキャッチ。
  2. (E/P/U) Method Interception
    Intercept method executions and execute your own logic.
    インターセプト法の実行と独自のロジックを実行します。
  3. (E/P/U) Method Decorator
    Add instructions before and after method execution.
    メソッドの実行前と後の命令を追加します。
  4. (E/P/U) Property & Field Interception
    Automate code execution when a field or a property is get or set.
    フィールドまたはプロパティを取得または設定されている場合は、コードの実行を自動化する。
  5. (E/P/U) Build-Time Validation
    Ensure that your aspect is being used where expected.
    予想される所で、あなたのアスペクトが使われていることを確認してください。
  6. (E/P/U) Attribute Multicasting
    Apply aspects to large codebases declaratively using custom attributes.
    宣言的にカスタム属性を使用して大規模なコードベースにアスペクトを適用します。
ADVANCED ASPECT FRAMEWORK
  1. (P/U) Support for Async and Iterator Methods
    Add aspects to async methods and automatic iterators. Intercept OnYield and OnResume semantics.
    非同期メソッドおよび自動イテレータにアスペクトを追加します。 OnYieldとOnResumeセマンティクスを傍受。
  2. (P/U) Aspect Inheritance
    Add aspects to a class/interface or abstract/virtual/interface method, and have the aspect automatically applied to implementations.
    クラス/インタフェースまたは抽象/仮想/インターフェイスメソッドにアスペクトを追加し、アスペクトは、自動的な実装に適用されている
  3. (P/U) Event Interception
    Override Add, Remove and Raise methods in events with the EventInterceptionAspect.
    取り外し、EventInterceptionAspectでイベントのメソッドを上げ、追加オーバーライドします。
  4. (P/U) Composite Aspects
    Develop aspects composed of several primitive transformations and use advanced concepts such as pointcuts and advices.
    いくつかの原始的な変換で構成されるアスペクトを開発し、このようなポイントカットやアドバイスなどの高度な概念を使用しています。
  5. (P/U) Dynamic Aspect Providers
    Add aspects to large codebases programmatically using LINQ and System.Reflection.
    プログラムでLINQとするSystem.Reflectionを使用して大規模なコードベースにアスペクトを追加します。
  6. (P/U) Aspect Optimizer
    Have PostSharp analyze your aspects and just generate instructions that are necessary to support the features the aspects actually use.
    PostSharpはあなたのアスペクトを分析し、アスペクトは、実際に使用する機能をサポートするために必要な命令を生成している。
DIAGNOSTICS PATTERN LIBRARY (€74)
  1. (E/P/U) Detailed Tracing
    Add logging to your codebase and keep it in sync, automatically, with support for NLog, Log4Net, and Enterprise Library. (E:50 methods per project)
    あなたのコードベースへのロギングを追加し、NLOG、log4netの、およびエンタープライズライブラリのサポートにより、自動で同期に保管してください。
MODEL PATTERN LIBRARY (€109)
  1. (E/P/U) INotifyPropertyChanged
    Implement the right property change notifications at the right time, automatically.
    自動的に、適切なタイミングで適切なプロパティ変更通知を実装します。
    (E:10 classes per project)
  2. (U) Code Contracts
    Add precondition checking to your codebase using custom attributes.
    カスタム属性を使用して、コードベースにチェックする前提条件を追加します。
THREADING PATTERN LIBRARY (€109)
  1. (U) Thread Dispatching
    Simplify dispatching execution back and forth between background and foreground threads.
    前後に、背景と前景のスレッド間の実行をディスパッチ簡素化します。
  2. (U) Exclusive Threading Model
    Prohibit multiple threads from concurrently accessing an object. Throws an exception instead of allowing data corruption.
    同時にオブジェクトにアクセスする複数のスレッドを禁止。代わりに、データの破損を許可するので例外をスローします。
  3. (U) Reader/Writer Synchronized Threading Model
    Safely share objects between several threads and declare lock level semantically, using custom attributes.
    安全に複数のスレッド間でオブジェクトを共有し、カスタム属性を使用して、意味的にロック·レベルを宣言します。
  4. (U) Actor Threading Model
    Use Erlang-like actor-based multithreading in C# 5.0.
    C#5.0にErlangのようなアクターベースのマルチスレッドを使用しています。
  5. (U) Deadlock Detection
    Simplify the diagnosis of deadlocks in your project and never allow your application to freeze without an error message.
    プロジェクト内のデッドロックの診断を簡素化し、アプリケーションがエラーメッセージなしで凍結することができませんでした。
ARCHITECTURE FRAMEWORK
  1. (U) Extended Reflection API
    Get what System.Reflection does not give to you: programmatically browse used-using, parent-child, or member-type relationships at high speed using PostSharp's internal indexes.
    するSystem.Reflectionがあなたに何を与えていない情報:プログラム的に閲覧し使用 - 使用して、親子で、あるいは高速でのメンバー型の関係はPostSharpの内部インデックスを使用。
  2. (U) Syntax Tree Decompiler
    Decompile methods to Abstract Syntax Trees and perform finer analysis.
    抽象構文木にメソッドをコンパイルし、より細かい分析を行う。
  3. (U) Built-In Architecture Constraints
    Have a finer control over visibility of types and members.
    型とメンバの可視性をより細かく制御できます。
  4. (U) Custom Architecture Constraints
    Enforce your own design rules.
    独自の設計ルールを適用します。
PLATFORMS
  1. (E/P/U) .NET Framework
    Build applications targetting .NET Framework 2.0, 3.5, 4.0, or 4.5.
  2. (P/U) Silverlight
    Build applications targetting Silverlight 4.0 or 5.0.
  3. (P/U) Windows Phone
    Build applications targetting Windows Phone 7.5 or 8.0.
  4. (P/U) Windows Store
    Build applications targetting Windows Store 8 or 8.1.
  5. (P/U) Portable Class Libraries
    Build portable class libraries 4.0, 4.5 or 4.6.
VISUAL STUDIO INTEGRATION
  1. (P/U) Code Editor Enhancements
    Immediately see which aspects are applied to the code you're editing thanks to code adornments and enhanced tooltips.
    すぐに側面は、コードの装飾品や強化されたツールチップのおかげで、編集しているコードに適用されているかを確認。
  2. (P/U) Aspect Browser
    See all aspects present in your solution and which declarations have been affected.
    あなたのソリューションとその宣言が影響を受けている中に存在するすべての側面を見る。
  3. (P/U) File and Line Number of Error Messages
    Simply double-click on an error message to get to the relevant line of source code.
    単純に、ソースコードの該当する行を取得するエラーメッセージをダブルクリックします。
LICENSING
  1. (E/P/U) Commercial Use
    Use PostSharp for development of production/commercial software.
    生産/商用ソフトウェアの開発のためPostSharpを使用してください。
  2. (E/P/U) Royalty-Free Redistribution of Runtimes
    Distribute PostSharp.dll and runtime libraries that need to run on end-user devices.
    PostSharp.dllとエンドユーザデバイス上で実行する必要がランタイムライブラリを配布します。
  3. (E/P/U) Perpetual License
    No time bomb. If you can use a specific version of PostSharp one day,
    you can use it every day.
    いいえ時限爆弾ません。あなたは1日PostSharpの特定のバージョンを使用できる場合は、 あなたは毎日それを使用することができます。
SUPPORT
  1. (P/U) 1 Year of Free Updates
    Get bug fixes and major releases during the duration of the subscription.
    サブスクリプション期間中のバグ修正とメジャーリリースを入手してください。
  2. (P/U) Premium Support
    Have your issues addressed with priority, use phone and desktop sharing (limited number of premium support cases available).
    あなたの問題は、優先使用の携帯電話やデスクトップの共有(利用可能なプレミアムサポートケースの数が限ら)で対処してきた。