ã³ã³ããåã®åºçŸã¯ãå€ãã®ãã©ãããã©ãŒã ã§äžè²«æ§ã®ããã¹ã±ãŒã©ãã«ãªç°å¢ãæäŸããããšã«ããããœãããŠã§ã¢ã®éçºãšãããã€ã«å€§ããªå€é©ããããããŸãããéçšãæé©åããããšããéçºè ã«ãšã£ãŠãç¹ã«Dockerã奜ãŸãããã¯ãããžãŒãšããŠæµ®äžããŠããŸããã³ã³ãããåºç€ãšããŠäœ¿çšããããšã§ãéçºè ã¯ä»ã®ã¯ãŒã¯ããŒãã«äŸåããŠããã®ãšåãäž»èŠãªã¡ãªãã(ç§»æ€æ§ãã¹ã±ãŒã©ããªãã£ãå¹çæ§ãã»ãã¥ãªãã£)ã享åããMLããã³AIã¢ããªã±ãŒã·ã§ã³ã«ã·ãŒã ã¬ã¹ã«æ¡åŒµã§ããŸãããã®èšäºã§ã¯ãSnake AI ã²ãŒã ãå«ãå®éã®äŸã䜿çšããŠãDocker ã§ TensorFlow.js ã䜿çšã㊠Web ãã©ãŠã¶ãŒã§ AI/ML ãå®è¡ããæ¹æ³ãæ€èšããŸãã
ãªãTensorFlow.js倿ã«Dockerãªã®ã?
å ç¢ãªããŒã«ãããã§ããTensorFlow.jsã®å©ããåããŠãæ©æ¢°åŠç¿ã¢ãã«ãWebãã©ãŠã¶ãŒã§å®è¡ã§ãããããã€ã³ã¿ã©ã¯ãã£ããªãã¢ã³ã¹ãã¬ãŒã·ã§ã³ããªã¢ã«ã¿ã€ã ã®æšè«ãªã©ã®ã¢ããªã±ãŒã·ã§ã³ã«å€ãã®å¯èœæ§ãéãããŸããDockerã¯ãã³ã³ããå ã«ã³ã³ãããå²ãããšã«ããã倿ããã»ã¹å šäœã§äžè²«æ§ãšäœ¿ãããããä¿èšŒããããšã«ãããæŽç·Žããããœãªã¥ãŒã·ã§ã³ãæäŸããŸãã
ã¹ããŒã¯AIãã¥ãŒã©ã«ãããã¯ãŒã¯ã²ãŒã
ã¹ããŒã¯AIã²ãŒã ã¯ãæéã®çµéãšãšãã«ã²ãŒã ãã¬ã€ãåŠç¿ããŠæ¹åãã人工ç¥èœãçµ±åããããšã«ãããå€å žçãªã¹ããŒã¯ã²ãŒã ã«çŸä»£çãªã²ãããå ããŠããŸãããã®ããŒãžã§ã³ã§ã¯ãç¢å°ããŒã䜿çšããŠæåã§ãã¬ã€ããããAIã«å¶åŸ¡ãä»»ããããšãã§ããŸããÂ
TensorFlow ã§åäœãã AI ã¯ãè¡çªãåé¿ããªããã¹ã³ã¢ãæå€§åããããã®æŠç¥çãªåããããããšã§ãç¶ç¶çã«æ¹åãããŸããã²ãŒã ã¯ãã©ãŠã¶ã§ TensorFlow.jsã䜿çšããŠå®è¡ãããŸããããã«ãããããŸããŸãªãã¬ãŒãã³ã°æžã¿ã¢ãã«ããã¹ãããAIãããŸããŸãªèª²é¡ã«ã©ã®ããã«é©å¿ãããã芳å¯ã§ããŸããÂ
楜ãã¿ãªãããã¬ã€ããŠããå Žåã§ããAI ã¢ãã«ã詊ããŠããå Žåã§ãããã®ã²ãŒã ã¯ã²ãŒã ãšæ©æ¢°åŠç¿ã®äº€å·®ç¹ãæ¢çŽ¢ããã®ã«æé©ãªæ¹æ³ã§ããç§ãã¡ã®ã¢ãããŒãã§ã¯ããã¥ãŒã©ã«ãããã¯ãŒã¯ã䜿çšããŠåŸæ¥ã®ã¹ããŒã¯ã²ãŒã ããã¬ã€ããŸããã
ãã®ã¹ããŒã¯ã²ãŒã ã®AIã«é£ã³èŸŒãåã«ããã¥ãŒã©ã«ãããã¯ãŒã¯ã®åºæ¬ãçè§£ããŸãããã
ãã¥ãŒã©ã«ãããã¯ãŒã¯ãšã¯?
ãã¥ãŒã©ã«ãããã¯ãŒã¯ã¯ã人éã®è³ã®åãã«è§Šçºãããæ©æ¢°åŠç¿ã¢ãã«ã®äžçš®ã§ããããã¯ããŒã(ãŸãã¯ããã¥ãŒãã³ã)ã®ã¬ã€ã€ãŒã§æ§æãããŠãããåããŒãã¯ããã€ãã®å ¥åãåãåããããããåŠçããåºåãæ¬¡ã®ã¬ã€ã€ãŒã«æž¡ããŸãã
ãã¥ãŒã©ã«ãããã¯ãŒã¯ã®äž»èŠã³ã³ããŒãã³ã:
- å ¥åã¬ã€ã€ãŒ: çããŒã¿(ç§ãã¡ã®ã²ãŒã ã§ã¯ãããã®åšå²)ãåãåããŸãã
- é衚瀺ã¬ã€ã€ãŒ: å ¥åãåŠçãããã¿ãŒã³ãæœåºããŸãã
- åºåã¬ã€ã€ãŒ: æçµçãªäºæž¬ãäžããŸã

