設計書レビューの種類を理解しよう

前回の勉強内容

ponsuke-tarou.hatenablog.com

レビューの種類についての過去問

作業成果物の作成者以外の参加者がモデレータとして主導すること,及び公式な記録,分析を行うことが特徴のレビュー技法はどれか。

ア. インスペクション > 正解
イ. パスアラウンド
ウ. ウォークスルー
エ. ペアプログラミング
平成24年春期問47 レビュー技法|応用情報技術者試験.com

インスペクションは、公式性の高いプロセスやルール・役割分担が決まっているレビュー技法です。

  • 英語 : inspection
  • 英和:精査,点検,検査; (書類の)閲覧. (ɪnspékʃən )
  • 別名 : ソフトウェアインスペクション

目的は欠陥を発見すること
以下のことを行う
a) 仕様を満たしていることの検証
b) 既定の品質を満たしていることの検証
c) 適切な規則・標準・ガイドライン・計画・仕様・やり方に従っていることの検証
d) a)-c)の結果が逸脱していないことの確認
e) Collects software engineering data (for example, anomaly and effort data)
f) 集めたsoftware engineering dataをチェックリストや検証の材料に使う
g) 発見した欠陥の修正をする
h) プロジェクト管理において適切な決定ができるようにインスペクションの結果を使えるよ う 記録 す る
IEEE 1028 Software Review and Audit

目的は、欠陥を発見すること。
他のレビューとは以下が違う
1. プロジェクトや企業の決まりに従う
2. 対象はサンプリングする
3. モデレータが管理を行う
4. インスペクションのノウハウがあるモデレータが先導する
5. インスペクションチームのメンバーが気付いた欠陥や他の意見についてモデレータ指揮の元話し合う
SWEBOK V3

ピアレビューの一種。ドキュメントの目視検査により、欠陥を検出する方法。
これにより、たとえば、開発標準の違反や、上位レベルドキュメントへの準拠違反が見つかる。最も公式なレビュー技術なので、必ず、文書化された実施基準に従って進める。
JSTQBソフトウェアテスト標準用語集

目的 : 欠陥の検出

設計仕様書やコーディングしたプログラムのロジックを第三者が検証し、誤りや問題点を検出することである。
インスペクションとは (inspection): - IT用語辞典バイナリ

メリット

  • 開発者本人が気づきづらい問題点を洗い出すことができる
  • プログラムなどを実際に動作させてみるテストでは検知できない潜在的な不具合を見つけることができる場合がある
  • コーディングルールに対する違反や極めて限定された条件でしか発生しない誤動作に繋がる問題点が検出される

役割

  • モデレータ(インスペクションリーダ) : 進行を主導し、インスペクション作業全体を統括する
    • モデレータにより、参加者の選定や、個々の役割の規定などが行われる
  • マネージャ : 実施のスケジュールを立て、レビューの目的が適切かどうかを判断する
  • レビューア(チェッカー/インスペクタ) : ある特定の技術やバックグラウンドを持ち、レビューを行う
    • 専門的ノウハウのある人
    • いろいろな分野や、レビュープロセスの役割を代表する人
    • 例えば・・・
      • プロジェクトや開発対象に関して一般的な知識しか持たないが、インスペクションの豊富なノウハウを持つ人
      • 法務やセキュリティーの専門知識をもっている他部門
  • 記録係 : レビューで取り上げた全ての課題・問題点・未解決事項を記録する
  • 他にも進行役等が設けられることもある

ルール

  • 実施計画立案では、実施タイミングや対象だけではなく「結果をどう使うか」まで決める
    • 例) 結果は対象ドキュメントの品質向上に使う
    • 例) 実施結果を工程移行の判定に使う
    • 例) プロジェクト完了後のプロセス改善のための会議のインプットに使う
  • 検出した欠陥をログに保管し、修正が行われたことを追跡調査する
  • インプット : ドキュメント
    • 企画書、プリセールスの提案書、プロジェクト計画書、要件定義書、各種設計書、ソースコード、バグ票、テスト計画書などあらゆる文書
  • アウトプット : 対象ドキュメントに含まれていると指摘された欠陥のリスト

f:id:ponsuke_tarou:20190806232933p:plain

ウォークスルーは、作成者がレビュー対象を説明しレビュー対象者にコメントを求める形式で進行するレビュー技法です。

  • 英語 : walkthrough

インスペクションに準じる公式なソフトウェアレビューに位置付けられることが多い。
ウォークスルーは、レビューを希望する作成者が数人のレビューアを招集、成果物の内容を順に説明する形式をとる。それに対してレビューアは、説明を通じて対象を追跡・検証し、その誤りや矛盾、抜け漏れなどを指摘するというのが大まかな流れである。
ウォークスルー(うぉーくするー) - ITmedia エンタープライズ

ドキュメントの著者による段階的なドキュメント内容の説明。情報を集めて、内容の共通理解を確立するために行なう。
ソフトウェアテスト標準用語集

目的 : 設計上の誤りを早期に発見すること と 設計の共通理解

設計上の誤りを検出するために作成者と複数の関係者が設計書をレビューします。
要求段階や設計段階の初期には,エンドユーザ (利用者) にも参加してもらうこともあります。
また、関係者間での使用上の共通理解を得ることができる。

メリット

  • ミーティングで指摘や意見が得られる
  • ウォークスルーの開催を前提にすれば、作成者は成果物を作る段階からそれが読まれること、他人に説明することを意識する
  • 作成者はミーティングで自身の考えを論理を説明する作業を通じて、自分自身で問題点や矛盾点に気付く場合もある
  • 解決策は、会議終了後に成果物作成者が自分で考えるので、会議の時間を短縮できる

ルール

  • 作成者が主体となって開催する
  • 指摘された内容は文書化するが、欠陥を修正するか否かについては作成者の責任として、ミーティングでは取り扱わない
  • 作成者はミーティングの終わりに指摘項目を読み上げ、追加の問題点やコメントの有無を確認する。

デザインレビューは、各設計工程において次の工程に向けて成果物を複数人でチェックするレビュー技法です。

  • 英語 : DesignReview
  • 略称 : DR

デザインレビューとは、開発における成果物を、複数の人にチェックしてもらう機会のことで、JIS(日本工業規格)やISO(国際標準化機構)9000シリーズにおいて定義されている設計審査のことである。
デザインレビューとは何? Weblio辞書

上司や管理者が参加すると設計者への評価へつながるため、出席すべきではないとされている。
情報処理教科書 応用情報技術者 テキスト&問題集 2018年版(日高哲郎)|翔泳社の本

目的 : 設計の工程ごとに設計品質の評価と各工程が終了したかどうかを判断する

レビュー対象が内部設計書であれば、外部設計書との一貫性の検証と要件定義の内容を満たしていることの確認を行う。
各設計工程ごとに成果物の問題点の早期発見を行うことで、後工程の作業をスムースにしてシステムの最終的な品質を高めることにつなげる。

メリット

各フェーズにおける仕様書や設計書、プログラムなどの成果物を第三者の目(営業、経理、購買、生産管理、品質保証など)でレビューすることにより、開発者の視点では漏れてしまう内容を精査して、品質を確保することを目的としている。<省略>
デザインレビューの参加者が、成果物について指摘し合うことにより、現在起きている問題やプロジェクトの進捗状況などの情報を共有することができるため、設計審査のみならず情報共有手段としても有効である。
デザインレビューとは何? Weblio辞書

f:id:ponsuke_tarou:20190823171232j:plain
黒姫山

次回の勉強内容

ponsuke-tarou.hatenablog.com

寝るまでにざっくり知っとくRDSって何?

BOSSから「RDSへ切り替えてみてもらえませんか?」と言われました。
懇親会でほろ酔いのまま「明日、やってみます!」と答えました。
はい、めちゃめちゃ知ったかしました、RDSがなんだかわかりません。
寝るまでにざっくり確認してみました。

RDSは、AWSのサービスでリレーショナルデータベースを管理できます。

  • 正式 : Amazon Relational Database Service

Amazon RDS はマネージド型リレーショナルデータベースで、データベースエンジンを Amazon AuroraMySQLMariaDBOracleMicrosoft SQL ServerPostgreSQL といった一般的な 6 種類のエンジンから選択できます。
特徴 - Amazon RDS | AWS

リレーショナルデータベースを管理するソフトウェアをまとめてRDBMSといいます。

RDBMSとはリレーショナルデータベースを作る・使うためのソフトウェアであり、以下のような特徴があります。

・データの整合性を維持しやすい。
・簡単にデータを参照・更新できるSQLという専門用語がある。
・信頼性のある更新処理を実現するトランザクション機能がある。
・障害発生時でも格納したデータが容易に失われない。
・セキュリティ・チューニングなど多くの周辺機能がある。
データベース初心者でも分かるRDBMSの基本~JPOUG Oracle Database入学式レポート | geechs magazine

RDSは、クラウド上のRDBMSです。

自分たちでせっせとサーバを用意してラックと置き場所を用意して・・・とか不要です。
AWSのEC2インスタンスでDBサーバ作ってインストールやら管理を頑張って・・・をRDSというDB専門サービスで楽にできちゃうみたいです。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/con-VPC-sec-grp.png
チュートリアル: ウェブサーバーと Amazon RDS データベースの作成 - Amazon Relational Database Service

AWSのコンソール画面でボタンをポチポチするだけでRDBの作成から管理まで出来ちゃいます。

https://d1.awsstatic.com/icons/jp/handson/secure-scalable/phase2/ss-handson-086.7f70334480ce55eb75d04e451c941b085497671c.jpg
フェーズ 2-3: Amazon RDS インスタンスを作成 - スケーラブルなウェブサイトの構築方法 | AWS

作ったあとでスケーリングも簡単にできるそうです。

e-words.jp

自動でスケーリングすることさえできるそうです。

https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F354022%2F8978bbb2-f2a7-e220-830d-68b3148902eb.png?ixlib=rb-1.2.2&auto=compress%2Cformat&fit=max&w=1400&s=1f7459ecc5c8b44b236c6262b2e7ea11
【AWS】RDS自動スケーリングが発表されたけど注意事項があるので検証した話 - Qiita

自動バックアップだって設定で出来ちゃいます。

docs.aws.amazon.com

どうやれば起動するんだろう・・・・

RDSは、使ったら使った分お金がかかります、だからきっと明日の朝は停止していることが予想されます。
明日の朝、どうやれば起動するかを知っときます。
aws.amazon.com

方法1. AWS コマンドラインインターフェース (CLI)のstart-db-instanceコマンドを使う

AWS CLIのインストールやらが必要そうなのでまた今度。
docs.aws.amazon.com

方法2. Amazon RDS アプリケーションプログラミングインターフェイス (API)のStartDBInstanceアクションを使う

そもそもAmazon RDS APIの使い方すらわからないのでまた今度。
docs.aws.amazon.com

方法3. AWS Toolkit for Visual StudioAWS Explorerを使う

今回、Visual Studioを使っていないので記録程度。
docs.aws.amazon.com

方法4. コンソール画面でボタンをポチポチする

一番簡単な方法がなぜかなかなか見つからない自分の検索センスの無さに驚きです。

  1. f:id:ponsuke_tarou:20190805221400p:plain
    Amazon RDS コンソールを開きます。
  2. f:id:ponsuke_tarou:20190805221241p:plain
    ナビゲーションペインで、[データベース] を選択し、
  3. 開始する DB インスタンスを選択します。
  4. f:id:ponsuke_tarou:20190805221558p:plain
    [アクション] で [開始] を選択します。

docs.aws.amazon.com

接続情報ってどこにあるんだろう・・・

起動できてもアプリやDBクライアントツールに設定する情報がわからないと困ります。

接続ユーザーとパスワードはRDSインスタンス作成時に指定しているので作成者に聞きます。

流石にそこまでコンソールでは見られないと思います。

https://d1.awsstatic.com/icons/jp/handson/secure-scalable/phase2/ss-handson-080.7ecbc8f8f202a528aba511e6ce09b3001e37d2d8.jpg
フェーズ 2-3: Amazon RDS インスタンスを作成 - スケーラブルなウェブサイトの構築方法 | AWS

最後に

