2017年7月28日金曜日

Active Directory と連携して Windows 認証してみる

概要

前回 Windows Server 上に Active Directory サーバを構築してみました
今回は Active Directory と Windows の認証を連携して Active Directory 上にいるユーザでログインするところまでやってみました

環境

  • Windows Server 2012 R2

ドメインに参加

まずクライアント側の Windows マシンが Active Directory のドメインに参加する必要があります
当然ですが、Active Directory サーバとクライアント側の Windows マシンはネットワーク的にリーチャビリティがある状態です
また以下の作業はドメインに参加する側のクライアント Windows マシンで行ってください

  1. 「コントロール パネル\ネットワークとインターネット\ネットワーク接続」で AD サーバと通信する方のネットワークアダプタのプロパティを開く
  2. 「インターネット プロトコル バージョン 4 (TCP/IP4)」のプロパティを開く
  3. 「次の DNS サーバのアドレスを使う」にチェックして IP に AD サーバのアドレスを入力する

先に DNS の向き先を AD サーバにしておかないとドメインに参加できません
次にマシンをドメインに参加させます

  1. 「コントロール パネル -> システムとセキュリティ -> システム -> システムの詳細設定」を選択
  2. 「コンピュータ名」タブ -> 「変更」を選択
  3. 「システムのプロパティ」を開き「コンピュータ」タブを開く
  4. 「ドメイン」に hawksnowlog を入力 (NetBIOS ドメインの小文字版を入れる)
  5. ユーザ名とパスワードに AD サーバの管理者権限を持つユーザの情報を入力
  6. 参加できたら再起動して AD サーバ中にいるユーザでログインできるか確認

という感じです
参加するときに以下のエラーが出る場合は設定を再度確認してください

ドメイン "hawksnowlog" に参加中に次のエラーが発生しました。指定されたドメインがないか、またはアクセスできません。

  • ネットワークアダプタの DNS の向き先の設定が AD サーバになっているか
  • Windows マシンから AD サーバへの疎通はできているか (ping などを打ってみましょう)
  • Windows ファイアウォールの設定も確認してみましょう、オフにできるなら一度オフにして参加できるか確認してみましょう

動作確認

クライアント側の Windows マシンで Active Directory 上のユーザでログインできるか確認してみます
ログインするときに HAWKSNOWLOG\username とすることで Active Direcotory サーバ上にいるユーザでログインできます
RDP などの場合ローカルにあるユーザ名を設定しているとそのユーザで自動的にログインできてしまうので、一旦ログアウトからドメインを指定してログインしてみてください

また AD サーバ側で「Active Directory ユーザとコンピュータ」を開いて「操作」->「新規作成」->「ユーザ」で新規ユーザを作成してみましょう
そしてそのユーザでログインできるかも確認してみてください

最後に

Windows マシンと Active Directory を連携して Windows へのログインを Active Directory 上のユーザで認証できるようにしてみました

一点はまったのが Active Directory に追加したユーザでリモートデスクトップに接続するときに

リモートでサインインするには、リモートデスクトップサービス経由でサインインする権限が必要です というエラーが発生しました

どうやら追加したユーザにリモートアクセスできる権限を持つグループへの参加が必要で自分はいろいろとグループに参加させてみたのですが、うまくできませんでした
また、ポリシーの設定で参加しているグループがリモートアクセスできるように設定すればできるともあったのですが、それでもダメでした

最終的に自分が解決したのは、もともとリモートアクセスできる管理者ユーザと同じ権限を持つユーザを追加することでリモートアクセスできるようにしました
たぶん、ちゃんとグループやポリシーを設定してユーザを追加するほうが正しい方法だと思いますが、とりあえず新規ユーザでログインできることを確認したかったのでそうしました

参考サイト

2017年7月27日木曜日

Windows Server 2012 R2 に Active Directory サーバを構築してみた

概要

Windows Server 2012 に Active Directory サーバを構築してみました
基本は画面をポチポチしていくだけです

環境

  • Windows Server 2012 R2

インストール

  1. 「サーバマネージャ」起動
  2. 「役割と機能の追加」を選択
  3. 「役割ベースまたは機能ベースのインストール」を選択
  4. サーバを選択 (基本は今インストールしようとしてサーバ名を選択すれば OK)
  5. 「Active Directory ドメインサービス」を選択 ->「機能の追加」を選択
  6. 機能の設定ページはそのまま「次へ」を選択
  7. AD DSの設定ページも特に何もせず「次へ」
  8. オプションサービスで「インストール」を選択
  9. インストールが完了したら「閉じる」

でインストール完了です
特に入力するところもないので本当にポチポチするだけです

設定

インストールしたら設定します
ここでドメインなどを設定します

  1. 「このサーバをドメインコントローラに昇格する」
  2. 「新しいフォレスト」を追加する -> ルートドメインに自分が設定したいドメインを入力 (今回は hawksnowlog.cf)
  3. DNS にチェックしてパスワードを入力して「次へ」
  4. DNS 自体はインストールしてないので特に設定せず「次へ」
  5. NetBIOS ドメイン設定 -> HAWKSNOWLOG
  6. パスを設定、基本はそのままで OK なので「次へ」
  7. 内容を確認して「次へ」を選択、問題なければ「インストール」を選択
  8. インストールが完了すると勝手に再起動します

動作確認

基本は再起動すれば ActiveDirectory サーバが動作しています
アプリケーションの一覧にも ActiveDirecotry サーバを管理するためのツールが追加されています

動作確認方法としてはログインする時に設定したドメインを指定するようにしてみます
今回であれば hawksnowlog\username でログインできます (.cf は不要です)
デフォルトだと新規ログインするときにパスワードを変更するように求められるので変更します
結構パスワードポリシーが厳しいです

最後に

とりあえず Windows Server 2012 に Active Directory サーバを構築してみました
次回はもう一台の Windows マシンを用意して Active Directory を使ってログイン認証を試してみようと思います

参考サイト

2017年7月23日日曜日

Mac で Air Video HD を使って動画配信サーバを構築してみる

概要

Air Video HD という動画配信することができるツールがあります
HDD に貯まった動画をスマホで見たり Chromecast で見ることができます
今回は Mac で試してみました

環境

  • macOS X 10.12.5
  • Air Video HD Server 2.2.4-beta2

Mac 側設定

http://www.inmethod.com/airvideohd/index.html;jsessionid=704286F1BC2199BC26A347A4680C380F
から Mac 版のインストーラをダウンロードします (Air+Video+Server+HD+2.2.4-beta2)
http://inmethod.com/airvideo/download.html じゃないので注意

ダブルクリックして「Air Video Server HD」が展開できたら「アプリケーション」に移動させます
これでインストール完了です

動画が詰まった HDD を Mac に接続します
Air Video を起動します
「Air Video Server HD Preferences」が開いたら「Shared Folders」でプラスしてマウントした HDD の動画のあるパスを指定しましょう
air_video_hd_on_mac.png

サーバ側はこれで準備完了です

iPhone 側設定

iPhone に Air Video HD をインストールします
App Store で検索すればすぐに見つかると思います
無料アプリで In App purchase があります、無料版だとスマホ上での動画再生時に広告的なのが表示されます

インストールすると Servers にインストールした Mac が表示されます
どうやら PIN やら IP とポートを使った接続をわざわざしないでも勝手にブロードキャストして見つけてくれるようです
Mac を選択すると HDD の中にある動画がずらっーと表示されると思います
あとは動画を選択して再生すれば OK です
air_video_hd_on_mac2.PNG

Chromecast について

Chromecast にも対応しているようです

