Programming Self-Study Notebook

勉強したことを忘れないように! 思い出せるように!!

マウスを変えたら肩こりがラクになった!

f:id:overworker:20210424164647p:plain:h250


私は39歳のサラリーマン(プログラマー)です。 朝から晩までPCに向かって仕事を行っています。プログラミンングだけでなくプレゼン資料作成、報告資料作成やWeb会議等も行っています。 そのせいか、慢性的な肩こりに悩まされていました。(今も肩こりはありますが、以前よりかなり楽になった気がします。)

f:id:overworker:20210424164834p:plain:h100f:id:overworker:20210424174158p:plain:h250


昨年まで慢性的な肩こりに悩まされていましたが、その肩こりの症状が最近和らいでいることに気が付きました。 自分でも肩こりが和らいでいることに気が付いていなかったのですが
「マウスをトラックボールタイプにすると肩こりがなくなるよ!」と聞いたときに、
「半年前にトラックボールに変えたけど、確かに肩こりが楽になってる!と変化に初めて気が付きました。

f:id:overworker:20210424164647p:plain:h100f:id:overworker:20210424170336p:plain:h250


多分、通常マウスは、肩関節から手首までの関節を動かすのに対し、トラックボールマウス親指の関節しか動かしていないからだと思います。
なので、本日はデスクワーク等で肩こりに悩んでいる方にトラックボールマウスをお勧めしたいと思います。

私が使用しているマウス:自宅用

使い始めたきっかけは、「右手のケガ」です。ケガの影響でマウスでポインタを動かすのが辛くなったので、指先(親指)だけで操作可能なトラックボールマウスに変更しました。ケガのせいで業務効率がかなり落ちていたので「少しでも操作が楽になればうれしいな~!」程度の期待しかしていなかったのですが、期待以上に操作がしやすかったことを覚えています。


Amazonへのリンクはこちら

(※ 少し型が古いため、値上がりしているようです。)

ケガが治ったら通常マウスに戻るつもりでしたが、トラックボールマウスの使い心地が余りにも良かったので、トラックボールマウスを使い続けるようになりました。

自宅用のマウスを会社に持っていくようになりました

会社ではリースPCに付属している通常マウスを使用していたのですが、「トラックボールマウスの方がはるかに楽だ~」と思うようになり、 出社時にはトラックボールマウスを持参するするようになりました。このころにはトラックボールマウスにかなり愛着が芽生えてきたので、 持ち運び時には専用ケースを使用するようになりました。

Amazonへのリンクはこちら

私が使用しているマウス:会社用(上記の次の型?)

一時的に出社頻度が上がったタイミングがあったのですが、「マウスを毎日持ち運びするのが面倒だな~」とおもい、会社用のトラックボールマウスを購入することにしました。まったく同じものを購入しようとしたのですが、値上がりしていたので同じメーカーの別の型番のトラックボールマウスを購入しました。(※ M570M575なのでマイナーチェンジだと思います。)使い心地は前のものとほぼ同じですので、買い替えで迷っている人は安心して乗り換えてよいと思います。


Amazonへのリンクはこちら

補足:マウスケースは同じでOK

前出のマウスケースにM575を入れてみました。
M575の方がほんの少しだけ大きいようですが、問題なくケースに収まります。

専用ケースもあったので紹介します。

Amazonへのリンクはこちら

その他のトラックボールマウス

以下、Amazonトラックボールマウスを検索したときの検索結果ページです。
トラックボールマウス

私は親指でボール操作をするタイプを選びましたが、中指で操作するタイプ等もあるようです。ボタン位置が違ったり、ボタンの数が違ったりと様々なタイプがありますので一度検索して、 ご自身の好みに合うものを見つけてみてください。

最後に

私は、家族には絶対にトラックボールマウスを薦めます。

(※ 父の日のプレゼントにトラックボールマウスはいかがでしょうか!!)

JMeterが用意しているFunctionについて調べてみた

f:id:overworker:20200422002101p:plain

久しぶりにJMeterのノートを書きたくなりましたので、前々からまとめておきたいと思っていたFunctionについてまとめてみました。

  • オフィシャルリファレンスはこちら