å³ 1:ã®äž»èŠã³ã³ããŒãã³ã ãã¥ãŒã©ã«ãããã¯ãŒã¯
åãã¥ãŒãã³ãå°ããªæææ±ºå®è ãšããŠæ³åããŠã¿ãŠãã ããããã¥ãŒãã³ãšå±€ãå€ããã°å€ãã»ã©ããããã¯ãŒã¯ã¯ãã¿ãŒã³ãããé©åã«èªèã§ããŸãã
ãã¥ãŒã©ã«ãããã¯ãŒã¯ã®çš®é¡
ãã¥ãŒã©ã«ãããã¯ãŒã¯ã«ã¯ããã€ãã®çš®é¡ãããããããããç°ãªãã¿ã¹ã¯ã«é©ããŠããŸãã
- ãã£ãŒããã©ã¯ãŒããã¥ãŒã©ã«ãããã¯ãŒã¯(FNN):
- æãåçŽãªã¿ã€ãã§ãããŒã¿ã¯å ¥åããåºåãŸã§äžæ¹åã«æµããŸãã
- åé¡ãååž°ããã¿ãŒã³èªèãªã©ã®ã¿ã¹ã¯ã«æé©ã§ãã
- ç³ã¿èŸŒã¿ãã¥ãŒã©ã«ãããã¯ãŒã¯(CNN):
- ç»åããŒã¿ãæäœããããã«èšèšãããŠããŸãã
- ãã£ã«ã¿ãŒã䜿çšããŠããšããžããã¯ã¹ãã£ãªã©ã®ç©ºéãã¿ãŒã³ãæ€åºããŸãã
- ãªã«ã¬ã³ããã¥ãŒã©ã«ãããã¯ãŒã¯(RNN)
- ã·ãŒã±ã³ã¹äºæž¬(æ ªäŸ¡ãããã¹ãçæãªã©)ã«é©ããŠããŸãã
- 以åã®å ¥åãèšæ¶ããæç³»åããŒã¿ãåŠçã§ããããã«ããŸãã
- é·çæèšæ¶ãããã¯ãŒã¯(LSTM)
- é·æçãªäŸåé¢ä¿ãåŠç¿ã§ããç¹æ®ãªã¿ã€ãã®RNNã§ãã
- æµå¯Ÿççæãããã¯ãŒã¯(GAN)
- ç»åããã£ãŒããã§ã€ã¯ã®äœæãªã©ãæ°ããããŒã¿ã®çæã«äœ¿çšãããŸãã
åã¿ã€ãã䜿çšããå Žå:
- CNNã®ç¹é·: ç»ååé¡ãç©äœæ€åºãé¡èªèã
- RNN/LSTM: èšèªã¢ãã«ãæ ªåŒåžå Žäºæž¬ãæç³»åããŒã¿ã
- FNNs: ã¹ããŒã¯ã®ãããªã²ãŒã ã§ã¯ãçŸåšã®ç¶æ ã«åºã¥ããŠæ¬¡ã®ã¢ã¯ã·ã§ã³ãäºæž¬ããããšãã¿ã¹ã¯ã§ãã
ã²ãŒã ã®ä»çµã¿ã¯?
ã¹ããŒã¯ã²ãŒã ã«ã¯2ã€ã®éã³æ¹ããããŸãã
æåã¢ãŒã:
- ããŒããŒãã®ç¢å°ããŒã䜿çšããŠãããå¶åŸ¡ããŸãã
- å£ãèªåã«ã¶ã€ãããã«ãã«ãŒã(èµ€ãåè§)ãé£ã¹ãã®ãç®æšã§ãã
- æç©ãé£ã¹ããã³ã«ãããã¯é·ãæé·ããã¹ã³ã¢ãå¢å ããŸãã
- ãããã¯ã©ãã·ã¥ãããšã²ãŒã ãçµäºããåèµ·åããŠå詊è¡ã§ããŸãã
AIã¢ãŒã:
- ã²ãŒã ã¯ãTensorFlow.jsã§æ§ç¯ããããã¥ãŒã©ã«ãããã¯ãŒã¯(AIè³ã®äžçš®)ã䜿çšããŠãã¬ã€ããŸãã
- AIã¯ããã®åšå²(å£ãæç©ã®äœçœ®ãããã®äœ)ãèŠãŠãå·Šãåæ¹ãå³ã®æé©ãªåããäºæž¬ããŸãã
- åã²ãŒã ã®åŸãAIã¯å€±æããåŠã³ãæéã®çµéãšãšãã«è³¢ããªããŸãã
- ååãªãã¬ãŒãã³ã°ãç©ãã°ãAIã¯ã¯ã©ãã·ã¥ãåé¿ããã¹ã³ã¢ãåäžãããããšãã§ããŸãã

