åå®å šæ§ããããŒã¿ãšã©ãŒé²æ¢ãã¢ãã«ç²ŸåºŠåäžãæµ·æŽç§åŠã«ãããåœéååä¿é²ãéããŠãæµ·æŽåŠãããã«å€é©ããŠããããæ¢ããŸãã
åå®å šãªæµ·æŽåŠïŒèªä¿¡ãæã£ãŠæµ·æŽããŒã¿ã®å€§æŽªæ°Žãä¹ãããªã
ç§ãã¡ã®æµ·ã¯ãå°çã®çåœç·ã§ãããäžçã®æ°åãå·Šå³ããäœçŸäžãã®çåœãæ¯ãããæµ·æµãååŠãçåœã®è€éãªã·ã¹ãã ã§ãããã®åºå€§ãªé åãçè§£ããããã«ãç§ãã¡ã¯çµ¶ããå¢å ããé«åºŠãªèŠ³æž¬æ©åšã®èŠéãå±éããŠããŸããæ·±æµ·ã芳枬ããèªåŸåã¢ã«ãŽãããŒããæµ·é¢ãã¹ãã£ã³ããè¡æãæ°Žè³ªã枬å®ããè¹è¶æèŒã»ã³ãµãŒã峡谷ãèªè¡ããæ°Žäžã°ã©ã€ããŒãªã©ã§ããããããäžäœãšãªã£ãŠããã¿ãã€ãåäœã§æž¬å®ãããèšå€§ãªããŒã¿ãããªãã¡ããžã¿ã«ã®å€§æŽªæ°ŽãçæããŸãããã®ããŒã¿ã¯ãæ°åå€åã®çè§£ãæŒæ¥ç®¡çãç°åžžæ°è±¡ã®äºæž¬ãžã®éµãæ¡ã£ãŠããŸãããããããã®å€§æŽªæ°Žã®äžã«ã¯é ããè匱æ§ããããŸããããã¯ã埮现ã§éããªããŒã¿ãšã©ãŒã§ãã
æ°åã¢ãã«ã®äºæž¬ããã»ã³ãµãŒã®ãšã©ãŒã³ãŒã-9999.9ã誀ã£ãŠå¹³åæ°æž©ã®èšç®ã«å«ãŸããããã«æªãã§ããŸãç¶æ³ãæ³åããŠã¿ãŠãã ããããããã¯ãããããŒã¿ã»ãããååçã䜿çšããå¥ã®ããŒã¿ã»ãããç°ãªãæšæºã䜿çšãããã®æç¢ºãªåºå¥ããªãã£ãããã«å¡©åã¢ã«ãŽãªãºã ãæ©èœããªããªãç¶æ³ãæ³åããŠã¿ãŠãã ããããããã¯çªé£ãªã·ããªãªã§ã¯ãªããèšç®æµ·æŽåŠã«ãããæ¥åžžçãªæžå¿µã§ããããŽããå
¥ããã°ãŽããåºãããšããååã¯ãå°çèŠæš¡ã«ãŸã§å¢å¹
ãããŸãããã£ãäžã€ã®èª€ã£ãããŒã¿ãã€ã³ããåæå
šäœãç Žå£ããæ¬ é¥ã®ããç§åŠççµè«ãç ç©¶è³éã®æµªè²»ããããŠç§ãã¡ã®çºèŠãžã®ä¿¡é Œã®åªå€±ã«ã€ãªããå¯èœæ§ããããŸãã
解決çã¯ãããåªããã»ã³ãµãŒãããå€ãã®ããŒã¿ã ãã§ãªããããŒã¿èªäœã®æ±ãæ¹ã«å¯Ÿãããã峿 Œãªã¢ãããŒãã«ãããŸããããã§ãã³ã³ãã¥ãŒã¿ãµã€ãšã³ã¹ã®åºæ¬çãªæŠå¿µã匷åãªåœç¶±ãæäŸããŸããããã¯åå®å šæ§ã§ããæ¬çš¿ã§ã¯ããªãåå®å šæ§ããœãããŠã§ã¢ãšã³ãžãã¢ã«ãšã£ãŠããããªåé¡ã§ã¯ãªããçŸä»£ã®å ç¢ã§åçŸæ§ã®ããæµ·æŽç§åŠã«ãšã£ãŠäžå¯æ¬ ãªèŠåŸã§ããã®ããæ¢ããŸããææ§ãªã¹ãã¬ããã·ãŒãããè±åŽããããŒã¿è±å¯ãªæä»£ã®å§åã«èãããããŒã¿æŽåæ§ã®åºç€ãæ§ç¯ããæãæ¥ãŠããŸãã
åå®å šæ§ãšã¯äœãããããŠãªãæµ·æŽåŠè ã¯æ°ã«ããã¹ããªã®ãïŒ
ãã®æ žå¿ã«ãããŠãåå®å šæ§ãšã¯ãäºææ§ã®ãªãããŒã¿åãæ··ããããšã«ãã£ãŠçãããšã©ãŒãé²ãããã«ãããã°ã©ãã³ã°èšèªãŸãã¯ã·ã¹ãã ã«ãã£ãŠæäŸãããä¿èšŒã§ããäŸãã°ãæ°å€ïŒæž©åºŠæž¬å®å€ãªã©ïŒãããã¹ãïŒå Žæã®ååãªã©ïŒã«è¿œå ã§ããªãããã«ããŸããããã¯åçŽã«èãããŸãããç§åŠèšç®ã«ãšã£ãŠãã®åœ±é¿ã¯ç倧ã§ãã
ç°¡åãªã¢ãããžãŒïŒç§åŠç 究宀
ããŒã¿åŠçãã€ãã©ã€ã³ãååŠç 究宀ãšèŠãªããŠãã ãããããŒã¿åã¯ã©ãã«ã®ä»ããããŒã«ãŒã®ãããªãã®ã§ãããé žãçšããå¡©åºãçšããèžçæ°Žãçšãªã©ãåå®å šãªã·ã¹ãã ã¯ãç¹å®ã®ç®¡çãããæé ïŒé¢æ°ïŒãªãã«ããå¡©é žããšã©ãã«ä»ããããããŒã«ãŒãææãªçç©åŠçãµã³ãã«çšã®å®¹åšã«æ³šãããšãé²ã峿 Œãªå®éšãããã³ã«ã®ãããªãã®ã§ããå±éºãªãæå³ããªãåå¿ãåŒãèµ·ããåã«ããªããæ¢ããŸããããªãã¯èªåã®æå³ãæç€ºçã«ãããã匷å¶ãããŸããåå®å šæ§ã®ãªãã·ã¹ãã ã¯ãã©ãã«ã®ãªãããŒã«ãŒã眮ãããç 究宀ã®ãããªãã®ã§ããäœã§ãæ··ããããšãã§ããŸãããäºæãã¬ççºãåŒãèµ·ãããããããã«æªãããšã«ããã£ãšããããèŠãããæ ¹æ¬çã«ééã£ãçµæãçã¿åºããããããªã¹ã¯ããããŸãã
åçåä»ã vs. éçåä»ãïŒ2ã€ã®å²åŠã®ç©èª
ããã°ã©ãã³ã°èšèªããããã®èŠåã匷å¶ããæ¹æ³ã¯ã倧ãŸãã«èšã£ãŠåçåä»ããšéçåä»ãã®2ã€ã®é£å¶ã«åããããŸãã
- åçåä»ã: PythonïŒããã©ã«ãã®ç¶æ
ïŒãMATLABãRã®ãããªèšèªã¯åçåä»ãã§ãã倿°ã®åã¯å®è¡æïŒããã°ã©ã ãå®è¡ãããŠããæïŒã«ãã§ãã¯ãããŸããããã«ããé«ãæè»æ§ãæäŸãããåæã®ã¹ã¯ãªããäœæãæ¢çŽ¢ã«ãããŠã¯ãã°ãã°é«éã§ãã
å±éºæ§: æž©åºŠã®æ¬ æå€ããN/AããšããŒã¯ãããCSVãã¡ã€ã«ãèªã¿èŸŒãPythonã¹ã¯ãªãããæ³åããŠã¿ãŠãã ãããããªãã®ã¹ã¯ãªããã¯ãããæååãšããŠèªã¿èŸŒããããããŸãããåŸã§ããã®åã®å¹³å枩床ãèšç®ããããšããŸããã¹ã¯ãªããã¯ãN/Aãå€ã«ééãããããæ°å€ã«è¿œå ããããšãããŸã§ãšã©ãŒãå ±åãããåæã®éäžã§ããã°ã©ã ãã¯ã©ãã·ã¥ããŸããããã«æªãããšã«ãæ¬ æå€ã
-9999ã ã£ãå Žåãããã°ã©ã ã¯ãŸã£ããã¯ã©ãã·ã¥ããªããããããŸããããå¹³åå€ã¯èããäžæ£ç¢ºã«ãªããŸãã - éçåä»ã: RustãC++ãFortranãJavaã®ãããªèšèªã¯éçåä»ãã§ãããã¹ãŠã®å€æ°ã®åã宣èšããå¿
èŠããããåã¯ã³ã³ãã€ã«æïŒããã°ã©ã ãå®è¡ãããåïŒã«ãã§ãã¯ãããŸããæåã¯ãã峿 Œã«æãããããããŸããããããã«ããæåãããšã©ãŒã®ã¯ã©ã¹å
šäœãæé€ãããŸãã
ä¿è·: éçåä»ãèšèªã§ã¯ãæž©åºŠå€æ°ãæµ®åå°æ°ç¹æ°ã®ã¿ãä¿æããããã«å®£èšããŸããæååãN/Aããããã«å²ãåœãŠãããšããç¬éãã³ã³ãã€ã©ã¯ãšã©ãŒã§ããªããæ¢ããŸããããã«ãããæ¬ æããŒã¿ãã©ã®ããã«æ±ãããäºåã«æ±ºå®ãããã匷å¶ãããŸããããšãã°ãæ°å€ãŸãã¯ãæ¬ æããã©ã°ã®ãããããä¿æã§ããç¹æ®ãªæ§é ã䜿çšãããªã©ã§ãããšã©ãŒã¯éçºäžã«ææãããã¹ãŒããŒã³ã³ãã¥ãŒã¿ãŒã§ã®éèŠãªã¢ãã«å®è¡äžã§ã¯ãããŸããã
幞ããªããšã«ãäžçã¯ããã»ã©äºå è«çã§ã¯ãããŸãããçŸä»£ã®ããŒã«ã¯å¢çç·ãææ§ã«ããŠããŸããããŒã¿ãµã€ãšã³ã¹ã®è°è«ã®äœå°ã®ãªãèšèªã§ããPythonã«ã¯ãéçºè ãåçãªã³ãŒãã«éçåä»ããã§ãã¯ã远å ã§ãã匷åãªåãã³ãã®ã·ã¹ãã ãå°å ¥ãããäž¡æ¹ã®å©ç¹ã享åã§ããããã«ãªããŸããã
ç§åŠããŒã¿ã«ããããæè»æ§ãã®é ããã³ã¹ã
åçåä»ãããããæè»ãªãããŒã¿åŠçããããããšèããããŠãã容æãã«ã¯ãç§åŠçãªæèã«ãããŠæ·±å»ãªé ããã³ã¹ãã䌎ããŸãã
- èšç®ãµã€ã¯ã«ã®ç¡é§: 髿§èœèšç®ã¯ã©ã¹ã¿ãŒã§ã®72æéã®å®è¡äžã«24æéçµéããæç¹ã§æ°åã¢ãã«ãã¯ã©ãã·ã¥ããåãšã©ãŒã¯ãæéããšãã«ã®ãŒããªãœãŒã¹ã®è«å€§ãªç¡é§ã衚ããŸãã
- ãµã€ã¬ã³ããªç Žæ: æãå±éºãªãšã©ãŒã¯ã¯ã©ãã·ã¥ãåŒãèµ·ãããã®ã§ã¯ãªãã誀ã£ãçµæãéãã«çæãããã®ã§ããå質ãã©ã°ãå®éã®å€ãšããŠæ±ã£ãããåäœãæ··åããããã¿ã€ã ã¹ã¿ã³ãã誀ã£ãŠè§£éããããããšãç§åŠçç ç©¶ã®åºç€ãèã埮åŠã«ééã£ãããŒã¿ã«ã€ãªããå¯èœæ§ããããŸãã
- åçŸæ§ã®å±æ©: ããŒã¿ãã€ãã©ã€ã³ãèããããŒã¿åã«é¢ããæé»ã®ä»®å®ãã¹ã¯ãªããå ã«é ãããŠããå Žåãå¥ã®ç ç©¶è ãããªãã®çµæãåçŸããããšã¯ã»ãŒäžå¯èœã«ãªããŸããåå®å šæ§ã¯ããŒã¿ã®ä»®å®ãæç€ºçã«ããã³ãŒããããéæã«ããŸãã
- å ±åäœæ¥ã®æ©æŠ: åœéçãªããŒã ãããŒã¿ã»ãããã¢ãã«ãçµ±åããããšãããšãããŒã¿åãšåœ¢åŒã«é¢ããç°ãªãä»®å®ãæ°ã¶æã®é å»¶ãšéªšã®æãããããã°ãåŒãèµ·ããå¯èœæ§ããããŸãã
ããããå±éºæ§ïŒæµ·æŽããŒã¿ã誀ãå Žæ
æœè±¡çãªè©±ããå ·äœçãªè©±ã«ç§»ããŸããããããã§ã¯ãæµ·æŽåŠã®ããŒã¿ã¯ãŒã¯ãããŒã§ééããæãäžè¬çã§æå®³ãªåé¢é£ã®ãšã©ãŒã®ããã€ãããããŠåå®å šãªã¢ãããŒããã©ã®ããã«è§£æ±ºçãæäŸããã®ãã説æããŸãã
æªåé«ãNullïŒæ¬ æããŒã¿ã®åŠç
ãã¹ãŠã®æµ·æŽåŠè ã¯æ¬ æããŒã¿ã«ç²ŸéããŠããŸããã»ã³ãµãŒãæ éããããäŒéãéåããããå€ããã£ãšããããç¯å²ããå€ãããããŸããããã¯ã©ã®ããã«è¡šçŸãããã®ã§ããããïŒ
NaNïŒéæ°ïŒ-9999,-99.9,1.0e35ã®ãããªããžãã¯ãã³ããŒ"MISSING","N/A","---"ã®ãããªæåå- ã¹ãã¬ããã·ãŒãã®ç©ºã®ã»ã«
å±éºæ§: åçåä»ãã·ã¹ãã ã§ã¯ãå¹³åå€ãæå°å€ãèšç®ããã³ãŒããèšè¿°ããéãæåã«ããžãã¯ãã³ããŒãé€å€ããã®ãå¿ããŠããŸããã¡ã§ããæ£ã®æµ·é¢æ°Žæž©ã®ããŒã¿ã»ããã«åäžã®-9999ãååšãããšãå¹³åå€ãšæšæºåå·®ã壿»
çã«æªããããŸãã
åå®å
šãªè§£æ±ºç: å
ç¢ãªåã·ã¹ãã ã¯ãæ¬ æãæç€ºçã«åŠçããåã®äœ¿çšã奚å±ããŸããRustãHaskellã®ãããªèšèªã§ã¯ãããã¯OptionãŸãã¯Maybeåã§ãããã®åã¯Some(value)ãŸãã¯Noneã®2ã€ã®ç¶æ
ããšãããšãã§ããŸããã³ã³ãã€ã©ã«ãã£ãŠäž¡æ¹ã®ã±ãŒã¹ãåŠçãããã匷å¶ãããŸããå€ãååšãããã©ãããæåã«ç¢ºèªããã«valueã«ã¢ã¯ã»ã¹ããããšã¯ã§ããŸãããããã«ãããèšç®ã§èª€ã£ãŠæ¬ æå€ã䜿çšããããšãäžå¯èœã«ãªããŸãã
Pythonã§ã¯ãããã¯åãã³ãïŒOptional[float]ïŒ`Union[float, None]`ã«å€æãããŸãïŒã§ã¢ãã«åã§ããŸããmypyã®ãããªéçãã§ãã«ãŒã¯ããã®åã®å€æ°ãæ°åŠæŒç®ã§äœ¿çšããããšããŠããããNoneã§ãããã©ãããæåã«ãã§ãã¯ããªãã³ãŒãã«ãã©ã°ãç«ãŠãŸãã
åäœã®æ··ä¹±ïŒå°çèŠæš¡ã®çœå®³ãžã®åŠæ¹ç®
åäœãšã©ãŒã¯ç§åŠããã³å·¥åŠã«ãããŠäŒèª¬çãªãã®ã§ããæµ·æŽåŠã«ãšã£ãŠãããã®åœ±é¿ã¯åæ§ã«ç倧ã§ãã
- 枩床: ææ°ãã±ã«ãã³ãè¯æ°ã®ãããã§ããïŒ
- å§å: ãã·ããŒã« (dbar)ããã¹ã«ã« (Pa)ããŸãã¯ãã³ãæ¯å¹³æ¹ã€ã³ã (psi) ã®ãããã§ããïŒ
- å¡©å: å®çšå¡©åã¹ã±ãŒã« (PSS-78ãç¡æ¬¡å ) ãŸãã¯çµ¶å¯Ÿå¡©å (g/kg) ã®ãããã§ããïŒ
- 深床: ã¡ãŒãã«ãŸãã¯ãã¡ãŸã ã®ãããã§ããïŒ
å±éºæ§: å¯åºŠãèšç®ããããã«ãã·ããŒã«åäœã®å§åãæåŸ ãã颿°ã«ããã¹ã«ã«åäœã®å€ãäžããããå Žåãçµæã®å¯åºŠå€ã¯10,000åããããŠããŸããæ°Žå¡ã®å®å®æ§ãæµ·æµã«é¢ããå šãæå³ã®ãªãçµè«ã«ã€ãªãããŸããäž¡æ¹ã®å€ãåãªãæ°å€ïŒäŸïŒ`float64`ïŒã§ãããããæšæºçãªåã·ã¹ãã ã§ã¯ãã®è«çãšã©ãŒãææã§ããŸããã
åå®å šãªè§£æ±ºç: ããã§ç§ãã¡ã¯åºæ¬çãªåãè¶ ããŠãã»ãã³ãã£ãã¯åãŸãã¯ãã¡ã€ã³åºæåãäœæããããšãã§ããŸããåã«`float`ã䜿çšããã®ã§ã¯ãªããæž¬å®å€ã«åå¥ã®åãå®çŸ©ã§ããŸãã
class Celsius(float): pass
class Kelvin(float): pass
class Decibar(float): pass
ãã®åŸã颿°ã·ã°ããã£ãæç€ºçã«ããããšãã§ããŸããdef calculate_density(temp: Celsius, pressure: Decibar) -> float: ...ãããé«åºŠãªã©ã€ãã©ãªã§ã¯ãèªååäœå€æãåŠçããããæž©åºŠãšå§åãå ç®ãããããªäºææ§ã®ãªãåäœã远å ããããšãããšãã«ãšã©ãŒãçºçããããããããšãã§ããŸããããã«ãããéèŠãªç§åŠçã³ã³ããã¹ããã³ãŒãèªäœã«çŽæ¥åã蟌ãŸããèªå·±ææžåãããã¯ããã«å®å
šã«ãªããŸãã
ã¿ã€ã ã¹ã¿ã³ããšåº§æšã®ææ§ã
æéãšç©ºéã¯æµ·æŽåŠã®åºç€ã§ããããã®è¡šçŸã¯å°é·åã§ãã
- ã¿ã€ã ã¹ã¿ã³ã: UTCã§ããããããšãçŸå°æéã§ããïŒãã©ãŒãããã¯äœã§ããïŒISO 8601ãUNIXãšããã¯ããŠãªãŠã¹æ¥ïŒïŒéç§ãèæ ®ããŠããŸããïŒ
- 座æš: å°æ°åºŠã§ããããããšã床/å/ç§ã§ããïŒæž¬å°åºæºç³»ã¯äœã§ããïŒäŸïŒWGS84ãNAD83ïŒïŒ
å±éºæ§: äžæ¹ãUTCãããäžæ¹ãçŸå°æéã䜿çšããŠãã2ã€ã®ããŒã¿ã»ãããé©åã«å€æããã«ããŒãžãããšã人çºçãªæ¥åšãµã€ã¯ã«ãçæãããããã€ãã³ããæ°æéããããããå¯èœæ§ããããæœ®æ±æ··åãæ€ç©ãã©ã³ã¯ãã³ãã«ãŒã ã®ãããªçŸè±¡ã®èª€ã£ãè§£éã«ã€ãªãããŸãã
åå®å šãªè§£æ±ºç: ã·ã¹ãã å šäœã§ãéèŠãªããŒã¿åã«å¯ŸããŠåäžã®ææ§ãã®ãªã衚çŸã匷å¶ããŸããæéã®å Žåãããã¯ã»ãšãã©åžžã«ãã¿ã€ã ãŸãŒã³å¯Ÿå¿ã®datetimeãªããžã§ã¯ããUTCã«æšæºåããŠäœ¿çšããããšãæå³ããŸããåå®å šãªããŒã¿ã¢ãã«ã¯ãæç€ºçãªã¿ã€ã ãŸãŒã³æ å ±ãæããªãã¿ã€ã ã¹ã¿ã³ããæåŠããŸããåæ§ã«ã座æšã«ã€ããŠã¯ãæå¹ãªç¯å²ïŒãããã-90ãã90ã-180ãã180ïŒå ã®ç·¯åºŠãšçµåºŠãå«ãŸãªããã°ãªããªãç¹å®ã®`WGS84Coordinate`åãäœæã§ããŸããããã«ãããç¡å¹ãªåº§æšãã·ã¹ãã ã«å ¥ãããšãé²ããŸãã
åçšããŒã«ïŒæµ·æŽåŠã¯ãŒã¯ãããŒã«ãããåå®å šæ§ã®å®è£
åå®å šæ§ãæ¡çšããŠããæ £ã芪ããã ããŒã«ãæšãŠãå¿ èŠã¯ãããŸãããããå³å¯ãªå®è·µã§ãããã匷åããææ°ã®æ©èœã掻çšããããšã§ãã
åä»ããããPythonã®å°é
ç§åŠã³ãã¥ããã£ã«ãããPythonã®åªäœæ§ãèãããšãåãã³ãïŒPEP 484ã§å®çŸ©ïŒã®å°å ¥ã¯ãéå»10幎éã§ããŒã¿æŽåæ§ã«ãšã£ãŠæãéèŠãªé²å±ã§ãããšèšããã§ããããããã«ãããPythonã®åºç€ãšãªãåçãªæ§è³ªãå€ããããšãªãã颿°ã®ã·ã°ããã£ã倿°ã«åæ å ±ã远å ã§ããŸãã
以åïŒæšæºPythonïŒ:
def calculate_practical_salinity(conductivity, temp, pressure):
# Assumes conductivity is in mS/cm, temp in Celsius, pressure in dbar
# ... complex TEOS-10 calculation ...
return salinity
ãã`temp`ãã±ã«ãã³ã§æž¡ããããã©ããªãã§ããããïŒã³ãŒãã¯å®è¡ãããŸãããçµæã¯ç§åŠçãªæå³ããªããªããã®ã«ãªããŸãã
以åŸïŒåãã³ãä»ãPythonïŒ:
def calculate_practical_salinity(conductivity: float, temp_celsius: float, pressure_dbar: float) -> float:
# ã·ã°ããã£ã«ãã£ãŠæåŸ
ãããåãææžåãããããã«ãªããŸããã
# ... complex TEOS-10 calculation ...
return salinity
ã³ãŒãäžã§Mypyã®ãããªéçåãã§ãã«ãŒãå®è¡ãããšãããã¯é£è¡åç¹æ€ã®ããã«æ©èœããŸãããããã®ãã³ããèªã¿åãããããŒããæåŸ
ãã颿°ã«æååãæž¡ãããšããŠããå Žåããå€ãNoneã§ããå¯èœæ§ã®ããã±ãŒã¹ãåŠçãå¿ããå Žåã«èŠåããŸãã
ããŒã¿åã蟌ã¿ãšæ€èšŒã«ã¯ãPydanticã®ãããªã©ã€ãã©ãªãé©åœçã§ããæåŸ ãããããŒã¿ã®ã圢ç¶ããåãæã€Pythonã¯ã©ã¹ãšããŠå®çŸ©ããŸããPydanticã¯ãçããŒã¿ïŒAPIããã®JSONãCSVããã®è¡ãªã©ïŒãè§£æãããããã¯ãªãŒã³ã§åä»ãããããªããžã§ã¯ãã«èªåçã«å€æããŸããåä¿¡ããŒã¿ãå®çŸ©ãããåãšäžèŽããªãå ŽåïŒäŸãã°ã枩床ãã£ãŒã«ãã«æ°å€ã§ã¯ãªããerrorããå«ãŸããå ŽåïŒãPydanticã¯çŽã¡ã«æç¢ºãªæ€èšŒãšã©ãŒãçºçãããã²ãŒãã§ç ŽæããããŒã¿ãæ¢ããŸãã
ã³ã³ãã€ã«èšèªïŒããã©ãŒãã³ã¹ãšå®å šæ§ã®ããã®ãŽãŒã«ãã¹ã¿ã³ããŒã
æµ·æŽåŸªç°ã¢ãã«ãäœã¬ãã«ã®èšåšå¶åŸ¡ã®ãããªããã©ãŒãã³ã¹ãéèŠãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã³ã³ãã€ã«ãããéçåä»ãèšèªãæšæºã§ããFortranãšC++ã¯é·ãéäž»åèšèªã§ããããRustã®ãããªçŸä»£çãªèšèªã¯ãã¡ã¢ãªå®å šæ§ãšåå®å šæ§ã®äž¡æ¹ã«ãããŠæ¯é¡ã®ãªãå®å šæ§ã«çŠç¹ãåœãŠãªãããäžçã¯ã©ã¹ã®ããã©ãŒãã³ã¹ãæäŸãããããæ³šç®ãéããŠããŸãã
Rustã®`enum`åã¯æµ·æŽåŠã«ãšã£ãŠç¹ã«åŒ·åã§ããã»ã³ãµãŒã®ç¶æ ãå®å šã«æç¢ºã«ã¢ãã«åã§ããŸãã
enum SensorReading {
Valid { temp_c: f64, salinity: f64 },
Error(String),
Offline,
}
ãã®å®çŸ©ã«ããã`SensorReading`ãä¿æãã倿°ã¯ããã3ã€ã®ããªã¢ã³ãã®ããããã§ãªããã°ãªããŸãããã³ã³ãã€ã©ã¯ãã¹ãŠã®å¯èœæ§ãåŠçãããã匷å¶ãããããæž©åºŠããŒã¿ã«ã¢ã¯ã»ã¹ããããšããåã«ãšã©ãŒç¶æ ããã§ãã¯ããã®ãå¿ããããšã¯äžå¯èœã«ãªããŸãã
åãæèããããŒã¿åœ¢åŒïŒå®å šæ§ãåºç€ã«çµã¿èŸŒã
åå®å šæ§ã¯ã³ãŒãã ãã®åé¡ã§ã¯ãããŸãããããã¯ããŒã¿ã®ä¿åæ¹æ³ã«ãé¢ä¿ããŸãããã¡ã€ã«åœ¢åŒã®éžæã¯ãããŒã¿æŽåæ§ã«ãšã£ãŠå€§ããªåœ±é¿ãåãŒããŸãã
- CSVïŒã«ã³ãåºåãå€ïŒã®åé¡ç¹: CSVãã¡ã€ã«ã¯åãªããã¬ãŒã³ããã¹ãã§ããæ°å€ã®åã¯ãè§£æããããšãããŸã§ããã¹ãã®åãšåºå¥ã§ããŸãããã¡ã¿ããŒã¿ã®æšæºããªããåäœã座æšç³»ãNULLå€ã®èŠåã¯å€éšã«ææžåããå¿ èŠããããããã§ç°¡åã«å€±ããããç¡èŠããããããŸãã
- èªå·±èšè¿°åœ¢åŒã«ãã解決ç: NetCDFïŒNetwork Common Data FormïŒãHDF5ïŒHierarchical Data Format 5ïŒã®ãããªåœ¢åŒããæ°åããã³æµ·æŽç§åŠã®åºç€ã§ããã®ã¯çç±ããããŸãããããã¯èªå·±èšè¿°åã®ãã€ããªåœ¢åŒã§ããããã¯ããã¡ã€ã«èªäœãããŒã¿ã ãã§ãªãããã®ããŒã¿ãèšè¿°ããã¡ã¿ããŒã¿ãå«ãããšãæå³ããŸãã
- å倿°ã®ããŒã¿åïŒäŸïŒ32ãããæµ®åå°æ°ç¹æ°ã8ãããæŽæ°ïŒã
- ããŒã¿ã®æ¬¡å ïŒäŸïŒæéã緯床ãçµåºŠã深床ïŒã
- å倿°ã«å¯Ÿãã屿§ãäŸãã°`units`ïŒ"degrees_celsius"ïŒã`long_name`ïŒ"Sea Surface Temperature"ïŒã`_FillValue`ïŒæ¬ æããŒã¿ã«äœ¿çšãããç¹å®ã®å€ïŒãªã©ã
NetCDFãã¡ã€ã«ãéããšãããŒã¿åãåäœãæšæž¬ããå¿ èŠããªãããã¡ã€ã«ã®ã¡ã¿ããŒã¿ããçŽæ¥èªã¿åãããšãã§ããŸããããã¯ãã¡ã€ã«ã¬ãã«ã§ã®åå®å šæ§ã®äžåœ¢æ ã§ãããFAIRïŒFindable, Accessible, Interoperable, and ReusableïŒããŒã¿ãäœæããããã«äžå¯æ¬ ã§ãã
ã¯ã©ãŠãããŒã¹ã®ã¯ãŒã¯ãããŒã®å ŽåãZarrã®ãããªåœ¢åŒã¯ãããã®åãå©ç¹ãæäŸããŸãããã¯ã©ãŠããªããžã§ã¯ãã¹ãã¬ãŒãžã«ä¿åããããã£ã³ã¯åãããå§çž®ããŒã¿é åãžã®å€§èŠæš¡äžŠåã¢ã¯ã»ã¹çšã«èšèšãããŠããŸãã
ã±ãŒã¹ã¹ã¿ãã£ïŒåå®å šãªã¢ã«ãŽãããŒãããŒã¿ãã€ãã©ã€ã³
ãããã®ååãã©ã®ããã«çµã¿åããããããèŠãããã«ãã¢ã«ãŽãããŒãã®ç°¡ç¥åãããä»®æ³ããŒã¿ãã€ãã©ã€ã³ãèŠãŠãããŸãããã
ã¹ããã1ïŒåã蟌ã¿ãšçããŒã¿æ€èšŒ
ã¢ã«ãŽãããŒããæµ®äžãããã®ãããã¡ã€ã«ããŒã¿ãè¡æçµç±ã§éä¿¡ããŸããçã¡ãã»ãŒãžã¯ã³ã³ãã¯ããªãã€ããªæååã§ããéžäžã§ã®æåã®ã¹ãããã¯ããã®ã¡ãã»ãŒãžãè§£æããããšã§ãã
- å®å šã§ãªãã¢ãããŒã: ã«ã¹ã¿ã ã¹ã¯ãªãããç¹å®ã®ãªãã»ããã§ãã€ããèªã¿åãããããæ°å€ã«å€æããŸããã¡ãã»ãŒãžåœ¢åŒããããã«å€æŽããããããã£ãŒã«ããç Žæãããããå Žåãã¹ã¯ãªããã¯å€±æããããšãªããžã£ã³ã¯ããŒã¿ãèªã¿åãã誀ã£ãå€ã§ããŒã¿ããŒã¹ãåããŠããŸãå¯èœæ§ããããŸãã
- åå®å šãªã¢ãããŒã: æåŸ ããããã€ããªæ§é ã¯ãPydanticã¢ãã«ãŸãã¯Rustã®æ§é äœãçšããŠãåãã£ãŒã«ãã«å³å¯ãªåïŒäŸïŒã¿ã€ã ã¹ã¿ã³ãã«ã¯`uint32`ãã¹ã±ãŒã«ãããæž©åºŠã«ã¯`int16`ïŒãå®çŸ©ããŸããè§£æã©ã€ãã©ãªã¯ãåä¿¡ããŒã¿ããã®æ§é ã«é©åãããããšããŸããäžäžèŽã®ããã«å€±æããå Žåãã¡ãã»ãŒãžã¯çŽã¡ã«æåŠãããäžæµã®ããŒã¿ãæ±æãã代ããã«æåã¬ãã¥ãŒã®ããã«ãã©ã°ãç«ãŠãããŸãã
ã¹ããã2ïŒåŠçãšå質管ç
çã§æ€èšŒæžã¿ã®ããŒã¿ïŒäŸïŒå§åãæž©åºŠãå°é»çïŒã¯ãæ¬¡ã«æŽŸçç§åŠåäœã«å€æãããå質管çãåããå¿ èŠããããŸãã
- å®å šã§ãªãã¢ãããŒã: ã¹ã¿ã³ãã¢ãã³ã®ã¹ã¯ãªãã矀ãå®è¡ãããŸããããã¹ã¯ãªããã¯å¡©åãèšç®ããå¥ã®ã¹ã¯ãªããã¯å€ãå€ããã©ã°ä»ãããŸãããããã®ã¹ã¯ãªããã¯ãå ¥ååäœãšååã«é¢ããææžåãããŠããªãä»®å®ã«äŸåããŠããŸãã
- åå®å
šãªã¢ãããŒã: åãã³ãä»ãã®Python颿°
process_profile(raw_profile: RawProfileData) -> ProcessedProfileã䜿çšããŸãã颿°ã®ã·ã°ããã£ã¯æç¢ºã§ããå éšã§ã¯ãcalculate_salinity(pressure: Decibar, ...)ã®ãããªä»ã®åä»ãããã颿°ãåŒã³åºããŸããå質管çãã©ã°ã¯æŽæ°ïŒäŸïŒ`1`ã`2`ã`3`ã`4`ïŒãšããŠã§ã¯ãªããQualityFlag.GOODãQualityFlag.PROBABLY_GOODãªã©ã®èšè¿°çãªEnumåãšããŠä¿åãããŸããããã«ããææ§ãããªããªããã³ãŒãã®å¯èªæ§ãå€§å¹ ã«åäžããŸãã
ã¹ããã3ïŒã¢ãŒã«ã€ããšé åž
æçµçã«åŠçãããããŒã¿ãããã¡ã€ã«ã¯ãäžçã®ç§åŠã³ãã¥ããã£ãšå ±æããæºåãã§ããŠããŸãã
- å®å
šã§ãªãã¢ãããŒã: ããŒã¿ã¯CSVãã¡ã€ã«ã«ä¿åãããŸããåããããŒã¯
"temp"ã"sal"ã"pres"ã§ããæž©åºŠãææ°ã§ãããå§åããã·ããŒã«ã§ããããšã説æããå¥ã®README.txtãã¡ã€ã«ããããŸãããã®READMEã¯å¿ ç¶çã«ããŒã¿ãã¡ã€ã«ããåé¢ãããŸãã - åå®å
šãªã¢ãããŒã: ããŒã¿ã¯ã³ãã¥ããã£æšæºã®èŠçŽïŒæ°åã»äºæž¬èŠçŽãªã©ïŒã«åŸã£ãŠNetCDFãã¡ã€ã«ã«æžã蟌ãŸããŸãããã¡ã€ã«ã®å
éšã¡ã¿ããŒã¿ã¯ã
temperatureãfloat32倿°ãšããŠãunits = "celsius"ããã³standard_name = "sea_water_temperature"ãšæç€ºçã«å®çŸ©ããŸããäžçäžã®ã©ã®ç ç©¶è ã§ããæšæºçãªNetCDFã©ã€ãã©ãªã䜿çšããã°ããã®ãã¡ã€ã«ãéããŠããã®ããŒã¿ã®å å®¹ãææ§ããªãæ£ç¢ºã«ç¥ãããšãã§ããŸããããŒã¿ã¯çã«çžäºéçšå¯èœã§åå©çšå¯èœã«ãªããŸãã
ãã倧ããªèŠç¹ïŒããŒã¿æŽåæ§ã®æåãè²ã
åå®å šæ§ã®æ¡çšã¯ãåãªãæè¡çãªéžæã§ã¯ãããŸãããããã¯å³å¯ããšå ±åäœæ¥ãžã®æåç転æã§ãã
å ±åäœæ¥ã®ããã®å ±éèšèªãšããŠã®åå®å šæ§
çµåã¢ãã«çžäºæ¯èŒãããžã§ã¯ãïŒCMIPïŒã®ãããªå€§èŠæš¡ãããžã§ã¯ãã§åœéçãªç ç©¶ã°ã«ãŒããå ±åäœæ¥ãè¡ãéãæç¢ºã«å®çŸ©ãããåå®å šãªããŒã¿æ§é ãšã€ã³ã¿ãŒãã§ãŒã¹ãäžå¯æ¬ ã§ãããããã¯ç°ãªãããŒã ãšã¢ãã«éã®å¥çŽãšããŠæ©èœããç°ãªãããŒã¿ã»ãããšã³ãŒãããŒã¹ãçµ±åããéã«çºçããæ©æŠãšãšã©ãŒãåçã«åæžããŸããæç€ºçãªåãæã€ã³ãŒãã¯ãèšèªã®å£ãè¶ ããŠãããèªäœãæè¯ã®ããã¥ã¡ã³ããšãªããŸãã
ãªã³ããŒãã£ã³ã°ã®å éãšãéšæã®ç¥èãã®åæž
ã©ã®ç 究宀ã§ãããéšæã®ç¥èããè±å¯ã«ååšããããšããããããŸããããã¯ãç¹å®ã®ããŒã¿ã»ãããã©ã®ããã«æ§æãããŠãããããããã¯ç¹å®ã®ã¹ã¯ãªããããã©ã°å€ãšããŠ-999ã䜿çšããçç±ã«ã€ããŠã®æé»ã®çè§£ã§ããããã«ãããæ°ããåŠçãç ç©¶è
ãçç£çã«ãªãã®ãéåžžã«å°é£ã«ãªããŸããæç€ºçãªåãæã€ã³ãŒãããŒã¹ã¯ããã®ç¥èãçŽæ¥ã³ãŒãå
ã«åã蟌ã¿ãæ°åè
ãããŒã¿ãããŒãšä»®å®ãçè§£ããããããåºæ¬çãªããŒã¿è§£éã®ããã«äžçŽè
ã«é Œãå¿
èŠæ§ãæžãããŸãã
ä¿¡é Œæ§ãšåçŸæ§ã®ããç§åŠã®æ§ç¯
ããã究極ã®ç®æšã§ããç§åŠçããã»ã¹ã¯ä¿¡é ŒãšåçŸæ§ãšããåºç€ã®äžã«ç¯ãããŠããŸããããŒã¿åŠçã«ãããæœåšçãªãã°ã®å€§éšåãæé€ããããšã§ãåå®å šæ§ã¯ç§ãã¡ã®åæãããå ç¢ã«ããçµæãããä¿¡é Œã§ãããã®ã«ããŸããã³ãŒãèªäœãããŒã¿æŽåæ§ã匷å¶ããå Žåãããããå°ãåºãããç§åŠççµè«ã«å¯ŸããŠããé«ãä¿¡é Œãæã€ããšãã§ããŸããããã¯ãå€ãã®ç§åŠåéãçŽé¢ããŠããåçŸæ§ã®å±æ©ã«å¯ŸåŠããããã®éèŠãªäžæ©ã§ãã
çµè«ïŒæµ·æŽããŒã¿ã®ããå®å šãªèªè·¯ãåãéã
æµ·æŽåŠã¯ããã°ããŒã¿ã®æä»£ã«ç¢ºåºãšããŠçªå ¥ããŸããããã®ããŒã¿ãçè§£ããå€åããå°çã«é¢ããå®çšçãªç¥èã«å€ããç§ãã¡ã®èœåã¯ããã®æŽåæ§ã«å®å šã«äŸåããŠããŸããç§ãã¡ã¯ãã¯ããåžæç芳枬ã«åºã¥ããææ§ã§èãããŒã¿ãã€ãã©ã€ã³ã®é ããã³ã¹ãã蚱容ããããšã¯ã§ããŸããã
åå®å šæ§ã¯ãå®åçãªãªãŒããŒãããã远å ããããç ç©¶ãé ããããããããšã§ã¯ãããŸãããããã¯ãåŸã§å£æ» çã§è²»çšã®ããããšã©ãŒãé²ãããã«ãæ£ç¢ºã§ããããšãžã®åªåãååãããããšã§ããããã¯ãã³ãŒããè匱ãªåœä»€ã®ã»ãããããç§åŠççºèŠã®ããã®å ç¢ã§èªå·±ææžåãããã·ã¹ãã ãžãšå€é©ããå°éçãªèŠåŸã§ãã
åé²ããããã«ã¯ãå人ãç 究宀ããããŠæ©é¢ããã®æèçãªåªåãå¿ èŠã§ãã
- åã ã®ç ç©¶è åã: 仿¥ããå§ããŸããããPythonã®åãã³ãæ©èœã掻çšããŠãã ãããPydanticã®ãããªããŒã¿æ€èšŒã©ã€ãã©ãªã«ã€ããŠåŠã³ã䜿çšããŠãã ããã颿°ã«æ³šéãä»ããŠãããªãã®ä»®å®ãæç€ºçã«ããŸãããã
- ç 究宀ãšPIåã: ç§åŠçæ¢æ±ãšäžŠè¡ããŠãœãããŠã§ã¢ãšã³ãžãã¢ãªã³ã°ã®ãã¹ããã©ã¯ãã£ã¹ãå°éãããæåãè²ãã§ãã ãããããŒãžã§ã³ç®¡çãã³ãŒãã¬ãã¥ãŒãæšæºåãããåèªèããŒã¿åœ¢åŒã®äœ¿çšã奚å±ããŠãã ããã
- æ©é¢ãšè³éæäŸæ©é¢åã: ç§åŠèšç®ãšããŒã¿ç®¡çã®ãã¬ãŒãã³ã°ãæ¯æŽããŠãã ãããå ¬çè³éã«ããç ç©¶ã«ãããŠãFAIRããŒã¿ååãšNetCDFã®ãããªèªå·±èšè¿°åœ¢åŒã®äœ¿çšãåªå ãã矩åä»ããŠãã ããã
åå®å šæ§ã®ååãåãå ¥ããããšã§ãç§ãã¡ã¯åã«ããè¯ãã³ãŒããæžããŠããã ãã§ãªãã21äžçŽã®æµ·æŽåŠã®ããã«ãããä¿¡é Œæ§ããããéæã§ãååçãªåºç€ãç¯ããŠããŸããç§ãã¡ã¯ãç§ãã¡ã®æµ·ã®ããžã¿ã«ãªåæ ãå¯èœãªéãæ£ç¢ºã§ä¿¡é Œã§ãããã®ã§ããããšãä¿èšŒããç®ã®åã«ãã課é¡ãéããŠãããå®å šã§æ å ±ã«åºã¥ããèªè·¯ãåãéãããšãå¯èœã«ããŸãã