2021年の振り返り

この記事は エンジニアと人生アドベントカレンダー2021 の25日目の記事です

振り返り

去年に引き続き振り返りを書いていきます

エンジニアとしての活動やプライベートの一部を覗き見ながら、2021年のbannzaiの人生に何が起きたのかをみていきましょう。ソースはTwitter

お仕事

4月に無職になり

5月のGW明けからAppify Technologies で働き始めました

後述しますが子供が産まれるのもあり9~11月はお休みでしたのでまだ半年も稼働はしてないのですが周りのレベルの高さにあたふたしながら楽しんでやっています。SwiftUI x GraphQLという構成でアプリを書いています。SwiftUIもGraphQLもいいぞ

あと久しぶりにGolangとReactも仕事で書いています。何もかも忘れているし時代も進んでいるので初心者に毛が生えた程度なのですが楽しいです。

家、変わりました

昨年の振り返り記事に書いてありますが、家を失くしました。辛い。3,4ヶ月の月日を経て家を手に入れました。嬉しい。そして、半年で家を変えて鹿児島に居住地を移しました。いえい。このアクションの理由も出産が絡んでいます

引っ越した翌日に全国的なニュースになるほどの豪雨に見舞われたり、1週間足らずで クローズドなコミュニティの洗礼を受けたりしましたが元気に過ごしています。

こっちはスーパーで買った刺身がとにかく美味い。寿司屋の寿司も美味い。食べ物がうまい。後久しぶりの車の運転も楽しいですね。テスラ欲しい

パパになりました

9月からパパになりました。ブログにも書いてあるのでそちらも見てください

bannzai.hatenadiary.jp

パートナーが最近育児漫画をよく描いているのでそちらにもちょいちょい私が登場しているのでbannzaiのパパ生活が気になる方はウォッチするのも面白いかもしれないですね。 https://twitter.com/hockamneco

もう本当に我が子かわいい。これにつきますね。パートナーの家族にも助けられながら仕事とも両立できています。

個人開発

Pilll

Pilllというアプリを共同で開発して、Flutterに書き直したものを今年の初めに出しました

bannzai.hatenadiary.jp

正確には覚えてないのですが、7/20くらいにトライアル付きで課金機能を出してマネタイズを始めたようです

今日(12/25)ま大体350人課金してくれていますね。やったね f:id:bannzai:20211225165810p:plain

少し前ですがAppStoreのレビューも2000件超えつつ4.6以上をキープしているのでとてもすごいですね。誘ってくれたohsさんには本当に感謝してます。貴重な体験が今できていると感じています

スターも200スターいただきました。まだの方は スターください

また個別にPilllを開発・運用した感想等をまとめた記事も別の機会に書こうと思います

クソ 素晴らしいアプリ

クソアプリアドベントカレンダー の企画でアプリを1つ作りました。こちらも是非ご覧ください

zenn.dev

が、諸事情によりTestFlightのpublinkがまだ公開できていません。というか公開しないかも

OSS

知っている方も多いと思うのですが普段はGitHubのスターを乞食するためにOSSを公開してスターを乞食することを生業としているのですが、年の瀬になるまでOSS作っていないことに気づきました。友人が主催の仲間内で集まってするハッカソンを機にOSSを作り始めました。そして、Swift愛好会で公開しました。まだ開発が必要ですが良い感じになりそうなので スターください (なんとかキャラブレを防ぐことができた)

内容はFigmaからSwiftUIのコードを生成してくれるFigmaのPluginです。

しかし、Pluginとして公開する準備等をすっかり忘れていたというドジっぷりを発揮しました。リリースまでもう少しお待ちください。スターは事前にください

このほかにもまだ作っていて途中のものがいくつかあるので来年公開したいですね。お楽しみに

まとめ

来年も

スターください 🌟

おしまい\(^o^)/

子供が生まれました

子供が生まれました

突然ですが子供が生まれました。

👶 < Hello, world

出産までの10ヶ月間

出産直前までを時系列に沿って人生を振り返ってみる

1月 パートナーの妊娠発覚

パパ、頑張るよ。まずは童心を思い出すよ

2月

Pilllリリースした。パパいっぱい君と遊びたいから働く時間減らせるように頑張るよ

bannzai.hatenadiary.jp

3月

こちを出迎える。パパな実は君より先に扶養する子が増えたんだ

4月

無職になる。パパな、無職で食って行こうと思うんだ

5月

Appifyで働き始める。パパな、やっぱり働くよ。無職で養うのまだ無理だと気付いたんだ

6月

エンジニアに話しかけていいタイミングをやる。パパな、バズり方覚えてそれでガッポガッポしてこうと思うんだ

7月

鹿児島に引越し。パパな、オリンピック開催前に一回東京から出た方が良いと思ったんだ。パートナーの実家近くに場所に行こう

8月

