open-uri, easy-to-use and extensible virtual file system · 2019-09-12 · open-uri, easy-to-use...

85
open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira [email protected] Free Software Initiative Group, Information Technology Research Institute, National Institute of Advanced Industrial Science and Technology (AIST) 2005–10–14 open-uri, Easy-to-Use and Extensible Virtual File System – p. 1

Upload: others

Post on 01-Aug-2020

7 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

open-uri, Easy-to-Use andExtensible Virtual File System

Tanaka [email protected]

Free Software Initiative Group,Information Technology Research Institute,

National Institute of Advanced Industrial Science and Technology (AIST)

2005–10–14

open-uri, Easy-to-Use and Extensible Virtual File System – p. 1

Page 2: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Table of Contents• Who am I?• How to use open-uri• Why open-uri?• open-uri and net/http• How to design easy-to-use API• Easy-to-use v.s. security• VFS – Virtual File System

open-uri, Easy-to-Use and Extensible Virtual File System – p. 2

Page 3: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Who am I?

open-uri, Easy-to-Use and Extensible Virtual File System – p. 3

Page 4: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Who am I (1)

The author of open-uri andseveral standard libraries:

open-uri.rb, pathname.rb, time.rb, pp.rb,prettyprint.rb, resolv.rb, resolv-replace.rb, tsort.rb

open-uri, Easy-to-Use and Extensible Virtual File System – p. 4

Page 5: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Who am I (2)

Contribution for variousclasses and methods.IO without stdioIO#read and readpartial

Time Time.utc Time#utc_offset

allocate marshal_dump marshal_load

Regexp#to_s Regexp.union

Process.daemonfork kills all other threads

open-uri, Easy-to-Use and Extensible Virtual File System – p. 5

Page 6: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Who am I (3)I reports many bugs, over 100/year.

• core dump• test failure• build problem• mismatch between doc. and imp.• etc.

open-uri, Easy-to-Use and Extensible Virtual File System – p. 6

Page 7: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Who am I (4)I wrote several non-standard libraries.

• htree• webapp• amarshal• ruby-tzfile• vfs-simple

open-uri, Easy-to-Use and Extensible Virtual File System – p. 7

Page 8: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

How to Useopen-uri

open-uri, Easy-to-Use and Extensible Virtual File System – p. 8

Page 9: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Simple Usagerequire ’open-uri’

open("http://www.ruby-lang.org"){

|f|

print f.read

}

Similar to open files.

open-uri, Easy-to-Use and Extensible Virtual File System – p. 9

Page 10: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Whyopen-uri?

open-uri, Easy-to-Use and Extensible Virtual File System – p. 10

Page 11: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Why open-uri?

• Easy-to-Use API• VFS: Not Only HTTP

open-uri, Easy-to-Use and Extensible Virtual File System – p. 11

Page 12: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

open-uriand

net/httpopen-uri, Easy-to-Use and Extensible Virtual File System – p. 12

Page 13: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

net/http has Too Many WaysNet::HTTP.get_printNet::HTTP.getNet::HTTP.start{|h| h.get }Net::HTTP.start{|h|h.request_get{|r|}}h = Net::HTTP.new; h.start {|h|h.request_get {|r| } }h = Net::HTTP.new; h.start {|h|q = HTTP::Get.newh.request(q){|r|}}

open-uri, Easy-to-Use and Extensible Virtual File System – p. 13

Page 14: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

open-uri has Fewer Waysopen(uri) {|f| }uri.open {|f| }uri.read

• Save User’s Memory

• Reuse User’s Knowledge

open-uri, Easy-to-Use and Extensible Virtual File System – p. 14

Page 15: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

net/http: get and printNet::HTTP.get_print(URI("http://host"))

print Net::HTTP.get(URI("http://host"))

open-uri, Easy-to-Use and Extensible Virtual File System – p. 15

Page 16: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

open-uri: get and printopen("http://host") {|f|print f.read

}

print URI("http://host").read

open-uri, Easy-to-Use and Extensible Virtual File System – p. 16

Page 17: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

get and printnet/http:

• Net::HTTP.get_print : print only• Net::HTTP.get : good

open-uri:• open : conventional• URI().read : short, polymorphism

