Hatena::ブログ(Diary)

kinneko@転職先募集中の日記

検索エンジンから来た方へ: 申し訳ないですが、日記なので日々積み重なっています。
目的の情報にたどり着くには、右の検索窓から日記内を再検索してください。
北陸エリア内(もしくはエリア外でも)で転職先を探しています。
(マジです。ネタではありません。ホントですって...)
詳細履歴書をご希望の方はメールでご連絡下さいませ。(kinneko at gmail.com)
chromeで見ると、死ぬほど出るGoogleの広告がブロックできないので、
firefoxでABPを入れるとすっきり見られます。

2017-04-20

RESTで応答するテストサーバーをノンコーディングで作る

ちょっと必要だったので、nodeでやってみた。

テストデーターの生成にはコーディングが必要だけど、数行のたいしたことない程度。


  • 使えたところ
    • サーバー側はノンコーディングで一瞬で立つ
    • テキストを使うのでダミーデータはすぐ作れる
  • 使いにくかったところ
    • keyがidに指定した連番になる
    • 検索は時間かかる
    • 追記すると2秒くらいはかかる

さくらのクラウドでUbuntuのインスタンスを生成

sshでアクセス。サボってrootで作業。

nodeとnpmをインストール。

# apt-get update

# apt-get install nodejs npm

# nodejs -v

v4.2.6

# npm -v

3.5.2

サボって、作業ディレクトリも作らず/rootのまま。

json-serverのインストール。

# npm i json-server -g


fakerで30万件のダミーデータの作成

# npm install faker

# vi make_fakedata.js

var counter = 10;
var faker = require('faker');
var db = { devices: [] };
for (var i=1; i<=counter; i++) {
  db. devices.push({
    uuid: faker.random.uuid(),
    mac: faker.internet.mac(),
    ipv4: faker.internet.ip(),
    id: i
  });
}
console.log(JSON.stringify(db));

テスト。

# nodejs make_fakedata.js

{"devices":[{"uuid":"c1305913-b21f-4714-b66b-79fffc625a32","mac":"c1:d5:32:12:0a:af","ipv4":"55.120.235.205","id":1},{"uuid":"f3d898cc-0c0f-45e1-b072-4021128db61f","mac":"48:38:76:28:fb:24","ipv4":"179.135.210.85","id":2},{"uuid":"2278dadd-2f80-4947-b2bc-1cf31b84d72c","mac":"c7:48:5c:68:d2:84","ipv4":"16.165.28.98","id":3},{"uuid":"81c5818f-22b2-4e5c-9c07-ca63acc19009","mac":"07:27:a7:20:31:45","ipv4":"189.132.206.77","id":4},{"uuid":"36c5cbd3-6da6-45be-9f6f-8eb1958d93e8","mac":"0c:ce:6b:80:64:66","ipv4":"146.204.232.92","id":5},{"uuid":"e3c1ad07-af87-4e3c-8934-888e62b15c0e","mac":"0c:36:dc:52:f2:66","ipv4":"60.174.66.106","id":6},{"uuid":"fe72849e-74d7-4177-9802-349838799333","mac":"80:36:b5:fb:b9:42","ipv4":"13.41.45.14","id":7},{"uuid":"5fc210bd-1538-4bd1-8d6d-94447f07fd7e","mac":"27:e0:b6:01:63:13","ipv4":"40.101.51.226","id":8},{"uuid":"fa362123-f7bf-47c2-bcc7-9be018436a05","mac":"4e:ef:ea:06:3c:15","ipv4":"52.83.186.234","id":9},{"uuid":"7674474d-4114-4f27-a3c2-caaf1756f96b","mac":"74:06:ab:7d:0f:9d","ipv4":"141.83.211.251","id":10}]}

30万件に増やして作成。

# vi make_fakedata.js

var counter = 300000;

吐く。

# time nodejs make_fakedata.js > db.json

real 0m21.968s

user 0m21.712s

sys 0m0.220s

サイズ感。

# ls -lh db.json

-rw-r--r-- 1 root root 32M Apr 20 22:58 db.json


起動テスト

# json-server --watch db.json

/usr/bin/env: ‘node’: No such file or directory

Ubuntuはこういうのがめんどくさいね。

# which nodejs

/usr/bin/nodejs

# ln -s /usr/bin/nodejs /usr/bin/node

再度。

# json-server --watch db.json

\{^_^}/ hi!

Loading db.json

Done

Resources

http://localhost:3000/devices

Home

http://localhost:3000

Type s + enter at any time to create a snapshot of the database

Watching...

ブラウザでport3000にアクセスする。

なにやら画面が出てきた。動いているようだ。


動作テスト

ローカルから。

# time curl -X GET "http://XXX.XXX.XXX.XXX:3000/devices/1"

{

"uuid": "9ff31ac6-1b68-488e-abd3-1be571cae96b",

"mac": "61:1e:c2:6b:f2:dc",

"ipv4": "230.130.203.248",

"id": 1

}

real 0m0.012s

user 0m0.004s

sys 0m0.000s

リモートなコンソールから。

$ time curl -X GET "http://XXX.XXX.XXX.XXX:3000/devices/1"

