読者です 読者をやめる 読者になる 読者になる

開発コードネーム 『Beck』 その3

仕様を追加。

多くの人たちのノウハウが1つの場所に集まり、残り続けて、それらが活用され、
また、可能であれば発展させていこうとする流れを作り、
後からプロジェクトに参加する人たちや、
周りの人たちを助けることになるものは何か?と考えている。

その1つはプロジェクト内の各業務での「チェックリスト(確認リスト)」だと思われる。

人によって意図的にさじ加減を変えて、
他人が出した成果物に対して、後出しで、
利点と欠点の両方があるものを、偉そうに欠点のみをあげつらって、
「おまえのためを思って指導してるんだよ」等、
恩着せがましくデカい声で、朝からお説教してるような自己中が威張り腐ってるよりも、
ささやかに、周りの人たちのために「チェックリスト」が作られていたほうが
よっぽどありがたい。

チェックリストを作成して、共有して、
チェックリストに対してPDCAサイクルを回そう!みたいな
仕事の仕方が流行っていくことを狙おうと思う。
真っ当な仕事の仕方だと思われる。

チェックリストの内容をきつくすれば、
品質が良くなりやすいメリットもあれば、仕事にかける時間が長くなるデメリットもある、
チェックリストの内容を軽くすれば、
品質が落ちやすくなるデメリットもあれば、仕事にかける時間が短くなるメリットもある
納期等、時間の制約がある中で、まあ、いろいろと状況が変わる中で、
バランスを取りながら、加減を測りながら、
とにかく、最低限やっておけばいいことは明確にしていけるし、
その時に最適な水準をプロジェクトマネージャーあたりが監視して
探していけばいいさ。

「お客さんと対等に仕事を行う」ためにやっておかなければいけない事が
チェックリストになっていれば、良い場面もある。すべてではないとは思うが。
お客さんの言いなりになり、まるで奴隷になり、プロジェクトが「ドM養成所」になり、
「損」をさせられてしまうことを回避するため。

お客様との打ち合わせに関する業務では・・・
<チェックリスト(例)>
・お客様との打ち合わせの際、○○を伝えて、合意が得られているか?
・お客様に打ち合わせを依頼するメールには○○が記載されているか?
・打ち合わせにおける決定権を持つ人が誰なのか?が明記されている返信をもらっているか?
・打ち合わせを依頼する際、決定権がある人に同席して頂くことを条件として依頼しているか?

みたいな感じのやつ。
もちろん上記だけで十分ではないです。
そのときの状況によって、やるべきことは変わるとも思えますが、
実際に上記のような内容のチェックリストは世の中に存在する。

他には、レビュー時の観点なども、チェックリストになっているとよいし。
(本日2回目)人によって意図的にさじ加減を変えて、
他人が出した成果物に対して、後出しで、偉そうに欠点をあげつらって、
「おまえのためを思って指導してるんだよ」「おまえは相手の事を考えていないんだよ」等、
恩着せがましくデカい声で、威張り腐ってる自己中じじいがお説教してるようなレビューは、
全員で一丸となって行わせないようにしよう、「じじい、しゃしゃり出るな」。
たいしたことない、でしゃばり自己中に後出しのお説教させて、
おだてて、「おれが指導したんだぜ」等、良い気分にさせてるくらいなら、
しれっと黙って、チェックリストを作れ!チェックリストに全員のノウハウを詰め込め!
という流れができればいい。
チェックリストを作るというささやかながらの行動は、
相手や自分たちのこと、後からプロジェクトに参加する人のことも、
お客さんのことも考慮された行動だ。

まあ、プロジェクト内の業務はいろいろだ。
チェックリストもいろいろ出てくるだろう。

対応事例検索機能においては、
プロジェクト内の各業務で使用する「チェックリスト」の登録、検索は、
特別に標準機能にする。この仕様は決定。

広告を非表示にする

SQL Server 2016 データ暗号化

