ラベル Development の投稿を表示しています。 すべての投稿を表示
ラベル Development の投稿を表示しています。 すべての投稿を表示

2017年9月26日火曜日

VisualStudio のインストールドライブを移動したお話。

C:ドライブの容量確保のため、インストール済みの Visual Studio 2015 と Install Shield LE 2015 をD:ドライブに移そうとして、(例によって)ハマってしまったので、記録しておきます。

手順はカンタンのはずでした。
1.Install Shield LE 2015 をアンインストール
2.Visual Studio 2015 をアンインストール
3.Visual Studio 2015 を D:ドライブにインストール
4.Install Shield LE 2015 をD:ドライブにインストール
5.既存のプロジェクトをビルドしてみる。

【事件番号1:インストール先のドライブやフォルダを変更できない】
3.の手順で VisualStudio 2015 のインストーラを起動しても、インストール先フォルダーの変更ができないんです。
[...]ボタンがディゼーブルで押せないんです。
このままだと、再び C:\Program Files (x86) にインストールすることになってしまいます。

いろいろネットで調べてやってみた。
1.インストーラの引数にパス名を指定。
コマンドプロンプトからインストーラを指定して、/CustomInstallPath パラメータでD:ドライブのパス名を指定してみました。
結果:ダメでした。
インストール先は、指定したフォルダになりませんでした。


2.VisualStudio 完全アンインストーラってのがネット上にあったのでダウンロードして実行。
https://github.com/Microsoft/VisualStudioUninstaller/releases
参考URL
https://qiita.com/yizumi1012xxx/items/b13314c12d5dec627ad7
結果:ダメでした。
インストール先を指定できません。

もうちょっと調べてみました。

3.レジストリエディタでパス情報を変更
この方法は危険なので注意して行ってくださいませ。
(1)[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components]を開きます。
(2)[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components]をエクスポートして file1.reg として保存しておきます。
(3)Visual Studio 2015 をインストールします。
(4)[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components]をエクスポートして file2.reg として保存します。
(5) file1.reg をインポートします。
(6) file2.reg をインポートします。
参考URL
https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/26fb86e2-edc9-40fb-a004-1abbfb93a9e4/visual-studio-community-2015-d?forum=vsgeneralja
結果:うまくいきました。

インストール完了です。実行してみました。

【事件番号2:%CommonDir%\dte80.olb がないなどのエラー】
起動してみると、いくつものファイルがないというエラーが出てしまいました。
ネット上を検索すると、ファイルを探してコピーすればいい、という記事と、 regsrv32.exe で登録すればいいという記事が見られました。
が、CドライブやDドライブを探しても該当ファイルがなかったのでした笑

んで。

1.インストーラを再度起動して「修復」を選択してみました。

無事、動かせるようになりました。
どうやら、最初にインストールしたとき「管理者として実行」をしなかったのが原因のようでした。

スクリーンショット取ってなくてすみません。m(_._)m

2017年7月5日水曜日

SVN リポジトリのHDDを交換してみた。

チーム用には Git という話は置いといてw

Windows マシンの外付けディスクに SVN のリポジトリを置いてローカルのバックアップを取るようにしてます。

で、このディスクがいっぱいになってしまいそうになったので、別のHDDに移動させてみようと試みました。

同じ苦労をする人もいそうなので、まとめておきます。

リポジトリのバックアップ

リポジトリのバックアップは、svnadmin dump コマンドで実行します。

残念ながらHDDを丸ごと、というのはできそうになかったので、リポジトリごとに実施してみました



■サンプルとして、次のような環境があるとします。

・現在のリポジトリの位置:G:\Repositories

・リポジトリ:Project1, Project2, Personal

・新しいHDDは H: ドライブ

・H:\Backup, H:\Repositories のフォルダを作っておきます。



■コマンドプロンプトで、H:\Backup に移動します

C:\>H:

H:\>cd Backup

H:\Backup>



■svnadmin dump コマンドでバックアップファイルを作成します。

ひとつづつ処理するのはめんどくさいので、for でループさせました。

H:\Backup>for %x in (Project1 Project2 Personal) do svnadmin dump >G:\Repositories\%x.dmp

リポジトリのダンプファイルが出来上がります。


リポジトリのリストア

■新しいリポジトリに移動します。

