ISUCON 予選の最初の1時間でやること
ISUCON は敷居が高そうで、出ても何もできなさそうという人向け。
1チーム3人なのでこれらを分担して進めます。
準備
- レギュレーションをみんなで読む
- 誰かがサーバにログインして公開鍵とか設置
- ブラウザからアプリを触って仕様を把握
- ソースコードを Git 管理してローカルに持ってきて開発環境を作る
- デプロイ周りのスクリプトを設置
計測
- ログの出力設定
- 計測ツールのインストール
- ベンチマーク中に出力されたログを解析
対応協議
アプリの動きやレギュレーションを把握するのはかなり大事だと思うので、対応方針を決める前にもう一回全員で確認したほうがいいかも知れませんね。
ISUCON9 の参加登録締め切りは 2019年8月25日(日) 18:00:00 JST です。
Android Studio のエミュレータ (Android Emulator / AVD) からホスト名でホストPC に接続したい
TL;DR
経緯
10.0.2.2 でホストにアクセスできるが、ホスト名でアクセスしたい時がある (サブドメインで区切られたマルチテナントなシステムとか) ので、試行錯誤してみた
シミュレータ (AVD) からのアクセスをホストで起動した proxy で処理するパターン
Squid インストール
macOS 前提です。
$ brew install squid
動作確認したのは squid-3.5.27
設定ファイル編集
必要であればよく使うポートを開けておくとよい (acl Safe_ports port 1025-65535» # unregistered ports
は設定されている)
$ vi /usr/local/etc/squid.conf
# 例 acl Safe_ports port 4200 acl Safe_ports port 8000 acl Safe_ports port 8080 acl Safe_ports port 9292
起動・停止・再起動
$ brew services run squid $ brew services stop squid $ brew services restart squid
ログ確認
$ tail -f /usr/local/var/logs/access.log # squid access_log
AVD からのローカルホストアクセス
コマンドラインから adb でエミュレータ起動する際に引数で渡したり、AVD の GUI 設定からプロキシを設定しても 127.0.0.1 が AVD 自身にループバックされているようで期待した動作にならなかった。
参考: Set up Android Emulator networking | Android Developers
通常の Android の Wi-Fi 設定でプロキシを手動設定する*1。
参考: Connect to Wi-Fi networks on your Android device - Android Help
プロキシのホストは Squid が起動している開発サーバ の Local IP、Squid のデフォルトポートは 3128
動作確認
lvh.me が 127.0.0.1 を返してくれるので、それにアクセスすると開発サーバの localhost にアクセスしてくれる。
(AVD 上の) http://lvh.me:8080 => (開発サーバの) http://127.0.0.1:8080
シミュレータ (AVD) 内の hosts を書き換えるパターン
事前に emulator
や adb
コマンドにパスを通しておいたほうが楽だが、今回は省略するのでフルパスで記載。
バーチャルデバイス (シミュレータ) 起動
$ # avd 名を確認 $ /Users/${HOME}/Library/Android/sdk/emulator/emulator -list-avds Pixel_2_API_28 $ # avd を指定してエミュレータを起動 (書き換えるので、writable を指定する) $ /Users/${HOME}/Library/Android/sdk/emulator/emulator -avd Pixel_2_API_28 -writable-system
Android Debug Bridge でバーチャルデバイスを操作
$ # デバイスの確認 $ /Users/${HOME}/Library/Android/sdk/platform-tools/adb devices List of devices attached emulator-5554 device $ $ # root になる $ /Users/${HOME}/Library/Android/sdk/platform-tools/adb root $ $ # デバイスをアタッチ $ /Users/${HOME}/Library/Android/sdk/platform-tools/adb remount $ $ # アタッチの確認 $ /Users/${HOME}/Library/Android/sdk/platform-tools/adb devices List of devices attached emulator-5554 device
バーチャルデバイス上の hosts を書き換える
$ # バーチャルデバイスから hosts ファイルを取得 $ ~/library/android/sdk/platform-tools/adb -s emulator-5554 pull /system/etc/hosts ~/tmp/ /system/etc/hosts: 1 file pulled. 0.0 MB/s (56 bytes in 0.004s) $ $ # 追記 (10.0.2.2 はホストのアドレス) $ echo '10.0.2.2 lvh.me' >> ~/tmp/hosts $ $ # 追記したファイルをバーチャルデバイスに上書き配置 $ ~/library/android/sdk/platform-tools/adb -s emulator-5554 push ~/tmp/hosts /system/etc/hosts
参考
- Android Studio AVD (エミュレータ) からデスクトップのローカルホストに接続させる設定 - 長生村本郷Engineers'Blog
- [Android] Android Virtual Device の /etc/hosts を書き換えて、Vagrant Virtual Machine へ接続する | deadwood
*1:端末により設定方法は変わります
RxJS の BehaviorSubject を share しようとして上手く行かなかったやつと上手く行ったやつ
以前はまったやつの備忘録 たぶん Angular 5.0.x, RxJS 5.5.x くらい
BehaviorSubject で Shared Service を作った時に、フィールドの Observable を直接参照するのではなく、メソッドを介して Observable を返す処理があった1
以下のように share した subject を分けると1度しか subscribe できない
import { Component, OnInit, Input } from '@angular/core'; import { Observable } from 'rxjs/Observable'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; import { share, tap } from 'rxjs/operators'; @Component({ selector: 'my-app', template: ` <ul> <li>counter: {{counter}} <li>direct: {{direct|async}} <li>return: {{returnValue|async}} <li>direct2: {{direct|async}} <li>return2: {{returnValue|async}} </ul> `, }) export class AppComponent implements OnInit { direct: Observable<string>; returnValue: Observable<string>; message$: Observable<string>; subject: BehaviorSubject<string> = new BehaviorSubject<string>('initial'); counter: number = 0; ngOnInit() { this.message$ = this.subject.asObservable().pipe(tap(() => this.counter++), share()); this.direct = this.message$; this.returnValue = this.getObservable(); this.subject.next('Hello!'); } getObservable(): Observable<string> { return this.message$; } }
share しないと複数回呼べる
Observable の Cold/Hot についてまだちゃんと理解できてないと感じたので、改めて調べよう