Slide 1

Slide 1 text

What I Talk about When I Talk about CLI Tool ίϚϯυϥΠϯπʔϧʹ͍ͭͯޠΔͱ͖ʹ๻ͷޠΔ͜ͱ https://www.flickr.com/photos/36247316@N00/3108399560

Slide 2

Slide 2 text

I’m Taichi Nakashima @deeeet tcnksm https://www.flickr.com/photos/flcherb/7781533580

Slide 3

Slide 3 text

https://www.flickr.com/photos/flcherb/7781533580

Slide 4

Slide 4 text

https://www.flickr.com/photos/flcherb/7781533580

Slide 5

Slide 5 text

https://www.flickr.com/photos/flcherb/7781533580

Slide 6

Slide 6 text

What I Talk about When I Talk about CLI Tool ίϚϯυϥΠϯπʔϧʹ͍ͭͯޠΔͱ͖ʹ๻ͷޠΔ͜ͱ https://www.flickr.com/photos/36247316@N00/3108399560

Slide 7

Slide 7 text

ຊൃදʹ͸ݸਓతͳࢥ૝ؚ͕·Ε͍ͯ·͢ Warning https://www.flickr.com/photos/flcherb/7781533580

Slide 8

Slide 8 text

ຊൃදʹ͸Perlͷ࿩ؚ͕·Ε͍ͯ·ͤΜ Warning ͨͩɼ͋ΒΏΔݴޠͰ࣮ݱՄೳͳ࿩Λ͠·͢ https://www.flickr.com/photos/flcherb/7781533580

Slide 9

Slide 9 text

Background https://www.flickr.com/photos/flcherb/7781533580

Slide 10

Slide 10 text

https://www.flickr.com/photos/flcherb/7781533580 ੈͷதʹ͸ ྑ͍$-*πʔϧͱ ͦ͏Ͱͳ͍πʔϧ͕͋Δ

Slide 11

Slide 11 text

https://www.flickr.com/photos/flcherb/7781533580 ͦͷࠩ͸୯७ͳ͜ͱΛ ࣮ફ͢Δ͜ͱͰॖΊΔ ͜ͱ͕Ͱ͖Δ ౰ͨΓલա͗ͯ͋·ΓޠΒΕͳ͍

Slide 12

Slide 12 text

https://www.flickr.com/photos/flcherb/7781533580 ࣗ෼͸ԿΛ࣮ફ͍ͯ͠Δ͔ʁ

Slide 13

Slide 13 text

طʹ࡞͍ͬͯΔͻͱ https://www.flickr.com/photos/flcherb/7781533580 ࡞ͬͨ͜ͱͳ͍ͻͱ → ݟ௚͠ͷػձʹ → ͙͢ʹΤσΟλΛ։͚ΔΑ͏ʹ

Slide 14

Slide 14 text

lྑ͍z$-*πʔϧͱ͸ʁ ͍͔ʹlྑ͍z$-*πʔϧΛ࡞Γ࢝ΊΔ͔ʁ What is “Good” CLI tool ? How to start to create “Good” CLI tool ? https://www.flickr.com/photos/36247316@N00/3108399560

Slide 15

Slide 15 text

lྑ͍z$-*πʔϧͱ͸ʁ ͍͔ʹlྑ͍z$-* What is “Good” CLI tool ? How to start to create “Good” CLI tool ? https://www.flickr.com/photos/36247316@N00/3108399560

Slide 16

Slide 16 text

#1 ͭͷ͜ͱʹूத͍ͯ͠Δ ௚ײతʹ࢖͑Δ ଞͷπʔϧͱ࿈ܞͰ͖Δ ར༻Λॿ͚ͯ͘ΕΔ ద੾ͳσϑΥϧτ஋Λ࣋ͪઃఆ΋Ͱ͖Δ ۤ௧ͳ͘ΠϯετʔϧͰ͖Δ ͙͢ʹվमͰ͖Δ #2 #3 #4 #5 #6 #7 https://www.flickr.com/photos/36247316@N00/3108399560

Slide 17

Slide 17 text

Good CLI Tool #1 Keep It Simple, Stupid ! ͭͷ͜ͱʹूத͍ͯ͠Δ https://www.flickr.com/photos/110382334@N05/11302995614

Slide 18

Slide 18 text

https://www.flickr.com/photos/110382334@N05/11302995614

Slide 19

Slide 19 text

