WEBVTT

1
00:00:00.000 --> 00:00:00.901
こんにちは。

2
00:00:00.901 --> 00:00:04.954
今回はジャバスクリプトのマス・ログ・ツーを紹介します。

3
00:00:04.954 --> 00:00:09.607
これは、数値を底が二の対数へ変換する、組み込みのメソッドです。

4
00:00:09.607 --> 00:00:15.761
たとえば処理時間が百ミリ秒から二百ミリ秒になれば二倍、五十ミリ秒になれば半分です。

5
00:00:15.761 --> 00:00:22.066
倍率をそのまま並べると二とゼロ点五になり、変化なしを表す一からの距離がそろいません。

6
00:00:22.066 --> 00:00:28.370
マス・ログ・ツーを使うと、二倍は一、変化なしはゼロ、半分はマイナス一に変換できます。

7
00:00:28.370 --> 00:00:31.373
四倍なら二、四分の一ならマイナス二です。

8
00:00:31.373 --> 00:00:39.028
この動画では、処理時間の比較を題材に、基本の書き方から入力検証、失敗しやすい注意点まで順に解説します。

9
00:00:39.028 --> 00:00:40.364
まず動作環境です。

10
00:00:40.364 --> 00:00:48.679
マス・ログ・ツーはジャバスクリプト標準の組み込みメソッドで、ブラウザーとノード・ジェイエスの両方で利用できます。

11
00:00:48.679 --> 00:00:53.652
二千十五年七月からブラウザー間で広く利用できる機能とされており、現在のクローム、

12
00:00:53.652 --> 00:00:58.626
エッジ、ファイアフォックス、サファリを対象にできます。

13
00:00:58.626 --> 00:01:02.932
ドムや外部ライブラリーには依存せず、インポートも不要です。

14
00:01:02.932 --> 00:01:09.613
記事のサンプルは、ブラウザーの現行版、またはノード・ジェイエス二十二以降を想定しています。

15
00:01:09.613 --> 00:01:16.591
これはサンプル全体の対象であり、このメソッド自体が二十二で追加されたという意味ではありません。

16
00:01:16.591 --> 00:01:20.600
古い環境では、タイプオブで関数かどうかを確認できます。

17
00:01:20.600 --> 00:01:22.720
基本の書き方を見ましょう。

18
00:01:22.720 --> 00:01:26.959
呼び出し方はマス・ログ・ツー、かっこ、エックスです。

19
00:01:26.959 --> 00:01:30.710
引数は一つだけで、対数を求める数値を渡します。

20
00:01:30.710 --> 00:01:35.602
戻り値は数値型で、二を何乗するとエックスになるかを表します。

21
00:01:35.602 --> 00:01:40.656
たとえば二の三乗は八なので、マス・ログ・ツー八の結果は三です。

22
00:01:40.656 --> 00:01:43.265
二なら一、一ならゼロになります。

23
00:01:43.265 --> 00:01:52.560
マスはコンストラクターではないため、インスタンスを作る必要はなく、マスに直接呼びかける静的メソッドとして使います。

24
00:01:52.560 --> 00:01:56.473
処理は同期的で、プロミスやアウェイトは不要です。

25
00:01:56.473 --> 00:02:00.387
まずは、この何乗という考え方を押さえてください。

26
00:02:00.387 --> 00:02:06.420
引数の順番で迷うこともなく、読み返したときに意図が伝わりやすい書き方です。

27
00:02:06.420 --> 00:02:09.105
値の範囲と特別な結果を確認します。

28
00:02:09.105 --> 00:02:11.789
エックスが一なら戻り値はゼロです。

29
00:02:11.789 --> 00:02:18.106
一より大きければ戻り値は正になり、ゼロより大きく一未満なら戻り値は負になります。

30
00:02:18.106 --> 00:02:22.211
ここが、半分や四分の一がマイナスの値になる理由です。

31
00:02:22.211 --> 00:02:27.580
エックスがゼロ、またはマイナスゼロなら、戻り値はマイナス無限大です。

32
00:02:27.580 --> 00:02:31.212
エックスが負の数なら、戻り値はナンになります。

