お知らせ

現在サイトのリニューアル作業中のため、全体的にページの表示が乱れています。

親クラスをモックして子クラスの単体テストをしたいときに

確認環境

Env Ver
@swc/cli 0.1.65
@swc/core 1.3.105
@swc/jest 0.2.31
@types/jest 29.5.11
jest 29.7.0
typescript 5.3.3

サンプルコード

コードのフルセットは以下
https://github.com/Lycolia/typescript-code-examples/tree/main/mocking-base-class-with-extension-class-swc-ts

ディレクトリ構成

src
 ├─BaseClass
 │  └─index.ts
 └─ChildrenClass
    ├─index.ts
    └─index.spec.ts

src/BaseClass/index.ts

親クラス。この例は抽象クラスだが別に具象クラスでも何でもいいと思う

export abstract class BaseClass {
  constructor(
    private baseValue: string,
    private ctx: { [key: string]: unknown }
  ) {}

  public hoge<ResultT>(payload: { [key: string]: unknown }) {
    // テスト走行時には全て無効な値を流し込むため
    // それらの影響で落ちないことの確認のために、オブジェクトの子を意図的に書いている
    console.log(this.baseValue, this.ctx.hoge, payload.piyo);
    // サンプルコードなので戻り値はスタブ
    return {} as ResultT;
  }
}

src/ChildrenClass/index.ts

子クラス

import { BaseClass } from '../BaseClass';

export class ChildrenClass extends BaseClass {
  constructor(baseValue: string, ctx: { [key: string]: unknown }) {
    super(baseValue, ctx);
  }

  public piyo<ResultT>(payload: { [key: string]: unknown }) {
    try {
      // このsuper.hoge()をモックして、
      // catchの中に流れるかどうかを確認するのが目的
      return super.hoge<ResultT>(payload);
    } catch (err) {
      // 実際はロガーが動くような部分だが、サンプルコードのためconsole.logで代用する
      console.log(err);

      throw err;
    }
  }
}

src/ChildrenClass/index.spec.ts

子クラスのテスト

import { ChildrenClass } from '.';
import { BaseClass } from '../BaseClass';

describe('fetch', () => {
  it('親のfetchが呼ばれ、親の戻り値が返ってくること', () => {
    // 子が正しくreturnしてくるかどうかを確認するための値
    const expected = { code: 200 };

    // Class.prototypeとやるとモック出来る
    const spiedSuperFetch = jest
      .spyOn(BaseClass.prototype, 'hoge')
      .mockReturnValue(expected);

    // 親クラスの処理はモックするので適当な値を入れておく
    // この内容が実行されていればテストが落ちるのでテストコードが間違っていることの検証に使える
    const inst = new ChildrenClass('aaaa', {} as { [key: string]: unknown });
    const actual = inst.piyo({ foo: 123 });

    // 親クラスのメソッドが正しい引数で呼ばれたことの確認
    expect(spiedSuperFetch).toHaveBeenCalledWith({ foo: 123 });
    // 子クラスのメソッドの戻り値が正しいことの確認
    expect(actual).toStrictEqual(expected);
  });

  it('親のfetchで例外が出たときに、ログ出力とリスローがされること', () => {
    const expected = Error('ERR');
    // 親クラスのメソッドが例外をスローするケースを作る
    jest.spyOn(BaseClass.prototype, 'hoge').mockImplementation(() => {
      throw expected;
    });

    // catch句の中でロガーが動いているかどうかの検査用
    const spiedConsoleLog = jest.spyOn(console, 'log');

    const inst = new ChildrenClass('aaaa', {} as { [key: string]: unknown });

    // 例外がリスローされていることを確認
    expect(() => {
      inst.piyo({ foo: 123 });
    }).toThrow(expected);
    // ロガーが動いていることを確認
    expect(spiedConsoleLog).toHaveBeenCalled();
  });
});

電子辞書 (EX-word)

ここ最近言葉の意味を調べようとするとコタツ記事であふれた検索結果や検索エンジンによる謎の解説ばかり出てきて本来の意味に辿り着けないケースが増えてきたので電子辞書を買った。

