ブックマーク / www.mizdra.net (13)

  • 試行錯誤を邪魔しない開発環境 - mizdra's blog

    ある機能を実装する際、完成形のコードになるまでには、プログラムとして不正確な状態や、プロダクト品質ではない状態を経る 静的型検査や lint rule に違反したコードが途中に挟まる 型エラーや lint エラーは望ましくないので、できるだけ早くこうした情報を開発者に伝え、気付けるようにすると良い CI でこうしたエラーを検知して、Pull Request をマージする前に気づけるようにするとか エディタ上にエラーの情報を表示して、コーディング中に気づけるようにするとか エラーを積極的に通知してくれるのはありがたいけど、やりすぎには注意するべき なんとなくでも動いてくれたほうが嬉しい 例えば lint エラーがあった際に、watch モードで起動しているビルドやテストの実行を止めて、lint エラー見つけたよーと教えてくれる開発環境がたまにあるけど... 別にビルドやテストの実行は止める必

    試行錯誤を邪魔しない開発環境 - mizdra's blog
    l08084
    l08084 2023/01/31
  • コードジャンプ可能な CSS Modules を実現する happy-css-modules の紹介 - mizdra's blog

    弊社では ReactCSS を書くための手法として CSS Modules を全面的に採用しています。そこで CSS Modules を使った開発をより快適にするために、「happy-css-modules」というツールを作りました。 happy-css-modules のデモ。 この記事ではこのツールが必要になった背景、導入方法、そしてツールの技術的な仕組みについて紹介します。 CSS Modules の問題点と、typed-css-modules による解決 CSS Modules では、デフォルトでは存在しないクラス名を使用しても、(プロジェクトの設定次第ですが) TypeScript のコンパイルエラーが出ることはありません。 import styles from './Button.module.css'; function Button() { return ( <but

    コードジャンプ可能な CSS Modules を実現する happy-css-modules の紹介 - mizdra's blog
    l08084
    l08084 2022/11/15
  • リリースノート自動生成テクニック - mizdra's blog

    普段からいくつか趣味で作ったツールやライブラリを npm パッケージとして publish しています。ちょっと工夫していることとして、「できるだけ簡単に npm publish できるようにしておく」というものがあります。npm publish が心理的に、手順的に難しいと、すでに main ブランチに新機能や修正が入っているのに、npm publish されていない、という状況が発生しがちです。新機能や修正をすぐにユーザに送り届けられるよう、npm publish は無思考でできるようになっていると嬉しいです。 その一環として、リリースノート (CHANGELOG) の自動生成というのをやっているので、その紹介をしてみます。当は 6 月にやっていた Maintainer Month 期間 に間に合わせたかったのですが、とろとろしていたら 7 月になってしまった! まあ遅れたから公開し

    リリースノート自動生成テクニック - mizdra's blog
    l08084
    l08084 2022/07/09
  • npm-scripts を書く時の手癖 - mizdra's blog

    かれこれ 5 年くらい趣味開発で npm-scripts を書き続けている。長年書き続けているとノウハウが蓄積されてきて、「こう書くとスッキリする」「迷いがなくなる」「後から拡張したくなった時に、簡単に拡張できる」みたいな書き方が身についてきた。自分の型、あるいは手癖のようなものだと思う。 せっかくなので、id:mizdra の今の npm-scripts を書く時の手癖を書き連ねてみる。 基形 { "scripts": { "build": "webpack --mode production", "dev": "webpack-dev-server --mode development", "lint": "eslint .", "test": "jest" } } 一番シンプルな npm-scripts を書く時のパターン。以下の 4 つの script を登録している。 buil

    npm-scripts を書く時の手癖 - mizdra's blog
  • TypeScript 4.5 Beta で実装された Node.js ESM 対応を試してみた - mizdra's blog

    ご存じの方もいるかもしれませんが、TypeScript 4.5 Beta で遂に Node.js ESM がサポートされました。まだ Stable に来ていない実験的な機能なのですが、どういうものなのか気になったので、先日趣味で作っているプロダクトに導入してみました。で、この記事はその備忘録です。実験的な機能で、これから状況もどんどん変わっていくので、数カ月後にはこの記事の内容も古くなっているかもしれません。未来から来た人がこの記事を読んでいる場合は、注意して読んで下さい。 今回 TypeScript の Node.js ESM 対応を導入してみたのはこちらの eslint-interactive というプロダクトです。以前このブログでも紹介した ESLintAPI を使った CLI ツールです。 github.com www.mizdra.net www.mizdra.net どう

    TypeScript 4.5 Beta で実装された Node.js ESM 対応を試してみた - mizdra's blog
  • WebAssemblyを使って乱数調整ツールをWebに移植した話 - mizdra's blog

    tl;dr C++のツールをWebAssemblyを使ってWebに移植した WebAssemblyへコンパイルする言語としてRustを, JS-WebAssembly間のバインディングにwasm-bindgenを採用した 乱数計算処理をWebAssemblyで実装することで, C++実装と比べて0.2〜0.7倍, JS実装と比べて1〜13倍の性能が出た はじめに 枠だけ確保してずっと放置していた去年のAdvent Calendarの記事がようやく書けたと思ったら, もう少しで今年のAdvent Calendarがやってくる季節になってしまいました. この記事は Pokémon RNG Advent Calendar 2017 23日目の記事です. adventar.org 皆さんは「乱数調整」という言葉を知っているでしょうか? 乱数調整とは簡単に言うと計算機によってゲームのランダムな事象を

    WebAssemblyを使って乱数調整ツールをWebに移植した話 - mizdra's blog
    l08084
    l08084 2021/05/08
  • JavaScript で print デバッグ時に変数名を出力する - mizdra's blog

    数列の和を求めるプログラムを作成することになり、意気揚々と以下のようなプログラムを書いたという状況を想像して下さい。 function sum(nums, acc = 0) { if (nums.length === 0) return 0; if (nums.length === 1) return nums[0]; return sum(nums.slice(1), acc + nums[0]); } const nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; console.log(sum(nums)); // expected: 55 一見すると何も問題なさそうに見えるプログラムですが、実はバグがあります (皆さん分かりますか?) *1。実際に上記プログラムを実行すると 55 ではなく 10 が出力されます。 こうした場面に遭遇すると、自然と sum

    JavaScript で print デバッグ時に変数名を出力する - mizdra's blog
    l08084
    l08084 2021/05/03
  • Webpack における bundle size の変化を継続的に監視する - mizdra's blog

    main ブランチとこのPRでどれだけ bundle size が変化したか比較したり、増加量がある閾値を超えていたら CI を fail させる、みたいなソリューションは結構紹介されているけど、bundle size の変化を継続的に監視する方法はあまり紹介されていないようだったので紹介します。 やり方 webpack --mode production --json でビルド情報を JSON で取得 JSON から chunk ごとの size に関する情報を抜き出す 好きなメトリクス監視サービスに2で手に入れたメトリクスを投げる で、それを実装したのがこのPR。見れば分かるので見てください。 github.com 30行程度で実装できて簡単ですね。

    Webpack における bundle size の変化を継続的に監視する - mizdra's blog
    l08084
    l08084 2021/03/31
  • rule ごとに高速に eslint --fix できるツールを作った - mizdra's blog

    大量のエラーに対して rule ごとに高速に eslint --fix できるツール 「eslint-interactive」 を作ったので、その紹介です。 動機 ESLint のデフォルトの出力はエラーの発生源や修正のためのヒントなど、開発者に役立つ多くの情報を含みます。これは多く場合機能しますが、膨大な量のエラーが報告される状況ではあまり機能しません (例えばプロジェクトに ESLint を導入する時や、プロジェクトの .eslintrc に大幅な変更を加える時など)。そうした状況では ESLint の出力が膨大になってしまい、開発者による出力の分析が困難になってしまいます。また、多くの種類のエラーがごちゃまぜになって出力されているため、エラーを修正するのも困難です。 そのため、このような多くのエラー発生する状況では、以下の 2 つの事柄が重要であると考えています。 全てのエラーをまと

    rule ごとに高速に eslint --fix できるツールを作った - mizdra's blog
    l08084
    l08084 2021/02/12
  • ブラウザにおけるメモリリークを解決するために読んでおけると良い資料 - mizdra's blog

    最近趣味仕事の Web アプリケーションでメモリリークに遭遇して、頑張ってメモリリークの原因を突き止めて修正する、ということがあった。その過程でメモリリークについて色々調べて知見が溜まったので、学習資料の紹介という形でアウトプットしてみる *1。 前置き 紹介する記事がかなり偏っていることに注意 冒頭で触れたメモリリークを解決するために読んだ記事をまとめただけなので、内容にそれなりの偏りがある 例えば id:mizdra が遭遇したメモリリークは全てブラウザ上で発生していたものだったので、これから紹介する内容も主にブラウザにおけるメモリリークに焦点を当てたものになる GC がどうメモリをどう解放しているか、何故メモリリークが発生するのかは全てカット 調べれば色々な記事が出てくるので、必要に応じて読んでください 基的な知識を抑える まずメモリリークとメモリ撹拌の違いを学ぼう どちらも同じ

    ブラウザにおけるメモリリークを解決するために読んでおけると良い資料 - mizdra's blog
    l08084
    l08084 2021/02/10
  • polyfill を深堀りする - mizdra's blog

    この記事ははてなエンジニア Advent Calendar 2020 5日目の記事です。4日目は id:syou6162 さんで、数字のバラ付きを考慮して意思決定する技術でした。 qiita.com developer.hatenastaff.com こんにちは、id:mizdra です。今年新卒としてはてなに入社し、WebアプリケーションエンジニアとしてGigaViewerというマンガビューワーを作っています。 最近のはてな社内では「tech-future」という、様々な技術を見つめ直すワーキンググループを運営しています。この会では、ある技術についての要点をまとめるだけでなく、その技術にまつわる歴史を紐解いて整理し、その上で全体を俯瞰して将来その技術がどういう方向に向かうのかを議論し、未来を予測する手がかりを作る、といった挑戦的な取り組みをしています。既に弊社のエンジニアから「tech-

    polyfill を深堀りする - mizdra's blog
  • target=''_blank" な <a> タグに noopener だけでなく noreferrer も付けるべきか - mizdra's blog

    追記 2020/10/29: モダンブラウザによって noreferrer が自動的に付与されつつある、という説明をしていましたが、正しくは noopener の間違いでした。失礼しました。既に記事の方は修正済みです。 追記終わり。 target="_blank" は新しいタブでリンク先を開くためのオプションです しかし、これにはリンク先のページからリンク元のページの window オブジェクトにアクセスできるという、ちょっと癖のある挙動があります この挙動自体は脆弱性ではありませんが、 フィッシング詐欺などに悪用される可能性がある、危険な挙動であることが知られています リンクのへの rel=noopener 付与による Tabnabbing 対策 | blog.jxck.io noopener そこで一般には、target="_blank" な <a> タグには noopener を指定

    target=''_blank" な <a> タグに noopener だけでなく noreferrer も付けるべきか - mizdra's blog
    l08084
    l08084 2020/11/07
  • Chrome拡張機能でコールバック地獄を解決する - mizdra's blog

    Chrome拡張機能の非同期APIはコールバックにより実装されています. 例えば, 拡張機能ごとに用意されるストレージからデータを取得する場合, ストレージへのアクセス中にJavaScriptの処理が中断されるのを防ぐため, 非同期APIが用意されています. // background.js chrome.storage.local.get(['admin'], (result1) => { chrome.storage.local.get([`user/${result1.admin}/name`], (result2) => { console.log(result2) }) }) このコールバックによる非同期APIJavaScriptにおいては一般的な非同期APIの実装手法ですが, 「コールバック地獄」という問題を引き起こします. これを解決する手法としてES2015で追加されたP

    Chrome拡張機能でコールバック地獄を解決する - mizdra's blog
    l08084
    l08084 2018/06/26
  • 1