シンボリックリンクでディレクトリが再起的ループするようにしたディレクトリの中から探す。読めないファイル、入れないディレクトリも置いておく。セキュリティ意識を持ってもらうための演習。なるように設定してある。これを通して、サーチPATHの説明を行う。しながら、さらうだけなので、大したことはない。管理者なら、以下で終わるネタ。いった手法を説明してきた。高速なデータ検索はできないのであろうか?究極のシンプルなやり方(メモリの無駄)最も簡単なアルゴリズムは、電話番号から名前を求めるようなデータベースであれば、電話番号自身を配列添え字番号とする方法がある。この方法は大量のメモリを必要とする。電話番号は6桁とする。;}hash0.cxxしかし、50人程度のデータであれば、電話番号の末尾2桁を取り出した場合、同じ数値の人がいることは少ないであろう。あれば、電話番号の末尾2桁の値を配列の添え字番号として、データを保存すれば、配列サイズは100件となり、メモリの無駄を減らすことができる。先に述べたように、データの一部を取り出して、それを配列の添え字番号として保存することで、高速にデータを読み書きできるようにするアルゴリズムはハッシュ法と呼ばれる。データを格納する表をハッシュ表、データの一部を取り出した添え字番号はハッシュ値、ハッシュ値を得るための関数がハッシュ関数と呼ばれる。;}hash1.cxxただし、上記のプログラムでは、電話番号の末尾2桁が偶然他の人と同じになることを考慮していない。データ件数が100件あれば、同じ値の人も出てくるであろう。このように、異なるデータなのに同じハッシュ値が求まることを、ハッシュ衝突と呼ぶ。たとえ話で言うなら、100個の椅子が連番付きで並んでいて、自分の電話番号末尾2桁の場所に座ろうとしたら、先に座っている人がいるような状態である。このような状態で、あなたなら何処に座るだろうか?ハッシュ関数に求められる特性ハッシュ関数は、できる限り同じような値が求まるものは、ハッシュ衝突が多発するので、避けなければならない。6桁の電話番号の先頭2桁であれば、電話番号の局番であり、同じ学校の人でデータを覚えたら、同じ地域の人でハッシュ衝突が発生してしまう。ハッシュ値を計算するのに、配列の空き場所を一つ一つ探すような方式では、データ件数に比例した時間がかかり、高速なアルゴリズムでなくなってしまう。このことから、ハッシュ関数には以下のような特徴が必要となる。同じハッシュ値が発生しづらい(一見してデタラメのように見える値)簡単な計算で求まること。同じデータに対し常に、同じハッシュ値が求まること。先の椅子取りゲームの例え話であれば、先に座っている人がいた場合、最も簡単な椅子に座る方法は、隣が空いているか確認して空いていたらそこに座ればいい。これをプログラムにしてみると、以下のようになる。このハッシュ法は、求まったアドレスの場所にこだわらない方式でオープンアドレス法と呼ばれる。大域変数で0で初期化されているものとする。見つからなかった}hash-openaddr.cxx注意:このプログラムは、ハッシュ表すべてにデータが埋まった場合、無限ループとなるので、実際にはもう少し改良が必要である。前に述べたオープンアドレス法は、ハッシュ衝突が発生した場合、別のハッシュ値を求めそこに格納する。データ件数を保存することはできない。チェイン法は、同じハッシュ値のデータをグループ化して保存する方法。同じハッシュ値のデータは、リスト構造とするのが一般的。;}hash-chain.cxxコンテスト入賞で校長表敬2019年12月18日HIT2019にて、優秀賞をなった3EIグループと、高専デザコンAM部門で審査員特別賞となった専攻科グループで校長表敬を行いました。説明し、それには正規形としての条件を満たしている必要があることを説明する。第一正規形は、すべての要素が原子値である条件を満たせばいい。表構造のリレーショナルデータベースにはできない。候補キーとは、必要最小限の項目となっているものを指す。1項目が抜けても選別できなくなるようであれば、候補キーとは言わない。主キーとは、候補キーのなかで管理の都合上便利なもの。従属関係があるという。完全従属する場合をいう。完全従属とは、候補キーを構成する全てのデータ項目に、非キーデータ項目が従属していること。部分従属とは、候補キーを構成するデータ項目の一部のデータ項目に、非キー項目が従属していること。この例において、単価は商品が決まれば自動的に求まる情報。これは、部分従属となる。推移従属性とは、データ項目でA→B→Cと、次々と値が求められる関係を指す。どの候補キーにも推移従属しない関係をいう。上記の例では、単価と個数が決まれば、金額が求まる推移従属の関係が含まれている。ボイスコッド正規形(BC正規化)。「元になるテーブルの結合従属性を維持して分解することにより得られる第5正規形などがある。トップダウン設計・ボトムアップ設計データベースの設計にあたって、実際の設計手順の説明を行う。トップダウン設計では、対象業務を記述し、その中から名詞となっている実体を抽出する。動詞や形容詞のように記載されている関連を抽出する。その実体・関連をER図に表す。見ながら、第1正規形を満たすように表を作っていく作業からおこなう。その属性の中で従属性を確認しながら、第2正規形・第3正規形へと整理していく。今日は、後期中間試験明けということで、テスト返却。昨年のテストは、説明問題中心になり簡単だったとの反省から、若干穴埋め問題・プログラム記述問題を増やした。蓋を開けてみたら平均点87点の好成績。テスト直後に記述問題で難しかったって感想言ってたくせに...。メモリ経由の盗み見ただ、テスト直後の間違いの確認で、定義されていない変数に何が入っているのかというのを疑問に思っている人がいたので、解説。入っていると思う人も多い。基本的に、局所変数はスタックを使うので、スタックに残っている前の値。いろんなデータがあるからこそ、ゴミ(どんな値が入っているか不明)いうことを説明。セキュリティという視点だと、Aさんとの通信処理が終わって、Bさんの処理を行う場合、プログラムの不備をみつけたBさんが、局所変数の配列に残っているデータをうまく読むことができたら、Aさんとの通信内容をBさんが盗み見れる可能性もあることを説明。局所変数だけでなく、ヒープメモリも同様の問題をはらんでいる。データ領域にも、他の人のデータが入っているかも...と説明する。雑談をしていて、これはまさに「神奈川県のデータ流出事件」と同じ構図なので、「「データ領域の再利用でデータ流出』で今ニュースになってるの知ってる?」と学生に聞いてみた。神奈川のネタに気づく学生さんが居ない。いう時事ネタのニュースを見ていないと感じたので、「みんな4年だとすぐに就職活動の人も多いのに、時事ネタ知らないのはまずいよ」と意識喚起。その上で、HDDデータ消去のやり方を解説、クイックフォーマット・完全フォーマットの違いや、軍のデータを扱う場合は、残留時期を読み取る可能性もあるので、ランダムデータを4回書き込むといった解説をする。Windows(無償版)をダウンロードし、インストールを行う。版の起動イメージ起動した状態のイメージを作っておきたかったが、Freeの環境では無理っぽいな。miniOrange。