はい!今やってます!

Work Pertly, Live Idly

MariaDBを5系から10系にアップデートする

WITH句のRecursiveサポート

MariaDBの10系のversionupで10.2.2からWITH句のrecursiveがサポートされるようなので、 テストサーバーを5.5から10.2にバージョンアップしようと。 mariadb.com

CentOS7 の場合

  • 設定ファイルの中身を生成

MariaDB - Setting up MariaDB Repositories - MariaDB

  • repoファイルを作成
sudo vi /etc/yum.repos.d/MariaDB.repo
sudo yum update MariaDB-server MariaDB-client
  • バージョンを確認
rpm -qa | grep MariaDB
  • 再起動
service restart mariadb

n+1問題用スニペット

for文の中でSQLを回してしまう事でアプリのパフォーマンスを落としてしまうn+1問題と呼ばれる処理。 解決するためにはデータをチャンクして処理する必要がある。あまり上手く書いてるコードと出会った事が無くて苦手意識があったのだけど、今日シンプルなのと出会ったのでスニペットとして覚えておこう。 言語はGoで。

const maxCount = 1000
for i := 0; i < len(target); i += maxCount
{
    j := i + maxCount
    
    if len(target) < j 
    {
        j = len(target)
    }

    subTarget := target[i : j]
    executeSQL(subTarget)
    log.Print("execution finished [" + strconv.Itoa(i) + "-" + strconv.Itoa((i + len(subTarget))) + "]")
}

Macに立てたローカルサーバにスマートフォンからアクセスする方法

開発環境のMacで立てたローカルサーバに、iPhoneなどの実機端末からWebアクセスしたい場合の手順です。
下記手順はローカル環境でWebサーバが稼働している前提で書かれています。

設定画面を開く

システム環境設定から、"共有"を選択する。 f:id:yuji_ueda:20160412225405p:plain

設定画面(共有)を開く

"相手のコンピューターが使用するポート"で"Wi-Fi"を選択。
Wi-Fiオプションから"ネットワーク名"や"パスワード"を適宜設定しておく f:id:yuji_ueda:20160412225641p:plain f:id:yuji_ueda:20160412225750p:plain ※画像のケースでは"共有する接続経路"に"Thunderbolt Ethernet 3"が選択されていますが、適当な設定は"ネットワーク"から確認可能です。

インターネット共有をONにする

f:id:yuji_ueda:20160412225904p:plain

クライアントの設定をする

"Wi-Fiオプション"で設定した内容に従って、クライアントからWi-Fiに接続します。

サーバへアクセス

画像にもある通り、ブラウザからhttp://yujiueda.localhostにアクセスすることで、
対象のサーバに接続されます。 f:id:yuji_ueda:20160412230044p:plain

Phoenix × Elixir ×MariaDB × Dockerでjsonを返すAPIを開発する (4日目 : DB設定 & API作成編)

前回の記事(Phoenix × ElixirでAPIを開発する (3日目 : DB環境構築編) - はい!今やってます!)に引き続きDBの設定をして、いよいよAPIを作成します。

MariaDBの権限付与

hostname -i //On API Container
grant all privileges on *.* to root@'172.%';
flush privileges;
SET PASSWORD FOR 'root'@'172.%' = PASSWORD('password');

phoenixのDB定義を設定

cd ${App_Dir}
vi config/dev.exs
設定例 DEV用)
config :api, Api.Repo,
adapter: Ecto.Adapters.MySQL,
username: "${User_Name}",
password: "${Password}",
database: "api_dev",
hostname: "mariadbmaster",

※テスト用も同様に書き換えてください。

DB設定

//APIサーバで
cd ${App_Path}
mix do deps.get, compile
mix ecto.create
env MIX_ENV=test mix ecto.create

jsonAPI作成

mix phoenix.gen.json Pool pools pool_name:string pool_url:string receiver_count:integer mayer_id:integer pool_rank:integer

ルーティング設定変更

vi web/router.ex
変更前)
  # Other scopes may use custom stacks.
  # scope "/api", Api do
  #   pipe_through :api
  # end
変更後)
  # Other scopes may use custom stacks.
  scope "/api", Api do
    pipe_through :api
    resources "/pools", PoolController, except: [:new, :edit]
  end

migration実行

mix ecto.migrate

ルーティングを確認

mix phoenix.routes

サーバを起動

mix phoenix.server

Postでレコード作成

curl -H "Content-Type: application/json" -X POST -d '{"pool": {"pool_name": "Test Resource", "pool_url": "http://www.test.com", "receiver_count": "0", "mayer_id": "999999999", "pool_rank": "1"}}' http://192.168.59.103:8080/api/pools

レコード確認

http://192.168.59.103:8080/api/pools

githubで新規リポジトリを作成してコミット

GitHub · Where software is built -> Create Repo

cd ${App Dir}
git init
git remote add origin https://github.com/uedayuji/api.git
git add .
git commit -m "Initial Commit"
git branch
git push origin master
git checkout -b release //Release Branch作成
git push origin release
git checkout -b develop
git push origin develop //Develop Branch作成

今回作成したコードはこちら(uedayuji/api · GitHub)で公開しています。 今後の実装はGithub上での開発となるので、このシリーズは完結です。

Phoenix × Elixir × MariaDB × Dockerでjsonを返すAPIを開発する (3日目 : DB環境構築編)

前回の記事 (Phoenix × Elixir × MariaDB × Dockerでjsonを返すAPIを開発する (2日目 : 開発環境構築編) - はい!今やってます!) に続いて、DB環境の構築を進めて行きます。PhoenixのデフォルトDBはPostgreDBですが、MariaDBで設定したいと思います。

