2018年5月31日木曜日

OpenDolphinログイン時の通信解析

 今回は前々回と同様の手順を用いてOpenDolphinのパケットキャプチャを行い、実際にどのようなデータが流れているのかを確認した。尚、今回確認したパケットはログインを行った際に送受信されるパケットである(図1,2)。
図1.OpenDolphinログイン画面
 
図2.ログイン後に表示される受付リストとスタンプボックス

図3 Wiresharkでログイン時に流れていたパケットをキャプチャ
取得したパケットは上記の図3の様なものである。ここからprtocolが「HTTP」、Infoが「GET~」から始まるパケットを探すと全部で6つあった。各々に対して、[追跡]>[HTTPストリーム]でパケットの再構築を行った。するとポップアップが表示されるので、show and save data asの項目を「UTF-8形式」に変更し、save as...よりパケットの保存を行う。尚、この際拡張子は「.txt」とする。
保存したパケットを開くと、下記の図4のようなテキストが表示された。
図4 再構築したパケット

1行目のGET~から始まるHTTPリクエストメッセージは、クライアントがどういったデータを要求しているのかを読み取ることが出来る。HTTPリクエストメッセージはリクエスト行とヘッダから構成されている(参考:HTTP入門)。図4では、リクエスト行が次のようになっている。
GET /dolphin/openSource/user/1.3.6.1.4.1.9414.70.1:w3415016 HTTP/1.1
これはHTTPのGETメソッドを使ってユーザ情報を要求しているものと思われる。その際のRESTful APIが次のようになっている。
http://[ホスト名]:8080/dolphin/openSource/user/[ユーザID]
2行目以降はリクエストヘッダで、その中には認証用のパスワードとユーザ名が含まれている。
Accept: application/json
Accept-Encoding: gzip, deflate
password: 6f8e646f95af8e79096477e877245664
userName: 1.3.6.1.4.1.9414.70.1:w3415039

Host: 172.16.108.251:8080
Connection: Keep-Alive
パスワードはMD5ハッシュ関数でダイジェストに置き換えられている。ユーザ名は[医療機関コード:ユーザID]になっている。
次にHTTPレスポンスを見ると次のようになっている。
HTTP/1.1 200 OK
Connection: keep-alive
X-Powered-By: Undertow/1
Server: WildFly/9
Content-Type: application/json
Content-Length: 821
Date: Thu, 31 May 2018 05:49:22 GMT

JSON形式のボディ部
しかし、userIdから始まるJSON形式のボディ部は改行されていないため、大変わかりにくいので、JSON Pretty Printというサイトを用いて、データの整形を行った。まずWiresharkのHTTPストリームからHTTPレスポンスのボディ部にあるJSONデータをコピーし、左のテキストボックスにペーストする。そして中央のメニューにある「Make pretty」というボタンを押下することで、右のテキストボックスに整形されたJSONデータが出力される。以下の図5がその出力結果である。
図5 JSON Pretty Printによって整形されたJSONデータ
そして、右テキストボックスタブメニューに存在する「Copy to clip board」というアイコンをクリックすることで、コピーすることが出来る。そして、テキストファイルに保存されている破損されたデータを整形されたデータに置き換えると下記の図6のように正常なテキストが表示される様になった。
図6 JSONデータを整形したHTTPパケット
他の5つのキャプチャしたパケットも同様の手順で処理を行った。なお、これら6つのHTTPリクエスト行を抽出すると、以下の様になった。
  1. GET /dolphin/openSource/user/1.3.6.1.4.1.9414.70.1:w3415016 HTTP/1.1
  2. GET /dolphin/openSource/serverinfo/cloud/zero HTTP/1.1
  3. GET /dolphin/openSource/chartEvent/subscribe HTTP/1.1
  4. GET /dolphin/openSource/stamp/tree/13 HTTP/1.1
  5. GET /dolphin/openSource/pvt2/pvtList HTTP/1.1
  6. GET /dolphin/openSource/pvt2/pvtList HTTP/1.1

このように、ログイン時だけで6つの通信が行われていることがわかった。4番目は図2に示すスタンプボックスの情報を取得しているものと思われる。5番目、6番目は図2に示す受付リストの情報を取得しているものと思われる。2番目と3番目は不明である。また、なぜ5番目と6番目で受付リストを2回取得しているのかも不明である。

