AWS CloudFormation 学習メモ

CloudFormationを使うようになったので、学習メモを記録。

f:id:sato_susumu:20180203002145j:plain:w500

CloudFormationって何?

AWS Black Belt Online Seminar 2016 AWS CloudFormation

とりあえず、どんな機能か知りたいときはBlack Belt Online Seminar。
概要もわかりやすく、まず知りたかった情報も大体載ってた。

クラスメソッド: CloudFormation入門

Black Belt Online Seminarの気になったページ

https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-2016-aws-cloudformation

P.12 Elastic BeanstalkやOpsWorksとの位置付けの違いがわかりやすく書かれている。
P.13 OpsWorksやCodeDeployの対象レイヤーの違いがわかりやすく書かれている。
P.66 AWS CloudFormation Designer。テンプレート内のリソース可視化。ドラッグアンドドロップで編集も可能
P.66 AWS CloudFormationにおける運用
P.81 変更セット(Change set)。変更を要求した箇所と影響を事前確認できる。

注意点

CloudFormationで作成したAWSリソースは、CloudFormation以外の方法で変更してはいけない。
CloudFormationで作成や変更に失敗したときには自動でロールバックしてくれるので、そのことも考慮する必要がある。CloudFormation以外の方法で変更してしまうと正常にロールバックできない。

用語

言葉 内容
テンプレート スタックを作成するときの入力となるテキスト(JSONまたはYAML1.1)
スタック テンプレートからプロビジョニングされたリソースの集合。スタックを簡単に作成/破棄できるのが、CloudFormationの特徴の一つ
変更セット 変更セットは、スタックに加えられる変更を要約した JSON形式のドキュメント。CloudFormationが作ってくれる

AnsibleでAWSリソースを作った場合との比較

AnsibleでもAWSリソースを作ったり、変更したりできるけど、それと比べても色々便利。

  • 作成時にGUI上でパラメータを設定できる。
  • 指定したパラメータを後から確認できる。
  • 作成したリソースが一覧表示できる。変更時にリソースへの影響を事前に表示してくれる。
  • 作成や変更のイベントが記録されている
  • 作成したときのテンプレートが残っている
  • 作成や変更に失敗したときにロールバックしてくれる

テンプレート

テンプレートのフォーマット

サポートしている書式は、JSON、YAML1.1。

YAML1.1なら、JSONではできなかったコメントの記載ができる。
JSONからYAMLの変換はこちらでできる。

テンプレートの構成

名前 内容
AWSTemplateFormatVersion テンプレートのバージョン
Parameters 実行時にユーザー入力を求めるパラメータを定義
Resources EC2などスタックを構成するリソースを定義
Mappings キーと値のマッピング。例:入力した内容やリージョンに応じて値を変える
Conditions 条件名と成立条件を列挙
Outputs スタック構築後に取得・表示した情報の定義。GUIでも確認できて便利らしい

CloudFormer(既存AWSリソースからのテンプレート作成)

自分でゼロからテンプレートを作るのはキツイので、CloudFormerという既存AWSリソースからテンプレート作成できるツールを使う。

クラスメソッド:CloudFormerの説明

CloudFormerを作成する手順:
スタック作成 > テンプレート > CloudFormerを選択。
CloudFormerが入ったWebサーバーのEC2インスタンスが立ち上がるので、 https でアクセス。

CLIで情報を取得して、テンプレート作成の参考にする

CLIで取得した情報をそのままCloudFormationでそのまま使えるわけではないけど、参考になることは多いような気がする。

EC2インスタンスの情報取得
公式リファレンス
AWS CLIを使ってEC2インスタンスの情報を取得する

aws ec2 describe-instances  



RDSインスタンスの情報取得
公式リファレンス

aws rds describe-db-instances  



Beanstalkの情報取得
公式リファレンス

aws elasticbeanstalk describe-application-versions  
aws elasticbeanstalk describe-applications  
aws elasticbeanstalk describe-configuration-options  
aws elasticbeanstalk describe-configuration-settings  
aws elasticbeanstalk describe-environment-resources  
aws elasticbeanstalk describe-environments  
aws elasticbeanstalk describe-events  

サンプルテンプレート、スニペット

サンプルコード & テンプレート

サンプルテンプレート(日本語)

テンプレートスニペット(日本語)

パラメータの記載方法

公式:パラメータの記載方法

"AWS::EC2::KeyPair::KeyName"など、AWS固有のパラメーター型の一覧はこちら

パラメータのDescriptionには日本語を使えない。残念。

リソースの記載方法

公式:EC2のリソース記載方法(AWS::EC2::Instance)。
ページ左側に各詳細項目へのリンクがある。

値の記載方法:

やりたいこと
文字列を直接記載する "abc"
パラメータの入力結果を参照する { "Ref": "パラメータ名(例:)" }
作成したEC2インスタンスIDを参照する { "Ref": "リソース名(例:EC2Instance)" }
Base64エンコード { "Fn::Base64": "abc" }
結合 { "Fn::JOIN": [ "", ["IPAddress=", {"Ref":"IPAddress"} ]] }

組み込み関数リファレンス
YAMLの場合、「Fn::」を「!」に省略可能。例:Fn::Join → !Join

立ち上げたEC2リソースの初期化方法

EC2にはUserDataに一定の書式で記載することで、インスタンス起動時にスクリプトを実行する機能がある。
スクリプトの実行で「CloudFormationヘルパースクリプト」を呼び出すことで、複雑なインストールなどもできる。

公式:AWS CloudFormation による Amazon EC2 へのアプリケーションのデプロイ
UserDataの設定方法やヘルパースクリプトの呼び出し方のサンプル。

ファイルの書き換えを行う場合はUserDataでsedを呼び出す。
sedの書式はsedでこういう時はどう書く? を参考にした。

1番目に出現した'Linux'を'リナックス'に

sed -e 's/Linux/リナックス/' source.txt

sedは-iオプションを指定することで、ファイルに上書き保存することができる。

sedで/を扱いたい場合は、区切り文字に|を使う。

$ echo "/123/" | sed 's|/|abc|g'
abc123abc

CloudFormationヘルパースクリプト

ヘルパースクリプトにはcfn-init、cfn-signal、cfn-get-metadata、cfn-hupがある。
Amazon Linux AMIを使っている場合、デフォルトで、AWS CloudFormationヘルパースクリプトが /opt/aws/bin にインストール済み。

ヘルパースクリプト公式リファレンス

クラスメソッド:cfn-initによるインスタンスの初期化

cfn-init用メタデータの記載方法(AWS::CloudFormation::Init)

テンプレートのバージョン管理をしたい

テンプレートを置いているS3バケットのバージョニングを有効にする。

テンプレートの書式を事前チェックする

S3上のテンプレートをチェック

aws cloudformation validate-template --template-url https://s3.amazonaws.com/cloudformation-templates-us-east-1/S3_Bucket.template  

ローカルのテンプレートをチェック(Macの場合)

aws cloudformation validate-template --template-body file:///Users/user-name/test/sampletemplate.json  

ローカルのテンプレートをチェック(Windowsの場合)

aws cloudformation validate-template --template-body file://C:/Users/user-name/test/sampletemplate.json

スタックの作成

テンプレートの選択

Amazon S3 テンプレート URL の指定」を選ぶ場合、httpで始まるリンクを指定する。リンクはS3上で該当ファイルの詳細を確認すると表示される。
スタック名には英数字 (大文字と小文字が区別されます) とハイフンのみを使用可能。

似たようなスタックを大量に作りたい(クイック作成)

スタック作成時、「作成」ボタンを押す手前に表示される「クイック作成」のリンクを控えておく。クイック作成の詳細な説明は公式ページ参照。

スタックの更新

直接更新(Update)、変更セット(Change set)を作って変更内容を確認してから適用の2つの方式がある。変更セットは、スタック一覧画面の変更セットタブに表示される。

TIPS、トラブル対応

Auroraを使ったRDS環境をCloudFormerで構築する方法

公式ページのAWS::RDS::DBClusterリファレンスだけではよくわからなかった。
CloudFormerの出力もイマイチ。現時点ではDBClusterには対応していない。
こちらのページが参考になったので、手直しして無事作成。

CloudFormerでElastic BeanstalkのDNSをRoute53に設定する

HostedZoneIdがないのでエラーが表示されるけど、Fn::GetAttでは取得できないので途方にくれた。
こちらのページを参考に、DNSNameとHostedZoneIdを設定。

AWS::Route53::RecordSetGroupのスタック作成時、一言 Invalid requestと怒られる

  • TTLの指定が必要なケースで、TTLの指定がない
  • Nameの最後にピリオドがない(未検証)

スタック更新時に「CloudFormation cannot update a stack when a custom-named resource requires replacing. Rename 'MYResourceXXX' and update the stack again.」と怒られる

メッセージだとわかりにくいけど、リネームの対象はテンプレート(JSONもしくはYAMLの文書) に書かれている該当リソース名。
公式ページの推奨方法も該当するリソース名の変更

テンプレートの該当リソース名を変更すれば、更新できる。
もう一度、該当リソース名を元の名前に変更して再更新すれば、同じリソース名も使える。

「テンプレートの検証エラー: Template format error: [/Resources/xxxx/xxxx/xxxx] map keys must be strings; received a collection instead」と怒られる

よくあるミス:

  • 最後のカンマを忘れている
  • []で囲むのを忘れている

リンク

公式:よくある質問

公式:ベストプラクティス

iPhoneの端末間データ移行とデータ消去に関するメモ

iPhoneを買い替えて、旧端末から新端末にデータ移行したのでメモ。
iOS11からは更にデータ移行が簡単になっていた。

f:id:sato_susumu:20180108121416j:plain

iPhone端末からiPhone端末へのデータ移行

データ移行の大まかな流れ

旧端末と新端末のどちらもiOS11以降なら、簡単に基本的な設定を移行させる方法「クイックスタート」がある。

  • iTunesiCloudで旧端末のバックアップをとっておく
  • 新端末をセットアップするときに、クイックスタートを使うかどうか聞かれるので使う
  • 旧端末で取得したバックアップを使って、新端末で復元する
  • アプリによっては復元だけではデータ移行できないので、手動でデータ移行する

クイックスタート

新端末をセットアップするときに、クイックスタートを使うかどうか聞かれる。
旧端末を近づけて指示に従うだけで、いくつかの基本的な設定を引き継いでくれる。

詳しい手順は公式ページ参照
以前の iOS デバイスから新しい iPhone、iPad、iPod touch にコンテンツを転送する - Apple サポート

クイックスタートで引き継がれるデータは、ほんの一部っぽい。
調べた限りでの引き継がれるデータ:

Apple IDを使用してiCloud、キーチェーン、iTunesApp Store、iMessage、FaceTimeにサインインが可能
・言語、地域、ネットワーク、キーボード、利用頻度の高い場所、Siriへの話しかけ方、ホームおよびヘルスケアデータを含む、デバイス設定を復元可能