খ͍͞΋ͷ͸ඒ͍͠ 4NBMMJTCFBVUJGVM ͭͷϓϩάϥϜʹ͸ ͭͷ͜ͱΛ͏·͘΍ΒͤΔ .BLFFBDIQSPHSBNEPPOFUIJOHXFMM https://www.flickr.com/photos/110382334@N05/11302995614

Slide 20

Slide 20 text

https://www.flickr.com/photos/110382334@N05/11302995614 ̎ͭҎ্ͷ͜ͱΛ΍Ζ͏ͱ ͢Δ͚ͩͰෳࡶ౓͸૿͢ ཧղͰ͖ͳ͍ɾशಘͰ͖ͳ͍ ϝϯςφϯεͰ͖ͳ͍

Slide 21

Slide 21 text

Good CLI Tool #2 Intuitive UI/UX ௚ײతʹ࢖͑Δ https://www.flickr.com/photos/hindrik/5568789280

Slide 22

Slide 22 text

$-*πʔϧʹ΋6*69 $-*πʔϧͷྺ࢙͸௕͍ ׳श͕ଘࡏ͢Δ https://www.flickr.com/photos/hindrik/5568789280

Slide 23

Slide 23 text

Command Pattern https://www.flickr.com/photos/hindrik/5568789280

Slide 24

Slide 24 text

> grep —i -C 4 "some string" /tmp https://www.flickr.com/photos/hindrik/5568789280

Slide 25

Slide 25 text

> grep —i -C 4 "some string" /tmp &YFDVUBCMF https://www.flickr.com/photos/hindrik/5568789280

Slide 26

Slide 26 text

> grep —i -C 4 "some string" /tmp &YFDVUBCMF 0QUJPOT https://www.flickr.com/photos/hindrik/5568789280

Slide 27

Slide 27 text

> grep —i -C 4 "some string" /tmp &YFDVUBCMF 0QUJPOT "SHVNFOUT https://www.flickr.com/photos/hindrik/5568789280

Slide 28

Slide 28 text

> git --no-pager push -v origin master https://www.flickr.com/photos/hindrik/5568789280

Slide 29

Slide 29 text

> git --no-pager push -v origin master &YFDVUBCMF https://www.flickr.com/photos/hindrik/5568789280

Slide 30

Slide 30 text

> git --no-pager push -v origin master &YFDVUBCMF $PNNBOE https://www.flickr.com/photos/hindrik/5568789280

Slide 31

Slide 31 text

