OSXにnode.jsをインストールする
リモートでは、普通にLinux上でnode.jsを使って大規模サービスを運用している。
そっちは、バージョン固定の場合は自前パッケージにビルドしてたり、そうでない場合はディストリビューションのパッケージをそのまま入れたりしている。
Angularとか、firebaseとかAWSのサービスとか、いろんなSDKで、nodeを前提にしていることが増えてきたりするとか、ローカルで開発したいとかいうことがあって、普段使いのMBPに入れることにした。
Xcode入れてソースからビルドするとか、brew入れてパッケージで入れるとか、めんどくさいかと思って敬遠してたのだけど、本家サイトにMac用のインストーラーがあったので拍子抜け。
https://nodejs.org/en/download/
落として実行する。
Node.js was installed at /usr/local/bin/node npm was installed at /usr/local/bin/npm Make sure that /usr/local/bin is in your $PATH.
と出た。
確かに/usr/local/bin/に入っている。
PATHは設定されている。
$ which node /usr/local/bin/node $ which npm /usr/local/bin/npm $ echo $PATH /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
インストールされたバージョンを確認。
$ node -v v6.10.2 $ npm -v 3.10.10
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
再度。
\{^_^}/ hi!
Loading db.json
DoneResources
http://localhost:3000/devicesType 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"
{}
JAGOVISORの金型完成。試し抜き。
発注した金型が仕上がって、試し抜き結果を回収してきた。
設計ではスリットは1.5mmだったのだけど、抜けにくいということから、2mmで再設計している。
設計図面のバージョンはMまで来ている。
試作、想定より出来がいい。
狭い部分がかなり抜きにくいということで、普通より圧を上げている。
数を抜くと細かい刃が外に向けて広がる可能性が高いそうだ。
そんときは刃の修理費がかかる。
細かい部分は当然ながら高いのでツラい。
とりあえず刃の状態見ながら抜いてもらって、ダメそうならそこで止めるということで量産手配を依頼した。
すぐに量産のお金も入れないといけないナ。
型で押し切ったので、一部分が白くなっているのがわかる。
レーザーカッターでやったのより、はるかになめらかできれい。
ワンタッチ(ウソ、ツータッチ)でフラットにできるので、持ち運びも荷物にならない。
IPDは最大で80mm近いので、野生さんでも安心。子供でも合わせられるレベルで調整可能。
フォーカスの調整は、左右でこのスリットの位置を変更することで簡易対応。
さて、技術書典2に間に合うのだろうか?
MacBook Pro 13のファンを交換する
普段使いのMBP Mid2012。
移動を除くとほぼ24h電源入っている。
ファンが摩耗で軸ズレしているのか、えらく大きな音を出すようになったので交換する。
バッテリに続いて、3rd partyの部品での交換。
手配したのはこれ。
MacBook Pro 13インチ A1278 A1342 CPU ファン ZB0506AUV1-6A
http://amzn.to/2n9t5MW
1,700円なら送料と時間考えると海外並みかな。
ニセモノかもだけど。
まぁ、動けばよい。
どうせなら、同じSUNONのがいいよな。
ホンモノのSUNONが来るかどうかわかんないけど。
他は結構なお値段がする。
- Cooling fan MacBookPro 13inch Unibody [661-4946] 4,600円
- MacBook Pro 13インチ用 冷却ファン 7,000円
- CPU冷却ファン:新品Apple Macbook Pro17インチ右用(MG45070V1-Q010-S99)メール便160円 2,243円
本体の裏蓋を外すには、小さめのプラスドライバでよい。
ファンは、三ヶ所のネジで止められている。
ファンの取り外しには、T-5のトルクスドライバが必要。普段携帯しているツールキットに入っている。
ネジには二種類あるので注意。
ファンのネジをはずしても、ハーネスがコネクタで固定されている。
ファンのコネクタ。
コネクタの裏側。
ファンを外したあと。
外したファン(左)と、買ったファン(右)。
表面処理も違うような感じ。買ったファンには細かいキズもある。管理用と思われるバーコードシールもない。
ハーネスが違う。オリジナルはストレートで、買ったものは編み込みになっている。
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に入れておけや!ってことかもだけど。
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
アプリ毎にこれを繰り返すのは超めんどくさい。