Figure 2: AIã®ã²ãããå ããããã¢ã®ã¯ã©ã·ãã¯ãªã¹ããŒã¯ã²ãŒã
ã¯ãã
ãã®ã²ãŒã ãã©ã®ããã«æ§ç¯ãããŠããããé ã远ã£ãŠèŠãŠãããŸããããWebãã©ãŠã¶ã§ã²ãŒã ãå®è¡ããã«ã¯ããŸãDockerãã€ã³ã¹ããŒã«ããå¿ èŠããããŸããæé ã®æŠèŠã¯æ¬¡ã®ãšããã§ããÂ
- ãªããžããªã®ã¯ããŒã³ãäœæãã
- Docker Desktop ã®ã€ã³ã¹ããŒã«
- Dockerfile ãäœæãã
- Docker ã€ã¡ãŒãžããã«ããã
- ã³ã³ãããŒãå®è¡ãã
- ãŠã§ããã©ãŠã¶ã䜿çšããŠã²ãŒã ã«ã¢ã¯ã»ã¹ããŸã
ãªããžããªã®ã¯ããŒã³
git clone https://github.com/dockersamples/snake-game-tensorflow-docker
Docker Desktop ã®ã€ã³ã¹ããŒã«
åæ æ¡ä»¶ïŒ
- ãµããŒããããŠããããŒãžã§ã³ã® MacãLinuxããŸã㯠Windows
- å°ãªããšã 4 GB ã® RAM
Docker DesktopãããŠã³ããŒãããã«ã¯ããããã¯ãªãã¯ããŠãã ãããã·ã¹ãã ã«é©ããããŒãžã§ã³ãéžæããŸã(MacãŠãŒã¶ãŒåãã®Appleã·ãªã³ã³ãŸãã¯IntelããããWindowsããŸãã¯Linuxãã£ã¹ããªãã¥ãŒã·ã§ã³)

