あぼぼーぼ・ぼーぼぼ

のんびり生きたい

若月佑美卒業セレモニーで若様を見送ってきた

12月4日、会社の大イベントで夜勤をしていたのでお昼頃に家に帰り疲れまくっていたものの、夕方頃家を出て武道館に向かい、若様を見送ってきた。

www.nogizaka46.com

席は2階の真ん中あたり。決していい席とは言えないが、落選した人に比べれば行けるだけ幸せだ。というか席はもはやどこでもいいから行きたかった。多分ファンみんなそういう気持ちだと思う。

日本武道館でライブを見るのは初めてだ。東京ドームや神宮球場とは違って、ステージが近くに見える。それだけメンバーの姿もよりくっきり見えるので、ライブが始まる前から興奮していた。

19:00になり、影ナレが始まった。誰だかわからないけど泣いていた。泣きながらもハッキリとナレーションしていたのが印象的だった。後の自己紹介で、それは美月だということがわかった。影ナレは、美月、梅ちゃん、たまちゃんの3人が担当した。若月軍団の3人だ。

影ナレが終わってしばらくして、ライブが始まった。はっきりとは覚えてないけど、最初は暗転からのOvertureだった気がする。そのあとは、ダンサーみたいな人たちが踊って、真ん中から若様が登場した。ロボットダンスだった。若様のキャラ渋滞を引き起こしたキャラの1つである。そうか、今日は若様の色んなキャラが見れるんだな、そう思った。

もうあまり覚えてなくて時系列で書けないのでここからは感想。

普段のライブでは聞けないような曲がたくさん聞けたので新鮮だった、とくに私のような新参者からすると。あと途中途中に乃木どこや乃木中の映像が流れてて普通に面白かった。レズロボットのくだりとか。

手紙も最高だった。若様らしい文章だった。

あとは最後の最後、ステージ裏にはけるときの「やっぱ若月だな!」「(会場全体で)だな!」は感動したし、そのあと若様が泣きそうになっているのを見てたまらなくなった。

・・・と、ポイントポイントで何度か泣いたところはあったが、私が一番感動したのは、セレモニー全体をとおして感じられた若様の二期生に対する愛情だ

曲のチョイスもそうだし、若様のコメントもそうだし、二期生のコメントからも、若様が普段から二期生に対して愛情深く接していたことがわかり、それでもう私は胸がいっぱいになった。

というのも、ファンのみなさんならわかるだろうけど、二期生に関しては各所で不遇だと言われている。これからだというときに加入したものの、一期生の壁が厚く、なかなか歯がゆい時期が長く続き、そして気づいたら入っていたフレッシュな三期性。

蘭世もセレモニー中、「二期生に対して(ファンのみなさん)色々と思うことがあるかもしれないですけど・・・」というようなコメントをしていて、やっぱり二期生本人たちも歯がゆい思いをしているのかなと感じた。

この卒業セレモニーでは若様をはじめとした一期生が、二期生に対して以前から、そして普段から愛情深く接している様子を知ることができた。若様の卒業セレモニーではあるが、なんだか二期生が救われたような気がした。

とても安心した。やっぱ若月だな、やっぱ乃木坂だな、と思った。

若月佑美さん、7年間ほんとうにお疲れ様でした。

iOSDC 2018でLTしたのでその話とか

もう1ヶ月前のことなので忘れつつあるものの、とりあえず書いていく。

スポンサー応募を忘れる

iOSDC 2018のスポンサー募集を何かで見た。うちの会社でスポンサーやったらいいんじゃないと思い上司に提案して資料請求したりしてた。

上司も基本的に「いいじゃん」という感じだったので、スポンサーをやるていで進んでいた。

ある日、twitterでスポンサー募集が締め切られていることを知った。

忘れていた。

cfp応募まで

スポンサー応募を完全に忘れ、意気消沈していたが、もともとスポンサーやるなら誰か登壇しないとね、という話になってたのでぼくもcfpを出すつもりだった。

