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が立っていました。
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についての説明はもう書きませんので、
とか
- 作者: C.M.ビショップ,元田浩,栗田多喜夫,樋口知之,松本裕治,村田昇
- 出版社/メーカー: 丸善出版
- 発売日: 2012/02/29
- メディア: 単行本
- 購入: 6人 クリック: 14回
- この商品を含むブログを見る
の7章とかを参考にして下さい。
要するに
SVMは「各データに対応するαiという値があって、それをある制約の元で最適化する」という問題に落とし込めて、この最適化する方法がSMOという事になります。
SMOについてはこのスライド
を元に実装しました。
データには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
思ったよりちゃんと動いているっぽいのでうまく実装できているようです。
においてあります。結果のグラフ画像なんかを出力するものが混ざっていますがまあ気にしないでください。
次は非線形分離なデータを学習できるようにしてみる予定。
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のアドレスにアクセスしてみると・・・・?
起動している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にはウィンドウを座標指定で出すことはできるのですが、右上とか右下という指定で出すことは出来ないようです。
そこで、その機能を自分で制作し、ライブラリとして活用することにしました。
なんかうまく動かないところがあるので未完成です。
以下にライブラリのコードを載せます
右下に配置する場合は、
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のようなものに参加するのは初めてで、緊張しながら書きました。いい勉強にもなったので参加してよかったと思います
また来年も参加したいと思うので、それまでにしっかりと勉強したいと思います
おわり