2014年7月12日土曜日

MySQL起動時に /etc/sysconfig/network: No such file or directoryと言われたら

Dockerを利用してCentOS上のMySQLを起動しようとすると下記感じでエラーが出る事がある。
$ /etc/rc.d/init.d/mysqld start
/etc/rc.d/init.d/mysqld: line 23: /etc/sysconfig/network: No such file or directory

その場合は、networkファイルを作ってあげれば解決する。
$ touch /etc/sysconfig/network

git push で 403 Forbidden が発生したら

Githubにpushしたら下記エラーが発生した。
git push
error: The requested URL returned error: 403 Forbidden while accessing https://github.com/{githubユーザ名}/{プロジェクト名}/info/refs

fatal: HTTP request failed

・対処方法
pushするURLを見失っている状態っぽいので、下記コマンドを実施。
git remote set-url origin https://{githubユーザ名}@github.com/{プロジェクト名}
git push
これで正しくpushできるようになるはずです。

2014年6月8日日曜日

Java8のlambda式について

Java8が公開されてそれなりに時間が経ちましたが、さすがにそろそろLambda式に慣れないとまずいということでメモとして残していきます。

Java7までの書き方から始まり、徐々にラムダ式の簡略記法に変換していく感じでまとめています。
go1メソッド→go4メソッドまで順序だてる感じで簡略化していきます。
簡略化の仕方に関しては各メソッドにコメントとして記載しているのでそちらを参照してもらえるとわかりやすいかと思います。

package lambda1;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.UnaryOperator;

public class Main {

 private static final List list = Arrays.asList("a", "b", "c", "d",
   "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q",
   "r", "s", "t", "u", "v", "w", "x", "y", "z");

 public static void main(final String[] args) {
  Main m = new Main();
  m.go1();
  m.go2();
  m.go3();
  m.go4();
 }

 /**
  * Java8以前の記述方法。
  * この記述を徐々に簡略化していきます。
  */
 public void go1() {
  System.out.println("go1");
  final List l = new ArrayList(list);
  System.out.println(l.toString());
  l.replaceAll(new UnaryOperator() {

   @Override
   public String apply(String str) {
    return "==" + str;
   }

  });
  System.out.println(l.toString());
 }

 /**
  * replaceAllの引数のUnaryOperatorインタフェースは
  * @FunctionalInterfaceのアノテーションが付いているので、
  * ラムダ式で記述を置き換えられる。
  */
 public void go2() {
  System.out.println("go2");
  final List l = new ArrayList(list);
  System.out.println(l.toString());
  l.replaceAll((String t) -> {
   return "==" + t;
  });
  System.out.println(l.toString());
 }

 /**
  * 処理が1行の場合は{}で囲う必要がないので削除。
  * さらにreturnも1行の場合は削除できるので削除。
  */
 public void go3() {
  System.out.println("go3");
  final List l = new ArrayList(list);
  System.out.println(l.toString());
  l.replaceAll((String t) -> "==" + t);
  System.out.println(l.toString());
 }

 /**
  * 型は推論してくれるし、かつ引数が1個なのでカッコも不要。
  */
 public void go4() {
  System.out.println("go4");
  final List l = new ArrayList(list);
  System.out.println(l.toString());
  l.replaceAll(t -> "==" + t);
  System.out.println(l.toString());
 }
}


しかし、便利ですね。
最初はPHPみたいな矢印マークでとっつきにくかったですが、こうやって徐々に簡略化していくと色々とわかりやすく学べました。
これなら、自分で関数インタフェース(@FunctionalInterface)を利用して、便利に色々と作れる気がしてきました。

2014年4月11日金曜日

MacでDockerにMonitを入れてApacheを動かす

Dockerで起動したCentOS上にMonitをインストールしてApacheを起動させます。

Monitとは、プロセス監視ツールです。
なぜ、このMonitを利用するかというと、、、Dockerは起動時に1つしかプロセスを起動するコマンドが使えないためです。
このMonitを利用すると、プロセスが立ち上がっていない場合Monitがかわりに起動してくれる様な設定が可能です。
なので、Dockerの起動時に立ち上げるプロセスをMonitにしておけば、Monitに監視させている他のプロセス(ApacheやSSHなど)をMonitが立ち上げてくれるんです!

それではインストールの仕方と設定方法を書いていきます。
・用意するもの
Dockerがインストールされた環境のみ。
もし、DockerがインストールされていなければMacでDockerを動かすでインストールしてみてください。

・まずはDockerを使ってcentosを起動
$ docker run -i -t centos /bin/bash

・続いて、とりあえずサーバを最新化します
$ yum update

・Monitのインストール
$ rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
$ rpm -ivh http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.5.1-1.el5.rf.i386.rpm
$ yum install --enablerepo=rpmforge monit

・Apacheのインストール
$ yum install httpd
・index.html作成
$ echo test > /var/www/html/index.html

