akiyoko blog

akiyoko の IT技術系ブログです

ゼロからはじめる Scrapy(AWS でお手軽データ分析 その1/3)

Python で Web クローリング・スクレイピングするためのツールといえば、 今や Scrapy が真っ先に候補に上がりますよね。


などを見ると、Beautiful Soup4pyquery も有力候補に見えますが、Google Trends を見てみるとやはり「Scrapy」が一番人気っぽいです。







目的

最終的には下図のように、Scrapy → Amazon S3 → Amazon Athena → Amazon QuickSight という流れで、AWS のいろいろなサービスを使ってお手軽データ分析をしてみたいと考えています。

f:id:akiyoko:20170311224916p:plain

今回は以下のように、Scrapy で Web スクレイピングして作成した CSVファイルを、S3 に格納するところまでを試してみます。

f:id:akiyoko:20170311224711p:plain:w400



まずは試しに、

http://www3.boj.or.jp/market/jp/stat/jx170301.htm
f:id:akiyoko:20170304235233p:plain

をスクレイピングしてみます。


 

事前準備

Mac に Scrapy をインストールします。

使用している Python は 2系ですが、Scrapy 1.1 以降は Python 3 対応済み(ただし Windows はサポート外)なので、3系でも特に変わりはないはずです。

前提条件

ローカル環境は以下の通りです。

  • MacOS Sierra 10.12.3
  • Python 2.7.12 (Anaconda 4.2.0)

インストール

pip でインストールします。

$ pip install scrapy

Scrapy (1.3.3)


 

プロジェクト作成

ひな形を作成

scrapy startproject コマンドを実行して、プロジェクトのひな形を作成します。

$ cd ~/PycharmProjects
$ scrapy startproject marketstat
$ cd marketstat

$ tree
.
├── marketstat
│   ├── __init__.py
│   ├── items.py
│   ├── middlewares.py
│   ├── pipelines.py
│   ├── settings.py
│   └── spiders
│       └── __init__.py
└── scrapy.cfg


 

Item を作成

まずはじめに、ひな形として作成された items.py を修正していきます。
Item クラスは、スクレイピングしたデータを入れるための箱になります。

以下のようなデータ項目を作成することにします。

項目名 変数名
日付 date
項目 name
予想値 expected_value
速報値 preliminary_value
確報値 confirmed_value


marketstat/spiders/items.py

# -*- coding: utf-8 -*-

import scrapy


class MarketstatItem(scrapy.Item):
    date = scrapy.Field()
    name = scrapy.Field()
    expected_value = scrapy.Field()
    preliminary_value = scrapy.Field()
    confirmed_value = scrapy.Field()


 

Spider を作成

次に、以下のコマンドを実行して、Spider のひな形を作成します。

$ scrapy genspider boj www3.boj.or.jp

 
作成された Spider のひな形を以下のように修正します。

marketstat/spiders/boj.py

# -*- coding: utf-8 -*-

from datetime import datetime
import scrapy
from pytz import timezone

from ..items import MarketstatItem


class BojSpider(scrapy.Spider):
    name = "boj"
    allowed_domains = ["www3.boj.or.jp"]
    date = datetime.now(timezone('Asia/Tokyo')).strftime('%y%m%d')
    start_urls = [
        'http://www3.boj.or.jp/market/jp/stat/jx{date}.htm'.format(date=date),
    ]

    def parse(self, response):
        for sel in response.css('table tr'):
            item = MarketstatItem()
            item['date'] = self.date
            item['name'] = sel.css('td::text').extract_first()
            item['expected_value'] = sel.css('td:nth-last-child(3)::text').extract_first()
            item['preliminary_value'] = sel.css('td:nth-last-child(2)::text').extract_first()
            item['confirmed_value'] = sel.css('td:nth-last-child(1)::text').extract_first()
            yield item

parse メソッドを修正して、スクレイピングしたデータを格納した Item オブジェクトを yeild するようにします。


ちなみに、scrapy shell コマンドを実行することで、ipython が立ち上がってスクレイピングのデバッグ実行ができるため、目的の Webページの CSS要素を特定するのに便利です。

$ scrapy shell http://www3.boj.or.jp/market/jp/stat/jx170301.htm
    ・
    ・
In [1]: print(response.css('table tr')[1].css('td::text')[0].extract())
銀行券要因

(参考)http://qiita.com/ttomoaki/items/05d3dc104a695f939d63



なお、

sel.css('td::text')[0].extract()

とせず、

sel.css('td::text').extract_first()

とすることで、指定した要素が見つからない場合に IndexError が発生せずに None が返されるので非常に使い勝手がよいです。また、「::text」を付けないと HTMLタグが含まれた状態で値が取れてしまうので、これも必須のテクでしょう。


(参考)Scrapy Tutorial — Scrapy 1.3.3 documentation



 

スクレイピング実行

crawl コマンドの引数に Spider名(今回の例では「boj」)を指定します。

なお、-o オプションで出力するファイル名を指定することができます。

$ scrapy crawl boj -o test.csv


test.csv

date,expected_value,preliminary_value,name,confirmed_value
170301,,,,
170301,-600,-600,銀行券要因,
170301,"-11,100","-13,300",財政等要因,
170301,"-11,700","-13,900",資金過不足,
170301,"9,000","9,000",国債買入,
    ・
    ・


ここで、settings.py に

###############
# OUTPUT FILE #
###############
FEED_FORMAT = 'csv'
FEED_URI = '/Users/akiyoko/tmp/test.csv'

と書いておけば、-o オプションをいちいち指定する必要はありません(どちらも指定した場合は、-o オプションの方が優先されるようです)。


またここで、作成した Spider のインスタンス変数名を「FEED_URI」のプレースホルダとして使うことも可能です。

FEED_URI = '%(date)s.csv'


 

S3 に格納する方法

S3 に格納するのも簡単です。
例えば「marketstat」というバケットに格納するなら、settings.py に

###############
# OUTPUT FILE #
###############
FEED_FORMAT = 'csv'
FEED_URI = 's3://marketstat/%(name)s/%(date)s.csv'

###########
# AWS KEY #
###########
AWS_ACCESS_KEY_ID = 'AKIXXX'
AWS_SECRET_ACCESS_KEY = 'XXXXX'

とすればよいです。簡単ですね。


Spider に任意の引数を渡す

ちょっとした小技ですが、-a オプションを指定することで、Spider に任意の引数を渡すことができます。

(参考)スパイダー — Scrapy 1.2.2 ドキュメント

$ scrapy crawl boj -a date=170303


Spider 側からは、__init__ メソッド内で引数を受け取ることができます。
また、__init__ 内でインスタンス変数を上書きすることで、parse メソッドが実行される前にインスタンス変数の値を書き換えておくことが可能です。


marketstat/spiders/boj.py

class BojSpider(scrapy.Spider):
    name = "boj"
    allowed_domains = ["www3.boj.or.jp"]
    date = datetime.now(timezone('Asia/Tokyo')).strftime('%y%m%d')
    start_urls = [
        'http://www3.boj.or.jp/market/jp/stat/jx{date}.htm'.format(date=date),
    ]

    def __init__(self, date=None, *args, **kwargs):
        super(BojSpider, self).__init__(*args, **kwargs)
        if date is not None:
            self.date = date
            self.start_urls = [
                'http://www3.boj.or.jp/market/jp/stat/jx{date}.htm'.format(date=self.date),
            ]

    def parse(self, response):
        for sel in response.css('table tr'):
            item = MarketstatItem()
            item['date'] = self.date
            item['name'] = sel.css('td::text').extract_first()
            item['expected_value'] = sel.css('td:nth-last-child(3)::text').extract_first()
            item['preliminary_value'] = sel.css('td:nth-last-child(2)::text').extract_first()
            item['confirmed_value'] = sel.css('td:nth-last-child(1)::text').extract_first()
            yield item


 

シェルを作成

日付を範囲指定してクローリングするなら、例えば以下のようなシェルを作成すればよいでしょう。

#!/bin/bash

START_DATE=170220
END_DATE=170301

for (( DATE=$START_DATE ; $DATE <= $END_DATE ; DATE=`date -j -v+1d -f %y%m%d $DATE +%y%m%d` )) ; do
   echo $DATE
   scrapy crawl boj -a date=$DATE
done


(参考)



なお、大量のリクエストが発生する場合は、settings.py に

DOWNLOAD_DELAY = 3  # or 30 ?

などと設定しておきましょう。


(参考)Settings — Scrapy 1.3.3 documentation


 

まとめ

今回、知識ゼロから Scrapy を使って Web スクレイピングを試してみました。
実際使ってみて、仕組み(どこを触ればいいか)さえ分かってしまえば、実装部分も少なくて非常に便利に使えることが実感できました。

次は、S3 に格納した CSVファイルを Amazon Athena と QuickSight を使ってデータ分析していきたいと考えています。

Vagrant と Ansible を連携させて Ubuntu 14.04 に MySQL, PostgreSQL を provision する手順

AnsibleとVagrantで開発環境を構築する - さくらのナレッジ
という記事を読んで、開発環境の Ubuntu サーバに MySQL や PostgreSQL をインストールするなら、Vagrant と Ansible を連携させた方がやりやすいな、と思ったのでメモがてらまとめておきたいと思います。


ベースとしては、以前使った Ansible Galaxy を使います。
具体的には、

インストールします。


Vagrant 以外の仮想サーバや通常のサーバに対して、MySQL や PostgreSQL を簡単にインストールする手順については、以下の過去記事を参照してください。

<過去記事>
akiyoko.hatenablog.jp

akiyoko.hatenablog.jp



