5.1さらうどん

@giginetの技術ブログ。ゲーム開発、iOS開発、その他いろいろ

韓国のAppleカンファレンス、KWDC24でSwiftのCLIツール開発について話してきた

めっちゃ緊張した

オーガナイザーの @unnnyong の紹介で韓国のAppleカンファレンス KWDC24にプロポーザルを出し、採択されたので参加してきた 🇰🇷

実は国外登壇(物理)は初めてだった。2年ほど前にBitriseが主催のカンファレンスで英語で話したことはあったけど、当時はCOVID下だったこともあり、オンライン開催で、ほとんどフィードバックが得られずに残念だった。今回は満を持しての物理登壇!

何を話したの?

SwiftによるCLIツールの開発手法と、ネタ探し、ツール開発の始め方を網羅的に説明する内容になっている。その他、モバイルDevOpsエンジニアのロールや、実践例、これまでのツール開発の歴史などにも言及している。

なんとなくDevOpsには興味があるけど、どうやってツール開発をすればいいかわからない、とりわけ「何を作って良いかわからない」という疑問についてのアンサーを意識した。結論をまとめると「まずチーム内の課題を解決しよう。またOSSにすることでさらに洗練されるよ」という感じ。

"Creating Intuitive Developer Tool in Swift" というタイトルになっているが、内容とあまりリンクしていない。これは単に要項の提出締め切りが早く、その時点で中身が真っ白だったので、ChatGPTで苦し紛れに出したタイトルだから。本番でタイトルを変えても良かった・・・・・・。

トークの設計と戦略

トーク内容の設計は、中身の質が担保されているのは基本線として、コミュニティ特有の環境について強く意識する必要がある。

当然、聴衆の理解力やコミュニティ全体のレベル感を掴めなければ、適切な目線で話題を絞れないし、そればかりではなくノリ、すなわち技術トレンドやミーム、コミュニティ内の有力なプレイヤーのキャラクター性などに合わせてメタを張っていく必要もある。

日本のiOSコミュニティには最初期から参加していて、もはや勝手知ったるという状況だが、海外登壇の難しい点はこれらの前提情報を得られづらいところだ。今回は、コミュニティオーガナイザにも軽く状況を聞き、以下の戦略にした。

  • 自己紹介やプロダクト、これまでのOSS活動の紹介を厚めにした
    • わざわざ海外に行くのは、プレゼンス向上という目的が大きいので、国内コミュニティ以上に自分を知ってもらうことに専念した
  • iOSツール開発の歴史や、業務での活用例を交えて前提共有をしっかり
    • 韓国ではネイティブアプリ(特にiOS)のDevOpsを専業としているエンジニアは希ということで、ロールについてイメージを持ってもらうことを意識した
  • エモい寄りの話は盛り込みつつも薄めに
    • あまりエモに寄りすぎると、母国語を使わずに細かいニュアンスコントロールをして抽象度の高い話をするのは難しく感じた。結果、単に「コントリビューションして盛り上げていこうぜ」ぐらいに留めた
  • 網羅性を高めて、各トピックは簡単に。浅く広く
    • これは聴衆の適切な知識量が掴めなかったという理由の他に、上記同様、単にlanguage barrierで深い話がしづらいので、単に手法を列挙するだけに留めた

正直、準備の後半は日本語・英語両方のtranscriptの準備に疲れてきたり、締め切りがシビアだったので、最終的にはクォリティアップはあきらめ「完成したらえらい」ぐらいまで妥協している。さらに同時並行で3トラックあるため、裏番組に人が吸われてしまって人が来ない可能性も考慮し、めちゃくちゃ準備に時間をかけてもな、という気持ちもあった。

結果的にあえて網羅的な流れにしているものの、ぶっちゃけ、あまり深い話はできておらず、表面的な内容に終始してしまった。渡航の大きな目的がプレゼンス向上とネットワーキング、プロダクトの宣伝というところも大きかったので、トークとしては及第点かな・・・・・・。

トーク後の反響とAsk the Speaker