å³ 3:ãã·ã³ã®DockerWebãµã€ãããDockerDesktopãããŠã³ããŒãããŸã
ã¯ã€ãã¯ã©ã³
Docker Desktop ãã€ã³ã¹ããŒã«ãããããã«ãæžã¿ã® Docker ã€ã¡ãŒãžãå®è¡ããã³ãã³ã ããã³ããã§æ¬¡ã®ã³ãã³ããå®è¡ããŸããã€ã¡ãŒãžããã«ããDockerã€ã¡ãŒãž1snake-game:vãå®è¡ããæ°ããã³ã³ãããéå§ãããã¹ããã·ã³äžã®ããŒã8080ãå ¬éããŸããÂ
次ã®ã³ãã³ããå®è¡ããŠãã¢ããªã±ãŒã·ã§ã³ãèµ·åããŸãã
ããã«ãŒäœæ
次ã«ããã©ãŠã¶ãéã㊠http://localhost:8080 ã«ç§»åããã¹ããŒã¯ã²ãŒã ã®åºåã確èªããæåã®ã²ãŒã ãéå§ããŸãã
ãªãDockerã䜿çšããŠã¹ããŒã¯ã²ãŒã ãå®è¡ããã®ã§ãã?
- ãã·ã³ã«Nginxãã€ã³ã¹ããŒã«ããå¿ èŠã¯ãããŸãã - DockerãåŠçããŸãã
- ã²ãŒã ã¯ãDockerããµããŒãããã©ã®ã·ã¹ãã ã§ãåãããã«åäœããŸãã
- ã²ãŒã ãDockerã€ã¡ãŒãžãšããŠç°¡åã«å ±æã§ããä»ã®ãŠãŒã¶ãŒã¯1ã€ã®ã³ãã³ãã§å®è¡ã§ããŸãã
ã²ãŒã ããžãã¯
index.html file ã¯ã²ãŒã ã®åºç€ãšããŠæ©èœããWebããŒãžã®ã¬ã€ã¢ãŠããšæ§é ãå®çŸ©ããŸããAI ãåããã©ã€ãã©ãª TensorFlow.js ãšãã²ãŒã ãã¬ã€ ããžãã¯ãåŠçããããã® script.js ãAI ããŒã¹ã®ç§»åã® ai.js ãååŸããŸããã²ãŒã ã®UIã¯ã·ã³ãã«ã§ãããªããæ©èœçã§ããã¬ã€ã€ãŒãæåå¶åŸ¡(ç¢å°ããŒã䜿çš)ãšAIã¢ãŒããåãæ¿ããããšãã§ãã ã¢ãŒãã»ã¬ã¯ã¿ãŒ ãåããŠããŸããã¹ã³ã¢ããŒãã¯ãAI ã®ãã¬ãŒãã³ã°æã«ã¹ã³ã¢ããã€ã¹ã³ã¢ãããã³äžä»£æ°ãåçã«æŽæ°ããŸãããŸããã²ãŒã èªäœã¯HTMLã® <canvas> èŠçŽ ã§å®è¡ããããããéåžžã«ã€ã³ã¿ã©ã¯ãã£ãã§ããå
ã«é²ãã«ã€ããŠãJavaScriptãã¡ã€ã«ãã©ã®ããã«ãã®ã²ãŒã ã«åœãå¹ã蟌ãããæ¢ã£ãŠãããŸãã
ãã¡ã€ã« : index.html
HTML ãã¡ã€ã«ã¯ãã²ãŒã ãã£ã³ãã¹ãã³ã³ãããŒã« ãã¿ã³ãªã©ãã²ãŒã ã®æ§é ãèšå®ããŸãããŸããTensorflow ããã©ã€ãã©ãªããã§ããããããã¯ã³ãŒãã§ãããèšç·Žããããã«ããã«äœ¿çšãããŸããÂ
- ã«ã³ãã¹ïŒ ã²ãŒã ãåŒãåããããå Žæã
- ã¢ãŒãã»ã¬ã¯ã¿ãŒ: æåãšAIã®ã²ãŒã ãã¬ã€ãåãæ¿ããããšãã§ããŸãã
- TensorFlow.js:AIã®é è³ãåããã©ã€ãã©ãª!
ãã¡ã€ã« : script.js
ãã®ãã¡ã€ã«ã¯ãããŒãã®æç»ãããã®ç§»åãæç©ã®é 眮ãã¹ã³ã¢ã®èšé²ãªã©ãã²ãŒã å ã®ãã¹ãŠãåŠçããŸãã
const canvas = document.getElementById('gameCanvas');
const ctx = canvas.getContext('2d');
let snake = [{ x: 5, y: 5 }];
let fruit = { x: 10, y: 10 };
let direction = { x: 1, y: 0 };
let score = 0;
- ã¹ããŒã¯ããžã·ã§ã³: ãããå§ãŸãå Žæã
- ãã«ãŒãã®äœçœ®: ãªã³ãŽãã©ãã«ãããã
- æ¹åïŒ ãããã©ã¡ãã®æ¹åã«åããŠãããã
ã²ãŒã ã«ãŒã
ã²ãŒã ã«ãŒãã¯ãããã®äœçœ®ãæŽæ°ããè¡çªããã§ãã¯ããã¹ã³ã¢ãåŠçããªãããã²ãŒã ã®å®è¡ãç¶æããŸãã
function gameLoopManual() {
const head = { x: snake[0].x + direction.x, y: snake[0].y + direction.y };
if (head.x === fruit.x && head.y === fruit.y) {
score++;
fruit = placeFruit();
} else {
snake.pop();
}
snake.unshift(head);
}
- ããã®ç§»å: ããã«æ°ããé ã远å ããå°Ÿãåãé€ããŸã(ãªã³ãŽãé£ã¹ãªãéã)ã
- è¡çªïŒ é ãå£ãèªåã®äœã«ã¶ã€ãããšãã²ãŒã ãçµäºããŸãã
ã¢ãŒãã®åãæ¿ã
document.getElementById('mode').addEventListener('change', function() {
gameMode = this.value;
});
- æåã¢ãŒã: ç¢å°ããŒã䜿çšããŠãããå¶åŸ¡ããŸãã
- AIã¢ãŒã: ãã¥ãŒã©ã«ãããã¯ãŒã¯ã¯æ¬¡ã®åããäºæž¬ããŸãã
ã²ãŒã ãªãŒããŒãšåèµ·å
function gameOver() {
clearInterval(gameInterval);
alert('Game Over');
}
function resetGame() {
score = 0;
snake = [{ x: 5, y: 5 }];
fruit = placeFruit();
}
- ã²ãŒã ã¯çµãããŸããïŒ ãããã¯ã©ãã·ã¥ãããšãã«ã²ãŒã ã忢ããŸãã
- ãªã»ããïŒ ã²ãŒã ãæåã«ãªã»ããããŸãã
AIã®ãã¬ãŒãã³ã°
ãã¡ã€ã« : ai.js
ãã®ãã¡ã€ã«ã¯ããã¥ãŒã©ã«ãããã¯ãŒã¯(ã¹ããŒã¯ã®éã³æ¹ãåŠç¿ããAIè³)ãäœæããŠãã¬ãŒãã³ã°ããŸãã
var movementOptions = ['left', 'forward', 'right'];
const neuralNet = tf.sequential();
neuralNet.add(tf.layers.dense({units: 256, inputShape: [5]}));
neuralNet.add(tf.layers.dense({units: 512}));
neuralNet.add(tf.layers.dense({units: 256}));
neuralNet.add(tf.layers.dense({units: 3}));
- ãã¥ãŒã©ã«ãããã¯ãŒã¯ïŒ ããã¯ã4å±€ã®ãã¥ãŒãã³ãæã€ã·ãã¥ã¬ãŒããããè³ã§ãã
- ã€ã³ãããïŒ ã²ãŒã ã®ç¶æ ã«é¢ããæ å ±(å£ãæç©ã®äœçœ®ãããã®äœ)ã
- ã¢ãŠããããïŒ å·Šæãåé²ã峿ã®3ã€ã®éžæè¢ã®ããããã
const optAdam = tf.train.adam(.001);
neuralNet.compile({
optimizer: optAdam,
loss: 'meanSquaredError'
});
- ãªããã£ãã€ã¶ïŒ è³ã®éã¿ã調æŽããããšã§ãè³ãå¹ççã«åŠç¿ããã®ãå©ããŸãã
- æå€±æ©èœ: AIã®äºæž¬ãã©ã®çšåºŠééã£ãŠããããæž¬å®ããAIã®æ¹åãæ¯æŽããŸãã
ããã¯ã²ãŒã ããã¬ã€ãããã³ã«ããã®åããèŠããŠèªåèªèº«ãèšç·ŽããŸãã
async function trainNeuralNet(moveRecord) {
for (var i = 0; i < moveRecord.length; i++) {
const expected = tf.oneHot(tf.tensor1d([deriveExpectedMove(moveRecord[i])], 'int32'), 3).cast('float32');
posArr = tf.tensor2d([moveRecord[i]]);
await neuralNet.fit(posArr, expected, { batchSize: 3, epochs: 1 });
expected.dispose();
posArr.dispose();
}
}
åã²ãŒã ã®åŸãAIã¯äœãèµ·ãã£ãããèŠãŠãå éšæ¥ç¶ã調æŽããæ¬¡ã®ã²ãŒã ã«åããŠæ¹åã詊ã¿ãŸãã
movementOptions é åã¯ãããã®å¯èœãªç§»åæ¹å ('left'ã'forward'ã'right') ãå®çŸ©ããŸãã
åŠç¿çã 0ã® Adam ãªããã£ãã€ã¶ãŒã001 ã¯ã¢ãã«ãã³ã³ãã€ã«ããå¹³åäºä¹èª€å·®æå€±é¢æ°ãæå®ãããŸããtrainNeuralNet 颿°ã¯ãç¹å®ã® moveRecord é åã䜿çšããŠãã¥ãŒã©ã« ãããã¯ãŒã¯ããã¬ãŒãã³ã°ããããã«å®çŸ©ãããŸããmoveRecord é åãå埩åŠçããäºæ³ãããåãã«å¯Ÿã㊠one-hot ãšã³ã³ãŒãããããã³ãœã«ãäœæããTensorFlow.js fit ã¡ãœããã䜿çšããŠã¢ãã«ããã¬ãŒãã³ã°ããŸãã
次ã®åããäºæž¬ãã
ãã¬ã€ãããšããAIã¯æåã®åããäœã§ããããäºæž¬ããŸãã
function computePrediction(input) {
let inputs = tf.tensor2d([input]);
const outputs = neuralNet.predict(inputs);
return movementOptions[outputs.argMax(1).dataSync()[0]];
}
computePrediction颿°ã¯ããã¬ãŒãã³ã°æžã¿ã®ãã¥ãŒã©ã«ãããã¯ãŒã¯ã䜿çšããŠäºæž¬ãè¡ããŸããå
¥åé
åãåãåããå
¥åãããã³ãœã«ãäœæãããã¥ãŒã©ã«ãããã¯ãŒã¯ã䜿çšããŠåããäºæž¬ããäºæž¬ãããåºåã«åºã¥ããŠç§»åãªãã·ã§ã³ãè¿ããŸãã
ãã®ã³ãŒãã§ã¯ããã¥ãŒã©ã« ãããã¯ãŒã¯ ã¢ãã«ã®äœæãç¹å®ã®ç§»åã¬ã³ãŒãã§ã®åŠç¿ãããã³åŠç¿æžã¿ã¢ãã«ã䜿çšããäºæž¬ã®äœæã瀺ããŸãããã®ã¢ãããŒãã¯ãã¹ããŒã¯AIã²ãŒã ã®æŽå²ããåŠã³ãæ å ±ã«åºã¥ããæ±ºå®ãäžãããšã«ãããã¹ããŒã¯AIã²ãŒã ã®ããã©ãŒãã³ã¹ãšã€ã³ããªãžã§ã³ã¹ãåäžãããããšãã§ããŸãã
ãã¡ã€ã« : Dockerfile
FROM nginx:latest
COPY . /usr/share/nginx/html
ãã nginx:ææ°
- ããã«ãããDocker ã¯ææ°ããŒãžã§ã³ã® Nginx ãåºæ¬ã€ã¡ãŒãžãšããŠäœ¿çšããããã«æç€ºããŸãã
- Nginx ã¯ãHTMLãCSSãJavaScript(Snakeã²ãŒã ã®æ§æèŠçŽ )ãªã©ã®éçãã¡ã€ã«ãæäŸããã®ã«æé©ãªWebãµãŒããŒã§ãã
- ãµãŒããŒãæåããäœæãã代ããã«ã次ã®è¡ã¯ãæ¢åã®ä¿¡é Œæ§ã®é«ãNginxã»ããã¢ããã䜿çšããŠæéãç¯çŽããŸãã
åãã /usr/share/nginx/html
- ãã®è¡ã¯ãçŸåšã®ãããžã§ã¯ããã£ã¬ã¯ããª(Snakeã²ãŒã ãã¡ã€ã«ããããã£ã¬ã¯ããªïŒindex.htmlãscript.jsãai.jsãªã©)Nginx WebãµãŒããŒã®ããã©ã«ããã©ã«ãã«Webã³ã³ãã³ããæäŸããããã®ãã©ã«ãã«ç§»åããŸãã
- /usr/share/nginx/html ã¯ãNginx ã衚瀺ãã Web ãã¡ã€ã«ãæ¢ãããã©ã«ãã®ãã©ã«ãã§ãã
éçºã»ããã¢ãã
Dockerã䜿çšããŠSnakeã²ãŒã ã®éçºç°å¢ãèšå®ããæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
éçºãã¹ã ãŒãºã«ããããã«ã Docker ããªã¥ãŒã ã䜿çšã㊠ãã²ãŒã ãã¡ã€ã«ã倿Žãããã³ã« Docker ã€ã¡ãŒãžãåæ§ç¯ãããªãããã«ããããšãã§ããŸããÂ
Snake-AI-TensorFlow-Dockerã³ãŒããååšãããã©ã«ãããã³ãã³ããå®è¡ããŸãã
docker run -it --rm -d -p 8080:80 --name web -v ./:/usr/share/nginx/html nginx
次ã®ãããªãšã©ãŒãçºçããå Žå
docker: Error response from daemon: Mounts denied:
The path /Users/harsh/Downloads/Snake-AI-TensorFlow-Docker is not shared from the host and is not known to Docker.
You can configure shared paths from Docker -> Preferences... -> Resources -> File Sharing.
See https://docs.docker.com/desktop/settings/mac/#file-sharing for more info.
Docker DesktopãéããSettings -> Resources -> File Sharing -> ã«ç§»åãããªããžããªã³ãŒããã¯ããŒã³ããå Žæãéžæãã Apply & restartãã¯ãªãã¯ããŸãã