ホスト

  • macOS Sierra 10.12.3
  • Vagrant 1.9.1
  • VirtualBox 5.1.14


macOS Sierra に Vagrant および VirtualBox をインストールする手順については、以下を参照してください。

<過去記事>
akiyoko.hatenablog.jp


ゲスト

  • Ubuntu 14.04

ゲストマシンのプライベート IPアドレスは「192.168.33.10」に設定しておきます。


データベース

  • MySQL 5.5.54
  • PostgreSQL 9.3.16


インストールと同時に以下の設定もおこなう想定です。

項目 設定内容
データベース名 myproject
データベースユーザ myprojectuser
データベースユーザパスワード myprojectuserpass


ちなみに、MySQL の root のパスワードは「rootpass」となります。
また、PostgreSQL の場合は「postgres」という Linuxユーザが作成されます。



 

MySQL のインストール

MySQL は ANXS.mysql でインストールします。

$ cd ~/dev/vagrant/ubuntu14
$ mkdir provisioning
$ ansible-galaxy install ANXS.mysql -p provisioning/roles


etc_mysql_my.cnf.j2 ファイル内の「character_set_server」および「collation_server」のキーワードを修正します。 *1

$ sed -i '' 's/^character_set_server/character-set-server/g' provisioning/roles/ANXS.mysql/templates/etc_mysql_my.cnf.j2
$ sed -i '' 's/^collation_server/collation-server/g' provisioning/roles/ANXS.mysql/templates/etc_mysql_my.cnf.j2


provisioning/hosts

[db-servers]
192.168.33.10


provisioning/site.yml

- hosts: db-servers
  become: true
  user: vagrant
  vars_files:
    - vars/mysql.yml
  roles:
    - { role: ANXS.mysql }

 

$ mkdir provisioning/vars

provisioning/vars/mysql.yml

mysql_current_root_password: ''
mysql_root_password: rootpass
mysql_databases:
  - name: myproject
mysql_users:
  - name: myprojectuser
    pass: myprojectuserpass
    priv: "myproject.*:ALL"


最終的なディレクトリ構成はこのような感じになります。

~/dev/vagrant/ubuntu14/
├── Vagrantfile
└── provisioning
    ├── hosts
    ├── roles
    │   └── ANXS.mysql
    │       ・
    │       ・
    ├── site.retry
    ├── site.yml
    └── vars
        └── mysql.yml


Vagrantfile

    ・
    ・
  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  config.vm.network "private_network", ip: "192.168.33.10"
    ・
    ・
  # Enable provisioning with a shell script. Additional provisioners such as
  # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
  # documentation for more information about their specific syntax and use.
  # config.vm.provision "shell", inline: <<-SHELL
  #   apt-get update
  #   apt-get install -y apache2
  # SHELL
  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "provisioning/site.yml"
    ansible.inventory_path = "provisioning/hosts"
    ansible.limit = "all"
  end


 

provision

サーバを初回起動する際に provision が実行されます。

$ vagrant up


起動済みのサーバには、以下のコマンドを実行することで provision が実行されます。

$ vagrant provision

  or

$ ansible-playbook -i provisioning/hosts provisioning/site.yml -k -vv

後者のコマンドの場合には、vagrant ユーザのパスワードが要求されます。

パスワードを入力したくない場合は、

$ vagrant ssh-config --host 192.168.33.10 >> ~/.ssh/config

### 念のためパーミッションを変更
$ sudo chmod 600 ~/.ssh/config

を設定しておけば、

$ ansible-playbook -i provisioning/hosts provisioning/site.yml -vv

で、パスワード無しで実行可能です。

 

動作確認

$ vagrant ssh

  or

$ ssh vagrant@192.168.33.10

でサーバにログインして、

$ mysql -u root -p

で動作確認します。




 

PostgreSQL のインストール

PostgreSQL は ANXS.postgresql でインストールします。

$ mkdir provisioning
$ ansible-galaxy install ANXS.postgresql -p provisioning/roles

provisioning/hosts

[db-servers]
192.168.33.110

provisioning/site.yml

- hosts: db-servers
  become: true
  user: vagrant
  vars_files:
    - vars/postgresql.yml
  roles:
    - { role: ANXS.postgresql }

 

$ mkdir provisioning/vars

provisioning/vars/postgresql.yml

postgresql_databases:
  - name: myproject
postgresql_users:
  - name: myprojectuser
    pass: myprojectuserpass
postgresql_user_privileges:
  - name: myprojectuser
    db: myproject
    priv: "ALL"


最終的なディレクトリ構成はこのような感じになります。

~/dev/vagrant/ubuntu14/
├── Vagrantfile
└── provisioning
    ├── hosts
    ├── roles
    │   └── ANXS.postgresql
    │       ・
    │       ・
    ├── site.retry
    ├── site.yml
    └── vars
        └── postgresql.yml


Vagrantfile

    ・
    ・
  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  config.vm.network "private_network", ip: "192.168.33.10"
    ・
    ・
  # Enable provisioning with a shell script. Additional provisioners such as
  # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
  # documentation for more information about their specific syntax and use.
  # config.vm.provision "shell", inline: <<-SHELL
  #   apt-get update
  #   apt-get install -y apache2
  # SHELL
  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "provisioning/site.yml"
    ansible.inventory_path = "provisioning/hosts"
    ansible.limit = "all"
  end


 

provision

サーバを初回起動する際に provision が実行されます。

$ vagrant up


起動済みのサーバには、以下のコマンドを実行することで provision が実行されます。

$ vagrant provision

  or

$ ansible-playbook -i provisioning/hosts provisioning/site.yml -k -vv

後者のコマンドの場合には、vagrant ユーザのパスワードが要求されます。

パスワードを入力したくない場合は、

$ vagrant ssh-config --host 192.168.33.10 >> ~/.ssh/config

### 念のためパーミッションを変更
$ sudo chmod 600 ~/.ssh/config

を設定しておけば、

$ ansible-playbook -i provisioning/hosts provisioning/site.yml -vv

で、パスワード無しで実行可能です。

 

動作確認

$ vagrant ssh

  or

$ ssh vagrant@192.168.33.10

でサーバにログインして、

$ psql -U postgres
  or
$ sudo su postgres
$ psql

で動作確認します。

おまけ

### ユーザ一覧
postgres=# \du

### データベース一覧
postgres=# \l

### データベース接続
postgres=# \c myproject

### テーブル一覧
myproject=# \d
myproject=# \dt

### 終了
myproject=# \q


 

書籍

PyCharm のオレオレ最強設定

先日、「最強のPython開発環境 PyCharmのすゝめ - Qiita」という記事がホットエントリーに上がっていましたが、かくいう私も、PyCharm は Python の統合開発環境(IDE)としてまさに最強だと考えています。


www.jetbrains.com



PyCharm(を含めた JetBrains 製品)は「out of the box(アウト・オブ・ボックス:箱から取り出してすぐに使える、難しい設定などは一切なしで使える)」というのが大きな魅力のひとつですが、今回紹介する環境設定をすることで更なる実力を発揮させることができます。


今回紹介するのはあくまで私の(オレオレ)最強設定ですので、異論・反論は緩やかな範囲でお願いします。。


 

事前準備(インストール)

まずはインストールについて。

環境

  • Mac OS:10.12.3(Sierra)
  • PyCharm:2016.3.2

インストール方法

少し前までは Homebrew Cask でインストールしていたのですが、Homebrew Cask が管理している PyCharm のバージョン情報がなかなか最新化されなかったりするので、公式サイトからアプリをダウンロードしてインストールするスタイルに変えました。


ということで、https://www.jetbrains.com/pycharm/download/ から、それぞれの環境に合わせたものをダウンロードします。

f:id:akiyoko:20170309233705p:plain



私は有償の「Professional Edition」を使っていますが、無償の「Community Edition」でも大抵の機能は使えますのでご安心を。

(参考)PyCharm :: Editions Comparison


なお、Professional Edition のライセンス料金はサブスクリプション方式になっていて、例えばパーソナルライセンスだと、

1年目 US $ 89.00 /年
2年目 US $ 71.00 /年
3年目以降 US $ 53.00 /年

となっています。

(参考)PyCharm: JetBrains Toolbox subscription





 

環境設定

上部メニューの[PyCharm] > [Preferences](ショートカットは「⌘ + ,」)から、PyCharm の環境設定が変更できます。

1.テーマ設定

[Appearance & Behavior] > [Appearance]

[UI Options]のTheme を「Darcura」(少し暗めのテーマ)に変更します。

f:id:akiyoko:20170310003027p:plain

理由:かっこいいから。

2.メモリ設定

[Appearance & Behavior] > [Appearance]

[Window Options]の「Show memory indicator」にチェックを入れます。

f:id:akiyoko:20170310003158p:plain

理由:メモリをクリアできるように。右下に使用メモリ量のインジケーターが表示されますが、これをクリックすることでメモリをクリアすることができるようになります。


f:id:akiyoko:20170310003752p:plain:w300


またここで、デフォルトのヒープメモリサイズを 2GB くらいに増やしておきます。

[Help] > [Edit Custom VM Options]

を選択すると、ファイルがまだ存在していなければ、
~/Library/Preferences/PyCharm2016.3/pycharm.vmoptions
が作成されます。

# custom PyCharm VM options

-Xms128m
-Xmx750m
-XX:ReservedCodeCacheSize=240m
-XX:+UseCompressedOops

これを、

# custom PyCharm VM options

-Xms128m
-Xmx2000m
-XX:ReservedCodeCacheSize=240m
-XX:+UseCompressedOops

などと書き換えて、PyCharm を再起動します。