iOS 11 のアップデートについて - Apple サポート

上記のネットワークにはWiFi設定も含まれてる。

バックアップから復元

詳しい手順は公式ページ参照
以前の iOS デバイスから新しい iPhone、iPad、iPod touch にコンテンツを転送する - Apple サポート

この時点で、OS設定や内蔵アプリのデータ移行は完了。

個別アプリのデータ移行

バックアップからの復元を行っても、アプリのデータがどこまで復元されているかはアプリによって異なる。

  • 全部復元できるアプリは何もせずにデータ移行が完了。らくちん
  • 基本的にはクラウドと連携しているアプリは、IDとパスワードの入力すれば完了
  • 一部のアプリは手動でデータ移行を行う必要がある。

どこまで復元されているかはアプリによって異なるので、使用するアプリは一通り動かしてみるほうが安全

LINE

公式ブログに引き継ぎ方法が書かれているので、その方法に従う
【機種変更をお考えの方へ】LINE関連アプリの引き継ぎ方法をまとめました! : LINE公式ブログ

Google Authenticator

端末間でアプリのデータを移行する方法はない。
元端末で登録時に使ったQRコードを厳重に保管しているので、新しい端末でもそのQRコードを再読込。
(登録時に使ったQRコードがない場合は、サービス毎に移行方法が異なるのでやっかい。特に旧端末が壊れたり紛失するとサービスにログインする手段も無くなったりする)

ゲーム

ゲームもアプリによって移行方法は様々みたい。移行するようなゲームはインストールしてないので未確認。

下記サイトに色んなゲームのデータ移行方法があった。
パズドラ、グラブルなど、人気ゲームアプリのデータ引き継ぎ方法まとめ - iPhone Mania

APN構成プロファイルの設定(格安SIMのみ)

格安SIMを使っている場合は、これをしないとモバイルデータ通信が使えない。

格安SIMサービス「IIJmio」の場合の設定方法:
初期設定(APN設定)をしよう|格安SIM/格安スマホのIIJmio

データ消去

近々、旧端末はデータ消去する予定。
データ消去するにも手順や注意点があるので、Appleの公式ページの説明をメモ
iPhone、iPad、iPod touch を売却または譲渡する前に - Apple サポート

参考:Android端末からiPhone端末へのデータ移行

Appleの公式ページに説明があったのでメモ
Android から iPhone、iPad、iPod touch に移行する - Apple サポート

IPアドレスのCIDR記法 学習メモ

IPアドレスの後ろに「/数値」が付いていることがあるけど、どういう意味かわかってなかったので調べてみた。

IPアドレスの基礎

IPv4IPアドレスは32bitで構成されている。
そのIPアドレスは、ネットワーク上ではネットワークアドレスとホストアドレスに分けて認識される。

ネットワークアドレス(別名:ネットワーク部、プレフィックス)
ホストアドレス(別名:ホスト部)

32bitのIPアドレスのうち、どこまでがネットワークアドレスで、どこからがホストアドレスかを決める方法は2種類ある。クラスを使ったクラスフルと、クラスを使わないクラスレス。

その他のIPアドレスの基礎的な内容は、下記のページがわかりやすかった。
IPアドレスの基礎知識 - Qiita

クラスフル(classfull)

クラスフルではネットワークアドレスに8ビット(クラスA)、16ビット(クラスB)、24ビット(クラスC)のいずれかを割り当てていた。
先頭のビット列でクラスA~クラスEまで区別できる。
クラスDはIPマルチキャスト用途。
クラスEは研究用途。

最小ブロック(クラスC)では、256個のアドレスしかなく、多くの企業では少なすぎた。
かと言って、それよりも大きいブロックは、クラスA、クラスBしかなく大雑把過ぎた。

クラスが区別できれば、サブネットマスクも決まる。

クラスレス(classless)

CIDR(Classless Inter-Domain Routing)

サイダーと読む。
CIDRは、クラスを使わないIPアドレスの割り当てと、経路情報の集成を行う技術。
CIDRは「可変長サブネットマスク (VLSM)」に基づき、ネットワークアドレスを可変長で割り当て可能にした。

CIDR記法は、IPアドレスの後ろに「/数値」が付く記載方法。例:a.b.0.0/16

CIDR記法の例

IP/CIDR ネットワークアドレス長 ホストアドレス長 サブネットマスク 扱えるホスト数(*1) 備考
a.b.c.0/24 24bit 8bit 255.255.255.000 256 クラスCと同等
a.b.c.0/22 22bit 10bit 255.255.252.000 1,024
a.b.c.0/21 21bit 11bit 255.255.248.000 2,048
a.b.0.0/16 16bit 16bit 255.255.000.000 65,536 クラスBと同等
a.0.0.0/8 8bit 16bit 255.000.000.000 16,777,216 クラスAと同等

*1 扱えるホスト数は、ブロードキャスト用、ネットワーク識別用、ゲートウェイを含めるかどうかによって解釈が異なる。

利用可能なアドレス数から2を引く必要がある。最大のアドレスと最小のアドレスは、ブロードキャスト用とネットワークの識別用に割り当てられる。詳細は RFC 1812 を参照。また、一般にゲートウェイIPアドレスを1つ必要とするので、1つのサブネットに配置できる(ゲートウェイ以外の)ホスト数は全アドレス数から3を引く必要がある。

参考

Classless Inter-Domain Routing - Wikipedia

NTP、Amazon Linuxの時刻設定、サーバー時刻監視 学習メモ

f:id:sato_susumu:20171226225810j:plain

NTPとは

NTP(Network Time Protocol)、エヌティーピー。
時計を正しい時刻へ同期するための通信プロトコル
UDPポート123を使用
NTPプロトコル上では協定世界時(UTC)を使って時刻を送受信する。

ntpd

ntpdは代表的なNTPの実装。
1000秒以上のズレを検知した場合は単純なクロック誤差ではないと判断し、同期しない。

ntpq

ntpdがシステムクロックを同期する様子を見るためのコマンド

ntpq -pの見方

http://ips.nekotype.com/1494/

remoteの左に同期しているサーバーに*がつきます。
また、複数設定している場合には、同期可能なサーバーに+がつきます。

refid:参照しているサーバーの、更に上位のNTPサーバです。
st:stratum番号、サーバーが第何階層か示す
when:前回サーバーを参照してから経過した秒数です。pollに達すれば再度参照します。
poll:参照する間隔(秒数)です。
reach:過去8回の参照結果です。同期したした場合1、同期しなかった場合0です。
   8進数で表示されており、
   毎回同期されると377(8進数)となります。つまり11111111(2進数)です。
delay:ポーリングインターバルの遅延見積もり(単位:ミリ秒)
offset:NTPサーバとのずれ(ミリ秒)
jitter:NTPサーバがどのくらい正確なのかを示す指標です。値が小さいほど正確。

ntpdログの長期保存と監視方法

PCIDSS で必要になる ntpd のログの取得と監視体制の構築 | Developers.IO

Amazon Linuxの時刻

デフォルトの状態

https://dev.classmethod.jp/cloud/aws/clock-on-amazon-linux-and-ntp/

Amazon Linuxはntpdがインストール済みで動作している。ログは出力していない。
設定ファイルを読めば、同期しているNTPサーバも確認できる。

$cat /etc/ntp.conf  
  
省略  
server 0.amazon.pool.ntp.org iburst  
server 1.amazon.pool.ntp.org iburst  
server 2.amazon.pool.ntp.org iburst  
server 3.amazon.pool.ntp.org iburst  
省略  

注意事項:

  • pool.ntp.orgはNTP POOL PROJECTが提供するタイムサーバーの仮想クラスタ
  • pool.ntp.orgはAWSが管理するタイムサーバではない。
  • poolに参加するサーバにはあまり厳密な規格が無い。
  • 場合によっては精度の低いNTPサーバが割り当てられてしまうこともある。

Amazon Time Sync Service

  • AWSが提供するNTPで配信される時刻同期サービス
  • 各リージョンで冗長化している衛星接続の原子時計を使って高精度な時刻参照を提供
  • 追加料金不要

公式ブログでの概要

ntpdやchronydでの設定方法
AWS公式の時刻設定方法(chronyでの設定例)

chronyd

ntpdとchronydの違い

サーバ時刻の取得例(zabbix 3.0)

各ホストの時刻のキーは「system.localtime」。
テンプレート「Template OS Linux」の取得アイテムにも「system.localtime」は含まれている。

テンプレート「Template OS Linux」を適用している場合、「監視データ > 最新データ > 名前に"local time" を設定し、フィルター」で、各ホストの時刻を確認できる

各ホスト毎に取得時刻が異なるため、当然"最新の値"は異なる。

サーバ時刻のズレを監視する例(zabbix)

Zabbix3.0での設定例:
https://qiita.com/miyahang55/items/9d1f99e9549143cdc8de

テンプレートを使ってntpqの情報を取得する:
https://qiita.com/qryuu/items/518a7167b728f2662ddd

サイボウズのスケジュールをGoogleカレンダーに同期してみた

今まで仕事関連のスケジュールは"サイボウズ"、個人のTODO兼スケジュールは"Remember the milk"と使い分けてた。それぞれ別アプリで管理するのは悪くないけど、時々統合したスケジュールが見たくなる。そんなわけで、まずはサイボウズのスケジュールをGoogleカレンダーに同期してみた。
f:id:sato_susumu:20171221210227j:plain

サイボウズのスケジュールをGoogleカレンダーへの同期する方法

サイボウズ公式Q&Aで、サイボウズGoogleカレンダーの自動同期はサポートしてないとのこと。

仕方ないので、ガルーン同期というAndoridアプリを使って同期。同期はサイボウズからGoogleカレンダーへの一方向同期。

ガルーン同期とは

サイボウズ ガルーン、サイボウズ Office、サイボウズ クラウドからGoogleカレンダーへの一方通行の同期を行うAndroidアプリ。PC上で動かす場合は、Andoridエミュレータを使用すると動かすことができる。

同期できる内容:

≪同期可能項目≫
・開始日時
・終了日時
・予定(タイトル: プルダウン部分)
・予定詳細(タイトル: 自由記述)
・メモ
※ 期間予定として登録したスケジュールは同期対象外です。

同期を設定するまでの流れ

社内サイボウズのスケジュールとGoogleカレンダーを無料で同期する方法 | いまと違うところへの説明が詳しい。
Andoridエミュレータの種類は、別にGenymotionである必要はない。アプリを使う時にURLやユーザーIDの設定で少し迷う部分もあるけど、GooglePlay上での公式説明に設定方法が書いてある。

同期の流れ

クラウド(google) ⇔ Android上のGoogleカレンダー ⇔ ガルーン同期アプリ ⇔ サイボウズ

Googleカレンダー同期とガルーン同期、両方がうまくいってないと正しく反映されない。

発生したトラブル

同期できてない

