インフラSE日記

OSS、仮想化、金融工学、ゲーム、ときどきラーメン

対角線論法について

カントール自然数\mathbb{N}と実数\mathbb{R}との間に全単射がないことを証明するために対角線論法を使ったことはあまりにも有名です。 その他にもチューリングの停止性問題、ゲーデル不完全性定理を証明するために対角線論法を使ったことでも有名ですね。

個人的に昔から対角線論法の証明内容が腹落ちしないというか、納得がいかなかったので自分で納得がいく証明方法を考えてみました。

ちなみに、初めてはてなブログMarkdown記法を使ってtexの数式で書いたのですが、 なかなかうまく書けないですね。

定理 自然数\mathbb{N}から実数\mathbb{R}への全単射は存在しない。

証明

自然数\mathbb{N}から実数\mathbb{R}の部分集合[0,1]へ全単射fが存在すると仮定する。

ここで関数g,hを下記の通り定義する。


g:[0,1]\times\mathbb{Z}_{10}\to\mathbb{Z}_{10}


g\left(r, n\right)=\lfloor r\times10^{n} \rfloor mod 10


h:\mathbb{Z}_{10} \to \mathbb{Z}_{10}

関数hは任意のx\in\mathbb{Z}_{10}に対しh\left(x\right)\neq x

を満たす関数であればなんでもよい

ここで実数rを以下の通り定義する。

r={\displaystyle
\sum_{i=1}^{\infty}\frac{h(g(r_{i},i))}{10^{i}}
}

仮定から、実数rに対応する整数Nが存在する。

{\displaystyle
g\left(r,N\right)=g\left(r_{N},N\right)=\lfloor \sum_{i=1}^{\infty}\frac{h(g(r_{i},i))}{10^{i}}\times10^{N} \rfloor mod 10=h(g(r,N))}

となり、矛盾する。 すなわち、自然数\mathbb{N}から実数\mathbb{R}全単射fが存在するという命題が偽であることがわかり、自然数から実数への全単射が存在しないことが証明できた。

僕が普通の対角線論法で納得いかない部分は、自然数から実数への対応表から、対応表にない実数を構成するところでした。対応表にない実数が、無限に並んだ自然数から実数への対応表のどれにも一致しないという論法において、何故無限個の実数と異なることを示すことができるのだろうという疑問がありました。 具体的に対応表に存在しない実数rを対角線上にある自然数から構成し、自然数と実数の間に全単射が存在するという仮定から、実数rに対応する自然数Nが存在することになるが、実数rのN番目の自然数は実数rのN番目の自然数と異なるという矛盾を導き出す。 このことによって、自然数から実数への全単射がないことが証明できる。

次は、ゲーデル不完全性定理かな?

そんな感じです。

ARP REQUSTの挙動について

今更、ネットワークの基本的なことを勉強しています。

その中でも、ARPは基本的な通信プロトコルであるため、どのような挙動をするか実験してみました。

何を今更そんな、という方もいらっしゃるかもしれませんが、ほとんど自分用のメモなので許してください!

 

結論

ARP REQUSTは他のサーバのARPテーブルを書き換えることができる

 

実験内容

仮想マシンVM1, VM2, VM3を使い、イーサネットヘッダの送信元MACアドレス送信先MACアドレスARPヘッダの送信元MACアドレス、送信元IPアドレス送信先MACアドレス送信先IPアドレスを変えながらARP REQUEST(ブロードキャスト)を投げる。ARP REPLYの内容と実際に書き換わったARPテーブルの内容を確認する。

 

通信するプログラムはVM1で実行する。VM1はUbuntu 14.04であり、生ソケットを使うものとする。

 

わかったこと①

イーサネットヘッダの送信元MACアドレスARPに全く影響しない。

 

イーサネットヘッダの送信元MACアドレスをVM1, VM2, VM3のMACアドレスに変更しながら実行してみたが、ARP REPLYに影響はなかった。

 

わかったこと②

ARP REPLYを返すサーバは、ARP REQUESTのARPヘッダに書かれている送信先IPアドレスのサーバである。

 

もともと知りたいIPアドレスに対応するMACアドレスのサーバにARP REPLYを返してほしいため、当たり前の挙動である

 

わかったこと③

