匿名アクセスの共有フォルダなのに資格情報を求められる

サーバー上の共有フォルダをゲストアカウントで匿名アクセスできるように設定してある。しかし、アクセスするクライアントPCによって、すんなりアクセスできるマシン(A)もあれば、資格情報の入力を求められるマシン(B)もある。

f:id:gomitaka0:20200203181649p:plain

資格情報入力を求められる

資格情報の入力を求められずにすんなりアクセスできるマシン(A)があるので、サーバー側の設定によることは考えにくく、クライアントPC側の違いが何か考えた。

その違いは、クライアントPCにサインインしているアカウント!

 マシン(A)は、クライアントPCのローカルWindowsアカウントでサインイン

 マシン(B)は、Microsoftアカウントでサインイン

この違いで匿名アカウントでのアクセス時の動作になぜ差異が出るかまではわからないけれど、対処方法はみつけた!

f:id:gomitaka0:20200203182421p:plain

ユーザー名 guest で認証

ユーザー名:guest

パスワード:(空欄)

(必要に応じて「資格情報を記憶する」にチェックを入れる)

これで認証を通り、共有フォルダへのアクセスが可能となった。

 

 

 

<サーバー>

 Windows Server 2012 R2

<クライアント>

  Windows 10

VS2019事始め(その3) Office連携の参照設定

ソース管理(TFS)への接続で足踏みをしたけれど、ソースコードをローカルに取得し、ビルド環境を整備する段階にきた。取得したプロジェクトをそのままビルドすると、246個のエラーと36個の警告。「参照コンポーネント '×××' が見つかりませんでした。」と警告が出ている参照設定を順々に再設定していく。

Microsoft.Office.Coreの参照を追加できない

最後に残ったのは、Excelとの連携のためのOffice関連の参照設定。

f:id:gomitaka0:20200123131816p:plain

参照コンポーネント 'Microsoft.Office.Core' が見つかりませんでした。

 

 Microsoft.Office.Interrop.Excel は再設定完了。

f:id:gomitaka0:20200123132852p:plain

Microsoft.Office.Interrop.Excel

しかし、Microsoft.Office.Core がみつからない。以前の環境ではCOMの中にあった「Microsoft Office 15.0 Object Library」が見当たらない???なぜ???

f:id:gomitaka0:20200123133003p:plain

Microsoft Office 15.0 Object Library がない

 

Excel側の問題か?

旧環境もWindows10であったのでOSは同じ、新マシンになったことでOfficeが新しくなっている。インストールされているOfficeの問題か?と思い確認。

f:id:gomitaka0:20200123133651p:plain

プレインストール版 Office2019

バージョンではなく、プレインストールOfficeがストアアプリ版が問題だ!と気づく。(ストアアプリ版ではCOMは利用できません)

早速、デスクトップ版のOfficeに入替。 

f:id:gomitaka0:20200123140451p:plain

デスクトップ版 Office2019

 そして、VS2019に戻ると、参照設定の再設定は必要なく、警告は解消。

f:id:gomitaka0:20200123141118p:plain

参照設定の警告なし

 参照マネージャーにも「Microsoft Office 15.0 Object Library」が追加された。

f:id:gomitaka0:20200123141326p:plain

Microsoft Office 16.0 Object Library

 

VS2019事始め(その2) Team Fundation Serverへの接続

インストールは無事終了し、次はTeam Fundation Serverへの接続。

TFSへの接続はどこからするの?

ソースコード管理に利用しているのはオンプレミスのActive Directry環境に構築した Team Fundation Server 2015 (TFS)。

VS2010からTFSへ接続する時は、額面通りの「Team Fundation Serverへの接続」というメニューがある。参照可能なTFSが一覧され、その中から接続対象を選ぶだけ。そこはVS2019でも同様にメニューをたどれば大丈夫だろうと踏んでいた。しかし甘かった(10年前と同じわけがなかった)。まさかMicrosoft製品どうしの連携で躓くとは思っていなかった。