心配とは裏腹に、結果的に大きな会場が埋まる程度に盛況だった (めっちゃうれしい😭)

意外と満席近かった

トーク後はAsk the Speakerもあり、ある程度の聴衆が集まってくれた。

参加者に回答する筆者

結果、GitHubで良くアイコンを見ます、と言ってもらえて、思った以上に認知されていることがわかった。ありがたすぎる。

一番印象的だったのは、僕の日頃の発表資料を読み込んでいてくれて、日本語を機械翻訳しながら韓国で展開してくれてる人が来てくれたことだ。先日のiOSDC 2024の発表内容についていろいろディスカッションできた。

fortee.jp

Live Translation(後述)の様子

その開発者も仕事で大規模アプリケーションを扱っているようで、お互い大変ですねといった話ができて良かった。国内カンファレンス向けの発表であっても意外と見られていることがわかったので、英語での発信も今後は意識していきたい。

英語でトークしてみて

国際カンファレンスはやはり言語の壁が厚いが、今回はTranslation Sponsorとして、Flittoというサービスが提供されていた。

Flittoは、AI技術を用いたカンファレンス用のLive Translationサービスで、韓国に拠点を持つ会社らしい。特に韓日の翻訳はかなり完成度が高く、今年の東京ゲームショウでも採用されていたそうだ。

これにより日本語でもトーク可能だったが、わざわざ海外まで行って、英語での登壇経験を積まないとあまり意味がない気がしたので、敢えて英語で喋った。後に翻訳ログを見たところ、ご覧の通りほぼ完璧に認識・翻訳ができていた。

元の英語発表の認識結果

自動翻訳後、綺麗に日本語訳できている

トーク前は発音がとても不安だったが、40分話通せた上に、音声認識も良好だったことから大分自信がついた 💪

KWDCへのフィードバック

今回、参加してみて、カンファレンスについては少し以下のような部分が気になった。

懇親会(パーティー)の設計

パーティーが前日のスピーカーディナーのみだった。アフターパーティーに加え、一般参加者にはランチも提供されなかったため、スピーカー以外と懇親するオフィシャルな時間がなかった。

スピーカー同士は、スピーカーディナーや、後述のツアーのようなオーガナイザ陣からのおもてなしにより密にコミュニケーションを取ることができたが、全体的に聴衆とコミュニケーションを取る機会に乏しく、またトークへのフィードバックも得づらかった。もし一般参加者だったら、ぼっちだったに違いない。

スピーカーディナーはサムギョプサルで盛り上がった

オンラインフォーラムへの誘導の弱さ

また、オンラインフォーラムの整備や誘導も足りていなかった。韓国ではあまりXが普及していない(もしくは買収後に廃れた)ようで、日本のカンファレンスと違い、リアルタイムの情報収集にとても苦戦した。公式のハッシュタグの案内もなかったし、投稿もほとんどなかった。そのため、参加者がフィードバックしたり、発表資料が共有されたり、ということがなかった。

一応参加者用のDiscordもあったが、ほとんどの聴衆がjoinしておらず、運営が周知に使うのみでほぼ機能していなかった。

すでに国内のコミュニティにいる人同士はMastdonやLinkedInなどで交流しているのかもしれないが、外様からはその様子をうかがい知ることができず、物理空間の人の多さとは裏腹に、実際の盛り上がりを感じ取ることができなかった。韓国もそうだし、おそらく日本も同様に、他国から見て言語の壁が高く、ドメスティックな環境に閉じてしまう傾向は強いと思う。

これらから、総じて、聴衆とのコミュニケーションの難しさや、見通しの悪さが気になった。特に知り合いの少ない海外なので尚更。わざわざ海外まで行く理由のほとんどはコミュニケーションのため、これらが改善されるとありがたい。(当然、運営には別途伝えるつもり)

また、日本のコミュニティ(iOSDC)のような、ビール飲みながらLTを聞くというノリも好きなので、こういった部分もどんどん輸出していきたい。KWDCの開催は2回目で、まだまだ洗練されていないところも感じたので、今後の更なる発展に期待。