パパ誕生日。パパな、やっぱりスターを乞食するのやめられないんだ

9月

宣言的無職。パパな、今月パパになるんだ

9月...

👶 < おんぎゃあ. ⭐️ < うおおおおおおおおおおおおおおおお!

f:id:bannzai:20210926135001p:plain

ピックアップ

無職って言っていた9月~11月までは育休予定です。鹿児島に引っ越したのは、オリンピック東京で開催変わらずか。東京出ておくか。 彼女の実家近くで助け借りよ。っていうのが経緯でした。

立ち会い

コロナ禍で出産の立ち会いが多くの病院で禁じられていたのですが、(パートナーがめちゃくちゃ)交渉してくれて実現できました。実の所出産に立ち会うって感覚が最初知らなくてそれが良いことかどうかがわからなかったのですが、実際に立ち会ってみると言葉にできないくらいの感動がありました。特にこのご時世で立ち会えたのは本当に幸運なことだと思っています。思い出したらまた感動してきた執筆終わったらパートナーにもっとお礼言お。

リアル

さて、このセクションでは出産の想像と現実のギャップについていくつか書きます。私(妊婦側ではない)目線の話ではあるのでそこは注意してください。もちろん全て個人差があります。まず私が持っていた妊娠から出産までのイメージは下のような感じでした。

想像していた

  • つわりはあるし妊娠中期~後期は胃に優しい食生活とかを心がける必要がありそうだ
  • お腹が大きくなると動くのもつらそうだから俊敏にサポートしよう
  • 陣痛が来たらすぐに病院に運ぼう。そのまま立ち合いになったら出産は痛いだろうしさポートしよう。声をかけよう
  • 出産直後は彼女は体力が無いだろうけど「ほら産まれたよ。よかった 😭」って言い合おう

直面した現実

想像とのギャップを書く

つわりはあるし妊娠中期~後期は胃に優しい食生活とかを心がける必要がありそうだ

初期からめっちゃつわりもあるし、パートナーが偏食になり食べれる食糧を調達する必要がある。ほぼ毎日変わる時期もあったのでネットスーパー買いだめとかは無理

お腹が大きくなると動くのもつらそうだから俊敏にサポートしよう

つわりでふらついているし初期から想像以上に動く。お腹が大きくなると立ち上がるのも常に全力なので補助は必要。寝たきりサポートくらいの勢い

陣痛が来たらすぐに病院に運ぼう。そのまま立ち合いになったら出産は痛いだろうしさポートしよう。声をかけよう

想像の補足から。陣痛が来たらまもなく分娩室(赤ちゃんを産むところ)に入って気張るのだろう。それが通常ルート。とか思っていましたが体験したものは違いました。

まず、陣痛の練習みたいな前駆陣痛という現象が起きます。これは陣痛よりも弱い痛みでお腹が痛くなります。区別がつけば良いのですが痛みの度合いや痛みの間隔などの肌感に近い判断材料しかありません。その肌感も初出産時には違いがわかるわけないので常に緊張しています。彼女の場合は前駆陣痛が2日間くらいあってから夜中に本陣痛が発生しました。ここで私たちは外さずに病院に行けましたが隣で見ていても「常に痛そう」って感じだったのでよく病院行くタイミング外さなかったな。と思っています。反面、痛さが違うので外さなかったという見方もできますが、病院に向かっている途中お互いに半信半疑ではあったとは思っているので簡単ではないです。

さて本陣痛だったと発覚してからなのですがすぐに産まれるわけではありません。彼女がその場で入院が決定し出産までは病院にいることになります。そしてこの時間は一概に何時間という指標があるわけでもなくまちまちです。彼女の場合は10時間の闘いの末に出産になりました。人によっては陣痛は「内側からハンマーで殴られるような」激痛らしいのでその状態で数時間はやばそうですね。

彼女の入院中はコロナ禍で一緒にいることができないので自宅待機していたのですが、「そろそろ産まれるから来て」と病院から電話があり院内に入りました。待機室に案内されそこで待っていたのですが時折「ぎゃあああああああああ」という声が聞こえてきました。その時は「もう一人いるのか。難産かな。痛そう」と本心で自分達ごとに思っていませんでした。実際その断末魔のような叫びは私の彼女の声で、後に安産と言われたのに、出産時の激しい痛みに耐えようとしている声でした。分娩室に入りそのことを認識すると脳が一瞬フラッシュしました。意識が朦朧としている彼女。血だらけの部屋。彼女の体制が変わらないようにつけられている拘束具。定期的に起こる断末魔の叫び。

いやいやここ拷問部屋の間違いやろ。と思いました。

のちに私が泣きそうな顔だと聞きましたがサポートどころではありません。むしろ看護師さんにサポートされていました。 というかサポートの余地がない。。。まじで手を握っているだけだった。。。