H:\Backup>cd \Repositories

H:\Repositories>



■svnadmin create でリポジトリを作ります。

同じように for でループして作成しました。

H:\Repositories>for %x in (Project1 Project2 Personal) do svnadmin create %x



■svnadmin load コマンドでダンプファイルからリストアを実行します

H:\Repositories>for %x in (Project1 Project2 Project3) do svnadmin load ./%x/ <H:\Backup\%x.dmp

リポジトリのリストアが出来上がったようです。

500 Internal Server Error が出ちゃう

これで動くと思ったんですよ。そしたら・・・

しばらくすったもんだした挙句、リポジトリのリストアで、コマンドプロンプトを管理者モードで実行してたのがよくなかったみたいでした

で、通常モードで再度リストア処理を実施しましたorz


forbidden Error が出ちゃう

お次は、これ・・・

んー・・・何が間違ってるんだろう・・・しばらく悩みました。

で、Server Manager で古いリポジトリと新しいリポジトリを比較してセキュリティの違いを発見!

リポジトリのセキュリティ設定

管理には Visual SVN Server Managerってのを使っているので、リポジトリを右クリック

セキュリティタブで、ユーザーのアクセス権を追加する必要がありました。
ローカルで使用しているだけなので、ここは Everyone に R/W を許可しました。


ユーザーの追加

Visual SVN Server Manager でユーザーを追加しまして、エクスプローラから SVN 更新を選んでみると

ユーザー認証画面が出てきまして、ディスクの入れ替えが完了しました。

めでたしめでたし。

2016年10月3日月曜日

Office Excel 用アドイン(今日の日付を入力)の作成

Excelで編集しているときに、割とよく入力中のセルに今日の日付を入れたい、と思う時があります。
例えば10月3日なら、10/3 と入力するだけで今日の日付になる、というのは知ってます。
でもね、それをワンタッチで実行したいわけですよ。

VBAとやらでマクロを作ることでもできそうですが、そこは C#使いのあちきのことですから、アドインで実行したい。
ということで、Officeアドインの作り方をまとめてみたいと思います。(前にも書いたような気がするけど気のせいだなw)

まずは Visual Studio (今回は2015)で、新規プロジェクトを作成します。
「新しいプロジェクト」で「Office Addin」-「Excel 2010 VSTO アドイン」を選択します。





アドインプロジェクトができたら、まずリボンを実装してみましょう。
プロジェクトに新しい項目としてリボン(ビジュアルなデザイナー)を追加して、グループボックスとボタンを追加します。

今回、リボン名は TodayRibbon にしました。
ThisAddIn.cs ファイルに次のコードを追加します。
protected override Office.IRibbonExtensibility CreateRibbonExtensibilityObject()
{ 

    return Globals.Factory.GetRibbonFactory().CreateRibbonManager(
        new Microsoft.Office.Tools.Ribbon.IRibbonExtension[] { new TodayRibbon() }

    );
}


ここまでの手順だけでプロジェクトをビルドして実行すると、Excelのリボンに「アドイン」と書かれたタブが追加されます。リボンの追加方法は、あちこちのサイトで説明されていますので他も参考にしてくださいませ。
タブが追加されてボタンが表示されるようになっても、セル上に今日の日付を入力するのに、タブを選択してボタンを押してまたホームタブに戻らなきゃいけない、ってのはとってもめんどくさいですよね?
エクセル標準のリボンタブ「ホーム」にボタンが配置されるようにしたいですよね?
ところが、その方法はググってもあまり説明されていないみたいです。
XAMLを書かなきゃいけないと書いてあるところもありますが、リボンデザイナーで記述することができます。
ここではその辺を詳しく説明したいと思います。
まず必要になるのが、Office 2010 Help Files: Office Fluent User Interface Control Identifiers
です。
こちらからダウンロードできます。
https://www.microsoft.com/en-us/download/details.aspx?id=6627
今回使用するのは、このファイルの中に含まれる、ExcelControls.xlsx ファイルになります。

開いてみましょう。


何やらいろいろ書かれていますが、←部分を見てください。
TabHome           tab
と書かれています。ここから下の部分がExcelを開いたときに表示される、「ホーム」のリボンメニュータブになっています。
次の行には「GroupClipboard」と書かれてますね。エクセルを最初に開くとリボンメニューのもっとも左側に「クリップボード」のグループがあります。
つまり、このリストの順番でコントロールが並べられているわけです。
今回のアドインで作成するボタンは、

