JDATA

JData
JDATA
OpenJData.png
파일 이름 확장자
.jdt, .jdb
인터넷 미디어 유형
응용 프로그램/json
유형코드텍스트와 바이너리
개발자첸첸팡
초기 릴리즈2019년 7월 25일, 3년 전(2019-07-25)[1]
최신 릴리즈
1.0 드래프트 2
2019년 7월 25일, 3년 전(2019-07-25)[2]
포맷의 종류data 교환
확장원JSON
오픈 포맷?네.
웹 사이트openjdata.org

JDATA는 인간이 읽을 수 있는(텍스트 기반) JSON 및 (이진) UBJSON 형식을 사용하여 범용 및 과학적 데이터 구조를 나타내도록 설계된 경량 데이터 주석 및 교환 개방형 표준입니다.JDATA 사양은 특히 MATLAB, Python, JavaScript 등과 같은 프로그래밍 언어 간의 계층적이고 복잡한 데이터 교환을 단순화하는 것을 목적으로 합니다.스칼라, N차원 어레이, 스파스/복소수치 어레이, 맵, 테이블, 해시, 링크드 리스트, 트리 및 그래프를 포함한 광범위한 데이터 구조를 저장하기 위한 JSON 호환 구성체의 포괄적인 목록을 정의하고 각 데이터 요소에 대한 선택적 데이터 그룹화 및 메타데이터를 지원합니다.생성된 데이터 파일은 JSON/UBJSON 사양과 호환되며 대부분의 기존 파서에서 쉽게 처리할 수 있습니다.또한 JDATA 정의 주석 키워드는 강력한 형식의 이진 데이터 스트림을 JSON에 저장, 데이터 압축, 링크 및 참조할 수 있습니다.

역사

JDATA 주석 체계의 초기 개발은 널리 사용되는 오픈 소스 MATLAB/GNU 옥타브 JSON 리더/라이터인 JSONLab 도구 상자 개발의 일환으로 2011년에 시작되었다.주석이 달린 N-D 어레이의 대부분은 다음과 같습니다._ArrayType_,_ArraySize_,그리고._ArrayData_JSONLab의 초기 릴리즈에서 구현되어 있었습니다.2015년, JData 규격의 초안이 Iso2Mesh Wiki에서 개발되었으며, 2019년 이후 개발은 Github으로 이행되었다.

릴리스

JDATA 버전 0.5

JData 사양의 v0.5 버전은 사양의 첫 번째 완전한 초안 및 퍼블릭 코멘트 요청(RFC)이며 2019년 5월 15일에 제공되었습니다.이 사양의 미리보기 버전은 N-D 어레이, 희박 및 복소수 어레이, 이진 데이터 인터페이스, 데이터 레코드 레벨 압축, 해시, 테이블, 트리, 링크드 리스트 및 그래프를 포함하여 과학 데이터 및 연구에 관련된 데이터 구조의 대부분을 지원합니다.또한 데이터 링크 및 참조에 대한 일반적인 접근법에 대해서도 설명합니다.이 사양 버전의 레퍼런스 실장은 JSONLab v1.8로 출시되었습니다.

JDATA 버전 1 드래프트 1

JDATA 사양 버전 1의 드래프트 1은 2019년 6월 4일에 출시되었습니다.이 릴리스의 주요 변경 사항에는 1) N-D 어레이 요소의 시리얼화 순서가 열 메이저에서 행 메이저로 변경됨, 2)가 포함됩니다._ArrayData_1D 벡터에서 2행 매트릭스로의 복잡한 N-D 어레이 변경에 대해 구성 3) 해시 데이터 JSON 표현에서 문자열이 아닌 값 키를 지원하고 4) 새로운 값을 추가합니다._ByteStream_오브젝트: 범용 바이너리 데이터 또는 바이너리 라지 오브젝트(BLOB)를 시리얼화합니다.이 사양 버전의 레퍼런스 실장은 JSONLab v1.9로 출시되었습니다.

JDATA 버전 1 드래프트 2

JDATA 사양 버전 1의 드래프트 2는 2019년 7월 25일에 출시되었습니다.이 릴리스의 주요 변경 사항에는 1) 를 통한 특별한 매트릭스 스토리지 지원이 포함됩니다._ArrayShape_태그, 2) 모두 이름 변경_ArrayCompression*_에 태그를 붙이다._ArrayZip*_, 3) 전용 테이블 데이터 키워드 추가:_TableCols_,_TableRows_,그리고._TableRecords_이 사양 버전의 레퍼런스 실장은 JSONLab v2.0으로 출시되었습니다.

