ホーム » スタッフ

スタッフ」カテゴリーアーカイブ

2020年3月
« 1月    
1234567
891011121314
15161718192021
22232425262728
293031  

最近の投稿(電子情報)

アーカイブ

カテゴリー

払い下げPCへのddを使ったディスクイメージコピー

総合情報処理センターのパソコンの入れ替えにより、払い下げとなったパソコンのセットアップ中。

1台をWindows10などの環境を整えて、あとは、USBブートのUbuntuを使って、HDDを全コピー。

最初、SATA のケーブルを、コピー元=SATA0 と、コピー先=SATA1 につないでコピーをしたら、同一バスを使うからかな!?やたらと時間がかかり、1台あたり 290分かかった。

$ time sudo dd if=/dev/sda of=/dev/sdb
289min...

2度目からは、コピー元=SATA0で、コピー先=SATA1を、コピー先=SATA3に変更して、ついでにコピー単位を256kB に変更して行う。

$ time sudo dd if=/dev/sda of=/dev/sdb bs=256k
78min...

バッファーサイズが効果的だったのか、SATA3 にしたのが良かったのか…はよく判らないけど、コピー時間を1/3に短縮できた。

でも、残りあと10台以上セットアップは続く。卒業式が始まる前に、1ローテーション回してから、式に向かう。まだまだあるし、もう1つUbuntuのUSBを準備し、2台並行作業を開始。

サーヴェイとは(FD研修会)

発想法の指導に関するFD研修会

サーヴェイ

はじめに

  • 論理立てて思考する起点を見出すのがサーヴェイ
  • デザインの作ろうとする物事の仕組みや考えを論理立てて説明出来るための要
  • 自身が納得できて、説得するためではなく説明の基礎

アイデア・イメージメモ

  • 考えの写真・図・イラスト
  • コメント1(思いつき、気付き、疑問、不、好感、利点など)
  • コメント2(提案、発展、課題など)
  • その他

Surveyとは、

  • SurveyとResearchの違い
    • Research…研究・調査
      • 研究する、調査する
    • Survey …調査、探査、測量、実地踏査
      • 見渡す、概観する
    • field work …実地研究、野外調査、実地調査、現地調査、巡見
  • 探検・発見

ResearchとSurveyの相違

  • リサーチ
    • 準備して調べること
      • 縛りが強い、決め事がある
      • 客観的
      • 設定
      • 定数的
      • やや論理的
      • ロジカル、裏付け的
  • サーヴェイ
    • 特に準備なく体感すること
      • 縛りがゆるやか、決め事はない
      • 主観的
      • 想定
      • 定性的
      • 感覚的
      • エモーショナル、曖昧さがあっていい

Surveyでの留意点

  • サーヴェイは、情報・データを得る方法の1つ
  • 問題を発見する方法
  • ポイント
    • 先入観を持たずに概観(常識や固定観念をはずす)
      • 自分の経験や知識を一度仕舞い込む
      • 常識や規則、良識に囚われていないかと自分に問う
    • 自分の五感+αに素直(感じや思いを表出する)
      • 感じるがまま、思うがままを表現
      • 幼少時の感覚を思い起こす
        • 純真な子供に成り代わって素直に対象と接する
    • 気付き、思いつきをメモ
      • 記号化 – 話し言葉、書き言葉、絵、写真、図など「うつし」
        • 取捨選択をしない
        • あまり深く考えない
        • 結論や解を求めない
        • 評価しない
  • 気になることがない…という場合には
    • アイデアイメージを書けない理由
      • こんなことはできない、不可能だから言わない、提案しても採用されない…
    • 曼荼羅法→根拠理由を考えて再度行う
      • なぜ書けないを曼荼羅法で気づかせる
    • なぜ、どうしてと問わない。関わり、関係を考えない

Surveyからメモ作成での姿勢と方向

  • 対象の概観(観察)
  • 時間を区切る
    • (5) / 15 / (30) / 45 / 90 分
    • 5分でまとめる(連想法を5分で…)
    • 30分以上同じことをさせない
  • 自他の評価を考えない・行わない
  • 対象の良い点も悪い点も見つける
    • 曼荼羅法、
      • 3×3の表
      • 真ん中にテーマと気付き
      • その周り8コマにアイデア(上下左右にプラスマイナス)
    • プラスマイナスカード法、
    • Brain Writing法、
    • Brain Storming法(希望点列挙法,欠点列挙法)
  • 素直に問う
    • 気になることを「何だろう」「どうしてかな」と自問する
  • 話す・見せる
  • ▶︎サーヴェイによるデータ・資料作成のプロセスとなる