出産直後は彼女は体力が無いだろうけど「ほら産まれたよ。よかった 😭」って言い合おう

なんだかんだ言って出産は終えました。疲れたとは違いますが私も40年分くらいの人生を過ごした気分でした。生まれたら終わりというわけではなく例えば出血をしていたら止血等を先生たちが並行して行っております。全然「産まれたよ。よかった 😭」と手放しに言える雰囲気ではありません。先生は言ってたけど。今度は母体に対してあれこれしています。私はあわあわしています。

とはいえ時間にしてはそれまでの衝撃の連続と比べると短い時間でした。そのあとは彼女とも喋ることはできました。できたのですが、「俺だったら気絶しているし喋る元気とかないな」って状態だったのでよく喋れたな。と思っています

コロナ禍

今回体験した出産事情は史上稀な環境だったと言えるのではないでしょうか。世界中でパンデミックが起きている中での出産です。通常だったらこうする。これができる。と言った期待も持てない状態でした。立ち会いの例もそうですが気分転換の選択肢の少なさも挙げられます。妊婦は基本的に薬等は使えないし免疫力も弱くなっています。感染力が高いウイルスとは特に相性が悪いです。通常の外食もできないし、私が運んでくる可能性もあるのでこの期間は出社含めての対人の場面を最小限に過ごすようにしていました。

必要であれば一部の人には言いましたが、この期間対面の予定全部断っていたのは ↑ の理由です。

あとからやればよかったと思ったこと

散々悲惨なシーンを書きましたが、やはり人生で思い出の場面だったことには変わりません。あとから何とも言えん感動も込み上げてきました。当事者からするといきなりその場面に遭遇すると何も余裕はありませんが、「悲惨さも含めて動画撮っておけばよかった」と思っています。同じような人がいるようなら動画をとりあえず回しておくことをお勧めします。

我が子

我が子可愛い。産まれた瞬間から可愛い。出産直後からまじ可愛い。指を握ってきます。嘘お。え、こんな可愛い生物いる?泣きます。嘘お。え、可愛い。嘘お。大きさは3,332gでした。あと1gでゾロ目なところも可愛い。髪の毛が思っていたよりも生えています。可愛い。手足の指が長い。可愛い。すごい。ほっぺが柔らかすぎる。すごい。パパが抱くと泣き止みます。これが尊いってやつか。指をチュパチュパしている。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。可愛い。

終わりに

書きたいことが山ほどあるのですが、すべてを文章にするのも大変なのでここら辺で筆を置きます。またオンラインでカジュアルにお話でもしましょう。最近身の回りがベビーラッシュなので落ち着いたらみんなでご飯でも行きたいですね。東京にもそのうち戻る予定なのでその時は誘ってください。

今日はスターは乞食しないお ( ^ ω ^ )。その代わり祝いの言葉待ってますね

おしまい \(^o^)/

個人開発のお話

個人開発のお話

こんにちは bannzai です。普段はちょっとしたツールやライブラリを作って営業力でスターをもらうことを生業としていますが今回はプライベートの時間で作っているアプリのお話と宣伝をしていきたいです

作っているアプリ

もともとohanamizukiさんが開発していたPilllというアプリを開発の方を引き継いで一緒に作っています。 Pilllについては下記のnoteを見てもらえたら概要や生まれた経緯が分かります。

note.com

簡単に言うとピルという薬の飲み忘れを防止するためにサポートするアプリになります。

引き継いで開発までの時系列をまとめると

  • ohanamizuki < Pilllに1万人以上ユーザーが付いてもっと良くしたいから開発の部分を引き継いで一緒にやってかない?
  • bannzai < よっしゃ
  • ohanamizuki < スケールさせたいしリプレイスしても良いくらいの気持ち
  • bannzai < よっしゃ
  • ohanamizuki < Androidもあったら良いよね
  • bannzai < よっしゃ

から始まりました。話自体はたしか2020年の6月くらいにもらいました。結果的にがっつりリプレイスもして2021/01/24にiOSアプリを、に少し時間を置いてAndroidのアプリもリリースすることができました 🎉 iOSについてはリプレイス後に一度計測もしたいし評価をリセットして出したのですが、執筆時の2021/5/01では1000件を超えるレビューと平均評価4.6が付けられていてとても嬉しいです。ユーザー数もちょうど2万人くらい(おそらくリプレイス後に+7kくらい)いて需要があることを体感しています

f:id:bannzai:20210429095542j:plain

以下に各プラットフォームのストアのリンクを該当ユーザーで使いたいという方はぜひ使用してみてください。あとスターください。Androidの方は最近出したばかりでもあるのでレビューもまだついていないのですがこちらの方も後述しますが現在はiOSと同じソースコードで動いているのでほぼiOSと体験は変わらないものとなっています。なのでアプリの内容としてはほぼ同一なものになっています。興味がある方は一度落として試してもらえたら嬉しいです。こちらもスターをもらえたら喜びます

