金沢に立ち寄って、一人旅をしてきた

SPAJAM 2020最優秀賞副賞で、軽井沢でワーケーション体験をして来た #SPAJAM #サードオフィス - がんばってなんか書く の帰りに、12/13 (日) - 14 (月) で金沢に一泊して来ました。

1日目

SPAJAMワーケーションは昼に解散予定だったので、夕方から夜にかけて移動する予定でスタート。

移動

軽井沢のアウトレットでみんなでお昼を食べた後に、あさま615号 -> はくたか567号と乗り継いで、金沢に移動。

f:id:yutailang0119:20201216021308j:plain f:id:yutailang0119:20201216023823j:plain

金沢駅

17時半ごろに到着しましたが、疲れていて、この日は晩ごはんを食べずにホテルで寝て、夜に駅の周りを散策するだけにしました。

f:id:yutailang0119:20201216021649j:plain
イメージ通りの金沢駅
f:id:yutailang0119:20201216021659j:plain
内側もかっこよかった

2日目

天気が悪く、気温も真冬の予報で心配してましたが、なんとか周りきれた。

金沢カレー

近江町店 | 金沢カレーの元祖!カレーのチャンピオン【チャンピオンカレー】

f:id:yutailang0119:20201216022015j:plain
金沢カレー発祥らしい

近江町市場

近江町市場 – 金沢市民の台所としてもうすぐ300年の小売市場

f:id:yutailang0119:20201216022328j:plain
鮭カーテン

金沢城公園

金沢城公園

f:id:yutailang0119:20201216022513j:plain f:id:yutailang0119:20201216022523j:plain f:id:yutailang0119:20201216022536j:plain

兼六園

文化財指定庭園 特別名勝 兼六園

f:id:yutailang0119:20201216022809j:plain f:id:yutailang0119:20201216022821j:plain f:id:yutailang0119:20201216022832j:plain

ここら辺から、1人なのが辛くなってきた。

内灘海岸

記憶上で、日本海を見たことない *1 のではということで、天気が悪くなければ、海を見たいと思っていました。
ということで、 北陸鉄道浅野川線に乗って、内灘海岸に行きました。

f:id:yutailang0119:20201216023326j:plain
ICカード使えなくて、久しぶりに切符買った
f:id:yutailang0119:20201216023336j:plain
f:id:yutailang0119:20201216023345j:plain
始発/終点駅以外、無人駅らしい
f:id:yutailang0119:20201216023356j:plain
初めての日本海
f:id:yutailang0119:20201216023405j:plain
日本海記念

海を見た瞬間に「日本海だー!!!」テンション上がったけど、寒すぎて滞在時間は10分でした。
往復で2時間近くかかったけど、旅とはこういうもの...

海鮮丼

海鮮丼を食べ

f:id:yutailang0119:20201216024229j:plain

サンダーバード

初のサンダーバードで帰路に着きました。

f:id:yutailang0119:20201216024330j:plain

f:id:yutailang0119:20201216024341j:plain
どこがサンダーで、どこがバードかはわからなかった

*1:福岡は日本海ではないとします

SPAJAM 2020最優秀賞副賞で、軽井沢でワーケーション体験をして来た #SPAJAM #サードオフィス

先日報告した SPAJAM 2020 の最優秀賞 の副賞の一つ、軽井沢ワーケーション体験に、12/12 (土) -13 (日) で行ってきました。

軽井沢ワーケーション体験プログラム

世間でも、ワーケーションという言葉が盛り上がりを見せています。
今回は、SPAJAM 2020のスポンサーで長野県の建設会社 株式会社フォレストコーポレーション様に特別にご招待いただき、軽井沢で1泊2日のワーケーション体験をして来ました。
新型コロナウィルス感染対策に、最大限配慮した環境で、我々チームおひっこしのメンバーをアテンドしていただきました。

軽井沢とワーケーション

軽井沢では、東京から新幹線で1時間の立地を生かして、コロナ禍よりも前からワーケーションやオフィスの誘致に注力されています。
今回滞在したサードオフィス以外にも、ワーケーションに利用できる施設が複数あり、訪問した三菱地所様のワーケーション施設もよかったです。

また、軽井沢市自体の平均所得が急激に上がっていて、その一因は教育関連の施設の充実とのことで、別荘地としての一時的な滞在から、移住という選択も増えているとのこと。

サードオフィス体験

今回滞在したサードオフィスを一言で表すと、会議室などオフィス機能の一部を併設した別荘です。