アプリはバックグランドにしても Chromecast 側は動作します
バツボタンやスワイプで別の動画に移動すると Chromecast 側も停止します
ただ、Chromecast に一度接続すれば接続しっぱなしになるので、再度動画を再生すれば勝手に Chromecast で再生されます
あとは当然ですが、マウントが外れたり、Mac 側の Air Vide HD Server が死んでも動画は停止します
Mac を閉じて休止状態にしても停止します

HDD の読み込み速度が遅いと動画がカクカクします
読み込む速度の早い HDD を使うことをおすすめします、SSD なら全然問題ないです

なので正直 Mac Book などのノード PC での起動はおすすめしません
iMac のデスクトップ環境や Mac Pro などのサーバで立ち上げるのをおすすめします

最後に

Air Video HD Server を Mac で試してみました
スマホでも見れるし Chromecast でも見れるのでかなり便利なアプリだと思います

Mac Book の場合でもクラムシェルモードとかで使えばいつでもアクセスできる環境は作れそうですがそこまでやるかという気はします
Mac Book であれば Chrome の拡張で「Videostream for Google Chrome」があるのでこれを使うほうが良いかなと思います

あとは Mac じゃなくて RaspberryPi など使ってサーバを立てるのが良いと思います
ラズパイも頑張れば Air Video HD Server を立てられるようです

2017年7月22日土曜日

Harbor で ldap 認証を試してみた

概要

前回 CentOS 上に LDAP サーバを構築しました
Harbor には LDAP 認証と連携する機能があります
せっかくなので Harbor の LDAP 連携機能を使ってみました

環境

  • サーバ側
    • CentOS 7.3.1611
    • openldap (servers, clients) 2.4.40-13
  • クライアント側
    • Harbor 1.1.2
    • docker 17.03.1-ce
    • docker-compose 1.13.0

ldap を有効にする

今回は既存の Harbor 環境に対して ldap をあとから追加します

  • vim harbor.cfg
ldap_url = ldap://192.168.10.1:389/
ldap_basedn = ou=People,dc=example,dc=com
  • docker-compose down
  • docker rmi $(docker images -q)
  • docker volume rm $(docker volume ls -q)
  • rm -rf /data
  • ./install.sh

ポイントはデータボリュームと /data を削除することです
そうしないと昔のデータを参照してしまい認証モードがずっと db_auth になってしまいます

動作確認

まずは admin ユーザで Harbor にログインします
そして、 Configuration -> Authentication で Auth Mode が「LDAP」になっていることを確認します
harbor_ldap.png

「LDAP Search Password」は自動で入力されていました
下に「TEST LDAP SERVER」というボタンがあるのでここをクリックして「Connection to LDAP server is verified. 」なることを確認します
もし失敗する場合は FW や ldap サーバの設定を確認してください

確認できたら ldap に登録したユーザでログインできるか確認してみましょう
一旦 admin ユーザでログアウトして別ユーザでログインします

問題なく ldap ユーザでログインできれば連携は成功です

最後に docker login もできるか確認してみましょう
同じく ldap ユーザでログインできるのが確認できると思います

最後に

Harbor の ldap 機能を試してみました
ldap サーバ側はかなり単純な設定なので、Harbor 側も設定する項目が少なく簡単にできました
ユーザ管理が断然楽になるので ldap がある環境であればこっちを使うほうが良いと思います

2017年7月21日金曜日

OpenLDAP と SSH 認証を連携してみた

概要

前回 CentOS 上に構築した LDAP サーバを今回は SSH の認証として使ってみたいと思います

環境

  • サーバ側
    • CentOS 7.3.1611
    • openldap (servers, clients) 2.4.40-13
  • クライアント側
    • Ubuntu 16.04
    • ldap-auth-client 0.5.3
    • nscd 2.23-0ubuntu9

必要なライブラリのインストール

  • apt install -y nscd ldap-auth-client

でインストールすると ldap サーバの設定をいろいろと聞かれます
今回は前回の設定をそのまま使うので以下のように回答しました
ldap サーバの IP やポート、cn, dc は各自で設定したものを記載してください

  • ldap://192.168.10.1:389
  • dc=example,dc=com
  • Protocol version: 3
  • Yes と回答
  • No と回答
  • cn=Manager,dc=example,dc=com
  • パスワードを設定します (たぶん ldap の設定を変更する際の root ユーザ以外に求められるパスワードです)

再度設定したい場合は dpkg-reconfigure ldap-auth-config コマンドを実行してください

pam の設定

  • pam-auth-update

これまた CUI での設定画面になります
項目内に「LDAP Authentication」と「Create home directory on login」があると思うのでそれぞれチェックをして有効にしてください

nsswitch.conf の設定

ldap を認証に使うように設定します

  • vim /etc/nsswitch.conf
passwd:         compat ldap
group:          compat ldap
shadow:         compat ldap

そして nscd を再起動します

  • systemctl restart nscd

おまけ: sshd の設定の確認

sshd の設定でパスワード認証がそもそも ON になっていない場合は ON にしましょう
また鍵認証のみが ON になっている場合は OFF にしておきます

  • vim /etc/ssh/sshd_config
PubkeyAuthentication no
PasswordAuthentication yes
  • systemctl restart sshd

動作確認

では動作確認です
設定したサーバに LDAP 上に作成したユーザで SSH ログインできるか確認してみましょう

  • ssh hawk@192.168.10.2

前回作成した hawk さんでログインできることを確認しました
また、ログイン後にホームディレクトリがあり、ログインシェルが bash になっていることも確認しました

hawk@ubuntu:~$ id
uid=1001(hawk) gid=1000(develop) groups=1000(develop)
hawk@ubuntu:~$ pwd
/home/hawk
hawk@ubuntu:~$ echo $BASH
/bin/bash

最後に

OpenLDAP と SSH の連携をしてみました
今回は nscd (Name Service Cache Daemon) というツールを使いましたが他にも sssd (System Security Services Daemon) というツールがあります
最近だと sssd を使うほうが主流らしいです

参考サイト

2017年7月20日木曜日

CentOS7 で OpenLDAP を試してみた

概要

CentOS7 に OpenLDAP をインストールしてグループの追加とユーザの追加までやってみました
結構クセのある操作なので慣れるまで大変かもしれません

環境

  • CentOS 7.3.1611
  • openldap (servers, clients) 2.4.40-13

インストール

  • yum -y install openldap openldap-clients openldap-servers

作業用ディレクトリの作成

OpenLDAP では .ldif というファイルを手動で作成してそれをコマンドで追加することで設定を反映させます
ldif ファイルを作成するディレクトリを作成しておきます

  • cd
  • mkdir ldap_work

設定と起動

データベース用の設定ファイルをコピーしてから起動します

  • cp -p /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
  • systemctl start slapd

admin 用の LDAP パスワードを設定

まずは admin 用のパスワードを登録します
このパスワードは設定を反映させるときに使うので忘れないようにしてください

  • slappasswd

でパスワードを入力して以下のようなハッシュが表示されれば OK です

{SSHA}Gtys4HSlB4NAbEY+/524hxN+Lcr60z7K

まだこの状態ではパスワードは LDAP に反映されていません
冒頭述べたように LDAP への設定の反映は基本的に .ldif ファイルを作成して ldapadd で反映します

  • touch ldap_work/add_admin_pass.ldif
  • vim ldap_work/add_admin_pass.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}Gtys4HSlB4NAbEY+/524hxN+Lcr60z7K