AppStore Google Play Store

選定技術の変更

もともと純粋にSwiftのみで書かれていたiOSアプリだったのでそんなに癖はなかったのでそのまま使用しても良かったのですが、クライアントはFlutter、バックエンドはFirebase(系のサービスを中心に)を採用して開発をすることにしました。以下が決めるまでのその時の気持ちです

  • どうせならなにか馴染みのない技術を試したい
  • Androidも出したい気持ちがあった
  • DBがアプリ内のローカルのみだったので変更する必要があった
  • 通知もローカルからの発信/受信のみだったがバックエンド用意してリモートからも送りたいよね
  • 開発者は一人だからFirestore(スキーマレス)でも全く困らなさそう
  • アプリとしての複雑さやスケール具合はある程度天井が見えているからFrameworkやBaaSの普通にできる範囲で必要要件はカバーできそう
  • 例えば「Flutterでxは難しいけどyならすぐできる」と代案の提案等をしても通じやすい相手だし冒険しても良さそう

と、こんな具合でした。実質リプレイス前後含めて開発に半年程の期間で仕事の合間の時間を使って開発している程度ですが、上記の判断基準で選出した結果におそらく後悔は一度もして無く過ごせていると思います。同じように悩む方がいたら参考にしてください。とはいえ、やっぱり躓くところはあるので作りたいものに対して軽く検証はしておくと安心ですね。

その他細かいところでいうとPilllのFlutterのコードはGitHubに公開されています。利点としてはみなさんに スターがもらえる 事とGitHub ActionsやBitriseといったCIが広い範囲の無料枠の中で使えるのがとても嬉しいですね。ちなみにデメリットはbannzaiの綺麗じゃないコードが世の中の誰でも見ることができるところですね。謙遜とかじゃなくて「動いているからヨシ」だったり「あー、ここはもう過度に共通化しちゃえば良いや。オレ一人だし」みたいなコードが散見できる場所になっているので私の恥部を見たい人は覗いてください。

github.com

今使っているもの

使っている技術やツールについて改めてまとめます。bannzaiのことを知っている人たちは話のネタにでもしてください。

Flutter

pubspec を見れば分かるのですが主要なライブラリをざっくりと書きます。

freezed x riverpod x flutter_hooks は組み合わせで State Management で使用しています。楽にかけてとても良きですね。mockitoはUnitTestingの際によく使用します。Flutterはmockitoを使ったmockの準備やWidgetTestingが結構強力で「もうここ動作確認したくないや」ってときにテストを書くハードルが下がってとても良いです。

Firebase(and GCP)

使っているサービスをずらりと。これ以外にもあるかも

  • Analytics
  • Crashlytics
  • Cloud Firestore
  • Firebase Cloud Functions
  • Cloud Messaging
  • Firebase Auth
  • BigQuery

守備範囲が広く取れてFirebaseってやつは良いですね

CI

PRごとのテストはGitHub Actions, Deploy系はBitriseって分け方にしています。BitriseはCodemagicでも良いなと思ったのですが、OSSによるPricingの工面がサポートが連絡しないといけなかったのと、証明書等を預けておけてスクリプトが動けばどこでも良いな。って気持ちだったので慣れているBitriseにしました

Web Pages

FAQやリリースノートはWebで管理したほうが便利かつPilllではドキュメントはNotionを最近使用していました。なのでこういった静的に置くWebページもNotionで置いておけたら良い。かつNotionでもデザインをPilllらしくしていけたら良いよね。などの願望を叶えてくれるツールであるAnotionを使用しています。最近公開したばかりなのでコンテンツ等もまだ少ないのですがデザインがカスタマイズできてNotionで書いておけば気軽にホスティングできてとても良きです

Anotionで作ったPilllのページです pilll.anotion.so

楽しい?

ここまで読んで「と言いつつbannzaiは性別♂だから開発しててどうなの」って思う方がいるかもしれません(というか僕もどうなんだろうと思っていた)。最初はとりあえずohanamizukiさんと久しぶりに一緒に開発するのも楽しいし、やりたい技術を試したりできるのと理性で考えたときに市場規模が良い感じにニッチだけどそこそこ大きく、競合も少ないからそういう意味で可能性を感じて身を乗り出しました。それで実際やってみると機能開発等は二人で開発のコスパ含めて議論するのですが、課題自体は割と明確で(おそらくは)何の障害もなく使用者の気持ちになって良い提案ができていたり、その結果AppStoreでの評価や使用者数の数字が右肩上がりに出ているようにポジティブな評価が目に見えたり、意外だったのがアプリ内で用意している問い合わせ用のフォームから礼を言われることもしばしばあります。また、開発者が募るSlackで「最近こういうの作っているんですよ」っていうと意外とユーザーが身近に何人もいたりしてそういうこともありモチベーションは結構高いです。というわけで今楽しんで開発をしています。