JDATA 주석 예시

수치 스칼라

수치는 JSON 또는 UBJ에서 직접 지원SON 사양숫자 값은 일반적으로 JData 주석으로 변환할 때 변경되지 않습니다.파일로 저장할 때는 JSON/UBJSON 수치 형식으로 직접 저장됩니다.예를들면

네이티브 데이터 텍스트-JDATA/JSON 폼 이진 JDATA(BJDATA/UBJSON)
a=3.14159 ➡️ {"a":3.14159} [{] [U][1][a][D][3.15169] [}]

특수 상수 및 문자열

"NaN", "Infinity" 및 "-Infinity"와 같은 몇 가지 특수 상수가 있습니다. 이들은 JSON/text-JData 형식으로 저장될 경우 특수 문자열 키워드로 인코딩되지만 이진 JData 형식으로 저장될 경우 변경되지 않습니다.

네이티브 데이터 텍스트-JDATA/JSON 폼 이진 JDATA(BJDATA/UBJSON)
a=nan ➡️ {"a":"_NaN_"} [{] [U][1][a][D][nan] [}]
a=inf ➡️ {"a":"_Inf_"} [{] [U][1][a][D][inf] [}]
a=-inf ➡️ {"a":"-_Inf_"} [{] [U][1][D][-inf] [}]
a=true ➡️ {"a":true} [{] [U][1][a][T] [}]
a=false ➡️ {"a":false} [{] [U][1][a][F] [}]
a=null ➡️ {"a":null} [{] [U][1][a][Z] [}]
a="A string" ➡️ {"a":"A string"} [{] [U][1][a][S][U][8][A string] [}]


구조 및 해시

계층 구조는 이름 있는 멤버로 메타데이터 또는 단순 목록을 나타낼 때 종종 필요합니다."구조" 데이터 유형은 JSON 및 UBJSON의 "개체" 구조에 직접 매핑될 수 있으므로 JData 주석을 사용할 때 변환할 필요가 없습니다.

네이티브 데이터 텍스트-JDATA/JSON 폼 이진 JDATA(BJDATA/UBJSON)