f:id:yutailang0119:20201216011334j:plain
勝者のポーズ
f:id:yutailang0119:20201216012449j:plain
風呂グラマー向け
f:id:yutailang0119:20201216012628j:plain
yutailang0119の泊まった部屋は朝日がよかった
f:id:yutailang0119:20201216014424j:plain
たき火をしたり

最優秀賞のおもてなし

ワーケーション体験ということで、研修的面はもちろんありましたが、今回の主役は最優秀賞の我々!
ということで、すばらしいおもてなしをいただきました!!!

お昼ごはん

くつかけステイ 中軽井沢 – 和食と宿のくつかけステイ 中軽井沢のWebサイト

f:id:yutailang0119:20201216011444j:plain
お昼ごはん
f:id:yutailang0119:20201216011455j:plain
お腹いっぱい

お酒も飲み放題で、大信州おいしかった。

サードオフィスでのドリンク

滞在中、シャンパン、ワイン、ビール、日本酒などをご用意いただき、すべて飲み放題でした!!!
というか、ワインセラーにずらっとシャンパンが並んでいて、飲み切れる量じゃなかった。
シャンパン、ワインの味は記憶できるほどわからないんですが、日本酒の小左衛門を久々にいただけてよかった。

f:id:yutailang0119:20201216012807j:plain
これも飲み放題

晩ごはん

シェフを呼んでのごはんでした。

f:id:yutailang0119:20201216013340j:plain
前菜
f:id:yutailang0119:20201216013349j:plain
鴨がおいしかった🦆
f:id:yutailang0119:20201216013400j:plain
エビ🦞
f:id:yutailang0119:20201216013410j:plain
肉🥩
f:id:yutailang0119:20201216013419j:plain
パスタ🍝

ワークショップ

2日目はワークショップとして、参加者とフォレストコーポレーション社員の皆様で、「あったらいいなワーケーション体験 (施設、サービス、機能)」というお題のアイディアソンを行いました。
ブレストから始めて、最後のチームワークでは @_bannzai_@noa_design51、@yutailang0119 と、フォレストコーポレーションの社員の方の4人チームで、アイディアソン優勝でした。
短い時間でしたが、普段触れているITとは離れた話も聞けてよかった。

f:id:yutailang0119:20201216014044j:plain
チームワーク

そのほかの副賞

チームでいただいた副賞をチーム内で分けて、うちには以下のものが来ました。

おまけ

軽井沢への行きは、チームメンバーで東京駅集合にしたので、東海道新幹線で向かいました。
初めて、北陸新幹線にも乗れました。
せっかく軽井沢までやって来たので、帰りは北陸新幹線を北に回って、金沢に延泊して帰ることにしました。
ということで、1人旅に続きます。

yutailang0119.hatenablog.com

*1:これから届く

SPAJAM 2020 本選大会に「おひっこし」として参加して、最優秀賞に選ばれました!!! #SPAJAM

予選: SPAJAM 2020 第2回予選大会に「おひっこし」として参加して、優秀賞に選ばれました #SPAJAM - がんばってなんか書く

11/7 (土)、8 (日) に行われたSPAJAM 2020 の本選大会に、 @_bannzai_@gaopin1534@koooootake@noa_design51と共に参加し、最優秀賞に選ばれました!!!🎉

https://history.spajam.jp/final-result/

youtu.be

優秀賞ということで、本選に行けるかは、全ての予選終了後の復活にかかっている状態。

SPAJAM 2020 第2回予選大会に「おひっこし」として参加して、優秀賞に選ばれました #SPAJAM - がんばってなんか書く

ということで、敗者復活を遂げて本選出場、そして、最優秀賞を勝ち取りました。

やったこと

感想

まずは、本当に嬉しかった!!!
敗者復活からの優勝ということで、喜びもより一層でした。
また、予選では審査員長の村上さんにウィークポイントを突かれたけど、今回はベタ褒めですごい満足感でした。
たしか、審査員のちょまどさんが言ってたと思う「ツンキャラがデレた時のギャップ」という表現がすごくしっくりきています。

ここ1週間ちょっと睡眠がうまくいかずに生活リズムが無茶苦茶になっていたり、予選よりも貢献できている感覚が弱いと思ったり *1 で自信がなかったりして、進行中は結構参った気持ちにもなりました。
また、プレゼン + 質疑応答 10分の枠を、プレゼンで9分消費した時には、かなり焦っていました。
しかし、「仕事やってるようなことしてるな」と発言した記憶もあり *2 、身につけていることの多くを吐き出せて、結果としての最優秀賞に貢献できたのかなと思います。

チームメンバー間では「優秀賞では呼ばれるな」と祈りながら結果発表を見て、最優秀賞に「おひっこし」の文字が出た時には、みんなで声を上げて喜びました。
最優秀賞は徹夜のがんばり全てを報われた気持ちにさせてくれました。