33
00:02:31.212 --> 00:02:34.528
エックスが無限大なら、戻り値も無限大です。

34
00:02:34.528 --> 00:02:40.055
注意したいのは、負数を渡しても、そのことだけで例外にはならない点です。

35
00:02:40.055 --> 00:02:45.109
業務で受け付けない値は、呼び出す側で先に検証する必要があります。

36
00:02:45.109 --> 00:02:53.320
この対応表は、入力チェックの条件を決めるときの基準にもなりますので、表として手元に残しておくと便利です。

37
00:02:53.320 --> 00:02:56.204
倍率を対数に変える考え方です。

38
00:02:56.204 --> 00:03:02.741
完成例では、以前の処理時間と現在の処理時間から、まず倍率を求めます。

39
00:03:02.741 --> 00:03:06.971
倍率は、現在の値を以前の値で割ったものです。

40
00:03:06.971 --> 00:03:12.355
百ミリ秒から二百ミリ秒なら倍率は二で、その対数は一です。

41
00:03:12.355 --> 00:03:19.085
百ミリ秒から五十ミリ秒なら倍率はゼロ点五で、その対数はマイナス一です。

42
00:03:19.085 --> 00:03:25.622
このように、現在の時間が長くなると結果は正、短くなると負になります。

43
00:03:25.622 --> 00:03:29.468
ただし元の処理時間も残すことが大切です。

44
00:03:29.468 --> 00:03:38.120
変化の大きさを表す対数と、実際の待ち時間は別の情報なので、両方を確認できる形にしましょう。

45
00:03:38.120 --> 00:03:46.580
掛け算で表していた変化を、足し算で比べられる尺度へ置き換えることが、この変換の狙いです。

46
00:03:46.580 --> 00:03:48.383
ここからは完成例です。

47
00:03:48.383 --> 00:03:56.581
コンペア・デュレーションという関数は、以前と現在の処理時間を受け取り、倍率と対数をまとめて返します。

48
00:03:56.581 --> 00:04:03.959
最初に、二つの値が数値型で、かつ有限かどうかを確かめ、問題があればタイプエラーを投げます。

49
00:04:03.959 --> 00:04:09.533
次に、ゼロ以下でないかを確かめ、ゼロ以下ならレンジエラーを投げます。

50
00:04:09.533 --> 00:04:12.812
入力は有限の正の数値に限定する設計です。

51
00:04:12.812 --> 00:04:18.387
検証を通ったら、現在の値を以前の値で割って倍率を求め、割り算の結果も有限で正かどうかを確認してから、

52
00:04:18.387 --> 00:04:23.961
マス・ログ・ツーで対数を計算します。

53
00:04:23.961 --> 00:04:27.240
検証と計算を一つの関数にまとめた形です。

54
00:04:27.240 --> 00:04:29.068
期待出力を読みましょう。

55
00:04:29.068 --> 00:04:33.332
以前の処理時間を百ミリ秒として、五つのケースを試します。

56
00:04:33.332 --> 00:04:35.769
変化なしは倍率一、対数ゼロです。

57
00:04:35.769 --> 00:04:40.947
二倍は倍率二、対数一、半分は倍率ゼロ点五、対数マイナス一になります。

58
00:04:40.947 --> 00:04:44.298
四倍は対数二、四分の一は対数マイナス二です。

59
00:04:44.298 --> 00:04:50.390
ゼロを渡した不正な入力のケースでは、レンジエラーとしてメッセージが表示されます。

60
00:04:50.390 --> 00:04:57.548
これらの出力は、ノード・ジェイエスの実機でも記事の期待出力と完全に一致することを確認済みです。

61
00:04:57.548 --> 00:05:03.336
プラスとマイナスが対称に並ぶ様子を見ると、対数に変える利点がはっきりします。

62
00:05:03.336 --> 00:05:09.580
符号と大きさの両方を見ることで、増えた変化と減った変化を同じ物差しで並べられます。

63
00:05:09.580 --> 00:05:12.929
よくある失敗が、例外処理だけに頼ることです。