ARP REPLYを返したサーバは、ARP REQUESTのARPヘッダに書かれている宛先IPアドレスのサーバのMACアドレスを、ARP REUESTのARPヘッダに書かれている送信元MACアドレスとして学習する

 

つまり、ARP REQUESTを受け取ったサーバは、素直にARP REQUESTを投げたサーバのIPアドレスMACアドレスを素直に学習する

この仕様を使えば、ARP REQUESTでブロードキャストドメイン上に存在するサーバのARPテーブルを改ざんできる

 

下に実験結果をまとめてみます

No.7以降の学習結果を書いていないのはめんどくさくなって実験してないからです

まぁ、ある程度仕様わかったしね、ある程度は大丈夫でしょう

これでARP SPOOFINGには偽のARP REPLYを投げてする方法と、偽のARP REQUETを投げる方法があることがわかりましたね!

 

良い子はARP SPOOFINGなんてやっちゃダメですよ!

 

No. 実行端末 ETH SRC MAC ETH DST MAC ARP SRC MAC ARP SRC IP ARP DST MAC ARP DST IP ETH SRC MAC ETH DST MAC ARP SRC MAC ARP SRC IP ARP DST MAC ARP DST IP VM1 VM2 VM3
1 VM1 VM1 FF:FF:FF:FF:FF:FF VM1 VM1 00:00:00:00:00:00 VM2 VM2 VM1 VM2 VM2 VM1 VM1 VM2のMACアドレスを、VM2のMACアドレスとして学習した VM1のMACアドレスを、VM1のMACアドレスとして学習した 学習していない
2 VM1 VM1 FF:FF:FF:FF:FF:FF VM2 VM1 00:00:00:00:00:00 VM2 VM2 VM2 VM2 VM2 VM2 VM1 VM2のMACアドレスを学習できなかった VM1のMACアドレスを、VM2のMACアドレスとして学習した 学習していない
3 VM1 VM1 FF:FF:FF:FF:FF:FF VM3 VM1 00:00:00:00:00:00 VM2 VM2 VM3 VM2 VM2 VM3 VM1 VM2のMACアドレスを学習できなかった VM1のMACアドレスを、VM3のMACアドレスとして学習した 学習していない
4 VM1 VM2 FF:FF:FF:FF:FF:FF VM1 VM1 00:00:00:00:00:00 VM2 VM2 VM1 VM2 VM2 VM1 VM1 VM2のMACアドレスを、VM2のMACアドレスとして学習した VM1のMACアドレスを、VM1のMACアドレスとして学習した 学習していない
5 VM1 VM2 FF:FF:FF:FF:FF:FF VM2 VM1 00:00:00:00:00:00 VM2 VM2 VM2 VM2 VM2 VM2 VM1 VM2のMACアドレスを学習できなかった VM1のMACアドレスを、VM2のMACアドレスとして学習した 学習していない
6 VM1 VM2 FF:FF:FF:FF:FF:FF VM3 VM1 00:00:00:00:00:00 VM2 VM2 VM3 VM2 VM2 VM3 VM1 VM2のMACアドレスを学習できなかった VM1のMACアドレスを、VM3のMACアドレスとして学習した 学習していない
7 VM1 VM3 FF:FF:FF:FF:FF:FF VM1 VM1 00:00:00:00:00:00 VM2 VM2 VM1 VM2 VM2 VM1 VM1      
8 VM1 VM3 FF:FF:FF:FF:FF:FF VM2 VM1 00:00:00:00:00:00 VM2 VM2 VM2 VM2 VM2 VM2 VM1      
9 VM1 VM3 FF:FF:FF:FF:FF:FF VM3 VM1 00:00:00:00:00:00 VM2 VM2 VM3 VM2 VM2 VM3 VM1      
10 VM1 VM1 FF:FF:FF:FF:FF:FF VM1 VM2 00:00:00:00:00:00 VM2 Gratuitous ARP
11 VM1 VM1 FF:FF:FF:FF:FF:FF VM2 VM2 00:00:00:00:00:00 VM2
12 VM1 VM1 FF:FF:FF:FF:FF:FF VM3 VM2 00:00:00:00:00:00 VM2
13 VM1 VM1 FF:FF:FF:FF:FF:FF VM1 VM3 00:00:00:00:00:00 VM2 VM2 VM1 VM2 VM2 VM1 VM3      
14 VM1 VM1 FF:FF:FF:FF:FF:FF VM2 VM3 00:00:00:00:00:00 VM2 VM2 VM2 VM2 VM2 VM2 VM3      
15 VM1 VM1 FF:FF:FF:FF:FF:FF VM3 VM3 00:00:00:00:00:00 VM2 VM2 VM3 VM2 VM2 VM3 VM3      

 

 

 