海外カンファレンスでコミュニケーションを取るために

上述の通り、無策で海外カンファレンスに行っても、ぼっち一直線になる可能性が高い。海外でコミュニケーションを取るためには以下を用意した方が良さそう。

とにかくスピーカーになる

重ね重ね、まずトークをしないと話かけてもらいづらい。それだけではなく、会話の際に英語に自信がなくとも、スピーカーという肩書きがあるだけで、かなり心の支えになるし、相手も敬意を持って聞いてくれる。行きたいカンファレンスにはまずCFPを出すべき。

SNSとプロフィール交換

事前にGitHubで有名になっておいた方が良いのはもちろんとして、それ以外にもSNSのトレンドが国やコミュニティによって違うので対策が必要。Xは日本以外では急速に廃れている印象を受けている。

直近のWWDC渡航でもそうだったが、海外ではやたらとLinkedInのIDを聞かれる。日本ではほとんど普及していないので放置していたが、しっかり整備していった方が良いと感じた。

日本だと外資のオポSPAMが来まくるサービスというイメージしかないが、スライドの共有などもLinkedInのフィード上で行われることが多いようだ。

今回特有かもしれないが、AirDropによる連絡先交換も多用された。日本だとiMessageや連絡先情報は、かなりプライベート性が高いので、交換可能な状態にしていった方が良い。やりとりもかざすだけなのでスマート。

会社の名刺のほかに、アイコンのステッカーを配るとコミュニケーションに便利だった。名刺をもらっても誰かわからないので、SNS IDとアイコンを渡すのが一番効果的だと思う。これは日本でもそう。

また、今回は別途NFCで連絡先が交換できる電子名刺の MEET を作って行ったら、珍しさも手伝い重宝した。オススメ。

覚えてもらえビリティ

これも日本でもそうだが、派手髪なので覚えてもらいやすく有利だった気がする。「アイコンと同じだよ〜」とか言ってアイスブレイクもできて便利。髪を赤くしよう。

ソウル弾丸ツアー 🚅

カンファレンスの翌日は、オーガナイザ陣にソウルツアーに連れて行ってもらった。観光地に行ったり、ピクニックしたり、夜景を見たり。

本当に弾丸ツアーといった感じで、1日盛りだくさんで非常に疲れたが、現地のメンバーのおもてなしを強く感じた 🫶 また、1日みっちり一緒にいたため、とても仲良くなれた。本当に良くしてもらって、感謝の言葉が尽きない。

最終的に意気投合してソウルの繁華街、梨泰院(イテウォン)で2時まで飲んでいた。一時期『梨泰院クラス』にハマっていたので、現地の雰囲気を見に行けて良かった。ハロウィン時期だったのもあり、治安が崩壊していて、現地のメンバーの案内がなければ一人で行くのは厳しかったと思う。

飲酒すると、とりあえず無限に英会話できるようになるので、やはり酒は全てを解決する。

海外カンファレンスでトークしよう!

前述のように、日頃の情報発信やオープンソース活動は意外と見られていて、業界はとても狭いなあと感じた。そして、様々な人から感謝を述べられたことで、その言葉をもらうだけで行った価値はあった。プレゼンスの向上や活動範囲を広めるためにも、海外でのトークは最適なのでぜひ。

この記事で書いた、海外でトークする際の考え方や準備のポイントなどが誰かに役立つと幸いです。

XCTestCaseをswift-testingに自動変換するswift-testing-revolutionaryを作った

swift-testing-revolutionary

ほぼタイトル通りですが、先日XCTestで書かれたテストケースを、swift-testingのテストケースに自動変換する、swift-testing-revolutionaryというユーティリティを公開しました。Xだと流れてしまうため、せっかくなのでブログ記事でも告知しておきます。

自動変換されて便利

使い方

基本的にはREADMEをご覧ください。このツールは、Xcodeコマンドプラグイン、Packageプラグイン、Command Line Interfaceの3つの使い方をサポートしています。

