bo-tech

heart and tech with love.

良いUIを生み出す7つのルール その1

要約してみた

medium.com

いちいちグーグルとかでサイトの構成となりそうなものを探したりするのがめんどくさいから良いUI, UXの基本というものを理解するというのが趣旨。

1. 光は空から降る

下から来ると不気味だよねって話が載っている。

あとはボタンに上から光が当たっているから下に影ができるとか、

2. 白黒を先に

要はグレイスケールで先にデザインを考えろと。

アーティストやデザイナーはもちろん色を使って、コミカルな感じとか柔らかい感じとかを表現するが

webアプリやアプリにおける良いUIという点においては重要なことではない。

色の塗り方は、まずシンプルに一つの色で、その次にグレイスケール+2の色、複数の色という風に考えたほうがよいと。

色を探すときにはRGBではなくHSBのカラースケールがつかいやすいとのこと。

一つのHSBの色調から明度や彩度を変更して、複数の色を取得することができるがあまり効果的ではない。

良い選び方としては、一つの色をベースとした色調、もしくは二つの色をベースとした色調から色を選ぶと良いと。

これをやるとデザインを崩さず配色ができる。

TIPS!!

黒は使わない。真っ黒という色は自然界ではほぼ存在しないためである。違和感が生まれる。

Adobe Color CC これはいいツールである。

典型的な色を探す。一つの色を決めたら他の多くのデザイナーがその色に対してどんな色を使っているのかなどを確認する。

3. 二倍の空白

無から考えろ。ブランクページを作るときには、ホワイトスペース以外は何もないものとして考えるのだ。

スタイルがないhtmlについては、コンテンツから考えるのだ。 スペースは後付けで、htmlは完全に定まっていなくてはならない。

行間にスペースを(行の高さの二倍)

要素ごとにスペースを

要素グループごとにスペースを

一ページ目はこんな感じ。

Ansible

少し使ったけど改めて

構成管理ツールAnsibleをもう少しまともに使ってみるか。

Ansible Documentation — Ansible Documentation

特徴として

chefと異なり、client側に特別なツールを用意しなくて良い

というのが大きな利点かと思われる。

基本的にはpythonがあればいいかなって感じ。

構成

Inventory

ansible.cfg

Playbook

がある。

試しに色々やってみる。

host, web, dbのサーバーを立てる

vagrantならできる。

vagrant init chef/centos-7.0 # Vagrantfileの生成

Vagrantfileの書き換えを行なって、3台のサーバーを立てる。

  # CUSTOMIZED BY bo0118
  config.vm.define "host" do |node|
    node.vm.box = "chef/centos-7.0"
    node.vm.hostname = "host"
    node.vm.network :private_network, ip: "192.168.43.51"
  end
  config.vm.define "web" do |node|
    node.vm.box = "chef/centos-7.0"
    node.vm.hostname = "web"
    node.vm.network :private_network, ip: "192.168.43.52"
  end
  config.vm.define "db" do |node|
    node.vm.box = "chef/centos-7.0"
    node.vm.hostname = "db"
    node.vm.network :private_network, ip: "192.168.43.53"
  end

単純にcentos7を三つ立ち上げて、host,web,dbという名前とipの設定をしただけ。

vagrant up # これで三つ立ち上がる
vagrant status # これで確認ができるはず

ansibleを入れる

vagrant ssh host # hostという名称でloginができる
yum install gcc python-devel # この二つが必要そう
sudo easy_install pip
sudo pip install ansible # これで導入完了

sshでhost -> web,db

host$ vi ~/.ssh/config
host$ chmod 600 ~/.ssh/config
host$ ssh-keygen -t rsa # これでprivate, publicの二つの鍵ができる
host$ ssh-copy-id web # vagrant userのpasswordはvagrant
host$ ssh-copy-id db # 同上
host$ ssh web # dbでもloginができることを確認

~/.ssh/configの内容は

Host web
  HostName 192.168.43.52
Host db
  HostName 192.168.43.53

ansible実行してみる

まずはInventoryが必要

vi hosts # 作業対象を記載
# [web]
# 192.168.43.52
# [db]
# 192.168.43.53

グルーピングもできる。今回はweb, dbのみ。

ansible all -i hosts -m ping
# -i hostsファイルのallに対して、ping moduleを実行する。

# -i hostsとか毎回煩わしいので
vi ansible.cfg # こちらに記載すれば省略化
# [defaults]
# hostfile = ./hosts

playbook利用

毎回 -m でやるのはきついのでplaybookという仕組みを使う

試しにweb,dbへとまとめてuserを追加するplaybookを作る

vi playbook.yml

playbook.ymlの中身は