{

"uuid": "9ff31ac6-1b68-488e-abd3-1be571cae96b",

"mac": "61:1e:c2:6b:f2:dc",

"ipv4": "230.130.203.248",

"id": 1

}

real 0m0.102s

user 0m0.030s

sys 0m0.000s

結構速いな。

お尻で変わる?

$ time curl -X GET "http://XXX.XXX.XXX.XXX:3000/devices/300000"

{

"uuid": "d42f3058-18af-42a3-b386-c40346663b03",

"mac": "64:6b:2c:3e:c8:1b",

"ipv4": "35.141.241.191",

"id": 300000

}

real 0m0.295s

user 0m0.020s

sys 0m0.010s

ちょっと遅くなるか?


ページ表示

# time curl -X GET "http://XXX.XXX.XXX.XXX:3000/devices/?_page=300"

[

{

"uuid": "5181a658-e09c-4240-bad1-eae1994afa50",

"mac": "cf:c6:83:91:83:03",

"ipv4": "201.52.9.202",

"id": 2991

},

{

"uuid": "caa13979-913f-4293-9af2-2690f5f62ad8",

"mac": "c9:0a:ce:1f:71:ea",

"ipv4": "134.201.251.112",

"id": 2992

},

{

"uuid": "aef66395-48b6-4c70-a36f-00cd71ada02a",

"mac": "e0:4f:ce:97:dd:3a",

"ipv4": "252.0.154.170",

"id": 2993

},

{

"uuid": "8a43dbd5-1aad-417d-9304-02a2171cf510",

"mac": "b8:4e:af:cc:04:3f",

"ipv4": "250.255.158.145",

"id": 2994

},

{

"uuid": "ab2a1789-117a-4147-8070-e6de311f1b8b",

"mac": "fd:76:79:09:aa:1d",

"ipv4": "213.199.191.146",

"id": 2995

},

{

"uuid": "b88a7a6c-d004-4d36-81ff-e173fe0ed1ea",

"mac": "f4:59:61:0b:23:be",

"ipv4": "136.238.119.171",

"id": 2996

},

{

"uuid": "bd34cbd1-64eb-46ca-882c-8066d28485c9",

"mac": "28:79:e1:34:1f:52",

"ipv4": "244.206.222.224",

"id": 2997

},

{

"uuid": "cf1f5712-40e7-41ad-b0e8-3131ae42d514",

"mac": "b7:8e:03:18:f7:cd",

"ipv4": "220.246.58.101",

"id": 2998

},

{

"uuid": "50960509-0cfa-4f6d-bbe3-a78173b22f38",

"mac": "99:ed:ef:a8:89:89",

"ipv4": "124.46.195.80",

"id": 2999

},

{

"uuid": "5a36c403-bf97-4c9d-94d0-b573a175ea04",

"mac": "9c:a1:6a:20:0b:12",

"ipv4": "32.64.176.38",

"id": 3000

}

]

real 0m0.486s

user 0m0.004s

sys 0m0.000s

10件表示された。このページ表示件数パラメータがいじれるといいのに。

おっと、_limit設定あった。

# curl -X GET "http://localhost:3000/devices/?_page=3&_limit=3"

[

{

"uuid": "dd651687-fbde-46fa-8b25-0f4ce3ca0820",

"mac": "05:66:a1:bf:c2:5b",

"ipv4": "95.45.132.54",

"id": 7

},

{

"uuid": "25aa9b73-3817-435c-8a3a-66b471f62c0f",

"mac": "ec:5a:71:59:75:71",

"ipv4": "92.209.6.102",

"id": 8

},

{

"uuid": "83563893-e0e7-4b6b-8205-29ad4a01270e",

"mac": "55:bd:31:4a:6e:b0",

"ipv4": "214.142.77.147",

"id": 9

}

]


レコード追加のテスト

重複idで書き込んでみる。

# curl -X POST -H "Content-Type: application/json" -d '{

> "uuid": "5181a658-e09c-4240-bad1-eae1994afa51",

> "mac": "cf:c6:83:91:83:04",

> "ipv4": "201.52.9.203",

> "id": 30001

> }' "http://XXX.XXX.XXX.XXX:3000/devices"

Error: Insert failed; duplicate id.

at Function.module.exports.insert (/usr/local/lib/node_modules/json-server/node_modules/lodash-id/src/index.js:49:18)

at /usr/local/lib/node_modules/json-server/node_modules/lodash/lodash.js:4379:28

at arrayReduce (/usr/local/lib/node_modules/json-server/node_modules/lodash/lodash.js:704:21)

at baseWrapperValue (/usr/local/lib/node_modules/json-server/node_modules/lodash/lodash.js:4378:14)

at LodashWrapper.wrapperValue (/usr/local/lib/node_modules/json-server/node_modules/lodash/lodash.js:9067:14)

at create (/usr/local/lib/node_modules/json-server/lib/server/router/plural.js:226:50)

at Layer.handle [as handle_request] (/usr/local/lib/node_modules/json-server/node_modules/express/lib/router/layer.js:95:5)

at next (/usr/local/lib/node_modules/json-server/node_modules/express/lib/router/route.js:137:13)

