ぱすたけ日記

日記っぽいのを書きます。

YAPC::Japan::Online 2022でコアスタッフをしました

ちょっと時間が経ってしまいましたが、先日のYAPC::Japan::Online 2022でコアスタッフをしたので、スタッフたちを自分で煽った手前、感想ブログを書いておきます。

スタッフ募集を見て応募したのですが、意外と去年の夏からやってたようなので今見直してビックリしました。

そういえば、この記事のタイトルからも分かるように最初は「#japanpm」の続編という設定だったのでした。Japan.pmも検索性などのために変えたいという話があり、スタッフミーティングを重ねる中で「YAPCを名乗ろう」と決められたのは今振り返ると本当に良かったなと思いました。その結果僕らも「YAPC」に恥じない体験や仕組みを用意したいと思って頑張れたし、参加者の皆さんの「YAPCだった」を聞いたり見たりしたときはガッツポーズものでした。

スタッフ業としてはまぁ1日目のトラックAの司会やアンカンファレンスの進行の他にも色々やってたんですが、やっぱり思い出深いのは川柳大会ですね。

せっかくならバーチャル背景に使えるように画像生成もやろうということで、1年に1回くらいやってる<canvas>を使った画像生成技を今回もやりました。

ちょっと雑なので読み込みタイミングによってはフォントがデフォルトになっていますが、事あるたびに再生成しているので最終的にはなんとかなるという作戦になっていたりとか、一応esbuildでTSから生成していたりとかしています。Twitterでも使ってもらえていたしバーチャル背景の他、登壇資料などにもお使いいただけていて嬉しかったです!!いやー軽く「やったらやれますよ〜」とか言って引き受けておいて良かった〜!文字サイズを決めるロジックも曖昧な感じで書いていたけど、意外とちゃんと収まり良い感じになっていて良かったです(自画自賛)。

あとは開催期間中以外の公式Twitterアカウントの投稿は9割くらい僕がやっていました。大体「!」がいっぱい付いてるのはそうです。

開催期間中はスタッフSlackを見たりして裏方やりつつ、Discordの芝生に陣取りつつ、トークを聞きつつという感じで全部入りで楽しめたのはオンラインの良かったところだな〜っと思いました。オフラインカンファレンスでスタッフやってると良い感じにサボったりして*1トーク聞いたり会話したりしていたので、主に芝生でuzullaさん中心に色んな人と話せて楽しかったです。土曜日は京都サンガの試合もあったので3窓していました。

僕はなんだかんだでYAPC::Asia Tokyo 2014が人生初YAPCだったので、yusukebeさんたちのYAPC思い出が聞けたのは良かったです。

今回久しぶりのYAPCしかもオンライン開催のスタッフをやって、Perlを書かない自分もやっぱりホームはYAPCだな〜って改めて感じたので、延期になっているYAPC::Japan Kyotoになるのかどうかは分かりませんが*2、次回のYAPCもなんらかの形でお手伝いしたいなって思っています。

改めて、YAPC::Japan::Online 2022の参加者・登壇者・スポンサー・スタッフの皆さんのおかげで楽しい時間を過ごせました。ありがとうございました!!次回もYAPCで僕と握手お願いします!!!!

*1:実際にはサボってなくて、ちゃんとひと声掛けたりシフト調整したりしてます

*2:どれだけ先になっても絶対にやりたいという強い気持ちはもちろんあります

マネーフォワードさんの社内勉強会でフロントエンドワークショップの講師を担当しました&資料を公開します

昨年のはてなリモートインターン2021で講義を担当したフロントエンドブートキャンプ の資料をご覧頂いたことをキッカケに連絡を頂いて、マネーフォワードさんの社内勉強会でフロントエンドワークショップの講師を担当しました。

その際に使用したワークショップ資料について、マネーフォワードさんにも確認して、Scrapboxの以下のページに公開しました。

構成としては

という3本立てになっています。

フロントエンドのモダン化を進める中で、普段の業務とは別にまとまった時間でチームメンバーにReactやフロントエンドに関するインプットをしたり手を動かしたりしたいというお話だったので、ハンズオン形式でReactで簡単なアプリケーションを作るハンズオンを中心としたワークショップ形式にまとめました。