open-uri, Easy-to-Use and Extensible Virtual File System – p. 17

Page 18: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Why Easy?open("http://host")

• No new construct

• Users don’t need to learn.

open-uri respects userknowledges.

open-uri, Easy-to-Use and Extensible Virtual File System – p. 18

Page 19: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

net/http: headersNet::HTTP.start ( "host" ) {|h|r = h. get ( "/" ,

"User-Agent" => "bar")p r["Content-Type"]print r. body

}

• No URI anymore

• No Net::HTTP.get anymore

• Net::HTTP.start, Net::HTTP#get andNet::HTTP::Response#body instead.open-uri, Easy-to-Use and Extensible Virtual File System – p. 19

Page 20: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

open-uri: headersopen("http://host",

"User-Agent" => "bar") {|f|p f.content_typeprint f.read

}

• Still URI

• Still open method

• Fewer things to learn.

open-uri, Easy-to-Use and Extensible Virtual File System – p. 20

Page 21: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

net/http: SSLrequire "net/https"

h = Net::HTTP.new("host", 443 )h.use_ssl = trueh.ca_file = "/etc/ssl/certs/ca-certificates.crt"h.verify_mode = OpenSSL::SSL::VERIFY_PEERh. start {r = h.get("/")print r.body

}• Different library: net/https

• Net::HTTP.new and Net::HTTP#start

• Different port

• Server verification not by default

• New SSL methods

open-uri, Easy-to-Use and Extensible Virtual File System – p. 21

Page 22: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

open-uri: SSLopen("https://host") {|f|print f.read

}

• Still URI

• Still open method

• Server verification by default

• No new library.

• No new methods. Fewer things to learn.

open-uri, Easy-to-Use and Extensible Virtual File System – p. 22

Page 23: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

net/http: proxyklass = Net::HTTP::Proxy("proxy", 8080)

klass.start("host") {|h|

r = h.get("/")

print r.body

}

• New method: Net::HTTP::Proxy

open-uri, Easy-to-Use and Extensible Virtual File System – p. 23

Page 24: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

open-uri: proxy% http_proxy=http://proxy:8080/% export http_proxy

• Conventional environment variable supported

• No new methods. An user might know thisalready.

• Fewer things to learn.

open-uri, Easy-to-Use and Extensible Virtual File System – p. 24

Page 25: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

net/http: basic authNet::HTTP.start("host") {|h|q = Net::HTTP::Get .new("/")q.basic_auth "user", "pass"r = h. request (q)print r.body

}

• New class: Net::HTTP::Get

• New method: Net::HTTP#request

open-uri, Easy-to-Use and Extensible Virtual File System – p. 25

Page 26: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

open-uri: basic authopen("http://host",:http_basic_authentication=>

["user", "pass"]) {|f|print f.read

}

• Still URI

• Still open method

• New option: :http_basic_authentication

• No new methods. Fewer things to learn.open-uri, Easy-to-Use and Extensible Virtual File System – p. 26

Page 27: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

How toDesign

Easy-to-UseAPI

open-uri, Easy-to-Use and Extensible Virtual File System – p. 27

Page 28: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

How to Design Easy-to-UseAPI

• Save brain power• Evolve gradually

open-uri, Easy-to-Use and Extensible Virtual File System – p. 28

Page 29: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Save Brain Power

Fewer Things to Learn• Fewer constructs for pragmatic usages• Huffman coding• DRY• No configuration is good configuration• Reuse user knowledge• Infrastructure friendly

open-uri, Easy-to-Use and Extensible Virtual File System – p. 29

Page 30: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Fewer Constructs for Prag-matic UsagesFewer constructs decrease things tolearn

• open v.s. Net::HTTP.get,Net::HTTP#get, etc.

• This is not minimalism.• The target of "fewer" is not all

constructs.

Pragmatic usages should be supportedby small constructs.

open-uri, Easy-to-Use and Extensible Virtual File System – p. 30

Page 31: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Fewer Constructs (2)

primitivesmethods

convenience

should be smaller

rarely usedfrequently used forpragmatic usages

open-uri, Easy-to-Use and Extensible Virtual File System – p. 31

