#85 xcodeproj & 今時の言語選定

どうも、esuiです。

ちょうどゴールデンウィークが始まる頃の発表の回ですね。
後日レポートになってしまい、すっかり忘れちゃってるところもあるのですが、まぁそれはそれということで…。




xcodeproj設定の最適化


第一部はxcodeproj設定の最適化についての発表でした。
例によって自分はXcodeを使っていないため、発表資料をまるっと転載気味なるのをご了承ください…。

xcodeprojとは


ファイル(パッケージ)の拡張子。
Xcode プロジェクトのソース・リソースファイルやらビルド設定を統合管理してるファイルの事のです。

よく見られるケース


- 別環境ビルド設定が必要になったけど面倒だからターゲットコピーして書き換えよう
- 環境で読み込むリソース変える必要があるけど、面倒だから両方内包してコードでパスを変えよう
というのがよくあるかもしれません。

が、これはやってはいけないとのことです。

ターゲットが変わると別のファイル・ビルド管理になってしまうこと、
リソースの内容にもよるが、セキュリティリスクを抱くことになる、というのが理由のようです。

xcodeproj 設定を最適化しよう


以下のように行うと良いとのことです。

# 環境変数値は User-Defined(xcconfig) で設定する
- ビルドスキームと xcconfig を増やして、それぞれの環境に応じた設定を行う。
- アプリ名やバンドルID、サーバURLなどの単なる文字列であればこれで十分。

# info.plist のキャッシュを無効にする
User-Defined(xcconfig) の値のみを変更した場合、ビルド時にinfo.plist が更新されないことがある。
Preprocessed-Info を有効にし、ビルド時にスクリプトでタイムスタンプを更新することでキャッシュを無効化できる。
# Run Script
touch "${TEMP_DIR}/Preprocessed-Info.plist"


# info.plist を書き換えて設定する
ネストされている項目や Bool 値の場合、Preprocessed-Infoを有効にし、PlistBuddy を使用して info.plist の内容を書き換える。

# Run Script
plistBuddy="/usr/libexec/PlistBuddy"
PREPROCESSED_INFOPLIST_PATH="${TEMP_DIR}/Preprocessed-Info.plist"

if [[ "${CONFIGURATION}" =~ ^Development-.* ]]; then
DOMAIN="example.jp"
HTTP_LOADS="Add :NSAppTransportSecurity:NSExceptionDomains:${DOMAIN}:NSExceptionAllowsInsecureHTTPLoads bool YES"
TLS_VERSION="Add :NSAppTransportSecurity:NSExceptionDomains:${DOMAIN}:NSExceptionMinimumTLSVersion string TLSv1.0"
FORWARD_SECRECY="Add :NSAppTransportSecurity:NSExceptionDomains:${DOMAIN}:NSExceptionRequiresForwardSecrecy bool NO"

$plistBuddy -c "${HTTP_LOADS}" $PREPROCESSED_INFOPLIST_PATH
$plistBuddy -c "${TLS_VERSION}" $PREPROCESSED_INFOPLIST_PATH
$plistBuddy -c "${FORWARD_SECRECY}" $PREPROCESSED_INFOPLIST_PATH
fi


# 外部SDKの設定ファイルを環境に応じて変更する
Build Rules で特定ファイルのみに対して独自に処理(コピー)を行う。
Build Phases でスクリプトを追加してコピーしてもいいが、Build Rules でやるほうが楽。

# Source files with names matching: */GoogleService-Info.plist
# Custom script:
OUTPUT_FILE_PATH="${DERIVED_FILE_DIR}/${INPUT_FILE_NAME}"
if [[ "${CONFIGURATION}" =~ ^Development-.* ]]; then
INPUT_FILE_PATH="${TARGET_NAME}/Configurations/Development/${INPUT_FILE_NAME}"
fi
plutil -convert binary1 -o "${OUTPUT_FILE_PATH}" -- "${INPUT_FILE_PATH}"


まとめ


OS のアップデートやアプリのバージョンアップの際、商用のターゲットに反映漏れなどで障害となりかねないため、
少なくとも継続的な開発が見込まれる場合は初めから共通・自動化できるところはなるべく行っておくべきである。
また、重大なセキュリティリスクとはならないだろうが、商用のアプリには開発環境の情報は一切含めるべきではない。

とのことでまとめとされていました。




第二部は、

今時の言語選定



ということで、新入社員も勉強会に来ていたのでこれからプログラミング言語を学ぶ際に、何を選ぶか、どう学んでいくべきかについての考察の発表でした。

手元に発表資料が無いのでその一部だけをかいつまんでレポートします…。

最近ではモバイルアプリ・ゲームエンジン・人工知能、、などなど、
トレンドとなるものが次々と出てきており、今後も次々と出て来ることになると思いますが、
何の言語をやるかは、自分の立ち位置をどこに置くか、どうなりたいかによって当然変わってきます。

初学者がプログラミング言語を学びたいけど何からやっていいかが分からない、といったような場合、
例えばゲームが好きだったらC#だったり、
ゲームはさほどでもなく流行りのものを、となると今なら機械学習に強いPythonがおすすめかもしれない、
それにも興味が無い場合、結局は自分の興味がある言語を6個くらい選んでサイコロを振って決める、
とかでも良いんじゃないでしょうか、などといった提案をされていましたw

20年以上前の昔はBASICくらいしかなく、選択肢も無かったが、
今は流行りの言語を追っていくことで、流行りのイベント・トレンドの参加券を持てる、ということにもなりそうです、と。
例えばMastodonのissue
https://github.com/tootsuite/mastodon/issues
を見ると、その中身はほぼRubyになっているが、Rubyをやっていないとこのイベントの参加券すらも持っていないことになってしまいます。

結局のところ、ビッグデータだったらJava、AIだったら Python(TensorFlowとか)、3D/AR/VR分野であれば Unity C# か Unrealエンジンとか、そういった自分の興味のある分野から学ぶ言語を考えるのが良いのではないでしょうか、といったまとめとされていました。

確かに急激に来たMastodonなどを見ていると、Rubyをやっていないと参加券すら持てなくて寂しい思いをしてしまうなぁと感じますね…。
こういった流行・ブームから、自分で興味をもつ分野を選んで好きな言語を始めてみるのが最も近道なんでしょうかねぇ。

この記事へのコメント