2018年9月30日日曜日

Prometheus で docker コンテナを監視する方法

概要

Docker の daemon metrics の機能を使うと簡単に Prometheus と連携することができます
Docker Damon metrics を有効にする方法と Prometheus との連携方法を紹介します

環境

  • Ubuntu 16.04
  • Prometheus 2.4.2
  • docker 18.03.1-ce

Docker Damon metrics の有効化

事前に停止が必要なコンテナは停止しておいてください

  • touch /etc/docker/daemon.json
  • vim /etc/docker/daemon.json
{
  "metrics-addr" : "0.0.0.0:9323",
  "experimental" : true
}
  • systemctl restart docker

これで 9323 ポートでメトリックが取得できるようになります
念のため netstat -an | grep 9232 などでポートが開いているか確認してください

Prometheus で監視対象を追加する

  • vim prometheus.yml

scrape_configs に以下の job_name を追加しましょう

scrape_configs:
  - job_name: 'worker2_docker'
    static_configs:
    - targets: ['192.168.100.12:9323']

追記したら Prometheus のコンテナを再起動します

  • docker restart prometheus

prometheus の部分は Prometheus のコンテナ名またはコンテナ ID になります

動作確認

Status -> Targets を確認すると監視対象が追加されていると思います
メトリックの名前は daemon_swam_ から始まる項目になります

最後に

dockerd の Daemon metrics の機能を使って使って Prometheus と連携してみました
連携自体はかなり簡単に行えます

ただ、Daemon metrics はかなり簡易的な情報しか取得できません
非公式ではありますが cAdvisor と連携する方法があります
cAdvisor の方が確かに各コンテナの情報を取得できるので細かい情報まで確認することができます

今回の方法は docker 公式のページで紹介されている方法なので今後取得できるメトリックの量などが増えるといいなーと思っています

参考サイト

2018年9月29日土曜日

Prometheus を試してみた

概要

Prometheus は次世代の監視システムとして話題のツールになっています
基本構成は監視対象のサーバに exporter と呼ばれるエージェントをインストールすることで監視できるようになります
exporter には様々な種類があり監視したいプロセスやミドルウェアによってインストールする exporter を変更します
今回は基本的なサーバ監視として node exporter をインストールしてサーバ監視をしてみました

環境

  • サーバ
    • Ubuntu 16.04 LTS
    • Prometheus 2.4.2
  • 監視対象
    • Ubuntu 16.04 LTS

Prometheus サーバ構築

設定ファイル作成

  • vim prometheus.yml
global:
  scrape_interval:     15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

rule_files:

scrape_configs:
  - job_name: 'worker'
    static_configs:
    - targets: ['192.168.100.10:9100']
  - job_name: 'worker2'
    static_configs:
    - targets: ['192.168.100.11:9100']

ポイントは scrape_configs でここで監視対象のサーバを指定します
9100 ポートは監視対象のサーバで node exporter をインストールした際に LISTEN するデフォルトのポートです

Prometheus はここで定義された監視対象に対して scrape_interval で指定された間隔ごとにメトリックの取得を行います

サーバ起動

  • docker run -d -p 9090:9090 -v $(pwd):/prometheus-data prom/prometheus --config.file=/prometheus-data/prometheus.yml

作成した設定ファイルをコンテナにマウントして起動します

localhost:9090 にアクセスすると、とりあえず Prometheus の UI にアクセスできます

node exporter のインストール

監視対象のサーバで以下のコマンドを実行するだけです

  • docker run -d --net="host" --pid="host" quay.io/prometheus/node-exporter

動作確認

Prometheus の UI からStatus -> Targets を確認しましょう
prometheus1.png

監視対象の一覧が表示されます
スタータスが up になっていれば監視が始まります

うまくステータスが OK にならない場合は ufw などの設定を確認してください
Prometheus サーバから各サーバの 9100 ポートにアクセスできる必要があります

あとはトップ画面から表示したいメトリックを選択して「Execute」すれば OK です
node exporter で取得できるメトリック名はサフィックスに node_ が付与されています
以下は「node_memory_MemFree_bytes」の表示結果です
prometheus2.png

タグを Graph に切り替えれば時系列のグラフを確認することができます

最後に

Prometheus に入門してみました
よく Docker などのコンテナ監視をする際に Prometheus が出てくることがあります
Docker には Prometheus のメトリック情報をデフォルトで取得できる方法があるため連携しやすいという感じです
その方法も次回紹介したいと思います

参考サイト

2018年9月28日金曜日

コンテナ監視に cAdvisor を使ってみた

概要

cAdvisor はコンテナのメトリックを簡単に取得できる監視ツールです
今回はインストールから各コンテナのメトリックの確認までしてみました

環境

  • docker 18.03.1-ce
  • Ubuntu 16.04 LTS
  • cAdvisor (v0.27.4)

インストール

メトリックを取得したいコンテナが動作しているホストで以下を実行します

docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --volume=/dev/disk/:/dev/disk:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  google/cadvisor:latest

監視に必要なパスをコンテナで ReadOnly でマウントしてファイルからメトリックの情報を取得しています

UI 確認

API もありますが今回は UI から確認してみました
localhost:8080 にアクセスすると localhost:8080/containers/ のトップページにリダイレクトされます

このページだとホストのメトリックしか監視できないので各コンテナの状態が確認できる「Docker Containers」を選択します
cadvisor1.png

すると localhost:8080/docker/ にアクセスします
ここに動作しているコンテナの一覧が表示されると思います
cadvisor2.png

ここからメトリックを確認したいコンテナを選択すると以下のような詳細が画面になります (一部抜粋)
cadvisor3.png

詳細画面では以下を確認することができます

  • 起動プロセスの一覧
  • CPU 使用率
  • メモリ使用率
  • ネットワーク転送量
  • ファイルシステム使用率

画面を下にスクロールしていくとリアルタイムに上記の情報が確認できると思います
各コンテナの詳細ページではコンテナごとのメトリックが確認できるのでホスト全体で確認したい場合は localhost:8080/containers/ で確認することができます

所感

少ししか触ってないですが所感です

まず複数のホストの監視は基本できません
ホストにメトリック情報を収集するエージェントをインストールして cAdvisor に送信することでできるようですが非公式っぽいです
なので基本はシングルホストの監視として使います
過去に Portainer というツールで監視しましたが基本的にはこれと同じ感じです
Portainer はリモートホストの docker ホストも監視できるので、その点では Portainer のほうがいいかもしれません

またできることはメトリック情報を確認することしかできないのでアラートを飛ばしたりもできません
なのでアラートなどを飛ばしたい場合は Prometheus などの統合監視ツールと連携してコンテナ監視をする感じになります

参考サイト

2018年9月27日木曜日

flasgger の Marshmallow schema でクエリーストリングを扱う方法

概要

flasgger の Marshmallow schema でクエリストリングを扱う方法を紹介します
基本は swagger で扱う方法と同じです