VS2019で「Team Fundation Serverへの接続」という分かりやすいメニューは見当たらない。VS2019のチームエクスプローラーのデフォルト画面はこの通り。

f:id:gomitaka0:20200121172208p:plain

VS2019のチームエクスプローラ

初期表示されているのは、クラウドの「Azure DevOps」と「ローカル Git リポジトリ」。TFSはお呼びでないようだ。

メニューバーの「接続の管理」ボタンを押下すると何やらインフォメーションが表示された。

接続ページに表示されていないチームプロジェクトに接続するには、[接続の管理]をクリックします。チームプロジェクトは、初めて接続した後、接続ページに表示されます。

f:id:gomitaka0:20200121172751p:plain

「接続の管理」ボタン押下

 [接続の管理]-[プロジェクトに接続]を選択する。

f:id:gomitaka0:20200121173326p:plain

[接続の管理]-[プロジェクトに接続]

ここで「プロジェクトに接続」画面に遷移。ここでもサインインを求められるが、求められるのは、Microsoftアカウント。私が接続したいのはオンプレミスのTFS、そしてオンプレミスのActive DirectryのADアカウントでアクセスしたい。

さらに、ここでインフォメーションに注目。

サーバーが見つかりません。上のピッカーを使用してログインし、Azure DevOpsアカウントまたは 追加 既存のAzure DevOps Serverにアクセスしてください。

f:id:gomitaka0:20200121174140p:plain

プロジェクトに接続

「Team Fundation Server」は「Azure DevOps Server」に呼び名が変わっていました。そして「Azure DevOps」と「Azure DevOps Server」は似て非なるもの。なんと分かりにくい。

[Azure DevOps Server を追加する]を選択すると、サーバーURLの入力を求められるので、TFSのURLを入力して[追加]。ここでTFSにアクセスするための認証情報の入力を求められる。私の場合は、オンプレミスのADアカウントでTFSに接続。

f:id:gomitaka0:20200121175116p:plain

Azure DevOps Server を追加する

無事にTFSを追加することができ、チームプロジェクトに接続。

f:id:gomitaka0:20200121175552p:plain

チームプロジェクトに接続

 

時代は変わっている

ソースコード管理の手法はGitがデフォルトになり、ソースコードの保存場所もクラウドへと変化し、そもそもソースコード管理環境が時代遅れってこと?と感じた出来事。

ソースコード管理と言えば Microsoft Visual Source Safe (VSS) 、という時代に育った世代としては、いまだに「ソースセーフにチェックインしました」なんて会話をしているのに。

VS2019事始め(その1) インストール

開発環境の移行を躊躇し続け Visual Studio 2010 (VS2010) を使い続けてきたが、時は2020年。いいかげん10年前のツールは卒業し、開発環境を移行することにした。

採用するのは Visual Studio 2019 (VS2019) 。VS2010から一足飛びにプロジェクトの移行できるのか不安を抱えながらの移行作業でハマったポイントの記録。

 

インストール開始 

早速インストール開始。すべてのコンポーネントをインストールすれば問題は起こらないのかもしれないが、無駄でもあるので、必要と思われるコンポーネントのみインストール。

f:id:gomitaka0:20200120171608p:plain

VS2019 インストールコンポーネント

 

インストール自体は無事に終了。自動起動してサインインを求められた。

オンプレミスのActive Directoryアカウント(ADアカウント)やらMicrosoftアカウントやら色々あって、どのアカウントで何をしているのかわからなくなってしまうので、ADアカウントもMicrosoftアカウントも利用せず、OS(Windows10)はローカルアカウントで利用中。(MicrosoftアカウントでOSログインしていたらサインインは求められないのかも)ここでもサインインはせず続行。

f:id:gomitaka0:20200120172337p:plain

VS2019 初期画面

 

「作業の開始」画面。ソースコード管理をしているオンプレミスのActive Directory環境内のTFS(Team Foundation Server)へまずは接続するため、「コードなしで続行(W)」で起動。