はてなインターンの資料をご覧頂いてお話頂いたということもあったので、はてなインターンの資料を作っているときに考えつつも、時間の関係や優先度の関係で入れられなかったReact+TypeScriptで実際に手を動かすパートやDOMに関する知識に関するパートを中心に取り扱っています。

講義資料の構成などを考えながらはてなインターン資料の補足を書いたのが年末に書いたこの記事でした。

第2部の「React入門ハンズオン」はこのワークショップのコアの部分です。Reactの実際のコードを書いていく手順を書き下しているイメージです。最初は普段仕事で書いているような順番で構成していったら、ブラウザの画面に成果物が出るのが結構最後の方になってしまったので、その辺はハンズオンらしく順番をこねくり回しています。マネーフォワードさんでのワークショップでは4つのグループに分かれて、それぞれのグループにReactやTypeScriptに慣れている方にTA的にサポートしてもらいながら、Zoomの部屋を僕が巡回しながら質問などに答えていく形式を取りました。

第1部の「DOMとレンダリングパフォーマンス」、第3部の「フロントエンドツールチェインについて」はReactを実際に書く以外のところの要素としてまずはDOMやウェブブラウザ、最後にcreate-react-appやその他のJSのtranspilerやbundlerを紹介しました。こちらは座学的な感じでそれぞれ実施しました。DOMだけじゃなくてウェブブラウザのレンダリングの話をこういうところで持ってくるのは僕の趣味ですね。

全体の構成時間としては休憩なども含めて3時間半ほどで実施しました。Reactハンズオンが2時間弱、それ以外の2つを30分程度という感じです。やってみて感じたのですが、やはりハンズオンしながらReactのフックの話やTypeScriptのあれこれを説明するのはちょっと情報量が過多になるので、事前にはてなリモートインターン2021のフロントエンドブートキャンプの資料を眺めておいてもらうとちょうど良いかなと思ったので、公開版の資料にはその旨を書いています。

しっかりとした長さのワークショップをしかも職業でウェブアプリケーションに関わっている皆さんに実施するということで内容のレベル感や速度感など結構悩みながら当日を迎えたのですが、アンケートでフィードバックを頂いたところ、レベル感なども概ね好評だったようで安心しました。

今回公開した資料自体はご自由に使ってもらって大丈夫です。めちゃくちゃ間違ったこととかは書いてないかと思いますが、資料の中でお気づきの点などあれば、Twitterなどでお知らせ頂ければと思います。

このような機会を頂いたマネーフォワードさんには感謝しています。ありがとうございます!!!

ブックライブにおけるモアレについて

先日、ブックライブに乗り換えました。

薄々そういう予感がしていたが、前述したとおりFire HDで表示していると案の定モアレがめっちゃ出る作品を見つけたので検証内容を追記しておきます。

以下のスクリーンショット魔法少女にあこがれて (6) (バンブーコミックス) よりです。『魔法少女にあこがれて』は最高なので読んでください。

Kindle版 on Chrome /w MacBook Pro

左ページのスカートとかがモアレってるけどまぁ耐えられるかな〜って雰囲気はある。

Kindle版 on FireHD

ブラウザ版とほぼ変わらない感じのモアレ感。Kindle版はこれくらいのクオリティっぽい?

ブックライブ版 on FireHD

とにかく辛い。この調子でモアレしまくってる作品を読みたくない。というか読めない。助けてくれ……

これでも一応「画質きれいモード」を有効にしています。これを有効にしても特に変わらないので、Fire HDでは効果無いのかもしれない

ブックライブ版 on Pixel 3a

Android版が悪いのか端末との相性なのかと思って検証したところ、どうやらブックライブが悪いわけではなくて、無理やりKindle Fire HDで動かしているのが良くなさそうな気配……

ブックライブ版 on iPad Pro

念の為iPad Proでも見たが、Pixel 3aと同様っぽい。

ブックライブ版 on Chrome w/ MacBook Pro

こちらもほぼ同様。

ということで、Fire HDで動かすとやっぱりAndroidアプリを無理やり動かしているからなのか、端末の性能的な問題なのかスクリーントーンがモアレるので、ブックライブで読む人はFire HDを使い続けるのは諦めると良さそうです。