明日、なんとか使えそうなぐらいには調べました。
本当に使えるようにはRDSはおろかAWSRDBの知識もめちゃめちゃ足りません。
少しずつこのページを更新していきたいものです。

f:id:ponsuke_tarou:20190805224722j:plain
とある日

次の日

調べたとおりにRDSを起動できました。

コンソールで確認したエンドポイントとポート番号を使ってみる。

pingコマンドで名前解決できているか見てみます。
# pingは通らなくても名前解決できていることがわかりました。
$ ping {確認したエンドポイント}

ec2-12-345-678-90.ap-northeast-1.compute.amazonaws.com [12.345.678.90]に ping を送信しています 32 バイトのデータ:
要求がタイムアウトしました。
要求がタイムアウトしました。
要求がタイムアウトしました。
要求がタイムアウトしました。

12.345.678.90 の ping 統計:
    パケット数: 送信 = 4、受信 = 0、損失 = 4 (100% の損失)、
クライアントツールで接続してみます。

f:id:ponsuke_tarou:20190806093944p:plain
A5:SQL Mk-2で接続してみる
f:id:ponsuke_tarou:20190806094124p:plain
接続できました。

iptablesはファイアウォールとパケット転送ができる

iptablesでポート転送の設定をして」と言われました。

AWSのCentOS6に「他のインスタンスに転送できるようにiptablesの設定をして」と言われました。
何?iptablesって?

iptablesは、Linuxに搭載されていてパケットのルールを設定できます。

http://smilejapan.net/wiki/index.php?plugin=ref&page=iptables%E3%81%A8%E3%81%AF%EF%BC%9F&src=iptables-1.gif
iptablesとは? - SMILE JAPAN WIKI

CentOS7からファイアウォールは、iptablesからfirewalldへと変更されました。

qiita.com

設定はコマンドと設定ファイルを書く方法があります。

コマンドで設定する時

iptables [-t テーブル] [コマンド] [チェイン] [条件] [ターゲット]

設定ファイルを書いて設定する時
設定ファイルの場所 : /etc/sysconfig/iptables

$ sudo cat /etc/sysconfig/iptables
*nat
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -p tcp -m tcp --dport 54321 -j DNAT --to-destination 10.0.1.1:1521
-A PREROUTING -p tcp -m tcp --dport 54322 -j DNAT --to-destination 10.0.1.2:80
-A POSTROUTING --dst 10.0.1.1 -p tcp -m tcp --dport 1521 -j SNAT --to-source 10.0.1.3
-A POSTROUTING --dst 10.0.1.2 -p tcp -m tcp --dport 80 -j SNAT --to-source 10.0.1.3
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT

受信したパケットはChainというルートを通って処理されます。

https://eng-entrance.com/wp-content/uploads/2016/07/chain.png
【丁寧解説】Linuxファイアウォール iptablesの使い方

https://oxynotes.com/wp-content/uploads/iptables01.png
コピペから脱出!iptablesの仕組みを理解して環境に合わせた設定をしよう | OXY NOTES

https://cacoo.com/diagrams/zWJRlTb4nFY0UoYy-B6C43.png
iptablesの設定 入門編 - Murayama blog.

Chainの種類
名前 設定できるテーブル 説明
INPUT filter, magnle 入ってくるパケットについてのチェイン
OUTPUT filter, nat, magnle 出てゆくパケットについてのチェイン
FORWARD filter パケットを転送についてのチェイン
PREROUTING nat, magnle 受信時にアドレスを変換するチェイン
POSTROUTING nat 送信時にアドレスを変換するチェイン

iptablesは、ポートフォワードとして使用するパケット転送機能もあります。

natテーブルに設定します。

ponsuke-tarou.hatenablog.com

設定ファイルでは「*nat」に書きます。

*nat
ここに設定を書く
COMMIT

iptablesで見かけたNATって何?

iptablesでNATテーブルってあるけどこれ何?

iptablesがさっぱり不明な状態で「iptablesを設定してポートフォワードできるよにする」必要があったのでiptablesが有効になっているか確認したらTable: natって出力がありました。

$ sudo /etc/rc.d/init.d/iptables status
Table: nat
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

NATはプライベートIPアドレスとパブリックIPアドレスを組合せで変換してくれます。

  • 正式名称 : Network Address Translation

https://camo.qiitausercontent.com/441f211d0a460bec29f4270ddbf1c0e090e92ef5/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3136303939332f35316164306362612d643864632d616665302d336334632d6534356563643761313462332e706e67
https://camo.qiitausercontent.com/84807767dd8cb6eac4c67e33b3e4e59a37db3d84/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3136303939332f38363661663661312d396164382d636336612d643431392d3735623237623835653239322e706e67
NATに関して可能な限り分かりやすくまとめて見た。 - Qiita

https://www.infraexpert.com/studygif/tcpipz36.gif
NAT( Network Address Translation )とは

変換するプライベートIPアドレスとパブリックIPアドレスの組合わせを管理してくれるのがNATテーブルです。

http://blog-imgs-70.fc2.com/a/y/u/ayufishing/rtxnat02s.png
NAT の理解は芋づる式 - インフラまわりのプロになりたい

https://www.infraexpert.com/studygif/tcpipz38.gif
NAT( Network Address Translation )とは

LAN内からインターネットへ出ていく時に送信元のプライベートIPアドレスをパブリックIPアドレスに変換してくれるのがソースNAT
  • 略称 : SNAT
  • 英語 : Source NAT
  • 別名 : 送信元NAT

https://camo.qiitausercontent.com/cbec96ed61552c11e57cc9770f4e8b3641124298/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3136303939332f37343331323764392d663461622d313838632d653331362d3136323264336339363336302e706e67
NATに関して可能な限り分かりやすくまとめて見た。 - Qiita

インターネットからLAN内にアクセスする時に送信先のパブリックIPアドレスをプライベートIPアドレスに変換してくれるのがデスティネーションNAT

https://camo.qiitausercontent.com/ef453e42301d02cee6a9a09ccdcb4d23283112b8/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3136303939332f37336534346230332d326262392d323635622d656566622d6264343164313239613233352e706e67
NATに関して可能な限り分かりやすくまとめて見た。 - Qiita

NATは、プライベートIPとパブリックIPを1対1の組合せで変換します。

プライベートIPはたくさん作れるけどパブリックIPをたくさん用意するのは大変です。

パブリックIPアドレスはタダじゃありません。

http://blog-imgs-70.fc2.com/a/y/u/ayufishing/rtxnat03s.png
NAT の理解は芋づる式 - インフラまわりのプロになりたい

そこで、IPマスカレード

  • 別名 : NAPT
  • 正式名称 : Network Address Port Translation
複数のプライベートIPを1つのパブリックIPに組合せられます。
なぜなら、IPアドレス+ポート番号で組合せるからです。

https://camo.qiitausercontent.com/8f2cd04f50b039a3a1af1eaef3ccc851c7977029/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3136303939332f32373462393962622d396330372d303663362d623431622d6465353030343230363166352e706e67
NATに関して可能な限り分かりやすくまとめて見た。 - Qiita

https://www.h323.jp/wp/wp-content/uploads/napt.jpg
MCU入門 第9回 NAT/FW トラバーサル③– NAT/FW トラバーサルの仕組み “NATとは” – MCU製品情報サイト VC.info

https://mo.kerosoft.com/pub/mo/image/iptables/.thumbnail/iptables-nat2.png.jpg
NAT箱の192.168.1.30:1234宛に届いたパケットを、10.0.2.50:80へ投げるというNATを書く。
# iptables -t nat -A PREROUTING -m tcp -p tcp --dst 192.168.1.30 --dport 1234 -j DNAT --to-destination 10.0.2.50:80
"10.0.2.50:80宛のパケットは、NAT箱の10.0.2.40というアドレスに付け替えてから送信する"というルールを書く。
# iptables -t nat -A POSTROUTING -m tcp -p tcp --dst 10.0.2.50 --dport 80 -j SNAT --to-source 10.0.2.40
NATのPREROUTINGを通って変換されたアドレスに対して許可ルールを書いておく。
# iptables -A FORWARD -m tcp -p tcp --dst 10.0.2.50 --dport 80 -j ACCEPT
戻りのパケットも許可する
# iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptablesで特定のポートを別のホストへ転送する方法 - Kerosoft : Modus Operandi

コンピュータ化システムバリデーションの基礎となるGMP省令の3大目的

コンピュータ化システムバリデーションを勉強するとGMPという単語をよく見かけました。

ponsuke-tarou.hatenablog.com

GMPとは、日本における「医薬品及び医薬部外品の製造管理及び品質管理の基準に関する省令」のことです。

  • 英語 : Good Manufacturing Practice
  • 日本語 : 適正製造規範

ざっくりいうと「安心して製品を使えるようにやらなければならないこと」です。
GMPは、医療分野以外にも食品などの製造業でも使われます。
日本の製薬・医療業界では「医薬品及び医薬部外品の製造管理及び品質管理の基準に関する省令」を指すことが多いです。
この省令は、GMP省令とも言います。
「医薬品及び医薬部外品の製造管理及び品質管理の基準に関する省令」は薬事法の14条に基づいています。
14条では「医薬品等の製造販売の承認」に始まり承認の基準や審査について記載されています。

GMPは、医薬品製造業における製造管理と品質管理の基準です。

健康食品や化粧品にも適用される基準です。

省令を読んでもよくわかりません。

書いてある文字列が難しくてよくわからないので、GMPを説明しているサイトと合わせて学びます。

誰が作業しても、いつ作業しても、必ず同じ品質・高い品質の製品をつくるために、医薬品製造業者が守るべきルールです。

目的を達成するためにやること

https://www.urethanegel.jp/blog/wp-content/uploads/2018/07/GMP.jpg
GMPって何?|医薬品の品質管理を分かりやすく!

(ハード)薬を作る製造所の環境や設備

GMP省令ではこんな感じで書いてあります。

(構造設備)
第九条 製品の製造所の構造設備は、次に定めるところに適合するものでなければならない。
 一 手順書等に基づき、その用途に応じ適切に清掃及び保守が行われ、必要に応じ滅菌され、また、その記録が作成され、保管されていること。
 二 製品等により有毒ガスを取り扱う場合においては、その処理に要する設備を有すること。
 三 作業所のうち作業室は、製品の種類、剤型及び製造工程に応じ、じんあい又は微生物による汚染を防止するのに必要な構造及び設備を有していること。ただし、製造設備等の有する機能によりこれと同程度の効果を得られる場合においては、この限りでない。
 四 作業所のうち、原料の秤量作業、製品の調製作業、充てん作業又は閉そく作業を行う作業室は、当該作業室の職員以外の者の通路とならないように造られていること。ただし、当該作業室の職員以外の者による製品への汚染のおそれがない場合においては、この限りでない。
 五 飛散しやすく、微量で過敏症反応を示す製品等又は交 叉さ 汚染することにより他の製品に重大な影響を及ぼすおそれのある製品等を製造する場合においては、当該製品等の関連する作業室を専用とし、かつ、空気処理システムを別系統にしていること。
 六 製品の製造に必要な質及び量の水(設備及び器具並びに容器の洗浄水を含む。)を供給する設備を有すること。
・医薬品及び医薬部外品の製造管理及び品質管理の基準に関する省令(◆平成16年12月24日厚生労働省令第179号)

間違いを防ぐことができること

フェールセーフ/フェールプルーフに似ています。
医療系のシステム開発では、設計段階から「ユーザ操作に間違いがあったら?」の目線が必要になりますね。

https://resilient-medical.com/wp-content/uploads/2017/10/s_2d8b5cd55b5a69bb2da5907ef37c47c6-600x500.jpg
https://resilient-medical.com/wp-content/uploads/2017/10/s_1a761dab43bbde6360d38e147bf4de04-600x500.jpg
https://resilient-medical.com/human-error/fail-safe-fool-proof

衛生的であること
高い品質を保ち続けることができること

システム開発では品質を保つために色んな種類のテストを実施します。
医療系のシステム開発ではこれがより厳しく求められることになります。

(ソフト)人によるルールの運用

https://www.temahimado.co.jp/img/gmp_09.gif
GMPとは?│にんにく卵黄通販サイト てまひま堂