4番目のHTTPレスポンスのボディ部に図7のようなBASE64エンコードされているデータpersonalTree.treeBytesが含まれているのが分かった。
図7 受付リストに含まれるBASE64エンコード文字列()
これをオンラインBase64でデコーダというサイトを用いてデコードすることで、元のデータを抽出することが出来る。
以下の図7がそのデコード結果である。
図8 treeBytesのデコード結果
デコードされた文字列を確認すると、どうやら下に示すようにxml形式のデータであることを読み取ることが出来た。
<stampTree project="open.dolphin" version="1.0">
  <root name="傷病名" entity="diagnosis">
    <stampInfo name="エディタから発行..." role="diagnosis" entity="diagnosis" editable="false" memo="傷病名エディタ"/>
  </root>
  <root name="テキスト" entity="text">
  </root>
  <root name="パ ス" entity="path">
  </root>
  <root name="汎 用" entity="generalOrder">
    <stampInfo name="エディタから発行..." role="p" entity="generalOrder" editable="false" memo="汎用エディタ"/>
  </root>
  <root name="その他" entity="otherOrder">
    <stampInfo name="エディタから発行..." role="p" entity="otherOrder" editable="false" memo="その他エディタ"/>
  </root>
  <root name="処 置" entity="treatmentOrder">
    <stampInfo name="エディタから発行..." role="p" entity="treatmentOrder" editable="false" memo="処置エディタ"/>
  </root>
  <root name="手 術" entity="surgeryOrder">
    <stampInfo name="エディタから発行..." role="p" entity="surgeryOrder" editable="false" memo="手術エディタ"/>
  </root>
  <root name="放射線" entity="radiologyOrder">
    <stampInfo name="エディタから発行..." role="p" entity="radiologyOrder" editable="false" memo="放射線エディタ"/>
  </root>
  <root name="検体検査" entity="testOrder">
    <stampInfo name="エディタから発行..." role="p" entity="testOrder" editable="false" memo="検体検査ディタ"/>
  </root>
  <root name="生体検査" entity="physiologyOrder">
    <stampInfo name="エディタから発行..." role="p" entity="physiologyOrder" editable="false" memo="生体検査エディタ"/>
  </root>
  <root name="細菌検査" entity="bacteriaOrder">
    <stampInfo name="エディタから発行..." role="p" entity="bacteriaOrder" editable="false" memo="細菌検査ディタ"/>
  </root>
  <root name="注 射" entity="injectionOrder">
    <stampInfo name="エディタから発行..." role="p" entity="injectionOrder" editable="false" memo="注射エディタ"/>
  </root>
  <root name="処 方" entity="medOrder">
    <stampInfo name="エディタから発行..." role="p" entity="medOrder" editable="false" memo="処方エディタ"/>
  </root>
  <root name="初診・再診" entity="baseChargeOrder">
    <stampInfo name="エディタから発行..." role="p" entity="baseChargeOrder" editable="false" memo="初診・再診エディタ"/>
  </root>
  <root name="指導・在宅" entity="instractionChargeOrder">
    <stampInfo name="エディタから発行..." role="p" entity="instractionChargeOrder" editable="false" memo="指導・在宅エディタ"/>
  </root>
</stampTree>


これは、明らかに図2に示すスタンプボックスの情報である。このような情報をなぜJSONで記述せず、XMLで記述してBASE64エンコードしているのかは不明である。

次回は、ログイン時以外の様々なパケットの解析を試みたいと思う。

【TIPS】

ログイン時に取り交わされる6つのHTTPメッセージは以下のとおりである。
#1 GET /dolphin/openSource/user/1.3.6.1.4.1.9414.70.1:w3415039 HTTP/1.1
GET /dolphin/openSource/user/1.3.6.1.4.1.9414.70.1:w3415039 HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate
password: 6f8e646f95af8e79096477e877245664
userName: 1.3.6.1.4.1.9414.70.1:w3415039
Host: 172.16.108.251:8080
Connection: Keep-Alive