環境

  • macOS X 10.14
  • Python 3.7
  • flasgger 0.9.0

ライブラリインストール

  • vim Pipfile
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
flasgger = "*"
marshmallow = "*"
apispec = "==0.38.0"

[dev-packages]

[requires]
python_version = "3.6"
  • pipenv install

ソース

  • vim query_string.py
# coding: utf-8
from flask import Flask, jsonify, request
from flasgger import Schema, Swagger, SwaggerView, fields


class NameSchema(Schema):
    name = fields.Str()


class ConvertView(SwaggerView):
    summary = 'Show your name'
    description = 'Query string converts to json string'
    parameters = [
        {
            'name': 'name',
            'in': 'query',
            'description': 'Your name',
            'type': 'string'
        }
    ]
    responses = {
        200: {
            'description': 'Success jsonify',
            'schema': NameSchema
        }
    }

    def get(self):
        name = request.args['name']
        d = self.external_api(name)
        return jsonify(NameSchema().dump(d).data)

    def external_api(self, name):
        return {'name': name}


app = Flask(__name__)
app.add_url_rule(
    '/convert/',
    view_func=ConvertView.as_view('convert'),
    methods=['GET']
)
Swagger(app)


if __name__ == '__main__':
    app.run(debug=True)

説明

parametersin: query とすることでクエリーストリングとして扱うことができます
取得する場合は request.args['name'] で取得できます
もしくは request.args.get('name') とすることで指定のキーがない場合には None を設定することができます
さらに request.argsImmutableMultiDict というクラスのオブジェクトになっており、get 時に型を指定したりデフォルト値を設定したりすることもできます

動作確認

  • pipenv run python3 query_string.py

アプリを起動したら curl で確認します

  • curl localhost:5000/convert/?name=hoge

クエリーストリングに指定した文字列が返ってくれば OK です

{
  "name": "hoge"
}

localhost:5000/apidocs/ にアクセスすると Swagger UI が確認できます
クエリーストリングの場合パラメータは以下のように表示されます
marshmallow_query_string.png

最後に

flasgger の Marshmallow schema でクエリーストリングを使ってみました
requiredtype チェックなどは自動で行ってくれないので validation なりを使う必要がありそうです

参考サイト

2018年9月26日水曜日

現在開いているタブの URL を取得する方法

概要

Firefox の Webextension で現在開いているタブの URL 情報を取得する方法を紹介します

環境

  • macOS 10.13.6
  • Firefox 62.0

manifest.json

  • vim manifest.json
{
  "manifest_version": 2,
  "name": "Tab URL",
  "version": "1.0",
  "description": "Fetching active tab's url",
  "icons": {
    "48": "icons/border-48.png"
  },
  "background": {
    "scripts": ["main.js"]
  },
  "permissions": [
    "tabs"
  ]
}

タブの操作をするので permissionstags を追加します

main.js

  • vim main.js
function getCurrentWindowTabs() {
  return browser.tabs.query({currentWindow: true, active: true});
}

getCurrentWindowTabs().then(tabs => {
  console.log(tabs[0].url);
});

browser.tabs.query でタブを取得します
タブは配列で取得できるので、それの一番始めを参照するとアクティブなタブを取得することができます
あとはタブの url プロパティを参照すれば URL 情報が取得できます

今回のサンプルの場合は extension が読み込まれたときに動作するので about:debugging の URL しか取得できないと思います

クリックイベントなどと合わせてクリック時に取得するようにすれば別ページなどでも動作させることができます

最後に

Firefox の Webextension でアクティブなタブの URL を取得する方法を紹介しました
タブが配列で取得できるので、そこから必要なタブだけを取得するのがポイントになると思います

参考サイト

2018年9月25日火曜日

マウスで選択した部分の文字列を取得する方法

概要

Firefox の Webextension でマウスで選択した部分の文字列の情報を取得する方法を紹介します
基本は選択 -> 右クリックの流れなのでコンテキストメニューから取得するのが早いです

環境

  • macOS 10.13.6
  • Firefox 62.0

manifest.json

  • vim manifest.json
{
  "manifest_version": 2,
  "name": "Selected text",
  "version": "1.0",
  "description": "Show selected text in console.log",
  "icons": {
    "48": "icons/border-48.png"
  },
  "background": {
    "scripts": ["main.js"]
  },
  "permissions": [
    "menus"
  ]
}

コンテキストメニューを使うので permissionsmenus を追加します

main.js

  • vim main.js
browser.menus.create({
  id: "select-text",
  title: "Show select text",
  contexts: ["all"]
});

browser.menus.onClicked.addListener((info, tab) => {
  switch (info.menuItemId) {
    case "select-text":
      if (info.selectionText !== undefined) {
        console.log(info.selectionText);
      }
      break;
  }
});

info.selectionText これで取得できます
info は OnClickData のオブジェクトです
selectionText 以外にも様々なプロパティがあります

動作確認

about:debugging から extension をインストールして動作確認してみましょう
文字列を選択してコンテキストメニューから追加した項目をクリックすると文字列が console.log で表示されると思います

cosole.log で表示するだけなのでデバッグからコンソール画面を表示しておいてください

おまけ (アンカーテキストの URL を取得する)

info から linkUrl を参照するだけで OK です

if (info.linkUrl !== undefined) {
  url = info.linkUrl;
}

最後に

Firefox の Webextension でマウスで選択した部分の文字列を取得してみました
コンテキストメニューのクリックイベントを拾うと簡単に取得できます

むしろそれ以外で取得する方法がわかりませんでした
ユースケースを考えるとそれ以外で必要な場面は少ないので API 的にもそうしているのかもしれません

参考サイト

2018年9月24日月曜日

コンテキストメニュー (右クリックのメニュー) に項目を追加する方法

概要

Firefox の Webextension でコンテキストメニューに独自のメニューを追加する方法を紹介します

環境

  • macOS 10.13.6
  • Firefox 62.0

manifest.json

  • vim manifest.json
{
  "manifest_version": 2,
  "name": "Context menu extension",
  "version": "1.0",
  "description": "Add original item into context menu",
  "icons": {
    "48": "icons/border-48.png"
  },
  "background": {
    "scripts": ["main.js"]
  },
  "permissions": [
    "menus"
  ]
}

context_scripts ではなく background で動作させる必要があります
また permissions に「menus」を追加する必要があります

main.js

  • vim main.js
function onCreated() {
  if (browser.runtime.lastError) {
    console.log(`Error: ${browser.runtime.lastError}`);
  } else {
    console.log("Item created successfully");
  }
}

browser.menus.create({
  id: "my-context-menu",
  title: "Hello!",
  contexts: ["all"]
}, onCreated);

browser.menus.onClicked.addListener((info, tab) => {
  switch (info.menuItemId) {
    case "my-context-menu":
      console.log("clicked");
      break;
  }
});

