設計書レビューの種類を理解しよう
- 前回の勉強内容
- レビューの種類についての過去問
- インスペクションは、公式性の高いプロセスやルール・役割分担が決まっているレビュー技法です。
- ウォークスルーは、作成者がレビュー対象を説明しレビュー対象者にコメントを求める形式で進行するレビュー技法です。
- デザインレビューは、各設計工程において次の工程に向けて成果物を複数人でチェックするレビュー技法です。
- 次回の勉強内容
前回の勉強内容
レビューの種類についての過去問
作業成果物の作成者以外の参加者がモデレータとして主導すること,及び公式な記録,分析を行うことが特徴のレビュー技法はどれか。
ア. インスペクション > 正解
イ. パスアラウンド
ウ. ウォークスルー
エ. ペアプログラミング
平成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用語辞典バイナリ
メリット
- 開発者本人が気づきづらい問題点を洗い出すことができる
- プログラムなどを実際に動作させてみるテストでは検知できない潜在的な不具合を見つけることができる場合がある
- コーディングルールに対する違反や極めて限定された条件でしか発生しない誤動作に繋がる問題点が検出される
役割
- モデレータ(インスペクションリーダ) : 進行を主導し、インスペクション作業全体を統括する
- モデレータにより、参加者の選定や、個々の役割の規定などが行われる
- マネージャ : 実施のスケジュールを立て、レビューの目的が適切かどうかを判断する
- レビューア(チェッカー/インスペクタ) : ある特定の技術やバックグラウンドを持ち、レビューを行う
- 専門的ノウハウのある人
- いろいろな分野や、レビュープロセスの役割を代表する人
- 例えば・・・
- プロジェクトや開発対象に関して一般的な知識しか持たないが、インスペクションの豊富なノウハウを持つ人
- 法務やセキュリティーの専門知識をもっている他部門
- 記録係 : レビューで取り上げた全ての課題・問題点・未解決事項を記録する
- 他にも進行役等が設けられることもある
ルール
- 実施計画立案では、実施タイミングや対象だけではなく「結果をどう使うか」まで決める
- 例) 結果は対象ドキュメントの品質向上に使う
- 例) 実施結果を工程移行の判定に使う
- 例) プロジェクト完了後のプロセス改善のための会議のインプットに使う
- 検出した欠陥をログに保管し、修正が行われたことを追跡調査する
- インプット : ドキュメント
- 企画書、プリセールスの提案書、プロジェクト計画書、要件定義書、各種設計書、ソースコード、バグ票、テスト計画書などあらゆる文書
- アウトプット : 対象ドキュメントに含まれていると指摘された欠陥のリスト
ウォークスルーは、作成者がレビュー対象を説明しレビュー対象者にコメントを求める形式で進行するレビュー技法です。
- 英語 : walkthrough
インスペクションに準じる公式なソフトウェアレビューに位置付けられることが多い。
ウォークスルーは、レビューを希望する作成者が数人のレビューアを招集、成果物の内容を順に説明する形式をとる。それに対してレビューアは、説明を通じて対象を追跡・検証し、その誤りや矛盾、抜け漏れなどを指摘するというのが大まかな流れである。
ウォークスルー(うぉーくするー) - ITmedia エンタープライズ
ドキュメントの著者による段階的なドキュメント内容の説明。情報を集めて、内容の共通理解を確立するために行なう。
ソフトウェアテスト標準用語集
目的 : 設計上の誤りを早期に発見すること と 設計の共通理解
設計上の誤りを検出するために作成者と複数の関係者が設計書をレビューします。
要求段階や設計段階の初期には,エンドユーザ (利用者) にも参加してもらうこともあります。
また、関係者間での使用上の共通理解を得ることができる。
メリット
- ミーティングで指摘や意見が得られる
- ウォークスルーの開催を前提にすれば、作成者は成果物を作る段階からそれが読まれること、他人に説明することを意識する
- 作成者はミーティングで自身の考えを論理を説明する作業を通じて、自分自身で問題点や矛盾点に気付く場合もある
- 解決策は、会議終了後に成果物作成者が自分で考えるので、会議の時間を短縮できる
ルール
- 作成者が主体となって開催する
- 指摘された内容は文書化するが、欠陥を修正するか否かについては作成者の責任として、ミーティングでは取り扱わない
- 作成者はミーティングの終わりに指摘項目を読み上げ、追加の問題点やコメントの有無を確認する。
デザインレビューは、各設計工程において次の工程に向けて成果物を複数人でチェックするレビュー技法です。
- 英語 : DesignReview
- 略称 : DR
デザインレビューとは、開発における成果物を、複数の人にチェックしてもらう機会のことで、JIS(日本工業規格)やISO(国際標準化機構)9000シリーズにおいて定義されている設計審査のことである。
デザインレビューとは何? Weblio辞書
上司や管理者が参加すると設計者への評価へつながるため、出席すべきではないとされている。
情報処理教科書 応用情報技術者 テキスト&問題集 2018年版(日高哲郎)|翔泳社の本
目的 : 設計の工程ごとに設計品質の評価と各工程が終了したかどうかを判断する
レビュー対象が内部設計書であれば、外部設計書との一貫性の検証と要件定義の内容を満たしていることの確認を行う。
各設計工程ごとに成果物の問題点の早期発見を行うことで、後工程の作業をスムースにしてシステムの最終的な品質を高めることにつなげる。
メリット
各フェーズにおける仕様書や設計書、プログラムなどの成果物を第三者の目(営業、経理、購買、生産管理、品質保証など)でレビューすることにより、開発者の視点では漏れてしまう内容を精査して、品質を確保することを目的としている。<省略>
デザインレビューの参加者が、成果物について指摘し合うことにより、現在起きている問題やプロジェクトの進捗状況などの情報を共有することができるため、設計審査のみならず情報共有手段としても有効である。
デザインレビューとは何? Weblio辞書
次回の勉強内容
寝るまでにざっくり知っとくRDSって何?
BOSSから「RDSへ切り替えてみてもらえませんか?」と言われました。
懇親会でほろ酔いのまま「明日、やってみます!」と答えました。
はい、めちゃめちゃ知ったかしました、RDSがなんだかわかりません。
寝るまでにざっくり確認してみました。
RDSは、AWSのサービスでリレーショナルデータベースを管理できます。
- 正式 : Amazon Relational Database Service
Amazon RDS はマネージド型リレーショナルデータベースで、データベースエンジンを Amazon Aurora、MySQL、MariaDB、Oracle、Microsoft SQL Server、PostgreSQL といった一般的な 6 種類のエンジンから選択できます。
特徴 - Amazon RDS | AWS
リレーショナルデータベースを管理するソフトウェアをまとめてRDBMSといいます。
- 正式 : Relational DataBase Management System
- 日本語 : 関係データベース管理システム
RDBMSとはリレーショナルデータベースを作る・使うためのソフトウェアであり、以下のような特徴があります。
・データの整合性を維持しやすい。
・簡単にデータを参照・更新できるSQLという専門用語がある。
・信頼性のある更新処理を実現するトランザクション機能がある。
・障害発生時でも格納したデータが容易に失われない。
・セキュリティ・チューニングなど多くの周辺機能がある。
データベース初心者でも分かるRDBMSの基本~JPOUG Oracle Database入学式レポート | geechs magazine
RDSは、クラウド上のRDBMSです。
自分たちでせっせとサーバを用意してラックと置き場所を用意して・・・とか不要です。
AWSのEC2インスタンスでDBサーバ作ってインストールやら管理を頑張って・・・をRDSというDB専門サービスで楽にできちゃうみたいです。
チュートリアル: ウェブサーバーと Amazon RDS データベースの作成 - Amazon Relational Database Service
どうやれば起動するんだろう・・・・
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 StudioのAWS Explorerを使う
今回、Visual Studioを使っていないので記録程度。
docs.aws.amazon.com
接続情報ってどこにあるんだろう・・・
起動できてもアプリやDBクライアントツールに設定する情報がわからないと困ります。
コンソールでエンドポイントとポート番号が確認できます。
Oracle データベースエンジンを実行している DB インスタンスへの接続 - Amazon Relational Database Service
最後に
明日、なんとか使えそうなぐらいには調べました。
本当に使えるようにはRDSはおろかAWS、RDBの知識もめちゃめちゃ足りません。
少しずつこのページを更新していきたいものです。
次の日
調べたとおりに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% の損失)、
クライアントツールで接続してみます。
iptablesはファイアウォールとパケット転送ができる
- 「iptablesでポート転送の設定をして」と言われました。
- iptablesは、Linuxに搭載されていてパケットのルールを設定できます。
- iptablesは、ファイアウォールとして使用するパケットフィルタリング機能です。
- iptablesは、ポートフォワードとして使用するパケット転送機能もあります。
iptablesは、Linuxに搭載されていてパケットのルールを設定できます。
設定はコマンドと設定ファイルを書く方法があります。
コマンドで設定する時
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というルートを通って処理されます。
Chainの種類
名前 | 設定できるテーブル | 説明 |
---|---|---|
INPUT | filter, magnle | 入ってくるパケットについてのチェイン |
OUTPUT | filter, nat, magnle | 出てゆくパケットについてのチェイン |
FORWARD | filter | パケットを転送についてのチェイン |
PREROUTING | nat, magnle | 受信時にアドレスを変換するチェイン |
POSTROUTING | nat | 送信時にアドレスを変換するチェイン |
iptablesは、ファイアウォールとして使用するパケットフィルタリング機能です。
ファイアウォールiptablesを簡単解説~初心者でもよくわかる!VPSによるWebサーバー運用講座(4) | さくらのナレッジ
パケットフィルタリング型のファイアーウォールです。
https://www.cyber-attack.net/cyber-security-dictionary/CyberAttack370.html
設定ファイルでは「* filter」に書きます。
*filter ここに設定を書く COMMIT
iptablesで見かけたNATって何?
- iptablesでNATテーブルってあるけどこれ何?
- NATはプライベートIPアドレスとパブリックIPアドレスを組合せで変換してくれます。
- NATは、プライベートIPとパブリックIPを1対1の組合せで変換します。
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
NATは、プライベートIPとパブリックIPを1対1の組合せで変換します。
そこで、IPマスカレード。
- 別名 : NAPT
- 正式名称 : Network Address Port Translation
複数のプライベートIPを1つのパブリックIPに組合せられます。
なぜなら、IPアドレス+ポート番号で組合せるからです。
MCU入門 第9回 NAT/FW トラバーサル③– NAT/FW トラバーサルの仕組み “NATとは” – MCU製品情報サイト VC.info
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という単語をよく見かけました。
- GMPとは、日本における「医薬品及び医薬部外品の製造管理及び品質管理の基準に関する省令」のことです。
- 誰が作業しても、いつ作業しても、必ず同じ品質・高い品質の製品をつくるために、医薬品製造業者が守るべきルールです。
- 目的を達成するためにやること
- 国や会社によってばらつきがあります。
コンピュータ化システムバリデーションを勉強するとGMPという単語をよく見かけました。
GMPとは、日本における「医薬品及び医薬部外品の製造管理及び品質管理の基準に関する省令」のことです。
- 英語 : Good Manufacturing Practice
- 日本語 : 適正製造規範
ざっくりいうと「安心して製品を使えるようにやらなければならないこと」です。
GMPは、医療分野以外にも食品などの製造業でも使われます。
日本の製薬・医療業界では「医薬品及び医薬部外品の製造管理及び品質管理の基準に関する省令」を指すことが多いです。
この省令は、GMP省令とも言います。
「医薬品及び医薬部外品の製造管理及び品質管理の基準に関する省令」は薬事法の14条に基づいています。
14条では「医薬品等の製造販売の承認」に始まり承認の基準や審査について記載されています。
GMPは、医薬品製造業における製造管理と品質管理の基準です。
健康食品や化粧品にも適用される基準です。
省令を読んでもよくわかりません。
書いてある文字列が難しくてよくわからないので、GMPを説明しているサイトと合わせて学びます。
誰が作業しても、いつ作業しても、必ず同じ品質・高い品質の製品をつくるために、医薬品製造業者が守るべきルールです。
目的は、大きく3つあります。
人による間違いを最小限にする。
医薬品が汚染されたり、品質が低下するのを防ぐ
高い品質を保つ仕組みをつくる
目的を達成するためにやること
(ハード)薬を作る製造所の環境や設備
GMP省令ではこんな感じで書いてあります。
(構造設備)
第九条 製品の製造所の構造設備は、次に定めるところに適合するものでなければならない。
一 手順書等に基づき、その用途に応じ適切に清掃及び保守が行われ、必要に応じ滅菌され、また、その記録が作成され、保管されていること。
二 製品等により有毒ガスを取り扱う場合においては、その処理に要する設備を有すること。
三 作業所のうち作業室は、製品の種類、剤型及び製造工程に応じ、じんあい又は微生物による汚染を防止するのに必要な構造及び設備を有していること。ただし、製造設備等の有する機能によりこれと同程度の効果を得られる場合においては、この限りでない。
四 作業所のうち、原料の秤量作業、製品の調製作業、充てん作業又は閉そく作業を行う作業室は、当該作業室の職員以外の者の通路とならないように造られていること。ただし、当該作業室の職員以外の者による製品への汚染のおそれがない場合においては、この限りでない。
五 飛散しやすく、微量で過敏症反応を示す製品等又は交 叉さ 汚染することにより他の製品に重大な影響を及ぼすおそれのある製品等を製造する場合においては、当該製品等の関連する作業室を専用とし、かつ、空気処理システムを別系統にしていること。
六 製品の製造に必要な質及び量の水(設備及び器具並びに容器の洗浄水を含む。)を供給する設備を有すること。
・医薬品及び医薬部外品の製造管理及び品質管理の基準に関する省令(◆平成16年12月24日厚生労働省令第179号)
間違いを防ぐことができること
フェールセーフ/フェールプルーフに似ています。
医療系のシステム開発では、設計段階から「ユーザ操作に間違いがあったら?」の目線が必要になりますね。
https://resilient-medical.com/human-error/fail-safe-fool-proof
衛生的であること
(ソフト)人によるルールの運用
ルールを決めてそれを書類に残すこと
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アプリケーションサーバです。
多階層型Javaアプリケーションを実現する統合プラットフォーム Oracle WebLogic Server【日本ユニシス】
買収を経てOracle社が作っています。
JPAって何?
JPAは、リレーショナルデータベースを使う時用のJavaフレームワークの仕様の定義です。
- 英語 : Java Persistence API
6.3. データベースアクセス(JPA編) — TERASOLUNA Server Framework for Java (5.x) Development Guideline 5.5.1.RELEASE documentation
Java EEだけではなくJava SEでも使えます。
JPAはJava EEの「Enterprise Application Technologies」に含まれる技術仕様ですが、Servlet/JSPやEJBなどと異なり、コンテナ・ベースのアーキテクチャを採用していないためJava SEでも利用可能です。
JPAの基礎1 - Qiita
データベースとJavaを関連付けてくれます。
初めてのJPA--シンプルで使いやすい、Java EEのデータ永続化機能の基本を学ぶ - builder by ZDNet Japan
JPAは以下3つの要素から構成されています。
Entityクラスは、データベースにあるテーブルを表すJavaのクラスです。
データベースにある1つのテーブルの1レコードを表すクラスです。
このクラスのインスタンスに
データを格納してテーブルを更新したり、
テーブルから取得したデータを格納して使います。
EntityManagerは、Entityのライフサイクルを管理するためのAPIを提供するインタフェースです。
初めてのJPA--シンプルで使いやすい、Java EEのデータ永続化機能の基本を学ぶ - builder by ZDNet Japan
JPAの実装
EclipseLink
Hibernate ORM : JPAの仕様作成にHibernateプロジェクトの創始者がいたため、JPAはHibernateの影響を受け継いでいます。
Apache Open JPA
アプリケーションサーバとJava EE
アプリケーションサーバ
- 英語 : Application Server
ビジネスロジックなどを実装したアプリケーションソフトウェアを実行することを専門とするコンピュータネットワーク上のサーバコンピュータ、もしくはそのようなコンピュータ上でのアプリケーションの実行を管理補助するミドルウェアのこと。
ウェブアプリケーションサーバは、ウェブクライアントからのHTTPのレスポンス要求を処理するWebサーバとバックエンドのデータベース中核層への橋渡しを担い、データの加工などの処理を行う。
プログラムの実行環境やデータベースへの接続機能、複数の処理を連結するトランザクション管理機能などを持ち、業務の処理の流れを制御するビジネスロジックを実装しているのがアプリケーションサーバである。
旧来の、クライアントやバックエンド側にビジネスロジックを実装する方式(2階層システム)に比べ、システムの変更や更新、増強などが容易で、柔軟性が高い。
アプリケーションサーバのいろいろ
Java EE アプリケーションサーバは、「Java EEに準拠したアプリケーションサーバ」のこと
たとえば・・・
WebLogic*1、JBoss、WebSphere、Glassfish、Cosminexus、Geronimo、iPlanet、Oracle 9iAS
.NETフレームワークに準じたアプリケーションサーバ
たとえば・・・
Internet Information Services (IIS) 、Base4アプリケーションサーバ、Zope
その他のアプリケーションサーバ
Java EE以外の言語セット・フレームワークを使用し、ビジネスロジックを実装し得るアプリケーションサーバ
Java EE は、Javaでシステム開発するための標準仕様です。
- 正式 : Java Platform, Enterprise Edition
Javaの拡張機能セット
コミュニティ主導のエンタープライズ・ソフトウェアの標準です。Java EEはJava Community Processを使って開発されており、業界の専門家、営利団体とオープンソース団体、Javaユーザー・グループ、さらに数え切れないほど多くの個人が貢献しています。
技術リソース | Oracle 日本
JavaでWebアプリケーションを中心とした業務アプリケーションを構築するために選定された数々の仕様と、その実装
Java EE 6 環境の構築 (1/4):CodeZine(コードジン)
サーバー中心の複数層アプリケーションの開発、デプロイおよび管理にかかるコストと複雑さを大幅に削減する組織的なテクノロジのセットを含み、広く使用されているプラットフォーム(標準仕様)です。Java EEはJava SEプラットフォーム上にビルドされ、移植可能、堅牢、スケーラブル、信頼性、およびセキュリティに優れたサーバー側アプリケーションを開発および実行するための一連の API を提供します。
Java EEおよびJava Webの学習
規定されている機能
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)
- Webアプリケーションのインターフェイスを構築するためのフレームワーク
- ユーザーインターフェースを簡単に作ることを主眼においたフレームワーク
- JSR-127
JSFはコンポーネントベースのフレームワークであり、Strutsなどのアクションベースとは異なります。
【JavaEE】今からでも間にあうJSF入門
Java Naming and Directory Interface ( JNDI)
ほかにもいろいろあります。
ストアドプロシージャって何?
ストアドプロシージャは、データベースへの複数処理を1つのプログラムにまとめたものです。
- 英語 : stored procedure
- stored : サーバー上に保管(ストア)されるという意味
プログラムは専用言語で書きます。
規格またはRMDB | 言語 |
---|---|
(標準SQLの規格)SQL99 | SQL/PSM Persistent Stored Module |
Oracle Database | PL/SQL Procedural Language Extensions to SQL |
Microsoft SQL Server | Transact-SQL T-SQL |
ストアドプロシージャの友達にストアドファンクションがいます。
ストアドプロシージャは、戻り値がありません。
戻り値があるのは、ストアドファンクションです。
ストアドプロシージャ (stored procedure)とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
ストアドプロシージャやストアドファンクションを使うと複数処理を1回でできるので実行速度が早くなります。
Oracle ストアド・プロシージャとストアド・ファンクションの基本と違い|Everything you do is practice
コンピュータ化システムバリデーションってなんだろう?
- ピュータ化システムバリデーションは、製薬業界や医療機器業界で使われる品質保証のことです。
- 目的は、システムが意図したとおりに動作することを保証することです。
- そんなCSVにはガイドラインがあります。
- 製薬や医療業界のシステム開発で使われる工程の略称
- 歴史
ピュータ化システムバリデーションは、製薬業界や医療機器業界で使われる品質保証のことです。
- 英語 : Computerized System Validation
- 略称 : CSV
一般工業製品の品質保証となぜ分けているのか?
一般工業製品の場合は「価格」と「品質」が比例します。
安ければある程度の不良は許容されます。
医薬品は、生命にかかわるため不良は許容されないから
医薬品の場合は「価格」にかかわらず「不良」は許容されません。
そのため、世界的にCSVへの取組が求められています。
日本医療機能評価機構のサイトでシステムに関わる医療事故を見ることができます。
日本医療機能評価機構のサイトから「分析テーマ」で「その他」を選ぶと見られます。
www.med-safe.jp
GMP省令が基礎となっています。
GMPの対象のうち製薬や医療に関わるコンピュータ化システムが対象になります。
医療機器に組み込まれるシステムだけではなく、文書を管理するシステムまで
医療に関わる広範囲のシステムが対象になります。
2. 適用の範囲
このガイドラインは、コンピュータ化システムを使用してGQP省令及びGMP省令が適用され る業務を行う製造販売業者等に適用する。
このガイドラインの対象となるコンピュータ化システムの例として、(1)~(7)が考えられる。また、対象外となるコンピュータ化システムは別紙2に記載する。
(1) 医薬品、医薬部外品の市場への出荷の可否の決定に係るシステム及び市場への出荷に係る記録を 作成、保存管理するためのシステム
(2) 製造指図書、製造に関する記録等を作成及び保存管理するためのシステム
(3) 製造工程を制御又は管理するためのシステム及びその管理データを保存管理するためのシステム
(4) 原材料及び製品の保管、出納等の生産を管理するシステム
(5) 品質試験に用いる機器を制御又は管理するためのシステム並びに品質試験結果及び管理データを保存管理するためのシステム
(6) 空調、製造用水製造設備など、製品の品質に重大な影響を及ぼす可能性のある製造支援設備・施設を制御又は管理するためのシステム及びその管理データを保存管理するためのシステム
(7) 文書(手順書類、品質標準書、製品標準書等)を作成、承認、保存管理するためのシステム
医薬品・医薬部外品製造販売業者等におけるコンピュータ化システム適正管理ガイドライン
バリデーションとは、製造工程及びその手順を検証して文書化することです。
検証を行い証拠となる文書を作成することにより、継続的に証拠を積み上げ高度な品質を保証していくことをバリデーションといいます。
「バリデーション」とは、製造所の構造設備並びに手順、工程その他の製造管理及び品質管理の方法が期待される結果を与えることを検証し、これを文書とすることをいう。
医薬品及び医薬部外品の製造管理及び品質管理の基準に関する省令
差分の機能仕様書や設計仕様書を作成してはならない。
最新の当該システムの機能がどうなっているかを一瞥して分かるようにしておかなければならないのである。<省略>
計画書、報告書、仕様書等は、最新バージョンのみをバインダーに綴じておかなければならない。
それに対して、テストスクリプトやテストログは全てのバージョンをバインダーに綴じておかなければならない。
なぜならば、最新のテストログのみを綴じておくとすべてのテストが合格しているからである。
規制当局のレビュでは、成功したテストを調査したいのではなく、エラーになったテストを参照し、解決された経緯を調査したいためである。
【ワンポイント】CSVにおける成果物の種類と管理方法 – eCompress
バリデーションの対象となるのは、開発したシステム自体だけではなくそれを使用する業務プロセスも含みます。
コンピュータ化されたシステム(Computerized System)とは、「コンピュータシステム」と「業務プロセス」を統合したものである。
「コンピュータシステム」は、ハードウェアとソフトウェアから構成され「業務プロセス」は、人、標準業務手順書(SOP)と、設備(例えば測定機器、CRF、筆記具など)から構成される。
コンピュータバリデーションとは イーコンプライアンス
目的は、システムが意図したとおりに動作することを保証することです。
「医薬品、医薬部外品、化粧品及び医療機器の品質管理の基準に関する省令」及びGMP省令に基づく業務を行うためのコンピュータ化システムの要件を明確にし、
コンピュータ化システムが意図したとおりに動作することを保証するため、これを開発する際に必要な事項、これを検証するバリデーションに関する事項及び運用管理に関する遵守事項を定め、GQP省令及びGMP省令の適正な実施の確保を図ることを目的とする。このガイドラインにおいては、コンピュータ化システムの開発から、検証、運用管理及び廃棄までの流れを総合してコンピュータ化システムのライフサイクルという。医薬品・医薬部外品製造販売業者等におけるコンピュータ化システム適正管理ガイドライン
薬や医療機器の品質保証のために、システムの開発から導入および廃棄までを検証・文書化します。
CSVで重要なことは、開発から廃棄までを検証して証拠として文書を残すことです。
それによって薬や医療機器の品質に問題がないことを保証します。
CSVではドキュメントがたくさん必要となるため、ユーザ企業とシステムを作る企業の間で成果物のイメージに相違がないことを確認することが作業量のズレ防止に大きく繋がります。
サプライヤが、ユーザ企業から CSV 活動のサポート(アウトソーシング)に関する見積依頼を受けた際に困る点を次に例示する。
●漠然とした要求で何をサポートして欲しいのかがよくわからない
●ユーザ企業とサプライヤの役割分担と責任範囲が明確になっていない
● CSV に関する規範が明確になっていない
● CSV を行うコンピュータ化システムに関する情報が不十分である(省略)
サプライヤが精度の高い見積を行う上で最低限必要な情報を、次に示す。
●当該コンピュータ化システムがどの規制に準拠すればよいのか
●CSV 活動はユーザ企業の規定あるいはサプライヤの方法に任せるのか
●当該コンピュータ化システムの GAMP のカテゴリ分類、システム規模や複雑さ
●成果物(バリデーションドキュメント)
CSV におけるサプライヤの役割
そんなCSVにはガイドラインがあります。
国際的にはGAMPというものがあります。
- 正式 : Good Automated Manufacturing Practice
ISPE(国際製薬技術協会)が作っていて、欧米ではこのGAMPの考え方が広く使われていて世界標準的なガイドラインです。
日本には「医薬品・医薬部外品製造販売業者等におけるコンピュータ化システム適正管理ガイドライン」というものがあります。
ガイドラインなので法的拘束力はありませんが、海外のガイドラインとも整合性があり世界的にも通用するものです。
GAMPとどう違うかはよくわかりません。
このガイドラインは欧米のGAMP5やPIC/S等のCSVガイドラインと整合性があり、コンピュータ化システムの開発から検証、運用、廃棄までのライフサイクルの考え方を採用しています。
CSVとは。コンピュータ化システムバリデーションとは
製薬や医療業界のシステム開発で使われる工程の略称
各工程の名前や略称は会社やプロジェクトによって異なりますが、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 | 承認された条件下で作業を行って動作できることを確認して記録を残す |
SlackにAWSとPythonを使って簡単なアプリを作る記録
- このサイトのやり方でアプリを作る
- AWSにインスタンスを作成する
- Slackで新規にアプリとボットユーザを作成する
- AWSでLambda関数からCloudWatchにデバッグ用のログを出力するためのIAMロールを追加する
- AWSでSlack Event APIの認証を行うLambda関数を作成する
- AWSで新規にAPI Gatawayを作成する
- Slackで作成したAPIを設定する
- ボットユーザをワークスペースに追加する
- ボットユーザがメッセージを投稿する機能を作る
- メッセージを投稿して動かしてみる
このサイトのやり方でアプリを作る
Slackで新規にアプリとボットユーザを作成する
- 「Create New App」ボタンから新規アプリを作成する。
- サイドメニューの[Bot Users]から新規ボットユーザを作成する。
AWSでSlack Event APIの認証を行うLambda関数を作成する
AWSで新規にAPI Gatawayを作成する
Lambda関数を叩くためのエンドポイントとなるAPIを作成する
APIにPOSTメソッドを作成する
デプロイしてエンドポイントを作成する
- 画面上部にエンドポイントとなるURLが表示されます。
テストする
-
- [Request Body]には、message.channels event | Slackの内容を入力します。
Slackで作成したAPIを設定する
- サイドメニューの[Event Subscriptions]を選択する。
- [Enable Events]を「On」にする。
- [Request URL]にエンドポイントとなるURLを入力する。
- [Subscribe to Bot Events]に「message.channels」か「message.groups」を追加する。
- [Save Changes]ボタンで保存する。
「message.channels」を設定することでボットユーザが参加しているパブリックチャンネルに投稿されたメッセージを取得できる
「message.groups」を設定することでボットユーザが参加しているプライベートチャネルに投稿されたメッセージを取得できる
パブリックチャンネルかプライベートチャネルかを見分ける簡単な方法
Slackの画面横に表示されているチャネル名の横にあるマークを見るとわかる。get.slack.help
ボットユーザをワークスペースに追加する
アプリをインストールする
チャネルにボットを参加させる
メッセージをチャネルに投げると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を設定する環境変数を設定する
Lambd関数を更新する
- [Function code]に参考にしているQiitaページに記載されているコードを転記する。
- [Save]ボタンで保存する。
メッセージの投稿には、ボットユーザがメッセージを投稿できるchat.postMessageを使用しています。
メッセージを投稿して動かしてみる
MacのPhpStormでLaravelプロジェクトでPHPUnitをできるようにする記録
- 以前、Laravelのプロジェクトを作ったことがありましたが、今回はPhpStormを使ってやります。
- PhpStormをインストールします。
- 新規にComposerプロジェクトを作成します。
- Xdebugをインストールします。
- プロジェクトを設定します。
- PHPUnitの設定をします。
- テストコードを作る
- PHPUnitでテストコードを実行します。
- 環境
- macOS Mojave バージョン10.14.4
- Composer version 1.8.0
以前、Laravelのプロジェクトを作ったことがありましたが、今回はPhpStormを使ってやります。
PhpStormをインストールします。
- JetBeanのPHPStormのサイトからダウンロードします。
- ダウンロードしたPhpStorm-yyyy.x.x.dmgをクリックします。
新規にComposerプロジェクトを作成します。
# 事前にインストールしてあるComposerの場所を確認 $ which composer /usr/local/bin/composer
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
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
プロジェクトを設定します。
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 # 省略
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
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
今回はうまくいきませんでした。
$ 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を設定します。
テストコードを作る
以前作ったファイルを流用します。なのでLaravelのディレクトリ構成とかからとっても外れています。
qiita.com
テスト対象ソースのエディタ上からテストクラスを生成します。
継承しているクラスを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); } } // 省略
作ったテストコード用に設定を追加します。
はじめてAWSのEC2でUbuntuを作ってSSHとリモートデスクトップで接続した時の記録
ドキュメントどおりにやっていれば超簡単にできます。
が、無駄につまずくので記録します。
EC2インスタンスを作成してSSH接続します。
EC2インスタンスを作成します。
参考 : 仮想マシンの起動
- AWSマネジメントコンソールの[EC2]からEC2 コンソールを表示します。
- [インスタンス]でインスタンスの一覧を表示します。
- [インスタンスの作成]ボタンで作成画面を表示します。
- [次のステップ〜]ボタンで進めながら内容を入力していきます。以下以外は規定値のままとしました。
- [確認と作成]ボタンで確認画面を表示して内容を確認します。
- [起動]ボタンで鍵の作成について選択して[インスタンスの作成]ボタンでインスタンスを作成します。
- 作成にはちょっと時間がかかります。
SSH接続します。
- インスタンス作成時に取得した鍵の権限を設定します。
- インスタンスの一覧から作成したインスタンスを選択して詳細画面を表示し、インスタンスのIPv4パブリックIPを確認します。
- 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コマンドをインストールしてみました。
作った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
セキュリティグループに設定を追加します。
Mac側を設定します。
リモートデスクトップアプリをインストールします。
- Apple StoreからMicrosoft Remote Desktop 10をインストールします。
Ubuntuへリモートデスクトップ接続します。
- Microsoft Remote Desktop 10を起動して[Add PC]ボタンで設定画面を開きます。
- 「インスタンスのIPv4パブリックIP」と「Ubuntuで作成したユーザー」を設定して[Add]ボタンで設定を追加します。
- 注意:今回はElasticIPアドレスを使用していないため、インスタンスを起動するたびにIPアドレスが変わります。なので、起動するたびにリモートデスクトップに設定するIPアドレスを変更する必要があります。
- 追加された設定をダブルクリックします。
- 初めての場合はダイアログが表示されるので[Connect]ボタンで進めます。
- Ubuntuに接続できました。
失敗したこと
Amazon Machine Image (AMI) で何を選択したかによってSSH接続する時のユーザ名が異なります。
ドキュメントの例では、
ですが初めて作ったインスタンスでは
でした。
これに気がつくのにかなり時間がかかりました。
xn--o9j8h1c9hb5756dt0ua226amc1a.com
インスタンスタイプが「t2.micro」では小さすぎた。
インスタンスタイプを「t2.micro」で作成しました。
SSH接続して作業するには問題なかったのですが、
デスクトップ環境をインストールしてリモートデスクトップ接続したところ
画面は表示されるものの全然動かない!
なので「t2.medium」に変更しました。
無料枠から外れてしまうのですが動かないよりはいいかと・・・。
サイドチャネル攻撃とテンペスト攻撃の違い
- 前回の勉強内容
- 勉強のきっかけになった問題
- サイドチャネル攻撃とテンペスト攻撃は、暗号装置を解析し暗号を盗む方法に使用されます。
- サイドチャネル攻撃は、動いている装置から出る電流や電磁波・振動を計測して暗号解析の手がかりを得る攻撃です。
- テンペスト攻撃は、サイドチャネル攻撃の種類の1つです。
- サイドチャネル攻撃には、他にも種類があります。
- 次回の勉強内容
前回の勉強内容
勉強のきっかけになった問題
テンペスト攻撃を説明したものはどれか。
- 故意に暗号化演算を誤動作させて正しい処理結果との差異を解析する。
- 処理時間の差異を計測して解析する。
- 処理中に機器から放射される電磁波を観測して解析する。
- チップ内の信号線などに探針を直接当て,処理中のデータを観測して解析する。
サイドチャネル攻撃とテンペスト攻撃は、暗号装置を解析し暗号を盗む方法に使用されます。
サイドチャネル攻撃は、動いている装置から出る電流や電磁波・振動を計測して暗号解析の手がかりを得る攻撃です。
- 英語 : Side Channel Attack
- 外部と隔離された機器でも攻撃される可能性があります。
テンペスト攻撃は、サイドチャネル攻撃の種類の1つです。
テンペスト攻撃は、機器やその周辺機器から出力される微弱な電磁波を計測して元情報を復元しようとします。
ディスプレイから発生される電磁波の放射レベルは強く、復号も容易になっています。
テンペスト技術とは?遠隔で不正に情報を傍受する技術への対策について
漏洩電磁波から画面表示を“再現”したパソコン・モニター
「10万円の受信機でパソコンからの漏洩電磁波を“盗聴”できる」――ISTがデモ | 日経 xTECH(クロステック)
サイドチャネル攻撃には、他にも種類があります。
電力解析攻撃は、機器の電力を計測します。
- 英語 : Simple Powering Analysis
- 別名 : SPA
故障利用攻撃は、故意に暗号化演算を誤動作させて正しい処理結果との差異を解析します。
- 別名 : フォールト解析攻撃
タイミング攻撃は、処理時間の差異を計測して解析します。
タイミング攻撃では、攻撃対象の処理の実装を分析して応答時間が変化する要因を見つけることで、入力とその応答時間から隠されたデータ(パスワードなど)の特定を試みます。
corgi-lab.com
プローブ解析は、チップ内の信号線などに探針を直接当て,処理中のデータを観測する破壊型解析です。
- 別名 : プロ―ビング
他にもCache攻撃、スキャンベース攻撃等色々あります。
次回の勉強内容
2進数の問題を見ると頭が混乱します。
前回の勉強内容
2進数の表現の問題
aを正の整数とし,b=aの2乗 とする。aを2進数で表現するとnビットであるとき,bを2進数で表現すると高々何ビットになるか。
- n+1
- 2n
- nの2乗
- 2のn乗
「高々」とは、「最大」のことです。
- 読み方 : たかだか
- bを2進数で表現すると高々何ビット = bを2進数で表現すると最大何ビット
数学において、高々(たかだか)という表現は、英語の at most に対応した厳密な意味を持つ用語である。
「xは高々2である」という表現は「xは多くとも2である」事、すなわち「x≦2」を意味する。
高々 (数学) - Wikipedia
超地道な解き方:「aを2進数で表現するとnビット」のnに値を入れて考えてみる。
- aが2bitだと、bの最大は1001で4bitになる
- aの最大 = (2進数)11 = (10進数)2 + 1 = (10進数)3
- bの最大 = aの2乗 = (10進数)9 = (10進数)8 + 0 + 0 + 1 = (2進数)1001 = 4bit
- aが3bitだと、bの最大は110001で6bitになる
- aの最大 = (2進数)111 = (10進数)4 + 2 + 1 = (10進数)7
- bの最大 = aの2乗 = (10進数)49 = (10進数)32 + 16 + 0 + 0 + 0 + 1 = (2進数)110001 = 6bit
- aが4bitだと、bの最大は11100001で8bitになる
- aの最大 = (2進数)1111 = (10進数)8 + 4 + 2 + 1 = (10進数)15
- bの最大 = aの2乗 = (10進数)225 = (10進数)128 + 64 + 32 + 0 + 0 + 0 + 0 + 1 = (2進数)11100001 = 8bit
- aが5bitだと、bの最大は1111000001で10bitになる
- aの最大 = (2進数)11111 = (10進数)16 + 8 + 4 + 2 + 1 = (10進数)31
- 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ツールを使ってちょっと大きめの値で確認してみる
- aが20bitだと、bの最大は1111111111111111111000000000000000000001で40bit
- aの最大 = (2進数)1が20個並ぶ = (10進数)1048575
- bの最大 = aの2乗 = (10進数)1099509530625 = (2進数)1111111111111111111000000000000000000001 = 40bit
- 使った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に対して、と定義する。next(n)と恒等的に等しい式はどれか。ここで,x AND y 及び x OR y は,それぞれxとyを2進数表現にして,けたごとの論理積及び論理和をとったものとする。
- (n+1) AND 255
- (n+1) AND 256
- (n+1) OR 255
- (n+1) OR 256
「恒等的に等しい」とは「どのような場合でも等しい」ということらしい
超地道な解き方:2進数にして論理演算してみます。
- nの最大値である255は2進数で書くと1111111となり、nは7bitで書ける範囲ということになります。
- n < 255の場合は、next(n) = n + 1 になります。
- n = 255の場合は、next(255) = 0になります。
- 以下表のようになる論理演算を選ぶわけです。
(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 |
- 回答群から推理して (n + 1) と (255 か 256) の組み合わせの論理演算になるはずです。
- 論理演算下後に (n + 1) になるはずです。
- 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 になりました。
恒等式 - 合格☆情報処理技術者試験
次回の勉強内容
勉強中・・・