超大雑把に以下のようなイメージを持っていただくと良いと思います。

導入方法 適応対象 導入の手間 カスタマイズ性
Xcodeコマンドプラグイン Xcodeプロジェクト
Packageプラグイン Swift Package
Command Line Interface 両方

アプリのテストケースなど、Xcodeプロジェクト内のテストケースを移行するにはXcodeコマンドプラグインとして利用するのがオススメ。GUIのみで簡単に導入、実行できます。

Xcodeコマンドプラグインの様子

ただし、Xcodeのコマンドプラグインの仕様が微妙すぎて、UnitTestターゲット全体しか変換対象に指定できませんGUIからファイル1つずつを変換対象に指定できれば便利だったのですが、Xcode側のサポートがされていないのでこれが限界です。

テストケース1つずつを変換したい場合は、CLIツールとして導入し、自分でファイル名を指定してもらうのが良いです。

$ swift-testing-revolutionary path/to/Tests/ViewModelTests.swift path/to/Tests/RepositoryTests.swift

また、プロダクトの性質上、一度変換してしまうともう使わないツールとなってしまうので、アプリケーション・パッケージの依存関係に含めるよりも、自分でバイナリを管理した方が利用しやすいかもしれません。Swift Packageをバイナリとして管理する方法は標準の良い方法がなく、現状Mintなどを使って入れるのが楽に思います。

swift-testingを導入していく

swift-testingの一番の利点は、既存のテストケースに変更を加えずに、今後追加するテストケースのみを簡単に新しいものに移行できる点です。また、簡単なブリッジングを書けば、Xcode 15.3 + Swift 5.10でも利用することができます。というわけでXcode 16を待たずとも今日から使えます!*1

今後は、新規テストはswift-testingで記入していくようにして、既存のテストコードの移行にこのツールを活用してもらえれば良いと思います。

ただ、このツールは既存のテストケースを機械的にswift-testingのコードに変換するだけなので、読みやすく、メンテしやすいテストに変更するにはさらなる書き換えは不可欠です。 (例えばParameterized Testsを利用するなど)

書き換えを行う場合も、このツールで一度機械的に変換してから、新機能の対応を行っていくと楽なため、ぜひ第一歩として役立てていただければと思います。

作ってみて

実装の大部分はswift-syntaxのSyntaxRewriterを使って、良い感じにシンタックスを書き換えただけ。

SyntaxRewriterの利用方法は、id:KishikawaKatsumi 先生のMastering SwiftSyntaxのセッションが大変役に立った。

expectationの置き換えなど、似たような変換が繰り返される処理は良い感じに抽象化して書けたと思う。

細かいところでは、Swift Syntaxにおけるtrivia*2の扱いに苦戦した。

例えば、テストメソッドにMacroやグローバルアクターのような予めattributeがついていて、さらに改行やスペースが含まれているケースを綺麗に置換するのがかなり大変だった。

@MainActor
func testCanFetchProducts() async await
@MainActor
@Test
func canFetchProducts() async await

その他、さまざまなシンタックスを考慮する必要があった。Swiftは言語機能が多すぎる。いろいろ抜け漏れがあるかも知れないので、気付いたらissueを立ててもらいたい。全体的に大分テストケースが足りていない。

このプロダクトは今年のGWに勢いで作り始め、概ね完成していたのだけど、当時はWWDC24前で、Xcode 16に同等機能が含まれていたらすぐにオワコンになるじゃん、とドキュメントまで書いて1ヶ月ほどお蔵入りにしていた。WWDC24のあと、Xcode 16に同等機能がないことを確認して、次の日にはすぐにpublicにすることができた。

ちょうどWWDC24期間中は現地にいたこともあり、パーティーで出会った開発者に挨拶代わりに紹介するなど、会話のきっかけになって良かった。

しつこいぐらいに宣伝しまくった結果、誰かがSwift Forumで言及してくれたりしていて、とてもありがたい 😊

こういうものを作ったら、あらゆるところで発信しまくるのが重要だなと再実感した。このエントリもその一環。

