お断り

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

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

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

まぁ、人工知能ちうか、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でもいい)

GPD WINなるパソコンはご存知だろう。

こやつのバッテリが妊娠した・・・・予兆はあったんですよ、2ヶ月くらい前、バッテリのもちがものすごく悪くなって、満充電の状態から30分程度で放電しきってしまうという。その後、なぜかバッテリのもちは回復して1,2時間は持つようになったものの、今度はなーんか裏蓋が膨らんできた。

ちうわけで、開けてみた。

DSCN6457.JPG

わかりにくいですけど、膨らんでます。手前に盛り上がってるんですよね。

なわけで、こりゃ交換しかない!

探してみたら、赤札天国で取り扱いがあるんですよ。一度売り切れになってたんですが、再入荷したっぽいです。ただ、赤札天国って大丈夫なんかなぁ、なんか中国っぽいなぁ・・・・と思いつつ、ポチ。問題なく届きました。

で、妊娠したバッテリと、新品バッテリを比較して見ましょう。

DSCN6459.JPGDSCN6458.JPGバッテリーは両面テープで貼り付けてあるので、マイナスドライバーでこじったため、傷がついてます。失敗すると、火吹くかも

ちうわけで、交換して無事復活した模様

DELL PowerVault TL4000

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

バックアップと言えばテープ!

ん?いまどき、バックアップはHDDだろうって?いやまぁ、そうなんですけどね。HDD が十分すぎるほど安くなったんで、もはやバックアップはHDDでいいだろ?って、その通りですよ。

だけどね、なんかテープバックアップって、ロマンやん。というわけで、LTOでバックアップします。

とーぜん、LTOなんて業務用機しかないわけで、めっさ高い!しかも、SCSI だ、SAS だと高いインターフェースしかない!いちおーUSBでつながるのもあるにはあるものの、最新モデルでヤフオクなんぞには出てない。

と、そんな中で、ふと思いついたのが iSCSI 。そーだ、iSCSI ならIP 到達性さえあれば接続できる。つまり、仮想マシンから使える。さらに、ネットワークだから、遠隔にも置ける。よーし、iSCIS で行こう!と。

で、探してみたところ、DELL PowerVault TL2000/TL4000 が iSCSI に対応してる

DSCN6422.JPGちうわけで、ヤフオクにてお買い上げ。写真の TL4000 と、TL2000 の2台セットで9800円。もちろん、ジャンク!届いた品物を確認したところ、TL4000 は Fan Erro 、TL2000 は Robotics Error が出てます。さーて、どうしたものか。

まずは、装置のリアを確認。

DSCN6425.JPGケーブリングしてますが、TL4000 のリア面です。なお、後述してますが、右の上から2段目のスロットに拡張モジュールを追加してます。ここで確認したいのが、真ん中にあるファンがついたユニットが二個あること。こいつを引っこ抜いてみると、

DSCN6435.JPGこのモジュールが LTO テープドライブそのものなんですね。TL4000 の場合、このドライブが2個入ってます。あとは、

DSCN6433.JPG電源装置も2個。冗長電源になってます。

そして、TL2000 は、このドライブモジュールと電源モジュールが一個づつしかついてない仕様なわけです。

でまぁ、ジャンク品のエラーに話が戻るわけですが、TL4000 は Fan Error なわけです。筐体を見渡しても、Fan はドライブモジュールについてるやつと 電源についてるやつ。もしかして、ドライブモジュールのファンが死んでるだけ??というわけで、TL2000 からドライブモジュールを引っこ抜いて、TL4000 にさしてみたら、おお!エラーが消えた。

というわけで、TL2000 と TL4000 をニコイチして、動く TL4000 ができちゃいました。

じゃあ、使ってみましょう。

目的は、iSCSI で LTO を使うこと。なので、Ethernet でつなぐわけです。さっきのリア面の写真をみてください。右下に Ethernet のポートがあるのが見えると思います。ふむふむ。これにつなげばいいんだな・・・・と思ってあれこれいじってみたんですが、ここで落とし穴。