(参考)IntelliJ IDEAのヒープサイズを増やす - Qiita



 

3.エディタ表示

[Editor] > [General] > [Appearance]

[Show line numbers]および[Show whitespaces]にチェックを入れます。

f:id:akiyoko:20170310003817p:plain

理由:
 ・行番号を表示したいから。
 ・空白スペースを可視化したいから。


 

4.コード補完

[Editor] > [General] > [Code Completion]

[Case sensitive completion]に「None」を選択。

f:id:akiyoko:20170310003834p:plain

理由:コード補完(control + space)の際、大文字小文字を区別しないで補完してほしいから。


 

5.タブの表示数

[Editor] > [General] > [Editor Tabs]

[Tab Closing Policy]の Tab limit を「10」から「50」に変更。

f:id:akiyoko:20170310003948p:plain

理由:タブを 10 個以上開くと勝手に閉じちゃう設定だと使いにくいから。


 

6.フォントサイズ設定

6.1. エディタのフォントサイズ

[Preferences] > [Editor] > [Color & Fonts] > [Font]

Scheme から[Save As]で、「Darcula copy」などという名前でコピーすると、フォントサイズが変更できるようになります。

「Size:10」くらいにしておきます。

f:id:akiyoko:20170310004021p:plain
f:id:akiyoko:20170310004036p:plain

理由:MacBook のディスプレイが 13インチと小さいので、できるだけ広い範囲でコードを見たいから。

6.2. コンソールのフォントサイズ

[Preferences] > [Editor] > [Color & Fonts] > [Console Font]

エディタとコンソールのフォントサイズは別々に設定が必要です。

f:id:akiyoko:20170310005558p:plain

こちらも「Size:10」くらいにしておきます。



 

7.PEP8 違反の警告

[Editor] > [Inspections]

  • [PEP8 coding style violation]
  • [PEP8 naming conversion violation]

を「week warning」から「warning」に変更。

f:id:akiyoko:20170310004146p:plain

理由:PEP8 違反の警告をワーニングに上げたいから。


(参考)最強のPython統合開発環境PyCharm - Qiita


 

8.プラグイン

[Plugins] で、以下のプラグインをインストールします。

  • CodeGlance(Sublime Text のミニマップ風)
  • gfm(GitHub Markdown プラグイン)
  • .ignore

インストールしていないプラグインは、検索して「Install」ボタンをクリックするとオンラインのリポジトリからダウンロードしてインストールすることができます。超便利。

f:id:akiyoko:20170310004817p:plain
f:id:akiyoko:20170310004832p:plain


 

9.Project ビューの表示設定

Project ビューの歯車アイコンをクリックして、

  • [Autoscroll to Source](Projectビューからシングルクリックでソースビューを開く)
  • [Autoscroll from Source](ソースビューを開くとProjectビューに該当モジュールがフォーカスする)

にチェックを入れておきます。

f:id:akiyoko:20170310010217p:plain



 

便利なショートカットなど

最後に非常に便利なショートカットをいくつか紹介します。

JetBrains 公式のチートシート もありますが、さすがに全部覚えきれませんよね。。

 

検索
ショートカット 説明
shift + ⌘ + f grep検索
opt + ⌘ + ↓ (↑) grep検索結果の前後を表示
⌘ + f ファイル内検索
(shift +) ⌘ + g ファイル内検索結果の前後を表示
⌘ + b 関数・メソッドの宣言にジャンプ
opt + ⌘ + F7 関数・メソッドを使用している箇所を検索
opt + ⌘ + ← (→) 履歴の前後を表示

 

タブ移動
ショートカット 説明
control + ← (→) タブ移動

 

ファイルを開く
ショートカット 説明
shift x 2 (素早く2回) クイック検索
⌘ + e 最近開いたファイルを開く
shift + ⌘ + o ファイル名でファイルを開く

 

差分表示
ショートカット 説明
(Project ビューで) ⌘ + d 別ファイルとの Diff

 

その他
ショートカット 説明
⌘ + ↑ ナビゲーションバーを操作
opt + F12 Terminal を開閉
shift + ⌘ + a 利用できるアクションを検索


 

まとめ

デフォルトの環境設定を何も弄らなくても、PyCharm は快適に動いてくれます。
しかしながら、今回のような環境設定をすると、PyCharm はその秘めたる力を開放してくれます。まだ見つけられていない素敵な設定を見つけたら、この記事をどんどん更新していきます。

それでは、素敵な PyCharm ライフを!

「ビットコインとか勉強会#5」に参加してきました

会場

株式会社オウケイウェイヴ 東京本社
東京都渋谷区恵比寿1-19-15(ウノサワ東急ビル5階)

Twitter

twitter.com



仮想通貨と言えば・・。
Coincheck様、いつもお世話になっています。


ビットコイン取引高日本一の仮想通貨取引所 coincheck bitcoin
ビットコイン取引高日本一の仮想通貨取引所 coincheck bitcoin



 

全体の感想など

前回に続いて二度目の「ビットコインとか勉強会」でしたが、今回はビットコイン自体の話ではなく、それに付随する周辺事情の話題がメインでした。


<過去記事>
akiyoko.hatenablog.jp


トークン? CounterParty? OpenAssets? the DAO?
恥ずかしながら、話を聞いてもあまり理解が出来なかったので、勉強会の後で少し調べてみました。ついでにビットコインの仕組みについても少し詳しく読んでみました。


ビットコインの仕組み

トークンについて


要するに「トークン」とは、「ブロックチェーン上で発行された独自コイン」のことなのですね。まだまだ勉強が足りないようです。。


ブロックチェーンは革命なのか? – アゴラ(中村 伊知哉)」を読んで、現在積ん読している本。もうすぐ読み始める予定です。







 

ビットコイン上に発行できるトークンって何?

小川 晃平 氏(AccumBit, inc CEO)



CounterParty、OpenAssets、Coluを比較しつつ、カラードコインの面白さについて解説。

  • カラードコイン
    • トークンのやりとりができるプロトコル
    • Ethereumと違ってとスマートコントラクトは含まれない
    • CounterParty, Colu, OpenAssets Protocol, etc
    • OP_RETURN(Bitcoinの仕様上、上限80byteまで)
      • 宛先が要らない空のアウトプット
  • 何が実現できる?
    • 例えば、分散化不動産取引とかが実現する?
    • 日本円を Bitcoin 上で取り引き
      • でも、1byteあたり200satoshiのトランザクションの取り引き手数料が掛かる?
    • ゲーム上のトークンが他のゲームでも使えたり、後で売れたりとか
      • マネーロンダリングに使われちゃう?規制化??
    • 宝石のトレースシステム、メタ情報を追加
    • 「ある物」を買える権利をトークン化??
  • 実用化に向けた問題点
    • マネーロンダリング
    • 法律の問題(5月・6月に施行される法律でトークンが壊滅しちゃうかも??)
    • トークン上がる上がる詐欺
    • ウォレットのバグ



 

SPVウォレットを作ってみた。

澤田 健都 氏(株式会社クロスブリッジ)


docs.google.com

  • Bitcoinを使ったサービスを作りたい!
  • ウォレットはいろいろある
    • SaaS だと、Block.io, Blockchain.info, BitGo
  • 自分でノードを立てよう!
    • bitcoin.d, C++
    • Bitcore, Node.js
      • bitpay??
    • btcd, Go
  • ↑は Full-node で使いづらい。。じゃあ、SPVノードを作ろう!!
    • 事前に必要なデータの条件(フィルタ)を伝えることができるので、Full-node に比べて無駄がない
    • ブルームフィルタは偽陽性(False Positive)
  • SPV のデメリット
    • プライバシー問題
      • フィルタを敢えて曖昧にしておく?
    • TXの署名の検証ができない
      • 信頼できるpeerを選ぶ? 0-confirmationを受け付けない、とかで解決?
  • 主なSPVの実装
    • Bitcoinj, Java
      • Androidアプリで多数利用しているっぽい
    • BreadWallet, Objective-C

「簡単、クレカ決済! PAY.JPを使ったクレカ決済の仕組み・開発運用時の考慮点について」に参加してきました

会場

株式会社ビズリーチ
東京都渋谷区渋谷2-15-1 渋谷クロスタワー 12F


 

全体の感想など

最近、決済関連の勉強会が頻繁に開催されているような気がするのですが、今回は、WebPay サービス終了にあたって公式移行サービスを発表したことで最近話題になった「PAY.JP」の勉強会です。

勉強会の会場はビズリーチ。オフィスにビーチやらグリーンがあるというのを耳にしたことがあったので、まずはそっちに興味津々。

行ってみると、ありましたー!!

f:id:akiyoko:20170214191851j:plain:w500
(グリーンの逆側しか撮ってなかったのですが雰囲気は伝わるかと。。)


気になる方は、こちらの記事をどうぞ。
hrnabi.com



それはさておき、今回の勉強会では実際に「PAY.JP」を使ってサービスを開発・運営した開発者の意見が聞けたのはすごくよかったです。選定の経緯としては、昨年中に PAY.JP のほか「Yahoo!ウォレット FastPay」「WebPay」「Cybersource」(仕組みが違いすぎて却下)を比較検討して、開発しやすそうということで採用に至ったとのこと。その時点ではまだ「Stripe」は本番利用できていなかったとは思うのですが、「PayPal」や「LINE Pay」なども検討に入れたのかどうかなども聞いてみたかったところです。


しかしながら結局、PAY.JP は越境EC には対応していないらしいので(要確認)、私のニーズに合うのは Stripe か PayPal のどちらかかなぁと思いました。


 

簡単、クレカ決済! PAY.JPを使ったクレカ決済の仕組み・開発運用時の考慮点について