サーヴェイの位置付け・必要性・実施の意味

  • サーヴェイ
    • 問題の発見 … 問う「なぜ?」「どうして?」と疑問に思うこと
    • 問題の探索 … さぐる、さがす
    • 問題の把握 … 全貌と細部(ディテール、詳細) → 現状把握・確認
  • 「発想のネタ」、「創造のいとぐち」を見出すためのプロセスの最初の行為であり思考
  • サーヴェイと問題
    • 発見、把握、探索

サーヴェイの発散・収束の思考

  • イメージからアイデアに
    • 探索→発見→把握→探索…のスパイラルアップ
  • 感覚的から論理的に
  • 関係や関わりも探り考える(空間・場・時間・機会・遊・休・知・美・感・交・操・演)

発想を出す時のテクニック

  • Surveyする時の写真は、モノクロの方がいい
    • 余計な情報が先入観になってしまう
  • 写真にマーカーを入れる
    • マーク付けした所をもとに議論

 

ネットワークセキュリティのためのTips

ファイル操作演習 回答編

Linux の操作演習をやったけど、興味を持った人はそれなりに楽しんでくれたみたい。ひっかけのネタになっていた部分を抜粋して簡単に説明。

基本は、以下のようにディレクトリに入って、ファイルだったら表示…の繰り返し。

$ cd /home0/Challenge/1-CTF.d/Task1
$ ls -al
0ReadMe brain concussion persons
$ cat 0ReadMe
...
$ cd brain
$ ls
company  concussion  of-brains
$ cat *
...
$ cd ../concussion
$ ls
...

Task4では、特殊なファイル名が入れてあるので、注意が必要。

$ cd /home0/Challenge/1-CTF.d/Task4
$ cd dir1
$ cat 'file name.txt'   空白を含むファイル名は''で囲む
:
$ cat ./--file.txt      -で始まるファイル名はコマンドオプションと
                        勘違いされないように ./ をつける。

dir3 の中には、シンボリックリンク(Windowsでいうところのショートカット)があるので要注意。

$ cd ../dir3
$ ls -al
lrwxrwxrwx 1 t-saitoh t-saitoh    2 Dec 20 10:45 Task4 -> ..
-rw-rw-r-- 1 t-saitoh t-saitoh   39 Dec 20 10:47 ZFile4

# cd Task4 をすると、1つ上のディレクトリへのシンボリックリンクがあるので
# 無限の繰り返しになる。

Task5 には、unix の基礎的なセキュリティトラップを体感してもらう。

$ cd /home0/Challenge/1-CTF.d/Task5
$ ls 
0ReadMe  Bomb
$ cd Bomb
$ ls                   接続が切れてしまう。

実は、今回 Login すると、環境変数PATH の設定に不備が仕掛けてある。また Bomb のディレクトリ内には、ls , cat といった名前で、強制的に接続をするコマンドを置いてある。この仕掛けにより、Bomb ディレクトリで ls を実行すると、接続が切れてしまう。

対策1

Bomb ディレクトリに入らずにファイルを探る

$ cd /home0/Challenge/1-CTF.d/Task5
$ ls Bomb
0ReadMe  Bomb
$ cat Bomb/cat
$ cat Bomb/flag

対策2

実は、環境変数 PATH (利用者がよく使うコマンドが保存されているディレクトリ一覧)が “.:/usr/bin:/bin” となっている。先頭に . が入っているため、カレントディレクトリの中に ls といったコマンドがあると実行してしまう。

環境変数 PATH にカレントディレクトリ(.)が入っていると、悪意のあるプログラムを実行させたい人が、危険な実行プログラムを置き逃げしてあると、実行してしまう可能性が高い。このため、(.)無しにすべき。

$ export PATH=/usr/bin:/bin
$ cd /home0/Challenge/1-CTF.d/Task5/Bomb
$ ls
cat  flag  less  ls  lv  more  nkf
$ cat flag
FLAG{DoNotTouchBomb}