Page 32: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Ex. net/http and open-uriMethods frequently used:net/http Net::HTTP.start, Net::HTTP#getopen-uri openopen-uri’s fewer constructs supportsmuch more features.

open-uri, Easy-to-Use and Extensible Virtual File System – p. 32

Page 33: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Huffman Coding• Shorter for frequent things

• Longer for rare things

Optimize for frequent things.Ex: p

open-uri, Easy-to-Use and Extensible Virtual File System – p. 33

Page 34: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Huffman Coding (2)

primitivesmethods

convenience

shorter methodslonger methods

rarely used frequently used

open-uri, Easy-to-Use and Extensible Virtual File System – p. 34

Page 35: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Ex. pp obj

• Very frequently used• Bad name in common sense• Almost no problem because everyone

knows

open-uri, Easy-to-Use and Extensible Virtual File System – p. 35

Page 36: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Ex. pp and y• Bad name in common sense• Problematic than p because not

everyone knows

open-uri, Easy-to-Use and Extensible Virtual File System – p. 36

Page 37: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Ex. to_s and to_strto s shorter. frequently used.to str longer. internal use.

open-uri, Easy-to-Use and Extensible Virtual File System – p. 37

Page 38: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Ex. defdef shorter. frequently used.define method longer. not encouraged.

open-uri, Easy-to-Use and Extensible Virtual File System – p. 38

Page 39: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Ex. time.rbTime.parse frequently used.Time.strptime generic. needs to learn the

format.

Time.parse is less flexible but enough formost cases, and easy to learn.

open-uri, Easy-to-Use and Extensible Virtual File System – p. 39

Page 40: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Candidates for Huffman Cod-ing

• Method name• Other name• Convenience method• Language syntax• etc.

open-uri, Easy-to-Use and Extensible Virtual File System – p. 40

Page 41: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Length for Huffman Coding• Number of characters• Number of nodes in AST• Editor keystrokes• etc.

open-uri, Easy-to-Use and Extensible Virtual File System – p. 41

Page 42: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Encourage Good Style• Programmers like short code• Short code should be designed as

good style

open-uri, Easy-to-Use and Extensible Virtual File System – p. 42

Page 43: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

DRY

Don’tRepeatYourself

open-uri, Easy-to-Use and Extensible Virtual File System – p. 43

Page 44: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

DRY ViolationNet::HTTP .start("host") {|h|q = Net::HTTP ::Get.new("/")q.basic auth "user", "pass"r = h.request(q)print r.body

}

open-uri, Easy-to-Use and Extensible Virtual File System – p. 44

Page 45: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

No Configuration is GoodConfigurationThings should be work well out-of-box.

• SSL CA certificates• http_proxy environment variable

open-uri, Easy-to-Use and Extensible Virtual File System – p. 45

Page 46: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Bad Examples• ext/iconv/config.charset• soap_use_proxy• require "irb/completion"• RUBYOPT=rubygems

open-uri, Easy-to-Use and Extensible Virtual File System – p. 46

Page 47: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Reuse User Knowledgeopen-uri reuse user knowledge.

• open is used to access an externalresource

• If a block is given for open, it is calledwith a file object

Various knowledge about open isreused.Fewer things to learn.

open-uri, Easy-to-Use and Extensible Virtual File System – p. 47

Page 48: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Reusable Knowledge• Ruby builtin (popular) method• Consistency• Unix• Standards: POSIX, RFC, etc.• Metaphor

open-uri, Easy-to-Use and Extensible Virtual File System – p. 48

Page 49: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Consistency• bang methods• each_with_index• etc.

Consistency violation:• Time#utc is destructive

open-uri, Easy-to-Use and Extensible Virtual File System – p. 49

Page 50: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Metaphor• HTTP is a kind of a network file

system• open-uri doesn’t support beyond file

system: POST, etc

open-uri, Easy-to-Use and Extensible Virtual File System – p. 50

Page 51: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Infrastructure Friendly• emacs, vi• line oriented tools• shell and file system• web browser

Prefer"It is easy using the legacy tool XXX"over"It is easy using the new tool YYY"

open-uri, Easy-to-Use and Extensible Virtual File System – p. 51