at next (/usr/local/lib/node_modules/json-server/node_modules/express/lib/router/route.js:131:14)

at Route.dispatch (/usr/local/lib/node_modules/json-server/node_modules/express/lib/router/route.js:112:3)

上書きされるわけではない。

サーバーは落ちたりしていない。


未登録idで書いてみる。

# time curl -X POST -H "Content-Type: application/json" -d '{

> "uuid": "5181a658-e09c-4240-bad1-eae1994afa52",

> "mac": "cf:c6:83:91:83:05",

> "ipv4": "201.52.9.204",

> "id": 300001

> }' "http://153.127.217.118:3000/devices"

{

"uuid": "5181a658-e09c-4240-bad1-eae1994afa52",

"mac": "cf:c6:83:91:83:05",

"ipv4": "201.52.9.204",

"id": 300001

}

real 0m2.373s

user 0m0.004s

sys 0m0.000s

2.3秒はかかりすぎか…

# tail -n 8 db.json

{

"uuid": "5181a658-e09c-4240-bad1-eae1994afa52",

"mac": "cf:c6:83:91:83:05",

"ipv4": "201.52.9.204",

"id": 300001

}

]

}

追記されている。


検索

フィルターを使った絞込み。

# curl -X GET "http://localhost:3000/devices?mac=cf:c6:83:91:83:05"

[

{

"uuid": "5181a658-e09c-4240-bad1-eae1994afa52",

"mac": "cf:c6:83:91:83:05",

"ipv4": "201.52.9.204",

"id": 300002

}

]

コンソールログはこんなのが出ている。

GET /devices?mac=cf:c6:83:91:83:05 200 1478.592 ms - 140

少し時間かかってるかな。

&でつないで、複数のフィルタを設定することもできる。


論理演算子でフィルタしてみる。

_gteを付けると>。

_lteを付けると<。

_neを付けると、その値を除外。

# curl -X GET "http://localhost:3000/devices?id_gte=300000&id_lte=300001"

[

{

"uuid": "d42f3058-18af-42a3-b386-c40346663b03",

"mac": "64:6b:2c:3e:c8:1b",

"ipv4": "35.141.241.191",

"id": 300000

},

{

"uuid": "5181a658-e09c-4240-bad1-eae1994afa51",

"mac": "cf:c6:83:91:83:04",

"ipv4": "201.52.9.203",

"id": 300001

}

]


こういうフィルタも書けるハズだけど、うまくいかなかった。

# curl -X GET "http://localhost:3000/devices?ipv4.201"


ソート

_sortと_orderプロパティが設定できる。

# curl -X GET "http://localhost:3000/devices?id_gte=3000&id_lte=30005&_sort=uuid&_order=DESC"

[

{

"uuid": "f55835e4-f32a-4235-897d-276727ce7233",

"mac": "be:64:5b:44:66:20",

"ipv4": "255.250.236.181",

"id": 30000

},

{

"uuid": "da22ad88-34fb-4d3c-9404-241039d086e3",

"mac": "29:7c:53:f7:f6:b3",

"ipv4": "174.162.24.144",

"id": 30003

},

{

"uuid": "87b7a857-66c4-484a-8d60-e731e071cc9a",

"mac": "a3:a4:4c:0e:da:f4",

"ipv4": "114.181.18.50",

"id": 30005

},

{

"uuid": "69b13648-a028-4ad8-9a3b-0fc332a15262",

"mac": "d8:df:21:de:36:24",

"ipv4": "205.72.27.216",

"id": 30002

},

{

"uuid": "6170f3e5-e5e5-4dfd-923b-916dcd1d8be3",

"mac": "e4:b0:53:13:37:d3",

"ipv4": "253.22.9.206",

"id": 30004

},

{

"uuid": "25a344a0-6c85-48cd-a153-d912d3c7614a",

"mac": "a5:ba:23:f6:25:48",

"ipv4": "210.133.43.253",

"id": 30001

}

]


レコードの更新

PATCHできるかな?

# curl -X PATCH -H "Content-Type: application/json" -d '{

> "ipv4": "192.168.0.1",

> "id": 30001

> }' "http://localhost:3000/devices"

{}

部分的にはできないか。

# curl -X PATCH -H "Content-Type: application/json" -d '{

> "uuid": "25a344a0-6c85-48cd-a153-d912d3c7614a",

> "mac": "a5:ba:23:f6:25:48",

> "ipv4": "192.168.0.1",

> "id": 30001

> }' "http://localhost:3000/devices"

{}

あら、全部もダメそう。

# curl -X GET "http://localhost:3000/devices/30001"

{

"uuid": "25a344a0-6c85-48cd-a153-d912d3c7614a",

"mac": "a5:ba:23:f6:25:48",

"ipv4": "210.133.43.253",

"id": 30001

}

書き換わってないね。

なんか間違っているかな?

消してから書けってことかな?

今回は更新はないからいいか。


レコードの削除

# curl -X DELETE -H "Content-Type: application/json" "http://localhost:3000/devices/30001"

{}

# curl -GET "http://localhost:3000/devices/30001"

{}

2017-03-16

