匿名アクセスの共有フォルダなのに資格情報を求められる
サーバー上の共有フォルダをゲストアカウントで匿名アクセスできるように設定してある。しかし、アクセスするクライアントPCによって、すんなりアクセスできるマシン(A)もあれば、資格情報の入力を求められるマシン(B)もある。
資格情報の入力を求められずにすんなりアクセスできるマシン(A)があるので、サーバー側の設定によることは考えにくく、クライアントPC側の違いが何か考えた。
その違いは、クライアントPCにサインインしているアカウント!
マシン(A)は、クライアントPCのローカルWindowsアカウントでサインイン
マシン(B)は、Microsoftアカウントでサインイン
この違いで匿名アカウントでのアクセス時の動作になぜ差異が出るかまではわからないけれど、対処方法はみつけた!
ユーザー名:guest
パスワード:(空欄)
(必要に応じて「資格情報を記憶する」にチェックを入れる)
これで認証を通り、共有フォルダへのアクセスが可能となった。
<サーバー>
<クライアント>
Windows 10
VS2019事始め(その3) Office連携の参照設定
ソース管理(TFS)への接続で足踏みをしたけれど、ソースコードをローカルに取得し、ビルド環境を整備する段階にきた。取得したプロジェクトをそのままビルドすると、246個のエラーと36個の警告。「参照コンポーネント '×××' が見つかりませんでした。」と警告が出ている参照設定を順々に再設定していく。
Microsoft.Office.Coreの参照を追加できない
最後に残ったのは、Excelとの連携のためのOffice関連の参照設定。
Microsoft.Office.Interrop.Excel は再設定完了。
しかし、Microsoft.Office.Core がみつからない。以前の環境ではCOMの中にあった「Microsoft Office 15.0 Object Library」が見当たらない???なぜ???
Excel側の問題か?
旧環境もWindows10であったのでOSは同じ、新マシンになったことでOfficeが新しくなっている。インストールされているOfficeの問題か?と思い確認。
バージョンではなく、プレインストールOfficeがストアアプリ版が問題だ!と気づく。(ストアアプリ版ではCOMは利用できません)
早速、デスクトップ版のOfficeに入替。
そして、VS2019に戻ると、参照設定の再設定は必要なく、警告は解消。
参照マネージャーにも「Microsoft Office 15.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のチームエクスプローラーのデフォルト画面はこの通り。
初期表示されているのは、クラウドの「Azure DevOps」と「ローカル Git リポジトリ」。TFSはお呼びでないようだ。
メニューバーの「接続の管理」ボタンを押下すると何やらインフォメーションが表示された。
接続ページに表示されていないチームプロジェクトに接続するには、[接続の管理]をクリックします。チームプロジェクトは、初めて接続した後、接続ページに表示されます。
[接続の管理]-[プロジェクトに接続]を選択する。
ここで「プロジェクトに接続」画面に遷移。ここでもサインインを求められるが、求められるのは、Microsoftアカウント。私が接続したいのはオンプレミスのTFS、そしてオンプレミスのActive DirectryのADアカウントでアクセスしたい。
さらに、ここでインフォメーションに注目。
サーバーが見つかりません。上のピッカーを使用してログインし、Azure DevOpsアカウントまたは 追加 既存のAzure DevOps Serverにアクセスしてください。
「Team Fundation Server」は「Azure DevOps Server」に呼び名が変わっていました。そして「Azure DevOps」と「Azure DevOps Server」は似て非なるもの。なんと分かりにくい。
[Azure DevOps Server を追加する]を選択すると、サーバーURLの入力を求められるので、TFSのURLを入力して[追加]。ここでTFSにアクセスするための認証情報の入力を求められる。私の場合は、オンプレミスのADアカウントでTFSに接続。
無事にTFSを追加することができ、チームプロジェクトに接続。
時代は変わっている
ソースコード管理の手法はGitがデフォルトになり、ソースコードの保存場所もクラウドへと変化し、そもそもソースコード管理環境が時代遅れってこと?と感じた出来事。
ソースコード管理と言えば Microsoft Visual Source Safe (VSS) 、という時代に育った世代としては、いまだに「ソースセーフにチェックインしました」なんて会話をしているのに。
VS2019事始め(その1) インストール
開発環境の移行を躊躇し続け Visual Studio 2010 (VS2010) を使い続けてきたが、時は2020年。いいかげん10年前のツールは卒業し、開発環境を移行することにした。
採用するのは Visual Studio 2019 (VS2019) 。VS2010から一足飛びにプロジェクトの移行できるのか不安を抱えながらの移行作業でハマったポイントの記録。
インストール開始
早速インストール開始。すべてのコンポーネントをインストールすれば問題は起こらないのかもしれないが、無駄でもあるので、必要と思われるコンポーネントのみインストール。
インストール自体は無事に終了。自動起動してサインインを求められた。
オンプレミスのActive Directoryアカウント(ADアカウント)やらMicrosoftアカウントやら色々あって、どのアカウントで何をしているのかわからなくなってしまうので、ADアカウントもMicrosoftアカウントも利用せず、OS(Windows10)はローカルアカウントで利用中。(MicrosoftアカウントでOSログインしていたらサインインは求められないのかも)ここでもサインインはせず続行。
「作業の開始」画面。ソースコード管理をしているオンプレミスのActive Directory環境内のTFS(Team Foundation Server)へまずは接続するため、「コードなしで続行(W)」で起動。
「Team Fundation Serverへの接続」につづく
ブックを閉じているのに削除できない
下記の手順で操作した場合にExcelファイルを削除することができない場合がある。
- Excelファイル(.xlsx)を開く・・・ブック①
- すべてのシートを選択
- シートの移動またはコピーで
- 移動先ブック:(新しいブック)
- コピーを作成する
コピー先の新しいブック(未保存)・・・ブック② - ブック①を閉じる
- 1で開いたブック①の物理ファイルを削除する
エラーは以下の通り
Microsoft Excel によってファイルは開かれているため、操作を完了できません。ファイルを閉じてから再実行してください。
- Excel2010のみで発生
- エラーが出るファイルAと出ないファイルBがある
- ファイルAには図オブジェクトが挿入されている
と切り分けできた。
Excel2010では、図オブジェクトが挿入されているファイルは、コピーした後ブックを閉じても、Excel.exeプロセスにつかまれている。
ブック間のコピーができない
あるExcelファイル(.xlsx)を開いて、新しいブックにシートコピーや選択行コピーを行おうとした時、下記のようなエラーが出た。
- シートコピーの時
移動先またはコピー先のブックの行列数が元のブックの行列数よりも少ないため、シートを移動先またはコピー先のブックに挿入できません。データを別のブックに移動またはコピーするには、データを選択して、[コピー]コマンドと[貼り付け]コマンドを使用して移動先またはコピー先のブックのシートに挿入してください。
- 選択行コピーの時
コピー領域と貼り付け領域のサイズが違うため、これをここに貼り付けることができません。
貼り付け領域内のいずれか1つのセルを選ぶか、または同じサイズの領域を選び、もう一度貼り付けてください。
Excelのオプション設定(「ファイル」ー「オプション」ー「保存」)でファイルの保存形式が「Excel 97-2003 ブック(*.xls)」になっている場合に上記事象が発生。ファイルの保存形式か「Excel ブック(*.xlsx)」にすることで解決する。
ソート順を保存する
こんなテーブルデータがあった場合
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
これで大量データの検索時ソートの負荷を下げたり、順位検索を行ったりできるようになる