小山健太



  • 求められるもの
    • 工数掛けたくない
    • セキュリティは担保したい
    • 堅牢性
    • 保守性
  • コード自体をシンプルにしよう
  • PAY.JP の仕組み
    • カード情報をトークン化
  • できること
    • クレカ情報の保存(暗号化した状態)
    • 支払い、与信枠確保、返金
    • 定期課金(月・年単位、トライアル期間)
    • 支払い時や定期課金時にWebhook送信
  • ドキュメントが日本語
  • カード情報を持つ企業は以下のいずれかが必要
    • グローバルセキュリティ基準の「PCI DSS」を取得
    • 書くカードブランド制定のセキュリティ基準プログラムに準拠
  • サービス選定基準
    • 料金
    • 対応カードブランド
    • 対応通過
    • 不正検知オプションサービス
    • 入金サイクル
    • サービスの継続性
    • 開発効率・運用性
  • 運用時は、エラーログやレスポンスを保存しておくべし!
  • 開発時の難しかったポイント
    • 問題①:API越しのデータとの不整合
      • そもそも重複データを持たせないようにする
      • データ不整合が発生した場合はエラーを出して検知し、運用でカバー!?
      • データ不整合が発生した場合は、API経由でPAY.JP側もロールバックしちゃう?!
    • 問題②:外部サービスへのリクエストがタイムアウトしたら?
    • リクエストタイムアウトの設定時間を長めに
    • エラーログを出して検出
    • 問題③:HTTPリクエストの結果を待って次のリクエストを・・と処理が同期的になりがち
  • その他
    • 電子マネーはサポートしてないが、Apple Pay、PAY.JP アカウントのみ対応
    • ログは fluentd で ElasticSearch に保存して、エラーログだけ Slack に通知
    • テスト環境と本番環境の二環境しかない、Admin画面がしょぼいのはデメリット

macOS Sierra のクリーンインストールから Python 開発用の初期設定まで一挙公開

先日ついに、自宅の MacBook Pro の OS を Yosemite(!!)から一気に Sierra にアップデートしました。通常のアップデートだと動作が重くなるという記事 も見かけたので、今回はクリーンインストール(ハードディスクを初期化したまっさらな状態からのインストール)に初挑戦してみました。

そこで、macOS Sierra のクリーンインストールから Python 開発用の初期設定までを、今回は一挙公開してみることにします。

MacBook Pro のスペック

MacBook Pro Retinaディスプレイ MF840J/A(Retina, 13-inch, Early 2015)
液晶サイズ:13.3インチ
CPU:Core i5 / 2.7 GHz / 2コア
SSD:256 GB
メモリ:16 GB(8GBから増設)
重量:1.58 kg




macOS Sierra のクリーンインストールおよび初期設定の手順は以下となります。

以下、開発向けの初期設定手順です。

(なお、本記事の手順およびアプリのバージョン等は、2017年2月時点のものです。)

こちらも参考に。



 

1. macOS Sierra のインストール

1.1. Sierra への OSアップデート

クリーンインストールの前に、OS を一旦 Sierra にアップデートする必要があります。


[Appleメニュー] > [このMacについて] から、[ソフトウェア・アップデート]をクリックします。
f:id:akiyoko:20170209235949p:plain:w500

App Store が立ち上がるので、「無料アップグレード」をクリック。
f:id:akiyoko:20170210000014p:plain

あとは適宜インストールしていきます。
後で再度クリーンインストールするので、設定は適当で構いません。
f:id:akiyoko:20170210000119p:plain


インストールが完了したら、バックアップを適宜実施しておきます。


Apple AirMacTimeCapsule-3TB ME182J/A

Apple AirMacTimeCapsule-3TB ME182J/A




最後に、クリーンインストールをするためにシステム終了をします。



 

1.2. ハードディスクの初期化

「⌘ + r」を押したまま電源ボタンをクリックして、「macOSユーティリティ」を起動させます。

(参考)Mac の起動時のキーコンビネーション - Apple サポート



「ディスクユーティリティ」からハードディスクを初期化します。

f:id:akiyoko:20170210010308p:plain


左側のメニューから「Macintosh HD」を選択して「消去]をクリック。

f:id:akiyoko:20170210010431p:plain


「Mac OS Extended (Journaled)」形式でフォーマットします。

f:id:akiyoko:20170210010530p:plain

f:id:akiyoko:20170210010626p:plain


「☓」ボタンをクリックして、ユーティリティを終了します。

f:id:akiyoko:20170210010728p:plain



 

1.3. Sierra のクリーンインストール

続けて、macOS Sierra のクリーンインストールを開始していきます。


「⌘ + r」を押したまま電源ボタンを押して起動した「macOSユーティリティ」から、「macOSを再インストール」を選択します。

f:id:akiyoko:20170210010845p:plain


ここで大事なポイントが。
ここでまず、Wi-fi に繋がっていることを確認しておきます。

f:id:akiyoko:20170210011011p:plain


プロキシの影響などでここから進まない場合があるようですが、ここで「おかしいな」と諦めて電源を切ってしまってはいけません(私はそれで一度ハマりました・・ Internet リカバリ経由で Yosemite のインストールからやり直さなくてはいけない羽目になってしまいますのでご注意を)。Wi-fi の設定を見直すか、別のネットワークに接続すると解決できることがあります。

f:id:akiyoko:20170210011123p:plain

f:id:akiyoko:20170210011253p:plain

f:id:akiyoko:20170210011356p:plain


インストールにしばらく時間が掛かります。


インストールが完了したら、初期設定が始まります。

f:id:akiyoko:20170210011500p:plain

f:id:akiyoko:20170210011633p:plain

f:id:akiyoko:20170210011807p:plain


バックアップを取っていた場合は「Time Machineバックアップから」を選択してバックアップからデータを復元します。今回は特にバックアップからの復元はおこないませんでした。

f:id:akiyoko:20170210012144p:plain

f:id:akiyoko:20170210012326p:plain


これまで使っていた Apple ID でサインインします。

f:id:akiyoko:20170210012529p:plain

f:id:akiyoko:20170210012650p:plain


アカウントを作成します。
ちなみに、フルネーム、アカウント名、パスワードは後で変更可能です。

f:id:akiyoko:20170210012814p:plain

f:id:akiyoko:20170210012954p:plain

別のデバイスに承認要求が来たら、承認しておきます。


セキュリティのために暗号化は有効にしておきます。

f:id:akiyoko:20170210013114p:plain


書類とデスクトップのファイルを iCloud に保存する設定をしておきます。

f:id:akiyoko:20170210013318p:plain


データの自動送信はオフに。

f:id:akiyoko:20170210013458p:plain


Siri は後で設定オフにできるので、とりあえず入れておきます。

f:id:akiyoko:20170210013642p:plain

f:id:akiyoko:20170208234642j:plain


この後しばらくすると、macOS Sierra のデスクトップが表示されます。




2. 基本操作系の初期設定

2.1. トラックパッドの設定

[システム環境設定] > [トラックパッド]

とにかく全部チェックを入れておきます。

f:id:akiyoko:20170213213801p:plain
「軌跡の速さ」を少し速くしておきます。

f:id:akiyoko:20170210013923p:plain
f:id:akiyoko:20170210013939p:plain



2.2. Google 日本語入力を IME に設定

「Google 日本語入力」を 本家サイト からダウンロードしてインストールします。

f:id:akiyoko:20170210014045p:plain
f:id:akiyoko:20170210014056p:plain

Launchpad 上のアイコンはまとめておいて、名前を適当に付けておきます。

f:id:akiyoko:20170210014206p:plain



ここで、ConfigDialog を起動して、「¥キーで入力する文字」を「円記号(¥)」から「バックスラッシュ(\)」に変更しておきます。
f:id:akiyoko:20170308112233p:plain



次に、[システム環境設定] > [キーボード] > [入力ソース]から、「Google」以外のものを「−」で削除します。
f:id:akiyoko:20170210014126p:plain

またここで、「メニューバーに入力メニューを表示」のチェックを外しておきます。
f:id:akiyoko:20170210014231p:plain


(私は自宅の MacBook では日本語キーボードを使っているのですが)caps キーは全く使わないので、代わりに「control」キーを割り当てています。

[システム環境設定] > [キーボード]から[装飾キー]をクリックして、以下のように変更します。
f:id:akiyoko:20170210014455p:plain


ちなみに英語キーボードの場合は、以前は「Karabiner」を使ってスペースキー左右の ⌘キーを空打ちすることで英数/かなを切り替えていたのですが、2017年2月現時点で Karabiner がまだ Sierra に対応できていないようです。

いろいろ試行錯誤した結果、「英かな.app」というアプリをインストールすることで今のところ十分代替できています。
https://ei-kana.appspot.com




最後に、[システム環境設定] > [キーボード] > [ショートカット]から、[入力ソース]および[Spotlight]のチェックを全て外し、「^ スペース」「^ ⌥ スペース」「⌘ スペース」「⌥ ⌘ スペース」のホットキーを他の用途で使えるようにしておきます。
f:id:akiyoko:20170210014253p:plain
f:id:akiyoko:20170210014321p:plain


同じく[ショートカット]の[Mission Control]から「^ ←」「^ →」のショートカットの割り当てを外しておきます。
f:id:akiyoko:20170310215618p:plain



 

2.3. ファンクションキーの設定

「fn」キーを使わずとも、F7 でカタカナ、F10 で半角英数字に変換ができるようにします(Windows ライクな操作ができるように)。


[システム環境設定] > [キーボード]

f:id:akiyoko:20170210014521p:plain


2.4. Dock の設定

