タグ

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

  • テストの説明に安易に「正しく」とか書かない - 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)
  • TypeScript で GADT っぽいの - Object.create(null)

    TypeScript で Haskell にあるような GADT (Generalized Algebraic Data Type) っぽいものをどう表現できるかという話. GADT を使いたくなる例 式をデータとして表現したいことありますよね. あると言ってくれ. 例えば数値と数値上の関数, そして関数適用がある式を考えます. 素朴に表現すると以下のようになるでしょう. type Expr = | { type: "num", val: number } | { type: "fun", val: Fun } | { type: "app", fun: Expr, arg: Expr }; type Fun = (x: number) => number; いちいちオブジェクトリテラルを書くのは面倒なのでコンストラクタを作っておきます. const num = (val: number)

    TypeScript で GADT っぽいの - Object.create(null)
  • 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)
    amagitakayosi
    amagitakayosi 2020/03/10
    面白い
  • コマンドの出力を HTML に変換して貼り付ける - Object.create(null)

    みなさんも生きていればコマンドの出力をブログに貼り付けたいということがあるでしょう. というわけでコマンド出力をなんとか HTML にして貼り付ける方法のご紹介です. TL; DR: script -q /dev/null <command> | ansi2html -i | pbcopy まず HTML は基的には以下のような形で良いはずです. 色とかフォントとかは適当に変えたければ変える. <pre style="color:#CCC;background-color:#000"> <!-- ここにコマンドの出力を貼り付ける --> </pre> 例えば ls の結果を貼り付けたいとすると, 適当に pbcopy に pipe で流し込んでコピーすれば良さそうに思われます. この pbcopy は macOS に標準で存在するコマンドで, 標準入力から受け取った内容をクリップボードに

    コマンドの出力を HTML に変換して貼り付ける - Object.create(null)
  • 「分割」できる疑似乱数生成器 - Object.create(null)

    この記事ははてなエンジニア Advent Calendar 2018 の 6 日目の記事です. こんにちは, id:susisu です. Mackerel のアプリケーションエンジニアをしています. 最近は新しいカスタムダッシュボード機能を開発したりしていました. mackerel.io この記事ではタイトルにある通り, ある種の疑似乱数生成器について紹介します. 内容は社内の技術勉強会 (兼 ???) にて LT として話したものの増補改訂版となっています. 乱数の話をしようと思ったのにはきちんと背景がありますが, これは長い上に直接関係のない話が多くなってしまったので, 一番最後に書きました. お時間のある方は最後までどうぞ. Splittable PRNG 通常の疑似乱数生成器 (pseudorandom number generator, 以下 PRNG) については, きっとこの

    「分割」できる疑似乱数生成器 - Object.create(null)
  • ISUCON7 予選通過反省会 - Object.create(null)

    ISUCON7 の予選に @amaya382, @spring_raining とチーム名「チーム名を考えるのが苦手すぎる」で参加しました. 私自身は初参加です. 最終スコア 89,047 で学生枠 2 (3) 位通過でした. 私がやったこと ほぼ完全にアプリケーション (Node.js) だけを担当しました. ESLint 導入 治安維持のためと思ってとりあえず導入したけど潜在バグ見つけられたりしてよかった ICONS_FOLDER という未使用の定数が見つかって, アイコンをファイルに書き出してほしそうな顔をしていたのでそのようにした (実際速い) JS のパフォーマンス改善 CPU プロファイル見て遅そうなところに小細工を加えた といってもアプリケーション側で改善できるところはほとんど見つけられず, ほぼ誤差の範囲だと思われる ごめんなさい, それ Node v8 からなんですよ で

    ISUCON7 予選通過反省会 - Object.create(null)
  • 差分検出アルゴリズム三種盛り - Object.create(null)

    こんばんは. 気がつけばもうずいぶんと涼しくなってきました. 勢い余って凍ってしまったりせぬよう, くれぐれも普段の言動にはお気をつけください. はじめに さて, 我々人類にはどうしても二つの文字列 (あるいは行ごとに区切られたテキスト) 間の差分を求めなければいけない瞬間が発生します. 先人たちはそういった時のために diff のようなツールを開発し, それを利用することで文明はめざましい発展を遂げてきました. しかしながら, 使用するアルゴリズムを比較検討したい場合, 「差分」の定義を変えるなどして既存のアルゴリズムに変更を加えたい場合, diff のない異世界に飛ばされて自分で実装しなければいけない時などにおいては, 差分検出アルゴリズムについての理解が必要不可欠です. というわけで, この記事では文字列間の差分検出とは何かということと, 差分を求める三種類のアルゴリズムの紹介・解説

    差分検出アルゴリズム三種盛り - Object.create(null)
  • Atom のカーソル上下移動を改良するパッケージを作った - Object.create(null)

    相変わらず Atom の環境を整備し続けています. というわけでまたパッケージを作りました. atom.io カーソルを上下に動かしたとき, デフォルトではこんな感じに全角文字などが間に入るとカーソルの水平位置がぐちゃぐちゃと動いてしまいます (水平位置を文字数 (正確には code unit 数) で見ているため). この動作を修正して見た目通りの位置に移動させるというものです. ちなみにこれは Atom がエディタを自前で描画しているためで, Sublime Text をはじめ大体のテキストエディタはデフォルトで修正後のような動作のはずです.

    Atom のカーソル上下移動を改良するパッケージを作った - Object.create(null)
  • パーサコンビネータを高速化した - Object.create(null)

    例のアレです. 式年遷宮したときの話はこちら. github.com 最初は軽い気持ちで細々とした最適化をしていたんです. switch を if に変えるとかいう小手先のアレで 10 % も高速化してウケてる— ボノボ (@susisu2413) 2017年3月13日 インライン化も同時にしてたから 10 % は言い過ぎか、でも高速化はしてる— ボノボ (@susisu2413) 2017年3月13日 ちなみにどう最適化するかというと V8 のプロファイラを使って適当に遅そうなところに目星をつけて色々試します. そんなこんなで Parsimmon*1 より妙に遅い原因を探していたら, ap, left, right (Parsec*2 でいうところの <*>, <*, *>) の実装の効率が悪く, これが主な原因であることがわかりました. アッアッ 30 % 高速化しました— ボノボ (

    パーサコンビネータを高速化した - Object.create(null)
    amagitakayosi
    amagitakayosi 2017/03/14
    JS製パーサコンビネータ
  • Markdown のテーブルをいい感じに編集する Atom パッケージを作った - Object.create(null)

    相変わらず既存のものが……だったので作りました. 以前 SyaroNote で Ace 向けに作ったものをベースに色々改良しています. atom.io 動作はこんな感じです. 他にも行の挿入や, 左・右・中央揃えの切り替えなどが簡単にできます. Markdown のテーブルの編集にお困りの方はお試しください. あと, WindowsLinux でのキーバインドなどがまだ適当だったりするので, 何か機能についてのご意見などあればお気軽に @susisu2413 までどうぞ. Markdown に関する愚痴 Markdown は簡単に使えますが, 一方で仕様がはっきりしていないので, 実装によってかなり解釈が違って, 色々試しているときにかなり疲弊しました. 例えばこれは Atom 標準の Markdown のプレビュー markdown-preview-plus のデフォルト (mar

    Markdown のテーブルをいい感じに編集する Atom パッケージを作った - Object.create(null)
  • 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)
    amagitakayosi
    amagitakayosi 2017/03/03
    沢山つくっててすごい
  • Sublime Text から Atom へ乗り換えチャレンジ - Object.create(null)

    なぜ JavaScript を書いているときにやたらと React のスニペットが表示されるようになって*1, これが大変迷惑だったためです. destroy を補完するために destroy と入力する必要があるのクソでしょ— susisu (@susisu2413) 2017年2月16日 💢 pic.twitter.com/8bu5h7Lb5W— susisu (@susisu2413) 2017年2月17日 来は同ファイル内に存在する識別子名を補完してくれるのですが, 謎のスニペットが出るものの欲しいものが出てくれません. 他にも constructor が補完されたと思って適当に確定すると constructor(props){ super(props); } みたいになるなどもあります. あと, こちらは割とどうでも良い理由として Haskell のシンタックスハイライトが

    Sublime Text から Atom へ乗り換えチャレンジ - Object.create(null)
  • npm view をいい感じに整形してくれるやつを作った - Object.create(null)

    ググってもいい感じのが無さそうだったので作りました (既にあったら教えてください). npm i -g npm-sum github.com なにこれ npm にはパッケージの情報を取得する npm view (あるいは show, info, v) というコマンドがありますが, これは全ての情報を含む巨大な JSON を返してくるので, 欲しい情報を探すにも時間がかかります. (そもそも人間が読むものではない気がする. ご丁寧にハイライトまでしてくれるけれど.) もちろん, 欲しい情報だけを取り出すこともできて, 例えば npm の最新バージョンを知りたいとかなら npm view npm version などとすれば良いのですが, なんかそれも面倒なので必要そうな情報をまとめて表示してくれるのを作りました. 要するに brew info みたいなのが欲しかったのです. 例えば npm

    npm view をいい感じに整形してくれるやつを作った - Object.create(null)
    amagitakayosi
    amagitakayosi 2016/12/02
    便利
  • GitHub の緑化を二年続けて思ったこと - Object.create(null)

    一年継続したといった記事を見て, そういえば二年継続していたら何か書こうかなと思っていたのを思い出したので, 書きます. github.com 2014年の10月2日からなので二年とちょっとですね. 良かったこと 当然ですがアウトプットの量が増えているはずです. 面倒くさい作業も, 継続するという謎の義務感が生まれているので, 少しずつであっても確実に進みます. カレンダーが緑になっていくのもモチベーション維持に大変有効です. あとドヤ顔できます. 良くなかったこと 相対的にインプットの量が減っていると思います. すぐにアウトプットにならないような作業を避けがちになったり, 次に何をするかを考えるだけで精一杯になったり, アウトプットした時点で満足してしまったりするためです. これを避けるために学習記録みたいなリポジトリを作ってやればいいのかもしれませんが, わざわざ GitHub に記録

    GitHub の緑化を二年続けて思ったこと - Object.create(null)
    amagitakayosi
    amagitakayosi 2016/10/07
    “面倒くさい作業も, 継続するという謎の義務感が生まれているので, 少しずつであっても確実に進みます.”
  • はてなインターンに参加したのでアレをアレします - Object.create(null)

    題のとおり, 参加していました. hatenacorp.jp この記事はアレなので, 是非アレしてください. 自己紹介 参加までの流れ インターン中の生活 前半 後半 その他雑多なこと 通勤 事 水分 Perl 語彙 おわりに インターン参加者の記事が集まるコーナー 自己紹介 ひょっとすると初めて見に来てくださる方もいると思うので. id:susisu (@susisu2413) 大学院生です (M1) 普段は JavaScript を書いていて, Perl, Web アプリケーション開発ほぼ未経験でした 詳しくはこちらをご覧ください. このブログについて - Object.create(null) 参加までの流れ はてなインターンは以前に友人の id:spring_raining が参加していたり, Twitter で頻繁に情報が流れてくることで存在を知っていました. 今年になって,

    はてなインターンに参加したのでアレをアレします - Object.create(null)
    amagitakayosi
    amagitakayosi 2016/09/12
    お疲れ様でした!!!良い機能を開発できて楽しかったです。是非また遊びに来てくださいな!!!!
  • 1