HTTP/1.1 200 OK
Connection: keep-alive
X-Powered-By: Undertow/1
Server: WildFly/9
Content-Type: application/json
Content-Length: 821
Date: Thu, 31 May 2018 05:49:22 GMT

{
  "userId": "1.3.6.1.4.1.9414.70.1:w3415039",
  "facilityModel": {
    "facilityId": "1.3.6.1.4.1.9414.70.1",
    "facilityName": "クリニック",
    "zipCode": "",
    "telephone": "",
    "facsimile": null,
    "s3URL": null,
    "s3AccessKey": null,
    "s3SecretKey": null,
    "memberType": "FACILITY_USER",
    "registeredDate": "2018-05-10",
    "url": "",
    "address": "",
    "id": 1
  },
  "sirName": "守久",
  "givenName": "遼子",
  "commonName": "守久 遼子",
  "departmentModel": {
    "departmentCodeSys": "MML0028",
    "departmentDesc": "内科",
    "department": "01"
  },
  "memo": null,
  "email": "kurasiki@caja",
  "orcaId": "10002",
  "useDrugId": "",
  "memberType": "FACILITY_USER",
  "registeredDate": "2018-05-17",
  "licenseModel": {
    "licenseDesc": "医師",
    "licenseCodeSys": "MML0026",
    "license": "doctor"
  },
  "roles": [
    {
      "userId": "1.3.6.1.4.1.9414.70.1:w3415039",
      "role": "user",
      "id": 20
    }
  ],
  "password": "6f8e646f95af8e79096477e877245664",
  "id": 19
}
#2 GET /dolphin/openSource/serverinfo/cloud/zero HTTP/1.1
GET /dolphin/openSource/serverinfo/cloud/zero HTTP/1.1
Accept: text/plain
Accept-Encoding: gzip, deflate
password: 6f8e646f95af8e79096477e877245664
userName: 1.3.6.1.4.1.9414.70.1:w3415039
Host: 172.16.108.251:8080
Connection: Keep-Alive

HTTP/1.1 200 OK
Connection: keep-alive
X-Powered-By: Undertow/1
Server: WildFly/9
Content-Type: text/plain
Content-Length: 0
Date: Thu, 31 May 2018 05:49:22 GMT
#3 GET /dolphin/openSource/chartEvent/subscribe HTTP/1.1
GET /dolphin/openSource/chartEvent/subscribe HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate
clientUUID: w3415039:89fa211b-833f-438a-a15e-3a298981e1db
password: 6f8e646f95af8e79096477e877245664
userName: 1.3.6.1.4.1.9414.70.1:w3415039
Host: 172.16.108.251:8080
Connection: Keep-Alive
#4 GET /dolphin/openSource/stamp/tree/19 HTTP/1.1
GET /dolphin/openSource/stamp/tree/19 HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate
password: 6f8e646f95af8e79096477e877245664
userName: 1.3.6.1.4.1.9414.70.1:w3415039
Host: 172.16.108.251:8080
Connection: Keep-Alive

HTTP/1.1 200 OK
Connection: keep-alive
X-Powered-By: Undertow/1
Server: WildFly/9
Content-Type: application/json
Content-Length: 4486
Date: Thu, 31 May 2018 05:49:22 GMT

