ブックマーク / susisu.hatenablog.com (13)

  • TypeScript の DI 手法あれこれ - Object.create(null)

    TypeScript で DI (依存性注入) するためのライブラリを作ったんですが, それを紹介する前に既存手法をまとめておいた方が説明が楽だなと思ったのでまとめておきます. そもそも DI の目的とは, みたいなところは詳しく説明しないのであしからず. 手法の比較 DI なし Service Locator エフェクト Constructor Injection Setter Injection デコレータ typed-inject 次回予告 手法の比較 DI なし まずは DI を使わない場合を見ていきましょう. ここでは例として, 以下のような時刻と乱数を必要とするコンポーネント MyService が, 時刻と乱数を扱う機能をそれぞれ提供するコンポーネント Clock と Random に依存するような場合を考えます. type Clock = { getTime: () =>

    TypeScript の DI 手法あれこれ - Object.create(null)
    l08084
    l08084 2023/06/21
  • TypeScript 型レベル関数型プログラミング in 2023 - Object.create(null)

    ちょっと前に話題になった hotscript の技法の紹介やら, ラムダ計算を TypeScript の型にコンパイルする話やらなんやら. 通常の型レベル関数 TypeScript の型エイリアスはパラメータを取れるので, これは型レベルの関数であるとみなせます. type IsNumber<X> = X extends number ? true : false; type A = IsNumber<42>; // = true 一方でこのようにして定義された関数は第一級ではない, つまり関数そのものを他の関数の引数として渡したりすることができません. type FilterUnion<F, X> = X extends unknown ? (F<X> extends true ? X : never) : never; // ~~~~ // ^ Error: Type 'F' is n

    TypeScript 型レベル関数型プログラミング in 2023 - Object.create(null)
    l08084
    l08084 2023/03/25
  • TypeScript 型レベルプログラミング フリースタイルガイド - Object.create(null)

    TypeScript の型レベルプログラミングのための真面目なスタイルガイドではありません. 型なしラムダ計算で喜ぶような人間が使うための諸刃の剣です. この記事の内容は TypeScript2022 年 1 月時点での最新版である 4.5.4 に基づいています. 将来のバージョンでの妥当性は保証しません. 「型〜」「〜型」という用語の「型」はしばしば省略します. 値レベルの話題は一切登場しません. 以前作った型レベル Brainfuck インタプリタはこのスタイルに則っているので参考にどうぞ. いつまでこのネタを引きずるんですか? パラメータに対して制約を付与しない 型定義のパラメータに対して extends を使って制約を付与すると, そのパラメータに与えられる引数を制約を満たすもののみに限定することができます. 例として, 以下の Append には string の部分型のみ

    TypeScript 型レベルプログラミング フリースタイルガイド - Object.create(null)
  • TypeScript をより安全に使うために その 1: オブジェクトの mutable な操作を避ける - Object.create(null)

    ふだん TypeScriptコードレビュー時に参考に貼ったりしている内部ドキュメントがあるのですが, 内部では何かと人目につきにくいので, 内容を整えて公開していきます. TypeScript の型システムは安全ではありません. つまり型検査を通過したコードであっても, 実行時にエラーが発生する可能性があります. TypeScript の設計についてのドキュメントにおいても, non-goals の一つとして Apply a sound or "provably correct" type system. Instead, strike a balance between correctness and productivity. が挙げられており, 完全に安全なものを目指すのではなく, 安全性と利便性とのバランスをとるものとされています. かといって TypeScript を使うなら

    TypeScript をより安全に使うために その 1: オブジェクトの mutable な操作を避ける - Object.create(null)
  • GitHub Actions で mkr を使う - Object.create(null)

    mkr とは何ですか? Mackerel の CLI です. GitHub Actions 上で mkr をセットアップする setup-mkr アクションを作りました. github.com こういう感じで uses: susisu/setup-mkr@v1 と一行書くだけで mkr コマンドが使えるようになります. steps: - uses: susisu/setup-mkr@v1 - run: mkr org env: MACKEREL_APIKEY: ${{ secrets.MACKEREL_APIKEY }} mkr の詳しい使い方はここでは紹介しませんが, mkr throw で何らかのメトリックを投稿したり, mkr wrap でジョブの成否を監視したり, mkr annotations create でイベントを記録したりといったことに利用できるかなと思います. さてここ

    GitHub Actions で mkr を使う - Object.create(null)
  • npm script の実行順のメモ - Object.create(null)

    2019-02-12 追記 この情報は古くなっている / 間違っている可能性があるので参照しないでください. 最新の情報は https://docs.npmjs.com/misc/scripts とかからどうぞ. npm@4.5 時点. 適当に書いていると (主に prepublish/prepare/prepublishOnly あたりで) 落とし穴に嵌ることがありそうなので. npm install (引数なし) preinstall install postinstall prepublish prepare prepublish は npm@5 以降では prepublishOnly と同じ動作になり, publish の前にのみ実行されるようになるので注意. npm install <pkg> (引数あり) インストール先ではなく, インストールされるパッケージのスクリプトについ

    npm script の実行順のメモ - Object.create(null)
    l08084
    l08084 2021/06/17
  • アプリケーションのコード規模に対する雑感 - Object.create(null)

    主観です 規模はコード行数 (LOC) で考えています 体感的にわかりやすいため 言語・フレームワーク・対象とするドメインなどによって何倍もずれるはず あくまでアプリケーションについての話です ライブラリについてはまた事情が変わってくる コードについての話しかしません LOC 〜 102 アプリケーションというより, ちょっとしたスクリプト程度 すぐに全貌を把握できる 困ったことがあったら作り直せば良いので, 正直何でも良いと思う LOC 〜 103 おそらく単機能のアプリケーション 全貌を完全に把握していられる 一人で開発しているなら何でも良いと思う 規模が小さいので, 型検査や lint のような静的解析は目視でもなんとかなる 機能が少ないので, テストは手動でもなんとかなる もちろん便利だと思うならコスト次第で使えば良い 複数人 (あるいは一人でも時間が離れている) で開発するのであ

    アプリケーションのコード規模に対する雑感 - Object.create(null)
    l08084
    l08084 2021/03/07
  • Template String Types でパス文字列を解析してクエリする - Object.create(null)

    ※この記事に含まれる内容は TypeScript 4.1 のプレビュー版のものです. 今後仕様が変わり動かなくなる可能性もありますのでご注意ください. 話題の template string types で早速遊んでみます. ゴール .foo[1].bar といった形のパス文字列を型レベルで解析してクエリしちゃいます. こういう感じ: type R1 = Query<{ foo: number }, "">; // R1 = { foo: number } type R2 = Query<{ foo: number }, ".foo">; // R2 = number type R3 = Query<[number, string, boolean], "[1]">; // R3 = string type R4 = Query<{ foo: { bar: string } }, ".fo

    Template String Types でパス文字列を解析してクエリする - Object.create(null)
    l08084
    l08084 2020/09/02
  • テストの説明に安易に「正しく」とか書かない - Object.create(null)

    みなさんテストは書いていますよね. 書いていなければふりだしに戻る. 例えば関数 add に対して, 以下のようなテストコードがあるとします. describe("add", () => { it("正しく計算できる", () => { expect(add(1, 2)).toBe(3); }); }); よさそうですね? もしよくないと思うのであればここから下は読まなくても大丈夫なくらい理解している方だと思います. 続いて関数名を変えただけのこちらをどうぞ. describe("sub", () => { it("正しく計算できる", () => { expect(sub(1, 2)).toBe(3); }); }); なんだか明らかに間違っている気がします. もしこのテストが通過してしまったとき我々はどうすればよいのでしょうか. 考えられるパターンは 2 つあります. 実装もテストも正

    テストの説明に安易に「正しく」とか書かない - Object.create(null)
    l08084
    l08084 2020/07/23
  • TypeScript で型レベル Brainfuck - Object.create(null)

    2024-04-15 追記: 内容をアップデートした記事を書きました. susisu.hatenablog.com TypeScript の型システムはチューリング完全ということが知られていますが, 同じくチューリング完全な言語である Brainfuck のインタプリタを実装することで, その計算能力を確認することができます. この記事のコードは TypeScript 3.8.3 で動作確認しています. ゴール 型レベルで Brainfuck のインタプリタを実装します. type Program = [ ",", ">", ",", "<", "[", ">", "[", ">", "+", ">", "+", "<", "<", "-", "]", ">", "[", "<", "+", ">", "-", "]", "<", "<", "-", "]", ">", ">", ">",

    TypeScript で型レベル Brainfuck - Object.create(null)
  • コールバック地獄から async/await に至るまでと, 非同期処理以外への応用 - Object.create(null)

    継続渡しスタイル (CPS: Continuation-assing style) 例えば以下は引数として与えられた数に 1 を加えるだけの関数と, それを呼び出すプログラム. function succ(x) { return x + 1; } console.log(succ(2)); // -> 3 CPS では関数がその継続 (callback) を受け取り, 内部でその継続を呼び出す. 上の例と同じものを CPS で書くと次のようになる. function succCPS(x, callback) { callback(x + 1); } succCPS(2, x => console.log(x)); // -> 3 この例だとほぼ何の得もないが, JavaScript において CPS は, ファイルの読み込みやサーバーへのリクエストの送信, ユーザーの入力待ちなど, 非同期

    コールバック地獄から async/await に至るまでと, 非同期処理以外への応用 - Object.create(null)
    l08084
    l08084 2019/06/24
  • 近況 2018年春 - Object.create(null)

    株式会社はてなに入社しました この文章の信憑性は著しく低いことが知られていますが, 信用していただけますか? というわけで京都に引越したので報告です. Adobe CC を購入した 学割が3月まで使えて1年分までなら購入できるっぽかったので購入しました. 1年分とはいえ, 全部入りで昔の Flash Professional 単体よりも安かったので, 初期投資の面では良い時代. ちなみに一番右の Animate ってのが名前が変わっただけの Flash Professional です. 購入した理由は主に以下の2つ. コード以外の生産的活動を増やしたい 同じ理由で GitHub の連続コミットも2月の頭で止めている 技術に傾倒した結果, 技術者以外が見てもよくわからないものを生産しつづけていることは実感していて, そこを変えていきたい気持ちがある とはいえ技術を捨てるというわけではなく,

    近況 2018年春 - Object.create(null)
    l08084
    l08084 2018/04/08
  • Wonderfl の思い出 - Object.create(null)

    Wonderfl のサービスが 3 月末で終了してしまうらしい. 知らない人のために説明すると Wonderfl は Flash のコードをその場で編集・コンパイルしてコードと一緒に公開できる Web サービス*1で, 私は Wonderfl にあるコードを見てプログラミングを学んだと言っても過言ではないので少し悲しい. wonderfl.net お気に入りに入っているのを眺めていたらいくつか印象に残っているものがあったので貼り付けておきます (私が作ったものではないです). とは言っても 3 月末ですべて消えてしまうので見たい方はお早めに*2. パーティクル崩し wonderfl.net パーティクルの応用で弾幕 wonderfl.net 高速化合戦その 1. copyPixelsを使用(追記あり) - forked from: 弾幕 - パーティクルの応用で弾幕 - wonderfl

    Wonderfl の思い出 - Object.create(null)
    l08084
    l08084 2017/03/03
  • 1