うまく同期ができてない場合は、以下のポイントをチェック。

  • Android端末上のGoogleカレンダーアプリで、該当するカレンダーは同期対象になっているか
    カレンダーアプリ > 左上メニュー > 設定 > 該当カレンダーを選択 > 同期 がONになっているか確認。
  • Android端末上のGoogleカレンダー同期はうまくいっているか
    Settingsアプリ > アカウント > Goolgle > カレンダーで同期日時を確認。
    同期が古い場合には、右上のメニューから「今すぐ同期」を選択。
  • ガルーン同期の同期はうまくいっているか
    アプリ画面上の同期日時を確認。
    画面は自動更新されないため、同期ボタンを押すなど注意が必要。
スケジュールの日付がズレている

1回だけ発生。原因不明。ガルーン同期アプリ > 設定 > タイムゾーン で、自動設定を選択し、新たに作ったカレンダーと同期したら解消されてた。

古いスケジュール内容が残ってる

条件がわからないけど発生した。試しにサイボウズの予定を削除したり、日付変更してみたが再現せず。こちらも原因不明。

ユーザーの動きを可視化するアクセス解析ツール Ptengine

適当にネットの海を泳いでいたら、「Webアクセス解析用ヒートマップ」が表示できるツールを発見!

昔、専用メガネ型デバイスを装着することで、Webページのどこが注目されているか可視化できる面白そうなシステムがあったけど、お手軽とは言えなかった。

このツールはすごくお手軽。

そして、このツールには「通常の無料プラン」以外に、「はてなブログ専用無料プラン」がある。

「通常の無料プラン」は解析対象ページが1ページなので、お試し目的以外には使い物にならない。

はてなブログ専用無料プラン」は制限は一応あるけど、全然気にならない程度。

十分使えて無料なんて、太っ腹。

Webに限らず可視化とか、ヒートマップとか、大好きなので、早速導入。

ヒートマップ例

クリック・ヒートマップ

クリックやタップした位置がわかる
f:id:sato_susumu:20171128230933p:plain


アテンション・ヒートマップ

ページのどの辺りがよく読まれるかわかる
f:id:sato_susumu:20171128231003p:plain


はてなブログに導入するときの注意点

導入する時に分かりづらかった点は解析コードのコピー先ぐらい。

ptengineに表示される説明は、はてなブログに限らず汎用的に書かれているので、 はてなブログの場合には、どこにコピーするべきかわかりにくい。

どこにコピーをするべきか。

正解は「はてなブログ公式のptengineのページ」に書いてあった。

さすが、はてなブログ

説明によると、コピー先は「はてなブログ」のアカウントがPRO版か無料版かによって違うので、注意が必要。

ビートマップ解析の難点

記事の最後の方まで読んでくれたユーザーが50%の場合、多いと見るか少ないと見るか。

離脱した場合、思った記事と違ったから離脱したのか、それとも解決したから離脱したのか。

ヒートマップをどう解釈するかが結構難しそう。

ヒートマップ以外のアクセス解析機能

ブログにアクセスがあると結果に即反映されて、画面も見やすい。

ヒートマップ以外にも普通のアクセス解析ツールとしても十分いい感じ。

iOSアプリ開発時に使ったリンクとメモ

久しぶりにiOSアプリ作ったけど、ホント知っとかなきゃいけないことが多すぎる。
Objective-Cで作ったので、そっち中心。

f:id:sato_susumu:20171123145916j:plain

アプリ開発全般

今から新規でiOSアプリを書き始めるなら。2016年冬 - Qiita
SwiftかObjective-Cか、ライブラリをどの程度使うか、最初の選択の参考になった。

これから iPhone アプリ開発に携わるのであれば覚えておきたい最低限のこと | Developers.IO
広く浅くキーワードを紹介してくれている。キーワードがあればググれる。

アプリケーションの状態とマルチタスキング · GitHub
コールバックが呼ばれる順番

iOSアプリ個人開発で使ってるツールとかノウハウを公開してみる - Qiita
アプリ開発に関連するツール、ライブラリ、書籍、サイトを見やすく紹介してくれている。

iOSアプリの構造

iOS アプリの構造がどのようになっているか紐解いてみる - A Day In The Life

アプリのバージョンについて

iOSアプリバージョンについて - Qiita
1アプリにつき3種類もバージョン情報があるので、その説明。ShortVersionとか考えたの誰だよ。

iOSアプリのバージョンを取得する - Qiita
プログラムでのバージョン情報の取得方法

バージョン番号の文字列を比較する方法 - 強火で進め
Objective-Cでのスマートなバージョン番号の比較方法。昔、自分で実装してたときは泥臭い方法だった。

各端末の解像度、画面サイズ

iPhone/iPad/Apple Watch解像度(画面サイズ)早見表 - Qiita
表になってて、わかりやすい。

The Ultimate Guide To iPhone Resolutions
iPhoneについては、図解されてて直感的にわかりやすい。

iPhoneとiPadの画面サイズと画素数、解像度、そしてアスペクト比のまとめ【更新中】 | wtpmj.com
PPIアスペクト比が必要な場合はこちら

ディープリンク、アプリ間連携

別名:Custom URL Scheme、カスタムURLスキーマ

[iOS] ディープリンク(Custom URL Scheme)でアプリを起動する | Developers.IO
ディープリンクの動作テスト方法に困っていたけど、ここに書いてある簡単なSafariを使うテスト方法で解決。

Custom URL Schemeの処理をシンプルに書く - Qiita
ディープリンクで連携した後のObjective-Cでの処理例。

「func application」は呼ばれるタイミングは遅めなので注意。
また、ホーム画面でアイコンをタップした場合は呼ばれないので注意。

UI

全般

iPhoneアプリ開発の虎の巻
UIKit UI部品全般。有名サイト。

画面間でのデータの受け渡しに付いて: 永遠ログ
色んな方法を紹介してくれている

今度こそ克服するAutoLayoutの使い方・基礎編~SwiftからはじめるiOSアプリ開発:その5【初心者向けアプリ開発3分tips】 - エンジニアtype | 転職@type
AutoLayout の丁寧な説明

個別

UIImageViewのScaleToFill、AspectFitなどの表示モード一覧

UIActivityIndicatorView - iPhoneアプリ開発の虎の巻
インジケーター。通称ぐるぐる表示
表示が小さく、初期の色は白いので注意。Hides When Stoppedを設定すると楽。

ローディング時のズルい進捗表示 - Qiita
ファイクの進捗表示サンプル

ios - Set UIButton Layer Border Width and Color in Interface Builder - Stack Overflow
角丸ボタン

Objective-C

基本

Objective-Cプログラミングの概念(公式)

Objective-Cによるプログラミング(公式)

公式なので詳しいけど、読んでない。検索して使う程度。

BOOL(YES/NO), bool(true/false), Boolean(true/false)

Objective-Cでの真偽値型 - ちくわプログラマにっき
3種類の真偽値がごっちゃになるので、この説明は助かる。

メモ

  • Switch内のcaseの処理は、1文以上はエラーになる。
    復数文処理したい場合は{}カッコで囲む必要がある。

マルチスレッド

全般

スレッドプログラミングガイド(公式)
並列プログラミングガイド(公式)

公式なので詳しいけど、読んでない。検索して使う程度。

NSOperationQueue

iOSで最も簡単にマルチスレッド処理を行う方法(NSOperationQueue)

GCDよりもNSOperation/NSOperationQueueの方がより高度な処理を行えるらしい。

GCD(Grand Central Dispatch)

dispatch_syncは、ブロッキング関数。
dispatch_asyncは、ノンブロッキング関数。

同期処理したいけど、メインスレッドから呼ばれるかもしれない処理の実装例:

if ([NSThread isMainThread]) {  
    // 処理  
} else {  
    dispatch_sync (  
        dispatch_get_main_queue(),  
        ^{  
            // 処理  
        }  
    );  
}  

出典:Main thread で実行 - Qiita

非同期でよければ、dispatch_async(dispatch_get_main_queue(), 処理) でいい。

【iPhoneアプリ】これを使えるようにならないと「マルチスレッド」について 概要編 - ゆるい感じのプログラムを書きたい。
GCDの説明。説明がとてもわかりやすい。

【iPhoneアプリ】これを使えるようにならないと「マルチスレッド」について 実装編 - ゆるい感じのプログラムを書きたい。
直列キューと並列キューそれぞれについて、dispatch_syncとdispach_asyncを呼んだ時にどう処理されるか、丁寧に図で解説してくれている。

あとで楽するエンジニアリング: gcdタスクを途中で中断する
キャンセル処理の実装例。

実行したい処理によってはキャンセルも考慮する必要がある。
dispatch_sync、dispatch_asyncそのものにはキャンセルする仕組みがないので注意。

LLDB

Xcode5でLLDBデバッガコマンドを使ってみる - Object for cutie
Xcode5でLLDBデバッガコマンドを使ってみる

LLDB to GDB Command Map
公式:GDBとLLDBのコマンド対応表

LLDB Tutorial
公式:チュートリアル

LLDB Data Formatters
公式:変数のフォーマット

ドキュメント

日本語版ドキュメント(公式)
一覧が見づらいけど、キレイに分類した一覧は公式では見つからなかった。
リンク切れがあるけど、見やすい非公式一覧はこちら。リンク切れはググればいい。

英語版ドキュメント

iOSヒューマンインターフェイスガイドライン

iOSアプリケーション プログラミングガイド

文字列操作プログラミングガイド
Objective-Cでの解説。

状態管理表、有限オートマトン

コンパクトで使いやすい状態管理がほしかったけど、見つからなかった。あんまり時間をかけるわけにもいかないので、結局自作。

有限オートマトン - Wikipedia

Swiftで有限オートマトン(ステートマシン)を作る - Qiita
Swiftの例

http://tercel-sakuragaoka.blogspot.jp/2011/03/objective-c_27.html
Objective-Cの例

ネットワーク

ATS

Xcode7でATSを即座に無効にする方法(これが一番楽だと思います) - Qiita
HTTPSではなく、HTTP通信を許可する手段の一つ

HTTP通信

NSURLConnection から NSURLSession への移行例 - Qiita

JSONを使ったHTTP通信

iOSでjson | Professional Programmer
JSON関連の変換

Sim@Memo: 【メモ】JSON ArrayでPOST送信する方法(Objective-C)
JSONを使ったHTTP通信

疎通確認(Ping)

  • PCからiOS端末へのping
    iOSIPアドレスを確認してpingiOS端末はpingを受け付けてくれので、とても助かる。
  • iOS端末からPCへのping
    Fingというアプリが使いやすかった。ポチポチ押すだけでpingを投げてくれる。

HTTP通信確認

  • iOS端末からPCへのHTTP通信確認
    とりあえず、SafariでOK。

その他のサービス、ポート開放確認

  • iOS端末からPCのサービスやポート開放を確認
    Fingというアプリが使いやすかった。デバイスを選んで、「サービスのスキャン」で開放ポートがわかる。そのまま、他のアプリで開くこともできる。

パケットキャプチャー