[] JAGOVISORの金型完成。試し抜き。

発注した金型が仕上がって、試し抜き結果を回収してきた。

設計ではスリットは1.5mmだったのだけど、抜けにくいということから、2mmで再設計している。

設計図面のバージョンはMまで来ている。


試作、想定より出来がいい。

狭い部分がかなり抜きにくいということで、普通より圧を上げている。

数を抜くと細かい刃が外に向けて広がる可能性が高いそうだ。

そんときは刃の修理費がかかる。

細かい部分は当然ながら高いのでツラい。

とりあえず刃の状態見ながら抜いてもらって、ダメそうならそこで止めるということで量産手配を依頼した。

すぐに量産のお金も入れないといけないナ。


パーツはこんな感じ。

https://lh3.googleusercontent.com/7uW3H9vxQf19-XsF262IhOuTDETiWRm7vqJgJh2-xqmx7u2kuJF3ZXz4mlFH9dHCZjuOeFVfZby_0fLaoEPnbWYWChHaLFKo8w=w640-h400-no?.jpeg


型で押し切ったので、一部分が白くなっているのがわかる。

https://lh3.googleusercontent.com/A6_2cMoPTa5NKvA09XqGdsbo8XRqzsYnb-bVVOIJnycoPNCi69qMgDzf-GsdnvTvY8ZVld-5A4HqloD99jZ0QZiJZOFXHFuegg=w640-h400-no?.jpeg

レーザーカッターでやったのより、はるかになめらかできれい。

https://lh3.googleusercontent.com/8roO3_KZy8G3cVsJQxBB1qFO9ZwKpKi302RkcRAVRtH9qtFR7lHVCNDuQhWWc2uFqtbrwjtkgBOOcYmbBoa-dAuQlDC8VNMXNA=w640-h400-no?.jpeg


組み立てて、端末セットすると、こんな感じ。

https://lh3.googleusercontent.com/yUw0ug_OmSK8oYHoeg6dIPmasoCwVi6CsSAxjwqKANlED0KqU70Zwq_XspdBjVNkWn4Jaztis9uJGWzyMKKrSUnhFGgE9OrG0Q=w640-h400-no?.jpeg

https://lh3.googleusercontent.com/_LlS-cE5qRgXeL2g1gzJPdX5ZPdnd02aBPJ2aG2zaVZqQtH7gQBhmf7HaUwHHzFw7QsaChfIkhw9SDvA6wHAXFeSLve5srJpHA=w640-h400-no?.jpeg


ワンタッチ(ウソ、ツータッチ)でフラットにできるので、持ち運びも荷物にならない。

https://lh3.googleusercontent.com/Vc4O6vq8zGTDFuBxgwPso_QYxwapWg_VPM7vnU4l2jlxoBQM3TPd3yI7l9IfzHd2XpsO_ITJYwmC9iqNZ6Nj5aDoa0BrITp1Mg=w640-h400-no?.jpeg


IPD調整は、左右別々にできる。

https://lh3.googleusercontent.com/DHdhtf9nDDpttOAmvO8MHHBK4gOdw3HdQ93ApGqv76vlGwEdKQO8PaC5kenvrbcUUH7RpTYKmcfGrpA8JZUdIRpwTEGQ5f6srQ=w640-h400-no?.jpeg

https://lh3.googleusercontent.com/K8t8uvPIZvzzuTJzGm_Y5bTDcUz--lVaremcg00OdOZqOe1Gg9oLvcnSHRM3DXl8sUKzCvnvXYmAeu7Ie6cfK7mSmnnhxbVEGg=w640-h400-no?.jpeg

https://lh3.googleusercontent.com/NBke1ArIZpDU40iDTuHOzjdvD37op8HmYjUlQgj-hTBBpAfo0_h1Z4-YprZinOfjHln4Hx43MgHvZEE0V08UubdKS27cA8kJuQ=w640-h400-no?.jpeg


IPDは最大で80mm近いので、野生さんでも安心。子供でも合わせられるレベルで調整可能。

https://lh3.googleusercontent.com/iPjUcctj7vvwTycGFZECP93oAvsI_fLIYmRhilOz4MgMSk4im6oyNZj0rSpy0nTqOT3yvb9xlfjurkYQeE7dnj-09x4fn8FnLg=w640-h400-no?.jpeg

https://lh3.googleusercontent.com/h9emYsa6ELR5aepptN_093kVvV1eNOcQdkDsXURiOUhemEml2oS0v6gG6SPz2gObBfIcFQzAM8EeRkqrIvaSfA6wBIbUMWqYuQ=w640-h400-no?.jpeg


フォーカスの調整は、左右でこのスリットの位置を変更することで簡易対応。

https://lh3.googleusercontent.com/q9-l7EtL6aVTpph4yCvOSClnSrZi8CBqKbcNw8VRTy9rEoMpFirptvhOZs_vclLiMA-Huguq1k-viE5wb4RUaIgoA5TrmbUGuA=w640-h400-no?.jpeg


金型が弱りそうな問題の箇所。