すべてがおまじないのような文法です
dn は識別子のことで「Distinguished Name」の略です
OpenLDAP では設定の追加や削除をするのに、この dn を使って重複や削除する項目を判断します

  • ldapadd -Y EXTERNAL -H ldapi:// -f ldap_work/add_admin_pass.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"

作成した ldif ファイルの設定の追加は ldapadd コマンドを使います
-Y EXTERNAL -H ldapi:// のオプションにしてはおまじないだと思ってください
パスワードの登録は OpenLDAP が持つグローバルな設定に対して追加するのでその場合にこのオプションが必要になります
これでパスワードの登録が完了しました

基本スキーマの登録

グループの登録をするときに必要になるクラスがあるので登録します
インストール時に用意されている ldif ファイルがあるのでそれを ldapadd していきます

  • ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
  • ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
  • ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif

Domain Component (dc) の変更

ここからがメインの設定になります
dc は「Domain Component」の略で ldap 内で管理されるドメインになります
今回は example.com をドメインとして登録します
もちろんダミーのドメインですがダミーでも問題ありません

  • touch ldap_work/modify_dc.ldif
  • vim ldap_work/modify_dc.ldif
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
  read by dn.base="cn=Manager,dc=example,dc=com" read by * none

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=example,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=example,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}Gtys4HSlB4NAbEY+/524hxN+Lcr60z7K

自分もよくわかってないのですが、上から

  • monitor というスキーマへ権限情報の変更
  • hdb というスキーマへ olcSuffix の変更
  • hdb というスキーマへ olcRootDN の変更
  • hdb というスキーマへ olcRootPW の変更

をそれぞれ行っています
上記 dc=example,dc=com の部分を書き換えれば別のドメインを設定することができます

設定の変更は ldapmodify コマンドを使って行います

  • ldapmodify -x -D cn=config -W -f ldap_work/modify_dc.ldif

を実行して変更を反映しましょう
先程登録した admin 用のパスワードを入力してください (slappasswd で設定したパスワード)
「-w」オプションを使用すれば引数でパスワードを指定することもできますが「-W」を使って入力したほうが良いと思います

modifying entry "olcDatabase={1}monitor,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"

こんな感じで反映されれば OK です
反映後の実体のファイルは /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}hdb.ldif などにあるので確認してみると良いと思います

Organization Unit (ou) の登録

登録したドメインに今度は ou (組織) を登録していきます
この組織の中にグループやユーザを登録することになります
グループやユーザを管理する上位の概念になるのでそれっぽい名前を付けましょう

  • touch ldap_work/add_ou.ldif
  • vim ldap_work/add_ou.ldif
dn: dc=example,dc=com
objectClass: dcObject
objectClass: organization
dc: example
o: Example Inc.

dn: ou=People,dc=example,dc=com
objectClass: organizationalUnit
ou: People

dn: ou=Group,dc=example,dc=com
objectClass: organizationalUnit
ou: Group

今回は People (ユーザを管理する組織) と Group (グループを管理する組織) を作成しました
追加なので ldapadd コマンドを使って登録します

  • ldapadd -x -D “cn=Manager,dc=example,dc=com” -W -f ldap_work/add_ou.ldif
adding new entry "dc=example,dc=com"
adding new entry "ou=People,dc=example,dc=com"
adding new entry "ou=Group,dc=example,dc=com"

グループの追加

Group ou 内にグループを作成していきます

  • touch ldap_work/add_group.ldif
  • vim ldap_work/add_group.ldif
dn: cn=develop,ou=Group,dc=example,dc=com
objectClass: posixGroup
cn: develop
gidNumber: 1000

cn に追加するグループ名を設定することができます
今回は cn=develop としました
ちなみにここで設定したグループ名は後に連携する SSH 認証のログイン後に id コマンドなどで確認できるグループ名になります

あとは ldapadd で追加すれば OK です

  • ldapadd -x -D “cn=Manager,dc=example,dc=com” -W -f ldap_work/add_group.ldif

ユーザの追加

最後にユーザを追加しましょう
ユーザは People 組織配下に作成します
同時に初期パスワードも設定する必要があるので slappasswd でハッシュ値を生成します

  • slappasswd -h ‘{CRYPT}’
    • パスワードを入力してハッシュ値を取得しておきます
    • {CRYPT}vUOIOBK7ku0LU
  • touch ldap_work/add_user.ldif
  • vim ldap_work/add_user.ldif
dn: uid=hawk,ou=People,dc=example,dc=com
objectclass: posixAccount
objectclass: inetOrgPerson
sn: hawk
cn: snowlog
displayName: hawksnowlog
uid: hawk
uidNumber: 1001
gidNumber: 1000
homeDirectory: /home/hawk
loginShell: /bin/bash
userPassword: {CRYPT}vUOIOBK7ku0LU
mail: hawk@hawksnowlog.cf

hawk さんを登録します
グループとの紐付けは gidNumber で行います
slappassword で作成したパスワードは userPassword に設定します
ログインしたときにホームディレクトリを作成しデフォルトで使用するログインシェルを指定しています
あとは ldapadd で追加すれば OK です

  • ldapadd -x -D “cn=Manager,dc=example,dc=com” -W -f ldap_work/add_user.ldif

確認してみる

作成したグループとユーザ情報を ldapsearch コマンドで確認してみます

  • ldapsearch -x -LLL -D “cn=Manager,dc=example,dc=com” -W -b “ou=Group,dc=example,dc=com”
  • ldapsearch -x -LLL -D “cn=Manager,dc=example,dc=com” -W -b “ou=People,dc=example,dc=com”

Group 配下と People 配下に登録したグループとユーザが存在するのが確認できると思います

最後に

CentOS7 上に LDAP サーバを構築してみました
これだけだとタダのユーザ管理にしか使えないので次回は SSH と連携して認証管理までやらせてみようと思います

Tips

作成したユーザを作成した場合は以下のコマンドで削除できます

  • ldapdelete -x -D “cn=Manager,dc=example,dc=com” -W “uid=hawk,ou=People,dc=example,dc=com”

cn=config 配下の設定をすべて表示します

  • ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config

参考サイト

2017年7月18日火曜日

Ruby から docker を操作する

概要

Ruby から docker API をコールしてみました

環境

  • CentOS 7.3.1611
  • docker 17.03.1-ce
  • Ruby 2.3.3p222

dockerd を tcp で通信できるようにする

事前に dockerd の設定を変更する必要があります
過去に紹介した記事があるのでこちらを参考に dockerd の設定を変更してください

ライブラリインストール

  • bundle init
  • vim Gemfile
gem "docker-api"
gem "pp"
  • bundle install

とりあえずバージョンを表示してみる

  • touch docker.rb
  • vim docker.rb
require 'docker'
require 'pp'

Docker.url = 'tcp://0.0.0.0:2376'
pp Docker.version
  • bundle exec ruby docker.rb
{"Version"=>"17.03.1-ce",
 "ApiVersion"=>"1.27",
 "MinAPIVersion"=>"1.12",
 "GitCommit"=>"c6d412e",
 "GoVersion"=>"go1.7.5",
 "Os"=>"linux",
 "Arch"=>"amd64",
 "KernelVersion"=>"4.9.4-1.el7.elrepo.x86_64",
 "BuildTime"=>"2017-03-24T00:36:45.846383257+00:00"}

こんな感じで表示されば OK です

イメージを pull する

先程のファイルの末尾に追記していきます

  • vim docker.rb
image = Docker::Image.create('fromImage' => 'alpine:latest')
p image.info["id"]

で以下のように ID が表示されれば OK です

"sha256:7328f6f8b41890597575cbaadc884e7386ae0acc53b747401ebce5cf0d624560"

