Slide 1

Slide 1 text

$䭁䓸הⰟח⛦׶ⴖ׷1ZUIPO̔獳遤遭 CZ(3007&9 *OD劣歊⼾䊻 1Z$PO+1$POGFSFODF%BZ!㣐歊⼒欵噟فٓؠ1J0

Slide 2

Slide 2 text

荈䊹稱➜ 2 • 爡ⰻדכ-JOVYװ'1("הְ׏׋⡚ٖ؎َ٦׾䬐䔲 • չת׌1ZUIPO⢪׏ג׷׿דַׅպה鎉ֲ⤘ • 1ZUIPO娖䎃 1ZUIPOדⰅꟌ • 䪮遭鐰锷爡8%#13&447PMחג1ZUIPO暴꧊㛁瘗 1ZUIPOד״ֻ剅ֻֿה٥䖤䠐זذ٦و • ⤑ⵃ麣Ⱗ⡲׶ • 鎉铂堣腉׾崞欽׃׋1ZUIPOٌآُ٦ٕ⡲׶ • ًةفؚٗٓىؚٝ @puhitaku 劣歊⼾䊻ִׅ׌׋ֻ׫ (3007&9吳䒭⠓爡䨽㾩

Slide 3

Slide 3 text

50$ ֶׁ׵ְ1ZUIPO儗➿ך穄提 (3007&9爡ⰻדכ˘ 䭁䓸ٌآُ٦ٕך⯔ה䕦 ✼䳔⻉׃״ֲ תה׭ 3

Slide 4

Slide 4 text

1ZUIPO儗➿ך穄提

Slide 5

Slide 5 text

1ZUIPO儗➿ך穄提 勻׷䎃 1ZUIPOך؟ه٦زכ
 穄✪׃תׅ 5

Slide 6

Slide 6 text

1ZUIPO儗➿ך穄提 ְא穄׻׷ ˖ 䎃剢傈 ˖ デ濼䔲ⴱכ傈➰ָ寸ת׏גְזַ׏׋ָծ➙䎃剢ח然㹀 ˖ https://github.com/python/devguide/pull/344 ׍ז׫ח˘ ˖ 1ZUIPOPSHה׃גך؟ه٦زכ穄׻׏ג׮ծ04ر؍أزٔؽُ٦ ءّٝח״׏גכ䲿⣘ׁ׸竲ֽ׷׮ך׮ ˖ ⢽6CVOUV-54䎃剢 ‣ ؟ه٦ز㼎韋ךANBJOAٔهآزٔחָ֮׷ ˖ ⢽3)&-䎃剢 ‣ 植遤ךדEFQSFDBUF ד嶊ִ׷ 6

Slide 7

Slide 7 text

1ZUIPO儗➿ך穄提 דֹ׷ꣲ׶傍ֻ
 1ZUIPOח獳遤׃׋ְ 7

Slide 8

Slide 8 text

1ZUIPO儗➿ך穄提 ּׅ1ZUIPOח獳遤הכְַזְ✲ָ㢳ְ فٗتؙزⰋ⡤ד1ZUIPO׾ؖحخٔ⢪׏גְ׷ ӹ ;VMJQך獳遤⢽ָ꬗涯ְ
 https://qiita.com/t2y/items/2a1310608da7b5c4860b ֿך؝٦سח⣛㶷׃גְ׷ⴽך1ZUIPOך؝٦سָ֮׷ 爡ⰻך㡦孡ָ넝ת׵׆אְ1ZUIPOד剅ֻ➂ָ㢳ְ 8 ׃ַ׃˘
 䒦爡ך㜥さכֿ׸׵הכ麩ֲ㔭ꨇָ䖉׍「ֽגְ׋˘

Slide 9

Slide 9 text

1ZUIPO儗➿ך穄提 9 䧮ղ׾㔭׵ׇ׋
 婍׷אך؛٦أָ˘

Slide 10

Slide 10 text

1ZUIPO儗➿ך穄提 10 䧮ղ׾㔭׵ׇ׋
 婍׷אך؛٦أָ˘ $ד剅ַ׸׋䭁䓸ٌآُ٦ٕ

Slide 11

Slide 11 text

(3007&9爡ⰻדכ˘

Slide 12

Slide 12 text

(3007&9爡ⰻדכ˘ ؙٓؐسך״ֲזչֶꆃ׾琎׿ד䚍腉׾أ؛٦ٕպָ
 דֹזְ׋׭ծيتװنزٕطحؙכ噰⸂搀ֻ׃׋ְ 暴ח⡚ٖ؎َ٦דծ㹋鄲ך嚂ׁ״׶׮넝鸞ז⹛⡲ָ銲実ׁ׸׷ אךٌآُ٦ٕח㢳ֻך،فָٔ⣛㶷ׅ׷ֿהָ֮׷ 12 䒦爡דכٗنحز׾⡲׏גְ׷׋׭ծ暴剣ך✲䞔ָ֮׷ ٗنحزⰻד⢪׻׸׷Ⱏ剣ًٌٌٔآُ٦ָֿٕ׸ח鑩䔲׃׋

Slide 13

Slide 13 text

(3007&9爡ⰻדכ˘ Ⱏ剣ًٌٌٔآُ٦ٕ TIN הכ 13 ӹ إٝ؟װو؎؝ٝהװ׶ה׶ׅ׷⦼׾呓秛׃׋Ⱏ剣ًٌٔח،ؙإأׅ׷ ٌآُ٦ٕ ӹ نزٕطحؙחז׷ה䚍腉ח湫䷼ׅ׷ךד㢳㼰؝٦سָꨇ׃ֻז׏גד׮ 鸞ֻ׃׋ְծ瘝ך椚歋ח״׶$"1*ぐ鎉铂ぢֽغ؎ٝر؍ؚٝ׾䱰欽 ӹ ٗنحزךⵖ䖴ח♶〳妀זךד㢳ֻך،فָٔ⣛㶷 3". TINٌآُ٦ٕ 104*9Ⱏ剣ًٌٔ 1ZUIPO ،فٔ TZOD
 EBFNPO TINٌآُ٦ٕ 1ZUIPO ،فٔ 1): 
 41* *$ و؎؝ٝ

Slide 14

Slide 14 text

(3007&9爡ⰻדכ˘ TINٌآُ٦ٕך⚥魦 ˖ TIN⡲䧭װ䱖➭ⵖ䖴 QUISFBENVUFY ׾$ד㹋鄲׃׋$"1* ˖ $"1*פך،ؙإأ׾䲿⣘ׅ׷$٥(P٥1ZUIPOغ؎ٝر؍ؚٝ $BMMTUBDL ⢽PQFO 14 1ZUIPO 1ZUIPOغ؎ٝر؍ؚٝ$䭁䓸ٌآُ٦ٕ liblovot_shm_py.so $"1* lovot_shm_py_open(PyObject* self, PyObject* args) lovot_shm_open(char* path) uint64_t PyObject*

Slide 15

Slide 15 text

䭁䓸ٌآُ٦ٕך⯔ה䕦

Slide 16

Slide 16 text

䭁䓸ٌآُ٦ٕך⯔ה䕦 1ZUIPOPSHך سًُؗٝز刹ֻ 16

Slide 17

Slide 17 text

䭁䓸ٌآُ٦ٕך⯔ה䕦 17 GSPNhttps://docs.python.jp/3/extending/extending.html ˑ$فؚٗٓيך剅ֹ倯׾濼׏גְ׷ז׵ծ1ZUIPOח倜׋ז
 穈׫鴥׫ٌآُ٦ٕ׾鷄⸇ׅ׷ךכֹ׻׭ג知⽃דׅկ˒ ˑ倜׃ְ穈׫鴥׫ؔـآؙؑزך㹋鄲ծ׉׃גⰋגך$ٓ؎ـٓٔꟼ侧
 הءأذي؝٦ٕח㼎ׅ׷ㄎן⳿׃ծָדֹ׷״ֲחז׶תׅկ˒

Slide 18

Slide 18 text

䭁䓸ٌآُ٦ٕך⯔ה䕦 18 GSPNhttps://docs.python.jp/3/extending/extending.html ˑ$فؚٗٓيך剅ֹ倯׾濼׏גְ׷ז׵ծ1ZUIPOח倜׋ז
 穈׫鴥׫ٌآُ٦ٕ׾鷄⸇ׅ׷ךכֹ׻׭ג知⽃דׅկ˒ ˑ倜׃ְ穈׫鴥׫ؔـآؙؑزך㹋鄲ծ׉׃גⰋגך$ٓ؎ـٓٔꟼ侧
 הءأذي؝٦ٕח㼎ׅ׷ㄎן⳿׃ծָדֹ׷״ֲחז׶תׅկ˒ ؕح؛٦

Slide 19

Slide 19 text

䭁䓸ٌآُ٦ٕך⯔ה䕦 19 GSPNhttps://docs.python.org/ja/3/howto/cporting.html ˑ$䭁䓸ך؎ٝة٦ؿؑ؎أכ$1ZUIPOח㔿剣ך׮ךד֮׶ծ
 ֿ׸ח״׷䭁䓸ٌآُ٦ٕכקַך1ZUIPO㹋鄲דכ⹛⡲׃תׇ׿կ˒ ˑ 1ZUIPOדכ 㢌刿ָ׋ֻׁ׿֮׏׋ךדծ
 1ZUIPOך"1*׾搀⫊ד幥תׇ׷ֿהכדֹתׇ׿ד׃׋կ˒ GSPNhttps://docs.python.jp/3/extending/extending.html

Slide 20

Slide 20 text

䭁䓸ٌآُ٦ٕך⯔ה䕦 20 䭁䓸ٌآُ٦ٕך"1*חכ
 ًآٍ٦غ٦آّٝ꟦ד✼䳔䚍ָזְ 1ZUIPO✼䳔חׅ׷חכ
 䗳׆何鸡ָ䗳銲

Slide 21

Slide 21 text

䭁䓸ٌآُ٦ٕך⯔ה䕦 㣐㢌׉ֲ׌ָ װ׷׃ַזְ 21

Slide 22

Slide 22 text

✼䳔⻉׃״ֲ

Slide 23

Slide 23 text

✼䳔⻉׃״ֲ ַֿֿ׵כ؟ٝفٕ׾⢪׏ג铡僇׃תׅ CFGPSFـٓٝثהBGUFSـٓٝث׾鋅嫰ץגי 23 github.com/puhitaku/pyconjp_2018_c_ext

Slide 24

Slide 24 text

✼䳔⻉׃״ֲ pyconjp_2018_c_ext, beforeـٓٝثך⚥魦♧鿇殛 libhelloworldהְֲ$䭁䓸ٌآُ٦ָٕ֮׶ծhelloworldػح؛٦آ
 ַ׵ㄎן⳿ׅկ1ZUIPOד⹛⡲ׅ׷կ 24 ְ׻ײ׷TFUVQQZ 䭁䓸ٌآُ٦ٕ劤⡤ 䖓חlibhelloworld.soחז׷ 䭁䓸ٌآُ٦ٕ׾ㄎעػح؛٦آ

Slide 25

Slide 25 text

俑㶵⴨ )FMMP 8PSME
 ׾鵤ׅꟼ侧 غ؎ز⴨ Y'&&%$"'& ׾鵤ׅꟼ侧 pyconjp_2018_c_ext/src/helloworld.c ✼䳔⻉׃״ֲ$箟 25 ✼䳔⻉׃״ֲ 24

Slide 26

Slide 26 text

✼䳔⻉׃״ֲ$箟 26 pyconjp_2018_c_ext/src/helloworld.c ٌآُ٦ٕ
 ꟼ侧㹀纏 ٌآُ٦ٕ
 ⴱ劍⻉ ✼䳔⻉׃״ֲ 25

Slide 27

Slide 27 text

✼䳔⻉׃״ֲ pyconjp_2018_c_ext/helloworld/__init__.py libhelloworldךꟼ侧׾ㄎן⳿ׅ؝٦سկ鋅׋湡鸐׶1ZUIPOד⹛⡲ׅ׷կ 27

Slide 28

Slide 28 text

✼䳔⻉׃״ֲ pyconjp_2018_c_ext/setup.py 䭁䓸ٌآُ٦ٕךؽٕس䭷㹀ָ֮׷⟃㢩כ兛鸐ךsetup.pyկ 28

Slide 29

Slide 29 text

✼䳔⻉׃״ֲ pyconjp_2018_c_ext/setup.py 䭁䓸ٌآُ٦ٕךؽٕس䭷㹀ָ֮׷⟃㢩כ兛鸐ךsetup.pyկ 29

Slide 30

Slide 30 text

✼䳔⻉׃״ֲ 1ZUIPO דך؎ٝأز٦ٕ 30

Slide 31

Slide 31 text

✼䳔⻉׃״ֲ 1ZUIPO דך⹛⡲ 31

Slide 32

Slide 32 text

✼䳔⻉׃״ֲ ד⹛⡲ָ然钠
 דֹ׋הֿ׹ד˘ ד鑐׃ג׫ת׃׳ֲ 32

Slide 33

Slide 33 text

✼䳔⻉׃״ֲ$箟 1ZUIPO דך؎ٝأز٦ٕ 33 搀⸇䊨ד׮ז׿ְְַ䠬ׄח4VDDFTTׅ׷

Slide 34

Slide 34 text

✼䳔⻉׃״ֲ 1ZUIPO דך⹛⡲ 34 דׅ״י։

Slide 35

Slide 35 text

✼䳔⻉׃״ֲ ⥜姻IFMMPXPSME@@JOJU@@QZ ˖ ְא׮ךfrom __future__ import print_function 35

Slide 36

Slide 36 text

✼䳔⻉׃״ֲ ٔكٝآ 36

Slide 37

Slide 37 text

✼䳔⻉׃״ֲ JNQPSU 37 כ

Slide 38

Slide 38 text

✼䳔⻉׃״ֲ JNQPSU 38 Symbol not found: _Py_InitModule

Slide 39

Slide 39 text

✼䳔⻉׃״ֲ הדכ䭁䓸ٌآُ٦ٕך 㹑鎉٥ⴱ劍⻉倯岀ָ麩ֲ׋׭ 1ZUIPO⩎ד
 ٌآُ٦ٕ׾钠陎דֹגְזְ 39

Slide 40

Slide 40 text

✼䳔⻉׃״ֲ דכ˘ void initϞδϡʔϧ໊ (void)הְֲءؚطثٍךꟼ侧ך⚥ד
 Py_InitModule("Ϟδϡʔϧ໊", PyMethodDef*); ׾㹋遤ׅ׷կ
 PyMethodDef*כծٌآُ٦ٕꟼ侧ךꂁ⴨ 40

Slide 41

Slide 41 text

✼䳔⻉׃״ֲ 41 דכ˘ PyModuleDef圓鸡⡤ך؎ٝأةٝأ׾⡲׶ծ
 PyMODINIT_FUNC PyInit_libϞδϡʔϧ໊(void);הְֲءؚطثٍך ꟼ侧ך⚥דPyModule_Create(*PyModuleDef)ח床׃PyObject*׾鵤ׅկ

Slide 42

Slide 42 text

✼䳔⻉׃״ֲ ٥٥٥ 42

Slide 43

Slide 43 text

✼䳔⻉׃״ֲ ♧ַ׵⼧תד麩ֲ 43

Slide 44

Slide 44 text

✼䳔⻉׃״ֲ ♧ַ׵⼧תד麩ֲ 44 הו׍׵ד׮⢪ֲחכ
 ♧⡤וֲׅ׸ל

Slide 45

Slide 45 text

✼䳔⻉׃״ֲ 45 ֮׷ׄׯזְַ

Slide 46

Slide 46 text

✼䳔⻉׃״ֲ 46 $חכ ֮׷ׄׯזְַ

Slide 47

Slide 47 text

✼䳔⻉׃״ֲ 47 فٔفٗإح؟ָ $חכ ֮׷ׄׯזְַ

Slide 48

Slide 48 text

✼䳔⻉׃״ֲ 48 ؝ٝػ؎ָٕ饥׷⵸ח؝٦س׉ך׮ך׾
 ⴖ׶剏ִ׸לְְ

Slide 49

Slide 49 text

✼䳔⻉׃״ֲ 49

Slide 50

Slide 50 text

✼䳔⻉׃״ֲ 50

Slide 51

Slide 51 text

✼䳔⻉׃״ֲ ٔٔكٝآ 51

Slide 52

Slide 52 text

✼䳔⻉׃״ֲ 52 JNQPSU䧭⸆ import helloworld

Slide 53

Slide 53 text

✼䳔⻉׃״ֲ 53 )FMMP8PSME䧭⸆ helloworld.hello()

Slide 54

Slide 54 text

✼䳔⻉׃״ֲ 54 6OJDPEF%FDPEF&SSPS helloworld.hello_hex()

Slide 55

Slide 55 text

✼䳔⻉׃״ֲ 55 6OJDPEF%FDPEF&SSPS helloworld.hello_hex() ⸇ִג5SBDFCBDLך䞔㜠ך搀ׁ

Slide 56

Slide 56 text

✼䳔⻉׃״ֲ 56 וָֿ䚓׃ְה䙼ְתַׅ 月➂䱱׃ ΍ Ύ Ώ ΐ

Slide 57

Slide 57 text

✼䳔⻉׃״ֲ 57 ൜ਓ͸ Py_BuildValue • Py_BuildValue()٥٥٥鵤׶⦼ךةفٕ׾⡲׷ꟼ侧 • "s#"٥٥٥char*ךꞿׁ׾䭷㹀׃ג1ZUIPOךstrח׃ג鵤ׅ • bin٥٥٥(unsigned char*) 0xfeedcafe • sizeof(bin)٥٥٥binךꞿׁɺͭ·Γ 4

Slide 58

Slide 58 text

✼䳔⻉׃״ֲ 58 ൜ਓ͸ Py_BuildValue鵤׶⦼ךةفٕ׾⡲׷ꟼ侧 • "s#"٥٥٥char*ךꞿׁ׾䭷㹀׃ג1ZUIPOךstrח׃ג鵤ׅ • bin٥٥٥(unsigned char*) 0xfeedcafe • sizeof(bin)٥٥٥binךꞿׁɺͭ·Γ 4 1ZUIPOדךTUSכײ׷ס׻غ؎ز⴨ 1ZUIPOדךTUSכ6OJDPEF俑㶵⴨ Y'&ך儗挿ד6OJDPEFה׃ג鍑ꅸדֹזְ׋׭ؒٓ٦חז׷

Slide 59

Slide 59 text

✼䳔⻉׃״ֲ 59 ⟣䠐ךغ؎ز⴨כ bytes ח׃ג鵤׃ת׃׳ֲ • "s#"٥٥٥char*ךꞿׁ׾䭷㹀׃ג1ZUIPOךstrח׃ג鵤ׅ • "y#"٥٥٥char*ךꞿׁ׾䭷㹀׃ג1ZUIPOךbytesח׃ג鵤ׅ

Slide 60

Slide 60 text

✼䳔⻉׃״ֲ ٔٔٔكٝآ 60

Slide 61

Slide 61 text

✼䳔⻉׃״ֲ 61 JNQPSU䧭⸆ import helloworld

Slide 62

Slide 62 text

✼䳔⻉׃״ֲ 62 )FMMP8PSME䧭⸆ helloworld.hello()

Slide 63

Slide 63 text

✼䳔⻉׃״ֲ 63 Y'&&%$"'&䧭⸆ helloworld.hello_hex()

Slide 64

Slide 64 text

תה׭

Slide 65

Slide 65 text

תה׭ 65 1ZUIPOד✼䳔䚍ךזְ俑岀װٌآُ٦ٕכ
 @@GVUVSF@@ TJY QZUIPOGVUVSF瘝ד✼䳔䚍׾然⥂ ٌآُ٦ٕךؒٝزٔه؎ٝزָⰋֻ殯ז׷鿇ⴓכ
 فٔفٗإح؟JG FMTF FOEJGד⛦׶ⴖ׷ 6OJDPEF%FDPEF&SSPSכקר黧麀׃תׅ
 TUS⢪欽皘䨽כCZUFTח湫ׅ䗳銲ָזְַثؑحؙ

Slide 66

Slide 66 text

תה׭ 䞔㜠ꆀ㢳ְךד
 ֮הדׄ׏ֻ׶铣׿ד׫גֻ׌ְׁ 66 github.com/puhitaku/pyconjp_2018_c_ext