https://lh3.googleusercontent.com/i413KNdk3vkoZg4r21JA4I8o6vF42VKWiemyDP6FFFgtnR_rYha5xCCzGPg15aXIGKy1KHzAPF9Eniuh3SFunhS8kyxF1kGVUw=w640-h400-no?.jpeg


さて、技術書典2に間に合うのだろうか?

2017-03-15

MacBook Pro 13のファンを交換する

普段使いのMBP Mid2012。

移動を除くとほぼ24h電源入っている。

ファンが摩耗で軸ズレしているのか、えらく大きな音を出すようになったので交換する。

バッテリに続いて、3rd partyの部品での交換。


手配したのはこれ。

MacBook Pro 13インチ A1278 A1342 CPU ファン ZB0506AUV1-6A

http://amzn.to/2n9t5MW

1,700円なら送料と時間考えると海外並みかな。

ニセモノかもだけど。

まぁ、動けばよい。

どうせなら、同じSUNONのがいいよな。

ホンモノのSUNONが来るかどうかわかんないけど。

他は結構なお値段がする。


数日で、ほんとにファンしか入ってないのが届いた。

https://lh3.googleusercontent.com/tx4HRqn099evwP1ftd-VMmzdDpuF-XI_--YTiFNC94kdmJGGdvl6QSdHazJecWyC5MmMGmwper63QdScLqO2fD6uYn6Tt_1G=w640-h400-no?.jpeg


本体の裏蓋を外すには、小さめのプラスドライバでよい。

ファンは、三ヶ所のネジで止められている。

https://lh3.googleusercontent.com/y1rX5fAq_T_aSyRDVkX5z-EtCO7G4bO6PG3OWizD_oEjwNbcuNATxuBj3Mma8NZ6dj9yffR__Um80G_KwM31BrFInfqMJgS9=w640-h400-no?.jpeg

ファンの取り外しには、T-5のトルクスドライバが必要。普段携帯しているツールキットに入っている。

https://lh3.googleusercontent.com/MNPDwIB0TLDzgN34LuNTmUwNbH56SUPMLUgwuiHaAzC1Bh7UmvpMWLNd3F7uLtZnrpFYsJOZid-FeAFns-EdwEPD1O7rMikv=w640-h400-no?.jpeg

ネジには二種類あるので注意。

https://lh3.googleusercontent.com/XqAOoh7FogiO83VUdfEcXOfRa_5Fc53YvbN5BshZ05aHMElfud6TGdroXROKBQIj2MdJgSIrQPQ-G6fFpM2eo84RkavlJ_Tf=w640-h400-no?.jpeg


ファンのネジをはずしても、ハーネスがコネクタで固定されている。

https://lh3.googleusercontent.com/MGZ3eYCO0cycRlH5phUUkGSaiH4WHqPGWQWI9VixHA7zyDIykoNvcVJLXA5q_VXVB7Qam2uGFT5i3V0WT5MO1fXjD-HNIlb3=w640-h400-no?.jpeg

ファンのコネクタ。

https://lh3.googleusercontent.com/xYIrJ2dU71IUq-lMQ9DuEU7YEN_JHlk8OXIBhWZMdOXNougCs0R1oe89JaAK0jqNqXY3Ue4ovaCC1a_2VALw9qzxltqqlGZY=w640-h400-no?.jpeg

コネクタの裏側。

https://lh3.googleusercontent.com/o3Z7RRVYP_ZO2Eah4tqk_97wQp7pafx9TCV0TEK53xAjADtQZddPZrTXQPBe_IWwedIoYlcYTXSVYBjaJYqbGwzmuFbuaPxx=w640-h400-no?.jpeg

ファンを外したあと。

https://lh3.googleusercontent.com/IjMS9j62hAeaboCzxeZSn4Q2cmkgLRK-aPWeqqGoDBDuuBf8Yd4pEX4SoWIZodMgyMW1tMBLwpQfFVdQAUdBz8huuTCEYFo_=w640-h400-no?.jpeg


外したファン(左)と、買ったファン(右)。

表面処理も違うような感じ。買ったファンには細かいキズもある。管理用と思われるバーコードシールもない。

https://lh3.googleusercontent.com/-pmieo87xLKA/WMkjXn7XykI/AAAAAAAAL9E/-JJrCgE8nrI5cYN3VCkVL6kmxnCKuGiFQCJoC/image.jpg

https://lh3.googleusercontent.com/-5mxROHkSyXA/WMkjXm_DlQI/AAAAAAAAL9E/3btoD6ZqB5Y8Mp1FEExTOJnuHVZomLA5gCJoC/image.jpg

ハーネスが違う。オリジナルはストレートで、買ったものは編み込みになっている。

http://lh3.googleusercontent.com/-u6_W9COcLvo/WMkjXl_Bs0I/AAAAAAAAL9E/7VLgUys0qbIEG2rcOFh-mdv-SXxGvwU4QCJoC/image.jpg



交換後は、順調に回ってます。

https://lh3.googleusercontent.com/31LT0zTCX57hZzA1Zj01iX_LQNKiQTB1BMwSTtK8nAhlxgr1wR5Vk0YofLLnk4z6GkHLZ4ODSIrfsT2dWELhaBT8ChKWVP65=w640-h400-no?.jpeg

2017-02-10