まず browser.menus.create でコンテキストメニューに項目を追加します
引数に id, title, contexts を指定します
id はクリックしたときの識別子として使うので好きな文字列を設定してください
title はコンテキストメニューに表示される項目名を指定します
contexts は項目を表示するのをどんなときにするか設定することができます
all にしておけばどんなときのコンテキストメニューでも追加した項目が表示されます
指定可能なタイプはこちらに記載されています

最後に項目がメニューに追加された際のコールバック用のメソッドを設定します
今回は onCreated メソッドをコールバックメソッドとして設定しています
このコールバックメソッドは項目が追加されたかどうかチェックするためのメソッドになります

実際に項目がクリックされたときの挙動を実装するには browser.menus.onClicked.addListener を設定します
onClicked というイベントにリスナーを設定します
リスナー内で info.menuItemId を取得し先程設定した id だった場合にどういう挙動をするか実装することができます

とりあえず今回は console.log しかしていませんがここで DOM の操作や XMLHttpRequest などを使ったりします
ちなみに console.log は background モードでないと表示することができないので注意してください

動作確認

about:debugging を開いて extension をインストールしましょう
すると右クリックのメニューに新しく項目が追加されていることが確認できると思います
context_menu2.png

今回はアイコンを配置していないので左にアイコンが表示されていません
またクリックするとデバッグ画面にしっかりとログが表示されているのも確認できると思います
context_menu1.png

キーボードショートカットを割り当てるには

コンテキストメニューが表示されたときに特定のキーボードを押すと項目をクリックしないでも実行することができる機能があります

WebExtension の場合には API として明示的に提供されていません
しかし項目のタイトルの先頭に割り当てたい文字を設定すると同じようなことができるようになります
例えば今回の場合であれば以下のように定義すれば「H」キーで実行することができます

browser.menus.create({
  id: "my-context-menu",
  title: "H) Hello!",
  contexts: ["all"]
}, onCreated);

最後に

Firefox の Webextension でコンテキストメニューに新たに項目を追加する方法を紹介しました
コンテキストメニューであればすべて Javascript だけでできます
またここから新たに UI (ウィンドウなど) を表示する場合には HTML の追加が必要になります

参考サイト

2018年9月21日金曜日

Firefox の Webextension を開発してみよう

概要

昔の Firefox のアドオン開発は XUL と呼ばれる XML 形式の UI と JavaScript で開発していました
しかし Firefox Quantum が登場し XUL が廃止され Chrome の Webextension と同じく HTML + JavaScript で開発するようになりました

今回は初めて Webextension を開発するチュートリアルを紹介します

環境

  • macOS 10.13.6
  • Firefox 62.0

ワークスペース作成

  • mkdir my_first_extension
  • cd my_first_extension

manifest.json の作成

必須のファイルになります
extension のメタデータなどを記載します

  • touch manifest.json
  • vim manifest.json
{
  "manifest_version": 2,
  "name": "My first extension",
  "version": "1.0",
  "description": "Test extension",
  "content_scripts": [
    {
      "matches": ["*://*/*"],
      "js": ["main.js"]
    }
  ]
}

main.js の作成

manifest.json で指定したスクリプトになります
ここにブラウザの操作や DOM の操作などを記載していきます
今回は超簡単な処理として表示したページの枠を青色にする処理を記載します

  • touch main.js
  • vim main.js
document.body.style.border = "5px solid blue";

body の情報を取得して CSS を当てているだけです

動作確認

Firefox を起動して about:debugging にアクセスします
「一時的なアドオンを読み込む」を選択して manifest.js を選択しましょう
webextension1.png

これで Webextension のテストができます
適当にサイトにアクセスすると枠が青くなっているが確認できると思います
webextension2.png

Tips

アイコンを設定する場合は以下の情報を manifest.json を追記します

"icons": {
  "48": "icons/border-48.png",
  "96": "icons/border-96.png"
}

そして icons ディレクトリ配下に border-48.png などを配置すれば OK です
2 サイズ分用意しなくても良いですが用意したほうが良いです

拡張機能 ID は Webextension を公開するときには指定が必要です
manifest.json に以下を追記しましょう

"applications": {
  "gecko": {
    "id": "my-first-extension@example.com"
  }
}

メールアドレス形式で指定します
これは XUL の時代にもありました
もし XUL で開発していたアドオンの新しいバージョンとして公開する場合は XUL 時代に使っていた ID と同じ値を指定してください

今回は content_scripts で動作させましたが他に background というモードがあります
XMLHttpRequest などは background モードでしか使えません
逆にアラート表示などは content_scripts でないとできません
background の場合は変わりに notifications などを使います
という感じでやりたいことによってモードを使い分ける必要があります

最後に

Firefox の Webextension に入門してみました
HTML + Javascript で書けるようになったので導入障壁はかなり下がったかなと思います
ただ、XUL 時代に使っていた UI などはすべて HTML に書き換える必要があるのでそこは大変かもしれません

また Firefox Quantum から API もだいぶ変わっているのでその辺りも開発時には注意が必要かなと思います

参考サイト

2018年9月20日木曜日

マネックス証券で口座開設する方法

概要

マネックス証券は外国株を購入することができる証券サービスです
今回は申込みの方法を紹介します
なお、本人確認に運転免許証の表裏とマイナンバーカードの表裏の電子データが必要になります
スマホで撮影して事前に PC などに転送しておきましょう

本記事でのゴールは外国株を取引できる状態にすることでしたが思った以上に時間がかかりました

環境

  • マネックス証券 (2018/09/06 時点)

タイムライン

  • 9.6 Web 申し込み
  • 9.11 メールで開設連絡
  • 9.15 書類到着
  • 9.15 ログイン確認
  • 9.15 金融機関からマネックスへの入金 (国内株であればこの時点で購入可)

国内株が購入可能な状態になるまで 9 日かかりました
米国株の場合ここから更に日数がかかります

  • 9.15 外国株取引口座開設申し込み
  • 9.19 外国株取引口座開設、入金
  • 9.20 円からドルへの振替完了

いかポイントを順を追って紹介します

口座開設

https://www.monex.co.jp/ にアクセスします
「口座開設」を選択します
manex1.png

「証券総合取引口座 開設[個人のお客様]」を選択します
manex2.png

中段くらいにある「お申込み内容の入力フォームへ」を選択します
manex3.png

