JSON Schemaを使ってみる

やること

JSON Schemaで項目間のチェックをする。 例えば、field1が1の場合に、field2はAであることをチェックする。 JSON Schemaで表現すると以下のようになる。

{
  "type": "object",
  "properties": {
    "field1": {
      "type": "string"
    },
    "field2": {
      "type": "string"
    }
  },
  "if": {
    "properties": {
      "field1": {
        "const": "1"
      }
    }
  },
  "then": {
    "properties": {
      "field2": {
        "const": "A"
      }
    }
  }
}

試した結果

  • Ruby Gem
    • json-schema (2.8.0)
      • "if"はdraft-07からだが、draft-04(実はdraft-06まで?)の実装であり、ifは使えない。
    • json_schemer (0.1.5)
      • 期待通り動作せず。
  • https://www.jsonschemavalidator.net
    • 期待通り。

Kubernetesをちょっとやってみる。

やること

Kubernetesが気になったため、ちょっと動かしてみる。

minikubeを使うと1ノードのKubernetesが使えるらしい。 とりあえずコマンドはコピペ。

curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/

minikube startしたら、kubectlがないと言われたので、これもコピペでインストール。

curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/v1.10.0/bin/linux/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/

とりあえず起動はできるっぽい。

minikube start  # 起動
minikube status #  ステータス確認
mkinikube stop   # 停止

Raspberry PIでJail+vnet

やること

Raspberry Piで、Jailとnet(VIMAGE)を使ってみる。 カーネルカーネルのビルドはこちら。

rixwwd.hatenablog.jp

epairの作成

LANケーブル的な役割をするインターフェースを作成する。

ifconfig epair0 create
ifconfig epair1 create

ルーターとホスト用のJailの作成

実験用の環境として、ルーターとホストを作成する。

jail -c name=router1 host.hostname=router1 vnet persist 
jail -c name=host1 host.hostname=host1 vnet persist 

epair0はRaspberry Piルーターの接続用。 epair1はルーターとホストの接続用。

ifconfig epair0b vnet router1
ifconfig epair1a vnet router1
ifconfig epair1b vnet host1

ifconfig epair0a inet 10.0.0.1 netmask 255.255.255.0
jexec router1 ifconfig epair0b inet 10.0.0.2 netmask 255.255.255.0
jexec router1 ifconfig epair1a inet 10.0.1.1 netmask 255.255.255.0
jexec host1   ifconfig epair1b inet 10.0.1.2 netmask 255.255.255.0

ルーターの構築

パケットを転送するようにするだけ。

jexec router1 sysctl net.inet.ip.forwarding=1

ルーティングテーブル修正

Raspberry Piからルーターを経由してホストへ接続できるよう、ルーティングテーブルの設定をする、

route add -net 10.0.1.0/24 10.0.0.2
jexec host1 route add default 10.0.1.1

pingで接続できていることを確認する。

jexec host1 ping 10.0.0.1
ping 10.0.1.2

後始末

使い終わったら削除する。

jail -r host1
jail -r router1

ifconfig epair0a destroy
ifconfig epair1a destroy

Raspberry PIでVIMAGE用カーネルのビルド

やること

Raspberry PIFreeBSDをインストールして、VIMAGEを使う。 VIMAGEを使うには、カーネルのビルドが必要。 カーネルのビルドをRaspberry PIで行うと遅いため、amd64な環境でクロスコンパイルする。

パッケージのインストール

ccacheを使ってビルド時間を短縮する。どの程度短くなるのかはわからないけど。

pkg install ccache
echo 'WITH_CCACHE_BUILD=yes' >> /etc/src.conf
echo 'WITHOUT_KERNEL_SYMBOLS=yes' >> /etc/src.conf

ソースのチェックアウト

FreeBSDのソースをチェックアウト。 VIMAGEを有効化する。

cd /usr/src
svnlite co https://svn.FreeBSD.org/base/stable/11

cat << 'EOF' > /usr/src/sys/arm/conf/RPI-B-VIMAGE
ident RPI-B-VIMAGE
include   "RPI-B"

options   VIMAGE

EOF

ビルド

ターゲットのアーキテクチャを指定してビルドする。 仮想マシンのCPUの割当が2コアなので-j2をつけてみる。

