rabbit-slide-znz-rubykaigi2014 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ebcad87ff203a3a3897a4eb3c0350dfb3a95fcde
4
+ data.tar.gz: 574c12725d48ca0243b3cb0be6b6a66ee16bd291
5
+ SHA512:
6
+ metadata.gz: 5bbb67f883b111f3fc06d99a33fb4fcd0e182baa16585d82ac930f32d56639979f0ddeacfb49d869f940f992257a61a6a85cebb0c56d547cfd04fb780d2fa61f
7
+ data.tar.gz: a86d4d45d7aeb18db77534d1be27242a20d11101a769abf7747313983ad002940fc6893cc97dbcb99d5fae4fcde6430e50678a6e0ed36145a625987d84dc6b13
data/.rabbit ADDED
@@ -0,0 +1 @@
1
+ ruby-removed-features.rab
data/README.md ADDED
@@ -0,0 +1,4 @@
1
+ rubykaigi2014-ruby-removed-features
2
+ ===================================
3
+
4
+ RubyKaigi 2014 での発表資料です。
data/README.rd ADDED
@@ -0,0 +1,24 @@
1
+ = Archaeology of Ruby: Removed Features Ruby (考古学 消された機能編)
2
+
3
+ RubyKaigi 2014 での発表資料です。
4
+
5
+ == 作者向け
6
+
7
+ === 表示
8
+
9
+ rake
10
+
11
+ === 公開
12
+
13
+ rake publish
14
+
15
+ == 閲覧者向け
16
+
17
+ === インストール
18
+
19
+ gem install rabbit-slide-znz-rubykaigi2014
20
+
21
+ === 表示
22
+
23
+ rabbit rabbit-slide-znz-rubykaigi2014.gem
24
+
data/Rakefile ADDED
@@ -0,0 +1,17 @@
1
+ require "rabbit/task/slide"
2
+
3
+ # Edit ./config.yaml to customize meta data
4
+
5
+ spec = nil
6
+ Rabbit::Task::Slide.new do |task|
7
+ spec = task.spec
8
+ # task.spec.files += Dir.glob("doc/**/*.*")
9
+ # task.spec.files -= Dir.glob("private/**/*.*")
10
+ # task.spec.add_runtime_dependency("YOUR THEME")
11
+ end
12
+
13
+ desc "Tag #{spec.version}"
14
+ task :tag do
15
+ sh("git", "tag", "-a", spec.version.to_s, "-m", "Publish #{spec.version}")
16
+ sh("git", "push", "--tags")
17
+ end
data/config.yaml ADDED
@@ -0,0 +1,20 @@
1
+ ---
2
+ id: rubykaigi2014
3
+ base_name: ruby-removed-features
4
+ tags:
5
+ - ruby
6
+ presentation_date:
7
+ version: 0.0.1
8
+ licenses: []
9
+ slideshare_id:
10
+ speaker_deck_id:
11
+ ustream_id:
12
+ vimeo_id:
13
+ youtube_id:
14
+ author:
15
+ markup_language: :rd
16
+ name: Kazuhiro NISHIYAMA
17
+ email: zn@mbf.nifty.com
18
+ rubygems_user: znz
19
+ slideshare_user: znzjp
20
+ speaker_deck_user: znz
@@ -0,0 +1,350 @@
1
+ = Ruby 考古学 \n 消された機能編
2
+ : subtitle
3
+ Archaeology of Ruby: \n Removed Features
4
+ : author
5
+ Kazuhiro NISHIYAMA
6
+ # : institution
7
+ # 所属
8
+ : content-source
9
+ RubyKaigi2014
10
+ : date
11
+ 2014/09/19
12
+ : allotted-time
13
+ 30m
14
+ : theme
15
+ default
16
+
17
+ = Self introduction
18
+
19
+ * one of Ruby Committers
20
+ * Mr. fix typo (by Chikanaga)
21
+ * I use Ruby since 1.4
22
+
23
+ == note
24
+
25
+ まずは自己紹介からです。
26
+ C Ruby のコミッターの一人です。
27
+ 昨日の朝一のちかながさんの発表の CRuby Committers Who's who in 2014 では Mr. fix typo と紹介されていました。
28
+
29
+ ruby を使い始めた時はバージョン 1.4 系でした。
30
+ そのバージョンより後で削除された機能で気になったものについての話をします。
31
+
32
+ = Agenda
33
+
34
+ * ((*リリースに入った後、消された機能*)) \n
35
+ (('sub:Some features removed after release'))
36
+ * 開発版のみに入っていた機能 \n
37
+ (('sub:Some features only in development branch'))
38
+
39
+ == note
40
+
41
+ まず過去のリリースに入っていたのに、消された機能の話です。
42
+
43
+ = Safe Level
44
+
45
+ * (({$SAFE=4})) is obsolete since 2.1.0
46
+ * 不完全な Sand Box
47
+ * Safe Level 自体の削除の話も何度かあった
48
+
49
+ == note
50
+
51
+ 最近のリリースで削除された大きな機能として、
52
+ safe level 4 があります。
53
+
54
+ 元々 Ruby の sand box 機能として safe level は不完全で、
55
+ safe level 自体の削除の提案がされたことも何度かありました。
56
+
57
+ (参考: https://bugs.ruby-lang.org/issues/8468#note-15 )
58
+
59
+ = Safe level
60
+
61
+ * ((<Feature #8468 Remove $SAFE|URL:https://bugs.ruby-lang.org/issues/8468>))
62
+ * Matz agreed at GitHub Tokyo drinkup (on 2013)
63
+ * tDiary, which is the only application using $SAFE == 4, also agreed
64
+ * (({$SAFE < 4})) is a fail-safe feature to detect bugs of applications
65
+
66
+ == note
67
+ そういう経緯もあり、2013 年の GitHub Tokyo drinkup で削除が合意されたようです。
68
+ (参考: https://bugs.ruby-lang.org/issues/8468 )
69
+
70
+ その場で safe level 4 を使っていた tDiary の開発者の賛成もあったようです。
71
+
72
+ その後の redmine 上での議論では、
73
+ JRuby では長い間 safe level をサポートしていなかったが、特に指摘されたことはなかったとか、
74
+ ActiveScriptRuby は safe level 3 を使っているなどの意見があったため、
75
+ 4 未満の safe level はセキュリティ機能としてではなく、
76
+ バグ発見用のフェイルセーフ機能として残ることになったようです。
77
+
78
+ 詳しい経緯は 8468 番の issue を見てください。
79
+
80
+ = Safe Level
81
+
82
+ * (({$SAFE=4})) is obsolete since 2.1.0
83
+
84
+ (('sub:raise ArgumentError'))
85
+ * (({untrust})) since 1.9.1
86
+ * (({untrust})) is deprecated since 2.1.0
87
+
88
+ (('sub:its behavior is same as taint'))
89
+
90
+ == note
91
+
92
+ その結果、 2.1.0 では safe level の 4 は廃止されて、
93
+ 4 を設定しようとすると ArgumentError が発生するようになりました。
94
+
95
+ その前の 1.9.1 で untrust が導入されて
96
+ 少しセキュリティ対策が強化されたこともあったのですが、
97
+ 活用されることなく 2.1.0 では deprecated になり、
98
+ taint と同じ動作になってしまいました。
99
+
100
+ = (({'.'})) from (({$LOAD_PATH}))
101
+
102
+ * security reason
103
+ * same as (({PATH})) does not contain (({'.'}))
104
+ since 1.9.2
105
+ * use (({require_relative})) instead
106
+ == note
107
+
108
+ セキュリティ関係といえば、
109
+ セキュリティ上の理由で '.' (ドット) が (('$LOAD_PATH')) からひっそり取り除かれました。
110
+ 理由としては実行コマンドの検索パスがカレントディレクトリを含んでいないのと同じ理由です。
111
+
112
+ 代わりの機能として require_relative が使えます。
113
+
114
+ = (({$KCODE}))
115
+
116
+ * from (({$KCODE})) to Encoding (m17n)
117
+ * (({$KCODE})) #=> nil # warning: variable $KCODE is no longer effective
118
+ * (({$KCODE=})) # warning: variable $KCODE is no longer effective; ignored
119
+
120
+ == note
121
+
122
+ ruby 1.9 の多言語化対応の影響で $KCODE の代わりに Encoding を使うようになりました。
123
+ そして $KCODE の参照は常に nil がかえってくるようになり、
124
+ $KCODE への代入は無視されるようになりました。
125
+
126
+ = Regexp options
127
+
128
+ * Regexp literal options (remains) : (({/n /e /s /u}))
129
+
130
+ //n.encoding #=> #<Encoding:US-ASCII>
131
+ //e.encoding #=> #<Encoding:EUC-JP>
132
+ //s.encoding #=> #<Encoding:Windows-31J>
133
+ //u.encoding #=> #<Encoding:UTF-8>
134
+
135
+ == note
136
+
137
+ 一方 $KCODE 関連だった正規表現リテラルの n e s u オプションはまだ残っています。
138
+ 互換性のために残っているので、そのうちなくなるかもしれません。
139
+ そして、もしかすると代わりに a オプションが増える可能性があるかもしれません。
140
+
141
+ = (({$=})) (ignore case)
142
+
143
+ * (({$= = true}))
144
+ * ruby 1.8.7: warning: modifying $= is deprecated
145
+ * ruby 1.9.3: warning: variable $= is no longer effective; ignored
146
+
147
+ == note
148
+
149
+ もう一つ、グローバル変数と言えば $= を true にすると
150
+ ハッシュのキーの文字列などで大文字小文字を無視することが
151
+ 出来るという機能がありました。
152
+
153
+ 使ったことがある人はほとんどいないと思いますが、
154
+ 1.8 で影響範囲が限定的になり、
155
+ 1.9 でそういう機能はなくなりました。
156
+
157
+ ドキュメントに残っていることがありますが、もう使えないので、
158
+ 見かけても無視してください。
159
+
160
+ = (({$deferr}))
161
+ (('sub:between 1.6.7 and 1.8.0'))
162
+
163
+ * (({$deferr})) → (({$stderr}))
164
+ * (({$defout})) → (({$stdout}))
165
+ * (({$stderr=})) → (({STDERR.reopen}))
166
+ * (({$stdin=})) → (({STDIN.reopen}))
167
+ * (({$stdout=})) → (({STDOUT.reopen}))
168
+
169
+ == note
170
+
171
+ さらに昔の話になりますが、
172
+ ruby 1.7 の頃には $defout や $deferr というグローバル変数があって、
173
+ 子プロセスに影響しない出力先変更に使われていましたが、
174
+ 今は $stdout と $stderr に統一されて、
175
+ 子プロセスに影響するリダイレクトは reopen を使うようになりわかりやすくなりました。
176
+
177
+ 今は子プロセスに影響しないリダイレクトは $stdout や $stderr への代入で、
178
+ 子プロセスに影響するリダイレクトは reopen を使うということを覚えておけば良いと思います。
179
+
180
+ さらに言えば、今は子プロセスを起動するときにリダイレクトなどを柔軟に指定できる
181
+ Process.spawn などのメソッドを使う方がおすすめです。
182
+
183
+ = (({if cond:}))
184
+ (('sub:until 1.8'))
185
+
186
+ if true:
187
+ p true
188
+ end
189
+
190
+ ((':')) をつけられる隠し機能の削除
191
+
192
+ == note
193
+
194
+ ruby 1.8 までは if の条件式の後ろなどに ((':')) を付けられるという隠し機能がありましたが、
195
+ 1.9 では取り除かれました。
196
+
197
+ 隠し機能のはずなのになぜか使われていて、修正が必要だった gem などもあったようです。
198
+
199
+ = (({File.exists?}))
200
+
201
+ * (({File.exist?})) (recommend)
202
+ * (({File.exists?})) (deprecated)
203
+
204
+ Ruby 本体のメソッド名は出来るだけ三単現のsを付けない
205
+
206
+ File.exists? IO::NULL
207
+ # warning: File.exists? is a deprecated
208
+ # name, use File.exist? instead
209
+
210
+ == note
211
+
212
+ Ruby 本体のメソッド名は出来るだけ三単現のsを付けないというルールがあるので、
213
+ File.exists? は以前警告が出ていたのですが、
214
+ 何かのミスだったのか警告が一度出なくなって、
215
+ また出るようになったという経緯があります。
216
+
217
+ そういう経緯もあってメソッド自体はまだ残っていますが、
218
+ 警告も出るようになっているので、
219
+ そのうち消されると思います。
220
+
221
+ = Agenda
222
+
223
+ * リリースに入った後、消された機能 \n
224
+ (('sub:Some features removed after release'))
225
+ * ((*開発版のみに入っていた機能*))\n
226
+ (('sub:Some features only in development branch'))
227
+
228
+ == note
229
+
230
+ 続いて開発版のみに入っていた機能についての話をします。
231
+
232
+ = Symbol < String in 2006 (1.9.0-dev)
233
+
234
+ * Symbol が String を継承していた時期があった
235
+ * Symbol < Stringも止める。caseとかでのバグをたくさん生んでしまう
236
+
237
+ (('sub:http://www.rubyist.net/~matz/20061107.html#p03'))
238
+
239
+ == note
240
+
241
+ ruby 1.9 の開発版の一時期に Symbol が String を継承するように変更されていた時期がありましたが、
242
+ 問題が多かったため、元通り継承関係のないクラス階層に戻されました。
243
+ matz 日記には理由として「caseとかでのバグをたくさん生んでしまう」と書かれていました。
244
+
245
+ = Symbol < String (cont.)
246
+
247
+ ruby 1.8.7:
248
+ // =~ :s
249
+ #~> TypeError: can't convert Symbol into String
250
+ methods[0].class #=> String
251
+
252
+ ruby 1.9.3:
253
+ // =~ :s #=> 0
254
+ methods[0].class #=> Symbol
255
+
256
+ * 継承は止めても String に似た扱いは入った。
257
+
258
+ == note
259
+
260
+ その影響もあり Symbol に String っぽい挙動が残っています。
261
+
262
+ その後 methods メソッドのように返り値が String から Symbol に変わったなどの影響もあり、
263
+ 継承関係はなくなったものの Symbol を String に似た扱いにするメソッドが ruby 1.8 までに比べると
264
+ ruby 1.9 以降では多くなっています。
265
+
266
+ = (({__send}))
267
+ (('sub:between 1.8 and 1.9'))
268
+
269
+ * (({__send__})) cannot call private methods
270
+ * (({__send})), (({__send!}))
271
+ * (({public_send})) since 1.9.1
272
+
273
+ private メソッド呼び出し用途が多く影響範囲が広いため元の挙動に
274
+
275
+ == note
276
+
277
+ ruby 1.9 の開発版の途中で send が今の public_send 相当の private メソッドは呼べないという変更が入り、
278
+ (({__send})) と (({__send!})) というメソッドが導入されたことがあったのですが、
279
+ アクセス制限を回避して private メソッドを呼び出すために send を使っていることが多く、
280
+ 影響が大きすぎたため、元に戻されて (({public_send})) というメソッドが導入されました。
281
+
282
+ = Real multi-value (to_splat)
283
+ (('sub: 1.9.x'))
284
+
285
+ * (({to_splat})) (!= (({to_ary}))) (!= (({to_a})))
286
+ * svalue, avalue, mvalue
287
+ * e.g. (({a, b = mvalue}))
288
+
289
+ == note
290
+
291
+ これも ruby 1.9 の開発版での話なのですが、
292
+ 2006年頃に真の多値を導入しようとしていた時期があり、
293
+ to_ary とは別に to_splat というメソッドが呼ばれるようになっていた時期があったのですが、
294
+ リリースされることなく to_splat などは消えました。
295
+
296
+ リリースされずに消えたので、確認できないので間違っているかもしれませんが、
297
+ 多重代入のときなどに to_a や to_ary の代わりに to_splat を呼ぶようになっていたのだと思います。
298
+
299
+ = Symbol.find in 2.2.0-dev
300
+
301
+ * Symbol.find(str) \n -> symbol or nil
302
+ * Return the related symbol if the symbol already exists.
303
+ * Return nil if not.
304
+ * revision 47543
305
+ * Removed because of Symbol GC
306
+ * If you still want this, request again on Redmine.
307
+
308
+ == note
309
+
310
+ 昨日のなりさんの Symbol GC の発表で話があったように、
311
+ ruby 2.1 までは Symbol は GC の対象ではなかったため、
312
+ ruby 2.2 の開発版で Symbol が既に存在するかどうか調べるメソッドが追加されました。
313
+
314
+ しかし、 2.2.0 で Symbol GC が導入されたため、
315
+ リリースに入ることなく削除されました。
316
+
317
+ それでも必要だと思ったら、redmine で再度リクエストしてくださいとコミットログに書いていました。
318
+
319
+ = statfs in 2.2.0-dev
320
+
321
+ * (({IO#statfs})) and (({File::Statfs}))
322
+ * https://bugs.ruby-lang.org/issues/9772
323
+ * (({statfs.f_type})) for tests
324
+ * Reject at ((<DevelopersMeeting20140517Japan|URL:https://bugs.ruby-lang.org/projects/ruby/wiki/DevelopersMeeting20140517Japan>))
325
+
326
+ (('sub:「Matz: 色々込み入ってるので core には入れないで test 配下へ. 欲しいということがあったら gem にしてください.」'))
327
+
328
+ == note
329
+
330
+ 次に ruby 2.2 の開発版にのみ存在した statfs の話です。
331
+ statfs.f_type がテストに必要ということで、とりあえず追加されて、
332
+ 各種 OS 対応など、みんなで変更していたのですが、5月17日の開発者会議で
333
+ 「色々込み入ってるので core には入れないで test 配下へ. 欲しいということがあったら gem にしてください.」
334
+ という理由で却下され、最低限の機能だけ test 配下に入り、一般に使える機能としては入りませんでした。
335
+
336
+ = Conclusion
337
+
338
+ * Some features only in development branch
339
+ * Some features cannot introduce because of compatibility
340
+
341
+ == note
342
+
343
+ 最後にまとめです。
344
+
345
+ いくつかの機能は開発版だけで消えてしまっています。
346
+ またいくつかの機能は互換性のために入らなかったり他の機能になったりしています。
347
+
348
+ 入らなかったり削られたのがなぜなのかを考えることで、
349
+ 今後の新機能の提案に生かしていただければ、
350
+ ということで話を終わります。
metadata ADDED
@@ -0,0 +1,65 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rabbit-slide-znz-rubykaigi2014
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Kazuhiro NISHIYAMA
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-09-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rabbit
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.0.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 2.0.2
27
+ description: |
28
+ RubyKaigi 2014 での発表資料です。
29
+ email:
30
+ - zn@mbf.nifty.com
31
+ executables: []
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - ".rabbit"
36
+ - README.md
37
+ - README.rd
38
+ - Rakefile
39
+ - config.yaml
40
+ - pdf/rubykaigi2014-ruby-removed-features.pdf
41
+ - ruby-removed-features.rab
42
+ homepage: http://slide.rabbit-shocker.org/authors/znz/rubykaigi2014/
43
+ licenses: []
44
+ metadata: {}
45
+ post_install_message:
46
+ rdoc_options: []
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ requirements: []
60
+ rubyforge_project:
61
+ rubygems_version: 2.2.2
62
+ signing_key:
63
+ specification_version: 4
64
+ summary: rubykaigi2014-ruby-removed-features ===================================
65
+ test_files: []