なにも わからぬ

パソコンとプログラミング関係をメモっていきたい

Oculus Goにadb経由でapkをインストールするまでメモ

f:id:htkb:20180510205333j:plain

要約

  • Oculus Goには開発者モードでPCからapkをadbで流し込むことが可能だが、そこまでに開発者登録→開発者モードON→adb接続→インストールという手順を踏む必要があってめんどい。
  • スマホVRでOculus RiftやHTC VIVEをエミュレートするVRidgeというアプリの開発元がOculus Go用の野良apkを配布しており、これを入れるのにこの作業が必要(待ってればそのうち正式にGearVRアプリとして登録されると思うが)
  • 野良apkは何でも入れられるっぽいが、スマホVR用のアプリであっても現状では起動はしてもほぼ進行不可(タップができない)なので野良GearVRアプリしかまともに使えず、実質VRidgeのapk入れる専用の作業

大雑把な手順

開発者モードをオン → adbでPCとつなぐ → adb install

開発者モードをオンにするまで

開発者モードをオンにするには公式からデベロッパーの登録をする必要があるが、Oculusアプリでいきなり開発者モードをオンにしようとすると登録ページに飛ばしてくれるのでアプリ経由で行くと間違いがなくて楽だと思う。

f:id:htkb:20180510195842j:plain Oculusアプリの設定→その他の設定→開発者モード→オン にしようとすると

f:id:htkb:20180510200211j:plain

と言われるので作成開始を押すとブラウザが開く。

f:id:htkb:20180510200226j:plain

リンクをクリックして開発者のチーム名を適当に入力し登録すると、Oculusアプリのさっきの開発者モードがオンにできるようになる。

adbでPCとつなぐまで

Windowsだとadbを導入してOculus Go ADB Drivers | Developer Center | Oculusを入れる必要がある。手っ取り早いadb導入はminimal adb and fastbootや15 seconds ADB Installerなどを入れることだが公式のものではないので安全性は保証しません。公式のAndroid SDKを入れるのが本筋だが少しめんどくさい。いずれにしても解説サイトは腐るほどあるのでググってね。

Ubuntuだと(Lubuntu 18.04で確認)sudo apt install android-tools-adb入れて繋いでadb devicesするだけでoculus goを認識してるはず。ただし何かしようとするとno permissionsとか怒られるので、USBケーブルをつなぐ前に(先に繋いじゃった場合は抜いてadb kill-serverしてから)sudo adb start-serverして繋ぐとOK。

参考:Ubuntu: adbでno permissionsでデバイスに接続できない | Scenery and Fish

どっちの場合もadb devicesでなんか認識してればOK、Oculus Goの画面にadb接続していいかー?とダイアログが出てるのでOKする。

apkをインストール

adb install (apkのファイルパス)

VRidgeのapkはここ Oculus Go and VRidge – RiftCat - Help Center

インストール成功したらOculus Goのライブラリ→提供元不明の中に(後ろの方に)あるのでクリックして起動する

疲れたのでVRidgeで遊ぶのはまたあとで……

スマホVR用のアプリをインストールすると

スマホVR用のアプリであるなごみの耳かきVRを入れてみる。

まずスマホにインストールしてApk Extractor等でapkを抽出しPCに移す。

adb install なごみみ_com.dlsite.nagomimi.apk

等としてインストールすると成功はするのだが、提供元不明の中に見当たらない。んでさらにPCから

adb shell am start -n com.dlsite.nagomimi/com.google.unity.GoogleUnityActivity
参考:package名のみからadb shell am start -nする - Qiita

とやると一応起動するのだが

f:id:htkb:20180510194024j:plain

タイトル画面らしきものが非VR画像をVRゴーグルで見たときのようなでたらめな感じで表示され、ちらっと見えているスタートボタンらしきものをタップする手段がないので詰む。モーションコントローラーのどのボタンも(スライドする部分のクリックも)タップとは対応していない模様。bluetoothマウスかなんか繋げられればいけるはずだが……。なので今の所、非GearVR用アプリを起動できても、進行に通常のタップが必要な画面があればそこで完全に詰むと思う。adbで起動中のアプリに干渉する方法とかあったりするかもしれないが詳しくないのでわからない。

systemdで起動時にpowertop --auto-tuneする