DELL  の TL4000 のページには、「ドライブコントローラ:SAS、FS、iSCSI」と書いてあるので、この右下の Ethernet で iSCSI が使えるんだろーなーって思っちゃうんですが、このポートは、筐体マネジメント GUI 専用で iSCSI のインターフェースじゃありません。リンク速度も 10/100M しかありません。

というわけで、必要になるのがこのモジュールとケーブル。

DSCN6442.JPGさきほどのリア面の右下にささってた管理モジュールボードと比較すると、仰々しさが違います。

DSCN6446.JPGこの左側のボードが、TL2000/TL4000 専用の SAS-iSCSI Bridge モジュールです。ヤフオクで一個だけ 10000 円で出てたので、即落札しましたが、他に出品されてるのは見たことがありません。

ちなみに、LTO ドライブモジュールの背面にあるのは、

DSCN6443.JPGこんな SAS コネクターだけなので、Bridge モジュールが手に入らないと、SAS でしか使えない代物になってしまいます。

ところで SAS って SCSI みたいにディジーチェーンで繋ぐことができるものじゃないんです??Bridge ボードには SAS コネクターが一個しかない。ドライブには2個ある。じゃあ、ディジーチェーンできるよね?と SAS ケーブルをもう一本買ってつないでみたんですが、認識しませんでした。はて?わからん・・・

FreeBSDとLinuxでNFS

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

FreeBSD と Linux の NFS は鬼門とか言われるらしいんですが、つながざるを得ない場合もあるんですよ。しかもこんな環境

NFS-CIFS.png

Linux ベースのアプライアンスで、データ領域を必要とするような場合ですね。うちでは foltia なんですけどね。

用件別にまとめると、

  • NFS サーバ: FreeBSD / NFS クライアント:Linux
  • CIFS サーバ:Linux / CIFS クライアント:Windows

って、わざわざ書かなくても、CIFS クライアントは Windows で当たり前なんですが。

で、まぁ厄介なのが NFS まわりの話。

FreeBSD 同士の NFS であれば、NFS サーバで

nfs_server_enable="YES"
mountd_enable="YES"

これだけ設定すりゃ、NFS マウントできるわけです。なんとなれば、mountd_enable さえなくても大丈夫。

ところが、NFS クライアントが Linux になると、

nfs_server_enable="YES"
nfsuserd_enable="YES"
rpcbind_enable="YES"
mountd_enable="YES"

これだけ設定しないと、マウントが失敗するわけです。RPC周りの動作が異なるらしく、RPC関連のサーバをちゃんと動くようにしないといけないらしい。あと、Daemon 動かすだけじゃなく、通信を許可する設定も。

/etc/hosts.allow

rpcbind : A.B.C.0/255.255.255.0 : allow

あとは、NFSv4 を有効にするとダメで、NFSv3 にすることが必須

とまぁ、NFS サーバとなる FreeBSD でこれだけ設定すれば、Linux から NFS マウントはできるようになるんです。


ところが、この Linux サーバ上で Samba を動かして、NFS マウントした領域を CIFS でアクセスしようとすると、これがまたコケる。

どうすりゃいいか、さらに FreeBSD の設定を追加します。

nfs_reserved_port_only="YES"
rpc_lockd_enable="YES"
rpc_statd_enable="YES"

これで CIFS からアクセスが可能にはなるんです。が、ファイルアクセスがすごく遅い。スループットが出ないという意味ではなく、ファイルコピーなどの操作を行っても「コピーの準備をしています」で数分待たされて、ようやくコピーが始まるわけです。

おそらくは CIFS アクセスで必須なロック関連がタイムアウトするのを待っちゃうんじゃないかなぁと。キャプって調べてみたところ、NFS クライアントから NFS サーバに対して UDP 111  (SunRPC) 通信をしようとしてるんだけど、これが遮断されてました。

遮断してるのは、Linux の iptables。そりゃまぁ、RPC なんて古代のプロトコル、怖いからって止めますわな・・・・

とはいえ、何とかしないと使い物にならないわけで、しかもLAN内のサーバなんだし・・・・

chkconfig iptables off