--- # この三本線でymlという意味らしい
- hosts: all # 全部対象
  sudo: yes # sudo コマンド
  tasks:
    - name: add user
      user: name=bobo

ちなみにこのplaybookというのは、「べき等性」を保つための仕組みであってこのこのplaybookを複数回起動したからといってboboユーザーが複数できたりはしないらしい。

サーバーのこうなっていて欲しいという姿を描けば良い。

ansible-playbook playbook.yml
# 多分出力結果は
# ok=2  changed=1 ....
# となっているかと。


ansible-playbook playbook.yml
# 多分出力結果は
# ok=2  changed=0 ....
# となっているかと。

# 一応確認
ssh web
web$ cat /etc/passwd # boboがいると思います。

module

今はuserモジュールを利用しましたが

Module Index — Ansible Documentation

公式がかなり見やすい感じでまとまっているのでご参照を。

あとはtipsかな

変数を利用する

vars:
  hogehoge: bobo
tasks:
  - name : user add
    user: name={{hogehoge}}

varsと変数名と{{}}これだけ。

ユーザー入力

変数と似ているが

vars_prompt:
  hogehoge: "input username..."
tasks:
  - name : user add
    user: name={{hogehoge}}

yum, service

よくあるyumとserviceのモジュールを使う

先のplaybook.ymlに続き

...
- hosts: web
  tasks:
    - name: install apache
      yum: name=httpd state=latest
    - name: start apache and enabled
      service: name=httpd state=started enabled=yes

これでインストール、起動、有効化(再起動時に立ち上げる)ができる。

file, copy

webサーバー上にindex.htmlを置くことにする。自動で。

適当に~/index.htmlを作成してplaybook.ymlを編集する。

fileやdirectoryに関するものはfileモジュールを利用する。

...
- name: change ower
  file: dest=/var/www/html owner=vagrant recurse=yes
- name: copy index.html
  copy: src=./index.html dest=/var/www/html/index.html owner=vagrant

with_items, notfiy

まとめてpackageを入れたいときに毎回yumモジュールを記載するのは面倒くさいのと、かなり読みにくい感じになってしまうのでwith_itemsモジュールを利用する。

また、phpパッケージいれたらhttpdを再起動したいかと。その場合にはnotifyを利用する。

ある処理が行われた時に、notifyに指定されてるhandlerの処理を行うというもの。

べき等性を保つために何の変化もなければ動作しない。

また、毎回動作するわけではなく、最後に一度動くようになっているらしい。

...
- name: install php packages
  yum: name={{items}} state=latest
  with_items:
    - php
    - php-devel
    - .....
  notify:
    - restart apache # 下のhandlersのいずれかを指定
handlers:
  - name: restart apache
    service: name=httpd state=restarted

dbサーバーのセットアップ

まぁ同様にyumモジュール使ってserviceモジュールで再起動するようにしたら良い。

が、centos7って標準レポジトリからmysql-serverが消えている模様。

ということで

mariadb-serverとmariadbサービスということに気をつけて設定すればOK

あとはまとめてDBとuser作りたいので、mysql_dbとmysql_userというモジュールを利用する。

あと多分python mysqldb moduleが必要だと言われるかと思うので、

MySQL-pythonを入れる必要があるかと。

hosts: db
sudo: yes
tasks:
  - name: install mariadb
    yum: name={{item}} state=latest
    with_items:
     - mariadb-server
     - MySQL-python
  -name: start mariadb and enabled
    service: name=mariadb state=started enabled=yes
  -name: create a database
    mysql_db: name=mydb state=present
  -name; create a user for mydb
    mysql_user: name=dbuser password=dbpassword priv=mydb.*:ALL state=present
ssh db
mysql -u dbuser -p mydb

あとはついでにgitをhostサーバーに入れて、 せっかく作ったplaybook.ymlとかをいれておくとしよう。

hosts: localhost
sudo: yes
tasks:
  - name: install git
    yum: name=git state=latest

Vagrant, ansible, Docker

違いはなんだろうか

最近この辺のインフラツールを扱っていたので 違いやら使いどころやらを整理してみる。

Vagrant

これは一番わかりやすい。

インフラの最もベースとなるOSやらメモリ容量やらストレージのサイズやらを管理するための共通的なインターフェースをもったアプリケーション

という感じ。

VirtualBoxの設定もできるし、azureの立ち上げとかもできるっぽい。

ansibleやDockerと絶対的に異なるのは、マシンパワーなどを変更したりするのはVagrantからしかできないか。

生成するインスタンスに対して環境構築を行うためのprovisionの機構ももちろんある。

とはいえ、shellでやったり直接コマンドを書いたりする。