イメージに tag 付けする

リポジトリとタグを指定してプライベートリポジトリに push する際に使います

  • vim docker.rb
tagged = image.tag('repo' => 'your-registry.com/hawksnowlog/alpine', 'tag' => 'latest', force: true)
p tagged

で以下のようにタグ付けしたイメージが追加されていれば OK です

["alpine:latest", "your-registry.com/hawksnowlog/alpine:latest"]

イメージを push する

タグ付けしたイメージを push してみます

  • vim docker.rb
Docker.authenticate!('username' => 'username', 'password' => 'password', 'serveraddress' => 'your-registry.com')
pushed = image.push(nil, repo_tag: 'your-registry.com/hawksnowlog/alpine:latest')
pp pushed

でプライベートリポジトリにイメージを push することができます

最後に

Ruby から docker を操作してみました
過去に golang でやったのですが数倍は楽にできました
その他の操作方法も Github の公式を見れば簡単にできると思います

参考サイト

2017年7月15日土曜日

Ubuntu16.04 の nginx で SSL 通信を有効にする方法

概要

Ubuntu16.04 で apt install できる nginx に SSL 証明書を設定して https 通信させてみました
Web 上に他にもいろいろと nginx + ssl の記事はありますが自分の備忘録として残しておきます

環境

  • Ubuntu 16.04
  • nginx 1.10.3

nginx のインストール

  • apt -y install nginx

今回は apt でインストールします
執筆時点での nginx の最新版は 1.13.3 なのでバージョン的にはかなり古いものになります

SSL の有効化

ディレクトリ構成などは apt install できたものをそのまま採用してます

設定ファイルの作成

まず SSL 用の設定ファイルがないので作成します

  • touch /etc/nginx/sites-available/ssl
  • vim /etc/nginx/sites-available/ssl
server {
        listen       443;
        server_name  your.site.domain.com;

        ssl                  on;
        ssl_certificate      /etc/ssl/certs/chain_server.crt;
        ssl_certificate_key  /etc/ssl/certs/server.key;

        ssl_session_timeout  5m;

        ssl_protocols  SSLv2 SSLv3 TLSv1;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers   on;

        location / {
            proxy_pass http://localhost:9292/;
            proxy_redirect default;
        }
}

server_name には 443 で受けるサーバまたはロードバランサのドメイン名を指定してください
ポイントとしては ssl_certificate の項目で nginx の場合 CA 証明書を設定する欄はなく ssl_certificate でサーバ証明書と CA 証明書を設定します
つまりどういうことかというと 2 つのファイルを結合して配置します

連結証明書の作成

  • scp server.crt server.key ca.crt server001:/etc/ssl/certs

ローカルからサーバに証明書を転送します、すでにサーバに証明書一式がある場合はこの作業は不要です
パスは「/etc/ssl/certs」に配置します

  • cd /etc/ssl/certs
  • cat server.crt ca.crt >> chain_server.crt

単純に cat で結合すれば大丈夫です

設定ファイルを有効化

Ubuntu + apt install の場合 sites-enabled に使いたい設定ファイルのシンボリックリンクを作成することで設定を追加することができます
Apache とかもこの方式を採用しています

  • cd /etc/nginx/sites-enabled
  • ln -s /etc/nginx/sites-available/ssl ssl
  • rm default
  • systemctl restart nginx

作成した ssl を sites-enabled にリンクして終了です
あとは nginx を再起動してあげましょう

動作確認

ブラウザや curl で適当にドメインにアクセスして localhost:9292 で動作してるアプリにアクセスできるか確認してください
もちろんローカルで動作しているアプリは別のものに変更して大丈夫です

最後に

Ubuntu16.04 の nginx で https 通信を設定してみました
Web 上に膨大な情報があるので簡単にセットアップできると思います

この後の Tips でも紹介していますが、地味に ufw の設定などでハマるかもしれません

Tips

もし key ファイルにパスが設定されている場合は以下のコマンドでパスフレーズがない key ファイルを作成してください
パスフレーズがあっても問題ないのは問題ないですが、systemctl で自動起動などができなくなります

  • openssl rsa -in server.key -out nopass_server.key

パスフレーズがわからない場合はさすがに証明書の管理者に聞くしかないと思います

Ubuntu の場合 ufw が効いているので 443 をオープンしましょう

  • ufw allow 443

あと curl で以下のようなエラーが出た場合は CA 証明書が適切に連結されているか確認してみてください

curl: (60) server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none

証明書によっては CA ファイルが不要な証明書もあるのでその場合は特にエラーも出ないと思います

2017年7月14日金曜日

既存の git リポジトリを既存の Heroku アプリとして登録する方法

概要

Heroku 上には既にアプリがあって新たに clone したリポジトリを Heroku のアプリとして登録した場合の方法を紹介します
というかいつもコマンドを忘れるので備忘録として残しておきます

環境

  • macOS X 10.12.5
  • heroku-cli 6.12.8-ec1843e

方法

git リポジトリ配下に移動して以下のコマンドを実行します

  • heroku git:remote --app your-existed-app-name

で Heroku アプリを登録したら

  • git push -u heroku master

で Heroku にデプロイできます

2017年7月13日木曜日

Ubuntu16.04 (64bit) に golang 1.8.3 をインストール

概要

別の記事でちょろっとインストール方法が記載されていたりするのですが、単体の記事でポストしていなかったので備忘録として残しておきます
バージョンが上がればインストール方法が変わる可能性があるので、最新版をインストールしたい場合は参考サイトにある公式を御覧ください

環境

  • Ubuntu 16.04
  • golang 1.8.3 -> 1.11.2

インストール

  • cd /tmp
  • wget 'https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz'
  • wget 'https://dl.google.com/go/go1.11.2.linux-amd64.tar.gz'
  • tar -C /usr/local -xzf go1.8.3.linux-amd64.tar.gz
  • mkdir $HOME/go
  • echo 'export PATH=$PATH:/usr/local/go/bin' >> $HOME/.profile
  • echo 'export GOPATH=$HOME/go' >> $HOME/.profile
  • echo 'export PATH=$PATH:$GOPATH/bin' >> $HOME/.profile
  • go version

Getting Started

  • mkdir -p $GOPATH/src/github.com/hawksnowlog/test
  • touch $GOPATH/src/github.com/hawksnowlog/test/main.go
  • vim $GOPATH/src/github.com/hawksnowlog/test/main.go
package main

import (
        "fmt"
)

func main() {
        fmt.Println("hoge")
}
  • go fmt github.com/hawksnowlog/test
  • go build github.com/hawksnowlog/test
  • go install github.com/hawksnowlog/test
  • test

参考サイト

2017年7月12日水曜日

VMware Harbor の harbor_ui のバイナリだけビルドしてみた

概要

前回 Harbor を docker コンテナ上でビルドしてみました
Harbor 内に含まれるバイナリの 1 つに harbor_ui というバイナリがあり API などを管理してます
今回はこのバイナリだけビルドしてビルドした独自のバイナリを動作確認するところまでやってみました

環境

  • CentOS 7.3.1611
  • make 3.82
  • docker 17.03
  • docker-compose 1.9.0
  • go 1.8.0

ビルドの流れを解析してローカルでビルドしてみる

Harbor のビルド全体を管理する Makefile 的には以下の「compile_ui」ターゲットで実行されていました

compile_ui:
        @echo "compiling binary for ui..."
        @$(GOBUILD) -o $(UIBINARYPATH)/$(UIBINARYNAME) $(UISOURCECODE)
        @echo "Done."

