1 00:00:00,400 --> 00:00:05,360 こんにちは、このコースでは ストリームライブラリについてお話します。 2 00:00:05,520 --> 00:00:07,840 ストリームは Pharo の 基本的な特徴の1つです。 3 00:00:09,240 --> 00:00:13,480 ストリームが何で、どう使うか、 いつ使うと便利かを見ていきましょう。 4 00:00:14,880 --> 00:00:16,200 ストリームとは何でしょう? 5 00:00:16,360 --> 00:00:17,840 ストリームオブジェクトは 6 00:00:18,000 --> 00:00:22,200 コレクションのような要素列を 7 00:00:22,360 --> 00:00:24,240 列挙することを可能にします。 8 00:00:24,400 --> 00:00:28,040 この要素列はメモリ中のコレクション かもしれませんし 9 00:00:28,800 --> 00:00:34,320 ネットワークから流れてくるかもしれませんし ファイル等かもしれません。 10 00:00:36,120 --> 00:00:39,320 ストリームはメモリ中に 現在位置を保持します。 11 00:00:40,000 --> 00:00:44,200 ストリームを使う時には 前に進めたり戻ったりしながら 12 00:00:44,360 --> 00:00:46,920 ストリームを読んだり書いたりします。 13 00:00:47,600 --> 00:00:50,760 ストリームの API の全体図です。 14 00:00:50,920 --> 00:00:54,680 ストリームを作るためには いくつかのオブジェクトは 15 00:00:55,520 --> 00:01:00,200 readStream や writeStream というメッセージを使って 16 00:01:01,000 --> 00:01:02,880 ストリームを作ることができます。 17 00:01:03,040 --> 00:01:06,800 (例えば、ファイルやコレクションから) 18 00:01:07,880 --> 00:01:10,480 こうしてストリームを作ることができます。 19 00:01:11,760 --> 00:01:16,560 この streamContents: メッセージが Collection に送られて 20 00:01:16,720 --> 00:01:19,120 ブロックが引数として渡されます。 ブロックはストリームを受け取ります。 21 00:01:19,680 --> 00:01:23,840 このブロックの中でストリームを使って コレクションを作ります。 22 00:01:24,000 --> 00:01:27,800 streamContents: メソッドが そのコレクションを返します。 23 00:01:27,960 --> 00:01:30,400 このメソッドの使い方は 終わりのほうで見ることになります。 24 00:01:31,440 --> 00:01:35,160 この場合は、 25 00:01:35,320 --> 00:01:38,680 readStream か writeStream か ReadWriteStream クラスに直接たのんで 26 00:01:38,840 --> 00:01:42,640 コレクション上に新しいインスタンスを作ります。 27 00:01:44,840 --> 00:01:50,200 これらの 3 つのメソッドは 要素を 1 つ読んだり 28 00:01:51,240 --> 00:01:53,320 あるところまで複数読んだりします。 29 00:01:54,080 --> 00:01:56,280 これらの 2 つは 30 00:01:56,440 --> 00:02:00,640 要素を 1 つか、または要素のコレクションを ストリームに書き込みます。 31 00:02:00,800 --> 00:02:04,440 ストリームから読み込み例がいくつかあります。 32 00:02:04,600 --> 00:02:06,600 まず、ストリームを作ります。 33 00:02:06,760 --> 00:02:11,640 コレクションから readStream を作ります。 34 00:02:11,800 --> 00:02:15,760 コレクションには a から f までの 全ての文字が入っています。 35 00:02:15,920 --> 00:02:19,840 コレクションの各要素として 1つずつの文字が入っています。 36 00:02:20,000 --> 00:02:24,520 コレクション上のストリームを作ります。 1つ1つの文字を見ていきましょう。 37 00:02:25,360 --> 00:02:27,760 ストリームの準備ができたら 38 00:02:28,400 --> 00:02:31,040 最初に next メッセージを送ります。 39 00:02:31,200 --> 00:02:34,720 ストリームが初期化された現在位置から 40 00:02:34,880 --> 00:02:36,800 要素を返します。 41 00:02:36,960 --> 00:02:40,200 ストリームの現在位置は 0 で ストリームの先頭位置です。 42 00:02:40,360 --> 00:02:45,120 next は最初の要素である a を返します。 43 00:02:45,920 --> 00:02:47,880 ここで next を呼ぶと 44 00:02:48,040 --> 00:02:51,800 b が得られて、そして c となります。 1つずつ。 45 00:02:51,960 --> 00:02:56,920 next を呼ぶことで 現在位置が1つずつ移動します。 46 00:02:57,760 --> 00:03:01,440 next を呼んで a を得てから 47 00:03:01,600 --> 00:03:06,480 upTo: メッセージを送って 引数として要素を1つ渡します。 48 00:03:06,640 --> 00:03:10,720 このメソッドは現在位置から 引数として渡した要素までの 49 00:03:10,880 --> 00:03:13,520 全ての要素を返します。 50 00:03:13,680 --> 00:03:17,040 現在位置が 1 で、a が得られた状態で 51 00:03:17,920 --> 00:03:19,800 upTo: $d を送ると 52 00:03:19,960 --> 00:03:23,320 現在位置から d までのものを返します。 53 00:03:23,480 --> 00:03:26,000 b と c です。 54 00:03:26,600 --> 00:03:28,720 d はストリームから取り出されています。 55 00:03:28,880 --> 00:03:32,440 つまり、ストリームの現在位置は d の後になっています。 56 00:03:32,600 --> 00:03:33,800 d は返されていません。 57 00:03:34,440 --> 00:03:38,760 stream position は現在位置を返します。 58 00:03:38,920 --> 00:03:40,720 現在位置は 0 で始まります。 59 00:03:40,880 --> 00:03:46,400 0 は最初の要素の前にあります。 0、1、2、3、4、と。 60 00:03:46,560 --> 00:03:49,120 現在 e の前で d の後になっています。 61 00:03:50,760 --> 00:03:55,840 ここで upToEnd メッセージをストリームに送ると 現在位置からストリームの末尾までの 62 00:03:56,000 --> 00:04:00,040 全ての要素を得ることができます。 63 00:04:00,200 --> 00:04:03,400 e と f です。 64 00:04:03,560 --> 00:04:07,520 ストリームが管理している現在位置を いくつかのメソッドを使って 65 00:04:07,680 --> 00:04:09,360 進めることができます。 66 00:04:09,520 --> 00:04:11,680 ストリームに書き込むこともできます。 67 00:04:11,840 --> 00:04:14,240 最初に、ストリームを作ります。 68 00:04:15,880 --> 00:04:19,840 Array new: 6 で 大きさ 6 の配列を作ります。 69 00:04:20,640 --> 00:04:24,240 writeStream メッセージを送って その配列上にストリームを作って 70 00:04:24,400 --> 00:04:27,600 ストリームを使って配列の中身を 徐々に埋めていくことができます。 71 00:04:27,760 --> 00:04:30,320 変数 stream にストリームを格納します。 72 00:04:30,480 --> 00:04:33,280 最初に nextPut: 1 メッセージを送ります。 73 00:04:33,440 --> 00:04:38,360 引数を 1 つ取って ストリームの現在位置にそれを追加します。 74 00:04:38,520 --> 00:04:43,800 配列には現在 1 が入っていて 空のセルが 5 個続いています。 75 00:04:46,280 --> 00:04:50,320 nextPutAll: メッセージは コレクションオブジェクトを取って 76 00:04:50,480 --> 00:04:53,360 ストリームに連結します。 77 00:04:54,240 --> 00:04:57,800 ストリームに nextPutAll: メッセージを送ると 78 00:04:58,600 --> 00:05:01,000 配列には、前回の nextPut: の結果の 79 00:05:01,880 --> 00:05:04,480 1 が入っていて 80 00:05:04,640 --> 00:05:06,880 nextPutAll: の結果の 81 00:05:09,240 --> 00:05:11,120 4 8 2 6 7 が続きます。 82 00:05:11,280 --> 00:05:14,880 ストリームはオブジェクトのコレクションの 83 00:05:15,040 --> 00:05:18,560 読み書きをする上で 特に便利で効率的です。 84 00:05:19,400 --> 00:05:21,600 ファイルに読み書きをすることもできます。 85 00:05:21,760 --> 00:05:25,200 例として 86 00:05:25,360 --> 00:05:27,440 新規ファイルに書き込む方法を示します。 87 00:05:29,880 --> 00:05:32,480 ストリームでは ファイルの名前を入力します。 88 00:05:33,640 --> 00:05:39,360 asFilereference メッセージを送ることで 89 00:05:39,520 --> 00:05:41,720 ファイルへの参照を作ります。 90 00:05:41,880 --> 00:05:46,040 これはまだ存在しないファイルですが そのファイルへの参照を得ることができます。 91 00:05:46,640 --> 00:05:49,440 hello.txt ファイルへの参照が得られました。 92 00:05:50,720 --> 00:05:52,680 そのファイルにwriteStream メッセージを 93 00:05:54,120 --> 00:05:55,440 送ることで 94 00:05:55,600 --> 00:06:00,760 このまだ存在しないファイルに関連つけられた 書き込み用のストリームが得られます。 95 00:06:00,920 --> 00:06:05,240 このストリームに書き込むと すぐにファイルが作られます。 96 00:06:06,240 --> 00:06:11,480 ここでストリームがあって nextPutAll:メッセージを文字列をつけて送ります。 97 00:06:11,640 --> 00:06:16,720 このメッセージは文字列の各要素を 1つずつ書き込んでいきます。 98 00:06:16,880 --> 00:06:19,400 h 次に e 次に l、という具合です。 99 00:06:20,560 --> 00:06:21,560 最後に 100 00:06:23,320 --> 00:06:24,960 ストリームを閉じることで 101 00:06:25,120 --> 00:06:29,720 ファイルへの書き込みが終わり 102 00:06:29,880 --> 00:06:33,360 ストレージに全て書き出してしまって 103 00:06:33,520 --> 00:06:37,360 ファイルポインタを閉じて良い ということを OS に伝えます。 104 00:06:37,520 --> 00:06:42,400 これでファイルに書き込みました。 それを読み込むことができます。 105 00:06:42,560 --> 00:06:46,720 ファイル名を 106 00:06:46,880 --> 00:06:48,680 文字列として示して 107 00:06:50,880 --> 00:06:56,200 asFileReference で このファイルへの参照を作ります。 108 00:06:57,800 --> 00:06:59,440 readStream で 109 00:06:59,600 --> 00:07:02,240 読み込みモードで開いて 110 00:07:02,400 --> 00:07:06,160 読み込み用ストリームを作ります。 111 00:07:07,840 --> 00:07:10,680 next で、ストリームの最初の要素を得ます。 112 00:07:10,840 --> 00:07:14,920 「Hello Pharo!」と書き込んだので 最初の要素は H です。 113 00:07:15,600 --> 00:07:19,000 現在位置は H の後で e の前ですが 114 00:07:19,160 --> 00:07:22,400 upToEnd でその現在位置から 115 00:07:22,560 --> 00:07:25,840 ファイルの終わりまでの要素を得ます。 116 00:07:26,000 --> 00:07:28,800 H 抜きの 「ello Pharo!」が得られます。 117 00:07:28,960 --> 00:07:33,160 H は next で既に取り出しているので。 118 00:07:33,320 --> 00:07:36,960 ストリームを使って コレクションを作ることができます。 119 00:07:37,120 --> 00:07:39,880 コレクションを作って 120 00:07:40,040 --> 00:07:44,320 中に何がはいるべきかを 徐々に選んでいきたい時に便利です。 121 00:07:45,480 --> 00:07:48,680 OrderedCollection を 122 00:07:50,840 --> 00:07:53,160 ストリームにメッセージを送ることで 作ります。 123 00:07:53,320 --> 00:07:56,240 OrderedCollection の 124 00:07:56,960 --> 00:07:58,640 新しいインスタンスから始めて 125 00:07:59,240 --> 00:08:01,760 writeStream にします。 126 00:08:02,520 --> 00:08:06,280 nextPut: メッセージで ストリームに 1 を加えます。 127 00:08:06,440 --> 00:08:10,200 stream contents で 128 00:08:10,360 --> 00:08:13,440 値 1 だけが格納された 129 00:08:13,600 --> 00:08:15,520 OrderedCollection クラスの インスタンスが得られます。 130 00:08:16,240 --> 00:08:19,720 これら3つの式は下に示したように 簡略化できます。 131 00:08:20,720 --> 00:08:23,240 streamContents: メッセージを 132 00:08:23,400 --> 00:08:26,960 欲しいコレクションのクラスである OrderedCollection に送ります。 133 00:08:27,120 --> 00:08:29,960 OrderedCollection に streamContents: を送り 134 00:08:30,120 --> 00:08:35,000 引数としてブロックを渡します。 ブロックは引数としてストリームを受け取ります。 135 00:08:35,160 --> 00:08:39,160 ブロックでは、コレクションの中身を ストリームを使って徐々に埋めていきます。 136 00:08:39,320 --> 00:08:41,760 ブロックが終わったら コレクションが得られます。 137 00:08:42,320 --> 00:08:46,120 ブロックでは、stream nextPut: 1 としています。 138 00:08:46,880 --> 00:08:49,720 ストリームに 1 を加えます。 139 00:08:49,880 --> 00:08:51,880 1 がコレクションに追加されます。 140 00:08:52,040 --> 00:08:55,880 この表現式が終わると streamContents: が終了します。 141 00:08:56,040 --> 00:08:58,840 1 を格納した OrderedCollection が得られます。 142 00:08:59,000 --> 00:09:03,720 streamContents: はコレクションを 真っ新な状態から作るときに便利です。 143 00:09:04,400 --> 00:09:07,600 このコースでは ストリームの API を学びました。 144 00:09:07,760 --> 00:09:11,920 Nautilus コードナビゲーターで クラスを探索して 145 00:09:12,080 --> 00:09:14,280 学ぶべきメソッドが沢山あります。 146 00:09:14,440 --> 00:09:18,560 ストリームでメモリ上のコレクションや ファイルやネットワークなどを 147 00:09:18,720 --> 00:09:22,480 読んだり書いたりすることができます。 148 00:09:23,640 --> 00:09:26,160 ストリームは現在位置を管理します。 149 00:09:27,040 --> 00:09:31,440 現在位置は 過去の要素と未来の要素の区切りです。 150 00:09:31,600 --> 00:09:36,000 ストリームを読み書きする度に 現在位置が変化します。 151 00:09:37,200 --> 00:09:40,480 ストリームは新しいコレクションを作る のにも役に立ちます。