Linux演習用リンク

演習の中では、クイズ形式などの回答を聞いたり、講義後の質問などのために、以下の Twitter ハッシュタグを用いることとする。#2020nitfcei3os って書いたけど、学内WiFi SNS系全カットじゃん。

なお、教室で BYOD パソコンで同時接続を行うため、この授業中だけ増設の WiFi アクセスポイントを設置します。

  • SSID = fnct-class , password = fnct-class にて接続してください。

Windowsでsshが使えない場合

データベース2019-講義録

情報構造論2019-講義録

オブジェクト指向と情報構造論と演習

データ構造を扱うプログラムの書き方を説明してきたので、それらを便利に書くためのオブジェクト指向の入り口を紹介する。

データ指向のプログラム記述

名前と年齢のデータを扱うプログラムを書く時、私なら以下のようなプログラムを作成する。

このプログラムの書き方では、saitohというデータにset_NameAge() , print_NameAge() を呼び出していて、データに対して処理を加えるという雰囲気がでている。このようにプログラムを書くと、saitoh というデータに対して命令するイメージとなり、擬人化したデータに向かってset,printしろ…って命令しているように見える。

// 名前と年齢の構造体 
struct NameAge {
   char name[ 20 ] ;
   int  age ;
} ;

// NameAgeを初期化する関数
void set_NameAge( struct NameAge* p , char s[] , int a ) {
   strcpy( p->name , s ) ;
   p->age = a ;
}

// NameAgeを表示する関数
void print_NameAge( struct NameAge* p ) {
   printf( "%s %d¥n" , p->name , p->age ) ;
}

void main() {
   struct NameAge saitoh ;

   set_NameAge( &saitoh, "t-saitoh" , 53 ) ;
   print_NameAge( &saitoh ) ;

   // NameAge の中身を知らなくても、
   // set_NameAge(),print_NameAge() の中身を見なくても、
   // saitoh を set して print する....という雰囲気は伝わるよね!!  
}

このプログラムでは、例えば、データに誕生日も覚えたいという改良を加えるとしても、main の前のデータ構造と関数の部分は色々と書き換えることになるだろうけど、main の内部はあまり変わらないだろう。こういう状態なので、プログラムを作成するときには、データ構造とそれを扱う関数を記述する人と、データ構造を使う人(main内部を書く人)と、分業ができるようになる。

隠蔽化

このような記述では、データ構造の中身を知らなくても、main で、setしてprintして…という処理の雰囲気は分かる。さらに、set_NameAge()とか、print_NameAge() の処理の中身を知らなくても、設定するとか表示するとか…は予想できる。

これは、NameAge というデータをブラックボックス化して捉えていると見れる。データ構造の中身を知らなくてもプログラムを理解できることは、データ構造の隠蔽化という。また、関数の中身を知らなくても理解できることは、手続きの隠蔽化という。

オブジェクト指向プログラミング

前述のように、プログラムを書く時には、データ構造とそのデータを扱う関数を一緒に開発するのが一般的である。オブジェクト指向プログラミングでは、データ構造その関数(メソッドと呼ぶ)をまとめてクラスと呼ぶ。

class NameAge {
private:
   // データ構造の宣言
   char name[ 20 ] ;
   int  age ;

public:
   // メソッドの定義
   void set( char s[] , int a ) { // 初期化関数
      strcpy( name , s ) ;
      age = a ;
   }
   void print() {                 // 表示関数
      printf( "%s %d¥n" , name , age ) ;
   }
} ;

void main() {
   NameAge saitoh ;
   saitoh.set( "t-saitoh" , 53 ) ;
   saitoh.print() ;
}

このプログラムでは、saitoh というデータ(具体的なデータオブジェクトと呼ぶ)に対して、set() , print() を呼び出している。

オブジェクト指向では、データに対して private を指定すると、クラス以外でその要素を扱うことができなくなる。これにより、クラスを設計する人と、クラスを使う人を明確に分けることができ、クラスを使う人が、クラス内部の変数を勝手に触ることを禁止できる。

