エアコン設置完了

R0012091.JPGよーやくエアコン設置が終わりました。当初はエアコン設置も自前で行けるんでね?って思ってたんですが、真空ポンプが必要ってことで、こりゃームリ!ってことで、父親の友人の電気屋さんに工事依頼したんですが・・・・・この作業待ちで3週間くらい止まってました。

ラック設置

さーて、いよいよ本格的に機材の搬入をしましょう。まずはラック。

R0012092.JPGすでにUPSとか、サーバ機とか置いちゃってますが、ラックを起きます。

自宅ラックの人たちの間でも、「もうメタルラックは捨てて、19インチラックを入れるべき」っていう意見があるのですが、うちはメタルラックです。理由はラックマウント機器が少ないから。ストレージがQNAPのタワーというかボックス型NAS、サーバもほとんどがタワー機なので、19インチラックを入れたとしても、メタルラックなりが必要なんですね。

じゃあってことで、全部メタルラックです。

ちなみに、メタルラックシリーズといえば、奥行き 46cm しかなかったんですが、新たに奥行き 61cm シリーズが追加されました。19インチラックに収めるような機材の場合、奥行き 46cm だとはみ出しが多くて安定性に問題ありなんですが、奥行き 61cm の棚にすると安定して置けます。

というわけで、サーバ機器用として 610 × 1200 のラックを一台、ストレージ機器用として 460 × 1200 のラックを1台、L字型に置くことにしました。

全景を見渡すとこんな感じ

R0012096.JPGもーちょっと広い建物にしたかったなぁーと思わないでもないですが、まぁそう言い出すと際限なく広くなりそうなので、これくらいで。

電源配線

電源関係を配置していきます。

R0012101.JPG特に電源が2系統以上あったりする場合は、ラベリングが非常に重要。これは絶対にやらないとダメです。

「どうせ一人で管理するんだし、線なんてたどればいいんだよ」って思ってた過去の私、そこに正座。「え?この線ってどっち?」とか言って引っ張ったらコンセント抜けてぎゃー!!って叫ぶことになります。

ケーブルは両端にラベリングしましょう。

R0012100.JPGケーブルにラベリングするときは、ラベル付きのタイラップが便利です。電気工事系の資材を扱ってる店の、タイラップコーナーにほぼあるので、探してみてください。

R0012098.JPGUPSも設置します。重いのと、ラック設計の慣例に習って、一番下の棚に。

R0012102.JPGメタルラックにそのまま置くと、ゴム足が棚板の隙間から下に落ちるので、硬質シートを敷いておくと良いです。

イバナ物置DCにすると、天井はそんなに高くありません。190cm くらいの天井高です。そして、断熱材を固定するために、金属の梁が入ってます。

R0012095.JPGつまり、こんな取り付け方ができます。案外これが便利。ちなみに、使ってるACタップはたのめーるオリジナルブランドのタップ。3Pコンセントでロック機能付きのACタップってけっこー高いんですが、たのめーるのこれ、安いんですよね。

機材搬入

ネットワーク機材を搬入して配線します。

R0012114.JPGR0012115.JPGポート数、多すぎだろ?って気もしますが、気にしなーい

R0012119.JPGストレージ装置。QNAPを全部で5台入れる予定ですが、3台は旧サーバ室で稼働中なので、まずは2台を搬入。稼動状態に入れて、Storage vMotion を使いながら、残り3台も順次搬入の予定です。

R0012120.JPGサーバ機は運用終了しているマシンも含めて6台を搬入予定ですが、こっちもまだ半分しか搬入できてません。vMotion で順次仮想マシンを空にして移設予定です。

Storage vMotionをちまちまやる必要があるので、全機器搬入には1ヶ月くらいはかかるかなぁと。

R0012122.JPG運用を開始して最初の夜。データセンタ内の証明を消すと、をを!!なんかデータセンターっぽい!

商用データセンターとかで仕事終わって退館するとき、証明を消すとマシンルーム全体がLEDの光だらけになるんですね。DC作業が無事に終わったあとにこれをみると、おぉ、綺麗だ!って気になるんですよ。まぁ、作業がうまく終わらず、宿題持ち帰りになった場合は、そんな余裕もまったくないんですけどね。

インシデント

機材搬入中に、部外者の侵入をゆるしてしまいました。インシデントです。

R0012112.JPG機材搬入中はドアを開けっ放しにするので、DC運用者の皆さん、注意しましょう。

Zabbix4が出ました。ちうても、もう1,2ヶ月前ですが・・・・・

いい加減、Ver.2.0 の Zabbix もどないかせんとなぁ、と思ってたのですが、思い切ってあげてみることに。とはいえ、切り替えなんてムリだしょ?ってことで、現行のVer.2.0と、Ver.4.0を並行運用します。