http://www.tokyo-eiken.go.jp/assets/pharma/hinshitu/image/gmp_003_2.gif
誰でもわかる簡単GMP (3)考え方の基本〜ルールを決めて書類にする・実行する・見直す・改善する〜

ルールを決めてそれを書類に残すこと

GMP省令では作る手順書の種類を具体的に決めています。
医療系のシステム開発では、仕様書や手順書の作成が重要となります。

(手順書等)
第八条 製造業者等は、製造所ごとに、構造設備の衛生管理、職員の衛生管理その他必要な事項について記載した衛生管理基準書を作成し、これを保管しなければならない。
 2 製造業者等は、製造所ごとに、製品等の保管、製造工程の管理その他必要な事項について記載した製造管理基準書を作成し、これを保管しなければならない。
 3 製造業者等は、製造所ごとに、検体の採取方法、試験検査結果の判定方法その他必要な事項を記載した品質管理基準書を作成し、これを保管しなければならない。
 4 製造業者等は、前三項に定めるもののほか、製造管理及び品質管理を適正かつ円滑に実施するため、次に掲げる手順に関する文書(以下「手順書」という。)を製造所ごとに作成し、これを保管しなければならない。
  一 製造所からの出荷の管理に関する手順
  二 バリデーションに関する手順
  三 第十四条の変更の管理に関する手順
  四 第十五条の逸脱の管理に関する手順
  五 品質等に関する情報及び品質不良等の処理に関する手順
  六 回収処理に関する手順
  七 自己点検に関する手順
  八 教育訓練に関する手順
  九 文書及び記録の管理に関する手順
  十 その他製造管理及び品質管理を適正かつ円滑に実施するために必要な手順
 5 製造業者等は、製品標準書、衛生管理基準書、製造管理基準書、品質管理基準書及び手順書(以下「手順書等」と総称する。)を製造所に備え付けなければならない。
・医薬品及び医薬部外品の製造管理及び品質管理の基準に関する省令(◆平成16年12月24日厚生労働省令第179号)

ルール実行するための手順書をSOPともいいます。

SOP(Standard Operating Procedures)とは標準業務手順書の略称で、治験の際に必ず守るべき基本的な業務手順をまとめた手順書。
SOPとは | 製薬業界 用語辞典 | Answers(アンサーズ)

ルールの実行結果を記録に残して証拠にすること

GMP省令には「記録を作成し、これを保管すること」がたくさんあります。
医療系のシステム開発では、エビデンスをきっちりと残して管理する必要があります。

(製造管理)
第十条 製造業者等は、製造部門に、手順書等に基づき、次に掲げる製造管理に係る業務を適切に行わせなければならない。<省略>
 三 製品の製造に関する記録をロットごと(ロットを構成しない製品については製造番号ごと。以下同じ。)に作成し、これを保管すること。
 四 製品の資材についてロットごとにそれが適正である旨を確認するとともに、その結果に関する記録を作成し、これを保管すること。
 五 製品等についてはロットごとに、資材については管理単位ごとに適正に保管し、出納を行うとともに、その記録を作成し、これを保管すること。
 六 構造設備の清浄を確認するとともに、その結果に関する記録を作成し、これを保管すること。
 七 職員の衛生管理を行うとともに、その記録を作成し、これを保管すること。
 八 構造設備を定期的に点検整備するとともに、その記録を作成し、これを保管すること。また、計器の校正を適切に行うとともに、その記録を作成し、これを保管すること。
・医薬品及び医薬部外品の製造管理及び品質管理の基準に関する省令(◆平成16年12月24日厚生労働省令第179号)

内容を見直して検討・改善していくこと

手順の作成と記録だけではなく、定期的に記録をチェックして状況や環境の変化に合わせた改善が必要になります。

(製造管理)
第十条 製造業者等は、製造部門に、手順書等に基づき、次に掲げる製造管理に係る業務を適切に行わせなければならない。<省略>
 九 製造、保管及び出納並びに衛生管理に関する記録により製造管理が適切に行われていることを確認し、その結果を品質部門に対して文書により報告すること。
・医薬品及び医薬部外品の製造管理及び品質管理の基準に関する省令(◆平成16年12月24日厚生労働省令第179号)

国や会社によってばらつきがあります。

ざっくり似ていても世界各国全く同じ基準ではありません。

PIC/Sでは、GMP基準の国際化を目指しています。

  • 正式 : Pharmaceutical Inspection Convention and Pharmaceutical Inspection Co-operation Scheme
  • 日本語 : 医薬品査察協定及び医薬品査察共同スキーム

PIC/Sは、GMPの分野で共通の基準を設け、各国の査察官にトレーニングの機会を提供することによって、世界中の査察基準を整合させることを目指しています。
PIC/Sの基礎知識。PIC/S GMPとは?PIC/Sの目的や成り立ちは? | コラム | 平原エンジニアリングサービス│医薬品施設のエンジニアリング

GMPの歴史

  • 1961年 サリドマイドの薬害について報告される
  • 1963年 (アメリカ)FDA(アメリカ食品医薬品局)が、連邦食品・医薬品・化粧品法に基づいて医薬品等の製造品質管理基準を定めた
  • 1969年 世界保険機関がWHO-GMPを制定し、加盟国に対して医薬品貿易においてGMPに基づく証明制度を採用・実施するように勧告
  • 1980年 (日本)薬事法改正に伴い「医薬品GMP」施行
  • 1990年 (日本)「原薬GMP」施行
  • 1994年 (日本)「医薬品GMP」「原薬GMP」を合わせた「医薬品の製造管理及び品質管理規則」施行し、これが製造業の要件となった
  • 1995年 PIC/S設立
  • 2005年 (日本)「医薬品及び医薬部外品の製造管理及び品質管理規則」が「医薬品及び医薬部外品の製造管理及び品質管理の基準に関する省令」へ改正され、製造販売承認の要件となった
  • 2014年 日本がPIC/Sに加盟

WebLogic Serverって何?

WebLogic Serverは、Java EEに準拠したWebアプリケーションサーバです。

https://www.unisys.co.jp/solution/tec/software/weblogic/s33drt000007gu0r-img/img_02.gif
多階層型Javaアプリケーションを実現する統合プラットフォーム Oracle WebLogic Server【日本ユニシス】

買収を経てOracle社が作っています。

  • 歴史
    • 1990年代 WebLogic社が開発
    • 1998年 BEA Systems社が買収
    • 2008年 Oracle社が買収

https://www.fujitsu.com/jp/Images/wls-history_tcm102-2266170.jpg
Oracleミドルウェア製品 Oracle WebLogic Server : 富士通

Java EE は、Javaシステム開発するための標準仕様です。

ponsuke-tarou.hatenablog.com

JPAって何?

JPAは、リレーショナルデータベースを使う時用のJavaフレームワークの仕様の定義です。

http://terasolunaorg.github.io/guideline/5.5.1.RELEASE/ja/_images/dataaccess_jpa_mapping.png
6.3. データベースアクセス(JPA編) — TERASOLUNA Server Framework for Java (5.x) Development Guideline 5.5.1.RELEASE documentation

Java EEだけではなくJava SEでも使えます。

JPAJava EEの「Enterprise Application Technologies」に含まれる技術仕様ですが、Servlet/JSPEJBなどと異なり、コンテナ・ベースのアーキテクチャを採用していないためJava SEでも利用可能です。
JPAの基礎1 - Qiita

データベースとJavaを関連付けてくれます。

https://builder.japan.zdnet.com/storage/2015/07/07/8ffc3bda4c104f848f0979154e31cfd1/image5.png
初めてのJPA--シンプルで使いやすい、Java EEのデータ永続化機能の基本を学ぶ - builder by ZDNet Japan

JPAは以下3つの要素から構成されています。

Entityクラスは、データベースにあるテーブルを表すJavaのクラスです。

データベースにある1つのテーブルの1レコードを表すクラスです。
このクラスのインスタンス
データを格納してテーブルを更新したり、
テーブルから取得したデータを格納して使います。

永続性コンテキストは、Entityクラスのインスタンスを集めたものです。

この永続性コンテキストとJPQL*1を使用してデータベースへの問合せを行います。

EntityManagerは、Entityのライフサイクルを管理するためのAPIを提供するインタフェースです。

https://builder.japan.zdnet.com/storage/2015/07/07/13f730bf2cc2d33fca20efa3b6979098/image6.png
初めてのJPA--シンプルで使いやすい、Java EEのデータ永続化機能の基本を学ぶ - builder by ZDNet Japan

JPAの実装

EclipseLink
Hibernate ORM : JPAの仕様作成にHibernateプロジェクトの創始者がいたため、JPAHibernateの影響を受け継いでいます。
Apache Open JPA

*1:Java Persistence Query Language : SQLに似た問合せ言語

アプリケーションサーバとJava EE

アプリケーションサーバ

  • 英語 : Application Server

ビジネスロジックなどを実装したアプリケーションソフトウェアを実行することを専門とするコンピュータネットワーク上のサーバコンピュータ、もしくはそのようなコンピュータ上でのアプリケーションの実行を管理補助するミドルウェアのこと。
ウェブアプリケーションサーバは、ウェブクライアントからのHTTPのレスポンス要求を処理するWebサーバとバックエンドのデータベース中核層への橋渡しを担い、データの加工などの処理を行う。
プログラムの実行環境やデータベースへの接続機能、複数の処理を連結するトランザクション管理機能などを持ち、業務の処理の流れを制御するビジネスロジックを実装しているのがアプリケーションサーバである。
旧来の、クライアントやバックエンド側にビジネスロジックを実装する方式(2階層システム)に比べ、システムの変更や更新、増強などが容易で、柔軟性が高い。

f:id:ponsuke_tarou:20190604224300p:plain
親水公園の猫

アプリケーションサーバのいろいろ

Java EE アプリケーションサーバは、「Java EEに準拠したアプリケーションサーバ」のこと

たとえば・・・
WebLogic*1JBoss、WebSphere、GlassfishCosminexusGeronimoiPlanetOracle 9iAS

.NETフレームワークに準じたアプリケーションサーバ

たとえば・・・
Internet Information Services (IIS) 、Base4アプリケーションサーバZope

その他のアプリケーションサーバ

Java EE以外の言語セット・フレームワークを使用し、ビジネスロジックを実装し得るアプリケーションサーバ

f:id:ponsuke_tarou:20190604224332p:plain
花壇の豆

Java EE は、Javaシステム開発するための標準仕様です。

  • 正式 : Java Platform, Enterprise Edition

Java拡張機能セット
コミュニティ主導のエンタープライズ・ソフトウェアの標準です。Java EEJava Community Processを使って開発されており、業界の専門家、営利団体オープンソース団体、Javaユーザー・グループ、さらに数え切れないほど多くの個人が貢献しています。
技術リソース | Oracle 日本

JavaでWebアプリケーションを中心とした業務アプリケーションを構築するために選定された数々の仕様と、その実装
Java EE 6 環境の構築 (1/4):CodeZine(コードジン)

サーバー中心の複数層アプリケーションの開発、デプロイおよび管理にかかるコストと複雑さを大幅に削減する組織的なテクノロジのセットを含み、広く使用されているプラットフォーム(標準仕様)です。Java EEJava SEプラットフォーム上にビルドされ、移植可能、堅牢、スケーラブル、信頼性、およびセキュリティに優れたサーバー側アプリケーションを開発および実行するための一連の API を提供します。
Java EEおよびJava Webの学習

規定されている機能

Java Servlet
  • サーバ上でウェブページなどを動的に生成したりデータ処理を行うために、Javaで作成されたプログラム及びその仕様
  • (Java EE 7) JSR-340
Java Server Pages ( JSP)
  • HTML内にJavaのコードを埋め込んでおき、Webサーバで動的にWebページを生成してクライアントに返す技術
  • Javaのコードは、<%と%>記号で囲まれた部分に書かれる(スクリプト言語チックにJavaを書く)
  • JSR-53

Java Servletとの違いは、記述方法にあり!
例えば、画像を表示する・・・

  • Java Servlet : Javaプログラムと同様に作成
    • out.print("<img src=\"/img/" + img.getName() + "\">");
  • JSP : HTMLにタグをつけて入れ込む
    • < img src="/img/<%= img . getName ( ) %>">

