WEBVTT

00:00:00.560 --> 00:00:01.360 align:middle
みなさん、こんにちは。

00:00:01.520 --> 00:00:04.800 align:middle
今回はデバッガを簡単に紹介して
ブレークポイントの概念と

00:00:04.960 --> 00:00:09.360 align:middle
Pharo での色々なブレークポイントを
説明します。

00:00:09.600 --> 00:00:11.560 align:middle
システムは生きていて

00:00:11.760 --> 00:00:14.760 align:middle
システムや

00:00:14.920 --> 00:00:18.040 align:middle
システム中のオブジェクトと
対話することを学びます。

00:00:18.840 --> 00:00:22.000 align:middle
ソースコードを扱うのではなく
オブジェクトを扱います。

00:00:22.160 --> 00:00:25.520 align:middle
オブジェクトには状態があり
メッセージを送ったり受けたりします。

00:00:26.760 --> 00:00:29.200 align:middle
デバッガを使うことを
怖がらないでください。

00:00:29.360 --> 00:00:33.480 align:middle
デバッガでコードを書いたり
動いているプログラムをインスペクトしたり

00:00:33.920 --> 00:00:37.360 align:middle
強力で本当に「使える」ツールです。

00:00:37.920 --> 00:00:41.040 align:middle
デバッガ上で直接開発する開発者を

00:00:41.200 --> 00:00:45.360 align:middle
自分も含め何人も知っています。

00:00:45.520 --> 00:00:49.440 align:middle
コードブラウザ以外にも
膨大な量のコードが

00:00:49.600 --> 00:00:51.280 align:middle
デバッガ上で書かれています。

00:00:51.440 --> 00:00:54.040 align:middle
その利点は
コードを書いている時に

00:00:54.200 --> 00:00:58.400 align:middle
メソッドのコンテキストや
オブジェクトや変数にアクセスできる点です。

00:00:58.560 --> 00:01:00.960 align:middle
そういったことを見たり
試行したりすることができます。

00:01:01.120 --> 00:01:04.640 align:middle
コードを書いている時に
全てのデータを渡して

00:01:04.800 --> 00:01:06.360 align:middle
テストすることができるのです。

00:01:06.920 --> 00:01:10.280 align:middle
デバッガはこんな表示になっています。

00:01:10.440 --> 00:01:14.560 align:middle
タイトルバーがあって
エラーメッセージを表示しています。

00:01:14.720 --> 00:01:16.920 align:middle
スタックがあります。コールスタックです。

00:01:17.080 --> 00:01:20.200 align:middle
メソッドを呼ぶスタックです。
ここを見ると

00:01:20.360 --> 00:01:24.440 align:middle
この performTest メソッドは
testSumming メソッドを呼んでいて

00:01:24.600 --> 00:01:27.600 align:middle
それが + メソッドを呼んでいます。

00:01:27.760 --> 00:01:32.400 align:middle
その + メソッドが
doesNotUnderstand:を発生させています。

00:01:33.680 --> 00:01:37.720 align:middle
ここで選ばれたメソッドの
コードがここに表示されます。

00:01:37.880 --> 00:01:41.440 align:middle
ここで DiceHandle クラスの
+ メソッドが選択されています。

00:01:41.600 --> 00:01:44.480 align:middle
それでそのコードが下側に表示されています。

00:01:44.640 --> 00:01:48.640 align:middle
一番下の部分には
色々な変数があります。

00:01:48.800 --> 00:01:50.760 align:middle
この実行中のコンテキストで

00:01:50.920 --> 00:01:53.720 align:middle
アクセス可能な変数全てです。

00:01:53.880 --> 00:01:56.480 align:middle
変数を変更したり

00:01:56.640 --> 00:01:59.840 align:middle
そのオブジェクトをインスペクトしたり
できます。

00:02:00.400 --> 00:02:04.000 align:middle
ここに一連のアクションがあります。

00:02:04.160 --> 00:02:08.280 align:middle
メソッドの再実行をしたり
呼び出し先に潜り込んだり

00:02:08.440 --> 00:02:10.760 align:middle
何が起こっているのか1行ずつ見たり
することができます。

00:02:11.400 --> 00:02:14.880 align:middle
デバッガが開いた時
それを閉じても何も解決しません。

00:02:15.160 --> 00:02:17.560 align:middle
デバッガを開いて

00:02:17.720 --> 00:02:21.200 align:middle
何が問題を起こしているのか
詳しく中を見る方がずっと簡単です。

00:02:21.360 --> 00:02:24.120 align:middle
デバッガでコールスタックや

00:02:24.280 --> 00:02:26.240 align:middle
オブジェクトを精査して
問題を修正するほうが