スマホアプリとかもあるにはあるのだがサブスク型で日々勝手が勝手に変わりそうでなんか嫌だったので買い切り型の物理デバイスにした。最近の電子辞書は中のコンテンツを充実させることで高価格を維持する路線をとっているらしく、広辞苑や国語辞典、英和辞典辺りがあれば十分だった私は型落ちの安いのを選んだ。

昔と違ってローマ字入力ができるのがありがたい。今でも廉価版だと五十音キーボードになっているらしく結構つらいものがある…。というので、ローマ字入力できるもので一番安いのを買ったが、ぼちぼちした。

箱はシンプルだ
シャンパンゴールドでいい感じの筐体
QWERTYキーボードが嬉しい

Surface Laptop 4

勉強会とかにもっと出たいけどノートPC買いたくないなぁ…という呪縛を破るために買った。Surface Laptop 4 5AI-00039だ。

スペックはCore i5 1135G7 4.20GHz/4C8T、MEM 16GB、ストレージ 512GB、重量 1,265g。因みにもう売った。

売った理由だが、まずキーボードがクソなのである。カーソルキーがノートPCあるあるな形状なのだが、特に↑↓の誤打鍵が酷く、文書作成やコーディング目的に使うにはクソ過ぎた。やってられなかった。

もう一つ理由があり、それはしょっちゅうフリーズすること、動きがもっさりすることだ。店頭で触ったのでこれは知っていたが、ちょっと正気ではなかった。我慢できなかった。私は短気なのだ。

因みにWin+Eを数回連打するだけでありえない遅さだということが如実にわかるので、店頭の動作展示がこれほどよくわかる例もそうないだろう。それでも買ったのは以前Surface Pro 4を使っていたことと、単に見た目である。

スタイリッシュな箱
セットアップでArcマウスが使えないの微妙すぎる
このキー配列が嫌、特にカーソルキー

因みにSurface Laptop 4はイマイチだが、Arcマウスはポータブルマウスとしてよく出来ている。平らにたためるのと、ホイールがなく、カバンの中で嵩張らず壊れづらいのは、とてもいい。

ノートPC (NEC Lavie)

Surfaceがクソ過ぎたので速攻買い替えたPC。Surfaceより遥かに軽いし、日本製だし、カーソルキーがまともだし、最高じゃないか。

マシンはNECのLavieで型式はPC-GN20D72DYEDYH2YAA。スペックはAMD Ryzen 5 7530U 4.5GHz/6C12T、MEM 16GB、ストレージ 256GB、重量 972gだ。

スタイリッシュさ皆無の武骨な箱。SDGsとはこういうことを言うのだと思う。私は好きだ。
恐らく追加パーツを収めるための空洞だろうか?汎用的な作りになっている。
天板とモニタを覆うようにカバーがかかっていて、日本人らしい気配りがとって見れる。素晴らしい

キーボードはカーソルキーがSurfaceと比べ大幅に改善され、極めてまともな形になっている。しかもHome, End, PageUp, PageDownがここにあるので使いやすい。Surfaceの奴は遠すぎる。

カーソルキーが小さくないので使いやすい

放熱にも気配りがされていて通風孔が多く、熱にも強そうだ。

背面には大きめの通風孔がある
側面にも程よい通風孔がある

