良いUIを生み出す7つのルール その1
要約してみた
いちいちグーグルとかでサイトの構成となりそうなものを探したりするのがめんどくさいから良い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搭載済みのubuntuのvagrant boxが存在するらしいのでこちらを利用しよう。
phusion/baseimage-docker · GitHub
ここからVagrantfileを取得し、vagrant upすればおっけー。
vagrant up
vagrant ssh
docker --version
Dockerを使う
さて、起動したのは良いものの何から手をつけたら良いものか。
dockerがインストールされたubuntu上に、
からマシンイメージのようなものを取得して展開することになりそうだ。
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できないとのことでインストールできなかった。
こういうエラーらしいが解決策が公式にないんよね。
諦めて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のインストール
ここでダウンロードして、インストール。
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接続する