僕はこの前Fire HDを買ったところなのですが、このままでは使いみちがなくなってしまうので、どうしようかという気持ちになってます……

でも背に腹は代えられないので、モアレが改善されることがないならiPad Proで読むように切り替えようかなって気分です。ふーむ悲しい……


もしこの記事を読んでブックライブ始める人が居たら、以下のTweetにある招待コードを入れておいてください。あなたの1ヶ月間の購入分の20%があなたと僕にポイントで入るそうです。(すでに利用中の人も入力したことなければ使えるそうです)

または https://booklive.jp/my/invite から招待コード 54437334 を入力してください。

マンガを買うプラットフォームをKindleからブックライブに乗り換えた

ずっとKindleで暮らしてたけど、最高に快適という感じでも無かったが、そこに資産があるからという理由でKindleで買い続けていた。そんな中、先日、メールに購入情報が入らないようになる変更が結構大きなトドメになって、ちゃんと引越し先を検討しようと思った。

一番の候補はBOOK WALKERだったんだけど、一方でそこまでKADOKAWAにロックインされたくないな〜と思っていたら、知人にブックライブが良いよって説得されたのでブックライブに引っ越した。

乗り換えるときにずっとボトルネックに感じていた資産がKindleにある問題はKindleタブレットにアレコレやってGoogle Play Store入れて、ブックライブアプリを動くようにしたことでまぁ当分は1つ前をKindleで確認して、新刊はブックライブで読むということになるけど、紙から電子に移行したときよりは圧倒的に楽だろうと思うと一気に受け入れられたので、もっとさっさとやっても良かった。

2週間くらい使って感じたメリット・デメリットを紹介します。

メールに購入情報がちゃんと載っている

まぁこれ載ってないAmazonが異常でしょというだけの話なんだけど、ブックライブのメールには全部あるので最高。前述の記事にあるような動かしていたGASもブックライブ向けに書き直して復活させました。

HTMLをパースするという側面的にも1つずつ<tr>を処理していくとなんとなく順番に情報が取れるので楽でした。

毎日クーポン取れる

毎日クーポンの出るガチャが引ける。「全作品50%OFF」とかもあるらしいけど、今のところ毎日なんか10%〜15%くらいお得になる感じの印象。勧めてくれた知人は週末クーポンを使って毎週まとめて買ってるって言ってたけど登録したての時は降ってこないっぽい。

ラノベ対象のクーポンとかが降ってきたり、ジャンル固定だったりもするので、毎日めっちゃ便利というわけではない。一方で最近はそこそこ積んでる結果、発売日に即DLして読むという感じでもないので、まぁなんかカートに入れておいて良い感じのクーポンが出たらそれで買うという感じにしている。

1万円以上買うと翌月3%ポイントになる

これもそうなんですが、そもそもこれまでずっと毎月50冊以上マンガ買ってるので、毎月大体3万〜4万くらい使ってるので、3%返ってきたり、毎日10%オフとかになるとそれだけで年間でまぁまぁなリターンがあるので、そういう意味でもさっさと乗り換えておいても良かったな感はあります。

フォロー機能がまとも && 新刊オート購入がある

フォロー機能がまともっぽいので新刊出るとちゃんと通知してくれる。Amazonも一応概念はあって最近はマシになってたけど、それでもまだしょぼいと思う。新刊オート購入もあるじゃんとは思っていて、これ自体は便利なのはそうなんだけど、毎日とかにクーポンがあることを思うと、結局新刊チェック時に手動で買う方がクーポン使えて便利なので、この機能は当分使わない気がする。

自動ダウンロードがない && ダウンロードが面倒

1日にまとめて10冊とか買っている && 移動中とかに雑に読みたいと思っている && 端末にSIMは刺さってないと購入時にダウンロードしておかないと読みたいときに読めない。今はほぼ家だからなんとかなるんだけど、まぁでもダウンロードしておきたいという気持ちはある。Kindleは購入時に配信先端末を選べたので、それを選ぶと自動で配信してくれたが、ブックライブにはそれが無い。

