スパゲッティ生産所

コードの走り書きとかメモとか日常のこととか

Docker 1.13でnamed volumeをserviceから使うとエラーになる

Docker1.12からSwarm modeが新しく入り、Docker単体でクラスタが組めるようになりました。そのときに使うコマンドが docker serviceなのですが、1.13でnamed volumeを使おうとするとSELinuxがエラーを出してしまいます。

ボリューム作成

$ docker volume create hoge
hoge
$ docker volume ls
DRIVER              VOLUME NAME
local               hoge

ボリュームを使用してサービスを作成

$ docker service create --mount type=volume,src=hoge,dst=/test --restart-condition none --name test busybox ls /test/
ye4fz0ctomset25go7dd7euvz
$ docker service ls
ID            NAME  MODE        REPLICAS  IMAGE
ye4fz0ctomse  test  replicated  0/1       busybox:latest

サービスが立ち上がっていない

$ docker service ps test
ID            NAME    IMAGE           NODE         DESIRED STATE  CURRENT STATE           ERROR                             PORTS
tk99naov7vjk  test.1  busybox:latest  test-swarm3  Shutdown       Rejected 2 minutes ago  "SELinux relabeling of  is not…" 

エラーにSELinuxの文字が見える

docker service logsのコマンドがこのバージョンではExperimentalなのでエラーメッセージの確認が難しいです。

同じ問題に当たった人を探していたら、すでにGitHubのissueが立っていました。

github.com

dockerのバージョンが1.13かつdockerdのオプションに--selinux-enabledが設定されている場合のみ発生するようです。

 

検証環境

$ docker version
Client:
Version: 1.13.1
API version: 1.26
Go version: go1.7.3
Git commit: 092cba3
Built: Wed Feb 15 21:34:55 2017
OS/Arch: linux/amd64

Server:
Version: 1.13.1
API version: 1.26 (minimum version 1.12)
Go version: go1.7.3
Git commit: 092cba3
Built: Wed Feb 15 21:34:55 2017
OS/Arch: linux/amd64
Experimental: false
$ cat /etc/os-release  
NAME="Container Linux by CoreOS"
ID=coreos
VERSION=1325.0.0
VERSION_ID=1325.0.0
BUILD_ID=2017-02-15-2139
PRETTY_NAME="Container Linux by CoreOS 1325.0.0 (Ladybug)"
ANSI_COLOR="38;5;75"
HOME_URL="https://coreos.com/"
BUG_REPORT_URL="https://github.com/coreos/bugs/issues"

JavaでSVM-SMOを実装する

かなり久しぶりにブログを書きます。

大学の課題で、「SVMを使って何かやってみろ」というものが出されたのでSVM-SMOを自分で実装してみることにしました。

SVMについての説明はもう書きませんので、

kivantium.hateblo.jp

 

とか

 

パターン認識と機械学習 下 (ベイズ理論による統計的予測)

パターン認識と機械学習 下 (ベイズ理論による統計的予測)

 

 の7章とかを参考にして下さい。

要するに

SVMは「各データに対応するαiという値があって、それをある制約の元で最適化する」という問題に落とし込めて、この最適化する方法がSMOという事になります。

SMOについてはこのスライド

www.slideshare.net

を元に実装しました。

データにはIrisデータセットを用いて、実装が正しいのかの確認をします。このデータセットは線形分離可能なデータセットになっています。

今回は以下の様な仕様にしました。

・使用するカーネル関数には線形カーネルを選びました。

・今回の実装では、Irisデータセットの"Petal.Width"をx軸、"Petal.Length"をy軸にとって学習させるのですが、x軸とy軸でrangeが違うのがなんか気持ち悪かったので、データの最大値で各値を割ってrangeが0~1になるようにしています。

・α更新時に選ぶ2点目は1点目以外からランダムで選ぶようにしています。

・α更新時にaiNewやajNewが不正な値になった場合、また更新する値の変化量が微小になった場合更新を行いません。

・ある一定回数更新が行われなかった時点で更新作業を終了します。

・パラメータCにはInteger.MAX_VALUEを入れてます。

この仕様で実装を行い、学習させた結果が以下の様なものです

https://pbs.twimg.com/tweet_video/Ca3z8ijUUAAmbnq.mp4

 思ったよりちゃんと動いているっぽいのでうまく実装できているようです。

今回のSVMソースコード

github.com

 