まぁ、仮想環境なんで、Zabbix サーバマシンをもう一個作るのはそんなに難しい話じゃない。Zabbix Agent 側も上位互換があるので、当面は今はいってるAgentのまま行けるっしょ

ちなみに、Agent 側は、zabbix_agentd.conf に Server=server1,server2 とコンマ接続でサーバを列挙すれば、両方から監視できます。

Zabbix Server Ver.4 から Agent Ver1 から Ver.4 まで監視できます。逆にServer Ver.2.0 では、Agent Ver.4 は監視できませんでした。


さてさて、Zabbix 4 なんですが、立ち上げてみたら一個問題が。

SNMP でスイッチを監視しようとしたら、ポートごとのインターフェーストラフィックが取得できない。

zabbix-1.png「そんなOIDねーよ」って言われちゃいます。

なんで・・・?と調べてみたところ、取得してるMIB値が net.if.in[ifHCInOctets.1] になってるんですね。

MIB 値 ifHCInOctets ちうのは、インターフェースごとの In 方向オクテット数なんですが、64-bit カウンタです。

SNMPって、もともと数値は 32-bit までだったのが、数年前(もう10年くらい経つ?)から64-bit カウンタが使えるように拡張されました。

なもんで、ifHCInOctets は必ず対応してるとは限りません。一方、32-bit カウンタはifInOctets という MIB で、こっちはまぁほぼ間違いなく対応してます。

ちうわけで、Zabbix 4 に 32-bit インターフェースカウンタを読ませましょう。という話です。

要約したら、「Zabbix のテンプレート弄って追加しろ」ってだけなんですが、

[テンプレート]-[Template Module Interfaces SNMPv1]-[ディスカバリールール]-[Network Interfaces Discovery]-[アイテムのプロトタイプ] を開きます。