[システム環境設定] > [Dock]


以下の設定をおこないます。

  • Dock のアイコンサイズをやや小さめにして左側に配置
  • タイトルバーのダブルクリックでウィンドウを Dock にしまう
  • (ディスプレイが狭いので)Dock を自動的に隠す

f:id:akiyoko:20170210014544p:plain


3. セキュリティ系の設定

3.1. パスワードの設定

[システム環境設定] > [セキュリティとプライバシー]


必要に応じて変更しておきます。

f:id:akiyoko:20170210014612p:plain



3.2. スリープ/スクリーンセーバーの設定

Mac は一人でしか使わないし、めったに持ち出さないこともあり、ロック解除にパスワードは設定しない方向で。

f:id:akiyoko:20170210014636p:plain


[システム環境設定] > [デスクトップとスクリーンセーバ]


スクリーンセーバー起動までの時間を「開始しない」に設定し、スクリーンセーバーを起動しないように(すぐにディスプレイを切るように)しておきます。
f:id:akiyoko:20170210014702p:plain


3.3. ファイアウォールの設定

[システム環境設定] > [セキュリティとプライバシー] > [ファイアウォール]

f:id:akiyoko:20170210014721p:plain


3.4. 位置情報サービスの設定

[システム環境設定] > [セキュリティとプライバシー] > [プライバシー]

「Mac を探す」などで利用される位置情報サービスですが、(めったに外に持ち出さないこともあり)省エネのためにもオフにしておきます。

f:id:akiyoko:20170210014721p:plain


3.5. ディスプレイを切にするまでの時間設定

[システム環境設定] > [省エネルギー]

バッテリー使用時にディスプレイを切にするまでの時間を「2分」から「10分」に変更。

f:id:akiyoko:20170210014741p:plain

電源アダプタ使用時にディスプレイを切にするまでの時間を「10分」から「30分」に変更。

f:id:akiyoko:20170210014758p:plain


4. 見た目系の設定

Finder とメニューバーの設定をおこないます。

なお、Finder で隠しファイルを表示する際には、Sierra 以前では「Macで隠しファイルを表示する方法 - Qiita」で書かれているように、ターミナルで

$ defaults write com.apple.finder AppleShowAllFiles true
$ killall Finder

を実行していましたが、Sierra 以降では Finder 上で「⌘ + shift + . 」というショートカットで隠しファイルの表示/非表示を切り替えられるようになったので、今回は上記のコマンドは実行していません。

(参考)macOS Sierraでは隠しファイルを表示するショートカットキー「CMD+Shift+.」がFinderでも利用可能に。 | AAPL Ch.


 

4.1. デスクトップのアイコンをきれいに並べる

Finder の [表示] > [表示オプションを表示]から、

f:id:akiyoko:20170210014930p:plain


表示順序に「グリッドに沿う」を選択します。

f:id:akiyoko:20170210014947p:plain:w250


4.2. ウィンドウのサイドバーに表示される項目を選択

[Finder] >[環境設定] > [サイドバー] タブ

Finder のサイドバーに表示させたいものを適宜チェックしておきます。
f:id:akiyoko:20170210015024p:plain:w400


4.3. すべてのファイルの拡張子を表示

[Finder] > [環境設定] > [詳細] タブにて、「すべてのファイル名拡張子を表示」をチェックします。

f:id:akiyoko:20170210015042p:plain:w400


 

4.4. バッテリー残量の表示設定

メニューバー右上の電池マークをクリック -> 「割合(%)を表示」をチェック

f:id:akiyoko:20170210015054p:plain:w400


 

4.5. メニューバーの日付表示設定

[システム環境設定] > [日付と時刻] > [時計]

f:id:akiyoko:20170210015108p:plain
f:id:akiyoko:20170210015124p:plain


4.6. 音声アイコンを表示

[システム環境設定] > [サウンド]

f:id:akiyoko:20170210015144p:plain



5. その他の設定

5.1. ユーザのフルネームを変更

[システム環境設定] > [ユーザとグループ]

アカウント名やフルネームを変更する場合はこちらから。

f:id:akiyoko:20170210014814p:plain
f:id:akiyoko:20170210014831p:plain


5.2. コンピュータ名の変更

[システム環境設定] > [共有]


自動的にイマイチなコンピュータ名が付けられているので、ここでコンピュータ名を変更しておきます。

f:id:akiyoko:20170210014907p:plain



 

5.3. Siri をオフに設定

[システム環境設定] > [Siri] から、「Siriを有効にする」のチェックを外します。

f:id:akiyoko:20170210015207p:plain



5.4. スクリーンショット画像の保存場所を変更

ターミナル上で以下のコマンドを実行して、スクリーンショット画像の保存場所をデスクトップから変更しておきます。

$ defaults write com.apple.screencapture location ~/Pictures/
$ killall SystemUIServer

(参考)Mac - スクリーンショットで撮影した画像の保存場所を変更 - PC設定のカルマ




とりあえず、OS のインストールと初期設定は完了です。




6. 無いと困る系アプリ

次に、無いと困る系のアプリをインストールしていきます。

6.1. Google Chrome

パソコン版 Chrome からダウンロードしてインストール。


デフォルトのブラウザとして設定しておきます。
f:id:akiyoko:20170210015829p:plain
f:id:akiyoko:20170210015844p:plain:w400


たくさんタブを開くので、メモリ開放プラグインが必須です。
ちなみに「One Tab」を使っています。




 

6.2. Sublime Text 3

https://www.sublimetext.com/3
からダウンロードします。
f:id:akiyoko:20170210020751p:plain


以降、Sublime Text 3 の初期設定をしていきます。

(参考)[tips][Sublime Text] Sublime Text 3をインストールしたらまずやること


6.2.1. License

[Help] > [Enter License]

「----- BEGIN LICENSE -----」から「------ END LICENSE ------」までを貼り付け。

f:id:akiyoko:20170210020811p:plain:w500

6.2.2. Package Control のインストール

