Author: kumassy

ZFSはいいぞ

この記事はKCS Advent Calender 17日目の記事です。

はじめに

初めまして。J科4年の @kumassy_ です。けんきうしつのサーバーの面倒を見ています。

概要

ハードディスクにはたくさんのファイルが保存されているかと思いますが、ハードディスク上にファイルを格納するための仕組みをファイルシステムといいます。世の中にはext4やxfsなどいろいろなファイルシステムがありますが、ZFSというファイルシステムがとてもよさそうだったので紹介します。

ZFSのいいところ

  • ファイルシステムにRAID機能が組み込まれている
  • 使うコマンドが2つで管理が簡単
  • スナップショットがとれる
  • パーティションの容量が動的に拡張されるため、事前にパーティションのサイズを指定しなくてよい

実際に使ってみた

CentOS7.5にハードディスクを4枚さしてRAID-Z1(RAID-5相当)を組んでみました。1枚は/と/boot用で、残りの3枚をZFSで管理します。


# ストレージプールの作成
# LVMでいうVolume Groupのようなもの
$ sudo zpool create tank raidz1 sdb sdc sdd
$ zpool list
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
tank 16.2T 1.55M 16.2T - 0% 0% 1.00x ONLINE -

# データセット(パーティションのようなもの)の作成
# 作成すると自動的にマウントされる
$ sudo zfs create tank/storage
$ sudo zfs create tank/home
$ zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 730K 10.5T 139K /tank
tank/home 128K 10.5T 128K /tank/home
tank/storage 128K 10.5T 128K /tank/storage

# マウントポイントの変更
$ sudo zfs set mountpoint=/storage tank/storage
$ sudo zfs set mountpoint=/home tank/home

とても簡単!!データセットを作ると自動的にマウントされるので、/etc/fstabの設定すらいらないです!!!!!!

さいごに

ZFSはいいぞ。

他にもスナップショットの作成やsend/receiveによるバックアップなど試したい機能がいろいろありますが、このあたりの資料を参考にしてみてください。

  • https://chibiegg.gitbooks.io/how-to-zfs/content/index.html
  • https://qiita.com/pitekusu/items/d5e9b0e4f5c06f8f76e3
  • https://pthree.org/2012/12/17/zfs-administration-part-x-creating-filesystems/

MacでTensorflow

Tensorflow

http://qiita.com/icoxfog417/items/fb5c24e35a849f8e2c5d
おもしろそう

インストール

https://www.tensorflow.org/versions/r0.9/get_started/os_setup.html#pip-installation をコピペしながら作業

easy_install なんてあるの知らなくて戸惑った

<br />
sudo easy_install pip<br />
sudo easy_install --upgrade six<br />

を見逃してたので tensorflow-0.9.0-py2-none-any.whl is not a supported wheel on this platform. と言われてしまった…

sudo pip install --upgrade $TF_BINARY_URL

<br />
$ sudo pip install --upgrade $TF_BINARY_URL</p>
<p>...</p>
<p>Exception:<br />
Traceback (most recent call last):<br />
  File &quot;/Library/Python/2.7/site-packages/pip-8.1.2-py2.7.egg/pip/basecommand.py&quot;, line 215, in main<br />
    status = self.run(options, args)<br />
  File &quot;/Library/Python/2.7/site-packages/pip-8.1.2-py2.7.egg/pip/commands/install.py&quot;, line 317, in run<br />
    prefix=options.prefix_path,<br />
  File &quot;/Library/Python/2.7/site-packages/pip-8.1.2-py2.7.egg/pip/req/req_set.py&quot;, line 736, in install<br />
    requirement.uninstall(auto_confirm=True)<br />
  File &quot;/Library/Python/2.7/site-packages/pip-8.1.2-py2.7.egg/pip/req/req_install.py&quot;, line 742, in uninstall<br />
    paths_to_remove.remove(auto_confirm)<br />
  File &quot;/Library/Python/2.7/site-packages/pip-8.1.2-py2.7.egg/pip/req/req_uninstall.py&quot;, line 115, in remove<br />
    renames(path, new_path)<br />
  File &quot;/Library/Python/2.7/site-packages/pip-8.1.2-py2.7.egg/pip/utils/__init__.py&quot;, line 267, in renames<br />
    shutil.move(old, new)<br />
  File &quot;/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py&quot;, line 299, in move<br />
    copytree(src, real_dst, symlinks=True)<br />
  File &quot;/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py&quot;, line 208, in copytree<br />
    raise Error, errors<br />