通信系のデバッグには Charles が便利 - Qiita
使ったことないけど、有料のプロキシ型パケットキャプチャという選択肢もある。SSL通信をキャプチャする場合には、ルート証明書を信頼する方法オレオレ証明書を有効にする必要があるみたい。

オーディオ

オーディオセッションプログラミングガイド(公式)

イコン画

Android,iOSアプリ用画像リソースとアイコンサイズのまとめ [2017年10月更新] | OPTPiX Labs Blog
必要なサイズ、内容、サイズを減らす方法をまとめてくれている。

iOSアプリケーションアイコンの設定手順 - Qiita
sipsというMacOSX固有コマンドを使っってリサイズし、復数のアイコンをまとめて用意・設定する方法。

アイコンには透過PNGを設定することもできるが、透過部分は黒くなる。透過が機能しない。

スプラッシュ画面

iOSのスプラッシュ画面実装における注意点と実装方法 - Qiita
スプラッシュ画面を設定する場合の設定する方法と注意点。

Tips

XCode プロジェクト名変更

Xcode6 プロジェクト名変更方法 - Qiita

XCode ターゲット名変更

プロジェクトをクリックして、TARGETSに表示されているターゲット名をクリック

XCode スキーム名変更

Product > Scheme > Manage Schemes... > スキーム名をクリック

XCode IPA名変更

デフォルトはスキーム名が使われる。
個別に名前を変えることも可能。
Product > Scheme > Edit Scheme... > Archive > Archive > Archive Name

端末がフリーズした場合

iPhone、iPad、iPod touch の電源が入らない場合やフリーズする場合 - Apple サポート

iPhone6以前,iPad,iPod touch
ホームボタンと上部のボタン(またはサイドボタン)を同時に 10秒以上、Apple ロゴが表示されるまで長押し

Amazon Echoで出来ること、スキル操作、拡張など色々調べたことのメモ

基本的な使い方とか、スキルの操作方法、開発方法など色々調べたので、メモを公開。

できること

標準でできることの一部は Alexaヘルプ(日本語) に記載されている。
それ以外にもスキルを追加することで拡張できる。

時刻、天気、スケジュール、トピックスを短くまとめて教えてくれる

「Alexa、何かある?」

時刻

「Alexa、今何時」

天気予報

「Alexa、明日の天気教えて」
「Alexa、明日の降水確率を教えて」

音楽再生

Prime Music、Music Unlimited(契約している場合のみ) の曲を再生。
「Alexa、XXの曲を再生して」
「Alexa、最近流行りの洋楽かけて」
「Alexa、3分後に音楽止めて」
「Alexa、3分後に再生を止めて」

音量変更

「Alexa、音量下げて」
「Alexa、音量上げて」
「Alexa、音量を3にして」

オーディオブック再生

まだ試してないけど、面白そう。

キッチンタイマー

「Alexa、3分のタイマーをセットして」
複数のタイマーを動かすこともできる。

買い物リスト、やることリスト

紙にメモするよりも、スマホに記録するよりも手軽で便利。
リストはAlexaアプリで確認できる。リストからの項目削除は音声ではできない。
使ってみたけど、スマホアプリの起動が遅く、リストを見るのに手間なのが残念。今後に期待。

  • 「Alexa、買い物リストに追加」→ Echoが何を追加するか聞いてくるので、商品名を話す(もしくはキャンセル)
  • 「Alexa、やることリストにXXを追加して」
  • 「Alexa、買い物リストを教えて」

カレンダー

「Alexa、今日の予定を教えて」
「Alexa、予定を教えて」 → 直近の予定を教えてくれる
「Alexa、明日の予定にXXを追加して」
他の人の声でもEchoが予定を答えてしまうので注意。

IFTTT

何か面白い連携を発表する人が出てくる予感。
公式のヘルプページへのリンク

スマートホーム

面白そうだけど、対応機器を持ってないので未確認

計算

「Alexa、15000わる320は?」

為替

「Alexa、1ユーロいくら?」
「Alexa、1ドルは何円?」

お遊び

「Alexa、なぞなぞ言って」
「Alexa、サイコロ降って」
「Alexa、百人一首読んで」

むちゃ振り

「Alexa、面白いこと言って」
「Alexa、ジョーク言って」
「Alexa、早口言葉言って」

その他

「Alexa、ボイパやって」
「Alexa、歌を歌って」
「Alexa、お正月の歌歌って」
「Alexa、誕生日の歌歌って」
「Alexa、クリスマスの歌歌って」
「Alexa、ジングルベル歌って」

スキルを追加する、使う

アメリカで公開されているスキルは既に15000を超えているとのこと。これから追加されていく日本語スキルが楽しみ。

日本語で発売時に用意された265スキルの一覧はこちら

ピカチュウトーク

ピカチュウと会話(?)できる。ちょっと面白い。
ピカ〜とか、ピカチューとか、ピカチュウ語しか言わないけど、何となく言いたいことがわかる時がある。
「誕生日」 → ピカチュウ語でハッピバースデーを歌ってくれる。

Hey MIKU!

初音ミクと会話できる。

起動しているスキルを終了する方法

  • 「Alexa、ストップ」(ストップの他に、止めて、中止でもOK)
    スキルが話している途中でも受け付けてくれる。

  • アクションボタン(Echoの上部にある4つのボタンのうち、右にあるボタン)を押す

起動しているスキルの使い方を知る方法

「Alexa、ヘルプ」(ヘルプの他に、どうすればいいの、使い方を教えてでもOK)を話すと、操作方法を説明してくれることがある。

TVを操作する

声で操作といえば、TVを操作したい。TV。

今までも声で操作できるデバイススマホアプリはあったけど、TV自体の音やノイズにとても弱かった。Amazon Echoは他と比べれば実用的なノイズ耐性があるので、対応製品が気になる。

Alexa対応TVを使う(現在は米国のみ)

Sonyの米国向け一部TVが対応している
今度TVを買うときにはAlexa対応TVがいいな。

スマートリモコン経由で赤外線操作

現時点で対応している製品は次の3つ。

もうちょっと様子を見たほうが良さそう。

関連記事:各社スマートリモコンがAmazon AlexaとEcho対応。声でテレビやエアコンなど操作 - AV Watch

Fire TVを操作する(現在は米国版のみ)

Amazon.com Help: Use Your Alexa Device to Control Your Fire TV
毎日のようにFire TVで動画見てるので、早く日本でもサービス開始しないかな。

Fire TV Stick (New モデル)

Fire TV Stick (New モデル)

電話の発着信、ハンズフリー通話、メッセージ送受信(現在は米国版のみ)

Alexa Calling & Messaging - Amazon Official Site
未来っぽくていいね。

Alexa Voice Remoteで遠隔コントロール(現在は米国版のみ)

Amazon.com Help
別売りのマイク付きリモコンで再生、停止、早送り、巻き戻し、音量変更とかできる。音楽とか再生する人には便利そう

Fire TabletでAlexaを使う(現在は米国版のみ)

Amazon.com Help: Using Alexa on Your Fire Tablet

Tips

アクションボタンの使いみち

アクションボタンは、Echoの上部にある4つのボタンのうち、右にあるボタン。丸い点が書いてある。

  • 停止状態の時に押すと、Alexaと呼びかけた時と同じ状態になる。
  • スキルが動作しているときには、スキルを停止する。
  • 10秒ほど長押しするとセットアップモードになる。

ライトリングの点灯の意味

公式の説明が参考にはなる。 これが全てでないので、あとは感覚で覚える必要がありそう。

f:id:sato_susumu:20171118025306p:plain:w500
出典:ライトリングについて

Echoが話すのをキャンセルする

(話している内容によっては)話してる途中に「アレクサ ストップ」と言うと止まる。

音楽などを一定時間で停止させる

「Alexa、スリープタイマーを30分にセットして」

Echoが勝手に商品を注文しないように設定する

設定 > アカウント > 音声ショッピング > 「音声による商品の注文」をOFFにする

スキルを開発する

Alexa | Amazon開発者ポータル - Amazon Developer
公式サイト

Alexa | アレクサ | Alexaスキル開発トレーニング
日本語の動画

Developing Alexa Skills - Hello, Alexa! (Part 1 of 6) - YouTube
英語の動画。内容が少し古いらしい。

Amazon Echo (Alexa) のSkillの開発に必要な基本概念を押さえる - Qiita

Alexa Skillsを公開する流れ - Qiita

Alexaスキル認定へのヒント集

Echo関連イベントに参加する

  • Amazon公式ハンズオントレーニング
    見つけたときには定員オーバーだった。残念。

  • Alexa Day 2018
    主催: JAWS-UG (AWS Users Group – Japan) を中心とした有志ボランティア
    日時:2018年2月11日(日) 10:30 〜17:30
    場所:神戸市
    面白そう。

参考

Alexaヘルプ(日本語)

Alexaヘルプ(英語)

Alexaの機能紹介(英語)




Amazon Echo (Newモデル)、チャコール (ファブリック)

Amazon Echo (Newモデル)、チャコール (ファブリック)

Amazon Echoのセットアップでつまづいた

招待メールが届いたので早速購入。

Kindleなんてセットアップ済みで送られてくるので、Echoのセットアップを舐めてました。

Amazon Echoのセットアップで30分ほど格闘するハメになったので、その記録。

(軽くググッた限りでは、皆さんセットアップはすんなり終わってる orz )

説明書の文章がよくわからない

「アプリストアからAlexaアプリをダウンロードします」

カタカナでアプリストアとだけ言われてもよくわからない。

ググってみると、Fire OS/Android/iOSでAlexaアプリが提供されてとのこと。

なるほど、PCがなくてもスマホタブレットがあれば設定できるのね。

表示される説明がよくわからない

「このcomputerでWi-Fi設定画面を開き、Amazon-XXXという名前のネットワークを選択します」

一瞬何を言っているのかわからなかった。

表示されている画像を見ると・・・・余計混乱する。

素直に文章通り、PCのWi−Fi設定画面を開くと「Amazon-XXX」という一時的なアクセスポイント(ネットワーク名)が現れる。

(Echoに限らず、WiFiのアクセスポイントは表示されるまで時間がかかることがあるので注意。)

まさか、Echoがアクセスポイントを提供するなんて思いもよらなかった。その発想はなかった。

PCのWiFiアクセスポイントを「Amazon-XXX」に切り替えると、すんなり次の手順に進める。

トラブル対応

WiFiのパスワード設定までは進めるけど、その後のセットアップが完了できない

iPhoneのAlexaアプリや、PCでのセットアップを何度も試すが、様々なメッセージが表示されながら、ことごとく失敗する。

  • 「デバイスを登録中にエラーが発生しました。トラブルシューティングの方法についてはヘルプをごらんください。エラー1」
  • 「認証の期限が切れました」
  • 「〜 登録エラー」
  • 「nullが〜」とか。nullってオイオイ。

最終的には、PCにて、http://alexa.amazon.co.jp > 設定 > デバイス > 新しいデバイスのセットアップ > Echo を選択して、セットアップすれば、すんなり終わった。