あと、後で出てくるがdockerに比べてやっぱり遅い。

ホスト型なのでOSのインストールやらネットワークの構築やらのためのオーバーヘッドが発生するためである。

ansible

環境構築ツールとでも呼ぼうか。

数ある環境に対して個別にソフトウェアなどをインストールせずとも同様の環境を構築することができる。

例えば、vagrantで作成した10VMに対して一括でdockerを入れたりもできる。

(まぁ別な方法としてはvagrantのprovisionの段階で入れておくこともできる。)

vagrant側も実はansibleプラグインがありymlを利用することができる。

ymlファイルでかけるってのがいいところなのかな。

実行条件を書いたり、設定のためのモジュールが多く用意されているので不必要なら入れないとか元々入っている場合には無駄に入れないとかもできる。

docker

上の二つとはちょっと異なっていて、

作成したインスタンス上(作ったvirtual machine)にて動作させるものであり、設定を閉じた「コンテナ」というものの中で行い不必要になったらコンテナごと破棄ができる。

作成ミスったら設定修正して再生成とかを行うように作られていそう。

使っていると環境をプログラミングしている気になってくる!

あとは、環境をdocker imageとして管理していてcommitを繰り返すことにより上に積み重ねていくようなこともできる。

また、Dockerfileを共有することによりdockerが入っていれば同じ環境を即座に生成することができるようになる。

あとはdocker hubから既にいい感じに設定されているdockerfileを取得し作ることもできる。

今後は自分でjava入れたりapache入れたりすることもなくなってくるのかな。

まぁ便利になったものだ。

Docker

Dockerさわってみよ

昨今流行っているdockerを遅まきながらに触ってみようかと思う。

vagrantとansibleは利用していてなんとなーく分かったけど、

dockerだけはいまいちまだ感覚がつかめていない。

Dockerを準備する

docker搭載済みのubuntuvagrant boxが存在するらしいのでこちらを利用しよう。

phusion/baseimage-docker · GitHub

ここからVagrantfileを取得し、vagrant upすればおっけー。

vagrant up
vagrant ssh
docker --version

Dockerを使う

さて、起動したのは良いものの何から手をつけたら良いものか。

dockerがインストールされたubuntu上に、

https://hub.docker.com

からマシンイメージのようなものを取得して展開することになりそうだ。

docker pull # docker hubからイメージを取得する
docker run # イメージからcontainerを生成
docker commit # containerの状態をイメージに保存する
docker push # docker hubへイメージを登録する

上記コマンドはクラスからインスタンスを生成するようなイメージがある。

またgitと同様にマシンの状態をコードで保存できるようになっているようだ。

docker search hogehoge # docker hubから検索できる
docker images # pullしたイメージを確認できる
docker inspect REPOSITORY:TAG # 詳細を確認できる
docker rmi REPOSITORY:TAG # イメージの破棄ができる

Dockerをさらに使う

これまでのコマンドで一通りdockerを通じて管理することができるようになった。

さて、実際に使っていこう。

docker run echo "hello world" # お決まりのhello world
docker ps # コンテナを確認できる
docker ps -a # 動作が終了したコンテナも含む
docker rm ID # コンテナを削除する

単発で死ぬので、継続的なものを使ってみよう。

docker run -d centos command # バックグラウンドで実行
docker logs # 実行結果を見れる
docker attach # フロントに持ってくる
docker kill # コンテナを終了する
docker start # コンテナを再開する

これでコンテナに対する操作はほぼできるようになる。

Dockerイメージを利用する

まずはコンテナ内に入って操作する。

docker run -i -t centos /bin/bash

# 別なターミナル
touch hoge.txt
exit

# 戻ってきた
docker commit CONTAINER_ID NAME

元のcentosに対して加えた変更をさらに保存するイメージが出来上がる。

とはいえ、これだとbuild processが不透明すぎて怖いよね。

ってときには、docker buildとDockerfileというもの利用して、 元となるimageからbuild processを積み上げていくようにする。

たとえば

FROM centos
MAINTAINER bo <bo@gmail>
RUN echo "now building..."
CMD ["echo", "now running...."]

RUNはbuild時、CMDはrun時に実行される。

docker build -t bobo/echo .
## now building...
docker images # 確認できる
docker run bobo/echo
## now running...

buildの末尾の.はカレントディレクトリを指している。

こんなんでイメージとコンテナは出来上がる。

確かにvagrantに比べると段違いの速さだし、 本当に環境構築のみに集中できる環境がそこにはある。

おもしろい技術だ。

ちょっとcentos7上にhttpdを立てようとしてみたら 権限の問題なのかrpmがunpackingできないとのことでインストールできなかった。