必要な情報を入力していきます
主に必要な項目は以下の通りです

  • 本人情報 (名前、電話番号、住所
  • 入金先の金融機関情報 (選択)
  • 特定口座の開設 (選択)
  • 勤務先等のインサイダー取り引き防止ための情報

になります
結構大変ですが頑張って入力しましょう
特定口座の開設に関しては初心者なので「開設する」にしました
キャンペーンコードは「2018」で OK です

次のページで入力した内容の確認をします
問題なければ開設申し込みをします

そして次のページで本人確認書類を 2 種類アップロードします
今回は免許書 (表のみ) とマイナンバーカード (表裏) をスマホで撮影してそれをアップロードしました
manex4.png

これで申し込みは完了です
確認のメールが届きます
manex5.png

この後の流れとして完了通知+書類の到着を待つ感じになります

ログイン確認

書類が到着するとログイン用の ID/PW が記載されているのでログインしてみましょう
https://mst.monex.co.jp/pc/ITS/login/LoginIDPassword.jsp

ログインするとすぐにログインパスワードと取引暗証番号の変更をさせられます
ポリシーがあるのでポリシーに合わせて変更してください

あとはログインして必要な作業をしましょう
書類にガイドがあるのでそれに沿ってやると良いと思います

主に自分がやったことは以下です

  • 金融機関からの入金 (振込処理に数分かかります)
  • 外国株取引口座の開設 (外角株取引口座の開設は最短で翌営業日になるようです -> 参考)

入金は必須かなと思います

いざ株購入

マネックスへの入金が済んだからようやく株を購入できます
国内株であればすぐに購入できます

米国株の場合は外国株取引口座の開設が済んだあと更にここから以下が必要になります

  • 入金された口座から外国株取引口座への入金
  • 日本円からドルへの振替 (更に数日かかります)

が必要になります
ドルに振替しないでも取引できる円貨決済という機能もあるようです
簡単に言うと円からドルへの振替を自動でやってくれるだけです
為替レートのタイミングを自分で選択できないのがデメリットかなと思います

いざ株米国株購入

外国株取引口座に入金できかつ株を購入するためのドルへの振替ができればようやく米国株を購入することができます
ちなみに外国株取引口座を開設するとサンクスメールは届くのそれで分かりますがその前に使えるようにはなっています

米国株を購入するには専用のページにアクセスします
monex6.png

「米国株取引 ログイン」を選択します
monex7.png

TradeStation という専用のページで取引します
monex8.png

最後に

マネックスで口座を開設する方法を紹介しました
いざやってみたら実際に株が購入できる状況になるまでかなり時間がかかりました
外国株の場合は更にかかるので 1 ヶ月くらいは余裕をもって申し込みしたほうが良いかなと思います

参考サイト

2018年9月19日水曜日

Pipfile で Github のブランチを指定する方法

概要

Pipfile では Github 上のソースを直接指定することができます
デフォルトは master ブランチですが開発ブランチなどを使いたい場合もあります
そんな場合のやり方を紹介します

環境

  • Python 3.7.0
  • pip 18.0
  • pipenv 2018.7.1

やり方

  • vim Pipfile
[packages]
pkg_name = {git = "https://github.com/yourname/repository.git", editable = true, ref = "feature/branch_name"}

ブランチは ref パラメータで指定します

  • pipenv lock
  • pipenv install

ポイントは一度 lock ファイルを作成する点です
lock ファイルを元に必要なパッケージをインストールするので先に作成する必要があります

2018年9月16日日曜日

macOS High Sierra + Android のエミュレータでインターネットにアクセスできない

概要

原因はホスト名が解決できないためです
エミュレータ起動時に DNS を指定してあげます

環境

  • macOS 10.13.6
  • Android Studio 3.1.4

対処方法

cd ~/Library/Android/sdk/emulator
* ./emulator -list-avds

Nexus_5X_API_28
Pixel_XL_API_28
  • ./emulator -avd Nexus_5X_API_28 -dns-server 8.8.8.8

という感じでコマンドラインから指定のエミュレータを起動します
コマンドから起動しておいてあとは Android Studio から apk をインストールしたりすれば動作確認できます

どうやら Android Studio 3.x 系だとエミュレータを起動する際に -dns-server オプションが指定できないようです
https://stackoverflow.com/questions/42839734/how-to-set-the-android-emulator-dns-server-from-android-studio

今後できるようになるかもしれません
(もしくは調査不足で実は設定する方法があるかもしれません、、)

あとは Mac 上でメインで使用しいてるネットワーク以外の設定 (Bluetooth PAN や Thunderbolt ブリッジなど) を削除してもできるようです

2018年9月15日土曜日

Ruby で Excel を操作 (axlsx 編)

概要

axlsx は Ruby で Excel を操作するためのライブラリです
今回は Mac で使ってみました

環境

  • macOS 10.13.6
  • Numbers 5.1
  • Ruby 2.5.1p57
  • axlsx 2.0.1

インストール

  • bundle init
  • vim Gemfile
gem "axlsx"
  • bundle install --path vendor

とりあえずサンプル

axlsx の公式にもあるサンプルです
円グラフを表示するサンプルです

  • vim test1.rb
require 'axlsx'

Axlsx::Package.new do |p|
  p.workbook.add_worksheet(:name => "Pie Chart") do |sheet|
    sheet.add_row ["Simple Pie Chart"]
    %w(first second third).each { |label| sheet.add_row [label, rand(24)+1] }
    sheet.add_chart(Axlsx::Pie3DChart, :start_at => [0,5], :end_at => [10, 20], :title => "example 3: Pie Chart") do |chart|
      chart.add_series :data => sheet["B2:B4"], :labels => sheet["A2:A4"],  :colors => ['FF0000', '00FF00', '0000FF']
    end
  end
  p.serialize('simple.xlsx')
end
  • bundle exec ruby test1.rb

これで実行すると以下のようなエクセルが確認できました

axlsx1.png

シートを作成する

require 'axlsx'

p = Axlsx::Package.new
wb = p.workbook
wb.add_worksheet(:name => "test")
p.serialize('simple.xlsx')

sample.xlsx というファイルに test というシートができます

指定のセルに値を追加する

require 'axlsx'

p = Axlsx::Package.new
wb = p.workbook
sheet = wb.add_worksheet(:name => "test")
sheet.add_row ['', '', '', '']
sheet.rows[0].cells[1].value = 5
p.serialize('simple.xlsx')

axlsx2.png

これが意外と曲者でした
一度セルに対して何か値を入れないとそのセルを指定して値を入れることはできないのです
上であれば 1 行目の左から 4 セルに空白を入れてその後で 1 行目の 2 セル目に 5 という値を入れています
参考

足し算する

require 'axlsx'

p = Axlsx::Package.new
wb = p.workbook
sheet = wb.add_worksheet(:name => "test")
1.upto(10) { |i| sheet.add_row [i] }
sheet.add_row ["=sum(A1:A10)"]
p.serialize('simple.xlsx')

axlsx3.png

単純に Excel で使っている式を文字列として追加するだけで OK です
SUM 以外の式に関しても同様のことが言えます

セルのスタイルを返る

require 'axlsx'

p = Axlsx::Package.new
wb = p.workbook
sheet = wb.add_worksheet(:name => "test")
1.upto(10) { |i| 
  style = sheet.styles.add_style(:bg_color => "%06x" % (rand * 0xffffff), :fg_color => "FFFFFF")
  sheet.add_row [i], :style => style
}
p.serialize('simple.xlsx')

axlsx4.png

シートからスタイル情報を生成し add_row するときに style 変数を指定します
今回はランダムで RGB 値を出していますが工夫すればグラデーション的なこともできると思います

最後に

Ruby で Excel を操作してみました
Office がなかったので Numbers で確認しました
もしかすると多少フォーマットが変わっているかもしれません

注意が必要なのは axlsx は書き込みしかできません
エクセルからデータを読み込む場合は roo などを使いましょう

これ以外にもいろいろなことができます
以下に記載したページにサンプルもたくさんあるので参考にしながら記載してみるといいと思います

参考サイト

2018年9月14日金曜日

emacs で robe を使う方法

emacs で robe を使う方法

概要

robe は emacs 上で Ruby のコードを補完してくれるパッケージです
インストールして使ってみました

環境

  • macOS 10.13.6
  • emacs 25.3.1
  • robe 20171116.2049

pry インストール

  • gem install pry pry-doc webrick

もし Gemfile で管理している場合は

  • vim Gemfile
gem "pry"
gem "pry-doc"
gem "webrick"

を記載して

  • bundle install

しましょう

robe インストール

emacs を開いてミニバッファで以下を実行します

  • M-x package-install RET robe RET

robe 設定記載

.emacs なり init.el に記載します

(add-hook 'ruby-mode-hook 'robe-mode)
(add-hook 'robe-mode-hook 'ac-robe-setup)

使ってみる

emacs で .rb ファイルを開きます
ミニバッファで以下を実行します
(inf-ruby の起動は不要です、robe-start で同時に起動してくれます)

  • M-x inf-ruby
  • M-x robe-start

robe-start で emacs のバッファ上で pry が起動します

あとは以下のような感じで補完してくれるようになります 
robe_demo.gif

その他コマンド

  • M-. to jump to the definition
  • M-, to jump back
  • C-c C-d to see the documentation
  • C-c C-k to refresh Rails environment
  • C-M-i to complete the symbol at point

参考サイト

2018年9月13日木曜日

Apple Special Event 2018 を見ました

自分用メモ
ツイートしながら見たのでまとめました

https://togetter.com/li/1266228

Rancher2.0 をインストールしてみた

概要

過去に 1.6 を触ったのですが 2.0 が登場したので触ってみました
とりあえず環境を構築するところまでです

環境

サーバ

  • rancher/rancher (2.0.8)
  • macOS 10.13.6

ワーカ

  • Ubuntu 16.04
  • docker 18.03.1-ce
  • rancher/rancher-agent:v2.0.8

Rancher 起動

今回はサーバは Mac 上で起動します

  • docker run -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher

https://172.28.128.1/ で管理画面を表示します (vboxnet0)
admin パスワードの設定と URL の設定をします

クラスタ作成

Rancher はクラスタを作成するのインフラとなるサービスをいろいろと選択できます
今回は VirtualBox をインフラとするので CUSTOM を選択します
Cluster Options でいろいろ設定できますがとりあえずそのままいきます
rancher2_1.png

ワーカとして登録するノードで実行するコマンドが表示されるのでコピーしておきます
etcd, Control Plane, Worker すべてにチェックを入れておきます
rancher2_2.png

ワーカノードの登録

VirtualBox で適当に VM を作成します
今回は Ubuntu16.04 を作成しました
あとは docker もインストールします
そして以下のコマンドを登録してノードをワーカとして登録します

sudo docker run -d --privileged --restart=unless-stopped --net=host -v /etc/kubernetes:/etc/kubernetes -v /var/run:/var/run rancher/rancher-agent:v2.0.8 --server https://172.28.128.1 --token 6q8j6x969mzwdh8929vb5gkjkq7fjstxsvklqmvc7qtmbtlc8zpchf --ca-checksum 4b443b81b26d0c70a9a832544dd7eb4ae40f39a7147410d9220a547148386eda --etcd --controlplane --worker

必要なノードは worker, etcd, Control Plane になります
それぞれ別のコンテナで起動しても良いですが面倒なので今回は 1 つのコンテナとして起動しています
初めにエージェントが起動しその後 kubernetes に必要なコンテナ (dns, ingress, canal etc) が次々と起動します
rancher2_3.png

上記のようにクラスタの作成が完了したらワーカノード上で docker ps でも実行してみるとわかると思います

kubectl でクラスタにアクセスしてみる

クラスタの画面から kubernetes 用の config ファイルが取得できるのでダウンロードしましょう
あとは kubectl コマンドでファイルを指定すればアクセスできます

  • kubectl --kubeconfig=kubeconfig get nodes
NAME            STATUS    ROLES                      AGE       VERSION
ubuntu-xenial   Ready     controlplane,etcd,worker   1h        v1.11.2

最後に

Rancher を使って k8s 環境を構築してみました
今回はノードが 1 台しかなく etcd, Control Plane, worker がすべて 1 台のマシン上で動作している環境にしました
これでも問題なくコンテナは動作します

しかし実際は etcd, Control Plane は別ノードで動かしましょう
そして worker も別ノードとして動かしてコンテナは worker ノードだけで動作させます
なので本来は最低でも 2 ノード必要になります
(Rancher サーバ自体が動作しているノードも含めると 3 台)
k8s 自体そうなっているのでまぁ当然かなと思います

参考サイト

2018年9月12日水曜日

Nexus7 に FactoryImage をインストールして復活させる方法

概要

間違って /system などを削除してブートローダ以降 Android が起動しなくなったりすることがあります
そんな場合に Factory Image をインストールし直すことで復活することがあります

環境

  • macOS 10.13.6
  • Nexus7 (2012)
  • Factory Image (5.1.1 nakashi)

やり方

  • wget https://dl.google.com/dl/android/aosp/nakasi-lmy47v-factory-5a0bb059.zip
  • unzip nakasi-lmy47v-factory-5a0bb059.zip
  • cd nakasi-lmy47v
  • ./flash-all.sh

全ログ

(bootloader) Bootloader is already unlocked
OKAY [  0.018s]
Finished. Total time: 0.020s
Erasing 'boot'                                     OKAY [  0.171s]
Finished. Total time: 0.216s
******** Did you mean to fastboot format this ext4 partition?
Erasing 'cache'                                    OKAY [  0.130s]
Finished. Total time: 0.175s
Erasing 'recovery'                                 OKAY [  0.025s]
Finished. Total time: 0.070s
******** Did you mean to fastboot format this ext4 partition?
Erasing 'system'                                   OKAY [  0.166s]
Finished. Total time: 0.211s
******** Did you mean to fastboot format this ext4 partition?
Erasing 'userdata'                                 OKAY [  3.510s]
Finished. Total time: 3.556s
Sending 'bootloader' (2100 KB)                     OKAY [  0.278s]
Writing 'bootloader'                               OKAY [  1.227s]
Finished. Total time: 1.550s
rebooting into bootloader                          OKAY [  0.020s]
Finished. Total time: 0.020s
extracting android-info.txt (0 MB) to RAM...
--------------------------------------------
Bootloader Version...: 4.23
Baseband Version.....: N/A
Serial Number........: 015d3f1889401e0a
--------------------------------------------
Checking product                                   OKAY [  0.030s]
Checking version-bootloader                        OKAY [  0.020s]
extracting boot.img (5 MB) to disk... took 0.026s
archive does not contain 'boot.sig'
archive does not contain 'dtbo.img'
archive does not contain 'dt.img'
archive does not contain 'odm.img'
archive does not contain 'product.img'
extracting recovery.img (5 MB) to disk... took 0.022s
archive does not contain 'recovery.sig'
extracting system.img (634 MB) to disk... took 4.725s
archive does not contain 'system.sig'
archive does not contain 'vbmeta.img'
archive does not contain 'vendor.img'
mke2fs 1.43.3 (04-Sep-2016)
Creating filesystem with 3557120 4k blocks and 889440 inodes
Filesystem UUID: 38a9d4ae-bd16-4304-8491-43451e8518a3
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

mke2fs 1.43.3 (04-Sep-2016)
Creating filesystem with 113408 4k blocks and 113408 inodes
Filesystem UUID: dc58664c-1964-4c17-b029-bb11c10581c2
Superblock backups stored on blocks:
        32768, 98304

Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

Sending 'boot' (5184 KB)                           OKAY [  0.650s]
Writing 'boot'                                     OKAY [  0.319s]
Sending 'recovery' (5738 KB)                       OKAY [  0.734s]
Writing 'recovery'                                 OKAY [  0.396s]
Sending 'system' (649455 KB)                       OKAY [ 81.857s]
Writing 'system'                                   OKAY [ 49.607s]
Erasing 'userdata'                                 OKAY [  2.268s]
Sending 'userdata' (4288 KB)                       OKAY [  0.568s]
Writing 'userdata'                                 OKAY [  2.622s]
Erasing 'cache'                                    OKAY [  0.087s]
Sending 'cache' (292 KB)                           OKAY [  0.063s]
Writing 'cache'                                    OKAY [  0.171s]
Rebooting                                          
Finished. Total time: 144.729s

これで unfortunately supersu has stopped も出なくなります

2018年9月11日火曜日

Nexus7 (2012) を Root 化してみた

概要

タイトルの通りやってみました
2012 と古いバージョンの Nexus7 になります
作業は自己責任でお願いします

環境

  • macOS 10.13.6
  • Nexus7 (2012)
  • TWRP
  • SuperSU

ADK (fastboot) のインストール

  • brew cask install android-platform-tools

SuperSU をダウンロードして Nexus7 に転送する

まずは電源 ON で普通に Android を起動します

ここから「SR5-SuperSU-v2.82-SR5-20171001224502.zip」をダウンロードします
ダウンロードしたファイルを Android file transfer などを使って Nexus7 に配置します
パスはどこでも OK ですが今回は /Android/data/SR5-SuperSU-v2.82-SR5-20171001224502.zip に配置しました

zip が Nexus7 にあればいいので Nexus7 で直接ファイルをダウンロードしても大丈夫かと思います
ただしその場合はパスがダウンロード用のパスになるので SuperSU をインストールする際にファイルを探す必要があります

カスタムリカバリイメージをインストールする

ここから Android っぽい作業になります
Android にはリカバリツールが標準でインストールされています
ただしそれだと SuperSU をインストールすることができません
なので zip を直接実行してインストールすることができるカスタムリカバリイメージをインストールします
ここから「openrecovery-twrp-2.8.5.1-grouper.img」をダウンロードしましょう

一旦電源を OFF しましょう
そして「電源」+「音量を下げるボタン」を同時に押しながら Nexus7 を起動します
すると以下のようなブートローダの画面になります
supersu1.jpg

ここでターミナルを立ち上げてダウンロードしたカスタムリカバリイメージのあるパスに移動します
そしてカスタムリカバリイメージを書き込みます

  • fastboot flash recovery openrecovery-twrp-2.8.5.1-grouper.img
sending 'recovery' (9426 KB)...
OKAY [  1.205s]
writing 'recovery'...
OKAY [  0.735s]
finished. total time: 1.940s

これで書き込み完了です
Nexus7 で音量を上げるボタンを 2 回押すと「Recovery mode」になるので電源ボタンを押して決定しリカバリーモードで起動します
supersu2.jpg

しばらくすると今回インストールしたカスタムリカバリイメージの「Team Win Recovery Project (TWRP)」が立ち上がります
supersu3.jpg

SuperSU をインストールする

TWRP の画面で一番左上の「Install」を選択します
そして先程 Nexus7 に配置した /Android/data/SR5-SuperSU-v2.82-SR5-20171001224502.zip を探します
どうやら /sdcard 配下にあるようなのでそこに移動しましょう
すると「SR5-SuperSU-v2.82-SR5-20171001224502.zip」があるので選択します
supersu4.jpg

そして「Swipe to Confirm Flash」でスワイプしてインストールします
supersu5.jpg

インストール中は以下のような感じです
supersu6.jpg

完了したら「Reboot System」を選択しましょう
supersu7.jpg

動作確認

Nexus7 が起動するとアプリ一覧に「SuperSU」があると思います
supersu8.jpg

設定画面は以下のような感じになっています
supersu9.jpg

最後に

今更ですが Nexus7 を Root 化してみました
ClockworkMod というカスタムリカバリイメージを使ってやってみましたができなかったので TWRP でやってみたらうまくできました

2018年9月10日月曜日

Google Cloud Shell を初期化する方法

概要

Google Cloud Shell 上でいろいろと作業しているファイルやディレクトリが増えていきます
ディスクのサイズも小さいのすぐに小さくなってしまうと思います
そんな場合に Google Cloud Shell の環境を 1 からやり直す方法を紹介します

環境

  • Google Cloud Shell (2018/08/28 時点)

方法

  • ls -a $HOME
  • sudo rm -rf $HOME

で Cloud Shell メニューから「歯車アイコン」->「Cloud Shell を再起動」 の順にクリックします
これで再起動すれば最初の状態に戻ります

そもそもシェル環境が使えなくなりコマンド自体が実行できない人は問い合わせるしかなさそうです

参考サイト

2018年9月9日日曜日

GKE 上で Jenkins を動かしてアプリの Canary デプロイを試してみた

概要

GKE 上で Jenkins を動かすことで Canary リリースを簡単に実現することができます
GKE で k8s クラスタを構築しそこに Jenkins をデプロイします
そして Cloud Source Repository 上でアプリのソースコードを管理して、Canary デプロイを実現します
今回は k8s + Jenkins の構築方法と実際にアプリを修正して Canary リリースまでやってみました
なお作業は Google Cloud Shell 上ですべて行います

環境

  • Google Kubernetes Engine (2018/09/04 時点)
  • Google Cloud Source Repository (2018/09/04 時点)
  • Google Cloud Shell
  • Jenkins 2.121.3

ディスク作成

  • gcloud config set compute/zone us-east1-d
  • gcloud compute disks create cd-jenkins

Jenkins の永続領域として使います

クラスタ作成

  • gcloud container clusters create jenkins-cd --num-nodes 2 --machine-type n1-standard-2 --scopes "https://www.googleapis.com/auth/projecthosting,cloud-platform"
  • gcloud container clusters get-credentials jenkins-cd
  • kubectl get pods

クラスタ内のノードは 2 台です
クラスタの認証情報を保存して kubectl でアクセスできることを確認します

サンプルアプリの取得

  • git clone https://github.com/GoogleCloudPlatform/continuous-deployment-on-kubernetes.git
  • cd continuous-deployment-on-kubernetes

ここに k8s 上にデプロイする Jenkins の定義やサンプルアプリの定義が含まれています
基本はこれを使っていきます

helm インストール

  • wget https://storage.googleapis.com/kubernetes-helm/helm-v2.9.1-linux-amd64.tar.gz
  • tar zxfv helm-v2.9.1-linux-amd64.tar.gz
  • cp linux-amd64/helm .

helm を使って Jenkins をデプロイするために使います

RBAC 設定

  • kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user=$(gcloud config get-value account)
  • kubectl create serviceaccount tiller --namespace kube-system
  • kubectl create clusterrolebinding tiller-admin-binding --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
  • ./helm init --service-account=tiller
  • ./helm update
  • ./helm version

helm を使ってクラスタにアクセスするサービスアカウントを作成します
アカウント名などは変更しても OK ですがそのままでも OK です

Jenkins デプロイ

  • ./helm install -n cd stable/jenkins -f jenkins/values.yaml --version 0.16.6 --wait
  • kubectl get pods
NAME                          READY     STATUS    RESTARTS   AGE
cd-jenkins-7c786475dd-smknn   1/1       Running   0          1h

Jenkins 用の Pod が Running になるまで待ちましょう
もしうまく Pod が上がらない場合は一旦削除して再度試してみてください

  • ./helm del --purge cd

Jenkins ログイン

  • export POD_NAME=$(kubectl get pods -l "component=cd-jenkins-master" -o jsonpath="{.items[0].metadata.name}")
  • kubectl port-forward $POD_NAME 8080:8080 >> /dev/null &
  • kubectl get svc

8080 で LISTEN していることを確認します
Google Cloud Shell のプレビュー機能を使って Jenkins を開きます

  • printf $(kubectl get secret cd-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo

これで admin ユーザのパスワードが表示できるのでログインしましょう

サンプルアプリのデプロイ

とりあえず手動でデプロイします

  • cd sample-app
  • kubectl create ns production
  • kubectl --namespace=production apply -f k8s/production
  • kubectl --namespace=production apply -f k8s/canary
  • kubectl --namespace=production apply -f k8s/services
  • kubectl --namespace=production scale deployment gceme-frontend-production --replicas=4
  • kubectl --namespace=production get service gceme-frontend

これでアプリにアクセスするための EXTERNAL-IP を確認しましょう
LoadBalancer を作成しているので有効になるのに少々時間がかかります

NAME             TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
gceme-frontend   LoadBalancer   10.59.255.179   35.193.81.133   80:31835/TCP   58m

これでブラウザでアクセスすると青色のアプリの画面が確認できると思います

  • export FRONTEND_SERVICE_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=production services gceme-frontend)
  • while true; do curl http://$FRONTEND_SERVICE_IP/version; sleep 1; done

この 2 つのコマンドはアプリを Canary リリースしたときに確認するコマンドなのでまだ実行しないで大丈夫です

Cloud Source Repository にアプリをコミットする

  • cd sample-app
  • git init
  • git config credential.helper gcloud.sh
  • gcloud source repos create gceme
  • git remote add origin https://source.developers.google.com/p/your-project-id/r/gceme
  • git config --global user.email "your-mail-address@domain.com"
  • git config --global user.name "your-name"
  • git add .
  • git commit -m "Initial commit"
  • git push origin master

とりあえず現在のソースを Cloud Resource Repository をプッシュします
ここに変更を加えてブランチを作成しブランチを Canary デプロイします

Jenkins に Credential を登録する

GKE 上にアクセスするための Credential を登録します

  1. 左メニュー認証情報を選択
  2. global を選択
  3. 認証情報の追加を選択
  4. 種類 -> Google Service Account from metadata を選択
  5. OK

gke_with_jenkins1.png

Jenkins にデプロイジョブの作成

Cloud Resource Repository から GKE にブランチをデプロイするためのジョブを作成します

  1. Jenkins のトップに戻る
  2. 「新しいジョブを作成」を選択
  3. 「Multibranch Pipeline」を選択して名前を「sample-app」で入力しジョブを作成
  4. Branch Sources -> Add source -> Git -> https://source.developers.google.com/p/your-project-id/r/gceme
  5. 認証情報はプロジェクト ID を選択
  6. Scan Multibranch Pipeline Triggers -> 他のビルドが起動していなければ定期的に起動 -> 間隔 -> 1 minute に設定

gke_with_jenkins2.png

Canary ブランチをデプロイしてみる

少し修正を加えてそれを Canary デプロイしてみます

  • git checkout -b canary
  • vim Jenkinsfile

冒頭の project の部分を自分のプロジェクト ID に変更します

-def project = 'PROJECT_ID'
+def project = 'your-project-id'

続いて canary ブランチになったのがわかるように色を変更します

  • vim html.go
-<div class="card blue">
+<div class="card orange">

バージョンも変更します

  • vim main.go
-const version string = "1.0.0"
+const version string = "2.0.0"

上記の変更を push します

  • git add .
  • git commit -m "Version 2"
  • git push origin canary

push が完了したら Jenkins のジョブに戻って「Scan Multibranch Pipeline Now」をスタートしましょう
gke_with_jenkins3.png

ビルドが完了したあとでブラウザでアプリにアクセスし続けるとオレンジの画面がたまに表示されるようになります
Canary デプロイはすべてのアプリを切り替えるのではなく一部のアプリだけを切り替えることができます
gke_with_jenkins4.png

master にマージする

  • git checkout master
  • git merge canary
  • git push origin master

再度「Scan Multibranch Pipeline Now」をスタートしてビルドが完了したあとにアプリにアクセスするとすべてのアクセスが 2.0.0 のアプリになっています

お掃除

  • gcloud compute disks delete cd-jenkins
  • gcloud container clusters delete jenkins-cd
  • gcloud source repos delete gceme

最後に

GKE 上に Jenkins をデプロイしてアプリの CI/CD 環境を構築してみました
ほぼサンプルを試しただけなので Jenkins のパイプラインの詳細は追っていませんが GKE 上で CI/CD する流れは掴めたかなと思います

アプリをデプロイするときは Slave 用の pod が立ち上がりデプロイするようです
公式のやり方ではあるのでこれで問題はないですが、既存の Jenkins がある場合はそこからデプロイするための連携とかしたいかなと個人的には思っています
Jenkins の k8s のプラグインをうまく設定すればできると思いますが、なぜか k8s と Jenkins の連携をするサンプルのほとんどが k8s 上に Jenkins もデプロイする方法なのが気になりました

参考サイト

2018年9月8日土曜日

mineo の S プラン (Softbank プラン) に申し込んでみた

概要

mineo の S プランが 2018/9/4 から始まりました
申し込みをして実際に SIM が届いて使ってみたのでやり方などを紹介します
また、今回は事前登録をしたので専用 URL から申し込みしています (現在は受付を終了しています)
mineo_s_plan1.png

身分証明書の電子データが必要になるので事前に準備しておきましょう

環境

  • mineo (S プラン)
  • iPhone6 (Softbank ロック)

タイムライン

  • 9/4 エントリーパッケージ購入
  • 9/5 申し込み完了
  • 9/7 SIM 到着、テスト

申し込み

まずはエントリコードを入力します
mineo_s_plan2.png

どうやら S プランの申込みにもエントリコードが使えるので Amazon でエントリコードを購入しました
エントリコードを使ったほうが事務手数料 3,000 円が無料になるのでお得です

プランを選択します
今回選択したのは以下の通りです
ポイントは「ソフトバンクプラン」と「デュアルタイプ」になります
デュアルタイプでないとキャンペーンが受けれません
通話サービスはキャンペーン中なので 10 分かけ放題を選択しました
3 ヶ月だけなのでもし不要な場合は 3 ヶ月後には解約する必要があります
また、このページで表示される金額はキャンペーンやエントリーコード適用前の金額になります

  • プランを選ぶ・・・ソフトバンクプラン (S プラン)
  • タイプを選ぶ・・・デュアルタイプ (データ通信+音声通話)
  • コースを選ぶ・・・500 MB
  • 通話サービスを選ぶ・・・mineo でんわ 10 分かけ放題
  • 端末の購入を有無を選ぶ・・・SIM カードのみを購入する

mineo_s_plan3.png

SIM を選択します
会話形式で SIM のタイプを選択できます
iPhone6 は「nano SIM」になるので nano SIM になっていれば OK です
https://support.apple.com/ja-jp/HT202645
mineo_s_plan4.png

MNP かどうかの選択になります
今回は新規で申し込みます
MNP の場合は予約番号などが必要になります
mineo に MNP で申し込む方法は過去に紹介しているのでこちらを御覧ください
mineo_s_plan5.png

オプションの申し込みになります
今回は特にオプションには申し込まないのでそのまま次にいきます
それにしてもオプションがかなりあってビックリです
mineo_s_plan6.png

契約内容の確認画面になります (SS 省略)
すでに eoID を持っていてログインしている場合はそれが表示されます
内容を確認して次にいきます
ちょくちょくオプションに加入するかどうかのダイアログが出ますが今回は申し込まないのでキャンセルしましょう

申込み内容を確認します
この画面もキャンペーン適用前の金額です
mineo_s_plan7.png

mineo おなじみの本人確認書類のアップロードになります
身分証明書を携帯で撮ったりスキャンして電子化しアップロードしてください

「提供条件のご確認-提供条件(重要事項)とサービスのご確認」になります
「同意する」を選択します
そして「お申込みを確定」で申し込みします

最後までキャンペーンの適用価格が確認できなかったのが怖いですが選択します
キャンペーン適用後の金額は申込み後に送付されてくる契約書で初めて確認できます、もしくは契約完了メールが送らてきたあと mineo のマイページから「ご契約内容照会」から確認できます
mineo_s_plan8.png

申込みの確認のメールが来ます
あとは SIM カードが来るまで待ちましょう

SIM 到着後、動作確認

まずは SIM を取り外します
mineo_s_plan9.jpg

そして iPhone6 に SIM を挿しましょう
mineo_s_plan10.jpg

プロファイルインストール

次にプロファイルをインストールします
Safari で https://mineo.jp/r/s/apn/ にアクセスしましょう
ここが罠ポイントなのですがプロファイルをダウンロードするのにインターネットへの接続が必要です
そしてまだ mineo SIM では通信できません
つまり Wi-Fi やテザリングを使ってインターネットに接続できる環境が必要になります
自分は Wi-Fi があるのでそれでダウンロードしましたが、代用できるものがない場合はフリーの Wi-Fi スポットなどに行きダウンロードする必要があります

設定ファイルをダウンロードする画面になったらリンクをクリックしてダウンロードします
iPhone6 以前のプロファイルをダウンロードしてください
mineo_s_plan11.PNG

するとプロファイルのインストール画面になるので iPhone6 のロックを解除するパスワードを入力してプロファイルをインストールしましょう
プロファイルのインストールが完了したら iPhone6 を再起動します

うまく繋がらない、、、

が、うまくインターネットに繋がりません
いろいろ試してみたいので結果を記載しておきます

試しにもともとあったソフトバンクのプロファイルを削除し再起動してみましたが結果は変わりませんでした

ダウンロードしたプロファイルがちゃんと iPhone6 以前用のプロファイルになっているか確認してください
自分は始め iPhone7 以降のプロファイルを使っていて繋がりませんでした

SIM の向きを確認する、抜き差ししてみる
これは結果的に関係なかったですが念の為確認してもいいと思います

自分が繋がらなかった最終的な原因は以下でした
設定 -> モバイル通信 -> オンになっていることを確認する
電波表示のところに 3G やら 4G という表記がない場合はオフになっています
設定アプリからオンにしましょう

その他

LINE のアカウントを取得するのに SMS を受け取る必要があるので SMS が受け取れるか試してみたのですが受け取れました
iPhone5 + mineo のときは受け取れなかったはずですが、iPhone6 だ大丈夫なようです

最後に

mineo の S プランに登録して Softbank 縛りの iPhone6 で使ってみました
基本は SIM を挿したあとでプロファイルをダウンロードするだけなので作業的には簡単なのですがやはり多少のハマりポイントはあったかなと思います

また申し込みに関してはもう事前登録のキャンペーンはやってませんがエントリーパッケージは使えるので使いましょう

あと気になってサポートに問い合わせてみたのですが A or D プランから S プランへのプラン変更は今回のキャンペーンの適用外となります
あくまでも新規 or MNP で S プランを新規契約した場合にキャンペーンが適用になります
プラン変更の場合はこれまで通り mineo のマイページから変更してください
参考 -> https://hawksnowlog.blogspot.com/2018/02/mineo-changes-to-dplan-from-aplan.html
その場合は事務手数料が別途かかります