タグ

ブックマーク / zenn.dev (272)

  • 「Firebase Authentication 7つの落とし穴」のリスクを再整理する

    https://twitter.com/kuwahara_jsri のやってる朝活Twitterスペースで以下の記事を知りました。 もちろんこういったリスクを列挙、検討するのは重要なことなのですが、 Firebase Authentication関係ない話では あれ、仕様に関して勘違いしてる? というのがいくつかあったので、再整理していきます。リスクは列挙することには業務上あまり意味はなく、評価され、リスクを受け入れるか外すかを判断するところが重要なので。 IDaaSは脆弱性を生み出すか IDaaS を導入することにより、逆に脆弱性が生まれることもあります。(中略) Firebase Authentication は他の IDaaS と比べて設定項目が少ないという特徴があります。 もちろんここに書かれてることは間違いではありません。ただ、少し実装にフォーカスが寄りすぎていると思っています。

    「Firebase Authentication 7つの落とし穴」のリスクを再整理する
    mizchi
    mizchi 2022/04/28
  • フロントエンドのテスト戦略について考える

    こんにちは。株式会社スタメンでFANTSのフロントエンドを担当している@0906kokiです! 今回の記事では、FANTS におけるフロントエンドのテスト戦略について書きたいと思います。 🙋🏻‍♂️ はじめに みなさんはフロントエンドのテストを書いていますでしょうか? 私が所属しているチームでは、今まで全体的なテスト指針が明文化されていなかったので、機能によってテストが書かれたり書かれなかったり、テストを書くにしても個人によって書く粒度にバラツキがありました。 直近でフロントエンドを書く人が増えていく / プロダクトがスケールしていくにつれて、そうしたバラツキによって生まれるコミュニケーションコストが大きくなってきたり、システム的な安全性を継続的に担保していくことが難しくなっていくように感じました。そのため、今まで方針を定めていなかったテスト戦略を、これから事業やプロダクト、チームがス

    フロントエンドのテスト戦略について考える
    mizchi
    mizchi 2022/04/22
  • イベントループと TypeScript の型から理解する非同期処理

    このは、ブルーベリーの 8 章からインスパイアされて、 TS の型が示す情報から Promise というものを理解してみる、というアプローチで書いたJSの非同期処理の解説です。 これらの資料と合わせて読むことを推奨します。 JSのイベントループのイメージを掴む JSでは中々意識することが少ないですが、正しく理解するには OS レベルのスレッドの視点で考え始める必要があります。 ブラウザや Node.js では一つのスクリプト実行単位を1つのスレッドに割り当てます。それをメインスレッドと呼んだり、ブラウザだったら UI スレッドと呼んだりします。 例えばブラウザでは、これは秒間60回、つまり 16.6ms ごとにループを呼び出します。(node だったらこれがもっと短いです) 仮に setTimeout の実装がなかったとして、それ相当の擬似コードを書くのを試みます。 let handl

    イベントループと TypeScript の型から理解する非同期処理
    mizchi
    mizchi 2022/04/21
    流行りの非同期理解チュートリアルを書いた
  • プロを目指す人のためのTypeScript 本の感想 #ブルーベリー本

    自分も教える事が多いので、読み手にどういう風に学んでほしいか、自分がどういう風に伝えるべきか、という視点で読んだ。 1章・イントロダクション そもそもTypeScript とはなにかみたいな話。 コンパイルエラーが出ている状態ではプログラムが完成したとは言えません。 力強い コンパイルエラーをただ避けるのではなく、利用する気持ち で TypeScript プログラミングに臨みましょう。 初心者に型違反の向き合い方を諭す話。IDEの補助になるとか。 TS年表で取り上げてるのが特徴的。exactOptionalProperty を取り上げてたり。 TSの型はランタイムに影響しない、という話を何度も解説している。これは初心者の誤解がとても多いので、必要だと思う。何度いっても、伝わって欲しい人に伝わらないのだが… enum や namespace については意図的に解説しない。過去のTS独自路線だ

    プロを目指す人のためのTypeScript 本の感想 #ブルーベリー本
    mizchi
    mizchi 2022/04/19
    自分の復習も兼ねて読んだ。完全初学者には厳しいけど他の言語や型システム自体に詳しい人ほど異常発達したユニオンとコントロールフロー解析に学ぶところがあると思う
  • 1~2年目のエンジニア向けにキャリアや勉強方法について話したこと

    オフィスアワーで1~2年目のweb/モバイルエンジニア向けに今後のキャリアや勉強方法について話す機会があった。形式としてはLTのような形ではなく、質問をいくつかもらいそれに都度答える形で進んだ。LTのような1対多の発表よりインタラクティブに相手に合った受け答えができるので良い形式だなと思った。 自分としてはキャリアについて偉そうに語れる立場ではないが、そこそこの刺さる話はできたと思うので今後のためにも要点をまとめておくことにする。 Q. エンジニアとしてのキャリア・技術遍歴を教えて! 自分は正直働いた会社は2社しかない。 2012~2014 大手 Web メディアサイトの開発 2014~現在 起業 技術遍歴。偉そうに語れるようなものではないことがお分かりいただけるだろう... 大学 4 年くらいの頃に WordPress あたりから始まり PHPJavascript を触る 新卒入社

    1~2年目のエンジニア向けにキャリアや勉強方法について話したこと
    mizchi
    mizchi 2022/04/16
  • ts-morphについてまとめる

    Projectを作成する&SourceFileの作成 ts-morphの基は、Projectを作って、そのProject内でSourceFileをファイルから読み込んだり、直接作成したりする。 import { Project } from "ts-morph"; const project = new Project(); // SourceFileを作成する const sourceFile = project.createSourceFile("./hoge"); // ファイルからSourceFileを作成する const sourceFile = project.getSourceFile("./hoge.ts") // Project内の全てのファイルからSourceFileを作成する const sourceFiles = project.getSourceFiles()

    ts-morphについてまとめる
    mizchi
    mizchi 2022/04/16
  • JSの非同期処理を理解するために必要だった知識と学習ロードマップ

    はじめに JavaScript の非同期処理を学習してみて「ある程度自信を持って理解できたと言える」状態に到達したので、その感想とまとめの学習ロードマップとその中でどのような知識が必要になるかを紹介したいと思います。 あるいは、自分が実際に学習してきた道筋に基づいているのでショートカットとして参考にしてもらったり、使えるリソースなどの情報が共有できると思います。もしくは「JavaScript 初心者が非同期処理を理解できるようになるまでの道筋」というストーリーで1つのサンプルとして見ていただけるといいかもしれません。 ChangeLog 大きな変更のみをトラッキングしています。 2022-11-16 の内容を反映させた追記・修正を追加 2022-05-21 構成を修正 「V8 エンジンから考える」の項目を追加 2022-04-30 「イベントループの共通性質」の項目を追加 「ロードマップ

    JSの非同期処理を理解するために必要だった知識と学習ロードマップ
    mizchi
    mizchi 2022/04/13
    自分はjquery deferredを経由したから理解できたけど、asyncからpromiseを逆算するのはしんどいと思う
  • Re: 僕らを縛る Node.js という呪いについて - あるいはなぜ TypeScript 以外が真っ当な選択肢にならなかったか

    Re: 僕らを縛る Node.js という呪いについて - あるいはなぜ TypeScript 以外が真っ当な選択肢にならなかったか https://d.potato4d.me/entry/20220405-nodejs/ へのアンサーソング。 プログラミング言語としての JavaScript の話をする。 2010年頃、Python 2 でプログラミングを学習した自分にとっては Node.js + CoffeeScript が Better Python だった。 CoffeeScript は当時の JS(ES3~5) に足りない機能を補ってくれて、Python と同じく空白制御のオフサイドルールなのが気に入った。見た目が少しだけ Ruby っぽいので当時全盛だった Rails の人間に訴求するにも有利だった。 Node.js のモジュールシステムである Commonjs は Pytho

    Re: 僕らを縛る Node.js という呪いについて - あるいはなぜ TypeScript 以外が真っ当な選択肢にならなかったか
    mizchi
    mizchi 2022/04/06
    書いた
  • なぜ僕が「SPAはコストが高い」と考えているのか

    どうもみなさんこんばんは ちょっと前に「個人開発者やスタートアップの初期からSPAで開発するのはコスト高いっすよね」みたいな事を書いたらフロントエンドエンジニアの皆様からバチバチに叩かれた僕です 彼らには彼らの考えがあるのでそれはどうでもいいのですが、どういう理由があってその発言をしたのか~と言う部分が気になっている方もいたようなので説明しておこうと思います ちなみに今でも全く意見は変わっておらず、この発言に同意できるかできないかは単純に視点の違い、規模の違い、スキルの違いだと思ってます 追記: もちろんSPAじゃないと実現できないようなサービスを作りたい場合はSPA一択ですし(インタラクティブにHPつくるサービスとか。でも世の中の95%くらいのサービスはそうじゃないと思います)、サイトの利用はログインした人にだけ提供するような業務系ツールなどはまた話が別です 前提の話 こういう記事ではコ

    なぜ僕が「SPAはコストが高い」と考えているのか
    mizchi
    mizchi 2022/03/31
    SPAはMPAと可逆だけどMPAはよほど工夫しない限りそうならない。わずかでもSPAの可能性があるならnext使うのが無難
  • terser で複数回 minify することに意味があるパターン

    一部のライブラリ作者が terser を複数掛けているのは知識として知っていたのですが、それのホットスポットを見つけたので記事にしておきます。 この記事で書いた内容はすべて https://try.terser.org/ のデフォルト設定で試したものです。 前提 terser がオブジェクトの定数メンバをどう展開してくれるかを調べようとしました。ネストされた「定数であってほしいもの」をどう解釈するかの実験です。 入力

    terser で複数回 minify することに意味があるパターン
    mizchi
    mizchi 2022/03/25
    書いた。オブジェクト内にある深いパスに定数があるとき、terser を複数掛けることで定数展開される様子
  • ESM treeshake に対応したバンドルサイズを計算してくれる Shakerphobia を作った

    bundlephobia.com というサイトがあります。これは npm のモジュールを参照した際のバンドルサイズを算出してくれるサービスです。 便利なんですが、基的に dist/.. 等の package.json の main で配られるものだけをターゲットにしているので、 ESM Treeshake で一部のモジュールだけ import {} from ... した際のバンドルサイズがわからない、という問題がありました。 なので、それに対応したものを自分で作りました。netlify にデプロイしてあります。 こんな感じです。 使い方 https://shakerphobia.netlify.app/?pkg=<>&imports=<a,b,c> どうやって動いてるか URL を踏むと、 cdn.skypack.dev (その実体は npm) からソースコードを落としてきて、 Web

    ESM treeshake に対応したバンドルサイズを計算してくれる Shakerphobia を作った
    mizchi
    mizchi 2022/03/24
    書いた。ESM Treeshake 対応版 Bundlephobia を作った話 https://zenn.dev/mizchi/articles/bundle-size-with-treeshake
  • (自分の) JavaScript のユニットテストの書き方

    (社内用ドキュメントの公開版) テストのポリシー 前提として、ユニットテストを導入するコストを、限界まで低くすることを目指す。テストが根付いていない言語環境や文化では、放っておくとテストが書かれないまま実装が進行し、結果としてテスト不可能な巨大な雪だるまが完成する。こうなるとメンテコストが高いE2Eを大量に書かないといけなくなり、テストの実行時間が膨れ上がっていく。 そうなる前に、ユニットテストを書きやすい環境を維持し、ユニットテストとして問題を切り分けられるような環境を維持する。とにかく書きやすさを重視し、一つのユニットテストを書くオーバーヘッドを限界まで下げる。 最初の一つを早い段階で書く 自分の経験的には、ユニットとテストの最初の一つを書いたらあとは自然とその周辺で増えていく。サンプルがあったら人はコピペする。逆にいうと最初の一つを書かない限り一切書かれない。まず一つ用意するのが大事

    (自分の) JavaScript のユニットテストの書き方
    mizchi
    mizchi 2022/03/22
    書いた
  • WebAssembly の GC Proposal とは何か / どこに向かおうとしてるのか

    最初に これは WebAssembly に GC が導入されるから紹介、という記事ではない。どちらかというと、WebAssembly GC の採用がどれだけ遠く、また GC がのればどんな言語でも wasm のコンパイルサイズが減って軽量になる、という夢を見ている人に、現実を見てもらうための記事になる。 WebAssembly GC Proposal (Team)は、それを実現するパーツを分割して仕様策定を進めていて、実際に GC が動き出すまでには数年かかるだろうし、自分の感覚的に、将来的に GC が採用されるかは五分五分といったところ。 ただ、 GC Proposal から派生した仕様郡は GC が採用されなかったとしても有意義なものばかりなので、記事ではそれを紹介したい。 基的にここを参照 Excuse 自分は低レベルプログラミングの経験が浅く、WebAssembly のために関

    WebAssembly の GC Proposal とは何か / どこに向かおうとしてるのか
    mizchi
    mizchi 2022/03/10
    記事書いた。 WASM GC Proposal が何を目指しているか。またなぜすぐには実現しないのか。
  • 実行環境依存のコードに対してテストを書く考え方

    社内用の啓発記事ですが、閉じる理由がないのでここに投げます。 ブラウザにべったりなコードを書いてると、ブラウザや node.js 固有の環境をインラインで記述してしまうことが多々あると思います。 あえてダメダメなブラウザ向けのエントリポイントの例を書きます。 // main.ts let id = localStorage.get('id'); if (!id) { id = `${navigator.userAgent}-${Math.random()}`; localStorage.set('id', id); fetch('/auth', { method: 'POST', credentials: 'include', body: JSON.stringify({ id, at: Date.now(), }), headers: {'Content-Type': 'applicat

    実行環境依存のコードに対してテストを書く考え方
    mizchi
    mizchi 2022/03/04
    書いた。社内用のドキュメントだけど一般的なブラウザ用コードのテストの書き方
  • wasm-pack で regex を使う時のビルドサイズとパフォーマンスの調査

    tl;dr regex crate のサイズが重い(700k) wasm-pack 環境で単純な正規表現のユースケースなら js-sys::RegExp を使う方が速度/サイズ両面で有利 なぜ調査するか wasm で軽量プログラミング言語を作りたいと思い、rust のパーサジェネレータを調べていた。 nom でサンプルの #ff00cc みたいなカラーコードをパースする example を wasm ビルドすると、16kb程度なのに対し、lalrpop で簡単な構文で生成した wasm binary が 697kb になってしまった。 追ってみると lalrpop は構文定義の grammar.lalrpop から grammar.rs を生成する precompile 処理と、その後のランタイム処理で使われる lalrpop-util がある。 この lalrpop-util は reg

    wasm-pack で regex を使う時のビルドサイズとパフォーマンスの調査
    mizchi
    mizchi 2022/02/21
    昨日書いた
  • corepack でモジュールごとに npm クライアントを指定する

    tl;dr node 14.19.0 で npm のバージョンを明示的に切り替える corepack が入った package.json の packageManager フィールドで npm 自体のバージョンや yarn の使用するバージョンを指定できる 詳しくは https://zenn.dev/teppeis/articles/2021-05-corepack 現状の npm-cli 自体が corepack に対応してないので、有効にしたければ npm コマンド自体を corepack に移す必要がある 現時点で packageManager を指定するだけだとまだ他の環境で有効にならないが、将来的に npm と node の corepack 対応が行き渡った時点で段階的に有効になる。 もっと詳しく # 手元の node を v14.19.0 以上に更新する # 自分は nvm

    corepack でモジュールごとに npm クライアントを指定する
    mizchi
    mizchi 2022/02/02
    node14 の最新版に入った corepack について挙動を調べて書いた。packageManager を書いておくと段階的に有効になるので、とりあえず書いておきましょう
  • dioxus web やってみる

    dioxus は RustGUIアプリケーションフレームワーク。 React を模した仮想DOM の APIで、 desktop アプリや wasm 吐き出しができる。 公式チュートリアルは desktop 版だったのでブラウザ版を探したら、たどり辛いところにあった。 Setup # rust や cargo のセットアップは略 $ cargo install trunk $ rustup target add wasm32-unknown-unknown # 公式ドキュメントになにもないが、 cargo add コマンドは cargo-edit が必要 # rust ユーザーなら常識かもだが、久しぶりなので知らなかった… $ cargo install cargo-edit # bundler として trunk というビルダーをインストール $ cargo install --lo

    dioxus web やってみる
    mizchi
    mizchi 2022/01/30
    Rust のGUIフレームワークの dioxus で wasm 吐き出しで遊んでたメモ書いた
  • Rust でパーサコンビネータを作ってみる (前編)

    パーサーコンビネータ とは、小さなパーサーを 合成(combine) して複雑なパーサーを作り上げていく手法です。この記事では、Rust で簡単なパーサーコンビネータのライブラリを作成し、それを使って JSON をパースすることを目指します。 パーサーコンビネータの使用例 今回作成するパーサーコンビネータを使うと以下のようなコードが書けます。 // カンマ区切りの整数列を受け付けるパーサー let digits_seq = separated(digits, character(',')); // "empty" というキーワードを受け取り、空の Vec を返すパーサー let empty_keyword = map(string("empty"), |_| vec![]); // カンマ区切りの整数列 または "empty" というキーワードを受け付けるパーサー let parser =

    Rust でパーサコンビネータを作ってみる (前編)
    mizchi
    mizchi 2022/01/26
  • node プロジェクトでも deno lint | deno fmt する

    なぜ npm ツールチェインで消耗した こういうところでシュッと deno を入れておくことで、あわよくば番で使う準備をする 経緯 久々に eslint の設定を見直したらやたら長大な感じでメンテがしんどくなった npm/yarn workspace で monorepo 化した際に、様々な eslint のバージョンが混在して peer-deps の管理が困難になった deno に組み込まれてる lint, fmt は deno かどうかはあまり関係なく、単に typescript なら使える 中身は https://dprint.dev/ と https://github.com/denoland/deno_lint deno lint は eslint の recommended 相当のものは実装してある eslint + typescript をメンテするより、 eslint

    node プロジェクトでも deno lint | deno fmt する
    mizchi
    mizchi 2022/01/12
    書いた。こういうところからシュッと deno を紛れ込ませていくぞ
  • turborepo で monorepo の差分ビルド

    Turborepo vercel が開発した monorepo 環境のためのビルドツールです。vercel ですが next 非依存です。 turborepo が何を解決するか node.js に限らず monorepo 環境下では、それぞれの内部モジュールのビルドは個別に行われることが多いです。ここでいう内部モジュールは、 package.json を持つディレクトリ単位、と捉えてもらって結構です。 apps/ web/ package.json # => foo, bar を参照 packages/ foo/ package.json dist/ index.js bar/ package.json # => foo を参照 dist/ index.js package.json このビルドが、(ビルドしない素の js と比べて)面倒な問題を引き起こします。 更新時にビルドを忘れて古い

    turborepo で monorepo の差分ビルド
    mizchi
    mizchi 2022/01/06
    書いた