まとめ

以上、最近こういう事もやっているよ活動報告でした。ユーザーの人は今後どんな機能追加するの。とか気になる人もいると思いますがそれは今後のお楽しみということで楽しみにしていてください。また機会があったら開発者向けのブログやらサービスを運用していての知見も記事にしていけたら良いなと思っています。

最後に一言だけ、GitHub,AppStore,Google Play Storeのアカウント持っている方へ。ぜひPilllのページまで行って

スターください 🌟

おしまい\(^o^)/

2020年の振り返り

振り返り

振り返り記事ってやつを書いてみたくなったので書いていく。

前置き

コロナの影響で例年の10分の1くらいしか外出してないようなそんな特殊な年でしたね。旅行とかほとんどできなかったので私の生活に起きて主にTwitterに書いてあることを雑多にまとめる記事です

ライフログ

まずはある程度の時系列順で起きたこと書きます

フリーランスになりました

前職に退職の意思を伝えて初めてのTwitter転職ってやつをしました

1ヶ月くらいで決まりました

退職時の同僚からのプレゼントのセンスには震えた

今はクックパッドマートのサービスを開発をしています。フリーランスとして活動しています

スプラトゥーンにめっちゃハマった

外出する時間が減った代わりに家にいる時間が爆増しました。ゲームに手を出し始めました。たぶん4末か5月くらいからやりはじめたのが妹との会話ログから追えます

f:id:bannzai:20201229084757p:plain
妹との会話

1日5~8時間くらいやってました

ここまでは順調。後述する家が無くなったことにより安定してゲームできる余裕がなくなってしまった

家がなくなりました

東京から出て福岡に引っ越す予定でした

福岡の絵審査会社の審査も通り順調に引っ越しが進んでそうな雰囲気を途中まで出してました

しかし、契約書について説明を求めたら仲介業者から手を切られました。契約書届いたし家を解約しちゃった後です。家を無くしました

家が見つかりました

4ヶ月くらいかけて家を見つけることができました。やったね。このブログを書く1週間前の話ですね。

ハッカソンで最優秀賞取りました

いえーい

戦利品です

その時書いたブログです

bannzai.hatenadiary.jp

人生が漫画になりました

よかったら読んでください

モーメントにまとめてあるのでここから一気に読めます

1800 スターもらいました

経緯。1800スターついているライブラリを譲り受けることになりました bannzai.hatenadiary.jp

3200スターもらいました

1800スターもらった話をSwift愛好会というイベントで話したら、同じ回で登壇していた @k_katsumi さんから 3200スター付いているライブラリを譲り受ける事になりました

love-swift.connpass.com

作ったやつ

作っているやつも含めるとまだあるのですがとりあえず完成したOSSをおいておくのでスターください

switchecker

Gedatsu

XChanger

まとめに入る前にまとめてく

毎年何かしらあるのですが家を無くしたり、漫画にされたりといった体験は初めてでした。家を無くした後しばらく「最近何してる?」と聞かれた時に目を血走らせて「屋根付きの家を探してる!」って言えば微笑くらいは取れたので便利で良かったです。だんだんみんな家が無いキャラに飽きてきたので家を見つけました

とはいえ住環境が安定してないと生活にも悪影響が出て全くやりたいことがはかどらなかったので住環境って大事だなあ。って思いました。OSSだけみても家があるときにしか出してない。自分の好き勝手しほうだいなスペースがある幸せを噛みしめてます。あと住環境整ったしゲーム環境も整備して遊んでこう。OSSも書いてスター乞食していきたい。スターください

過去が描いてある漫画については個人的に「言っても面白くないな」って感じだったのですが、こうやってネガティブなことでもポップにテンポよく話が伝えることができて作品を通じての表現ってすごい。そういった点に感動しましたね。こういう表現ができるの良い

あとフリーランスになりました。これも初めて。職場によるけど正社員時代と何が変わったかと言われるとそこまで変化は無いです。最近思ったことは評価制度がある会社だと評価の対象から外れやすい立場だな。と思いました。個人的には嬉しい点

ハッカソンちょいちょい参加してますが予選・本選を通しての1位というのは初めてでした。ハッカソン自体久しぶりに参加しましたがやっぱり楽しいのでもっと参加していきたいですね

リポジトリごとスターをもらえる体験も初めてです。お二方ありがとうございました。みなさんからのリポジトリごとスターもお待ちしております

振り返り記事も書いたのは初めてです。というわけで初めてがいっぱいの年でした。まだ僕に初スター上げたことない人は今がチャンスです。こちらのアカウントのリポジトリすべてにスターを付けてください

github.com

来年の抱負

スター欲しい

まとめ

いっぱい書いちゃった。最後にひとことだけ

スターください 🌟

おしまい\(^o^)/