setenv ARCH arm
setenv TARGET_ARCH armv6
make -j2 kernel-toolchain
make -j2 buildkernel KERNCONF=RPI-B-VIMAGE

mkdir ~/kernel-RPI-B-VIMAGE
make -j2 installkernel KERNCONF=RPI-B-VIMAGE DESTDIR=~/kernel-RPI-B-VIMAGE

Raspberry PIへインストール

~/kernel-RPI-B-VIMAGEをscpなどでRaspberry PIにコピーする。 コピーしたら、ディレクトリを入れ替えて再起動して終わり。

cd /boot
mv kernel kernel.org
mv dtb dtb.orig
cp -r ~/kernel-RPI-B-VIMAGE/* /boot
reboot

再起動が終わるとビルドしたカーネルになっているはず。

unarm -a
dimes | grep VIMAGE
    root@freebsd-vbox:/usr/obj/arm.armv6/usr/src/sys/RPI-B-VIMAGE arm
WARNING: VIMAGE (virtualized network stack) is a highly experimental feature.

Mattermostのバージョンアップ

やること

mattermostのバージョンアップ。

https://docs.mattermost.com/administration/upgrade.html

バックアップ

mattermostとデータベース(PostgreSQL)をバックアップする。

systemctl stop mattermost
mv /opt/mattermost /opt/mattermost.old
pg_dump --username mmuser --password -f ~/mattermost.dump mattermost

インストール

新しいバージョンをインストールして、旧バージョンの設定、データ、ログを移行するだけ。

curl -O  https://releases.mattermost.com/X.X.X/mattermost-team-X.X.X-linux-amd64.tar.gz
tar xf mattermost-team-X.X.X-linux-amd64.tar.gz -C /opt
cp -pr /opt/mattermost.old/config /opt/mattermost/
cp -pr /opt/mattermost.old/data /opt/mattermost/
cp -pr /opt/mattermost.old/logs /opt/mattermost/
chown -R mattermost:mattermost /opt/mattermost

起動

systemctl start mattermost

mattermostで日本語検索

やること

mattermostで日本語検索をできるようにする。

環境

手順

基本的な手順はここにかいてある通り。 https://docs.mattermost.com/install/i18n.html#japanese

この手順をコピペしてもパスがちょっと違ったりしてうまくできない。 CentOS用に以下のように読み替える。

Install necessary packages:

postgresql-develもインストールする。

sudo yum install git gcc-c++ postgresql-devel

Intall Mecab and Mecab IPA-dictionary:

prefixは指定しない。指定しておけば、色々混ざらないようにできるが、面倒なのでやらない。

mkdir ~/tmp
cd ~/tmp
git clone https://github.com/taku910/mecab.git
cd mecab/mecab/
./configure
make
sudo make install
cd ~/tmp/mecab/mecab-ipadic/
./configure --with-charset=utf8
make
sudo make install

ライブラリのパスに/usr/local/libを追加する。

su -
echo /usr/local/lib > /etc/ld.so.conf.d/usr-local-x86_64.conf
ldconfig
exit

Install textsearch_ja:

pg_configへのパスは指定しない。

cd ~/tmp
git clone https://github.com/oknj/textsearch_ja.git
cd textsearch_ja
make USE_PGXS=1
sudo make USE_PGXS=1 install

Enable pg_catalog.japanese:

extensionを作るのはpostgresで。

sudo su - postgres
psql
> create extension if not exists textsearch_ja;
> \q

Install pg_bigm:

cd ~/tmp
curl -L -O https://osdn.jp/projects/pgbigm/downloads/63792/pg_bigm-1.1-20150910.tar.gz
tar zxvf pg_bigm-1.1-20150910.tar.gz
cd pg_bigm-1.1-20150910
make USE_PGXS=1
sudo make USE_PGXS=1 install

Re-create index using pg_bigm:

pg_configへのパスは指定しない。 extensionを作るのはpostgresで。 indexの作り直しはmmuserで。(mmuser)はmattermost用のユーザ。

su - postgres
psql
> create extension if not exists pg_bigm;
> \q
psql --user mmuser --password mattermost
> drop index idx_posts_message_txt;
> create index idx_posts_message_txt on posts using gin (message gin_bigm_ops);
> \q
exit