他にもいろいろ比較して特徴を知ろう!
出展 : JSPの特徴を理解する:Tomcatを使う「JSPプログラミング」(1) - @IT

比較対象 JavaScript JavaScript Java Applet*2 CGI*3 CGI CGI
同じところ HTMLにタグを入れて使う - - 実行するところ - -
違うところ - 実行するところ 実行するところ - 使えるプログラム言語 起動の仕方
JSPの場合 <% %> サーバ側 サーバ側 サーバ側 Java 複数アクセスがあっても1度起動していればその内部で実行
比較対象の場合 <script> </script> クライアント側 クライアント側(アプレット自体はサーバにおいてあるが使う時にクライアントに持って行って実行する) サーバ側 特定のプログラミング言語に依存しない(JavaでもCでもどんとこい) アクセスがあるたびに新しいプロセス起動
Java Server Faces ( JSF)

JSFコンポーネントベースのフレームワークであり、Strutsなどのアクションベースとは異なります。
https://www.dcom-web.co.jp/wp-content/uploads/2015/06/img_dcom_jsf1_19.jpg
【JavaEE】今からでも間にあうJSF入門

Java Naming and Directory Interface ( JNDI)
  • ネーミング・サービス / ディレクトリー・サービス を扱うためのインターフェイスを規定した仕様
  • ディレクトリ・サービスが提供するデータやオブジェクトを名前で発見し、参照するのためのAPI
  • 他システムに対するインターフェースであり、具体的な実装からは独立している
  • サービス・プロバイダ・インターフェース(SPI)が規定されており、フレームワークディレクトリ・サービスの実装をプラグインすることができる
  • ディレクトリ・サービスの実装はサーバでもフラットファイルでもデータベースでもよく、サービスの提供側が任意に選択できる
  • JSR-907
Java Transaction API ( JTA)
JPAは、リレーショナルデータベースを使う時用のJavaフレームワークの仕様の定義です。

ponsuke-tarou.hatenablog.com

ほかにもいろいろあります。

f:id:ponsuke_tarou:20190604230702p:plain
花壇のクレソン

*1:ponsuke-tarou.hatenablog.com

*2:クライアント側のWebブラウザ上で動作するJavaのプログラムです。 ブラウザは読み込んだHTML文書内に、アプレット読込を指示する記述があると、サーバに対してアプレットのプログラムを送るよう要求します。 要求を受信したサーバは、クライアントにプログラムを返します。 クライアントは、アプレットプログラムを受け取り、Webブラウザ上で実行します。

*3:e-words.jp

*4:e-words.jp

ストアドプロシージャって何?

ストアドプロシージャは、データベースへの複数処理を1つのプログラムにまとめたものです。

  • 英語 : stored procedure
    • stored : サーバー上に保管(ストア)されるという意味

e-words.jp

https://image.itmedia.co.jp/ait/articles/1703/10/si_plsql-01-1b.jpg
PL/SQLとは何か プログラムの特徴と基本構造を理解する (1/2):超入門「PL/SQL」(1) - @IT

プログラムは専用言語で書きます。

規格またはRMDB 言語
(標準SQLの規格)SQL99 SQL/PSM
Persistent Stored Module
Oracle Database PL/SQL
Procedural Language Extensions to SQL
Microsoft SQL Server Transact-SQL
T-SQL

ストアドプロシージャの友達にストアドファンクションがいます。

ストアドプロシージャは、戻り値がありません。

ストアドプロシージャやストアドファンクションを使うと複数処理を1回でできるので実行速度が早くなります。

https://2.bp.blogspot.com/-iovzQkOLg90/W986Mda8_uI/AAAAAAAByPw/fATEQTmMGskdtHKo6PtP0s3Y5Fg56P5bACLcBGAs/s640/2018-11-04_11h25_09.png
https://1.bp.blogspot.com/-lVOmCKoIt7U/W987oFnsvNI/AAAAAAAByQQ/id2tbYS86b8gpgw3K3vM0UhJg51tmtwBACLcBGAs/s640/2018-11-04_11h32_48.png
Oracle ストアド・プロシージャとストアド・ファンクションの基本と違い|Everything you do is practice


f:id:ponsuke_tarou:20190603204533j:plain
栃木県八幡自然研究路

コンピュータ化システムバリデーションってなんだろう?

ピュータ化システムバリデーションは、製薬業界や医療機器業界で使われる品質保証のことです。

  • 英語 : Computerized System Validation
  • 略称 : CSV

一般工業製品の品質保証となぜ分けているのか?

一般工業製品の場合は「価格」と「品質」が比例します。
安ければある程度の不良は許容されます。

医薬品は、生命にかかわるため不良は許容されないから

医薬品の場合は「価格」にかかわらず「不良」は許容されません。
そのため、世界的にCSVへの取組が求められています。

日本医療機能評価機構のサイトでシステムに関わる医療事故を見ることができます。

日本医療機能評価機構のサイトから「分析テーマ」で「その他」を選ぶと見られます。
www.med-safe.jp

GMP省令が基礎となっています。

ponsuke-tarou.hatenablog.com

GMPの対象のうち製薬や医療に関わるコンピュータ化システムが対象になります。

医療機器に組み込まれるシステムだけではなく、文書を管理するシステムまで
医療に関わる広範囲のシステムが対象になります。

2. 適用の範囲
このガイドラインは、コンピュータ化システムを使用してGQP省令及びGMP省令が適用され る業務を行う製造販売業者等に適用する。
このガイドラインの対象となるコンピュータ化システムの例として、(1)~(7)が考えられる。また、対象外となるコンピュータ化システムは別紙2に記載する。
(1) 医薬品、医薬部外品市場への出荷の可否の決定に係るシステム及び市場への出荷に係る記録を 作成、保存管理するためのシステム
(2) 製造指図書、製造に関する記録等を作成及び保存管理するためのシステム
(3) 製造工程を制御又は管理するためのシステム及びその管理データを保存管理するためのシステム
(4) 原材料及び製品の保管、出納等の生産を管理するシステム
(5) 品質試験に用いる機器を制御又は管理するためのシステム並びに品質試験結果及び管理データを保存管理するためのシステム
(6) 空調、製造用水製造設備など、製品の品質に重大な影響を及ぼす可能性のある製造支援設備・施設を制御又は管理するためのシステム及びその管理データを保存管理するためのシステム
(7) 文書(手順書類、品質標準書、製品標準書等)を作成、承認、保存管理するためのシステム
医薬品・医薬部外品製造販売業者等におけるコンピュータ化システム適正管理ガイドライン

バリデーションとは、製造工程及びその手順を検証して文書化することです。

検証を行い証拠となる文書を作成することにより、継続的に証拠を積み上げ高度な品質を保証していくことをバリデーションといいます。

「バリデーション」とは、製造所の構造設備並びに手順、工程その他の製造管理及び品質管理の方法が期待される結果を与えることを検証し、これを文書とすることをいう。
医薬品及び医薬部外品の製造管理及び品質管理の基準に関する省令

差分の機能仕様書や設計仕様書を作成してはならない。
最新の当該システムの機能がどうなっているかを一瞥して分かるようにしておかなければならないのである。<省略>
計画書、報告書、仕様書等は、最新バージョンのみをバインダーに綴じておかなければならない。
それに対して、テストスクリプトやテストログは全てのバージョンをバインダーに綴じておかなければならない。
なぜならば、最新のテストログのみを綴じておくとすべてのテストが合格しているからである。
規制当局のレビュでは、成功したテストを調査したいのではなく、エラーになったテストを参照し、解決された経緯を調査したいためである。
https://ecompress.co.jp/wp-content/uploads/2018/08/11.png
【ワンポイント】CSVにおける成果物の種類と管理方法 – eCompress

バリデーションの対象となるのは、開発したシステム自体だけではなくそれを使用する業務プロセスも含みます。

コンピュータ化されたシステム(Computerized System)とは、「コンピュータシステム」と「業務プロセス」を統合したものである。
「コンピュータシステム」は、ハードウェアとソフトウェアから構成され「業務プロセス」は、人、標準業務手順書(SOP)と、設備(例えば測定機器、CRF、筆記具など)から構成される。
コンピュータバリデーションとは イーコンプライアンス

https://jpn.nec.com/process/pharma/images/validatin02.jpg
GxP規制対応・CSVコンサルティングサービス: 製薬ソリューション | NEC

目的は、システムが意図したとおりに動作することを保証することです。

「医薬品、医薬部外品、化粧品及び医療機器の品質管理の基準に関する省令」及びGMP省令に基づく業務を行うためのコンピュータ化システムの要件を明確にし、
コンピュータ化システムが意図したとおりに動作することを保証するため、これを開発する際に必要な事項、これを検証するバリデーションに関する事項及び運用管理に関する遵守事項を定め、GQP省令及びGMP省令の適正な実施の確保を図ることを目的とする。

このガイドラインにおいては、コンピュータ化システムの開発から、検証、運用管理及び廃棄までの流れを総合してコンピュータ化システムのライフサイクルという。

f:id:ponsuke_tarou:20190726160605j:plain
コンピュータ化システムのライフサイクルモデル
医薬品・医薬部外品製造販売業者等におけるコンピュータ化システム適正管理ガイドライン

薬や医療機器の品質保証のために、システムの開発から導入および廃棄までを検証・文書化します。

CSVで重要なことは、開発から廃棄までを検証して証拠として文書を残すことです。
それによって薬や医療機器の品質に問題がないことを保証します。

http://www.ymc.co.jp/design/img/chromato/technicalguide/gmp_support/img_0002.png
GMPサポート・メンテナンス|分取LCシステム|株式会社ワイエムシィ

f:id:ponsuke_tarou:20190726221720j:plain
カテゴリ分類表と対応例
医薬品・医薬部外品製造販売業者等におけるコンピュータ化システム適正管理ガイドライン

CSVではドキュメントがたくさん必要となるため、ユーザ企業とシステムを作る企業の間で成果物のイメージに相違がないことを確認することが作業量のズレ防止に大きく繋がります。

サプライヤが、ユーザ企業から CSV 活動のサポート(アウトソーシング)に関する見積依頼を受けた際に困る点を次に例示する。
●漠然とした要求で何をサポートして欲しいのかがよくわからない
●ユーザ企業とサプライヤの役割分担と責任範囲が明確になっていない
CSV に関する規範が明確になっていない
CSV を行うコンピュータ化システムに関する情報が不十分である

(省略)

サプライヤが精度の高い見積を行う上で最低限必要な情報を、次に示す。
●当該コンピュータ化システムがどの規制に準拠すればよいのか
CSV 活動はユーザ企業の規定あるいはサプライヤの方法に任せるのか
●当該コンピュータ化システムの GAMP のカテゴリ分類、システム規模や複雑さ
●成果物(バリデーションドキュメント)
CSV におけるサプライヤの役割

そんなCSVにはガイドラインがあります。

国際的にはGAMPというものがあります。

  • 正式 : Good Automated Manufacturing Practice

ISPE(国際製薬技術協会)が作っていて、欧米ではこのGAMPの考え方が広く使われていて世界標準的なガイドラインです。

https://www.cst.chiyoda.co.jp/images/solution_iyaku_img1.gif
医薬向けソリューション | ITソリューション | CST(千代田システムテクノロジーズ株式会社)

https://www.to-be.co.jp/solution/assets_c/2017/03/CSV01-thumb-530xauto-5281.png
コンピューター化システムバリデーション(CSV)支援サービス|東洋ビジネスエンジニアリング株式会社 B-EN-G

国際的にはPIC/S GMPというのもあります。

PIC/S*1が、欧州のGMPをもとに作ったガイドラインでこの中にコンピュータ化システムについても記載されています。

日本には「医薬品・医薬部外品製造販売業者等におけるコンピュータ化システム適正管理ガイドライン」というものがあります。

ガイドラインなので法的拘束力はありませんが、海外のガイドラインとも整合性があり世界的にも通用するものです。
GAMPとどう違うかはよくわかりません。

