ãã®èšäºã¯ãåå¿è ã«ãšã£ãŠããŸãã¯åã«æ¥œãã¿ã®ããã«æãèå³æ·±ããã®ã«ãªãã§ãããã èšäºã䞻芳çãªè©äŸ¡ãšèè ã®æããªæšè«ã«æºã¡ãŠããããšã«æ³šæããŠãã ããã
ããã¯ãã¹ãŠãã®èšäºãšNode.jsãç¥ããããšããé·å¹Žã®é¡ãããå§ãŸããŸããã ãã®ãããªç¶æ³ã®çµã¿åãããèŠéãããšã¯äžå¯èœã§ããïŒã ããããäœãããªããã«ããã®äžã§èŠã€ããã§ãããã
ããã§ã¯å§ããŸãããã ææŠãã
æ°åŒããã¹ãããããã®å°ãããŠãµããµãã®Webã¢ããªã±ãŒã·ã§ã³ãäœæããããšã決å®ãããŸããã ããŠãã€ãŸããããªãã¯å ¥ã£ãŠãåŒãå ¥åãããã¿ã³ãæŒããŠãåŒã®ã¬ã³ããªã³ã°ãžã®ãªã³ã¯ãååŸããŠåã¶ã MathMLã§æ°åŒã玹ä»ããŸãã ãŸãããŸã èå³ã®ããåŒãèŠã€ããŠããã®ã¬ã³ããªã³ã°ãŸãã¯MathMLãååŸã§ããã®ã¯çŽ æŽãããããšã§ãã ãªãœãŒã¹ã®æ¶è²»ãæå°éã«æããããšãéèŠã§ãã
ã¿ã¹ã¯ãå®çŸ©ããããããªãã¢ãŒããã¯ãã£
äžèšã®çµæãšããŠã次ã®ããšãè¡ãããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã¯ãã¯ã©ã€ã¢ã³ããšãµãŒããŒã®2ã€ã®éšåã«å³å¯ã«åå²ãããŠããŸã
- ãã»ãŒããä»ãããµãŒããŒãšã¯ã©ã€ã¢ã³ãã®éä¿¡:) RESTfull
- Node.jsãµãŒããŒäž
- MongoDBããŒã¿ããŒã¹ãšããŠ
ããã«ãã¹ãŠã«ã€ããŠããå°ã
ã¯ã©ã€ã¢ã³ã/ UI /ãã©ãŠã¶
ã¯ã©ã€ã¢ã³ãã¯ãã§ã«ããªãæšæºçãªAngularJSã§ãã ãããŸã§ã®ç§ã®æèŠã§ã¯ããã€ã³ãã£ã³ã°ã解決ããŠã€ã³ã¿ãŒãã§ãŒã¹ãæ§ç¯ããã®ã«ãã以äžè¯ããã®ã¯ãããŸãããç§ã®æèŠã§ã¯ãããã¯Webã¢ããªã±ãŒã·ã§ã³ãäœæããéã®äž»ãªåé¡ã§ããã5ãã©ã¹ã§è§åºŠãæ±ãããšã§ãã ã¯ã©ã€ã¢ã³ãã®æ ŒçŽåº«ã«å ããŠãTypescriptãJadeãããã³Sassã䜿çšããŸããã
- ã¿ã€ãã¹ã¯ãªãã-ã³ãŒããã¢ãžã¥ãŒã«ã«åå²ããå¯èœæ§ã¯æ¯èŒçåçŽã§ããããã¡ãããåä»ããããã³ãŒããèšè¿°ãã人éã®ã¯ã©ã¹ã䜿çšããŠããäœäººã®åé¯ããJSãå«ãã§ãäœã眮ãæããããŸããã
- J-çŸãããã¢ãžã¥ãŒã«ãæ©èœãããããªãºã ã
- Sass-ã¢ãžã¥ãŒã«ãå€æ°ãªã©ã«ã³ãŒããæã¡è² ããèœåã®ãã ç§ã®äººçãå°ãè¯ãããããããªããšã
ããã§ã¯Font Awesomeã¢ã€ã³ã³ãGoogleãããªã¢ã«ã®ãã¬ããã䜿çšããŸãã ããããŸã§ã®ãšããã JQueryãªãã§ãå®è¡ã§ããŸãã
ãµãŒããŒ
ããã§ã¯ããã¹ãŠãäžèŠãããšæããããããã¯ããã«æªãã§ãã ã¡ãªã¿ã«ãç§ã¯äœãæžããããšã¯ãªãããããç§ã®æåã®ãã³ã±ãŒãã§ãããããã»ã©ãŽããŽãããŠããªãããšãå€æããã
æåã«é©ããã®ã¯ãããŸããŸãªã©ã€ãã©ãªã®æ°ã§ãã ãã¡ãããããã¯Javaã§ã¯ãããŸããããã¿ã¹ã¯ã®ããã«ç§ã¯å¿ èŠãªãã¹ãŠãèŠã€ããŸãã
intelã¯ãããŒãã«ãã°ã€ã³ããããã®ããªã䟿å©ã§æ©èœçãªã©ã€ãã©ãªã§ãã
config-æ§æãã¡ã€ã«ã䜿çšããç°¡åãªæ¹æ³
mongoose-ããŒããšã¢ã³ã¬ã®éã®äžçš®ã®äŒæ¢ç¶æ
expressã¯ãããŒãã®Webãã¬ãŒã ã¯ãŒã¯ã§ãã ããŒãäžã«WebãµãŒããŒãäœæããããã§ã«è€éã§ã¯ãªãããã»ã¹ãç°¡çŽ åããŸã
body-parser-ååã瀺ãããã«POSTãªã¯ãšã¹ããåŠçãã
ã¢ãžã§ã³ã-ãžã§ãã¹ã±ãžã¥ãŒãªã³ã°
Libxmljs-XMLã®æäœãããã¯äŸåé¢ä¿ã«JVMããªãå Žåã«éèŠã§ã
ãããã®ã¢ãžã¥ãŒã«ã®å質ã¯ãæåŸ ã©ããã§ã¯ãªãå ŽåããããŸãïŒã ããšãã°libxmljs ... ubuntuã§ã¯ã ã¿ã³ããªã³ãªãã§ã¯ãã®ãããªãã®ã¯é 眮ãããŸããã
cp build/Release/lib.target/xmljs.node build/xmljs.node
ãµãŒããŒåŽã§ããã¯ã©ã€ã¢ã³ããšãŸã£ããåãçç±ã§Typescriptã䜿çšããŸããã ãããããã¡ãåŽã«ããã€ãã®åé¡ããããŸãã...ã¯ã©ã€ã¢ã³ããã³ãŒããè€éã«ãªããªãã¢ãããŒããèŠã€ããããšãã§ããå ŽåãããŒãã§Typescriptã䜿çšãããšãã³ãŒããå°ãè€é/æ··ä¹±ããŸããããæåŠããã»ã©ã§ã¯ãããŸããã§ããã
ãã³ã°ãŒã¹
ããã¯ãããŒã¿ã¹ããŒã ãäœæãããã®ã¹ããŒã ã«åŸã£ãŠmongaããããŒã¿ãèªåçã«æ€èšŒãä¿åãããã³èªã¿åãããšãã§ããèå³æ·±ãã©ã€ãã©ãªã§ãã ããã¯éåžžã«äŸ¿å©ã§äŸ¿å©ãªãã®ã§ãã Mongooseã䜿çšãããšãããŒãããã¢ã³ã¬ãç°¡åã«æäœã§ããŸã...
ããšãã°ããã®ããã«ãæ°ããæ°åŒãããŒã¿ããŒã¹ã«ä¿åã§ããŸã
var formula: any = new entity.Formula(); formula.name = req.body.name; formula.description = req.body.descr; formula.mathml = req.body.data; formula.save();
ãŸãã¯åŒãèŠã€ãã
entity.Formula.find( {_id: req.params.id} ) .select(bdKey) .exec( 'find', (err, formula): void => { if ( err || (formula.length !== 1) ) { res.send( 404 ); } else { res.header("Content-Type", "image/png"); res.send(formula[0][bdKey], {}, function (err) {}); } });
è°é¡
ãã¥ãŒã¯ãããã©ãŒãã³ã¹ã®åé¡ã®ããã«éçºãããŠããåŒå€æã¢ã«ãŽãªãºã ã®ãããªã¢ã«ãŽãªãºã ã®äžå¯æ¬ ãªéšåã§ãã 倧éã®å€æèŠæ±ã«ãããã¢ããªã±ãŒã·ã§ã³ãéåžžã«è¿ éã«åæ¢ããå¯èœæ§ããããŸãã æãè«ççã§ç°¡åãªæ¹æ³ã¯ããã¥ãŒã«å ¥ããããšã§ãã
ãã¥ãŒãæŽçããããã«ãNode.jsã®ã©ã€ãã©ãªãããã€ãããããšã«æ³šæããŠãã ããã ã¢ãžã§ã³ããéžãã çç±ã¯æ¬¡ã®ãšããã§ãã
- MongoDBã«ã¿ã¹ã¯ãä¿åããããšãå¯èœã§ã
- ã©ã€ãã©ãªã䜿çšãããšãéåžžã®æå³ã§ãã¥ãŒãæŽçã§ããã ãã§ãªããã¹ã±ãžã¥ãŒã«ã«åŸã£ãŠã¹ã±ãžã¥ãŒã«ãèšå®ããããšãã§ããŸããããã¯éåžžã«æ¥œããè¿œå æ©èœã§ãã
ãžã§ãããã¥ãŒã«è¿œå
service.agenda.now( 'process new formula', {fid: fid} );
ãžã§ããã³ãã©ãŒã®ç»é²
service.agenda.define('process new formula', (job, done): void => { var data = job.attrs.data; log.debug( "process new formula: " + data.fid ); AgendaService.processRendering( data.fid, done ); });
Libxmljs
ãªã¯ãšã¹ãå ã®ç¹å®ã®ãœãªã¥ãŒã·ã§ã³ãæ€èšŒããããšã¯éèŠã§ãããéèŠã§ãã ããŒã¿ãæ€èšŒããããã«ãåãæ€èšŒãéåžžã«å¹ççã«å®è¡ã§ããååãªèå³æ·±ãexpress-validatorããã³validator.jsã©ã€ãã©ãªãGoogleã§ç®¡çããããšãã§ããŸããã ããããMathMLããã§ãã¯ããå¿ èŠãããããã®ããã«2ã€ã®ã©ã€ãã©ãªxsd-schema-validatorãšLibxmljsã«äŒããŸãã ã æåã¯Java / SAXã䜿çšããŸããã€ãŸããJVMãå¿ èŠã§ãããæåã®æ°åã§äœããããŸããããªãã£ããããLibxmljsã䜿çšããŸããã 圌女ã®ä»äºã«ã¯Javaã¯å¿ èŠãããŸãããããã°ããããããã®ã¯åœŒå¥³ã§ããã
MathMLã®æ€èšŒã«ã¯ã ããã§å ¥æãã2çªç®ã®ããŒãžã§ã³ã®ã¹ããŒã ã䜿çšããŸãã ã
ãã®ãããªãã®ã¯æ€èšŒã®ããã«èŠããŸã
fs.readFile('mathml2.xsd', {encoding:'utf-8'}, (err, data): void => { try { if (err) { process.chdir(cwd); fail(); return } var xsdDoc = libxmljs.parseXmlString(data); var xmlDoc = libxmljs.parseXmlString(xsd); var valid = xmlDoc.validate(xsdDoc); log.debug( "xsd validation" + valid ); process.chdir(cwd); if ( valid ) ok(); else fail(); } catch(e) { process.chdir(cwd); fail(); } });
ã¬ã³ããªã³ã°
æ°åŒã®ã¬ã³ããªã³ã°ã«ã¯ãPhantomJSãšçµã¿åãããŠMathJaxã䜿çšããŸãã æéãã€æãå®å®ãããªãã·ã§ã³ã§ã¯ãããŸããããéãããæéå ã§åŠå®ã§ããªãå©ç¹ãšãªãã»ã©ååã«è¿ éã§ããããšãå€æããŸãã;ïŒã
ã¢ã³ãŽãã
MongoDBã¯ãåŒã®ä¿åã«äœ¿çšãããŸãã ãã©ãŒãã¥ã©ãã¹ãã£ã³ã°ã§ã¯ããããã«ãã°ããã¢ã¯ã»ã¹ã§ããŸãã ãã®ãããMathMLãã¢ã³ã°ã¢ã¹ã«ä¿åãããã ãã§ãªããæ°åŒç»åã®ã¬ã³ããªã³ã°ãä¿åãããŸãïŒã¯ã€ãã¯ã¢ã¯ã»ã¹ã§ã¯ãªããã©ããã«ä¿åããå¿ èŠãããããïŒã åçã¯å€ãã®ã¹ããŒã¹ãå æãããGridFSãªã©ã®è¿œå ã®ã©ã€ãã©ãªããã¬ãŒã ã¯ãŒã¯ã䜿çšããã«ããŒã¿ããŒã¹ã®ãã£ãŒã«ããšããŠä¿åããããã®æšå¥šäºé ã«é©åããŸãã äžæ¹ãã¬ã³ããªã³ã°ãããç»åãMongã«ä¿åãããšããã¡ã€ã«ã·ã¹ãã äžã§æãã§ã¯ãªããããŒã¿ããŒã¹ã«ããŒã¿ãä¿åãããã¹ãŠã®å©ç¹ãåŸãããŸãã
ããŒã¿ã¹ããŒã
module entity.schema { export var IFormula: any = new mongoose.Schema({ name: {type: String, default: ''}, description: {type: String, default: ''}, created: {type: Date, default: Date.now}, modified: {type: Date, default: Date.now}, mathml: {type: String, default: ''}, png200: {type: Buffer}, png100: {type: Buffer}, png50: {type: Buffer}, png200t: {type: Buffer}, png100t: {type: Buffer}, png50t: {type: Buffer}, ready: {type: Boolean, default: false}, error: {type: Boolean, default: false} }); }
ãããžã§ã¯ãã®çµã¿ç«ãŠ
ç§ã¯Gulpã䜿çšããŠãããžã§ã¯ããæ§ç¯ããŸããããããã¯åããŠã®ãå¥åŠãªãäœéšã§ãã...ãã©ã°ã€ã³ã®éãšè³ªã«æºè¶³ããŸããã Gruntã®åŸã«Gulpã®ã¹ã¯ãªãããåããŠæžãããšããç§ã¯èªåã®äººçãçããã¹ã¯ãªãããåãåããŸããã ãã¹ãŠã®çç±ã¯ãGruntã®åŸã䞊åæåã§ã¯ãªãç§ã®è³ã§ãã ãšã©ãŒãèªèããåŸããã«ãã¹ã¯ãªãããããçŽãå§ããŸããããå°ãé ããŠãçŸæç¹ã§ã¯ãŸã äœæ¥ãå®äºããŠããŸããã ã¢ã»ã³ããªã¯ãããã€ãã®Gulpã¿ã¹ã¯ãåŒã³åºãbashã¹ã¯ãªããã«ãã£ãŠå®è¡ãããŸãã ããã¯ãŸã£ããçŸãããã®ã§ã¯ãããŸããããæ©èœããå€æŽã¯ã»ãŒå®äºããŠããŸãã çŸåšãåé¡ã¯äž»ã«ã¿ã€ã ã¹ã¯ãªããã®ã³ã³ãã€ã«ã«ãããéžæãããã¢ãããŒãïŒ1ã€ã®ãã¡ã€ã«ãžã®ã³ã³ãã€ã«ïŒã䜿çšããŠãããããã³ã³ãã€ã«ããã»ã¹ã®çµäºããã£ããããããšã¯ã§ããŸããã ããã§ãæäŒããããŠããã ããŸãã
ã¢ããªã±ãŒã·ã§ã³ãã¹ãã£ã³ã°
Googleã¯ã©ãŠãã®2ã€ã®ãã€ã¯ãã€ã³ã¹ã¿ã³ã¹ã«ã¢ããªã±ãŒã·ã§ã³ãé 眮ããå®éšçšã«300ãã«ã®å¯å€§ãªèŽãç©ã䜿çšããŸããã ã¡ãªã¿ã«ã ããŠãåã³ãã¯ã©ãŠãã䜿çšããããšã®2ã€ã®æèŠã ãŸããéåžžã«ã¯ãŒã«ã§ãã¯ã©ãŠããã¯ãããžãŒã®äœ¿çšã«éåžžã«æºè¶³ããŠããŸãïŒå°ãªããšãçŸåšã®æ®µéã§ã¯ïŒã ãŸãããããŠãã¡ãããè»èã«ããšã®ãªãèèã®æšœã§ã å šäœã®åé¡ã¯ãçŸæç¹ã§ã¯ãããŒãã¢ãžã¥ãŒã«ã®ã€ã³ã¹ããŒã«ãšäžç·ã«ã¯ã©ãŠãã®ã€ã³ã¹ã¿ã³ã¹ã«ã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ããé©åãªå±éã¹ã¯ãªãããèšè¿°ã§ããªãã£ãããšã§ãã ããŒã«ã«ä»®æ³ãã·ã³ã§debianã䜿çšããå Žåãæé ã¯æ£åžžã«æ©èœããŸãããdebianã§ã¯ãã³ãã³ããå®è¡ããŠãã«ãŒãããã§ã¯ãªããŠãŒã¶ãŒãããã®ãã¡ã€ã«ãäœæããããããã¯ã©ãŠãã§ã€ã³ã¹ã¿ã³ã¹ãäœæãããšãã«ãã¡ã€ã«ã¢ã¯ã»ã¹ãšã©ãŒãnpmã€ã³ã¹ããŒã«ã®å®è¡æã«ãã¡ã€ã«ã«ã¢ã¯ã»ã¹ãããšã©ãŒã§ããã ããããåé¡ã¯æ²ãã£ãæã«ãããŸãããã€ã³ã¹ããŒã«ã¯2段éã§å®è¡ãããŸãã æåã«ããŠãŒã¶ãŒã«ä»£ãã£ãŠãã¹ãŠã®ã¢ãžã¥ãŒã«ãäœæãã2çªç®ã«ãã«ãŒãããã€ã³ã¹ããŒã«ããŸãã äžè¬çã«ãç¹ã«Googleã¯ã©ãŠãã®å Žåãã¯ã©ãŠãã¯åªããŠããŸã;ïŒ
ããŠã人çãèã®ããã«èŠããªãããã«ãRFãŸãŒã³ã®ãã¡ã€ã³ãéžæããŸãã ç¹å¥ãªåé¡ã¯ãããŸããã§ããã Nginxã®èšå®ã§punycodeåãæå®ããããã«ãã·ã¢èªã®æåãå ¥ããªãããã«ããå¿ èŠãããå¯äžã®ãã®ã
ç§ã®Nginxã®å Žåããã®ããã«èŠããŸã
listen 80; server_name xn--c1ajpkj4do.xn--p1ai;
ã¢ããªã±ãŒã·ã§ã³ãšJSON
ãã®çµæãéåžžã«èå³æ·±ãã·ã¹ãã ãäœæãããããŒã¿ã¯ãã©ãŠã¶ãŒã®ã€ã³ã¿ãŒãã§ãŒã¹ãããã¹ãŠã®æ®µéã§JSONãªããžã§ã¯ãã«ãã£ãŠè¡šãããããŒããç¶ç¶ããŠããŒã¿ããŒã¹ã§çµãããŸãã ããã¯ãã®ãããªã·ã¹ãã ã§ã®ç§ã®æåã®çµéšã§ãããæ£çŽãªãšãããç§ã¯ããããäžçš®ã®åã³ãåŸãŸããã ã¢ããªã±ãŒã·ã§ã³ã«ããŒã¿å€æããªãå Žåãããã¯ããããªããšã§ãããå人çã«ã¯ããã®ããããªããšã¯ããçšåºŠã®éææ§ãæäŸããå人çã«ã¯è¯ãããšã§ã:)ã
ããŠãæåŸã«äœãèµ·ãã£ãã®ã
æ°åŒããã¹ãã§ããã·ã³ãã«ãªWebã¢ããªã±ãŒã·ã§ã³ã§ããããšãå€æããŸããã éã®ãªãœãŒã¹ãæ¯èŒçå°ãªãïŒGoogle Cloudã®2ã€ã®ãã€ã¯ãã€ã³ã¹ã¿ã³ã¹ïŒãããããªãã·ã³ãã«ã§è² è·ã«åŒ·ãã¢ããªã±ãŒã·ã§ã³ãäœæããããšãã§ããŸããã
äžè¬çã«ãç§ã¯äžèšã®æè¡ã«æºè¶³ããŠããŸããã ããŒãã®ã©ã€ãã©ãªã®æ°ãšè³ªãã³ãŒãã®èšè¿°ã®ããããã«é©ããŸããã äžå¿«ãªæ®çç©ã¯ãããŒãã®ã©ã€ãã©ãªã«ããã€ãã®ãã°ãæ®ã£ãŠããŸããã æã«ã¯ãã¹ãŠãã²ã©ãæªå å·¥ã§æªå®æã«èŠããã ãããããšã©ãŒã¯è§£æ±ºå¯èœã§ããããšãå€æããããã»ã©æéã¯ããããŸããã§ããã ã¡ãªã¿ã«ãJavaã§ããã€ãã®ã©ã€ãã©ãªãã»ããã¢ããããŠç解ãããšããããããšã©ãŒã®è§£æãšä¿®æ£ïŒãœãŒã¹ã§ã®1åã®ç·šéãå«ãïŒã«è²»ããæéãå°ãªããªããŸããã ããã¡ãæããªãã§ãã ãããç§ã¯ããŒããšJavaã®ã¬ãã«ã®éããç解ããŠããŸããç§ã¯æèŠã ãã«ã€ããŠè©±ããŠããã
çµæ
ã³ãŒã
建èšçãªæ¹å€ãšã¬ãã¥ãŒã ãã§ããããã§ãã