アプリチームにも当然のごとく宣伝はしたが、みな興味はありそうだったものの、誰もcfpを出したりせず、というかそもそもiOSDCに参加する予定の人はいなかった。

cfp決定

cfpを出そうとは思ってたものの、話す内容はとくに考えていなかった。

いろいろ漠然と考えて、Textureのことなら少し話せそうだなーと思って、軽い気持ちでLT枠/ルーキーズLT枠に応募した。

まさかの採用から当日まで

cfpを出してからは、仕事に追われ、iOSDCのことなど考えてなかった。

ある日メールが届いた。ルーキーズLT枠で採用されたらしい。

ここから登壇当日までの記憶はほとんどない。正直それほど肉体的/精神的にキツかった。

当日

案の定うちの会社からはひとりでの参加となった。

当日はもうなんかてんやわんやしてた。

お昼に接続テストしようと思ったら、ミニディスプレイポーとVGAの変換ケーブルが会場に無くて、池袋に買いに行ったりした。

会場で大学の頃の先輩と偶然出会ったりした。

発表

ある程度は練習していたので、練習のとおりに話していった。

みなさんちゃんと聞いてくれてありがとうありがとうありがとう、という気持ちで話した。

資料はこちら。

振り返り

K

  • iOSDC登壇経験(LT)をつめた
  • Textureについての知見が得られた
  • 大学の先輩に出会えた

P

  1. スポンサー応募忘れた
  2. 発表のために成果を出すのがキツすぎた
  3. 5分でわかりやすく伝えることができなかったと思われる
    • そもそも5分で話す内容ではなかったと思われる
  4. 変換ケーブル無くて焦った

T

  1. タスクに落とし込む
  2. カンファレンス駆動開発は今後一切しない
    • 話せる見込みがある内容で勝負する
  3. 伝えたい内容に基づいて発表時間を決める
    • ラクそうだと思ってLTに逃げない
  4. 変換ケーブルは事前に買っとく

おわりに

反省する部分も多いけど、また来年も何らかの形で関わりたいなーと思う。

あとLT後のビールが格別だったし、ストレスから解放されたあとの深夜のマクドナルド爆食は最高だった。

みなさん素晴らしいイベントを開催してくださって本当にありがとうございました。

iOSDC 2018 Reject Conference days1 参加レポ

1週間ほど空いてしまいましたが、先週 iOSDC 2018 Reject Conference days に参加してきました。

iosdc-reject-conference.connpass.com

DeNAさんでの開催でした。エントランスは綺麗でした〜。

f:id:aboy_perry:20180925012035j:plainf:id:aboy_perry:20180925012107j:plainf:id:aboy_perry:20180925012119j:plain

発表枠での参加ではないため、聞いたトークの雑感レポになります。

Make our Swift better

実際に自身が考えた改修案が、Swiftに取り込まれるまでのお話。すげ〜。

考案してからacceptされるまでに約6ヶ月かかったそうです。実フローの話は貴重ですねー。

ちなみに提案したDictionaryのメソッドは、Swift 5で使えるようになるそうです!やったね。

エンジニア経験を活かしたスクラムマスターとして 開発チームとプロダクトを成長させる

エモいタイトル!

スクラムの話ですが、私はというと現在アプリの仕事ではウォーターフォールを経験しています。ただ並行でリーダーをやっているAPI開発ではスクラムを目指しているため、興味がありました。

こういう系の発表を聞いていて思うのは、やっぱり一つの正解というのはなくて、チームにフィットした形を見つけることが大切なんだな〜と。

私もやっていきたい。いや、やっていくぞ。

RxTest/RxBlockingテストパターン

私も仕事ではRxSwiftを使っているので、他の方がどうやって書いているのか知れれば、と思い聞いていました。