また、一覧も買ってにシリーズでまとまってるので、シリーズを開いてダウンロードするやつを選ぶ必要があって困っている。困ってたけど、アプリの「最近追加した本」の欄か検索から購入日時でソートすると欲しい一覧が見れることが分かってきた。(追記: まとめずに表示する方法教えてもらいました、アプリについて言及しているところに詳細を追記済み)

URLがRESTっぽい

作品のURLが https://booklive.jp/product/index/title_id/${タイトルID}/vol_no/${巻数3桁}で表現されていてURLが扱いやすそうなのが嬉しい気がしている。扱うことがあるかは不明だけど、例えば1巻だけ抽出したいみたいな場合にこれまではamakanizeのようにタイトルをパースして頑張っていたけど、そういうのがURLだけで出来るようになるのは便利じゃんっと思っている。

アプリの出来はイマイチだけど耐えられる。ビューワーは普通くらい。

アプリの出来は若干もっさりしている。あとやっぱりアプリトップとかで買わせて来たりしようとするおもてなしがめっちゃあるけど、本棚だけ見続けたい。ビューワーはまぁまぁ不満はないくらい。特筆してめっちゃ体験が良いとかはない。ただ、Kindleを買い替えてから画面が眩しいと思っていたので、アプリの機能で画面を暗く出来るのはちょっと便利(他のそういうアプリを入れれば出来るのは知ってたしやっていたが、くっついてると楽ですね)。

強いて言うなら一覧でシリーズにまとめない一覧が欲しい。シリーズを開くのが面倒なので……ここも購入順とかで並べれば良いのだけど、検索結果の一覧なのでアクセスが悪い…

追記: 2021-12-27 15:25 シリーズでまとめない方法を教えてもらいました。

分かりづらいけれど、こういう感じでシリーズでまとまってて困ってたのだけど、

設定から「新刊・続刊表示」をオフにすると

各巻で表示されるようになった!!!!!いや〜〜助かりました!!!!!!!!!

追記: 2022-01-06 00:15 モアレについて

比較した結果を別の記事に書きました。

その他

というか考えたら年末キャンペーンとかあるのはそりゃそうという感じなので、なんか始めるタイミングをミスったな〜とは思っている。今始めると1月6日まで買った分全部70%返ってくるそうで許せん!!とはなってる。

そういう感じなのでもしこの記事を読んでブックライブ始める人が居たら、以下のTweetにある招待コードを入れておいてください。あなたの1ヶ月間の購入分の20%があなたと僕にポイントで入るそうです。(すでに利用中の人も入力したことなければ使えるそうです)

または https://booklive.jp/my/invite から招待コード 54437334 を入力してください。

GASの書き換えやった件とかはまた別途気が向いたら記事書きます。それに伴いサイドバーに新着購入出すの一旦止めました。理由はAmazonのURLを生成出来ないからで飛び先がブックライブにしか出来ないので……この辺も追々整備していきたい。

全体的にクーポンやポイントに惹かれた感は否めないけど、一方で月の出費の大きな割合をマンガが占めているので、それを減らしたり出来るのは大きな魅力であった。

またもうちょい使ってみてなんかあったら追記したりします。

『はてなリモートインターン2021 フロントエンドブートキャンプ 講義資料』についての補足など

このエントリははてなエンジニア Advent Calendar 202120日目です。

昨日はid:astjさんのHomebrew Formula の CI を GitHub Actions で行う - 平常運転でした。

はてなリモートインターン2021 フロントエンドブートキャンプ 講義資料

今年の夏に行ったはてなリモートインターン2021でインターン参加者にJavaScript/TypeScriptとReactを用いた現代的なフロントエンド開発についてキャッチアップしてもらうためのはてなリモートインターン2021 フロントエンドブートキャンプの講義を担当しました。

この記事では、この講義資料の作成時に考えていたことや、この資料で扱いきれなかったことなどについて補足をしたいと思っています。前半では講義資料自体に関するフォローを、後半ではこの資料を起点にフロントエンドについて学ぶ場合に合わせて扱うと良さそうなキーワードや関連資料について挙げてみたいと思っています。

講義の立ち位置