(ネットを見てると、PCでセットアップに失敗しても、Alexaアプリなら簡単にセットアップできたという情報もあった。)

公式のヘルプページ

Alexaヘルプ


Amazon Echo (Newモデル)、チャコール (ファブリック)

Amazon Echo (Newモデル)、チャコール (ファブリック)

iOSアプリの種類や配布に関するメモ

iOSアプリの配布について調べていたら、やたら道のりが長かった。
断片的な情報はネットで沢山あるのだけど、全体像がわかりにくい。
ある程度理解できた気がするので、調べた内容を公開。

f:id:sato_susumu:20171109003443j:plain

メンバーシップの種類

アプリを配布するためには、いずれかの登録が必要。
メンバーシップ毎に選択できるアプリ配布方法に違いがある。

個人 法人 教育機関
ADP(Apple Developer Program)
ADEP(Apple Developer Enterprise Program)
iOS Developer University Program

個人: 個人事業主、個人経営者含む
法人: Appleとの契約の締結が可能な法人
教育機関: 認可済みの学位を授与できる高等教育機関

メンバーシップの選択に関する比較(公式)

メンバーシップ毎に選択できるアプリ配布方法

Development AppStore VPPストア AdHoc In-House
ADP(Apple Developer Program)
ADEP(Apple Developer Enterprise Program)
iOS Developer University Program

Apple Developer Program

別名:iOS Developer Standard Program
旧名称:iOS Developer Program
略称:ADP

公式ページ
登録に必要な情報
ライセンス契約情報へのリンク元
価格情報

Apple Developer Programの年間登録料は99米ドルです(または現地通貨の同等額)。価格は地域によって異なることがあり、登録手続きの際は現地通貨で表示されます。

日本円での価格は為替レートによって改定される。

法人が登録する場合は D-U-N-S Number が必要。

Apple Developer Enterprise Program

旧名称:iOS Developer Enterprise Program
略称:DEP、ADEP、iDEP(アイデップ)

公式ページ
登録に必要な情報
ライセンス契約情報へのリンク元
価格情報

Apple Developer Enterprise Programの年間登録料は299米ドルです(または現地通貨の同等額)。価格は地域によって異なることがあり、登録手続きの際は現地通貨で表示されます。

日本円での価格は為替レートによって改定される。

登録には D-U-N-S Number が必要。

iOS Developer University Program

公式ページ

配布の種類

配布には複数の種類がある。

development配布(開発用配布)

  • 自分のMacに接続された端末のみインストール可能

App StoreもしくはVPP

App Store配布(一般公開)
  • Appleによるアプリ審査が必要
  • 一般公開されるため、プライベートなアプリ提供ができない
  • AppStore登録後に証明書が無効になっても問題ない

アプリ審査(App Review)
AppStore審査ガイドライン

VPP(Volume Purchase Program)配布
  • Appleによるアプリ審査が必要
  • カスタムB2Bアプリをプライベートな方法で提供できるので法人アプリ向き
  • 配布先企業は Apple Business Manager に登録が必要
  • Apple Business Manager を通じて配布

公式ページ

Ad HocもしくはIn-House

Ad Hoc配布(評価用配布)
  • App Storeを介さずに配布可能
  • 配布先デバイスは事前登録した100台まで
  • バイス追加の都度、UDID登録、プロビジョニングプロファイル更新、リビルドが必要
In-House配布(企業内配布)
  • App Storeを介さずに配布可能
  • 配布先デバイスは無制限
  • In-House版アプリの利用者は組織内の従業員に限る
  • 証明書が無効になるとアプリが起動できなくなる (削除や期限切れに注意!)

TestFlight Beta Testing

よく知らないのでパス

証明書(Certificate)やプロビジョニングプロファイル(Provisioning Profile)に関する全体像

配布可能なアプリを作るためには、配布用証明書とプロビジョニングプロファイルが必要。

iOSアプリのプロビジョニング周りを図にしてみる - Qiita
ここに書かれた図がとてもとてもわかり易い。

既に証明書が作成済みの場合は、後述の「他の人が作成した証明書を利用する場合」の方法で証明書を受け取ればいい。

配布用証明書とプロビジョニングプロファイルにはそれぞれ期限があるので注意が必要

Apple Developer Programの証明書は1年後に期限切れになり、プロビジョニングプロファイルは1年後に期限切れになります。

出典みつからず。

Apple Developer Enterprise Programの証明書は3年後に期限切れになり、プロビジョニングプロファイルは1年後に期限切れになります。

出典:日本語ドキュメント - Apple Developer

Apple Developerサイト(developer.apple.com)

メンバーシップ登録や内容確認を行うサイト。
メンバー招待/権限管理、証明書作成、プロビジョニングプロファイル作成もここで行う。

招待には「Invite as Admins」「Invite as Members」の2種類がある。

メンバーの権限管理に関する説明(公式)

配布の手段

複数の手段がある。

AppStoreを使う

審査を通ったアプリのみ。

VPPストアを使う

審査を通ったアプリのみ。
代表者がVPPストアで購入し、MDMで配布という方法もある。

MDMを使う

(法人向けアプリの場合)Appleが推奨するインストール方法。詳しくは知らない。

Apple Configurator2を使う

(法人向けアプリの場合)Appleが推奨するインストール方法の一つ?。
複数台のiPhone/iPadMacに接続して、まとめて設定やアプリインストールができる。

対応OSはMacのみ。Mac App Storeでダウンロードできる

参考: 複数のiPadに一括でアプリをいれるタスクが回ってきた(MDMサーバなし編) - Qiita

OTA(Over The Air)配信を使う

(法人向けアプリの場合)Appleが推奨している記載が見当たらない。アプリの更新が面倒。

Ad Hocビルド、In-Houseビルドしたアプリを配布できる。
HTTPS通信できる環境に必要なファイルを置く必要がある。

参考:無線経由のプロファイルの配布と構成(公式)

参考: 「現在ダウンロードできません。」と表示された場合の対処方法

iTunesを使う

(法人向けアプリの場合)Appleが推奨している記載が見当たらない。アプリの更新が面倒。

Mac版でもWindows版でもOK

iTunesを使ってipaファイルをインストールする方法

App Storeやアプリ管理機能が削除された「iTunes v12.7」でMacに保存された"ipa"や着信音をiOSデバイスへインストールする方法。 | AAPL Ch.
こちらの説明がわかりやすかった。

エンタープライズAppの信頼の確立

iTunesを使ってインストールした場合、エンタープライズAppでは信頼の確立という作業が必要。信頼の確立を行っていない場合、アプリを起動すると次のメッセージが表示される。

信頼されていないエンタープライズ開発元
"アプリ名"はこのiPHoneでは信頼されていません。この開発元が信頼されるまで、そのエンタープライズAppは使用できません。

iOS でカスタムのエンタープライズ App をインストールする - Apple サポート (日本)
信頼を確立するための方法は、公式ページが十分わかりやすい。

手動でインストールする場合の注意点

iOS 10.3以降での証明書に関する注意点

iOS 10.3 以降では、証明書ペイロードを含むプロファイルを手動でインストールした場合、SSL 通信に対してその証明書が自動的には信頼されません。
メールで送信されてきたプロファイルや、Web サイトからダウンロードしたプロファイルをインストールする際は、SSL 通信に対する信頼を手動で有効にする必要があります。
SSL 通信に対して証明書の信頼を有効にするには、「設定」>「一般」>「情報」>「証明書信頼設定」の順に選択します。「ルート証明書を全面的に信頼する」で、証明書に対する信頼を有効にします。
Apple では、Apple Configurator またはモバイルデバイス管理 (MDM) を介して証明書を配布することを推奨しています。Configurator や MDM でインストールされたか、MDM 登録プロファイルの一部としてインストールされた証明書ペイロードは、SSL 通信において自動的に信頼されます。

参照:iOS 10.3 で手動でインストールした証明書プロファイルに関する変更点

エンタープライズアプリのインストールに関する注意

App をモバイルデバイス管理 (MDM) でインストールした場合は、自動的に信頼が確立します。App を手動でインストールする場合は、信頼も手動で確立する必要があります。
Apple では、App の配布には MDM ソリューションを利用することを推奨しています。その方が安全で、ユーザの介入も不在です。所属組織が運用する安全な Web サイトからカスタム App をインストールできるという利点もあります。App を所属組織からインストールするのでなければ、Apple App Store からのみ App をダウンロードし、インストールするようにします。iPhoneiPadiPod touch を保護するには、これが最善の策です。

参照:iOS でカスタムのエンタープライズ App をインストールする

信頼の確立、再検証にはインターネットの接続が必要

信頼を確立する際は、App の開発元の証明書を検証するため、インターネットへの接続が必要です。ファイアウォールをお使いの場合は、https://ppq.apple.com への接続を許可するように設定しておいてください。App を信頼する際にインターネットに接続されていないと、デバイスには「未検証」と表示されます。この状態の App を使うには、インターネットに接続してから、「App を検証」ボタンをタップしてください。
App の初回の検証が済んだ後、信頼を維持し続けるため、iPhoneiPadiPod touch で App 開発元の証明書を定期的に再検証する必要があります。再検証できない場合は、状況に応じて、間もなく検証が期限切れになるというメッセージが表示されます。信頼を維持するには、デバイスをインターネットに接続し、「App を検証」ボタンをタップするか、App を起動してください。

参照:iOS でカスタムのエンタープライズ App をインストールする

https://ppq.apple.com」と書かれているが、他にもOCSP(Online Certificate Status Protocol)を使って「https://ocsp.apple.com」などにもアクセスするらしい。それ以外にも「ax.init.itunes.apple.com」にもアクセス?

接続先やプロトコルに関する詳しい説明はこちら

D-U-N-S Numberに関する補足

ADP(法人)かADEPの登録に必要な情報の一つ。

D-U-N-S Numberとは

The Data Universal Numbering System (D-U-N-S®)
1962年にD&Bが開発した9桁の企業識別コードのことで、世界の企業を一意に識別できる企業コードです。
D&Bが独自に管理をしており、日本企業についてはTSRが運営しています。

出典:東京商工リサーチ

D-U-N-S Numberの申請は東京商工リサーチに依頼するのが楽。
サイトの上の方に「自社D-U-N-S Numberの申請」がある。

料金
「自社D-U-N-S Numberの申請」¥3,000(税抜)
D-U-N-S Number 証明書発行希望」¥10,000(税抜)
上記2つをセットで申し込む場合は、セットで¥10,000(税抜)

証明書(Certificate)に関する補足

開発用と配布用の2種類がある

証明書(Certificate)には開発用(Development 別名:Apple Development)と配布用(Distribution 別名:Apple Distribution)の2種類がある。
自分のMacに接続された端末以外にアプリをインストールしたい場合は、配布用証明書を使う必要がある。

iOS Development」「iOS Distribution」という古い形式の証明書もあるが、Xcode11未満用。 (Xcode12でも手動であれば使える。プロビジョニングプロファイルは必要に応じて、Apple Developerサイトで更新が必要。)