どうぞご利用ください

どうぞご利用ください。利用報告などお寄せいただけたら嬉しいです。

*1:ただしXcode 15で実行するとIDEサポートがないため、とても見づらい

*2:改行やスペースなど、意味解析には影響を及ぼさないtoken

WWDC24に参加してきた

WWDC24に行った

今年は運良く当選したので、WWDC24に参加してきた。17, 19以来5年ぶり3回目の出場(23も会場には入れなかったが、現地にはいた)

著者近影

23年は仕事で現地まで行ったが、会場には入れず、参加者の様子を見聞きしただけで厳密な比較はできないけど、今年は昨年に比べて参加者がかなり増え、日本からの渡航者も増えていた印象だった。

COVID以降初の参加だったが、今年は大分COVID前のコンベンションセンター時代の盛り上がりが戻っていたように感じた。

0日目:registration

初日はInfinite Loop(旧Apple本社)にてregistration。バッヂを受け取って終わりかと思ったら、そのままビールが提供されたり、参加者と懇親できるようになっていた。COVID前のWWDCを想起させるノリだった。

ビールを片手にご機嫌の著者

公式のコンテンツはないが、知り合いや初対面の方含め、いろんな人と雑談する。

夜はパーティーで紹介してもらった韓国から来たDeveloper集団の宿にお邪魔して交流したりとわいわいしていた。

1日目:Keynote + Special Event

現地時間の月曜はKeynote、朝6時半前には現着してApple Park前で待機。かなり早く行ったけど、8時前ぐらいまで入場はできずに、列の形成もファジーな感じだった。ここまで張りきらなくても結果的には前の方に座れたので、7時半ぐらいに行くので十分かもしれない。 (とはいえコンベンションセンター時代には徹夜組もいたので、本当に毎年いつから並べば良いか読めない)

8時過ぎたらPark内に入場できて、朝食などが振る舞われた。 期間中は事あるごとに食事が提供されたが、どれも美味しくて驚く。以前のWWDCは雑なランチボックスが5日間提供され続けていて、かなり食傷していたけど、とても食事の質が上がっていた。しかも参加費が無料だからビックリ。

Keynote前には朝食も用意されてメッチャ美味かった

ようやっとKeynote。発表内容は他の記事に譲るけど、やはり毎年とてもプラットフォームの進化にワクワクする。茶番のクオリティも年々上がっていて楽しませてくれる。

Tim CookとFederighiが出てきてテンション上がる

その後、後述のLabに行ったり、Xcode 16を試したりしていた。

同僚の@___freddi___ と仕事中

今回、Swiftのメジャーバージョンがあることは自明であり、開発中のアプリのビルドがちゃんと通るかを心配していたが、事前の予想に反してSwift 5モードの互換がかなりしっかりしており、少しの変更で開発環境を作ることができた。終わった後のビールが美味い。

電源、ネットワークのブースが屋外で、炎天下の中作業していたけど、熱中症のリスクがあるので気をつけた方が良い。

In Person Lab

今年の特徴として、わずか3時間ほどではあったが、COVID前のIn Person Labが部分的に復活していたのは良かった。ビルド+Xcode Labがあったので、予め用意していたld(linker)周りの質問を持って行った。

In-Person Labでビルドについてディスカッションした

In Person Lab、やはりOnline Labと比べて体験が段違い。対面であることのコミュニケーションのしやすさもそうだが、その場で操作を変わってくれたり、ホワイトボードでディスカッションできたりと、Online Labで同等の体験は難しい。

また、Online Labではミーティングの参加者しか対応してくれないが、In Person Labでは、わからないところは周りのエンジニアを呼んできてくれて教えてくれるのも大きい。

最終的に屈強なビルドエンジニアが4人も集まってきて見てくれた

ここでわいわいすることこそがWWDCの真骨頂だと思うので、来年はぜひ日数を伸ばしてほしい。

2日目:Special Session