においてあります。結果のグラフ画像なんかを出力するものが混ざっていますがまあ気にしないでください。

 

 

次は非線形分離なデータを学習できるようにしてみる予定。

VMwareにCoreOSをインストールしてnginxでサーバーを起動してみる

タイトルの通り。
現在管理しているアプリケーションを将来的にはDockerに乗せて運用したいと思っていたので、CoreOSの練習としてインストールしてみます。

VMにインストールするところまでは、
Docker1.0.0を記念して、ISO imageからCoreOSをインストールしてみた。
のブログを参考にして行いました。ここまでは詰まるところはありませんでした。

次に、CoreOS上にDockerコンテナを作成します。
まずはイメージをpullしてきます。今回はCentOSを使いました。

core@localhost ~ $ docker pull centos:latest
Pulling repository centos
0c752394b855: Download complete 
511136ea3c5a: Download complete 
34e94e67e63a: Download complete 

とりあえずこれを起動してみます。

core@localhost ~ $ docker run -it --name test1 centos /bin/bash
bash-4.1# 

ちゃんとbashが起動しました。
これに、nginxをインストールしてみます。
nginxのリポジトリを登録

bash-4.1# rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
Retrieving http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
warning: /var/tmp/rpm-tmp.unaiUS: Header V4 RSA/SHA1 Signature, key ID 7bd9bf62: NOKEY
Preparing...                ########################################### [100%]
   1:nginx-release-centos   ########################################### [100%]

yumでnginxをインストール

bash-4.1# yum -y install nginx

バージョン確認

bash-4.1# nginx -v     
nginx version: nginx/1.6.0

nginxがインストールされました。
これを、VMの外から見れるようにします。
とりあえず今起動中のdockerコンテナを停止します。
今、nginxをインストールしたコンテナ(test1)から、新しいイメージnginx1を作ります。
コンテナを確認

core@localhost ~ $ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
7db044814c26        centos:latest       /bin/bash           14 minutes ago      Exited (130) 2 seconds ago                       test1

このコンテナから新しいイメージを作成

core@localhost ~ $ docker commit 7db044814c26 nginx1
d92fb22f3ebc2ecf9c0be4e12cb7793640f7ffbc9eb525e483bdb3aaacb20cf3

イメージを確認すると、

core@localhost ~ $ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
nginx1              latest              d92fb22f3ebc        48 seconds ago      187.3 MB
centos              latest              0c752394b855        4 weeks ago         124.1 MB

最初にpullしたcentosとは別に、nginx1というイメージができています。
ではこのnginx1から、nginxを実際に起動するためのコンテナを作成します。

core@localhost ~ $ docker run -t -i -p 8080:80 --name test2 nginx1 /bin/bash
bash-4.1#  

-pは、ホストとコンテナの間のポートのバインドを指定するためのもので、この場合はホストの8080ポートとコンテナの80ポートがバインドされています。

nginxを起動

bash-4.1# nginx

そして、このコンテナからデタッチします。ctrl^p ctrl^qでデタッチできます。
コンテナを確認

core@localhost ~ $ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
031c0904aeb4        nginx1:latest       /bin/bash           2 minutes ago       Up 2 minutes        0.0.0.0:8080->80/tcp   test2

コンテナtest2は起動中で、ポート8080が80にバインドされていることがわかります。
この状態でCoreOSを起動しているVMのアドレスにアクセスしてみると・・・・?

f:id:jimang_laurant:20140709013736p:plain


起動しているnginxにアクセスすることが出来ました!

本来ならば、nginx1からtest2を作る時には-iによる対話起動でなく、-dでバックグラウンド起動させたかったのですが、そうすると次にattachした時にbashのコンソールが出てこなかったりしてとても悩みました。
ちょっとまだ不安定で、本番環境で使うにはまだまだかかりそうですが、とても面白い技術だなーと思いました。ちょっとずづ勉強していこうと思います。

参考にしたページ
Docker1.0.0を記念して、ISO imageからCoreOSをインストールしてみた。
Dockerでnginxサーバー立ててみた。あとDockerの使い方とか。
いまさら聞けないDocker入門

GAEのTaskQueueに入れるServletについて

GAEにはスレッドのように使えるTaskQueueというものがあります。