そんな感じです。

Nutanix CE構築手順

家のNutanix CEの仮想マシンが壊れたので、再構築してみました。

自分への備忘として、構築時の手順を以下に記載します。

構築してからスクリーンショットをとってないことに気づきましたが後の祭りでした。

構築所要時間は1時間くらいです。

 

■構築環境

 仮想基盤:VMware Workstation Pro

 メモリ:16G

 vCPU:4

 HDD1::200GB(Hot)

 HDD2:500GB(Cold)

 Nutanix Host IP:192.168.197.11

 CVM IP:192.168.197.21

 

1. Nutanix CEのインストール
1-1. Nutanix CE用のimgを下記URLからダウンロードする
 【URL】
  http://next.nutanix.com/t5/Discussion-Forum/Download-Nutanix-CE-Docs-and-Guides/m-p/3188#U3188
1-2. 1-1.で取得したimgファイルを解凍し、ファイル名を「ce-flat.vmdk」に変更する
1-3. Nutanix用のVMDKファイルを下記URLからダウンロードする
【URL】
  https://www.virtuallifestyle.nl/2015/06/nextconf-running-nutanix-community-edition-nested-on-fusion/
 【ファイル名】
  ce.vmdk
1-4. Nutanix用の仮想マシン(以下Nutanix01とする)を作成する
 メモリ:16GB
 プロセッサ:4
 ブート用メディア:ce.vmdk    SATA
 Hot Disk(SSD):200GB   SCSI(0:0)
 Cold Disk(HDD):500GB SCSI(0:1)
1-5. NutanixをBIOS起動する
下記をvmxファイルに追記
vhv.enable = "TRUE"
bios.forceSetupOnce = "TRUE"
1-6. [Boot]->[Hard Drive]より起動ディスクの優先順位をSATA(ce.vmdk)に変更し、再起動する
1-7. Nutanixにログインする
 ユーザ名:root
 パスワード:nutanix/4u
1-8. 下記コマンドを実行し、認識しているディスクを確認する
 【コマンド】
  fdisk -l
1-9. 下記コマンドを実行し、Hot Diskとして認識させたいデバイスを擬似的にSSDとして認識させる
 【コマンド】
  echo 0 > /sys/block/sda/queue/rotational
  cat /sys/block/sda/queue/rotational
1-10. 下記ユーザ名入力し、ログインする
 【ユーザ名】
  install
1-11. キーボードのレイアウトを指定する※1
 【レイアウト】
  jp106
1-12. ネットワーク設定を行う
・Host IP Address
・Host Subnet Mask
・Host Gateway
・CVM IP Address
・CVM Subnet Mask
・CVM Gateway
DNS Server

1ノード構成の場合、下記にチェックを入れる※2
 Create single-node clusrter?

 ※2チェックを入れインストールすると後のクラスタ構築時に失敗することがあるため、チェックを入れない

1-13. EULAを最後まで読んで、「I accept the end user license agreement.」にチェックを入れる
1-14. Nutanixのインストールが終了するまで待つ

 

2. クラスタの構成
2-1. 下記ユーザ名とパスワードを入力し、CVMにログインする
 ユーザ名:root
 パスワード:nutanix/4u
2-2. 下記コマンドを実行し、クラスタを構成する
 【コマンド】
  cluster -s <CVMのIPアドレス>
2-3. 下記コマンドを実行し、DNSサーバを設定する
 【コマンド】
  cp -p /etc/resolv.conf /etc/resolv.conf.default
  cluster add-to-name-servers servers="8.8.8.8"
  cat /etc/resolv.conf
2-4. 下記URLアクセスし、管理コンソール(PRISM)にログインする

 https://192.168.197.21:9440/

2-5. 下記を入力し、パスワードを設定する
  ユーザ名:admin
  パスワード:admin
