読者です 読者をやめる 読者になる 読者になる

インフラSE日記

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

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がありますね。ここらへんは全く知識がないので、ぜひ勉強していきたい分野です。

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

VMware Workstationの仮想アダプタのIPアドレスが勝手に変更されていた件

ある日突然、VMware WorkstationのNAT用のアダプタvmnet08のIPアドレスが勝手に変更されていました。構成ファイルも変更した記憶もないし、NATサービスを再起動した記憶もないです。(そもそも仮想アダプタの構成ファイルを変更していないからNATサービスを再起動したとしても変更されないはず)

 

構成ファイルvmnetdhcp.confとvmnetnat.confを確認すると、確かにvmnet08の設定が変更されていました。

もしかすると自分で気づかないうちに何か処理をして変更してしまっているのかもしれません。わざわざ家の環境でログ監視なんてする気になれなかったので、一個一個ログを追わないといけないからめんどくさいと思ってしまっている…

 

仮想マシンIPアドレスが変更されて、以下行ったこと。

①hostsの書き換え

 DNSサーバ構築すればいいんですけどね、よくしらないからhostsに

 頼っていました。

 これを期にDNSサーバ構築してみようかな、、

②Nutanix再構築

 僕の技術力不足であることは確実ですが、Nutanixの基盤とCVMのIPアドレスの変更

 方法がわからなかったので、最初から構築しなおしました。

 1~2時間位はかかりますね。

 

めんどくさいから、IPアドレスが変わった原因については放置かも。

DNSサーバは学習する価値ありですね。やっぱりBindですかね、、

 

 

ニセコイが終わって少し哀しいです。

そんな感じです。

エクセルの関数についての疑問

最近仕事が忙しくて全く書いていないことを思い出しました。

いやすみませんずっとゲームやってました。

魔女と百騎兵

攻略しました。

 

結構長かったですね。

でも面白かったです。

(ところどころゲームバランスとかシステムへの不満が多少あるのを除いて)

 

さて、エクセルの関数を覚えるの避けてたんですが、「仕事が遅い!」

と怒られてしまってエクセルの関数をマスターしようと思って

エクセルについて勉強中です。

 

以下、エクセルの関数の疑問。

・VLOOKUP関数は何故検索する列を指定できないのか

 というより、何故こんな仕様にしたのかっていう疑問です。

 左端だけってお前…って感じです。

 RDB的な使い方を想定しているだと思います。

 主キーは常に左端にあるとは限らないのでは…?と

 

巷では「エクセルはク◯」ってなってますが、僕は胸を張ってこれを言えるほどエクセルを触っていないと思うので、言えるかどうか判断できるようになるまでエクセルを触ってみたいと思います。

 

vCenterサーバも構築したし次はもっと仮想よりの話がしたいですね。

LVSとかHAproxyのようなLPIC3のこともやっていきたいです。

 

 

 

 

そんな感じです。

 

 

 

Nutanix CEその3

ncliコマンドとacliコマンド

Nutanixには管理用のコマンドとしてncliとacliがあります。

それぞれの役割は以下のとおり。

ncli: クラスタ構成などNutanixに関する管理

acli: 仮想マシンの作成・破棄、VLAN、スナップショットなどAHVに関する管理

 

今回はacliをいじって、仮想マシンの情報を取得するコマンドを調べてたいと思います。

 

acli

acliにはわかりやすい名前空間が設定されており、目的に応じたコマンドを使います。

全部のコマンドは紹介せず、よく使いそうなコマンドだけ列挙します。

 

■core 

 AHV自体の設定を行うコマンドです。

 ・設定情報取得

  core.get

 ・設定

  JSONファイルを出力するか、DNSを使うかどうかなど設定可能です。

  core.set

 

■host

 ホストに関するコマンドです。

 ・設定情報取得

  CVMおよびホストのメモリサイズ、CPU数などが取得できます。

  host.get <ホストのIPアドレス>

  ・一覧

  host.list

 ・指定したホスト上で実行されているVM一覧

  host.list_vms <ホスト名またはIPアドレス>

■net 

 VLANに関する設定を行うコマンドです。

 ・作成

  net.create <VLAN名> vlan=<VLAN ID>  

  ・削除

  net.delete <VLAN名>

 ・一覧

  net.list

 ・詳細

  指定したVLANの情報を出力します

  net.get <VLAN名>

 ・指定したVLANが設定されているVM一覧

  net.list_vms 

 

