์ด ๋ฌธ์๋ InterSystems IRIS ๋ฐ์ดํฐ ํ๋ซํผ์ ์ํ ์คํ ์์ค ์ปค๋ฎค๋ํฐ ํ๋ก์ ํธ์ธ Python Gateway์ ๊ดํ ๊ฒ์ ๋๋ค. ์ด ํ๋ก์ ํธ๋ฅผ ํตํด Python(๋ง์ ๋ฐ์ดํฐ ๊ณผํ์์ ๊ธฐ๋ณธ ํ๊ฒฝ)์์ ์์ฑ๋ ๋ชจ๋ ๊ธฐ๊ณ ํ์ต ์๊ณ ๋ฆฌ์ฆ์ ์กฐ์จํ๊ณ ์๋ง์ ๊ธฐ์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ InterSystems IRIS ํ๋ซํผ์์ ์ ์ํ ๋ก๋ด ๋ถ์ AI/ML ์๋ฃจ์ ์ ์ ์ํ๊ฒ ์์ฑํ ์ ์์ต๋๋ค. ์ด ๊ธฐ์ฌ์์๋ InterSystems IRIS๊ฐ Python ํ๋ก์ธ์ค๋ฅผ ์ค์ผ์คํธ๋ ์ด์ ํ๊ณ ํจ์จ์ ์ธ ์๋ฐฉํฅ ๋ฐ์ดํฐ ์ ์ก์ ์ํํ๋ฉฐ ์ง๋ฅํ ๋น์ฆ๋์ค ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
๊ณํ
- ์๊ฐ.
- ๋๊ตฌ.
- ์ค์น
- API.
- ์ํธ ์ด์ฉ์ฑ.
- ์ฃผํผํฐ ๋ ธํธ๋ถ.
- ๊ฒฐ๋ก .
- ์ฐ๊ฒฐ.
- M.L.ํดํท.
์๊ฐ
Python์ ๊ฐ๋ฐ์ ์์ฐ์ฑ ๋ฐ ์ฝ๋ ๊ฐ๋ ์ฑ ํฅ์์ ์ค์ ์ ๋ ๊ณ ๊ธ ๋ฒ์ฉ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋๋ค. ์ด ๊ธฐ์ฌ ์๋ฆฌ์ฆ์์๋ InterSystems IRIS ํ๋ซํผ์์ Python ์ธ์ด๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์ด ๊ธฐ์ฌ์ ์ฃผ์ ์ด์ ์ ๊ธฐ๊ณ ํ์ต ๋ชจ๋ธ์ ๋ง๋ค๊ณ ์ ์ฉํ๊ธฐ ์ํ ์ธ์ด๋ก Python์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
ML(Machine Learning)์ ์ธ๊ณต์ง๋ฅ ๋ฐฉ์์ ํ ์ข ๋ฅ๋ก์ ๋ฌธ์ ๋ฅผ ์ง์ ์ ์ผ๋ก ํด๊ฒฐํ๋ ๊ฒ์ด ์๋๋ผ ๋น์ทํ ๋ฌธ์ ๋ฅผ ๋ง์ด ํด๊ฒฐํ๋ ๊ณผ์ ์์ ํ์ตํ๋ ๊ฒ์ด ํน์ง์ด๋ค.
๊ธฐ๊ณ ํ์ต ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ชจ๋ธ์ ์ ์ ๋ ๋ณดํธํ๋๊ณ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๊ฐ ์์ง๋ง ๋ชจ๋ ์ ๊ทผ์ฑ, ๋จ์์ฑ ๋ฐ ์ค์ง์ ์ธ ๊ฒฐ๊ณผ ๋ฌ์ฑ์ผ๋ก ๊ท๊ฒฐ๋ฉ๋๋ค. ํด๋ฌ์คํฐ๋ง ๋๋ ์ ๊ฒฝ๋ง ๋ชจ๋ธ๋ง์ด ์๋ก์ด ๊ธฐ์ ์ ๋๊น?
๋ฌผ๋ก ๊ทธ๋ ์ง๋ ์์ง๋ง ์์ฆ์๋ ํ๋์ ๋ชจ๋ธ์ ์คํํ๊ธฐ ์ํด ์์ญ๋ง ์ค์ ์ฝ๋๋ฅผ ์์ฑํ ํ์๊ฐ ์์ผ๋ฉฐ ๋ชจ๋ธ์ ๋ง๋ค๊ณ ์ฌ์ฉํ๋ ๋น์ฉ์ด ์ ์ ์ค์ด๋ค๊ณ ์์ต๋๋ค.
๋๊ตฌ๋ ์งํํ๊ณ ์์ต๋๋ค. ์์ ํ GUI ์งํฅ AI/ML ๋๊ตฌ๋ ์์ง๋ง, BI์ ๊ฐ์ ๋ค๋ฅธ ๋ง์ ์ ๋ณด ์์คํ ํด๋์ค(์ฝ๋ ์์ฑ์์ ํ๋ ์์ํฌ ๋ฐ GUI ์งํฅ ๊ตฌ์ฑ ๊ฐ๋ฅ ์๋ฃจ์ ์ฌ์ฉ์ ์ด๋ฅด๊ธฐ๊น์ง)์์ ์ฐ๋ฆฌ๊ฐ ๋ณธ ์ง๋ณด๋ ๋ณผ ์ ์์ต๋๋ค. AI/ML ์์ฑ ๋๊ตฌ์์. ์ฐ๋ฆฌ๋ ์ด๋ฏธ ์ฝ๋ ์์ฑ ๋จ๊ณ๋ฅผ ํต๊ณผํ์ผ๋ฉฐ ํ์ฌ๋ ๋ชจ๋ธ ๊ตฌ์ถ ๋ฐ ๊ต์ก์ ์ํด ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ต์ข ์ฌ์ฉ์๊ฐ ํน์ ๋ฐ์ดํฐ์ ๋ํ ๋ชจ๋ธ ๊ต์ก์ ์๋ฃํ๊ธฐ๋ง ํ๋ฉด ๋๋ ๋ฏธ๋ฆฌ ๊ต์ก๋ ๋ชจ๋ธ์ ์ ํํ๋ ๊ธฐ๋ฅ๊ณผ ๊ฐ์ ๋ค๋ฅธ ๊ฐ์ ์ฌํญ๋ ๋จธ์ ๋ฌ๋ ์ ์ฉ์ ๋ ์ฝ๊ฒ ์์ํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ฌํ ๋ฐ์ ์ผ๋ก ์ธํด ์ ๋ฌธ๊ฐ์ ํ์ฌ ์ ์ฒด๊ฐ ๊ธฐ๊ณ ํ์ต์ ํจ์ฌ ๋ ์ฝ๊ฒ ๋ฐฐ์ธ ์ ์์ต๋๋ค.
๋ฐ๋ฉด์ ์ฐ๋ฆฌ๋ ์ ์ ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์์งํฉ๋๋ค. InterSystems IRIS์ ๊ฐ์ ํตํฉ ๋ฐ์ดํฐ ํ๋ซํผ์ ์ฌ์ฉํ๋ฉด ์ด ๋ชจ๋ ์ ๋ณด๋ฅผ ์ฆ์ ์ค๋นํ์ฌ ๊ธฐ๊ณ ํ์ต ๋ชจ๋ธ์ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํด๋ผ์ฐ๋๋ก ์ ํํ๋ฉด์ AI/ML ํ๋ก์ ํธ๋ฅผ ๊ทธ ์ด๋ ๋๋ณด๋ค ์ฝ๊ฒ โโ์์ํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ํ์ํ ์์๋ง ์๋นํ ์ ์์ต๋๋ค. ๋ํ ํด๋ผ์ฐ๋ ํ๋ซํผ์ด ์ ๊ณตํ๋ ๋ณ๋ ฌํ ๋๋ถ์ ๋ญ๋น๋๋ ์๊ฐ์ ์ ์ฝํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ฒฐ๊ณผ๋ ์ด๋ป์ต๋๊น? ์ด๊ฒ์ ์ํฉ์ด ๋ ๋ณต์กํด์ง๋ ๊ณณ์ ๋๋ค. ๋ชจ๋ธ ๊ตฌ์ถ์ ์ํ ๋ง์ ๋๊ตฌ๊ฐ ์์ผ๋ฉฐ ์ด์ ๋ํด์๋ ๋ค์์ ์ค๋ช ํ๊ฒ ์ต๋๋ค. ์ข์ ๋ชจ๋ธ์ ๊ตฌ์ถํ๋ ๊ฒ์ ์ฝ์ง ์์ง๋ง ๊ทธ ๋ค์์ ๋ฌด์์ ๋๊น? ๋น์ฆ๋์ค์์ ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ์ด์ต์ ์ป๋ ๊ฒ ๋ํ ์ค์ํ ์์ ์ ๋๋ค. ๋ฌธ์ ์ ๊ทผ์์ ๋ถ์ ๋ฐ ํธ๋์ญ์ ์ํฌ๋ก๋์ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๋ถ๋ฆฌ์ ๋๋ค. ๋ชจ๋ธ์ ๊ต์กํ ๋ ์ผ๋ฐ์ ์ผ๋ก ๊ณผ๊ฑฐ ๋ฐ์ดํฐ์ ๋ํด ์ํํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ตฌ์ฑ๋ ๋ชจ๋ธ์ ์์น๋ ํธ๋์ญ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๋๋ค. ํ๋ฃจ์ ํ ๋ฒ ์คํํ๋ฉด ์ต๊ณ ์ ์ฌ๊ธฐ ๊ฑฐ๋ ํ์ง ๋ชจ๋ธ์ด ๋ฌด์จ ์์ฉ์ด ์์ต๋๊น? ์ฌ๊ธฐ๊พผ๋ค์ ์ด๋ฏธ ๋์ ๊ฐ์ง๊ณ ๋ ๋ฌ์ต๋๋ค. ๊ณผ๊ฑฐ ๋ฐ์ดํฐ๋ก ๋ชจ๋ธ์ ๊ต์กํด์ผ ํ์ง๋ง, ๋น์ฆ๋์ค ํ๋ก์ธ์ค๊ฐ ๋ชจ๋ธ์ ์์ธก์ ๋ฐ๋ผ ์๋ํ ์ ์๋๋ก ์๋ก ๋ค์ด์ค๋ ๋ฐ์ดํฐ์ ์ค์๊ฐ์ผ๋ก ์ ์ฉํด์ผ ํฉ๋๋ค.
ML Toolkit์ ๋ฐ๋ก ์ด๋ฌํ ์์ ์ ์ํํ๋ ๋๊ตฌ ํคํธ์ ๋๋ค. ์ฆ, ๋ชจ๋ธ์ ํจ๊ป ๊ฐ์ ธ์ค๊ณ ํธ๋์ญ์ ํ๊ฒฝ์ ์ ๊ณตํ์ฌ ๊ตฌ์ถํ ๋ชจ๋ธ์ ๋น์ฆ๋์ค ํ๋ก์ธ์ค์์ ์ง์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. Python Gateway๋ ML Toolkit์ ์ผ๋ถ์ด๋ฉฐ Python ์ธ์ด์์ ํตํฉ์ ์ ๊ณตํฉ๋๋ค(R Gateway์ ์ ์ฌํ๊ฒ ML Toolkit์ ์ผ๋ถ๊ฐ R ์ธ์ด์์ ํตํฉ์ ์ ๊ณตํจ).
ํดํท
๊ณ์ํ๊ธฐ ์ ์ ๋์ค์ ์ฌ์ฉํ ๋ช ๊ฐ์ง Python ๋๊ตฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ์ค๋ช ํ๊ฒ ์ต๋๋ค.
๊ธฐ์
- Python์ ํด์๋ ๋ฒ์ฉ ๊ณ ๊ธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์
๋๋ค. ์ธ์ด์ ์ฃผ์ ์ฅ์ ์ ์ํ, ML ๋ฐ AI ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๊ท๋ชจ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค. ObjectScript์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ์ฒด ์งํฅ ์ธ์ด์ด์ง๋ง ๋ชจ๋ ๊ฒ์ด ์ ์ ์ผ๋ก ์ ์๋์ง ์๊ณ ๋์ ์ผ๋ก ์ ์๋ฉ๋๋ค. ๋ํ ๋ชจ๋ ๊ฒ์ด ๊ฐ์ฒด์
๋๋ค. ์ดํ ๊ธฐ์ฌ๋ ์ธ์ด์ ๋ํด ์ผ์์ ์ธ ์น์ํจ์ ๊ฐ์ ํฉ๋๋ค. ํ์ต์ ์์ํ๋ ค๋ฉด ๋ค์์ผ๋ก ์์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ ์ ์๋ฅ ๋น์น . - ๋ค์ ์ฐ์ต์ ์ํด ๋ค์์ ์ค์ ํฉ๋๋ค.
ํ์ด์ฌ 3.6.7 64๋นํธ . - IDE: ์ฌ์ฉ
PyCharm , ๊ทธ๋ฌ๋ ์ผ๋ฐ์ ์ผ๋กะผะฝะพะณะพ . Atelier๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ Python ๊ฐ๋ฐ์๋ฅผ ์ํ Eclipse ํ๋ฌ๊ทธ์ธ์ด ์์ต๋๋ค. VS Code๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ Python์ฉ ํ์ฅ์ด ์์ต๋๋ค. - ๋
ธํธ๋ถ: IDE ๋์ ์จ๋ผ์ธ ๋
ธํธ๋ถ์์ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๊ณ ๊ณต์ ํ ์ ์์ต๋๋ค. ๊ทธ ์ค ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ๊ฒ์
์ฃผํผํฐ .
๋์๊ด
๋ค์์ ๊ธฐ๊ณ ํ์ต ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ (์ผ๋ถ) ๋ชฉ๋ก์ ๋๋ค.
๋ํผ โ ์ ํํ ๊ณ์ฐ์ ์ํ ๊ธฐ๋ณธ ํจํค์ง.ํ๋ค โ ๊ณ ์ฑ๋ฅ ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋ฐ ๋ฐ์ดํฐ ๋ถ์ ๋๊ตฌ.๋งคํธํ๋กฏ๋ฆฝ - ์ฐจํธ ์์ฑ.์จ๋ณธ - matplotlib ๊ธฐ๋ฐ ๋ฐ์ดํฐ ์๊ฐํ.์คํด๋ฐ โ ๊ธฐ๊ณ ํ์ต ๋ฐฉ๋ฒ.XGBoost โ Gradient Boosting ๋ฐฉ๋ฒ๋ก ๋ด์ ๊ธฐ๊ณ ํ์ต ์๊ณ ๋ฆฌ์ฆ.๊ฒ์ฌ โ NLP.์ผ ๋ผ์ค - ์ ๊ฒฝ๋ง.ํ ์ ํ๋ก์ฐ ๊ธฐ๊ณ ํ์ต ๋ชจ๋ธ์ ๋ง๋ค๊ธฐ ์ํ ํ๋ซํผ์ ๋๋ค.ํ์ด ํ ์น Python์ ์ด์ ์ ๋ง์ถ ๊ธฐ๊ณ ํ์ต ๋ชจ๋ธ์ ๋ง๋ค๊ธฐ ์ํ ํ๋ซํผ์ ๋๋ค.nyoka - ๋ค์ํ ๋ชจ๋ธ์ PMML.
AI/ML ๊ธฐ์ ์ ๋น์ฆ๋์ค๋ฅผ ๋ณด๋ค ํจ์จ์ ์ด๊ณ ์ ์๋ ฅ ์๊ฒ ๋ง๋ญ๋๋ค. ๋ํ ์ค๋๋ ์ด๋ฌํ ๊ธฐ์ ์ ๊ฐ๋ฐ ๋ฐ ๊ตฌํ์ด ๋ ์ฌ์์ง๊ณ ์์ต๋๋ค. AI/ML ๊ธฐ์ ๊ณผ ์ด๋ฌํ ๊ธฐ์ ์ด ์กฐ์ง์ ์ฑ์ฅ์ ์ด๋ป๊ฒ ๋์์ด ๋๋์ง ์์๋ณด์ญ์์ค.
์ค์น
Python Gateway๋ฅผ ์ค์นํ๊ณ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
- OS
- Windows
- Linux
- Mac
- ๋์ปค
- DockerHub์ ์ด๋ฏธ์ง ์ฌ์ฉ
- ๋๋ง์ ์ด๋ฏธ์ง ๋ง๋ค๊ธฐ
์ค์น ๋ฐฉ๋ฒ์ ๊ด๊ณ์์ด ์์ค ์ฝ๋๊ฐ ํ์ํฉ๋๋ค. ์ฝ๋๋ฅผ ๋ค์ด๋ก๋ํ ์ ์๋ ์ ์ผํ ์ฅ์๋
OS
์ด์ ์ฒด์ ์ Python Gateway๋ฅผ ์ค์นํ๋ ๊ฒฝ์ฐ ์ด์ ์ฒด์ ์ ๊ด๊ณ์์ด ๋จผ์ Python์ ์ค์นํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด:
Python 3.6.7 64๋นํธ ์ค์น . ๊ธฐ๋ณธ ๋๋ ํฐ๋ฆฌ์ Python์ ์ค์นํ๋ ๊ฒ์ด ์ข์ต๋๋ค.- ๋ชจ๋ ์ค์น
dill
:pip install dill
. - ObjectScript ์ฝ๋๋ฅผ ๋ค์ด๋ก๋ํฉ๋๋ค(์:
do $system.OBJ.ImportDir("C:InterSystemsReposPythoniscpy", "*.cls", "c",,1)
) ์ ํ์ด ์๋ ๋ชจ๋ ์์ญ์. ๊ธฐ์กด ์์ญ์์ ์ ํ์ ์ง์ํ๋ ค๋ฉด ๋ค์์ ์คํํ์ญ์์ค.write ##class(%EnsembleMgr).EnableNamespace($Namespace, 1)
. - ์ฅ์
์ฝ์์ DLL/SO/DYLIB ํด๋๋กbin
InterSystems IRIS ์ธ์คํด์ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ผ์ ๋ค์์์ ๋ฐํ๋ ๊ฒฝ๋ก์์ ์ฌ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค.write ##class(isc.py.Callout).GetLib()
.
Windows
- ํ๊ฒฝ ๋ณ์๊ฐ ๋ค์์ธ์ง ํ์ธํ์ญ์์ค.
PYTHONHOME
Python 3.6.7์ ๊ฐ๋ฆฌํต๋๋ค. - ์์คํ
ํ๊ฒฝ ๋ณ์๊ฐ ๋ค์์ธ์ง ํ์ธํ์ญ์์ค.
PATH
๋ณ์๋ฅผ ํฌํจPYTHONHOME
(๋๋ ๊ทธ๊ฒ์ด ๊ฐ๋ฆฌํค๋ ๋๋ ํ ๋ฆฌ).
๋ฆฌ๋ ์ค(๋ฐ๋น์/์ฐ๋ถํฌ)
- ํ๊ฒฝ ๋ณ์๊ฐ ์๋์ง ํ์ธ
PATH
ํฌํจํ๋ค/usr/lib
ะธ/usr/lib/x86_64-linux-gnu
. ํ์ผ ์ฌ์ฉ/etc/environment
ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํฉ๋๋ค. - ์ค๋ฅ๊ฐ ์๋ ๊ฒฝ์ฐ
undefined symbol: _Py_TrueStruct
์ค์ ์ ์ง์ PythonLib
. ๋ํ์ถ๊ฐ ์ ๋ณด ๋ฌธ์ ํด๊ฒฐ ์น์ ์ด ์์ต๋๋ค.
Mac
- ํ์ฌ Python 3.6.7๋ง ์ง์๋ฉ๋๋ค.
ํ์ด์ฌ.org . ๋ณ์ ํ์ธPATH
.
ํ๊ฒฝ ๋ณ์๋ฅผ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ InterSystems ์ ํ์ ๋ค์ ์์ํ์ญ์์ค.
๋์ปค
์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๊ฐ์ง ์ด์ ์ด ์์ต๋๋ค.
- ์ด์์ฑ
- ํจ๊ณผ
- ์ ์ฐ
- ๊ฐ๋ฒผ์
- ๋ถ๋ณ์ฑ
์ด๊ฒ์ ํ์ธํ์ญ์์ค
๋ชจ๋ Python ๊ฒ์ดํธ์จ์ด ๋น๋๋ ํ์ฌ ์ปจํ
์ด๋ ๊ธฐ๋ฐ์
๋๋ค. 2019.4
.
์ค๋น๋ ์ด๋ฏธ์ง
๋ฌ๋ฆฌ๋ค: docker run -d -p 52773:52773 --name irispy intersystemscommunity/irispy-community:latest
InterSystems IRIS Community Edition๊ณผ ํจ๊ป Python Gateway๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ์คํํฉ๋๋ค. ๊ทธ๊ฒ ๋ค์ผ.
๋๋ง์ ์ด๋ฏธ์ง ๋ง๋ค๊ธฐ
๋์ปค ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๋ ค๋ฉด ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ฃจํธ์์ ์คํํฉ๋๋ค. docker build --force-rm --tag intersystemscommunity/irispy:latest .
.
๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฏธ์ง๋ ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋น๋๋ฉ๋๋ค. store/intersystems/iris-community:2019.4.0.383.0
, ๊ทธ๋ฌ๋ ๋ณ์๋ฅผ ์ค์ ํ์ฌ ์ด๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. IMAGE
.
InterSystems IRIS์์ ๋น๋ํ๋ ค๋ฉด ๋ค์์ ์คํํ์ญ์์ค. `docker build --build-arg IMAGE=store/intersystems/iris:2019.4.0.383.0 --force-rm --tag intersystemscommunity/irispy:latest'.
๊ทธ๋ฐ ๋ค์ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์คํํ ์ ์์ต๋๋ค.
docker run -d
-p 52773:52773
-v /<HOST-DIR-WITH-iris.key>/:/mount
--name irispy
intersystemscommunity/irispy:latest
--key /mount/iris.key
InterSystems IRIS Community Edition ๊ธฐ๋ฐ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํค๋ฅผ ์ง์ ํ ํ์๊ฐ ์์ต๋๋ค.
๋๊ธ
- ํ
์คํธ ํ๋ก์ธ์ค
isc.py.test.Process
์ฌ๋ฌ ์ด๋ฏธ์ง๋ฅผ ์์ ๋๋ ํ ๋ฆฌ์ ์ ์ฅํฉ๋๋ค. ์ด ๊ฒฝ๋ก๋ฅผ ๋ง์ดํธ๋ ๋๋ ํ ๋ฆฌ๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ์ค์ ์ ํธ์งํ์ญ์์ค.WorkingDir
๋ง์ดํธ๋ ๋๋ ํ ๋ฆฌ๋ฅผ ์ง์ ํฉ๋๋ค. - ํฐ๋ฏธ๋์ ์ก์ธ์คํ๋ ค๋ฉด ๋ค์์ ์คํํ์ญ์์ค.
docker exec -it irispy sh
. - ๋ก๊ทธ์ธ์ ํตํด ์์คํ
๊ด๋ฆฌ ํฌํธ์ ์ก์ธ์ค
SuperUser
/SYS
. - ์ปจํ
์ด๋๋ฅผ ์ค์งํ๋ ค๋ฉด ๋ค์์ ์คํํฉ๋๋ค.
docker stop irispy && docker rm --force irispy
.
์ค์น ํ์ธ
Python Gateway๋ฅผ ์ค์นํ ํ์๋ ์ ๋๋ก ์๋ํ๋์ง ํ์ธํ๋ ๊ฒ์ด ์ข์ต๋๋ค. InterSystems IRIS ํฐ๋ฏธ๋์์ ๋ค์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
set sc = ##class(isc.py.Callout).Setup()
set sc = ##class(isc.py.Main).SimpleString("x='HELLO'", "x", , .var).
write var
๊ฒฐ๊ณผ๋ HELLO
- ํ์ด์ฌ ๋ณ์์ ๊ฐ x
. ๋ฐํ ์ํ๋ผ๋ฉด sc
์ค์์ด๊ฑฐ๋ var
๋น์ด ์์, ํ์ธ
API
Python Gateway๊ฐ ์ค์น๋์์ผ๋ฉฐ ์๋ํ๋์ง ํ์ธํ์ต๋๋ค. ์ฌ์ฉ์ ์์ํ ์๊ฐ์
๋๋ค!
Python์ ์ฃผ์ ์ธํฐํ์ด์ค๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. isc.py.Main
. ๋ค์๊ณผ ๊ฐ์ ๋ฉ์๋ ๊ทธ๋ฃน์ ์ ๊ณตํฉ๋๋ค(๋ชจ๋ ๋ฐํ %Status
):
- ์ฝ๋ ์คํ
- ๋ฐ์ดํฐ ์ ์ก
- ๋ณด์กฐ์
์ฝ๋ ์คํ
์ด๋ฌํ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์์์ Python ์ฝ๋๋ฅผ ์คํํ ์ ์์ต๋๋ค.
๋จ์ ๋ฌธ์์ด
SimpleString
์ฃผ์ ๋ฐฉ๋ฒ์
๋๋ค. 4๊ฐ์ ์ ํ์ ์ธ์๊ฐ ํ์ํฉ๋๋ค.
code
์คํํ ์ฝ๋ ์ค์ ๋๋ค. ๋ผ์ธ ํผ๋ ๋ฌธ์:$c(10)
.returnVariable
๋ฐํํ ๋ณ์์ ์ด๋ฆ์ ๋๋ค.serialization
- ์ง๋ ฌํ ๋ฐฉ๋ฒreturnVariable
. 0 - ๋ฌธ์์ด(๊ธฐ๋ณธ๊ฐ), 1 - repr.result
- ๊ฐ์ด ๊ธฐ๋ก๋ ๋ณ์์ ๋ํ ByRef ์ฐธ์กฐreturnVariable
.
์์์ ์ฐ๋ฆฌ๋ ๋ค์์ ์ํํ์ต๋๋ค.
set sc = ##class(isc.py.Main).SimpleString("x='HELLO'", "x", , .var).
์ด ์์์๋ Python ๋ณ์์ ํ ๋นํฉ๋๋ค. x
๊ฐ์น Hello
Python ๋ณ์์ ๊ฐ์ ๋ฐํํ๊ณ ์ถ์ต๋๋ค. x
ObjectScript ๋ณ์์ var
.
์คํ ์ฝ๋
ExecuteCode๋ ๋ ์์ ํ๊ณ ๋ ์ ํ์ ์ธ ๋์์
๋๋ค. SimpleString
.
InterSystems IRIS ํ๋ซํผ์ ๋ผ์ธ์ 3์๋ก ์ ํ๋๋ฉฐ ๋ ๊ธด ์ฝ๋๋ฅผ ์คํํ๋ ค๋ฉด ์คํธ๋ฆผ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๋ ๊ฐ์ง ์ธ์๊ฐ ํ์ํฉ๋๋ค.
code
โ ์คํํ Python ์ฝ๋์ ๋ฌธ์์ด ๋๋ ์คํธ๋ฆผ.variable
- (์ ํ ์ฌํญ) ์คํ ๊ฒฐ๊ณผ๋ฅผ ํ ๋นํฉ๋๋ค.code
์ด ํ์ด์ฌ ๋ณ์.
์ฌ์ฉ ์ ์:
set sc = ##class(isc.py.Main).ExecuteCode("2*3", "y").
์ด ์์์๋ 2์ 3์ ๊ณฑํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ Python ๋ณ์์ ์ ์ฅํฉ๋๋ค. y
.
๋ฐ์ดํฐ ์ ์ก
Python๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ต๋๋ค.
ํ์ด์ฌ -> InterSystems IRIS
ํ์ํ ์ง๋ ฌํ์ ๋ฐ๋ผ InterSystems IRIS์์ Python ๋ณ์ ๊ฐ์ ๊ฐ์ ธ์ค๋ 4๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
String
๊ฐ๋จํ ๋ฐ์ดํฐ ์ ํ ๋ฐ ๋๋ฒ๊น ์ฉ.Repr
๊ฐ๋จํ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ณ ๋๋ฒ๊น ํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค.JSON
InterSystems IRIS ์ชฝ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ์กฐ์ํ ์ ์์ต๋๋ค.Pickle
๊ฐ์ฒด๋ฅผ ์ ์ฅํฉ๋๋ค.
์ด๋ฌํ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ด์ฌ์์ ๋ณ์๋ฅผ ๋ฌธ์์ด์ด๋ ์คํธ๋ฆผ์ผ๋ก ๋ฐ์ ์ ์์ต๋๋ค.
GetVariable(variable, serialization, .stream, useString)
- ์ป๋คserialization
๋ณํ๊ธฐ ์ฌ์ดvariable
ะฒstream
. ๋ง์ฝuseString
๊ฐ 1์ด๊ณ ์ง๋ ฌํ๊ฐ ๋ฌธ์์ด์ ๋ฐฐ์น๋๋ฉด ์คํธ๋ฆผ์ด ์๋ ๋ฌธ์์ด์ด ๋ฐํ๋ฉ๋๋ค.GetVariableJson(variable, .stream, useString)
โ ๋ณ์์ JSON ์ง๋ ฌํ๋ฅผ ์ป์ต๋๋ค.GetVariablePickle(variable, .stream, useString, useDill)
-๋ณ์์ Pickle(๋๋ Dill) ์ง๋ ฌํ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
์ฐ๋ฆฌ์ ๋ณ์๋ฅผ ์ป์ผ๋ ค๊ณ ๋
ธ๋ ฅํฉ์๋ค y
.
set sc = ##class(isc.py.Main).GetVariable("y", , .val, 1)
write val
>6
InterSystems IRIS -> ํ์ด์ฌ
InterSystems IRIS์์ Python์ผ๋ก ๋ฐ์ดํฐ ๋ก๋.
ExecuteQuery(query, variable, type, namespace)
- ๋ฐ์ดํฐ ์ธํธ ์์ฑ(pandasdataframe
๋๋list
) SQL ์ฟผ๋ฆฌ์์ Python ๋ณ์๋ก ์ค์ variable
. ๋น๋ ๋ดํฌisc.py
ํด๋น ์ง์ญ์์ ์ด์ฉ ๊ฐ๋ฅํด์ผ ํจnamespace
- ์์ฒญ์ด ๊ทธ๊ณณ์์ ์คํ๋ฉ๋๋ค.ExecuteGlobal(global, variable, type, start, end, mask, labels, namespace)
- ์ ์ญ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํฉ๋๋ค.global
์ฒจ์์์start
์end
Python์์ ์ ํ ๋ณ์๋กtype
:list
, ๋๋ ํ๋คdataframe
. ์ ํ์ ์ธ์์ ๋ํ ์ค๋ชmask
์labels
์์ ๋ฌธ์ ๋ฐ ์ ์ฅ์์์ ์ฌ์ฉ ๊ฐ๋ฅ๋ฐ์ดํฐ ์ ์ก ๋ฌธ์ .ExecuteClass(class, variable, type, start, end, properties, namespace)
- ํด๋์ค ๋ฐ์ดํฐ ๋ก๋class
์์ด๋์์start
์end
Python์์ ์ ํ ๋ณ์๋กtype
:list
, ๋๋ ํ๋คdataframe
.properties
โ ๋ฐ์ดํฐ ์ธํธ์ ๋ก๋ํ ํด๋์ค ์์ฑ ๋ชฉ๋ก(์ผํ๋ก ๊ตฌ๋ถ). ์ง์๋๋ ๋ง์คํฌ*
ะธ?
. ๊ธฐ๋ณธ -*
(๋ชจ๋ ์์ฑ). ์ฌ์ฐ%%CLASSNAME
๋ฌด์ํ๋ค.ExecuteTable(table, variable, type, start, end, properties, namespace)
- ํ ์ด๋ธ ๋ฐ์ดํฐ ๋ก๋table
์์ด๋์์start
์end
ํ์ด์ฌ์์.
ExecuteQuery
- ๋ฒ์ฉ(์ ํจํ SQL ์ฟผ๋ฆฌ๋ Python์ผ๋ก ์ ๋ฌ๋จ). ํ์ง๋ง, ExecuteGlobal
๊ทธ๋ฆฌ๊ณ ๊ทธ์ ๋ฉ ExecuteClass
ะธ ExecuteTable
์ฌ๋ฌ ๊ฐ์ง ์ ํ ์ฌํญ์ ๊ฐ์ง๊ณ ์์
ํ์ญ์์ค. ํจ์ฌ ๋น ๋ฆ
๋๋ค(ODBC ๋๋ผ์ด๋ฒ๋ณด๋ค 3-5๋ฐฐ ๋น ๋ฅด๊ณ 20๋ฐฐ ๋น ๋ฆ). ExecuteQuery
). ์์ธํ ๋ด์ฉ์
์ด๋ฌํ ๋ชจ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ ์์ญ์์ ๋ฐ์ดํฐ ์ ์ก์ ์ง์ํฉ๋๋ค. ๋น๋ ๋ดํฌ isc.py
๋์ ์ง์ญ์์ ์ฌ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค.
์ฟผ๋ฆฌ ์คํ
ExecuteQuery(request, variable, type, namespace)
- ์ ํจํ SQL ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ Python์ ์ ๋ฌํฉ๋๋ค. ์ด๊ฒ์ ๊ฐ์ฅ ๋๋ฆฐ ๋ฐ์ดํฐ ์ ์ก ๋ฐฉ๋ฒ์
๋๋ค. ๊ฒฝ์ฐ์ ์ฌ์ฉ ExecuteGlobal
๋ํผ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ธ์ :
query
- SQL ์ฟผ๋ฆฌ.variable
- ๋ฐ์ดํฐ๊ฐ ๊ธฐ๋ก๋๋ Python ๋ณ์์ ์ด๋ฆ.type
-list
๋๋ ํ๋คdataframe
.namespace
- ์์ฒญ์ด ์คํ๋ ์์ญ.
๊ธ๋ก๋ฒ ์คํ
ExecuteGlobal(global, variable, type, start, end, mask, labelels, namespace)
- Python์ ์ ์ญ์ ์ ๋ฌํฉ๋๋ค.
์ธ์ :
global
์๋ ๊ธ๋ก๋ฒ์ ์ด๋ฆ์ ๋๋ค.^
variable
- ๋ฐ์ดํฐ๊ฐ ๊ธฐ๋ก๋๋ Python ๋ณ์์ ์ด๋ฆ.type
-list
๋๋ ํ๋คdataframe
.start
โ ์ ์ญ์ ์ฒซ ๋ฒ์งธ ์ฒจ์. ๋ฐ๋์%Integer
.end
์ ์ญ์ ๋ง์ง๋ง ์ฒจ์์ ๋๋ค. ๋ฐ๋์%Integer
.mask
โ ์ ์ญ ๊ฐ์ ๋ง์คํฌ. ๋ง์คํฌ๋ ์ ์ญ์ ํ๋ ์๋ณด๋ค ์งง์ ์ ์์ต๋๋ค(์ด ๊ฒฝ์ฐ ๋์ ์๋ ํ๋๋ ๊ฑด๋๋๋๋ค). ๋ง์คํฌ ํฌ๋งท ๋ฐฉ๋ฒ:+
๊ฐ์ ๊ทธ๋๋ก ์ ๋ฌํฉ๋๋ค.-
๊ฐ์ ๊ฑด๋๋๋๋ค.b
โ ๋ถ์ธ ์ ํ(0
-False
, ๋๋จธ์ง๋ -True
).d
โ ๋ ์ง($horolog์์, Windows์ ๊ฒฝ์ฐ 1970๋ ๋ถํฐ, Linux์ ๊ฒฝ์ฐ 1900๋ ๋ถํฐ).t
- ์๊ฐ($horolog, ์์ ์ดํ ์ด).m
โ ํ์์คํฌํ(YEAR-MONTH-DAY HOUR:MINUTE:SECOND ํ์ ๋ฌธ์์ด).
labels
- ์ด ์ด๋ฆ์ %๋ชฉ๋ก. ์ฒซ ๋ฒ์งธ ์์๋ ์ฒจ์์ ์ด๋ฆ์ ๋๋ค.namespace
- ์์ฒญ์ด ์คํ๋ ์์ญ.
์คํ ํด๋์ค
๊ฐ์ธ๋ค ExecuteGlobal
. ํด๋์ค ์ ์์ ๋ฐ๋ผ ํธ์ถ์ ์ค๋นํฉ๋๋ค. ExecuteGlobal
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ฅผ ๋ถ๋ฅธ๋ค.
ExecuteClass(class, variable, type, start, end, properties, namespace)
- ํด๋์ค ๋ฐ์ดํฐ๋ฅผ Python์ ์ ๋ฌํฉ๋๋ค.
์ธ์ :
class
- ํด๋์ค ์ด๋ฆvariable
- ๋ฐ์ดํฐ๊ฐ ๊ธฐ๋ก๋๋ Python ๋ณ์์ ์ด๋ฆ.type
-list
๋๋ ํ๋คdataframe
.start
โ ID๋ฅผ ์์ํฉ๋๋ค.end
- ์ต์ข ์์ด๋properties
โ ๋ฐ์ดํฐ ์ธํธ์ ๋ก๋ํ ํด๋์ค ์์ฑ ๋ชฉ๋ก(์ผํ๋ก ๊ตฌ๋ถ). ์ง์๋๋ ๋ง์คํฌ*
ะธ?
. ๊ธฐ๋ณธ -*
(๋ชจ๋ ์์ฑ). ์ฌ์ฐ%%CLASSNAME
๋ฌด์ํ๋ค.namespace
- ์์ฒญ์ด ์คํ๋ ์์ญ.
์ ํ ์์ฑ์ ์ ์ธํ ๋ชจ๋ ์์ฑ์ ๊ทธ๋๋ก ์ ๋ฌ๋ฉ๋๋ค. %Date
, %Time
, %Boolean
ะธ %TimeStamp
- ํด๋น Python ํด๋์ค๋ก ๋ณํ๋ฉ๋๋ค.
ํ ์ด๋ธ ์คํ
๊ฐ์ธ๋ค ExecuteClass
. ํ
์ด๋ธ ์ด๋ฆ์ ํด๋์ค ์ด๋ฆ์ผ๋ก ๋ณํํ๊ณ ํธ์ถ ExecuteClass
. ์๋ช
:
ExecuteTable(table, variable, type, start, end, properties, namespace)
- ํ
์ด๋ธ ๋ฐ์ดํฐ๋ฅผ Python์ ์ ๋ฌํฉ๋๋ค.
์ธ์ :
table
- ํ ์ด๋ธ ์ด๋ฆ.
๋ค๋ฅธ ๋ชจ๋ ์ธ์๋ ๊ทธ๋๋ก ์ ๋ฌ๋ฉ๋๋ค.ExecuteClass
.
์ฐธ๊ณ
ExecuteGlobal
,ExecuteClass
ะธExecuteTable
๋๊ฐ์ด ๋นจ๋ฆฌ ์ผํ์ญ์์ค.ExecuteGlobal
๋ณด๋ค 20๋ฐฐ ๋น ๋ฅธExecuteQuery
๋์ฉ๋ ๋ฐ์ดํฐ ์ธํธ(์ ์ก ์๊ฐ >0.01์ด).ExecuteGlobal
,ExecuteClass
ะธExecuteTable
๋ค์ ๊ตฌ์กฐ๋ก ์ ์ญ์์ ์์ ํฉ๋๋ค.^global(key) = $lb(prop1, prop2, ..., propN)
์ด๋์์key
์ ์์ ๋๋ค.- ์
ExecuteGlobal
,ExecuteClass
ะธExecuteTable
์ง์๋๋ ๊ฐ ๋ฒ์%Date
๋ฒ์์ ํด๋นmktime
OS์ ๋ฐ๋ผ ๋ค๋ฆ์ฐฝ : 1970-01-01,๋ฆฌ๋ ์ค 1900-01-01,๋งฅ ). ์ฌ์ฉ%TimeStamp
์ด ๋ฒ์ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ฑฐ๋ pandas ๋ฐ์ดํฐ ํ๋ ์์ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค. ์ด ์ ํ์ ๋ชฉ๋ก์๋ง ์ ์ฉ๋ฉ๋๋ค. - ์
ExecuteGlobal
,ExecuteClass
ะธExecuteTable
๋ฐ์ดํฐ ์์ค(์ ์ญ, ํด๋์ค ๋๋ ํ ์ด๋ธ) ๋ฐ ๋ณ์๋ฅผ ์ ์ธํ ๋ชจ๋ ์ธ์๋ ์ ํ ์ฌํญ์ ๋๋ค.
์
ํ
์คํธ ํด๋์ค
set global = "isc.py.test.PersonD"
set class = "isc.py.test.Person"
set table = "isc_py_test.Person"
set query = "SELECT * FROM isc_py_test.Person"
// ะะฑัะธะต ะฐัะณัะผะตะฝัั
set variable = "df"
set type = "dataframe"
set start = 1
set end = $g(^isc.py.test.PersonD, start)
// ะกะฟะพัะพะฑ 0: ExecuteGlobal ะฑะตะท ะฐัะณัะผะตะฝัะพะฒ
set sc = ##class(isc.py.Main).ExecuteGlobal(global, variable _ 0, type)
// ะกะฟะพัะพะฑ 1: ExecuteGlobal ั ะฐัะณัะผะตะฝัะฐะผะธ
// ะัะธ ะฟะตัะตะดะฐัะต ะณะปะพะฑะฐะปะฐ ะฝะฐะทะฒะฐะฝะธั ะฟะพะปะตะน ะทะฐะดะฐัััั ะฒัััะฝัั
// globalKey - ะฝะฐะทะฒะฐะฝะธะต ัะฐะฑััะบัะธะฟัะฐ
set labels = $lb("globalKey", "Name", "DOB", "TS", "RandomTime", "AgeYears", "AgeDecimal", "AgeDouble", "Bool")
// mask ัะพะดะตัะถะธั ะฝะฐ 1 ัะปะตะผะตะฝั ะผะตะฝััะต ัะตะผ labels ะฟะพัะพะผั ััะพ "globalKey" - ะฝะฐะทะฒะฐะฝะธะต ัะฐะฑัะบะธะฟัะฐ
// ะัะพะฟััะบะฐะตะผ %%CLASSNAME
set mask = "-+dmt+++b"
set sc = ##class(isc.py.Main).ExecuteGlobal(global, variable _ 1, type, start, end, mask, labels)
// ะกะฟะพัะพะฑ 2: ExecuteClass
set sc = ##class(isc.py.Main).ExecuteClass(class, variable _ 2, type, start, end)
// ะกะฟะพัะพะฑ 3: ExecuteTable
set sc = ##class(isc.py.Main).ExecuteTable(table, variable _ 3, type, start, end)
// ะกะฟะพัะพะฑ 4: ExecuteTable
set sc = ##class(isc.py.Main).ExecuteQuery(query, variable _ 4, type)
ํธ์ถ ๋ฐฉ๋ฒ do ##class(isc.py.test.Person).Test()
๋ชจ๋ ๋ฐ์ดํฐ ์ ์ก ๋ฐฉ๋ฒ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ํ์ธํฉ๋๋ค.
๋์ฐ๋ฏธ ๋ฉ์๋
GetVariableInfo(variable, serialization, .defined, .type, .length)
- ๋ณ์์ ๋ํ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ: ์ ์ ์ฌ๋ถ, ํด๋์ค ๋ฐ ์ง๋ ฌํ ๊ธธ์ด.GetVariableDefined(variable, .defined)
- ๋ณ์๊ฐ ์ ์๋์๋์ง ์ฌ๋ถ.GetVariableType(variable, .type)
- ๋ณ์์ ํด๋์ค๋ฅผ ๊ฐ์ ธ์ต๋๋ค.GetStatus()
- Python ์ชฝ์์ ๋ง์ง๋ง ์์ธ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ ๊ฑฐํฉ๋๋ค.GetModuleInfo(module, .imported, .alias)
โ ๋ชจ๋ ๋ณ์๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ํ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.GetFunctionInfo(function, .defined, .type, .docs, .signature, .arguments)
- ํจ์์ ๋ํ ์ ๋ณด๋ฅผ ์ป์ต๋๋ค.
์ํธ ์ด์ฉ์ฑ
ํฐ๋ฏธ๋์์ Python ๊ฒ์ดํธ์จ์ด๋ฅผ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ์ผ๋ ์ด์ ํ๋ก๋์
์์ ์ฌ์ฉํด ๋ณด๊ฒ ์ต๋๋ค. ์ด ๋ชจ๋์์ Python๊ณผ ์ํธ ์์ฉํ๊ธฐ ์ํ ๊ธฐ๋ณธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. isc.py.ens.Operation
. ๊ทธ๊ฒ์ ์ฐ๋ฆฌ์๊ฒ ๋ค์์ ํ์ฉํฉ๋๋ค:
- Python ์ฝ๋ ์คํ
- Python ์ปจํ ์คํธ ์ ์ฅ/๋ณต์
- Python์์ ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ์์
๊ธฐ๋ณธ์ ์ผ๋ก Pyhton ์์
์ ๋ํผ์
๋๋ค. isc.py.Main
. ์์
isc.py.ens.Operation
InterSystems IRIS ์ ํ์์ Python ํ๋ก์ธ์ค์์ ์ํธ ์์ฉ์ ํ์ฉํฉ๋๋ค. ๋ค์ฏ ๊ฐ์ง ์์ฒญ์ด ์ง์๋ฉ๋๋ค.
isc.py.msg.ExecutionRequest
Python ์ฝ๋๋ฅผ ์คํํฉ๋๋ค. ๋ณด๊ณisc.py.msg.ExecutionResponse
์คํ ๊ฒฐ๊ณผ์ ์์ฒญ๋ ๋ณ์์ ๊ฐ์ผ๋ก.isc.py.msg.StreamExecutionRequest
Python ์ฝ๋๋ฅผ ์คํํฉ๋๋ค. ๋ณด๊ณisc.py.msg.StreamExecutionResponse
์คํ ๊ฒฐ๊ณผ ๋ฐ ์์ฒญ๋ ๋ณ์์ ๊ฐ. ๋น์ทํ ๋ฌผ๊ฑดisc.py.msg.ExecutionRequest
, ํ์ง๋ง ๋ฌธ์์ด ๋์ ์คํธ๋ฆผ์ ์๋ฝํ๊ณ ๋ฐํํฉ๋๋ค.isc.py.msg.QueryRequest
SQL ์ฟผ๋ฆฌ ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ ์กํฉ๋๋ค. ๋ณด๊ณEns.Response
.isc.py.msg.GlobalRequest
/isc.py.msg.ClassRequest
/isc.py.msg.TableRequest
์ ์ญ/ํด๋์ค/ํ ์ด๋ธ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํฉ๋๋ค. ๋ณด๊ณEns.Response
.isc.py.msg.SaveRequest
Python ์ปจํ ์คํธ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ณด๊ณEns.StringResponse
์ปจํ ์คํธ ID๋ก.-
isc.py.msg.RestoreRequest
Python ์ปจํ ์คํธ๋ฅผ ๋ณต์ํฉ๋๋ค.๋ํ,
isc.py.ens.Operation
๋ ๊ฐ์ง ์ค์ ์ด ์์ต๋๋ค.Initializer
- ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค ์ ํisc.py.init.Abstract
. ํจ์, ๋ชจ๋, ํด๋์ค ๋ฑ์ ๋ก๋ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ๋ก์ธ์ค๊ฐ ์์๋ ๋ ํ ๋ฒ ์คํ๋ฉ๋๋ค.PythonLib
- (Linux์๋ง ํด๋น) ๋ถํ ์ค๋ฅ๊ฐ ํ์๋๋ฉด ํด๋น ๊ฐ์ ๋ค์์ผ๋ก ์ค์ ํฉ๋๋ค.libpython3.6m.so
๋๋ Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์ฒด ๊ฒฝ๋ก์์๋ ๊ฐ๋ฅํฉ๋๋ค.
๋น์ฆ๋์ค ํ๋ก์ธ์ค ์์ฑ
๋น์ฆ๋์ค ํ๋ก์ธ์ค ๊ฐ๋ฐ์ ์ฉ์ดํ๊ฒ ํ๋ ๋ ๊ฐ์ง ํด๋์ค๊ฐ ์์ต๋๋ค.
isc.py.ens.ProcessUtils
๋ณ์ ๋์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ํ๋์์ ์ฃผ์์ ์ถ์ถํ ์ ์์ต๋๋ค.isc.py.util.BPEmulator
Python์ผ๋ก ๋น์ฆ๋์ค ํ๋ก์ธ์ค๋ฅผ ์ฝ๊ฒ ํ ์คํธํ ์ ์์ต๋๋ค. ํ์ฌ ํ๋ก์ธ์ค์์ ๋น์ฆ๋์ค ํ๋ก์ธ์ค(Python ๋ถ๋ถ)๋ฅผ ์คํํ ์ ์์ต๋๋ค.
๋ณ์ ๋์ฒด
์์ ๋ฌผ๋ ค๋ฐ์ ๋ชจ๋ ๋น์ฆ๋์ค ํ๋ก์ธ์ค isc.py.ens.ProcessUtils
, ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค GetAnnotation(name)
์ด๋ฆ์ผ๋ก ํ๋ ์ฃผ์์ ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค. ํ๋ ์ฃผ์์๋ Python์ผ๋ก ์ ๋ฌ๋๊ธฐ ์ ์ InterSystems IRIS ์ธก์์ ํ๊ฐ๋ ๋ณ์๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค. ๋ค์์ ๋ณ์ ๋์ฒด ๊ตฌ๋ฌธ์
๋๋ค.
${class:method:arg1:...:argN}
- ๋ฉ์๋ ํธ์ถ#{expr}
- ObjectScript ์ธ์ด๋ก ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
ํ
์คํธ ๋น์ฆ๋์ค ํ๋ก์ธ์ค์์ ์์ ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. isc.py.test.Process
, ์๋ฅผ ๋ค์ด ํ๋์์ Correlation Matrix: Graph
: f.savefig(r'#{process.WorkDirectory}SHOWCASE${%PopulateUtils:Integer:1:100}.png')
. ์ด ์์์:
#{process.WorkDirectory}
๊ฐ์ฒด์ WorkDirectory ์์ฑ์ ๋ฐํํฉ๋๋ค.process
, ํด๋์ค์ ์ธ์คํด์ค์ ๋๋ค.isc.py.test.Process
์ ๊ฒ๋ค. ํ์ฌ ๋น์ฆ๋์ค ํ๋ก์ธ์ค.${%PopulateUtils:Integer:1:100}
๋ฐฉ๋ฒ์ ํธ์ถInteger
ํด๋์ค%PopulateUtils
, ์ธ์ ์ ๋ฌ1
ะธ100
, ๋ฒ์์์ ์์์ ์ ์๋ฅผ ๋ฐํ1...100
.
ํ ์คํธ ๋น์ฆ๋์ค ํ๋ก์ธ์ค
ํ ์คํธ ์์ฐ ๋ฐ ํ ์คํธ ๋น์ฆ๋์ค ํ๋ก์ธ์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก Python Gateway์ ์ผ๋ถ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฌ์ฉํ๋ ค๋ฉด:
- OS ํฐ๋ฏธ๋์์ ๋ค์์ ์คํํฉ๋๋ค.
pip install pandas matplotlib seaborn
. - InterSystems IRIS ํฐ๋ฏธ๋์์ ๋ค์์ ์คํํฉ๋๋ค.
do ##class(isc.py.test.CannibalizationData).Import()
ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์ฑ์๋๋ค. - ์ ํ ์ถ์
isc.py.test.Production
. - ์์ฒญ ์ ํ ๋ณด๋ด๊ธฐ
Ens.Request
ะฒisc.py.test.Process
.
๋ชจ๋ ๊ฒ์ด ์ด๋ป๊ฒ ํจ๊ป ์๋ํ๋์ง ๋ด
์๋ค. ์ด๋ ค ์๋ isc.py.test.Process
BPL ํธ์ง๊ธฐ์์:
์ฝ๋ ์คํ
๊ฐ์ฅ ์ค์ํ ํธ์ถ์ Python ์ฝ๋ ์คํ์ ๋๋ค.
์ฌ์ฉ๋ ์์ฒญ isc.py.msg.ExecutionRequest
, ์์ฑ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Code
โ ํ์ด์ฌ ์ฝ๋.SeparateLines
- ์คํ์ ์ํด ์ฝ๋๋ฅผ ์ค๋ก ๋ถํ ํ ์ง ์ฌ๋ถ.$c(10)
(n
) ๋ฌธ์์ด์ ๊ตฌ๋ถํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ํ ๋ฒ์ ์ ์ฒด ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๊ถ์ฅ๋์ง ์์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ฒ๋ฆฌ ์ ์ฉ์ ๋๋ค.def
์ ์ฌํ ์ฌ๋ฌ ์ค ํํ. ๊ธฐ๋ณธ0
.Variables
์๋ต์ ์ถ๊ฐ๋ ๋ณ์์ ์ผํ๋ก ๊ตฌ๋ถ๋ ๋ชฉ๋ก์ ๋๋ค.Serialization
- ๋ฐํํ๋ ค๋ ๋ณ์๋ฅผ ์ง๋ ฌํํ๋ ๋ฐฉ๋ฒ. ์ต์ :Str
,Repr
,JSON
,Pickle
ะธDill
, ๊ธฐ๋ณธStr
.
์ฐ๋ฆฌ์ ๊ฒฝ์ฐ์๋ ์์ฑ๋ง ์ค์ ํฉ๋๋ค. Code
, ๋ค๋ฅธ ๋ชจ๋ ์์ฑ์ด ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๋๋ก ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ํธ์ถํ์ฌ ์ค์ process.GetAnnotation("Import pandas")
, ๋ฐํ์ ์ ๋ณ์ ๋์ฒด๊ฐ ์ํ๋ ํ ์ฃผ์์ ๋ฐํํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก ์ฝ๋ import pandas as pd
Python์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค. GetAnnotation
์ฌ๋ฌ ์ค Python ์คํฌ๋ฆฝํธ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ์ ์ฉํ ์ ์์ง๋ง ์ด ๋ฐฉ๋ฒ์ผ๋ก ์ฝ๋๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ์๋ ์ ํ์ด ์์ต๋๋ค. ์์ฑ์ ์ค์ ํ ์ ์์ต๋๋ค. Code
์ด๋ค ์์ผ๋ก๋ ๋น์ ์๊ฒ ํธ๋ฆฌํฉ๋๋ค.
๋ณ์ ์ป๊ธฐ
์ฌ์ฉํ๋ ๋ ๋ค๋ฅธ ํฅ๋ฏธ๋ก์ด ๋์ isc.py.msg.ExecutionRequest
- Correlation Matrix: Tabular
:
ํ์ด์ฌ ์ธก์์ ์๊ด ํ๋ ฌ์ ๊ณ์ฐํ๊ณ ๋ณ์๋ฅผ ์ถ์ถํฉ๋๋ค. corrmat
์์ฒญ ์์ฑ์ ์ค์ ํ์ฌ JSON ํ์์ InterSystems IRIS๋ก ๋๋๋ฆฝ๋๋ค.
Variables
:"corrmat"
Serialization
:"JSON"
Visual Trace์์ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ BP์์ ์ด ๊ฐ์ด ํ์ํ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ์ป์ ์ ์์ต๋๋ค. callresponse.Variables.GetAt("corrmat")
.
๋ฐ์ดํฐ ์ ์ก
๋ค์์ผ๋ก InterSystems IRIS์์ Python์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค. ๋ชจ๋ ๋ฐ์ดํฐ ์ ์ก ์์ฒญ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํฉ๋๋ค. isc.py.msg.DataRequest
, ๋ค์ ์์ฑ์ ์ ๊ณตํฉ๋๋ค.
Variable
๋ฐ์ดํฐ๊ฐ ๊ธฐ๋ก๋๋ Python ๋ณ์์ ๋๋ค.Type
- ๋ณ์ ์ ํ:dataframe
(ํฌ๋ ๋ฐ์ดํฐ ํ๋ ์) ๋๋list
.Namespace
- ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ์์ญ. ๋น๋ ๋ดํฌisc.py
์ด ์์ญ์์ ์ฌ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค. ์ ํ ์ง์์ด ์๋ ์์ญ์ผ ์ ์์ต๋๋ค.
์ด ์ธํฐํ์ด์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก 4๊ฐ์ง ์์ฒญ ํด๋์ค๊ฐ ๊ตฌํ๋ฉ๋๋ค.
isc.py.msg.QueryRequest
- ์์ฑ ์ค์ Query
SQL ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ ๋๋ค.isc.py.msg.ClassRequest
- ์์ฑ ์ค์ Class
ํด๋์ค ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํฉ๋๋ค.isc.py.msg.TableRequest
- ์์ฑ ์ค์ Table
ํ ์ด๋ธ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํฉ๋๋ค.isc.py.msg.GlobalRequest
- ์์ฑ ์ค์ Global
์ ์ธ๊ณ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํฉ๋๋ค.
ํ
์คํธ ํ๋ก์ธ์ค์์ ํ๋ ์ดํด๋ณด๊ธฐ RAW
์ด๋์์ isc.py.msg.QueryRequest
ํ๋์ผ๋ก ๋ณด์ฌ์ค๋๋ค.
Python ์ปจํ ์คํธ ์ ์ฅ/๋ณต์
๋ง์ง๋ง์ผ๋ก InterSystems IRIS์ Python ์ปจํ
์คํธ๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค. isc.py.msg.SaveRequest
์ธ์ ํฌํจ:
Mask
โ ๋ง์คํฌ๋ฅผ ๋ง์กฑํ๋ ๋ณ์๋ง ์ ์ฅ๋ฉ๋๋ค. ์ง์*
ะธ?
. ์:"Data*, Figure?"
. ๊ธฐ๋ณธ*
.MaxLength
โ ์ ์ฅ๋ ๋ณ์์ ์ต๋ ๊ธธ์ด. ๋ณ์์ ์ง๋ ฌํ๊ฐ ๋ ๊ธธ๋ฉด ๋ฌด์๋ฉ๋๋ค. ๋ชจ๋ ๊ธธ์ด์ ๋ณ์๋ฅผ ๊ฐ์ ธ์ค๋ ค๋ฉด 0์ผ๋ก ์ค์ ํ์ญ์์ค. ๊ธฐ๋ณธ$$$MaxStringLength
.Name
โ ์ปจํ ์คํธ ์ด๋ฆ(์ ํ ์ฌํญ).Description
โ ์ปจํ ์คํธ ์ค๋ช (์ ํ ์ฌํญ).
๋ณด๊ณ Ens.StringResponse
ั Id
์ ์ฅ๋ ์ปจํ
์คํธ ํ
์คํธ ํ๋ก์ธ์ค์์ ํ๋ ์ดํด๋ณด๊ธฐ Save Context
.
๊ด๋ จ ์์ฒญ isc.py.msg.RestoreRequest
InterSystems IRIS์์ Python์ผ๋ก ์ปจํ
์คํธ๋ฅผ ๋ก๋ํฉ๋๋ค.
ContextId
์ปจํ ์คํธ ์๋ณ์์ ๋๋ค.Clear
โ ๋ณต์ํ๊ธฐ ์ ์ ์ปจํ ์คํธ๋ฅผ ์ง์๋๋ค.
์ฃผํผํฐ ์์ฒฉ
์ด ํ์ฅ์ ์ฃผ์์ Python ์ฝ๋๊ฐ ํฌํจ๋์ด ์๊ณ ์ ํ ์ ๋ชฉ์ผ๋ก ํ๋ ์ด๋ฆ์ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ด์ Jupyter Notebook์์ PythonGateway ๋น์ฆ๋์ค ํ๋ก์ธ์ค๋ฅผ ๊ฐ๋ฐํ ์ ์์ต๋๋ค. ๊ฐ๋ฅํ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์๋ก์ด ๋น์ฆ๋์ค ํ๋ก์ธ์ค ์์ฑ
- ๋น์ฆ๋์ค ํ๋ก์ธ์ค ์ญ์
- ์ ํ๋ ๋ง๋ค๊ธฐ
- ๋ณ๊ฒฝ ํ๋
- ํ๋ ์ญ์
์ฌ๊ธฐ์
ํ๋ก์ธ์ค ํ์๊ธฐ
ํ๋ก์ธ์ค ํธ์ง๊ธฐ
์ค์น
- InterSystems IRIS 2019.2+๊ฐ ํ์ํฉ๋๋ค.
- PythonGateway v0.8+ ์ค์น(๋จ์ง ํ์ํจ
isc.py.util.Jupyter
,isc.py.util.JupyterCheckpoints
ะธisc.py.ens.ProcessUtils
). - ๋ฆฌํฌ์งํ ๋ฆฌ์์ ObjectScript ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
- ์คํํ๋ค
do ##class(isc.py.util.Jupyter).Install()
ํ๋กฌํํธ๋ฅผ ๋ฐ๋ฆ ๋๋ค.
์กฐ์ฌ ๊ฒฐ๊ณผ
MLToolkit์ ๊ตฌ์ถ๋ ๋ชจ๋ธ์ ๋น์ฆ๋์ค ํ๋ก์ธ์ค์์ ์ง์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋ชจ๋ธ๊ณผ ํธ๋์ญ์ ํ๊ฒฝ์ ๊ฒฐํฉํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ ๋๊ตฌ ์ธํธ์ ๋๋ค. Python Gateway๋ MLToolkit์ ์ผ๋ถ์ด๋ฉฐ Python ์ธ์ด์์ ํตํฉ์ ์ ๊ณตํ์ฌ Python(๋ง์ ๋ฐ์ดํฐ ๊ณผํ์์ ๊ธฐ๋ณธ ํ๊ฒฝ)์์ ์์ฑ๋ ๊ธฐ๊ณ ํ์ต ์๊ณ ๋ฆฌ์ฆ์ ์ค์ผ์คํธ๋ ์ด์ ํ๊ณ ์๋ง์ ๊ธฐ์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํ ๋ก๋ด ๋ถ์ AI/ InterSystems ํ๋ซํผ IRIS์ ML ์๋ฃจ์ .
์ฐธ์กฐ
์ด์ ๊ธฐ์ฌ ํ์ด์ฌ ๊ฒ์ดํธ์จ์ด Python ๊ฒ์ดํธ์จ์ด ์ํ ์๋ ด ๋ถ์ ํ์ด์ฌ 3.6.7 64๋นํธ Python ๋ฌธ์ ๋ฐ ๊ณผ์
MLํดํท
MLToolkit ์ฌ์ฉ์ ๊ทธ๋ฃน์ InterSystems ๊ธฐ์
GitHub ์กฐ์ง์ ์ผ๋ถ๋ก ์์ฑ๋ ๋น๊ณต๊ฐ GitHub ๋ฆฌํฌ์งํ ๋ฆฌ์
๋๋ค. Python ๊ฒ์ดํธ์จ์ด๋ฅผ ํฌํจํ์ฌ MLToolkit ๊ตฌ์ฑ ์์๋ฅผ ์ค์น, ํ์ต ๋๋ ์ด๋ฏธ ์ฌ์ฉ ์ค์ธ ์ธ๋ถ ์ฌ์ฉ์๋ฅผ ๋์์ผ๋ก ํฉ๋๋ค. ์ด ๊ทธ๋ฃน์ ๋ง์ผํ
, ์ ์กฐ, ์ํ ๋ฐ ๊ธฐํ ์ฌ๋ฌ ์ฐ์
๋ถ์ผ์์ ์๋ง์ ๊ตฌํ ์ฌ๋ก(์์ค ์ฝ๋ ๋ฐ ํ
์คํธ ๋ฐ์ดํฐ ํฌํจ)๋ฅผ ๋ณด์ ํ๊ณ ์์ต๋๋ค. ML Toolkit ์ฌ์ฉ์ ๊ทธ๋ฃน์ ๊ฐ์
ํ๋ ค๋ฉด ๋ค์ ์ฃผ์๋ก ๊ฐ๋จํ ์ด๋ฉ์ผ์ ๋ณด๋ด์ฃผ์ญ์์ค.
- GitHub ์ฌ์ฉ์ ์ด๋ฆ
- ์กฐ์ง(์ผํ๊ฑฐ๋ ๊ณต๋ถ)
- ์ง์(์กฐ์ง์์์ ์ค์ ์ง์, "ํ์" ๋๋ "๋ ๋ฆฝ").
- ๊ตญ๊ฐ
๊ธฐ์ฌ๋ฅผ ์ฝ๊ณ ์ธ๊ณต ์ง๋ฅ ๋ฐ ๊ธฐ๊ณ ํ์ต ๋ฉ์ปค๋์ฆ์ ๊ฐ๋ฐํ๊ฑฐ๋ ํธ์คํ
ํ๊ธฐ ์ํ ํ๋ซํผ์ผ๋ก์ InterSystems IRIS์ ๊ด์ฌ์ด ์๋ ์ฌ๋๋ค์ ์ํด ๊ท์ฌ์์ ๊ด์ฌ์ ๊ฐ์ง ์ ์๋ ๊ฐ๋ฅํ ์๋๋ฆฌ์ค์ ๋ํด ๋
ผ์ํ๋๋ก ์ด๋ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ท์ฌ์ ์๊ตฌ ์ฌํญ์ ์ฆ์ ๋ถ์ํ๊ณ ๊ณต๋์ผ๋ก ์คํ ๊ณํ์ ๊ฒฐ์ ํ ๊ฒ์
๋๋ค. AI/ML ์ ๋ฌธ๊ฐ ๊ทธ๋ฃน์ ์ฐ๋ฝ์ฒ ์ด๋ฉ์ผ ์ฃผ์ โ
์ถ์ฒ : habr.com