ターゲット的には単純に go build しているだけです
環境変数で構成されるコマンドを紐解くと

  • /usr/local/bin/go build -o ./make/dev/ui/harbor_ui ./src/ui

こんな感じになります
なので、ローカルの go 環境でビルドする場合は

  • cd /root/go/src/github.com/vmware/harbor
  • vim src/ui/api/search.go
    • 適当に書き換えてみる
    • log.Info(keyword) を L.45 に追加してみる
  • make cleanbinary
  • make compile_ui

とすればビルドすることができます
成功すると harbor-ui というバイナリが以下のディレクトリに生成されます

  • ls ./make/dev/ui/harbor_ui

これを既存のコンテナで動作しているバイナリと入れ替えます

docker コンテナ上で動作させる

すでに Harbor のコンテナが動作している前提で説明します
まず生成したバイナリをコンテナにコピーします

  • docker cp ./make/dev/ui/harbor_ui harbor-ui:/harbor/harbor_ui
  • docker restart harbor-ui

そしてコンテナを再起動したらコンテナの localhost に API を叩いてコードの変更が反映されているか確認してみましょう

  • docker exec -it harbor-ui /bin/bash
  • curl localhost/api/search?q=library

で API をコールして修正したコードが反映されているか確認することができます
今回の場合であればロギングを追加してるのでロギング用のコンテナホストに出力されています
Harbor の各種コンテナは syslog ドライバを使っているため上記ログに出力されます

  • docker exec -it harbor-log tail -f /var/log/docker/2017-07-11/ui.log

最後に

harbor_ui というバイナリファイルだけビルドして動作確認する方法まで紹介しました
これで API の部分にバグがあれば自分で修正して p-r を送信することができます
やるかわからないですが、、、

2017年7月11日火曜日

VMware Harbor をビルドしてみた

概要

Harbor をビルドしてみました

環境

  • CentOS 7.3.1611
  • make 3.82
  • docker 17.03
  • docker-compose 1.9.0
  • go 1.8.0

docker でビルドする

  • git clone https://github.com/vmware/harbor
  • docker pull golang:1.7.3
  • cd harbor
  • make install GOBUILDIMAGE=golang:1.7.3 COMPILETAG=compile_golangimage CLARITYIMAGE=vmware/harbor-clarity-ui-builder:1.2.7

だいたい 10 分くらいで完了します
「Start complete. You can visit harbor now.」が表示されればコンパイル完了かつビルドサーバ上で harbor が起動しています
docker ps などで確認するとコンテナが動作しているのが確認できると思います

make ディレクトリ内に docker-compose.yml があるので、そこに移動すれば docker-compose コマンドも使えます

  • cd make
  • docker-compose down

ローカルの go 環境でビルドする

  • mkdir $GOPATH/src/github.com/vmware/
  • mv harbor $GOPATH/src/github.com/vmware/
  • cd $GOPATH/src/github.com/vmware/harbor
  • make install GOBUILDIMAGE=golang:1.7.3 COMPILETAG=compile_golangimage CLARITYIMAGE=vmware/harbor-clarity-ui-builder:1.2.7

でやってみたんですが、結局イメージを取得してビルドする流れになったので、たぶん make じゃなくて go build とかする必要があると思います

最後に

Harbor をビルドしてみました
仕組みとしては Makefile が提供されていて、その中で docker を使ってビルドしている感じです

ビルド方法は 2 つ提供されているようですが前者のビルド方法を使っておけば良さそうです

参考サイト

2017年7月8日土曜日

Ruby で Firebase のプッシュ通知を送信する方法

概要

前回 Firebase を使って単一のデバイスにプッシュ通知を送信してみました
そのときはコンソールを使いましたが今回は Ruby から送信してみたいと思います
所謂、自動送信などを実現することができます

環境

  • mac OS X 10.12.5
  • Xcode 8.3.3 (8E3004b)
  • Ruby 2.2.3p173

ライブラリインストール

  • bundle init
  • vim Gemfile
gem "fcm"
  • bundle install

サーバキーの取得

Firebase のコンソールから取得できます
ログイン後

プロジェクトの設定 -> クラウドメッセージング -> サーバキー

で取得できます

firebase_push_with_ruby1.png

コード

  • vim send_push.rb
# coding: utf-8
require 'fcm'

fcm = FCM.new("先ほど取得したサーバキーはここに入力します")

token = "eIWudgln0C4:APA91bHA9sX7WNO6cBVAzV_DLZ89Ap54SSg6uNPOtWn8VLGdJlxutyu458yUR4yrz7ILNcNCaK5sAWhIyqq8W16XXPLfnDrenjmf_OBpLm5dJGCeZXrZ8hn5eJM2d8AYw8uQG8Gkj5E0"
opts = {
  "notification" => {
    "body" => "新着記事があります!"
  }
}
ret = fcm.send_with_notification_key(token, opts)
p ret

実行

  • bundle exec ruby send_push.rb

で成功すると以下のようなレスポンスが得られます

{:body=>"{\"multicast_id\":8431807027711221811,\"success\":1,\"failure\":0,\"canonical_ids\":0,\"results\":[{\"message_id\":\"0:1499328992939718%350c1818350c1818\"}]}", :headers=>{"content-type"=>["application/json; charset=UTF-8"], "date"=>["Thu, 06 Jul 2017 08:16:33 GMT"], "expires"=>["Thu, 06 Jul 2017 08:16:33 GMT"], "cache-control"=>["private, max-age=0"], "x-content-type-options"=>["nosniff"], "x-frame-options"=>["SAMEORIGIN"], "x-xss-protection"=>["1; mode=block"], "server"=>["GSE"], "alt-svc"=>["quic=\":443\"; ma=2592000; v=\"39,38,37,36,35\""], "accept-ranges"=>["none"], "vary"=>["Accept-Encoding"], "connection"=>["close"]}, :status_code=>200, :response=>"success"}

200 で返ってくれば OK です

ちょっと説明

今回の場合 notification というキーを使っています
これを使うことで通知が届くのですが、他に data というキーもありこれはカスタム用のペイロードを設定するためのキーなので、プッシュ通知は送信できるのですが、実際に通知バーに通知が出ません
所謂サイレントプッシュなどに使うためのキーになります
各種キーの詳細は参考サイトにある Firebase の公式ページを参考にすると良いと思います

また、API でプッシュ通知を送信した場合、なんとコンソール画面のプッシュ通知の一覧に表示されません
理由はわかりませんが現状はそういう仕様らしいので、履歴として管理したいのであれば何かしら自分で仕組みを作成する必要がありそうです

そしてもう一つ問題なのがコンソールではターゲットセグメントでアプリに対してプッシュ通知を送信できるのですが、API だとそれができません
なので、強制的に /all みたいなトピックを Subscribe するような実装をアプリ側で行い、その /all に対してプッシュ通知を送信することでアプリを使っている全ユーザに配信することができるようになります

最後に

Ruby を使って Firebase のプッシュ通知を送信してみました
1 つの端末に送信する方法を紹介しましたが、同じようにトピックにも送信することができると思います
指定するキーを間違えないようにしないとうまくプッシュ通知を受信することができないことがあるのでキーの内容については確認することをおすすめします

アプリ全体に送信することができなかったり、コンソールに結果が表示されないなど少し不可解な仕様はありますが、とりあえず今回の方法でプログラムからプッシュ通知を送信することはできると思います

参考サイト

2017年7月7日金曜日

Firebase で単一のデバイスにだけプッシュ通知を送信する方法

概要