この講義はインターン生が後半期間に実際にチームに配属されて、TypeScriptやReactと向き合う必要が出てきた時の道標になるというのが第一の目的でした。スローガンとしては「セマンティクスとかその辺はふっ飛ばして、手で動かせれば良い状態を目指す」という感じです。インターン生の中にはウェブ開発はやったことがあってもReactやTypeScriptに馴染みが無い人も居るだろうということで、そういう人たちでも初手で萎縮してしまわずに挑戦してもらえるように、いきなり目にするとギョッとするかもしれない記法や表現を中心に紹介をするというチョイスになっています。一方でフロントエンドが大好きな参加者にも何かを持って帰ってもらえるものがあるように、読み物としても楽しめる付録や脚注などを多めに付けています。

講義時間が1時間ということでハンズオン的な手を動かすパートなどは無しで、座学全体としても圧縮気味に情報をギュッと詰め込んでいます。

講義資料のハイライトと補足

モダンなJavaScriptを書く上で覚えておきたい概念

いわゆるAjaxjQuery時代のJavaScriptをチラッと読み書きしたことがあるような人に向けて、ES6以降のモダンなJavaScriptにおけるポイントを紹介しました。やはり大きな概念はPromiseの概念とModuleの導入ということで、その辺りを中心に扱っています。アロー関数なんかも初めて見るとギョッとしそうなので扱いました。classも一応紹介しましたが、実はそんなに手で書くことはないかもしれませんね。

その後はTipsと称しつつ、追加で for-of や Nullish coalescing operator (??)、Rest parametersなどについても紹介しています。

TypeScriptについて

ここは若干厚めに The TypeScript Handbook などを参考に基本的な型表現から型ガードなどについて紹介しています。

実際に手を動かす時間を取りにくいという前提があったので、利用例のコードを各ページに多めに載せています。ここでも初めて見る時にギョッとしないようにConditional Typesなどについても少しだけ触れています。

また冒頭では、TypeScriptからJavaScriptに変換するコンパイラとしてのtscの振る舞いが、babelなどでも代替可能なことにも言及することで、実行時のランタイムとは違うフェイズで利用されるものであることや、社内でも実際にはwebpackのts-loaderではなくbabel-loaderでパースしていることも多いので、そういう情報を付与しています。

Reactについて

このパートではまず宣言的UIという概念について触れ、ReactやJSX、またVirtual DOMという概念がどういう要望から生まれてきたものなのかについて紹介しました。

その後は実際のチーム配属後にClass Componentを書くことはほぼ無いだろうということで、ReactのHooksについて代表的な組み込みHooksとそれらの利用方法などについて紹介しています。

「付録」について

「付録」は本編の資料を書いているときに筆がノッて書いてしまったものの、そんな細かいことを喋っている時間は無いということで端っこに寄せた解説たちです。実際には本当に講義時間が↑までで終わったので、完全におまけの読み物という感じになりました。アロー関数のthisに関する取り扱いやReact Hooksの依存と同一オブジェクト判定についてやフロントエンドのツールチェイン、さらには標準(Standard)についても簡単な解説を書いています。

講義資料では扱わなかったこと、合わせて読みたいキーワード

はてなリモートインターン2021の講義では時間などの制約もあったので、かなり内容としては厳選されている且つ後半のチーム配属に進んだあとはチームのメンターも居るということで、補助輪的な資料になっています。実際にこの資料を用いてフロントエンド開発に触れ始める場合には、さらにどういう情報や資料について触れると理解が進みそうかについて少し書いてみようかと思います。ここでは個人として1から独学で学ぶためというよりは、実際に業務というかチームに入ってReactを書き始めるぞというケースについてを主に想定して書いています。

オススメの書籍やリソース

講義資料の末尾でも紹介していましたが、ReactやTypeScriptについてのオススメの書籍を掲載しておきます。

JavaScript: JavaScript Primer - 迷わないための入門書 #jsprimer

この資料では一切扱っていないJavaScript自体の文法や概念について分かりやすく解説されている書籍です。紙版もありますが、ウェブのリソースだと最新に更新されていたりもしますし、そのままウェブブラウザの開発ツールなどでサンプルを動かすことも出来るのでオススメです。

TypeScript: プログラミングTypeScript