f:id:gomitaka0:20200120173236p:plain

VS2019 作業の開始

 

「Team Fundation Serverへの接続」につづく

ブックを閉じているのに削除できない

下記の手順で操作した場合にExcelファイルを削除することができない場合がある。

  1. Excelファイル(.xlsx)を開く・・・ブック①
  2. すべてのシートを選択
  3. シートの移動またはコピーで
     - 移動先ブック:(新しいブック)
     - コピーを作成する
    コピー先の新しいブック(未保存)・・・ブック②
  4. ブック①を閉じる
  5. 1で開いたブック①の物理ファイルを削除する

エラーは以下の通り

Microsoft Excel によってファイルは開かれているため、操作を完了できません。ファイルを閉じてから再実行してください。

f:id:gomitaka0:20200115182635p:plain

ファイル削除エラー

 

  • Excel2010のみで発生
  • エラーが出るファイルAと出ないファイルBがある
  • ファイルAには図オブジェクトが挿入されている

と切り分けできた。

Excel2010では、図オブジェクトが挿入されているファイルは、コピーした後ブックを閉じても、Excel.exeプロセスにつかまれている。

ブック間のコピーができない

あるExcelファイル(.xlsx)を開いて、新しいブックにシートコピーや選択行コピーを行おうとした時、下記のようなエラーが出た。

  • シートコピーの時

移動先またはコピー先のブックの行列数が元のブックの行列数よりも少ないため、シートを移動先またはコピー先のブックに挿入できません。データを別のブックに移動またはコピーするには、データを選択して、[コピー]コマンドと[貼り付け]コマンドを使用して移動先またはコピー先のブックのシートに挿入してください。   

  •  選択行コピーの時

 コピー領域と貼り付け領域のサイズが違うため、これをここに貼り付けることができません。

貼り付け領域内のいずれか1つのセルを選ぶか、または同じサイズの領域を選び、もう一度貼り付けてください。

 

Excelのオプション設定(「ファイル」ー「オプション」ー「保存」)でファイルの保存形式が「Excel 97-2003 ブック(*.xls)」になっている場合に上記事象が発生。ファイルの保存形式か「Excel ブック(*.xlsx)」にすることで解決する。

f:id:gomitaka0:20200115180616p:plain

Excelのオプション

 

ソート順を保存する

こんなテーブルデータがあった場合

   SELECT * FROM T_MONTHLY_SALES;
        YEAR   MONTH  AMOUNT          RANK1  RANK2
        ------ ------ --------------- ------ ------
        2018   10     1200000         NULL   NULL
        2018   11     11500000        NULL   NULL
        2018   12     1570000         NULL   NULL
        2019   1      1250000         NULL   NULL
        2019   2      1230000         NULL   NULL
        2019   3      1450000         NULL   NULL
        2019   4      2200000         NULL   NULL
        2019   5      1850000         NULL   NULL
        2019   6      1950000         NULL   NULL

検索時に売上高順にソートするのはORDER BY句で可能

   SELECT * FROM T_MONTHLY_SALES ORDER BY AMOUNT DESC;
        YEAR   MONTH  AMOUNT          RANK1  RANK2
        ------ ------ --------------- ------ ------
        2018   11     11500000        NULL   NULL
        2019   4      2200000         NULL   NULL
        2019   6      1950000         NULL   NULL
        2019   5      1850000         NULL   NULL
        2018   12     1570000         NULL   NULL
        2019   3      1450000         NULL   NULL
        2019   1      1250000         NULL   NULL
        2019   2      1230000         NULL   NULL
        2018   10     1200000         NULL   NULL