Page 52: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Evolve Gradually

• Adaptive Huffman coding

• How to find bad API

• How to avoidincompatibility

• Incompatible changeopen-uri, Easy-to-Use and Extensible Virtual File System – p. 52

Page 53: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Adaptive Huffman CodingWhat methods are used frequently?

• Long method name at first• Alias to short name later• Define convenience methods for

idioms

open-uri, Easy-to-Use and Extensible Virtual File System – p. 53

Page 54: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Adaptive Huffman Coding (2)• Short names and operators should be

used carefully• Use a long name if hesitate• Alias is not a bad thing (TMTOWTDI)• Primitives should have long names• Define new method for idiom

open-uri, Easy-to-Use and Extensible Virtual File System – p. 54

Page 55: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Operators• CGI#[] and CGI#params

CGI#[] was defined unsuitably.• Hash#[]

primitive: Hash#fetch

open-uri, Easy-to-Use and Extensible Virtual File System – p. 55

Page 56: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

How to Find Bad API• Repeated surprise• Often cannot remember• Idiom

open-uri, Easy-to-Use and Extensible Virtual File System – p. 56

Page 57: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Repeated SurpriseExample:

• Time#utc is destructive• Iconv.iconv returns an array• String#gsub(/\\/, ’\\\\’) has no

effect• etc.

Violate POLS

open-uri, Easy-to-Use and Extensible Virtual File System – p. 57

Page 58: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Often Cannot RememberManual is required again and again forsame issue.

• RubyUnit• optparse

open-uri, Easy-to-Use and Extensible Virtual File System – p. 58

Page 59: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

RubyUnitrequire ’runit /testcase ’require ’runit/cui/testrunner’

class TestC < RUNIT ::TestCasedef test unit

...end

end

RUNIT::CUI::TestRunner.run(TestC.suite)

open-uri, Easy-to-Use and Extensible Virtual File System – p. 59

Page 60: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Test::Unitrequire ’test / unit’

class TestC <Test::Unit ::TestCase

def test unit...

endendTest::Unit removed code for runner.

open-uri, Easy-to-Use and Extensible Virtual File System – p. 60

Page 61: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

optparserequire ’optparse’ARGV.options {|q|

q.on ("-h") { puts q }q.on("-v") { $VERBOSE = true }q.parse!

}

open-uri, Easy-to-Use and Extensible Virtual File System – p. 61

Page 62: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Idiom• Repeated code• Violate DRY• An idiom may be good• An idiom may be bad

Bad idiom example:• Iconv.iconv()[0]

open-uri, Easy-to-Use and Extensible Virtual File System – p. 62

Page 63: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

How to Avoid IncompatibilityExtension without Incompatibility:

• new method• new keyword argument• new constants

Introducing new names has nocompatibility problem. (in most case)

open-uri, Easy-to-Use and Extensible Virtual File System – p. 63

Page 64: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Incompatible Change

Incompatible Changeis a Bad Thing

But fixing bad API involves incompatible change,sometimes.

open-uri, Easy-to-Use and Extensible Virtual File System – p. 64

Page 65: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Incompatible ChangeAPI Migration Example

• net/http: API version• cgi: special implementation for a

transition period• fork: warning after change• IO#read: warning before change• etc.

open-uri, Easy-to-Use and Extensible Virtual File System – p. 65

Page 66: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

net/http: API versionNet::HTTP has two APIs.

• Ruby 1.6: API version 1.1• Ruby 1.7: API version 1.2

API version can be switched dynamically.

open-uri, Easy-to-Use and Extensible Virtual File System – p. 66

Page 67: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

net/http: switch API versionNet::HTTP.version_1_1... use 1.1 API ...

Net::HTTP.version_1_2... use 1.2 API ...

• It tends to forget restore API version• Global switch – not thread safe

open-uri, Easy-to-Use and Extensible Virtual File System – p. 67

Page 68: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

cgi: special implementationfor a transition periodCGI#[] returns:

• Ruby 1.6: an array of parameters• Ruby 1.8: transition period• future?: a first parameter or nil

open-uri, Easy-to-Use and Extensible Virtual File System – p. 68

Page 69: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