今回使ってみたFirebase MLVisonが手軽で、予選から使ったFirebase Cloud Firestore / Strageの合わせて、アプリを作っていく感覚を得られたので、何かに繋げていきたいですね。

ハッカソン参加とチーム構成

今回のメンバーのバランスがよかったので、本選に行って、次はみんなと同じ場所で一緒にやりたい。

SPAJAM 2020 第2回予選大会に「おひっこし」として参加して、優秀賞に選ばれました #SPAJAM - がんばってなんか書く

世間と自身の状況をあれこれと考え、今回も自分は京都から参加としました。 *3
最優秀賞で集まる機会を得たので、結果オーライ。

チームバランスの良さは今回も感じました。
最初の役割分担で、4人のプログラマー陣は大きくUIとロジックで2:2と分かれる分担になり、偶然にも予選の組み合わせと担当が逆となりましたが、困りごとは得意な人が自然とフォローに回る空気ができていてよかった。
自分は終盤には、予選も本選もデザイナーがこだわりたいところの調整を担当して、@noa_design51 からも承認を得られたのもよかった。 *4

全員が一定以上の実力を持ったメンバーなので心配はなかったですが、自分自身も広くできるなと再確認できたし、実力者メンバーの中においても自分が深くできることも知れたのはとても参加した価値がありました。

反省点

反省の一つはiOSのバージョンの話。
iOS 14端末は全てiOS 14.2にアップデート済みでしたが、そのSDKに対応するXcode 12.2がまだStableリリースされておらず、実機インストールできない状況でした。
気づいてすぐにXcode 12.2 RC1のダウンロードを始めました。
途中で気づけてよかった。
Xcode 12.2 RC1が出た時に、すぐにStableリリースされるだろうと、マシンからbetaを消してたので、特異なパターンではあるけど、注意が必要でした。

おわりに

チーム「おひっこし」として、共に参加した @_bannzai_、@gaopin1534、@koooootake、@noa_design51 ありがとう!
1人だけ遠隔ということで苦労もかけたと思うので、不満だった点は集まった時に教えてください。
@_bannzai_ は誘ってくれてもありがとう!
早く家見つけてね

SPAJAM 2020運営、審査員の皆様、初のオンライン開催、ありがとうございました。
オンラインだからこそ、今回のメンバーでの参加が叶ったことと思います。

ほぼ徹夜ですごく疲れましたが、最高の結果で終われました!
最優秀賞は全てを癒す

*1:調べていたWatsonを断念して、開発パートの序盤分を使わなかったことが大きい

*2:たぶん、プレビュー画面用のモデリングを考えていた時だと思う

*3:あれこれの一つは、iPhone 12 miniの予約

*4:内心、ここまでやる?って気持ちがゼロではなかった

github/docsにPR出したけど、タイミングが悪くてコントリビュートし損ねた

GitHubのドキュメントがOSSになった。

github.blog

Pull Requestを出した

ちょうど、ドキュメントのMarkdownが崩れている箇所を知っていたので、修正を出した。

github.com

重複でマージされなかった

GitHubスタッフから

Because this particular issue has been fixed by the GitHub Docs team, I am going to close this pull request. We encourage folks to open an issue first so we can verify the need for the proposed change and avoid duplicate work.

https://github.com/github/docs/pull/264#issuecomment-705704911

というコメントがきて、最初は 「この種の問題はGitHub Docs teamが直すので、まずはissueを作ってね」 と読んでいて、OSSの意味...と誤解したのだけど、 id:ikesyo と話していて、 同じタイミングでGitHub Docs teamが修正していたことが判明 した。
コメントは「GitHub Docs teamも同じ修正をしたところだったので、作業の重複をしないために、まずはissueを作ることをおすすめします」というのが、おそらく正しかった。

