Network Frameworkを使ったUDP通信チャットアプリのサンプルを作った

今年のGWは10連休だったわけだけど、あまりコード書く時間は取れなくて、終盤に何かやらないとやばいと思い立った。
そういえば、昨年のWWDC18で発表されたNetwork Frameworkに興味があったけど、結局使えてないなと思い出したので、ローカルネットワーク内でUDP通信するチャットアプリのサンプルを作ってみた。

github.com

これ自体はわざわざUDPを使う必要もない実装ではあるのだけど、これをベースに例えば動画や音声コミュニケーションを実装したいなと思っている。
これが本当のサーバーレスや!!! *1

Special Thanks

実際は @shu223さんのブログを、大筋真似ただけなんだけども、やってみると、大枠は掴めた。

shu223.hatenablog.com

締め

書き出しが遅かったので、GW後にもちょっと手直しする必要が出てきて、結局月末までかかってしまったけど、なんとかWWDC19が始まる前に触れてよかった。

*1:違う

fastlane deliverでiPad Pro 3rd generationのスクリーンショットアップロードができるようになった件

App Store ConnectではiPhone XS Maxおよび、iPad Pro 3rd Generationのストアスクリーンショットが必須になった。
(いわゆるベゼルレス筐体)

Upcoming App Store Submission Requirements - News - Apple Developer

Starting March 27, 2019, all new apps and app updates for iPhone or iPad, including universal apps, must be built with the iOS 12.1 SDK or later and support iPhone XS Max or the 12.9-inch iPad Pro (3rd generation). Screenshots for these devices will also be required.

ところで、fastlane deliver では、アップロードするストアスクリーンショットの種別判別に、画像の解像度 (resolution) に基づいて、振り分けを行っている。
そして、12.9-inch iPad Pro (2nd generation)と12.9-inch iPad Pro (3rd generation)は、同じ 2,732 x 2,048ピクセル解像度、264ppi ...
勘のいい皆さんはお気づきでしょう、この状態でアップロードすると、2nd generationのトラックに3rdの分で用意したスクリーンショット画像もアップロードされていた。
-> [deliver] Cannot upload iPad 3rd generation screenshots · Issue #14116 · fastlane/fastlane · GitHub

3rd分だけ手でアップロードするしかなかったし、Appleのレビューはユーザーが使用している端末と違う筐体型のデバイスが写っているスクリーンショットを当て込んでいると、metadata rejectしてくる。

本日、12.9-inch iPad Pro (3rd generation)も区別してアップロードできるようになった fastlane 2.121.0 がリリースされた🎉
https://github.com/fastlane/fastlane/releases/tag/2.121.0

さて、どのように実現されているかを見てみる。
https://github.com/fastlane/fastlane/commit/15c80c227bf249e913a8429520496d3e5ad95a69

To solve this issue 3rd generation screenshots must contain (3rd generation) part in the name of screenshot. *1

...
......
.........
現場からは以上です。

追記

追記2

2.121.1 を使いましょう。

*1: supplyのようにディレクトリを分ける案もあるけど、App Store Connectの場合、スクリーンショットを別端末サイズに流用する機能もあって、大変なんだと思う

キングダム ハーツとyutailang0119

これは何

会社の朝会で話したやつ2
前回

今回はキングダム ハーツの話をした。

本題

ちょっと旬は過ぎましたが、キングダム ハーツⅢ 発売されましたね、めでたいですね。

キングダム ハーツとは

スクエア・エニックスがディスニー協力の元、制作/販売しているRPGゲーム作品、およびそのシリーズ。
ミッキー、ドナルド、グーフィーが武器を振り回したりするゲーム。
KHオリジナルのキャラクターの版権も、全てディズニーが持っている。

ナンバリングタイトル (KH1, KH2, KH3) がソラが主人公の正史、それ以外は外伝という扱い (だったはず)
KH2から3の間に5作の外伝をはさんだもの、正史を13年待った。
ナンバリングタイトル以外もやらないと、普通に話がわからない。