{
  "personalTree": {
    "category": null,
    "userModel": {
      "userId": "1.3.6.1.4.1.9414.70.1:w3415039",
      "facilityModel": {
        "facilityId": "1.3.6.1.4.1.9414.70.1",
        "facilityName": "クリニック",
        "zipCode": "",
        "telephone": "",
        "facsimile": null,
        "s3URL": null,
        "s3AccessKey": null,
        "s3SecretKey": null,
        "memberType": "FACILITY_USER",
        "registeredDate": "2018-05-10",
        "url": "",
        "address": "",
        "id": 1
      },
      "sirName": "守久",
      "givenName": "遼子",
      "commonName": "守久 遼子",
      "departmentModel": {
        "departmentCodeSys": "MML0028",
        "departmentDesc": "内科",
        "department": "01"
      },
      "memo": null,
      "email": "kurasiki@caja",
      "orcaId": "10002",
      "useDrugId": "",
      "memberType": "FACILITY_USER",
      "registeredDate": "2018-05-17",
      "licenseModel": {
        "licenseDesc": "医師",
        "licenseCodeSys": "MML0026",
        "license": "doctor"
      },
      "roles": [
        {
          "userId": "1.3.6.1.4.1.9414.70.1:w3415039",
          "role": "user",
          "id": 20
        }
      ],
      "password": "6f8e646f95af8e79096477e877245664",
      "id": 19
    },
    "treeBytes": "PHN0YW1wVHJlZSBwcm9qZWN0PSJvcGVuLmRvbHBoaW4iIHZlcnNpb249IjEuMCI+Cjxyb290IG5hbWU9IuWCt+eXheWQjSIgZW50aXR5PSJkaWFnbm9zaXMiPgo8c3RhbXBJbmZvIG5hbWU9IuOCqOODh+OCo+OCv+OBi+OCieeZuuihjC4uLiIgcm9sZT0iZGlhZ25vc2lzIiBlbnRpdHk9ImRpYWdub3NpcyIgZWRpdGFibGU9ImZhbHNlIiBtZW1vPSLlgrfnl4XlkI3jgqjjg4fjgqPjgr8iLz4KPC9yb290Pgo8cm9vdCBuYW1lPSLjg4bjgq3jgrnjg4giIGVudGl0eT0idGV4dCI+Cjwvcm9vdD4KPHJvb3QgbmFtZT0i44ORIOOCuSIgZW50aXR5PSJwYXRoIj4KPC9yb290Pgo8cm9vdCBuYW1lPSLmsY4g55SoIiBlbnRpdHk9ImdlbmVyYWxPcmRlciI+CjxzdGFtcEluZm8gbmFtZT0i44Ko44OH44Kj44K/44GL44KJ55m66KGMLi4uIiByb2xlPSJwIiBlbnRpdHk9ImdlbmVyYWxPcmRlciIgZWRpdGFibGU9ImZhbHNlIiBtZW1vPSLmsY7nlKjjgqjjg4fjgqPjgr8iLz4KPC9yb290Pgo8cm9vdCBuYW1lPSLjgZ3jga7ku5YiIGVudGl0eT0ib3RoZXJPcmRlciI+CjxzdGFtcEluZm8gbmFtZT0i44Ko44OH44Kj44K/44GL44KJ55m66KGMLi4uIiByb2xlPSJwIiBlbnRpdHk9Im90aGVyT3JkZXIiIGVkaXRhYmxlPSJmYWxzZSIgbWVtbz0i44Gd44Gu5LuW44Ko44OH44Kj44K/Ii8+Cjwvcm9vdD4KPHJvb3QgbmFtZT0i5YemIOe9riIgZW50aXR5PSJ0cmVhdG1lbnRPcmRlciI+CjxzdGFtcEluZm8gbmFtZT0i44Ko44OH44Kj44K/44GL44KJ55m66KGMLi4uIiByb2xlPSJwIiBlbnRpdHk9InRyZWF0bWVudE9yZGVyIiBlZGl0YWJsZT0iZmFsc2UiIG1lbW89IuWHpue9ruOCqOODh+OCo+OCvyIvPgo8L3Jvb3Q+Cjxyb290IG5hbWU9IuaJiyDooZMiIGVudGl0eT0ic3VyZ2VyeU9yZGVyIj4KPHN0YW1wSW5mbyBuYW1lPSLjgqjjg4fjgqPjgr/jgYvjgonnmbrooYwuLi4iIHJvbGU9InAiIGVudGl0eT0ic3VyZ2VyeU9yZGVyIiBlZGl0YWJsZT0iZmFsc2UiIG1lbW89IuaJi+ihk+OCqOODh+OCo+OCvyIvPgo8L3Jvb3Q+Cjxyb290IG5hbWU9IuaUvuWwhOe3miIgZW50aXR5PSJyYWRpb2xvZ3lPcmRlciI+CjxzdGFtcEluZm8gbmFtZT0i44Ko44OH44Kj44K/44GL44KJ55m66KGMLi4uIiByb2xlPSJwIiBlbnRpdHk9InJhZGlvbG9neU9yZGVyIiBlZGl0YWJsZT0iZmFsc2UiIG1lbW89IuaUvuWwhOe3muOCqOODh+OCo+OCvyIvPgo8L3Jvb3Q+Cjxyb290IG5hbWU9IuaknOS9k+aknOafuyIgZW50aXR5PSJ0ZXN0T3JkZXIiPgo8c3RhbXBJbmZvIG5hbWU9IuOCqOODh+OCo+OCv+OBi+OCieeZuuihjC4uLiIgcm9sZT0icCIgZW50aXR5PSJ0ZXN0T3JkZXIiIGVkaXRhYmxlPSJmYWxzZSIgbWVtbz0i5qSc5L2T5qSc5p+744OH44Kj44K/Ii8+Cjwvcm9vdD4KPHJvb3QgbmFtZT0i55Sf5L2T5qSc5p+7IiBlbnRpdHk9InBoeXNpb2xvZ3lPcmRlciI+CjxzdGFtcEluZm8gbmFtZT0i44Ko44OH44Kj44K/44GL44KJ55m66KGMLi4uIiByb2xlPSJwIiBlbnRpdHk9InBoeXNpb2xvZ3lPcmRlciIgZWRpdGFibGU9ImZhbHNlIiBtZW1vPSLnlJ/kvZPmpJzmn7vjgqjjg4fjgqPjgr8iLz4KPC9yb290Pgo8cm9vdCBuYW1lPSLntLDoj4zmpJzmn7siIGVudGl0eT0iYmFjdGVyaWFPcmRlciI+CjxzdGFtcEluZm8gbmFtZT0i44Ko44OH44Kj44K/44GL44KJ55m66KGMLi4uIiByb2xlPSJwIiBlbnRpdHk9ImJhY3RlcmlhT3JkZXIiIGVkaXRhYmxlPSJmYWxzZSIgbWVtbz0i57Sw6I+M5qSc5p+744OH44Kj44K/Ii8+Cjwvcm9vdD4KPHJvb3QgbmFtZT0i5rOoIOWwhCIgZW50aXR5PSJpbmplY3Rpb25PcmRlciI+CjxzdGFtcEluZm8gbmFtZT0i44Ko44OH44Kj44K/44GL44KJ55m66KGMLi4uIiByb2xlPSJwIiBlbnRpdHk9ImluamVjdGlvbk9yZGVyIiBlZGl0YWJsZT0iZmFsc2UiIG1lbW89IuazqOWwhOOCqOODh+OCo+OCvyIvPgo8L3Jvb3Q+Cjxyb290IG5hbWU9IuWHpiDmlrkiIGVudGl0eT0ibWVkT3JkZXIiPgo8c3RhbXBJbmZvIG5hbWU9IuOCqOODh+OCo+OCv+OBi+OCieeZuuihjC4uLiIgcm9sZT0icCIgZW50aXR5PSJtZWRPcmRlciIgZWRpdGFibGU9ImZhbHNlIiBtZW1vPSLlh6bmlrnjgqjjg4fjgqPjgr8iLz4KPC9yb290Pgo8cm9vdCBuYW1lPSLliJ3oqLrjg7vlho3oqLoiIGVudGl0eT0iYmFzZUNoYXJnZU9yZGVyIj4KPHN0YW1wSW5mbyBuYW1lPSLjgqjjg4fjgqPjgr/jgYvjgonnmbrooYwuLi4iIHJvbGU9InAiIGVudGl0eT0iYmFzZUNoYXJnZU9yZGVyIiBlZGl0YWJsZT0iZmFsc2UiIG1lbW89IuWIneiouuODu+WGjeiouuOCqOODh+OCo+OCvyIvPgo8L3Jvb3Q+Cjxyb290IG5hbWU9IuaMh+WwjuODu+WcqOWuhSIgZW50aXR5PSJpbnN0cmFjdGlvbkNoYXJnZU9yZGVyIj4KPHN0YW1wSW5mbyBuYW1lPSLjgqjjg4fjgqPjgr/jgYvjgonnmbrooYwuLi4iIHJvbGU9InAiIGVudGl0eT0iaW5zdHJhY3Rpb25DaGFyZ2VPcmRlciIgZWRpdGFibGU9ImZhbHNlIiBtZW1vPSLmjIflsI7jg7vlnKjlroXjgqjjg4fjgqPjgr8iLz4KPC9yb290Pgo8L3N0YW1wVHJlZT4K",
    "publishType": null,
    "partyName": "クリニック",
    "publishedDate": null,
    "lastUpdated": null,
    "published": null,
    "versionNumber": "13",
    "url": "",
    "description": "個人用のスタンプセットです",
    "name": "個人用",
    "id": 23
  },
  "subscribedList": []
}
#5 GET /dolphin/openSource/pvt2/pvtList HTTP/1.1
GET /dolphin/openSource/pvt2/pvtList HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate
password: 6f8e646f95af8e79096477e877245664
userName: 1.3.6.1.4.1.9414.70.1:w3415039
Host: 172.16.108.251:8080
Connection: Keep-Alive