■image

 Image Configurationに関する設定を行うコマンドです。

 ・情報取得

  指定したイメージの情報を出力します

  image.get <イメージ名>

 ・一覧

  イメージの一覧を出力します

  image.list

 

vm

 仮想マシンに関する設定を行うコマンドです

 ・作成

  VMを新規作成します。VM名以外を省略したときは

  memory=2G, num_cores_per_vcpu=1, num_vcpus=1

  で設定されます。

  vm.create <VM名> [memory=<メモリサイズ> \

  num_cores_per_vcpu=<vCPUあたりのコア数> num_vcpus=<vCPU数>

   

  ところで、vCPU当たりのコア数って逆じゃないかなぁと思ったりしてます。

  コアあたりのvCPU数なんじゃ……?

 

 ・一覧

  vm.list

 

 ・設定情報

  vm.get

 

 ・電源ON/OFF

  vm.on <仮想マシン名>/vm.off <仮想マシン名>

 

 ・VMに紐付いているNICの情報

  vm.nic_get

 

  見た感じ、各VMの実行状態(running, stop, suspendなど)の一覧を出力する

  コマンドはないみたいです。ちょっと不便。

 

とりあえずこれくらいですかね。本当はコマンドを使って仮想マシンを作成してOSインストールまでやりたかったんですが、思ったよりリソースが足りなくてNutanix上で仮想マシンを立ち上げることができなさそうです。CVMが結構メモリをもりもり食ってるので、CVMのメモリ割り当てとか変更する方法を調べないといけないです。

 

Future Work

  1. acliコマンドのみで仮想マシン・VLAN・イメージを作成する
  2. Prism以外のコンポーネントの働きを理解する

 

そんな感じです。

 

Ansible始めました①

Ansibleとは

Ansibleは構成管理ツールの1つです。Infrastructure as a Codeという言葉があるように、コードによってサーバ構成を制御・管理しようという発想です。イマドキのインフラ系SEはコーディングくらいできないといけない、ということですね。

 

Ansibleを使うと以下のことが出来ます。

  1. サーバ構成(状態)をコードによって管理できる
  2. アプリケーションをインストールして設定し使用できるようにする(デプロイ)

 

Ansibleというツール1つで全てのサーバ構成を管理し、アプリケーションをデプロイすることができるのです。すごい!

 

話はそれますが……

SEはよくパラメータシートという不思議なドキュメントを書きます。

サーバに設定するべきパラメータ名と値の組を書いたドキュメントです。

一旦このパラメータシートを作成し、パラメータシートに書かれている通りに手動で設定し、パラメータシートに書かれている値通りに設定されているか手動でテストします。個人的にこの作業、すごい無駄だと思っています。手動で設定するとミスは増えるし(人間は必ずミスする生き物)、テストもエビデンスを取得するとはいえ人間が行う以上やはりミスはつきものです。

そしてパラメータシートはエクセルで作成されることが多いのですが、データとデザインが一体化していて非常にめんどくさいです。HTMLとCSSが分離した理由も個々にあると思ってますが、データとデザイン(レイアウト)は本質的に全く別のものです。

 

何が言いたいかというとAnsibleを使うと煩雑なドキュメント作成から開放されて、コードで一貫したサーバ構成・管理ができるのです。gitを使えばバージョン管理もできますからね。

インフラ系SEも積極的にAnsibleを使って行くべきだし、使えないとこれから淘汰されていく時代なのかもしれません。

 

実行環境

実行環境は以下のとおり。

 

OS: Ubuntu 14.04 64bit(仮想マシンESXiサーバ上の仮想化マシン)

CPU: 2 vCPU

メモリ:4GB

ホスト名: ansible.localdomain

 

Ansibleのインストール

Ubuntu 14.04にAnsibleをインストールする手順を示します。

他のバージョンのUbuntuや、違うディストリビューションだと手順が異なることもありますので、ご注意ください。

  1. Pythonパッケージのインストール
    sudo apt-get install python-software-properties
  2. レポジトリの追加
    sudo add-apt-repository ppa:ansible/ansible
    ユーザ名: ansible
    PPA名: ansible
  3. 登録されているサーバからパッケージリストを取得する
    sudo apt-get update
  4. Ansibleインストール
    sudo apt-get install ansible
  5. Ansibleバージョン確認
    ansible --version

 

 以下のようになれば成功。

 

f:id:chemicallogical:20160619132503j:plain

 

 次回からはもう少し本格的にAnsibleを使っていこうと思います。

 

 

 

そんな感じです。