2002年3月28日発売のKHが発売されてから17年、ダークシーカー編という大きな1章が完結したが、まだまだ終わりが見えない。
KH10周年の時に、20周年には完全完結するだろうと言われてたけど、絶対3年後までに次作が出ているのかさえ怪しい

発売順 ≠ 時系列ではなく、さらには同じ名前の人物が複数人いて、輪をかけて混乱する。
でも、KH3までやると、いろいろと繋がるので、ぜひやってほしい。

id:yutailang0119 の時系列順キングダム ハーツ

キングダム ハーツ ファイナル ミックス (KHFM)

2002年12月26日発売
初めてプレイしたキングダム ハーツ
好きなワールドは ハロウィンタウン (ナイトメアー・ビフォア・クリスマス)
発売は2002年12月26日だけど、この頃はPS2は持ってなく、春に新しくクラスが一緒になった友達の家でちょっとずつやって進めた記憶があるので、2003年の4月頃にやったんだと思う。
当時、小学5年生。
ファイナル ミックス (以下、FM) は北米版ベースに追加要素が加わった英語版で、英語のゲームをしているだけでもかっこいい感じがしてた。
ちなみにここまでスクエア発売らしい。 *1
記念すべきKHシリーズ始まりの物語なので、ぜひやってほしい。

キングダム ハーツ チェイン オブ メモリーズ (COM)

2004年11月11日発売
ナンバリングタイトルじゃないけど、これは正史。
好きなワールドはやっぱり ハロウィンタウン (KH1とワールド構成がほぼ一緒) 当時、小学6年生で、ゲームボーイアドバンスは持っていたので、クリスマスに買ってもらった。
KHシリーズとゲームシステムが全然違って、ひどく落胆した覚えがある。
今考えると、ソーシャルゲーム感ある。

自分はKHキャラクターの中で、リクが好きだったので、シナリオはおもしろかったので、ぜひやってほしい。

キングダム ハーツⅡ (KH2)

2005年12月22日発売
好きなワールドは タイムレス・リバー (蒸気船ウィリー)
中学生になっていたので、かなり自由にゲームを買えるようになっていたので、自分で買った。
ゲームシステムがかなり改善されているし、シナリオが本当に泣けます。
裏ボスまで辿りつく気力がなくて、後述のFMでやって驚いた。

ここからKH3の発売を13年待つこととなる。
今なら待たずにKH3までできるので、ぜひやってほしい。

キングダム ハーツ 358/2 Days (Days)

2009年5月30日発売
好きなワールドは トワイライトタウン (KHオリジナル)
ⅩⅢ機関と呼ばれる、前作までの敵視点で進めていくので、ちょっとディズニー感が薄くて、物足りないかも。
DSだったので、高校の休み時間にやってた。
今後のKHシリーズで重要な情報が紛れている可能性があるので、ぜひやってほしい。

キングダム ハーツⅡ ファイナル ミックス+ (KH2FM)

2007年3月29日発売
コンテンツがKH2とCOMのリミックスだったので、2010年くらいに後からやった。
KH2でまた泣いた。
2回KH2で泣きたい人は、ぜひやってほしい。

キングダム ハーツ Re:コーデッド (Re:Coded)

2010年10月7日発売
好きなワールドは 忘却の城 (KHオリジナル) 元々携帯用ゲームで展開していたものシナリオを、DSに移植したもの。
Daysの続きでやってた。
今考えると、受験期によくやれてたと思う。
手軽にできるので、ぜひやってほしい。

キングダム ハーツ バース バイ スリープ ファイナル ミックス (BbS)

2011年1月20日発売
好きなワールドは レイディアントガーデン (KHオリジナル) BbS無印は2010年1月9日に発売されてたんだけど、英語版がやりたくて待ってた。
結果、受験期に直撃して、受験が終わるまで我慢した。
受験が終わってぶっ通しでやって、1日ちょっとで終わらせた。
これも本当におすすめできるので、ぜひやってほしい。

キングダム ハーツ ドリーム ドロップ ディスタンス (DDD)

