Swift Days Fukuokaに参加してきました

Swift Days Fukuokaとは

全国のSwiftに何らかの関係があるエンジニアが、福岡に一斉に集まって情報共有をする3日間(1/24 ~ 26)のイベント(connpassより引用)です。

会場はLINEさんの福岡オフィスを使わせて頂きました。

  • 1日目:HAKATA Test Night

testnight.connpass.com

  • 2日目午前:みんなでSwift復習会

cswift.connpass.com

  • 2日目午後:HAKATA.swift + Swift愛好会

hakata-swift.connpass.com

  • 3日目:わいわいswiftc 番外編ワークショップ

iosdiscord.connpass.com

私は2日目午後から参加してきました。

HAKATA.swift + Swift愛好会について

とくに細かいテーマはなく、iOS・Swiftに関するトピックが幅広く取り上げられたトークセッションと、談義と呼ばれるLTタイムがありました。

談義の時間は、かっちりとしたスライドをつくらなくてもOK、時間もある限り好きなだけ話してOK、話してる最中でもちゃちゃ入れOKなので、みんなでゆるっと盛り上がってる感じが楽しかったです。

トークの詳しい内容は、connpassのページの資料とTwitterハッシュタグを見ていただければと思います。

セッションの合間や夜の懇親会で、たくさんのSwift開発者と知り合えたのがとても楽しかったです。

写真は懇親会のときに食べたもつ鍋。博多といえばこれでしょ

f:id:aomathwift:20200127171911j:plain

わいわい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

昨日ややさんがこちらの記事を公開されてました。

blog.yayawatanabe.net

おなじようにやりたいことを宣言してる方がたくさんいたので、感化されて私もやってみたいと思います。

元日中には間に合いませんでしたが、今年の終わりにどれだけ達成できたかを振り返ります(覚えてたら)

開発

  1. 中途半端になってる個人開発をやりきる
  2. 個人アプリを2つ以上リリースする
  3. コンパイラの本を読み切る
  4. DDDの本を読み切って理解する
  5. カンファレンスのcfpを出す
  6. 勉強会で登壇する
  7. コンパイラの本を読み切る
  8. 行けなかったSwiftコンパイラインターンの内容を再現する
  9. 勉強会でいろんな人に話しかける
  10. 考え込みすぎる前に質問する
  11. OSSにコントリビュートする
  12. 自作ライブラリを作ってみる
  13. バックエンドの開発にチャレンジする
  14. Androidアプリ開発をやってみる
  15. 技術書展などで何か執筆する
  16. 得意言語を一つでも増やす
  17. 応用情報とる
  18. Swift UI完全に理解する
  19. Qiitaやブログでアウトプットを定期的にする

ちなみに中途半端になってるものとしては、友達と作ってたアプリ1つと、途中まで作ってたfastlaneのpluginがあります。とりあえずこれは絶対終わらせたい。

あれもやりたい、これもやりたいになってできてなかったことをすこしでも最後までやりきるようにしたい気持ちです。

仕事

  1. 連絡を早くする
  2. 仕事中にできなかったことをその日のうちに家でもう一回振り返り、復習する
  3. 考えすぎる前に人に相談する
  4. 見つけたことは同じチームの人にどんどん共有する
  5. アジャイルの知識を学ぶ
  6. 教えるときはとりあえず自信持って話す
  7. 自分の仕事がなぜ必要かを意識する
  8. 自分の関わるサービスを自分でたくさん使う
  9. 身近なユーザーの声を聞いてみる
  10. 人に質問するときのマイルールを作る

せっかく社会人になる前に内定先でアルバイトをさせてもらってるので、技術だけでなく仕事のスキルも磨きたいですね。

学業

  1. 研究室のメンバーと議論する
  2. 学会に行く
  3. 学会に論文出す
  4. 研究会で英語の発表に挑戦する
  5. 一回一回のゼミを大事にする
  6. 各種論文を計画的に進める
  7. アカデミック英語のスキルを上げる
  8. 研究室でゲームしない
  9. 関連する論文や本を積極的に読む

学生の本業は学業であることを忘れがちなので、今年はいつも念頭においておきたいです。

研究室でゲームしないとかここに書くのかという感じですが、何気にむずかしいやつなのでがんばります…

