é çã®ãªãä¿åæžã¿ãªããžã§ã¯ãïŒObjectScriptããã³Pythonã§Cachéãªããžã§ã¯ããæäœããç°¡åãªäŸ
![](https://habrastorage.org/webt/jb/ba/sp/jbbaspnh-olgr2ot_f2peelsifc.jpeg)
ãã€ã·ã¥ãŽã¡ã³ã·ã¥ã¿ã€ã³å
2020幎6æãæ£ç¢ºã«50幎éã®è¡šåœ¢åŒã®ããŒã¿ãŠã§ã¢ããŠã¹ããŸãã¯æ£åŒã«ã¯ãªã¬ãŒã·ã§ãã«ããŒã¿ã¢ãã«ã ããã¯å ¬åŒææžã§ã- åãæåãªèšäºã§ãã ãšãã¬ãŒã»ãã©ã³ã¯ã»ã³ããå士ã«æè¬ããŸãã ãšããã§ããªã¬ãŒã·ã§ãã«ããŒã¿ã¢ãã«ã¯ãéå»100幎éã§æãéèŠãªã°ããŒãã«ã€ãããŒã·ã§ã³ã®ãã©ãŒãã¹ãªã¹ãã«èŒã£ãŠããŸãã
äžæ¹ãå¥åŠãªããšã«ãCoddã¯ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ãšSQLèšèªã圌ã®çè«ã®æªãã å®è£ ãšèŠãªããŠããŸããã ã¬ã€ãã©ã€ã³ãšããŠã圌ã¯ãã¹ãŠã®ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ç®¡çã·ã¹ãã ãæºããå¿ èŠã®ãã12ã®ã«ãŒã«ïŒå®éã«ã¯13ã®ã«ãŒã«ïŒãéçºããŸããã å®éãä»æ¥ãäžçã§ã¯å°ãªããšãCoddã®ãã«ãŒã«0ããæºããDBMSãèŠã€ãããªããããDBMSã100ïŒ ãªã¬ãŒã·ã§ãã«ãšåŒã¶ããšã¯ã§ããŸãã:)äŸå€ããããããããŸããã
ãªã¬ãŒã·ã§ãã«ã¢ãã«ã¯ããã»ã©è€éã§ã¯ãªããå šäœã«ããã£ãŠç 究ãããŠããŸãã ããã«æ·±ãç 究ãããŠãããããããŸããã äžæ¹ã2019幎ã®ä»å¹Žã¯ãŸãå¥ã®èšå¿µæ¥ãç¥ããŸã-ã¡ããã©10幎åãïŒNoSQLããã·ã¥ã¿ã°ã圌ã¯åŸã«ãSQLã ãã§ãªããTwitterã«ç»å ŽããããŒã¿ããŒã¹ã¢ãã«éçºã®å®è·µã«æ¥éã«æµžéãå§ããŸããã
ãªããããªã«é·ã玹ä»ã§ããïŒ ããã°ã©ãã³ã°ã®äžçã¯ããŒã¿ïŒããã³ãã¡ããã¢ã«ãŽãªãºã ïŒã§æ§æãããŠãããšããäºå®ãšããªã¬ãŒã·ã§ãã«ã¢ãã«ã®ç¬å çå°äœã¯ãããäžå¯§ã§ãããããããã°ã©ããŒã®åè£æèã«ã€ãªãããŸãã éçºè ã®é ã«ããäœæ¥ãªããžã§ã¯ãïŒOOPãåèšã§ããïŒïŒã®ããããããã®ãªã¹ãããã¥ãŒãããªãŒãããŒããèŸæžãã¹ã¬ãããªã©ã¯ãã¹ãŠããŒãã«ã§ã¯ãããŸããã
ç¶ããŠãææ°ã®DBMSã®ã¹ãã¬ãŒãžã¢ãŒããã¯ãã£ã«ã€ããŠèŠããŠããŸããïŒ ççŽã«èšã£ãŠã圌ãã®æ£ããèãã®èª°ãããŒãã«ã®åœ¢ã§ããŒã¿ãä¿åããŸããã DBMSéçºè ã¯ãã»ãšãã©ã®å ŽåãããŸããŸãªBããªãŒïŒããšãã°ãPostrgeSQLïŒã䜿çšããŸãã äžæ¹ãDBMSã䜿çšããŠæ ŒçŽããããªã±ãŒãããéããŒãã«ã§åäœããŸãã ãããŠããã«ãããããã°ã©ããŒã¯ã»ãã³ãã£ãã¯ãªã®ã£ãããšäžåšçšãªäžéããŒã¿ã¬ã€ã€ãŒãåžžã«ã€ãªãããã«ãªããŸãã ãããŠãããã«ãããå éšã®äºåç·åŒµãåŒãèµ·ãããå šèº«ã®äžå¿«æãšäžç çããããã°ããŸãã
ã€ãŸããèŠããã«ççŸããããŸããããŒã¿ãã¿ã¹ã¯ã«é©ãããªããžã§ã¯ãã«ããã¯ããä¿åãããšãã«ããã€ãã®ããŒãã«ãåŠçããå¿ èŠããããŸãã
絶æïŒ ããã:)ãããããªããžã§ã¯ããªã¬ãŒã·ã§ãã«ãããã³ã°ã«ã€ããŠã¯ã©ãã§ãããããããã¯ORMã®äžè¬çãªè©±ã§ããïŒ ãã®èæŠã仲éãšå ±ã«ã€ãŽãŒã«ã»ãã¬ãšã³ã³ã«ä»»ããŸãããã ãããŠã ããããããã«ãããš ãåäžçŽã®ãã®å šäœã®ç©èªã¯ç§ãã¡ãå¿é ããã¹ãã§ã¯ãããŸãã ã
ãã¡ãããããã€ãä»ãããã°ãïŒRobert Martin "Clean Architecture"ïŒã¯ãã·ãªã¢ã«åããŠãã¡ã€ã«ã«ããããããããä»ã®é©åãªã¹ããªãŒã ã«ããã·ã¥ãããã§ããããšã«èšåãã䟡å€ããããŸãã ãããã第äžã«ãèšèªã§ããã«å¶éããã第äºã«ãDBMSã«æ ŒçŽããããšã ããå¿é ããããã«ãªããŸãã
ãã€ãããã°ã䜿çšãããããã®æµ®ãæ²ã¿ã«ã¯ãåªããäŸå€ããããŸããã€ã³ã¿ãŒã·ã¹ãã ãºCachéDBMSïŒããã³çŸåšã¯ã€ã³ã¿ãŒã·ã¹ãã ãºIRISããŒã¿ãã©ãããã©ãŒã ïŒã§ãã ããã¯ãããããéçºè ããèªæãªããšãé ãããããã«å ãžé²ãäžçã§å¯äžã®DBMSã§ããã€ãŸããããããæ£ããä¿åããæ¹æ³ããèããããšãã解æŸãããŸãã ã¯ã©ã¹ãPersistentå±ãç¶ç¶ããèŠç¹ã¯åžœåã ã€ãŸãã°ããŒãã« ïŒã°ããŒãã«å€æ°ãšæ··åããªãã§ãã ããïŒïŒã«ãããšèšãã ãã§ååã§ãã
æåã¹ããªãŒã ããã€ããªã¹ããªãŒã ãªã©ãããããçš®é¡ã®ããŒã¿ãä¿åã§ããŸãã 以äžã«ç°¡åãªäŸã瀺ããŸãã
// - // : , , , , Class FW.Events Extends %Persistent { Property "My name" As %String; } // // «» set haJS = ##class(FW.Events).%New() // write haJS.%Id()
ããã«ãããã¯çŽ æŽãããããšã§ããCachéãã€ãã£ãã®ObjectScriptã ãã§ãªããPythonãJavaãJavaScriptãC ++ãCïŒãPerlã§çŽæ¥ãªããžã§ã¯ããååŸããã³ä¿åããããšã§ãæ ŒçŽããããªããžã§ã¯ããšéä¿¡ã§ããŸãã ãããŠãããã«æããã:)ã SQLã¯ãšãªãä»ããŠåããªããžã§ã¯ãããçŽæ¥æ å ±ãååŸããããšãã§ããŸãããŸãããªããžã§ã¯ãã§ç¬èªã®ã¡ãœãããåŒã³åºãããšãã§ããŸãã ããæ£ç¢ºã«ã¯ããã®å Žåã®ã¡ãœããèªäœïŒããã³ããžãã¯ã¯ãŒãSqlProcïŒã¯ã¹ãã¢ãããã·ãŒãžã£ã«ãªããŸãã ãã¹ãŠã®éæ³ã¯ãã§ã«CachéDBMSã®å éšã«ãããŸãã
ã·ã¹ãã éCachéDBMSãžã®ç¡æã®ãã¹ãã¢ã¯ã»ã¹ãååŸããæ¹æ³Eclipseã«åºã¥ãAtelier IDEã䜿çšããŠãObjectScriptã³ãŒããæäœããCachéDBMSãµãŒããŒïŒããã³InterSystems IRISãã©ãããã©ãŒã ïŒã«çŽæ¥ã¢ã¯ã»ã¹ããã®ãæã䟿å©ã§ãã ãã¹ãŠã®ããŠã³ããŒãããã³ã€ã³ã¹ããŒã«æé ã¯ãã¡ãã§ãã
æªã®èšèªãäœãšèšã£ãŠããããã¯çµ¶å¯Ÿã«æ¬åœã§ãïŒ :) ããã§ã Cachéã®ãã«æ©èœããŒãžã§ã³ã®ã·ã³ã°ã«ãŠãŒã¶ãŒãããŠã³ããŒãããŠã€ã³ã¹ããŒã«ã§ããŸãïŒç¡æã§ç»é²ããå¿ èŠããããŸãïŒã ãã«ãã¯ãMacOSãWindowsãããã³Linuxã§å©çšå¯èœã§ãã
ãã䟿å©ã§éŠŽæã¿ã®ãã人ã«ãšã£ãŠã¯ãå¿«é©ã§ã·ã³ãã«ãªVisual Studio Codeã䜿çšã§ããã³ãã¥ããã£ãéçºããObjectScriptãã©ã°ã€ã³ã§è£å®ã§ããŸãã
ãããŠä»ãããã€ãã®å®çšçãªäŸã ããã€ãã®é¢é£ãªããžã§ã¯ããäœæããŠãObjectScriptãšPythonã§ããããæäœããŠã¿ãŸãããã ä»ã®èšèªãšã®çµ±åãåæ§ã«å®è£ ãããŸãã Pythonã¯ãObjectScriptãšã®ãæ倧ã®èŠªåæ§ãã®çç±ã§éžæãããŸã-äž¡æ¹ã®èšèªã¯ã¹ã¯ãªããå¯èœã§ãOOPããµããŒããã匷ãåä»ãã¯ãããŸãã:)
äŸã®ã¢ã€ãã¢ã«ã€ããŠã¯ã掻çºãªããããã¹ã¯ïŒãããããšæ··åããªãã§ãã ããïŒïŒãã·ããã¢ã³ããŽãŒããŒãã£ãŒããã¬ãŒã ã¯ãŒã¯ã®ãããžã§ã¯ãã«ç®ãåããŸãã ã€ããªãã®ãŒã®ãœãŒã¹ã³ãŒãã¯github.com/Hajsru/framework-weekendã«ãããŸãããœãŒã¹ã³ãŒãã¯ããã¹ããäœããªã£ãŠããŸãã
macOSãŠãŒã¶ãŒã«ãšã£ãŠéèŠãªãã¥ã¢ã³ã¹ã Pythonã®ãµããŒãã¢ãžã¥ãŒã«ãéå§ããå ŽåãCachéãã€ã³ã¹ããŒã«ãããã£ã¬ã¯ããªãžã®ãã¹DYLD_LIBRARY_PATHãæå®ããå¿ èŠãããããšãèŠããŠããå¿ èŠããããŸãã ããšãã°ã次ã®ããã«ïŒ
export DYLD_LIBRARY_PATH = / application / Cache / binïŒ$ DYLD_LIBRARY_PATH
ãã㯠ãããã¥ã¡ã³ãã«å ·äœçã«ç€ºãããŠããŸãã
ObjectScriptã§ã¹ãã¢ãã¯ã©ã¹ãäœæããŸã
è¡ããŸãããã Cachéã®ã¯ã©ã¹ã¯éåžžã«åçŽã§ãã IDEãªãã§ãå®è¡ã§ããŸããCachéãã©ãããã©ãŒã ã€ã³ã¹ã¿ã³ã¹ã®ããŒã¿ã«ããã¯ã©ã¹ã³ãŒããçŽæ¥ã³ããŒããŸãïŒã¯ããCachéDBMSã¯åãªãDBMSã«ã¯ã»ã©é ãã§ãïŒïŒã·ã¹ãã ãã©ãŠã¶>ã¯ã©ã¹>ã€ã³ããŒãïŒããŒã ã¹ããŒã¹USERïŒã
ä¿ååŸããªããžã§ã¯ãã¯å¯Ÿå¿ããã¯ã©ã¹ã®ååãšäžèŽããååã§ã°ããŒãã«è¡šç€ºãããŸãã ãŸããCaché管çããŒã¿ã«ã®[ã·ã¹ãã ãã©ãŠã¶]> [ã°ããŒãã«ïŒããŒã ã¹ããŒã¹USERïŒ]ã確èªããŸãã
// , , Class FW.Event Extends %Persistent { Property title as %String; Property description as %String; Property date as %Date; Property visitors as list of FW.Attendee; } // / Class FW.Attendee Extends %Persistent { Property name As %String; }
PythonããCachéã®ãªããžã§ã¯ãã«ã¢ã¯ã»ã¹ãã
æåã«ãCachéDBMSããŒã¿ããŒã¹ã«æ¥ç¶ããŸãã ããã¥ã¡ã³ããŒã·ã§ã³ã®ããã«ç¹°ãè¿ããŸã ã
圹ã«ç«ã€æçšãªäºå®ã ç¡æã§ãCachéDBMSã®ãã¬ãŒãã³ã°ããŒãžã§ã³ã§ããããŸããããã«ãããå®å šã«æ©èœããããŒãžã§ã³ã§å©çšå¯èœãªãã¹ãŠãå®è¡ã§ããŸãããã¢ã¯ãã£ããªæ¥ç¶ã¯2ã€ããèš±å¯ãããŸããã ãããã£ãŠãåæã«ãIDEããã®æ¥ç¶ãç¶æãããµãŒããŒãšå¯Ÿè©±ããããã«ä»ã®ã³ãŒããå®è¡ããããšããããšã¯ã§ããŸããã æãç°¡åãªè§£æ±ºçã¯ãPythonã³ãŒãã®å®è¡äžã«IDEãéããããšã§ãã
# Caché Python3 import intersys.pythonbind3 # conn = intersys.pythonbind3.connection() conn.connect_now("localhost[1972]:USER","_SYSTEM","SYS", None) # print ("conn = %d " % conn.handle) # database = intersys.pythonbind3.database(conn)
ãããŠãITã€ãã³ããšãã®åå è ã®ãªããžã§ã¯ãããŒã¿ããŒã¹ãäœæããŸãã ãšãŠãç°¡åã§ãã 1ã€ç®ã¯ãã€ãã³ãåå è ã«é¢ããæ å ±ãç»é²ããã³ä¿åããããã®ã¯ã©ã¹ãäœæããããšã§ãã ã¯ã©ã¹ãåçŽåãããããã¡ã³ããŒåã®ã¿ã
# class Attendee: # def __init__ (self): self.att = database.create_new("FW.Attendee", None) # id def new (self, name): self.att.set("name", name) self.att.run_obj_method("%Save",[]) # id def use (self, id): self.att = database.openid("FW.Attendee",str(id),-1,-1) # def clean (self): id = self.att.run_obj_method("%Id",[]) self.att.run_obj_method("%DeleteId", [id])
ã芧ã®ããã«ãCachéã®ãªããžã§ã¯ãã®ãã£ãŒã«ãã«ã¢ã¯ã»ã¹ããã¡ãœããã«æ¢è£œã®ã©ãããŒé¢æ°ã䜿çšããŸããsetãã©ã¡ãŒã¿ã§ãããã±ãŒãžãšã¯ã©ã¹ã®ååãšãšãã«åŒçšç¬Šãšopenidã§ããããã£åãæž¡ããŸãã åæ§ã®geté¢æ°ã«ã€ããŠã¯ã以äžã®äŸããããŸãã å ç¥ããã¯ã©ã¹ã«ãã£ãŠç¶æ¿ãããã¡ãœãããå«ãä»ã®ã¡ãœããã«ã¢ã¯ã»ã¹ããã«ã¯ãå¿ èŠã«å¿ããŠã¡ãœããåãšåŒã³åºããã©ã¡ãŒã¿ãŒã§run_obj_methodïŒïŒé¢æ°ã䜿çšããŸãã
è¡ã®äžã§æãéèŠãªéæ³ïŒself.att.run_obj_methodïŒ "ïŒ Save"ã[]ïŒ
ããã«ããããŠããã¿ã¹ã§èŠèŠããORMãªã©ã®è¿œå ã®ã©ã€ãã©ãªããã¬ãŒã ã¯ãŒã¯ã䜿çšããã«ããªããžã§ã¯ããçŽæ¥åç §ããŠä¿åããããšãã§ããŸãã
ããã«ãObjectScriptã®ãªããžã§ã¯ãæåã®æ§è³ªãšãã®ã¯ã©ã¹ã®ã¡ãœããïŒãã®äŸã§ã¯å®è¡ããŸããã§ããïŒãèãããšãPersistentã¯ã©ã¹ãšãã®ç¥å ããç¶æ¿ãããã¡ãœããã»ããå šäœãžã®Pythonã¢ã¯ã»ã¹ããããŒãã¹ãåŸãããŸãã å®å šãªãªã¹ãã¯æ¬¡ã®ãšããã§ãã
æåã®ã¡ã³ããŒãäœæããŸãã
att = Attendee() att.new("")
ãã®ã³ãŒããå®è¡ãããšãFW.AttendeeDãšããååã®ã°ããŒãã«ãããŒã¿ããŒã¹ã«è¡šç€ºãããã¹ã¯ãªãŒã³ã·ã§ããã®ããã«ä¿åããã°ããã®ãªããžã§ã¯ãã®å 容ã衚瀺ãããŸãã
![](https://habrastorage.org/webt/pg/rz/ck/pgrzckyjglh-k4knyfjbchwl_6y.png)
ä¿ååŸããã®ãªããžã§ã¯ãã¯ç¬èªã®IDïŒçªå·1ïŒãæã¡ãŸãã ãããã£ãŠããã®IDã䜿çšããŠããã°ã©ã ã«èªã¿èŸŒãããšãã§ããŸãã
att = Attendee() att.use(1) print (att.att.get("name"))
ãããŠãå¿ èŠã«å¿ããŠãåã³idãç¥ã£ãŠãåå è ããŒã¿ããŒã¹ãããªããžã§ã¯ããåé€ã§ããŸãã
att = Attendee() att.use(1) att.clean()
ãã®äŸãå®è¡ããåŸããªããžã§ã¯ãã«é¢ããã¬ã³ãŒããã°ããŒãã«ã«è¡šç€ºãããªããªãããšã確èªããŠãã ããã ããŠã³ããŒããããããŒã¿ã¯ãããã°ã©ã ãçµäºãããŸã§ãªããžã§ã¯ãã®ãã¡ã¢ãªå ãã«æ®ããŸãã
次ã®ã¹ãããã«é²ã¿ãŸãããã å®éã®ã€ãã³ãã¬ã³ãŒããäœæããŸãã
# class Event: # def __init__ (self): self.event = database.create_new("FW.Event", None) # id def new (self, title, desc, date): self.event.set("title", title) self.event.set("description", desc) self.event.set("date", date) self.event.run_obj_method("%Save",[]) # id def use (self, id): self.event = database.openid("FW.Event",str(id),-1,-1) # def addAttendee (self, att): eventAtt = self.event.get("visitors") eventAtt.run_obj_method("Insert", [att]) self.event.set("visitors", eventAtt) self.event.run_obj_method("%Save",[]) # def clean (self): id = self.event.run_obj_method("%Id",[]) self.event.run_obj_method("%DeleteId", [id])
ã¯ã©ã¹æ§é ã¯ãåå è ã®äžèšã®ã¯ã©ã¹ãšã»ãŒåãã§ãã æãéèŠãªããšã¯ããã®ã€ãã³ãaddAttendeeïŒattïŒã®åå è ã®ãªã¹ãã«åå è ãè¿œå ããæ¹æ³ãç»å Žããããšã§ãã
æ°ããã€ãã³ãã«é¢ãããªããžã§ã¯ãã¬ã³ãŒããäœæããããŒã¿ããŒã¹ã«ä¿åããããšããŸãã
haJS = Event() haJS.new("haJS", " ", "2019-01-19")
次ã®ãããªçµæã«ãªãã¯ãã§ãïŒæ¥ä»ã¯èªåçã«ObjectScript圢åŒã«å€æãããPythonãªããžã§ã¯ãã«å床èªã¿èŸŒãŸãããšå ã®åœ¢åŒã«æ»ããŸãïŒã
![](https://habrastorage.org/webt/yk/vt/xh/ykvtxherbupxqtus54bsoz19exy.png)
åå è ãã€ãã³ãã«è¿œå ããããšã¯æ®ããŸãã
# haJS = Event() haJS.use(1) # att = Attendee() att.new("") # haJS.addAttendee(att.att)
ãããã£ãŠããããã®äŸã¯ãããŒã¿ã¢ãã«ãšãã®è¡šåœ¢åŒã®ã¹ãã¬ãŒãžã¹ããŒã ã«ã€ããŠåæã«èããå¿ èŠããªãããšã瀺ããŠããŸãã ããæ確ãªããŒã«ãã¿ã¹ã¯ã«äœ¿çšã§ããŸãã
Pythonãä»ã®èšèªã§Cachéãæ¥ç¶ããŠäœ¿çšããããã®è©³çŽ°ãªæé ã¯ãããã¥ã¡ã³ãããã³InterSystemséçºè ã³ãã¥ããã£ããŒã¿ã«ã§ãã€ã§ãå©çšã§ããŸã-ããã¯ã community.intersystems.comã® 5,000人以äžã®ã¡ã³ããŒã§ãã
ãã«ãïŒInterSystemsCachéãã«ãã¢ãã«DBMSã¯ã ãªããžã§ã¯ãããŒã¿ããŒã¹ã®æ°žç¶çãªäžççãªãŒããŒã§ãã
![]()