2012年3月29日発売
好きなワールドは シンフォニー・オブ・ソーサリー (ファンタジ)
ソフトだけ友達に借りてやった。
約10周年のタイトルで、操作性をかなり刷新して賛否両論あるけど、自分はおもしろかった。
シナリオの印象は薄めだったけど、KH3の直前の物語で、やっていてよかったので、ぜひやってほしい。

キングダム ハーツ ユニオン クロス (Uχ)

iOS/Androidソーシャルゲーム
惰性でやってたけど、KH3の腹落ち感のためには必須だったので、ぜひやってほしい。

キングダム ハーツⅢ (KH3)

2019年1月25日発売
全部のワールドがよくできてて好きだけど、1つだけ上げるなら トイボックス (トイ・ストーリー)
最高、待ってた。
本当にダークシーカー編の完結って感じで、とてもよかった。
エピローグとシークレットムービーを見ると、まだまだまだまだ物語は続きそうだなぁとなった。

これのためにPS4 Proと42inch 4Kディスプレイを買った。
買うだけの価値があったので、みんな買って、ぜひやってほしい。

クリアResult

キングダム ハーツ キー バックカバー (χ BC)

実はKH3が終わってから、キングダム ハーツ HD 2.8 ファイナル チャプター プロローグを買って、やっと新規映像特典のχ BCを見た。
KH3やる前に見ておくべきだったので、ぜひ先に見てほしい。

今やるなら

これで全部できる

store.playstation.com

全部はやっている暇はない人向け

www.jp.square-enix.com

で気持ちを高めて、 KINGDOM HEARTS INTEGRUM MASTERPIECE | 公式PlayStation™Store 日本 を気づいたら買ってほしい。

最後に

可愛いドナルドの姿をお楽しみください。 (⚠️KH3の画像を含みます)

挟まるドナルド

*1:この後からはスクエア・エニックス

数字で見るはてなに入社1周年

ちょっと遅くなったけど、2/11 (月) で、株式会社はてなに入社して1年が過ぎた。

なにかしらの数字にして、振り返ります。

業務で書いた言語: 4つ

あたりが主。
拡張子レベルの粒度だと、fastlaneとかGradleとかJenkinsfileとかxmlとかもあるので、10は超えそう。

チームの移動: 1回

株式会社はてなに入ってからの半年を振り返る - がんばってなんか書く にも書いたけど、マンガチームから、ブックマークチームに移動して、今ではテックリードに近いロールも担当している。
やりたいことはいっぱいあるし、しばらくはブックマークかなぁと思っている。*1

有給休暇取得: 0日

入社半年で付与された10日丸々残ってる。
柔軟に働けてるので、手続きのために有休取らなきゃいけないなんてことがない。

それはそれとして、今までもそんな有休取らないタイプだったかも。

所定休暇日以外の休み: 5日

有給休暇の取得と辻褄合わないじゃんと思われるけど、それ以外でも休みがある。
有給休暇付与までの間に上長承認があれば使える特別休暇で休んだ。
WWDC後にサンフランシスコ観光して1日と、実家から新幹線出社してる最中に地震で動けなくなってしまって1日使った。
それ以外に夏休みで3日 *2 あった。

実家 (福岡) への帰省: 2回

前述の地震で痛い目を見たので、億劫にはなってしまったけど、年2回は自分にしては多い方。
新幹線でシュッと帰れる距離なのは、非常に楽。

査定: 2回

はてなは8月が期初で、半年に一度の査定なので、タイミングよく2回。

年収昇給: 30万強

じゃあ、給料いくら上がったのって思われる*3と思うので、少しぼかしで書いたけど、こんなもん。
2回経てもこんなもんか…
200万くらい、ぽんと上がるとよいんだけどなーとは思う。
ついでにグレードも上げたい。

副業: 1社

昨年末から副業でiOSアプリ開発をしている。
とりあえず3ヶ月という契約でスタートしたけど、昨日確認したら継続したいとのことで、自分も特に不満がないので、継続になりそう。
GraphQL最高。
はてなは副業は許可制なので、ちゃんと申請した上で始めた。