systemd全然わからないので理屈とか全然わからんがとりあえず動いたよ、というメモ。以下Lubuntu 18.04で正常動作を確認。環境に応じて適宜パスなどを変更してね。

sudo vim /etc/systemd/system/powertop.service

中身は↓

[Unit]
Description=Powertop tunings

[Service]
ExecStart=/usr/sbin/powertop --auto-tune
RemainAfterExit=true

[Install]
WantedBy=multi-user.target

ファイルを追加しただけで再起動などしなくても認識されsudo systemctl list-unit-filesで見える状態になっているが、まだdisableになっているので、sudo systemctl start powertopをしてエラーが出ないことを確認しsudo systemctl enable powertopとすると自動起動するようになる。再起動してみてpowertopで全部Goodになっていることが確認できればOK。

Latitude 7370でpowertop --auto-tuneするとバッテリー持ち倍ぐらい違う。

参考にした

Powertop - ArchWiki

Systemd メモ書き - Qiita

ebayでLatitude 7370を買ったときのあれこれ

f:id:htkb:20180428153234j:plain

開発できるモバイルノートが必要になり物色していたところ、ebayでcore m7/8G/256G/フルHDのLatitude 7370が$449だった(全部込みで結局55000くらいになったけど)ので即買いしたときのメモ。

Seller refurbished??

商品のConditionがSeller refurbishedになっていて、メーカーのリファービッシュ品ならよくあるし一定の信頼がおけるけど、Sellerがリファービッシュしたってどういうことやねん大丈夫なの?と少し調べてみたところ、ebayにおけるSeller refurbishedというコンディションを名乗るための条件や定義などは特に無いらしく、極端な話外装をアルコールティッシュで拭きましたーってだけでもrefurbishedを名乗れる。なので、(自称)状態が良いUsed品程度の意味合いのようだ。あっちのフォーラム等でも英語で「UsedとSeller refurbishedって何がちゃうねん」的なやり取りがいくつか見られる。

なもんで状態とかが気がかりだったんだけど、届いたものは外装はおおむね綺麗(ただしモニタ・天板のウェットティッシュかなんかで拭いたあとの拭き跡のようなものがひどかった)、中身のパーツ類も見る限り純正の組み合わせのままのようで、

f:id:htkb:20180428153252j:plain

SSDの使用時間はかなり短く(ただ12時間使用でなんで電源148回も切ってんだ……?)バッテリーのwear levelも4%であった。refurbishedというか単純に使用頻度がかなり少なかったブツのような気がする。あるいはSSDとか交換済みなのかもしれないが。

ということでうちに来たのはかなり当たりの子でしたが、ebayを見て回ると明らかに傷ボロなのにSeller refurbishedを名乗ってるのが割とあるんで、Usedと同じ扱いで商品画像をよーっくチェックして出品者の説明もよく読んでから買う必要があるみたい。

Latitude 7370のキーボード

Latitude 7370はskylake世代のXPS13(9350)の兄弟機のような立ち位置だが、筐体も内部も流用ではなく結構違い、キーボードの打ち味もかなり異なると多くのレビューで言われていた。総じて「Latitudeのほうがキーが深くしっかりタイプできて圧倒的に良い」的な評価だったので、その評価にちょっと不安を感じつつ期待していたんだけど、やっぱり不安の通りだった。

f:id:htkb:20180428160636j:plain

深いのはいいんだけどちょっと重いんです。深さで言えば普段メインで使っているHappy Hacking Keyboard Type-Sのほうが圧倒的に深いんだけど、それと比べてもLatitude 7370のキーボードはちょっと重い。しっかりタイプできるというよりはメンブレンパンタグラフだけど)のゴムを潰す重さみたいな嫌な重みを感じるというか、少なくとも軽快にタイピングできるようにはあまり感じない。もっともHHKB Type-Sとメカニカル赤軸に慣れた今、普通のHHKB Pro2でさえ重くて指がだるいなーと感じるほど軽いキーボードに慣れてるんでその影響もあるかもしれないけれど。まあ実用に耐えないというほどではないしそのうち慣れるだろう(と思いたい)。

個人的にノートのキーボードは浅くても全然良いと思うんだけどなー。例えばChromebook C302CAはかなり浅いキーボードだけどクリック感は必要十分で打ち味も軽く、非常に打ちやすい良いキーボードだと感じた。レビューなどを見て回ってもキーボードの評価は上々のようだし。キーボードの良し悪しを語るならキーストロークの深さより圧倒的に押下圧のが重要だと思うんだけど、まあ好みもあると思うのであくまで個人的な感想です。

