Spring Bootことはじめ

業務ではrailsをやっているので久しぶりにJavaをやりたくなってSpring Bootに手を出しました。railsほどではないけど、Spring Bootも簡単に導入できて良い感じ。Eclipseでのgit操作がGUIで中々難しい…ここはコマンドでやった方が楽かもしれません。

こちらを参考にさせていただきました。 qiita.com

ただ、バージョンが合わないのか、そのままでは動かない箇所があったので一部修正。pom.xmldependencies に以下を追加しました。2個目のはホットデプロイ的な機能を実現するためのものなので必須ではないです。

     <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>

完成形は以下のリポジトリにあります。 github.com

こっちの方が何倍も参考になりますが… github.com

docker-composeでredisを起動して接続する

設定ファイルはこんな感じ。

docker-compose.yml

version: '2'

services:
  redis:
    image: redis:latest
    ports:
      - "6379:6379"
    command: redis-server --appendonly yes
    volumes:
       - ./data/redis:/data

起動までのコマンドはこちら

# -d をつけるとバックグラウンドで起動
docker-compose up -d
# 起動していることを確認
docker-compose ps
# コマンドから接続
redis-cli
127.0.0.1:6379> 

Crowi導入

ドキュメント管理ってどうやるのがベストなんでしょうか?書きやすく見やすいものが良いですよね。色々な候補があるなかで気になっていたCrowiというサービスを使うことにしました。UIもシンプルで良い感じです。こうゆうサービスって書きやすさも大事ですが、なにより見やすさが一番です。書くより見るほうが多いですから。

site.crowi.wiki

導入手順を書いてやろう!と思ったんですが、herokuにアカウントがある人はボタンひとつでした(画像参照)。簡単すぎる。しかもfreeプランで運用可能みたい。素晴らしすぎる。

f:id:katsu68:20171009171652p:plain

ファイルのアップロードは、デフォルトだとオフになっているようです(2017/10/09 現在)。Crowiのアプリ設定(/admin/app)に「画像以外のファイルアップロードを許可」というチェックボックスがあるけど非活性になっています。 herokuでファイルをアップロードできるようにするにはherokuのアプリケーションのSettings(/apps/[アプリケーション名]/settings) > Config Variables に FILE_UPLOADlocalを追加すれば「画像以外のファイルアップロードを許可」にチェックが入れられるようになります。

[追記] herokuでは、しばらくアクセスしないとスリープモードになるらしいけど、そのタイミングでアップロードしたファイルが消える模様。永続化したい場合は、S3の設定をするか、heroku以外の環境を使うのが良いかも。herokuで運用するなら上手くいく方法を探すのもアリだけどS3が無難な気がします。

機能開発のカテゴリー

アジャイルな見積もりと計画づくり」という書籍を読んでいて機能開発の優先順位付けに参考になりそうな指標があったので紹介します。それは「狩野モデル」という狩野紀昭教授が提唱した手法です。フィーチャ(機能)を3つのカテゴリーに分けて考えます。

  • 当たり前、または必須のフィーチャ
  • 線形、一元的なフィーチャ
  • 魅力的なわくわくするフィーチャ

当たり前のフィーチャは文字通りあって当たり前でないと価値が毀損します。あって当たり前なので品質に磨きをかけても顧客満足度は上がりません。

線形のフィーチャは、あればあるほど良い。フィーチャの量に対して顧客満足度が線形で高まるということです。

魅力的なフィーチャは、大きな満足をもたらしてくれるものです。これによって顧客は割増料金を払ってくれます。ただ、このようなフィーチャがないからといって顧客満足度が悪くなることもないです。

これを使えば、どのフィーチャを優先的に実装すべきかなにを後回しにしても影響が少ないかを判断する一助になりそうですね。

re:dash on docker on vagrant

タイトル通りで、vagrant上でdockerを動かしてみます。

こちらを参考にdokcer、docker-composeをセットアップします。 re:dashのバージョンによっては./setup/docker/create_database.shがいらない(ファイルがそもそも存在しない)みたいです。

enomotodev.hatenablog.com

その代わり、docker-compose run --rm server create_dbを実行する必要があります。ここを参考にしました。 qiita.com

あとはdocker-compose up -dを実行してコンテナを起動させます。以下のコマンドを実行して結果が帰ってくれば起動はOKです。

[vagrant@localhost redash]$ curl http://localhost:28080
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>Redirecting...</title>
<h1>Redirecting...</h1>
<p>You should be redirected automatically to target URL: <a href="/login?next=http%3A%2F%2Flocalhost%3A28080%2F">/login?next=http%3A%2F%2Flocalhost%3A28080%2F</a>.  If not click the link.[vagrant@localhost redash]$ 

コピーするdocker-compose.ymlは今回はdocker-compose.production.yml を使いました。ただ、vagrant上で80ポートをポートフォワーディングしたくなかったので以下のように書き換えました。

[vagrant@localhost redash]$ diff docker-compose.yml docker-compose.production.yml 
43c43
<       - "28080:80"
---
>       - "80:80"
[vagrant@localhost redash]$

合わせて、Vagrantfileにポートフォワーディングの設定を追加します。

config.vm.network :forwarded_port, host: 28080, guest: 28080

今回の環境は、接続するDBは別のvagrant仮想マシンです。接続にはプライベートネットワークの設定を行います。vagrantのネットワーク周りの基礎知識と設定はこちらを参考にしました。

labs.septeni.co.jp

config.vm.network "private_network", ip: "192.168.33.10", virtualbox__intnet: "dev_net"

もう一個の仮想マシンも同じ設定(virtualbox__intnet: "dev_net")をします。vagrantを再起動して設定を反映させたら再度、docker-compose up -d を行います。 ホストOS側のブラウザで http://localhost:28080/を実行するとログイン画面に遷移したら完了です。たまに「Internal Server Error」が発生します。そのときは、dockerサービスを再起動すると直ります。

service docker restart

f:id:katsu68:20171007202437p:plain バージョンによってこの辺は違うようです。ログイン情報を登録するとトップページが表示されます。お疲れ様でした。 f:id:katsu68:20171007202550p:plain

プライベートネットワーク設定が完了している場合はデータソースを登録するとき、もう一つの仮想マシンIPアドレスを指定すれば接続可能です。接続できない場合は、dockerサービスを再起動すると直ったりします。うちの環境は接続先がMySQLなので接続先に192.168.33.%(仮想マシンIPアドレス)からの接続を許可する必要があります。

mysql> grant all privileges on [データベース名].* to [ユーザ名]@"192.168.33.%" identified by '[パスワード]' with grant option;