このガイドラインは欧米のGAMP5やPIC/S等のCSVガイドラインと整合性があり、コンピュータ化システムの開発から検証、運用、廃棄までのライフサイクルの考え方を採用しています。
CSVとは。コンピュータ化システムバリデーションとは

https://www.gmp-platform.com/files/user/B5-006-01-08_2-500x288.jpg?v=1435036698
厚労省「コンピュータ化システム適正管理ガイドライン」の要点(8) | GMP Platform

ガイドラインがあってもCSVの理解・実施はとても大変です。

理解するのは大変です。
法令がたくさん関わってきます、他業界のシステムを開発をしてきた開発会社にはわかりにくいです。
実施も大変です。
ドキュメントを大量に作らなくてはなりません、実施状況を定期的に確認して記録しなくてはいけません、関わる関連会社に理解してもらうために指導もしなくてはいけません。
なので、CSVの支援サービスを行っている会社もたくさんあります。

www.fujitsu.com
www.to-be.co.jp

製薬や医療業界のシステム開発で使われる工程の略称

各工程の名前や略称は会社やプロジェクトによって異なりますが、CSVを実施している製薬や医療業界ではGAMP4の用語を各工程の略称として使用していることがあります。
最新のGAMP5ではこの略称の一部は記載されなくなったためいつかなくなるかもしれませんが・・・。

日本語の工程名 (GMP4の略称)英語の工程名 ポイント
設計適格性確認 (DQ)Design Qualification テスト工程になって仕様変更が発生しないよう開発ベンダは「作成する要求仕様書」と供給業者から提出される「設計仕様書」が合致しているかどうかを確認し、その記録を残すことが重要
ユーザ要求仕様 (URS)User Required Specification 要求仕様書の作成には関係部門が連携して、必要事項を漏れなくまとめていくことが大切
システム機能仕様 (FS)Functional Specification 作成はサプライヤがしてもそのレビューと承認はユーザ企業(製薬企業、医療機器企業)の責任である
システム設計仕様 (DS)Design Specification -
実装/単体テスト - -
据付時適格性確認(結合テスト) (IQ)Installation Qualification 設計仕様書等に記載された通りに据え付けられ、プログラムがインストールされたことを確認して記録を残す
運転時適格性確認(機能テスト) (OQ)Operational Qualification
性能適格性確認(要件テスト) (PQ)Performance Qualification 承認された条件下で作業を行って動作できることを確認して記録を残す

歴史

*1:Pharmaceutical Inspection Convention and Pharmaceutical Inspection Co-operation Schemeの略。医薬品分野における品質システムの開発・実施・保守を目的とした協力組織で日本も参加している。

*2:アメリカ食品医薬品局

*3:1993-04-01に施行され、2005-03-30に廃止された。廃止の意図は不明らしい。

*4:[読み方]はっしゅつ。起こること。あらわし出すこと。

*5:「コンピュータ使用医薬品等製造所適正管理ガイドライン」を改定したもので2012-04-01に施行された。

SlackにAWSとPythonを使って簡単なアプリを作る記録

このサイトのやり方でアプリを作る

qiita.com

Slackで新規にアプリとボットユーザを作成する

  1. 「Create New App」ボタンから新規アプリを作成する。
  2. サイドメニューの[Bot Users]から新規ボットユーザを作成する。

AWSでLambda関数からCloudWatchにデバッグ用のログを出力するためのIAMロールを追加する

  1. f:id:ponsuke_tarou:20190507135118p:plain
    [IAM]画面を開く。
  2. f:id:ponsuke_tarou:20190507135340p:plain
    サイドメニューの[Role]を選択して[Create role]ボタンを押下する。
  3. f:id:ponsuke_tarou:20190507135531p:plain
    [AWS service]の[Lambda]を選択し、画面下の[Next: Permissions]ボタンを押下する。
  4. f:id:ponsuke_tarou:20190507135836p:plain
    [AWSLambdaBasicExecutionRole]を選択してロールを追加する。
  5. f:id:ponsuke_tarou:20190507140448p:plain
    Roleが追加される。

AWSでSlack Event APIの認証を行うLambda関数を作成する

  1. f:id:ponsuke_tarou:20190507141038p:plain
    コンソールで[Lambda]を選択する。
  2. f:id:ponsuke_tarou:20190507141332p:plain
    [Create a function]ボタンを押下する。
  3. f:id:ponsuke_tarou:20190507141453p:plain
    [Author from scratch]を選択して必要な項目を入力する。
    1. [Runtime]は、「Python 3.6」を選択する。
    2. [Permission]は、[Execution role]で「Use an existing role」を選択して[Existing role]で追加したIAMロールを選択する。
  4. f:id:ponsuke_tarou:20190507143045p:plain
    参考にしているQiitaページに記載されているコードとHandlerを転記して保存する。
    • エンドポイントを認証するためにSlackからリクエストが送られてきた際には、認証をとおすためにchalleng要素をレスポンスする必要がある。そのための処理。

AWSで新規にAPI Gatawayを作成する

Lambda関数を叩くためのエンドポイントとなるAPIを作成する

  1. f:id:ponsuke_tarou:20190507144320p:plain
    コンソールから[API Gateway]を選択する。
  2. f:id:ponsuke_tarou:20190507144525p:plain
    [Get started]ボタンを押下する。
  3. f:id:ponsuke_tarou:20190507144602p:plain
    [OK]ボタンを押下する。
  4. f:id:ponsuke_tarou:20190507145026p:plain
    内容を入力してAPIを作成する。

APIにPOSTメソッドを作成する

  1. f:id:ponsuke_tarou:20190507145810p:plain
    POSTメソッドを追加する。

デプロイしてエンドポイントを作成する

  1. f:id:ponsuke_tarou:20190507150340p:plain
    [Action]セレクトから「Deploy API」を選択してデプロイを行う。
  2. 画面上部にエンドポイントとなるURLが表示されます。

テストする

  1. f:id:ponsuke_tarou:20190508125412p:plain
    [Test]リンクを押下します。
  2. f:id:ponsuke_tarou:20190508125617p:plain
    [Test]ボタンを押下します。
  3. f:id:ponsuke_tarou:20190508125841p:plain
    Lambda関数が呼ばれてログが出力されました。
  4. f:id:ponsuke_tarou:20190508130138p:plain
    CloudWatchにもログが出力されました。

Slackで作成したAPIを設定する

  1. サイドメニューの[Event Subscriptions]を選択する。
  2. [Enable Events]を「On」にする。
  3. [Request URL]にエンドポイントとなるURLを入力する。
  4. [Subscribe to Bot Events]に「message.channels」か「message.groups」を追加する。
  5. [Save Changes]ボタンで保存する。

f:id:ponsuke_tarou:20190507151234p:plain

「message.channels」を設定することでボットユーザが参加しているパブリックチャンネルに投稿されたメッセージを取得できる

api.slack.com

「message.groups」を設定することでボットユーザが参加しているプライベートチャネルに投稿されたメッセージを取得できる

api.slack.com

パブリックチャンネルプライベートチャネルかを見分ける簡単な方法

Slackの画面横に表示されているチャネル名の横にあるマークを見るとわかる。

f:id:ponsuke_tarou:20190508152336p:plain
#マーク
f:id:ponsuke_tarou:20190508152400p:plain
鍵マーク
get.slack.help

ボットユーザをワークスペースに追加する

アプリをインストールする

f:id:ponsuke_tarou:20190507151911p:plain
サイドメニューの[Install App]を選択し[Install App to Workspace]ボタンを押下してインストールする。

チャネルにボットを参加させる

f:id:ponsuke_tarou:20190507152311p:plain
Slackの歯車マークから[Add people to チャネル]からボットを追加する。

メッセージをチャネルに投げるとAWSのCloudwatchのLogに内容が出力される

START RequestId: 24..................... Version: $LATEST
[INFO]	2019-05-08T06:11:48.565Z	24......................
{
    "token": "hogehoge",
    "team_id": "hogehoge",
    "api_app_id": "hogehoge",
    "event": {
        "client_msg_id": "hogehoge",
        "type": "message",
        "text": "chanelとgroupの違いがよくわからない",
        "user": "投稿したユーザID",
        "ts": "1557295907.016900",
        "channel": "チャネルID",
        "event_ts": "1557295907.016900",
        "channel_type": "group"
    },
    "type": "event_callback",
    "event_id": "イベントID",
    "event_time": 1557295907,
    "authed_users": [
        "hogehoge"
    ]
}
ログはLambda関数に書いた「logging.info(json.dumps(slack_event))」で出力される

ボットユーザがメッセージを投稿する機能を作る

AWSにOAuth Tokenを設定する環境変数を設定する

Slack APIの画面でOAuth Tokenを確認する
  1. サイドメニューの[OAuth & Permissions]を選択してOAuth Tokenを確認する。
    • OAuth Tokenは、ワークスペースにアプリをインストールした際に生成されている。
Lambda画面でOAuth Tokenを設定する環境変数を設定する
  1. [Lambda]の画面 > サイドメニューの[Functions] > 作成した関数 で関数の画面を開く。
  2. [Environment variables]にKEY「SLACK_APP_AUTH_TOKEN」「SLACK_BOT_USER_ACCESS_TOKEN」を入力して各OAuth Tokenを設定する。
  3. 画面右上の[Save]ボタンで保存する。

Lambd関数を更新する

  1. [Function code]に参考にしているQiitaページに記載されているコードを転記する。
  2. [Save]ボタンで保存する。
メッセージの投稿には、ボットユーザがメッセージを投稿できるchat.postMessageを使用しています。

api.slack.com

メッセージを投稿して動かしてみる

f:id:ponsuke_tarou:20190508154352g:plain
できあがり

MacのPhpStormでLaravelプロジェクトでPHPUnitをできるようにする記録

  • 環境
    • macOS Mojave バージョン10.14.4
    • Composer version 1.8.0

以前、Laravelのプロジェクトを作ったことがありましたが、今回はPhpStormを使ってやります。

ponsuke-tarou.hatenablog.com

PhpStormをインストールします。

  1. JetBeanのPHPStormのサイトからダウンロードします。
  2. ダウンロードしたPhpStorm-yyyy.x.x.dmgをクリックします。
  3. f:id:ponsuke_tarou:20190424223044p:plain
  4. f:id:ponsuke_tarou:20190424223107p:plain
  5. f:id:ponsuke_tarou:20190424223120p:plain
  6. f:id:ponsuke_tarou:20190424223133p:plain
  7. f:id:ponsuke_tarou:20190424223145p:plain
  8. f:id:ponsuke_tarou:20190424223205p:plain
    好きな色を選びます
  9. f:id:ponsuke_tarou:20190424223227p:plain
  10. f:id:ponsuke_tarou:20190424223239p:plain

新規にComposerプロジェクトを作成します。

# 事前にインストールしてあるComposerの場所を確認
$ which composer
/usr/local/bin/composer
  1. f:id:ponsuke_tarou:20190424223355p:plain
  2. f:id:ponsuke_tarou:20190424230607p:plain
    プロジェクトを作成するディレクトリとComposerの場所とpackageでLaravelを選択して作ります
  3. f:id:ponsuke_tarou:20190424234741p:plain
    プロジェクト作成中です。
  4. f:id:ponsuke_tarou:20190424235113p:plain
    プロジェクトが作成されました。

qiita.com

Composerがインストールされていない場合はPhpStormのサイトを参照して作成します。

以下サイトの[新しいComposerプロジェクトを作成するには] > [2. ダイアログで、プロジェクトのパラメータを指定します。] > [b. Composerコマンドの実行方法を選択します。]を参照
pleiades.io

Command line parameterで指定した「–prefer-dist」はLaravelをZIPでダウンロードするということです。

# こんなコマンドが動きます。
/usr/local/bin/composer create-project laravel/laravel /path/to/project/directory/tryPhp/composer --prefer-dist

kin29.info
getcomposer.org

Laravelのバージョンを確認します。

# ウィンドウの下にある[Terminal]またはMacのターミナルで確認します。
$ php artisan -V
Laravel Framework 5.8.14

LaravelにくっついているサーバでLaravelの初期画面を確認します。