TypeScriptの型やtscの機能について一通り紹介されている他、JavaScriptとの相互運用についてもしっかり解説されていてオススメです。個人的には「付録H ESLintとAST」は便利に活用させてもらってます!

React: Reactハンズオンラーニング 第2版

序盤ではJavaScriptの知識自体を教えてくれて、その後にJSXからステート、Hooksからテストと順番に学ぶことが出来ます。手堅く一通り把握するならこの本で十分かも?

JavaScriptの文法について

前述した JavaScript Primer で全体像をおさらいしてみると良いかと思います。また、Promiseの概念についてもJavaScript Promiseの本でおさらいするとオススメです。

DOM

Virtual DOMについて軽く触れましたが、そもそものDOMについて何も言及していませんでした。まぁ最初から時間内に紹介できないことが分かっていたので、HTML文書についてやそれから生成されるDOMについては意図的に削っていました。過去のインターンなどでも利用していたはてな教科書などではWebに関することとして最初に紹介していました。

HTMLがパースされてDOMとなってJavaScriptAPIから操作可能になっていることなどは、Reactだけを触るとそれなりに隠匿されているので気にしなくても動くものを書くことは出来るのですが、DOMに紐付いたイベントハンドラなどを扱うこともありますし、後述するようなWebブラウザ上での出来事を理解する上でも最初に触れておきたい概念です。

React Componentの記述

講義資料は時間の関係で全て座学だったのですが、実際には手を動かす時間を作って、小さなReact Componentをいくつか組み合わせたTodoツールなどを書いてみると良いかと思います。その際にはComponentの設計やディレクトリ構造について、すでにチームで採用しているアプローチを実際に取り入れてみるのも良いでしょう。

個人的には特にAPI呼び出しを扱う例をハンズオンでやっておくと良いのではないかと思っています。React Componentの小さなサンプルを手習いに書いてみる場合にReactのstateを書き換えてレンダリングを更新するようなものに収まりがちですが、実際にアプリケーション開発と向き合うとなるとAPIとのやり取りは切っても切れない関係でしょう。現代だと useSWRを使うこともあるかと思いますが、それ以外の仕組みでAPI呼び出しをラップしたり、Custom Hooksにしていることも多いと思うので、そのアプローチに関する知識を共有しておく良いでしょう。

ツールチェイン

npm、ESLint、Prettier、tsc、babel、webpack、Jestなどはチームで利用しているいないに関わらず、現代のフロントエンド成果物を構成する上でどういうフェイズでどういう役割を果たすかを知っておくのは重要でしょう。さらには場合によってはesbuildやrollupなどを利用していることもあるかと思います、その場合に何と代替可能なツールであるかを抑えておきましょう。

Webブラウザ上でのレンダリング

パフォーマンスなどについて考えていくようになるとWebブラウザレンダリングのフェイズがどのように構成されているかについても知っておいて損はないでしょう。手前味噌かつ少し古いスライドですが、こういう資料もあるので参考にしてみてください。

Webブラウザ上でのJavaScript API

JavaScript(ECMAScript)の他にもWebブラウザだけで使えるnavigatordocumentlocationhistoryをはじめ、ServiceWorkerやfetch、その他諸々のAPIがあります。

定番的なのはMDNにまとまっています。

少し前に面白そうなのを紹介した資料も良ければどうぞ。

その他

  • ECMAScriptの仕様についてやWHATWGのLiving Standardについて
  • CSSとReact Componentについて
    • CSS ModulesやCSS in JSについて

まとめ

はてなリモートインターン2021」で行ったフロントエンド講義に詰め込み損ねた情報について列挙してみました。こうやってみるとフロントエンドは学ぶことが多くて大変なように感じるかもしれません。一方でこれらを知らなくてもまずはcreate-react-appなどからはじめてみて、興味が出たことから順番に学んでみるというのでも十分かもしれません。まずは大きく広がっているフロントエンドの世界に飛び込んでみて、Webブラウザを介して体験を提供する喜び、楽しさを感じてみてください。そうして興味が出た時にまたこの記事を思い出して頂いて、この記事が皆さんの学びのための道標になれば嬉しいです。

明日のはてなエンジニア Advent Calendar 2021の担当はid:shimobayashiさんです。