2-6. PRISM初回ログイン時、「NEXT username」と「NEXt password」を入力し、認証する
  [NEXT username」はNutanix NEXTに登録しているメールアドレス

2-7. [admin] > [Nothing To Do?]をクリックして2048で高得点を出す

 

 Nutanixの入門書が出ていたので思わず買ってしまいました。

まだ、途中までしか読めていませんが思ったよりも詳しいことを書いています。

GW中に読了したいです。

Nutanix Hyper Converged Infrastructure入門

Nutanix Hyper Converged Infrastructure入門

 

 

 

そんな感じです。

 

 

 

Zabbixについて

家のサーバを監視するために最近Zabbixを導入してみました。

使い始めて1ヶ月位しか経ってませんが、良いと思う点と良くないと思う点について書いてみたいと思います。

 

■良いと思う点

1. オープンソースであるため、イニシャルコストが0

 僕はUbuntu 14.04の環境にインストールしたのですが、インストールもそれほど難しくなかったです。Zabbix Agentの導入は少し苦労しました。

2. テンプレート機能

 ホストが増えると楽になりますね。同じような設定をする場合だと、めんどくささ設定する時間がかなり減ります。

 

■良くないと思う点

1. 監視抑止をスケジュールで制御できない

 バックアップや、バッチ処理およびメンテンス等のためこの時間帯は監視を抑止したいという時があると思います。それがホストやトリガー単位でできないのはめんどくさいですね。正確に言うとトリガーだと、トリガー関数のtime()やdate()を使えばできるのですが、スケジュールと閾値の設定は別にしたいです。SiteScopeは監視抑止の制御をスケジュールでできるんですが。。

2. 「概要」画面でホスト名が固定表示でないため下にスクロールするとホスト名が見えなくなる

 これはただの表示の問題なので、監視に直接関係ないところです。概要画面を見ていて下にスクロールするとホスト名が流れちゃって、どのホストが障害が起きてるかわからなくなるんですよね。Zabbixって正直表示が見やすいとは思わないです…。

3. 正規表現チェッカーがない

 ログ監視するときに、ほぼ正規表現使うと思います。普通、ログ監視に限らず、監視設定を行うとテストを実施すると思います。監視したい文字列と自分が設定した正規表現がマッチするかテストしたいのに、テストツールがないから外部のツールを使うしかないですね。そもそもZabbixって設定に対するテストができないのでは、と思ってます。そもそもZabbixのログ監視ってなんか怪しいですよね、、

 

話のネタがない+幼女問題が解けてないためZabbixについて書いてみました。

ほとんどZabbixへの愚痴になってしまいましたが、オープンソースなのでもっともっとこれから向上していくでしょう。

(自分でコミッターになればいいじゃんて思うのですが、そんな実力もないので。不甲斐なさすぎる。。)

 

ログ監視について調べるため、Zabbixのソースコード読んでいます。

次は幼女問題かZabbixのソースコードリーディングについてかな。

nginxのソースコードリーディングも放置しているのでやりたいですね。

それとNutanixも。「Nutanix Hyper Converged Infrastructure入門」買いましたが早速積んじゃってます。

 

週1くらいで更新していきたいです。

そんな感じです。

 

 

 

 

200人の赤と青の幼女のお祭り

みなさん幼女問題ってご存知ですか?

幼女とは「幻の女」の略で、論理的思考にのみ従う悪魔(天使?)のことです。

ラプラスの悪魔みたいに、超越した存在のことを悪魔っていうことがありますね。

 

ブログを書く書く言っておきながら全く書いていなかったので幼女問題に挑戦してみました。

 

問題は以下の通り。

08.200人の赤と青の幼女のお祭り

ある村に住む200人の幼女は、この時期になると髪の毛の色が変わる。
赤か青になるのだが、自分では自分が何色に変わったか見ることができない。
赤も青も少なくとも一人は存在することが保証されている。

そしてこの時期になると、幼女たちは自分の色を知るためのお祭りを開催する。
お祭り期間中、幼女たちは広場に出かけて、交流をする。
このとき、髪の色について話題に出してはいけないが、他人の色を見ることは構わない。
そして、自分の色がわかったひとは次の日広場に出かけず、家にこもる。

つまり、祭り初日は200人の幼女が広場に来るが、数日後には自分の色がわかったひとが来なくなり、最終的には誰も来なくなる。
誰も来なくなったときに、祭りは終了する。

今年の幼女の髪の色は赤100人、青100人だった
このとき祭りが終了するのは何日後か?

 

 

以下、僕の回答。

100日後。

 

赤い髪の幼女がn人、青い髪の幼女がn人いると一般化して考える。
「赤も青も少なくとも一人は存在する」を☆で表す。
また、赤い髪の幼女から連番を振り、幼女1, 幼女2, ..., 幼女n+1, ... , 幼女2nとする。

(i)n=1のとき
赤い髪の幼女が「自分は青い髪である」と仮定すると
条件☆に矛盾するため、赤い髪の幼女は自分が赤い髪であるとわかる。
青い髪の幼女も同様であるため、1日後に2人とも来なくなり祭りは終了する。

(ii)n=2のとき
幼女1が「自分は青い髪である」と仮定すると、幼女2は「自分以外3人は全員髪が青い、条件☆から自分の髪は赤い」とわかるはずである。
すなわち、幼女1は翌日幼女2が来なければ自分の髪の毛は青い、翌日幼女2が来たら赤いと判断することができる。
同様に幼女2も考えるはずである。
幼女1, 2ともに髪が赤く翌日来るため、当日自分の髪は赤いとわかる。
幼女4, 5, 6も色が自分の髪の毛の色が青になっただけで考え方は同様である。
1日後全員が自分の髪の色がわかり、2日後に全員来なくなり祭りは終了する。

(iii)n=3のとき
幼女1が「自分は青い髪である」と仮定する。
さらに幼女2がこの仮定の下、「自分が青い髪である」と仮定すると、
幼女2は「自分以外3人は全員髪が青い、条件☆から自分の髪は赤い」とわかるはずである。
すなわち、幼女2は翌日幼女3が来なければ自分の髪の毛は青い、翌日幼女3が来たら赤いと判断することができるはずである。
翌日幼女3が来るため、幼女2は自分の髪の毛の色が青いとわかる。
幼女2が2日後も祭りに来た場合、幼女1の「自分は青い髪である」の仮定が間違っていたことになるため、幼女1は2日後に自分の髪の色が赤いとわかる。
同様に幼女2, 3も考えるはずである。
幼女4, 5, 6も髪の毛の色が青になっただけで考え方は同様である。
2日後に全員が自分の髪の色がわかり、3日後に全員来なくなり祭りは終了する。

(i)~(iii)からn日後に祭りが終了すると予想できる。

(iv)n=kのとき
幼女1が「自分が青い髪である」と仮定する。
さらに幼女2, ..., 幼女k-1がこの仮定の下、「自分が青い髪である」と仮定すると、
幼女kは「自分以外2k-1人は全員髪が青い、条件☆から自分の髪は赤い」とわかるはずである。
すなわち、幼女k-1は翌日幼女kが来なければ自分の髪の毛は青い、翌日幼女kが来たら赤いと判断することができるはずである。
k-1日後に幼女2, 3, ..., kが祭りに来た場合、幼女1の「自分は青い髪である」の仮定が間違っていたことになるため、
幼女1はk-1日後に自分の髪の色が赤いとわかる。
同様に幼女2, 3, ..., kも考えるはずである。
幼女k+1, ..., 幼女2kも髪の毛の色が青になっただけで考え方は同様である。
k-1日後に全員が自分の髪の色がわかり、k日後に全員来なくなり祭りは終了する。

 

以上から100日後に祭りが終了することがわかる。

 

 

 

補足

100%合っている保証はありませんので、ご了承ください。

にしても幼女だらけの村ってすごいですね。祭りといえば僕は何故か金田一少年の事件簿の「雷祭殺人事件」を思い出すんですが、僕だけですかね?

 

次は別の幼女問題に挑戦するか、ZabbixかOracleあたりのことを書きたいです。

せめて週1の更新にしよう。。

 

そんな感じです。

SIerという業界について

最近全く日記を書いていないことに気づきましたので、久々に日記を書こうと思います。

 

技術系の記事じゃなく、今回の記事は「SIer」という日本独自の発達した謎の業界について思ったことを正直に書こうと思います。

他の方も同じような内容を書いていらっしゃいますが、それでも僕は自分が思ったこととして書こうと思います。

もちろん、全てのSIerに当てはまることはないと思います。

SIerに勤めているSEの中には真のエンジニアの方もいらっしゃると思います。

 

思ったことは4つ。

1. システムエンジニアはエンジニアではない

2. 保守・運用はできるだけ自動化すべき

3. 工数という奴隷制

4. Office3種の神器(ExcelPowerPoint、Word)の害悪さ

 

一つずつ書いていきます。

 

1. システムエンジニアはエンジニアではない

 僕は、ITの分野では「技術」は以下の二種類あると思っています。

 ①既存のものを組み合わせる

 ②新しいものを生み出す

SIerは①が得意です。多くのベンダが提供している製品の「仕様」を知っているので、それらを組み合わせて顧客の望むシステムを構築します。

あくまで知っているのは「仕様」だけです。「実装」なんて多分知りませんし、知ろうともしていなんじゃないかと思います。

プロプライエタリなソフトウェアは逆アセンブルでもしないと仕様を知ることはできませんが。。

他人の褌で相撲を取っている状態ですね。

製品の仕様についてわからないことは「問い合わせ」という魔法の言葉を使ってベンダに丸投げです。

確かに、「システム」という新しいものを生み出しているという点では②も当てはまるのかもしれませんが、社内や顧客の中だけで使われるシステムにすぎず、一般のベンダやエンジニアが使う製品やシステムは生み出していないわけです。

(これは多分自分がB2BというよりB2B2Cを強く意識しているからかもしれません)

プログラミングできるSEなんてほとんどいません。

 

「ビジネスなのだから、ただプログラミングができるだけではダメで、プログラミングすることによってビジネス(ひいては利益)につながることをすべきである。だからSEはプログラミングができるできないの議論はズレている」という意見ももちろんあります。私も一部ではその通りだと思います。企業は慈善事業じゃないですから、株主のために利益を出す必要があります。ビジネスモデルの中での話ではなく、あくまでエンジニアとしての話をすると、プログラミングできないSEなんて価値がないです。

プログラミングして製品を生み出して利益を出すという話ではありません。プログラミングができないとOS、仮想化、ネットワークなどの技術を真に理解できないからだと思っているからです。これではエンジニアなどと到底呼べません。

 

ついで言うとSIerは「実績」にやたらこだわります。「実績」というのはつまり「過去にやったことがあるかどうか」です。「実績」がないものはやたら使いたがりません。

理由は単純で「わからない」からです。いつになったら新しいものを使うんでしょうか。ずっと同じものを使い続けるんでしょうか。

 

結論:システムエンジニアはエンジニアではない。(プログラミングを学ぶべき)

 

2. 保守・運用はできるだけ自動化すべき

構築・開発したら終わりというシステムはこの世に存在しません。必ずシステムを利用するユーザーがいます。そしてシステムが正常に動いているかを確認したり、ユーザーからの追加の要望やシステムの設定変更などをする必要があります。

保守・運用は人間が作業する箇所を徹底的に減らし、自動化した方が絶対いいです。

ミスも減りますし、人件費も減ります。もちろん、全てを自動化できるわけではありませんので、必ずどこかで人間が介入しなければなりません。設定変更する必要があるかどうかなどの「判断」を人間がして、設定変更などはスクリプトなどで自動で設定できるようにすればいいのです。

 

結論:保守・運用はできるだけ自動化する

 

3. 工数という奴隷制

SIerの多くは「工数」「人月」という単位で予算を作成します。

他の方も同じ表現をされていましたが、現代に蘇った奴隷制度です。

一人一ヶ月働いたら◯円で計算します。ここに効率化なんて概念はありません。

構築・開発に10ヶ月かかるシステムを新たな技術を取り入れることによって5ヶ月にすることに成功したSEは給料が半分になるのでしょうか?

さらに言えば、人月や工数が妥当かどうかどうやって判断しているのでしょうか?

効率化すればするほど利益が減る、そんな素敵なシステムなのです。

 

結論:SIer奴隷制度を容認している

 

4. Office3種の神器(ExcelPowerPoint、Word)の害悪さ

仕様書などのドキュメントはMicrosoftが提供しているOfficeで作成することが多いです。というか、SEの大半の仕事はExcelとWordとにらめっこすることです。

本来記述している内容が最も大切なはずなのに、体裁やフォーマットなどにこだわって無駄な時間をかけていると感じました。

HTMLとCSSの分離と同じで「書く内容」と「文字などの装飾」は分離する必要があると思います。(極端なことを言うとドキュメントなんてテキストエディタでもよいかもしれない)

 

更に言うとExcelをデータベース代わりに使っていることが多いです。

エンジニアとしてあるまじき行為だと思います。

もしExcelのファイルが壊れたら? 誰かが悪意を持って改ざんしたら? いつ誰が、何から何に更新したか管理できるか? バージョン管理はできるのか?(デグレが起きたらどう対応するのか?) などなど。

 

Excelデータベースは止めて、MySQLOracleなどのDBを使って管理するべきだと思います。費用面・管理のしやすさという点ではExcelのほうがいいかもしれませんけど。。

本来最も大切な内容が、体裁・フォーマットなどによって情報量が落ち、品質が低下シている気がします。

 

結論:すべてのドキュメントをOffice、PowerPoint、Wordで書くのは止めるべき

 

 

以上です。

次はずっと考えている数学の問題について書きたいと思います。

 

 

そんな感じです。

chroot/jailは仮想化技術なのか

chrootとは

chrootは実行するプロセスのルートディレクトリを変更するシステムコールである。

chrootによって実行されたプロセスは、指定されたディレクトリを"/"だと思い込んで実行するため、それ以上の階層のディレクトリにアクセスすることはできない。これは"chroot監獄"などと呼ばれる。

chroot実行

実行環境:Ubuntu 12.04 64bit

実行コマンド:chroot /myroot ls

ディレクトリ構成

/myroot

 |_bin/bash

   |_bin/ls

   |_lib/ld-2.19.so

   |_lib64/ld-linux-x86-64.so.2

 

実行できませんでした。下記のエラーメッセージが出力された。

chroot: failed to run command ‘/bin/bash’: No such file or directory

 

今回の記事の目的はchrootを実行することじゃないから原因究明については

後ほど。でもこれなんかモヤモヤする。早く解消したい。

 

chroot/jailは仮想化技術なのか

前々からchroot/jailは仮想化じゃないと思ってました。その理由を述べます。

その前に、仮想化ってなんでしょうか。みんな当たり前に使っていて、実はよくわかっていないバズワードになっているのではと感じています。

wikipediaによると、「リソースの抽象化」って書いてますが、僕は仮想化とは「物理的な実体を論理的に一つのもの、または複数に見せかける」ことだと思っています。

そうすると、ハードディスクに書き込まれた0/1列を1つのファイルに見せるファイルシステムも仮想化ってことになるけど、これはどうなるんだろう…。OSもマルチプロセスも仮想化ってことになりますね。仮想化の技術の1つとしてマルチプロセス(物理CPUのリソースを分割するタイムシェアリング)があるのか…。卵が先か鶏が先かみたいな話になってしまいました。話を戻します。

 

chroot/jailは最上位のディレクトリをホストOSのルートディレクトリ以外のディレクトリにすることによって、ファイルシステムが複数あるように見せかけています。サンドボックスの役割を果たしています。

 

僕がchroot/jailを仮想化技術じゃないと思う理由は次の通り(というより、chroot/jailが仮想化技術と呼ばれていることへの個人的な不満になりますw)

1. カーネルが共通である

2. 囚人の見せかけられたファイルシステムは看守からアクセスできる

3. 囚人のプロセスは看守から見ることができる(killも可能)

 

 つまり、リソースの観点からは本当に閉じていないのです。

だから、chroot/jailを仮想化技術と呼ぶことに対して心理的な抵抗があります。

似たようなことを他の方もおっしゃっていました。ちなみにその方は「半仮想化」って読んでいましたね。なるほど!

 

ちなみに、抽象化は「対象から詳細を捨象し、考えるべき要素・概念を減らすこと」です。端的に言えば「こまけぇことはいいんだよ!」です。

 

最後に

他にも似たような技術にLXC/Dockerがありますね。ここらへんは全く知識がないので、ぜひ勉強していきたい分野です。

なんかただの愚痴?みたいになってしまいました。まだまだ未熟なのでさらに仮想化について学んでいきたいです。