Vue.jsアーキテクチャリング勉強会でVue のアーキテクチャ のLTをした話
10月30日にクラウドワークスで「Vue × Vuex のアーキテクチャ完全に理解した」というタイトルで登壇させていただきました
本日の #VueArchit にて発表した「Vue × Vuex のアーキテクチャ完全に理解した」の資料です!https://t.co/QOZf89Iiyz
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) October 30, 2019
登壇のきっかけ
今回、サービスでVue.js Nuxtの環境で開発を行ったので、その知見をまとめたいと思っていた際にみーたさんのTweetを見て、これでLT駆動開発だっ!と思い申し込みました。
vueを使った大規模アーキテクチャの勉強会とかやったら皆来てくれますかね?
— みーた@テケテケ↑🦉💀🍬🐺 (@earlgrayMK) August 29, 2019
私達が知りたいから他社さんお声掛けしたいって感じなんですけど、場所とかは提供しますので...✨
興味ある方はいいねください:)#vuejs
登壇前の準備
実際に今回開発を行ったメンバーは僕だけじゃないので、登壇前に社内で内容を話あって決めました。
最後の方にめちゃくちゃ追加しましたが...😇😇😇
開発の内容を振り返りしてまとめた感じなので、完璧な資料とはいかないですが、開発に臨む前に見るには良い内容になったかなとは思います。
当日
めちゃくちゃ緊張しながらいきました!
何回かLTは実施していましたが、20分ものLTはあまりやったことがなかったので...
様子をツイートと共に振り返りたいと思います。
#VueArchit
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) October 30, 2019
みんな落ち着いて発表を聞きたいが為に1番目の発表をとりあうじゃんけんが開催されるなどした。
一番最初が一番楽
「Atomic Designは実際の開発に即していない」
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) October 30, 2019
わかりみ #VueArchit
わかりみ
BASEさんではデザインではAtomic Designを採用しつつも、実装はAtomic Designに乗っ取っていないらしい...
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) October 30, 2019
#VueArchit
なるほどと思いながら聞いてました。
完全理解ですって!? #VueArchit
— mgr=['カービィ','ちょろ太','まぐろ','もぐら','みゅー'] (@biccur_gama) October 30, 2019
完全に理解した()
element uiいいぞ!! #vuearchit
— resessh (@resessh7) October 30, 2019
element uiはいいぞ〜
storeにActionsとGetterで接続するのはPagesという構成、うちも同じだ #VueArchit
— えんぴつ@子育て中フロントエンジニア (@empitsu88) October 30, 2019
state直接参照するのは別によくない…?#VueArchit
— ぶた気温@転職の季節 (@butaosuinu) October 30, 2019
弊社も同様の理由でgetterを経由しないstore参照は処刑モノですね。#VueArchit
— 笹木 信吾 (@HousouP) October 30, 2019
「Stateを直接参照すると、Vuexに保存されているデータを何も介さず見ることになる。Getterなどで表示内容を変更して参照している場合があるため、情報の一意性が保てなくなる。」
— mgr=['カービィ','ちょろ太','まぐろ','もぐら','みゅー'] (@biccur_gama) October 30, 2019
「Mutationを呼ぶことでvueファイルから、Stateの内容を直接書き換えることができる...」
#VueArchit
この辺の議論は面白かったのでアンケートとった(後ほど)
TS安定して使うためにvue3使いたい感はある#VueArchit
— 笹木 信吾 (@HousouP) October 30, 2019
型安全で開発したい(切実)
うちの会社の場合、SPAじゃないしストアがそのページだけでしか使わない軽めのものばかりなので、Vuex より Vue.observable の方を(自分が)推奨していってる #VueArchit
— mascii (@mascii_k) October 30, 2019
もちろんこういう使い方もあるので、あくまで大規模の時はって話である
VuexへのTypeScriptの導入は名著「実践TypeScript」を参考にしたらステキな感じに型定義ができました #VueArchit
— えんぴつ@子育て中フロントエンジニア (@empitsu88) October 30, 2019
今度見る!
propsでfunction渡そうぜっていうのはどこかで見たな
— mgr=['カービィ','ちょろ太','まぐろ','もぐら','みゅー'] (@biccur_gama) October 30, 2019
#VueArchit
これどっちが良いのよ
どこを太らせるように寄せていくか?という話 #VueArchit
— おおやまみちのく (@yamanoku) October 30, 2019
これが言いたかった
この資料、概要がまとまっていてとてもありがたいです。
— fumiyasac@UI実装であると嬉しいレシピブックVol.1&2著者 (@fumiyasac) October 30, 2019
(実は僕もNuxt.jsはじめたばかりです) https://t.co/Mmf4D3Y3NZ
うれぴい
ちなみに本日私が実施した乾杯は @jollyjoester に #love_swift #love_kotlin で学んだものです🤗🤗
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) October 30, 2019
こちらの勉強会、初心者にもやさしい勉強会なので良かったら参加ください😎
#VueArchit
宣伝をした
#VueArchit
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) October 30, 2019
Vuex において、Storeへのアクセスはどのコンポーネントまで許容していますか???
Organismsの割合が思ったより多かった。確かにPagesだけだとemit地獄になったりしてつらみが深いし、propsで渡すのもめんどくさいけどね。
登壇後
なんとはてブのTOPにでてた...
ちょっといやかなり恐縮である。。。
SpeakerDockに乗せた資料も5kを超えていたので、はわわわわわってなりました。
.@entaku19890818 さんのスライドが、はてブ[テクノロジー]タブのTOPに!!
— ウホーイ (@the_uhooi) October 31, 2019
自分のことのように嬉しい笑 pic.twitter.com/F1S0esBZhh
わいの資料5k達成してんじゃん pic.twitter.com/wHnY7qrcgF
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) November 2, 2019
次の目標
資料内でも言及していますが、型が欲しいっ... と思いながら開発していたので、型導入したときにまたどこかで話をしたいなと思ってはいます。
また、資料は完全ではないので、何か質問や議論やこう思います見たいな話がありましたら、是非是非TwitterのDMなどで連絡いただけるとありがたいですー!!!🤗🤗🤗
iOSDCに行ったことない人も参加を味わえるブログというのは言い過ぎている
そう。言い過ぎている
iOSDC Japan 2019はiOSやその他諸々を題材としたLTが多いカンファレンスです。
今回は初日は体調が悪くいけなかったので2日目から、、(2日目も途中から)
画像処理における、UIImageとCGImageとCIImageの効果的な使い分け
画像処理のお話。
CIImageは恥ずかしながら知らなかった..
#iosdc #a
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年9月6日
そもそも普通の画像処理ってどんな流れだっけっていうイメージができないとあかんやんな
スライドの資料が丁寧ーーーーー!
#iosdc #a
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年9月6日
こういう実験結果聞くのワクワクしちゃうぞ???
結果から言うとCIImageが早かったと言う内容でした。
実験をするのがとても良いですよね。普段このような実験に時間取りずらいので。
節子の人。
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年9月6日
応援したった。
#iosdc #a
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年9月6日
> 自動テストを入れないと書き換えできない
> 設計を変えないと自動テストがいれられない
っっっっっせやな
せやなみが深い。
分離がされていない状態ではそもそもテストができない
#a #iosdc
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年9月6日
バグを世に出すまでの最後の壁をどうするか????
いい言葉。
全体的に業務よりの話だったと思う。
「チームとしてどういう痛みを許容するのかちゃんと共有して決断しようね」
という話だった。
個人開発でもない限りエンジニア一人で決断て言う状況は存在しなくて、ちゃんと恐れず巻き込まないとダメ。言うは易く行うは難し。
ソーシャルライブサービスにおけるデジタル化粧の仕組みと実装/iOSDC19
noppeさん
デジタル化粧とか難しそうな印象でしたね
photoshopで輪郭をシュツとする方法を学べるらしい
photoshopのチュートリアルで輪郭をシュッとする方法が学べる…#iosdc #a
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年9月7日
はい。
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年9月7日
今回出演した部分は全てOSS作ってるそうです。sugoi
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年9月7日
深掘りしたらめちゃくちゃ難しいんでしょうが、僕でもできるかもと思わせてくれそうな内容でよかったです。難しい内容から初歩でも動かせる内容に切り取るの素晴らしいと思いました。
LTでは友達が出てたので応援してました。
キャーーー!! @66nylon_y ちゃんさーんーーー#iosdc #b
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年9月6日
キャーーー!!!@_bannzai_ さーんーーー#iosdc #b pic.twitter.com/zC7bPwoj1s
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年9月6日
キャーーーー!@the_uhooi さーーーん #iosdc #a
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年9月6日
2日目の茶会は出られませんでしたが、最終日の懇親会は参加しました。
人見知りの割にはまぁまぁ喋れた。
懇親会の目標はたくさんの人間と喋るです。よろしくお願いします。#iosdc
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年9月7日
なんでみんなタピオカからいくんですかね????ww #iosdc
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年9月7日
発表者みんな楽しそうですごく良かった。
今回僕もプロポーザル出してたが、一つもかすらなかった。。。
この悔しさは忘れたくない!
そういえばリジェクトコンってやつに応募してたきが。。。
(今から頑張る)
iosdc-reject-conference.connpass.com
iosdc-reject-conference.connpass.com
KotlinFestに行ったことない人も参加を味わえるブログ
KotlinFestとは「Kotlinを愛でる」をビジョンにKotlinファンが集まる技術カンファレンスです!
今回は2019/08/24(土)に開催されました。
こちらが公式Connpass
品川で開催。駅から該当の3階までいくとわかる。
着 #kotlinfest pic.twitter.com/hFEluR9ZSo
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年8月24日
名前書いてバックもらった
#kotlinfest pic.twitter.com/8dbqWS4WOk
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年8月24日
スケジュール
以下参加したセッションについて
オープニング・セッション
はじまた! #kotlinfest pic.twitter.com/ztgYraWDr3
— Hideyuki Nanashima (@jollyjoester) August 24, 2019
いえーい!
#kotlinfest は多くの方の情熱と支援のおかげで開催できています! pic.twitter.com/ucVZ22h2v9
— さわら@技術書典 お25C Cognito屋さん (@hiroga_cc) August 24, 2019
あと、JetBrainsの中の人が講演してました。
JetBrainsはMPP推しらしい。(初めて知ったけど)
要は全部Kotlinで書いて行こうぜって感じ。
ビジネスロジックもUIも共有できれば無敵感あるな#kotlinfest pic.twitter.com/Kz9ApMRebg
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) August 24, 2019
去年のKotlinConfでも同じことを言ってたらしい。
KotlinConf 2018 - Effective Multiplatform Kotlin Development by Marcin Moskala
お昼休憩後、セッション開始。見たもののみ記載
資料全体まとめはスタッフのさわらさんがまとめているよ☺️
現時点でインターネットに公開されている #kotlinfest のスライドはすべて収録したと思います!皆さんご発表ありがとうございました〜!
— さわら@技術書典 お25C Cognito屋さん (@hiroga_cc) August 24, 2019
おうちで復習するまでが #kotlinfest だよ! https://t.co/Ief5ZumhFT
Kotlin コルーチンを 理解しよう 2019
八木俊広さん ( @sys1yagi )
直前までブースの人と喋っていてサテライト勢となるぼく(右上奥)
そういえば今日のお気に入りの一枚をシェアするの忘れてました。僕が担当する領域は必ず緩い空間になります😇 #kotlinfest pic.twitter.com/ANCPixv1Ul
— Hideyuki Nanashima (@jollyjoester) August 24, 2019
この人が論文内でコルーチンのことを初めて書いたらしい。(原文見つからず)
歴史のお話
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年8月24日
#kotlinfest pic.twitter.com/28xX9Qs2x0
Swiftでやったことあるから多少理解したつもりになれる
#kotlinfest #a
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年8月24日
ここまでの説明はGCD に近い印象だな
実践的な内容ありがたき
#kotlinfest #a
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年8月24日
ViemModelで書く実装例出していただけてるのめちゃありがたき〜〜〜〜〜
図があったほうがわかりやすい
#kotlinfest #a
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年8月24日
スーパーわかりやすい pic.twitter.com/WpTYwPUUj6
テストもわかった
#kotlinfest #a
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年8月24日
Rxのテスト例見たときも思ったけど、やっぱViewModelのテストが一番書いた分のリターンが得られそうである
つまりこうなる
#kotlinfest #a
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) August 24, 2019
Coroutine 完全に理解した
Coroutinesから紐解くKtorの仕組み
小谷野 雄史さん ( @bandwagondagon )
※資料が見つからなかったので見つけ次第更新予定
Ktorの話、「けーたー」っていうらしいよ
https://t.co/7GuLFq1nSA#kotlinfest #B
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年8月24日
これがktorってやつか
Ktorはパイプラインの中にフェーズを持っててそこでCoroutinesを使ってるらしいよ
#kotlinfest #B
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年8月24日
計算パイプライン難し
suspend関数を駆使してるらしいが挙動がわからん
#kotlinfest #b
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年8月24日
かのうせいなのかー pic.twitter.com/UsddecVFBj
そして無事こうなる
Coroutine 何もわからない#kotlinfest #b
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年8月24日
フロントエンドもKotlinで書きたい! -WebページをKotlin/JSで作った軌跡-
Subroh Nishikoriさん ( @subroh_0508 )
肩にいる人には触れないスタイル
#kotlinfest #c
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年8月24日
肩になんかいるwww pic.twitter.com/Z0iqQSaHtZ
KotlinでReactやるときにはこれ
KotlinでReactやるときにhttps://t.co/1rTiTwYG0q#kotlinfest #c
— はすみん@Kotlin Fest楽しかった! (@prgskater) August 24, 2019
実は彼の発表は前も聞いていたので、なんとなくわかってたけど改めてdivタグKotlinで書くのすごいなって思いました(小並)
資料内にも出てくるがKotlinでjsやHTML構造がかける一方で、やはりUIフレームワークを使えないと有用でないため、Material-UIのラッパーを作ったらしい
#kotlinfest #c
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年8月24日
「Material-UIの9割をサポートしています」( ˙꒳˙ )キリッ
カッコイイ..... pic.twitter.com/N3q3z3GhdF
なおどうしてもKotlinで表現できない場合、Kotlin内でjsを書ける模様
#kotlinfest #c
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年8月24日
Kotlin さんなんでもやりますね pic.twitter.com/avavNdUZfz
ポートフォリオ作る欲。アがるな
これでポートフォリオ作るかhttps://t.co/r433Yfxjf2#kotlinfest #c
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) August 24, 2019
Kotlin/Nativeはなぜ動くのか?
荻野陽太さん ( @youta1119 )
https://speakerdeck.com/youta1119/kotlinfest2019
Kotlin / Nativeの内訳
#kotlinfest #a
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年8月24日
C++ もあるしCもあるしOb-CもあるしOb-C++ もあるから読める気しないな😇 pic.twitter.com/e83vvBUkGy
当然こうなる
#kotlinfest #a
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年8月24日
C++ 側ではこんな風になっています
ぼく「ほぉ(全く読めない)」
正直最後のセッションは全く知識が無くわからなかった😞
Native の話だったが思ったより低レイヤーだったので、すごかった#kotlinfest #a
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年8月24日
クロージング
他のコミュニティの宣伝もできるよ!!!
懇親会
懇親会ではKotlinだけでなく様々な言語で開発している人がいた。
学生もいた。(参加費無料でうらやま)
懇親会中にも言ったが、Swiftのイベントと違ってKotlinのイベントはサーバーサイド/フロント/アプリ開発と本当に幅広いのは特徴でJetBrainsの「全部Kotlinで書こうぜ」な世界に本当になっちゃうかもなーと思いながら喋っていた。
それは今回のセッションにも表れていて、サーバーサイド/フロント/アプリ全てのセッションが聴けたのはよかった😊
開発欲アガった🤩🤩🤩🤩🤩🤩
そして、これを書いているときに大事なことに気がつく。
昨日の贅沢な懇親会の食事を一枚も撮っていないことに気がついて泣いてる
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) August 25, 2019
#kotlinfest
最後に
コトリーン!!! #kotlinfest pic.twitter.com/FxSaC9J4RU
— さわら@技術書典 お25C Cognito屋さん (@hiroga_cc) August 24, 2019
本日はご参加ありがとうございましたーーーー!!
Swift/Kotlin愛好会合宿(7/6-7)に初参加してきたが最高だったことを参加者目線で話そうか!!!!!
どうもentakuです。
さぁSwift/Kotlin愛好会合宿を終わらせましょうか。
運営メンバーの素晴らしいブログたちはこちら。
当日の流れはこちらを見た方がいい。
今回僕は完全なる参加者目線で書きます。
参加の動機
私は何度かSwift/Kotlin愛好会に参加/LTも1-2回程度登壇させていただきました。
今回はずっと作りたいと思っていたスポーツ観戦系個人アプリを集中して作りたいと思い参加しました。
初参加とはいいましたが、運営メンバーの人と技術書典も出したりと顔見知りは多い方だったと思うので、他のメンバーより比較的リラックスして望めたかと思います。
#love_kotlin #love_swift
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年7月6日
> 家でコードが書けない
わかる
実際どうだったか?
Twitterのハッシュタグ はとても騒がしく見えますが、現地はとても静かでした。
それぞれ盛り上がったり、集中したい人は集中するといった感じでとても良かったですね。
#love_swift #love_kotlin
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年7月6日
Twitter見てると、騒がしそうではありますが、現地はとても静かです。
現場からは以上です。
合宿の最後には談義タイムほぼ全員が談義したのではないでしょうか?
皆さんの特色が出てるLTで良かったですね😊
誰かに見せようと思えるから頑張れるんだよなぁ
#love_swift #love_kotlin
— entaku | CBcloudで物流系サービスなど作る (@entaku19890818) 2019年7月7日
全員談義!!!!!!!!!!!!!!!
> んで?肝心のアプリは?
作ったよ!
とりあえず動くよ!
改善点が死ぬほどありますが、この合宿で作ったのが最初の思い出になりますよう。
花火〜!!#love_swift #love_kotlin pic.twitter.com/HUY7NY1TMN
— afroscript@MercariのEngineering Gateway人 (@afroscript10) July 6, 2019
Togetterが楽しすぎて永遠に見てられるな...
また進捗するぞ!
Tweetで振り返るKotlin愛好会LT
おはようございますentakuです。
4/25にKotlin愛好会にLT枠「iOSエンジニアはイケてるAndroid開発 を完全に理解した()」で参加したので、Tweetと共に振り返ります。
資料はこちら
(改めて読むと恥ずかしいな)
Kotlin愛好会、
— afroscript@MercariのEngineering Gateway人 (@afroscript10) 2019年4月25日
今日の会場はこんな感じ:)#love_kotlin #finolab pic.twitter.com/Te24eQISH7
会場みなさんとの距離が近めでよかった
イケてるを修飾してるのは開発のほうかな #love_kotlin
— youhei@( ˘ω˘)スヤァ…🤔 (@Luecy1) 2019年4月25日
ああ、そうですね。
この辺はちゃんと定義しないと難しいですが、
「意図した責務分けがなされていて、サクサクできる開発」ですかね
Jetpackよくわからないよくわかる #love_kotlin
— [¥158,692]にしこりさぶろ〜 (@subroh_0508) 2019年4月25日
それな
Androidはgoogle様がSampleたくさん出してるのが良いぞ #love_kotlin
— youhei@( ˘ω˘)スヤァ…🤔 (@Luecy1) 2019年4月25日
Sample おとして実行するだけでもだいぶ勉強になる気がする
ViewModelはアーキテクチャのパターンが元ネタなのでRxやAACなど違うライブラリやフレームワークに登場するのでそちらも調べてみるといいかもね! #love_kotlin
— mochico@AndroidやってるCのもちこ (@_mochicon_) 2019年4月25日
なんとなく理解できてるつもりでもなかなか難しいんですよね。
動かしながら感覚掴まないと。
Googleは実際神 #love_kotlin
— [¥158,692]にしこりさぶろ〜 (@subroh_0508) 2019年4月25日
Google is God #love_kotlin
— youhei@( ˘ω˘)スヤァ…🤔 (@Luecy1) 2019年4月25日
神
ですね!マッピングの表のあたりはちょっと初見の人だと混乱しちゃうかなと思う点がありました。例えばFragmentはライフサイクルを持ちつつViewを持たずに動作できるが単体では動作できないなどiOSでは完全に一致するものがない概念なので違いを探してみるのも面白いと思います
— mochico@AndroidやってるCのもちこ (@_mochicon_) 2019年4月25日
マッピングの表は自分でも説明しながら思いましたね()
iOS/Android でViewの差分があるのは当たり前なので、その辺は異なるものとして認識しないと僕のようになる。
初参加だったけどいろんな知見得られたり話聞けたりして楽しかった #love_kotlin
— サンスケ@ドルパ&コミ1 (@sansuke05) 2019年4月25日
頑張ってkotlin書くぞ💪という気持ちになる勉強会だった。ありがとうございました! #love_kotlin
— さおり (@m_TwT) 2019年4月25日
お疲れ様でした!交流するタイプのイベントが初めてで不安だったけど、参加して外部のエンジニアがどんな感じか知れたのはすごく良かった。知識不足を痛感したので頑張って勉強していきたい🤔 #love_kotlin
— pato2ryon (@pato2ryon) 2019年4月25日
とてもいい。
僕の発表が貢献できてたら嬉しいです( ´∀`)
#love_kotlin https://t.co/QvBUn0RRT1
— entaku | 4月で渋谷を去ります。5月からは神田 (@entaku19890818) April 25, 2019
今日のデモで使用したGitHubです。
スターが増えると、アプリの機能が増える仕様です()
機能追加はよ!
技術書典でSwift/Kotlin愛好会の合同執筆本を出典した話
こんにちはentakuです。
2019/4/14(日) に開催された技術書典に初執筆初参加しました!
熱がまだあるうちにブログにまとめます。
こんな立派な本の一章かけるなんてありがたい...
執筆することになったきっかけ
Swift/Kotlin愛好会主催者の @jollyjoester さんのツイートがきっかけでした。
Hideyuki Nanashima on Twitter: "Swift/Kotlin愛好会で #技術書典 6申し込んだぞ! https://t.co/MYsRTRZJl6"
「技術書典」という名前を聞いたことはあったんですが、正直どういうイベントか詳しく分かってなかったです()
しかし、1年以上iOS開発してきた経験をまとめるものが欲しいと思うで参加しました。
Re:VIEWで執筆
執筆は「Re:VIEW」という書籍執筆支援システムを使うのが一般的だそうです。
(本当はカスタム版を使ったんですが、リンク忘れた😇)
書き方はMarkDownのような感じで、
書籍用のテンプレートファイルを見ながら編集したり、どんな表記がいいか「Re:VIEW XX 」などでググって執筆しました。
普段技術ブログを書いている方には内容は困らないかも知れませんが、「本という物理媒体に残ってしまう..」というプレッシャーを感じながらの執筆はまた違ったものだと思います。
それでも、ものが出来るのはやはり楽しいもので、作りながらみんなでワイワイするのは楽しかったです。
執筆内容への思い
「サクッとお天気iOSアプリを作ってiOSエンジニアになる!」という内容で書かせていただきました。
僕はiOSアプリ開発者として働く中で、「0->1でiOSアプリを作る」という経験が重要だと考えています。
細部の機能やデザインの追加/変更/削除は全体を理解していなくても可能ですが、全体を把握できないと突貫工事になってしまいどこかに無理が生じてしまいます。
最小構成で作成し、意図して機能やデザインの追加/変更/削除をしていくことが自分が開発するアプリを成長させていくために必要なことだと考えているため、今回はこちらの内容で執筆させていただきました。
いざ当日
すごい人..すごい人..
正直こんなに人がいっぱいいるイベントだと思ってなかった...
印刷した本は技術書典の会場に直接届けるので、著者とはいえ手に取れるのは当日です。
150部作成しましたが、完売。本当に嬉しいですありがたいです。
振り返り
以上駆け足でしたが、技術書典でSwift/Kotlin愛好会の合同執筆本を出典した話でした。
今回実際書いてみて、一番感じたことは普段から小出し小出しで書いていないと一気にまとめるのは難しいなということです。
少しでも疑問に思ったこと、解決したことはなんらかの形で出していって結果本になるくらいの気持ちが一番望ましいですね。
try!swift workshop 'Testing and Performance Workshop'
try!swift 3日目のworkshopの一つである'Testing and Performance Workshop'に参加して来ました。
会場はこちらでした。
講師のSamuelさんがワークショップ用のリポジトリを作ってくれました。
パフォーマンスに問題のあるプロジェクトを直していこう!と言うものです。主に実施した2つを紹介していきます。
- ScrollingSmooth
- ImagesInTables
- ScrollingSmooth
※すでにmasterの最新は解決ずみのものが上がってますのでご注意ください
Initial commit with sample projects. · sgoodwin/PerformanceDemos@92fcf1e · GitHub
- 問題発見
これを実行すると...真っ白😮
これを調査します。
- 調査
XcodeのメニューからProduct>Profileを開き"Time Profiler"を開きます
すると....
CPU100%😇
お気付きの方も多いかも知れませんが、10,000,000回appendしており、また全てメインスレッドで行なっているので、描画処理が進まないと言う状態です。
override func viewDidLoad() {
super.viewDidLoad()
for _ in 0..<10_000_000 {
data.append(randomWord())
}
tableView.reloadData()
}
- 解決
そこでswiftでの非同期処理を実現するために"DispatchQueue"を使います。
override func viewDidLoad() {
super.viewDidLoad()
namesQueue.async { [weak self] in
guard let self = self else { return }
for _ in 0..<10_000_000 {
self.semaphore.wait()
self.data.append(self.randomWord())
self.semaphore.signal()
}
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
viewControllerの全体はこちらから
PerformanceDemos/ViewController.swift at master · sgoodwin/PerformanceDemos · GitHub
結果
Time Profilerで見るとメインスレッドが空き、サブスレッドが張り付いていることがわかります。
非同期処理を行うことで「時間のかかる処理は別の場所で実行する」と言うことが可能になります。
2.ImagesInTables
続いて名前から察してるかも知れませんがimageの読み込みです。
実行すると...カクカク😱
- 調査
CPU上ではさっきと違って100%と言うわけではありません。
ですが、コードを見るとセルの表示時にURLからデータを読み込んで、表示しています...
- URL先のdataを取る
- とったdataをUIImage型へ変換し、imageViewへ設定する
ということを行うので、メインスレッドが混雑してカクカクになってると思われます。
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.imageView?.image = UIImage(data: try! Data(contentsOf: URL(string: "https://via.placeholder.com/150.png?text=Demo+desu!")!))
cell.textLabel?.text = "row \(indexPath.row)"
return cell
}
- 解決
またもや" DispatchQueue"さんですよ。
今回はちょっと工夫してデフォルトイメージを設定してみました。
let defautImage:UIImage = UIImage(data: try! Data(contentsOf: URL(string: "https://via.placeholder.com/150.png?text=Demo+desu!")!))!
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let queue = DispatchQueue.global(qos: .default)
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.imageView?.image = defautImage
queue.async {
let data:UIImage = UIImage(data: try! Data(contentsOf: URL(string: "https://pbs.twimg.com/profile_images/828386643560181761/zVBAD623_400x400.png")!))!
DispatchQueue.main.async {
cell.imageView?.image = data
}
}
cell.textLabel?.text = "row \(indexPath.row)"
return cell
}
結果
サクサク😻
ほんとは画像キャッシュとかすると思いますが、時間がなかった(メンドくさい)ので解決です。
Time Profilerを見るとcellごとにスレッドできてますね。
(これはこれでいいのだろうか?)
画像読み込み周りはいつもライブラリに依存してしまっているので、仕組みがわかってないと困った時に解決策を考えられないなぁと感じました。
その他画面遷移で画面が重なりすぎないようにするお話と、UnitTestをやったのですが、そこまで行かなかったので、このブログはここでおしまいです😃
まとめ
- 重い処理はサブスレッドを駆使し、UIを更新するメインスレッドは空けておくような工夫をする
- 画像取得とキャッシュをよろしくやってくれるライブラリは神。先人に感謝。
- 自分のプロジェクトでTime Profiler開こう!どのくらい重い処理をしているのかしろう
以上です。みなさんも試してみてください!🤗