前回 Firebase のプッシュ通知をとりあえず試しました
Firebase のプッシュ通知には送信対象としてユーザセグメント (アプリ)、トピック、単一の端末 (FCM トークン) の 3 種類があります
今回はその中の単一の端末に送信する方法を紹介します

環境

  • mac OS X 10.12.5
  • Xcode 8.3.3 (8E3004b)
  • iPhone5 (通知テスト用の実機)

AppDelegate にトークンを取得する処理を追加

didFinishLaunchingWithOptions を以下のように編集します

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Firebase の初期化
    FIRApp.configure()
    // プッシュ通知の許可を表示する
    if #available(iOS 10.0, *) {
        let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
        UNUserNotificationCenter.current().requestAuthorization(
            options: authOptions,
            completionHandler: {_, _ in })
        // For iOS 10 display notification (sent via APNS)
        UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
        // For iOS 10 data message (sent via FCM)
        FIRMessaging.messaging().remoteMessageDelegate = self as? FIRMessagingDelegate
    } else {
        let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
        application.registerUserNotificationSettings(settings)
    }
    application.registerForRemoteNotifications()
    // オブザーバを設定し端末トークンの更新監視をします
    NotificationCenter.default.addObserver(
        self,
        selector: #selector(self.tokenRefreshNotification(_:)),
        name: NSNotification.Name.firInstanceIDTokenRefresh,
        object: nil)
    // すでにローカルにトークン情報がある場合はそれを表示する
    if let refreshedToken = FIRInstanceID.instanceID().token() {
        print("InstanceID token: \(refreshedToken)")
    }
    return true
}

ポイントは NotificationCenter.default.addObserver の部分でこれを登録することで端末トークンが更新されたときにトークンが表示されるようにします
もし、すでにトークンがローカルにある場合はそれを表示します

そして addObserver で追加している端末トークンが更新された際に呼ばれる関数「tokenRefreshNotification」を追加します

// トークンの更新があった場合にコールされます
func tokenRefreshNotification(_ notification: Notification) {
    if let refreshedToken = FIRInstanceID.instanceID().token() {
        print("Refresh InstanceID token: \(refreshedToken)")
    }
}

これで準備 OK です
当然ですが実機でなければトークンを取得できないので実機を接続してください

アプリを実機にインストールしてトークンを取得する

今回はコンソールログに出力しているだけなので、アプリを起動したらコンソールログを確認しましょう
今回であれば以下のように表示されれば OK です

Refresh InstanceID token: eIWudgln0C4:APA91bHA9sX7WNO6cBVAzV_DLZ89Ap54SSg6uNPOtWn8VLGdJlxutyu458yUR4yrz7ILNcNCaK5sAWhIyqq8W16XXPLfnDrenjmf_OBpLm5dJGCeZXrZ8hn5eJM2d8AYw8uQG8Gkj5E0

このトークンを使ってプッシュ通知を送信します

動作確認

今回は Firebase のコンソール画面からプッシュ通知を送信してみます
ログインして Notifications の画面に移動し新しいメッセージを作成します
そしてターゲットの部分で「単一の端末」を選択して先ほどのトークンを入力しましょう
firebase_single_push1.png

これで送信するとテストしていた実機にだけプッシュ通知が行くことを確認できると思います

通知が届かない場合は

まずアプリをインストールしたときのプッシュ通知の確認で許可するようにしましょう

あとはアプリがバックグランドにいる必要があります
フロントですでに動作している状態ではプッシュ通知は動作しません

今回は紹介しませんでしたが、p12 証明書を設定する必要もあるのでその辺りもしっかり Firebase に設定されているか確認してください
テスト用のプッシュ通知になるので development 用のプッシュ通知証明書から p12 ファイルを作成する必要もあります

最後に

Firebase で指定した 1 端末にだけプッシュ通知を送信する方法を紹介しました
Firebase の場合端末情報をデータベースに保存するのは自分でやる必要があるので、もし端末トークンを管理したい場合は登録する処理を書きましょう

おそらく登録しないのは登録しても誰のどの端末か全くわからないので、手元にある実機でコンソール出力して確実に端末がわかる状態で送信できれば問題ないのでそうしているんだと思います

今はなき Parse.com などは端末トークンをバックエンド側に保存する機能があったのでコンソール画面などでも確認できたのですが、Firebase の場合そういった機能はないのでコンソール画面でも端末トークンの一覧を確認することはデフォルトではできません

参考サイト

2017年7月6日木曜日

Ruby で文字列から変数を生成する方法

概要

前回文字列からクラスを生成する方法を紹介しましたが、今回は文字列から変数を生成してみます

環境

  • CentOS 7.3.1611
  • ruby 2.3.3p222

コード

こんな感じです

a = "hoge"
instance_variable_set("@#{a}", "fuga")
p @hoge

=> “fuga”

a = "hoge2"
eval("@#{a} = 'fuga2'")
p @hoge2

=> “fuga2”

個人的には instance_variable_set を使います
代入数するあたいを引数で渡せるのでいろいろ渡せます

2017年7月5日水曜日

Ruby で文字列からクラスのオブジェクトを生成する方法

概要

文字列でクラス名を作成してその文字列からクラスのオブジェクトを作成する方法を紹介します

環境

  • CentOS 7.3.1611
  • ruby 2.3.3p222

コード

こんな感じです
Module.const_get を使うと簡単に実現できます

class Hoge
  attr_accessor :name
  def initialize name
    @name = name
  end
end

klass_name = "Hoge"
klass = Module.const_get(klass_name)
hoge = klass.new 'jiro'
p hoge.name

# error
klass_name = "Fuga"
klass = Module.const_get(klass_name)

ちなみにクラスが存在しない場合は NameError になります
uninitialized constant Module::Fuga (NameError)

2017年7月4日火曜日

「Guideline 4.2.2 - Design - Minimum Functionality」に対抗してみました

概要

アプリの審査基準の一つに Minimum Functionality という基準があり、これはアプリが単純すぎる場合にリジェクトされる基準になります
例えば Web ビューだけのアプリでサイトに訪問するのと同じエクスペリエンスしか提供されていない場合などは対象となります
今回この基準でリジェクトされたアプリがあり、リジェクトされるごとに機能を少しづつ改善したところリジェクトされないところまで来たので、その対処方法を紹介します

環境

  • macOS X 10.12.5
  • Xcode 8.3.3 (8E3004b)

アプリの概要

アプリは単純な RSS リーダのようなアプリです
ある特定のサイトに特化した RSS リーダでアプリで見栄えを良くし簡単に見れるようにしたアプリです
基本的にな機能はフィード情報を取得して UITableView で表示するだけなので確かに Web ビューと変わらないと言えば変わりません

あえて言うなら売りはシンプルさですが、今回 Minimum Functionality に引っかかりました

対応方法

具体的に「これ」を実装すればリジェクトされないという基準もわからないのでとりあえず思いつくものを機能追加してみました
一応選定基準としては

  • UI に大きく影響しない機能
  • コードレベルで簡単に追加できる機能

あたりを基準に選定していきました

とりあえず普通に出してみる

リジェクトされたあとにコメントでアピールしてどうなるか確認してみました
アピールコメントの内容は「Web に訪問するよりシンプルで良い、見やすい」という点をアピールしました

が結果は当然アウトでリプライはガイドラインの URL がびっしりと書かれた感じでした

プッシュ通知の実装

Firebase を使ってプッシュ通知機能を入れてみました
UI に影響がなくプッシュ通知だけであれば、ロックインもほぼされないので導入しました

で、結果はこれもダメ
今回アピールはせずコメントに「じゃあアプリのスピードを改善するのじゃダメ?」という質問にしてみました
要するにどうやればリジェクトされないか具体的な方法を教えてくれるか期待したですが
結局リプライは前回と同様ガイドラインの URL が送られてくるだけでした