HTTP/1.1 200 OK
Connection: keep-alive
X-Powered-By: Undertow/1
Server: WildFly/9
Content-Type: application/json
Content-Length: 2346
Date: Thu, 31 May 2018 05:49:22 GMT

{
  "list": [
    {
      "memo": null,
      "facilityId": "1.3.6.1.4.1.9414.70.1",
      "patientModel": {
        "romanName": null,
        "nationality": null,
        "nationalityDesc": null,
        "maritalStatus": null,
        "jpegPhoto": null,
        "mobilePhone": null,
        "relations": null,
        "reserve1": null,
        "reserve2": null,
        "reserve3": null,
        "reserve4": null,
        "reserve5": null,
        "reserve6": null,
        "memo": null,
        "email": null,
        "facilityId": "1.3.6.1.4.1.9414.70.1",
        "telephone": null,
        "patientId": "00004",
        "healthInsurances": [
          {
            "beanBytes": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGphdmEgdmVyc2lvbj0iMS44LjBfMTYxIiBjbGFzcz0iamF2YS5iZWFucy5YTUxEZWNvZGVyIj4KIDxvYmplY3QgY2xhc3M9Im9wZW4uZG9scGhpbi5pbmZvbW9kZWwuUFZUSGVhbHRoSW5zdXJhbmNlTW9kZWwiPgogIDx2b2lkIHByb3BlcnR5PSJHVUlEIj4KICAgPHN0cmluZz41Yjk0NWIyZi01Mzg4LTQ0ODMtYjlhYS0wOTdkMDJhZDk1MmE8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9ImNsaWVudEdyb3VwIj4KICAgPHN0cmluZz7vvJLvvJDvvJDvvJA8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9ImNsaWVudE51bWJlciI+CiAgIDxzdHJpbmc+77yW77yY77yV77yTPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJleHBpcmVkRGF0ZSI+CiAgIDxzdHJpbmc+OTk5OS0xMi0zMTwvc3RyaW5nPgogIDwvdm9pZD4KICA8dm9pZCBwcm9wZXJ0eT0iZmFtaWx5Q2xhc3MiPgogICA8c3RyaW5nPmZhbHNlPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJpbnN1cmFuY2VDbGFzcyI+CiAgIDxzdHJpbmc+57WE5ZCIPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJpbnN1cmFuY2VDbGFzc0NvZGUiPgogICA8c3RyaW5nPjA2PC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJpbnN1cmFuY2VDbGFzc0NvZGVTeXMiPgogICA8c3RyaW5nPk1NTDAwMzE8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9Imluc3VyYW5jZU51bWJlciI+CiAgIDxzdHJpbmc+MDYzMzAwNzA8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9InBheU91dFJhdGlvIj4KICAgPHN0cmluZz4wLjMwPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJzdGFydERhdGUiPgogICA8c3RyaW5nPjIwMTctMTAtMzA8L3N0cmluZz4KICA8L3ZvaWQ+CiA8L29iamVjdD4KPC9qYXZhPgo=",
            "id": 32
          }
        ],
        "kanaName": "サヤマ セイジ",
        "gender": "male",
        "genderDesc": "M",
        "birthday": "1948-06-15",
        "simpleAddressModel": null,
        "appMemo": "診察1",
        "pvtDate": null,
        "ownerUUID": null,
        "fullName": "佐山 清二",
        "id": 31
      },
      "deptName": "内科",
      "deptCode": "01",
      "doctorName": "守久 遼子",
      "doctorId": "10002",
      "jmariNumber": "JPN000000000000",
      "pvtDate": "2018-05-17T15:22:21",
      "department": "内科,01,守久 遼子,10002,JPN000000000000,",
      "firstInsurance": "06 組合",
      "insuranceUid": "5b945b2f-5388-4483-b9aa-097d02ad952a",
      "lastDocDate": null,
      "appointment": null,
      "id": 34,
      "state": 0
    }
  ]
}
#6 GET /dolphin/openSource/pvt2/pvtList HTTP/1.1
GET /dolphin/openSource/pvt2/pvtList HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate
password: 6f8e646f95af8e79096477e877245664
userName: 1.3.6.1.4.1.9414.70.1:w3415039
Host: 172.16.108.251:8080
Connection: Keep-Alive