使ってみての感想だが、まずやはりキーボードがいい。FnLockが凄い都合よく作られていて、Fキーはロックされるが、カーソルキーやDeleteとかの部分はロックされていないように感じた。これは地味に使いやすく、恐らく装飾キーだけロックし、それ以外はロックしない設計なのだろう。他はロックされても困るので非常に良い(いや別にChgKeyで配置換えすればいいだけなのでどうでもいいが

そしてパフォーマンスもいい。エクスプローラーの起動がもっさりすることもないし、今のところフリーズもしていない。欠点はNECの初期アプリを消すのに手間がかかったがそのくらいだ。

この端末は勉強会などでの開発に使う予定だが、最低限まともにGUIが動けば後はどうでもいいのでスペックを抑えている。何故なら実際の開発に関係する処理はUbuntuサーバーを利用するため、このマシン自体はシンクライアント機として機能すればいいからである。メモリ16GBは一般的には多くも見えるが、私は普通に作業してるだけで10GB程度はメモリを使うので、8GBでは足りないのである。

ヤマハルーター

いわゆる高いルータ。RTX830。

買った理由としてはVPNを引こうと思い、VPNルーターを買おうとして目についたので買った。要件を考えた結果、色々あり、結局のところVPNは使っていない。VPNは一度侵入を許すとやりたい放題されてしまうリスクがあるのと、セキュリティを考えたときにセットアップや維持がクソめんどくさそうだったのがある(端的に言うとルートCA証明書が必要で、これは作るのも面倒だし、これで署名した証明書を維持管理するのもしんどい)

結局VPNを使おうとしていた用途には公開鍵暗号方式のSSH接続で繋ぐことで事なきを得たが、この用途だけに限れば特にルーターを買い替える必要はなかった。

今のところの大きな利点としてはルーター再起動時にOCNバーチャルコネクトに安定接続できるのと、DNSサーバーが入っていることくらいだ。前使っていたルーターはOCNバーチャルコネクトの初回接続が極めて不安定で、メンテや停電などで一度でも再起動がかかると再接続に5~120分ほどかかるという地獄があり、これが嫌すぎて再起動のストレスがやばかったが、このルーターにしてこれは解消した。またDNSサーバーも思いのほか便利で、example.comを外出先ではグローバルIP、自宅ではローカルIPに自然とマップできるので、これは重宝している。

細かいことはコマンドで設定できるのでGUIを触らなくていいことくらいで、今のところそんなにすごい恩恵はないが、きっといつの日か何か恩恵が来ることもあるだろうというので、あまり後悔はしていない。出来ることは多いはずなので一種の投資だ。

ひとまず業務用ルーターということで見た目が強固だし、電源ケーブルが抜けないようにするアタッチメントもイケていい感じだ。

箱は普通の段ボール。NECと同じスタイルだ。まぁ普通はこうだよね
いわゆる逸般人の部屋によくある見た目
清掃の人が足を引っかけても電源が抜けない仕様

これまでに使っていたルーターはRTX830にぶら下げてWiFiのAPにするためのブリッジルーターとして使っている。因みにルーター交換に伴い通信環境が改善したとかはなかった。以前はBuffaloのWSR-1166DHP4を使っていたが、ここは非常にコストパフォーマンスのいいルーターを出しているので、安く早くある程度設定ができるルーターを求めている場合には重宝すると思う。夏場落ちたりすることもないし、5年単位で壊れないので作りもいい。低価格製品だと設定画面がお世辞にも使いやすいとは言えないが、用はこなせるので問題になることは一般用途では少ないだろう。

ブルーレイドライブ

今時光学ドライブ買う?と思われるだろうが、買ったのだ。しかもでかいやつ。CDドライブのころからそうなのだが、光学ドライブはデカいほうが性能がいい法則がある。コンパクトドライブと比較したときR/W速度が倍くらい違う。コンパクトドライブだとCDのReadはx24が上限だが、デカいやつはx48が一般的だ。異次元だ。その代わり値段は高い。需要が減ってきていると思われるので買うなら今だろうというので大型機を買うことにした。(こういう一般人に理解されがたいものは需要が薄そうなので追々消える懸念がある

バッファローのドライブを買うのは初めてな気がする。ドライブ系はIODATAが多かった

デカい

デカいが置く場所はあるので困らなかった。上にはRubix22と生田宮の仕事守が乗っている

これは以前まで使っていたコンパクトDVDドライブだ。この期に売却となった。

コンパクトDVDドライブ

自作デスクトップPCを持っているのに外付けドライブを買うのは何とも奇妙な話だが、最近のケースには5インチベイが付いてないのである。勿論付いているのもあるのだが、見栄えがいいケースには大抵付いていない。というわけで外付けになっている。

しかし何故DVDドライブではなくBDドライブを買ったかだが、実は前回もBDドライブを検討したのだが高かったし、インターネット全盛のこの時代にBDを使う機会はないと思っていたのだ。実際ディスクレスは増えている。しかし、実際は違った。レンタルではなく永続的に自分の手元に映像データを置いておくにはBDが必要だったのだ。dアニメやAmazon Prime Videoは一生見れる保証がない。ある日突然消える。それは困るというのでBDを買うことにしたわけだ。

と言う訳でDVDも買っている。ひとまず印象深い映画ということで、SAOP二作、夏トン、ジョゼ虎、あしせかのBDを買った。映画館で見た作品を好きなタイミングで、また見れるというのはいいものだ。

SAOP二作、夏トン、ジョゼ虎、あしせかのBD

また丁度いいので久々にCDも買った。これまでもAmazonにMP3がないのはCDを買っていたのだが、ここ数年Amazon Digital Musicの改悪が酷く、まともにMP3を買えない問題があった。探すのも大変だし、買うのも大変だし、ダウンロードするのも大変だ。時期によっては酷いバグがあって力技を使わないとダウンロードできないことさえあった。最早Amazonは特定の曲を買わせる気など毛頭なく、Unlimitedに加入させてランダムな曲を再生させて集金することしか頭にないと思う。彼らにアーティストは理解できないのだ。どうせ禄でもない輩が開発しているに違いない。古きオタクには辛い時代になったが、そんならCDを買えばいい。幸いアニメイトが近所にあるので買いに行くのに困ることはない。ゲーマーズも虎の穴もつぶれたがアニメイトとメロンブックスはある。今こそ地の利を生かす時だ。通販で買うより行って買ったほうが運動になるしゴミも出ない!

久々にCDも買った

x24がx48になっただけあり、CDは爆速でリッピングできたし、読み取り時の爆音もなくなって非常に快適だった。よい買い物をしたと思う。

投稿日:
開発::設計ジャンル::名前サービス::AWS

ここ数年見かける有効期限付きのURLの名前をPrivate Cache Distributionパターンというらしい。

これはFantiaみたいな課金サービスを利用している人にはもはや当たり前だと思うが、ページを表示してから一定時間たつと画像が表示できなくなるが、一定時間内であればそのURLは誰でも見れるみたいなやつだ。要するにURLに短めの有効期限を付けて認証されたユーザーにしか見えなくする仕組みのことだ。

参考

投稿日:
OS::Linux::Ubuntu

確認環境

Ubuntu 22.04.3 LTS

設定ファイルのありか

/etc/ssh/sshd_config

公開鍵認証にする

SSHD側に公開鍵を置き、クライアント側からは秘密鍵でアクセスする

  1. sudo nano /etc/ssh/sshd_configで以下の設定に変更

    PubkeyAuthentication yes
    AuthorizedKeysFile      .ssh/authorized_keys
    PasswordAuthentication no
    PermitEmptyPasswords no
    
  2. 鍵置き場を作る

    mkdir ~/.ssh/
    
  3. 公開鍵を書き込む

    echo "公開鍵" > ~/.ssh/authorized_keys
    
投稿日:
OS::Windowsその他::SSH

古のSFTPマウントツールが軒並み死んでいるためRcloneを使う。WindowsからLinux上に構築したストレージに繋ぐときに便利

前提条件

  • 接続先のSSH環境がある
  • 接続先のSSH環境の公開鍵認証に利用する秘密鍵にパスフレーズが付いている

確認環境

Env Ver
OS Windows 11 Pro (22621.3155)
Rclone 1.65.2

手順

  1. Rcloneをインストールする
    choco install rclone
    
  2. WinFspもインストールする。これがないとマウントできない
  3. Rcloneの接続設定を作成する。設定ウィザードは少々複雑なのでよく読むこと
    rclone config
    
  4. 設定が完了したら、以下のコマンドでマウントできる
    # 例:rclone mount hoge:/home/hoge Z: --network-mode
    rclone mount <user name>:<mount path> <drive letter>: --network-mode
    

トラブルシューティング

マウント時のターミナルウィンドウが邪魔

公式の解説によると、Windowsではバックグラウンドで動かすことができない

Use the --daemon flag to force background mode. On Windows you can run mount in foreground only, the flag is ignored.

どうしてもバックグラウンドで動かしたい場合はVDeskを使って適当な仮想デスクトップで起動するか、タスクトレイ系のユーティリティを使ってタスクトレイに突っ込んだりするといいだろう

参考