引っ越しに失敗して家を失ったけどSPAJAM2020ハッカソンで最優秀賞を獲った話

引っ越しに失敗して家を失ったけどSPAJAM2020ハッカソンで最優秀賞を獲った話

SPAJAM2020というハッカソンに出場し最優秀賞を獲得しました。この記事では作った作品の紹介や今の気持ち、チームへの感謝。それとは別に僕が家を失った話を時系列をあわせて書いていきます。

引っ越しに失敗した話

突然ですが引っ越しに失敗しました(2020/08/17)

ちなみに引っ越しが失敗するとも露知らなかった時の様子です

「おひっこし」

SPAJAM2020ハッカソンに出場したいと思い7月にチームビルディングして、その当初引っ越しをするメンバーが全体の過半数(僕も引っ越す予定だった)を超えていたので「おひっこし」というチーム名にして応募し第二回予選を応募しました。ちなみにこの頃は家がありました。下の画像はDMでチーム名の決定、および予選の申込み直前のDMの発言です。日付は 2020/08/13 です。4日後家がなくなることが決定します

f:id:bannzai:20201109230848p:plain

予選

「おひっこし」の第二回予選の結果は 優秀賞最優秀賞 を獲得できず惜しくも1位にはなれませんでした。

SPAJAMでは出されたお題に沿ったアプリを作り、それをもとに審査基準にそって評価を競う場となっています。予選のときのお題は交流で、「おひっこし」でパシャっと交流できる イマージ というアプリを作成しました。作っている本人たちがわいわい楽しく開発できて本当に楽しい予選でした。

www.youtube.com

ちなみにこのときにはもともと住んでいた家を出ており、私が住む権利を主張できる住居は無くなっていました。一言でいうと言えを失いました。家を失ってから1週間後くらいにハッカソンだったかな

本選出場チームに選出

SPAJAM2020の本選出場への権利の獲得は2つの道がありました。

  • 計5回の予選で選出される最優秀賞を獲得したチーム
  • 1度の予選で最大3チーム選出される優秀賞なのですが、その予選で優秀賞を取った最大15チームからさらに篩をかけられた3チーム

以上の2つの方法から本選出場の権利が付与されるシステムになっています。第二回予選で「おひっこし」は優秀賞だったのですが、この本選出場できる3チームの中の一つに選んでもらい本選出場が決定しました。

この時のステータスは「いろいろなバタバタが落ち着き始めて回復してきたからまた家を探そう」と前向きに思っていた時期でした。そうです。まだ家がないです。

本選

本選出場してまず受付とチーム紹介から始まりました。予選のときにもあり、ほとんど内容が一緒なのですがせっかくなので紹介したいと思います。

チーム「おひっこし」です。僕たちのチーム名の由来はチーム結成時にメンバーの過半数が「おひっこし」をする予定だったので「おひっこし」というチームになりました。しかし、代表者である僕は「おひっこし」を失敗しました。結果家を失いました。他のメンバーは「おひっこし」を成功させています。ここまでが予選でも紹介した時のステータスです。さて、本選当日である今日なのですが... まだ家が見つかってません! よろしくおねがいします!

こんな感じだったと思います。ちなみに審査員の方々の反応です。

本選の最優秀賞の賞品の一つが温泉券10万円(1人に付き)と知り燃えました。1ヶ月分くらいの住まいが確保できると思ったからです。

f:id:bannzai:20201109235639p:plain

肝心の本選でのお題は観光。そして、「おひっこし」では 地元を観光地化してポスター化して共有するアプリ ぽすすめ を作りました。

www.youtube.com

アプリのアイディアを出して、デザインをお越し、アプリを作り、プレゼンの資料づくり、紹介動画の撮影等とにかく24時間以内にメンバー全員がやることが多くてとにかく大変でしたがちゃんと動くアプリ、魅力を目一杯凝縮したプレゼン資料が完成して やりきった 感が強かったのがとても記憶に残っています。

そんな感想を胸のうちに抱えている(普通に口にも出してたけど)アプリだったので結果が出るまで予選以上の緊張がありましたが、審査の結果発表時に 最優秀賞 として選出してもらえたときには久しぶりに嬉しくて「うっしゃ!」って声を出すほど嬉しかったです。言葉通り結果オーライで、予選のときに最優秀賞を逃したこと、本選の前日に乗り物酔いがひどいのでチームメンバーが集合する場所に前泊していたこと、 徹夜で頭を働かせながら作りきったこと、持ち家が無いこと。すべてのここまでに至るネガティブだったことが報われました。最後のだけ嘘です。家は欲しいです。