画像のキャッシュ機能を実装

ならばと実装してみようということで画像を取得する際にメモリにキャッシュする機能を実装してみました
具体的には Kingfisher というライブラリを追加することでキャッシュできるようにしました
(Kingfisher の紹介記事はこちら)

で、結果はこれもダメ
たぶんここまでの結果を見て自分の予想だと内部的なブラッシュアップや機能改善ではダメで UI 的に変化をもたらして UX を向上しないとダメなんだろうなと思いました (もちろんアプリによっては機能改善でも OK かもしれませんが)

ここではアピールやコメントは一切せず次の一手を考えてました

CoreData を使ってお気に入り機能を追加する

読み込んだフィードの情報をお気に入りできる機能を追加しました
お気に入りの情報は CoreData を使ってローカル端末にのみ保存します
クラウド等で保存はしないのでアプリが消えればお気に入りの情報もクリアされてしまいます
お気に入りは UITableViewCell をスワイプすることでできるようにしました
スターボタンを設置しても良かったのですが、既存 UI への影響を考えて極力変更が小さい方法を選択しました

で、結果的にこれがヒット、アプリの審査が通りました
ここまでの結果で見れば CoreData を使った機能を追加すれば回避できるような気がします
が、やはりアプリによってだとは思うので正直 CoreData の機能が決め打ちになるとは思えないかなと思います
が、試してみる価値はあるかなと思います

別の観点から

実は画像のキャッシュ機能を追加した時に、ちょうどよかったので別のアプリにも Kingfisher を追加しました
で、実はその別のアプリも Minimum Functionality で引っかかったのですが、そのアプリはアピールしたところすんなり審査を通過しました
アピールした点は画像のキャッシュを追加したという点ではなく「Web ビューじゃないよ、サイトじゃ同じ内容確認できないよ」という内容なので何とも言えませんが
アピールを頑張ってすれば、アプリによっては審査が通過するアプリもあるのかもしれません

アプリの審査基準は正直わからない

何度もアプリを審査に出してはいますが、明確な審査基準はさっぱりわかりません
ガイドラインはあるものの結局人がレビューしているので人によって審査基準に差がある気もしています

というのも今回審査が通ったときに別のアプリも審査中だったのですが、別のアプリもすべて同日に審査が通りました
ここから予想するに自分のレビュー待ちのアプリすべてをレビューしてくれるある 1 人の人が指定され、その人が結構ゆるい方でバンバン審査が通過したんじゃないかなとも予想しています

というかアプリの審査はアプリごとのキューじゃなくてユーザごとのキューになっているような気もしました
1 番最初にレビュー待ちになったアプリは一週間前で最後にレビュー待ちになったアプリは 2 日前だったので、それで同日に審査が通ったのを見るとそういうこともあるのかなと思った次第です

最後に

Minimum Functionality の対策を紹介しました
自分の場合、決め手は CoreData の機能でしたが、必ずしも CoreData を使った機能を追加することで通過するようになるとはならないと思います
それでも、そういうケースがあるということを紹介できて良かったかなと思います

もしかしたら全く同じ機能で Swift4 対応したアプリを審査に出したらまた Minimum Functionality でリジェクトされるかもしれませんが、、、w

2017年7月3日月曜日

Softbank から Mineo に MNP で移行しました

概要

Softbank の 2 年縛りがついに終了したので MVMO に乗り換えました
いろいろ悩んだ結果 au の回線がある Mineo にしました
乗り換えの手順や流れについて紹介します

環境

  • Softbank iPhone6
  • Mineo

用意するもの

必須

  • エントリーバッケージ
  • 身分証明書の電子コピー
  • MNP 予約番号
  • クレジットカード
  • メールアドレス (Gmail)

任意

  • Wifi 環境 (プロファイルのダウンロードに使用)

全体の流れとタイムライン

以下それぞれ詳細に手順等を記載していきます

  • 6.25 Amazon でエントリーバッケージ購入
  • 6.27 Amazon からエントリーバッケージ到着
  • 6.29 Softbank に問い合わせて MNP 予約番号を取得
  • 6.29 そのまま必要なものを準備して Mineo に登録
  • 7.1 Mineo から SIM が届く
  • 7.1 SIM を iPhone5 に設定してプロファイルおよび回線の切り替えを行う
  • 7.1 動作確認まで実施して問題ないことを確認

途中ゆっくりやりましたが、9 日間で完全に切り替えが完了しました

エントリーバッケージの購入

これはやっておいたほうが事務手数料を抑えられるのでお得です
Amazon などで売られています

契約時に 3,000 円の事務手数料がかかるのでですが、これがあるとその 3,000 円を無料にすることができます
エントリーバッケージ自体 900 円ほどなので実質 2,000 円ほど得をできます

自分は Amazon で購入し翌日には届きました

エントリーパッケージ開封

とりあえず開封しましょう
裏面に開封すると契約に同意とあるので軽く読んでおくといいと思います
まだ契約とかではないので安心してください


softbank_to_mineo1.JPG


softbank_to_mineo2.JPG

見開きで右下にエントリーコードが記載されています
Mineo 申し込み時にこのコードを利用することで事務手数料が無料にできます
softbank_to_mineo3.jpg

Softbank の「*5533」に電話して MNP 予約番号を取得する

MNP の予約番号を発行します
専用ダイヤルで「*5533」があるので 1 -> # -> 4 -> 暗証番号の順にキーパッドで入力していきます

でそのまま予約番号を教えてくれると思ったらオペレータにつながって結局そこで発行してくれます
しかも結構待たされる感じです、、、

オペレータからは費用関係 (違約金、事務手数料) の話があったあと Yモバイルやお得な値引きの話をされますが、最後に断れば大丈夫です

MNP の予約番号が発行されるとショートメールで届きます

一点ポイントとしては Softbank は月の途中で解約しても日割りはしてくれません
なので、20 日締めになるので 15 日とかに予約番号を発行して乗り換えしたほうが有効にはできるかもしれませんが、20 日を越えて切り替えできないと結局翌月の請求も発生するので、あまり攻めすぎないように注意してください

Mineo に申し込む

予約番号が取得できたら Mineo に申し込みします
http://mineo.jp/apply/ から申し込み手続きに進みましょう

まずはエントリーコードを入力します
パッケージに記載されていたコードを入力しましょう
softbank_to_mineo4.png

次に「プラン」「タイプ」「コース」「通話サービス」「端末購入の有無」を選択します
今回は au がよかったので「a プラン」で電話番号はそのまま引き継ぐのでタイプは「デュアルタイプ」コースは「3GB」にしました
通話サービスは月にそこまで掛けないので申し込みませんでした
端末は既存の au 端末で iPhone5 を持っているのでそれを使うため同時購入は無しにしました
softbank_to_mineo5.png
※スクリーンショットは途中省略

ちなみに iPhone5 で Mineo は非公式なのでご注意ください (参考)

3 つ目は SIM のサイズを選択します
今回は iPhone5 で使用する想定なので「nanoSIM」を選択します
softbank_to_mineo6.png

4 つ目に MNP の予約番号を入力します
SMS に送られた予約番号を入力しましょう
また、MNP をする電話番号と予約番号の期限も選択してください
softbank_to_mineo7.png

5 つ目にオプションサービスの選択と個人情報の入力です
オプションに関してはいろいろなオプションがつらつらと一覧で表示されるのでお好きなオプションをオンにしてください
自分は特に必要なかったので全部オフにしました