使い方はこちら(https://developers.google.com/appengine/docs/java/taskqueue/)です。

QueueにTask用のServletを入れて使いますが、その時に呼ばれるServletメソッドはdoPostの方になります。doGetしかServletに書かれてない場合、そのServletは405を返すのですが、TaskQueueは入れたServletが例外を返さない場合、StatusCodeがいくらであってもGAEのlog上にエラーを吐きません。なので、もしdoPostをオーバーライドしそこねていても気付きにくくなっています(ただ、リトライ設定をしている場合はリトライされます)。

実行ログにエラーは出ていないのにTaskQueueが動かない、というときは正しいメソッドをオーバーライドしているか確認しましょう。

フォロワー監視ったー更新

フォロワー監視ったー  https://follower-watcher.appspot.com/ 更新しました。

SSLでの通信を行うようにしました。

・リムーブ通知のうち、フォロワーからのブロックで発生したものをブロック通知として別に通知するようにしました。

 

とりあえずはつけたい機能は全てつけたので開発は一旦終わります。

勿論サポートは続けますし、何か機能の要望があれば可能な限り応じようと思います。

 

新しいアプリケーションを作りました

フォロワー監視ったー

http://follower-watcher.appspot.com/

なんかアレな名前ですが要するにりむられったーみたいなものです。

りむられったーがどうやら機能しなくなっているようで(公式ページもつながらない)、結構重宝してたのでどうせなら自分で作ってしまえということで作りました。

無保証ですが、使いたい人はどうぞ。

 

JavaFXアプリケーション製作中に作ったライブラリの話(未完成)

これはJavaFX Advent Calendar2013の20日目のエントリです。昨日はyumix_hさんの「JavaFXでiPhone風のメールクライアントを作る」でした。明日はもじゃ変さんのエントリです。


現在、JavaFXを使ったTwitterクライアントを製作中(なぜかTwitterクライアント作ってる人多いですね)です。デスクトップアプリケーションとして作っているので、もちろんUserStreamの機能を付けるのですが、Favorited通知やRT通知の際に画面の隅にちょっとした通知ウィンドウを出す機能が欲しくなりました。
しかし、JavaFXにはウィンドウを座標指定で出すことはできるのですが、右上とか右下という指定で出すことは出来ないようです。
そこで、その機能を自分で制作し、ライブラリとして活用することにしました。
なんかうまく動かないところがあるので未完成です。

以下にライブラリのコードを載せます

gist8048855

右下に配置する場合は、

Stage stage = new Stage();

//stageの設定をこの間に書く

NotificationWindow nw = new NotificationWindow(stage);
nw.setShowplace(NotificationWindow.LOWER_RIGHT);
nw.showNotificationWindow();

とかすると右下に指定したウィンドウを表示します。
ウィンドウを表示する時間も指定可能で、

nw.showtime(5);

と書けば5秒でそのウィンドウが自動的に閉じられます。

ライブラリの中でやってることは、

Rectangle2D sb = Screen.getPrimary().getVisualBounds();

で解像度を取得、

nstage.getScene().getRoot().prefWidth(-1);
nstage.getScene().getRoot().prefHeight(-1);

でウィンドウの大きさを取得して、

int X = 解像度のWidth - ウィンドウのWidth - 調整値
int Y = 解像度のHeight - ウィンドウのHeight - 調整値

を計算して、出たXとYを

nstage.setX(X);
nstage.setY(Y);

してるだけです。してるだけなので、Windowsだとうまく動きますが、MacやLinuxで上や左にツールバーみたいなのがあるとその分だけ表示がずれる問題が残ってます。
解像度をScreen.getPrimary().getVisualBounds()で取得しているので、解像度にはツールバーなどの幅を除いた値が入ってるのですが、setX()やsetY()の原点はツールバーなどは関係なく画面の左端になっているのが原因です。多分仕様なのでどうしようもないですが・・・(洒落ではないですよ?)
この問題を解決するには、実行されているデスクトップの環境(ツールバーとかdockがどこにあってどのくらいの大きさなのか~とか)を取得することが必要なのですが、Screenクラスにはこういう情報は入っていないようで・・・・。こういう情報を取得する方法を知ってる方が居たら教えて下さい。
上の問題点さえ解決できれば、ライブラリは一応完成します。その場合は、ライブラリとしてきちっと公開する予定です。

こういうAdvent Calendarのようなものに参加するのは初めてで、緊張しながら書きました。いい勉強にもなったので参加してよかったと思います
また来年も参加したいと思うので、それまでにしっかりと勉強したいと思います
おわり