年別にソートするならこんな感じ

   SELECT * FROM T_MONTHLY_SALES ORDER BY YEAR,AMOUNT DESC;
        YEAR   MONTH  AMOUNT          RANK1  RANK2
        ------ ------ --------------- ------ ------
        2018   11     11500000        NULL   NULL
        2018   12     1570000         NULL   NULL
        2018   10     1200000         NULL   NULL
        2019   4      2200000         NULL   NULL
        2019   6      1950000         NULL   NULL
        2019   5      1850000         NULL   NULL
        2019   3      1450000         NULL   NULL
        2019   1      1250000         NULL   NULL
        2019   2      1230000         NULL   NULL

データ件数が多い場合や複合的な検索をする場合、検索時にソートしたくない時もある

そんな時はソート順をデータとして保存してしまおう

ROW_NUMBER()関数を使うとソート順番号を取得できる

   SELECT ROW_NUMBER() OVER(ORDER BY AMOUNT DESC)AS ROW_NO,* FROM T_MONTHLY_SALES;
        ROW_NO   YEAR   MONTH  AMOUNT          RANK1  RANK2
        -------- ------ ------ --------------- ------ ------
        1        2018   11     11500000        NULL   NULL
        2        2019   4      2200000         NULL   NULL
        3        2019   6      1950000         NULL   NULL
        4        2019   5      1850000         NULL   NULL
        5        2018   12     1570000         NULL   NULL
        6        2019   3      1450000         NULL   NULL
        7        2019   1      1250000         NULL   NULL
        8        2019   2      1230000         NULL   NULL
        9        2018   10     1200000         NULL   NULL

このソート順番号でカラム「RANK1」を更新する

  UPDATE T_MONTHLY_SALES
       SET RANK1 = T_ROW_NO.ROW_NO
      FROM T_MONTHLY_SALES
     INNER JOIN (SELECT ROW_NUMBER() OVER(ORDER BY AMOUNT DESC)AS ROW_NO,YEAR,MONTH 
                   FROM T_MONTHLY_SALES) AS T_ROW_NO
        ON T_MONTHLY_SALES.YEAR = T_ROW_NO.YEAR
       AND T_MONTHLY_SALES.MONTH = T_ROW_NO.MONTH

結果は以下の通り

   SELECT * FROM T_MONTHLY_SALES;
        YEAR   MONTH  AMOUNT          RANK1  RANK2
        ------ ------ --------------- ------ ------
        2018   10     1200000         8      NULL
        2018   11     1150000         9      NULL
        2018   12     1570000         4      NULL
        2019   1      1250000         6      NULL
        2019   2      1230000         7      NULL
        2019   3      1450000         5      NULL
        2019   4      2200000         1      NULL
        2019   5      1850000         3      NULL
        2019   6      1950000         2      NULL

年別のソート順番号でカラム「RANK2」を更新する(下記は2019年分の更新)

  UPDATE T_MONTHLY_SALES
       SET RANK2 = T_ROW_NO.ROW_NO
      FROM T_MONTHLY_SALES
     INNER JOIN (SELECT ROW_NUMBER() OVER(ORDER BY AMOUNT DESC)AS ROW_NO,YEAR,MONTH 
                   FROM T_MONTHLY_SALES
                  WHERE YEAR = 2019 ) AS T_ROW_NO
        ON T_MONTHLY_SALES.YEAR = T_ROW_NO.YEAR
       AND T_MONTHLY_SALES.MONTH = T_ROW_NO.MONTH
     WHERE T_MONTHLY_SALES.YEAR = 2019

結果は以下の通り

   SELECT * FROM T_MONTHLY_SALES;
        YEAR   MONTH  AMOUNT          RANK1  RANK2
        ------ ------ --------------- ------ ------
        2018   10     1200000         8      NULL
        2018   11     1150000         9      NULL
        2018   12     1570000         4      NULL
        2019   1      1250000         6      5
        2019   2      1230000         7      6
        2019   3      1450000         5      4
        2019   4      2200000         1      1
        2019   5      1850000         3      3
        2019   6      1950000         2      2

 

これで大量データの検索時ソートの負荷を下げたり、順位検索を行ったりできるようになる