64
00:05:12.929 --> 00:05:16.431
マス・ログ・ツーにマイナス八を渡すコードを、トライとキャッチで囲んでも、

65
00:05:16.431 --> 00:05:19.933
例外は発生しません。

66
00:05:19.933 --> 00:05:24.804
結果はナンとしてそのまま表示され、キャッチの処理には入りません。

67
00:05:24.804 --> 00:05:31.199
キャッチへ入ることを前提にしていると、不正な計算結果が後続の処理へ流れてしまいます。

68
00:05:31.199 --> 00:05:37.593
完成例が、型、有限性、正数という条件を先に確認していたのは、この問題を防ぐためです。

69
00:05:37.593 --> 00:05:43.226
文字列の百も完成例では拒否し、入力形式の誤りを見逃さない設計にしています。

70
00:05:43.226 --> 00:05:46.880
計算の前に検証する、という順番を覚えてください。

71
00:05:46.880 --> 00:05:48.806
ゼロと割り算の注意点です。

72
00:05:48.806 --> 00:05:52.955
処理時間がゼロだった場合、完成例はレンジエラーにします。

73
00:05:52.955 --> 00:06:00.068
ゼロを小さな正数へ置き換えれば計算はできますが、選んだ数によって結果が大きく変わってしまいます。

74
00:06:00.068 --> 00:06:04.662
計測の分解能より短かった値なのか、欠けたデータをゼロで表しているのかを確認し、

75
00:06:04.662 --> 00:06:09.255
別の状態として扱うほうが判断しやすくなります。

76
00:06:09.255 --> 00:06:17.257
また、有限の正数どうしでも、極端な値を割ると倍率が無限大になったり、非常に小さくなってゼロになったりします。

77
00:06:17.257 --> 00:06:20.665
完成例が割り算の後も検証するのはそのためです。

78
00:06:20.665 --> 00:06:26.148
計算結果は近似値になる点にも注意し、判定には丸める前の値を使ってください。

79
00:06:26.148 --> 00:06:29.017
結果の読み方を間違えないことも大切です。

80
00:06:29.017 --> 00:06:34.612
ログ・レイシオが二だからといって、処理時間が二ミリ秒増えたわけではありません。

81
00:06:34.612 --> 00:06:37.194
基準の四倍になった、という意味です。

82
00:06:37.194 --> 00:06:42.072
単位の付いた差分と、対数による倍率は、別の情報として扱ってください。

83
00:06:42.072 --> 00:06:44.941
もう一つ、評価の向きにも注意が必要です。

84
00:06:44.941 --> 00:06:50.535
この例では現在の時間を以前の時間で割るため、正の方向が遅延の増加を意味します。

85
00:06:50.535 --> 00:06:55.556
処理件数のように大きいほうが望ましい指標では、評価の向きが変わります。

86
00:06:55.556 --> 00:07:03.016
画面には指標の意味を明記し、表示用に小数桁をそろえる場合も、判定には丸める前の値を使うようにしましょう。

87
00:07:03.016 --> 00:07:04.997
活用場面とまとめです。

88
00:07:04.997 --> 00:07:13.282
マス・ログ・ツーは、同じ種類の処理について、変更前後の所要時間を比較するレポートに使えます。

89
00:07:13.282 --> 00:07:21.386
二倍と半分、四倍と四分の一を対称に表せるため、基準からの相対的な変化を並べやすくなります。

90
00:07:21.386 --> 00:07:24.448
ただし、元の値の重要性は残ります。

91
00:07:24.448 --> 00:07:30.031
一ミリ秒から二ミリ秒への変化と、一秒から二秒への変化は、対数ではどちらも一ですが、

92
00:07:30.031 --> 00:07:35.614
利用者への影響まで同じとは判断できません。

93
00:07:35.614 --> 00:07:46.600
実務へ導入するなら、最初は元の処理時間、倍率、対数の三つを併記し、比較条件をそろえた小さなレポートで試すのがおすすめです。

94
00:07:46.600 --> 00:07:48.221
お疲れさまでした。

95
00:07:48.221 --> 00:07:53.804
まずは、二倍が一、半分がマイナス一という対応を覚えてください。