HTTP/1.1 200 OK
Connection: keep-alive
X-Powered-By: Undertow/1
Server: WildFly/9
Content-Type: application/json
Content-Length: 2346
Date: Thu, 31 May 2018 05:49:22 GMT

{
  "list": [
    {
      "memo": null,
      "facilityId": "1.3.6.1.4.1.9414.70.1",
      "patientModel": {
        "romanName": null,
        "nationality": null,
        "nationalityDesc": null,
        "maritalStatus": null,
        "jpegPhoto": null,
        "mobilePhone": null,
        "relations": null,
        "reserve1": null,
        "reserve2": null,
        "reserve3": null,
        "reserve4": null,
        "reserve5": null,
        "reserve6": null,
        "memo": null,
        "email": null,
        "facilityId": "1.3.6.1.4.1.9414.70.1",
        "telephone": null,
        "patientId": "00004",
        "healthInsurances": [
          {
            "beanBytes": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGphdmEgdmVyc2lvbj0iMS44LjBfMTYxIiBjbGFzcz0iamF2YS5iZWFucy5YTUxEZWNvZGVyIj4KIDxvYmplY3QgY2xhc3M9Im9wZW4uZG9scGhpbi5pbmZvbW9kZWwuUFZUSGVhbHRoSW5zdXJhbmNlTW9kZWwiPgogIDx2b2lkIHByb3BlcnR5PSJHVUlEIj4KICAgPHN0cmluZz41Yjk0NWIyZi01Mzg4LTQ0ODMtYjlhYS0wOTdkMDJhZDk1MmE8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9ImNsaWVudEdyb3VwIj4KICAgPHN0cmluZz7vvJLvvJDvvJDvvJA8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9ImNsaWVudE51bWJlciI+CiAgIDxzdHJpbmc+77yW77yY77yV77yTPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJleHBpcmVkRGF0ZSI+CiAgIDxzdHJpbmc+OTk5OS0xMi0zMTwvc3RyaW5nPgogIDwvdm9pZD4KICA8dm9pZCBwcm9wZXJ0eT0iZmFtaWx5Q2xhc3MiPgogICA8c3RyaW5nPmZhbHNlPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJpbnN1cmFuY2VDbGFzcyI+CiAgIDxzdHJpbmc+57WE5ZCIPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJpbnN1cmFuY2VDbGFzc0NvZGUiPgogICA8c3RyaW5nPjA2PC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJpbnN1cmFuY2VDbGFzc0NvZGVTeXMiPgogICA8c3RyaW5nPk1NTDAwMzE8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9Imluc3VyYW5jZU51bWJlciI+CiAgIDxzdHJpbmc+MDYzMzAwNzA8L3N0cmluZz4KICA8L3ZvaWQ+CiAgPHZvaWQgcHJvcGVydHk9InBheU91dFJhdGlvIj4KICAgPHN0cmluZz4wLjMwPC9zdHJpbmc+CiAgPC92b2lkPgogIDx2b2lkIHByb3BlcnR5PSJzdGFydERhdGUiPgogICA8c3RyaW5nPjIwMTctMTAtMzA8L3N0cmluZz4KICA8L3ZvaWQ+CiA8L29iamVjdD4KPC9qYXZhPgo=",
            "id": 32
          }
        ],
        "kanaName": "サヤマ セイジ",
        "gender": "male",
        "genderDesc": "M",
        "birthday": "1948-06-15",
        "simpleAddressModel": null,
        "appMemo": "診察1",
        "pvtDate": null,
        "ownerUUID": null,
        "fullName": "佐山 清二",
        "id": 31
      },
      "deptName": "内科",
      "deptCode": "01",
      "doctorName": "守久 遼子",
      "doctorId": "10002",
      "jmariNumber": "JPN000000000000",
      "pvtDate": "2018-05-17T15:22:21",
      "department": "内科,01,守久 遼子,10002,JPN000000000000,",
      "firstInsurance": "06 組合",
      "insuranceUid": "5b945b2f-5388-4483-b9aa-097d02ad952a",
      "lastDocDate": null,
      "appointment": null,
      "id": 34,
      "state": 0
    }
  ]
}
#5と#6は同じ内容に見える。
なお、#5,#6の中にあるBASE64エンコード部分(patientModel.healthInsurances.beanBytes)をデコードすると次のようになっていた。
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_161" class="java.beans.XMLDecoder">
 <object class="open.dolphin.infomodel.PVTHealthInsuranceModel">
  <void property="GUID">
   <string>5b945b2f-5388-4483-b9aa-097d02ad952a</string>
  </void>
  <void property="clientGroup">
   <string>2000</string>
  </void>
  <void property="clientNumber">
   <string>6853</string>
  </void>
  <void property="expiredDate">
   <string>9999-12-31</string>
  </void>
  <void property="familyClass">
   <string>false</string>
  </void>
  <void property="insuranceClass">
   <string>組合</string>
  </void>
  <void property="insuranceClassCode">
   <string>06</string>
  </void>
  <void property="insuranceClassCodeSys">
   <string>MML0031</string>
  </void>
  <void property="insuranceNumber">
   <string>06330070</string>
  </void>
  <void property="payOutRatio">
   <string>0.30</string>
  </void>
  <void property="startDate">
   <string>2017-10-30</string>
  </void>
 </object>
