非機能要件(非機能設計)とは

経験が浅い技術者は、システムを構築する際、ユーザーの目から見える機能(機能要件)を満たすことのみを考えがちです。
しかし、システムが価値を生み出すためには、システムが安定的に運用される必要があります。
システムの安定運用を実現するための要件を、「非機能要件」と呼びます。

要件は、国際規格ISO/IEC 9126(JIS X 0129)においては、「機能性」「信頼性」「使用性」「効率性」「保守性」「移植性」の6つの特性に分類できます。
この内、「機能性」を除いた5つの特性が「非機能要件」とみなすことができる特性です。
これらの分類を詳しく書くと以下の通りです。


この国際規格は、情報処理技術者試験で出題されます。
試験対策としては、6つの特性とその概要さえ覚えておけば十分です。

また、実務に従事する上では、6つの特性とその概要を理解した上で、副特性に書かれている観点を網羅的に見て非機能要件を洗い出すことが重要です。
現場に要件定義書のテンプレートがあるのであれば、その現場のテンプレートに従って非機能要件を記述すれば良いのですが、テンプレートが無い場合はこの国際規格をベースに要件定義を進めるのが良いでしょう。

なお、要件定義の後の基本設計でも、非機能要件をベースとした非機能設計が必要になります。
非機能設計についても非機能要件と同じことが言えます。


いかがでしたでしょうか。

今回は、見逃されがちな非機能要件について触れました。
特に、新規のシステムの上流工程に携わるのであれば絶対に知っておきたい知識なので、携わる予定があるのであればどのような特性があるのか今一度眺めてみると良いでしょう。

これからも役に立つ技術の解説を書いていこうと思います!

共通鍵暗号方式・公開鍵暗号方式とSSL

この記事では、暗号化が必要な理由や共通鍵暗号方式・公開鍵暗号方式の概要、SSLの仕組みの概要について書きます。
暗号化については、ノード(端末やサーバ等、他の機器との通信を行う主体を指す)間の通信に着目した内容となります。

1.暗号化が必要な理由

ノード間の通信内容は、Wiresharkのようなパケットキャプチャ(ソフトウェア)で確認することが可能です。
どのような形で確認できるのかは、Googleの画像検索で調べればイメージがわきやすいと思います。

そして、ユーザ/パスワードのような重要な情報を送受信する際も、同じようにパケットキャプチャで通信内容を見ることができてしまいます。
もし、そのような重要な情報が平文(生データ)で送受信されていたとしたら、それはセキュリティ面で重大なリスクとなります。
例えば、ユーザ/パスワードを盗み見た第三者が、なりすましでログインすることができてしまいます。

それを防ぐために、「鍵」と呼ばれる通信を行う者同士であらかじめ共有されたデータを使用し、特定のアルゴリズムにより通信するデータを暗号文に変換します。
そうすることで、第三者に通信内容を盗み見られたとしてもその中から重要な情報を取得されるのを防ぐことができます。
「鍵」を持たない第三者が暗号文を見ても内容を理解できない、という所が重要です。

2.共通鍵暗号方式・公開鍵暗号方式の仕組み

暗号化の方式は大きく分けて二つあり、「共通鍵暗号方式」と「公開鍵暗号方式」があります。

2.1.共通鍵暗号方式

これは、あらかじめ2者間で共有された共通鍵を使用する方式です。
図解すると以下のようになります。

この方式は、方式が単純であることから暗号化・復号を早く行うことができるのが利点ですが、多くの鍵を用意する必要がでてきてしまう欠点があります。
上記の図の通りなのですが、2者の組み合わせ毎に鍵を用意する必要が出てきてしまうため、n(n-1)/2の分だけ鍵が必要になってしまいます。
(各々のノード(n)は、他の各々のノード(*(n-1))に対して鍵を用意する必要がある。ただし、2者間で別々の鍵を用意する必要はない(/2)。)

2.2.公開鍵暗号方式

これは、それぞれの主体が秘密鍵と共有鍵を管理し、通信を行う時に通信相手に共有鍵を渡して通信を行う方式です。
図解すると以下のようになります。

この方式は、少ない鍵で通信を行うことができる利点がありますが、方式が難しく暗号化・復号を早く行うことができません。
必要な鍵の数は、それぞれの主体が秘密鍵と共有鍵の2つの鍵さえ持っていれば良いので、必要なのは2nの分のみです。

3.SSLについて