何かおもしろい仕事があれば、ご相談ください🙌

個人ブログ: 19本

年間比で2倍 (前年10本) なので、数値としては大きく増加。
絶対数でいうと、もう少し書きたいですね。

Hatena Developer Blog: 5本

Advent Calendarあたりから、Developer Blog大臣をするようになったので、コンテンツ考えたりもしています。
次年はもっと書くことになるはず!

まとめ

主だったものを数字で上げてみた。
昇給のこととか書いてるので、怒られが発生するかも?
また半年後にお会いしましょう。

*1:あくまで個人の思惑で、マネージメント層がどう考えているかを反映したものではない

*2:特に予定もなくて、結局年末に使ったけど

*3:自分でも思う

2019年の誕生日を迎えた抱負とか課題感とか

あけましておめでとうございますには、もう遅い時期だけど、2019年最初のブログ

誕生日を迎えた

先週の1/19 (土) に誕生日を迎えまして、26歳になった。

お祝いくださった皆様、ありがとうございます!!!

抱負

26歳の抱負は「人、チームとの向き合い方の再考」

背景

2019年の年明けから、チームメンバーが推してくれたこともあり、所属チームのモバイルアプリ側のテックリード (以下、TL) に近いロールを拝命した。
近いと濁したのは、チームレベルのTLは別でいて、自分はあくまでその中のモバイルアプリ側を担当することから。

はてなに於いてのTLはポジションではなく、ロールとして位置づけられている。

形式的には、テックリードにはチームの技術的な窓口となってもらっています。

はてなにおけるテックリード、そしてサービスプラットフォームチームのテックリードについて - Hatena Developer Blog

また、テックリードには、ディレクターなど非エンジニアとエンジニアとの橋渡し役になることも期待しています。技術的な事情に関する説明責任を果たしたり、技術的な側面から意思決定の手助けをしたりと、チームのエンジニアを代表する存在でもあります。

はてなにおけるテックリード、そしてサービスプラットフォームチームのテックリードについて - Hatena Developer Blog

実は自分にこういった役割が回って来たのは、アプリケーションエンジニア人生初めての経験。
はてな入社前は、だいたいの場面でiOS1人/Android1人/他サーバーサイド/フロントエンドみたいな環境にいることが多かった。
たまにiOS2人という時期も自分はサポートだったし、そもそもスマホアプリが3人以上ということに出会わなかった気がする。

今回、いろいろなタイミングが重なって、モバイルアプリメンバー内にも必要になるフェーズだと思っていたけれど、なんとなく別の人がやるもんだと思っていた。

課題感

まだ今年は1ヶ月も経っていないけど、すでに課題感は感じている。

経験

前述の通り、こういうロールの経験がないことで、歯がゆい気持ちになることが起きている。

  • チームビルディング
  • ソフトウェア工学の知識
    • プログラミング全般
    • 見積もり
  • 他メンバーのケア
  • TLとしての立ち振舞

やってみて、今更ながら足りない部分が見えてきた。
そもそもでエンジニア組織自体のメンタリングの経験もないので、無勉強で突入したのがよくなかった。
本を読むだとか、単純に知識をインプットすることで緩和できることもあるはずなので、おすすめのトレーニングがあれば、知りたい。
新しい言語を学ぶ時と同じように、チュートリアルをやって、ドキュメントを読むべき。

人間的面

それとは別で、人間性の部分もネックになっていると思う。
元からの自分を知っている人ならわかると思うけど、恥を忍んで言うと、基本的に自分は口調が強いし、イライラを態度に出しがち。
前々から自覚はあるので、最大限の注意を払って気をつけてはいたのだけど、去年晩秋くらいから度々反省することがあった。

これの解消に効く薬はないとは思うものの、今現在の自己分析では心の余裕が足りないからかなと思っている。

まとめ

そんな26歳の抱負と滑り出しだった。
相談乗るよという人がいたら、いつでも声をかけてください。

