タケユー・ウェブ日報

Ruby on Rails や Flutter といったWeb・モバイルアプリ技術を武器にお客様のビジネス立ち上げを支援する、タケユー・ウェブ株式会社の技術ブログです。

WSL2のadbコマンドでWindowsホストのadb-serverに接続する

動機・やりたいこと

  • WSL2で開発するが、WSL2上では Android Emulatorが使用できない
  • WSL2から、Windowsホストにインストールした Android Emulator を使いたい

やったこと

手順

WindowsホストにWindows用の Android SDK / platform-tools をインストール

Android Studioをインストールするとき、Platform-Toolsもインストールされました。 後からインストールするときは SDK Managerから SDK Tools > Android SDK Platform-Tools でインストールできます。

インストール後、Windows環境変数 PATH にパスを追加しておきます。

C:\Users\ユーザー名\AppData\Local\Android\Sdk\platform-tools

developer.android.com

WSL2 (Ubuntu) にUbuntu用の Android SDK / platform-tools をインストール

ここなど

medium.com

Windowsホスト上で所定の操作を行うPowerShellスクリプトを実行

こちらの記事のとおり

ただし

  • $adbPath"C:\Users\ユーザー名\AppData\Local\Android\Sdk\platform-tools"
  • Set-NetFirewallProfile -DisabledInterfaceAliases "vEthernet (WSL)" は管理者権限が必要

medium.com

WSL2で ADB_SERVER_SOCKET 環境変数を設定して adb コマンドがWindowsホスト上の adb-server へ接続するようにする

以下を .profile に追記して source ~/.profile

export ADB_SERVER_SOCKET=tcp:$(cat /etc/resolv.conf | grep nameserver | cut -d' ' -f2):5037

adbを使う

takeyuweb@concolor:~$ adb devices
List of devices attached
emulator-5554   device # <-- Windows上で動くEmulator

Google Play Store 予約注文(事前登録)開始の手順メモ

support.google.com

大変わかりづらく、先に製品版の審査を通してしまって事前登録できない、製品版の地域を一度選ぶと事前審査の地域が削除され戻せない、など取り返しが付かないところがあるので要注意

  1. 事前登録の審査を受ける
  2. バイナリを登録
  3. 国/地域を選択
  4. 特典の有無
  5. 事前登録の審査が終わってアプリページの掲載が開始
  6. 製品版リリースを作成して公開する(国/地域は選択しない
  7. 公開を開始する時に製品版の 国/地域 を選択する
  8. 事前登録からインストールになって事前登録者に通知が送られる

途中公開版の国/地域を選択してしまうと、事前登録の方の国/地域が削除されてしまうので、うっかり選択してしまったら公開の概要の管理対象の公開をオンにして、反映しないように止めておく必要がある。

オープンテストやクローズドテストと絡めるやり方もあるようだが、シンプルな事前登録の手順は上記のような流れらしい

Chromeでビデオ/音声入力する機能開発の時にオーディオ入力として任意のWAVファイルを使う方法

タケユー・ウェブ株式会社ではWebRTCを利用したブラウザベースのライブ配信サービスの開発運営を行っています。

お客様から、「ステレオ音声配信を行いたい」というご依頼があり、この機能開発を行う必要がありましたが、弊社にはステレオマイクはありません。 適当なステレオ音源をマイク入力の代わりに使いたいところです。

そんなときにはChromeのフェイクデバイス機能を使います。

録音を行うChromeの起動オプションとして --use-fake-device-for-media-stream--use-file-for-fake-audio-capture=file.wav を渡します。

私の環境はWindows なのでこんなコマンド

"C:\Program Files\Google\Chrome\Application\chrome.exe" --use-fake-device-for-media-stream --use-file-for-fake-audio-capture="C:\Users\takeyuweb\Channel_Test_Once_LR.wav"

こうするとマイク入力のデバイスに Fake Audio Input を使用できるようになり、選択した音声ファイルの内容が繰り返しマイク入力として流してくれます。

ちなみにステレオ音声ファイルはこちらのサイトのものをダウンロードさせて頂き、WAVに変換して使用しました。

VSCode Remote - SSH と WSL2 でリモートFlutter開発

f:id:uzuki05:20181215091555j:plain

この記事について

できたこと

  • VSCode の Remote SSH で Flutter 開発をするAndroidアプリをビルド)
    • Remote SSH で WSL2 の Ubuntu で開発する
    • Remote SSH 接続先である WSL2 のホスト機は Android端末と同じネットワーク内にある