開発用/配布用共に証明書の作成にはCSRが必要

CSRとは証明書署名要求(Certificate Signing Request)の略で、証明書を発行するのに必要な情報。

他の人が作成した証明書を利用する場合

証明書を使うには次の情報が必要

  • 秘密鍵を含めた証明書を書き出したファイル(.p12ファイル)
  • 秘密鍵の書き出しに使用したパスワード

参考: .p12ファイルを書き出す方法

パスワードが必要なことは忘れがちなので注意

.p12ファイルとは

キーチェーン上で証明書や秘密鍵をエクスポートすると作成されるファイル。
証明書だけでなく秘密鍵も扱えるので便利だけど、操作を間違わないように注意が必要。

開発者証明書に関する補足

2015年9月17日に正式公開されたXcode7からはApple Developer Program に登録して開発用証明書を作成しなくても、自作アプリをiOS端末にインストールして実機で動かすことができるようになりました。Apple Developer Programへの登録費用が要らなくなり手順も大幅に簡略化されたので、そちらのやり方を推奨します。

【2016年最新版】わかりやすく徹底解説!iOS端末でアプリの実機テストをする為に必要なCertificate(開発用証明書)の作成手順 - 夜更かし工房

証明書の期限切れについて

Macに関する注Developer ID証明書が期限切れになっても、ユーザはなお、この証明書で署名したMacアプリケーションをダウンロード、インストール、実行できます。しかし、更新版に署名し、あるいは新規にアプリケーションを開発するためには、新しいDeveloper ID証明書が必要です。

出典:アプリケーションの配布に関するガイド

MDMに関する補足

MDMはどんなことができるか

MobiConnectという製品の例。
http://www.mobi-connect.net/price/ios.html

製品の比較

調べた範囲ではWikiが一番わかりやすく、一覧性もよかった。
Mobile Device Management - Wikipedia

こちらの比較表は内容は古いけど、提供形態(クラウド型かオンプレ型か)に関する情報があった。

参考資料

ややこしいiOSアプリ配布方法の俯瞰とケースバイケースの配布方法選定 - Qiita iOSアプリ配布方法についてわかりやすく記載されている。

エンタープライズにおけるiOSアプリ開発で押さえておくべき7つのこと
2014年の資料だけど、幅広い機能が図入りで解説されている。

この記事では触れてないけど、便利そうな機能

  • DEP (Device Enrollment Program)
  • Single App Mode

iOSアプリリリースのポイント - Chipstar Lightの気づき
あとから見つけた。。。この記事の概要に相当する内容がスッキリわかりやすく書かれてます。

エンタープライズネットワークで Apple 製品を使う(公式)
iOSが接続する接続先やプロトコルの一覧

アプリケーションの配布に関するガイド(公式)
目的の内容を探しづらいけど、内容は豊富。トラブルシューティングに関する記載もある。

Apple Developer Program の管理者が最低限意識すべきこと
必要な最新情報がわかりやすくまとまっていた

困ったときのおまじない

  • Xcode上でのプロファイル再取得
    Xcode > Preferences > Accounts > Download Manual Profiles
  • Macの再起動

Windowsのバージョンや実行環境に関するメモ

古いWindowsタブレットWPFアプリが動くかどうか調べたかっただけなのに、 どんどん深みにはまっていった。調査したのでメモとして記録。

f:id:sato_susumu:20171108013245j:plain

Windowsのバージョン

バージョンの調べ方: 121ware.com > サービス&サポート > Q&A > Q&A番号 002356
初心者にもわかりやすい説明。エディションの確認方法へのリンクもある。

OS名 NT バージョン 発売年
Windows XP NT 5.1 2001年
Windows Vista NT 6.0 2006年
Windows 7 NT 6.1 2009年
Windows 8 NT 6.2 2012年
Windows 8.1 NT 6.3 2013年
Windows 10 NT 10.0 2015年

Windows 10のバージョン

バージョンの調べ方: winverコマンドを実行

Version マーケティング コードネーム 提供開始
1507 - TH1 2015年7月
1511 November Update TH2 2015年11月
1607 Anniversary Update RS1 2016年8月
1703 Creators Update RS2 2017年4月
1709 Fall Creators Update RS3 2017年10月
1803

TH: Thresholdの略
RS: Redstoneの略

WindowsのOS別サポート期限
デスクトップOSのOS/バージョン別シェア

.NET Frameworkのバージョン

.NET Frameworkバージョン CLRバージョン 最低動作OS 対応開発ツール 補足
.NET Framework 3 2.0 Windows XP Visual Studio 2005 Windows Vistaに標準搭載。WPF対応
.NET Framework 3.5 2.0 Visual Studio 2008 Windows 7に標準搭載。以降で開発可能。LINQ対応
.NET Framework 4 4 Visual Studio 2010 Parallel LINQ対応
.NET Framework 4.5 4 Windows Vista Visual Studio 2012 Windows 8に標準搭載
.NET Framework 4.6 4 Windows 7 Visual Studio 2015 Windows 10に標準搭載
.NET Framework 4.7 4 Visual Studio 2017

上記以外にもマイナーバージョンもある
CLRバージョン: バージョンが同じ場合は共存できない。インストールすると古いバージョンを上書きされる。
LINQ: Language INtegrated Query、統合言語クエリ、リンクと読む

CLRとは

CLRとは、Common Language Runtimeの略。共通言語ランタイム。
.NET Framework上で、サービスやアプリケーションを実行するための仮想マシンの名称。
CLRは次の主要な5項目で構成されている。

  • 共通型システム (CTS: Common Type System)
  • 共通言語仕様 (CLS: Common Language Specification)
  • 共通中間言語 (CIL: Common Intermediate Language)
  • ジャストインタイムコンパイラ (JIT: Just-in-time compiler)
  • 仮想実行システム (VES: Virtual Execution System)

参考

.NET Framework - Wikipedia (日本語)
.NET Framework - Wikipedia (英語)
.NET Frameworkは、英語版Wikipediaがわかりやすくまとまってた。最初からココを見ればよかった。
.NET Framework のバージョンおよび依存関係

SSL証明書 メモ

SSL証明書を取得したけど、手続きは難解だし、途中でも様々な用語が出てくるしで解かりづらかった。

f:id:sato_susumu:20171108013505j:plain

認証局(CA:Certification Authority)

主な役割は「電子証明書の発行と失効」。

パブリック認証局

パブリック認証局ルート証明書は、一般的なウェブブラウザやメールソフトにあらかじめ組み込み済み。
そのため、ルート証明書の配布やインストールが不要。

プライベート認証局

事業会社などが独自に設立。
ルート証明書の配布や設定などに手間が掛かかる。
社内だけなど、限られたネットワークで電子証明書を利用する場合、使うことができる。

3階層の証明書と、中間CA証明書

3階層で証明書を検証する仕組み。(4階層というのもある)

1階層目:ルート証明書(パブリック認証局であれば、ブラウザ等に既に組み込まれている)
2階層目:中間CA証明書
3階層目:サーバ証明書

下位2階層の証明書をサーバーに設定する必要がある。

SSL証明書について

GMOグローバルサインのSSL証明書を中心に記載

SSL証明書の種類(別名:認証タイプ、認証レベル)

クイック認証SSL(別名:ドメイン認証、ドメイン認証型、DV、Domain Validation)

認証レベル: 低
個人による取得: ○
アドレスバー表示: ブラウザのアドレスバーに鍵マーク
認証項目: ドメイン名の使用権
特徴: 低価格、スピード発行、個人事業主の取得可

企業認証SSL(別名:企業実在認証、実在証明型、OV、Organization Validation)

認証レベル: 中
個人による取得: ☓
アドレスバー表示: ブラウザのアドレスバーに鍵マーク
認証項目: ドメイン名の使用権、組織の法的実在性
特徴: 証明書情報に組織名。ウェブサイトの信頼性アップ

EV SSL(別名:EV認証、EVタイプ、EV、Extended Validation)

認証レベル:高
個人による取得:☓
アドレスバー表示:アドレスバー・鍵マークが緑。運営組織名が表示
認証項目:ドメイン名の使用権、組織の法的・物理的実在性、組織の運営、承認者・署名者の確認
特徴: アドレスバーに組織名、フィッシング詐欺対策

サービス、オプションの種類

マルチドメインSSL

複数の別ドメインサイトを1枚のSSL証明書SSL暗号化通信を実現させる。

ワイルドカードSSL

対象の認証タイプ:クイック証明SSL、企業認証SSL
複数のサブドメインサイトを1枚のSSL証明書で暗号化通信を実現させる。
※証明書が「.example.com」に発行されている場合、「https://example.com/」でも利用可能です。
※証明書が「
.example.com」に発行されている場合、「https://www.sub.example.com/」にアクセスすると警告が表示されます。

「www.」有り無し対応『2way』

証明書お申し込み時に「www.example.com」のようなwww.で始まるコモンネームを申請をされた場合、「example.com」といったwww.が付かないURLへのSSLアクセスにも対応可能です。
※クイック認証SSLのお申し込み時に「www.example.com」のコモンネームで申請をされた場合、審査時に「example.com」のドメインで審査すると2wayが適用されます。 「www.example.com」のFQDNで審査した場合は、2wayが適用されないため、審査した「www.example.com」のFQDNでのみ利用可能となります。
https://jp.globalsign.com/service/ssl/feature/?id=basicservice

同一コモンネームであれば、証明書のコピー利用OK

証明書コピー利用でコスト削減 追加ライセンス無償

グローバルサインのSSLサーバ証明書はコモンネーム(ディスティングイッシュネーム)ごとの課金のため、1ライセンス(1枚)ご購入いただくことで、同一コモンネームであれば無制限にインストールして同時に利用することが可能です。負荷分散のための複数台サーバ構成やクラウド環境など、サーバが増設することが想定される環境においても、その都度証明書を追加購入する必要がありません。

https://jp.globalsign.com/support/faq/67.html
https://jp.globalsign.com/support/faq/74.html

CSR

CSRとは

Certificate Signing Request(証明書サイン要求)の略。
DN情報や生成時に使用した公開鍵の情報が含まれている。
CSRの生成は証明書を利用するサーバー上で作成する方がよりいいらしい(?)

スキップ申込サービス(GlobalSignのみ)

https://jp.globalsign.com/service/ssl/feature/skip.html

スキップ申し込みを利用するための条件:

  • サーバの管理に、レンタルサーバ等で利用するサーバ管理ツールを利用していない。
  • サーバは、Microsoft IIS5.0以降、Tomcatのいずれかを使用している。

バックアップ

発行されるサーバIDは、CSR生成元のキーペアとの正しい組み合わせでのみ使用できる。
そのため、次の内容のバックアップが必要。
秘密鍵が流出するとSSLのセキュリティが保てなくなるため注意。

  • キーペア(秘密鍵と公開鍵)ファイル
  • CSRファイル