プログラムを記述する時には、データ件数を数える時に、カウンタの初期化を忘れて動かないといった、初期化忘れも問題となる。オブジェクト指向のプログラム言語では、こういうミスを減らすために、データ初期化専用の関数(コンストラクタ)を定義することで、初期化忘れを防ぐことができる。

// コンストラクタを使う例
class NameAge {
   // 略
public:
   NameAge( char s[] , int a ) { // データ初期化専用の関数
      strcpy( name , s ) ;       //  コンストラクタと呼ぶ
      age = a ;
   }
   // 略
} ;
void main() {
   NameAge saitoh( "t-saitoh" , 53 ) ; // オブジェクトの宣言と初期化をまとめて記述できる。
   saitoh.print() ;
}

プログラムにオブジェクト指向を取り入れると、クラスを利用する人クラスを記述する人分業ができ、クラスを記述する人は、クラスを利用するプログラマーに迷惑をかけずにプログラムを修正できる。

この結果、クラスを記述する人はプログラムを常により良い状態に書き換えることができるようになる。このように、よりよく改善を常に行うことはリファクタリングと呼ばれ、オブジェクト指向を取り入れる大きな原動力となる。。

最近のC++なら

最近のオブジェクト指向プログラミングは、テンプレート機能と組み合わせると、単純リスト処理が以下のように書けてしまう。struct 宣言やmalloc()なんて出てこない。(^_^;

#include <iostream>
#include <forward_list>
#include <algorithm>

int main() {
  // std::forward_list<>線形リスト
  std::forward_list<int> lst{ 1 , 2 , 3 } ;

  // リスト先頭に 0 を挿入
  lst.push_front( 0 ) ;


  // 以下のような処理を最新のC++なら...
  //   for( struct List*p = top ; p != NULL ; p = p->next )
  //     printf( "%d¥n" , p->data ) ;

  // 通常の反復子iteratorを使って書いてみる。
  //   auto は、lst の型推論。
  //   本来なら、std::forward_list<int>::iterator itr = lst.begin() と書く。
  for( auto itr = lst.begin() ;
       itr != lst.end() ;
       itr++ ) {
    std::cout << *itr << std::endl ;
  }

  // 同じ処理を algorithm を使って書く。
  std::for_each( lst.begin() ,
                 lst.end() ,
                 []( int x ) { // 配列参照のコールバック関数
                   std::cout << x << std::endl ;
                 } );

  // 特に書かなくてもデストラクタがlstを捨ててくれる。
  return 0 ;
}

関数ポインタ

前プログラムのC++のfor_each アルゴリズムでは、コールバック関数が使われていたが、この仕組みを分かるために関数ポインタの考え方が重要。

int add( int x , int y ) {
   return x + y ;
}
int mul( int x , int y ) {
   return x * y ;
}
void main() {
   int (*f)( int , int ) ; // fは2つのintを引数とする関数へのポインタ
   f = add ;               // f = add( ... ) ; ではないことに注意
   printf( "%d¥n" , (*f)( 3 , 4 ) ) ; // 3+4=7
   f = mul ;
   printf( "%d¥n" , (*f)( 3 , 4 ) ) ; // 3*4=12
}

演習(ハッシュ法)

ハッシュ法のプログラム(オープンアドレス法もしくはチェイン法)を用いて、
(1)名前と電話番号,(2)名前と住所,(3)名前と誕生日について、名前をキーとして検索するプログラムを作成せよ。

原則として「出席番号 % 3 + 1」の番号のテーマに取り組むこと。

レポートを作成する際には、ハッシュ関数を変更してどういった変化があるか確認せよ。
ハッシュサイズは、10〜20件程度で良い。

B木とB+木とハッシュ法

B木

データベースのデータを扱う場合には、B木を用いることが多い。

複数のデータを格納するノードは、位数Nであれば、2✕N個のデータと、その間のデータを持つノードへの2N+1個のポインタで構成される。

ノードにデータを加える場合(あるいは削除する場合)は、頻繁にノードのポインタの付け替えが発生しないように、データがN個を下回った時や、2N個を超える場合に以下のような処理を行う。ノード内のデータ数が2Nを超える場合は、均等に木構造が成長するように、中央値を上のノードに移動し、ノードを2分割する。

データを削除することでN個を下回る場合は、隣接するノードからデータを移動する。(上図の緑部分のように上位ノードの値を交えながら移動する)

このような処理を行うことで、極力不均一に成長した木構造が発生しないようにB木は管理されている。

B+木とシーケンスセット

再帰的な木構造のB木では、特定のデータを探す場合には、O(log N)で検索が可能である。

しかしながら、直積のようなすべてのデータを対象とする処理を行う場合、単純なB木では再帰呼出しをしながらの処理を必要とすることから、複雑な処理が発生する。そこで、データ列を横方向にアクセスするための単純リストであるシーケンスセットをB木と並行して管理するデータ構造B+木である。

データを検索する場合は、B木構造部を用い、全データ処理は、シーケンスセットを用いる。

ハッシュ法

ハッシュ表は、データの一部をとりだしてハッシュ値を求め、そのハッシュ値を番地とする場所にデータを保存する方法である。しかし、データの一部を取り出すため、異なるデータに対して同じハッシュ値となる場合がある。これをハッシュ衝突とよぶ。この際のデータの保存の方法から、2つの方式がある。

  1. オープンアドレス法
    ハッシュ表がすでに埋まっていたら、別の保存場所を探す方式。
  2. チェイン法
    同じハッシュ値となるデータをリスト構造で保存する方法。

(2019-01-29) 図が見にくかったので差し替え

トランザクション処理

トランザクション処理

トランザクション処理とは、相互に依存関係にある複数の処理を矛盾なく処理することであり、データベースでは、ACID特性(原子性,一貫性,隔離性,耐久性)がもとめられる。この時、直列化可能(様々な順序で処理できるかもしれないけど、矛盾しない結果となる処理順序が存在すること)であることが求められる。

例えば、以下のように、50万円のデータがあった時、入金処理と出金処理がほぼ同じタイミングで開始された場合、入金処理が終わらないうちに、出金処理が開始されると、以下の例では入金処理が無視されてしまう。

上記のような問題が発生しないようにするには、以下のように、入金処理の時点で他の更新処理を排除するLOCK処理を行い、入金データの書き込みを終えた時点でUNLOCK処理を行う、排他処理が重要となる。(ロックされている間は、アクセスを禁止する。)

同時実行制御

複数のトランザクションによるデータアクセスで、トランザクション処理を直列化可能にすることを、同時実行制御と呼ぶ。この方式には、2つの方法がある。

  1. ロッキング方式(悲観的制御)
    先行するトランザクションは、データにロックをかけ、他のトランザクションを一時的に排除する方式。後発の処理はアンロックされるまで待たされることことから、これが処理効率の低下となる。

    • ロッキング方式では、ロックをかける大きさ(粒度)が大きいと、待ち処理が発生する可能性が高い。一方で、粒度を小さくしようとすると、ロックの判定が難しくなり効率が低下する可能性も出てくる。
    • ロックの種類
      ロックには、読み出し中心のデータと書き込みで更新のかかるデータでは、ロックのかけ方が異なる。例えば、読み出し中のデータは値が変化しないことから、同じタイミングで読み出し処理が発生しても、待たせる必要は無い。
      この時、データを読み出す際にかける共有ロック(Read Lock)と、書き込みの際にかけるロック占有ロック(Write Lock)がある。
    • 2相ロッキングプロトコル
      トランザクションのロックの操作は、ロックをかける操作が続く成長相と、ロックを解除する操作が続く縮退相に分けて行うことが多い。これを2相ロッキングプロトコルと言う。
  2. 時刻印処理(楽観的制御)
    データの競合の発生頻度が低い場合には、ロッキング方式は待ち処理時間が無駄となるため、同時アクセスを許す方式。ただし、あとで処理の発生した時間(タイムスタンプ)を確認し不都合が判明した場合は、処理の記録をもとにロールバックしてやり直す方式。

デッドロック

複数のトランザクションの実行時には、相互の関係から、処理がうまく進まない場合も発生する。(お互いが相手の処理をロックする状態で、ロック解除が発生しない。)

このような状態をデッドロックと呼び、この状態が発生すると処理が停止してしまうこともある。このような状態は、避けられない場合もあるが、どの処理が何を使うのか、どのデータはどの処理の終了を待っているのかといった資源の状態をグラフ理論で表現したもの資源グラフをで表現し、グラフが巡回するようであれば、デッドロックが発生する。