できないこと

  • 遠隔地やクラウド上にあるWindows PC上のWSL2に入ったFlutter SDKで、手元にあるAndroid端末を使ってデバッグ実行する
    • WSL2 のホスト機からAndroid端末に対してTCP/IPで接続できる必要があります。もしかするとトンネリングなどの手法で遠隔地でもできるかもしれないが

構成図

f:id:uzuki05:20210130030106p:plain
構成図

続きを読む

Aurora MySQL で utf8mb4 なダンプデータをインポートしようとして ERROR 1709 (HY000) at line 25: Index column size too large. The maximum column size is 767 bytes.

よく知られているのが、 innodb_large_prefix=1innodb_file_format=Barracuda にする、ROW_FORMATDYNAMICCOMPRESSED にする必要があることです。 しかしその設定は満足しているのに、なぜ?という場面がありました。

show variables where Variable_name in ('innodb_large_prefix', 'innodb_file_format', 'innodb_default_row_format');
show variables like "chara%";
+---------------------------+-----------+
| Variable_name             | Value     |
+---------------------------+-----------+
| innodb_default_row_format | dynamic   |
| innodb_file_format        | Barracuda |
| innodb_large_prefix       | ON        |
+---------------------------+-----------+
3 rows in set (0.00 sec)

+--------------------------+------------------------------------------------------------------+
| Variable_name            | Value                                                            |
+--------------------------+------------------------------------------------------------------+
| character_set_client     | utf8mb4                                                          |
| character_set_connection | utf8mb4                                                          |
| character_set_database   | utf8mb4                                                          |
| character_set_filesystem | utf8mb4                                                          |
| character_set_results    | utf8mb4                                                          |
| character_set_server     | utf8mb4                                                          |
| character_set_system     | utf8                                                             |
| character_sets_dir       | /rdsdbbin/oscar-5.7.mysql_aurora.2.07.2.0.1106.0/share/charsets/ |
+--------------------------+------------------------------------------------------------------+
8 rows in set (0.00 sec)

原因

dumpファイルで ROW_FORMAT=COMPRESSED が指定されていました。

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=50853 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;

Aurora MySQL では COMPRESSED に対応していません。

Amazon RDS MySQL DB インスタンスから DB クラスターにデータを移行するAmazon Aurora MySQL - AWS Database Migration Service

このため、このダンプファイルはAuroraでは ROW_FORMAT の不備という扱いになりまいた。

対策

少々乱暴ですがダンプファイルを書き換えることで対応しました。

Linuxの場合

$ sed -i -e "s/ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8/ROW_FORMAT=DYNAMIC/g" dump.sql

macの場合

$ sed -i "" -e "s/ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8/ROW_FORMAT=DYNAMIC/g" dump.sql

Flutter で Android App Bundle を作成して Play Console にアップロードするときのメモ

Android App Bundle (.aab) の作成

flutter clean
flutter build appbundle --build-number=123

アップロード

Android App Bundle (.aab)

f:id:uzuki05:20210125040908p:plain
アップロード先

アップロードするファイル

PROJECT_ROOT/build/app/outputs/bundle/release/app-release.aab

ネイティブ デバッグ シンボル

f:id:uzuki05:20210125041134p:plain
ネイティブ デバッグ シンボル のアップロード

アップロードするファイル

PROJECT_ROOT/build/app/intermediates/flutter/release/ にある arm64-v8a armeabi-v7a x86_64 を1つのZIPファイルにアーカイブしてアップロードします。 Windowsだとまとめて選択して「圧縮フォルダーへ送る」でOKです。

Flutter/Dart で S3 へのダイレクトアップロードを実装する

f:id:uzuki05:20181215091555j:plain

ダイレクトアップロードのクライアント側実装では次の2つのステップが必要です。

  1. ダイレクトアップロード用のURLを取得する
  2. S3にダイレクトアップロードする

Flutter /Dart でどう書けば良いのか?私が試した方法を紹介します。

この記事ではサーバ側の実装については述べません。

続きを読む