生活

  1. 2時までに寝る
  2. 9時までに起きる
  3. お酒飲みすぎない
  4. 深夜に物食べない
  5. アイス毎日食べない
  6. ラーメンは週1に留める
  7. 週1以上ジムに通う
  8. ジム行けなくても筋トレする
  9. 自炊の頻度を増やす
  10. 会社でランチ作る
  11. 得意料理を見つける
  12. 頭痛薬を月に一箱以上買わない
  13. 何も食べずに鎮痛剤飲まない
  14. 毎日肩のストレッチする
  15. 鎮痛剤の用法用量を守る
  16. 早めに家さがしする
  17. 引っ越しに向けて少しずつ断捨離する
  18. 1年以上着てない服をとっておかない
  19. 書類整理をちゃんとやる
  20. 納税について勉強する
  21. モニターを買う
  22. iPhone買う
  23. AirPodsPro買う
  24. 学割が効くうちにMacBookPro買い換える

なんか他の方に比べて自堕落で不健康な生活ぶりが浮き彫りになる目標ですが、私にはこれを達成できたらえらいというやつなのです。

整体師さんに怒られ続けてるので、今年こそ頭痛を減らして薬を減らしたいな…

経験・趣味

  1. 斎藤一のお墓参りに会津に行く
  2. 土方歳三のお墓参りに函館に行く
  3. 新選組縁の地を訪ねて京都に行く
  4. 100名山どこか登る
  5. 家族旅行に行く
  6. 海外旅行に行く
  7. 伊豆の海を見に行く
  8. 高校の友だちと早めに集まる
  9. Switch版のうたプリをやる
  10. エヴァの新劇場版を最新作公開までに見返す
  11. 積んでる本を読む
  12. フェスに行く
  13. ELLEGARDENスピッツの出るライブに行く
  14. グランピングに行く
  15. 乗ったことのない新幹線に乗る
  16. コミケに行く
  17. インナーカラーをちゃんとメンテする
  18. 服をいろいろ着回す

要するにオタ活充実させたいみたいな話になります。

こういうのを日々の糧にできると良いなあと思います。

精神

  1. 自分を責めない
  2. 自分を卑下しない
  3. 奢らない
  4. 謙虚でいる
  5. 周りの人への感謝をわすれない
  6. 自分のことを棚にあげない
  7. 素直に謝る
  8. 相手の話を先に聞く
  9. 頭ごなしに人の意見を否定しない
  10. 怒る前に落ち着く
  11. 人に流されない、自分の芯をもつ

〜しないばかりになってしまいましたが、実践できれば自分も周りも気持ち楽になれるかなあと思います。

対人

  1. はじめましてを怖がらない
  2. いろんな趣味嗜好の人と話す
  3. 家族との時間を多めに作る
  4. 初めてのコミュニティに入ってみる
  5. 定番自己紹介を考える
  6. 同期との交流を大事にする
  7. 誕生日を知ってる人におめでとうを伝える
  8. 相手の気持ちになって考える

人とどれだけ話してきたかがその人の経験値になるという話を知り合いが言っていたので、それを標にたくさん交流したいです。

まとめ

皆さん仰る通り100個は多いですね…汗

この中で少しでもちゃんと達成できてることがあれば、1年後自分を褒めてあげたいと思います。

というわけで、今年もどうぞよろしくお願いします!

Azure Devops PipelineでiOSアプリのCIを設定してみた

Azure Devopsが大変優秀だということで、リポジトリ管理からスプリント管理まで全部をこちらにまとめてしまおうという動きがアルバイト先でありました。

それに伴って、今までCircle CI動かしてたパイプラインをAzureのPipelineに移行しました。

その設定の際の知見をまとめたいと思います。

Azure Devopsについて

azure.microsoft.com

Azure Devopsでは、アジャイル計画ツールやGitリポジトリホスティングサービス等、チーム開発に必要なツールがひとつにまとまっていて、それをプロジェクトごとに管理することができます。

チームメンバー5人までなら無料で始めることができるので、最初からお金をかけたくない・少しずつ移行していきたいというチームにもおすすめ。

無料でもプライベートリポジトリは何個でも作ることができますが、Pipelineに関しては並列実行ができない・ビルド時間月1800分までという制限が付きます。