Bug 1012952 – docker: error: unpacking of archive failed on file /usr/sbin/suexec: cpio: cap_set_file

こういうエラーらしいが解決策が公式にないんよね。

諦めてdocker hubからhttpdのイメージを持ってくるかなー。

httpdを実行させてみよう

Vagrantfile

config.vm.network :forwarded_port, guest:80, host:3000

これで自分のmac(3000) -> virtual machine(80)にフォワードする。

vagrant up # VM起動
vagrant ssh # sshで入る
docker pull httpd # officialからhttpdのdockerイメージ取得
docker run -it --rm -p 80:80 httpd # httpdイメージを80から80にフォワードした状態で起動する。

この-p 80:80のoptionで詰まった。

確かにdockerプロセスがVM上のどこにマッピングされるかなんて書いてなかったしな。

これで

It Works!

とか出るはずです。

ローカルでの開発環境を構築する

汚れない開発環境を作るとしよう

macでの開発を行っているけど、荒れるのが嫌いなので ローカル開発環境を構築することにします。

Vagrant, VirtualBox入れる

ここ参照してください。

Centosを立ち上げる。

mkdir mycentos
cd mycentos
vagrant init chef/centos-7.0
vim Vagrantfile
# config.vm.network "private_network", ip: "192.168.33.10"
# このコメントアウトを外す
vagrant up # これで立ち上がる

Centosの設定

provisionを使う手もあるけど、 gitでshellスクリプトを管理しておける方が良さげっぽい。

git様様ですねー。

ってことで

vagrant ssh
sudo yum install -y git
git clone https://github.com/toriumi0118/centos70
cd centos70
./run.sh

exit
vagrant suspend # 一時停止したいとき

これでphp, ruby, rails, nodejs, mariadbが入るはず。 javaも入れておこうか悩み中。 セットアップ内容を変更するときは main.yml を修正すればOK。

詳しくは以下を参照。

Vagrant tips

共有フォルダってのがあるらしい

Vagrantfileがあるhost OS上のフォルダと guest OS上の/vagrantが共有らしい

シンボリックリンクをguest OS上に貼っておけば webサーバーの内容をhost OSから変更することができる。

Provision

サーバー作成時の色々な設定などを実行するための機構。

Vagrantfileへ

# config.vm.provision :shell, :inline => "echo hello world"
config.vm.provision :shell, :path => "provision.sh"

こんな記載をして、Vagrantfileと同列の場所に

sudo yum -y install httpd
sudo service httpd start
sudo chkconfig httpd on

sudo service iptables stop
sudo chkconfig iptables off

こんなファイルを置いておけば、httpdサービスが立ち上がった状態の 仮想マシンが生まれる。

Boxを作成する

vagrant package

このコマンドを現在実行しているguest OSフォルダにて実行すればOK。 このフォルダ直下にpackage.boxというファイルができるので、

vagrant box add my-box-name package.box
rm package.box # ~/.vagrant.d/boxesに入るので不要

これで追加できる。

Vagrant

仕事の関係でVagrant

ちょっとごたごたがあって、趣味アプリの時間が取れなくなってしまった。

なので、最近すこしキャッチアップを始めたVagrantについて記載。

Vagrantとは

仮想マシンを構成をプログラムするためのツールってところだろうか。

いろいろな仮想マシンに対してプログラムできるらしいが、

VirtualBoxに対してやってみるか。

暇なときにazureに対してもやってみよう。

VirtualBoxのインストール

Downloads – Oracle VM VirtualBox

ここでダウンロードして、インストール。

Vagrantのインストール

Download Vagrant - Vagrant

ここでダウンロードして、インストール。

boxの取得

今回はcentos7でやってみるか。

boxってのはテンプレートという感覚。 azureでいうマシンイメージやら awsでいうamiに近いのかな。

vagrant box add ¥
https://atlas.hashicorp.com/chef/boxes/centos-7.0

## other commands
vagrant box list # boxを確認できる。
vagrant box remove hogehoge # boxを削除できる

こんな感じ*1

仮想マシン立ち上げる

mkdir testcentos7 # 仮想マシンインスタンスごとに一つ必要
cd testcentos7
vagrant init chef/centos-7.0
vagrant up # Vagrantfileがあるフォルダで実行すると立ち上がる

VirtualBoxを立ち上げると起動が確認できる。

Vagrantのコマンド達

vagrant status # ステータス確認
vagrant suspend # 一時停止
vagrant resume # 再開
vagrant halt # 停止
vagrant up # 起動
vagrant ssh # ssh接続する

*1:ちなみに、取得したboxは ~/.vagrant.d/boxes 以下にある