2日目火曜日はわずかに1時間ほどのセッションがあるのみ。昨年は「Apple Vision Proのアプリ作ってね〜」という基調講演的な内容だったと聞いていて、今年はApple Intelligence(以下AI)関連かな、と思っていたが、案の定そんな感じだった。

セッション自体は撮影や録画禁止だったので、中身の記録はないが、会場は小規模なホールで、登壇者が生で話してくれるのは体験が良かった。

Special Session、小規模なホールで開催された

撮影禁止とは言え、コンフィデンシャルな話がされていたわけではなく、AIに対応していくための既存のセッションの内容の再紹介といった感じで、気になる方はIntent周りのセッションを見ると、大体内容が把握できると思う。終盤はApple Vision ProでのARや、AIを使った体験設計の話で、セッションにはない内容だった。

技術的な話は、要約すると「App Intent作ってほしい〜」と言った話だった。App Intent自体はSiriやSpotlight、Widgetsなどを連携するために以前からiOSに存在するが、AIの登場により「通貨」のような側面が強くなってきたなと感じた。今後数年のAIの普及や、将来的なApp Intentの用途の拡大を見越すと、徐々にIntentを充実させる投資を行っていかないと、将来的なアプリの進化が行き詰まってしまうかもしれない。

他にもAssistant Schemaの解説があった。

Integrating your app with Siri and Apple Intelligence | Apple Developer Documentation

Assistant Schemaはアプリ上の手続きをSiriやAIが解釈可能な形で提供するためのブリッジの役割を果たす仕組みだ。 Intelligenceというと、なにか抽象的なインプットで、魔法のように全て良い感じにしてくれるものを想像してしまうが、実際は開発者が泥臭く手続きを記述するものなんだなという印象だった。開発者が泣くことでエンドユーザーが魔法のような体験を得ることができている。

開催期間中

開催期間中は、日中はAirbnbで仕事をしつつも、今年は日本人も多く、日々様々なミートアップが開かれていたので、毎日パーティーピープルをしていた。

到着日に開かれた日本人nomikaiや、世界中の参加者とのMeetup、Swiftコミュニティによる10周年イベントと暇をする時間がなかった。

Swift 10周年おめでとう〜

昨年は週末までいたが、後半時間を持て余したので、今年は木曜昼には現地を離れた。そのため、Online Labやセッション動画の鑑賞、新技術の検証がほとんどできなかったのが心残り。 例年に比べて全体的に薄味な印象だったのでなんとかなった。

今年の総評

正直、昨年の新プラットフォーム(Apple Vision Pro)の発表が大きすぎて、今年はそれに比べると大きな発表はなかったと思う。

しかし、例年の傾向から大きな発表は数年に一度なので「今年は繋ぎの年っぽいなあ」という察しは事前にあって、良くも悪くも予想の範疇ではあった。

Swift AssistやApple Intelligenceも現段階では触れるところが限られているし、OS機能の強化も順当なものであった。 開発環境もSwift 6が出ることや、言語の新機能は、ほとんどオープンソースコミュニティで発表や議論が尽くされていたし、Xcodeの変化も目新しいものはなかった。

WWDCの前から、生成AIの普及とデバイスの高性能化に伴って、クラウドからローカルAIへの再評価が始まりつつあるな、と感じていたが、Apple Intelligenceの発表によりそのトレンドが強固なものになったのを感じた。 この領域は、ネイティブエンジニアに利があると思うし、ネイティブに投資していくのはまだまだ将来性が高いのではないかと考えている。

Apple Intelligenceは現時点では、A17 Proを始めとする高性能端末でしか動作せず、アーリーアダプター向けの機能ではあるけど、今後2〜3年ほどで普及機にも浸透し、生活に欠かせないものになっていく未来が見える。 その時に備えて今からどんどん投資していきたい。

Apple Vision Pro

今回、ついに日本発売が決まったので、帰りの飛行機で速攻注文した。(¥784,200 💸)

レンズの購入などが煩わしく、現地では敢えて購入しなかったので楽しみに発売を待とうと思う。

高い買い物なので、せっかくだから何か開発しようかなあ。