でもとにかく嬉しかったですね。嬉しすぎて本選の最初の方で「最優秀賞獲ってなにか一言求められたら『賞品の温泉券で1ヶ月分の屋根付きの宿に宿泊する権利がもらえて助かりました!』とボケを入れよう」と思っていましたが、本当に頭の中が喜びに支配されてボケを言う余裕がなくて、実際に 最優秀賞を獲得した気持ちどうぞと審査員に振られたときは普通に喜びを伝えるだけの返答になってしまいました。最後の最後でキャラブレを発生させてしまいました。後悔はしてないですが反省はしています。

反省です

審査員の方からの最優秀賞を獲得の紹介ツイートです。

すぐ下のツイートで芸人枠として捉えられていることを実感しました。

SPAJAM2020のHPにも最優秀賞チームとしても掲載してもらいました

まとめ

予選・本選で個人的にチャレンジしたことや良かったこと・次に生かせること等も色々あるのですが、長くなりそうなので割愛します。また直接会う人もいると思うのでそういう機会があれば話題のネタにでもしてください。

最優秀賞が獲得できて本当に良かった。チームメンバーの gaopin1534 koooootake noa_design51 yutailang0119 を誘って良かった。最高の結果になったし本当に感謝の気持ちがいっぱい。

そして、次は「家が決まった!」のブログが出したい...
お家は見つかっていませんが、 https://github.com/bannzai/ ではいつでもスターを受け付けています。

bannzaiハッカソン優勝おめでとう!家なくなったのどんまい!おまwキャラブレwクソワロタw と思っているそこのあなた!

スターください 🌟

おしまい\(^o^)/

1800スターもらった話

こんにちは。bannzaiです。このブログを読んでいる人の中には私が スター乞食 と呼ばれていることを知る人も少なくないでしょう。
今日は一瞬にして1800スターを獲得できたすごそうなお話をします。

経緯

この1.8kのスターが増えた経緯は実はTwitter上で確認できるので見ていきましょう。

すごそうなツイート

すかさず反応。すごそう

1.8kのリポジトリを持っていた人からのリポジトリ移譲提案。すごそう

移譲

そもそもリポジトリ移譲ってスターも引き継がれるのか。当然の疑問を持ちました。スターが引き継がれなかったら引き継ぐ意味がない(言い過ぎ)なのですが、ちゃんとGitHubのドキュメントにもスターも引き継がれると書いてあり安心して スターをもらう Geccoのメンテを引き継ぐことを承諾しました。

https://docs.github.com/en/github/administering-a-repository/transferring-a-repository

What's transferred with a repository?

When you transfer a repository, its issues, pull requests, wiki, stars, and watchers are also transferred. If the transferred repository contains webhooks, services, secrets, or deploy keys, they will remain associated after the transfer is complete. Git information about commits, including contributions, is preserved. In addition:

f:id:bannzai:20200916202548p:plain

ついに

とはいえさすがに無条件ではなく、メンテとその時に存在していたissueとPRの対応とCloseをお願いされたので え、そんなことで1800スターもらえるんですか!?馬車馬のように対応します! やっていくぞ。って気持ちで対応しました。 そして、移譲の条件を無事クリアして届いたメールがこちらです

f:id:bannzai:20200916203309p:plain

うひょーい f:id:bannzai:20200916203800p:plain

Gecco

詳しくはリポジトリのREADMEに書いてあるので見てください https://github.com/bannzai/Gecco

UIのガイドとして使えます

https://cloud.githubusercontent.com/assets/6880730/12470510/2d1cb602-c038-11e5-8095-a2a0d77f99db.gif

まとめ

スター乞食のロールモデルとして新境地を開けました。
みなさんからの大量にスターがついているリポジトリを移譲するムーブもお待ちしております。

1800スターは大きな成果ですがみなさんからのスターはいつでも受付中なので、Geccoに

スターください 🌟

おしまい\(^o^)/

解脱してAutoLayoutのエラーログをスラスラ読もう

解脱してAutoLayoutのエラーログをスラスラ読もう

解脱(Gedatsu)をすればAutoLayoutのエラーログもスラスラ読めるようになります

解脱前 解脱後

解脱を入れるには

CocoapodsでもSwiftPackageManagerでもCarthageでもマニュアルインストールでもいいですが、まずはGedatsuのInstallセクションを見て、Gedatsuをプロジェクトにインストールしていきましょう

解脱するには

解脱するのは簡単です。AppDelegate.application:didFinishLaunchingWithOptions:Gedatsu.open をして悟りを開くだけです。 DEBUG フラグで囲むのを忘れないように

#if DEBUG
import Gedatsu
#endif

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    #if DEBUG
    Gedatsu.open()
    #endif
    return true
}

解脱の仕組み

どうやって私が解脱まで到達できたのか少し紹介します。まず Gedatsu のエントリポイントとなる関数を見てみましょう。ここでは標準エラー出力までに途中に処理を挟んでいます。次にUIKitのPrivate APIをフックしている関数を見ます。

Gedatsu.open

コードはここです