00:02:26.400 --> 00:02:30.040 align:middle
デバッガを閉じてから原因を
推測するよりずっと簡単です。

00:02:31.480 --> 00:02:34.840 align:middle
デバッガはともだちです。

00:02:35.000 --> 00:02:37.560 align:middle
デバッガを使ってコンテキスト中の
オブジェクトや

00:02:37.720 --> 00:02:42.440 align:middle
インスタンス変数などと対話します。

00:02:42.600 --> 00:02:47.040 align:middle
変数の状態をチェックしたり
あるいは修正してしまったりします。

00:02:48.000 --> 00:02:51.560 align:middle
オブジェクトの状態をチェックするために
メッセージを送ったり

00:02:51.720 --> 00:02:54.440 align:middle
どう反応するのかをチェックします。

00:02:55.080 --> 00:02:59.160 align:middle
もちろんコールスタック上のメソッドを
修正してセーブして

00:02:59.320 --> 00:03:02.160 align:middle
新しいコードで実行を継続できます。

00:03:02.320 --> 00:03:06.920 align:middle
最初から再実行することなく。

00:03:07.400 --> 00:03:10.120 align:middle
メソッドが失敗した時に
そのメソッドを修正して

00:03:10.280 --> 00:03:14.080 align:middle
そのメソッドを再実行して
プログラムは実行継続します。

00:03:15.000 --> 00:03:16.200 align:middle
とてもよく使われる

00:03:17.040 --> 00:03:19.240 align:middle
デバッグ手法に

00:03:19.680 --> 00:03:22.400 align:middle
コンソールに表示する
というものがあります。

00:03:22.560 --> 00:03:27.200 align:middle
それは実際には

00:03:27.360 --> 00:03:31.720 align:middle
デバッグ手法としてはとても残念なもので

00:03:32.320 --> 00:03:37.480 align:middle
トレースしたい全てのメソッドを修正して
問題が修正されたら再び

00:03:37.640 --> 00:03:40.600 align:middle
全てのトレースを取り除かなければなりません。

00:03:40.760 --> 00:03:44.400 align:middle
その上、問題がどこにありそうか

00:03:44.560 --> 00:03:47.680 align:middle
どこから問題が入り込んでくるのか
およその見当がついていなければ

00:03:47.840 --> 00:03:52.440 align:middle
トレースとしてどこで何を表示するか
決められません。

00:03:52.760 --> 00:03:57.240 align:middle
もう1つの方法にブレークポイントがあります。

00:03:57.680 --> 00:04:01.920 align:middle
ブレークポントは次に通過する時に

00:04:02.080 --> 00:04:06.040 align:middle
実行を停止するように Pharo に
指示するコードです。

00:04:06.200 --> 00:04:09.560 align:middle
最も簡単なブレークポントは
Halt now です。

00:04:09.720 --> 00:04:13.800 align:middle
Halt クラスに now メッセージを
送ります。

00:04:13.960 --> 00:04:17.360 align:middle
すると直ちに実行を停止します。

00:04:17.520 --> 00:04:19.520 align:middle
ここからデバッガが開きます。

00:04:19.680 --> 00:04:23.760 align:middle
何が起こるのか1行ずつプログラムの状態を
見ていくことができます。

00:04:24.320 --> 00:04:27.520 align:middle
つまり Halt now はプログラムを
一時停止させます。

00:04:27.680 --> 00:04:30.120 align:middle
再実行することもできますが
当面は一時停止しています。

00:04:30.280 --> 00:04:33.880 align:middle
そしてアプリケーションの現状態で
デバッガを開きます。

00:04:34.040 --> 00:04:36.120 align:middle
Halt now はとても良いのですが

00:04:36.280 --> 00:04:40.120 align:middle
システムにより実行されるものも含めて

00:04:40.320 --> 00:04:43.200 align:middle
定常的に実行されるメソッドに置いてしまうと

00:04:43.360 --> 00:04:48.120 align:middle
デバッガが何十個も開いてしまう
ことになります。

00:04:48.280 --> 00:04:52.520 align:middle
Halt now をデバッガを開く時に

00:04:52.920 --> 00:04:55.800 align:middle
使われるコードに置いてしまうと

00:04:55.960 --> 00:04:57.400 align:middle
デバッガを開こうとした時に

00:04:57.560 --> 00:04:59.440 align:middle
それ自身が Halt now を実行してしまい
また別のデバッガを開くことになり

00:04:59.600 --> 00:05:04.200 align:middle
ということが繰り返され
システムを止めてしまいます。

00:05:04.520 --> 00:05:07.760 align:middle
この場合、 Halt once を使います。

00:05:07.920 --> 00:05:12.520 align:middle
Halt once は一度実行されたら
実行を停止しますが