Pipelineの設定

azure-pipelines.ymlをプロジェクトのルートに作成し、その中にパイプラインの処理を書いていきます。

タスクは、画像のようなAzure Devops上のタスク一覧からGUIで追加すると、yamlファイルにコードで起こしてくれます。

f:id:aomathwift:20191111150702p:plain f:id:aomathwift:20191111150716p:plain

ローカルで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名からの嬉しいメッセージ、大切にします。

f:id:aomathwift:20191003002655j:plain

近況報告

私のサマーインターンラッシュは9月いっぱいで終了したので、今後のことを含めここで少し近況報告です。

10月からサマーインターンでお世話になったクックパッドさんで再び長期アルバイトをさせていただいています。

部署はサマーインターンのとき同様モバイル基盤部で、メンターはなんと偉大なるぎぎにゃん先生(@giginet)です。

自分は割とシュッと質問するのが得意じゃなかったりするのですが、せっかくの貴重すぎる機会を無駄にしないように、時間を大事に使って頑張りたいと思います(戒め)

iOSDC Japan 2019 参加記録

iosdc.jp

9/5(木)〜9/7(金)で行われたiOSDC Japan 2019に参加してきました。というわけで、#iwillblogです!

印象に残ったトーク

トークいっぱい聞いたしなるほどわからん状態で止まってるものもあるので、厳選してご紹介します。

簡単なアプリを作れるようになった!からその先に進むために

speakerdeck.com

Swift初級から中級になるためにはどうしたら良いのか?と思ったときに、アプリ開発の世界を広げていく方法を紹介しています。

私自身同様の悩みをもったことがあったので、とても参考になりました。そして、ろくさん(@66nylon_y)の行動力がすごすぎて、自分も見習いたいと思いました、、、!

とりあえず他の方々にも勧められてるSwiftコンパイラの世界を覗いてみたいと思います。

自作して理解するリアクティブプログラミングフレームワーク

fortee.jp

RxSwiftを自作しながらリアクティブプログラミングを完全に理解した状態になりましょうというセッション。

私は半年前くらいにRxSwiftを触り始めたのですが、実際にプロダクトコードに入れていくうちに、一時はダニング=クルーガー効果でまさに「完全に理解した」みたいな状態になってました。

が、そこから一線超えてここ最近は「なんも分からん」状態に陥っていたので、理解のための新しいアプローチの仕方としてとても良いお話が聞けたと思います。

トーク以外について

スポンサーブース

一階のスペースではスポンサーの企業が各々の企画を打ち出してブースを出店していました。アンケートに答えてノベルティー貰えたり、エンジニアの方と直接フランクにお話ができたりします。

サマーインターンでお世話になった企業やこれからお世話になる企業はいずれもスポンサーとしてブース出されていたので、「お久しぶりです」「今度からよろしくお願いします」といった会話で盛り上がることができました。

ランチ・ドリンク

毎日お昼には美味しいランチが出て、LTの前にはお酒を含むドリンク配布され、食事事情はとても充実してました。(なのに写真がなにもない!!)

私はいろいろあって懇親会や茶会は出られませんでしたが、写真でみたところ料理もお酒もとても充実していたので、来年は必ず参加します。

コミュニケーション

今回のカンファレンスの一番の魅力はいろんな方とコミュニケーションが取れたことだったと感じてます。

先述した通りサマーインターンで知り合った方とブースで再会できたり、同じくサマーインターンでお世話になった方がスタッフとして参加しておられて困ったときに気軽に相談できたり、SNS上やQiitaの記事でしか見たことなかった憧れのエンジニアの方とお話できたり、人との繋がりがすごく感じられた3日感でした。

まとめ

iOSの大きなカンファレンスに参加するのは初めてでしたが、学ぶこと・刺激をうけることが本当に多くて、とても充実した時間を過ごすことができました。

自分はまだまだ精進しないと!と思う傍ら、自分もいつかスピーカーとして参加したいなーと思ったり。

最後に、iOSDCのスタッフの皆さん、知見を共有してくださったスピーカーの皆さん、私とお話してくれた皆さん、本当にありがとうございました!来年も是非参加させて頂きたいと思います。