Android端末をバックアップ・リストアする(2)

http://d.hatena.ne.jp/kinneko/20170209/p1

続き。


N5: 端末データのフルバックアップ

N5のほうのデータとアプリをまるごとバックアップしておく。

システムアプリを含んだバックアップと、含まないバックアップがあるので、容量差を見てみた。

$ adb backup -apk -shared -all

$ ls -lh backup.ab

-rw-r----- 1 kinneko staff 1.2G 2 9 11:36 backup.ab

$ mv backup.ab backup.ab.in_system

$ adb backup -nosystem -apk -shared -all

Now unlock your device and confirm the backup operation...

$ ls -lh backup.ab

-rw-r----- 1 kinneko staff 907M 2 9 11:43 backup.ab

$ mv backup.ab backup.ab.ex_system

$ ls -lh backup.ab.*

-rw-r----- 1 kinneko staff 907M 2 9 11:43 backup.ab.ex_system

-rw-r----- 1 kinneko staff 1.2G 2 9 11:36 backup.ab.in_system


N5: 写真とダウンロードデータのバックアップ

FileTranspherを使ってバックアップしておく。


N5->N5X: 端末データの移行

N5Xで"使ってみる"ボタンを押す。

SIMカードの挿入画面が出てきたけど、今はないので"スキップ"。

N5Xへようこそ画面になる。データのコピーを選ぶ。

ネットワーク接続をはじめるので、"セットアップ時にネットワークを使用しない"を選ぶ。ダイアログが出るが"続行"する。

ここで、アカウント設定の同期したものを使うか、BTとWiFIを使って端末間のデータ移行はできるのだけど、アプリの設定は引き継がれないのでパス。パスワードを忘れてしまったサービスなど調べるのもめんどくさいので一括移行がいい。

日付と時刻を設定する。

名前はそのまま"次へ"を押す。

指紋によるロック解除も使わないので"スキップ"する。警告が出るので再度"スキップ"。

Googleサービスが出るので、これは各自判断でオンオフを選んで先へ。

その他の設定項目で、メールアカウントなどの設定が出るが、これも飛ばして"設定を完了"を押す。

最終調整を行っていますと出て、ホーム画面になる。"ようこそ"と表示されている。

設定を開き、端末情報のビルド番号を数回タップして、開発者モードをオンにする。

1つ戻って、開発者オプションからUSBデバッグをオンにする。PC側に接続していると、そのまま許可ダイアログが出るので許可する。

adb devicesコマンドで端末が表示されるのを確認する。

$ adb restore backup.ab.ex_system

Now unlock your device and confirm the restore operation.

端末側で、完全な復元画面になって、パスワードを求められるけど、パスワードは設定していないので、そのまま"データを復元する"ボタンを押す。

しばらく待つ。

端末側に"復元が終了しました"というトーストが出て終わり。

しかし、アプリは何も出てきていない。デフォルトの33アプリのみ。

再起動する。

引き継げてない... orz


もともとN5Xに入っててバックアップしたアプリをリストアしてみる

$ adb restore com.kinneko.jago360.ab

Now unlock your device and confirm the restore operation.

リストアされてない...

特にエラーも出てないのだよね。


しょうがないのでアカウント移行手順に従う

念のため、N5のほうでバックアップとリセットで、データのバックアップをオンにしておく。

N5でWiFiとBluetoothをオンにする。

N5Xは再度初期化。WiFi設定を行うと、アップデートを確認中のあと、データの引き継ぎ画面になる。

"Androidスマートフォンからのバックアップ"を選ぶ。

設定から付近の端末を選べと表示が出るが、N5のほうにはそういう設定はない。

N5のポップアップで"新しいAndroid端末のセッ..."というのが出ているので選ぶ。

スタートガイドの画面が出る。次へを押す。

端末のリストが出る。N5Xの表示と同じものを選ぶ。端末に接続していますの後、コードの確認で6桁のアルファベットが出る。

N5X側で同じコードが表示されていたら、N5側で次へを押す。

他の端末へコピー画面が出る。コピーボタンを押す。なんか一瞬でコピー出た。不安。たぶん、アカウントしか投げてなくて、あとはクラウドバックアップでやる気のようだ。

N5X側ではパスワード入力画面が出ている。Googleアカウントのパスワードを入れる。

パスワードが違うと出る...

長期で変更されていないパスワードは、変更しないと認証されないようだ。警告もなにも出ないとは...

別端末からパスワードを変更して、認証は通った。

アプリのダウンロードがされている。

ホーム画面の構成は維持されているようだ。


移行できなかったもの

chromeのブックマークのバックアップないな。

この手順では、有料アプリはリストアされないようなのだけど、これは使ってないので問題ない。

adb経由で直接入れたアプリは移行されない。めんどくさいことだ。

GooglePlay開発者サービスは、同意なしには更新されなかった。

twitterアプリもアプリ認証が必要だった。

Slackアプリも認証が必要だった。

ホームアイコンの電卓アプリが引き継がれなかった。

音量の定位置は引き継がれなかった。

Ingressのアカウントは、GooglePlay Engineからのアカウント引き継ぎを受けたようだけど、COMMの距離が200kになってた。