[Interface {#IFNAME}({#IFALIAS}): Bits received] をクローンすると早いでしょう。32-bitカウンターを追加します。

zabbix-2.png変更するのは、名前(64-bitカウンタとかぶるとダメなので)、キー、SNMP OID。

名前キーOID
Interface {#IFNAME}({#IFALIAS}): Bits received net.if.in[ifHCInOctets.{#SNMPINDEX}] 1.3.6.1.2.1.31.1.1.1.6.{#SNMPINDEX}
Interface {#IFNAME}({#IFALIAS}): Bits received(32-bit) net.if.in[ifInOctets.{#SNMPINDEX}] 1.3.6.1.2.1.2.2.1.10.{#SNMPINDEX}
Interface {#IFNAME}({#IFALIAS}): Bits sent net.if.out[ifHCOutOctets.{#SNMPINDEX}] 1.3.6.1.2.1.31.1.1.1.10.{#SNMPINDEX}
Interface {#IFNAME}({#IFALIAS}): Bits sent(32bit) net.if.out[ifOutOctets.{#SNMPINDEX}] 1.3.6.1.2.1.2.2.1.16.{#SNMPINDEX}

 既存の 64-bit カウンターと並べて、こんな感じの監視キーを作ってあげます。

zabbix-3.pngこれで無事監視できるようになりました。

内装工事

さて、建物できたので、よーやく内装関連です。電源関係とネットワーク関係。データセンターなんですから、電源とネットワークが来ないことには話になりませんわな。

まぁ、Tier1 以上の本物だと、その外にも消火設備だとか、入退室管理システムだとか、あれこれあるですが、それはやりません。

というわけで、まずは地面に埋めたボイド管にケーブルを通します。いきなりパイプにケーブルを押し込んでも、そんなもん入るわけないので、まずはケーブルを引っ張る針金をとおします。

R0012013.JPG白飛びしてて見にくいですけど、右手に伸びてる青っぽいのが通した針金です。

んで、これを引っ張ってまずは電源ケーブル。

R0012014.JPGシステム用の正、副に加えて、エアコンとか用の予備で3系統引き込んでます。さらにケーブルを通しましょう。

R0012015.JPG手前の灰色が先に通した電源。オレンジ色のが光ファイバーケーブル。黒いのがテレビアンテナ用の同軸線です。なお、この光ファイバーケーブル、ヤフオクで買った代物なんですが、500フィートのリールが3個で1万円という代物。この工事が終わってもまだ1本目のリールを使い切ってません。残ってるケーブル、何に使おう・・・・?

ケーブルをデータセンタ室内に引き込むとこうなります。

R0012018.JPGんでまって・・・・・どーやらこのあたりから、父親がすごいやる気を出しまして。電源回りの内装がえらい本格的に。当初の計画では、ケーブルの先にOAタップ付けときゃいーだろ!って思ってたら、こんなんできてきました。

R0012044.JPG鼠色の箱はブレーカ箱です。あと、室内コンセントはこんな感じ。

R0012055.JPG冬はエアコンなしで行けるようにということで、家庭用の換気扇も設置。

R0012046.JPGそれから、室内照明

R0012047.JPGこの照明装置、オーム電機のLT-NLDM14D-HLっていう製品なんですが、いかにも!!っていう感じのLED照明。最近のデータセンターって、照明がLEDなのがほとんどなんですが、この照明で照らすと、いかにもデータセンターって雰囲気になります。(個人の感想であって効果をうんうんかんぬん)

光ファイバーの終端は例によってSCコネクタをつけて、木の板に固定します。実際の接続は光パッチケーブルで。

R0012049.JPGなお、エアコンはさすがに自前で工事は難しいので、電気屋さんにお願いする予定です。

エアコン取付が終わったら、いよいよマシンを入れていきましょうかね。

お断り

このネタは萌えるか萌えないかというネタです。なので、次のような人々はご遠慮ください。

  • 「好き/嫌い」と「良い/悪い」「正しい/間違ってる」を区別できない人
  • 萌えが気に食わないからと存在を消滅させたいような連中
  • 人工知能が人間の領域を犯すとか言ってる人たち

人工知能を萌えさせてみよう

まぁ、人工知能ちうか、Deep Learningしてみようという話です。

ことの発端は Twitter。Twitter眺めてると、イラストを投稿してくれる絵師さんがけっこーいらっしゃいます。で、いいなぁこれ!ってなったら、保存しちゃうわけですが、TL見てないときにイラストが流れてたりすると、見逃してしまうわけです。

んじゃ、API 使って片っ端からダウンロードしたらどだろ?と

ダウンロードしてみました。

DownloadPlain.pngん・・・・・・期待してたのと、ちょーっと違うかなぁ。期待してたイラストダウンロードされてはいるんですが、なんかそうじゃないのもけっこー混ざってる。実写写真とか、DVDとかの宣伝画像とかとかとか・・・・

言い換えると、萌える画像と萌えない画像が混ざってる。

しかも、自動でダウンロード走らせてしまったもんだから、1000万個ちかくのファイルができてしまった。

こんなの、とーてー目視で振り分けなんぞやってられん!ということで、自動ふるい分けできんか??と考えたわけです。

これって、いってみりゃ画像認識なわけです。画像認識と言ったら Deep Learning!

さぁ、Deep Learning で萌える画像と萌えない画像を識別させてみよう!

よくあるDeep Learningは、「これは犬の写真です」「これは自動車の画像です」みたいな、物の形を識別するものがほとんどです。同じ仕組みで、「萌えるか萌えないか」すなわち、「好きか嫌いか」を識別できるのか??というのが新しい点かなと。

教師データの準備

まずは教師データの準備をば。

こればっかりは手動で振り分けるしかありません。手作業でこれはイイ!という画像を集めます。

萌える画像をごそっと。おおよそ3000枚

GoodTeacher.png次に萌えない画像もやっぱり3000枚ほど。あくまでも萌えない画像、すなわち、私が好きじゃない画像です。良いとか悪いとか、うまいとか下手とかじゃありません。念のため

BadTeacher.pngなお、実際には「うーん、これはどっちだ。判断できん」という保留も2000枚くらい出てきてます。これはDeep Learningの教師データには使いません。

しっかしまぁ、どっちもエロ画像ばっかりやな(を

スクリプトをごりごり

学習させるためのデータが準備できたので、次はDeep Learningの実装。

import os
import numpy
import chainer
import chainer.functions as func
import chainer.optimizers
import random
import cv
import cv2
import io
import sys
import psycopg2
import pickle
import datetime
import locale

from PIL import Image

locale.setlocale(locale.LC_ALL , 'ja_JP.eucJP')

"""
model = pickle.load(open("model" , 'rb'))
"""
model = chainer.Chain (
    conv1 = func.Convolution2D( 3, 32, 3, pad=1),
    bn1   = func.BatchNormalization(32),
    conv2 = func.Convolution2D(32, 32, 3, pad=1),
    bn2   = func.BatchNormalization(32),
    conv3 = func.Convolution2D(32, 32, 3, pad=1),
    conv4 = func.Convolution2D(32, 32, 3, pad=1),
    conv5 = func.Convolution2D(32, 32, 3, pad=1),
    conv6 = func.Convolution2D(32, 32, 3, pad=1),
    l1    = func.Linear(2048 , 512),
    l2    = func.Linear(512 , 2))

def forward(x):
    x = chainer.Variable(numpy.array(x, dtype=numpy.float32), volatile=False)
    h = func.max_pooling_2d(func.relu(model.bn1(model.conv1(x))), 2)
    h = func.max_pooling_2d(func.relu(model.bn2(model.conv2(h))), 2)
    h = func.max_pooling_2d(func.relu(model.conv3(h)), 2)
    h = func.max_pooling_2d(func.relu(model.conv4(h)), 2)
    h = func.dropout(func.relu(model.l1(h)))
    h = model.l2(h)
    return h

optimizer = chainer.optimizers.Adam()
optimizer.setup(model)

def lean(pic , priority):
    t = chainer.Variable(priority.astype(numpy.int32))
    h = forward(pic)
    optimizer.zero_grads()
    d = func.softmax_cross_entropy(h, t)
    d.backward()
    optimizer.update()

    if(h.data.argmax() == priority):
        return True
    else:
        return False

def load_norm_img(imgpath):
    img  = Image.open(imgpath)
    img  = img.resize((128 , 128))
    img  = img.convert('RGB')
    img  = numpy.asarray(img)
    img  = img.transpose(2,0,1)
    img  = numpy.expand_dims(img, axis=0)
    
    return img

def dir_lean(good_dir , bad_dir):
    good_files = os.listdir(good_dir)
    random.shuffle(good_files)
    bad_files  = os.listdir(bad_dir)
    random.shuffle(bad_files)
    num = min([len(good_files) , len(bad_files)])

    hit = 0
    count = 0
    for i in range(0 , num):
	count += 2
	file = good_dir + "/" + good_files[i]
	img = load_norm_img(file)
        pri = numpy.array([0])
	if(lean(img , pri)):
	    hit += 1
	file = bad_dir + "/" + bad_files[i]
	img = load_norm_img(file)
        pri = numpy.array([1])
	if(lean(img , pri)):
	    hit += 1
    per = (hit * 100) / count
    print(str(hit) + " / " + str(count)) + " ( " + str(per) + "% )"

for i in range(0 , 20):
    print("Epoch " + str(i))
    dir_lean("good" , "bad")
    print(">>Update saved module<<")
    pickle.dump(model , open("model" , 'wb') , -1)

こんなかんじ!

いやね、このBlogネタ書こうと思ったのは、このコードを書きたかったんですよ。このコード書くときに、Chainerってどーやって書くの?だれかサンプル公開してないの??って思って調べたんですが、全然出てこなかったんですよ。なもんで、じゃあ動くのできたらまるごと晒してみようかなと。

ただーし!このコード、拾い物の情報とか試行錯誤とかして書いたやつなので、本当に正しいの?と言われたら、さぁ?としか・・・・間違ってたら、だれかおせーて。

主要な部分を解説しましょう。

def load_norm_img(imgpath):
    img  = Image.open(imgpath)
    img  = img.resize((128 , 128))
    img  = img.convert('RGB')
    img  = numpy.asarray(img)
    img  = img.transpose(2,0,1)
    img  = numpy.expand_dims(img, axis=0)

    return img

画像をファイルから読み込むサブルーチン。ファイルから読み込んで、128x128の解像度に縮小します。読み込んだ画像は当然二次元のデータですが、ニューラルネットワークに突っ込むには一次元配列にしないといけない。なので、そのための一次元化処理もこの中でやってます。

"""
model = pickle.load(open("model" , 'rb'))
"""
model = chainer.Chain (
    conv1 = func.Convolution2D( 3, 32, 3, pad=1),
    bn1   = func.BatchNormalization(32),
    conv2 = func.Convolution2D(32, 32, 3, pad=1),
    bn2   = func.BatchNormalization(32),
    conv3 = func.Convolution2D(32, 32, 3, pad=1),
    conv4 = func.Convolution2D(32, 32, 3, pad=1),
    conv5 = func.Convolution2D(32, 32, 3, pad=1),
    conv6 = func.Convolution2D(32, 32, 3, pad=1),
    l1    = func.Linear(2048 , 512),
    l2    = func.Linear(512 , 2))

次にモデル定義。これがニューラルネットワークの定義そのものです。畳み込み処理を2段通したあと、2048ノード、512ノード、2ノードの3層ネットワークです。
コメントアウトしてあるpickle.loadは、学習させたネットワークを保存しておいたものを読みだすときに使う処理。メインループでpickle.dump使ってmodel変数の中身、つまりネットワークをファイルに書き出してますが、これを読み込む場合はコメントアウトしたload処理を有効化して、変わりにmodel変数の定義をコメントアウトします。

def forward(x):
    x = chainer.Variable(numpy.array(x, dtype=numpy.float32), volatile=False)
    h = func.max_pooling_2d(func.relu(model.bn1(model.conv1(x))), 2)
    h = func.max_pooling_2d(func.relu(model.bn2(model.conv2(h))), 2)
    h = func.max_pooling_2d(func.relu(model.conv3(h)), 2)
    h = func.max_pooling_2d(func.relu(model.conv4(h)), 2)
    h = func.dropout(func.relu(model.l1(h)))
    h = model.l2(h)
    return h

つぎはネットワークの伝搬処理の実装部。ニューラルネットワークの第一層から第二層への伝搬はRelu関数とDropout関数を通して、第二層から第三層へは関数なし、つまりは線形関数で伝搬します。

def lean(pic , priority):
    t = chainer.Variable(priority.astype(numpy.int32))
    h = forward(pic)
    optimizer.zero_grads()
    d = func.softmax_cross_entropy(h, t)
    d.backward()
    optimizer.update()

    if(h.data.argmax() == priority):
        return True
    else:
        return False

最後に学習処理の本体。forwardで順方向伝搬をしたあと、伝搬結果を評価して、逆伝搬して、モデルをアップデートする。という処理をそのまんま流してます。

この関数と、forwad() 関数の中でVariable()関数を読んでますが、どうやらChainerで使う変数次元に合わせる関数のようで、お約束的に使うっぽいです。

さて結果は

教師データもそろった。処理系もできた。さぁ学習しましょう。

スクリプト内でパーセント値をprintしてる部分がありますが、画像を準に学習する際に、順伝搬させてその結果が期待している判定に一致した率を表示してます。

エポックが進むに従い、この割合が上がっていくことを期待して眺めるわけですが、なんと20から30エポックくらいで90%程度に達して、それ以上は上がらなくなりました。9割正しく判定できたら、まぁ十分じゃね??

というわけで、自動判定をしてみます!

まずは萌えると判定された画像

GoodResult.png次に、萌えないと判定された画像

BadResult.png赤四角で囲ったのが判定ミスしてるものです。

完璧とは言えないけど、まずまず十分に使い物になるレベルじゃね?

どっちにしたところで、エロ画像ばっかりやんけ!っていうのはおいておいて

建築!

さーて、ようやく建築です。といっても、基本的にイナバのマニュアルどおりなんですが。マニュアルどおりに建てるだけなら、たぶん1日でできるんじゃないかしら?

まずは土台を組んで、基礎に乗せます。

R0011987.JPG土台の四隅は地中に埋め込んだ基礎を使って固定します。

R0011988.JPG基礎を固定したら、柱を立てます。

R0011989.JPG次は梁を乗せます。元の部材が良くできてて、柱に引っ掛けてからねじを締めるだけ。これは良く考えられてますねぇ

R0011993.JPG以上で骨格ができるので、次は板をつけて回ります。屋根板と壁板の取り付け。

R0012004.JPG

壁板と屋根板は板状の固定パーツで柱や隣の板に固定してからねじでとめます。と言っても、これは説明しにくいので、実際に建てる人はマニュアルをよーっく見てくださいませ。マニュアルの絵と実物を見比べるとまぁなんとかなるでしょう

R0012000.JPGマニュアルどおりに組んでいくと、こんな感じで色違いの金属部材を取り付けることになります。これらは、室内に断熱板を固定するための固定具です

R0012005.JPG取り付ける断熱材はこんな感じ。発砲スチロールの板で、この写真は裏面。ちょーっと薄い気もするんですが、その真価は来年の夏にわかるでしょう。

R0012011.JPG断熱材はそのまま内装材を兼ねてるので、断熱材を取り付けると、内装が完成します。

R0012016.JPGドアを取り付けて、建物の囲みが完成します。

R0012017.JPG

物置の部材として同梱されてるものはこれですべてで、建物としての役割は十分です。が、壁と天井が全面断熱材に覆われてるのに、床だけが金属の板だったりするんですね。

R0012032.JPG床下からの湿気とか、断熱とか、入室時の歩き心地とかを改良したいので、養生シートと合板を敷きます。

R0012036.JPG以上で建物は完成。

メーカはおそらく基礎工事含めて2,3日でここまでくることを想定してるのかなぁという感じですが、基礎工事だなんだを含めたら、そろそろ一ヶ月はかかってるような・・・・

配線の準備

データセンターなので、当然のことながらネットワークと電源は必須。

当然ながら、有線配線します。自宅の裏庭に建てるので配線も自分でできます。まぁ、電気工事のうち、ブレーカーさわったりは電気工事士の資格が必要なんですが、これは父親が資格もってるのでお任せの方針で。

実際に配線するのはもっと後なんですが、線を通す準備だけしておきます。

使うのはこれ

R0011965.JPGPF管という配線を通す専用の管です。

まずはPF管を埋めるために溝を掘ります。

R0011967.JPGR0011969.JPGR0011971.JPGそして、管を入れる

R0011975.JPG最後に埋める!

R0011982.JPG管の端は接続箱につなぐわけですが、この作業はまだ保留。

R0011976.JPG管を通したりするために、木の根を切ったりしてますが、まぁ大丈夫でしょう。

15mくらい溝掘って埋めるのにほぼ一日かかり。全身筋肉痛になりますた。

なお、この管3本に電源3系統、光ファイバー4対、テレビアンテナ用同軸ケーブル1本を入れる予定ですが、それはまた今度

基礎工事

物置を買ったので、とーぜん建てます。どうやらイナバ物置を買って2,3万円払えば建ててくれるらしいのですが、自前で建てます。

でも建てる前に、基礎工事・・・・・のさらに前に整地から

整地

しょにょ1の写真を見てもらうとわかるように、木が茂ってます。

邪魔なので、植木を移動します。

R0011960.JPGそして、整地

R0011963.JPG植木を移動して、土を均してます。

転倒対策

そもそも設置場所を地上に変更したのが台風対策。いくら風が強くないことを期待できる場所にしたとしても、まだ飛んでいくかもしれない。

ということで、建物の隅にアンカーを入れてます。

PA050324.JPGこのネジ棒の下にはこんなものが埋まってます。

PA010250.JPG白い容器の中はこんな感じ

DSCN0723.JPGDSCN0724.JPGネジとか鉄筋を入れてコンクリートを流し込んでます。

ちなみにコンクリートって、砂:砕石:セメント=3:3:1(重量比)を混ぜて水でこねて作ります。

DSCN0717.JPGDSCN0718.JPGDSCN0720.JPGDSCN0721.JPGなお、このコンクリート、水入れすぎ。建築物に使ったら怒られるレベルですが、ただの重りなんで今回は問題なしです。

基礎打ち

整地がおわって、アンカーが埋まったので、基礎打ちします。

R0011985.JPG市販のコンクリートブロックを並べたわけですが、この並べ方はイナバ物置の組み立てマニュアルに乗ってるので、そのとおりに並べましょう。

データセンターは自作して所有する時代だそうです。

コンテナデータセンターを自作した方がいらっしゃり、大騒ぎになっていたりするわけですが、これにより、データセンターは自作し、所有する時代に入ろうとしています。

それにしても、この方のデータセンター作成記、工事してコンテナ置いたところでご本人の記事が途絶えちゃってるんですが、どこか別のサイトで公開されてるんでしょうか・・・?

さてまぁ、私が自宅にサーバをおいてかれこれ20年。世の中、ご家庭にサーバがあって当たり前の時代になったわけですが!

DSCN0741.JPG.jpegうちの場合、物置部屋となってる部屋の一画に、ルミナスメタルラックに載せてます。

自宅にサーバを置くと、あれこれ問題があるわけです。

  • ファンの音がうるさい
  • ケーブルとかに足ひっかけそう
  • 空調をかけたいけど、部屋全体を冷やすのはもったいない
  • 2018年夏、冷房なしで稼動しつづけるサーバは見ててかわいそう

そりゃまぁ、データセンターが必要でしょうとも。

というわけで、時代の流れにのっとり、データセンターを自作してみようと思うわけです。

まずはコンセプトを定めましょう

!!自宅の敷地内に、目標予算50万!!

先のSyuhei氏は不動産競売を使ったとかで、おおよそ500万円でできたとか。一般に市販のコンテナデータセンターを設置すると5000万から1億なので、氏は10分の1で実現したようですね。同じことをやってもしょうがないので、さらに10分の1、目標予算は50万で。

あと、電気だ回線だは今あるものを使いたい。よって、自宅敷地内というのが条件。幸いにもこっちは某近畿の田舎にある農家。土地はある・・・・はず。

どこに設置しよう?

じゃあ、どこに設置するか。最初に思いついたのがここ。DSCN0709.JPG.jpeg自宅のベランダ。普段使ってないし、広い空間もあるのでここに決めたぁ。と思ってたんですが、2018年の台風21号、ちょっと奥さんみました?あの台風??

アカン。こんな二階のベランダに置いたら台風に耐えられん。

ちうわけで、別候補DSCN0711.JPG.jpeg自宅裏の余ってる土地。おおよそ2m、5m四方の空間。隣の家が迫ってるので日当たりもよくなく、植物育てるわけにもいかない、あまってた土地。ここにしよう。

建物はどうする?

コンテナデータセンターは、海上輸送コンテナを使うからこそ、コンテナデータセンターなわけですが、コンテナって、安ければ1個1万円くらいで買えたりするんですが、輸送費だけで100万くらいかかるとか。そんな高いのはイヤン。ちうわけで、プレハブ物置 イナバ NXP-50STを使います。100人のってもだいじょーぶ なイナバ物置です。さて注文、DSCN0705.JPG.jpegうをを、でかい。この写真に写ってるのは、外枠とかの材料だけで、このほかにドアだとか、内装用の断熱材だとかで、この写真の1.5倍くらいの物資です。

さーて、これを組み立てきれるのか??

なお、タイトルですが、Twitterで、イナバ物置つかってデータセンターつくろう。って話題にしたら、こんなツィートが飛んできたので、そのまんま使わせてもらいました。

光ケーブルを自作する

| コメント(0) | トラックバック(0)

Ethernetケーブルといえば当然ながら自作するもので、ふつーはRJ-45コネクターとカシメ機を常備しているものかと思うのですが、Ethernetって光もあるんですよね。

あれ?光ケーブルの自作って・・・・・・?ってお話です。

建物間を結ぶ光ケーブルが必要になったんですが、長い光ケーブルって高いんですよね。なもんで、ヤフオクをごそごそ。

R0011739.JPG電線とかに張ってある屋外用のケーブルでございます。これと同じものが3個で1万とかなんで、とりあえずポチ。

さて、ケーブルだけ手に入れたはいいものの、コネクタをつけるのが厄介なのです。

まずは工具

R0011764.JPGそんな何度も使うようなもんでもないので、安く上げたいなぁと。というわけで、安い加工工具をポチ。あと、ファイバーケーブルにはケーブル補強にやたら強い繊維を使った補強材が入ってるので専用のはさみが必要だったりするのです。(あ、写真にはさみいれるの忘れた)

そして、取り付けるコネクタ

R0011749.JPGどれが使えるかなぁと、いろいろ買ってみたんですが、まず必要なのが左上の仮設用コネクタ。これが便利。本来はケーブルの方端にSCコネクタを仮付けして、もう一端に正式なコネクタをつけるためのものなんですが、お手軽さゆえに、この仮設コネクタだけで最終形態にしちゃうのも手かなと。ただし、1個2000円もするのでお高いです。

んで、仮設じゃなくて正式なコネクターとしてつけるのが右のSANWAのコネクター。こっちだと、1個あたり500円程度なので、運用系はこっちにしたいところ。

あと、左下のコネクタ、これは使いこなせなかったので、省略。


さて、それじゃコネクタ加工をはじめましょ。まず、光ファイバはガラスなんで非常にもろい。なにかのはずみにケーブル引っ張ったりすると、あっさりと折れたり切れたりするので、ケーブル端を固定することを考えましょう。

R0011915.JPGこんな感じで木の板に固定。ただ、これをやってもやっぱり失敗して折ったりするので、ケーブル外皮は長めに剥いておいた方がいいです。

次にケーブルの被服剥き。

R0011917.JPG工具に入ってる、黄色い取っ手のストリッパーで剥きます。

ここで注意。このストリップはストリッパーを強く握って、ケーブルの先端までしっかりと剥き切ること。

R0011740.JPG光ファイバーを剥いたところをよーーっく見ると、被服が2重になってるのがわかります。剥いた根元付近に、芯線と同じような透明被服があるのが見え・・・ますか?この透明被服をしっかりと剥いておかないと、ケーブル加工に失敗します。

次はケーブルの先端加工。これが光ファイバー加工の肝中の肝です。これをちゃんとやっておかないと絶対にリンクしません。

使うのは工具写真に写ってる真ん中の先端加工専用の工具。単体でも売ってるみたいです。これにストリップしたケーブルを設置する。

R0011757.JPGやや右よりの丸いのがカッターの刃。で、その左右両方に黒いスポンジ(?)があるんですが、ケーブルの先端が必ず右のスポンジに乗るように設置します。右のスポンジまで届いてない状態でカッターを動かしてもケーブルは切れません。あと、ケーブルストリップの際の透明被服が刃の部分に残ってると、やっぱりケーブルは切れません。

R0011758.JPGこんな風に刃のところでケーブルが切れていれば成功です。

R0011923.JPG仮設用コネクタをつけてみましょう。丸いボタンを押しながら慎重にケーブルを差し込んでいきます。

R0011930.JPGそのうち、コネクターの先端からケーブルが出てくるので、出てきたらケーブルの先端とコネクタの先端が一致するところまで引き戻します。(この写真は先端からケーブルが出た状態。ここから引き戻す)

ここまで来たら、ケーブルに光が通せるはず。

R0011931.JPG片方のケーブルができたら、SFPに接続してリンク状態を見ながら加工したほうが楽です。

R0011932.JPGSC-FCの変換パッチケーブルを準備しておくのを忘れないように。

もう一方をSANWAのコネクタにつけます。

R0011936.JPGこの写真は、もう一方の仮設用コネクターもSANWAコネクタに付け替えたあとですね。

SANWAコネクタをつけるときは、ケーブルとコネクタを接着剤でくっつけます。

R0011938.JPG接着剤を爪楊枝にとって、ケーブルに塗りつけながらケーブルをコネクタに差し込んでいきます。

私が使った接着剤は、安定の SuperX

R0011937.JPG最後にリンクがちゃんとあがることを確認しましょう。

R0011934.JPGこのチェックは光ケーブルをループバックさせて、同じSFPのRXとTXを直結してます。とーーーーぜんですが、運用中のスイッチでやらないこと。ループしちゃいます。

端末とかをつないでなければ、スイッチにパケットが入らないので、ループさせても問題ありません。

さぁ、光ネットワークを運用しませう。

Elasticsearchって聞くんだけど、なんだろう??

と思ってたわけです。とりあえず動かしてみるとか、勉強会行ってみるとかしたんだけど、どーにも分からん。そのうち、どーやらJSONというものが関係してるらしいと知って、JSONについて調べてみたら・・・・・あ、あっさり理解できた。

ちうわけで、簡単にまとめてみる。

まずは、よく見かける説明を

Elasticsearchはオブジェクト指向型データベースで、検索に特化したものであある

ポイントは、オブジェクト指向型データベースってところなんですね。で、データベースじゃなくて、オブジェクト指向型のドキュメントというのがあって、XMLとかJSONとかymlとかがあるわけですね。

つまり、オブジェクト型ドキュメントがわかれば、そのオブジェクト指向型ドキュメントを溜め込んでくれるデータベースがオブジェクト指向型データベースとなる。

オブジェクト指向型ドキュメント、というか、JSONって?そこまで分かればググろうや。 じゃなくて、まぁそれが肝なんですが、よーするに箇条書き文章と思えば良いわけですね。ただし、見出し付き箇条書き。

  • バイナリィポット:処女作。喫茶店と仮想現実空間が舞台。なっちゃんかわいい
  • プリンセスホリデー:第二作。ファンタジー世界が舞台。シルフィーかわいい 月は東に日は西に:第三作。学園もの。ちひろちゃん最高
  • 夜明け前より瑠璃色な:第四作。学園もの。麻衣ちゃんかわいい
  • FORTUNE ARTERIAL:第五作。学園もの。白ちゃんかわいい
  • 穢翼のユースティア:第六作。ファンタジー世界。リシアかわいい
  • 大図書館の羊飼い:第七作。学園もの。佳奈すけー
  • 千の波濤、桃花染の皇姫:第八作。和風ファンタジー。古杜音もふー

とまぁ、こんな箇条書きはよくあるのではないかと。 この箇条書き文章をJSONで表記するとこうなる。

[{

"タイトル" : "バイナリィポット" ,

"舞台" : "喫茶店と仮想現実" ,

"お気に入り" : "諏訪 奈津子"

} , {

"タイトル" : "プリンセスホリデー" ,

"舞台" : "ファンタジー世界" ,

"お気に入り" : "シルフィー・クラウド"

} , {

"タイトル" : "月は東に日は西に" ,

"舞台" : "学園" ,

"お気に入り" : "橘 ちひろ"

} , {

"タイトル" : "夜明け前より瑠璃色な" ,

"舞台" : "学園" ,

"お気に入り" : "朝霧 麻衣"

} , {

"タイトル" : "FORTUNE ARTERIAL" ,

"舞台" : "学園" ,

"お気に入り" : "東儀 白"

} , {

"タイトル" : "穢翼のユースティア" ,

"舞台" : "ファンタジー世界" ,

"お気に入り" : "リシア・ド・ノーヴァス・ユーリィ"

} , {

"タイトル" : "大図書館の羊飼い" ,

"舞台" : "学園" ,

"お気に入り" : "鈴木 佳奈"

} , {

"タイトル" : "千の波涛 桃花染の皇姫" ,

"舞台" : "和風ファンタジー世界" ,

"お気に入り" : "椎葉 古杜音"

}]

構造化されたテキストはこういう風に、文章を意味で区切ってその意味ごとにテキストを入れるということ。

で、Elasticsearch にデータを入れるときは、「 {"タイトル" : "月は東に日は西に" , "舞台" : "学園" , "お気に入り" : "橘 ちひろ"} 」 を1件のデータとして登録するわけです。7件のデータを登録できるわけですね。

そしてそして、検索に特化したものが Elasticsearch なんですから、検索しなければ意味がありません。「 {"舞台" , "ファンタジー"} 」として Query を発行しましょう。すると、プリホリ、ユースティア、千桃の3本が検索結果として帰ってくるのです。ポイントは、千桃も結果として帰ってくること。データは「和風ファンタジー」となっていても、部分マッチで「ファンタジー」で検索されてくるわけです。

ちうわけで、Elasticserach とか、MongoDB とかを知りたければ、JOSNを知れ(XMLでもいい)