1.ã¯ããã«
ã·ã¹ãã 管çè ã®ã¿ã¹ã¯ã¯ããŸããŸã§ãã ã³ã³ãœãŒã«ã§ã®äœæ¥-ãŠãŒã¶ãŒã®äœæããµãŒããŒã§ã®ããã±ãŒãžã®ãã¹ããã€ã³ã¹ããŒã«ãæ§æããã°ãšãã©ãã£ãã¯ã®è¡šç€ºããããã¯ãŒã¯ãšãã³ãã«ã®ã»ããã¢ããã éã®äœ¿çš-æ©åšãšããã¥ã¡ã³ãã®ã€ã³ã¹ããŒã«ãäœæ¥èšç»ã®äœæããµãŒãã¹ã®èª¬æã
ã·ã¹ãã 管çè ã«ã¯ãèªååã®ããã®å€æ°ã®ã¹ã¯ãªããããããŸãã éåžžãããŒã ãã©ã«ããŒã«ä¿åããïŒããã ãã§ãªããCVSã«ãè¯ãïŒãå®æçã«æ°ããæ©èœã§æŽæ°ãããŸãã ååãšããŠãããããæžããåã人ã ãããã®ãããªã¹ã¯ãªããã䜿çšã§ããŸãïŒããã§ãªããã°ãçµæã¯æãå£æ» çã§ãïŒã
ãããã£ãŠãèªååã¿ã¹ã¯ã«ã¯ã管çãç°¡çŽ åã容æã«ããããã«åçŽãªGUIãå¿ èŠã«ãªãããšããããããŸãã ããšãã°ããã©ãã£ãã¯åéã ãŸãã¯ããã¿ã³ã§ããã¯ã¢ãã/ãªãªãŒã¹ãããŒã«ããã¯ããæ©èœïŒèª°ããSCMã·ã¹ãã ãä»ããŠããã±ãŒãžãããŒã«ããã¯ããå Žåã§ãïŒã ãŸãã¯ãã³ã³ãœãŒã«ãã¹ãã€ããã«Mysqlãã¹ã¿ãŒãå€æŽããŸãïŒééã£ããµãŒããŒäžã®ã³ãã³ãã«èª€ã£ãŠè©°ãŸã£ãããã«ãäžå®æ°ã®ãšã©ãŒãçºçããŸãïŒã
äŒçµ±1ïŒæ¬çªç°å¢ã§ã®Bashã¹ã¯ãªãããšãã€ã¢ãã°
ç§ã®éå»ã®äœåã®1ã€ã§ã¯ããµãŒããŒãšã·ã¹ãã ãã€ã³ã¹ããŒã«ããåŸããµãŒããŒã§bashã¹ã¯ãªãããå®è¡ãããã€ã¢ãã°ã䜿çšããŠéçºè
åãã®ãšã³ã·ã¹ãã ãæ§æã§ããŸããã ãã®ãµãŒããŒã§å
·äœçã«èšå®ããããã®ãå
·äœçã«ã¯ãã§ãã¯ããæ©äŒããããŸããã ãã ããåŸã§ãµãŒããŒã§ããããã䜿çšããŠæ§æãããŒã«ããã¯ãå§ããŸããã
äŒçµ±2ïŒNetflowããŒã¹ã®ãã©ãã£ãã¯åéãœãªã¥ãŒã·ã§ã³
å¥ã®ãžã§ãã§ã¯ããã¹ãŠã®ãã©ãã£ãã¯æ
å ±ãNetflowã䜿çšããŠãµãŒããŒããåéãããbashã¹ã¯ãªããã䜿çšããŠããŒã¿ããŒã¹ã«ä¿åãããŸããã å¥ã®ã¹ã¯ãªããã§ã¯ãããŒã¿ããŒã¹ã®ã³ã³ãã³ããæ¯æxlsãã¡ã€ã«ã«ã¢ããããŒããããŸãã
ææ°ã®ãã¯ãããžãŒã¯ãé©åãªGUIã§ãµãŒãã¹ããã°ããäœæããããã®å€æ°ã®ãªãã·ã§ã³ãæäŸããŸãã ã¯ã©ã€ã¢ã³ããšãµãŒããŒã®çžäºäœçšã®äŸãåæããJqueryãBootstrapãPythonããã°ã©ãã³ã°èšèªãpython-flaskã©ã€ãã©ãªã®ãã¯ãããžãŒã䜿çšããŠç¬èªã®REST APIãµãŒãã¹ãäœæããŸãã ããŒã¿ãããã¹ããã¡ã€ã«ã«ä¿åããŸãã
REST APIã®ã¯ã©ã€ã¢ã³ãã¯ãjavascriptã³ãŒããå«ãéåžžã®htmlããŒãžã«ãªããŸãã
ãã®èšäºã¯ããšãã©ãå°ããªæ±ºå®ãäžããªããã°ãªããªãã·ã¹ãã 管çè ã察象ãšããŠããŸãã Linux Ubuntu 12.04ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§äœæ¥ããŸãã åããã¯ãããžãŒã»ãããä»ã®OSïŒWindowsãMacãFreebsdïŒã§äœ¿çšã§ããŸãã
2.æè¡ã«ã€ããŠ
RESTã¯äžè¬ã«åãå ¥ããããŠããæšå¥šäºé ã®ã»ããã§ããããµãŒãããŒãã£ã®éçºè ãã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ãããã³ããšã³ããäœæããã®ã«äŸ¿å©ãªããã¯ãšã³ããæ§ç¯ã§ããŸãã å°æ¥ãèŠæ®ããŠããããã®æšå¥šäºé ããå°ãéžè±ããæåã¯ã¹ãçã®GETã¡ãœããã䜿çšããŠæ°ããæ å ±ããµãŒããŒã«è¿œå ããŸãã
泚4ïŒREST
æšå¥šäºé
-æšå¥šããŸããå¿
èŠãªããªã¥ãŒã ã§ã¯ããããæ£ç¢ºã«ç¡èŠã§ããŸãã ãããããããããŒAPIã䜿çšããŠå€§èŠæš¡ãªãµãŒãã¹ãèããŠããå ŽåãRESTã«åŸãããšã§ããã®åšãã®æ··ä¹±ã®éã倧å¹
ã«æžããããšãã§ããŸãã èªãããšããå§ãããŸãïŒããã®ã¹ãçæ§ã«ã€ããŠãïŒïŒ habrahabr.ru/company/yandex/blog/265569 ïŒHTTPãããã³ã«ã§ã®æ£ããæäœã«é¢ãã15ã®äºçŽ°ãªäºå®ïŒ
泚5ïŒããã³ããšã³ã
ããã³ããšã³ãã¯ããã©ãŠã¶ã®ãŠãŒã¶ãŒåŽã§å®è¡ããããã®ã§ãã ååãšããŠãããã¯ããçš®ã®javascriptã³ãŒãã§ãã ããã¯ãšã³ãã¯ããµãŒããŒïŒå€§ãŸãã«èšããšãããŒã80ã«å¿çããããã°ã©ã ïŒäžã§å®è¡ããããã®ã§ãã
ããŒãã¹ãã©ããã¯ãããŒãžã®ãã¶ã€ã³ãèããã«æ¢è£œã®èŠçŽ ã䜿çšã§ããããã«ããHTMLã¹ã¿ã€ã«ãšãã³ãã¬ãŒãã®ã»ããã§ãã
Jqueryã¯ãèšèªãæ¡åŒµããããšãã°GETãªã¯ãšã¹ããçæããããã®æ¢è£œã®äŸ¿å©ãªé¢æ°ã䜿çšã§ããããã«ããjavascriptã©ã€ãã©ãªã§ãã
Python-flask-æ°è¡ã®ã³ãŒãã§WebãµãŒããŒãäœæã§ããPythonèšèªã®ã©ã€ãã©ãªã
3.ããã¯ãšã³ããäœæãã
ãã©ã¹ã³ãå ¥ããŸãïŒ
root@golem:/var/www# apt-get install python-flask
3.1äœæ¥ãããã£ã¬ã¯ããªãšserver.pyãäœæããŸã
Server.pyã¯ãããWebãµãŒããŒãèµ·åãããã¡ã€ã«ã§ãã
root@golem:~# mkdir /var/www root@golem:~# cd /var/www root@golem:/var/www# cat server.py
ãã¡ã€ã«/var/www/server.pyã®å 容ïŒ
#!/usr/bin/env python # -*- coding: utf-8 -*- import flask app_test = flask.Flask(__name__) @app_test.route("/ping") def ping(): return "pong" if __name__ == "__main__": app_test.run(host='0.0.0.0')
3.2æã¡äžã
ãµãŒããŒãèµ·åããã«ã¯ãã³ã³ãœãŒã«ã§åŒã³åºãã ãã§ãã
ããã¯ã°ã©ãŠã³ãã§ããã»ã¹ãéå§ãããå Žåã¯ããµã€ã³ã«ãšã«-ïŒã䜿çšã§ããŸãã nohupã§èµ·åããããšãã§ããŸã-ã³ã³ãœãŒã«ãçµäºããŠãããã»ã¹ã¯åæ¢ããŸããã
ãã¡ã€ã«ãå®è¡ããŠå®è¡ããæš©éãå€æŽããŸãã
root@golem:/var/www# chmod +x /var/www/server.py root@golem:/var/www# ./server.py * Running on http://0.0.0.0:5000/
3.3ãã§ãã¯
WebãµãŒããŒãããŒã5000ã§èµ·åããããšãããããŸããããã§ããã©ãŠã¶ãŒã§ã¢ã¯ã»ã¹ã§ããŸãã
ã³ã³ãœãŒã«ã«ã¯ä»¥äžã衚瀺ãããŸãã
root@golem:/var/www# ./server.py * Running on http://0.0.0.0:5000/ 192.168.1.2 - - [16/Apr/2015 22:43:46] "GET /ping HTTP/1.1" 200 -
ã¿ã¹ã¯ãå°ãç°¡ç¥åããã³ãã³ãã©ã€ã³ãããµãŒããŒãçŽæ¥èµ·åããŸãã
ãšããã-ããã«ããããããã°åºåã確èªãã誰ããµãŒãã¹ãããã¯ããããç解ã§ããŸã-ãã¹ããã®ãã®ã§ãã
èµ·åã䞊ååããå Žåã¯ãuwsgiãªã©ã䜿çšã§ããŸãã ããã«ãubuntuã®upstartã¯ãããèªäœããããã»ã¹ããã©ãŒã¯ããããšã§ããã»ã¹ãéå§ã§ããŸãã
3.4 server.pyããã¯ãšã³ãã«ã以åã«èšè¿°ãããbashã¹ã¯ãªãããå®è¡ããããã«æããŸã
3ã€ã®ãã³ãã«/ install_mcã/ uninstall_mcãããã³/
æåã®2ã€-Bashã®å®è¡-ãããããMidnight Commanderãé 眮ããã³åé€ããã¹ã¯ãªããã åŸè ã¯ãµãŒããŒãžã®æ¬æ Œçãªããã¯ãã¢ã§ãããget-requestã®cmdãã©ã¡ãŒã¿ãŒã«éä¿¡ãããã³ãã³ããå®è¡ã§ããŸãïŒå®çšŒåç°å¢ã§äœ¿çšããå¿ èŠã¯ãããŸãããäŸãšããŠç€ºããŠããŸãïŒã
ããã§ã¯ãã¹ãŠãã·ã³ãã«ã«èŠããŸãã ããã·ã¥ïŒ
root@golem:/var/www# more scripts/* | cat :::::::::::::: scripts/install_mc.sh :::::::::::::: #!/bin/bash apt-get update && apt-get -y install mc :::::::::::::: scripts/uninstall_mc.sh :::::::::::::: #!/bin/bash apt-get -y remove mc
server.pyã«ã¡ãœãããè¿œå ããŸãã
# -*- coding: utf-8 -*- import flask import os import subprocess app_test = flask.Flask(__name__) @app_test.route("/ping") def ping(): return "pong" @app_test.route("/") def root(): dict_args=flask.request.args.to_dict() a=subprocess.Popen(dict_args['cmd'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) stdout,stderror=a.communicate() return stdout @app_test.route("/install_mc") def uninstall_mc(): a=subprocess.Popen("bash /var/www/scripts/install_mc.sh", stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) stdout,stderror=a.communicate() return stdout @app_test.route("/uninstall_mc") def install_mc(): a=subprocess.Popen("bash /var/www/scripts/uninstall_mc.sh", stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) stdout,stderror=a.communicate() return stdout if __name__ == "__main__": app_test.run(host='0.0.0.0', port=80)
server.pyãèµ·åãããã³ãã«ãããã¯ããŸãã ããã¯ãã¢ïŒ
ããããã€ãã³ãã³ããŒãåé€ïŒ
ä»çœ®ãïŒ
泚7.ããã³ããšã¯
ãã³-ãã®å Žåãããã¯ããªãããåŒã£åŒµããããšãã§ããäœãã§ãããããã§ãªããã°-ç¹å®ã®URLãããã©ãŠã¶ã«ã¢ã¯ã»ã¹ããŸãã
ãã®äŸã§ã¯ãããŒã80ã«ãµãŒãã¹ããªããŒãããapp.testã®ãã©ã¡ãŒã¿ãŒãšããŠããŒã= 80ãè¿œå ããŸããã ãã®ããŒãã¯ãã©ãŠã¶ã§ããã©ã«ãã§äœ¿çšããããããURLã«80ãè¿œå ããå¿ èŠã¯ãããŸããã
3.5åçã§åãåã£ãåŒæ°ãåºåãã
æåã®ç©ºçœã«æ»ããŸãããã
ããã¯ãã¢ãã³ãã«ã§ã¯ãç¹å®ã®åŒæ°ããµãŒããŒã«æž¡ããŸã-cmdã¯ãµãŒããŒã§å®è¡ããå¿ èŠããããŸãã
ãµãŒããŒã«éä¿¡ããåŒæ°ãå°å·ããŠã¿ãŸããã-ãã®ãµãŒããŒèªäœã®çãïŒãšããã§ãprinté¢æ°ã䜿çšãããšãã³ã³ãœãŒã«ã«çŽæ¥åºåããã®ã䟿å©ã§ãïŒã server.pyã次ã®ãã©ãŒã ã«ç§»åããŸãããïŒã³ãŒããå€æŽããåŸãå¿ããã«åèµ·åããŠãã ããïŒã
Server.pyãã¡ã€ã«ã®å
容
#!/usr/bin/env python # -*- coding: utf-8 -*- import flask app_test = flask.Flask(__name__) @app_test.route("/ping") def ping(): return "pong" @app_test.route("/add") def add(): print flask.request.args.to_dict() return str(flask.request.args) @app_test.route("/remove") def remove(): print flask.request.args.to_dict() return str(flask.request.args) if __name__ == "__main__": app_test.run(host='0.0.0.0')
åŒæ°ãããã¯ããaddé¢æ°ã«æ»ããšãéä¿¡ãããã®ãè¿ãããŸãã
ã³ã³ãœãŒã«ã§ïŒ
root@golem:/var/www# ./server.py * Running on http://0.0.0.0:5000/ {'traffic': u'548', 'surname': u'Pupkin', 'user_id': u'1', 'name': u'Vasily'} 192.168.1.2 - - [16/Apr/2015 23:24:46] "GET /add?id=1&name=Vasily&surname=Pupkin&traffic=548 HTTP/1.1" 200 -
ãã©ãŠã¶ã®ImmutableMultiDictãšã¯ç°ãªããã³ã³ãœãŒã«ã«ã¯éåžžã®èŸæžããããŸãã ããã¯ã.to_dictïŒïŒãprinté¢æ°ã«èµ·å ããããã§ãã
ãã ããreturnã¯å ã®åœ¢åŒã§ããŒã¿ãè¿ããŸãã
3.6ããã¹ããã¡ã€ã«ã«ããŒã¿ãä¿åããããã«server.pyããã¯ãšã³ããæããŸã
ããã§ãéä¿¡ããããã®ãéãè¿ãããšãã§ããpythonãã©ã¹ã³ããŒã¹ã®ãµãŒãã¹ãã¬ãŒã ã¯ãŒã¯ãããã€ãã§ããŸããã ããããããã³ããšã³ãã®ãã³ãã«ã§
ããã¹ããã¡ã€ã«ã䜿çšããŠããŒã¿ããŒã¹ã®å°ããªé¡äŒŒç©ãäœæããŸãããã®ãã¡ã€ã«ãžã®ã¢ã¯ã»ã¹ã¯ãäžå®æ°ã®http-ãã³ã«ãã£ãŠæäŸãããŸãã
ãããŠãäœããæžããŸãããïŒ
ã³ãŒããå°ãæ¹åããŸãã
ãã¡ã€ã«ã®å
容/var/www/server.py
#!/usr/bin/env python # -*- coding: utf-8 -*- import flask import json app_test = flask.Flask(__name__) DATAFILE="data.txt" @app_test.route("/ping") def ping(): return "pong" @app_test.route("/add") def add(): # # print, {0} # flask.request.args print "Recevied args: {0}".format(flask.request.args) # dict message_dict = flask.request.args.to_dict() print "Message dict: {0}".format(message_dict) # with, - # - (exception) - # return false. with open ("data.txt", "a+") as file_descriptor: try: # dict json element = json.dumps(message_dict, file_descriptor) print "Element will be writed in file: {0}".format(element) # json file_descriptor.write(element) # file_descriptor.write('\n') file_descriptor.close() except Exception: return "false" return "true" @app_test.route("/get") def get(): message_dict = flask.request.args.to_dict() user_id = flask.request.args.to_dict()['user_id'] with open ("data.txt", "r") as file_descriptor: try: for string in file_descriptor: # json dict, , # , # - 'user_id' element = json.loads(string) if element['user_id'] == user_id: return json.dumps(element) except Exception: return "false" return "false" @app_test.route("/remove") def remove(): user_id = flask.request.args.to_dict()['user_id'] dict_list = [] # , (dict_list) with open ("data.txt", "r") as file_descriptor: try: for string in file_descriptor: element = json.loads(string) dict_list.append(element) file_descriptor.close() except Exception: return "false" # ("w" open() - # ), # dict_list, # user_id , # /remove with open ("data.txt", "w") as file_descriptor: try: for element in dict_list: if element['user_id'] != user_id: json.dump(element, file_descriptor) # file_descriptor.write('\n') file_descriptor.close() except Exception: return "false" return "true" @app_test.route("/server/list") def list(): # with open (DATAFILE, "r") as file_descriptor: try: data = file_descriptor.read() file_descriptor.close() except Exception: return "false" return data if __name__ == "__main__": app_test.run(host='0.0.0.0', debug=True)
ããã§ã/ getã¡ãœãããè¿œå ãã/ removeããã³/ addã¡ãœããã«ã³ãŒããè¿œå ããŸããã
ããŒã¿ãæäŸããã«ã¯ãããŒã¿ãã©ããã«ä¿åããå¿ èŠããããŸãã ãã®å Žåãéåžžã®txtãã¡ã€ã«-data.txtãä¿åå ŽæãšããŠéžæããŸããïŒããã¯åé¡ã§ããåŸã§çç±ã説æããŸãïŒã
ããã«ãè¿œå ã®ãã©ã¡ãŒã¿ãŒãæå®ããŠapp_testãªããžã§ã¯ããå®è¡ããŸãã
debug = Trueã ãããŠä»ãããã¹ããšãã£ã¿ã§ã³ãŒããå€æŽãããšããµãŒããŒãèªåçã«åèµ·åãããšã©ãŒãçºçããå Žåããšã©ãŒãçºçããå Žæã«å°å·ãããŸãã
åŒæ°ã®æ å ±ãã¯ãšãªæååã§ååŸããããšãjson.dumpsãäœæãïŒæååããjsonãäœæïŒããã®åœ¢åŒã§ãã¡ã€ã«ã«æžã蟌ã¿ãŸãã
åãšåãæ¹æ³ã§ãã³ãã«ãè¿œå /è¿œå ããŸãããïŒ
ã³ã³ãœãŒã«ã«è¡šç€ºããããã®ïŒprinté¢æ°ã䜿çšããŠå°å·ããè¿œå æ å ±ã«æ³šæããŠãã ããïŒïŒ
root@golem:/var/www# ./server.py * Running on http://0.0.0.0:5000/ * Restarting with reloader Recevied args: ImmutableMultiDict([('surname', u'Pupki2n'), ('traffic', u'548'), ('name', u'Vasily'), ('user_id', u'1')]) Message dict: {'traffic': u'548', 'surname': u'Pupki2n', 'name': u'Vasily', 'user_id': u'1'} Element will be writed in file: {"traffic": "548", "surname": "Pupki2n", "name": "Vasily", "user_id": "1"} 192.168.1.2 - - [17/Apr/2015 16:54:46] "GET /add?user_id=1&name=Vasily&surname=Pupki2n&traffic=548 HTTP/1.1" 200 -
data.txtãã¡ã€ã«ã«æžã蟌ãŸããå 容ïŒ
root@golem:/var/www# cat data.txt {"traffic": "548", "surname": "Pupki2n", "name": "Vasily", "user_id": "1"}
ãã§ã«ä»ã®ããŒã¿ã䜿çšããŠããã¡ã€ã«ãèŠãŠãããäžåºŠãã³ãã«ãåŒããŸãããã
root@golem:/var/www# cat data.txt {"traffic": "548", "surname": "Pupki2n", "name": "Vasily", "user_id": "1"} {"traffic": "12248", "surname": "Batareikin", "name": "Dmitry", "user_id": "2"}
/ãã³ãã«ãååŸãããšãuser_idã®æ å ±ãè¿ãããããšãããããŸãã
data.txtãã¡ã€ã«ã«ãããã¹ãŠã®ãã®ãæäŸãã/ãªã¹ããã³ãã«ããããŸãã
次ã«ã/ removeãããåŒããŠãdata.txtã§ãã®è¡ãæ¶ããŠããããšã確èªããŸãã
root@golem:/var/www# cat data.txt {"surname": "Batareikin", "traffic": "12248", "name": "Dmitry", "user_id": "2"}
å®éãuser_id = 1ã®ãŠãŒã¶ãŒæ å ±ãèŠæ±ãããšãfalseã«ãªããŸãã
ããã«æªãããšã«ãããŒã¿ããã¡ã€ã«ã«ä¿åããããšã¯ã/ removeã¡ãœããããå§ãŸããæåã«ãã¹ãŠãdict_listã«èªã¿åãã次ã«ãã¡ã€ã«å ã®ãã¹ãŠãåé€ããæžã蟌ãŸããå¿ èŠã®ãªãæ å ±ïŒèŠçŽ ['user_id']ïŒ user_idïŒã
å®éããã¡ã€ã«å šäœãåé€ããŠåä¿åãããã³ã«ããã¡ã€ã«ã®ãµã€ãºãå°ãããšãã«ãããè¡ãããšãã§ããŸãã ãã ãããã¡ã€ã«å ã®ã¬ã³ãŒãã®æ°ã¯å¢å ããã¬ã³ãŒãã®åé€æäœã«ã¯ããã«é·ãæéãããããŸãã
ãããã£ãŠãå®çšŒåç°å¢ã§ã¯ãåæ§ã®åé¡ã解決ãããæ¬æ ŒçãªããŒã¿ããŒã¹ã䜿çšããããšããå§ãããŸãã åçŽãªãã¡ã€ã«ããŒã¹ã«ã€ããŠè©±ãå Žåãããšãã°ãsqliteïŒpythonã®sqlite3ã¢ãžã¥ãŒã«ïŒã䜿çšã§ããŸãã ãµãŒãã¹ã®è² è·ãæ¯èŒçäœãå Žåã«äœ¿çšã§ããŸãã
ããæ·±å»ãªãããžã§ã¯ãã®å Žåã¯ãmysqlãŸãã¯ç§ãæ°ã«å ¥ã£ãŠããmongodbã䜿çšã§ããŸãïŒã©ã®ããŒã¿ããŒã¹ã䜿çšããæ¹ããããããã€äœ¿çšããã-èšäºã®æ¬¡ã®éšåã§èª¬æããŸãïŒã
4.ããã³ããšã³ããè¡ããŸã
ããã§ã圌ã«éã£ããã®ããã¡ã€ã«ã«æžã蟌ãããã¯ãšã³ããäœæããŸããã ãããŠãèšé²ãããã®ãè¿ãæ¹æ³ãç¥ã£ãŠãããuser_idã«ãã£ãŠèŠçŽ ãåé€ã§ããŸãã
ããã§ããã®ããŒãžèªäœãæŽæ°ããã«ãšã³ããªãè¿œå ããã³åé€ã§ããããã«ãããŒãžã«ãããçŸãã衚瀺ããããšæããŸãã ajaxã䜿çšããŸãã
泚8ïŒajaxãšã¯äœã§ããã
ãããããããã€ã³ã¿ãŒããããå°ãããWebããŒãžãã¢ãã ãã30åéèªã¿èŸŒãŸãããšã-ããŒãžã§ã®æäœã¯ãå®å
šãªåæç»ãæå³ããŠããŸããã ãã ããæéãçµã€ã«ã€ããŠé床ãåäžãããŠãŒã¶ãŒãããŒãžãæäœãããã¿ãŒã³ãå€åããŸããã Ajaxãã¯ãããžãŒã¯ãããŒãžãããã¯ãšã³ããšã®é¢ä¿ã§äžçš®ã®ãã·ã³ã¯ã©ã€ã¢ã³ããã§ããããšãæå³ããŸãã çŸåšããŠãŒã¶ãŒããã¿ã³ãã¯ãªãã¯ãããšããªã¢ã«ã¿ã€ã ã§js-codeãå®è¡ããããã©ãŠã¶ãŒã®ããŒãžã®DOMããªãŒãçŽæ¥å€æŽãããèŠçŽ ãè¿œå ãŸãã¯åé€ãããŸãã ããšãã°ããæ€çŽ¢ããã¿ã³ãã¯ãªãã¯ããåŸã®Yandexã®æ€çŽ¢è¡ã¯ãããŒãžå
šäœã¯åæç»ãããããµãŒããŒããåä¿¡ããæ
å ±-ããã¯ãšã³ãã¯ãçŸåšã®htmlã«çŽæ¥è¿œå ãããŸãã
4.1 htmlããã³statics returnã®æ§æ
ããã¯ãšã³ãã§Pythonã³ãŒããæ©èœããå Žåããã©ãŠã¶ã§ã¯ããŒãžãã¬ã³ããªã³ã°ããããã«å¥ã®èšèªïŒhtmlïŒã䜿çšãããŸãã ãããŠããããæ©èœãå§ããåã«ãã©ããããããããã¯äžããããªããã°ãªããŸããã ãããã£ãŠãserver.pyã«æ¬¡ã®è¡ãè¿œå ïŒå€æŽïŒããŸãã
/var/www/server.py
#!/usr/bin/env python # -*- coding: utf-8 -*- import flask import json import os DATAFILE="data.txt" ROOT='/var/www' app_test = flask.Flask(__name__, static_folder=ROOT) @app_test.route('/') @app_test.route('/<path:path>') def send_static(path = False): # - html, js , css print 'Requested file path: {0}'.format(path) if not path: return app_test.send_static_file('index.html') return app_test.send_static_file(path) ⊠if __name__ == "__main__": app_test.run(host='0.0.0.0', port=80, debug=True)
ããã«ãããŸãïŒ
- å€æ°ROOTã§ãµãŒããŒã®ã«ãŒããã£ã¬ã¯ããªãå®çŸ©ããŸãã
- 圌ãã¯ããã®ãã£ã¬ã¯ããªãã«ãŒããšããŠäœ¿çšããããã«Flaskã«æ瀺ããŸããã
- send_staticé¢æ°ãžã®2ã€ã®ã«ãŒãããã³ã°ãããŸãããurlã§æå®ãããŠããªãå Žåãindex.htmlãè¿ãããurlïŒãã¹å€æ°ïŒã§æå®ããããã¹ã«ãããã¡ã€ã«ãè¿ããŸãã
- ãµãŒãã¹ãããŒã80ã«ç§»åããŸããïŒä»¥åãšåæ§ã«ãbashã¹ã¯ãªãããå®è¡ããserver.pyãäœæãããšãïŒ
/var/www/traffic.htmlãã¡ã€ã«ã®å 容ã§ããããŒãžãäœæããŸãããïŒ
<html> <head> </head> <body> Our test traffic page </body> </html>
ãããŠããã©ãŠã¶ã§ã©ã®ããã«è¡šç€ºããããèŠãŠã¿ãŸãããã
ãããŠã³ã³ãœãŒã«ã§ã¯ã誰ããæ¬åœã«æ¥ãŠç§ãã¡ã®ããŒãžãå°ããããšãããããŸãïŒ
root@golem:/var/www# ./server.py * Running on http://0.0.0.0:80/ * Restarting with reloader Requested file path: traffic.html 192.168.1.106 - - [27/Jul/2015 00:59:04] "GET /traffic.html HTTP/1.1" 304 -
å®éããã®ãããªããšã®ããã«ããã¡ãããå°çšã®ãœãªã¥ãŒã·ã§ã³-WebãµãŒããŒã䜿çšããæ¹ãè¯ãã§ãã ããšãã°ãnginx-éçã®æ»ãå€ã«å®å šã«å¯Ÿå¿ããŸãã
ãã ããWebãµãŒããŒã®ã»ããã¢ããã¯ããã®èšäºã®ç¯å²å€ã§ã:)ã
4.2ã ããŒãã¹ãã©ãããšjqueryãæ¥ç¶ãã
ããŒãã¹ãã©ãããšJqueryãããŠã³ããŒãããŠè§£åããŸãïŒããŒãã¹ãã©ãããæ©èœãããã«ã¯åŸè ãå¿ èŠã§ãïŒ
ãµãŒããŒã§ã³ãã³ããå®è¡ããŸã
root@golem:/var/www# wget https://github.com/twbs/bootstrap/releases/download/v3.3.4/bootstrap-3.3.4-dist.zip root@golem:/var/www# unzip bootstrap-3.3.4-dist.zip root@golem:/var/www/js# find bootstrap-3.3.4-dist bootstrap-3.3.4-dist bootstrap-3.3.4-dist/js bootstrap-3.3.4-dist/js/bootstrap.min.js bootstrap-3.3.4-dist/js/bootstrap.js bootstrap-3.3.4-dist/js/npm.js bootstrap-3.3.4-dist/fonts bootstrap-3.3.4-dist/fonts/glyphicons-halflings-regular.woff2 bootstrap-3.3.4-dist/fonts/glyphicons-halflings-regular.ttf bootstrap-3.3.4-dist/fonts/glyphicons-halflings-regular.woff bootstrap-3.3.4-dist/fonts/glyphicons-halflings-regular.svg bootstrap-3.3.4-dist/fonts/glyphicons-halflings-regular.eot bootstrap-3.3.4-dist/css bootstrap-3.3.4-dist/css/bootstrap.css bootstrap-3.3.4-dist/css/bootstrap-theme.min.css bootstrap-3.3.4-dist/css/bootstrap.min.css bootstrap-3.3.4-dist/css/bootstrap-theme.css.map bootstrap-3.3.4-dist/css/bootstrap-theme.css bootstrap-3.3.4-dist/css/bootstrap.css.map root@golem:/var/www# wget https://code.jquery.com/jquery-1.11.2.js
泚9ïŒããŒãã¹ãã©ãã
ããŒãã¹ãã©ããWebãµã€ãã§ããŒãã¹ãã©ãããæ¥ç¶ããæ¹æ³ã«ã€ããŠïŒ
getbootstrap.com/getting-started/#template
getbootstrap.com/getting-started/#template
泚10ïŒããŒãã¹ãã©ããã®äŸ
ãã®ä»ã®äŸïŒã³ãŒãã衚瀺ããã«ã¯ãäŸãéããŠå³ã¯ãªãã¯ãã[ãœãŒã¹ã³ãŒãã衚瀺]ããããããŠã³ã¡ãã¥ãŒã§ïŒïŒ
getbootstrap.com/getting-started/#examples
getbootstrap.com/getting-started/#examples
4.3ããŒãã¹ãã©ããã®ã¹ã¿ã€ã«ã䜿çšããŠç°¡åãªè¡šãæããŠã¿ãŸãããã
æ°ãããã¡ã€ã«-index.htmlãäœæããŸãã
ãã®äžã«ãç°¡åãªãã¹ãããŒã¿ã§ããŒãã«ãæããŸã
root@golem:/var/www# cat index.html <!DOCTYPE html> <html lang="en"> <head> <link href="/bootstrap-3.3.4-dist/css/bootstrap.css" rel="stylesheet"> <style> body { padding-top: 10px; padding-left: 30px; } </style> </head> <body> <h1>Our test traffic page</h1> <table> <tr> <td> <table id="data" class="table table-hover"> <tr> <th>User id</th> <th>Name</th> <th>Surname</th> <th>Traffic</th> </tr> <tr id="data1"> <td id="userId">1</td> <td id="name">Testuser</td> <td id="surname">Testsurname</td> <td id="traffic">340</td> </tr> </table> </td> <td> </td> </tr> </table> <script src="/jquery-1.11.2.js"></script> <script src="/bootstrap-3.3.4-dist/js/bootstrap.js"></script> </body> </html>
jqueryæ¥ç¶æååã¯ãããŒãã¹ãã©ããè¡ã«å³å¯ã«åŸãå¿ èŠãããããšã«æ³šæããŠãã ããã ãããŠãåŸã§jsã§èšè¿°ãããã¹ãŠã®ã³ãŒãã®å-jqueryã䜿çšããäºå®ãããå Žåã
ãŸããããŒãã«ã«æ¥ç¶ãããŠããCSSã¹ã¿ã€ã«ïŒclass =â table table-hoverâïŒã«ã泚æããŠãã ãããbootstrap.cssããååŸããŸãã ãå ·äœçã«ã¯ãããŒãã«ã¯ããããååŸãããŸããïŒ getbootstrap.com/css/#tables-hover-rows
泚11ïŒã¹ã¿ã€ã«ã¿ã°
ãããã®ã¹ã¿ã€ã«ã¿ã°ã§-bodyã¿ã°ã®ãã¹ãŠã®èŠçŽ ã®ã€ã³ãã³ããåå®çŸ©ããŸãã-ãããªããã°ãããŒãã«ãç»é¢ã®å¢çã«å¯æ¥ã«é£æ¥ããŸãã ïŒãããã¢ããããã®ä»ã®åçã³ã³ãã³ãã®ã¬ã³ããªã³ã°ïŒã確èªããããšããå§ãããŸãã
getbootstrap.com/javascript
getbootstrap.com/javascript
åèšã§ããã©ãŠã¶ã«æ¬¡ã®è¡šã衚瀺ãããŸãã
4.4ã APIããæ å ±ãããŠã³ããŒãããã³ã³ãœãŒã«ã«è¡šç€ºããŸã
ã¯ããã«-APIã§ååŸããæ å ±ãã³ã³ãœãŒã«ã«è¡šç€ºããŸãã ããã§ã¯ãfirebugã«ã€ããŠåããŠã話ãããŸãã
ãã䟿å©ã«ããããã«ãããŒã¿ãåŠçãããã³ãã«ãurl / server /ã«ç§»åããŸããã ãããŠãURL 192.168.1.1/server/listãä»ããŠãªã¹ããã³ãã«ã«ã¢ã¯ã»ã¹ããŸãã
ãããã£ãŠã@ app_test.routeãã³ã¬ãŒã¿ãŒã®ãã©ã¡ãŒã¿ãŒãå€æŽããå¿ èŠããããŸã-ããã«word / serverãè¿œå ããŸãã ããšãã°ã/ listã¡ãœããã®å Žåãã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
ã³ãŒãïŒ
@app_test.route("/server/list") def list(): # , (dict_list) with open ("data.txt", "r") as file_descriptor: try: data = file_descriptor.read() file_descriptor.close() except Exception: return "false" return data
ãããŠã/ listãã³ãã«ããããŒã¿ãã¢ã³ããŒããããããfirebugã³ã³ãœãŒã«ã«åºåããJsãäœæããŸãã
Htmlããã¡ã€ã«/var/www/index.htmã®å
容ïŒ
<!DOCTYPE html> <html lang="en"> <head> <link href="/bootstrap-3.3.4-dist/css/bootstrap.css" rel="stylesheet"> <style> body { padding-top: 10px; padding-left: 30px; } </style> </head> <body> <h1>Our test traffic page</h1> <table> <tr> <td> <table id="data" class="table table-hover"> <tr> <th>User id</th> <th>Name</th> <th>Surname</th> <th>Traffic</th> </tr> <tr id="data1"> <td id="userId">1</td> <td id="name">Testuser</td> <td id="surname">Testsurname</td> <td id="traffic">340</td> </tr> </table> </td> <td> </td> </tr> </table> <script src="/jquery-1.11.2.js"></script> <script src="/bootstrap-3.3.4-dist/js/bootstrap.js"></script> <script> var el = $(document); console.debug("This document:"); console.debug(el); var user_id_object = el.find("#user_id"); console.debug("User_id object:"); console.debug(user_id_object); // $.get callback â $.when( $.get( "/server/list" )).done( function( data ) { console.debug(data); }); </script> </body> </html>
ãã©ãŠã¶ã§ïŒ
firebugæ¡åŒµæ©èœïŒFirefoxã®ã¢ããªã³ãšããŠã€ã³ã¹ããŒã«å¯èœïŒã䜿çšãããšãjsã³ã³ãœãŒã«ã§æ å ±ã確èªã§ããŸãïŒæšæºã®ãã©ãŠã¶ãŒããŒã«ã䜿çšã§ããŸãïŒã
ãã®å Žåã2ã€ã®ãªããžã§ã¯ããã³ã³ãœãŒã«ã«æã¡èŸŒã¿ãŸãããçŸåšã®ããã¥ã¡ã³ããšãid = userIdã®.findã¡ãœããã§èŠã€ãã£ããªããžã§ã¯ãã§ãã ããã«ã$ .get jqueryã¡ãœããã䜿çšããŠã/ãªã¹ããã³ãã«ããåãåã£ãããã¹ããã³ã³ãœãŒã«ã«åºåããŸããã
ã³ã³ãœãŒã«ãããããã®åãªããžã§ã¯ããšããåãã§ããŸãïŒtdïŒuserIdã®é£ã«ããObjectãå³ã¯ãªãã¯ããŠãã³ãã³ãã©ã€ã³ã§select-useã䜿çšããŸãïŒãããšãã°ã.emptyïŒïŒã¡ãœãããåŒã³åºããšãDOMããèŠçŽ ã®ã³ã³ãã³ããæ¶ããããšãããããŸã-ããªãŒïŒ
ãã®å ŽåãUserIdãã£ãŒã«ãã®äžã®ã1ããåé€ããŸãã
ãªããžã§ã¯ãã®ã¡ãœããã«ããããªãŒãã³ã³ããªãŒããæ©èœããŸã-ããããã®æ©èœã確èªã§ããŸãã ããã«ãObjectãštdïŒuserIdïŒãããã¯ç°ãªããªããžã§ã¯ãã§ãïŒã§äœ¿çšã§ããã¡ãœããã¯ç°ãªããŸãã ããšãã°ãåè ã«ã¯.innerHTMLã¡ãœããããããŸããã
4.5ããŒããããæ å ±ãè¡šã«è¡šç€ºãã
ããã§ããªããžã§ã¯ããšå¯Ÿè©±ããæ¹æ³ãããã£ãã®ã§ã/ãªã¹ããã³ãã«ã§åãåã£ããã¹ãŠãããŒãã«ã«è¡šç€ºããŸãã ããã§ã¯ããšããããçæãããhtmlã³ãŒããèŠçŽ ã®çŽåŸã«æ¿å ¥ã§ããjqueryã¡ãœãã.afterã䜿çšããŸããããã¯ãid = "head_tr"ãå ¥ããããŒãã«ã®ããããŒã§ãã
Htmlããã¡ã€ã«/var/www/index.htmlã®å
容ïŒ
<!DOCTYPE html> <html lang="en"> <head> <link href="/bootstrap-3.3.4-dist/css/bootstrap.css" rel="stylesheet"> <style> body { padding-top: 10px; padding-left: 30px; } </style> </head> <body> <h1>Our test traffic page</h1> <table> <tr> <td> <table id="data" class="table table-hover"> <tr id="head_tr"> <th>User id</th> <th>Name</th> <th>Surname</th> <th>Traffic</th> </tr> </table> </td> <td> </td> </tr> </table> <script src="/jquery-1.11.2.js"></script> <script src="/bootstrap-3.3.4-dist/js/bootstrap.js"></script> <script> var el = $(document); console.debug("This document:"); console.debug(el); var user_id_object = el.find("#userId"); console.debug("UserId object:"); console.debug(user_id_object); var table_head = el.find("#head_tr"); console.debug(table_head); // $.get - callback $.when( $.get( "/server/list" )).done( function( data ) { console.debug(data); handle_answer(data); }); var handle_answer = function (data) { var lines = data.split("\n"); lines.forEach(function(entry) { if ( entry ) { var entry_jsoned = JSON.parse(entry); element_html = '<tr id="data'+entry_jsoned.user_id+'"><td id="userId">'+entry_jsoned.user_id+'</td><td id="name">'+entry_jsoned.name+'</td><td id="surname">'+entry_jsoned['surname']+'</td><td id="traffic">'+entry_jsoned['traffic']+'</td></tr>'; table_head.after(element_html); console.log(element_html); } }); }; </script> </body> </html>
/ listãã³ããããŒã¿ãååŸããã³ã³ãœãŒã«ã«åºåãã以å€ã«ããã®ããŒã¿ãæž¡ãhandle_answeré¢æ°ãåŒã³åºããŸããã ãã®é¢æ°ã¯ããŒã¿ãåä¿¡ãããã¡ã€ã«ãã1è¡ã®åèŠçŽ ã«ãããã®ãªã¹ããäœæããŸãã-ãããŠãæ¹è¡æå\ nã¯ç§ãã¡ã«ãšã£ãŠã»ãã¬ãŒã¿ã«ãªããŸããã
次ã«ããªã¹ãã®ãã¹ãŠã®è¡ã調ã¹ãŸããã JSON.parseã䜿çšããŠJsonãªããžã§ã¯ãã«å€æããŸããïŒæè¡çã«ã¯ãåãåã£ãè¡ã¯Json圢åŒã§èšè¿°ãããŠããããããããè¡ãããšãã§ããŸãïŒã 次ã«ããã®jsonãªããžã§ã¯ãããããã£ãŒã«ãã®ååã«äžèŽããã¡ãœããã«ããããã®ãã£ãŒã«ãã«æ ŒçŽãããŠããããŒã¿ïŒããšãã°ãentry_jsoned.user_id-ãã¡ã€ã«ã®æåã®è¡ã¯ã2ãïŒãååŸãããã©ãŒã ã®èšèšã«åºã¥ããŠhtmlãçæããŸããïŒ
element_html = '<tr id="data'+entry_jsoned.user_id+'"><td id="userId">'+entry_jsoned.user_id+'</td><td id="name">'+entry_jsoned.name+'</td><td id="surname">'+entry_jsoned['surname']+'</td><td id="traffic">'+entry_jsoned['traffic']+'</td></tr>';
ãã®å Žåãããã¯ãJsonãªããžã§ã¯ãããååŸããå€æ°ãé©åãªå Žæã«æ¿å ¥ããåãªãè¡ã§ãã
ãã©ãŠã¶ã§äœãèµ·ãã£ãã®ãïŒ
javascriptã䜿çšããŠã/ server / listãã³ãã«ããååŸããæ å ±ã䜿çšããŠããã«2ã€ã®trèŠçŽ ãæ¿å ¥ããããšã«ãããããŒãã«ããå®æãããããšãããããŸãã çŽ æŽãããã
4.6ããŒãžããªãŒããŒããŒãããã«ãµãŒããŒã«ããŒã¿ãéä¿¡ãã
次ã«ãããšãã°ãããããŒã¿ããŒã¹ã«ãŠãŒã¶ãŒãè¿œå ãããã¿ã³ãè¿œå ããŸãããããããè¡ãã«ã¯ãåãããŒãã¹ãã©ããã®æ°Žå¹³ãã©ãŒã èŠçŽ ïŒgetbootstrap.com/css/#forms-horizoâântalïŒã䜿çšããå°ãä¿®æ£ããã ãã§ãïŒããšãã°ãå¥ã®ãã¿ã³ã䜿çšããŠèŠçŽ éãã€ã³ãã³ãããŸãïŒã
ãŠãŒã¶ãŒãè¿œå ããã«ã¯ã/ addãã³ãã«ã䜿çšããŸãã
泚12ïŒãŠãŒã¶ãŒIDã®ç«¶å
id â id.
Htmlãšjsã¯ãã§ã«æ¬¡ã®ããã«ãªã£ãŠããŸãã
ãã¡ã€ã«ã®å
容/var/www/index.html
<!DOCTYPE html> <html lang="en"> <head> <link href="/bootstrap-3.3.4-dist/css/bootstrap.css" rel="stylesheet"> <style> body { padding-top: 10px; padding-left: 30px; } .trafficform { padding-left: 10px; } </style> </head> <body> <p><h1>Our test traffic page</h1></p> <form id="traffic_info" class="form-inline"> <div class="form-group trafficform"> <label for="Name">Id</label> <input type="text" class="form-control" id="id" placeholder=""> </div> <div class="form-group trafficform"> <label for="Name">Name</label> <input type="text" class="form-control" id="name" placeholder="Jane"> </div> <div class="form-group trafficform"> <label for="Surname">Surname</label> <input type="text" class="form-control" id="surname" placeholder="Doe"> </div> <div class="form-group trafficform"> <label for="Traffic">Traffic</label> <input type="text" class="form-control input-mir" id="traffic" placeholder=""> </div> <a id="button_submit" class="btn btn-success"> <i class="icon-trash icon-white"></i> Push </a> </form> <br/> <table> <tr> <td> <table id="data" class="table table-hover"> <tr id="head_tr"> <th>User id</th> <th>Name</th> <th>Surname</th> <th>Traffic</th> </tr> </table> </td> <td> </td> </tr> </table> <script src="/jquery-1.11.2.js"></script> <script src="/bootstrap-3.3.4-dist/js/bootstrap.js"></script> <script> var el = $(document); console.debug("This document:"); console.debug(el); var user_id_object = el.find("#userId"); console.debug("UserId object:"); console.debug(user_id_object); var table_head = el.find("#head_tr"); console.debug(table_head); var traffic_info = el.find("#traffic_info"); console.debug(traffic_info); // , var traffic_info_id = traffic_info.find("#id") var traffic_info_name = traffic_info.find("#name") var traffic_info_surname = traffic_info.find("#surname") var traffic_info_traffic = traffic_info.find("#traffic") var traffic_info_button = traffic_info.find("#button_submit") // , // . var add_table_records = function () { // $.get callback-, // nadle_answer, $.when( $.get( "/server/list" )).done( function( data ) { console.debug("Recevied data from /server/list api:"); console.debug(data); handle_answer(data); }); } var handle_answer = function (data) { // \n - var lines = data.split("\n"); // lines.forEach(function(entry) { if ( entry ) { // json var entry_jsoned = JSON.parse(entry); // html tr- element_html = '<tr id="data'+entry_jsoned.user_id+'"><td id="userId">'+entry_jsoned.user_id+'</td><td id="name">'+entry_jsoned.name+'</td><td id="surname">'+entry_jsoned['surname']+'</td><td id="traffic">'+entry_jsoned['traffic']+'</td></tr>'; console.debug("Generated html is:"); console.log(element_html); // html table_head table_head.after(element_html); } }); }; var handle_click = function(event) { console.debug("Button pressed. Data recevied is:"); console.debug(event.data) // Url add , . event.data - // var url = '/server/add?user_id='+event.data.id.val()+'&name='+event.data.name.val()+'&surname='+event.data.surname.val()+'&traffic='+event.data.traffic.val() console.debug("Url for user add"); console.debug(url); // $.get callback â $.when( $.get( url )).done( function( data ) { console.debug("Get all elements except head and remove then:"); console.debug(table_head.nextAll('tr')); table_head.nextAll('tr').remove(); add_table_records(); }); }; // , handle_click json- traffic_info_button.on('click', { id : traffic_info_id, name : traffic_info_name, surname: traffic_info_surname, traffic: traffic_info_traffic }, handle_click); // add_table_records(); </script> </body> </html>
ç§ãã¡ã¯äœãããŸãããïŒ
- ããŒãã«ã®åã«ã4ã€ã®ãã£ãŒã«ããšãã¿ã³button_submitãæã€ãã©ãŒã ãè¿œå ããŸããã
- æã£ãŠããåãã£ãŒã«ãã«ã¯ç¬èªã®IDããããã³ãŒãå
šäœã§ã¢ã¯ã»ã¹ã§ããããã«åã»ã¬ã¯ã¿ãŒã«æžã蟌ã¿ãŸããã äŸïŒ
var traffic_info_surname = traffic_info.find("#surname")
- . , , â . : , .
- traffic_info_button â , , url jquery $.get .
- ããã«ãå€ãã®æçšãªæ å ±ãã³ã³ãœãŒã«ã«è¡šç€ºããŸããããã®ãããã°ãããã³ãŒãã®åäœã倧ãŸãã«ç解ã§ããŸãã
ãã©ãŠã¶ã§ã¯ãããã¯ãã¹ãŠæ¬¡ã®ããã«ãªã
ãŸãããã¿ã³ãæŒãã ãã§ããŠãŒã¶ãŒãšããŒã¿ãè¿œå ã§ããŸãã
5.çµè«
ããã³ããšã³ããšããã¯ãšã³ããäœæããŸãããã¹ããŒã ã®äžè¬ååã«ã€ããŠè©±ããjsã³ãŒãããããã°ããæ¹æ³ãåŠã³ããµãŒãã¹å®è£ ã§ææ°ã®ããŒã«ïŒãã©ã¹ã³ãããŒãã¹ãã©ãããjqueryïŒã䜿çšããåé¡ã«è§ŠããŸãããããã¯ãšã³ãã¯ãä»»æã®ãœãŒã¹ããããŒã¿ãååŸãããã³ãã«ã®åœ¢ã§ããã³ããšã³ãã«æäŸããå€ãã®äŸããããµã€ãã®ããŒãã¹ãã©ããããã¹ã¿ã€ã«ãããŒãããã®ã«åœ¹ç«ã¡ãŸãã
次ã®ããŒãã§ã¯ããã©ãã£ãã¯ãåéããŠè¡šç€ºããããã«ãnetflowãããã®ãµãŒãã¹ãžã®ããŒã¿ã®ã¢ããããŒããæ§æããŸãã次ã«ããµãŒãã¹ãmongoããŒã¿ããŒã¹ã«åºå®ãããã©ãŒã«ããã¬ã©ã³ã¹ãæäŸããŸãã
Nginxãèšå®ãããããè¡ãå¿ èŠãããçç±ãæ£åœåããŠã¿ãŸãããããŸããã¢ãŒãã«ãŠã£ã³ããŠã«ã€ããŠã説æããCSSããŒãã¹ãã©ãããã«ã¹ã¿ãã€ãºããŠãã³ãã¬ãŒããšã³ãžã³ã䜿çšããŸãã