Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GNU Make勉強会 / GNU Make Exercise

Pudding
August 30, 2020

GNU Make勉強会 / GNU Make Exercise

あくあたん工房でGNU Makeの勉強に使用した資料です。

リポジトリ:https://github.com/pddg/gnu-make-exercise

Pudding

August 30, 2020
Tweet

More Decks by Pudding

Other Decks in Programming

Transcript

  1. .BLFpMF 7 ˔ NBLFͷಈ࡞Λఆٛ͢Δ ˓ UBSHFUɿੜ੒͢Δ λʔήοτϑΝΠϧ܈ ˓ QSFSFRɿUBSHFUͷ ੜ੒ʹඞཁͳϑΝΠϧ܈

    ˓ DPNNBOEɿUBSHFUΛ ੜ੒͢ΔίϚϯυ܈ ˔ ஫ҙɿΠϯσϯτ͸λϒ # コメントは `#` で始める # prereqが無い場合 target1: command1 # targetとして定義した物を # 他のtargetのprereqにできる target4: target1 command1 # それぞれの要素は複数定義可 target2 target3: prereq1 prereq2 command1 command2
  2. ґଘάϥϑ 8 # コメントは `#` で始める # prereqが無い場合 target1: command1

    # targetとして定義した物を # 他のtargetのprereqにできる target4: target1 command1 # それぞれの要素は複数定義可 target2 target3: prereq1 prereq2 command1 command2 UBSHFU UBSHFU DPNNBOE DPNNBOE DPNNBOE DPNNBOE UBSHFU UBSHFU QSFSFR QSFSFR
  3. $ make target4 9 # コメントは `#` で始める # prereqが無い場合

    target1: command1 # targetとして定義した物を # 他のtargetのprereqにできる target4: target1 command1 # それぞれの要素は複数定義可 target2 target3: prereq1 prereq2 command1 command2 UBSHFU UBSHFU DPNNBOE DPNNBOE DPNNBOE DPNNBOE UBSHFU UBSHFU QSFSFR QSFSFR
  4. 10 # コメントは `#` で始める # prereqが無い場合 target1: command1 #

    targetとして定義した物を # 他のtargetのprereqにできる target4: target1 command1 # それぞれの要素は複数定義可 target2 target3: prereq1 prereq2 command1 command2 UBSHFU UBSHFU DPNNBOE DPNNBOE DPNNBOE DPNNBOE UBSHFU UBSHFU QSFSFR QSFSFR $ make target4
  5. 11 # コメントは `#` で始める # prereqが無い場合 target1: command1 #

    targetとして定義した物を # 他のtargetのprereqにできる target4: target1 command1 # それぞれの要素は複数定義可 target2 target3: prereq1 prereq2 command1 command2 UBSHFU UBSHFU DPNNBOE DPNNBOE DPNNBOE DPNNBOE UBSHFU UBSHFU QSFSFR QSFSFR $ make target4
  6. 12 # コメントは `#` で始める # prereqが無い場合 target1: command1 #

    targetとして定義した物を # 他のtargetのprereqにできる target4: target1 command1 # それぞれの要素は複数定義可 target2 target3: prereq1 prereq2 command1 command2 UBSHFU UBSHFU DPNNBOE DPNNBOE $ make target4 طʹ྆ํଘࡏ͠ɺ͔ͭɺ UBSHFUͷํ͕ΑΓ΋ߋ৽೔͕ݹ͍ ˣ Կ΋͠ͳ͍ طʹ྆ํଘࡏ͢Δ͕ɺ UBSHFUͷํ͕ΑΓ΋ߋ৽೔͕৽͍͠ ˣ UBSHFUΛࢦఆ͞ΕͨίϚϯυͰ࠶࡞੒
  7. ݱ୅ʹ͓͚Δ.BLFͷ࢖͍Ͳ͜Ζ 16 ˔ Ұͭͷݴޠͷείʔϓʹऩ·Βͳ͍ɺෳࡶͳૢ࡞΍ ଟ਺ͷΦϓγϣϯ෇͖ͷίϚϯυͷΤΠϦΞε ˓ ΫϩεϏϧυɾEPDLFSΛ࢖ͬͨϏϧυͳͲ ˓ MJOU΍୯ମςετͷ࣮ߦ ˓

    Ϗϧυ੒Ռ෺ͷύοέʔδϯά ˓ QSPUPDΛ࢖ͬͨίʔυੜ੒ͳͲ ˔ ϓϩδΣΫτϝϯόʔͱ࡞ۀख๏ͷڞ༗͕Ͱ͖Δ ˓ ෳࡶͳૢ࡞ΛӅṭ͠ɺ։ൃΛޮ཰Խ ˓ ֮͑΍͍͢ڞ௨ݴޠͱͯ͠ͷ.BLFpMF
  8. λʔήοτͱٙࣅλʔήοτ 23 ˔ .BLFͷλʔήοτ͸࣮ࡏ͢Δʢ·ͨ͸͜Ε͔Β ੜ੒͢ΔʣϑΝΠϧ܈Λࢦ͢ ˔ Ͱ͸Α͘ݟΔmake clean΍make install͸ʁ ˓

    ͜ΕΒ͸ٙࣅλʔήοτͱݺ͹ΕΔ ˓ ࢦఆ͞Εͨͱ͖ৗʹ࣮ߦ͞ΕΔλʔήοτ ˓ DMFBO΍JOTUBMMͱ͍͏ϑΝΠϧ͕͋ͬͯ΋ײ஌͠ͳ͍ ˓ .BLFͷػೳͰ͸ͳ͍ͷͰɺͦΕΒͷॲཧ͸ࣗ෼Ͱ ॻ͘ඞཁ͕͋Δɻ &Y1IPOZUBSHFU
  9. .PHONY 24 ˔ ٙࣅλʔήοτʹ͢Δʹ͸ ಛघͳλʔήοτͰ͋Δ .PHONYͷQSFSFRͱͯ͠ ࢦఆ͢Δ ˔ ෳ਺ʹ෼͚ͯॻ͘͜ͱ΋ɺ Ұͭʹ·ͱΊͯॻ͘͜ͱ΋

    ग़དྷΔ # ターゲット一つずつに設定する場合 .PHONY: hoge hoge: fuga .PHONY: piyo piyo: poyo ˞ 1IPOZɿʹͤ΋ͷɾ·͕͍΋ͷ IUUQTEJDUJPOBSZHPPOFKQXPSEFOQIPOZ # まとめて設定する場合 .PHONY: hoge piyo hoge: fuga piyo: poyo &Y1IPOZUBSHFU
  10. ม਺ 27 ˔ ͜͜·Ͱ͸શͯϋʔυίʔσΟϯά͖ͯͨ͠ ˓ ࣅͨΑ͏ͳϧʔϧ͕ଟ਺͋ΔͱɺԿ͔վળ͢Δͨͼʹ ଟ਺ͷมߋΛඞཁͱͯ͠͠·͏ ˔ ͦ͜Ͱม਺Λར༻͢Δ ˓

    ܕͷΑ͏ͳ΋ͷ͸ແ͍ ˓ ୯ʹͦͷม਺Λར༻ͨ͠ࡍՕॴ͕ɺͦͷม਺ͷ஋ ʢจࣈྻʣʹஔ׵͞ΕΔɺͱߟ͑Δͱ$ͷdefine ͳͲʹ͍ۙ &Y7BSJBCMF
  11. 28 ˔ l変数名=値zͰએݴͰ͖Δ ˔ ࢖༻࣌͸l$(変数名)z ˔ એݴͨ͠৔ॴ͸ؔ܎ແ͍ ˓ શ෦ΛಡΈࠐΜͰ͔Βม ਺ͷ஋Λల։͢ΔͨΊ

    ˓ ಉ໊ͷม਺ͷ஋͸࠷ޙʹ એݴ͞Εͨ΋ͷͰ্ॻ͖ # コンパイラを変数化 CC=gcc hello: main.c $(CC) -o hello main.c # targetやprereqにも使える SRC_FILES=a.txt b.txt c.txt MERGED_FILE=merged.txt $(MERGED_FILE): $(SRC_FILES) cat $(SRC_FILES) \ > $(MERGED_FILE) ม਺ &Y7BSJBCMF # 表示されるのは2.0.0 VERSION=1.0.0 .PHONY: print_version print_version: echo $(VERSION) VERSION=2.0.0
  12. 29 ˔ ࣄલʹఆٛ͞Ε͍ͯΔ ಛघͳม਺΋ଘࡏ͢Δ ˔ ίϚϯυͰ࢖͑Δࣗಈม਺ ͱ͍͏΋ͷ΋͋Δ ˓ ίϚϯυதͷλʔήοτ ໊ͳͲͷϋʔυίʔυΛ

    ๷͛Δ ˔ σϑΥϧτλʔήοτ͸ .DEFAULT_GOALͰઃఆ .PHONY: print print: # 使用するMakeのバージョン echo $(MAKE_VERSION) # 指定されたターゲット一覧 echo "$(MAKECMDGOALS)" # 変数一覧 echo "$(.VARIABLES)" # カレントディレクトリのパス echo $(CURDIR) ಛघͳม਺ &Y7BSJBCMF # $< → prereqの最初の一つ # $@ → ターゲット名 main.o: main.c gcc -c $< -o $@ # $^ → prereqの一覧 hello: main.o gcc $^ -o $@ # 単にmakeと実行されたとき # helloをターゲットとする .DEFAULT_GOAL=hello
  13. 30 ˔ .BLFpMFͷ֎෦͔Βม਺Λ ౉͢ํ๏͸छྨ ˔ ؀ڥม਺ ˓ தͰఆ͍ٛͯ͠Δ஋Λ ্ॻ͖Ͱ͖ͳ͍ ˔

    NBLFͷҾ਺ ˓ தͰఆ͍ٛͯ͠Δ஋Λ ্ॻ͖Ͱ͖Δ # Makefileの中身 VAR=hoge # これは定義済み扱い DEFINED= .PHONY: print print: @echo $(VAR) @echo $(DEFINED) @echo $(ENV_VAR) ֎෦͔Β஋Λ౉͢ &Y7BSJBCMF # 環境変数 $ VAR=fuga DEFINED=hoge ENV_VAR=piyo \ make print hoge piyo # makeの引数 $ make print \ VAR=fuga DEFINED=hoge ENV_VAR=piyo fuga hoge piyo
  14. ໰୊ઃఆ 31 ˔ ҎԼͷཁ݅Λຬͨ͢Α͏ʹɺ.BLFpMFʹมߋΛՃ͑Αɻ ˓ $47ϑΝΠϧΛੜ੒͢ΔϓϩάϥϜ͕มߋʹͳͬͨ ࡍʹɺมߋՕॴ͕ՕॴͰࡁΉ ˓ ੜ੒͢Δσʔλྔʢ-n 10ʣ͕มߋʹͳͬͨͱ͖

    ʢྫ͑͹-n 100ʣʹมߋՕॴ͕ՕॴͰࡁΉ ˔ ͨͩ͠ɺ$47ϑΝΠϧ͸HFO@EBUBQZΛ༻͍ͯੜ੒͢Δ΋ͷ ͱ͠ɺHFO@EBUBQZࣗମΛมߋ͢Δ͜ͱ͸ෆՄͱ͢Δɻ &Y7BSJBCMF
  15. 33 ˔ ͋Δ֦ுࢠΛ࣋ͭϑΝΠϧ Λੜ੒͢Δͱ͖ɺଟ͘ͷ৔ ߹ͦͷϧʔϧ͸ͲΕ΋ಉ͡ Ͱ͋Δ ˔ % ΛϫΠϧυΧʔυͱͯ͠ ࢖༻Ͱ͖Δ

    ˓ ࣗಈม਺Λ͏·͘ ׆༻͢Δͱྑ͍ # .cから.oを生成するルール %.o: %.c gcc -o $@ $< # .oから実行バイナリを作るルール %: %.o gcc -o $@ $^ ύλʔϯϚον &Y1BUUFSO
  16. ҉໧ͷϧʔϧ 34 ˔ .BLFʹ͸ࣄલʹఆٛ͞Εͨ҉໧ͷϧʔϧ͕ଘࡏ͢Δ ˓ ྫ͑͹ %.o: %.c $(COMPILE.c) $(OUTPUT_OPTION)

    $< ˔ શͯͷ҉໧ͷϧʔϧ͸make --print-data-baseͰ දࣔͰ͖Δ &Y1BUUFSO
  17. 37 ˔ .BLFpMFதͷม਺͸جຊత ʹશͯάϩʔόϧͰ͋Δ ˔ ޙ͔Βఆٛ͠௚͢ͱɺͦͷ ஋͸্ॻ͖͞Εͯ͠·͏ ˔ ಛఆͷϧʔϧ͚ͩ஋Λม͑ ͍ͨʜʜͱ͍͏৔߹ɺӈͷ

    ํ๏Ͱ͸μϝ # 表示されるのはどちらも2.0.0 VERSION=1.0.0 .PHONY: print_version print_version: echo $(VERSION) VERSION=2.0.0 .PHONY: print_version2 print_version2: echo $(VERSION) ม਺ͷείʔϓ &Y1BUUFSO5BSHFU4QFDJpD7BSJBCMF
  18. 38 ˔ ಛఆͷείʔϓʹݶͬͯม ਺ͷ஋Λมߋ͢Δ ˓ ಛఆͷύλʔϯʹϚον ͢Δ৔߹ ˓ ಛఆͷλʔήοτͷ৔߹ ˔

    ্ॻ͖͢Δ͜ͱʹ஫ҙ ˓ BQQFOEͰ͸ແ͍ # make print_version # → 1.0.0が表示される # make print_version2 # → 2.0.0が表示される .PHONY: print_version .PHONY: print_version2 print_version: VERSION=1.0.0 print_version2: VERSION=2.0.0 print_version print_version2: echo $(VERSION) ݻ༗ͷม਺ &Y1BUUFSO5BSHFU4QFDJpD7BSJBCMF
  19. 42 ˔ ؀ڥม਺ͱ૊Έ߹Θͤͯ ࢖͏ͳͲ ˔ ؀ڥม਺ʹର͢Δ σϑΥϧτ஋ͷఆٛʹ͸ ?=Λ࢖ͬͨํ͕εϜʔζʹ ॻ͚Δ ˔

    ݸਓతʹ͸͋·Γ࢖͍ Ͳ͜Ζ͕ͳ͍ʁ SUDO=sudo ifdef SUDO_USER SUDO=sudo -u $(SUDO_USER) endif .PHONY: install install: $(SUDO) mv hoge /usr/local/bin/ JGEFG &Y$POEJUJPO
  20. 43 ˔ Λ࢖͏ํ๏ͱlzΛ࢖͏ ํ๏͕͋Δɻ ˓ ͷ৔߹ɺલޙͷۭന΋ ൺֱ͞ΕΔ ˓ ΍΍͍͜͠ͷͰޙऀਪ঑ ˔

    "/%ͱ͔03͕ॻ͚ͳ͍ ifeq ($(HOGE),hoge) HOGE=fuga endif # 以下はfalse ifeq (hoge, hoge) HOGE=hoge endif ifeq "$(HOGE)" "hoge" HOGE=fuga endif JGFRɾJGOFR &Y$POEJUJPO
  21. 44 ˔ ৚݅෼ذ͸ίϚϯυͷهड़ ʹ΋࢖͑Δ ˔ ͨͩ͠ɺJGઅશମΛUBCͰ Πϯσϯτͯ͠͠·͏ͱɺ શ͕ͯίϚϯυͱ࣮ͯ͠ߦ ͞Εͯ͠·͏ ˔

    JG৚݅ͷΠϯσϯτ͸ εϖʔεͰߦ͏ # インデントしない方が良い main: ifeq "$(ANOTHER)" “another.c" gcc -o main another.c else gcc -o main main.c endif JGͷΠϯσϯτ &Y$POEJUJPO # タブでインデントするとエラー # # $ make # /bin/sh: 1: ifeq: not found # make: *** [Makefile:2: main] Error 127 main: ifeq "$(ANOTHER)" “another.c" gcc -o main another.c else gcc -o main main.c endif
  22. ؔ਺ 47 ˔ .BLFʹ͸༷ʑͳػೳΛఏڙ͢Δ૊ΈࠐΈؔ਺͕͋Δ ˓ TIFMMɿγΣϧεΫϦϓτΛ࣮ߦ͢Δ ˓ XJMEDBSEɿಛఆͷύλʔϯΛ࣋ͭϑΝΠϧσΟϨΫ τϦΛྻڍ͢Δ ˓

    EJSɿࢦఆ͞ΕͨύεͷσΟϨΫτϦ෦Λநग़͢Δ ˓ TVCTUɿจࣈྻதͷಛఆͷจࣈྻΛஔ׵͢Δ ˓ GPSFBDIɿෳ਺ͷཁૉʹؔ਺Λద༻͢Δ &Y'VODUJPOT
  23. 48 • $(関数名 引数1,引数2) ˔ ஫ҙࣄ߲ ˓ ΧϯϚͷલޙʹۭനΛೖ Εͳ͍ ˓

    $Λ࢖͍͍ͨ৔߹ɺ$$ͱ ͯ͠Τεέʔϓ͢Δ ࢖͍ํ &Y'VODUJPOT # 直下にあるCのソースコードを列挙 C_SRCS=$(wildcard *.c) # ファイル名の.cと.oを置換 O_FILES=$(subst .c,.o,$(C_SRCS)) %.o: %.c echo "gcc -o $@ $<" $(O_FILES): $(C_SRCS) # パイプも使える FILES=$(shell ls -a | grep -v .git) .PHONY: ls ls: echo $(FILES)
  24. ໰୊ઃఆ 49 ˔ ҎԼͷཁ݅Λຬͨ͢.BLFpMFΛॻ͚ ˓ DNEσΟϨΫτϦҎԼʹ͋ΔͭͷίϚϯυΛϏϧυ͠ɺ ͦΕͧΕCJOσΟϨΫτϦҎԼʹ഑ஔ͢Δ ˓ lib/*.go ͱstatik/*.goɺ͓Αͼ֤ίϚϯυͷ(P

    ϑΝΠϧɺgo.mod͕มߋ͞ΕͨΒ࠶౓Ϗϧυ͕૸Δ ˓ makeͱ࣮ߦ͢ΔͱͭͷίϚϯυ͕Ϗϧυ͞Εɺ make cleanͰશͯ࡟আ͞ΕΔ ˔ ͨͩ͠ɺ.BLFpMFதʹ(PͷιʔείʔυϑΝΠϧ໊Λ ϋʔυίʔυͯ͠͸ͳΒͳ͍ ˔ ิ଍ɿgo build -o バイナリへのパス ./cmd/コマンド名 &Y'VODUJPOT
  25. छྨͷม਺ͷ࢖͍෼͚ 51 ˔ ࣮͸એݴͷ࢓ํʹΑͬͯ.BLFpMFͷม਺͸छྨ͋Δ ˓ ୯७ల։ม਺ɿVAR := value ˓ ࠶ؼల։ม਺ɿVAR

    = value ˔ ͦΕͧΕͷม਺͸ධՁ͞ΕΔλΠϛϯά͕ҟͳΔ ˓ ୯७ల։ม਺ɿͦͷ৔Ͱ஋͕ల։͞ΕΔ ˓ ࠶ؼల։ม਺ɿ࢖ΘΕΔͱ͖ʹ஋͕ల։͞ΕΔ &Y5ZQFPG7BSJBCMF
  26. 52 ˔ ؔ਺ͳͲΛ࢖ͬͯಈతʹ มΘΓಘΔ஋ΛऔΔม਺Ͱ ҧ͍͕ൃੜ͢Δ ˔ ࠷ॳʹఆ͍ٛͯ͠Δ͚ͩͷ DATEม਺ͷ஋͕࣮ߦͷ౓ʹ มԽ͍ͯ͠Δ ˔

    ҰํDATE_FIXED͸ มԽ͍ͯ͠ͳ͍ ۩ମతͳڍಈ &Y5ZQFPG7BSJBCMF DATE=$(shell date) DATE_FIXED:=$(shell date) .DEFAULT_GOAL=all .PHONY: print print%: @echo $(DATE) @echo $(DATE_FIXED) @sleep 1 .PHONY: all all: print1 print2 print3 $ make Sat 29 Aug 2020 06:44:17 PM UTC Sat 29 Aug 2020 06:44:17 PM UTC Sat 29 Aug 2020 06:44:18 PM UTC Sat 29 Aug 2020 06:44:17 PM UTC Sat 29 Aug 2020 06:44:19 PM UTC Sat 29 Aug 2020 06:44:17 PM UTC
  27. 53 ˔ ɿະఆٛͷͱ͖ʹ୅ೖ ˓ ؀ڥม਺Λѻ͏ͷʹศར ˔ ɿఆٛࡁΈͷ஋ʹ৽ͨͳ ஋ΛՃ͑Δ ˓ ಛఆͷλʔήοτ͚ͩ

    ϏϧυΦϓγϣϯΛ௥Ճ ͍ͨ͠ͳͲ ͍ͭͰʹଞͷԋࢉࢠ &Y5ZQFPG7BSJBCMF HOGE?=hoge HOGE += fuga .PHONY: print print: @echo $(HOGE) $ make hoge fuga $ HOGE=piyo make piyo fuga
  28. ໰୊ઃఆ 54 ˔ ҎԼͷཁ݅Λຬͨ͢Α͏ʹɺ.BLFpMFʹมߋΛՃ͑Αɻ ˓ ϑΝΠϧͷੜ੒ޙɺ֦ுࢠΛআ͍ͨϑΝΠϧ໊͕ಉ͡෺ಉ࢜ͷ ૊ΛɺҰͭͷΞʔΧΠϒʹ·ͱΊΔ ˗ ྫ͑͹foo.csvͱfoo.json͔Βfoo.tar.gzΛ࡞Δ ˔

    ͨͩ͠ɺΞʔΧΠϒ໊ʹ͸Ϗϧυ࣌ͷ࣌ؒΛՃ͑ɺྫ͑͹ foo_20200830-000000.tar.gzͱͳΔΑ͏ʹ͢Δ͜ͱɻ ˔ ·ͨɺಉ࣌ʹੜ੒ͨ͠ΞʔΧΠϒ໊ͷ೔͕࣌ἧ͏Α͏ʹ஫ҙ͢Δ ˔ ิ଍ ˓ ೔࣌ੜ੒ɿdate +%Y%m%d-%H%M%S ˓ ΞʔΧΠϒੜ੒ɿtar czf アーカイブ名 ファイル1 ファイル2… &Y5ZQFPG7BSJBCMF
  29. ؀ڥʹॊೈʹରԠ͢Δ 57 ˔ ؀ڥʹΑ༷ͬͯʑͳҧ͍͕͋Δ ˓ -JOVY΍.BDͰ͸࡟আίϚϯυ͕rm ͕ͩ8JO͸del ˓ -JOVYͷsed ͱ.BDͷsed

    ͸Φϓγϣϯ͕ҧ͏ ˔ ͜ΕΒͷࠩҟΛٵऩ͢Δʹ͸Ͳ͏͢Ε͹ྑ͍͔ʁ ˓ Ͱ͖Δ͚ͩ.BLFͷػೳΛ࢖͏ ʢshellͷ࢖༻Λආ͚Δʣ ˓ ࣮ߦίϚϯυΛม਺Խͯ͠؀ڥ͝ͱʹ੾Γସ͑ &Y1PSUBCJMJUZ
  30. 58 ˔ ·ͣ͸ $(OS) Ͱ൑ఆ ˔ -JOVYͱ.BDͷ൑ఆ͸ uname ίϚϯυΛ࢖͏ ˔

    ͦΕͧΕͷ৚݅෼ذ಺Ͱ ඞཁͳϑϥάͷ௥Ճ΍ɺ ίϚϯυͷมߋΛߦ͏ 04͝ͱʹ෼ذ &Y1PSUBCJMJJUZ ifeq "$(OS)" “Windows_NT" # Windows else UNAME=$(shell uname -s) ifeq "$(UNAME)" "Linux" # Linux else # macOS endif endif
  31. ໰୊ઃఆ 61 ˔ &YͷΑ͏ͳ.BLFpMF͸·ͩඇޮ཰ ˓ Ϗϧυ͍ͨ͠શͯͷίϚϯυΛྻڍ͢Δඞཁ͕͋Δ ˓ ࣮͸͜ΕΛ͏·͘ղܾ͢Δํ๏͕͋Δ ˔ ύλʔϯϚονͰॻ͍ͯXJMEDBSEͰల։Ͱ͖ͨΒخ͍͠

    ˓ ͭ·Γbin/%ʹϚονͨ͠λʔήοτͷQSFSFRͰ $(wildcard cmd/%/*.go)Έ͍ͨͳ͜ͱ͕͍ͨ͠ &Y4FDPOEBSZ&YQBOTJPO IUUQTXXXHOVPSHTPGUXBSFNBLFNBOVBM NBLFIUNM4FDPOEBSZ&YQBOTJPO
  32. ͦͷଞUJQT 62 ˔ ίϚϯυͷ࣮ߦ݁Ռ੍ޚ ˓ A!AΛ෇͚Δͱɺ࣮ߦίϚϯυΛදࣔ͠ͳ͍ ˓ AAΛ෇͚Δͱɺࣦഊͯ͠΋ແࢹ͢Δ ˔ ෳ਺λʔήοτΛฒྻʹੜ੒

    ˓ AK/Aʢ/͸੔਺ʣͱ͍͏Φϓγϣϯ෇͖Ͱ࣮ߦ͢Δ ˔ Α͘ݟΔDPOpHVSFͬͯԿʁ ˓ .BLFpMFࣗମΛ͜ΕΛ࢖ͬͯੜ੒͢Δ ˓ BVUPNBLFͷΑ͏ͳ΋ͷ΋͋ΔͷͰڵຯ͕͋Ε͹ ˔ ΋ͬͱ৽͍͠.BLFΈ͍ͨͳͷͳ͍ͷʁ ˓ CB[FMͱ͔͋Δ͚ͲٻΊͯΔͷͱ͸ҧ͏͔΋