# サーバを起動します
$ php artisan serve
Laravel development server started: <http://127.0.0.1:8000>
# 表示されたURLにブラウザでアクセスします。
[Wed Apr 24 23:58:16 2019] 127.0.0.1:51584 [200]: /favicon.ico

f:id:ponsuke_tarou:20190425000004p:plain
表示されました。

Xdebugをインストールします。

qiita.com

プロジェクトを設定します。

PHP language levelを使っているPHPのバージョンに合わせます。

# [PHP language level]用に使っているPHPのバージョンを確認します
$ php --version
PHP 7.3.1 (cli) (built: Jan 10 2019 13:15:37) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.1, Copyright (c) 1998-2018 Zend Technologies
    with Xdebug v2.7.2, Copyright (c) 2002-2019, by Derick Rethans
    with Zend OPcache v7.3.1, Copyright (c) 1999-2018, by Zend Technologies

# [CLI Interpreter]用に使っているPHPのディレクトリを確認します
$ which php
/usr/local/bin/php
$ ls -la /usr/local/bin/ | grep php
# 省略
lrwxr-xr-x    1 mana  admin       27  1 20 14:09 php -> ../Cellar/php/7.3.1/bin/php
# 省略
  1. [PhpStorm] > [Preferences...] > [Languages & Frameworks] > [PHP]を選択します。
  2. [PHP language level]を使っているPHPのバージョンへ変更します。
  3. [CLI Interpreter]の[...]ボタンでダイアログを開き、使っているPHPの場所を設定します。
    • f:id:ponsuke_tarou:20190507231840p:plain
      XdebugがDebuggerとして設定されます。
PHP language levelが非活性で変更できない場合の対応方法

qiita.com

PHPUnitは、プロジェクトを作ったときに配置されています。

プロジェクトの直下にあるcomposer.jsonを確認するとデフォルトでインストールされています。
venderディレクトリにもphpunitディレクトリが配置されています。

    "require-dev": {
        "beyondcode/laravel-dump-server": "^1.0",
        "filp/whoops": "^2.0",
        "fzaninotto/faker": "^1.4",
        "mockery/mockery": "^1.0",
        "nunomaduro/collision": "^2.0",
        "phpunit/phpunit": "^7.5"
    },
$ ls -l vendor/ | grep phpunit
drwxr-xr-x@  8 mana  staff  256  4 24 23:47 phpunit

f:id:ponsuke_tarou:20190506130945p:plain
venderディレクトリにもphpunitディレクトリが配置されています。

PHPUnitの設定をします。

(Macのターミナルを使う場合)PHPUnitのパスを通します。

# .bash_profileにphpunitのパスを書いて
$ echo 'export PATH="/Path/To/vendor/phpunit/phpunit:$PATH"' >> ~/.bash_profile
# 反映して
$ source ~/.bash_profile
# 確認します。
$ phpunit --version
PHPUnit 7.5.9 by Sebastian Bergmann and contributors.
パスはbin配下ではなくphpunit配下を指定します。

以前PHPStormを使わなかった時は、PHPUnitのPathにbin配下を指定しました。

$ echo 'export PATH="/Path/To/vendor/bin/phpunit:$PATH"' >> ~/.bash_profile

PHPUnitを使えるようにする。 - Qiita

今回はうまくいきませんでした。

$ echo 'export PATH="/Path/To/vendor/bin/phpunit:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
$ phpunit --version
-bash: phpunit: command not found

シンボリックリンクが貼ってあるけどだめなのですね。

$ ls -la vendor/bin/
total 32
drwxr-xr-x@  6 mana  staff   192  5  6 14:50 .
drwxr-xr-x@ 47 mana  staff  1504  5  6 14:43 ..
-rwxr-xr-x@  1 mana  staff  6028  2 17 05:54 php-parse
lrwxr-xr-x   1 mana  staff    26  5  6 14:43 phpunit -> ../phpunit/phpunit/phpunit
-rwxr-xr-x@  1 mana  staff  4305 10 14  2018 psysh
lrwxr-xr-x   1 mana  staff    51  5  6 14:43 var-dump-server -> ../symfony/var-dumper/Resources/bin/var-dump-server

composer.jsonにautoloadの定義があることを確認します。

定義がなければ環境に合わせて定義します。

    "autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            "database/seeds",
            "database/factories"
        ]
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },

対応付けのためのクラスマップ生成を行います。

# クラスマップ生成
$ composer dump-autoload
Generating optimized autoload files> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: beyondcode/laravel-dump-server
Discovered Package: fideloper/proxy
Discovered Package: laravel/nexmo-notification-channel
Discovered Package: laravel/slack-notification-channel
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.                                                                                                           Generated optimized autoload files containing 3759 classes

# 確認します
$ cat vendor/composer/autoload_psr4.php
<?php

// autoload_psr4.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'phpDocumentor\\Reflection\\' => array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/reflection-docblock/src', $vendorDir . '/phpdocumentor/type-resolver/src'),
    'Zend\\Diactoros\\' => array($vendorDir . '/zendframework/zend-diactoros/src'),
    'XdgBaseDir\\' => array($vendorDir . '/dnoegel/php-xdg-base-dir/src'),
    'Whoops\\' => array($vendorDir . '/filp/whoops/src/Whoops'),
    'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'),
    'TijsVerkoyen\\CssToInlineStyles\\' => array($vendorDir . '/tijsverkoyen/css-to-inline-styles/src'),
    'Tests\\' => array($baseDir . '/tests'),
    'Symfony\\Polyfill\\Php72\\' => array($vendorDir . '/symfony/polyfill-php72'),
    'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
    'Symfony\\Polyfill\\Intl\\Idn\\' => array($vendorDir . '/symfony/polyfill-intl-idn'),
    'Symfony\\Polyfill\\Iconv\\' => array($vendorDir . '/symfony/polyfill-iconv'),
    'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'),
    'Symfony\\Contracts\\' => array($vendorDir . '/symfony/contracts'),
    'Symfony\\Component\\VarDumper\\' => array($vendorDir . '/symfony/var-dumper'),
    'Symfony\\Component\\Translation\\' => array($vendorDir . '/symfony/translation'),
    'Symfony\\Component\\Routing\\' => array($vendorDir . '/symfony/routing'),
    'Symfony\\Component\\Process\\' => array($vendorDir . '/symfony/process'),
    'Symfony\\Component\\HttpKernel\\' => array($vendorDir . '/symfony/http-kernel'),
    'Symfony\\Component\\HttpFoundation\\' => array($vendorDir . '/symfony/http-foundation'),
    'Symfony\\Component\\Finder\\' => array($vendorDir . '/symfony/finder'),
    'Symfony\\Component\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher'),
    'Symfony\\Component\\Debug\\' => array($vendorDir . '/symfony/debug'),
    'Symfony\\Component\\CssSelector\\' => array($vendorDir . '/symfony/css-selector'),
    'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'),
    'Ramsey\\Uuid\\' => array($vendorDir . '/ramsey/uuid/src'),
    'Psy\\' => array($vendorDir . '/psy/psysh/src'),
    'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'),
    'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
    'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
    'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
    'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'),
    'Opis\\Closure\\' => array($vendorDir . '/opis/closure/src'),
    'NunoMaduro\\Collision\\' => array($vendorDir . '/nunomaduro/collision/src'),
    'Nexmo\\' => array($vendorDir . '/nexmo/client/src'),
    'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
    'League\\Flysystem\\' => array($vendorDir . '/league/flysystem/src'),
    'Lcobucci\\JWT\\' => array($vendorDir . '/lcobucci/jwt/src'),
    'Laravel\\Tinker\\' => array($vendorDir . '/laravel/tinker/src'),
    'JakubOnderka\\PhpConsoleHighlighter\\' => array($vendorDir . '/jakub-onderka/php-console-highlighter/src'),
    'JakubOnderka\\PhpConsoleColor\\' => array($vendorDir . '/jakub-onderka/php-console-color/src'),
    'Illuminate\\Notifications\\' => array($vendorDir . '/laravel/nexmo-notification-channel/src', $vendorDir . '/laravel/slack-notification-channel/src'),
    'Illuminate\\' => array($vendorDir . '/laravel/framework/src/Illuminate'),
    'Http\\Promise\\' => array($vendorDir . '/php-http/promise/src'),
    'Http\\Client\\' => array($vendorDir . '/php-http/httplug/src'),
    'Http\\Adapter\\Guzzle6\\' => array($vendorDir . '/php-http/guzzle6-adapter/src'),
    'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'),
    'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'),
    'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'),
    'Fideloper\\Proxy\\' => array($vendorDir . '/fideloper/proxy/src'),
    'Faker\\' => array($vendorDir . '/fzaninotto/faker/src/Faker'),
    'Egulias\\EmailValidator\\' => array($vendorDir . '/egulias/email-validator/EmailValidator'),
    'Dotenv\\' => array($vendorDir . '/vlucas/phpdotenv/src'),
    'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'),
    'Doctrine\\Common\\Inflector\\' => array($vendorDir . '/doctrine/inflector/lib/Doctrine/Common/Inflector'),
    'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'),
    'Cron\\' => array($vendorDir . '/dragonmantank/cron-expression/src/Cron'),
    'BeyondCode\\DumpServer\\' => array($vendorDir . '/beyondcode/laravel-dump-server/src'),
    'App\\' => array($baseDir . '/app'),
    '' => array($vendorDir . '/nesbot/carbon/src'),
);

PHPUnitの設定ファイルとなるphpunit.xmlを確認します。

自動でできるなんて素敵ですね。

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="vendor/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false">
    <testsuites>
        <testsuite name="Unit">
            <directory suffix="Test.php">./tests/Unit</directory>
        </testsuite>

        <testsuite name="Feature">
            <directory suffix="Test.php">./tests/Feature</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist processUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">./app</directory>
        </whitelist>
    </filter>
    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="BCRYPT_ROUNDS" value="4"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="MAIL_DRIVER" value="array"/>
        <env name="QUEUE_CONNECTION" value="sync"/>
        <env name="SESSION_DRIVER" value="array"/>
    </php>
</phpunit>

PhpStormにPHPUnitを設定します。

  1. [PhpStorm] > [Preferences...] > [Languages & Frameworks] > [PHP] > [Test Frameworks]を選択します。
  2. リストに「Local」がない場合は[+]ボタンで追加します。
  3. [PHPUnit library]で「Use Composer autoloder」を選択してvenderディレクトリ配下のautoloder.phpへのパスを設定します。
  4. [Test Runner]で[Default configuration file:]にチェックを入れてphpunit.xmlへのパスを設定します。

テストコードを作る

以前作ったファイルを流用します。なのでLaravelのディレクトリ構成とかからとっても外れています。
qiita.com

テスト対象ソースのエディタ上からテストクラスを生成します。

  1. f:id:ponsuke_tarou:20190506154955p:plain
    テスト対象ソース上でコンテキストメニュー > [Go To] > [Test]を選択します。
  2. f:id:ponsuke_tarou:20190506155122p:plain
    [Create New Test...]を選択します。既にテストペアが存在する場合はそのテストソースも表示されます。
  3. f:id:ponsuke_tarou:20190506155343p:plain
    テスト対象のメソッドを[Geneate test method for:]から選択して[OK]ボタンを押下します。
  4. f:id:ponsuke_tarou:20190506155514p:plain
    テストクラスが生成されました。

継承しているクラスをPHPUnit\Framework\TestCaseへ変更します。

自動生成時はHPUnit_Framework_TestCaseとなっていますがエラーとなるため変更します。
tomomik.hatenablog.com

Macのデフォルトではバックスラッシュが円マークになる事があるので以下のサイトを見てバックスラッシュで記載します。
Macにおけるバックスラッシュ(\)の入力方法 - Qiita

<?php

namespace App;

use PHPUnit\Framework\TestCase;

class controlStdClassArrayTest extends TestCase
{
// 省略

自動生成されたメソッドへテストコードを記載して保存します。

<?php

namespace App;

use PHPUnit\Framework\TestCase;

class controlStdClassArrayTest extends TestCase
{

    public function testCreateStdClassArrayNew()
    {
        $target = new controlStdClassArray();
        $stdList = $target->createStdClassArrayNew();

        foreach ($stdList as $std) {
            $this->assertInstanceOf(\stdClass::class, $std);
        }
    }
// 省略

作ったテストコード用に設定を追加します。