証明書更新時にCSR再作成は必要か

更新時に元のCSRファイルを使う事もできるが、セキュリティを考えると再作成した方がいい。
レンタルサーバ会社のルール、Microsoft IISなどのサーバによっては、CSRの更新を必須としている場合がある。

同じ情報で同じ手順でCSRを作成しても、二度と同一のCSRを作成することはできないらしい。
CSR作成に同じ秘密鍵を使うと、公開鍵も同じになってしまう。
秘密鍵も毎回作成するのがオススメらしい。

注意点

作成したCSRファイルに対して、公開鍵長やDN情報の変更はできない。

DNとは

Distinguished Name(識別されたネーム、ディスティングイッシュネーム)の略。
CSRに含まれている、特定の法人名やドメイン名をコード化した情報。
国名、州(郡)、地域(都市)、組織名、組織内の部署名、コモンネームが含まれる。

CSR生成メモ

秘密鍵の作成(パスフレーズあり)
パスフレーズなしで作成する方法もあるため、その方法の方がいい?
公開鍵長は「2048bit」を指定。1024bitではダメ。

$ openssl genrsa -des3 -out example.com.key.pem 2048  

パスフレーズを削除

$ openssl rsa -in example.com.key.pem -out example.com.key_np.pem  

CSRを生成

$ openssl req -new -key example.com.key_np.pem -out example.com.csr.pem  
Country Name (2 letter code) [AU]:JP  
State or Province Name (full name) [Some-State]:都道府県名。例:Tokyo  
Locality Name (eg, city) []:市区町村名。東京の場合は区名。例:Minato-ku  
Organization Name (eg, company) [Internet Widgits Pty Ltd]:組織名や会社名。例:Cybertrust Japan Co.,Ltd.  
Organizational Unit Name (eg, section) []:組織内の部署名。例:Technical Division  
Common Name (e.g. server FQDN or YOUR name) []:例:*.example.com  
Email Address []:空白のまま  
  
Please enter the following 'extra' attributes  
to be sent with your certificate request  
A challenge password []:空白のまま  
An optional company name []:空白のまま  

SSL証明書発行/更新

発行/更新手続き(GlobalSignの場合)

  • 必要な項目を入力
  • CSRを入力
  • メール認証、ページ認証、DNS認証のいずれかの方法で認証
    メール認証は楽だけど、受信できるメールアドレスは限られている。

SSL証明書発行時のメールで送られてくる情報

  • コモンネーム
  • 証明書 SHA256
    -----BEGIN CERTIFICATE-----
    (X.509 証明書データ)
    -----END CERTIFICATE-----
  • 中間CA証明書
    -----BEGIN CERTIFICATE-----
    (X.509 証明書データ)
    -----END CERTIFICATE-----
  • 証明書+中間証明書(PKCS7形式) SHA256。IISの場合に使用する。
    -----BEGIN PKCS7-----
    (PKCS7形式の証明書データ)
    -----END PKCS7-----

更新時したときの新しい証明書の有効期限(GlobalSignの場合)

他の会社で行ったことがないので、GlobalSignで発行した証明書をGlobalSignで更新したケースのみ記載。
有効期間開始日:発行日時
有効期間終了日:終了日時から1年後(1ヶ月追加のオプションを選択していれば、更に1ヶ月後)

AWSSSL証明書を扱う方法

次の3種類の方法がある。

  • 自分で取得したSSL証明書を IAM にアップロード
  • 自分で取得したSSL証明書AWS Certificate Manager(ACM)にアップロード
  • AWS Certificate Manager(ACM)で無料DV証明書(制約あり)を発行

無料DV証明書の特徴、制約

  • CloudFront, ELB(ALB含む)のみ使用可能。
  • 無料
  • 自動更新
  • マルチドメインワイルドカード対応
  • 認証レベルはDVのみ
  • 証明書の認証局(CA)はAmazon
  • CloudFrontで使える証明書は、us-east-1リージョンに登録されている証明書のみ。
  • ELBで使える証明書は、ELB設置リージョンに登録されている証明書のみ。

詳しい説明

ACMで管理するメリット

IAM と比べてどういうメリットがあるのか確認してみました。

証明書の更新が一括で行える  
どのリソースで使われているかが一目でわかる  
使われていない証明書を確認・削除できる  

一番のメリットは証明書の更新が圧倒的に楽になることでしょう。これまでの IAM 方式だと、新しい証明書を IAM にアップロードし、その証明書を使っている ELB や CloudFront の設定をひとつひとつ変更する必要がありました。その証明書がどこで使われているか把握していないと更新し忘れる可能性があります(ELB が何十個もあると更新するのもひと苦労です…)。

https://blog.manabusakai.com/2016/10/acm-import-certificate/

自分で取得したSSL証明書AWS Certificate Manager(ACM)にアップロードする場合の注意点

ACM はインポートされた証明書にマネージド型更新 を提供しません。
重要
インポートした証明書の有効期限をモニタリングし、失効する前に更新する責任はお客様に帰します。期限切れの証明書と同じ ARN を持つ新しい証明書をインポートすると、新しい証明書で古い証明書が置き換えられます。さらに、ACM は新しい証明書を古い証明書と同じサービスおよびリソースに関連付けます。
インポートした証明書を更新するには、発行者から新しい証明書を取得して ACM にインポートするか、または ACM から新しい証明書をリクエスト することもできます。

http://docs.aws.amazon.com/ja_jp/acm/latest/userguide/import-certificate.html

AWS Certificate Manager

証明書のインポート

証明書本文: SSL証明書(PEM形式)
証明書のプライベートキー: CSR作成に使用した秘密鍵(PEM形式)
証明書チェーン: 中間CA証明書(PEM形式)
余計な空白や改行があると失敗する(失敗した。。。)

インポートした証明書を使ったときにハマったところ

Elastic Beanstalkで使う場合、インポートしたSSL証明書.elasticbeanstalk.com に適用できず、アクセスできない。
(AMIで設定したSSL証明書を使った場合は、
.elasticbeanstalk.com にアクセスできたため、謎。)

その他

拡張子と内容について

拡張子.pem

PEM(Privacy Enhanced Mail)と呼ばれる形式。
.pemという拡張子は鍵の中身じゃなくて、エンコーディングを表している。
Base64によってテキスト化されている。
証明書をファイルに保存して取り扱うことが比較的多い。
ヘッダ「-----BEGIN XX -----」とフッタ「-----END XX-----」で囲われているので、XXの部分で内容を区別できる。

CSR

「—–BEGIN CERTIFICATE REQUEST—–」、「—–END CERTIFICATE REQUEST—–」で囲われている。
よく使われる拡張子は「.csr」「.txt」

秘密鍵

「—–BEGIN RSA PRIVATE KEY—–」、「—–END RSA PRIVATE KEY—–」で囲われている。
よく使われる拡張子は「.key」「.txt」

証明書(公開鍵)

「—–BEGIN CERTIFICATE —–」、「—–END CERTIFICATE—–」で囲われている。
よく使われる拡張子は「.crt」「.cer」「.cert」「.ca」「.txt」。
中間証明書の場合は「
.ca-bundle」もある。

オススメのファイル名

ファイル名も拡張子も特に決まりがない。コモンネームを含めた方がわかりやすいらしい。

CT

Certificate Transparencyの略。
Google 社により考案され、2013 年に「RFC 6962」として規格化。
CTログサーバに発行した証明書を登録することで、証明書発行の「透明性」を確保する仕組み。

SCT

Signed Certificate Timestamp(署名付き証明書タイムスタンプ)の略
CTログサーバに証明書を登録した際に、発行してもらえるタイムスタンプ

Macの環境構築 メモ(インストール関連は自動化)

MacBookProを購入したけど、環境構築がダルいのでインストール関連だけでも自動化。

それにしても、世の中は進化してて、いろんなセットアップがお手軽に自動で行えるようになってた。

  • brew caskがbrew本家に取り込まれて、何も設定せずに使える。
  • brew caskのインストール先も/Applicationsに直接インストールされるようになってた。
  • XCodeをインストールしなくても、brewの実行に必要な XCode Command Line Tools は自動でインストールしてくれる。

Ansibleを使う方法とか、完全自動化ともあったけど、お手軽さを重視。

f:id:sato_susumu:20171014111848j:plain

WiFi設定、AppleID、省電力設定の変更

こればっかりは手動で設定。
自動インストールが止まらないように省電力設定を変更。(システム環境設定 > 省エネルギー)

各種コマンドやアプリのインストール

brewの設定

まずはターミナルを立ち上げて、brewをインストール。
コマンドラインで次の内容を実行。

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

きちんとセットアップできてるかどうか確認

brew doctor  
brew cask doctor  
brew -v  

インストールの実行

まずは、Brewfile というファイルを用意。

brew 'git'  
brew 'openssl'  
brew 'vim'  
brew 'peco'  
brew 'wget'  
brew 'openssl'  
brew 'nkf'  
brew 'mysql'  
brew 'yasm'  
brew 'jq'  
brew 'imagemagick'  
brew 'awscli'  
brew 'aws-elasticbeanstalk'  
brew 'ansible'  
  
cask 'google-japanese-ime'  
cask 'dropbox'  
cask 'vlc'  
cask 'google-chrome'  
cask 'vagrant'  
cask 'virtualbox'  
cask 'sourcetree'  
cask 'visual-studio-code'  
cask 'android-studio'  
cask 'mysqlworkbench'  
cask 'atom'  
cask 'skype'  
cask 'transmit'  
cask 'cd-to'  
cask 'appcleaner'  
cask 'kindle'  
cask 'nosleep'  
cask 'slack'  
cask 'the-unarchiver'  
cask 'google-photos-backup-and-sync'  
cask 'flash-player'  
cask 'gimp'  
cask 'Karabiner'  
  
cask 'xquartz'  
brew 'wine' # xquartz required  
brew 'winetricks' # xquartz required  
  
mas 'ToyViewer ', id: 414298354  
mas 'The Unarchiver', id: 425424353  
mas 'Disk Diag', id: 672206759  
mas 'Xcode', id: 497799835  

Brewfileがあるフォルダで次のコマンドを実行

brew bundle  

途中で何度かパスワードを聞かれる。
masの実行時にAppleIDのパスワードを聞かれる。

不要なファイルを削除

終わったら不要なファイルを後始末。

brew cleanup  
brew cask cleanup  

省電力設定も元に戻す。

コマンドラインで設定

finder

finderなどの設定もコマンドラインでできる。

