﻿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
ストリームは新しいコレクションを作る
のにも役に立ちます。