ポケモンGOは、生年月日からはじまったので、めんどくさいからそのままアプリ削除した。

Slackもログインからになっている。

モナコインアプリ消えた。当たり前か。コインの情報も引き継げない。

ハングアウトの履歴も引き継げていない。

血圧記録アプリのデータも引き継げていない。

Bluetooth系アプリの接続情報も引き継げていない。

テザリングの設定も引き継いてない。


端末移行は、なんでこんなに面倒な仕様なんだろう。

Googleもっとちゃんと考えてほしい。

アプリデータとかクラウドへのバックアップ使っても、ほとんど同期できないで新規設定だし、引き継げないデータ多すぎだし。

ローカルで入れたアプリは移行できずに再インストールになるし。

ひどい。

Google的には、設定はfirebaseに入れておけや!ってことかもだけど。

2017-02-09

Android端末をバックアップ・リストアする(1)

N5落として液晶割ったので、N5Xに引っ越しする。

予備のN5Xは、娘にあげてしまったので、VRデモ端末なくなるのがつらい。

1.5kくらいで、N5の中古が買える相場らしいけど、Daydream時代にそれもね。

Daydream対応アップデートを行ったばかりの、ZTE Axon7も5万円強で買えるみたいだけど、850をイマサラという気もする。

とりあえずの移行先はN5Xとして、現在使っている状態をバックアップしておく。


N5X: 写真やダウンロードしたデータを保存する

アプリと設定は、adb backupでバックアップできるのだけど、これには写真データとかダウンロードデータは含まれない。

まず、これらをバックアップする。

USB接続して、端末をファイル転送モードに。Android File Transferアプリから、Macにデータを退避する。

デモ機なので、あんまりデータは入っていない。


N5X: ローカルアプリをバックアップする

さて、移行先のN5Xはデモで使っているので、こちらにもアプリが入っている。

容量のデカいものもあるので、共存はできない感じか。

しかし、自前ビルドで、ビルド環境失われたデモアプリとかも入っているので、これらはバックアップしておきたい。

$ adb shell pm list package | sort

package:android

package:android.autoinstalls.config.google.nexus

package:com.DemoScenes

package:com.HeadsetDemo

package:com.android.backupconfirm

package:com.android.bluetooth

package:com.android.bluetoothmidiservice

package:com.android.bookmarkprovider

package:com.android.calllogbackup

package:com.android.captiveportallogin

package:com.android.carrierconfig

package:com.android.cellbroadcastreceiver

package:com.android.certinstaller

package:com.android.chrome

package:com.android.connectivity.metrics

package:com.android.cts.ctsshim

package:com.android.cts.priv.ctsshim

package:com.android.defcontainer

package:com.android.documentsui

package:com.android.dreams.basic

package:com.android.egg

package:com.android.emergency

package:com.android.externalstorage

package:com.android.facelock

package:com.android.hotwordenrollment

package:com.android.htmlviewer

package:com.android.inputdevices

package:com.android.keychain

package:com.android.location.fused

package:com.android.managedprovisioning

package:com.android.mms.service

package:com.android.mtp

package:com.android.musicfx

package:com.android.nfc

package:com.android.omadm.service

package:com.android.pacprocessor

package:com.android.phone

package:com.android.printspooler

package:com.android.providers.blockednumber

package:com.android.providers.calendar

package:com.android.providers.contacts

package:com.android.providers.downloads

package:com.android.providers.downloads.ui

package:com.android.providers.media

package:com.android.providers.partnerbookmarks

package:com.android.providers.settings

package:com.android.providers.telephony

package:com.android.providers.userdictionary

package:com.android.proxyhandler

package:com.android.retaildemo

package:com.android.sdm.plugins.connmo

package:com.android.sdm.plugins.dcmo

package:com.android.sdm.plugins.diagmon

package:com.android.sdm.plugins.sprintdm

package:com.android.server.telecom

package:com.android.settings

package:com.android.sharedstoragebackup

package:com.android.shell

package:com.android.statementservice

package:com.android.stk

package:com.android.systemui

package:com.android.vending

package:com.android.vpndialogs

package:com.android.wallpaper.livepicker

package:com.android.wallpaperbackup

package:com.android.wallpapercropper

package:com.divegames.divecitycoaster

package:com.divegames.divedeep

package:com.divegames.launcher

package:com.futuremark.dmandroid.application

package:com.google.PlayGround

package:com.google.android.GoogleCamera

package:com.google.android.apps.books

package:com.google.android.apps.cloudprint

package:com.google.android.apps.docs

package:com.google.android.apps.docs.editors.docs

package:com.google.android.apps.docs.editors.sheets

package:com.google.android.apps.docs.editors.slides

package:com.google.android.apps.enterprise.dmagent

package:com.google.android.apps.gcs

package:com.google.android.apps.genie.geniewidget

package:com.google.android.apps.helprtc

package:com.google.android.apps.inputmethod.hindi

package:com.google.android.apps.maps

package:com.google.android.apps.messaging

package:com.google.android.apps.photos

package:com.google.android.apps.plus

package:com.google.android.apps.tycho