「control + ` (shift + @)」で Console を表示して、Installation - Package Control の「SUBLIME TEXT 3」タブに記載されているコマンド

import urllib.request,os,hashlib; h = 'df21e130d211cfc94d9b0905775a7c0f' + '1e3d39e33b79698005270310898eea76'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)

をコピペして Enter(上記コマンドは定期的に変更されるので、適宜公式ページを参照すること)。

f:id:akiyoko:20170210020854p:plain


6.2.3. 文字コード対応

「⌘ + shift + p」で Package Control を開き、Install Package を選択して、
f:id:akiyoko:20170210021008p:plain

「ConvertToUTF8」を検索してインストールします。
f:id:akiyoko:20170210021052p:plain

6.2.4. 全角スペースの表示

Package Control で「TrailingSpaces」を検索してインストールします。

f:id:akiyoko:20170210021109p:plain

全角スペースが認識できていないような。。

(参考)Sublime Text 3でスペース(半角・全角)やタブを可視化する方法



たまに発生する文字化けは「Codecs33」をインストールすることで解消できます。

f:id:akiyoko:20170210021156p:plain


(参考)MacでSublimeText3を使う際にShift_JISを文字化けしないようにする - Qiita


6.2.5. ユーザ設定

[Preference] > [Settings - User]

{
    "default_encoding": "UTF-8",  // デフォルトのエンコーディングの文字コード
    "draw_white_space": "all",  // タブやスペースなどの不過視文字を表示
    "fallback_encoding": "UTF-8",  // 文字コードが不明なファイルのエンコーディングの文字コード
    //"font_face": "",
    "font_size": 10,
    "highlight_line": true,  // 現在の選択行をハイライト表示
    "ignored_packages":
    [
        "Vintage"
    ],
    "line_padding_top": 2,  // 行間
    "show_encoding": true,  // エンコーディングの文字コードを右下のステータスバーに表示
    "tab_size": 4,
    "trailing_spaces_highlight_color": "comment",  // コメントの色でハイライト
    "trailing_spaces_regexp": " |[ \t]+",  // 全角スペースを正規表現に追加
    "translate_tabs_to_spaces": true,  // タブをスペースに変換
    //"trim_trailing_white_space_on_save": true,  // 空白の削除
    "word_wrap": true  // 自動改行
}

 

6.2.6. 再起動

最後に、Sublime Text 3 を再起動します。



6.3. HyperSwitch

タスクの切り替えを Windows風にするアプリです。


本家サイト からダウンロードしてインストールします。
何年も前からずっと β です。。

f:id:akiyoko:20170210021425p:plain

macOS Sierra 以降、環境設定でダウンロードした全てのアプリの実行を許可することができなくなったので、インストール時にアプリへのアクセス許可を一つ一つ設定する必要があります。
f:id:akiyoko:20170210021446p:plain:w400
f:id:akiyoko:20170210021457p:plain


起動後に、以下の設定をおこないます。

  • 「Run HyperSwitch in the background」にチェック
  • ウィンドウの移動を「⌘ + Tab」に変更
  • 「Include windows from other screens」にチェック(複数モニタを使っている場合)
  • 「Use shift to cycle backwards」にチェック

f:id:akiyoko:20170210021515p:plain

Dock にもメニューバーにも表示しないように設定。
f:id:akiyoko:20170210021529p:plain

以下のチェックは外しておきます。
f:id:akiyoko:20170210021541p:plain



 

6.4. Dropbox

https://www.dropbox.com/downloading?src=index
からアプリをダウンロードしてインストールします。

f:id:akiyoko:20170210225111p:plain:w350

起動したら Dropbox アカウントでログインしてファイルを同期します。
f:id:akiyoko:20170210225132p:plain:w350
f:id:akiyoko:20170210225146p:plain:w350

アプリへのアクセスを許可します。
f:id:akiyoko:20170210225202p:plain:w500
f:id:akiyoko:20170210225217p:plain


 

6.5. Alfred

App Store からインストールするとバージョン1系のものしかインストールできないので、公式サイト からダウンロードしてインストールします。

f:id:akiyoko:20170210021641p:plain


最後に、Alfred のホットキーを「⌘ ダブルタップ」に変更しておきます。
f:id:akiyoko:20170210021702p:plain


(参考)Alfredを起動するショートカットは⌘キー2回押しで - Qiita


 

6.6. Memory Clean

App Store からインストールします。

f:id:akiyoko:20170210015511p:plain


以下の設定をしておきます。

  • 「Icon Visible」をオフ
  • 「Auto Clean」にチェック

f:id:akiyoko:20170210015529p:plain:w400
「Auto Clean」をオンにします。
f:id:akiyoko:20170210015540p:plain:w400


 

6.7. Stuffit Expander

解凍ツール。App Store からインストールします。

f:id:akiyoko:20170210015558p:plain





以下、開発向けの初期設定です。


7. Xcode

7.1. Xcode

Xcode はいわば通過儀礼です。
App Store からインストールします。現時点の最新バージョンは 8.2.1 でした。

f:id:akiyoko:20170210015336p:plain


Xcode はサイズが 4GB 以上もある巨大アプリです。
もしここで、ダウンロードが全然進まなくて「Xcode をダウンロードできませんでした」というエラーが出てしまう場合は、Google Public DNS を使うように設定すればすんなりとダウンロードできる場合があります。


設定方法は、[システム環境設定] > [ネットワーク] から以下の設定をおこないます。
f:id:akiyoko:20150919030402p:plain
f:id:akiyoko:20150919030416p:plain

(参考)[Mac]Mac でGoogle Public DNS を設定する方法


起動すると追加のコンポーネントのインストールを要求されるので、インストールをしておきます。
f:id:akiyoko:20170210230709p:plain:w500


7.2. Command Line Tools

次に、Command Line Tools をインストールします。
Command Line Tools をインストールすると、合わせて Git などが自動的にインストールされます。

以下のコマンドを実行します。

$ xcode-select --install


ダイアログが出てくるので、「インストール」をクリックします。
f:id:akiyoko:20170210015356p:plain:w500
f:id:akiyoko:20170210015410p:plain
f:id:akiyoko:20170210015426p:plain



後で Homebrew をインストールするのにライセンスに同意する必要があるので、先に済ませておきます。

$ sudo xcodebuild -license


f:id:akiyoko:20170210015441p:plain




 

8. Homebrew

8.1. Homebrew

Homebrew は macOS 用パッケージマネージャーです。Python や Ansible などのパッケージをコマンド一発でインストールすることができます。

なお、Homebrew Cask という派生のパッケージマネージャーを使うと Macアプリのパッケージ管理もできるのですが、アプリの更新が遅かったり、Cask 自体の不具合があったり、アプリの管理がややこしくなってしまったという前回の反省から、今回は Homebrew Cask を使うのはやめました。


今回の初期設定の方針としては、基本的にアプリは Webサイトからダウンロードしてインストールすることとし、機能的に過不足がないものが App Store からも入手できる場合のみ App Store からインストールすることにしています。



ターミナルで以下のコマンドを実行して、Homebrew をインストールします。

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

念のため、コマンドは 公式サイト をチェックしておいた方がよさげです(記事によっては公式サイトとは異なるコマンドが記載されている場合があるようです)。

$ brew --version
Homebrew 1.1.9
Homebrew/homebrew-core (git revision d96b; last commit 2017-02-08)


Homebrew は「/usr/local/」以下にファイルをインストールするので「/usr/local/bin」にパスを通しておく必要があるのですが、最初から「/usr/local/bin」にパスが通っていたので、今回は特に何もしませんでした。

$ env $PATH
env: /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin: No such file or directory

もしパスが通っていなければ、以下を実行。

$ echo "export PATH=/usr/local/bin:\$PATH" >> ~/.bash_profile
$ source ~/.bash_profile


最後に、Homebrew の診断をしておきます。

$ brew doctor
Your system is ready to brew.


 

9. 開発系パッケージ

9.1. Git

Xcode の Command Line Tools でインストールされたものをそのまま使います。

$ git --version
git version 2.10.1 (Apple Git-78)
$ which git
/usr/bin/git


初期設定をしておきます。

$ git config --global user.name "akiyoko"
$ git config --global user.email "akiyoko@users.noreply.github.com"
$ git config --global color.ui auto


GitHub への接続設定をします。

~/.netrc

machine github.com
login akiyoko
password <パスワード>

なお、.netrc のパーミッションは 600 にしなければ動作しません。

$ chmod 600 ~/.netrc

 

9.2. Python

macOS にはデフォルトで Python 2.7 が入っています。

$ python --version
Python 2.7.10
$ which python
/usr/bin/python


ここで改めて、Homebrew で pyenv をインストールし、pyenv から Anaconda をインストールして、Python系の周辺パッケージのセッティングをまとめて済ませます。


<過去記事>
akiyoko.hatenablog.jp


### Homebrew で pyenv をインストール
$ brew install pyenv

$ pyenv --version
pyenv 1.0.7

$ cat << EOF >> ~/.bash_profile
export PYENV_ROOT=\${HOME}/.pyenv
export PATH=\${PYENV_ROOT}/bin:\$PATH
eval "\$(pyenv init -)"
EOF

$ source ~/.bash_profile


### Anaconda をインストール
$ pyenv install -l
$ pyenv install anaconda-2.4.0
$ pyenv global anaconda-2.4.0


$ python --version
Python 2.7.10 :: Anaconda 2.4.0 (x86_64)
$ which python
/Users/akiyoko/.pyenv/shims/python


また、

  • condaは仮想環境管理にも使えます。: virtualenv/venvの代わり
    • 仮想環境下でcondaやpipでパッケージをインストールできます。
    • condaで作る仮想環境はpythonのバージョン違いまで吸収できるため、virtualenvの上位互換と言えます。
    • 事実、anacondaでvirtualenvを使おうとすると、condaで環境を作るように警告が出ます。(virtualenvが作れはします。)


データサイエンティストを目指す人のpython環境構築 2016 - Qiita」より


ということなので、virtualenv および virtualenvwrapper はインストール不要です。


 

9.3. pip

pip は Anaconda に含まれているので、インストールは不要です。

$ pip --version
pip 7.1.2 from /Users/akiyoko/.pyenv/versions/anaconda-2.4.0/lib/python2.7/site-packages (python 2.7)


 

9.4. tree

tree は macOS にデフォルトでインストールされていないので、インストールします。

$ brew install tree

 

9.5. wget

wget も macOS にデフォルトでインストールされていないので、インストールします。

$ brew install wget

 

9.6. Ansible

$ brew install ansible

$ ansible --version
ansible 2.2.1.0
  config file =
  configured module search path = Default w/o overrides


後でインストールする Vagrant で起動した VM(192.168.33.10 で起動中と仮定)に対して、疎通テストをしてみます。


まずは、インベントリファイルを、とりあえず ~/hosts あたりに作っておきます。

$ cat << EOF > ~/hosts
[webservers]
192.168.33.10

[all:vars]
ansible_ssh_user=vagrant
EOF

インベントリファイルを探索するルールについては、以下を参照のこと。
osx - Where to store Ansible host file on Mac OS X - Stack Overflow


実行結果。

$ ansible -i ~/hosts all -m ping -k
SSH password:
192.168.33.10 | success >> {
    "changed": false,
    "ping": "pong"
}




 

10. 開発系アプリ

10.1. iTerm2

公式ページ から最新版をダウンロードします。

f:id:akiyoko:20170210021920p:plain


iTerm を立ち上げて、Preferences から適宜設定を変更します。

f:id:akiyoko:20170210021942p:plain


[Profiles] > [Text]

とりあえず、フォントを 11pt くらいに変更。
f:id:akiyoko:20170210022000p:plain

[Profiles] > [Window]

背景の透明度を上げます。
f:id:akiyoko:20170210022019p:plain

[Profiles] > [Terminal]

「Unlimited scrollback」にチェックを入れます。
f:id:akiyoko:20170213211353p:plain



10.2. PyCharm

Professional Edition をインストールします。

f:id:akiyoko:20170212224535p:plain

【2017/3/10 追記】
PyCharm の環境設定について記事にまとめました。
akiyoko.hatenablog.jp


10.3. Vagrant & VirtualBox

Vagrant をインストールします。

Download - Vagrant by HashiCorp
f:id:akiyoko:20170212224402p:plain
f:id:akiyoko:20170213000516p:plain

$ vagrant --version
Vagrant 1.9.1


続けて、VirtualBox をインストールします。

Downloads – Oracle VM VirtualBox
f:id:akiyoko:20170212224559p:plain

「OS X hosts」からダウンロードします。
f:id:akiyoko:20170212224626p:plain
f:id:akiyoko:20170213000844p:plain

バージョンは 5.1.14 r112924 (Qt5.6.2) でした。




ちなみに以前は、Vagrantbox.es というサイトから Box を検索して「vagrant box add」で URL を登録していましたが、現在は Vagrant を開発している本家 HashiCorp が Box を配布するようになっています。

Discover Vagrant Boxes | Atlas by HashiCorp


なので、「Boxを追加する」という作業も不要になりました。
「vagrant init」で名前を指定した後、初回の「vagrant up」実行時にダウンロードが始まります。

$ mkdir -p ~/dev/vagrant/ubuntu14 && cd $_
$ vagrant init ubuntu/trusty64
$ vagrant up

 

10.4. Sequel Pro

MySQL クライアントには「Sequel Pro」を使っています。

https://sequelpro.com/download
からダウンロードします。

f:id:akiyoko:20170213232725p:plain


例えば、Vagrant(IPアドレスを「192.168.33.10」と想定)上の MySQL への接続設定はこちら。
f:id:akiyoko:20170213234528p:plain

EC2インスタンス(IPアドレス「52.xxx.xxx.xxx」、公開鍵認証)上の MySQL への接続設定はこちら。
f:id:akiyoko:20170213234640p:plain




 

11. その他系アプリ

11.3. Skitch

矢印をお絵かきするアプリ

f:id:akiyoko:20170210015644p:plain


「【eLV勉強会】Dockerを触ってみよう 〜 初心者向けDockerハンズオン 〜」に参加してきました

会場

CO-CreationLABO
東京都千代田区平河町1-4-3 平河町伏見ビル 2F

全体の感想など

仮想化技術と言うと、開発環境構築のために VMware や VirtualBox、Vagrant を利用することはあったのですが、Docker は今回が初体験でした。Docker については何となく知っていたのですが、やはり実際に触ってみると感覚として理解できますね。


たまたま積ん読になっていた Docker本があったので、勉強会の前にざっと目を通しておこうと思ったのですが、(良いことなのですが)詳しく書かれ過ぎていて結局核心の部分までたどり着かず。。


ついでに言うと、(「さくらのVPS」は以前に使っていましたが)「さくらのクラウド」も初、Docker 専用のホスティングサーバ「Arukas」も初体験でした。ちなみに、Arukas はさくらのインターネットが運営をしていて、今は無償公開中だそうです。



 

Dockerの基本的概念

横田真俊氏(さくらのインターネット)


  • Docker は PyCon 2013 で発表された
  • コンテナと仮想化の違い
  • コンテナはOSの代わりに各コンテナがアプリを稼働させる。ホストマシンの処理負荷が低い
  • コンテナのメリット
    • 処理速度が速い
    • メモリ・ディスクの消費量を抑えられる
    • 一番大きなメリットはポータビリティ


確かに、VirtualBox + Vagrant などの仮想化ツールで開発環境を構築するスタイルだとポータビリティ性に少し難があるように感じますし、仮想マシンの構成を管理するための Infrastructure as Code にしても「Infrastructure as Code の弊害 | Stay Creative !」で言及されているように実態とコードとの乖離が問題となります。そういった意味でも、Docker のポータビリティ容易性は大きな魅力です。

(参考)VagrantとDockerについて名前しか知らなかったので試した - Qiita




 

Dockerハンズオン

ハンズオン資料
qiita.com

  • インストールハンズオン
  • 基礎的なコマンド
  • アプリケーションをインストール
  • Dockerfileを書いてみよう
  • 応用編


 

さくらのクラウドで CentOS7 をインストール

さくらのクラウド にログインして「さくらのクラウド(IaaS)」をクリックします。

f:id:akiyoko:20170121020221p:plain

サービスご利用の流れ| さくらのクラウド」のフローに記載されているように、さくらインターネット会員ID(さくらのVPS を利用していれば既に持っているはず)があればコントロールパネルにログイン可能です。その後、「さくらのクラウド」アカウント(「さくらのクラウド」ユーザーも同時に作成可能)を作成して、クレジットカードを登録すれば利用を開始することができるようになります。


まずはリージョンを「東京第1ゾーン」に変更して、「追加」ボタンをクリック。
f:id:akiyoko:20170121021639p:plain

最小構成で CentOS サーバを作成します。
なお今回は、公開鍵の設定はせずにパスワード認証の設定を行います。
f:id:akiyoko:20170121021704p:plain


全てのステータスが「成功」になると、インスタンスの起動は完了です。
f:id:akiyoko:20170121022504p:plain


接続する IPアドレスは、サーバ一覧の画面から確認することができます。
f:id:akiyoko:20170208080557p:plain


クライアントのターミナルから、

$ ssh root@27.133.xxx.xxx

でログインすることができます(パスワードは作成時に入力したもの)。



コントロールパネルの[詳細]>[コンソール]から Webコンソールを操作することも可能ですが、動作がモッサリしているのでちょっと使い物にならない印象です。。
f:id:akiyoko:20170121022711p:plain
f:id:akiyoko:20170121022728p:plain


CentOS7 上で Docker をインストール

CentOS に Docker をインストールします。

### パッケージ情報を最新化
yum -y update

### docker-engine パッケージをセットアップ
curl -fsSL https://get.docker.com/ | sh

### サービスを有効化
systemctl enable docker.service

### docker デーモンを起動
systemctl start docker

### docker のバージョン確認
docker version


<実際のコマンド>

[root@akiyoko ~]# curl -fsSL https://get.docker.com/ | sh
+ sh -c 'sleep 3; yum -y -q install docker-engine'
warning: /var/cache/yum/x86_64/7/docker-main-repo/packages/docker-engine-selinux-1.12.6-1.el7.centos.noarch.rpm: Header V4 RSA/SHA512 Signature, key ID 2c52609d: NOKEY
docker-engine-selinux-1.12.6-1.el7.centos.noarch.rpm の公開鍵がインストールされていません
Importing GPG key 0x2C52609D:
 Userid     : "Docker Release Tool (releasedocker) <docker@docker.com>"
 Fingerprint: 5811 8e89 f3a9 1289 7c07 0adb f762 2157 2c52 609d
 From       : https://yum.dockerproject.org/gpg
setsebool:  SELinux is disabled.
Re-declaration of boolean virt_sandbox_use_fusefs
Failed to create node
Bad boolean declaration at /etc/selinux/targeted/tmp/modules/100/virt/cil:159
/usr/sbin/semodule:  Failed!
libsemanage.semanage_direct_install_info: Overriding docker module at lower priority 100 with module at priority 400.

If you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:

  sudo usermod -aG docker your-user

Remember that you will have to log out and back in for this to take effect!

[root@akiyoko ~]# yum -y update
読み込んだプラグイン:fastestmirror, priorities
Loading mirror speeds from cached hostfile
No packages marked for update
[root@akiyoko ~]# systemctl enable docker.service
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

[root@akiyoko ~]# systemctl start docker
[root@akiyoko ~]# docker version
Client:
 Version:      1.12.6
 API version:  1.24
 Go version:   go1.6.4
 Git commit:   78d1802
 Built:        Tue Jan 10 20:20:01 2017
 OS/Arch:      linux/amd64

Server:
 Version:      1.12.6
 API version:  1.24
 Go version:   go1.6.4
 Git commit:   78d1802
 Built:        Tue Jan 10 20:20:01 2017
 OS/Arch:      linux/amd64


 

コンテナを起動する(Docker run)

CentOS 上で Ubuntu を利用できるようにします。

### hello-world を起動
docker run hello-world

### Ubuntu コンテナを起動して Ubuntuを操作
docker run -it ubuntu bash

### Ubuntu バージョンを確認
cat /etc/issue


<実際のコマンド>

[root@akiyoko ~]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
78445dd45222: Pull complete
Digest: sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

[root@akiyoko ~]# docker run -it ubuntu bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
b3e1c725a85f: Pull complete
4daad8bdde31: Pull complete
63fe8c0068a8: Pull complete
4a70713c436f: Pull complete
bd842a2105a8: Pull complete
Digest: sha256:7a64bc9c8843b0a8c8b8a7e4715b7615e4e1b0d8ca3c7e7a76ec8250899c397a
Status: Downloaded newer image for ubuntu:latest

root@030555c1014f:/# cat /etc/issue
Ubuntu 16.04.1 LTS \n \l


 

起動した Ubuntu で curl を利用できるようにする

### Ubuntu のアップデート
apt-get -y update

### curl をインストール
apt-get -y install curl

curl ifconfig.me/ip

### exit でコンテナから抜けられる
exit

### 再度コンテナを動かしてみる
docker run -it ubuntu bash

### 再び IPアドレスを入れようとしても動かない
curl ifconfig.me/ip

exit すると、環境が消えてしまいます。

バックグランド(デタッチドモード)でコンテナを動かす

そこで、今度はバックグラウンドで動かしてみます。

### 今の時刻を毎秒表示するコンテナを起動する
docker run jpetazzo/clock

### バックグランド(デタッチドモード)でコンテナを動かす
docker run -d jpetazzo/clock
  • d オプションを付けると、バックグラウンドで動作させることができます。


 

基礎的なDockerコマンド

### docker ps で今動いているコンテナの確認
docker ps

### docker ps -a で今まで起動したコンテナを確認
docker ps -a

### 「docker ps -l」で直近に操作したコンテナを表示し「docker ps -q」でコンテナのショートIDが表示される。
docker ps -l
docker ps -q


<実際のコマンド>

[root@akiyoko ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
6f89ec594aa2        jpetazzo/clock      "/bin/sh -c 'while da"   5 minutes ago       Up 5 minutes                            suspicious_lalande
[root@akiyoko ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
6f89ec594aa2        jpetazzo/clock      "/bin/sh -c 'while da"   5 minutes ago       Up 5 minutes                                     suspicious_lalande
00a52497540f        jpetazzo/clock      "/bin/sh -c 'while da"   6 minutes ago       Exited (0) 5 minutes ago                         admiring_volhard
2ec9602f7828        ubuntu              "bash"                   8 minutes ago       Exited (127) 6 minutes ago                       angry_engelbart
030555c1014f        ubuntu              "bash"                   14 minutes ago      Exited (130) 8 minutes ago                       mad_noether
83b477b7eb2a        hello-world         "/hello"                 16 minutes ago      Exited (0) 16 minutes ago                        reverent_booth
[root@akiyoko ~]# docker ps -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
6f89ec594aa2        jpetazzo/clock      "/bin/sh -c 'while da"   5 minutes ago       Up 5 minutes                            suspicious_lalande
[root@akiyoko ~]# docker ps -q
6f89ec594aa2


 

docker logs でコンテナのログを確認する

### コンテナのログを確認
docker logs 6f89ec594aa2

### 指定された数行だけログを確認
docker logs --tail 3 6f89ec594aa2

### リアルタイムでログを確認
docker logs --tail 1 --follow 6f89ec594aa2


 

docker kill、docker stopでコンテナを止める

### デタッチモードで起動したサーバを停止させる
docker kill 6f89ec594aa2
docker stop 6f89ec594aa2

kill よりも stop の方が安全に停止できるそうです。


 

Docker上で Ghost をインストールする

次は、簡易ブログツール「Ghost」を Docker を利用してインストールしてみます。
Ghost は、コマンド一発でインストール可能です。

### -p でポートマッピング可能(Ghost は 2368番ポートで動作する)
docker run -p 80:2368 -d ghost

### ブラウザに作成したサーバのIPアドレスを入力してアクセスができるか確認し、アクセスができるようであればコンテナを停止
docker kill (コンテナのID)


ブラウザから Ghost が動作しているのを確認することができます。
http://27.133.xxx.xxx/
http://27.133.xxx.xxx/admin

f:id:akiyoko:20170207233546p:plain

 

nginx コンテナを立ち上げてページを編集

下記コマンドで nginx を起動します。

docker run -itd -p 80:80 nginx:latest

起動後にブラウザから IPアドレスを入力して nginx の画面を表示し、正常に nginx が起動しているか確認をします。
f:id:akiyoko:20170207233636p:plain

 

nginx コンテナ上にページを作成

### docker psでnginxのコンテナIDを確認
docker ps

### docker exec コマンドで bash の追加プロセスを実行
docker exec -it $(docker ps -ql) /bin/bash

Ubuntu に入れた!

### ps -ef コマンドで nginx コンテナの中での操作を確認
ps -ef

### nginx のドキュメント・ルートにある index.html を書き換える
echo 'hello world' > /usr/share/nginx/html/index.html
cat /usr/share/nginx/html/index.html


ブラウザで確認します。

http://27.133.xxx.xxx/index.html
f:id:akiyoko:20170207233657p:plain


bashを終了します。

exit


 

nginx イメージの作成

### docker commit コマンドで mynginx:1.0 イメージを作成
docker commit $(docker ps -ql) mynginx:1.0

### docker images コマンドで、イメージが作成されたのを確認
docker images

### 作成した mynginx:1.0 イメージを使って、新しいコンテナを実行
docker run -d -p 8080:80 mynginx:1.0

### curl コマンドで、コマンドライン上でポート 8080 を開く
curl http://localhost:8080


<実際のコマンド>

[root@akiyoko ~]# docker commit $(docker ps -ql) mynginx:1.0
sha256:dde66d6cd18fc6d0ead8c88b460d9a54e4668471a44a66b281e37600192053c4
[root@akiyoko ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
mynginx             1.0                 dde66d6cd18f        About a minute ago   181.6 MB
ghost               latest              783cee09899e        11 hours ago         325.8 MB
nginx               latest              a39777a1a4a6        17 hours ago         181.6 MB
hello-world         latest              48b5124b2768        4 days ago           1.84 kB
ubuntu              latest              104bec311bcd        4 weeks ago          128.9 MB
jpetazzo/clock      latest              12068b93616f        23 months ago        2.43 MB

[root@akiyoko ~]# docker run -d -p 8080:80 mynginx:1.0
1d4f406be21b686906f8b68adc283660f3dc0aa762f7113708515c153e78ce49

[root@akiyoko ~]# curl http://localhost:8080
hello world


 

コンテナの停止と削除

### docker ps でコンテナの状態を確認
docker ps

### コンテナを停止するため docker kill コマンドを実行
docker kill $(docker ps -q)

### docker ps では実行中のプロセスはない
docker ps
### docker ps -a でコンテナが停止中であることを確認
docker ps -a

### docker rm コマンドでコンテナ(コンテナ用のイメージ・レイヤとメタ情報)を削除
docker rm $(docker ps -aq)
docker ps -a


 

Dockerfile でイメージの自動構築

### 作業用ディレクトリ mynginx を作成
mkdir mynginx
cd mynginx

### Dockerfile を作成
tee ./Dockerfile <<-'EOF'
FROM nginx:latest
RUN echo "hello world<br />$(date)" > /usr/share/nginx/html/index.html
EOF

### docker build コマンドで mynginx:1.1 イメージを自動作成
docker build -t mynginx:1.1 .

### イメージが作成されたことを確認
docker images

<実際のコマンド>

[root@akiyoko mynginx]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mynginx             1.1                 b9f4ec36b1d3        17 seconds ago      181.6 MB
mynginx             1.0                 dde66d6cd18f        7 minutes ago       181.6 MB
ghost               latest              783cee09899e        11 hours ago        325.8 MB
nginx               latest              a39777a1a4a6        17 hours ago        181.6 MB
hello-world         latest              48b5124b2768        4 days ago          1.84 kB
ubuntu              latest              104bec311bcd        4 weeks ago         128.9 MB
jpetazzo/clock      latest              12068b93616f        23 months ago       2.43 MB
### 作成した mynginx:1.1 イメージを使って、新しいコンテナを実行
docker run -d -p 8888:80 mynginx:1.1

### curl コマンドで、コマンドライン上でポート 8888 を開く
curl http://localhost:8888

<実際のコマンド>

[root@akiyoko mynginx]# docker run -d -p 8888:80 mynginx:1.1
e3566e13cc33662496a82d13e598a04834b1b5f907ac502d55f6510e5c985107
[root@akiyoko mynginx]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES
e3566e13cc33        mynginx:1.1         "nginx -g 'daemon off"   11 seconds ago      Up 10 seconds       443/tcp, 0.0.0.0:8888->80/tcp   elated_davinci
[root@akiyoko mynginx]# curl http://localhost:8888
hello world<br />Wed Jan 18 11:47:30 UTC 2017


 

Docker Hub にログイン

アカウント作成
https://hub.docker.com/ から登録し、ログインします。

f:id:akiyoko:20170207233923p:plain


 

サーバから Docker Hub にログイン

docker login コマンドを実行します。

<実際のコマンド>

$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: <自分のDockerHubID>
Password: <パスワード>
Login Succeeded

 

Docker イメージの登録と公開

イメージをタグ付けします。

### docker tags コマンドで mynginx:1.1 イメージに Docker Hub ID の情報をタグ付け
docker tag mynginx:1.1 <自分のID名>/mynginx:1.1

### docker images で確認
docker images

<実際のコマンド>

[root@akiyoko mynginx]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mynginx             1.1                 b9f4ec36b1d3        7 minutes ago       181.6 MB
akiyoko/mynginx     1.1                 b9f4ec36b1d3        7 minutes ago       181.6 MB
mynginx             1.0                 dde66d6cd18f        15 minutes ago      181.6 MB
ghost               latest              783cee09899e        11 hours ago        325.8 MB
nginx               latest              a39777a1a4a6        17 hours ago        181.6 MB
hello-world         latest              48b5124b2768        4 days ago          1.84 kB
ubuntu              latest              104bec311bcd        4 weeks ago         128.9 MB
jpetazzo/clock      latest              12068b93616f        23 months ago       2.43 MB


 

docker push でイメージ送信

DockerHub に作成したイメージを送信します。

### docker push コマンドでイメージを送信
docker push <自分のID名>/mynginx:1.1


<実際のコマンド>

[root@akiyoko mynginx]# docker push akiyoko/mynginx:1.1
The push refers to a repository [docker.io/akiyoko/mynginx]
1022adbe77fc: Pushed
a03d7e02b0d4: Mounted from library/nginx
e04b871e18d3: Mounted from library/nginx
a2ae92ffcd29: Mounted from library/ghost
1.1: digest: sha256:df231d9fd41379c5565d1c529921bdb616fb3ec946f5b02d321bde0cd83d2059 size: 1155


Docker Hub 上にある自分のページを表示し、リポジトリを確認します。

f:id:akiyoko:20170207234126p:plain


不要なイメージの削除

### docker images -q を実行すると、ローカルにあるイメージ ID を表示
docker images -q

### docker rmi で全てのイメージを削除
docker rmi -f $(docker images -aq)


 

Arukas にログイン

DockerHub に登録したイメージを利用して、Arukas 上でアプリケーションを作成します。


https://app.arukas.io/
f:id:akiyoko:20170207234242p:plain

f:id:akiyoko:20170207234320p:plain


Arukas 上でアプリケーションを作成

ダッシュボードにて、「新しいアプリケーションを作成」ボタンをクリック。

f:id:akiyoko:20170207234354p:plain

アプリ作成に必要な各種情報を入力します。

App Name myapp
Image <DockerHubId>/mynginx:1.1(1.1 のタグを忘れずに!)
Port 80

アプリケーションを作成 ボタンをクリック。

f:id:akiyoko:20170207234415p:plain

一覧画面に作成されたアプリケーションが表示されます。


アプリの 起動 ボタンをクリック後、OK をクリックすると、 アプリが起動します。

f:id:akiyoko:20170207234434p:plain

起動後、 Endpoint の URL を開きます。

f:id:akiyoko:20170207234453p:plain

f:id:akiyoko:20170207234518p:plain