ブックマーク / mizchi.dev (21)

  • node.js のメトリクスの計測、ベンチマークの改善、Docker イメージの絞り方を勉強した

    フロントエンドのパフォーマンス計測は得意なのだが、サーバーサイド node.js のメトリクスの取り方はあまり知らなくて、いつも勘でやりがちだった。最近は業務でこの周辺で困ることが増えたので、勉強しなおした。 また、最近使ってみたかった cloudflare workers の制限で、メモリ 128MB、CPU 時間 50ms という制約があり、このためにも Node.js の CPU のメトリクスを計測できるようになっておく必要があった。 という目的を踏まえて、今回は OS やデータベースの最適化は扱わず、ネットワークとアプリケーション層だけに絞って学習した。あと仕事Docker イメージのサイズにも悩んでたので、ここも。 (あと ISUCON 参加者が楽しそうだったのもある。 ISUCON のチューニング対象にフロントエンドは含まれないので…) 計測対象 今回実験したリポジトリはこ

    node.js のメトリクスの計測、ベンチマークの改善、Docker イメージの絞り方を勉強した
  • Cloudflare Workers それは Frontend / Node.js が CDN Edge Side まで拡張されるもの

    最近は Cloudflare Workers が熱くて、週末はずっとその調査しています。この記事はそのまとめです。 注意点として、手元でいろいろなパターンで動かして試してはいますが、プロダクション環境で運用したわけではないです。それを踏まえた上でお読みください。 特に断りが無い限り、引用文は DeepL で翻訳したものです。 Cloudflare Workers とはなにか Cloudflare Workers | サーバーレスコンピューティング | Cloudflare 一言でいうなら 「ServiceWorker の API が CDN Edge 上で動く JavaScript 処理系」 です。 Technology Radar では、まだ ASSESS(調査) フェーズという扱いです。 Cloudflare Workers | Technology Radar | ThoughtWo

    Cloudflare Workers それは Frontend / Node.js が CDN Edge Side まで拡張されるもの
  • minlink - browser/node で使える Worker ラッパー

    mizchi/minlink: Minimum(> 1kb) and isomorphic worker wrapper with comlink like rpc. というライブラリを作った。自分で使ってみて、とても便利だったので紹介する。 概要 Browser WebWorker / Node worker_threads を同じ API でラップして、関数呼び出しのように使える Magical なことをしない軽量 comlink みたいなもの 双方向で API をラップできる Web Worker を使う思想的な背景は off-the-main-thread の時代 - mizchi's blog にて。 使い方: Browser WebWorker をラップする。 // browser worker.js import { expose } from "minlink/dist/b

    minlink - browser/node で使える Worker ラッパー
  • ちょっとでもセキュリティに自信がないなら、 Firebase Authentication を検討しよう

    note のやらかしのあのへんについて。 認証自作、 Rails 、 Devise - Diary パーフェクト Rails 著者が解説する devise の現代的なユーザー認証のモデル構成について - joker1007’s diary 認証サーバーの実装は質的に難しいです。セキュリティが絡むものは「簡単な実装」などなく、プロアマ個人法人問わず、個人情報を守るという点で、同じ水準を要求されます。悪意あるハッカーは常にカモを探していて、もし認証が破られた場合、自分だけではなく大多数に迷惑が掛かります。初心者だから免責されるといったこともありません。全員が同じ土俵に立たされています。 とはいえ、認証基盤を作らないといろんなサービスが成立しません。そういうときにどうするか。 Firebase Authentication で、タイトルの件なんですが、 Firebase Authenticat

    ちょっとでもセキュリティに自信がないなら、 Firebase Authentication を検討しよう
  • 大統一 Node ツールチェイン Rome の野望 現状の実装

    つい先日 beta リリースされたフロントエンドのツールチェインの Rome について、その思想とコードを読んだ結果の現状について。 Rome Frontend Toolchain この記事は公式ドキュメント以外にもソースを読んで得られた undocumented な部分も含んでいるので、すぐ古くなる。その前提で読むように。 問題の認識とその解決手段 フロントエンドの最適化は実行前のプリプロセスに、エコシステムの開発リソースの多くが当てられている。Node のツールチェインが発達するにつれて、自前の パーサ+AST 定義を持つ実装が増えていった歴史がある。 acorn(estree) babel prettier typescript terser それぞれのツールの生成する AST はそのツールの都合で微妙に/もしくは大幅に定義がずれている。typescript に至っては完全に別物。こ

    大統一 Node ツールチェイン Rome の野望 現状の実装
  • next.js + vercel + firebase authentication で JWT の検証を行う + Graphql

    今個人で作ってるアプリの 認証 + Graphql の部分を抜き出して GitHub に公開した。 mizchi/next-boilerplate-20200727 next.js + vercel + firebase は (パーツを良く選べば) 最高 next.js はルーティングを持つページを作るには最高で、サーバー、静的サイト、JAM スタック、AMP と必要に応じて選択できる。React ベースならこれ一択。 認証サーバーの実装は毎度疲れるし、Firebase Athunetication はこの点においては OAuth Secret を置くだけ + Custom Provider も作れるので、最高。 それと比べて firestore は、ちょっと前に firestore べったりでアプリを試作したことがあったのだが、型がないためにかなり扱いづらく、また読み書きの速度が遅くパフ

    next.js + vercel + firebase authentication で JWT の検証を行う + Graphql
  • コードとビジュアルの双方向編集なエディタを試作して ビジュアルプログラミングについて考えてみた

    ノーコードは形を変えた現代の RPG ツクールなのではないか - mizdev の記事では、ノーコードのビジュアルプログラミングが発展性を欠く理由として、次の理由を挙げました。 汎用的なビジュアルプログラミング基盤(Scratch みたいなものではなくプロユースなもの) ↑ 上でのビジュアル環境でのデータベースのグラフ構造のビジュアル化手法 ↑ 上でのビジュアル環境でのパイプラインのビジュアル化手法 ↑ 上での UI とデータと UI のマッピングのビジュアル化手法 これらを隠蔽してオートスケールするマネージレスなインフラ基盤(これはパイプライン実装の中身) で、こんなものを作った話 現代の Intellisense + Formatter 感覚 TypeScript の補完と、保存の度に prettier をバリバリに効かせた状態でプログラミングをしていると、そもそも自由文脈でコードを書

    コードとビジュアルの双方向編集なエディタを試作して ビジュアルプログラミングについて考えてみた
  • 省ビルドサイズ要求環境でモダンフロントエンドをやる (主に preact の話)

    モダンフロントエンド = 宣言的 UI = 仮想 DOM ターゲット npm ツールチェインが使えない環境で、パフォーマンスを悪化させずにモダンフロントエンドをやりたい人 サードパーティスクリプトを提供する人 方向性 省ビルドサイズを目指す とくに外部から読み込まれる 3rd party script は、サイズ要求が厳しい lighthouse で 100 点の環境の点数を落とさないためには、おそらく 3rd は 20~30kb 未満を目指す必要がある 今後パフォーマンスが SEO に関わってくるので、このへんは重要 Google、ウェブサイトの UX 健全性を示す Web Vitals を導入。3 つの重要指標は LCP/FID/CLS | 海外 SEO 情報ブログ 実行時パフォーマンス要求 よほど複雑なアルゴリズムを実行するので無い限り、省ビルドサイズ制限を満たせば十分 モバイルで重

    省ビルドサイズ要求環境でモダンフロントエンドをやる (主に preact の話)
  • ノーコードは形を変えた現代のRPGツクールなのではないか

    この記事について。 2030 年 「エンジニアです。コードは書けません。」|__shinji__| note 自分はそもそもビジュアルプログラミングやオーサリングに興味があり、ノーコードは興味の範疇でありつつも、現状のもの、現状の「コード抜きで作れる」ような謳い文句は厳しいと思っています。それを、RPG ツクールを例に説明します。 はじめに、ノーコードを分類する 記事では、「専用の管理画面で編集し、出力のためにコードを書かない、もしくはコピペ程度」のものをノーコードとして扱います。 その中でさらに種類ごとに分類してみます。このような定義があるわけではなく、自分の主観的で暫定的な分類です。 タイプ 1: データベースから自動的にフォームを生成 Google App Sheet MS Power Apps タイプ 2: 高水準 API のパイプライン Zapier IFTTT 古の Yaho

    ノーコードは形を変えた現代のRPGツクールなのではないか
  • ts-expect-error を付与しながら .js を .ts に一括で書き換える

    やりたいこと 巨大なコードベースに対して、 .js をとりあえず .ts に書き換えてしまいたい。 だが、素朴な拡張子の書き換えで型違反が出ると jest やその他ツールが止まりはじめて面倒。 なので、エラー行には // @ts-expect-error を自動で付与しながら書き換えたい。@ts-ignore ではなく、@ts-expect-error なのは、型エラーを修正した際に、それが伝搬するようにするため。 方法 ファイルの拡張子を .js から .ts に書き換える typescript service 経由で型を検査し、エラー行を集める エラーが出た行に // @ts-expect-error を付与する コード 書き捨てなので汚いです import * as ts from "typescript"; import { uniq } from "lodash"; import

    ts-expect-error を付与しながら .js を .ts に一括で書き換える
  • IE First を避ける

    まず、去年の実績として、IE のシェアが 9% から 5% になっています。 Browser Market Share Japan | StatCounter Global Stats 世界だと 1.4% です。これは途上国などでは Android Chrome が支配的だからです。 https://gs.statcounter.com/browser-market-share/all 国内で「IE シェア」などでググって出るサイトは 9% と出ていますが、これはデスクトップのみの数字で、モバイルを含めた数字は 5%前後です。日はさらに Chrome ベースの新 MS Edge の正式リリースがコロナと確定申告の影響で延期されており、リリースのタイミングでさらに減ることが予想されます。 去年の実績値でいえば、来年度には 2% 台、再来年には 1%を切っている可能性があります。これは to

    IE First を避ける
  • react-jsonschema-form(@rjsf/core) を使う場合は material-ui を使うしかない

    jsonschema から form を生成してくれる react-jsonschema-form というライブラリがある。デモページをみたところ、かなり良く出来てるように感じたので、使ってみた。 react-jsonschema-form playground だが、いざ使ってみるとかなり混沌とした状況だった。 tldr @rjsf/core の出力は bootstrap@4 で壊れている bootstrap@3 を避ける場合 @rjsf/material-ui を使うしかない 経緯 まず、多くの紹介記事は古く、react-jsonschema-form は @rjsf/core に名前が変わっている bootstrap@3 は jquery 依存が残っているなど、レガシーな設計なので、可能な限り避けたい @rjsf/core は bootstrap@3 の CSS を前提にした出力をす

    react-jsonschema-form(@rjsf/core) を使う場合は material-ui を使うしかない
  • module bundler を作った

    このフロントエンドの魔境に生まれたからには一度は俺が考えた最強の module bundler を作りたい。みんなそう思ってると思う。作った。 mizchi/bundler: hobby bundler tldr このコードが // foo.js export default 1; // index.js import foo from "./foo.js"; console.log(foo); export const index = 1; こうなる // @mizchi/bundler generate const _$_exported = {}; const _$_import = (id) => _$_exported[id] || _$_modules[id]((_$_exported[id] = {})); const _$_modules = { "/foo.js": (_

    module bundler を作った
  • React Context を用いた簡易 Store

    課題 redux を引っ張り出すと大仰になる。Context 下に共有ステートを持ってそこに setState できるだけでよい。 なので、次の 2 つを用意する 現在の state を参照する const appState = useAppState() 現在の state を更新する関数を返す const setAppState = useSetAppState() React.useState() と違って分割している理由は、主にパフォーマンス上の理由 大域な参照なので、可能な限りステートを参照したくない setState() の API は (prevState: State) => State も取れるので、状態更新用途に限ってはそもそも useAppState() せずに済むことが多い でも毎回書いてるけどボイラープレート感強い上に忘れるのでここにメモする 毎回書いてるボイラー

    React Context を用いた簡易 Store
  • next.js で自分のブログを作る

    next.js で自分のブログを作る 自分のブログとして mizchi.dev を作った話 at 隅田川.js #1(オンライン) - connpass 何を作ったか このブログ自身(mizchi.dev)。スライドツールも突貫で自作 ソースコード mizchi/dev Lighthouse Full AMP GA 対応 Git から編集ヒストリの生成 どんなブログがほしかったか Lighthouse で満点出したい 普通の Markdown じゃつまんないから MDX で書きたい サーバーの運用をしたくない next.js の最適化に乗りたい 作った どうせ動かないし CDN 上で静的サイト + Full AMP MDX コンパイラを自作 (amdx) netlify + 買ったまま忘れてたカスタムドメイン(mizchi.dev) pages/*.tsx が公開される仕組みを、そのまま採

  • Incremental Static Regeneration で実現する次世代のサーバーアーキテクチャ

    next.js 9.4 に Incremental Static Regeneration という実験的な新機能があります。 Blog - Next.js 9.4 | Next.js パッと見、「段階的な静的サイト生成…?なんのことだろう…」となったのですが、手元で試してみた感じ、これが既存のサーバーの実装アプローチを変える、革命的な機能ではないかと思いました。 解説を書きつつ、どのような応用があるか解説します。 next.js の Incremental SSG を試してみる リポジトリはここです。 mizchi/issg-playground 解説にあたっては、必要なのはほぼこのファイルだけで、短いのでそのまま貼ります。 // pages/[slug].tsx import { GetStaticProps, GetStaticPaths } from "next"; type Pro

    Incremental Static Regeneration で実現する次世代のサーバーアーキテクチャ
  • Hello, Deno v1.0.0

    Deno 1.0.0 がリリースされて、ちょっと遊んでみたので、その感想。 圧倒的ゼロインストール感 自分は mac なので brew install deno しました。deno コマンドが入ります。セットアップはこれで終わり。 GitHubtrending に上がっていた https://github.com/oakserver/oak という web server を試してみます。 // server.ts import { Application } from "https://deno.land/x/oak/mod.ts"; const app = new Application(); app.use((ctx) => { ctx.response.body = "Hello World!"; }); await app.listen({ port: 8000 }); この

    Hello, Deno v1.0.0
  • Recoil について勉強した

    Fecebook が新しく発表した Recoil について 自分の学習手順 Getting Started | Recoil を写経して動かす Facebook 製の新しいステート管理ライブラリ「Recoil」を最速で理解する - uhyo/blog で非同期周りを理解 公式ドキュメントの API Reference で理解 <RecoilRoot ...props /> | Recoil これは自分が写経しながら書いた型定義。色々足りてないがチュートリアルで出る範囲は理解できる。 declare module "recoil" { export type RecoilState<T> = {}; export const RecoilRoot: React.ComponentType<{ initializeState?: (options: { set: <T>(recoilVal:

    Recoil について勉強した
  • next.js の amp モードで tailwind.css を purgecss と合わせて使う

    このリポジトリ でやったこと。 やろうとしたこと tailwind.css は Utility First と銘打った CSS フレームワークで、コンポーネント化を前提としたモダンフレームワークと相性がいいです。今回は next.js の amp-mode で tailwind を使おうとしてみました。 Tailwind CSS - A Utility-First CSS Framework for Rapidly Building Custom Designs 問題 前提として、 amp には inline css の容量制限があり、75kb を超えると AMP と認識されなくなります。 tailwind はビルドして使うのが前提のフレームワークですが、全部入りの tailwind.min.css は 1.3 M あります。これでは到底、75 kb に収まりません。 AMP の CSS

    next.js の amp モードで tailwind.css を purgecss と合わせて使う
  • next.js の AMP mode を使って静的サイトを作る

    この記事は amdxg を作りながら, next.js で AMP に対応したときにやったことです。 コードはこちらです amdx/packages/ssg at master · mizchi/amdx AMP について Google の推奨する HTML のサブセット仕様です。制約付きのインライン CSS のみ + 一切の JS が書けず、代わりに動きがあるものは amp plugin を使って記述します。 モバイルでは、Google の検索結果画面からは GoogleCDN 上のキャッシュが返却されるので、非常に高速に開くことができます。 (⚡ マークが AMP 対応の印) モバイルに限らず、ある種のベストプラクティスの強制なので、PC でも AMP 対応することに意味はあります。 この記事では、実際にこのブログのための SSG を作る過程で、どのように next.js 上で AMP

    next.js の AMP mode を使って静的サイトを作る