a = (( ( )
'i1', 1
'f1', 2.0,
's1':문자열
)

➡️

{
"a":{
'i1':1
"f1": 2.0,
"s1": 문자열
}
}

[{]
[U] [1] [a]
[{]
[U] [2] [i1][U] [1]
[U] [2] [f1] [D] [2.0]
[U][2][s1][S][6][문자열]
[}]
[}]


어레이 형식의 2D 어레이

단순한 1차원 벡터는 JSON과 UBJSON 모두에서 "어레이" 구조를 사용하여 지원됩니다.예를들면

네이티브 데이터 텍스트-JDATA/JSON 폼 이진 JDATA(BJDATA/UBJSON)
a=[1,2,3 4,5,6]
➡️
{ "a " : [ 1, 2, 3 ] , [ 4, 5, 6 ] }
[ { ] [ 1 ] [ a ][ U ] [ 1 ] [ 2 ] [ U ] [ 3 ][ 3 ][ ] [ U ] [ 4 ] [ U ] [ 5 ] [ 6 ] [ ]] [ ]
위의 1-D 행 벡터의 예와 유사하게, 우리는 할 수 있습니다.
활자를 쓰다[$]그리고 카운트[#]단순화하는 마커
이진 형식의 이 배열
[{] [1] [a] [$] [U] [#] [3] [1] [2] [3] [$] [U] [3] [4] [5] [6] []] [}
이를 더욱 단순화하기 위해 JData 사양에서는

UBJSON 어레이 수 마커를 한층 더 확장했습니다.[#]N-D 배열의 차원 벡터를 나타내는 1-D 배열 카운트 유형을 수용합니다. 이 경우 2x3 행렬의 경우 [2,3]

[{] [1] [a] [$] [#] [$] [U] [#] [2] [3] [1] [2] [3] [4] [6] [}

주석이 달린 형식의 2-D 어레이

JData 규격에서는 저장된 데이터 레코드에서 데이터 유형, 데이터 크기 및 압축과 같은 추가 정보를 지정할 수 있도록 경량 데이터 주석 방식을 도입했다.이는 JData에서 지정한 사람이 읽을 수 있는 서브필드 키워드와 함께 "구조와 유사한" 데이터 컨테이너(거의 모든 프로그래밍 언어에서 구조가 지원됨)를 사용하여 실현됩니다.또한 이 구성은 기존 JSON/UBJSON 라이브러리를 사용하여 쉽게 직렬화할 수 있습니다.

예를 들어, 위의 2-D 어레이는 주석 첨부 포맷을 사용하여 데이터를 세밀하게 저장할 수 있습니다.

네이티브 데이터 텍스트-JDATA/JSON 폼 이진 JDATA(BJDATA/UBJSON)

a=[
1,2,3
4,5,6
]

➡️

{
"a":{
"_ArrayType_": "uint8",
"_Array Size_" : [ 2, 3 ],
"_Array Data_" : [1, 2, 3, 4, 5, 6]
}
}

[{]
[U] [1] [a]
[{]
[U] [11] [_ArrayType_][S] [U] [5] [uint8]
[U] [11] [ _ Array Size _ ][ U ] [ 2 ] [ U ] [ 3 ][ ]
[U] [11] [_ArrayData_][$][U][#][6] [1][2][3][4][6]
[}]
[}]

3차원 이상의 어레이

JSON/UBJSON에서 네이티브로 지원되는 고차원 어레이 저장에는 직접 포맷 또는 주석 포맷 중 하나를 사용할 수 있지만 텍스트 기반 JData에 주석 포맷을 사용하는 이점은 처리 속도가 빨라지기 때문에 이진 JData에 최적화된 포맷을 사용하는 것이 더 유리합니다.

네이티브 데이터 텍스트-JDATA/JSON 폼 이진 JDATA(BJDATA/UBJSON)
a=[       [           [1,9,6,0],           [2,9,3,1],           [8,0,9,6]       ],       [           [6,4,2,7],           [8,5,1,2],           [3,3,2,6]       ]   ] 
➡️
{   "a":[         [           [1,9,6,0],           [2,9,3,1],           [8,0,9,6]         ],         [           [6,4,2,7],           [8,5,1,2],           [3,3,2,6]         ]     ] } 
[ { ] [ 1 ] [ a ][ U ] [ 1 ] [ U ] [ 9 ] [ U ] [ 6 ] [ 0 ][ 0 ][ ] [ ] [ U ] [ 3 ] [ 1 ] [ ] [ U ] [ 0 ]
JData 주석을 사용한 보다 효율적인 대체 형식
{   "a":{         "_ArrayType_":"uint8",         "_Array Size_":[2,3,4],         "_Array Data_":[1,9,6,0,2,9,3,1,8,0,9,6,6,4,2,                        7,8,5,1,2,3,3,2,6]   } } 
[{] [U] [1] [a] [#] [U] [#] [3] [3] [4] [1] [9] [6] [2] [9] [2] [3] [1] [8] [0] [9] [9] [9] [9] [9] [6] [6] [6] [7] [7] [7]

압축 기능이 있는 어레이 데이터

JDATA 주석에서는 공간을 절약하기 위해 데이터 압축을 지원합니다.사용되는 압축 방식인 "_ArrayZipType", 압축 전에 "_ArrayData_" 구조에 저장된 "사전 처리된" 데이터의 차원 벡터인 "_ArrayZipSize_", 압축된 데이터 바이트 스트림인 "_ArrayZipData_" 등 몇 가지 추가 키워드가 필요합니다.예를들면

네이티브 데이터 텍스트-JDATA/JSON 폼 이진 JDATA(BJDATA/UBJSON)

a=[
1,2,3
4,5,6
]

➡️

{
"a":{
"_ArrayType_": "uint8",
"_Array Size_" : [ 2, 3 ],
"_ArrayZipType_: "zlib"
"_ArrayZipSize_:[1,6]
"_ArrayZipData_" : eJxjZGJMYWUDAAA+ABY="
}
}

[{]
[U] [1] [a]
[{]
[U] [11] [_ArrayType_][S] [U] [5] [uint8]
[U] [11] [ _ Array Size _ ][ U ] [ 2 ] [ U ] [ 3 ][ ]
[U] [14][_ArrayZip]Type_] [S] [U] [4] [zlib]
[U] [14] [ _ Array Zip Size _ ][ U ] [ 1 ] [ 6 ][ ]
[U] [_ArrayZipData_][$][U][#][14] [...압축된 바이트 스트림...]
[}]
[}]

복잡한 수치의 어레이와 복잡한 값의 어레이

복소값 데이터 레코드는 "주석 배열 형식"을 사용하여 저장해야 합니다.이것은, 다음의 존재에 의해서 실현됩니다._ArrayIsComplex_의 복잡한 값의 시리얼화 및_ArrayData_실제 부품 값],[상제 부품 값]의 순서로 구성된다.

네이티브 데이터 텍스트-JDATA/JSON 폼 이진 JDATA(BJDATA/UBJSON)
a=10.0+6.0j
➡️
{a}:{ "_ArrayType_":"double", "_ArraySize_":[1,1], "_ArrayIsComplex_", "_ArrayData_":[10.0], [6.0]}}
[ { ] [ U ] [ 1 ] [ a ][ 11 ] [ _ ArrayType _ ][ S ] [ 6 ] [ double ][ U ] [ 11 ] [ _ ArraySize _ ][ U ] [ 3 ][ U ] [ 3 ] [ ]] [ 16 ] [ ArrayT ]
a=[1+2j, 3+4j 5+6j, 7+8j]
➡️
{a}:{ "_ArrayType_":"uint8", "_ArraySize_":[2,2], "_ArrayIsComplex_":true "_ArrayData_":[1,3,5,7],[2,4,6,8]}
[ { ] [ U ] [ 1 ] [ a ][ 11 ] [ _ ArrayType _ ][ S ] [ 5 ] [ uint 8 ][ U ] [ 11 ] [ _ ArraySize _ ][ U ][ 2 ] [ 2 ] [ ] [ ]] [ U ] [ 16 ] [ ArrayT ]

스파스 어레이

네이티브 데이터 텍스트-JDATA/JSON 폼 이진 JDATA(BJDATA/UBJSON)
a=140(5,4); a(1,1)=2.0; a(2,3)=9.0; a(4,2)=7.0;
➡️
{ "a":{ "_ArrayType_":"double", "_ArraySize_":[5,4], "_ArrayIsSparse_":true, "_ArrayData_":[1,2,4],[1,3,2],[2.0,7.0],}}}.
[ { ] [ U ] [ 1 ] [ a ][ 11 ] [ _ ArrayType _ ][ S ] [ 6 ] [ double ][ U ] [ 11 ] [ _ ArraySize _ ][ U ] [ 3 ][ U ] [ 3 ] [ ] [ 16 ] [ ArraySP _ Resse ]

복잡한 값의 스파스 어레이

네이티브 데이터 텍스트-JDATA/JSON 폼 이진 JDATA(BJDATA/UBJSON)
a=140(5,4); a(1,1)=2.0+1.2j; a(2,3)=9.0-4.7j; a(4,2)=7.0+1.0j;
➡️
{ "a":{ "_ArrayType_"double", "_ArraySize_":[5,4], "_ArrayIsSparse_":"참", "_ArrayData_":[1,2,4], [1,3,2], [2.0,1.2,7.0],1.1].
[ { ] [ U ] [ 1 ] [ a ][ 11 ] [ _ ArrayType _ ][ S ] [ 6 ] [ double ][ U ] [ 11 ] [ _ ArraySize _ ][ U ] [ 3 ][ U ] [ 3 ] [ ] [ 16 ] [ ArraySP _ Resse ]

테이블

네이티브 데이터텍스트-JDATA/JSON 폼이진 JDATA(BJDATA/UBJSON)
a table without row-name
이름 나이 정도 높이 ----  ------- ------  ------ Andy 21 BS 69.2 윌리엄 21 MS 71.0 Om 22 BE 67.1 
➡️
{   "_TableCols_": ["이름", '나이',               "학위', '높이'],   "_TableRows_": [],   "_테이블 레코드_": [     ['앤디',    21, 'BS', 69.2],     ['윌리엄', 21, "MS", 71.0],     ['옴',      22, 'BS', 67.1]   ] } 
[{] [U] [_TableCols_][S][U][4][이름][S][U][3][연령] [S][U][6][도][S][U][6][6][도][S]높이] [ ] [ U ] [ _ TableRows _ ][ ] [ 14 ] [ _ TableRecords _ ][ S ] [ U ] [ 4 ] [ Andy ][ 21 ] [ S ] [ U ] [ 2 ] [ BS ][ d ] [ 69 2 ] [ S ] [ S ]
열 데이터 유형 지정➡️
{   "_TableCols_": [     {"데이터명":"이름",      "데이터 타입":"문자열'     },     {"데이터명":'나이',      "데이터 타입":"int32"     },     {"데이터명":"학위',      "데이터 타입":"문자열'     },     {"데이터명":'높이',      "데이터 타입":'싱글     }   ],   "_TableRows_": [],   "_테이블 레코드_": [     ['앤디',    21, 'BS', 69.2],     ['윌리엄', 21, "MS", 71.0],     ['옴',      22, 'BS', 67.1]   ] } 
[{] [U] [_TableCols_][{][U][8][데이터명][S][U][4][이름][S][U][8][데이터타입][S][U][6][string][U][S][S][6] [높이] [U] [8] [데이터타입][S][U][6][싱글][} []] [11] [_TableRows_][]][14][_TableRows_] [[ ][ U ][ 4 ] [ S ] [ U ]

나무들

네이티브 데이터 텍스트-JDATA/JSON 폼 이진 JDATA(BJDATA/UBJSON)
트리 데이터 구조
뿌리={아이디:0,데이터.:10.1}  ├── 노드 1={아이디:1,데이터.:2.5}  ├── 노드2={아이디:2,데이터.:100}      ├── 노드2.1={아이디:3,데이터.:9}      └── 노드2.2={아이디:4,데이터.:20.1}  └── 노드 3={아이디:5,데이터.:-9.0} 
➡️
 {    "_TreeNode_(root)":        {"id":0,"데이터":10.1},    "_Tree Children_": [        {"_TreeNode_(node1)":           {"id":1,"데이터":2.5}        },        {           "_TreeNode_(node2)":               {"id":2,"데이터":100},           "_Tree Children_": [              {"_TreeNode_(node2.1)":                 {"id":3,"데이터":9}              },              {"_TreeNode_(node2.2)":                  {"id":4,"데이터":20.1}              }           ]        },        {"_TreeNode_(node3)":           {"id":5,"데이터":-9.0}        }    ]  } 
[{] [U] [_TreeNode_(root)][{][U][2][id][l][0][U][4][data][d][10.1][}] [U][14][_TreeChildren_][][U][16][Node][1][Node]6] [ _ TreeNode _ ( node 2.1 ) ][ { ] [ U ] [ 2 ] [ l ] [ 3 ][ 3 ] [ U ] [ 4 ] [ d ] [ 9 ] [ ] [ } [ { ] [ U ] [ 16 ] [ _ TreeNode _ ( node 2.2 ) ][ 4 ][ ]

그래프

네이티브 데이터 텍스트-JDATA/JSON 폼 이진 JDATA(BJDATA/UBJSON)
유향 그래프 객체
  머리 ={아이디:0,데이터.:10.1}      e1 ┌─노드 1={아이디:1,데이터.:2.5}     e2  노드2={아이디:2,데이터.:100}─┐     e3                 └➝노드 3={아이디:3,데이터.:9} e7 e6   e4                   노드 4={아이디:4,데이터.:20.1}      e5   꼬리 ={아이디:5,데이터.:-9.0} 
➡️
 {    "_GraphNodes_":[      "헤드": {"id":0,"데이터":10.1},      "node1":{"id":1,"데이터":2.5 },      "node2":{"id":2,"데이터":100 },      "node3":{"id":3,"데이터":9   },      "node4":{"id":4,"데이터":20.1},      "테일': {"id":5,"데이터":-9.0}    ],    "_GraphEdges_":[      ["헤드", "node1",'e1'],      ["node1","node2",'e2'],      ["node2","node3",'e3'],      ["node3","node4",'e4'],      ["node4","테일', 'e5'],      ["node1","node3",'e6'],      ["node2","node4",'e7']    ]  } 
[{] [U] [12] [_GraphNodes_][{][U][4][id][l][0] [U][4][data][d][10.1][}[U][5][node1][ID][2]a] [d] [20.1] [ tail ][ { ] [ U ] [ 2 ] [ id ] [ 5 ] [ U ] [ 4 ] [ d ] [ d ] [-9.0 ][ ] [ ][ ] [ U ] [ 12 ] [ _ GraphEdges _ ][ 4 ][2] [e4] [ ] [ S ] [ U ] [ 4 ] [ tail ][ S ] [ 2 ][ 2 ] [ e5 ][ ] [ ] [ 4 ] [ Node 1 ] [ S ][ U ] [ 5 ] [ Node 2 ][ U ]

소프트웨어 생태계

텍스트 기반의 JData 파일은 플레인 JSON 파일이며 대부분의 기존 JSON 파서로 쉽게 구문 분석할 수 있습니다.JData 주석 태그를 포함하는 JSON 파일에는 .jdt라는 접미사를 붙이는 것이 좋습니다.단, .json으로 저장할 수도 있습니다..jdt 파일과 .json 파일 사이에는 다음과 같은 몇 가지 작은 차이가 있습니다.

  1. JDATA .jdt 파일은 하나의 파일 내에 여러 개의 연결된 JSON 개체를 수용합니다.
  2. JData .jdt 문자열은 문자열 내의 새 행을 받아들이지만 JSON 지정에서는 새 행 문자를 "\n"로 인코딩해야 합니다. 대부분의 JSON 파서는 "완화" 구문 분석 모드를 통해 문자열 내의 새 행을 처리할 수 있습니다.

JDATA 사양의 바이너리 인터페이스는 주로 UBJSON 사양 초안 12에서 파생된 형식인 Binary JDATA(Binary JDATA) 사양을 통해 정의됩니다.BJData 형식에는 UBJ에 비해 세 가지 확장 기능이 포함되어 있습니다.SON: 1) BJData는 4개의 새로운 데이터 마커를 도입했습니다.[u]위해서"uint16",[m]위해서"uint32",[M]위해서"uint64",그리고.[h]위해서"float16")는 UBJSON에서 지원되지 않는다2) BJData는 최적화된 타입의 N-D 어레이 컨테이너를 도입하고 3) BJData는 매핑을 정지한다.NaN/Infinity로.null([Z]대신 각각의 IEEE754 표현을 사용합니다.

경량 Python JData 인코더/디코더, pyjdata는 [3]PyPI, Debian/Ubuntu 및 GitHub에서 사용할 수 있습니다.dict, array, numpy ndarray 등 다양한 복잡한 데이터 구조를 JData 표현으로 변환하여 데이터를 JSON 또는 UBJSON 파일로 내보낼 수 있습니다.BJData Python 모듈,[4] pybj는 BJData/UBJ 읽기/쓰기를 활성화합니다.SON 파일은 PyPI, Debian/Ubuntu 및 GitHub에서도 사용할 수 있습니다.

MATLAB 및 GNU Octab의 경우 JSONLab v2.0은 최신 JDATA 사양의 레퍼런스 구현이며 Debian/Ubuntu, Fedora 및 GitHub에서 사용할 수 있습니다.JSONLab 툴박스는 MATLAB File Exchange를 통해 배포되며 가장 인기 있는 다운로드 패키지 중 하나이며 Popular File 2018에 이름이 붙여졌습니다.

JavaScript에서는 jsdata라는 이름의 JData 인코더/디코더가 개발되어 웹 페이지에서 JData 인코딩 파일을 처리합니다.jsdata의 두드러진 적용 분야는 NIH가 지원하는 클라우드 기반 몬테카를로 광자 전송 시뮬레이션 플랫폼인 MCX [5]Cloud이다.

Monte Carlo eXtreme 광자 전송 시뮬레이터의 일부로서 JData 주석을 포함한 JSON 파일의 부호화/복호화를 위한 콤팩트 함수도 C/C++에 구현되었다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ "JData Specification - Version 1 Draft 2". GitHub. 14 March 2022.
  2. ^ "NeuroJSON/jdata". GitHub. 14 March 2022.
  3. ^ "JData for Python - a lightweight and portable data annotation method".
  4. ^ "Binary JData for Python - a lightweight binary JSON format".
  5. ^ Fang, Qianqian; Yan, Shijie (2021). "MCX Cloud – a modern, scalable, high-performance and in-browser Monte Carlo simulation platform with cloud computing" (preprint). mcx.space. doi:10.1101/2021.06.28.450034. S2CID 235700017. Retrieved 2021-12-18.

외부 링크