このあたりに追加してみたい
ということで、エクセルファイルをスクロールしていくと、
数値タブを示す、[GroupNumber]の group とスタイルタブを示す「GroupStyles」のgroupを見つけることができます。
さて、準備完了です。リボンデザイナーで次のように処理していきます。

1.タブをExcelのホームタブに設定


リボンデザイナの上部をクリックして、プロパティの RibbonType を Microsoft.Excel.Workbookに設定します。
この設定は、リボンがExcelのワークブック用であることを示しています。

2.タブの設定
次にタブメニューを設定します。

リボンデザイナのタブの位置をクリックして、以下のようにプロパティを設定します。
ControlId-ControlIdType をOfficeに設定し、OfficeIdを TabHome に設定します。

TabHome ...どこかで出てきましたね。
そう先ほどの ExcelControls.xlsx ファイルで tab として記載されていた語句です。
この指定で、このタブが、Excelの「ホーム」タブに所属するタブだということが設定されます。

3.グループの設定
最後にグループの設定を行います。もう要領がわかってきたかな?

リボンデザイナでグループボックスをクリックして、プロパティを設定します。
GroupBoxのPositionプロパティのPositionType をBeforeOfficeId として、OfficeIdの部分に GroupStyles を入力します。
これが、ExcelControls.xlsxに記載されていたグループの名前で、その Before、つまり「スタイルタブ」の前に配置する、という意味ですね。
もちろん、AfterOfficeIdを選んで GroupNumberと入力しても同じ位置に表示されます。
(実際には、他のアドインがその場所を横取りする場合があるかもしれません)

ということで、プロジェクトを実行すると、目的の場所に[Today]ボタンが表示されるようになりました。

最後は、[Today]ボタンが押された時の処理を設定します。
リボンデザイナで[Today]ボタンをダブルクリックすると、リボンのコードに次のコードが作成されます。


private void btnToday_Click(object sender, RibbonControlEventArgs e)
{
}


リボンのコードは class TodayRibbon に属していますが、アドインで処理したいエクセルの情報はThisAddIn のインスタンスから参照するほうが楽ですので、次のように ThisAddIn クラスのインスタンスに対して処理を依頼するようにします。

private void btnToday_Click(object sender, RibbonControlEventArgs e)
{
     ThisAddIn logic = ThisAddIn.Instance();
     if(logic != null)
     {
         logic.onButtonToday();
     }
}


ThisAddInのインスタンスを取得できるように、ThisAddIn.cs に次のようなコードを追加します。

public static ThisAddIn instance = null;
public static ThisAddIn Instance()
{
     return instance;
}


instance = this; を ThisAddIn_Startup 内に記述すればOKですね。
※ブレイクポイントを付けてデバッグしてみるとわかるのですが、ThisAddIn_Startup よりも先に CreateRibbonExtensibilityObject が呼び出されてきますので、この位置に instance = this; を付けることもできます。

さて、最後に現在のセル内に今日の日付を設定する処理です。
エクセル用のデータを操作するには、通常、Excel.Workbook オブジェクトを取得し、Excel.WorkSheetオブジェクトを取得し、んでもって...という手順を踏む必要があるのですが、選択中のセルに対する処理では、ThisAddIn.Application.Selection を使用すると現在のセルが取得できました。
ThisAddInには次のコードを記述ました。

internal void onButtonToday()
{
    Excel.Range range = null;
    try
    {
        range = Application.Selection;
        if (range != null)
        {
            range.Value = DateTime.Today;
        }
    }
    finally
    {
        if (range != null)
        {
            Marshal.ReleaseComObject(range);
        }
    }

}


ビルドして実行してみましょう。

うまく動いてくれました。

このアドインのインストーラ欲しい人っているかなー?
求められたら、フリーウェアで公開しますね。