00:05:12.680 --> 00:05:17.240 align:middle
それ以降は何度実行されても
実行を停止しません。

00:05:18.520 --> 00:05:22.120 align:middle
Halt once はコードのどこにでも
置くことができます。

00:05:23.880 --> 00:05:26.200 align:middle
一度だけ実行されて

00:05:26.360 --> 00:05:28.280 align:middle
デバッガーを開いて

00:05:28.440 --> 00:05:31.680 align:middle
すぐに無効になります。

00:05:32.360 --> 00:05:35.240 align:middle
もう1つの方法は一定の回数の実行後に
停止することです。

00:05:35.640 --> 00:05:38.560 align:middle
例えば 10 回繰り返された後で停止すれば

00:05:38.720 --> 00:05:42.080 align:middle
あるコレクションの10個目の要素に
何かある場合に

00:05:42.240 --> 00:05:44.800 align:middle
それまでの 9 回は

00:05:44.960 --> 00:05:47.880 align:middle
デバッガを開いても無駄なわけです。

00:05:48.040 --> 00:05:51.000 align:middle
なので 10 回目に停止したいわけです。

00:05:52.040 --> 00:05:56.280 align:middle
あるいは特定の条件を満たす時だけ

00:05:56.520 --> 00:05:59.920 align:middle
停止することも考えられます。

00:06:00.080 --> 00:06:02.040 align:middle
Halt if: は

00:06:02.240 --> 00:06:04.200 align:middle
メソッド名のシンボルが引数の場合には

00:06:04.400 --> 00:06:07.480 align:middle
コールスタック上にそのメソッドが
ある場合にデバッガを開きます。

00:06:07.640 --> 00:06:11.280 align:middle
つまり、Dice>>faces のコードに
Halt if: #printString を入れると

00:06:11.440 --> 00:06:15.920 align:middle
Dice>>faces が

00:06:16.080 --> 00:06:18.000 align:middle
printString メソッドから
呼ばれている時だけ

00:06:18.160 --> 00:06:20.200 align:middle
ブレークポイントが

00:06:20.520 --> 00:06:23.120 align:middle
働いて、プログラムを一時停止させます。

00:06:23.720 --> 00:06:25.360 align:middle
if: は引数としてブロックを取ることもできます。

00:06:25.520 --> 00:06:28.320 align:middle
ブロック内のコードが

00:06:28.480 --> 00:06:32.680 align:middle
true の場合だけプログラムを一時停止して

00:06:32.880 --> 00:06:35.080 align:middle
デバッガを開きます。

00:06:35.320 --> 00:06:38.840 align:middle
Pharo ではテストもコールスタック中の
メソッドなので

00:06:39.000 --> 00:06:42.840 align:middle
テストから実行された時だけ

00:06:43.000 --> 00:06:45.400 align:middle
一時停止することができます。

00:06:45.960 --> 00:06:49.560 align:middle
now、once、onCount:、if:
といったメソッドはどれも

00:06:50.240 --> 00:06:53.000 align:middle
Halt クラスのメソッドです。

00:06:53.160 --> 00:06:56.720 align:middle
コードを勉強して
どうやって実装されているか見ることができます。

00:06:56.880 --> 00:06:59.880 align:middle
そして自分のメソッドを追加して

00:07:00.040 --> 00:07:03.760 align:middle
自分にとって必要な独自の
ブレークポイントを作ることもできます。

00:07:03.920 --> 00:07:06.240 align:middle
下の例では

00:07:06.400 --> 00:07:11.080 align:middle
between:and: というブレークポイントを
実装しました。

00:07:11.240 --> 00:07:14.280 align:middle
minTime から maxTime までの間だけ

00:07:14.440 --> 00:07:19.320 align:middle
プログラムを停止させるものです。

00:07:20.400 --> 00:07:23.800 align:middle
つまり正子から午前2時までの間だけ

00:07:23.960 --> 00:07:27.640 align:middle
プログラムを停止させて
デバッガを開きます。

00:07:27.800 --> 00:07:31.240 align:middle
デバッガはとても強力なツールです。

00:07:31.560 --> 00:07:35.280 align:middle
システムで沢山のブレークポイントを
定義していますが

00:07:35.440 --> 00:07:37.760 align:middle
必要なだけ追加することができます。

00:07:37.920 --> 00:07:41.360 align:middle
ブレークポイントを使うと
メソッドを変更してデバッガを開いて

00:07:41.520 --> 00:07:44.240 align:middle
何が起きているのか1行ごとに
見ていくことができます。

00:07:45.120 --> 00:07:48.720 align:middle
ブレークポイントは本当に強力です。

00:07:48.880 --> 00:07:52.440 align:middle
ブレークポイントやデバッガを使う
ことを躊躇しないでください。