スライド内ででてきたViewModelの書き方が私の書き方と似ていて、勝手に親近感が。でもRxで書くとだいたいああなる気がします。

TestSchedulerでのテストは書いたことがなかったので、とてもタメになりました。

制約のなかでContainerViewControllerを作る方法

最近とても複雑な画面を目にし、案の定実装もかなり複雑だったため、ContainerViewを使った実装やMicroViewControllerに興味がありました。

画面は作ってオワリではないので、複雑な画面ほど、保守性を意識して実装したいところです。

実際にTwitterぽいUIを作る上での試行錯誤が聞けたので、実用的な話として参考にしたいです。

おわりに

iOSDC 2018はcfpの数がとても多かったみたいで、リジェクトされた中にも素晴らしい発表がたくさんあったかと思います。

そんな発表に巡り会えるReject Conferenceはほんとに貴重です。

所用で懇親会の前に帰りましたが、とても楽しめました!関わった皆さんお疲れ様でした!ありがとうございました!

ぼくはただLINE Clovaスキルを開発したいだけなんだ....

雑感

LINE Clovaのスキルを開発できる Clova Extensions Kit が先日公開された。

clova-developers.line.me

ぼくの好きな乃木坂46とコラボしたりしてるので、スキル開発しようかなと思い立ち。

nogizaka-lineclova.jp

早速Developer登録して開発してみてるが...

CEK(SDKのようなもの)は今のところNode.jsとSwiftが用意されていて。

普段iOSアプリ開発でSwiftゴリゴリ書いてるけど、環境構築にDocker使ったり、Swiftのバージョンらへんが面倒なのでNode.jsでやることに。

ここまではまだいいけど、LINE Clovaのスキルを動かすサーバーはSSL必須とのこと。

そのためにお名前ドットコムでドメインとったりHerokuでSSL対応する方法ぐぐったりして、、、

「ぼくはただLINE Clovaスキルを開発したいだけなのに...」

という気持ちに。

とりあえずNode.jsなのでローカルで動かして開発しつつ、お名前ドットコムのDNSの変更が反映(されるのに1~2日かかるらしい)されたら、やっていこうかなと。

あとLINE ClovaをLINEのオンラインショップでポチったのだけど、平均で1週間ほどかかるとのこと。なげぇぇぇぇぇ!ビックカメラとかで買えば良かった。

とはいえ、スキルストアが来月公開予定なので、それまでには作っときたいなぁ。

Flutter Meetup Tokyo #2に参加しました

Flutter Meetup Tokyo #2にブログ枠として参加しましたので、参加レポを書きます。

はじめに断っておくと各発表の詳細は公開されているスライドを読んだほうが誤解なく伝わるので書きません。

f:id:aboy_perry:20180603210628j:plain

flutter-jp.connpass.com

当日はこちら↓のAndroidもくもく会と同じ会場で、仲良く始まりました。

mercari-android-mokumoku.connpass.com

また、Meetup中はhttps://www.sli.do/によるほぼリアルタイム質疑応答も行われていました。

それでは、各LTについて雑感を書いていきます。

Flutter Overview++ (Google I/O 2018)

speakerdeck.com

Google I/O 2018 のセッションのなかでFlutter関連のものの概要をかいつまんで紹介。

Flutter(Beta 3)はフルでMaterial Designをサポートしていて、その理由がMaterial DesignのメンバーがFlutterのチームに入って一緒に開発しているからだそうで、なるほどな〜という感じです。

それから「状態管理」について、私は setState() しか知らなかったので、setState()以外の選択肢が知れたことはめちゃめちゃ有意義でした。

Google I/OにはFlutterアプリのショーケースがあって、FLutterで作られたアプリが実機で触れたらしい。また、アリババがすでに2000万MAU規模のアプリ(間違ってたらごめんなさい)をFlutterで作っているとのこと。

まだまだプロダクションでの採用数は多いとは言えないものの、今後活用事例が増えていくのは時間の問題でしょう。