> git --no-pager push -v origin master &YFDVUBCMF (MPCBM 0QUJPOT $PNNBOE https://www.flickr.com/photos/hindrik/5568789280

Slide 32

Slide 32 text

> git --no-pager push -v origin master &YFDVUBCMF (MPCBM 0QUJPOT $PNNBOE $PNNBOE 0QUJPOT https://www.flickr.com/photos/hindrik/5568789280

Slide 33

Slide 33 text

> git --no-pager push -v origin master &YFDVUBCMF (MPCBM 0QUJPOT $PNNBOE $PNNBOE 0QUJPOT "SHVNFOUT https://www.flickr.com/photos/hindrik/5568789280

Slide 34

Slide 34 text

Option Pattern https://www.flickr.com/photos/hindrik/5568789280

Slide 35

Slide 35 text

> grep —i -C 4 "some string" /tmp https://www.flickr.com/photos/hindrik/5568789280

Slide 36

Slide 36 text

> grep —i -C 4 "some string" /tmp 4XJUDI Ҿ਺Λ൐Θͳ͍ https://www.flickr.com/photos/hindrik/5568789280

Slide 37

Slide 37 text

> grep —i -C 4 "some string" /tmp 4XJUDI Ҿ਺Λ൐Θͳ͍ 'MBH Ҿ਺Λ൐͏ https://www.flickr.com/photos/hindrik/5568789280

Slide 38

Slide 38 text

> grep —i > grep --ignore-case https://www.flickr.com/photos/hindrik/5568789280

Slide 39

Slide 39 text

> grep —i > grep --ignore-case 4IPSU ߴ଎ʹ࢖͏ͨΊʹ https://www.flickr.com/photos/hindrik/5568789280

Slide 40

Slide 40 text

> grep —i > grep --ignore-case 4IPSU -POH ߴ଎ʹ࢖͏ͨΊʹ ՄಡੑΛߴΊΔ https://www.flickr.com/photos/hindrik/5568789280

Slide 41

Slide 41 text

(/6ඪ४ΠϯλʔϑΣʔε cf. https://www.gnu.org/prep/standards/html_node/ Command_002dLine-Interfaces.html https://www.flickr.com/photos/hindrik/5568789280

Slide 42

Slide 42 text

https://www.flickr.com/photos/hindrik/5568789280 My Interface design

Slide 43

Slide 43 text

https://www.flickr.com/photos/hindrik/5568789280 ࠷΋΍Γ͍ͨ͜ͱΛ࠷΋؆୯ʹ Φϓγϣϯ͕ඞཁͳΒShortΦϓγϣϯΛ४උ͢Δ σϑΥϧτͰഁյతૢ࡞Λ͠ͳ͍ ର࿩ΠϯλʔϑΣʔεΛආ͚Δ LongΦϓγϣϯΛ४උ͢Δ e.g., —force ࣗಈԽͷ๦͛ʹͳΔ

Slide 44

Slide 44 text

Good CLI Tool #3 Play well with others ଞͷπʔϧͱ࿈ܞͰ͖Δ https://www.flickr.com/photos/alexsk/3251194325

Slide 45

Slide 45 text

$-*πʔϧ͸ଞͷεΫϦϓτ ͔Βݺͼग़͞ΕΔ 4IFMMTDSJQU΍$SPO $IFG %PDLFSpMF https://www.flickr.com/photos/alexsk/3251194325

Slide 46

Slide 46 text

Exit Code https://www.flickr.com/photos/alexsk/3251194325

Slide 47

Slide 47 text

exit 0 exit 1 nonzero ੒ޭ ࣦഊ https://www.flickr.com/photos/alexsk/3251194325

Slide 48

Slide 48 text

Output Stream https://www.flickr.com/photos/alexsk/3251194325

Slide 49

Slide 49 text

stdout stderr Τϥʔϝοηʔδ ϑΝΠϧʹॻ͖ग़͍ͨ͠ ύΠϓͰ౉͍ͨ͠ https://www.flickr.com/photos/alexsk/3251194325 ඪ४Τϥʔ ඪ४

Slide 50

Slide 50 text

Good CLI Tool #4 Documentation ར༻Λॿ͚ͯ͘ΕΔ https://www.flickr.com/photos/jjpacres/3293117576

Slide 51

Slide 51 text

υΩϡϝϯτ΍6TBHF͕ ଘࡏ͠ͳ͍πʔϧͳͲ ୭΋࢖͍ͨ͘ͳ͍ ར༻౓ʹ߹ΘͤͨυΩϡϝϯτΛ४උ͢Δ https://www.flickr.com/photos/jjpacres/3293117576

Slide 52

Slide 52 text

Document Pattern https://www.flickr.com/photos/jjpacres/3293117576

Slide 53

Slide 53 text

ར༻ස౓ https://www.flickr.com/photos/jjpacres/3293117576

Slide 54

Slide 54 text

ར༻ස౓ 3&"%.&NE ࢖͏͔൱͔Λ൑அ͢Δ https://www.flickr.com/photos/jjpacres/3293117576

Slide 55

Slide 55 text

ར༻ස౓ 3&"%.&NE 6TBHF ࢖͏͔൱͔Λ൑அ͢Δ πʔϧΛಈ͔ͨ͢Ίʹ ࠷௿ݶ஌Δ΂͖ ࢖͍ํΛཧղ͢Δ IFMQI https://www.flickr.com/photos/jjpacres/3293117576

Slide 56

Slide 56 text

ར༻ස౓ 3&"%.&NE 6TBHF .BO ࢖͏͔൱͔Λ൑அ͢Δ πʔϧΛಈ͔ͨ͢Ίʹ ࠷௿ݶ஌Δ΂͖ ࢖͍ํΛཧղ͢Δ ෳࡶͳྫ΍ ΑΓॊೈʹ࢖͏ͨΊ ͷΦϓγϣϯΛൃݟ͢Δ IFMQI https://www.flickr.com/photos/jjpacres/3293117576

Slide 57

Slide 57 text

Good CLI Tool #5 Configurable ద੾ͳσϑΥϧτ஋Λ࣋ͪ ઃఆ΋Ͱ͖Δ https://www.flickr.com/photos/dwilkin/12153072866

Slide 58

Slide 58 text

ϢʔβʹແବͳೖྗΛ ͤ͞ͳ͍ https://www.flickr.com/photos/dwilkin/12153072866

Slide 59

Slide 59 text

ϢʔβʹແବͳೖྗΛ ͤ͞ͳ͍ ͕ ޷͖ʹઃఆ΋Ͱ͖Δ https://www.flickr.com/photos/dwilkin/12153072866 શһΛຬ଍ͤ͞Δ͜ͱ͸Ͱ͖ͳ͍

Slide 60

Slide 60 text

Configuration Pattern https://www.flickr.com/photos/dwilkin/12153072866

Slide 61

Slide 61 text

༏ઌ౓ https://www.flickr.com/photos/dwilkin/12153072866

Slide 62

Slide 62 text

༏ઌ౓ σϑΥϧτ஋ https://www.flickr.com/photos/dwilkin/12153072866

Slide 63

Slide 63 text

༏ઌ౓ σϑΥϧτ஋ ઃఆϑΝΠϧ ਓ͕ؒಡΊΔ΋ͷ(json/YAML/DSL/HCL) https://www.flickr.com/photos/dwilkin/12153072866

Slide 64

Slide 64 text

༏ઌ౓ σϑΥϧτ஋ ઃఆϑΝΠϧ ؀ڥม਺ ਓ͕ؒಡΊΔ΋ͷ(json/YAML/DSL/HCL) https://www.flickr.com/photos/dwilkin/12153072866

Slide 65

Slide 65 text

༏ઌ౓ σϑΥϧτ஋ ઃఆϑΝΠϧ ؀ڥม਺ ΦϓγϣϯҾ਺ ਓ͕ؒಡΊΔ΋ͷ(json/YAML/DSL/HCL) https://www.flickr.com/photos/dwilkin/12153072866

Slide 66

Slide 66 text

Good CLI Tool #6 Painless Installation ۤ௧ͳ͘ΠϯετʔϧͰ͖Δ https://www.flickr.com/photos/midorisyu/752223850

Slide 67

Slide 67 text

ର৅Ϣʔβʹ߹ͬͨ Πϯετʔϧํ๏ .BDϢʔβʹ͸ʁ1FSMϢʔβʹ͸ʁ https://www.flickr.com/photos/midorisyu/752223850

Slide 68

Slide 68 text

1 Command Install https://www.flickr.com/photos/midorisyu/752223850

Slide 69

Slide 69 text

> brew install > apt-get install > yum install > cpan > gem install > pip install https://www.flickr.com/photos/midorisyu/752223850

Slide 70

Slide 70 text

Good CLI Tool #7 maintainable ͙͢ʹվमͰ͖Δ https://www.flickr.com/photos/damski/7045068945

Slide 71

Slide 71 text

Τϥʔ͸ඞͣىΔ ى͖ͨͱ͖ʹԿ͕ىͬͯΔ͔ ৄࡉ͕֬ೝͰ͖Δ ιʔεΛݟͣʹԿ͕ىͬͯΔ͔Θ͔Δ ιʔεͷͲ͜Λ௚ͤ͹Α͍͔Θ͔Δ https://www.flickr.com/photos/damski/7045068945

Slide 72

Slide 72 text

DEBUG Option https://www.flickr.com/photos/damski/7045068945

Slide 73

Slide 73 text

> tool --debug Φϓγϣϯ https://www.flickr.com/photos/damski/7045068945

Slide 74

Slide 74 text

> tool --debug > export DEBUG=1 > tool Φϓγϣϯ ؀ڥม਺ ։ൃऀ޲͚ https://www.flickr.com/photos/damski/7045068945

Slide 75

Slide 75 text

#1 ͭͷ͜ͱʹूத͍ͯ͠Δ ௚ײతʹ࢖͑Δ ଞͷπʔϧͱ࿈ܞͰ͖Δ ར༻Λॿ͚ͯ͘ΕΔ ద੾ͳσϑΥϧτ஋Λ࣋ͪઃఆ΋Ͱ͖Δ ۤ௧ͳ͘ΠϯετʔϧͰ͖Δ ͙͢ʹվमͰ͖Δ #2 #3 #4 #5 #6 #7 https://www.flickr.com/photos/36247316@N00/3108399560

Slide 76

Slide 76 text

lྑ͍z$-* ͍͔ʹlྑ͍z$-*πʔϧΛ࡞Γ࢝ΊΔ͔ʁ What How to start to create “Good” CLI tool ? https://www.flickr.com/photos/36247316@N00/3108399560

Slide 77

Slide 77 text

#1 ͲΜͳπʔϧΛ࡞Δ͔ߟ͑Δ ݴޠΛબͿ 3&"%.&NEΛॻ͘ #2 #3 https://www.flickr.com/photos/36247316@N00/3108399560 ߴ଎ʹϓϩτλΠϓΛͭ͘Δ %&.0 #4

Slide 78

Slide 78 text

How to start #1 Chance ͲΜͳπʔϧΛ࡞Δ͔ߟ͑Δ https://www.flickr.com/photos/cleopold73/3677296594

Slide 79

Slide 79 text

$-*πʔϧͷ ॳظিಈ ෳࡶͳ࡞ۀΛࣗಈԽ͍ͨ͠ ͋ΔλεΫͷੜ࢈ੑΛߴΊ͍ͨ "1*ͷ$-*ΫϥΠΞϯτཉ͍͠ ʜ https://www.flickr.com/photos/cleopold73/3677296594

Slide 80

Slide 80 text

͍͖ͳΓෳࡶͳ͜ͱΛ͠ͳ͍ ! ͭͷ͜ͱʹूத͢Δ Good CLI Tool #1 https://www.flickr.com/photos/cleopold73/3677296594

Slide 81

Slide 81 text

໰୊ͷҰ෦Λղܾ͢Δ͚ͩͰΑ͍ ! ଞͷπʔϧͱ࿈ܞͰ͖Δ Α͏ʹ͢Δ Good CLI Tool #3 https://www.flickr.com/photos/cleopold73/3677296594

Slide 82

Slide 82 text

How to start #2 Programming language ݴޠΛબͿ https://www.flickr.com/photos/8153468@N04/2668229310

Slide 83

Slide 83 text

ݴޠબ୒͸ πʔϧͷ഑෍ํ๏ʹ௚݁͢Δ ! ۤ௧ͳ͘Πϯετʔϧ ͯ͠΋Β͏͜ͱΛߟ͑Δ Good CLI Tool #6 https://www.flickr.com/photos/8153468@N04/2668229310

Slide 84

Slide 84 text

(P ͋ΒΏΔϓϥοτϑΥʔϜ ͷϢʔβΛର৅ʹ 1FSM Perl mongerΛର৅ʹ SVCZ rubyistΛର৅ʹ https://www.flickr.com/photos/8153468@N04/2668229310 ˠόΠφϦμ΢ϯϩʔυͰ ˠHFNͰ ˠDQBOͰ

Slide 85

Slide 85 text

How to start #3 README Driven Development 3&"%.&NEΛॻ͘ https://www.flickr.com/photos/alessiorr/14144160337

Slide 86

Slide 86 text

README Driven Development https://www.flickr.com/photos/alessiorr/14144160337

Slide 87

Slide 87 text

ίʔυΛॻ͘લʹ 3&"%.&NEΛॻ͘ ໊લΛߟ͑Δɼ $-*πʔϧ͕ԿΛ͢Δ΋ͷͳͷ͔Λߟ͑Δɼ $-*πʔϧͷΠϯλʔϑΣʔε ࢖͍ํ Λߟ͑Δ https://www.flickr.com/photos/alessiorr/14144160337

Slide 88

Slide 88 text

ࣗ෼͕ԿΛ࡞Γ͍ͨͷ͔ ੔ཧ্ͨ͠Ͱ࡞Γ࢝ΊΒΕΔ https://www.flickr.com/photos/alessiorr/14144160337

Slide 89

Slide 89 text

No content

Slide 90

Slide 90 text

Ϣʔβࢹ఺ͰσβΠϯͰ͖Δ https://www.flickr.com/photos/alessiorr/14144160337

Slide 91

Slide 91 text

൪ςϯγϣϯ͕ߴ͍ͱ͖ʹ υΩϡϝϯτ͕ॻ͚Δ ࡞ΓऴΘͬͨޙʹυΩϡϝϯτΛ੔උ͢Δ ͷ͸͠ΜͲ͍ʜ https://www.flickr.com/photos/alessiorr/14144160337

Slide 92

Slide 92 text

NAME ==== ! ## Description ! ## Usage ! ## VS. https://www.flickr.com/photos/alessiorr/14144160337

Slide 93

Slide 93 text

ස౓͕ߴ͍ͳΒͰ͖Δ͚ͩ ୹໊͍લΛ෇͚Δ ස౓͕௿͍ͳΒ આ໌తͳ໊લΛ෇͚Δ = ίϚϯυ໊ NAME ==== ! ## Description ! ## Usage ! ## VS. ໊લ https://www.flickr.com/photos/alessiorr/14144160337

Slide 94

Slide 94 text

͜Ε͸ͲΜͳπʔϧͳͷ͔ʁ ͭͷ͜ͱʹूத͍ͯ͠Δ Good CLI Tool #1 = ୹͘؆ܿͳઆ໌͕ॻ͚Δ NAME ==== ! ## Description ! ## Usage ! ## VS. આ໌ https://www.flickr.com/photos/alessiorr/14144160337

Slide 95

Slide 95 text

ΠϯλʔϑΣʔεͷఆٛ ௚ײతʹ࢖͑Δ Good CLI Tool #2 Ϣʔβͷࢹ఺Ͱ ࠷΋΍Β͍ͤͨ͜ͱΛ ࠷΋؆୯ʹͰ͖ΔΑ͏ʹ NAME ==== ! ## Description ! ## Usage ! ## VS. ࢖͍ํ https://www.flickr.com/photos/alessiorr/14144160337

Slide 96

Slide 96 text

ൺֱ ଞͷπʔϧͱͷൺֱ NAME ==== ! ## Description ! ## Usage ! ## VS. ࣅͨΑ͏ͳπʔϧ͸ଘࡏ͢Δ શ͘ಉ͡΋ͷΛ࡞ͬͯ΋ ҙຯͳ͍ ࣅͨπʔϧͱൺ΂ͯ! Կ͕༏Ε͍ͯΔͷ͔Λߟ͑Δ! → πʔϧͷಛ௃ʹͳΔ https://www.flickr.com/photos/alessiorr/14144160337

Slide 97

Slide 97 text

όοδ όοδͷ४උ = CI as a Service ͷઃఆ = ͸͡Ί͔Βςετ؀ڥΛ! ४උ͢Δ ςετ݁ՌΛϢʔβʹ ݟͤଓ͚Δ͜ͱͰ ςετΛॻ͘Ϟνϕʔγϣϯ Λอͪଓ͚Δ NAME ==== ! ## Description ! ## Usage ! ## VS. https://www.flickr.com/photos/alessiorr/14144160337

Slide 98

Slide 98 text

https://www.flickr.com/photos/sergiu_bacioiu/4664215911 How to start #4 ߴ଎ʹϓϩτλΠϓΛ࡞Δ Build a prototype as soon as possible

Slide 99

Slide 99 text

https://www.flickr.com/photos/sergiu_bacioiu/4664215911

Slide 100

Slide 100 text

https://www.flickr.com/photos/sergiu_bacioiu/4664215911

Slide 101

Slide 101 text

LIVE https://www.flickr.com/photos/sergiu_bacioiu/4664215911

Slide 102

Slide 102 text

(PݴޠΛ࢖ͬͯ $-*πʔϧΛ࡞੒ɼ ΫϩείϯύΠϧͯ͠ (JUIVCʹϦϦʔεʂ https://www.flickr.com/photos/sergiu_bacioiu/4664215911

Slide 103

Slide 103 text

(PݴޠΛ࢖ͬͯ $-*πʔϧΛ࡞੒ɼ ΫϩείϯύΠϧͯ͠ (JUIVCʹϦϦʔεʂ https://www.flickr.com/photos/sergiu_bacioiu/4664215911 tcnksm/cli-init mitchellh/gox tcnksm/ghr codegansta/cli

Slide 104

Slide 104 text

#1 ͭͷ͜ͱʹूத͍ͯ͠Δ ௚ײతʹ࢖͑Δ ଞͷπʔϧͱ࿈ܞͰ͖Δ ར༻Λॿ͚ͯ͘ΕΔ ద੾ͳσϑΥϧτ஋Λ࣋ͪઃఆ΋Ͱ͖Δ ۤ௧ͳ͘ΠϯετʔϧͰ͖Δ ͙͢ʹվमͰ͖Δ #2 #3 #4 #5 #6 #7 https://www.flickr.com/photos/36247316@N00/3108399560

Slide 105

Slide 105 text

#1 ͲΜͳπʔϧΛ࡞Δ͔ߟ͑Δ ݴޠΛબͿ 3&"%.&NEΛॻ͘ #2 #3 https://www.flickr.com/photos/36247316@N00/3108399560 ߴ଎ʹϓϩτλΠϓΛͭ͘Δ %&.0 #4