個人情報の入力ですが、ここで一点ポイントです
入力する個人情報は MNP をした名義と同じ名義で実施してください
詳しい理由はわかりませんが、Softbank 時の名義と Mineo で新しく MNP する名義は同一名義でないとうまく MNP ができないようです
あと細かいですが名前や住所の入力が数字も英語も全角しか受け付けないのでご注意ください
softbank_to_mineo8.png
※ここも長いのでスクリーンショットは途中省略です

同時にメールアドレスの登録と eoID の登録も行います
ユーザ名やパスワード、秘密のパスワードは後々使うことになるので忘れずにメモしておいてください

6 つ目は確認とクレジットカード情報の入力です
月額料金の内容を確認し用意しておいたクレジットカードの情報を入力してください
softbank_to_mineo9.png

7 つ目は身分証明書のアップロードです
免許証などスマホで撮影してそれをアップロードすれば OK です
もちろんスキャナでコピーしても OK です
softbank_to_mineo10.png

そして最後に利用規約と入力した内容、契約内容を確認して完了となります
申込みが完了すると登録したメールアドレスに仮登録の URL が届きます
URL にアクセスすると本登録が完了になります

あとは SIM が送られてくるのを待ちましょう (ちなみにまだこの段階では Softbank に契約しています)
進捗確認ページがあるので申し込み完了メールに記載の受付番号を使って配送状況などを確認することができます

SIM を挿す

Mineo から郵送で SIM が届いたら早速せっていしてみましょう
ちなみに以下のような感じで郵送されてきました
softbank_to_mineo11.jpg

開けるとご利用ガイドと SIM が入っています
softbank_to_mineo12.JPG

後日郵送でくるらしいですが契約内容は登録した eoID を使って以下から確認することができます
https://my.mineo.jp/

さっそく SIM を取り出して iPhone5 に取り付けます
iPhone の SIM を取り出すには横のアナに針を挿してスロットを出します
softbank_to_mineo14.JPG

MNP の切り替えを行う

次に電話番号の切り替えを行います
https://my.mineo.jp/ にログインしましょう

画面下の方にある「MNP転入切替/回線切替手続き」を選択します
softbank_to_mineo15.png

そして電話番号を先ほどスロットに挿した SIM のケースに記載のバーコードの裏面にある下 4 桁の番号を入力して切り替えを行います
softbank_to_mineo16.jpg

だいたい 30 分ほどで回線の切り替えは完了するみたいです
受付メールは来ますが切り替え完了メールは来ないみたいです

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

そしたら iPhone5 に Mineo 用のプロファイルをインストールします
Safari で以下の URL にアクセスします
http://mineo.jp/r/a/apn/

iPhone5s, 5c 用の URL もあるようですが今回は上記の iPhone6 用のプロファイルをインストールします

アクセスすると勝手にプロファイルのインストール画面に切り替わるのでインストールをタップしてインストールします
パスワードを聞かれるので入力します
softbank_to_mineo13.JPG

そしてプロファイルのインストールができたら一旦端末を再起動してください
再起動後、おそらくこの段階で Mineo でインターネットにアクセスできるようになっていると思います
ラグがあり端末が止まる場合は少し待ちましょう

Wifi をオフにして適当にアクセスできるか確認すると良いです
ちなみにプロファイルも先ほどインストールした Mineo のプロファイルが使われていると思います (一般 -> プロファイルで使用中のプロファイルが確認できます)

もし使えない場合は「111」にダイヤルすることで回線の切り替え状況を確認できるらしいので切り替えが完了しているか確認してみてください
また切り替えが完了していると Softbank 側の SIM で通信できなくなっているのでそっちも確認すると良いと思います

そしてこのプロファイルをインストールする設定ですが、何気にさらっと記載していますが iPhone5 がネットワークに接続している必要があります
自分の場合は Wifi 環境が別途自宅にあるのでそこに接続してプロファイルをダウンロードしましたが、別のネットワーク環境がない場合は正直ハマると思います

動作確認

切り替え後簡単な確認を行ってみました

  • 電話

問題なし

  • インターネット

問題なし

  • Wifi

問題なし

  • SMS

状況によって受信不可
これは少し検証が必要なのですが携帯などの番号からは受け取れたのですが、LINE や Facebook など SMS 認証を使う場合には受け取れませんでした
3G を使えば受け取れるという情報もあったのですが、自分はそれでも不可でした

  • テザリング

不可
そもそも設定項目がない

という感じでした
テザリングできないのはやや不便ですが、まぁ致し方ないという感じでしょうか
また、他のサイトでは SMS が受け取れないとあったのですが自分の場合は 4G 回線状態でも問題なく受け取れました
1 端末からのみテストしたので別端末からはできない可能性はありそうです

最後に

Softbank から Mineo に移行してみました
実際に試した手順なのでかなり正確な手順だと思います
全体通してテザリングと SMS が使えないだけでそれ以外は今のところ大丈夫そうです
この問題も端末レベルの問題なので別の端末に買い換えれば使えるようになると思います
ただ、公式の対応表を見ると iPhone 系列はすべてテザリング不可なので、テザリングも使いたい場合は Android 端末を使うしかなさそうです

契約に必要なものや情報は事前に Web で調べました
MNP 予約番号やクレカ、身分証明書の電子コピーなど意外と準備するものが多く正直この準備が一番大変だった印象です
MNP 時に同一名義じゃないとできないという点は自分の場合特に問題なかったのですが、家族契約などしている場合にはハマりやすいポイントかなと思います

SIM が届いてからの設定に関しては同封のご利用ガイド片手にやりましたが、ほとんどつまるポイントはありませんでした

今回端末を購入せず手元にある au シムロックの iPhone5 で試しましたが特に問題なくできました
端末は気が向いたら適当に購入してようかなと思います

あとは解約時の請求周りの情報も確定したら追記しようかなと思います

Tips

途中記載しましたが Softbank には月額料金の日割りはありません
なので、締め日の 20 日により近い状態で MNP の切り替えを行ったほうが良いのですが、あまり遅くなると 20 日をまたいで翌月になるのでその点は余裕を持って手続きを進めるようにしてください

最近 Softbank にはプラミアムフライデーという制度があり何かが無料でもらえるクーポン的なのがあります
一応このメールが届いて使い切ってから解約したほうが少しだけお得感はありますがまぁそこまでこのタイミングに合わせて解約する必要はないかなと思います

SIM を設定後、うまく通信できない場合は「設定」->「モバイルデータ通信」が ON になっているか確認してみてください

Mineo の連携サービスでマイネ王というサービスがあります
これは登録しておいたほうが良いかと思います
フリータンクという機能があり、もし通信量が月の上限に達した場合、無料で 1GB まで容量をもらうことができます
eoID とは違う ID が別途必要になり、登録後 eoID と連携することでフリータンクを使うことができるようになります

2017年7月2日日曜日

Cocoapods で「ERROR: Parsing unable to continue due to parsing error」

概要

pod install などするときにタイトルのエラーが発生してインストールなどができなくなりました
エラーの詳細は以下の通りです

[!] ERROR: Parsing unable to continue due to parsing error:
contained in the file located at /Users/kakakikikeke/.cocoapods/repos/master/CocoaPods-version.yml
---
min: 1.0.0
last: 1.3.0.beta.2
prefix_lengths:
- 1
- 1
- 1

対応方法を紹介します

環境

  • mac OS X 10.12.5
  • Cocoapod 1.2.1
  • Xcode 8.3.3 (8E3004b)

対応方法

  • gem uninstall psych

で自分は解決しました
正直理由は不明です