  1. f:id:ponsuke_tarou:20190507233810p:plain
    上部にある[Add Configurations...]を押下します。
  2. f:id:ponsuke_tarou:20190507234037p:plain
    [+]ボタンで表示されるテンプレートから[PHPUnit]を選択します。
  3. f:id:ponsuke_tarou:20190507235136p:plain
    各項目を入力して設定を追加します。

PHPUnitでテストコードを実行します。

f:id:ponsuke_tarou:20190507235717p:plain
[▶]ボタンで実行できます。

デバックしてブレークポイントで止めることもできます。

f:id:ponsuke_tarou:20190508000342p:plain
受話器マークをクリック後に虫ボタンでデバック実行してブレークポイントで止めることができます。

はじめてAWSのEC2でUbuntuを作ってSSHとリモートデスクトップで接続した時の記録

ドキュメントどおりにやっていれば超簡単にできます。
が、無駄につまずくので記録します。

AWSのアカウントを作成します。

aws.amazon.com

住所は英語で入力します。

www.scriptlife.jp

EC2インスタンスを作成してSSH接続します。

EC2インスタンスを作成します。

参考 : 仮想マシンの起動

  1. AWSマネジメントコンソールの[EC2]からEC2 コンソールを表示します。
  2. [インスタンス]でインスタンスの一覧を表示します。
  3. [インスタンスの作成]ボタンで作成画面を表示します。
  4. [次のステップ〜]ボタンで進めながら内容を入力していきます。以下以外は規定値のままとしました。
    • 1. AMI の選択
      • Amazon マシンイメージ (AMI) : Ubuntu Server 18.04 LTS (HVM), SSD Volume Type - ami-0fc20dd1da406780b (64 ビット x86)
    • 2. インスタンスタイプの選択
      • インスタンスタイプ : 汎用t2.micro >> 後で「t2.medium」に変更しました。
    • 3. インスタンスの設定
      • 終了保護の有効化 : ON
    • 5. タグの追加
      • [キー]=「Name」、[値] = 「Ubuntu18.04」
      • [インスタンス / ボリューム] = チェックON(作ったインスタンスが後でなんだかわかるように名前を設定しました)
    • 6. セキュリティグループの設定
      • セキュリティグループの割り当て : 新しいセキュリティグループを作成する
      • タイプ : SSH
      • プロトコル : TCP
      • ポート範囲 : 22
      • ソース : 自分のパブリックIPアドレス(xxx.xxx.xxx.xxx/32)
  5. [確認と作成]ボタンで確認画面を表示して内容を確認します。
  6. [起動]ボタンで鍵の作成について選択して[インスタンスの作成]ボタンでインスタンスを作成します。
    • 作成にはちょっと時間がかかります。

f:id:ponsuke_tarou:20200225201334p:plain

SSH接続します。

  • 環境
    • 接続元 : macOS Catalina バージョン10.15.3
    • ssh : OpenSSH_7.9p1, LibreSSL 2.7.3
  1. インスタンス作成時に取得した鍵の権限を設定します。
  2. インスタンスの一覧から作成したインスタンスを選択して詳細画面を表示し、インスタンスIPv4パブリックIPを確認します。
  3. MacのターミナルなどでSSH接続します。
# ssh接続する方法 : ssh -i {作成した秘密鍵のファイルパス} {ユーザ名:AMIの種類で変わる}@{インスタンスのIPv4パブリックIP}
$ ssh -i .ssh/key.pem ubuntu@{インスタンスのIPv4パブリックIP}
The authenticity of host '{インスタンスのIPv4パブリックIP} ({インスタンスのIPv4パブリックIP})' can't be established.
ECDSA key fingerprint is SHA256:Zxxx
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '{インスタンスのIPv4パブリックIP}' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-1057-aws x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Tue Feb 25 11:15:51 UTC 2020

  System load:  0.0               Processes:           87
  Usage of /:   13.6% of 7.69GB   Users logged in:     0
  Memory usage: 14%               IP address for eth0: 172.31.17.109
  Swap usage:   0%

0 packages can be updated.
0 updates are security updates.



The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

ubuntu@ip-1xx-xx-xx-1xx:~$ 
aptコマンドでmysqlコマンドをインストールしてみました。

ponsuke-tarou.hatenablog.com

作ったUbuntu Serverにリモートデスクトップ接続できるようにします。

Ubuntu Server側を設定します。

aptの更新とユーザー作成をします。
# 1. SSHでログインします。
# 2. aptのリポジトリ一覧を更新します(-y : 問い合わせがあった場合はすべて「y」と答える)
$ sudo apt update -y
Hit:1 http://us-east-2.ec2.archive.ubuntu.com/ubuntu bionic InRelease
Hit:2 http://us-east-2.ec2.archive.ubuntu.com/ubuntu bionic-updates InRelease
Hit:3 http://us-east-2.ec2.archive.ubuntu.com/ubuntu bionic-backports InRelease
Get:4 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]     
#...省略... 
32 packages can be upgraded. Run 'apt list --upgradable' to see them.

# 3. インストール済みのパッケージを更新します。
$ sudo apt upgrade -y
Reading package lists... Done
Building dependency tree       
#...省略... 
Processing triggers for initramfs-tools (0.130ubuntu3.9) ...
update-initramfs: Generating /boot/initrd.img-4.15.0-1060-aws

# 4. リモートデスクトップ用にユーザーを作成します。
$ sudo adduser ponsuke
Adding user `ponsuke' ...
Adding new group `ponsuke' (1001) ...
Adding new user `ponsuke' (1001) with group `ponsuke' ...
Creating home directory `/home/ponsuke' ...
Copying files from `/etc/skel' ...
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
Changing the user information for ponsuke
Enter the new value, or press ENTER for the default
	Full Name []: 
	Room Number []: 
	Work Phone []: 
	Home Phone []: 
	Other []: 
Is the information correct? [Y/n] y

# 5. 作ったユーザーをsudoグループに参加させます。
$ sudo gpasswd -a ponsuke sudo
Adding user ponsuke to group sudo
デスクトップ環境をインストールします。
# 1. パッケージを検索します。
$ apt search ubuntu-desktop
Sorting... Done
Full Text Search... Done
edubuntu-desktop/bionic 15.12.9 amd64
  educational desktop for Ubuntu

kubuntu-desktop/bionic 1.370 amd64
  Kubuntu Plasma Desktop/Netbook system

lubuntu-desktop/bionic-updates 0.94.1 amd64
  Lubuntu Desktop environment

qtubuntu-desktop/bionic 0.64+17.10.20170707-0ubuntu7 amd64
  Qt plugins for Mir support on Ubuntu (desktop)

ubuntu-desktop/bionic-updates 1.417.4 amd64
  The Ubuntu desktop system

xubuntu-desktop/bionic 2.225 amd64
  Xubuntu desktop system

# 2. ubuntu-desktopをインストールします。
$ sudo apt -y install ubuntu-desktop
Reading package lists... Done
Building dependency tree     
#...省略... 
Processing triggers for systemd (237-3ubuntu10.39) ...
Processing triggers for ureadahead (0.100.0-21) ...
xrdpをインストールします。

xrdp とは
xrdp はオープンソースで開発されている Remote Desktop Protocol のサーバソフトウェアです。
フロントページ - 日本 xrdp ユーザ会

# 1. パッケージを検索します。
$ apt search xrdp
Sorting... Done
Full Text Search... Done
xorgxrdp/bionic 0.9.5-2 amd64
  Remote Desktop Protocol (RDP) modules for X.org

xorgxrdp-hwe-18.04/bionic-updates 0.9.5-2~18.04.1 amd64
  Remote Desktop Protocol (RDP) modules for X.org

xrdp/bionic 0.9.5-2 amd64
  Remote Desktop Protocol (RDP) server

xrdp-pulseaudio-installer/bionic 0.9.5-2 amd64
  Remote Desktop Protocol (RDP) server - PulseAudio module installer

# 2. xrdpをインストールします。
$ sudo apt install -y xrdp
Reading package lists... Done
Building dependency tree       
#...省略... 
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
Processing triggers for ureadahead (0.100.0-21) ...

# 3. バージョンを確認します。
$ xrdp -v

xrdp: A Remote Desktop Protocol server.
Copyright (C) Jay Sorg 2004-2014
See http://www.xrdp.org for more information.
Version 0.9.5

# 4. new_cursorsを無効化します。
$ ls -la /etc/xrdp/ | grep xrdp
-rw-------   1 xrdp root  2939 Mar  4 11:41 rsakeys.ini
-rw-r--r--   1 root root  4916 Feb 16  2018 xrdp.ini
-rw-r--r--   1 root root  3361 Feb 16  2018 xrdp_keyboard.ini

$ sudo sed -e 's/^new_cursors=true/new_cursors=false/g' -i /etc/xrdp/xrdp.ini

# 5. xrdpサービスを再起動します。
$ sudo systemctl restart xrdp

# 6. xrdpサービスを有効化します。
$ sudo systemctl enable xrdp.service
Synchronizing state of xrdp.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable xrdp

$ sudo systemctl enable xrdp-sesman.service

$ systemctl list-unit-files -t service | grep xrdp
xrdp-sesman.service                            enabled  
xrdp.service                                   enabled 

# 7. 作成したユーザーに切り替えます。
$ su ponsuke
Password: 
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

$ cd ~
$ pwd
/home/ponsuke

# 8. 環境変数を設定します。
$ DESKTOP=/usr/share/ubuntu:/usr/local/share:/usr/share:/var/lib/snapd/desktop

# 9. .xsessionファイルを作成します。
$ cat <<EOF > ~/.xsessionrc
> export GNOME_SHELL_SESSION_MODE=ubuntu
> export XDG_CURRENT_DESKTOP=ubuntu:GNOME
> export XDG_DATA_DIRS=${DESKTOP}
> export XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
> EOF
Authentication Requiredダイアログを回避できるようにします。

Polkit(旧名PolicyKit)とは、Unixオペレーティングシステムで、システム全体の権限を制御するためのアプリケーション開発ツールキットである。このライブラリによって、特権を持たないプロセスが、特権を持つプロセスと通信することができるようになる。
Polkit - Wikipedia

# 1. 設定します。
$ cat <<EOF | sudo tee /etc/polkit-1/localauthority/50-local.d/xrdp-color-manager.pkla
> [Netowrkmanager]
> Identity=unix-user:*
> Action=org.freedesktop.color-manager.create-device
> ResultAny=no
> ResultInactive=no
> ResultActive=yes
> EOF
[sudo] password for ponsuke: 
[Netowrkmanager]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device
ResultAny=no
ResultInactive=no
ResultActive=yes

# 2. サービスを再起動します。
$ sudo systemctl restart polkit

セキュリティグループに設定を追加します。

  1. AWSマネジメントコンソールの[EC2]からEC2 コンソールを表示します。
  2. [インスタンス]でインスタンスの一覧を表示します。
  3. インスタンスの一覧から作成したインスタンスを選択して詳細画面を表示し、セキュリティグループ名のリンクでセキュリティグループの画面表示します。
  4. [インバウンド]タブの[編集]ボタンでダイアログを表示します。
  5. [ルールの追加]ボタンで行を追加して以下を設定します。
    • タイプ : RDP
    • ルール : TCP
    • ポート : 3389
    • ソース : 自分のパブリックIPアドレス(xxx.xxx.xxx.xxx/32)
  6. [保存]ボタンで保存してダイアログを閉じます。

Mac側を設定します。

リモートデスクトップアプリをインストールします。
  1. Apple StoreからMicrosoft Remote Desktop 10をインストールします。
Ubuntuリモートデスクトップ接続します。
  1. Microsoft Remote Desktop 10を起動して[Add PC]ボタンで設定画面を開きます。
  2. インスタンスIPv4パブリックIP」と「Ubuntuで作成したユーザー」を設定して[Add]ボタンで設定を追加します。
  3. 追加された設定をダブルクリックします。
  4. 初めての場合はダイアログが表示されるので[Connect]ボタンで進めます。
    • f:id:ponsuke_tarou:20200304223132p:plain
  5. Ubuntuに接続できました。

f:id:ponsuke_tarou:20200304223310p:plain

失敗したこと

Amazon Machine Image (AMI) で何を選択したかによってSSH接続する時のユーザ名が異なります。

ドキュメントの例では、

ですが初めて作ったインスタンスでは

でした。
これに気がつくのにかなり時間がかかりました。
xn--o9j8h1c9hb5756dt0ua226amc1a.com

インスタンスタイプが「t2.micro」では小さすぎた。

インスタンスタイプを「t2.micro」で作成しました。
SSH接続して作業するには問題なかったのですが、
デスクトップ環境をインストールしてリモートデスクトップ接続したところ
画面は表示されるものの全然動かない!
なので「t2.medium」に変更しました。
無料枠から外れてしまうのですが動かないよりはいいかと・・・。

f:id:ponsuke_tarou:20190501212514j:plain
乙女の滝

サイドチャネル攻撃とテンペスト攻撃の違い

前回の勉強内容

ponsuke-tarou.hatenablog.com

勉強のきっかけになった問題

テンペスト攻撃を説明したものはどれか。