【追記】
上記の実装では、次のような問題があります。
1.IMEがONの場合、全角の日付が入力されるので半角変換しないと日付フォーマットが効かない。
2.アンドゥができない(致命傷w

ということで、これらの問題をいろいろ解決しようと努力しているところで、こんなコマンドを知ることになりました。
[CTRL]+[;](CTRLキーを押しながらセミコロンを押す)

なんと、今日の日付がワンタッチで入力できてしまいました。
ちゃんちゃんw

2015年11月2日月曜日

VisualStudio の Install ShieldLimited Edition 2013 でアップデートインストール

Visual Studio 2013 でインストーラを作成する方法の一つに、Install Shield Limited Edition (以下、ISLE と略します)があります。 まだ使っていないという方の入り口としては、マイクロソフトさんのこのページあたりからたどるといいでしょうね。

で、インストールプロジェクトをこさえて、インストーラをビルドするまでの方法については、あちこちにまとめられたページが公開されていますので、わざわざ重複して紹介するまでもないでしょう。
と、いうことで入門から初回ビルドまでの情報についてはここでは記載しません。

インストーラをリリースした後でソフトウェアをバージョンアップしたインストーラを作成すると、そのままでは、以前のバージョンをコントロールパネルからアンインストールして新しいバージョンのインストーラを起動しなければならなくなってしまいます。
(じっさい、困ってしまいましたよw)

そこで、自動的にアップデートインストールできるような ISLE の設定方法をまとめることにしました。

1.ソフトウェアのバージョン情報
アプリケーションプロジェクトの[Properties]タブの[アセンブリ情報(I)...]ボタンを押すと、プロダクトのバージョン情報が表示されます。
アプリケーションのアセンブリ情報画面
この「アセンブリバージョン」「ファイルバージョン」にアプリケーションのバージョン情報を定義します。
バージョンアップの際は、この情報をより大きい数値に変えることになります。
バージョン情報 1.0.0.0 だったアプリケーションを 1.1.0.0 にバージョンアップする場合を例にとってみます。
バージョンを 1.0.0.0 から 1.1.0.0 にアップ


2.セットアッププロジェクトの構成
ここで、セットアッププロジェクトのバージョンもアップします。

現在のバージョン情報である、[Product Version]の部分を 1.00.0000 から 1.10.0000 に変更します。
このとき、その直後の [Product Code]も変更する必要があります。
[Product Code]の部分をクリックすると、右側に { } ボタンが現れますから、ここをクリックしてGUIDを再度生成します。

ここまでの設定でインストーラを構築した場合、すでに 1.00.0000 のバージョンがインストールされたコンピュータでインストーラを起動すると、プロダクトコードが異なるために、別のアプリケーションとしてインストールされてしまいます。つまり、同じアプリケーションが重複してインストールされてしまうことになります。
インストーラがそれ以前の過去のバージョンを自動的に削除してから新しいプロダクトをインストールできるようにするには、[Product Code]の次の行に記述されている[Upgrade Code]が関係してくることになります。

あ。ちょっと待って!
[Upgrade Code]の部分もクリックすると右側に { } ボタンが出現して新しいGUIDに更新できるようになっていますが、ここを変更してはいけません。

アップグレードインストールが正しく動作するようにするには、左側のツリーメニューにある、[Upgrade Paths]の部分を編集します。

Upgrade Paths の画面はこのようになっています。
ツリーの Upgrade Paths を右クリックして、「New Upgrade Path...」メニューを選択します。


ファイル選択ダイアログが表示されますが、「キャンセル」ボタンで閉じると、新しいアップグレードエントリが作成されています。


アップグレードの新しいノードには「Upgrade」のような名前を付けます。
プロパティの Max Version 部分には、新しく設定されたバージョン 1.10.0000 が表示されています。
その下の Include Max Version は、アップグレードの際に以前のバージョンを削除する最大バージョン情報を含めるかどうかを示しています。
ここは「No」を設定するほうがいいのかな、と思っています。


これで、アップグレードインストーラの完成です。

プロジェクトの [Upgrade Code] のGUIDを変更してしまった場合は、アップグレードノードを追加して、古いバージョンの Upgrade Code をセットアップ時の削除対象に追加する必要があります。
このとき、以前ビルドしたプロジェクトファイルのバックアップがないと、以前リリースした Upgrade Code を入手できなくなりますので、注意してください。

ISLEにはずいぶんと泣かされましたw
その他、苦労した部分についてもいずれ書けたらいいなと思ってるところです。

ではでは。