インターネット上で通信を安全に行う仕組みとして、SSLと呼ばれる仕組みがあります。
SSLは、インターネットプロトコルであるhttpsにも使われています。
(重要な情報を送受信する時にはhttpsを使うべきであると言われたことがあると思いますが、httpsが安全な理由はSSLを使っているからです)

SSLでは、先で説明した共通鍵暗号方式と公開鍵暗号方式を利用しています。
また、サーバ証明書を利用するのも特徴です。
サーバ証明書とは、認証局(サーバの正当性を証明する第三者の企業)からサーバに対して付与されるものであり、通信を行うサーバが正当なものである(犯罪等に悪用されることがない)ことを証明するデータです。
仕組みは以下の通りです。サーバ側で管理する鍵は2つのみで済む、かつ公開鍵暗号方式は共通鍵(短い文字列)に対してのみ用いられるため高速、と共通鍵暗号方式と公開鍵暗号方式の良いとこ取りの方式となっています。


いかがでしたでしょうか。

暗号化は複雑なアルゴリズムで書かれており、汎用的なライブラリも用意されているので、アプリケーションを作成する技術者が意識することは通常ありません。
しかし、ライブラリを使用する時に暗号化方式の概要の知識がある方が理解が進むため、概要の知識だけでも知っておいた方が無難です。
また、情報処理技術者試験でも問われる内容となりますので、試験対策という意味でも知っておく必要があります。

これからも役に立つ技術の解説を書いていこうと思います!

データベースの障害復旧の基礎

今回は、データベースの障害復旧について、情報処理技術者試験で問われる一般論を書いていきます。
また、関連するファイル・概念の説明もついでに行います。

【データベースの復旧に用いるファイル・概念】

・チェックポイント

障害回復操作を開始すべき時点。一定時間感覚で訪れる。
なお、チェックポイントでは、データベースの状態や障害回復操作を開始すべき時点の情報を保存したチェックポイントファイルが生成される。

・バックアップファイル

障害復旧のためにデータベースのある時点の内容全体をコピーしたファイル。

・ログファイル(ジャーナルファイル) データベースの更新前や更新後の情報を書き出したファイル。

【障害復旧方法】

直前のチェックポイント時点でコミットされていないトランザクションについては障害復旧が必要になる。

・障害発生時点でコミットしていないトランザクション

更新前のログファイルを用いて処理開始時点の状態に戻す。
(ロールバック)

・障害発生時点でコミットしているトランザクション

バックアップファイルを適用してから、更新後のログファイルを用いてコミット時点の状態に進める。
(ロールフォワード)

【障害復旧とは直接関係ないが重要なファイル】

・ダンプファイル

ファイルやメモリの内容を出力したファイルであるが、DBMSにおいては各テーブルの定義情報や全レコードを出力したファイルのことを指す。
実務では、他の環境にデータを移したり、テスト環境等で簡易的にバックアップを取ったりする時に用いる。
(プログラム開発者にとってはこれが一番馴染み深いと思います。MySQLではSQL文(DDL文+INSERT文)がそのままダンプファイルとして出力されるので、中身も理解しやすいです。)


いかがでしたでしょうか。

今回書いた内容は試験頻出であり、データベースが試験範囲に含まれる試験区分であればITパスポートでも問われる内容なので、情報処理技術者試験を受験するのであれば必ず押さえておきたいポイントです。
また、実務でも、基本設計工程やインフラ作業に携わるのであれば知っておく必要があります。

今回の記事が理解の助けになれば幸いです。

アイデアを引き出すのに使えるマクドナルド理論とは

「マクドナルド理論」と呼ばれる心理学のテクニックの紹介です。

あるテーマについて誰もアイデアを発言しない時に、すぐに思いつく限りで最低のアイデアを発言すると、皆がアイデアを発言し始める、というテクニックです。
昼食を決める時に「マクドナルドに行きたい」と言うと他のメンバーがより良いアイデアを発言し始める、という話が「マクドナルド理論」の由来です。
(マクドナルドが本当に最低のアイデアなのかどうかは置いておいて)

なぜこれでアイデアを発言するようになるのかは定かではありませんが、以下のような理由があると思っています。

  • 最低のアイデアで決まってしまうのを避けたい、という動機が生まれる
  • (取るに足らないかもしれない)自分のアイデアを発言しても良い、という安心感が生まれる

なお、ブレーンストーミングのようにメンバー全員でアイデアの数を稼ぐ必要があるような場面でなければ、あえて最低のアイデアを発言することに拘る必要はないと思っています。
とにかくアイデアを発言すれば、そのアイデアが許容できるものであればすんなり通りますし、最低のアイデアであればマクドナルド理論で対案を発言してくれます。
日々の業務で生産性を上げたいのであれば、アイデアの良し悪しに関わらずとりあえず口火を切って、お互いに悩む時間を減らすことが大事だと考えています。