cgi: special implementationfor a transition periodCGI#[] returns something tweaked onRuby 1.8.Try to work as both Array and String.

• Ruby 1.8.0: subclass of String• Ruby 1.8.1: subclass of

DelegateClass(String)• Ruby 1.8.2: extended String

open-uri, Easy-to-Use and Extensible Virtual File System – p. 69

Page 70: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

fork: warning after changeDoes fork kill other threads in childprocess?

• Ruby 1.6: No• Ruby 1.8: Yes

open-uri, Easy-to-Use and Extensible Virtual File System – p. 70

Page 71: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

fork: warning after change% ruby -e ’Thread.new{sleep};fork’

• Ruby 1.6: No warning• Ruby 1.8.0: No warning• Ruby 1.8.1: warning:

fork terminates thread• Ruby 1.8.2: No warning

open-uri, Easy-to-Use and Extensible Virtual File System – p. 71

Page 72: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

IO#read: warning beforechangeIO#read will block even ifO_NONBLOCK is set.

• Ruby 1.8: doesn’t block• Ruby 1.9: block

open-uri, Easy-to-Use and Extensible Virtual File System – p. 72

Page 73: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

IO#read: warning beforechangeIO#read will block even ifO_NONBLOCK is set.

• Ruby 1.8.2: No warning• Ruby 1.8.3: warning:

nonblocking IO#read is obsolete;use IO#readpartial or IO#sysread

• Ruby 1.9: No warningwarning only if verbose mode.

open-uri, Easy-to-Use and Extensible Virtual File System – p. 73

Page 74: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Easy-to-Usev.s. Security

open-uri, Easy-to-Use and Extensible Virtual File System – p. 74

Page 75: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Easy-to-Use v.s. Security• HTTP_PROXY• http://user:pass@host/• redirection and taint• File.open(uri)

open-uri, Easy-to-Use and Extensible Virtual File System – p. 75

Page 76: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

VFSVirtual File

Systemopen-uri, Easy-to-Use and Extensible Virtual File System – p. 76

Page 77: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

VFS• Why VFS?• What is VFS• VFS and polymorphism• Polymorphic open• Other Resources• Other Operations• Security Considerations

open-uri, Easy-to-Use and Extensible Virtual File System – p. 77

Page 78: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Why VFS?Typical simple program:

• Load an external resource• Process the resource• Store the result

VFS ease the first step.

open-uri, Easy-to-Use and Extensible Virtual File System – p. 78

Page 79: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

What is VFSVFS provides:

• open a http/ftp/... resource• read a http/ftp/... resource• etc.

filesystem like operations fornon-filesystem targetPolymorphism of filesystem

open-uri, Easy-to-Use and Extensible Virtual File System – p. 79

Page 80: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

VFS and polymorphismThe polymorphism can be implementedby:

• usual method dispatch mechanism• own mechanism

open-uri uses the method dispatch forthe polymorphism.

open-uri, Easy-to-Use and Extensible Virtual File System – p. 80

Page 81: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Polymorphic openIf open-uri is in effect:

• open("http://...") callsURI("http://...").open

• open("ftp://...") callsURI("ftp://...").open

• etc.

Any URI can be opened if the URI hasopen method.

open-uri, Easy-to-Use and Extensible Virtual File System – p. 81

Page 82: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Other ResourcesLDAP:class URI::LDAPdef open(*args)

...end

end

open("ldap://...") { ... }

open-uri, Easy-to-Use and Extensible Virtual File System – p. 82

Page 83: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Other Operations• URI("http://...").read• Other operations should be defined

for polymorphic to Pathname in future.

open-uri, Easy-to-Use and Extensible Virtual File System – p. 83

Page 84: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Security Considerations• open("|...")• File.open is not affected

open-uri, Easy-to-Use and Extensible Virtual File System – p. 84

Page 85: open-uri, Easy-to-Use and Extensible Virtual File System · 2019-09-12 · open-uri, Easy-to-Use and Extensible Virtual File System Tanaka Akira akr@m17n.org Free Software Initiative

Summary• How to design Easy-to-Use API

• Save brain power• Evolve gradually

• VFS by open-uri

open-uri, Easy-to-Use and Extensible Virtual File System – p. 85