</java>
明らかに保険情報である。

使用可能メモリについて

前回のブログで物理メモリと使用可能メモリの間に大きな差があることを書いた。その対策としてシステム構成において最大メモリのチェックを外すという方法が紹介されていた。
これにしたがって操作をしていたところ、誤って最大メモリを0にしたままチェックを入れて再起動してしまった。そのため、使用可能なメモリが0になってしまい、Windowsは起動はするものの、遅くて使い物にならなくなった。
これについてはネット上に「msconfigのブート詳細オプションでメモリを0に設定してしまった」という記事があり、他にも同様な現象にさいなまれている人がいるとわかった。これに対してどのようにして復旧したかを書いておく。

復旧方法

まず復旧するにあたってメモリが全く使われていない関係上通常の環境下ではとてもではないがmsconfigを実行する事ができない為、必要最低限の動作で作業を行う必要がある。その為今回はセーフモードで復旧作業を行うのだが、windows10はデフォルトの状態だと起動時にF8等のコマンドを入力してもセーフモードの起動を行うことができないようだ。そこで調べてみたところ、どうやらwindowsの起動に2回以上失敗すると、次回起動時にスタートアップ修復なるものが実行され、そこからセーフモードでの起動が行える様だ。スタートアップ修復が実行された後は、この様な手順でセーフモードでの起動を行うことが出来る。
セーフモードで起動することができれば、検索バーもしくは「Winキー+R」でファイル名を指定して実行を呼び出し、「msconfig」と入力しシステム構成を起動する。あとはブートタブ>詳細オプションからブート詳細オプションを表示し、「最大メモリ」のチェックを外し設定を変更することで、復旧を行うことが出来る。



0 件のコメント:

コメントを投稿

レーダーチャートの表示2

前回 レーダーチャートの表示を行うことが出来たので、今回は実際の値を代入したグラフの描画を試みる。 .controller('RaderChartController', ['$scope', 'Countries', funct...