å¤ã RubyGems 㨠Bundler 2.1.1 ã®çµã¿åããã§ã¯ bundle exec ç°å¢ä¸ã§ bundler ãè¦ã¤ããããªãï¼ï¼
CircleCI ã® macOS ãã«ãã³ã³ããã§ fastlane ã使ã£ã¦ iOS ããã¸ã§ã¯ãã®ãã«ãããã¦ããã®ã ãã以ä¸ã®ãããªã¨ã©ã¼ãåºãããã«ãªã£ã¦ãã¾ã£ãã æ ¹æ¬çãªåå ã¯ããã£ã¦ãªããã©ãã¨ããããã¡ã¢ã¨ãã¦æ®ãã¦ããã
bundle exec fastlane tests [â ¦] ð bundler: failed to load command: fastlane (/Users/distiller/project/vendor/bundle/ruby/2.3.0/bin/fastlane) LoadError: cannot load such file -- bundler /Users/distiller/project/vendor/bundle/ruby/2.3.0/gems/fastlane-2.128.1/fastlane/lib/fastlane/plugins/plugin_manager.rb:5:in `require' /Users/distiller/project/vendor/bundle/ruby/2.3.0/gems/fastlane-2.128.1/fastlane/lib/fastlane/plugins/plugin_manager.rb:5:in `<class:PluginManager>' /Users/distiller/project/vendor/bundle/ruby/2.3.0/gems/fastlane-2.128.1/fastlane/lib/fastlane/plugins/plugin_manager.rb:4:in `<module:Fastlane>' /Users/distiller/project/vendor/bundle/ruby/2.3.0/gems/fastlane-2.128.1/fastlane/lib/fastlane/plugins/plugin_manager.rb:3:in `<top (required)>' /Users/distiller/project/vendor/bundle/ruby/2.3.0/gems/fastlane-2.128.1/fastlane/lib/fastlane/plugins/plugins.rb:9:in `require' /Users/distiller/project/vendor/bundle/ruby/2.3.0/gems/fastlane-2.128.1/fastlane/lib/fastlane/plugins/plugins.rb:9:in `<top (required)>' /Users/distiller/project/vendor/bundle/ruby/2.3.0/gems/fastlane-2.128.1/fastlane/lib/fastlane.rb:27:in `require' /Users/distiller/project/vendor/bundle/ruby/2.3.0/gems/fastlane-2.128.1/fastlane/lib/fastlane.rb:27:in `<top (required)>' /Users/distiller/project/vendor/bundle/ruby/2.3.0/gems/fastlane-2.128.1/fastlane/lib/fastlane/cli_tools_distributor.rb:41:in `require' /Users/distiller/project/vendor/bundle/ruby/2.3.0/gems/fastlane-2.128.1/fastlane/lib/fastlane/cli_tools_distributor.rb:41:in `take_off' /Users/distiller/project/vendor/bundle/ruby/2.3.0/gems/fastlane-2.128.1/bin/fastlane:23:in `<top (required)>' /Users/distiller/project/vendor/bundle/ruby/2.3.0/bin/fastlane:22:in `load' /Users/distiller/project/vendor/bundle/ruby/2.3.0/bin/fastlane:22:in `<top (required)>'
ã¨ã©ã¼è©³ç´°ã¨ç¶æ³
fastlane ã®ä¸ã® require 'bundler' ãã¦ããç®æã§ ãLoadError: cannot load such file -- bundlerã ã¨ããã¨ã©ã¼ãçºçãã¦ããã
ãã®ã¨ã©ã¼ãçºçããã®ã¯ Bundler ã®ãã¼ã¸ã§ã³ 2.1.1 ã使ç¨ãã¦ããæã§ãBundler 2.0.2 ã使ç¨ãã¦ããæã«ã¯åé¡ã¯èµ·ãããªãã£ãã Ruby ã RubyGems ã®ãã¼ã¸ã§ã³ã¯æ¬¡ã®éãã
$ ruby --version ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin17] $ gem --version 2.5.2.3
調æ»
ã¨ãããã Bundler ã®ãã¼ã¸ã§ã³ã«ãã£ã¦æåãéãã£ã½ãã®ã§ Bundler ã®ãã¼ã¸ã§ã³ãå¤ããªããæåã確èªãã¦ã¿ãã
# 両æ¹ã® Bundler ãã¤ã³ã¹ãã¼ã« $ sudo gem install bundler -v 2.1.1 Fetching: bundler-2.1.1.gem (100%) Successfully installed bundler-2.1.1 1 gem installed $ sudo gem install bundler -v 2.0.2 Successfully installed bundler-2.0.2 1 gem installed # Bundler 2.1.1 ã§ require 'bundler' ããå ´åã¯ã¨ã©ã¼ $ bundle _2.1.1_ exec irb irb(main):001:0> require 'bundler' LoadError: cannot load such file -- bundler from (irb):1:in `require' from (irb):1 from /usr/bin/irb:11:in `<top (required)>' from /Library/Ruby/Gems/2.3.0/gems/bundler-2.1.1/lib/bundler/cli/exec.rb:63:in `load' from /Library/Ruby/Gems/2.3.0/gems/bundler-2.1.1/lib/bundler/cli/exec.rb:63:in `kernel_load' from /Library/Ruby/Gems/2.3.0/gems/bundler-2.1.1/lib/bundler/cli/exec.rb:28:in `run' from /Library/Ruby/Gems/2.3.0/gems/bundler-2.1.1/lib/bundler/cli.rb:476:in `exec' from /Library/Ruby/Gems/2.3.0/gems/bundler-2.1.1/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run' from /Library/Ruby/Gems/2.3.0/gems/bundler-2.1.1/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command' from /Library/Ruby/Gems/2.3.0/gems/bundler-2.1.1/lib/bundler/vendor/thor/lib/thor.rb:399:in `dispatch' from /Library/Ruby/Gems/2.3.0/gems/bundler-2.1.1/lib/bundler/cli.rb:30:in `dispatch' from /Library/Ruby/Gems/2.3.0/gems/bundler-2.1.1/lib/bundler/vendor/thor/lib/thor/base.rb:476:in `start' from /Library/Ruby/Gems/2.3.0/gems/bundler-2.1.1/lib/bundler/cli.rb:24:in `start' from /Library/Ruby/Gems/2.3.0/gems/bundler-2.1.1/exe/bundle:46:in `block in <top (required)>' from /Library/Ruby/Gems/2.3.0/gems/bundler-2.1.1/lib/bundler/friendly_errors.rb:123:in `with_friendly_errors' from /Library/Ruby/Gems/2.3.0/gems/bundler-2.1.1/exe/bundle:34:in `<top (required)>' from /usr/local/bin/bundle:22:in `load' from /usr/local/bin/bundle:22:in `<main>' irb(main):002:0> exit # Bundler 2.0.2 ã ã¨åé¡ãªã $ bundle _2.0.2_ exec irb irb(main):001:0> require 'bundler' => false irb(main):002:0> exit
Ruby ã RubyGems ã®ãã¼ã¸ã§ã³ãä¸ããã¨èµ·ãããªã
ã¡ãªã¿ã« Ruby 㨠RubyGems ã®ãã¼ã¸ã§ã³ãä¸ããã¨ãBundler 2.1.1 ã使ã£ã¦ããã®åé¡ã¯èµ·ãããªãã£ãã
$ ruby --version ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-darwin17] $ gem --version 3.1.1 $ bundle exec irb irb(main):001:0> require 'bundler' => false
CircleCI ã® macOS ãã«ãã³ã³ããã 㨠chruby ã³ãã³ãã使ã£ã¦ Ruby ã®æ°ãããã¼ã¸ã§ã³ã使ããã£ã½ãã®ã§ (Xcode 10.1 ã®ã³ã³ããã§ç¢ºèª)ã対å¿çã¨ãã¦ã¯æ°ãããã¼ã¸ã§ã³ã® Ruby ã使ãããã«ããã®ãè¯ãããã
Terraform ã® remote ããã¯ã¨ã³ãã使ç¨ãã (tfstate ãã¡ã¤ã«ãå ±æã§ãã / apply ããªã¢ã¼ãã§å®è¡ã§ãã)
æ¦è¦
èæ¯
ããã¾ã§ Terraform ã local ããã¯ã¨ã³ãã®ã¿ã§ä½¿ã£ã¦ãã (tfstate ãã¡ã¤ã«ããã¼ã«ã«ãã¹ãä¸ã«ä¿æ) ã®ã ããã©ãè¤æ°ãã·ã³ã§ Terraform ã使ãããå ´åã«ä¸ä¾¿ã ã£ãã®ã§ããã¯ã¨ã³ãã«ã¤ãã¦èª¿ã¹ãã ããã§ãæè¿ã¯ remote ããã¯ã¨ã³ãã¨ãããã®ããã£ã¦ä¾¿å©ããã¨ãããã¨ãåãã£ãã®ã§ä½¿ã£ã¦ã¿ãã
ãã£ããã¨
ãã¨ãã¨ãã¼ã«ã«ãã¹ãä¸ã« tfstate ãã¡ã¤ã«ãä¿æãã¦ããããremote ããã¯ã¨ã³ãã使ãããã«å¤æ´ããã
éæ
- remote ããã¯ã¨ã³ãã§ Terraform Cloud ã使ãã®ã¯ãããªãç°¡åã«å§ãããã¦æ¥½ã ã£ã
- åãå
¥ããã®ã楽ã ãç¶æ
ä¿æã ããªãç¡ææ ã§ã§ããã®ã§ãå人ã®è¶£å³ããã¸ã§ã¯ãã¨ãã§ãæ°è»½ã«ä½¿ã£ã¦ãããã
- Terraform Cloud ãæ¢ã¾ã£ãã¨ãã¨ãã®ãªã¹ã¯ã¯å¤å°æ°ã«ãªãã
- ãªã¢ã¼ãå®è¡ããã¼ã éçºã§ä½¿ãã®ã«ä¾¿å©ããã ã£ã
ããã¯ã¨ã³ã (backend) ã¨ã¯
Terraform ã®ããã¯ã¨ã³ãã¨ã¯ãç¶æ (state) ã®èªã¿è¾¼ã¿æ¹æ³ããé©ç¨ (apply) ãªã©ã®æä½ã®å®è¡æ¹æ³ã決ãããã®ã ãã®æ½è±¡åã«ãã£ã¦ããã¼ã«ã«ãã¡ã¤ã«ä»¥å¤ã§ã®ç¶æ ä¿æ (tfstate ãã¡ã¤ã«ã®ä¿æ) ããªã¢ã¼ãå®è¡ãªã©ãå¯è½ã«ãªã£ã¦ããã ããã©ã«ãã§ã¯ local ããã¯ã¨ã³ãã使ããã¦ããã (ãã¼ã«ã«ãã¹ãä¸ã«ç¶æ ãã¡ã¤ã«ãä¿æãããªã©ã®é常åä½ã)
- åè : Backends - Terraform by HashiCorp
ããã¯ã¨ã³ãã使ç¨ããããã®è¨å®ã¨åæå
ããã¯ã¨ã³ãã®è¨å®ã¯ãTerraform ãã¡ã¤ã«ã§è¡ãããã terraform ã»ã¯ã·ã§ã³ã«ã以ä¸ã®ããã« backend ç¯ãæ¸ãã°è¯ãã¨ã®ãã¨ã
terraform {
backend "remote" {
address = "demo.consul.io"
scheme = "https"
path = "example_app/terraform_state"
}
}ããã¯ã¨ã³ãã使ç¨ããããã®å¤æ´ã®é©ç¨ã¯ terraform init ã§è¡ãããã ããæ¢ã«ãã¼ã«ã«ãã¹ãä¸ã«ç¶æ
ãã¡ã¤ã« (tfstate ãã¡ã¤ã«) ãããç¶æ
ã§æ°ãã«ããã¯ã¨ã³ãã®è¨å®ã追å ããå ´åããterraform init ãå®è¡ããã°ãã¼ã«ã«ããç§»è¡ãã¦ããã (ç§»è¡ãããã©ããã¤ã³ã¿ã©ã¯ãã£ãã«èãã¦ããã; èªåã®æå
ã§ local ãã remote ã¸ã®ç§»è¡ã確èª)ã
ã¾ããããã¯ã¨ã³ãã®è¨å®ã®ä¸é¨ã Terraform ãã¡ã¤ã«ä»¥å¤ã§è¨å®ããæ¹æ³ãããã (Partial Configuration ã¨å¼ã¶ããã)
- ã¤ã³ã¿ã©ã¯ãã£ã : ã¤ã³ã¿ã©ã¯ãã£ããªå ¥åãç¡å¹ã«ãªã£ã¦ããªãå ´åã¯ã¤ã³ã¿ã©ã¯ãã£ãã«èãã¦ããã
- ãã¡ã¤ã« :
terraform init -backend-config={file_path}ã¨ããæãã§ãè¨å®ãå¥ã«æ¸ãããã¡ã¤ã«ãæå®ã§ãã - ã³ãã³ããªãã·ã§ã³ :
terraform init -backend-config="{key}={value}" -backend-config="{key}={value}"å½¢å¼ã§æå®ã§ãã
ä¸è¨ã®æ¹æ³ã§ã¯ããã¯ã¨ã³ãã®ç¨®é¡èªä½ãæå®ãããã¨ãã§ããªã (ã§ãããï¼ ã§ããã®ããªï¼) ã®ã§ãåãã½ã¼ã¹ã³ã¼ããªãã¸ããªã使ã£ã¦ãã人ãã¡ãããããå¥ã®ããã¯ã¨ã³ãã®ç¨®é¡ã使ç¨ãããå ´åã«ä¸ä¾¿ã§ã¯â¦â¦ï¼ ã¨ä¸ç¬æã£ãã®ã ãã©ããã®å ´å㯠backend.tf ã¿ãããªãã¡ã¤ã«ãå¥ã«ç¨æã㦠(ããã¦ãã®ãã¡ã¤ã«ã¯ã½ã¼ã¹ã³ã¼ããªãã¸ããªã«ã¯ã³ãããããªããã¨ã«ãã)ãããã«ããã¯ã¨ã³ãã ãã®è¨å®ãæ¸ãã°è¯ãããã ã£ãã
remote ããã¯ã¨ã³ã
remote ããã¯ã¨ã³ãã使ç¨ããã¨ãTerraform Cloud (https://app.terraform.io/ ã¾ã㯠Terraform Enterprise) ã«ç¶æ ãä¿æããããTerraform Cloud ä¸ã§å¦çãå®è¡ãããã§ããã
ä»å㯠https://app.terraform.io/ ã使ç¨ããã ã¢ã«ã¦ã³ãã使ãã¦ãçµç¹ (organization) ãä½ãå¿ è¦ãããã VCS ã¨ã®é£æºãã§ããããããªãã¦ãè¯ãã
local ãã remote ã¸ã®ç§»è¡
ä¸è¿°ã®ã¨ãããTerraform ãã¡ã¤ã«ã«è¨å®ãæ¸ã㦠terraform init ããã°ç°¡åã«ç§»è¡ã§ããã ã¯ã¼ã¯ã¹ãã¼ã¹ã¯äºåã«ä½æãã¦ããå¿
è¦ã¯ãªãã (terraform init ã§ä½æãããã)
apply ãªã©ã®å¦çã®ãªã¢ã¼ãå®è¡
https://app.terraform.io/ ã®ç¡æã¢ã«ã¦ã³ãã§ã¯æ¬æ¥ã¯ãªã¢ã¼ãå®è¡ã¯ã§ããªãããè©¦ç¨æéãããã£ã½ãã¦ãªã¢ã¼ãå®è¡ã試ãã¦ã¿ããã¨ãã§ããã ãã¼ã«ã«ãã¹ãä¸ã§ terraform apply çã®ã³ãã³ããå®è¡ããã¨ããã¼ã«ã«ãã¹ãä¸ã®ãã¡ã¤ã«ã Terraform Cloud ã«éä¿¡ããã¦ãããã§å®è¡ãè¡ãããããã ã£ãã
(ã¯ã¾ãã©ãã) tfstate ãã¡ã¤ã«ã .auto.tfvars ãã¡ã¤ã«ã®æ±ã
ãã¼ã«ã«ãã¹ãä¸ã®ãã¡ã¤ã«ã Terraform Cloud ã«éãããéãtfstate ãã¡ã¤ã«ã .auto.tfvars ãã¡ã¤ã«ãéããã¦ããã£ã½ãã£ãã (ã©ã®ãã¡ã¤ã«ãéãããã®ãã¾ã§ã¯èª¿ã¹ã¦ããªãããå°ãªãã¨ããããã®ãã¡ã¤ã«ã¯éä¿¡ãããã£ã½ããã¨ã¯ç¢ºèªãã)ã
ãã®ãããtfstate ãã¡ã¤ã«ããã¼ã«ã«å´ã«åå¨ããã¨ãã¨ã©ã¼ã«ãªã£ã¦ãã¾ãã å ·ä½çã«ã¯ä»¥ä¸ã®ãããªã¨ã©ã¼ãçºçããã
------------ Terraform Enterprise System Message ------------
Terraform Enterprise detected a terraform.tfstate file in your working directory: <VCS-REPO>/terraform.tfstate
The presence of this file causes a state migration error which prevents Terraform from running successfully. To fix this error please migrate your local terraform.tfstate to Terraform Enterprise and make sure the the file is deleted from your version control system.
For step by step instructions on how to migrate your terraform.tfstate file from Terraform Open Source to Terraform Enterprise, please see:
https://www.terraform.io/docs/enterprise/migrate/index.html
-------------------------------------------------------------
Setup failed: Terraform Enterprise detected a terraform.tfstate file
.auto.tfvars ãã¡ã¤ã«ãéãããã®ã§ãã¼ã«ã«å´ã§å¤æ°ãå®ç¾©ãã¦ããå ´åã¯ç¹ã« Terraform Cloud å´ã§è¨å®ã追å ããªãã¦ãããã¾ã§éãåãã¯ãã§ããã ããè¤æ°ãã·ã³ã§åãããã«åããããã¨æãã®ã§ãTerraform Cloud ã®ã¯ã¼ã¯ã¹ãã¼ã¹ã® Variables ã§è¨å®ããæ¹ãè¯ãããã§ããã
(ã¯ã¾ãã©ãã) aws ãããã¤ãã§ profile ã§ã®èªè¨¼æ å ±æå®ãã§ããªã
ããã¯ããã§ Terraform Enterprise å´ã« AWS CLI ã¨ããã¤ã³ã¹ãã¼ã«ããã¦ããªãããããã£ã¼ã«è¨å®ããã¦ããªãã¯ããªã®ã§ããã¨ã㨠aws ãããã¤ãã§ profile ã«ããèªè¨¼æ
å ±è¨å®ããã¦ããå ´åã¯ããªã¢ã¼ãå®è¡ããããã«æ¸ãæããå¿
è¦ãããã
ä¾¿å© : apply åã®ã¬ãã¥ã¼ãªã©ããã¼ã ã§å¯è½
ä¸è¨ã®å³ã®ããã«ãweb UI ä¸ã§ãªã¢ã¼ãå®è¡ã®æ§åã確èªã§ããã ä¸è¨ã®å³ã§ã¯éãã¦ããããplan ã®çµæãè¦ããã¨ãã§ãã¦ãweb UI ä¸ã§ confirm ãããã¨ãã§ããã

ãã¼ã ã§éçºãã¦ããéã«ã¯ãããã§ã¬ãã¥ã¼çãè¡ãããã¼ã«ãããã¨ãã§ãã¦ä¾¿å©ããã
ãInfrastructure As Codeã ã«æ¸ããã¦ãã ãã¯ã¼ã¯ããã¼ã«ã¬ããã³ã¹ãçµã¿è¾¼ã : æ¿èªãªã©ã®ããã¼ãèªååãã¦ãã°ã®ä¿æãªã©ããããã¨ã§ãæã§ã®æ¿èªãããè¯ããã®ã«ãªãã ã¨ããã®ãå®ç¾ããã«ããããããä»çµã¿ã使ããã¨è¯ãããã§ããã

Infrastructure as Code âã¯ã©ã¦ãã«ããããµã¼ã管çã®ååã¨ãã©ã¯ãã£ã¹
- ä½è : Kief Morris,å®®ä¸åè¼,é·å°¾é«å¼
- åºç社/ã¡ã¼ã«ã¼: ãªã©ã¤ãªã¼ã¸ã£ãã³
- çºå£²æ¥: 2017/03/18
- ã¡ãã£ã¢: åè¡æ¬ï¼ã½ããã«ãã¼ï¼
- ãã®ååãå«ãããã° (2ä»¶) ãè¦ã
èªãã : Infrastructure As Code
ã¤ã³ãã©ãã£ã¦ãããã¼ãã¨ããæ°æã¡ã§å»å¹´ã®ä¸ããã«èªãã ã

Infrastructure as Code âã¯ã©ã¦ãã«ããããµã¼ã管çã®ååã¨ãã©ã¯ãã£ã¹
- ä½è : Kief Morris,å®®ä¸åè¼,é·å°¾é«å¼
- åºç社/ã¡ã¼ã«ã¼: ãªã©ã¤ãªã¼ã¸ã£ãã³
- çºå£²æ¥: 2017/03/18
- ã¡ãã£ã¢: åè¡æ¬ï¼ã½ããã«ãã¼ï¼
- ãã®ååãå«ãããã° (2ä»¶) ãè¦ã
æ¬æ¸ã§ã¯æå (第 1 é¨) ã« ããªã Infrastructure as Code ãå¿ è¦ãªã®ãã ãInfrastructure as Code ã¨ã¯ä½ãªã®ããä½ãç®æãã¦ããã®ãã ã¨ãã£ã説æããå§ã¾ããInfrastructure as Code ã«é¢ãããµã¼ãã¹ããã¼ã«ã®ç´¹ä»ããªãããã ãã㦠2 é¨ã§ã¯ã1 é¨ã§ç´¹ä»ããããã¼ã«ãªã©ã使ã£ããµã¼ãã¼ã®è¿½å ã夿´ã¨ãã£ãã¤ã³ãã©ã¹ãã©ã¯ãã£ã®éç¨ã®ãã¿ã¼ã³ãç´¹ä»ãããã æå¾ã® 3 é¨ã¯ãã©ã¯ãã£ã¹ã§ãã½ããã¦ã§ã¢å·¥å¦ã®ãã©ã¯ãã£ã¹ãå¿ç¨ãããã¨ã Infrastructure as Code ã®ããã®çµç¹ã¨ãã£ãé¨åã®è©±ããªãããã
èªåã¯ãInfrastructure as Code ã¨ã¯ã¤ã³ãã©æ§æç®¡çãã³ã¼ãåãããã¨ã§æé ãåç¾ã§ããããã«ãããããã¼ã¸ã§ã³ç®¡çã§ããããã«ããããèªååã§ããããã«ãããã¨ãã¨ãããããã®çè§£ãããªãç¶æ ã§èªã¿å§ããã®ã ããæ¬æ¸ã§èª¬æããã Infrastructure as Code ã¯ã½ããã¦ã§ã¢å·¥å¦ã®ãã©ã¯ãã£ã¹ãå¿ç¨ãããªã©ããã¨ãã¨èªåãæ³å®ãã¦ãããã®ãããããã«é²ãã ãã®ã ã£ãã ã¾ããæ¬æ¸ã¯ ããªãããããèãæ¹ãããã®ãã ã¨ããææ³çãªé¨åãä¸å¯§ã«èª¬æãã¦ãããç´å¾ããããã å¦ã³ã®å¤ãè¯ãæ¬ã§ãã£ãã
ç¹ã«æ°ã«ãªã£ãå 容ã®ã¡ã¢ãææ³
- Infrastructure as Code ã®åå
- ç°¡åã«åç¾ã§ããã·ã¹ãã
- ä½¿ãæ¨ã¦ã«ã§ããã·ã¹ãã
- çµ±ä¸çãªã·ã¹ãã
- å復ã§ããã·ã¹ãã
- çµ¶ããå¤åããè¨è¨
- Infrastructure as Code ã®åå
- å®ç¾©ãã¡ã¤ã«ã®å©ç¨
- èªå·±è¨è¿°ã·ã¹ãã ã¨ããã»ã¹
- ãããããã®ããã¼ã¸ã§ã³ç®¡ç
- ç¶ç¶çãã¹ãã·ã¹ãã ãããã»ã¹
- 䏿夿´ã§ã¯ãªãå°å»ã¿ãªå¤æ´
- ç¶ç¶çã«ãµã¼ãã¹ãå©ç¨å¯è½ç¶æ ã«ä¿ã¤
- ãã¢ã³ããã©ã¸ã£ã¤ã«ã ã¨ããæ¦å¿µ : ã¹ãã¬ã¹ãåããã¨ãã«é常ãããå¼·ããªãã·ã¹ãã (ã¤ã³ã·ãã³ãçºçæã®å¯¾å¿ã¨ãã¦æ¹è¯ãããã¨ãããã©ã«ãã®å¯¾å¿ã¨ãã)
- ãã¹ã¿ãã¯ã ã®æ¦å¿µ : ä¸ã¤ã®åä½ã¨ãã¦å®ç¾©ã»å¤æ´ããããã¤ã³ãã©ã¹ãã©ã¯ãã£è¦ç´ ã®éå
- ã¹ã¿ãã¯ã®åä½ã§æ§é åãã¦ãã : åç´ãªæ§æã ã¨ã¹ã¿ãã¯ã¸ã®åå²ã®æ©æµã¯ãªããããªã½ã¼ã¹ã®å ±æãªã©ãããå ´åã«ã¯æå³ããã
- ã¹ã¿ãã¯éã®æ å ±ã®ããåãã«æ§æã¬ã¸ã¹ããªãå½¹ã«ç«ã¤
- ã·ã¹ãã ã®å質ã«ã¤ãã¦ãæ©è½çãªæ£ããã®åé¡ã ã¨æããã¦ãã¾ããã¨ãå¤ãããå®éã«ã¯å¤åã許ããã©ãããæ±ºããéµãæ¡ã£ã¦ãã
- é«å質ã·ã¹ãã ã¯å¾æ¥ãããç°¡åãã¤å®å ¨ã«å¤æ´ã§ãã
- ç¶ç¶çãªãã©ã³ãã®ãã¹ãã¯ç¶ç¶çã¤ã³ãã°ã¬ã¼ã·ã§ã³ã§ã¯ãªã
- ç¶ç¶çã¤ã³ãã°ã¬ã¼ã·ã§ã³ã¨ã¯ããã¹ã¦ã®ä½æ¥ããã©ã³ã¯ã§è¡ããã¦ããã¹ã¦ã®ã³ãããããã¹ãããããã¨ãä¿è¨¼ãããã å®å ¨ã«ãã§ãã¯ããã夿´ã ããæ¬çªã·ã¹ãã ã«é©ç¨ããããã¨ãä¿è¨¼ããããã«ã¯ç¶ç¶çããªããªã¼ãã¤ãã©ã¤ã³ã使ãã
- ææ³ã¨ãã¦ã¯ããã¨æããå®è·µçã«ã¯ã¬ãã¥ã¼çã©ãããã®ã ï¼ï¼ ã¨ããæ°ãããã (æ©è½ãå®å ¨ã«å®è£ ããåã®å°ãã夿´ã®ç¶æ ã§ãã©ã³ãããã¼ã¸ãã¦ãããããããå®è·µçãªæ°ãããã)
- 夿´ãã¤ãã©ã¤ã³ : ã½ããã¦ã§ã¢ã®ãããã¤ãã¤ãã©ã¤ã³ã«ç¸å½ãããã® (ã½ããã¦ã§ã¢ã®ãããã¤ã¨ã¯éããã¨ãåºå¥ããããã«èè ã¯ããå¼ãã§ãã)
- ç¶ç¶çããªããªã¼ã¯ç¶ç¶çãããã¤ã§ã¯ãªã : ç¶ç¶çããªããªã¼ (CD) ã¨ã¯ããã¹ã¦ã®å¤æ´ãããã«æ¬çªã«éãè¾¼ããç¶æ ã«é«ãããã¨ã ãããã¤å¤æãä¸ãããå¾ã¯ãã¼ã«ããããã¤ãã¦ãã (ã·ã¹ãã ã®ç¨¼åãæè¡çãªå¤æã«ãªãã®ã§ã¯ãªããã¸ãã¹ä¸ã®å¤æã«ãªã)
- ã¤ã³ãã©ã¹ãã©ã¯ãã£ã®å¤æ´ã®ãã¹ãã§ãã½ããã¦ã§ã¢ã®ãã¹ãã¨åããã使°´æºã®ãã®ãå¤ãã髿°´æºã®ãã®ãå°ãªããã (ãã¹ããã©ããã)
- ããã«éããããã¹ãã®ãã©ã¯ãã£ã¹ã¯çµæ§ã½ããã¦ã§ã¢ã®ãã¹ãã¨ä¼¼ã¦ããé¨åãå¤ããªã¼ã¨æãã
- ãªãªã¼ã¹ã¨ãããã¤ãåãé¢ãã¨ãããã©ã¯ãã£ã¹
- æ©è½ãã°ã«ã¨ãã¼ããã¦ã³ã¿ã¤ã 交æãã¿ã¼ã³ã¨ã
- ã³ã³ã·ã¥ã¼ã主å°ã®ã³ã³ãã©ã¯ã (CDC) ãã¹ã
- ã³ã³ã·ã¥ã¼ããæä¾ãããã¹ãããããã¤ãå´ã®ãã¤ãã©ã¤ã³ä¸ã§åãã
- ã½ããã¦ã§ã¢éçºã®ã¯ã©ã¤ã¢ã³ãã¨ãµã¼ãã¼éã§ã使ããã
- ã¯ã¼ã¯ããã¼ã«ã¬ããã³ã¹ãçµã¿è¾¼ã
- æ¿èªãªã©ã®ããã¼ãèªååãã¦ãã°ã®ä¿æãªã©ããããã¨ã§ãæã§ã®æ¿èªãããè¯ããã®ã«ãªã
- ã¼ããã¦ã³ã¿ã¤ã 夿´ã®ãã¿ã¼ã³
- ãã«ã¼ã»ã°ãªã¼ã³äº¤æ : ã½ããã¦ã§ã¢ã«ããããã«ã¼ã»ã°ãªã¼ã³ãããã¤ãã¿ã¼ã³ãã¤ã³ãã©ã¹ãã©ã¯ãã£ã«å¿ç¨ãããã®ã 2 ã¤ã®ã¤ã³ã¹ã¿ã³ã¹ç¾¤ãåãæ¿ãã
- ãã§ããã¯ã¹äº¤æ : ãã«ã¼ã»ã°ãªã¼ã³äº¤æãé²åããããã®ã 常ã«ã¤ã³ã¹ã¿ã³ã¹ç¾¤ã 2 ã¤ç¨æãã¦ããã®ã§ã¯ãªããå¿ è¦ã«ãªã£ãã¨ãã«æ°ãã«ç¨æãã
- ã«ããªã¢äº¤æ : å ¨ä½ã䏿°ã«åãæ¿ããã®ã§ã¯ãªããã·ã¹ãã å ¨ä½ã®ãã¡ã®ä¸é¨ãã¤ãæ°ãããã®ã«å¤ãã¦ããã å¤§è¦æ¨¡ã·ã¹ãã ã§ã¯ä¸è¨ã¯æ¡ç¨ã§ããªãã®ã§ããã®æ¹æ³ã«ãªã (Google ã Facebook ãªã©ã§æ¡ç¨)
- 伿¥ãå¤åãããã¼ãºã«å¯¾ãã¦ä¿¡é ¼ã§ããé«å質ã®ãµã¼ãã¹ã§å¿ãã¦ããããã®çµç¹é¢ã§ã®åå
- ãµã¼ãã¹ã®è¨è¨ãå®è£ ãæ¹è¯ã«å¯¾ãã¦ç¶ç¶çã«ã¢ããã¼ããã¦ãããã¨
- ç¶ç¶çã«ãµã¼ãã¹ãããªããªã¼ãæ¹è¯ããæ¨©éããã¼ã ã«ä¸ãããã¨
- ç¶ç¶çã«ã¹ãã¼ãã£ã«å¤æ´ãããªããªã¼ãã¤ã¤ãé«ãå質ã¨ã³ã³ãã©ã¤ã¢ã³ã¹ãä¿è¨¼ãããã¨
- å¹ææ¸¬å®ã ç®æ¨ã¨ç¶æ³ã«åºã¥ãã¦å½¹ã«ç«ã¤ãã®ã鏿
- ã¤ã³ãã©ãã¼ã ãè¯ã使ã£ã¦ããã®ã¯ãªã¼ãã¿ã¤ã ãå¹³å修復æé (MTTR)ãå¹³åæ ééé (MTBF)ãå¯ç¨æ§ãæ¬ç©ã®å¯ç¨æ§ãªã©
- ã¦ã¼ã¶ã¼ã«åãä¸ããçµç¹
- ãã©ã¯ãã£ã¹
- ã»ã«ããµã¼ãã¹ã¢ãã« (使ã人ãä½ã)
- Dev 㨠Ops ã (æ§ç¯ãéç¨ã) åããã¼ã : éç¨æã®åé¡ããæ§ç¯ã®ãã¼ã ãå¦ç¿ãã¥ãã
- è·è½æ¨ªæåãã¼ã : è¤æ°ã®ããã¸ã§ã¯ãã®éã§ãã«ãã¿ã¹ã¯ãããªãå¿
è¦ããªããªããå¹ççã«
- ãã®ãã¼ã ã§ã¯å°éæ§ã®ç¶æã«èª²é¡ãããããããã©ã¤ãã ãªã©ã®ãã¼ã 横æåã®ã³ãã¥ããã£ã§å¯¾å¿
- è·è½åå²ã¢ãã«ã«ã¯è½ã¨ãç©´ããã
- è¨è¨ã®ç´°åå : è¨è¨ã¨ä»æ§ãä¸å¤®ã§ä½ããã¦ãå®è£ ã®ããã«æ§ã ãªãã¼ã ã«åé ãããã ãã¼ã ããã¯å ¨ä½åãè¦ããªã
- 峿 ¼ãªæ¥ç¨ç®¡ç : åãã¼ã ãè¤æ°ããã¸ã§ã¯ãã«é¢ãããã¨ã«ãªãã®ã§ãæ¥ç¨ç®¡çãéè¦ã«ãªã£ã¦ãã
- é·ããªã¼ãã¿ã¤ã : ãã¼ã éã®ä½æ¥ã®ä¸ã¤ä¸ã¤ããªã¼ãã¼ããããçã
- ãã©ã¯ãã£ã¹
ç£è¨³ã®å®®ä¸ããã®ã¾ãããã«ãã ãæ°ããæè¡ç¨èªãåºã¦ããã¨ãé¢é£ãããã¼ã«ãããã»ã¹ã注ç®ãããããããå°å ¥ããã°èª²é¡ã¯è§£æ±ºãããã¨æãããã¡ã§ããã ãããã大åãªã®ã¯ãã®è¨èã®èå¾ã«ããææ³ãå²å¦ãçè§£ããé©åã«éç¨ãã人ã ã¨ããã®ãè¯ã#æ¸ç± #InfrastructureAsCode
— Nobuoka Yu (@nobuoka) August 10, 2018
ãå¤ãã®äººã ã¯ããã©ã°ããã£ãºã (ããªãã¡ãä»äºãçµãããããã¨) ã¨æè¡å質 (ããªãã¡ãä½ãã®æ£ãã) ããã¬ã¼ããªãã¨è¦ã¦ããããããã¯èª¤ã£ãäºåæ³ã ã
— Nobuoka Yu (@nobuoka) August 31, 2018
åºæ¬çã«è¨è¨ãã¡ããã¨ããªãããã¨ãã£ã¦éçºé度ãä¸ããã¨ãããã¨ã¯ç¡ããã ãã#æ¸ç± #InfrastructureAsCode
ã¦ã±ã
ãååã® Chris Bird ã¯ããã âDevOopsâ ã¨åä»ããã å¤ãã®ãã·ã³ã 1 度ã«ã¾ã¨ãã¦èªåçã«æ§æ/è¨å®ã§ããããã«ãªãã¨ãå¤ãã®ãã·ã³ã 1 度ã«ã¾ã¨ãã¦å£ããã¨ãã§ããããã«ãªãã®ã§ããã
— Nobuoka Yu (@nobuoka) September 10, 2018
ã¦ã±ã#æ¸ç± #InfrastructureAsCode
èªãã : ããããã Auto Layout â iOS ã¬ã¹ãã³ã·ããã¶ã¤ã³ããã¹ã¿ã¼
ååã® iOS ã¨ã³ã¸ãã¢æ°ã« ãAuto Layout ã«ã¤ãã¦ã¡ããã¨å¦ãã§ããã¨ããã§ããã ã£ã¦è¨ãããã®ã§èªãã ã

ãããããAuto Layout iOSã¬ã¹ãã³ã·ããã¶ã¤ã³ããã¹ã¿ã¼
- ä½è : å·ééä»,æå太
- åºç社/ã¡ã¼ã«ã¼: ãªãã¯ãã¬ã³ã
- çºå£²æ¥: 2016/06/17
- ã¡ãã£ã¢: åè¡æ¬ï¼ã½ããã«ãã¼ï¼
- ãã®ååãå«ãããã° (1ä»¶) ãè¦ã
èè ã«ããã¨ä¸è¨ã®ããã«æ¸ããã¦ãã¦ããã㨠iOS ã¢ããªéçºã®åå¿è åãã£ã½ãã ã¾ãã« iOS ã¢ããªéçºåå¿è ã§ããèªåã«ã¨ã£ã¦å¦ã³ã®å¤ãè¯ãæ¬ã ã£ãã
ããããããAuto Layoutãã¯Auto Layoutã¨ãµã¤ãºã¯ã©ã¹ã«ã¤ãã¦è§£èª¬ãã¦ããæ¸ç±ã§ããã¬ã¤ã¢ã¦ãã®åºç¤ãå æ¬çã«ç´¹ä»ããå¾åã§ã¯æ¥åã§ãã使ããã¿ã¼ã³ãã¾ã¨ãã¦ãã¾ããã¢ãã¾ã³ã®ç´¹ä»æã«ããã¨å¯¾è±¡è ã¯ã
éå»ä¸åº¦ã¯Xcodeãç¨ãã¦ã¢ããªãä½ã£ããã¨ãããããAuto Layoutã¨ãµã¤ãºã¯ã©ã¹ãç¨ããAdaptive Layoutã¨è¨ãããã¨ãã¤ã尻込ã¿ãã¦ãã¾ãã¢ããªéçºè ã«ã´ã£ããã®ä¸åã§ãã
ã¨ããæãã«ãªã£ã¦ãã¾ããåºæ¬çã«ã¯ãiOSã¢ããªéçºåå¿è ã«åãã¦æ¸ãã¦ããã®ã§ã"é»å¸¯ã¨ã³ã¸ãã¢"ã¿ãããªäººã«ã¯åãã¾ããã
「よくわかるAuto Layout」を執筆した話 - Jeffsuke is not a pen.
2016 å¹´ã®æ¬ãªã®ã§ææ°æ å ±ããªãç¹ã ãã¯æ³¨æãå¿ è¦ããã (ã¨ã¯ãã Auto Layout ã®åºç¤ãå¦ã¶ä¸ã§ã¯åé¡ãªãããã)
å¦ãã ãã¨
大éã®å¦ã³ããã£ãã
1 ç« : Adaptive Layout ãã¯ããã
- ãAdaptivityã ã¨ããã®ã¯ web ã§ããã¨ããã®ã¬ã¹ãã³ã·ããã¶ã¤ã³ã¿ãããªæãã æ§ã ãªãµã¤ãºã®ç»é¢ãªã©ã«é©åããããã« UI ãã¶ã¤ã³ãã
- iOS 8 ãããã¬ã¤ã (trait) ã¨ããæ¦å¿µãå°å
¥ãããã ç»é¢ãµã¤ãºãªã©ã®ç°å¢æ
å ±ãæ½è±¡çãªãªãã¸ã§ã¯ãã¨ãã¦æ±ãæ¦å¿µ
- ãã®ã²ã¨ã¤ã«ãµã¤ãºã¯ã©ã¹ (size class) ãããã ãµã¤ãºã¯ã©ã¹ã§ã¯å¹
ãé«ãã
Compactã¨Regularã«åé¡ - ãã¬ã¤ãã®å°å
¥åã¯ãç»é¢ãµã¤ãºã
UIScreen.mainScreen().bounds.size.widthã¿ããã«ã¨ã£ããã端æ«ç¨®å¥ãUIUserInterfaceIdiomã§ã¨ã£ãããã¦ã (ã¨æ¸ããã¦ããããç¾å¨ã§ã¯UIUserInterfaceIdiomããã¬ã¤ãã®ä¸ç¨®ã«ãªã£ã¦ãã£ã½ã)
- ãã®ã²ã¨ã¤ã«ãµã¤ãºã¯ã©ã¹ (size class) ãããã ãµã¤ãºã¯ã©ã¹ã§ã¯å¹
ãé«ãã
2 ç« : Auto Layout ã®åºæ¬æ¦å¿µ
- Auto Layout ã¨ã³ã¸ã³ã¯å¶ç´å¼ã®é£ç«æ¹ç¨å¼ãè§£ãã¦ã¬ã¤ã¢ã¦ããæ±ºå®ãã
- Auto Layout ã¨ã³ã¸ã³ã«ããè¨ç®ã«ããã¦ã¯ãåã³ã³ãã¼ãã³ãã®ãã¬ã¼ã ã§ã¯ãªã夿¥ç©å½¢ (Alignment Rectangle) ãç¨ãããã
- å¶ç´å¼ã¯
Item1.Attribute1 = Multiplier * Item2.Attribute2 + Constantã®å½¢ãNSLayoutConstraintã§è¡¨ç¾ããã- Constant (å¶ç´å®æ°) ã¯å¶ç´çæå¾ã«ã夿´å¯è½ã§ãç»é¢å転çã«å¯¾å¿ãããã
- çå·ã ãã§ãªãä¸çå·ãå¯è½
- å¶ç´ã«ã¯åªå 度ããã
- åè : Auto Layout Guide: Anatomy of a Constraint
- Intrinsic Content Size ã¯ãview ãä¿æããå
容ã®åºæã®ãµã¤ãºã ä»ã®å¶ç´ããªãå ´åã«ã¯ãã®ãµã¤ãºã使ãããããã
- Content Hugging Priority 㨠Content Compression Resistance Priority ã§ä¼¸ã³ç¸®ã¿ã®åªå åº¦ãæ±ºãããã
- Auto Layout 以åã«ã¯ Autoresizing ã使ããã¦ããã Auto Layout ã«ãå½±é¿ãã (
NSAutoresizingMaskLayoutConstraintã¨ããå¶ç´ã«ãªã)ã View ãã³ã¼ãã§çæããã¨ããã©ã«ãã§ã¯ Autoresizing ã Auto Layout ã®å¶ç´ã«å¤æãããã®ã§æ³¨æã (UIView.translatesAutoresizingMaskIntoConstraintsã§å¤æãããªãããã«è¨å®ã§ãã)
3 ç« : UIViewController ã¨ã¬ã¤ã¢ã¦ãããµãã¼ãããã¯ã©ã¹
- 表示ã®é層æ§é : ã¹ã¯ãªã¼ã³ (
UIScreen)ãã¢ããªã®ã¦ã£ã³ã㦠(UIWindow)ããã¥ã¼ã³ã³ããã¼ã©ããã¥ã¼ã³ã³ããã¼ã©ãæã¤ãã¥ã¼ - ã¢ããªèµ·åæã®ã«ã¼ããã¥ã¼ã³ã³ããã¼ã©ã®è¨å®æ¹æ³ã¯ã¹ãã¼ãªã¼ãã¼ãã使ããã©ããã§ç°ãªã
- ã¬ã¤ã¢ã¦ãã®ã©ã¤ããµã¤ã¯ã«ã¯ãå¶ç´ã®æ´æ°ããã¬ã¼ã ã®æ´æ°ãã¬ã³ããªã³ã°ã® 3 ã¹ããã
- ãã¬ã¼ã ã¨ã¯ï¼ï¼
- View controller ã®ã©ã¤ããµã¤ã¯ã« : èªã¿è¾¼ã¿ã表示ãã¬ã¤ã¢ã¦ããé表示
UIWindowã¯ã¦ã£ã³ãã¦ã ãã¼ãã¼ãã¨ããã¦ã£ã³ãã¦- ã¢ããªå
é¨ã§ã¦ã£ã³ãã¦ã®é
åãåããã
windowLevelã§éãªãé - ã¦ã£ã³ãã¦ãµã¤ãºã¨ã¹ã¯ãªã¼ã³ãµã¤ãºã¯åºå¥ãããã¨
4 ç« : Storyboard 㨠Auto Layout
- ã¢ããªèµ·åæã®ã¹ãã¼ãªã¼ãã¼ããããã°ã©ã ã§æå®ãã§ããã A/B ãã¹ãã¨ãã AppDelegate ã§
- ã¹ãã¼ãªã¼ãã¼ããã¨ã« Auto Layout ã®æå¹ç¡å¹ã®è¨å®ãã§ãã
- è¤æ°ãã¥ã¼ã« Spacing to nearest neighbor ãã§ãã
- Equal Width ãªã©ã§ 2 ã¤ã®ãã¥ã¼ã«ãµã¤ãºã®å¶ç´ãã¤ãã¦ãã以å¤ã®å¹ ã®å¶ç´ããªãå ´åã¯å¤§ããæ¹ã® Intrinsic content size ã使ããã (Content Hugging Priority 㨠Content Compression Resistance Priority ã ã¨å¾è ã®ã»ããé常ã¯åªå )
- Align Panel ã§ãã¥ã¼éã®ä¸¦ã³æ¹ã決å®ã 宿°ãæå®å¯è½
- Stack ãã¿ã³ãæ¬æ¸ã®ä¾ã¨ã¯å¤ãã£ã¦ããï¼
- IB (Interface Builder) ã§ãã¥ã¼ã Control ãã©ãã°ãããã¨ã§ãå¶ç´è¿½å ã§ããã Document Outline Control ä¸ã§ã
- IB ã§ã®ãã¥ã¼ã®ãã¼ã¸ã³è¡¨ç¤º : Editor > Canvas > Show Layout Rectangles
- IB ä¸ã§è¿½å ããå¶ç´ã¯
IBOutletã§åç §ã§ãã - å¶ç´ã« Identifier ãã¤ãããã¨ãã§ãã¦ãã¨ã©ã¼ã¡ãã»ã¼ã¸ãªã©ããããããããªã£ããã³ã¼ãããåç §ã§ããããã«ãªã£ãã
- xib ã§ç¬èªãã¥ã¼ãä½ãã
- iOS 8 以éã®ç«¯æ«ã®ã¿ãµãã¼ãã§ããã° Xcode 7 ã§å°å ¥ããã Storyboard Reference ã§åå²ã§ããã ãããªããã°ã³ã¼ãã§åå²
- Bundle ã®æ¦å¿µã¨ã¯ï¼ â ã¢ããªããã¬ã¼ã ã¯ã¼ã¯ããã®ä»ã®ç¨®ã ã®ã³ã³ãã³ããªã©ã表ããã®ãããã
5 ç« : ã³ã¼ã㨠Auto Layout
- å¶ç´ (
NSLayoutConstraint) ãã³ã¼ãä¸ã§çæããæ¹æ³ã¯ 3 ã¤ã æ®éã«ã¤ã³ã¹ã¿ã³ã¹åããã®ã¨ãVFL (Visual Format Language) ãç¨ããæ¹æ³ã¨ãNSLayoutAnchorãã¡ã¯ããªã¼ã¯ã©ã¹ãç¨ããæ¹æ³ - VFL ã¯ã¢ã¹ãã¼ã¢ã¼ãã¿ãããªãã¤ã ãããã°ä¸ã®ã¨ã©ã¼ã¡ãã»ã¼ã¸ã«ãåºã¦ããã®ã§ä¸å¿å½¢å¼ã¯ç¥ã£ã¦ããã¨ããã¨ã®ãã¨
NSLayoutAnchorãããããã iOS 9.0 以é- å¶ç´ãä½ã£ããã¨ã¯æå¹åãå¿
è¦ã iOS 7 以åã®ãµãã¼ããå¿
è¦ãªããã¥ã¼ã«è¿½å ããã iOS 8 以éã ãã§ãããªãå¶ç´ã®æå¹åãè¡ãã è¤æ°å¶ç´ãæå¹åããããã®ä¾¿å©ã¡ã½ããããã (
NSLayoutConstraint.activateConstrains) - å¶ç´ã®åé¤ãç·¨éãã§ããã ç·¨éã§å¶ç´å®æ°ã夿´ããã»ããå¶ç´ã®åé¤ã¨è¿½å ããã³ã¹ããä½ãããã
- iOS 9.0 以éã§ã¯
UILayoutGuideã§ç©ºéã表ç¾ã§ããã Android ã®Spaceã£ã½ããã©ãSpaceã¨éã£ã¦ view ã§ã¯ãªããããã Xcode 7.3 æç¹ã§ã¯ IB ä¸ã§çæã§ããªã (ã¾ãã)
6 ç« : å®è£ åºæ¬ãã¿ã¼ã³
- 親ãã¥ã¼ã«å¯¾ããå²åã§å¹ ãé«ããæå®ã§ããã Multiplier ã§ã
- Android ã§ããã¨ããã®
Spaceã¿ãããªãã®ã¯UIViewãéæã«ãã (ã¾ãã¯ä¸ã«æ¸ããUILayoutGuide)- éæã«ããã»ããããã©ã¼ãã³ã¹æªãããèæ¯è²æ±ºã¾ã£ã¦ããªãèæ¯è²æå®ã®æ¹ãè¯ãããã
- View ãåé¤ãããã䏿çã«é表示ã«ãã¦å¾ããæ»ãã¨ãããããªå¦ç (æ¬æ¸ã§ã¯ãã«ãã¡) ã¯é£ãã
- View ãåé¤ããã¨ãã® view ã«é¢é£ããå¶ç´ãåé¤ããããã
UIScrollViewã®å 容ãµã¤ãºã Auto Layout ã§æå®ãã (ãããªããã°ã³ã¼ãã§æå®ããå¿ è¦ããã)- ä¸è¿°ã®ã¨ãããAutoresizingMask ãå¶ç´ã«å¤æãããªãããã«ããæ¹ã (æé»çã«å¶ç´ã追å ããã¦æ··ä¹±ãããã¨ãããã¨ããªãã®ã§) è¯ãå ´åãå¤ãããxib ãã¡ã¤ã«ã«ã¬ã¤ã¢ã¦ããã«ãã»ã«åããã view ã
UITableCellViewã«è¿½å ããå ´åãªã©ã¯ Autoresizing ãæå¹ã«ãã¦ããã¨ä¾¿å©ã£ã½ã (ããããã¨è¦ª view ã®ãµã¤ãºã«èªåçã«åãããã«ãªãã®ã§) UIStackViewã¯ãview ãç¸¦ãæ¨ªã«ä¸åã«ä¸¦ã¹ã viewã å¶ç´ãèªåã§è¿½å ããã¨ãèªåã§ Auto Layout ãã¦ãããã®ã§ä¾¿å© (Android ã§ããã¨ããã®LinearLayoutã£ã½ãæã)
7 ç« : å®è£ å¿ç¨ãã¿ã¼ã³é
UITableViewã®ã»ã«ã®é«ããæå®ããæ¹æ³ã¯ 3 ã¤ã åºå®ã®é«ããä¸ããæ¹æ³ã¨ãã»ã«ãã¨ã«è¨ç®ããæ¹æ³ã¨ãSelf-Sizing Cells ãä½¿ãæ¹æ³ (iOS 8 以é)ã- ãªãã¹ã¯ãªã¼ã³ã§ã®ã¬ã¤ã¢ã¦ãã®éã«
UILabelã®ãµã¤ãºãè¦ãã«ã¯preferredMaxLayoutWidthãè¨å®ããå¿ è¦ããã - ãã¼ãã«ã®ã¹ã¯ãã¼ã«é åå
¨ä½ã®é«ãè¨ç®ãæåã«å®è¡ãããã®ã§ãã»ã«æ°ãå¤ãå ´åã¯ããã©ã¼ãã³ã¹ã«åé¡ãèµ·ããããã iOS 7 以éã ã¨
estimatedRowHeightã§å¯¾å¦ã§ãã - Dynamic Typeãã¦ã¼ã¶ã¼è¨å®ã«åããã¦ãã©ã³ãã®ãµã¤ãºã夿´ããä»çµã¿
- ãã©ã³ããµã¤ãºãæå®ããã®ã§ã¯ãªãããã¹ãã¹ã¿ã¤ã«ãè¨å®ããã
UIContentSizeCategoryDidChangeNotificationã®éç¥ã¸ã®å¯¾å¿ãå¿ è¦- iOS 10 ããã¯ä¸é¨ view ã«ã¤ãã¦ã¯èªåã§è¿½å¾ãã¦ãããããã«ãªã£ãã£ã½ã : iOSのDynamic Typeについて - Qiita
- åè : Scaling Fonts Automatically | Apple Developer Documentation
- ãã¼ãã¼ã表示æã«è¡¨ç¤ºä¸ã®å 容ããã¼ãã¼ãã«é ããªãããã«ããã«ã¯ç¬èªå¦çãå¿ è¦
- ç»é¢å転ã¸ã®å¯¾å¿ã¯ãiOS 8.0 以éã¨ããããåã§æ¹æ³ãç°ãªã
- å転æã®ã¬ã¤ã¢ã¦ã夿´ã¯å¶ç´ã®æå¹åã¨ç¡å¹åã§ããã®ã (å¶ç´ã®è¿½å ã¨åé¤ããã) ããã©ã¼ãã³ã¹çã«ã¯è¯ã
UIViewControllerTransitionCoordinator.animateAlongsideTransitionã«å¶ç´ã®å¤æ´ãè¨è¿°ãããã¨ã§ãç»é¢å転ã®ã¢ãã¡ã¼ã·ã§ã³ã¨åæãã¦åãããã«ãªãããã
8 ç« : Auto Layout ããããã°ãã
- ãããã°ã«ç¨ãããã¨ãã§ãã Auto Layout ã®æ å ±ã¯ : IB ãã£ã³ãã¹ããã³ Document Outline Control ä¸ã¨ Issue Navigator ä¸ã¨å®è¡æã®ã³ã³ã½ã¼ã« (ãã®ç« ã§ã¯ä¸»ã«ã³ã³ã½ã¼ã«ã®è©±)
- ææ§ãªã¬ã¤ã¢ã¦ããã©ããã¯
hasAmbiguousLayoutã§ç¢ºèªã§ãããexerciseAmbiguityInLayoutã§ã©ã³ãã ã«ãã¬ã¼ã ã夿´ã§ãã - ããã¥ã¡ã³ãåããã¦ããªã便å©ãªã¡ã½ããããã
- å¶ç´ã®è¡çªã¯ã³ã³ã½ã¼ã«ãã°ã確èªã
UIViewAlertForUnsatisfiableConstraintsã®ã·ã³ããªãã¯ãã¬ã¼ã¯ãã¤ã³ãã§ãæãããã - å¶ç´ã« Identifier ã追å ããã®ã¨ã軸ããã¥ã¼ãã¨ã«å¶ç´ã確èªãã
- ãã¥ã¼ãããã¬ã¼ã Xcode 6 ã§è¿½å ããã¦ãã å¶ç´ã®è¡¨ç¤ºãã§ãã
- åè : Specialized Debugging Workflows
9 ç« : ãµã¤ãºã¯ã©ã¹ã¨ãã¬ã¤ãã³ã¬ã¯ã·ã§ã³
- ãã¬ã¤ãã³ã¬ã¯ã·ã§ã³ã ãã¥ã¼ã¿ãã«ãªã®ã§æé©ãªå¤ãæã¤ï¼ï¼ ã¿ãããªãã¨ãæ¸ããã¦ããããã¥ã¼ã¿ãã«ã¨ãã表ç¾ãããããããªãã (ä¾ãã°ã¢ããªã®ã¦ã£ã³ãã¦ãã¹ã¯ãªã¼ã³ãããå°ããå ´åã«ã
UIScreenãæã¤ãã¬ã¤ãã³ã¬ã¯ã·ã§ã³ã®ãµã¤ãºã¯ã©ã¹ã¯ Regular ã ãã©UIWindowãæã¤ãã¬ã¤ãã³ã¬ã¯ã·ã§ã³ã®ãµã¤ãºã¯ã©ã¹ã¯ Compact ã«ãªããã¿ãããªãã¨ããªã¼ã¨æã£ã¦ããã ãããã£ã¦ããã©ããã¯ä¸æ) - ç»é¢å転
- IB ã«ããã¦ãµã¤ãºã¯ã©ã¹ã«å¿ããã¬ã¤ã¢ã¦ããå¯è½
ææ³
Auto Layout ã¯ãã¡ããã®ãã¨ãview ã®é層æ§é ã view ã®ã¬ã³ããªã³ã°ã®ã©ã¤ããµã¤ã¯ã«å¨ããªã©ã«ã¤ãã¦ãå¦ã¶ãã¨ãã§ãã¦ãé常ã«è¯ãæ¬ã ã£ãã
åå¿è ãªããã« ãiOS ã® view å¨ãã«ã¤ãã¦å¿ èªã®ä¸åãªã®ã§ã¯ãªããã ã¨æã£ãã
é¢é£
- Building Adaptive User Interfaces - Apple Developer : Apple ã® Adaptive UI ã®ããã®æ å ±éã
èªãã : ããããã¤ãã iPhone ã¢ããªéçºå ¥é â Swift ã§ã¯ãããããã°ã©ãã³ã°ã®ç¬¬ä¸æ©
使 ã iOS ã¢ããªéçºã«é¢ãããã¨ã«ãªã£ãã®ã§ iOS ã¢ããªéçºã«ã¤ãã¦å¦ãã§ããã
ã¨ãããã
ã® 2 ã¤ãèªãã§åºç¤ã®åºç¤ã ãããããã¨ããã§æ¬æ¸ãèªãã ã

- ä½è : è¤æ²»ä»,å¾³å¼ä½è¡£,å°æå å¥å,å°æç±æ²
- åºç社/ã¡ã¼ã«ã¼: SBã¯ãªã¨ã¤ãã£ã
- çºå£²æ¥: 2016/10/26
- ã¡ãã£ã¢: Kindleç
- ãã®ååãå«ãããã°ãè¦ã
æ°ãã«å¦ãã ãã¨
Foundation ãã¬ã¼ã ã¯ã¼ã¯å¨ã
Timerã¯ã©ã¹ ã§ã¿ã¤ãã¼å¦çã§ããUserDefaultsã¯ã©ã¹ ã§ãã¼ã¿ã®æ°¸ç¶åãUserDefaults.standardã§æ¨æºã®ã¤ã³ã¹ã¿ã³ã¹ãåå¾URLSessionã¯ã©ã¹ ã§ HTTP éä¿¡ã .dataTask ã§ã¿ã¹ã¯ç»é²JSONSerializationã¯ã©ã¹ ã§ JSON ã®å¦ç
UIKit ãã¬ã¼ã ã¯ã¼ã¯å¨ã
UIAlertControllerã¯ã©ã¹ ã§ã¢ã©ã¼ã表示ã 鏿è¢ãUIImagePickerControllerã¯ã©ã¹ ã§ç»åã½ã¼ã¹ã¨ãã¦ã«ã¡ã©å©ç¨å¯å¦ç¢ºèª- ã«ã¡ã©å©ç¨ã«ã¯ã¢ã¯ã»ã¹è¨±å¯ãå¿ è¦ã ãã©ãã©ã¤ãã©ãªã¸ã®ã¢ã¯ã»ã¹ã«ã許å¯ãå¿ è¦
UIActivityViewControllerã¯ã©ã¹ ã§ãã¼ã¿å ±æ
ãã®ä»ãã¬ã¼ã ã¯ã¼ã¯å¨ã
æ¬æ¸ã§åºã¦ãããã¬ã¼ã ã¯ã¼ã¯ã
- AVFoundation ãã¬ã¼ã ã¯ã¼ã¯ ã§é³æ¥½åççã§ãã
- MapKit ãã¬ã¼ã ã¯ã¼ã¯ ã§å°å³ãæ±ãã
- ãããã°æã«å°å³ä¸ã®è¡¨ç¤ºè¨èªãå¤ãããå ´åã¯ãXcode ã®ãã¼ã«ã©ã¤ãºè¨å®ã¨ç«¯æ«ã®è¨èªè¨å®ããã
- Core Location ãã¬ã¼ã ã¯ã¼ã¯ ã®
CLGeocoderã¯ã©ã¹ã§çµåº¦ç·¯åº¦ã¨ä½æã®å¤æãå¯è½ - Core Image ãã¬ã¼ã ã¯ã¼ã¯ ã¨ããç»åå¦çãã¬ã¼ã ã¯ã¼ã¯ããã
- SafariServices ãã¬ã¼ã ã¯ã¼ã¯ ã®
SFSafariViewControllerã¯ã©ã¹ ã§ web view å®ç¾
Swift è¨èªå¨ã
fileprivate修飾åã¨ãinternal修飾åã¨ãã§ã¢ã¯ã»ã¹å¶å¾¡ã§ããã
ãã®ä» iOS ã¢ããªå¨ã
- éãªã£ã¦ãã view ã® z 軸æ¹åã®éãªãé ã Interface Builder (IB) ä¸ã§å¤æ´ããã«ã¯ããã¥ã¡ã³ãã¢ã¦ãã©ã¤ã³ä¸ã§ã®åå¾ã®ä½ç½®ãå¤ããã°ãã
- ãªãã¸ã§ã¯ãã鏿ãã¦ãã¡ãã¥ã¼ã® Editor > Arrange > Send to Front ãªã©ã§å¤æ´ãããã¨ãå¯è½
- Xcode ã§ãã©ã¡ã¼ã¿æ å ±ãè¦ãã«ã¯ã«ã¼ã½ã«ãå½ã¦ã¦ Option ãã¼
- App Transport Security ã§éä¿¡ã®ã»ãã¥ãªãã£å¨ããè¦å®ããã
NSAppTransportSecurityãã¼- åè : Cocoa Keys
- iOS 10 ã§ããã©ã«ãè¨å®ãå¤ãã£ãããã
é¢é£ãã¦èª¿ã¹ããã¨
ãããããã¬ã¼ã ã¯ã¼ã¯ã¨ã¯ï¼
å ±æãªã½ã¼ã¹ *1 ãä¿æããæ§é åããããã£ã¬ã¯ã㪠(ãã³ãã«) ã®ãã¨ãããã
A framework is a hierarchical directory that encapsulates shared resources, such as a dynamic shared library, nib files, image files, localized strings, header files, and reference documentation in a single package. Multiple applications can use all of these resources simultaneously. The system loads them into memory as needed and shares the one copy of the resource among all applications whenever possible.
What are Frameworks?
A framework is a bundle (a structured directory) that contains a dynamic shared library along with associated resources, such as nib files, image files, and header files. When you develop an application, your project links to one or more frameworks. For example, iPhone application projects link by default to the Foundation, UIKit, and Core Graphics frameworks.
Framework
ææ³
ããªãä¸å¯§ã« Xcode ä¸ã§ã®æä½æé ãªã©ã®èª¬æãæ¸ããã¦ãã¦ãiOS éçºä»¥å¤ãå«ãã¦ããã°ã©ãã³ã°èªä½ã®åå¿è åãã¨ããæãã ã¨ããããæåã®ä¸æ©ã¨ãã¦ã¯è¯ãããã éçºçµé¨è ã§ããiOS ãåãã¦ãªãæ¬æ¸ãã°ã¼ã£ã¨èªãã§ä¸éãå¦ã¶ã¨ããä½¿ãæ¹ã¯ã§ãããã (ã¨ã¯ããå¤ãã®ã§ä»ã ã¨ä»ã«è¯ãæ¬ãããããã)
䏿¹ã§ã½ã¼ã¹ã³ã¼ãã«å¾®å¦ãªã¨ããããã£ãã *2ãããªã²ã¼ãã®èª¬æã¨ãã¯ãã¼ã¸ã£ã®èª¬æã¨ããå¾®å¦ã ã£ããããã®ã¯æ°ã«ãªã£ãã
*1:ãã¤ãããã¯ã·ã§ã¢ã¼ãã©ã¤ãã©ãªã nib ãã¡ã¤ã«ãç»åãã¡ã¤ã«ããã¼ã«ã©ã¤ãºãããæååãããããã¡ã¤ã«ããªãã¡ã¬ã³ã¹ããã¥ã¡ã³ããªã©ã
*2:ãAVAudioPlayerã®ä½¿ãæ¹ã ã®ã½ã¼ã¹ã³ã¼ãã¯ã¾ãã«æ¬æ¸ã®ãã®ã§ãAVAudioPlayer ã®åæåå¦çãã¡ãã£ã¨è¬ãªæ°ãããã