いかがでしたでしょうか。

今回は、私も使うことがある心理学のテクニックの紹介でした。
心理学のテクニックの中には仕事で使えるものも少なくないので、また紹介したいと思います!

文字コードの入門

この記事では、文字コードに関する初歩的な内容について簡単に書いていきます。

1.文字コードの概念とコード体系

コンピューターで取り扱う文字には、それぞれコードが割り振られています。
コードは1~4バイトの情報として取り扱われ、1バイトの文字は1バイト文字、2~4バイトの文字はマルチバイト文字と呼ばれます。
原則として、半角英数字記号は1バイト文字として扱われ、それ以外の文字はマルチバイト文字として扱われます。
(ここでは詳しく触れませんが、半角カナや人間には読めない制御文字は、1バイト文字のこともあればマルチバイト文字のこともあります)
これらの情報は、16進数で表現されることが多いです。また、プログラム上では、10進数で表現されることも多いです。

どの文字にどのコードが割り振られるのかは、コード体系によって決まります。

1バイト文字に関しては、今日のPCではASCIIというコード体系が使われます。
ASCIIにて、どの文字にどのコードが割り振られているのかは、以下の表から確認することができます。
(例えば、「A」には「0x41」(10進数で「65」)が、「a」には「0x61」(10進数で「97」)が割り振られています)
https://ja.wikipedia.org/wiki/ASCII

また、ホストコンピューターでは、1バイト文字にEBCDICという別のコード体系が使われます。
EBCDICの表は以下の通りであり、ASCIIとは異なる割り振られ方をしていることがわかります。
(例えば、「A」には「0xC1」(10進数で「193」)が割り振られています)
https://ja.wikipedia.org/wiki/EBCDIC

マルチバイト文字については、今日ではUTF-8やShiftJISといったコード体系が使われることが多いです。
(マルチバイト文字に関しては、この記事では詳細を割愛します)

2.ソースコード上で文字コードを取り扱う例

ソースコード上でも、文字コードを取り扱うことができます。
と言うより、文字は内部的には文字コードであり、「A」や「a」といった表示は人間が読みやすいように表現しているものです。

以下は、「A」や「a」といった文字が内部的にどのような文字コードを持っているのかを表示するJavaのプログラムです。
ASCIIコード表通りの文字コードが割り振られていることを確認できます。

■ソースコード

・CharCode1.java

■実行結果

また、文字の比較も、文字コードにより行うことができます。
以下は、「ABC」という文字列を前から1文字ずつ読み込み、「B」の文字を読みこんだ時だけ表示を行うJavaのプログラムです。

■ソースコード

・CharCode2.java

■実行結果

3.文字コードを意識する理由

ここで、「なぜプログラミングで文字コードを意識する必要があるのか」と疑問を持った方もいらっしゃるかもしれません。
確かに、人間には読みにくい文字コードを使ったプログラミングをするよりも、文字を直接使ったプログラミングの方が望ましいように思えます。
例えば、この記事で2つ目に取り上げたソースコード(CharCode2.java)では、文字コードを使用しなくても文字コードを使った時のような制御を実現でき、それならば文字コードを使った制御をしない方が望ましいように思えます。

それでも文字コードを意識する一番の理由は、バイナリの制御文字を取り扱うために必要だからです。
文字には、人間が読める文字の他に、コンピューターに命令を送るための制御文字が存在します。
多くの人にとって一番馴染みがある制御文字の一つが「改行文字」です。
コンピューターが改行文字を読みこむと、文章の改行が行われます。
(この記事が正しく改行されて読みやすくなっているのも、この「改行文字」のおかげです)
改行文字はOSによって割り振られている文字コードが異なりますが、Unix/Linuxの場合は「10」が割り振られています。
この文字は、プログラム上で”A”や”a”といった形で記述することができず、プログラミング言語やライブラリでサポートされない場合は、文字コードを参照しないと改行文字であるか否かを判定できません。

例えば、Javaで絵文字を含む文字列を1文字ずつ切り取る場合に、文字コードの参照が必要になります。
解説やコード例は以下の記事に書いています。
java:Unicodeの絵文字をjavaで取り扱う


いかがでしたでしょうか。

文字コードについてプログラミングの入門書に書かれていることは少ないですが、実務では度々目にします。
実務でプログラミングをするのであれば、文字コードについても早めに勉強しておくことをお勧めします。