Lubuntu 18.04問題なし

f:id:htkb:20180429155745j:plain

ちょうどいいタイミングだったのでせっかくのWin10 Proを投げ捨ててLubuntu 18.04を入れた。skylake世代のcore m7で全然新しくないので何もしなくてもデバイス一通り認識してるし何の問題もない。NVMe SSD初体験のせいなのかわからないけどVScodepython書くくらいならi5-7500のデスクトップより快適な気がする(多分気のせい)。

Firefoxのタブバーとか消すPythonスクリプト(TreeStyleTab用)

Firefoxが新しくなってからTreeStyleTabのサイドバーと元々のタブバーが両方出てうざい的なアレ、いじるの面倒で放っといたんだけどちょびっとウィンドウマネージャ弄りをしたついでに重い腰を上げてググったらやり方が3秒で見つかったんだけど

qiita.com

クリーンインストール後に一々プロファイルフォルダ手動で掘るのだるいので(もうそろそろubuntu18.04の季節ですし)、自分用に自動化スクリプト書いたついでにせっかくだからちょっとクロスプラットフォームやべき等性を考慮してみた。Ansibleでやれ。WindowsUbuntuのみで確認。

プロファイル/chrome/userChrome.css(無ければ作成)にMARKER + CSS_STRの行を、もしすでにMARKERで始まる行があればそこに上書き、なければ末尾に追加する。defaultプロファイルがまだ作られてないと動作しないのでFirefoxの初回起動を済ます必要あり。ファイルを直接いじるので使用は自己責任で。

f:id:htkb:20180316223302p:plain

i3-wmでタイトルバー消してるのでさらにサッパリした

NASってどうやねん(と言いつつ注文した)

うちにはPCやサーバが複数ある以上ファイル共有の有用性はもちろんわかっているけど、その時その時で適当に鯖機でSamba立てたりWindowsから共有したりとゆるくやっていてNASを買ったことはなかった。そして自分は気まぐれなので鯖をOS変えてみたりサブのクライアント機として引っ張り出したりいじくり回して環境を壊し再インストールということがよくあり、そういやSambaサービス立ってねーわ的なこともよくあり、何かしら専用のファイルサーバが必要だなと思い色々調べつつ考えてみた。


ファイルサーバ自体はFreeNASでも入れたマシンを用意すればよく(つーか共有できればいいだけならsamba立てただけの好きなlinuxでいい)、他の専用NAS同様WebブラウザからGUIで色々できるようだ。一方で値段あたりのスペックに劣るNAS専用機を買うのは、安定したハード構成と専用OSによる安定性・信頼性を期待してのことなのかと思ったが……Amazon価格.comなどの口コミを見てみると、なんか全然安定してなさそうに見えるんだけどどうなんですかね……。

ざっと見たところ、売れ筋のQNAP・Synology2万前後のはそれなりに安定してそうだけどメモリが512M/1GとかCPUがarm系で仮想化とかできないっぽい、純粋なNASって感じ(evernoteのパチもんメモアプリみたいなwebアプリっぽい機能は色々付いてるけど)。

一方で4万前後のintel CPU搭載機はdocker使えたり色々できますって触れ込みだけど、この色々な機能についての悪い口コミが目立つ。安定してない、バージョンアップでおかしくなった、SMBのバージョンが古く不具合があるが対応してくれない、などなど。NASなんだからそれ以上を求めるなよって話もあるかもしれないが、4万って言ったら完全にPC1台組めるのでその価格帯のNASが専門外の機能とはいえ公式に対応を謳ってる機能がまともに動かないのはきつい。サーバ関係をNASに集約したいって目的で2万余計に出すのだろうしね。linuxベースとはいえ独自カスタムのOSなんだろうから自分でいじくり回して対処することもできなさそう。

ちなみにmini-stxベアボーンのdeskmini 110は

  • 安くて小さい
  • 2.5インチに限られるけど一応HDD2台積める(起動ストレージはUSBメモリでいいけど一応M.2 PCIe SSDも挿せる)
  • NICがFreeNASで強く推奨されてるIntel NIC(I219-V)

とFreeNAS用に非常に都合がいいと思う。FreeNASはメモリも8G以上を強く推奨してるので(zfsの都合?)メモリの高い現在はちょっとつらいけど、それでも本体は3万行かないくらいで組める。