package:com.google.android.apps.walletnfcrel

package:com.google.android.backuptransport

package:com.google.android.calculator

package:com.google.android.calendar

package:com.google.android.carrierentitlement

package:com.google.android.configupdater

package:com.google.android.contacts

package:com.google.android.deskclock

package:com.google.android.dialer

package:com.google.android.ext.services

package:com.google.android.ext.shared

package:com.google.android.feedback

package:com.google.android.gm

package:com.google.android.gm.exchange

package:com.google.android.gms

package:com.google.android.gms.setup

package:com.google.android.googlequicksearchbox

package:com.google.android.gsf

package:com.google.android.gsf.login

package:com.google.android.ims

package:com.google.android.inputmethod.japanese

package:com.google.android.inputmethod.korean

package:com.google.android.inputmethod.latin

package:com.google.android.inputmethod.pinyin

package:com.google.android.keep

package:com.google.android.launcher

package:com.google.android.launcher.layouts.bullhead

package:com.google.android.marvin.talkback

package:com.google.android.music

package:com.google.android.onetimeinitializer

package:com.google.android.packageinstaller

package:com.google.android.partnersetup

package:com.google.android.play.games

package:com.google.android.printservice.recommendation

package:com.google.android.setupwizard

package:com.google.android.storagemanager

package:com.google.android.street

package:com.google.android.syncadapters.contacts

package:com.google.android.tag

package:com.google.android.talk

package:com.google.android.tts

package:com.google.android.videos

package:com.google.android.webview

package:com.google.android.youtube

package:com.google.audiospaces

package:com.google.castledefense

package:com.google.cdl

package:com.google.samples.apps.cardboarddemo

package:com.google.vr.cyclops

package:com.google.vr.inputcompanion

package:com.google.vr.ndk.samples.controllerpaint

package:com.google.vr.ndk.samples.treasurehunt

package:com.kinneko.jago360

package:com.kinneko.jago360dive

package:com.lge.HiddenMenu

package:com.lge.entitlement

package:com.lge.lifetimer

package:com.mypaceengine.mmdtest

package:com.qti.qualcomm.datastatusnotification

package:com.qualcomm.atfwd

package:com.qualcomm.qcrilmsgtunnel

package:com.qualcomm.qti.rcsbootstraputil

package:com.qualcomm.qti.rcsimsbootstraputil

package:com.qualcomm.timeservice

package:com.quicinc.cne.CNEService

package:com.unity3d.vrstandardassetscb

package:com.verizon.omadm

package:jp.bluetone.hardwarechecker

package:org.codeaurora.ims

なんか、157アプリも入っているんだね。

多すぎてよくわかんないな。

logcatで表示しながらアプリ起動するか、intentでコマンドでアプリ起動するとわかるか。

logcat死ぬほど出るので、オススメできない。

02-09 14:48:00.430 879 3671 I ActivityManager: Start proc 13125:com.google.PlayGround/u0a103 for activity com.google.PlayGround/com.google.unity.GoogleUnityActivity

設定->アプリからは65アプリがインストールされているのがわかる。

pm list packageで出てくる大半は、システムアプリ。表示しなくていいのに。

バックアップが必要なのは、このくらいしかなかった。前にvuforia試した時のアプリはいなくなっていた。

  • package:com.google.PlayGround
  • package:com.kinneko.jago360
  • package:com.kinneko.jago360dive

PlayGroundは、ソースを改変してDaydream機でなくてもリモコン動くようにしたやつ。

あとの2つは自前アプリ。

$ adb backup -f com.google.PlayGround -apk com.google.PlayGround

Now unlock your device and confirm the backup operation...

端末側に表示が出た。

端末が暗号化されているので、バックアップも暗号化がいるそうな。パスワードを入れろという。

端末を暗号化した記憶はないんだけどな。どうも、デフォルトで暗号化されているようだ。

$ ls -l com.google.PlayGround

-rw-r----- 1 kinneko staff 0 2 9 15:01 com.google.PlayGround

どゆこと?

パスワードの間違いとかも表示されない。

adb backupでは一括しかできないの?

オプション間違いか。

$ adb backup -apk com.google.PlayGround -shared -f com.google.PlayGround.ab

Now unlock your device and confirm the backup operation...

端末側でパスワードを入れ、「データをバックアップ」を押してしばらく待つとバックアップできたようだ。

$ ls -lh com.google.PlayGround.ab

-rw-r----- 1 kinneko staff 142M 2 9 15:09 com.google.PlayGround.ab

アプリ毎にこれを繰り返すのは超めんどくさい。


N5X: 端末のリセット

Felica対応端末ではないので、おサイフケータイは使っていないから、これは問題なし。

指紋認証も設定していないので、これも問題なし。

設定->セキュリティ->スマートフォンの暗号化に設定があるのだけど、暗号化されていて解除できないようだ。

設定->バックアップとリセット->自動復元をオフに。

設定->バックアップとリセット->データーのバックアップをオフに。

設定->バックアップとリセット->データの初期化を実行する。"モバイル端末をリセット"を押し、再確認の"すべて消去"も押す。

消去後、自動的に再起動してくる。

Welcome画面が出れば成功。