今年に限らない目標だと、「挑戦」
はてなバリューズの一つに挑戦が好きというのがあるし、 はてなのエンジニアのバリューズ - Hatena Developer Blog を支えるのも挑戦だし、まだまだやれてないこと、やりたいことは無数にあるので、今年もいろいろやっていきたい。

去年の誕生日は有給消化期間で、転職や京都に来る直前だったので、そういった環境変化への不安だったので、たいぶ様変わりした。
もうすぐ、はてなに入社して、そして京都に移住して1年になるので、それもまたよきタイミングでまとめを書く。

apple/swift-syntax超々入門 UIColor編

これは Swift Advent Calendar 2018 24日目の記事です。
昨日23日目は @uounɹɐʇの「Conditional Conformanceで遊ぼう」でした。

前説

先日福岡で行われた 第5回 HAKATA.swift ~福岡でSwiftの勉強会~ でLTとして話した内容です。

apple/swift-syntax とは

github.com

READMEの冒頭には

SwiftSyntax is a set of Swift bindings for the libSyntax library. It allows for Swift tools to parse, inspect, generate, and transform Swift source code.

とあり、Swiftの

  • 解析
  • 検査
  • 生成
  • 変換

に用いることができ、所謂、メタプログラミングに使用できます。

メタプログラミングについてはこちらがおすすめ

speakerdeck.com

お題

iOSで色を扱う場合にお馴染み、UIKitデフォルトAPIとして提供されるイニシャライザ

UIColor.init(red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat)

ですが、これには以下のような不満点があります。

  • RGB1~255表現を0~1の少数値に変換して表現するため、直感的ではない
  • 特にデザイナーはHexColor (16進トリプレット) で知りたい

ということで、swift-syntaxをを用いて、コメントでHexColorを入れてみようと思います。

想定はこんなコード

Contents.swift

import UIKit

let string = "ABCDE"
let color1 = UIColor(red: 0.55, green: 0.0, blue: 0.0, alpha: 1.0)
let array = [1, 2, 3, 4, 5]
let color2 = UIColor(red: 0.0, green: 1.0, blue: 0.0, alpha: 1.0)
let dictionary = ["foo": 1,
                  "bar": 2,
                  "baz": 3]
let color3 = UIColor.init(red: 0.0, green: 0.0, blue: 1.0, alpha: 1.0)

用意したツールは こちら

github.com

$ swift run swift-color-detector help
dump \(path): Dump code
rewrite \(path): Add HexColor Comments and Save

まずは使ってみる

dump

これをdumpしてみると

$ swift run swift-color-detector dump Contents.swift
import UIKit

let string = "ABCDE"
let color1 = UIColor(red: 0.55, green: 0.0, blue: 0.0, alpha: 1.0) /* #8C0000 */
let array = [1, 2, 3, 4, 5]
let color2 = UIColor(red: 0.0, green: 1.0, blue: 0.0, alpha: 1.0) /* #00FF00 */
let dictionary = ["foo": 1,
                  "bar": 2,
                  "baz": 3]
let color3 = UIColor.init(red: 0.0, green: 0.0, blue: 1.0, alpha: 1.0) /* #0000FF */

と出力されます。

rewrite

$ swift run swift-color-detector rewrite Contents.swift

とすると、与えたpathのコードの書き換えも行います。

swift-syntaxを扱う主要なコード

今回のサンプルでswift-syntaxをメインで扱う部分は、以下ファイルの60行強で実現されています。

swift-color-detector/ColorSyntaxRewriter.swift at master · yutailang0119/swift-color-detector · GitHub

段階としては

  1. ColorSyntaxRewriter
    • イニシャライザに該当するコードを検査
  2. ColorInitializerSyntaxRewriter
    • UIColor.init(red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) を検査
  3. ColorLiteralSyntaxRewriter
    • Trivial (コメント) を追加

という3ステップで実現しています。

まとめ

いかがでしたでしょうか?
簡単に扱えそうな気がしてきませんか?

そもそも自分もメタプログラミングは挑戦を始めたばかりで、 apple/swift-syntax も手探りなため、最適解とは限りません。
ぜひ、アドバイスをもらえるとありがたいです。