  1. 故意に暗号化演算を誤動作させて正しい処理結果との差異を解析する。
  2. 処理時間の差異を計測して解析する。
  3. 処理中に機器から放射される電磁波を観測して解析する。
  4. チップ内の信号線などに探針を直接当て,処理中のデータを観測して解析する。

平成30年春期問13 テンペスト攻撃を説明したもの|情報処理安全確保支援士.com

サイドチャネル攻撃とテンペスト攻撃は、暗号装置を解析し暗号を盗む方法に使用されます。

サイドチャネル攻撃は、動いている装置から出る電流や電磁波・振動を計測して暗号解析の手がかりを得る攻撃です。

  • 英語 : Side Channel Attack
  • 外部と隔離された機器でも攻撃される可能性があります。

https://www.keirex.com/img/CypherAttack_j.jpg
ケイレックス・テクノロジー >> システムソリューション技術 >> 暗号セキュリティーの脅威と対策

https://www.togawa.cs.waseda.ac.jp/img/research/secu-sidechannel-attack.png
研究紹介 | 早稲田大学 戸川研究室

http://www.ec.okayama-u.ac.jp/~sws/nogami/Works/pic5.png
SCOPE:IoT時代における機器認証を安全に実現するセキュリティ計算チップの開発

テンペスト攻撃は、サイドチャネル攻撃の種類の1つです。

テンペスト攻撃は、機器やその周辺機器から出力される微弱な電磁波を計測して元情報を復元しようとします。

ディスプレイから発生される電磁波の放射レベルは強く、復号も容易になっています。
https://cybersecurity-jp.com/wp000/wp-content/uploads/2018/10/img_27685_1.png
テンペスト技術とは?遠隔で不正に情報を傍受する技術への対策について

漏洩電磁波から画面表示を“再現”したパソコン・モニター
https://tech.nikkeibp.co.jp/it/free/ITPro/NEWS/20041124/153009/1.jpg
「10万円の受信機でパソコンからの漏洩電磁波を“盗聴”できる」――ISTがデモ | 日経 xTECH(クロステック)

サイドチャネル攻撃には、他にも種類があります。

http://tooljp.com/windows/chigai/img/sidechannel-attack-valiation.png
サイドチャネル攻撃とテンペスト攻撃の違い

https://www.uec.ac.jp/research/information/column/22/images/pct_03.jpg
ユニーク&エキサイティング研究探訪 No.22│電気通信大学

電力解析攻撃は、機器の電力を計測します。

  • 英語 : Simple Powering Analysis
  • 別名 : SPA

https://www.netagent.co.jp/study/blog/img/20170914/20170914_overview.png
RHme3 WriteUp 第2問 - セキュリティごった煮ブログ|ネットエージェント

故障利用攻撃は、故意に暗号化演算を誤動作させて正しい処理結果との差異を解析します。

  • 別名 : フォールト解析攻撃

https://image.itmedia.co.jp/enterprise/articles/0806/05/fta.jpg
確率論を究める――交通事故とシステムダウンの関係 (2/3) - ITmedia エンタープライズ

タイミング攻撃は、処理時間の差異を計測して解析します。

タイミング攻撃では、攻撃対象の処理の実装を分析して応答時間が変化する要因を見つけることで、入力とその応答時間から隠されたデータ(パスワードなど)の特定を試みます。
https://corgi-lab.com/blog/wp-content/uploads/2018/01/time-attack_result.png
corgi-lab.com

プローブ解析は、チップ内の信号線などに探針を直接当て,処理中のデータを観測する破壊型解析です。

  • 別名 : プロ―ビング

他にもCache攻撃、スキャンベース攻撃等色々あります。

次回の勉強内容

ponsuke-tarou.hatenablog.com

2進数の問題を見ると頭が混乱します。

前回の勉強内容

ponsuke-tarou.hatenablog.com

2進数の表現の問題

aを正の整数とし,b=aの2乗 とする。aを2進数で表現するとnビットであるとき,bを2進数で表現すると高々何ビットになるか。

  1. n+1
  2. 2n
  3. nの2乗
  4. 2のn乗

平成25年春期問1 2進数の表現|応用情報技術者試験.com

f:id:ponsuke_tarou:20190416193255p:plain
あの日の思い出

「高々」とは、「最大」のことです。

  • 読み方 : たかだか
  • bを2進数で表現すると高々何ビット = bを2進数で表現すると最大何ビット

数学において、高々(たかだか)という表現は、英語の at most に対応した厳密な意味を持つ用語である。
「xは高々2である」という表現は「xは多くとも2である」事、すなわち「x≦2」を意味する。
高々 (数学) - Wikipedia

超地道な解き方:「aを2進数で表現するとnビット」のnに値を入れて考えてみる。

  • aが2bitだと、bの最大は1001で4bitになる
    1. aの最大 = (2進数)11 = (10進数)2 + 1 = (10進数)3
    2. bの最大 = aの2乗 = (10進数)9 = (10進数)8 + 0 + 0 + 1 = (2進数)1001 = 4bit
  • aが3bitだと、bの最大は110001で6bitになる
    1. aの最大 = (2進数)111 = (10進数)4 + 2 + 1 = (10進数)7
    2. bの最大 = aの2乗 = (10進数)49 = (10進数)32 + 16 + 0 + 0 + 0 + 1 = (2進数)110001 = 6bit
  • aが4bitだと、bの最大は11100001で8bitになる
    1. aの最大 = (2進数)1111 = (10進数)8 + 4 + 2 + 1 = (10進数)15
    2. bの最大 = aの2乗 = (10進数)225 = (10進数)128 + 64 + 32 + 0 + 0 + 0 + 0 + 1 = (2進数)11100001 = 8bit
  • aが5bitだと、bの最大は1111000001で10bitになる
    1. aの最大 = (2進数)11111 = (10進数)16 + 8 + 4 + 2 + 1 = (10進数)31
    2. bの最大 = aの2乗 = (10進数)961 = (10進数)512 + 256 + 128 + 64 + 0 + 0 + 0 + 0 + 0 + 1 = (2進数)1111000001 = 10bit
なんかaを1bit増やすとbのbitが2bit(真ん中の10分)増える・・・だから「2n」ですね。

Webツールを使ってちょっと大きめの値で確認してみる

サイトで紹介されている解き方

nけたの正の整数aと、mけたの正の整数bを乗算(a×b)したときのけた数はそれぞれの数字のけた数の和(n+m)を超えることはありません。
この性質は10進数に限ったことではなく、2進数、16進数などでも同じです。また、2進数では必ずけた数の和になります。
問題では2進数nビット(けた)の正の整数aを二乗したときのけた数ですから、
 (n+n)=2n
平成25年 春期 応用情報技術者 午前 問1

 2進数でnビットの最大値は、1111...112ですね(1がn個)。
 これを式変形します。
  1111...112(※1がn個) = 1000...002(※(n+1)桁。1の後ろに0がn個) - 12
 これを、10進数に直すと、
  2n - 1
 となります。
 ※注:簡単に導出しているように見えますが、実際には簡単な例(n=2のときとか)で確認しています。

 そうしたら、2乗しましょう。
  (2n - 1)2
    = 22n - 2 * 2n + 1

 これを2進数に直すと、
    = 1000...0002(※(2n+1)桁。1の後ろに0が2n個)
     - 100..002(※(n+1)桁。1の後ろに0がn個)
     + 12
となります。
計算後は、(2n+1)桁よりも小さな値になりますから、2n桁になります。
応用情報H25春 問1の解説 - だるまのエクセルVBA

ビット演算の応用問題

0以上255以下の整数nに対して、https://www.ap-siken.com/kakomon/22_haru/img/01.gifと定義する。next(n)と恒等的に等しい式はどれか。ここで,x AND y 及び x OR y は,それぞれxとyを2進数表現にして,けたごとの論理積及び論理和をとったものとする。

  1. (n+1) AND 255
  2. (n+1) AND 256
  3. (n+1) OR 255
  4. (n+1) OR 256

平成22年春期問1 ビット演算の応用|応用情報技術者試験.com

「恒等的に等しい」とは「どのような場合でも等しい」ということらしい

detail.chiebukuro.yahoo.co.jp
oshiete.goo.ne.jp

超地道な解き方:2進数にして論理演算してみます。

  1. nの最大値である255は2進数で書くと1111111となり、nは7bitで書ける範囲ということになります。
  2. n < 255の場合は、next(n) = n + 1 になります。
  3. n = 255の場合は、next(255) = 0になります。
  4. 以下表のようになる論理演算を選ぶわけです。
(10進数)n (10進数)next(n) (2進数)n (2進数)next(n)
255 0 1111111 0000000
254 255 1111110 1111111
2 3 0000010 0000011
1 2 0000001 0000010
0 1 0000000 0000001
  1. 回答群から推理して (n + 1) と (255 か 256) の組み合わせの論理演算になるはずです。
  2. 論理演算下後に (n + 1) になるはずです。
  3. nを7として8bitの2進数表記(256を表すため)で試してみます。

(n+1) AND 255

10進数 2進数
n+1=8 0000100
255 011111111
AND 0000100

(n+1) AND 256

10進数 2進数
n+1=8 0000100
256 10000000
AND 0000000

(n+1) OR 255

10進数 2進数
n+1=8 0000100
255 011111111
OR 011111111

(n+1) OR 256

10進数 2進数
n+1=8 0000100
256 10000000
OR 1000100
  • 答えは「 ( n + 1) AND 255 」です。

サイトで紹介されている解き方

定義式をみると、0なら1、1なら2と1ずつ足していって255だったら0にもどるという。いわゆる256進カウンタであることがわかります。これを2進数で考えます。255とは11111111です。ここで1を加えると0になるので100000000が0になる処理を考えると選択肢アが正解だとわかります。
平成18年度春期・ソフ開過去問・解説

ア 『(n +1)AND 255』は、255を2進数で表すと“1111 1111”なので、n =0のとき、next(n )=1になり、n =255のとき、next(n )=0になり、定義と一致する。
イ 『(n +1)AND 256』は、256を2進数で表すと“1 0000 0000”なので、n =0のとき、next(n )=0になり、定義と一致しない。
ウ 『(n +1)OR 255』は、255を2進数で表すと“1111 1111”なので、n =0のとき、next(n )=255になり、定義と一致しない。
エ 『(n +1)OR 256』は、256を2進数で表すと“1 0000 0000”なので、n =0のとき、next(n )=257になり、定義と一致しない。
平成18年 春期 ソフトウェア開発技術者 午前 問3

n が 255 の場合・・・

255+1=256

256と255は2進で
0001 0000 0000
0000 1111 1111

これらの AND は
0000 0000 0000
で、ゼロになります。

255未満で、例えば n が 254 については・・・

254+1=255

255と255は2進で
0000 1111 1111
0000 1111 1111

これらの AND は
0000 1111 1111
で、255 。n+1 になりました。
恒等式 - 合格☆情報処理技術者試験

f:id:ponsuke_tarou:20190417000727j:plain
思い出の一枚

次回の勉強内容

勉強中・・・