Error: [(&#039;/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.py&#039;, &#039;/tmp/pip-Qy6Cic-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.py&#039;, &quot;[Errno 1] Operation not permitted: &#039;/tmp/pip-Qy6Cic-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.py&#039;&quot;), (&#039;/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.pyc&#039;, &#039;/tmp/pip-Qy6Cic-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.pyc&#039;, &quot;[Errno 1] Operation not permitted: &#039;/tmp/pip-Qy6Cic-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/__init__.pyc&#039;&quot;), (&#039;/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.py&#039;, &#039;/tmp/pip-Qy6Cic-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.py&#039;, &quot;[Errno 1] Operation not permitted: &#039;/tmp/pip-Qy6Cic-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.py&#039;&quot;), (&#039;/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.pyc&#039;, &#039;/tmp/pip-Qy6Cic-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.pyc&#039;, &quot;[Errno 1] Operation not permitted: &#039;/tmp/pip-Qy6Cic-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib/markers.pyc&#039;&quot;), (&#039;/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib&#039;, &#039;/tmp/pip-Qy6Cic-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib&#039;, &quot;[Errno 1] Operation not permitted: &#039;/tmp/pip-Qy6Cic-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib&#039;&quot;)]<br />

(#^ω^)

--ignore-installed six

https://github.com/tensorflow/tensorflow/issues/500

<br />
sudo pip install --upgrade $TF_BINARY_URL --ignore-installed six<br />

でうまくいった(幻想)

ふるい numpy

<br />
$ python<br />
Python 2.7.10 (default, Oct 23 2015, 19:19:21)<br />
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin<br />
Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.<br />
&gt;&gt;&gt; import tensorflow<br />
RuntimeError: module compiled against API version 0xa but this version of numpy is 0x9<br />
Traceback (most recent call last):<br />
  File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt;<br />
  File &quot;/Library/Python/2.7/site-packages/tensorflow/__init__.py&quot;, line 23, in &lt;module&gt;<br />
    from tensorflow.python import *<br />
  File &quot;/Library/Python/2.7/site-packages/tensorflow/python/__init__.py&quot;, line 48, in &lt;module&gt;<br />
    from tensorflow.python import pywrap_tensorflow<br />
  File &quot;/Library/Python/2.7/site-packages/tensorflow/python/pywrap_tensorflow.py&quot;, line 28, in &lt;module&gt;<br />
    _pywrap_tensorflow = swig_import_helper()<br />
  File &quot;/Library/Python/2.7/site-packages/tensorflow/python/pywrap_tensorflow.py&quot;, line 24, in swig_import_helper<br />
    _mod = imp.load_module(&#039;_pywrap_tensorflow&#039;, fp, pathname, description)<br />
ImportError: numpy.core.multiarray failed to import<br />

(#^ω^)

Homebrew 先生

http://stackoverflow.com/questions/33859531/runtimeerror-module-compiled-against-api-version-a-but-this-version-of-numpy-is

<br />
brew install python<br />

でできた!

Polymerをつかってみる

PolymerはWebcomponentを実装したライブラリです。Polymerがサポートしている機能としては、

  • カスタムエレメント
  • HTMLインポート
  • テンプレート
  • Shadow Dom

です。

カスタムエレメント

HTMLにはspanなどの要素がありますが、自分で新しい要素を作れるようになります。

HTMLインポート

今まで.cssや.jsは別ファイルに分けれてたのに.htmlは別ファイルに分けられませんでした。
WebComponentでは分割できます。

テンプレート

<template>タグを使うことでテンプレートを記述できます。

Shadow Dom

CSSにスコープの概念を導入します。CSSやJSをカプセル化できます。

Polymerでは<dom-module>タグを使ってカスタムエレメントを表現していきます。<dom-module>はShadow Domの機能を備えているのでCSSやJSをカプセル化することができます。<dom-module>タグ内の<template>タグでカスタムエレメントのDOMを定義します。

またPolymerはデータバインディングという便利な機能もあります。Angular.jsでも同様な機能が使えますね。

Polymerを使ってみる

Polymerを使ったアプリの簡単なサンプルPolymer starter kitがあるのでそれをダウンロード、ビルドして遊んでみましょう。
なお以下では全てMacでの説明になります。Windowsの場合は宗教上の問題により説明できません。
まずgitからレポジトリをクローンしましょう。

<br />
git clone https://github.com/PolymerElements/polymer-starter-kit.git polymer-s<br />

次にNode.jsやBowerの依存パッケージをインストールします。
npmやbowerが使えることを念のため確認。

<br />
node -v    #=&gt; v0.12.7<br />
npm -v     #=&gt; 3.4.0</p>
<p>cd polymer-s<br />
npm install -g gulp bower &amp;&amp; npm install &amp;&amp; bower install<br />

結構時間かかります。

無事インストールできたらビルドしてみましょう。

<br />
gulp serve<br />

これでアプリをプレビューできます。このコマンドで立ち上がるサーバーはソースファイルに変更を加えたときに自動的にページをリロードしてくれるのでとてもはかどります。
…うまくいくはずなのですが、Error: Cannot find module ‘dateformat’というエラーが出てしまいました。

<br />
npm install dateformat #=&gt;これだけでは直らなかった</p>
<p>npm uninstall gulp -g<br />
npm install gulp -g</p>
<p>gulp serve<br />

今度こそうまくいきました。
スクリーンショット 2016-02-06 12.26.10

テキストボックスの文字列を編集するとタイトルの文字もリアルタイムに変わります。これはデータバインディングの機能ですね。
スクリーンショット 2016-02-06 12.26.20

次回(があったら次回)からはStarterKitを使わずにフルスクラッチでキッチンタイマーアプリを作っていきたいと思います。

参考

  • http://qiita.com/masashi127/items/9d81b0396f4834062ead
  • http://stackoverflow.com/questions/33328403/error-cannot-find-module-dateformat-in-gulp