internal func open() {
    _ = dup2(STDERR_FILENO, writer.writingFileDescriptor)
    _ = dup2(reader.writingFileDescriptor, STDERR_FILENO)
    source = DispatchSource.makeReadSource(fileDescriptor: reader.readingFileDescriptor, queue: .init(label: "com.bannzai.gedatsu"))
    source.setEventHandler { ... }
    source.activate()

普段iOS開発たちでは使わない関数たちばかりですね。僕も初めて使いました。ここらへんの関数たち説明を書こうと思ったのですが思ったよりボリューミーだったので途中から挫折しちゃいました。(てへ

なので簡易的な説明だけ書いておきます。参考のリンクも貼っておくので興味があったら調べてみてください。簡易的な説明すると 1つめの dup2writer.writingFileDescriptor を通して標準エラー出力に書き込めるように。2つ目の dup2標準エラー出力の書き込み先を reader.writingFileDescriptor にしています。DispatchSource.makeReadSource では監視したいファイルディスクリプターを渡して、setEventHandler で監視対象のイベントのハンドリング、activate で監視の開始をしています。

あと途中まで詳しく書こうとして断念した文章をおいておきます。情報量はあまり変わりませんがもう少し丁寧な言葉づかいになっています。

途中まで詳しく書こうとして断念した文章

dup2はファイルディスクリプタを複製するシステムコールの関数です。duplicateの略ですね。2はきっと引数の数です。ファイルディスクリプタはファイルに対して割り当てられている識別子です。参照先のファイルを表すポインタみたいなやつです。少し説明を省略しますが、1つめのdup2writer.writingFileDescriptorを通して標準エラー出力に書き込めるように。2つ目のdup2で 標準エラー出力の書き込み先をreader.writingFileDescriptor` にしています。

readerやらwriterといったものは Pipeのラッパーです。例えばReaderの中身だとこんな具合です。Pipeで用意されたファイルに書き込まれると(2つ目のdup2を思い出してください)ファイルが読み込めるようになります。

internal class ReaderImpl: Reader {
    let pipe: Pipe = Pipe()
    var writingFileDescriptor: Int32 { pipe.fileHandleForWriting.fileDescriptor }
    var readingFileDescriptor: Int32 { pipe.fileHandleForReading.fileDescriptor }

    func read() -> Data {
        pipe.fileHandleForReading.availableData
    }
}

次に DispatchSource.makeReadSource で行っていることは reader.readingFileDescriptor を監視するために渡しています。きっと指定したファイルディスクリプタに向いているファイルに変更がある場合にデータを読み込むように割当られる仕組みなんでしょう(雑な理解。source.setEventHandler で変更を検知したときに実行したい処理内容を書きます。この場合はAutoLayoutでエラーが起きた時点のデータからログを整形してコンソールに流す。それ以外は整形せずにコンソールに流す。といったことをしています。最後の source.activate() で監視を始める流れになっています。

通常何かしらのエラーのログや出力は標準エラー出力書かれてコンソール上に出てきます。もっと噛み砕くと 1. Process X < 標準エラーにログ書くぞ 1. 標準エラー < Process X から書かれるぞ!書かれてるぞ! 1. 標準エラー < 書かれたからコンソール上に出してくれ みたいな流れです。

UIView.engine:willBreakConstraint:dueToMutuallyExclusiveConstraints:

2つ目のUIKitのPrivate APIのフックです。コードはここです こちらはシンプルにObjective-CのRuntime APIを Swiftから呼び出してメソッドを入れ替えることで途中の処理を挟んでいます。

internal static func swizzle() {
    guard let from = class_getInstanceMethod(UIView.classForCoder(), NSSelectorFromString("engine:willBreakConstraint:dueToMutuallyExclusiveConstraints:")) else {
        fatalError("Could not get instance method for UIView.engine:willBreakConstraint:dueToMutuallyExclusiveConstraints:")
    }
    guard let to = class_getInstanceMethod(UIView.classForCoder(), #selector(UIView._engine(engine:constraint:exclusiveConstraints:))) else {
        fatalError("Could not get instance method for UIView.\(#selector(UIView._engine(engine:constraint:exclusiveConstraints:)))")
    }
    method_exchangeImplementations(from, to)
}

このPrivate API UIKitCoreの中のシンボルに含まれていました。 下記のコマンドで確認ができます。

$ nm /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/UIKitCore.framework/UIKitCore | grep engine:willBreakConstraint:dueToMutuallyExclusiveConstraints:

上記の2つを組み合わせて AutoLeyoutの制約のエラーが発生したときにコンソールに任意のエラーメッセージを出力する仕組みを実現しています。

解脱した人の声

まとめ

Gedatsuを望む方リポジトリはこちらです。
https://github.com/bannzai/Gedatsu/

そして解脱をした人もこれからする人も

スターください 🌟

おしまい\(^o^)/