# Automatically open a new Finder window when a volume is mounted  
# マウントされたディスクがあったら、自動的に新しいウィンドウを開く  
defaults write com.apple.frameworks.diskimages auto-open-ro-root -bool true  
defaults write com.apple.frameworks.diskimages auto-open-rw-root -bool true  
defaults write com.apple.finder OpenWindowForNewRemovableDisk -bool true  
# Set `  {HOME}` as the default location for new Finder windows  
# 新しいウィンドウでデフォルトでホームフォルダを開く  
defaults write com.apple.finder NewWindowTarget -string "PfDe"  
defaults write com.apple.finder NewWindowTargetPath -string "file://  {HOME}/"  
# Show Status bar in Finder (ステータスバーを表示)  
defaults write com.apple.finder ShowStatusBar -bool true  
# Show Path bar in Finder (パスバーを表示)  
defaults write com.apple.finder ShowPathbar -bool true  
# Show Tab bar in Finder (タブバーを表示)  
defaults write com.apple.finder ShowTabView -bool true  
# Show the ~/Library directory (ライブラリディレクトリを表示、デフォルトは非表示)  
chflags nohidden ~/Library  
# Show the hidden files (不可視ファイルを表示)  
defaults write com.apple.finder AppleShowAllFiles YES  

その他の設定

# Avoid creating `.DS_Store` files on network volumes (ネットワークディスクで、`.DS_Store` ファイルを作らない)  
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true  
  
# Disable the "Are you sure you want to open this application?" dialog  
# 未確認のアプリケーションを実行する際のダイアログを無効にする  
defaults write com.apple.LaunchServices LSQuarantine -bool false  

手動でいろいろ設定

本体設定

  • システム環境設定 > キーボード
  • システム環境設定 > キーボード > 「スマート引用符とスマートダッシュを使用」をOFF
  • システム環境設定 > トラックパッド

Firefox

最新のFirefoxではVimperatorの一部機能が動かないので、Firefox 55.0.3をダウンロードしてインストール
アカウントを入力して、設定の同期

Google Chrome, Dropbox, Skype

アカウントを入力して同期

java

JDK8をダウンロードしてインストール

Google IMEを設定

LaunchpadでGoogle IMEのConfigDialogを起動
一般タブ > キー設定の選択 > 編集 > 左下の編集 > インポート > keymap.txt を選択

アクティビティモニタ

アクティビティモニタを起動
Dockバーのアイコンを右クリック > Docアイコン > CPU使用率を表示

ターミナル

設定変更

Vimperatorの設定

ホームフォルダに .vimperatorrc を作成し、Dropbox内の設定ファイルを読むようにさせる。

set titlestring='Firefox!!!'  
source! ~/Dropbox/_vimperatorrc  

jFD2

jFD2本体をダウンロード
https://sites.google.com/site/ikemen/jfd2

jFD2_1.02c.dmgを開く
jFD2.app をアプリケーションフォルダに移動
Finder上で、jFD2.app に対して Ctrl を押しながら、右クリック > 開く

jFD2を実行するとJava6ランタイムがいると言われる。
Java6ランタイムをダウンロード
https://support.apple.com/kb/DL1572?viewlocale=ja_JP&locale=en_US

シンボリックリンクDropbox内の設定を読むようにさせる。

cd ~  
rm -rf ~/.jfd2   
rm -rf ~/.jfd2_user  
ln -s "/Users/username/Dropbox/tools_mac/Application Support/.jfd2" ~/.jfd2  
ln -s "/Users/username/Dropbox/tools_mac/Application Support/.jfd2_user" ~/.jfd2_user   

Time Machine

TimeMachineを開く
「バックアップを自動作成」をチェック
「Time Machineをメニューバーに表示」をチェック

Atom

コマンドラインで次の内容を実行

apm install sync-settings  
atom  

sync-settingsを設定

  • Personal Access Tokenを設定
  • Gist Idを設定

sync-settings の Restore を実行

Visual Studio Code

Settings Syncを設定
Settings Sync - Visual Studio Marketplace

Microsoft Office

以前にAmazonで購入しているので、ダウンロードしてインストール。
ダウンロードするときは、「ご利用方法はこちら」に書かれているMSのダウンロードURLからダウンロードしたほうが早い。

VLC

履歴を残さないように設定変更
【メモ】VLC for Macで、再生履歴を消す&残さないようにする - Marの人生の一片

キーリピートの高速化

ある程度の高速化でよければ、 システム環境設定 > キーボード で設定する。
もっと高速化する場合は、 Karabiner というツールで設定する。
詳細は、[Mac] キーボードの反応速度を速くする方法 | Developers.IO 参照

参考

Macでの開発環境構築をできる限り自動化する。 - Qiita

ターミナルから Mac を設定する(defaults write コマンド等) - Qiita

読書メモ:(Web開発者のための)大規模サービス技術入門

2010年初版の本。昔の"はてな"の裏側が垣間見えるのも面白い。
サービスの規模に対して、とても少ない人数で運用、開発してたことに驚く。
あと、この本はインターンシップで教えていた内容がベースらしいけど、これだけの内容をインターンシップで教えているのは凄い。

もともとノウハウを凝縮したような本なので、内容が濃い。
検索システムなどあまり興味のない章もあったけれど、現在のはてなインターンシップでも既に別の説明に置き換わっているらしい。

はてなについて

スタート

2001年に「人力検索はてな」開始。従業員3名、PC1台。

2010年当時の規模

登録ユーザー数150万人
1500万UU(ユニークユーザー)/月
数十億アクセス/月(画像などへのアクセスは除く)
ピーク時の回線トラフィック量は850Mbps
サーバー台数600台。22ラック。仮想化台数は1300台

当時の体制

インフラ部は仮想ホストを管理。社員4名、アルバイト数名
サービス開発部はサービスごとに3〜4名。

技術選定基準

  • 言語
    ポリシーは同じレイヤーの言語は基本は1つに絞る。
    ただし、速度が求められる場合にはC/C++なども使う。

  • ミドルウェア
    DBもMySQLに統一

  • 基準
    新しいものはダメという基準はないが、枯れたものが使いやすい。
    クラウドは細かい挙動がわからないことがある。

アルゴリズム

エンジニアの共通言語。お互いが知ってれば、ハッシュの一言で済む。
アルゴリズムを学ぶわかりやすい利点は、新しい問題にも対処できるかもしれない点。

アルゴリズムのオーダー表記

O(1) < O(log n) < O(n) < O(n log n) < O(n2) < O(nk) < O(2n)
オーダー表記は定数項を無視する。

処理の改善

実際の速度はキャッシュの効きにもよるので計測しないとわからない。
何がネックになっているか計測して、最適化か、アルゴリズム変更か、HW変更か判断。
人間の直感よりも、さくっと実装して試してみるのも大事。最近のコンピュータは速いのでスペックで殴った方が早いことも。

その他

  • オープンソースライブラリを使ったり、必要な箇所だけ抜粋すると工数が減ることも。
  • 圧縮は地味だけど重要。例:HTTPのdeflate圧縮通信
  • プロトタイピングでうまくいっても、実運用で使うためには他の作業も結構ある。
  • GoogleIMEはLOUDSというデータ構造で巨大な辞書を50MBに圧縮。

サーバ・インフラ入門

エンタープライズWebサービスという軸での比較

安定化対策

  • システムを安定させるために余裕を持たせる。限界の7割で運用。CPUもメモリも7割が目安。
  • HDDだけでなく、メモリ、ネットワークの障害も日常的に発生する
  • 外部連携サーバーが落ちても動くようにする
  • メモリリークを日頃から除去
  • 発行するSQLを把握
  • 異常動作時の自立制御
    自動DoS判定
    リソース不足時の自動再起動
    処理時間の長いSQLをKILL(10秒に1回取得して判定)

システムの成長戦略(p.17)

小規模な段階での最適化はベストではない。
でも、なにも考えずに見切り発車も考えもの。
大規模化の壁は突如として目の前に現れます。たとえばデータ規模が増加することによるI/O負荷の上昇は、それほどなめらかに増加するわけではありません。

自分が扱っているサービスは規模はぜんぜん違うけど、ホントこれ。忘れないようにしたい。

コマンド、ツール

hdparm メモリとディスクの転送速度が見れる

sar OSの状況確認

  • 過去の統計データに遡ってアクセスする
  • 現在のデータを周期的に確認

Squid(スクウィッド)

プロキシ (Proxy) サーバ、ウェブキャッシュサーバなどに利用される。
キャッシュサーバーを使うことで大量のアクセスを捌く。

MySQL

インデックス

  • 1回のクエリで1つのインデックスしか使わない
  • インデックスとして作用するのは、明示指定したインデックス、プライマリキー/UNIQUE制約を指定したカラム
  • インデックスが効いているかどうかはexplainコマンドで確認できる
    keyは使用したインデックス。
    Using filesortやUsing temporararyが出るのあまり筋のよくないクエリ
  • インデックスの付け忘れは目を増やすことでカバー
    • slow.log
    • SQL文が画面に表示されるようにライブラリに手を入れる
    • O/Rマッパで都度explainして怪しいクエリは自動で報告
  • 異なるサーバにあるテーブルをJOINする機能はない(MySQL5.1ではFEDERATEDテーブルを利用すれば可能)

DBへの更新/書込をスケール

  • 更新系クエリが増えると厳しい
  • テーブルを分割してテーブルサイズを小さくする
  • そもそもRDBMSを使わない

RDBMSの限界を超えたら

  • バッチ処理でデータを抽出
  • そのデータを提供するサーバーを作りWeb APIでクエリ
  • 用途を特化してるので早い

理論と実践

  • 開発スピードを求めるには実践力が必要。
  • 規模が大きくなると、小手先の実践は通用しなくなる。
  • 多くの問題はわりと教科書に載っているような古典的な理論で解けたりする。
  • Web開発には理論と実践の両方が必要
  • 計算機の問題として道筋を立てるには、ある程度知識の引き出しが必要。

KiB、MiB、GiBが何バイトか、また調べた(人生で4回目ぐらい?)

f:id:sato_susumu:20171005183955j:plain

バイト数を数えるときの単位「kB」は1000バイトか、1024バイトか注意する癖はついている。
けど、「KiB」って単位は1000バイトだったか、1024バイトだったか、調べても、調べても、すぐに忘れてしまう。

俺の記憶力がいくら悪くても、調べて、ブログに書けば流石に覚えるんじゃないかな。
というわけで、また調べた(人生で4回目ぐらい?)

調べた結果

KiBの語源は kilo binary byte
なので、読みがキビバイト
ここでいう「binary」は「二進数」という意味。
単位名が「KiB」じゃなくて、「KbB」とか「KBB」なら分かりやすかったのに。

語源も調べたし、理解した、ブログにも書いた、これで忘れないはず。

似たような単位MiB, GiB, TiB, PiB

単位 読み 説明
KiB キビバイト(kibibyte) Kilo binary Byteの略 2の10乗バイト(1024の1乗バイト)
MiB メビバイト(mebibyte) Mega binary Byteの略 2の20乗バイト(1024の2乗バイト)
GiB ギビバイト(gibibyte) Giga binary Byteの略 2の30乗バイト(1024の3乗バイト)
TiB テビバイト(tebibyte) Tera binary Byteの略 2の40乗バイト(1024の4乗バイト)
PiB ペビバイト(pebibyte) Peta binary Byteの略 2の50乗バイト(1024の5乗バイト)