コミット は3日前だったけど、PR (repo sync by Octomerger · Pull Request #273 · github/docs · GitHub) は、自分が修正を出した数時間後。
別にあるらしいPrivateリポジトリとのsyncで表に出てきたものだった。
Markdownの修正だし、issue作るのと労力変わらないと思ってやった修正だったけど、本当にタイミングが悪かった。

レビュワーには手間をかけたし、issueで確認するのは大事、世界中から多くのPRが送られるOSSは大変だなと思う。
未公開情報もあり、別にPrivateなリポジトリのは仕方ないと思うので、ラグタイムで生じるこの手の問題は致し方ないかなと思う。

おわりに

これに懲りずに、修正を出していきましょう

ちなみにページは ここ
無事、直っていますね

PrivateリポジトリのSwiftPMをCIから使う

最近はモバイルアプリのリポジトリのプロジェクト整理として、これまではPrivateなPodSpecsやgit submoduleを使って解決していた依存を置き換えたり、単体での取り回しが効く程度にリポジトリを分けたりなどをしている。

iOSアプリならPackage.swift を用意して、Swift Package Managerで解決
Androidアプリなら GitHub PackagesMavenとして利用して、Gradleで解決
という方針で進めている。

CI as a Service (以下、CI) にて、PrivateリポジトリをSwift Package Managerで依存解決するのに、ちょっとてこずったので記しておく。
AndroidアプリでのGitHub Packages利用についても、あとでまとめたい。

本題

本題の回答としては、Appleドキュメントに記載があって、Xcode 12現在はこれで解決ができるようになっている。
Apple Developer Documentation

If you’re using the xcodebuild command directly, use SSH–based Git URLs for your packages and configure your SSH credentials. Set up your known_hosts file in the ~/.ssh directory of the macOS user that runs your CI tasks. xcodebuild honors your SSH configuration — there’s no additional setup required.

  • https ではなく、SSH形式のGit URLを使う
    • 例えば git@github.com:niw/KeyboardGuide.git
  • ~/.ssh/known_hostsSSHの設定を置く

この設定をしていない場合、 xcodebuild で依存解決ができずに、ビルドができない。

...
Resolving Swift Package Manager dependencies...
Command line invocation:
    /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -resolvePackageDependencies
...
Resolve Package Graph
Fetching git@github.com:user/repository.git
xcodebuild: error: Could not resolve package dependencies:
  The server SSH fingerprint failed to verify.
...

具体的な策

BitriseのWorkflowで、 Activate SSH key (RSA private key) 後に、Script stepとして、以下を実行しておくことで解決した。

for ip in $(dig @8.8.8.8 github.com +short); do ssh-keyscan github.com,$ip; ssh-keyscan $ip; done 2>/dev/null >> ~/.ssh/known_hosts || true

前述の‪Apple‬ドキュメントにある通り、 ~/.ssh/known_hostsgithub.comへの接続を追加した形だ。

ここからは、この対応をする上で半日を潰した罠を書き残しておく。

1. 情報が少ない

上記のドキュメントに書いてある通りにやればいいだけ。
それだけなのだが、それにしても話題にしている人が少ない。

取り組み始めた段階で、すぐにほぼ答えの回答にたどり着いたが、なぜか設定後のビルドが失敗したので、諦めて別の方法を探していた。

discuss.bitrise.io

Circle CIのヘルプにも、同じ話題が上がっていた。

support.circleci.com

しかし、 IDEPackageSupportUseBuiltinSCM について調べても、情報が少ない。
ヘルプの記載と名前から推測すると、 xcodebuild でシステムのGitを参照させるためのオプションだろうか。

xcodebuild does not conform to the system ssh config and does not access the keys CircleCI stores in ssh-agent. We can work around this by requesting Xcode uses the main system version of ssh which will behave as expected.

ちなみに、Xcode 12では解決しているのか、 IDEPackageSupportUseBuiltinSCM YES にせずに、通るようになった。

2. SSH公開鍵/秘密鍵の用意

普段GitHubと連携する前提だと、多くのことがGitHubPersonal Access Token で解決できるのだけど、SwiftPMの場合にはGitそれ自体のサポートのため、SSHによる認証が採用されている。
幸いに、今回の環境ではBitriseでCocoaPodsのPrivate PodSpecsを使うために、他リポジトリにもアクセス権があるSSH鍵を設定していたので、この構成を調整する必要はなかった。
BitriseにAppを追加するフローで設定できるSSH鍵のままでは、リポジトリへの権限問題で、認証を通過できないかもしれない。

また、GitHub Actionsなどの他CIでは、解決方法が異なるかもしれない。

3. Bitrise Workflowの同時編集

これはSwiftPMと全く関係ない話題 だが、BitriseのWorkflowを複数人で編集すると、上書きしあう可能性がある。
自分が本題で詰まっていたため、途中からチームメンバーにも検証を手伝ってもらっていたが、どうにも自分が書いた設定が巻き戻っていることがあった。
それぞれ別々にWorkflowを用意して作業していたつもりであったが、おそらく他の人がWorkflowエディタを開いた段階の設定が、自分の変更を上書きして、巻き戻りが発生していたのだと思う。
やってみれば、 bitrise.yml は1枚なので、そうなると理解できるが、できればdiffだけを保存してもらいたい...

まとめ

以上、紆余曲折あって半日溶かしたものの、結局はAppleドキュメントにある通りに、パッケージをSSH形式のURL指定し、 ~/.ssh/known_hostsSSH設定を追加する

for ip in $(dig @8.8.8.8 github.com +short); do ssh-keyscan github.com,$ip; ssh-keyscan $ip; done 2>/dev/null >> ~/.ssh/known_hosts || true

で解決できた。
1日お疲れ様でした。

SPAJAM 2020 第2回予選大会に「おひっこし」として参加して、優秀賞に選ばれました #SPAJAM

9/26 (土)、27 (日) に行われたSPAJAM 2020 の第2回予選大会に、 @_bannzai_@gaopin1534@koooootake@noa_design51と共に参加し、優秀賞に選出されました。

https://history.spajam.jp/competition-result2/

www.youtube.com

やったこと

  • Firebase Cloud Firestore / Strageのデータベース関連の処理
  • 画像の合成処理の実装
  • 写真を撮った後のプレビュー画面
  • Figmaで作られたデザインを当てたり
  • デモ動画の演者

感想

ものとしては、24時間でそれなりに動くし、見た目も丁寧に作れたのでよかった。
特にプレゼン資料など、デザイナーって (@noa_design51 が) すごいと感じてた。

今回自分以外は東京集まっていたので、常時Discordで繋いでいたのはよかった。
ただ完全に同じ環境にはもちろんならなくて、食事とか打ち上げとかの面ではちょっと寂しい感じになった。
オンラインだから同じ予選会のチームで出れたのではあるのだけど。

あと、めちゃくちゃ久しぶりにハッカソンに参加して、徹夜が非常に辛かった。

優秀賞ということで、本選に行けるかは、全ての予選終了後の復活にかかっている状態。
今回のメンバーのバランスがよかったので、本選に行って、次はみんなと同じ場所で一緒にやりたい。
たのむ!!!!

iOSDC Japan 2020に参加 & LT登壇しました #iosdc

前々回: iOS Japan 2018に参加 & LT登壇しました #iosdc - がんばってなんか書く
去年は書いてなかったことが発覚した。

全体

今年は時世もあり、オンライン開催ということだった。

iosdc.jp

👍

  • 暑い中の移動が無
  • ノベルティを持ち帰らなくていいのが、非常に楽
    • 宿泊を伴うと、荷物が面倒なので
  • 複数トラックの並行視聴が可能
    • 自分は途中で諦めた
  • 起床、即参加が可能

👎

  • 京都に住んでいると、iOSDCだけに限らず、カンファレンス参加は出張チャンスなのだけど、今年は家で一人
  • Ask the Speakerに行かないと、トークを待っている時間が長く感じる
  • 休憩ルームで人と話すことがメインで参加しているので、オンラインだとその点を完全には補完する術がない
    • Discordの雑談チャンネルはよかったけど、喋っているのは大体固定のメンバー (かつ、大体いつもカンファレンスで話している人たち) で、「自分たちの会話を顔の見えない不特定多数に聞かれている」という感覚が、2.5日では慣れることができなかった
  • コーヒーを自分で淹れる必要がある
  • 昼食タイミングが難しい

LT

fortee.jp

xcrun Essentialsという題目で話した。 ギリギリまで5分に収まるように調整していたり、そもそもオンラインでの登壇も初めてだったので、ここ最近で最もプレッシャーがあった。

LT待機室では、他の登壇者の様子も見えていたけど、自分ばかり話していた気がする。 *1

やっぱり、準備した全ての内容を5分で話すことはできなかったので、Ask the Speakerで話させてもらった。 アップロードしたスライドには、完全版として掲載している

speakerdeck.com

👍

  • 一人でいるので、LTの練習がしやすい
  • カンペ見放題
  • LT中の焦りが、視聴者からは見えづらい
  • ニコ生を意識した煽り

👎

  • 今年はLTのみがライブだったので、周りに共感者が少ない
  • 自分はZoomが好きではなく *2 、慣れていなかったためにセットアップでの不安やZoomを通すとKeynoteのTransitionsアニメーションがもたつく *3 ので、非常にストレスフルだった
  • カメラの目線が難しい
  • 自分のワイプが配信に載る時に、左右反転することを先に知りたかった
    • 内側を向くようにカメラを調整したつもりだった

f:id:yutailang0119:20200923142232j:plain
タイムシフトからいいの撮れた

最後に

今年もお疲れさまでした

*1:スタッフ側の画面に自分ばかり映ると言われた

*2:Macに修正パッチ出させたあれの印象が強い

*3:諦めてアニメーション切った