SQL Server 2016 の新機能「Always Encrypted」。
Always Encrypted (Database Engine) (Always Encrypted (データベース エンジン))

以下サイトで、どんなものか確認してみる。
SQL Server 2016 CTP 2.0 の Always Encrypted を使ってみる at SE の雑記

ということらしい。「Always Encrypted」の動作については、また後ほど確認してみるとして。

今のところは、いろいろと検討した結果、管理者側の機能としては、
顧客の「システム担当」が、対称キー作成時のパスワードを
ユーザー情報の登録/更新/参照の際(対称キーOpenの際)に入力した時に、
 ・ユーザー情報を暗号化して登録(更新)できる
 ・ユーザー情報を復号化して参照できる
といった動作にしていくことを予定。
なので「Always Encrypted」を使用しない方法でやってみる。

【1】対称キーの作成(アルゴリズムは AES_256 を指定)
CREATE SYMMETRIC KEY Beck_Sym_Key
WITH ALGORITHM = AES_256
ENCRYPTION BY PASSWORD = '[SymKeyPassword]'
go

f:id:masawan-guitar:20161011003133p:plain

【2】登録時の操作(暗号化)

(例)MST_USERテーブル(CREATE文)

暗号化する項目は[varbinary](max)型。

CREATE TABLE [dbo].[MST_USER](
	[SystemUserID] [uniqueidentifier] NOT NULL,
	[UserID] [varbinary](max) NOT NULL,
	[LoginID] [varbinary](max) NOT NULL,
	[Password] [varbinary](max) NOT NULL,
	[LastName] [varbinary](max) NOT NULL,
	[FirstName] [varbinary](max) NOT NULL,
	[LastNameKana] [varbinary](max) NOT NULL,
	[FirstNameKana] [varbinary](max) NOT NULL,
	[MailAddress1] [varbinary](max) NOT NULL,
	[MailAddress2] [varbinary](max) NULL,
 CONSTRAINT [PK_MST_USER] PRIMARY KEY CLUSTERED 
(
	[SystemUserID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

(1)対称キーをオープンする。対称キーの GUID を Key_GUID 関数で取得して、
 EncryptByKeyでデータを暗号化して INSERT する。

OPEN SYMMETRIC KEY Beck_Sym_Key
DECRYPTION BY PASSWORD = '[SymKeyPassword]'
go

DECLARE @kGuid UNIQUEIDENTIFIER
SET @kGuid = Key_GUID('Beck_Sym_Key')

INSERT INTO MST_USER (
    [SystemUserID],
    [UserID],
    [LoginID],
    [Password],
    [LastName],
    [FirstName],
    [LastNameKana],
    [FirstNameKana],
    [MailAddress1],
    [MailAddress2]
)VALUES(
    NEWID(),
    EncryptByKey(@kGuid, "[UserID]",
    EncryptByKey(@kGuid, "[LoginID]",
    EncryptByKey(@kGuid, "[Password]",
    EncryptByKey(@kGuid, "[LastName]",
    EncryptByKey(@kGuid, "[FirstName]",
    EncryptByKey(@kGuid, "[LastNameKana]",
    EncryptByKey(@kGuid, "[FirstNameKana]",
    EncryptByKey(@kGuid, "[MailAddress1]",
    EncryptByKey(@kGuid, "[MailAddress2]" 
)

(2)対称キーの CLOSE

CLOSE SYMMETRIC KEY Beck_Sym_Key
go

(参考)SELECT文を実行するとデータが暗号化されていることを確認できる。

SELECT * FROM MST_USER

f:id:masawan-guitar:20161010214334p:plain

【3】参照時の操作(復号化)

(1)SELECT文を実行(DecryptByKey で復号化)

対称キーをOPENして、SELECT文を実行。DecryptByKeyでデータを復号化する。

OPEN SYMMETRIC KEY Beck_Sym_Key
DECRYPTION BY PASSWORD = '[SymKeyPassword]'

SELECT TOP 1000 [SystemUserID]
    ,CONVERT(varchar, DecryptByKey([UserID])) AS  [UserID]
    ,CONVERT(varchar, DecryptByKey([LoginID])) AS [LoginID]
    ,CONVERT(varchar, DecryptByKey([Password])) AS [Password]
    ,CONVERT(varchar, DecryptByKey([LastName])) AS [LastName]
    ,CONVERT(varchar, DecryptByKey([FirstName])) AS [FirstName]
    ,CONVERT(varchar, DecryptByKey([LastNameKana])) AS [LastNameKana]
    ,CONVERT(varchar, DecryptByKey([FirstNameKana])) AS [FirstNameKana]
    ,CONVERT(varchar, DecryptByKey([MailAddress1])) AS  [MailAddress1]
    ,CONVERT(varchar, DecryptByKey([MailAddress2])) AS [MailAddress2]
FROM [ProjectManagementSystem].[dbo].[MST_USER]

(2)対称キーの CLOSE

CLOSE SYMMETRIC KEY Beck_Sym_Key

(参考)SELECT文を実行して復号化されたデータを参照。
f:id:masawan-guitar:20161010213804p:plain

※対称キーをDROPする場合

DROP SYMMETRIC KEY Beck_Sym_Key
【4】ユーザ登録を行うプロシージャのサンプル
CREATE PROCEDURE [dbo].[RegistUser]
    @SymKeyPassword varchar(250),
    @UserID varchar(250),
    @LoginID varchar(250) ,
    @Password varchar(max) ,
    @LastName varchar(max) ,
    @FirstName varchar(max) ,
    @LastNameKana varchar(max) ,
    @FirstNameKana varchar(max) ,
    @MailAddress1 varchar(max),
    @MailAddress2 varchar(max)
AS
BEGIN

    DECLARE @OpenCmd nvarchar(MAX)
    SET @OpenCmd =N'OPEN SYMMETRIC KEY Beck_Sym_Key DECRYPTION BY PASSWORD = ''' + @SymKeyPassword + ''' '
    EXECUTE sp_ExecuteSql @OpenCmd

    DECLARE @kGuid UNIQUEIDENTIFIER
    SET @kGuid = Key_GUID('Beck_Sym_Key')

    INSERT INTO MST_USER (
        [SystemUserID],
        [UserID],
        [LoginID],
        [Password],
        [LastName],
        [FirstName],
        [LastNameKana],
        [FirstNameKana],
        [MailAddress1],
        [MailAddress2]
    )VALUES(
        NEWID(),
        EncryptByKey(@kGuid, @UserID),
        EncryptByKey(@kGuid, @LoginID),
        EncryptByKey(@kGuid, @Password),
        EncryptByKey(@kGuid, @LastName),
        EncryptByKey(@kGuid, @FirstName),
        EncryptByKey(@kGuid, @LastNameKana),
        EncryptByKey(@kGuid, @FirstNameKana),
        EncryptByKey(@kGuid, @MailAddress1),
        EncryptByKey(@kGuid, @MailAddress2) 
    )

    CLOSE SYMMETRIC KEY Beck_Sym_Key

END
広告を非表示にする

開発コードネーム 『Beck』 その2

(注)以下は、例えば物理的に隔離された高価なセキュリティールームを用意することができない、
検証環境が無い、その他いろいろ、そもそも「そんなにお金をかけれない」といった状況で
「ソフトウェアの機能+少々の運用ルール」のみで個人情報の保護を実現する方法を
できる限り考えているだけです。世の中はお金持ちばかりでは無いので。
私の居る現場では、個人情報保護のため、特別な権限を持った人のみが入れるセキュリティルームがあります。
でも、そんな環境はどこの現場でも用意できるものではないと思い、
現場で、特別な権限を持たないような人であっても、別の部屋を用意しなくても、
個人情報漏洩の責任を負わされることを気にすることなく仕事が行える状態になり、
また、個人情報の保護、漏洩の防止を実現できる方法は無いか?と試しに考えてみたまでです。
 

「(1)システム管理者側の機能を贅沢にする」について。

個人情報の保護を考慮して、システムの障害原因調査やシステム動作の解析が行える設計としたい。

「ユーザーの個人情報」を「架空の個人情報(実在しない個人情報)」に置き換えたデータを使用して、
システム障害の原因調査が行えるような機能を盛り込むことにする。

今、要件を想像中で、っていうか言われたこと無いけど、そういう感じの要件あるだろう。
システム動作についてデータ調査を依頼したい状況の場合、
調査依頼先が、システムの開発元や保守・運用担当などであったとしても、
「本番環境における個人情報に関するデータを見られたくない」なんていう要望も少なからず、あるはずだ。

そんなご要望にお応えして、
「ご安心ください、個人情報は見えません。『架空の個人情報』が見える状態でデータ調査が可能なんです。」
といったような状況を実現するためのシステムの仕様、取り決め事などを考えている。
そんで軽く運用のイメージを描いてるところだ。詳細は後でまとめるとして。

まずは概要から。

一応の前提(システムの利用権限に関する決め事など)
・システム導入先の組織をA社とする。
・本番運用にて、ユーザー登録時に個人情報は暗号化してDBに登録する仕組みとする。
・暗号キーに関する情報(データ暗号化/復号化の際に使用するパスワード等)を保管するのはA社のみ。
 開発元はA社のその情報を破棄する。
システム開発担当の人たち(ソースが見れる人たち)に対しても
 システム本番運用時のA社固有の暗号キーに関する情報を秘密にしておく。
・本番運用時の個人情報が含まれたデータを「システム開発元(調査を行う側)」は取得することはできない。
・A社のユーザー本人は、自身のユーザーIDが分かる状態。
・ユーザーIDに該当する人が本当は誰なのか?が分かる権限を持つのはA社の「システム担当者」のみ。
・「システム開発元(調査を行う側)」の権限では、A社の本番環境のログインユーザー情報と
 ログインパスワードを知ることはできない。
・「システム開発元(調査を行う側)」の権限で、調査用DBを使用した場合には、
 ログインパスワードを知らなくても「ユーザーID」のみでログイン可能。
f:id:masawan-guitar:20161008195039p:plain

だいたい上記みたいな感じで運用させてみたい、ということだ。

例えば「給与の情報とか、データベースを覗いたら丸裸!」みたいなシステムよりはマシだとは思える。
開発元や保守・運用の人などに対しても、名前を見せないようにすることくらいしたほうがよいと思う。
AES暗号化はエチケット(礼儀作法)のようなものだ。システムにデリカシーは必要だ。
「AES-256」にしようかな。

@IT マスターIT/暗号技術:第3回 AES暗号化
http://www.atmarkit.co.jp/ait/articles/1506/18/news019.html

Microsoft Developer Network(MSDN)
SQL Server 2016 暗号化アルゴリズムの選択」
 https://msdn.microsoft.com/ja-jp/library/ms345262.aspx
「CREATE SYMMETRIC KEY (Transact-SQL)」
 https://msdn.microsoft.com/ja-jp/library/ms188357.aspx

システム動作の解析や、障害の原因調査のような業務では、
個人が誰であるかを特定できない性質の「個人を意味するシステム上のユニークなキー」の情報は必要。
個人が誰であるかを推測し難くするためには「ユニークなキー」は定期的に振り直した方がよいのかな。
まあ、その「ユニークなキー」を本番運用環境DBと調査用DBで一致させるようにする。
→ データベースが自動作成した「uniqueidentifier」型の識別子を利用する。

広告を非表示にする

開発コードネーム 『Beck』

独自の「プロジェクト管理システムの設計&開発」をスタート。
開発コードネームRedstone」とかそういうの、マイクロソフトの真似をしてみるのもいいと思うので、
この開発コードネームは「Beck(ベック)」と名付けてみる(孤高のギタリスト Jeff Beck から拝借)。
※(注) 当開発プロジェクトは、自宅での自由研究です。

f:id:masawan-guitar:20161003002116j:plain:w300

当初、OSSを利用してみようと思って調べていたのですが、
仕事のほうで、ASP.NET(VB)を扱うことになったので、実益を伴うほうがよいということもあり、
ASP.NET(VB) + DB:SQLServer という組み合わせでやっていきます。

勝手に思ってるだけなんですが、大切なのは「芸術」と「工学」と仮定して、
工学の分野は私が担当するので、誰か画面デザインをお願いしたいです。

プロジェクト管理システムで何を実現するかは、主にはローカルでまとめるとして、
大雑把な構想としては・・・

(1)システム管理者側の機能を贅沢にする

 障害発生時に、システム管理者等が、
 システムで発生している現象について「様々な解析」が行える機能。
 また、現在、流行ってる「ログの可視化」関連の機能や、
 通常稼働中のシステムから「様々な指標」を抽出できる機能を盛り込みたい。
 できたら、まずは周りの人に見せて、意見を伺うという流れで行きたいところです。

(2)ユーザー側の機能をシンプルにする

 と見せかけて、多くの機能を表には出さず、裏の機能として盛り込んでおく。
 後々、要望が挙がった時に、できる限り要望に応えられるように
 システムの動作を切り替えられるようにしておきたい。

(3)何かしら困ってる人の助けになるように、ノウハウ共有のための「爆速の事例検索機能」を盛り込む。

 プロジェクト管理と直接的に関係がない場合も多々あるけど、
 個人の能力よりも、多くの人たちのノウハウが1つの場所に集まり、残り続けて、それらが活用され、
 また、可能であれば発展させていこうとする流れの方が、全体として良いに決まってる。
 その一方で、周りの人たちの助けになるようにと、何かしらの対応事例をシステムに登録して、
 後の人たちが参照できるように、対応事例を残してくれた個人のためにも、
 対応事例登録、及び、参照に関する週間、月間、年間ランキング的なものを集計して表示して・・・
 特定の個人を犠牲にすることなく全員のために行われた他人の行動の欠点をあげつらって
 ディスってるような評価はシステムから排除して、
 例えば、マイナス評価無しで「匿名非公開のプラス評価」を積み上げて集計していく仕組み等、
 プラスの評価をゼロから積み上げ、アゲアゲの気持ちでいこうという仕掛け、流れが欲しいところであり、
 仲間を助ける行動のうち、恩着せがましくなくて、素直に「ありがたい」と思われるささやかな行動に感謝、
 (そのような「感謝ポイント」を積み上げていく方法、公平なスタンスで集計していくシステム仕様、
 また、運用ルールをどのように定めていくのかが課題だ。自分なりの答えを出す必要がある。)
 かつ、そんなささやかながらの行動をした人のお給料がUPされるのは当然だよね、
 といった感じの流れができればいい。

といったところです。

マイクロソフトExcelのファイルを扱えるライブラリを探したのですが、
今のところ「EPPlus」ってのが良さげでした。
ただし「.xls」のファイルは扱えず「.xlsx」のファイルのみだそうです。

試しに、Excelファイル(.xlsx)のアップロード&データをデータベースに一括登録する処理を実装して、
処理時間計測をしましたが、

  5,000件 9秒84
 10,000件 19秒01

まだまだかなと。コードの組み方はまだ改善の余地はあるので、もう少し調べて、速くしてみたい。

疑似個人情報データ生成サービスってのがあったので利用してみましたが、テストデータを作るのが楽でした。
URL) ttp://hogehoge.tk/personal/generator/
※上記の頭に h を付けて、http~にしてください。

f:id:masawan-guitar:20161002202955p:plain

広告を非表示にする

Visual Studio 2015 Professional VB.NET 単体テストの作成

Visual Studio 2015 Professional VB.NET(以下、VB)にて、MSTestを利用した単体テストの自動化を試しています。ユニットテストフレームワークはたくさんありますが、VisualStudio標準の「MSTest」から使ってみようというところです。

手順を確認した際に、VBにおいてコードエディタ上のコンテキストメニューから「単体テストの作成」が行えない現象が発生する場合がありました(※VB単体テストプロジェクトを手動で作成する方法や、C# の場合には問題なく行えました)。 現時点で、他の端末での動作等は未確認のため、端末依存の問題であるかどうか不明で、また、設定が不足している、VisualStudioの不具合とも断定できない状況ではあります。
ただ、VBにおいても、コードエディタ上で右クリックから単体テストの作成を行えた方が便利と思い、コンテキストメニューから「単体テストの作成」が行えない現象を回避する方法を見つけましたので、記載しておきます。

■前提

前提としては、コードエディタ上のコンテキストメニューに「単体テストの作成」を表示する設定が行われていることです。まずは、「単体テストの作成」をコンテキストメニューに表示する設定を行う必要があります。

以下のサイトはVisualStudio2012の手順にはなりますが、参考になりました。
VisualStudio2015でも同様の手順で設定が行えます。
すがろぐ » Visual Studio 2012 右クリックで単体テストの追加 コンテキストメニューを表示する。

■手順(例)
VBでコードエディタ上のコンテキストメニューから「単体テストの作成」を行うための操作
(1) メニュー[ファイル]から[新規作成]で[プロジェクト]を選択します。

f:id:masawan-guitar:20160917085022p:plain

(2) VBのクラスライブラリを選択します。OKボタンを押下します。

f:id:masawan-guitar:20160917093041p:plain

(3) (VB)メソッドを追加し、メソッド名を右クリックするとメニューに[単体テストの作成]は表示されているのですが、選択できない状態となっています。

f:id:masawan-guitar:20160917085037p:plain

(4) ソリューションエクスプローラーで、ソリューションを右クリック→[追加]→[新しいプロジェクト]を選択します。

f:id:masawan-guitar:20160917085115p:plain

(5) C#のクラスライブラリを選択します。OKボタンを押下します。

f:id:masawan-guitar:20160917085047p:plain

(6) ソリューションに「VB」と「C#」のプロジェクトがある状態になります。

f:id:masawan-guitar:20160917085125p:plain

(7) (C#) クラスを右クリックし、[単体テストの作成]を選択します。

f:id:masawan-guitar:20160917085143p:plain

(8) (C#)以下のエラー画面が表示されます。[OK]ボタンを押下します。

f:id:masawan-guitar:20160917085540p:plain

(9) (VB)その後、再度、VBのメソッドを右クリックすると[単体テストの作成]が選択できる状態になっています。[単体テストの作成]を選択します。

f:id:masawan-guitar:20160917130955p:plain

(10)(VB)単体テストの作成画面が表示されます。[OK]ボタンを押下します。

f:id:masawan-guitar:20160917085221p:plain

(11)(VB)単体テストの作成中のウインドウが表示されます。

f:id:masawan-guitar:20160917085228p:plain

(12)(VB)単体テストのプロジェクト、テストコード(テンプレート)が自動生成されます。

f:id:masawan-guitar:20160917085238p:plain

その後、C#のプロジェクトを削除しても、
問題なくVBのコードエディタ上からの右クリックで「単体テストの作成」は行える状況でした。

■バージョン情報

f:id:masawan-guitar:20160917090516p:plain

■暫定的なまとめ

Visual Studio 2015 Professional VB.NETにて
コードエディタ上で右クリックメニューから[単体テストの作成]が行えない時には、
ソリューションにC#のプロジェクトを追加して、
一度、C#のコードエディタ上から[単体テストの作成]の操作を行えば、
その後、VBのコードエディタ上での右クリックメニューから「単体テストの作成」が行える状態になる。

広告を非表示にする