基本構文

${__functionName(var1、var2、var3)}

// パラメータが必要な場合
${__time(YMD)} 

// パラメータが不要な場合
${__threadNum}

代表的な関数

テスト計画の影響を受ける情報

名前 説明
${__threadNum} スレッド番号を取得する
${__threadGroupName} スレッドグループ名を取得する
${__samplerName} サンプラー名(ラベル)を取得する

テスト実行時の環境に影響を受ける情報

使用例 説明
${__time(YMD,)} さまざまな形式で現在の時刻を返す
${__timeShift(dd/MM/yyyy,21/01/2018,P2D,,)} 指定された秒/分/時間/日数が追加されたさまざまな形式で日付を返します

処理内容の影響を受ける情報

使用例 説明
${__counter} 増分数を生成する

計算・変換を実施する関数

使用例 説明
${__dateTimeConvert(01212018,MMddyyyy,dd/MM/yyyy,)} 日付または時刻をソース形式からターゲット形式に変換します
${__intSum(2,5,MYVAR)} int番号を追加します
${__longSum(2,5(MYVAR)} 長い数字を追加する

その他

使用例 説明
${__Random(0,10)} 乱数を生成する
${__RandomDate(,,2050-07-08,,)} 特定の日付範囲内でランダムな日付を生成する
${__RandomString(5)} ランダムな文字列を生成します

プライバシーポリシー

はじめに

こんにちは管理人のoverworkerです。(https://overworker.hatenablog.jp/、以下当サイト)は、個人情報に関する法令等を順守し、個人情報を適切に取り扱います。

個人情報の管理

当サイトは、お問い合わせいただいた内容についての確認・相談、情報提供のためのメール送信(返信)の目的以外には使用しません。また知り得た個人情報を第三者に開示することは、警察・裁判所など公的機関からの書面をもった請求以外に一切利用いたしません。

当サイトでの広告の配信について

当サイトでは、第三者配信の広告サービス(Googleアドセンス)を利用しています。 このような広告配信事業者は、ユーザーの興味に応じた商品やサービスの広告を表示するため、当サイトや他サイトへのアクセスに関する情報 「Cookie」(氏名、住所、メール アドレス、電話番号は含まれません) を使用することがあります。 またGoogleアドセンスに関して、このプロセスの詳細やこのような情報が広告配信事業者に使用されないようにする方法については、こちらをご覧ください。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。 このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。 このトラフィックデータは匿名で収集されており、個人を特定するものではありません。 この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。 この規約に関して、詳しくはこちらをクリックしてください。

免責事項

当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。 当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。 当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。 当サイトで掲載している画像や動画の著作権・肖像権等は各権利所有者に帰属致します。

運営者

overworker

はてなブログのサイドバーにカテゴリーを追加する

f:id:overworker:20210417125415p:plain:h300

自分のブログ(無料版)にサイドバーを追加したときのメモです。
あらかじめサイドバーの調整機能が用意されているので、簡単に変更できました。

ブログの管理画面からデザインを選択する

f:id:overworker:20210417130350p:plain:w200

カスタマイズを選択する

f:id:overworker:20210417130643p:plain:w300

サイドバーを選択する

f:id:overworker:20210417130851p:plain:w300

モジュール追加を選択する

f:id:overworker:20210417131049p:plain:w300

カテゴリー適用を選択する

f:id:overworker:20210417131438p:plain:w400

以上です。

Node.js+Jestで単体テスト:Level2(異常系テスト)

f:id:overworker:20200916000438p:plain:h150

レベル2:異常系テストの追加

  • 異常系の判定ができるようになる

レベル2-1:文字種(サポート内)

レベル2-1-1:数字

レベル2-1-1-1:半角

レベル2-1-1-1-1:境界値外
レベル2-1-1-1-1-1:入力パラメータ
// ------
// Number.MIN_SAFE_INTEGER~Number.MAX_SAFE_INTEGER(=~9007199254740991)
//   安全に処理ができる保証がある範囲
// 注意) 上記範囲を超えたとしても、結果が破損することが決まっているわけではない
// ------
describe('Level 2-1-1-1-1-1:入力パラメータ', () => {
  test('adds Number.MAX_SAFE_INTEGER+1 + -1 to equal Number.MAX_SAFE_INTEGER', () => {
    // expect(sum(Number.MAX_SAFE_INTEGER+1, -1)).not.toBe(Number.MAX_SAFE_INTEGER);
    expect(sum(Number.MAX_SAFE_INTEGER+1, -1)).toBe(Number.MAX_SAFE_INTEGER);
  });
});
レベル2-1-1-1-1-2:出力パラメータ
describe('Level 2-1-1-1-1-2:出力パラメータ', () => {
  test('adds Number.MAX_SAFE_INTEGER + 1 to equal', () => {
    // expect(sum(Number.MAX_SAFE_INTEGER, 1)).not.toBe(Number.MAX_SAFE_INTEGER+1);
    expect(sum(Number.MAX_SAFE_INTEGER, 1)).toBe(Number.MAX_SAFE_INTEGER+1);
  });
});
レベル2-1-1-1-1-3:途中結果
describe('Level 2-1-1-1-1-3:途中結果', () => {
  test('スキップ', () => {
  });
});

レベル2-2:文字種(サポート外)

レベル2-2-1:数字全角

describe('Level 2-2-1-1:全角', () => {
  test('スキップ', () => {
  });
});

レベル2-2-2:文字列

レベル2-2-2-1:半角

レベル2-2-2-1-1:半角数字文字
describe('Level 2-2-2-1-1:半角数字文字', () => {
  test('adds "1" + 1 to equal 2', () => {
    expect(sum("1", 1)).toBe(false);
  });
  test('adds 1 + "1" to equal false', () => {
    expect(sum(1, "1")).toBe(false);
  });
  test('adds "1" + "1" to equal false', () => {
    expect(sum("1", "1")).toBe(false);
  });
});
レベル2-2-2-1-2:半角英文字
describe('Level 2-2-2-1-2:半角英字文字', () => {
  test('adds "a" + 1 to equal 2', () => {
    expect(sum("a", 1)).toBe(false);
  });
  test('adds 1 + "b" to equal false', () => {
    expect(sum(1, "b")).toBe(false);
  });
  test('adds "a" + "b" to equal false', () => {
    expect(sum("a", "b")).toBe(false);
  });
});

レベル2-2-2-2:全角

レベル2-2-2-2-1:全角数字文字
describe('Level 2-2-2-2-1:全角数字文字', () => {
  test('adds "1" + 1 to equal 2', () => {
    expect(sum("1", 1)).toBe(false);
  });
  test('adds 1 + "1" to equal false', () => {
    expect(sum(1, "1")).toBe(false);
  });
  test('adds "1" + "1" to equal false', () => {
    expect(sum("1", "1")).toBe(false);
  });
});
レベル2-2-2-2-2:全角英文字
describe('Level 2-2-2-2-2:全角英字文字', () => {
  test('adds "a" + 1 to equal 2', () => {
    expect(sum("a", 1)).toBe(false);
  });
  test('adds 1 + "b" to equal false', () => {
    expect(sum(1, "b")).toBe(false);
  });
  test('adds "a" + "b" to equal false', () => {
    expect(sum("a", "b")).toBe(false);
  });
});

レベル2-2-2-3:絵文字

describe('Level 2-2-2-3:絵文字', () => {
  test('adds 1 + 🐸 to equal false', () => {
    expect(sum(1, '🐸')).toBe(false);
  });
  test('adds 🐸 + 1 to equal false', () => {
    expect(sum('🐸', 1)).toBe(false);
  });
  test('adds 🐸 + 🐸 to equal false', () => {
    expect(sum('🐸', '🐸')).toBe(false);
  });
});

レベル2-2-2-4:スペースのみ

レベル2-2-2-4-1:半角スペース
describe('Level 2-2-2-4-1:半角スペース', () => {
  test('adds 1 + " " to equal false', () => {
    expect(sum(1, ' ')).toBe(false);
  });
  test('adds " " + 1 to equal false', () => {
    expect(sum(' ', 1)).toBe(false);
  });
  test('adds " " + " " to equal false', () => {
    expect(sum(' ', ' ')).toBe(false);
  });
});
レベル2-2-2-4-2:全角スペース
describe('Level 2-2-2-4-2:全角スペース', () => {
  test('adds 1 + " " to equal false', () => {
    expect(sum(1, ' ')).toBe(false);
  });
  test('adds " " + 1 to equal false', () => {
    expect(sum(' ', 1)).toBe(false);
  });
  test('adds " " + " " to equal false', () => {
    expect(sum(' ', ' ')).toBe(false);
  });
});

レベル2-2-2-5:空文字列

describe('Level 2-2-2-5:空文字列', () => {
  test('adds 1 + "" to equal false', () => {
    expect(sum(1, '')).toBe(false);
  });
  test('adds "" + 1 to equal false', () => {
    expect(sum('', 1)).toBe(false);
  });
  test('adds "" + "" to equal false', () => {
    expect(sum('', '')).toBe(false);
  });
});

レベル2-2-3:特殊文字

レベル2-2-3-1:記号

describe('Level 2-2-3-1:記号', () => {
  test('adds "\b" + 1 to equal false', () => {
    expect(sum('\b', 1)).toBe(false);
  });
  test('adds "\t" + 1 to equal false', () => {
    expect(sum('\t', 1)).toBe(false);
  });
  test('adds "\v" + 1 to equal false', () => {
    expect(sum('\v', 1)).toBe(false);
  });
  test('adds "\n" + 1 to equal false', () => {
    expect(sum('\n', 1)).toBe(false);
  });
  test('adds "\r" + 1 to equal false', () => {
    expect(sum('\r', 1)).toBe(false);
  });
  test('adds "\f" + 1 to equal false', () => {
    expect(sum('\f', 1)).toBe(false);
  });
  test('adds "\'" + 1 to equal false', () => {
    expect(sum('\'', 1)).toBe(false);
  });
  test('adds "\"" + 1 to equal false', () => {
    expect(sum('\"', 1)).toBe(false);
  });
  test('adds "\`" + 1 to equal false', () => {
    expect(sum('\`', 1)).toBe(false);
  });
  test('adds "\\" + 1 to equal false', () => {
    expect(sum('\\', 1)).toBe(false);
  });
  test('adds "\0" + 1 to equal false', () => {
    expect(sum('\0', 1)).toBe(false);
  });
});

レベル2-2-3-2:number

describe('Level 2-2-3-2:number', () => {
  test('adds "number" + "number" to equal false', () => {
    expect(sum("number", "number")).toBe(false);
  });
});

レベル2-2-3-3:null

describe('Level 2-2-3-3:null', () => {
  test('adds null + 1 to equal false', () => {
    expect(sum(null, 1)).toBe(false);
  });
  test('adds 1 + null to equal false', () => {
    expect(sum(1, null)).toBe(false);
  });
  test('adds null + null to equal false', () => {
    expect(sum(null, null)).toBe(false);
  });
});

レベル2(ボーナス):
afterAllafterEachbeforeAllbeforeEach

const sum = require('../sum');

let paramArray = [];
let paramAll = [
  ['Level 0        :正の整数',1, 2, 3],
  ['Level 1-1      :負の整数',-1, -2, -3],
  ['Level 1-2      :小数',1.2, 3.4, 4.6],
  ['Level 1-3      :境界値',Number.MAX_SAFE_INTEGER, 0, Number.MAX_SAFE_INTEGER],
  ['Level 1-3      :境界値',Number.MAX_SAFE_INTEGER-1, 1, Number.MAX_SAFE_INTEGER],
  ['Level 1-3      :境界値',Number.MIN_SAFE_INTEGER, 0, Number.MIN_SAFE_INTEGER],
  ['Level 1-3      :境界値',Number.MIN_SAFE_INTEGER+1, -1, Number.MIN_SAFE_INTEGER],
  ['Level 1-4-1    :特異値(0) 入力値が0',1, 0, 1],
  ['Level 1-4-1    :特異値(0) 入力値が0',1, 0.0, 1],
  ['Level 1-4-1    :特異値(0) 入力値が0',0, 1, 1],
  ['Level 1-4-1    :特異値(0) 入力値が0',0.0, 1, 1],
  ['Level 1-4-2    :特異値(0) 結果が0',1, -1, 0],
  ['Level 1-4-2    :特異値(0) 結果が0',1, -1, 0.0],
  ['Level 1-4-2    :特異値(0) 結果が0',-1, 1, 0],
  ['Level 1-4-2    :特異値(0) 結果が0',-1, 1, 0.0],
  ['Level 1-4-3    :特異値(0) 入力値が0,結果が0',0, 0, 0],
  ['Level 1-4-3    :特異値(0) 入力値が0,結果が0',0.0, 0.0, 0.0],
  ['Level 2-1-1-1-1:境界値外(入力)',Number.MAX_SAFE_INTEGER+1, -1, Number.MAX_SAFE_INTEGER],
  ['Level 2-1-1-1-1:境界値外(入力)',Number.MAX_SAFE_INTEGER, 1, Number.MAX_SAFE_INTEGER+1],
  // ['Level 2-1-1-1-2:境界値外(途中経過)',],
  // ['Level 2-2-1-1  :全角文字列',],
  ['Level 2-2-2-1-1:半角数字', "1", 1, false],
  ['Level 2-2-2-1-1:半角数字', 1, "1", false],
  ['Level 2-2-2-1-1:半角数字',"1", "1", false],
  ['Level 2-2-2-1-2:半角文字列',"a", 1, false],
  ['Level 2-2-2-1-2:半角文字列', 1, "b",false],
  ['Level 2-2-2-1-2:半角文字列', "a", "b",false],
  ['Level 2-2-2-2-1:全角数字文字',"1", 1,false],
  ['Level 2-2-2-2-1:全角数字文字', 1,"1", false],
  ['Level 2-2-2-2-1:全角数字文字', "1","1", false],
  ['Level 2-2-2-2-2:全角英字文字', "a", 1,false],
  ['Level 2-2-2-2-2:全角英字文字', 1, "b", false],
  ['Level 2-2-2-2-2:全角英字文字', "a", "b", false],
  ['Level 2-2-2-3  :絵文字', 1, '🐸', false],
  ['Level 2-2-2-3  :絵文字', '🐸', 1, false],
  ['Level 2-2-2-3  :絵文字', '🐸', '🐸', false],
  ['Level 2-2-2-4-1:半角スペース', 1, ' ', false],
  ['Level 2-2-2-4-1:半角スペース', ' ', 1, false],
  ['Level 2-2-2-4-1:半角スペース', ' ', ' ', false],
  ['Level 2-2-2-4-2:全角スペース', 1, ' ', false],
  ['Level 2-2-2-4-2:全角スペース', 1, ' ', false],
  ['Level 2-2-2-4-2:全角スペース', ' ', ' ', false],
  ['Level 2-2-2-5  :空文字列', 1, '', false],
  ['Level 2-2-2-5  :空文字列', '', 1, false],
  ['Level 2-2-2-5  :空文字列', '', '', false],
  ['Level 2-2-3-1  :記号', '\b', '', false],
  ['Level 2-2-3-1  :記号','\t', '', false],
  ['Level 2-2-3-1  :記号', '\v', '', false],
  ['Level 2-2-3-1  :記号', '\n', '', false],
  ['Level 2-2-3-1  :記号', '\r', '', false],
  ['Level 2-2-3-1  :記号', '\f', '', false],
  ['Level 2-2-3-1  :記号', '\'', '', false],
  ['Level 2-2-3-1  :記号', '\"', '', false],
  ['Level 2-2-3-1  :記号', '\`', '', false],
  ['Level 2-2-3-1  :記号', '\\', '', false],
  ['Level 2-2-3-1  :記号', '\0', '', false],
  ['Level 2-2-3-2  :number', "number", "number", false],
  ['Level 2-2-3-3  :null', null, 1, false],
  ['Level 2-2-3-3  :null', 1, null, false],
  ['Level 2-2-3-3  :null', null, null, false],
];

describe('テスト', () => {
  paramAll.forEach(param =>
    {
      describe(param[0], () => {
        test(`adds ${param[1]} + ${param[2]} to equal ${param[3]}`, () => {});
      });
      afterEach(() => {
        expect(sum(param[1], param[2])).toBe(param[3]);
      });
    }
  );
});

Node.js+Jestで単体テスト:Level0(スタート)~Level1(正常系テスト)

f:id:overworker:20200916000438p:plain:h150


仕事でNode.js+Jestを使った時に、調べた内容のメモです。

前提

環境構築

フォルダ構成

JestSample
├app/
│   ├sum.js
│   └__tests__/
│       └sum.test.js
├node_modules
│   └ (省略)
├package.json
└package-lock.json

レベル0:リファレンスサンプル(正の整数の計算を追加)

test('adds 1 + 2 to equal 3', () => {
  expect(sum(1, 2)).toBe(3);
});

レベル1意向で上記、テストをベースに単体テストの拡充を実施していきます。

レベル1:正常系テストの追加

  • 「正常系テストの追加」を通して、テストパターンを単純に追加できるようになる

レベル1-1:負の整数の計算を追加

test('adds -1 + -2 to equal -3', () => {
  expect(sum(-1, -2)).toBe(-3);
});

レベル1-2:小数の計算を追加

test('adds 1.2 + 3.4 to equal 4.6', () => {
  expect(sum(1.2, 3.4)).toBe(4.6);
});

レベル1-3:境界値のテストを追加

test('adds Number.MAX_SAFE_INTEGER + 0 to equal Number.MAX_SAFE_INTEGER', () => {
  expect(sum(Number.MAX_SAFE_INTEGER, 0)).toBe(Number.MAX_SAFE_INTEGER);
});
test('adds Number.MAX_SAFE_INTEGER-1 + 1 to equal Number.MAX_SAFE_INTEGER', () => {
  expect(sum(Number.MAX_SAFE_INTEGER-1, 1)).toBe(Number.MAX_SAFE_INTEGER);
});
test('adds Number.MIN_SAFE_INTEGER + 0 to equal Number.MIN_SAFE_INTEGER', () => {
  expect(sum(Number.MIN_SAFE_INTEGER, 0)).toBe(Number.MIN_SAFE_INTEGER);
});
test('adds Number.MIN_SAFE_INTEGER+1 + -1 to equal Number.MIN_SAFE_INTEGER', () => {
  expect(sum(Number.MIN_SAFE_INTEGER+1, -1)).toBe(Number.MIN_SAFE_INTEGER);
});

レベル1-4:特異値(0)のテストを追加

レベル1-4-1:_+0

test('adds 1 + 0 to equal 1', () => {
  expect(sum(1, 0)).toBe(1);
});

レベル1-4-2:0+_

test('adds 0 + 1 to equal 1', () => {
  expect(sum(0, 1)).toBe(1);
});

レベル1-4-3:結果が0

test('adds 1 + (-1) to equal 0', () => {
  expect(sum(1, -1)).toBe(0);
});

test('adds (-1) + 1 to equal 0', () => {
  expect(sum(-1, 1)).toBe(0);
});

レベル1-4-4:0+0

test('adds 0 + 0 to equal 0', () => {
  expect(sum(0, 0)).toBe(0);
});

レベル1-5:特異値(0.0)のテストを追加

レベル1-4-1:_+0.0

test('adds 1 + 0.0 to equal 1', () => {
  expect(sum(1, 0.0)).toBe(1);
});

レベル1-4-2:0.0+_

test('adds 0.0 + 1 to equal 1', () => {
  expect(sum(0.0, 1)).toBe(1);
});

レベル1-4-3:結果が0.0

test('adds 1 + (-1) to equal 0', () => {
  expect(sum(1, -1)).toBe(0);
});

test('adds (-1) + 1 to equal 0', () => {
  expect(sum(-1, 1)).toBe(0);
});

レベル1-4-4:0.0+0.0

test('adds 0 + 0 to equal 0', () => {
  expect(sum(0.0, 0.0)).toBe(0.0);
});

レベル1(ボーナス):describe(name, fn)

const sum = require('../sum');

// レベル0:リファレンスサンプル
describe('Level 0:リファレンスサンプル', () => {
  describe('Level 0:正の整数', () => {
    test('adds 1 + 2 to equal 3', () => {
      expect(sum(1, 2)).toBe(3);
    });
  });
});

// レベル1:正常系テスト
describe('Level 1:正常系テスト', () => {

  // 1-1
  describe('Level 1-1:負の整数', () => {
    test('adds -1 + -2 to equal -3', () => {
      expect(sum(-1, -2)).toBe(-3);
    });
  });

  // 1-2
  describe('Level 1-2:小数', () => {
    test('adds 1.2 + 3.4 to equal 4.6', () => {
      expect(sum(1.2, 3.4)).toBe(4.6);
    });
  });

  // 1-3
  describe('Level 1-3:境界値', () => {
    test('adds Number.MAX_SAFE_INTEGER + 0 to equal Number.MAX_SAFE_INTEGER', () => {
      expect(sum(Number.MAX_SAFE_INTEGER, 0)).toBe(Number.MAX_SAFE_INTEGER);
    });
    test('adds Number.MAX_SAFE_INTEGER-1 + 1 to equal Number.MAX_SAFE_INTEGER', () => {
      expect(sum(Number.MAX_SAFE_INTEGER-1, 1)).toBe(Number.MAX_SAFE_INTEGER);
    });
    test('adds Number.MIN_SAFE_INTEGER + 0 to equal Number.MIN_SAFE_INTEGER', () => {
      expect(sum(Number.MIN_SAFE_INTEGER, 0)).toBe(Number.MIN_SAFE_INTEGER);
    });
    test('adds Number.MIN_SAFE_INTEGER+1 + -1 to equal Number.MIN_SAFE_INTEGER', () => {
      expect(sum(Number.MIN_SAFE_INTEGER+1, -1)).toBe(Number.MIN_SAFE_INTEGER);
    });
  });

  // 1-4
  describe('Level 1-4:特異値(0)', () => {
    describe('Level 1-4-1:_ + 0', () => {
      test('adds 1 + 0 to equal 1', () => {
        expect(sum(1, 0)).toBe(1);
      });
    });

    describe('Level 1-4-2:0 + _', () => {
      test('adds 0 + 1 to equal 1', () => {
        expect(sum(0, 1)).toBe(1);
      });
    });

    describe('Level 1-4-3:結果が0', () => {
      test('adds 1 + (-1) to equal 0', () => {
        expect(sum(1, -1)).toBe(0);
      });
      test('adds (-1) + 1 to equal 0', () => {
        expect(sum(-1, 1)).toBe(0);
      });
    });

    describe('Level 1-4-4:0 + 0', () => {
      test('adds 0 + 0 to equal 0', () => {
        expect(sum(0, 0)).toBe(0);
      });
    });
  });

  // 1-5
  describe('Level 1-5:特異値(0.0)', () => {
    describe('Level 1-5-1:_ + 0.0', () => {
      test('adds 1 + 0.0 to equal 1', () => {
        expect(sum(1, 0.0)).toBe(1);
      });
    });

    describe('Level 1-5-2:0.0 + _', () => {
      test('adds 0.0 + 1 to equal 1', () => {
        expect(sum(0.0, 1)).toBe(1);
      });
    });

    describe('Level 1-5-3:結果が0', () => {
      test('adds 1 + (-1) to equal 0', () => {
        expect(sum(1, -1)).toBe(0);
      });

      test('adds (-1) + 1 to equal 0', () => {
        expect(sum(-1, 1)).toBe(0);
      });
    });

    describe('Level 1-5-4:0.0 + 0.0', () => {
      test('adds 0.0 + 0.0 to equal 0', () => {
        expect(sum(0.0, 0.0)).toBe(0.0);
      });
    });
  });
});

その他の記事へ

AWSの障害情報をチェックする方法

f:id:overworker:20210404081310g:plain:w500



2021年4月2日に自システムの障害アラートが発生しました。
原因は同時刻にWAF障害が発生していたためなのですが、そのことに気が付くのが遅れたため自システムのClowdWatchLogsばかり確認してしまいました。
また、そもそも自分の中でAWS障害の発生状況を確認するという意識が低いことに気が付いたためAWSの障害情報の確認方法についてまとめておきたいと思いました。

基本『aws SERVICE HEALTH DASHBOARD』を確認する

aws SERVICE HEALTH DASHBOARD』へアクセスする

ページの構成

  • CurrentStatus

アマゾンウェブサービスは、サービスの可用性に関する最新情報を以下の表に公開しています。 いつでもここに戻って現在のステータス情報を取得するか、RSSフィードを購読して個々のサービスの中断を通知してください。 以下に記載されていない当社のサービスのいずれかでリアルタイムの運用上の問題が発生している場合は、「お問い合わせ」リンクをクリックしてサービス問題レポートを送信してお知らせください。 すべての日時は太平洋標準時(PST / PDT)です。

アマゾンウェブサービスは、過去1年間に以下の表に公開したすべてのサービス中断の実行ログを保持します。 以下のステータスアイコンのいずれかにマウスを合わせると、詳細なインシデントレポートが表示されます(アイコンをクリックすると、ポップアップが表示されたままになります)。 表の上部にある矢印ボタンをクリックして、カレンダーを前後に移動します。 すべての日時は太平洋標準時(PST / PDT)です。

具体的な内容の確認を実施する

現時点では、AWS上の不具合が解消されていますので、CurrentStatusは正常を示しており、不具合発生時の様子を確認することは出来ません。ココでは、本日(2021年4月4日)時点で2021年4月2日に発生したWAFの不具合がどのように閲覧できるかを確認します。

f:id:overworker:20210404131948p:plain:w410
  • 1列目とそれ以外の領域で、行の高さ方向の幅に違いがあるので表示がずれていますが、4/2の欄でマークが他と違いサービスが存在することが確認できます。
  • 他と違うマークの上にポインタを重ねると、ポップアップが表示され、その日に発生した問題の内容が確認できます。
    • 表示位置がAWS WAFの行とずれていますが、ポップアップのタイトルからWAFの不具合に関する通知であることが確認できます。

[解決済み] AWS WAF-AP-NORTHEAST-1でのブロックされたリクエストの増加と、ルール変更の伝播の遅延 8:52 PM PDTAP-NORTHEAST-1リージョンでApplicationLoad Balancer(ALB)またはAPIGatewayでAWSWAFを使用している一部のお客様は、AWS WAFルールの変更の伝播が遅く、ブロックされたWebリクエストが増加しています。根本原因を特定し、問題の修正に取り組んでいます。問題が解決するまで、アプリケーションロードバランサーAWS WAFを使用しているお客様は、オプションで、WAFフェイルオープン属性(https://docs.aws.amazon.com/elasticloadbalancing/latest/application/application)を有効にすることで、リクエストをターゲットに転送するようにALBを設定できます。 -load-balancers.html#load-balancer-waf)、およびAPIGatewayでAWSWAFを使用しているお客様は、影響を受けるWebACLを一時的に無効にすることができます。 9:13 PM PDT 7:10 PMから8:25 PM PDTの間に、AP-NORTHEAST-1リージョンでApplication Load Balancer(ALB)またはAPIGatewayでAWSWAFを使用する一部のお客様は、AWSWAFルールの変更の伝播が遅くなりました。ブロックされたウェブリクエストの増加。この問題は解決され、サービスは正常に動作しています。

※ 時間の単位が(PDT)であることを確認しましょう。PDTとは、太平洋標準時は、西海岸標準時ともいい、協定世界時を8時間遅らせた、主にアメリカ西海岸の地域の標準時である。「-0800」のように表示する。 なお、夏時間では協定世界時より7時間遅れ、太平洋夏時間と呼ばれている。

確認できる内容
  • 現在の状況
  • 障害が発生していた時間帯
  • 障害発生時のAWSの振る舞い
  • AWS利用者がとるべき対応方法
    • WAFがALBとAPIGatewayのどちらに設定されているかで、とるべき行動が変わるようですが、どちらの場合についでも対応方法が記述されていることが確認できます。