SwiftPackageManagerでつまずいたこと
こんにちは。デスクワークで腰痛が悪化し続けているあおいです。
SwiftPackageManagerに関してつまずいたことがあったのですが、解決策書いてる記事が殆ど無かったのでメモしておきます。
SwiftPackageManager とは
SwiftPackageManager(以下SwiftPM)とは、Swiftのソースコードで構成されたパッケージを、依存関係の解決やバージョン管理をしつつ利用できるようにしてくれるパッケージ管理ツールです。
以前はコマンドラインからの実行のみ可能でしたが、Xcode11以降はXcodeに統合され、iOSアプリのプロジェクトでもSwiftPMのパッケージが利用できるようになりました。
つまずいたポイント
SwiftPMで作ったパッケージをコマンドラインから
$ swift test
でテストを実行すると以下のエラーが出ました。
'dispatchPrecondition(condition:)' is only available in macOS 10.12 or newer
Xcodeから実行したテストは通ってるし、実行してるPC自体のOSはとっくにmacOS10.12より新しいのにどういうことだろう…
となったので、オープンソースであるSwiftPMのソースコードの中身を詮索してみました。
すると以下の記述を発見。
特に指定しない場合、macOSのターゲットバージョンは勝手に10.10にされてしまうようですね。
ここで挙がったdispatchPrecondition(condition:)
のターゲットSDKはmacOS10.12以上なので、macOS10.10では動かんよということみたいです。
以下のオプションを足してターゲットを上書きすることで成功しました。
$ swift test -Xswiftc "-target" -Xswiftc "x86_64-apple-macosx10.12"
対称のパッケージがmacOSをサポートしてるなら、Package.swift
のplatformにmacOSバージョンを指定してあげても成功します。
あ、ちなみに、iOS向けのライブラリとかで利用するときにplatformにiOSのみを指定しても、swiftコマンドによる実行は必然的にmacOS上でのビルドになります。
詰まるところmacOS向けでないものはswiftコマンドでのビルド・テストはする必要はないのかも。
それにしてもこの最低バージョンが強制的に指定されるのには何か理由があるのでしょうか…
せめてPackage.swiftにmacOS以外の設定がされてる場合はそもそもビルドされないの方が嬉しいかもしれません。
このあたり気になるのでもう少し実装みてみようかなと思います。
このへん詳しい方は是非教えて下さい🙏
Swift Days Fukuokaに参加してきました
Swift Days Fukuokaとは
全国のSwiftに何らかの関係があるエンジニアが、福岡に一斉に集まって情報共有をする3日間(1/24 ~ 26)のイベント(connpassより引用)です。
会場はLINEさんの福岡オフィスを使わせて頂きました。
- 1日目:HAKATA Test Night
- 2日目午前:みんなでSwift復習会
- 2日目午後:HAKATA.swift + Swift愛好会
- 3日目:わいわいswiftc 番外編ワークショップ
私は2日目午後から参加してきました。
HAKATA.swift + Swift愛好会について
とくに細かいテーマはなく、iOS・Swiftに関するトピックが幅広く取り上げられたトークセッションと、談義と呼ばれるLTタイムがありました。
談義の時間は、かっちりとしたスライドをつくらなくてもOK、時間もある限り好きなだけ話してOK、話してる最中でもちゃちゃ入れOKなので、みんなでゆるっと盛り上がってる感じが楽しかったです。
トークの詳しい内容は、connpassのページの資料とTwitterのハッシュタグを見ていただければと思います。
セッションの合間や夜の懇親会で、たくさんのSwift開発者と知り合えたのがとても楽しかったです。
写真は懇親会のときに食べたもつ鍋。博多といえばこれでしょ
わいわいswiftc 番外編ワークショップについて
テーマは「SILをOptimizeしてみよう」
SwiftコンパイラはSILGenのフェーズでSIL(Swift Intermediate Language)と呼ばれる中間言語に変換して、LLVM IRに変換します。LLVM IRに変換する前の、SILの最適化を行うフェーズについて取り上げたのが今回のワークショップでした。
フレディ(@freddi)先生による講義→実践課題を繰り返すスタイルで、課題は基本的にSILOptimizerのコードを自分で書いてみるというものでした。
難易度の感じ方は人に依ったと思いますが、個人的にはハマりまくったのでかなり難しかったです。(C++も初めて書いた)
フレディさんはじめいろんな人に助けてもらいながらなんとか課題の3題中2問まで完成させることができました。
ワークショップ参加後の今は、参加前に読んだ@kitasukeさんの書かれたSILの本の内容がよりスッと入ってくるようになった気がします。
まとめ
勉強会で遠征したのは今回が初めてだったのですが、全国のSwift開発者と繋がれたり、自分がこれから勉強していくためのきっかけになる知識を得られたりと、とても実りある遠征になりました。福岡の美味しいものいっぱい食べれたのも良かったです。
準備や当日の発表・運営をしてくださった皆さん、懇親会などでお話してくださった皆さん、ありがとうございました!
次はtry!Swiftでお会いできるのを楽しみにしています。
余談
私はとにかく飛行機が嫌いで、とりわけ着陸が苦手なのですが、帰りはたまたま同じ便だったおもち(@omochimetaru)さんが隣の席で、着陸態勢の間ずっと話しててくださったおかげで恐怖も頭痛もほとんど無く着陸することができました。(感謝)
すなわち会話してることで気が紛れる上気圧変化にも強くなるようなので、今後飛行機で遠征するときは誰か話し相手として一緒に乗ってください、おねがいします。
2020年やりたいこと100
昨日ややさんがこちらの記事を公開されてました。
おなじようにやりたいことを宣言してる方がたくさんいたので、感化されて私もやってみたいと思います。
元日中には間に合いませんでしたが、今年の終わりにどれだけ達成できたかを振り返ります(覚えてたら)
開発
- 中途半端になってる個人開発をやりきる
- 個人アプリを2つ以上リリースする
- コンパイラの本を読み切る
- DDDの本を読み切って理解する
- カンファレンスのcfpを出す
- 勉強会で登壇する
- コンパイラの本を読み切る
- 行けなかったSwiftコンパイラインターンの内容を再現する
- 勉強会でいろんな人に話しかける
- 考え込みすぎる前に質問する
- OSSにコントリビュートする
- 自作ライブラリを作ってみる
- バックエンドの開発にチャレンジする
- Androidアプリ開発をやってみる
- 技術書展などで何か執筆する
- 得意言語を一つでも増やす
- 応用情報とる
- Swift UI完全に理解する
- Qiitaやブログでアウトプットを定期的にする
ちなみに中途半端になってるものとしては、友達と作ってたアプリ1つと、途中まで作ってたfastlaneのpluginがあります。とりあえずこれは絶対終わらせたい。
あれもやりたい、これもやりたいになってできてなかったことをすこしでも最後までやりきるようにしたい気持ちです。
仕事
- 連絡を早くする
- 仕事中にできなかったことをその日のうちに家でもう一回振り返り、復習する
- 考えすぎる前に人に相談する
- 見つけたことは同じチームの人にどんどん共有する
- アジャイルの知識を学ぶ
- 教えるときはとりあえず自信持って話す
- 自分の仕事がなぜ必要かを意識する
- 自分の関わるサービスを自分でたくさん使う
- 身近なユーザーの声を聞いてみる
- 人に質問するときのマイルールを作る
せっかく社会人になる前に内定先でアルバイトをさせてもらってるので、技術だけでなく仕事のスキルも磨きたいですね。
学業
- 研究室のメンバーと議論する
- 学会に行く
- 学会に論文出す
- 研究会で英語の発表に挑戦する
- 一回一回のゼミを大事にする
- 各種論文を計画的に進める
- アカデミック英語のスキルを上げる
- 研究室でゲームしない
- 関連する論文や本を積極的に読む
学生の本業は学業であることを忘れがちなので、今年はいつも念頭においておきたいです。
研究室でゲームしないとかここに書くのかという感じですが、何気にむずかしいやつなのでがんばります…
生活
- 2時までに寝る
- 9時までに起きる
- お酒飲みすぎない
- 深夜に物食べない
- アイス毎日食べない
- ラーメンは週1に留める
- 週1以上ジムに通う
- ジム行けなくても筋トレする
- 自炊の頻度を増やす
- 会社でランチ作る
- 得意料理を見つける
- 頭痛薬を月に一箱以上買わない
- 何も食べずに鎮痛剤飲まない
- 毎日肩のストレッチする
- 鎮痛剤の用法用量を守る
- 早めに家さがしする
- 引っ越しに向けて少しずつ断捨離する
- 1年以上着てない服をとっておかない
- 書類整理をちゃんとやる
- 納税について勉強する
- モニターを買う
- iPhone買う
- AirPodsPro買う
- 学割が効くうちにMacBookPro買い換える
なんか他の方に比べて自堕落で不健康な生活ぶりが浮き彫りになる目標ですが、私にはこれを達成できたらえらいというやつなのです。
整体師さんに怒られ続けてるので、今年こそ頭痛を減らして薬を減らしたいな…
経験・趣味
- 斎藤一のお墓参りに会津に行く
- 土方歳三のお墓参りに函館に行く
- 新選組縁の地を訪ねて京都に行く
- 100名山どこか登る
- 家族旅行に行く
- 海外旅行に行く
- 伊豆の海を見に行く
- 高校の友だちと早めに集まる
- Switch版のうたプリをやる
- エヴァの新劇場版を最新作公開までに見返す
- 積んでる本を読む
- フェスに行く
- ELLEGARDENかスピッツの出るライブに行く
- グランピングに行く
- 乗ったことのない新幹線に乗る
- コミケに行く
- インナーカラーをちゃんとメンテする
- 服をいろいろ着回す
要するにオタ活充実させたいみたいな話になります。
こういうのを日々の糧にできると良いなあと思います。
精神
- 自分を責めない
- 自分を卑下しない
- 奢らない
- 謙虚でいる
- 周りの人への感謝をわすれない
- 自分のことを棚にあげない
- 素直に謝る
- 相手の話を先に聞く
- 頭ごなしに人の意見を否定しない
- 怒る前に落ち着く
- 人に流されない、自分の芯をもつ
〜しないばかりになってしまいましたが、実践できれば自分も周りも気持ち楽になれるかなあと思います。
対人
- はじめましてを怖がらない
- いろんな趣味嗜好の人と話す
- 家族との時間を多めに作る
- 初めてのコミュニティに入ってみる
- 定番自己紹介を考える
- 同期との交流を大事にする
- 誕生日を知ってる人におめでとうを伝える
- 相手の気持ちになって考える
人とどれだけ話してきたかがその人の経験値になるという話を知り合いが言っていたので、それを標にたくさん交流したいです。
まとめ
皆さん仰る通り100個は多いですね…汗
この中で少しでもちゃんと達成できてることがあれば、1年後自分を褒めてあげたいと思います。
というわけで、今年もどうぞよろしくお願いします!
Azure Devops PipelineでiOSアプリのCIを設定してみた
Azure Devopsが大変優秀だということで、リポジトリ管理からスプリント管理まで全部をこちらにまとめてしまおうという動きがアルバイト先でありました。
それに伴って、今までCircle CI動かしてたパイプラインをAzureのPipelineに移行しました。
その設定の際の知見をまとめたいと思います。
Azure Devopsについて
Azure Devopsでは、アジャイル計画ツールやGitリポジトリのホスティングサービス等、チーム開発に必要なツールがひとつにまとまっていて、それをプロジェクトごとに管理することができます。
チームメンバー5人までなら無料で始めることができるので、最初からお金をかけたくない・少しずつ移行していきたいというチームにもおすすめ。
無料でもプライベートリポジトリは何個でも作ることができますが、Pipelineに関しては並列実行ができない・ビルド時間月1800分までという制限が付きます。
Pipelineの設定
azure-pipelines.yml
をプロジェクトのルートに作成し、その中にパイプラインの処理を書いていきます。
タスクは、画像のようなAzure Devops上のタスク一覧からGUIで追加すると、yamlファイルにコードで起こしてくれます。
ローカルでyamlを編集するのでも良いのですが、Devops上で編集するとインデントのミス等をその場で指摘してもらえるのでとても便利です。
基本的な設定はドキュメントを見てもらうと良いので、私自身が苦戦した所・ややこしいところだけピックアップしてお話します。
躓いたポイント
xcWorkspacePathはオプションだが自分で指定しないといけない
Xcode BuildタスクのxcWorkspacePath
という項目は自身で設定しなくても動くオプション項目です。
そのため最初は、こういうのは設定しなくてもよしなにxcworkspaceを見つけてきてくれるだろうと思ってそのまま動かしたら、何やら違うプロジェクトのxcworkspaceを開こうとして、指定されたSchemaがないと怒られる。
おかしいなと思ってxcWorkspacePath
のデフォルト値を確認すると、**/*.xcodeproj/project.xcworkspace
になっている。
どうやらCarthageのCheckoutフォルダ配下のいずれかのライブラリのxcworkspaceを開こうとしてしまってたみたいですね。
ここをApp名.xcodeproj/project.xcworkspace
にしてあげることで解決しました。
ちなみに、Cocoapodsを使ってるプロジェクトの場合はApp名.xcworkspace
を指定してあげると良いです。
インストール先のPathを指定するとキャッシュがうまくいかない
bundle installする際はいつも --path vendor/bundle
にpath指定でやってたのですが、ここでpathを指定するとキャッシュがうまくいきません。
bundle installすると(Pipeline.Workspace)/.bundle
配下に入るので、そこを参照しに行くようになってるみたいです。
ちなみに、現在このキャッシュタスクはベータ版でキャッシュをクリアする機能がありません。
そのため、設定途中でクリアしたいとなったらバージョン名(v0, v1等)をつけたりしてキャッシュのキーを変えることで対応ができます。
ブランチの指定の仕方がややこしい
指定ブランチへのマージ・PRのオープン等を引き金としてテストを発火させることができるのですが指定するブランチがややこしい(主観)ので注意が要るなと感じました。
trigger:
で指定したブランチは、そのブランチへのpushとマージで発火します。(ここは普通)
pr:
で指定したブランチは、指定したブランチに向けたPRがオープンされたら発火します。(ここがややこしい)
完成形
ざっとiOSアプリのCIに必要な処理を書いた設定ファイルがこちらです。
bundle installはfastlaneを使った処理をあとから追加したくて書いてます。
trigger: - develop pr: - develop - master pool: vmImage: 'macos-latest' variables: MINT_PATH: $(Pipeline.Workspace)/.mint BUNDLE_PATH: $(Pipeline.Workspace)/.bundle stages: - stage: Build jobs: - job: Build steps: - task: CacheBeta@0 inputs: key: v0 | gems | $(Agent.OS) | Gemfile.lock path: $(BUNDLE_PATH) displayName: 'Cache gems' - script: bundle install displayName: Bundle Install - task: CmdLine@2 inputs: script: brew install mint displayName: Mint Install - task: CacheBeta@1 inputs: key: v0 | mint | $(Agent.OS) | Mintfile path: $(MINT_PATH) displayName: Cache Mint - script: mint bootstrap displayName: Tools Install by Mint - task: CmdLine@2 inputs: script: 'sudo xcode-select --switch /Applications/Xcode_11.1.app/Contents/Developer' displayName: Xcode select - task: CmdLine@2 inputs: script: | # 秘密テキストの環境変数が指定できるので、そこに事前に取得したGithubのアクセストークンを設定しておく export GITHUB_ACCESS_TOKEN=$(GITHUB_ACCESS_TOKEN) mint run Carthage carthage bootstrap --no-use-binaries --platform iOS --cache-builds && echo '*** Resolved dependencies:' && cat 'Cartfile.resolved' displayName: Carthage Build - task: CmdLine@2 inputs: # ライブラリを使ってテスト用のモッククラスを作成するためのスクリプト script: mint run SwiftyMocky swiftymocky generate displayName: MockFile Generate - task: Xcode@5 inputs: actions: 'build' configuration: 'Debug' sdk: 'iphonesimulator13.1' xcWorkspacePath: 'App名.xcodeproj/project.xcworkspace' scheme: 'App名' xcodeVersion: 'specifyPath' xcodeDeveloperDir: '/Applications/Xcode_11.1.app' packageApp: false destinationPlatformOption: 'iOS' destinationSimulators: 'iPhone 8' displayName: Xcode Build - task: Xcode@5 inputs: actions: 'test' configuration: 'Debug' sdk: 'iphonesimulator13.1' xcWorkspacePath: 'App名.xcodeproj/project.xcworkspace' scheme: 'App名' xcodeVersion: 'specifyPath' xcodeDeveloperDir: '/Applications/Xcode_11.1.app' packageApp: false destinationPlatformOption: 'iOS' destinationSimulators: 'iPhone 8' displayName: Xcode Test
なお今回は一旦無料の枠の中でやっているので、並列実行処理はありません。
ビルド→テストの処理はこの前リリースされたマルチステージ機能を活かし、ビルド成功時のみテストを実行するという処理に書き換えても良いかなと思います。
まだまだCI初心者なので、間違ってたりアドバイスなどあればコメントおねがいします!
ZOZOテクノロジーズさんのインターンに参加してきた話と近況報告
9/12~9/27の間、ZOZOテクノロジーズさんのインターンに参加してきました。 今回のブログではその体験記と、近況報告を書きたいと思います。
ZOZOテクノロジーズさんでのインターンについて
私が参加したインターンシップはこちらです。 tech.zozo.com
このインターンに応募した理由は、もちろんiOSコースの募集があったというのもありますが、自分がZOZOTOWNの超ヘビーユーザーであることが大きかったです。
面接でもESでも、聞かれてもないのにZOZOTOWNへの愛をひたすら語ってました。
これは私の憶測ですがこのZOZOTOWNへの愛情表現(?)がインターン合格に一役買ったのではないかという気がしてます。
インターンの内容
私は念願のZOZOTOW iOSチームへの配属になりました。
取り組んだのはZOZOTOWNアプリのレガシーなコードのリファクタリングです。
これはインターンを開始する前に、メンターのばんじゅんさん(@banjun)やチームリーダーのあららさん(@arara_jp)と事前に話をして決めたタスクです。
具体的にはObjCのコードをSwiftに書き換えるという業務だったのですが、さすが私が高校生のときから使ってたくらい歴史の長いZOZOTOWNアプリ、一筋縄でひょいと移行できるようなコードではありません。
そんな癖のあるコードでも、メンターのばんじゅんさんが移行するコードを細分化して安全に移すためのヒントを与えてくださったり、Swiftらしい書き方をすごく意識して厳しくも温かいレビューをしてくださったりしたおかげで、日々楽しく学びながらリファクタリングに取り組むことができました。
PRのレビュアーには技術顧問である岸川さんにも入って頂き、なんかもう光栄すぎてそのPR持ち帰りたいみたいな気持ちでした(語彙力)
会社の雰囲気
インターン中は毎日違うチームの方とランチをセッティングして頂き、ZOZOテクノロジーズさんのメンバーと幅広く交流する機会が得られました。
いろんな方とお話して思ったことは、本当に楽しくて優しい方が多いということです。
それぞれのメンバーとはほんの1,2回のランチをご一緒しただけでしたが、就活の話や技術の話、ファッションの話からアニメ・ゲームの話まで、どんな話題でもみなさん真剣に私の話をきいてくださったし、私が聞いて興味深い話もたくさんして頂きました。
そんなメンバーだからこそだと思いますが、社員さん同士も皆とても仲が良いです。
社内の雰囲気がとても穏やかなのに、仕事はきちっとこなすというのがとても良き風土だと感じました。
インターンを終えて
実は私がインターンで入社した日の朝、世間を騒がせたZOZOグループ買収のニュースがあったので、最初はなかなか複雑な心境でした。
しかしながら、社員の皆さんはそんな大きな変化に気を落とすこともせず、むしろ変化を楽しんでいるという様子。
社名や組織体制が変わっても、やることは変わらない。それが皆さんの信念としてあるようでした。
皆さんが同じ方向を向いているからこそ、メンバー同士の仲の良さも際立つのかなという気がします。
私も、こんな風に強い信念を持って仕事に打ち込みたいと考えさせられた10日間でした。
選考から長くに渡りお世話になったZOZOテクノロジーズの皆さん、ありがとうございました!
最終日に頂いた、インターン中に関わった39名からの嬉しいメッセージ、大切にします。
近況報告
私のサマーインターンラッシュは9月いっぱいで終了したので、今後のことを含めここで少し近況報告です。
10月からサマーインターンでお世話になったクックパッドさんで再び長期アルバイトをさせていただいています。
部署はサマーインターンのとき同様モバイル基盤部で、メンターはなんと偉大なるぎぎにゃん先生(@giginet)です。
自分は割とシュッと質問するのが得意じゃなかったりするのですが、せっかくの貴重すぎる機会を無駄にしないように、時間を大事に使って頑張りたいと思います(戒め)