ちなみに今回の発表の内容よりも少し詳しく書いた記事がqiitaに公開されてるとのことです。

Build reactive mobile apps with Flutter (Google I/O '18) メモ

Flutter List View

speakerdeck.com

勉強会が2日前だと勘違いしていたそう

たいていのアプリで使うことになるListView。私も使っていますが、Sliver(ずっとSilverだと思っていた)を使ってごにょごにょできることははじめて知りました。

とくにスクロールと連動してAppBar(iOSでいうところのNavigationBar)が出たり引っ込んだりするようなUIを、SliverAppBarを使えばそこそこ簡単に実装できるのは良いなーと思いました。なかなか大変なんですよねあれ...。

とはいえどちらかというとSliverのような低レイヤの機能は初心者向けではないと思ってるので、最初はSliverを考えずに高レイヤのWidgetを使うだけでじゅうぶんですね。

またこの辺の質疑応答であったのですが、メルカリでは一部プロジェクトでFlutterを使おうという流れになっているとのことです...!!!

Flutterのリアクティブ戦略 setState ~ Reduxまで

docs.google.com

1つめのLTでも状態管理の話は出ましたが、このLTはそれをもう少し詳しく説明した感じでした。

setState()がいくつかのデメリットを持ち合わせているとしても、Flutterにおける状態管理は、widgetの中にビジネスロジックを持つのがまず基本のキであることには変わりないでしょう。

あとはこれらも読んでねと言っていた気がします。

lacolaco.hatenablog.com

https://hackernoon.com/why-flutter-uses-dart-dd635a054ebf

"Hello Flutter" の次におさえたいFlutterのポイント その4

www.slideshare.net

開発中の翻訳アプリを使った、国際化対応の話。3ステップにわけてあったのでめちゃわかりやすい。

実際国際化対応ってどうやってるんでしょう。多分会社でやるとしたら翻訳チームみたいなところに「このファイルのこの部分の単語を全て英語にしてこっちのファイルのここに書いてください」みたいなことになるんだと思うんですけど。それか自分たちで全部やるか。

このLTで紹介されていた方法だと、言語ごとにできた.arbファイルを翻訳チームに渡せば普通にできそうですね。たしかにコマンドを叩かないといけなかったりして少しだけ面倒そうだなと思いつつ、これはこれでじゅうぶんなのではと思いました。

Flutter テストことはじめ

speakerdeck.com

登壇者「Flutterのテスト書いたことある人手を上げて〜」

聴講者「は〜い(1人)」

から始まったテストのお話(多分1人じゃないはず...はず)

ちなみに私は書いたことないです..

Flutterギャラリーというサンプルアプリのテストをのぞいてみると良いそう。

業務で取り入れようとするのであればやっぱり最低限ユニットテストは書けるようになっておかないとダメかなーと思いますのでこのへんは頑張ろうと思いました。

BLoC

speakerdeck.com

BLoCとはビジネスロジックをUI/プラットフォームから分離する設計パターン。

viewの表示のtrue/elseもBLoCのoutputを使うべしとのことです。MVVMでいうとViewModelからisLabelHiddenのようなパラメータをViewに渡してViewは該当のLabelにバインドしておく、みたいな感じでしょうか...?

BuildContextについて調べてみた

speakerdeck.com

SnackBarを触りながら調べてみたとのこと。

正直普段触ってて全然気にしてなかったところなので、まずこれを調べてみたというのがすごい。

debugのときあのView(Widget)のヒエラルキー見えるやつってみなさん使ってるんですかね。この方はそれを使って、「動かないときはScaffoldがない」というのを確認したそう。

Flutter * 2dimensions

speakerdeck.com

今回はアニメーションツール NIMA の話。

ファイル名やアニメーション名はのちのちコードで使うので、NIMA上でちゃんと命名しといたほうがいいとのこと。

ちゃっかりFlutterにPRを出してマージされたとのことで、コントリビューターです。

www.reddit.com

FlutterでQRコードリーダーを雑に作ってみた

speakerdeck.com

世にあるQRコードアプリは広告だらけなので自分で作ってみた。とりあえず勢いがあったLT。

普段はゲームをやっているのでゲーム好きとしてはピクッとしました。

ちなみにこういう発表で「開発時間4時間」とか「だいたい2週間で作成」とか言ってる方がたまにいて、なんなんでしょうかみんな天才なんでしょうか。私にはムリです。才能わけて。

ちなみにFlutterに関してはこのyoutubeチャンネルがおすすめとのこと。

www.youtube.com

Flutterアニメーションはじめの一歩

speakerdeck.com

メイド喫茶駆動開発」の9文字が一番インパクトありました。

AnimationControllerとTweenを組み合わせて簡単なアニメーションは可能だということ。

インフラジスティックスとFlutter

slides.com

Doughnutとう英単語アプリをFlutterのアルファ版を使って作った。開発期間は2週間とのこと。

Text to speech pluginというFlutterプラグインがあって、意外と良かったそう。

また、最後に紹介されていたIndigo Design to Code (D2C) Studioというのが本当にすごくてやばかったです。sketchからFlutterアプリをジェネレートするらしい。ワクワクしますねー。

jp.infragistics.com

おわりに

Flutter Meetup Tokyo初参加でしたが、みんなのFlutterに対する注目度が高いなーと思いました。

また私自身は普段業務でRxSwiftを用いたiOS開発をしているので、Dart/FlutterでもRxを使った開発をGoogleがやっていることが知れて良かったです。setState()での開発に慣れたらstreamingを使った開発にもチャレンジしたいなーと思わせる会でした。

それからめちゃくちゃオシャレで美味しいケータリングが用意されていたのですが、それがこちらのお店だということが質疑応答で判明しました。

出張料理 素粒子 / catering services SORYUSHI

まとめると全体的に最高でした!運営/発表者のみなさんありがとうございました!

f:id:aboy_perry:20180603210645j:plain

iOS Test Night #7 参加レポート

iOS Test Nightにブログ枠として参加しました!

f:id:aboy_perry:20180328203135j:plainf:id:aboy_perry:20180328203114j:plain
iOS Test Night様子

testnight.connpass.com

内容の詳細はスライドを読むのが一番なので書きません!感想メインで書いていきます。

SwiftにおけるMockライブラリの活用

speakerdeck.com

トビ@デベロッパーのおしごと! (@tobi462) | Twitter

MockitoインスパイアなMockライブラリが2つ紹介されてました、CuckooMockitです。ぼくはFlutterでもmockitoを使ってるので、学習コストの面でもそのどちらかを使おうかなーという感じです。

個人的に手動でMockを作ることにあまり抵抗はないですし、業務でも手動でやってますが、試しに導入できそうだったらしたいなと思います。

Visual Studio App Centerで始めるCI/CD

www.slideshare.net

なかしょ (@nakasho_dev) | Twitter

テスト結果が視覚的に見やすくていいなと思いました。それからUDIDを追加したときに再署名されたプロファイルを含めて自動で配信してくれる(?)らしく、どちゃくそ便利。

つい最近、業務でちょうどMSのHockeyAppを使っているのですが、今回の発表を聞いて意外とMS頑張っているなーと驚きました!選択肢のひとつに加えたい。

DI with Reader Monad

speakerdeck.com

Toshiki Takezawa👻 (@to4iki) | Twitter

関数に引数で渡すProtocolによってDI(≒Mock化)できるのはかなり面白いと思いました。ただ....多分....使わないだろうなー...。

ライブラリが公開されています。

github.com

モナドはいまだにちゃんと説明できないのでなんかいい記事ないかなーと探してたらこんな記事に出会いました。モナドポケモンモナドポケモン

qiita.com

はじめて書いたテスト

speakerdeck.com

ryokosuge (@ryo_kosuge) | Twitter

こういう話好きです。チームメンバーに迷惑がかかるのを避けたいからテストを書き始めたというのが素晴らしいなーと思って聞いてました。たしかに人って他人に迷惑がかかるならなんか頑張っちゃう気がします。

逆にいうと、チームにテスト書く習慣を付けたいけどどうしたらいいかわからない!という人は、迷惑がかかっている雰囲気を出す、もしくはそういった仕組みをこっそり導入すればいいかもしれませんね。

また↓で登場するTDDを導入してみるのもいいかもしれません。

Swiftで書いておぼえるTDD

タイポー田中@技術書典4く-07 (@ktanaka117) | Twitter

これはまだスライドがあがっていませんが、人を殺せる厚みのTDD本を8000円で買いましたというお話でした。というのは嘘で、実際業務でテストに関する取り組みを積極的にしているご自身の経験から、TDDを導入して得られるメリットなどをお話してくださいました。(TDD本買ったのは本当)

そのなかでも、常にプロダクトコードに関して改善意識が持てる、というのは大きいメリットだなーと思います。しかもチーム全体で。

なかなか案件のお尻が決まってスケジュールがキツキツだったりして、思うようにリファクタや改善が進まないこともあると思います。というかあります。TDDを導入すると、"テストを書く"ということが"機能を実装する"ことの一部になるので、自然にテストを書く文化が根付くのかなーと思います。

// TODO: リファクタ // TODO: テスト書く って書かれたコードがプロダクトコードに眠っている人は、思い切ってTDDを導入すると案外そのTODOが実現されたりするかもしれないですね。

おわりに

まずスタッフの方々、楽しいイベントでしたありがとうございました!参加者も多かったですし、みなさんテストに関心があるのだなーと関心しました。

ぼく自身はというと、今ぼくが業務で触っている3つのアプリ(と自社作ライブラリ)すべてでテストが書けているわけではないので、テスト(TDD)導入の体験談が聞けたのはすごくよかったです。

あとテストを書く人は偉い。そう思いました。テストを書いたらみんなで褒めていきましょう。そして書いた人は自慢していきましょう。そのスパイラルが、じつはテストを書く組織/人になるために一番重要なのかもしれません。

【Flutter】背景いっぱいに画像を表示する

最近Flutterにハマっています。むしろFlutterしか触っていません。

背景、iOSでいうとUIViewControllerのviewのbackgroundImageに画像を設定するやり方です。

f:id:aboy_perry:20180326010834p:plain:w300
背景いっぱいに画像表示

Stackを使って実現することができます。

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: new AppBar(title: new Text(widget.title)),
        body: new Stack(
          children: <Widget>[
            new Container(
              decoration: new BoxDecoration(
                image: new DecorationImage(
                  image: new NetworkImage(
                      "http://2xmlabs.com/wp-content/uploads/2018/01/C21NRVrUoAAI7eI.jpg"),
                  fit: BoxFit.cover,
                ),
              ),
            ),
            new ListView(
                padding: const EdgeInsets.all(20.0),
                children: ["A", "B", "O"].map((String str) {
                  return new Text(str);
                }).toList()
            ),
          ],
        )
    );
  }
}

ちなみにContainerのdecorationプロパティに設定するやり方でもいけます。

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(title: new Text(widget.title)),
      body: new Container(
        decoration: new BoxDecoration(
          image: new DecorationImage(
            image: new NetworkImage(
                "http://2xmlabs.com/wp-content/uploads/2018/01/C21NRVrUoAAI7eI.jpg"),
            fit: BoxFit.cover,
          ),
        ),
        child: new ListView(
            padding: const EdgeInsets.all(20.0),
            children: ["A", "B", "O"].map((String str) {
              return new Text(str);
            }).toList()
        ),
      ),
    );
  }
}