Docker Image取得

git pull centos

Docker コンテナ作成

docker run --privileged -d -i -t --name=mariadbmaster -e "HOSTNAME=mariadbmaster" -e "TZ=Asia/Tokyo" -e "TERM=dumb" -v /Users/uedayuuji/work/docker_related/workspace:/workspace -p 3306:3306 ${Image_Id} /sbin/init

※systemctlからMariaDBを起動するために--privilegedオプションと/sbin/initが必要

ログイン

docker exec -it mariadbmaster bash

mariadbのインストール

yum -y install mariadb-server

MariaDB文字コード設定

vi /etc/my.cnf.d/server.conf 
 > character-set-server=utf8

MariaDB起動

systemctl enable mariadb.service
systemctl start mariadb.service
mysql_secure_installation

MariaDBログイン

mysql -u root -p

イメージ作成

docker commit mariadbmaster uedayuji/mariadb

Docker Hubにプッシュ

docker login
docker push uedayuji/mariadb

Docker Imageはこちらから落とせます(https://hub.docker.com/r/uedayuji/mariadb/)

次の記事(Phoenix × Elixir ×MariaDB × Dockerでjsonを返すAPIを開発する (4日目 : DB設定 & API作成編) - はい!今やってます!)に続きます。

Phoenix × Elixir × MariaDB × Dockerでjsonを返すAPIを開発する (2日目 : 開発環境構築編)

前回のDocker環境構築 ( Phoenix × ElixirでAPIを開発する (1日目 : Docker環境構築編) - はい!今やってます! ) に引き続いて、コンテナ内で開発環境を構築していきます。

Linuxの環境確認

uname -a

Localeの設定

localectl set-locale LANG=ja_JP.utf8
localectl status

wgetをインストール

yum install wget

Erlangを落とす

wget http://www.erlang.org/download/otp_src_18.2.tar.gz
tar zxvf otp_src_18.2.tar.gz
cd otp_src_18.2

※バージョンは適宜確認して最新のものを落とすようにして下さい。

依存関係ライブラリをインストール

yum install -y git gcc openssl openssl-devel ncurses ncurses-devel unixODBC unixODBC-devel gcc fop inotify-tools java-1.7.0-openjdk-devel gcc-c++

コンパイル&確認

./configure
make
make install
erl

Elixirのインストール

cd /usr/local/lib
git clone https://github.com/elixir-lang/elixir.git
cd elixir
make clean test
vi ~/.bashrc
 > PATH="$PATH":/usr/local/lib/elixir/bin/
source ~/.bashrc
iex

Hexインストール

mix local.hex

Node.jsをインストール

yum install epel-release
yum install nodejs npm --enablerepo=epel
npm install -g n
n stable

Phoenixをインストール

git clone https://github.com/phoenixframework/phoenix.git && cd phoenix && git checkout v1.1.0 && mix do deps.get, compile

※バージョンは適宜最新のものを利用して下さい。

ライブラリローディングようのライブラリ(?)

yum install inotify-tools

テストアプリケーション作成

cd /usr/local/lib/elixir/phoenix/installer
mix phoenix.new /var/www/${App_Name}

MariaDBを使用したいので、実際はこのコマンドを実行しています。

mix phoenix.new /var/www/${App_Name} --database mysql

MariaDBインストール

yum -y install mariadb-server

サーバ起動

cd /var/www/${App_Name}
vi config/dev.exs
 > (編集内容 : Portを80番を指定)
mix phoenix.server

定義されているルーティングの確認

mix phoenix.routes

ブラウザからアクセス

http://${Docker_Ip}:8080/

Docker Image(api)をDocker Hubで公開

docker commit api uedayuji/phoenix
docker images
docker login
docker push uedayuji/phoenix

こちら(Docker Hub)にDocker Imageは公開しています。

今日はここまで

こちらの記事(Phoenix × ElixirでAPIを開発する (3日目 : DB環境構築編) - はい!今やってます!)に続きます。

Phoenix × Elixir × MariaDB × Dockerでjsonを返すAPIを開発する (1日目 : Docker環境構築編)

PhoenixとElixirでAPIを開発したい。
Macのローカルに開発環境を立てる。

boot2dockerを落とす

http://boot2docker.io/
1. パッケージファイルが落ちて来たら流れに沿ってインストール
2. boot2dockerのアイコンをクリックして実行

パラメータ設定

$(boot2docker shellinit)

Dockerプロセス確認

docker ps

Docker Hubのアカウントを作成する

https://hub.docker.com/

Docker Imageをpullする

docker pull centos  

centosは適当です。ただしOfficial

Docker Imageを確認

docker images

Dockerコンテナ作成

docker run --privileged -d -i -t --name=${Container_Name} -v ${Host_Path}:${Container_Path} -p ${Host_Port}:${Container_Port} ${Image_Id} /sbin/init
例1) : docker run --privileged -d -i -t --name=api -v $HOME/work/docker_related/workspace:/var/www -p 8080:80 6ffc02088cb8 /sbin/init
例2) : docker run  --privileged -d -i -t -e "HOSTNAME=api" -e "TZ=Asia/Tokyo" --name=api --link=mariadbmaster:mariadbmaster -v $HOME/work/docker_related/workspace:/var/www -p 8080:80 6ffc02088cb8 /sbin/init

コンテナ一覧を確認

docker ps -a

ミスった時用コンテナ破棄コマンド

docker rm `docker ps -a -q`

bashでログイン

docker exec -it api bash

今日はここまで

こちら ( Phoenix × ElixirでAPIを開発する (2日目 : 開発環境構築編) - はい!今やってます! ) に続きます。