æ¬æ¥ã¯ãNodeããã³Crystalãã©ãããã©ãŒã ã®é·æãšçæãããã³Duoã§ãŸããŸãå€ãã®ãµãŒããŒãããžã§ã¯ããCrystalã«ç§»è¡ãããçç±ã«ã€ããŠã®ç¿»èš³ã翻蚳ããããšæããŸãã
ããŒã
âæåŸ
æ°å¹Žåã«ããŒãã«åãæ¿ããŸããã åœæç§ãã¡ã¯å°æ°ã®éçºè ãæ±ããå°ããªäŒç€Ÿã§ãããåŸæ¥å¡ã¯ã§ããã ãå€æã§ããå¿ èŠããããŸããã éçºè ãããã³ããšã³ããŸãã¯ããã¯ãšã³ãã«ç¹åã§ããããã«ããããšã¯ãç§ãã¡ã«ãšã£ãŠéæäžå¯èœãªèŽ æ²¢ã§ããã ãµãŒããŒãŸãã¯ã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ã€ã¢ã³ãéšåã§å€ãã®äœæ¥ãè¡ãããå Žåãå°éåéã«é¢ä¿ãªããåé¡ã«å¯ŸåŠã§ãã人ãå¿ èŠã§ããã
Nodeã¯ç§ãã¡ã«ãšã£ãŠå®å šã«æçœãªéžæè¢ã®ããã«æããŸããã JavaScriptãç¥ã£ãŠããéçºè ãæ¡çšããå Žåãããã¯åœŒãã¯ã©ã€ã¢ã³ããããžã§ã¯ããšãµãŒããŒãããžã§ã¯ãã®äž¡æ¹ã§äœæ¥ã§ããããšãæå³ããŠããŸããã ããŒã«ãæ§æãäŸåé¢ä¿ã¯éè€ãããã¹ãŠã®ã¿ã¹ã¯ã¯JavaScriptã䜿çšãããããã¹ãã«ãåäžããŸãã
âçŸå®
ãµãŒããŒã³ãŒããšã¯ã©ã€ã¢ã³ãã³ãŒãã®ç®æšã¯ãŸã£ããç°ãªããŸãããããã®ã¿ã€ãã®ã³ãŒãã«ã¯ãéåžžã«ç°ãªãäœæ¥æ¹æ³ã®ç¥èãå¿ èŠã§ãã éåžžãã¯ã©ã€ã¢ã³ãã³ãŒãã¯ããŠãŒã¶ãŒãšã®å¯Ÿè©±ãã€ã³ã¿ãŒãã§ã€ã¹ã®æŽæ°ããµãŒããŒããã®ããŒã¿èŠæ±ã®å®è¡ã§ãã éçºè ã¯éåžžãwebpackãŸãã¯browserifyã䜿çšããŠã³ãŒããããã±ãŒãžåããReactã§ã€ã³ã¿ãŒãã§ã€ã¹ãéçºããCSSãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠããŒãžã¬ã€ã¢ãŠããç°¡çŽ åããŸããã
ãµãŒããŒäžã§ãããã°ã©ãã¯ããŒã¿ããŒã¹ãžã®SQLã¯ãšãªãORMããã¡ã€ã«ã®èªã¿åããšæžã蟌ã¿ãåŠçãããµãŒãããŒãã£APIãšã®çžäºäœçšãæŽçããŸãã ãµãŒããŒäžã®ããŒã¿ã¹ããªãŒã ã¯ãèŠæ±/å¿çã¢ãã«ã«åŸããŸãã ãªã¯ãšã¹ãéã§ããã¹ãŠã®ã¿ã¹ã¯ãåçãæäŸããå¿ èŠããããããã¯ãã¹ãŠç¹å®ã®æ¹æ³ã§å®è¡ããå¿ èŠããããŸãã ç¹å®ã®ã¹ããããåã®ã¹ãããã§åŸãããçµæã«äŸåããŠããå Žåã察å¿ããããã»ã¹ãé çªã«å®è¡ããå¿ èŠããããŸããããã§ãªãå Žåã¯ã䞊è¡ããŠå®è¡ã§ããŸãã
âæšæºçãªéåææ§
Nodeã¯ãåã¿ã¹ã¯ãéåæã§å®è¡ããããã«èšèšãããŠããŸãã ã€ãŸãã5ã€ã®ã¿ã¹ã¯ãå®äºããããã«Nodeã«äŸé Œãããšã圌ã¯ããããã¹ãŠåæã«å®è¡ããããšããŸãã éå»æ°å¹ŽéãçŽæã¯ãã®ä»äºã®ã¢ãã«ããµããŒãããäž»ãªæ段ã§ããã äžèšã§èšãã°ãPromiseã䜿çšãããšãããã°ã©ãã¯éåæã¿ã¹ã¯ã®ã»ãããé£éã§ããŸããéåæã¿ã¹ã¯ã¯ã次ã ã«å®è¡ãããäžé£ã®ã¹ãããã§ãã
ãµãŒããŒã§ã¯ã䞊åã¿ã¹ã¯ã®æšæºçãªäœ¿çšã¯éåžžã«å¹æçãªã¢ã€ãã¢ã®ããã«æãããããããŸããã å®éã«ã¯ãç§ãã¡ãçŽé¢ããŠããã»ãšãã©ã®ã¿ã¹ã¯ã«ã€ããŠã以åã®ã¿ã¹ã¯ããååŸããããŒã¿ãå¿ èŠã§ãã ã¿ã¹ã¯ã䞊è¡ããŠå®è¡ã§ãããšããŠããã·ã¹ãã ãªãœãŒã¹ã¯ããã«äœ¿ãæããããå¯èœæ§ããããŸããã€ãŸããããŒã¿ããŒã¹ã«å¯Ÿããå€æ°ã®äžŠè¡ã¯ãšãªã®å®è¡ã«ãããæ¥ç¶ã®ããŒã«ã䜿ãæããããåæã«ãµãŒãã¹ãæäŸã§ãããŠãŒã¶ãŒã®æ°ãæžããŸãã
Nodeãé·å¹Žäœ¿çšããŠãçŽæãããã§ãŒã³ãäœæããããšã¯ç§ãã¡ã®æšæºã«ãªããŸããã èšè¿°ãããã³ãŒãã®ååã¯ãéåæã¿ã¹ã¯ãé 次解決ãããã¿ã¹ã¯ã«å€ããããšãç®çãšããŠããŸããã ãããã®äžé£ã®çŽæã¯ããã¹ãããããã°ãé£ãããã³ãŒããç¹ã«ãããã«ããããã§ã¯ãããŸããã ã¿ã¹ã¯ãšãµãã¿ã¹ã¯ãå®è¡ãããé åºã§ãããã³ãŒããåã«èŠãã ãã§ã¯ç解ãã«ããããšããããããŸãã
Nodeã®äœæè ã§ããRoal Dahlã¯ããã®ç¶æ³ãéåžžã«ããŸã説æããã€ã³ã¿ãã¥ãŒã§NodeãšGoãæ¯èŒããŸãã ã
ãããããã®ã·ã¹ãã ãããã°ã©ããŒã«æäŸããã€ã³ã¿ãŒãã§ãŒã¹ã¯ãããã¯ãããŠãããå®éãããã¯ããæåããããã°ã©ãã³ã°ã¢ãã«ã ãšæããŸãã ããããã³ã°ã¢ãããŒãã䜿çšãããšãå€ãã®ç¶æ³ã§ãå®è¡ãããã¢ã¯ã·ã§ã³ã®æ¬è³ªã確èªããæ¹ãã¯ããã«åªããŠããŸãã äžé£ã®ã¢ã¯ã·ã§ã³ãå€æ°ããå Žåãã·ã¹ãã ã«æ¬¡ã®ãããªããšãäŒããæ©èœã¯éåžžã«äŸ¿å©ã§ãããã¿ã¹ã¯Aã解決ããçããåŸ ã£ãŠããšã©ãŒãåºããŠãã ããã åé¡Bã解決ããããåçãåŸ ã€ãããšã©ãŒãè¿ããŸãã Nodeã§ã¯ãé¢æ°åŒã³åºãéã§çµ¶ããããžã£ã³ããããå¿ èŠãããããããããéæããããšã¯ã¯ããã«å°é£ã§ãã
ynåçã¿ã€ã
JavaScriptã§å®æçã«ããã°ã©ã ããŠãã人ã¯ã ãã§ããé ããæ©ãããundefined is not objectããšãããšã©ãŒã«æ £ããã§ãããã ãã®ãšã©ãŒã¯ããªããžã§ã¯ããšèŠãªãããnullå€ãæžã蟌ãŸããŠããå€æ°ã®ã¡ãœãããŸãã¯ããããã£ã«ã¢ã¯ã»ã¹ããããšãããšçºçããŸãã ã³ãŒãã®éåæã»ã¯ã·ã§ã³éã§è»¢éãããããŒã¿ãå¶åŸ¡ããã ãã§ã¯ååã§ã¯ãããŸããããŸããã¢ããªã±ãŒã·ã§ã³ã³ãŒãã®ä»»æã®å Žæã®åã§äœãèµ·ãã£ãŠããããèªèããå¿ èŠããããŸãã ã¢ããªã±ãŒã·ã§ã³ã1ã€ã®ããã»ã¹ããããŒã¿ãåä¿¡ããŠââå¥ã®ããã»ã¹ã«æž¡ããã³ã«ãã¯ã©ãã·ã¥ãçºçããå ŽåããããŸãã ãã¹ãŠã®å¯èœãªå€ãåŠçããå¯èœæ§ãæäŸããªãå ŽåããµãŒããŒã¯ãšã©ãŒãã¹ããŒããããããã«æªãããšã«ãäºæããªãããšãè¡ããŸãã
ã¯ãªã¹ã¿ã«
Nodeã§äœæ¥ããªãããPythonãPHPãRubyãGoãªã©ãä»ã®å€ãã®èšèªãšãã©ãããã©ãŒã ã調ã¹ãŸããã ååãšããŠããããã¯Nodeãããé ãããéçºç®çã«ã¯ããã»ã©äŸ¿å©ã§ã¯ãããŸããã§ããã é床ãšæ§æã¯ãç¹å®ã®å¶éãŸã§ããæé©åã§ããªãèšèªã®2ã€ã®èŠçŽ ã§ãã
ãã®åŸãæšå¹ŽãCrystalèšèªã«é¢ããèšäºãèªã¿ãŸããã ããã¯ãLLVMãä»ããŠãã·ã³ã³ãŒãã«ã³ã³ãã€ã«ãããæ°äžä»£ã®èšèªã®ãã®ã§ãã ãã®æ§æã¯Rubyã«äŒŒãŠããŸãïŒç§ã¯æ°ã«å ¥ã£ãŠããŸãïŒããGoãšåããããé«éã«åäœããŸãïŒãããŠãã®ç£ã¯é床ãåããŸããïŒïŒã
ã¯ãªã¹ã¿ã«ã¯ãŸã éåžžã«è¥ãã§ãããã³ã³ãã³ã管çã·ã¹ãã ã®äžéšã®ãµãŒããŒéšåãã¯ãªã¹ã¿ã«äžã§ããçŽãããšã«ããŸããã ããŸããããŸããã ä»äºäžã«ç§ãèŠã€ãããã®ã¯æ¬¡ã®ãšããã§ãã
- ã¯ãªã¹ã¿ã«ã¯é«æ§èœãåããŠããŸãã ç§ã®ã¿ã¹ã¯ã§ã¯ãNodeã®2åé«éã§ããã
- 䜿çšããã¡ã¢ãªã¯ãããããã§ãã Crystalã¯éåžžãããã»ã¹ããšã«5 MBæªæºãããŒãã¯200 MB以äžå¿
èŠã§ãã
- ãã®çµæãå
žåçãªåé¡ã解決ããããã«åªããæšæºã©ã€ãã©ãªãåããŠããã100åã®NodeäŸåé¢ä¿ãšæ¯èŒããŠã12åã®äŸåé¢ä¿ã®ã¿ãå¿
èŠã§ããã
- ããã©ã«ãã§ã¯ãã³ãŒãã¯åæçã«èŠããNodeãªã©ã®ã€ãã³ãã«ãŒãã䜿çšããŸãããåæå®è¡ã®æŽçã«ã¯è»œéã¹ã¬ããã䜿çšãããGoã®ãããªãã£ãã«ãä»ããŠå¯Ÿè©±ãæŽçãããŸãã ããã«ãããã³ãŒããç解ãããããªããŸãã
- Crystalã¯éçã«åæå®ãããŠãããããã³ã³ãã€ã«æã«ãšã©ãŒãèŠã€ããããšãã§ããŸãã
- Crystalã¯åãæšæž¬ããŸãããã®çµæãå泚éãé »ç¹ã«äœ¿çšããå¿
èŠããªãããããã®åã·ã¹ãã ã¯äœ¿ããããã§ãã
Crystalã§ã®ããã°ã©ãã³ã°ã倧奜ãã ã£ãã®ã§ãCMSã®ããã¯ãšã³ãå šäœããã®èšèªã§æžãçŽããŸããã ãã®APIã¯NodeããŒã¹ã®CMSãšäºææ§ããããããæ¯èŒçå°ãªãåŽåã§Webãµã€ããæ°ããã·ã¹ãã ã«è»¢éããããå€ãã·ã¹ãã ã«æ»ãããã§ããŸãã Crystalã¯ãŸã è¥ããããžã§ã¯ãã§ãããä¿éºãå¿ èŠãªã®ã§ãããã¯éèŠã§ãã
DuoCMSãCrystalã«å®å šã«æžãæããåŸãå®çšŒåç°å¢ã§ãã¹ãããå¿ èŠããããŸããã å®éããã®è³æã®ãªãªãžãã«ã¯ãCrystalã§å®è¡ããããµã€ãã«æçš¿ãããŠããŸãã
NodeNodeãšCrystalã®ã³ãŒãæ¯èŒ
æ¯èŒã®ããã«ã以äžã¯ãCrystalããã³Nodeã§èšè¿°ãããã³ã³ãããŒã©ãŒã³ãŒãã®ãããã«ç°¡ç¥åãããããŒãžã§ã³ã§ãã
ãããNodeäžã®ã³ã³ãããŒã©ãŒã§ãïŒExpressãã¬ãŒã ã¯ãŒã¯ã䜿çšïŒã
const express = require('express') const app = express() const bodyParser = require('body-parser') const UserService = require('user-service') app.use(bodyParser.json()) app.get('/', function (req, res) { res.send('Hello World!') }) app.post('/api/users', function (req, res) { if(request.body){ UserService.save(request.body) .then(function(){ res.send('user saved') }) .catch(function(err){ res.send(err) }) }else{ res.send("no user provided") } }) app.listen(3000, function () { console.log('Example app listening on port 3000!') })
ãããCrystaläžã®ã³ã³ãããŒã©ãŒã§ãïŒKemalãã¬ãŒã ã¯ãŒã¯ã䜿çšïŒã
require "kemal" require "user" require "user-service" get "/" do "Hello World!" end post "/api/users" do |ctx| if (json = ctx.request.body) user = User.from_json(json) UserService.new.save(user) "user saved" else "no user provided" end end Kemal.run
ããã2ã€ã®äŸã®æ§é ãéåžžã«äŒŒãŠããããšã¯ç°¡åã«ããããŸãã ãã ããPromiseãäžèŠã«ãªããšãã³ãŒãã®åèšéã¯æžå°ããŸããã ãã倧ããªã¢ããªã±ãŒã·ã§ã³ãäœæããå Žåãããã¯èãã匷åã§ãã DuoCMS 5ãµãŒããŒã³ãŒãã¯ãçŽ15,609è¡ã®JavaScriptã§æ§æãããŠããŸãã DuoCMS 6ã³ãŒãã¯ã10,186è¡è¿ãã§ãã DuoCMS 6ã«ã¯çŸåšãå®è£ ã«å¿ èŠãªã³ãŒãã30ïŒ å°ãªããããå€ãã®æ©èœããããŸãã åæã«ãçŽæããªãããããã®ã³ãŒãã¯èªã¿ããããä¿å®ããããã§ãã
Crystalã«ã¯äœãæ¬ ããŠããŸããïŒ
éçºè ã¯ãCrystalã®çŸåšã®ãªãªãŒã¹ãã¢ã«ãã¡ããŒãžã§ã³ãšåŒã³ãŸãã ããã§ãçç£çšã«èšèšãããã¯ããã«è€éã§ãªããã¬ãŒã ã¯ãŒã¯ã䜿çšããªããã°ãªããªãã£ãããšãèšããªããã°ãªããŸããã ææªã®ã·ããªãªã§ã¯ãCrystalã¯çŸåšããŒã¿çã§ãã ãã ããéçºè ã®æ³šæã¯ç解ã§ããŸãã ã¢ã«ãã¡çã«ã€ããŠè©±ããŸããããã«ãããæäœãå€æŽãAPIã®ç Žå£ãªã©ã®äœå°ãäžããããŸãã
CrystalãçŽ1幎é䜿çšããŠããŸããããããžã§ã¯ãã®éçºãšãããããŸã ã¢ã«ãã¡çã§ãããšããäºå®ã®ããã«ãããããªå€æŽã«ããééããŠããŸããã ããã³ããšã³ãã§ReactãæŽæ°ããéã«ããã«åé¡ãçºçããŸããã ããã«ãCrystalã¯Crystalã§æžãããŠãããšèšã£ãŠãã䟡å€ããããŸããã€ãŸããåäœããªãããšãå€æããå Žåã¯ãèšèªãšæšæºã©ã€ãã©ãªã§ä¿®æ£ãè¡ãããšãã§ããŸãïŒç§ã¯ããããŸããïŒã
çŸæç¹ã§ã¯ãCrystalã®äž»ãªæ¬ èœæ©èœã«ã¯æ¬¡ã®ãã®ããããŸãã
- Windowsã®ãµããŒãã¯ãŸã ãããŸããïŒããã¯æ°ã«ããŸãããMacã§äœæ¥ããLinuxã§ã³ãŒããå±éããŸãïŒã
- ãŸã çã®äžŠåæ§ã¯ãããŸããïŒNodeã§ã¯ããã§ã¯ãããŸããïŒã
- ã€ã³ã¯ãªã¡ã³ã¿ã«ã³ã³ãã€ã«ã¯ãããŸããïŒããã¯ãã³ãŒãã«å€æŽãå ããåŸã«ã·ã¹ãã ãã³ã³ãã€ã«ããã®ã«éåžžã«äŸ¿å©ãªãããçŽ8ç§ããããŸãïŒã
- Crystalåãã«ååã«ãµããŒããããŠãããªãŒãã³ãœãŒã¹ã©ã€ãã©ãªã¯ããŸããããŸããããããã§ã¯ãCrystalãæ¬æ Œçãªãããžã§ã¯ãã§äœ¿çšãããããã«ãªã£ããšãã«ãã¹ãŠãæŽããŸããã
ç§ãã¡ã«ãšã£ãŠããããã®æ¬ ç¹ã¯ã©ããã¯ãªã¹ã¿ã«ãæŸæ£ããçç±ã§ã¯ãããŸããã§ããã ç§ãã¡ã䜿çšããã©ã€ãã©ãªã«æ¬ ããŠããæ©èœãå®è£ ããè¿œå ãè¡ãå¿ èŠããããŸããããããã¯Nodeã§äœæ¥ããŠãããšãã«ãèµ·ãããŸããã æåŸã«ãã¯ãªã¹ã¿ã«ã«ãšãŠãæºè¶³ããŠãããšèšããŸãã
ãŸãšã
ã¯ãªã¹ã¿ã«ãè©ŠããŠã¿ãŸãããïŒ ã¯ããããã§ãïŒ äºã¯æ¬åœã«çŽ æŽãããã§ãã Crystalã§ããã°ã©ã ããã®ã¯è¯ãããšã§ããã³ãŒãã¯èªã¿ããããç·šéãç°¡åã§ãã ã¡ãªã¿ã«ãCrystalã䜿çšããŠãã®èšèªã®éçºã«è²¢ç®ãã人ãå€ããã°å€ãã»ã©ããã®èšèªã¯è¯ããªããŸãã ãã¹ãŠãèªåã®ç®ã§èŠããã§ããïŒ ã€ã³ã¹ããŒã«æé ã¯æ¬¡ã®ãšããã§ãã ãã¡ãããããžã§ã¯ããµã€ãã§ãã ãããŠãããã¯Crystalãã£ããã§ã ãããããã°ã@ criswardã«ç§ãæžããŠãã ããã
Crystalãå®çšŒåç°å¢ã§äœ¿çšãããã©ãããå°ããå Žåã¯ããããå¿ èŠã§ãã å人çã«ã¯ãå®çšã«é©ãããã®ãäœãå¯äžã®æ¹æ³ã¯ã倱æã蚱容ãããåé¡ã§ãããè©ŠããŠãããåŸã ã«å€§ããªãããžã§ã¯ãã§ããã«åãæ¿ããããšã ãšæããŸãã ããšãã°ãéåžžã«ãã©ãã£ãã¯ã®å€ããããžã§ã¯ããéèŠãªãšãªã¢ã§ãã¯ãªã¹ã¿ã«ãã©ãã§ã䜿çšããŠããŸããã ãã¹ãŠã®ãµã€ããç£èŠããå®æçã«ããã¯ã¢ããããŸããããã«ãCrystalã«äœããçºçããå Žåã«åããŠãNodeã¯åžžã«æå ã«ãããŸãã
芪æãªãèªè ïŒ ãããžã§ã¯ãã§Crystalãè©Šãäºå®ã¯ãããŸããïŒ