・一旦、centosをコミットしておく(ここは飛ばしてもOK)
$ exit
上記で、Dockerから抜ける。
$ docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES 20cafcb9639e        centos:6.4          /bin/bash           3 days ago          Exit 0                                  grave_shockley       
$ docker commit 20c ak220/centos 
・コミット確認
$ docker images
 REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
 ak220/centos        latest              d83459021df6        3 days ago          668 MB 
commitしたimageが存在することを確認。
・commitした状態の続きを操作するの
$ docker run -i -t ak220/centos /bin/bash

・Monitの設定
$ vi /etc/monit.conf 
変更項目は下記
変更前
set httpd port 2812 and
    use address localhost
    allow localhost
    allow admin:monit
    allow @monit
    allow @users readonly
変更後
set httpd port 2812 and
    use address 0.0.0.0
    allow admin:monit
続いて、MonitにApacheを監視させる。
$ vi /etc/monit.d/httpd.conf
check process httpd with pidfile /var/run/httpd.pid
    start program = "/etc/init.d/httpd start" with timeout 60 seconds
    stop program  = "/etc/init.d/httpd stop"
    if failed port 80 protocol http
    then restart
    group apache

・Monitの設定ファイルが正しいかを確認
$ monit -t
Control file syntax OK #と表示されればOK

・Monit起動
$ service monit start
Starting monit: Starting monit daemon with http interface at [0.0.0.0:2812]
                                                           [  OK  ]
もし「/etc/init.d/monit: line 18: /etc/sysconfig/network: No such file or directory」というエラーがでたら、下記のコマンドを実行して下さい。
$ touch /etc/sysconfig/network
Apacheが起動していることを確認する。ApacheのプロセスがあればOK。
$ ps -ef | grep httpd
root        53     1  0 14:10 ?        00:00:00 /usr/sbin/httpd
apache      55    53  0 14:10 ?        00:00:00 /usr/sbin/httpd
apache      56    53  0 14:10 ?        00:00:00 /usr/sbin/httpd
apache      57    53  0 14:10 ?        00:00:00 /usr/sbin/httpd
ここまでできたら、Dockerから抜けます。
$ exit


・構築したコンテナをコミットして、Monitを起動
$ docker ps -l
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS               NAMES
d99e2f8dc5bc        ak220/centos:latest   /bin/bash           3 days ago          Exit 0                                  hungry_engelbart    
$ docker commit d99e2f ak220/centos
Dockerで構築したimageをコミットしたので、このイメージをRunさせるときにMonitのプロセスを実行します。
ついでに、localhost:10080をDockerのCentOSで稼働しているApacheの80番ポートに紐付けます。
$ docker run -d -t -p 10080:80 -p 12812:2812 ak220/centos /usr/bin/monit -I

で、http://localhost:10080にアクセスすると、、、ん、見れない。EC2上ではうまく行ったのに・・・。
だいぶ困った。同じ設定なのに。
EC2上とMac上でのDockerの起動の違いはMacではboot2docker上でDockerが起動していること。VirtualBoxのポートフォワードが犯人でした。
ということで、boot2dockerの設定をします。
$ ./boot2docker stop
$ for i in {49000..49900}; do
 VBoxManage modifyvm "boot2docker-vm" --natpf1 "tcp-port$i,tcp,,$i,,$i";
 VBoxManage modifyvm "boot2docker-vm" --natpf1 "udp-port$i,udp,,$i,,$i";
done
$ ./boot2docker start
$ docker run -d -t -p 49080:80 -p 49812:2812 ak220/centos /usr/bin/monit -I
http://localhost:49080/
で「test」っていう文字がブラウザに表示されたらOK。(このtestはecho text > /var/www/html/index.htmlで書き込んだやつ)
・Monitの管理画面
http://localhost:49812/
これでMonitの管理画面が見れます。プロセスの停止、起動が出来たりします。

VirtualBoxのポートフォワードにははめられました。みなさん気をつけて下さい。

2014年4月7日月曜日

Dockerの基本コマンド

Dockerの基本コマンドを羅列していきます。

・Dockerのバージョン確認
$ docker version

・Dockerで使用するコンテナの検索
$ docker search [centos]
ubuntuがほしいなら、「docker search ubuntu」

・使用するコンテナのダウンロード
$ docker pull centos
docker pull [searchした結果のNAME]
結構時間かかります。

・コンテナを走らせコマンドを実行する
$ docker run -i centos echo "hello world"
docker run -i [ダウンロードしたコンテナ名] [実行したいコマンド]

・コンテナのIDを取得
$ docker ps -l

・コンテナのコミット
$ docker commit 347ba centos/echo
docker commit [docker ps -lで表示されたIDの頭の一部で良いらしい] [コミットする名前]

・コミットしたコンテナの使用
$ docker run centos/echo echo 'hello'
docker run [コミットしたREPOSITORY名] [コマンド]

・コミットしたコンテナの確認
$ docker images