å³ 4:Docker Desktopã䜿çšããŠAIã¹ããŒã¯ã²ãŒã ã®éçºç°å¢ãèšå®ãã
ã³ãã³ããå床å®è¡ãããšããšã©ãŒã«çŽé¢ããããšã¯ãããŸããÂ
docker run -it --rm -d -p 8080:80 --name web -v ./:/usr/share/nginx/html nginx
次ã®ã³ãã³ãã§ã³ã³ãããå®è¡ãããŠãããã©ããã確èªããŸã
harsh@Harshs-MacBook-Air snake-game-tensorflow-docker % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c47e2711b2db nginx "/docker-entrypoint.âŠ" 3 seconds ago Up 2 seconds 0.0.0.0:8080->80/tcp web
ãã©ãŠã¶ãéããŠURLã«ç§»åããŸã http://localhost:8080ãã¹ããŒã¯ã²ãŒã ã®åºåã衚瀺ãããŸãããã®ã»ããã¢ããã¯ããã¹ãŠãé«éãã€åçã«ä¿ã€ãããéçºã«æé©ã§ãã

å³ 5:Webãã©ãŠã¶ãä»ããŠã¹ããŒã¯ã²ãŒã ã«ã¢ã¯ã»ã¹ããŸãã
ã³ãŒãã®å€æŽã¯ãã³ã³ãããåæ§ç¯ããããšãªãããã©ãŠã¶ã«ããã«åæ ãããŸã-v ~/.:/usr/share/nginx/html â ãããéæ³ã®éšåã§ã!ããŒã«ã«ãã£ã¬ã¯ããª(Snake-AI-TensorFlow-Docker)ãã³ã³ããå
ã®Nginx HTMLãã£ã¬ã¯ããª(/usr/share/nginx/html)ã«ããŠã³ãããŸãã
~/Snake-AI-TensorFlow-Docker ã³ãŒãå
ã® HTMLãCSSããŸã㯠JavaScript ãã¡ã€ã«ã«å ãã倿Žã¯ãã³ã³ãããŒãåæ§ç¯ããªããŠããå®è¡äžã®ã¢ããªã«ããã«åæ ãããŸãã
çµè«Â
çµè«ãšããŠãTensorFlow.js ãš Docker ã䜿çšã㊠Snake AI ã²ãŒã ãæ§ç¯ãããšãML ãš AI ãã€ã³ã¿ã©ã¯ãã£ã㪠Web ã¢ããªã±ãŒã·ã§ã³ã«ã·ãŒã ã¬ã¹ã«çµ±åã§ããããšã瀺ãããŠããŸãããã®ãããžã§ã¯ããéããŠã匷ååŠç¿ã®åºç€ãæ¢æ±ããã ãã§ãªããDocker ãéçºãšãããã€ã®ããã»ã¹ãç°¡çŽ åããæ¹æ³ãçŽæ¥èŠãŠããŸããã
ã³ã³ããåã«ãããDockerã¯ç°ãªãã·ã¹ãã éã§äžè²«ããç°å¢ã確ä¿ããäžè¬çãªãèªåã®ãã·ã³ã§åäœããããšããåé¡ãæé€ããŸãããã®äžè²«æ§ã«ãããWeb ã¢ããªã±ãŒã·ã§ã³ãæ©æ¢°åŠç¿ãããžã§ã¯ãããŸã㯠AI ã¢ããªã±ãŒã·ã§ã³ã®ããŒãžã§ã³ã®äžäžèŽãããŒã«ã«æ§æã®åé¡ãå¿é ããããšãªããä»ã®ãŠãŒã¶ãŒãšã®å ±åäœæ¥ãæ¬çªç°å¢ãžã®ãããã€ãäŸåé¢ä¿ã®ç®¡çã容æã«ãªããŸãã