デスクトップ用CPUの消費電力が気になるというなら、少し高くなるけど出たてホヤホヤのGemini Lakeオンボードのマザーをmini-itxケースに突っ込むと性能・省エネ性のバランスが◎。

でも調べた限りGemini Lake系は全部蟹NICなんだよな。あとケースの見た目や小ささに拘ると沼にハマりそう。


みたいなことを休日を潰してウダウダ考えつつ、結局

 \  \   バ バ ー ン   /  / f:id:htkb:20180311133709p:plain

いやもう堂々巡りで埒が明かなかったので。一台組んだらどうせまたFreeNAS上で色々やろうとして再インスコ繰り返すだろうし……NASはファイル共有してくれればいいよ(身も蓋もない結論)。以上、脳内会議場からの中継でした。

NETGEAR Nighthawk X4 EX7300を買った

AmazonがfireTV stickとの抱き合わせで4割引きやってたので、wifi環境については別にどうでもよかったんだけどまんまと乗せられて買ってしまった。アンテナ2本なのに1733Mbpsとはなんぞやと思ったら、802.11ac wave2だとチャンネル幅が160MHzになって1ストリームあたり866Mbps出るらしい。まあうちにwave2対応端末無いんですけど。

RT-AC1200HPとのリプレースなので片付ける前に2つ並べてiperf3でスループットを比べてみた。

ネットワーク環境

[クライアント]~~~~~[無線ルータ(APモード)]=====[ハブ]=====[サーバ]
  • クライアント:lubuntu 17.10, Intel 7265NGW(802.11ac 2x2)/Intel I219-V(GbE
  • サーバ:CentOS 7.4, Killer E2200(GbE)
  • ハブ:NETGEAR GS305-100JPS
  • RT-AC1200HPは1ポートだけGbEなのでそのポートでハブと接続

電波状況

f:id:htkb:20180221194536p:plain
一番上がRT-AC1200HPでその下がEX7300
パソコンのアンテナがモニタ裏に来てるので微妙によろしくない

結果

RT-AC1200HP

[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-30.00  sec   634 MBytes   177 Mbits/sec    2             sender
[  5]   0.00-30.05  sec   631 MBytes   176 Mbits/sec                  receiver

EX7300

[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-30.00  sec  1.70 GBytes   488 Mbits/sec    0             sender
[  5]   0.00-30.04  sec  1.70 GBytes   486 Mbits/sec                  receiver

有線

[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-30.00  sec  3.27 GBytes   937 Mbits/sec    0             sender
[  5]   0.00-30.05  sec  3.27 GBytes   935 Mbits/sec                  receiver

有線強すぎ問題

感想

  • 同じ2x2のはずなのにえらい速度違うな(EX7300が速いっていうよりAC1200HPが遅い)
  • CentOS最新でもKiller NICのドライバ自動で入ってくれなくて哀しみを背負った(http://elrepo.org/linux/elrepo/el7/x86_64/RPMS/のkmod-alx-*を入れた)
  • nmcliを使うたびにググるのアレなんで今後X上でもnmcliでネットワーク設定すると誓った(16年連続256回目の宣誓)

Pythonで内包表記芸/内包表記でフィボナッチ第999999項

Pythonといえば内包表記芸、何でもかんでも内包表記で書けば宝くじに当たるわ身長は10km伸びるわ彼女ができて札束風呂でウハウハです(※個人の感想です)。が、今までlist.__setitem__等のメソッドを知らず内包表記をしゃぶりつくせていなかったことが判明したため、自分の理解のためにまとめてみる。

内包表記芸で使うテクニック

内包表記内ローカル変数

[i+a[i] for a in [[0,2,4,6,8]] for i in range(5)] # [0, 3, 6, 9, 12]

for文でiterableを回すと、そのfor文のブロック内で変数として使えるってだけの話なんだけど、内包表記芸ではこれを多用する。

内包表記内変数への書き込み

これがキモ。内包表記内ではn = 1のような代入式を書くことができない(と思う)が、a.append(1)は書くことができる(そして戻り値のNoneが値として評価される)。さらにa.__setitem__(0, 1)a[0] = 1と等価)やa.__delitem__(0)del(a[0])と等価)なども使えるため、リストならばほぼ自由にアクセスできると言っていい。数値や文字列の変数もoperatorモジュールのiadd()などで操作できそうに思えるが、数値や文字列はイミュータブルのため、これらのメソッドによる再代入はできない。

詳しくは 10.3. operator — 関数形式の標準演算子 — Python 3.6.1 ドキュメント

後置ifの悪用

内包表記内では後置ifっぽいのが書け、条件が真でないと以降のコードは読まれないし、リストへの要素追加も行われない。

[i for i in range(10) if i%2==0] # [0, 2, 4, 6, 8]

そしてif文に与えられた条件式は値が確定しない限り評価されるため、条件式として上記のa.__setitem__()などを書くと、要素追加は行わずに変数操作のみを行うということができる。

[a[0] for a in [[0]] for i in range(1, 11) if a.__setitem__(0, a[0]+i) or i==10] # [55]

このコードは本体リストへの要素追加の前にa.__setitem__(0, a[0]+i) or i==10を評価する。a.__setitem__(0, a[0]+i)の戻り値は常にNoneのため条件式に影響は及ぼさないが、リストaへのアクセスは毎回行われる。そして条件式が真となり本体のリストへの要素追加が起こるのはi==10のときのみ。このテクニックを使わないと、内包表記内変数へのアクセスのたびに本体の要素数が増えてしまうため重要。

内包表記でフィボナッチ数

フィボナッチ数列は漸化式で定義され、n番目のフィボナッチ数を覚えておいてn+1番目とn+2番目を求めるために使う必要があり、内包表記内では自分自身へのアクセスができないため内包表記では求められなさそうに見える。そこで内包表記内の変数としてリストを持っておき、そっちへappendすることで自分自身へのアクセスの代わりとする。

# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
[i if i<2 else (a.append(sum(a[-2:])), a[-1])[1] for a in [[0,1]] for i in range(10)]

上のコードでは0項目・1項目だけ場合分けして、あとはリストaに計算したフィボナッチ数をappendしていき、その最後の要素a[-1]を追加していくリスト内包表記となっている。a.append(sum(a[-2:]))の戻り値はNoneなので、(None, a[-1])[1]としてa[-1]のみをリストに追加している。

このコードの動作を考えるとわかる通り、内部で二重にリストを保持して無駄だし遅いしメモリも食うので、常にaの要素数が次のフィボナッチ数を計算するために必要な2個だけになるようにしてみる。

# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
[i if i<2 else (a.append(sum(a[-2:])), a.__delitem__(0), a[-1])[2] for a in [[0,1]] for i in range(10)]

要素を追加した後にindex=0の要素を消している。このコードのaが確かに要素数2個になっているかは、a[-1]の部分をa[:]にしてみるとわかる。

[0, 1, [1, 1], [1, 2], [2, 3], [3, 5], [5, 8], [8, 13], [13, 21], [21, 34]]

これでフィボナッチ数列をまるまる求めるコードはできたけど、結局数列を全てリストで保持しているため数が多くなるとメモリをバカ食いして死ぬことになる。

f:id:htkb:20170619222930j:plain

そこで999999番目のフィボナッチ数だけを求めてみる。ここで前述の後置ifの悪用が役立つ。

追記:999999項目と言いながら1000001項目を求めるコードだったので修正しました。ご指摘感謝します。修正ここから

if a.append(i if i<2 else (sum(a[-2:]), a.__delitem__(0))[0]) or i==999999

これはaへのappend(及びi<2ならば__delitem__も)は毎回行われるが、i==999999にならないと本体のリストへの追加を行わない。aの要素数はループが何回回っても2個に保たれるため、メモリ消費量が少ないまま内包表記でFib999999を求められる。

 [a[-1] for a in [[]] for i in range(1000000) if a.append(i if i<2 else (sum(a[-2:]), a.__delitem__(0))[0]) or i==999999]

f:id:htkb:20170622213102j:plain

修正ここまで

合ってるのか合ってないのかは知らないけど、メモリ消費量も特に増えることなく数秒後に数字がどばっと表示された。めでたしめでたし。

内包表記内で多次元リストを持ち、list.__setitem__()で値を書き込んだりすれば、内包表記内でDP(動的計画法)のテーブルを回すこともできる。

Submission #1365750 - Typical DP Contest | AtCoder

いやー夢が広がりまくりだと思いませんか!!Zen of Python?知らん!!