Android エミュレーターで通信速度の遅い端末を作る Android Studio3.3.2

次の手順で行います。

Tools→

AVD Manager→

各エミュレーターの一覧出てくると思いますが、その鉛筆みたいなアイコンをクリック→

「Show Advanced Settings」をクリック

Netoworkという項目にSpeedとLatencyというのがありますので、それを変更。

・Fullがデフォルトで、PC上でできるかぎりのネットワーク速度を実現

・LTE なんか懐かしい  略称はLong-Term Evolution  らしい。

・HSDPA 多分、昔ハイスピードパケット通信とか言ってたあたりだと思うんですよね。この辺りから、遅さを体感できる…。

・GPRS 3Gぐらいの通信速度

下記の公式情報も参考にしてください。

https://developer.android.com/studio/run/managing-avds?utm_source=android-studio

Ubuntu 18.04 LTS Desktop 日本語Remix セットアップ

ひどい頭痛眼痛に悩まされながら泥沼セットアップを行ったので備忘録的に記事化。

やったこと

  1. UbuntuインストールDVDの作成
  2. インストールDVDからUbuntuをインストール
  3. GPUを積んだので、NVIDIAのドライバをインストール

1. インストールDVDの作成

  1. Ubuntu 18.04 LTS Desktop 日本語Remixのisoイメージダウンロード。
    ubuntu-ja-18.04.2-desktop-amd64.isoを使いました。
  2. 書き込み可能な空のDVDを用意して書き込み可能なドライブに挿入。
  3. isoイメージを右クリック→ディスクへ書き込み→挿入したDVDを選択。
  4. 書き込みが完了したら内容を確認して終了。

参考: Ubuntu 15.10 インストールDVDの作成

2. Ubuntuのインストール

沼①

  1. インストールDVDをセット。
  2. 起動時にF11を長押ししてブートメニューを開く。
    • BIOSがASRockだったため。ブートメニューがBIOS設定内に存在する種類なら、ブートの順位でディスクを入れたドライブを最優先にするだけでOK。
  3. ディスクからの起動を選択し、インストールDVDからUbuntuを起動。
  4. あとはこちらの記事を参考にポチポチとメニューを進めていく。
    Ubuntu 18.04 LTSインストールガイド【スクリーンショットつき解説】
    • このとき、USB起動かUEFIかといった選択肢が出てきたが、UEFIではないので(BIOSなので) USBを選択した。選択肢が「USB」であったのは、DVDドライブがUSB接続の外付けドライブだったことによると思われる。
    • 差分や選択肢の進み方をメモしておく。
      • モード選択
        今回はUbuntuを単体でクリーンインストールするので「Ubuntuをインストール」を選択。
      • インストールタイプ
        通常のインストール。
        アップデートをダウンロード → ✖(ネットワーク接続してなかったので)
        追加のソフトウェア類 → ✖
      • ストレージ設定
        ディスクを削除してインストール。
        インストールの暗号化 → ✖
        LVMを使用 → ✖
  5. インストールが完了するまで待ち、再起動のメニューが出たら再起動。
  6. ログイン後、初期設定
    1. 新機能はスルー。
    2. Livepatchは設定しても良かったかもしれない (特に設定しなかった)。
    3. 改善支援のデータ送信 → ✖

参考: Ubuntu 18.04 LTSインストールガイド【スクリーンショットつき解説】

3. NVIDIAのドライバダウンロード

Windowsマシンなら付属のCDを入れるだけで良さそうなのに、Ubuntuはこのあたり面倒。

※apt-getでドライバをインストールする方法(「NVIDIA apt-get」🔍)もある。今回入れるドライバは、まだダウンロード可能なドライバリストになかったので、runファイルを落としてきて入れる方針。

  1. 積んでいるGPUの種類を調べる。(購入した商品の箱とかに型番書いてあるのでそれ見てもOK)
    1. 情報更新 sudo update-pciids
    2. 情報表示 lspci | grep -i nvidia あるいは lspci | grep -i VGA
      後ろの方の[ ]で挟まれた部分が知りたい情報
  2. NVIDIAのサイトからドライバをダウンロード
    https://www.nvidia.co.jp/Download/index.aspx?lang=jp
    型番選んでダウンロードタイプを選んで検索→ダウンロード。
    ダウンロードタイプはGRDにした(SDがなかった)
  3. NVIDIA-Linux-x86_64-430.14.runというファイルがダウンロードされた。

4. NVIDIAのドライバインストール

沼②

  1. nouveauドライバの無効化
    参考: Ubuntu 18.04 LTS : NVIDIAドライバーをインストール : Server World
    1. 下記コマンドを実行。
      vi /etc/modprobe.d/blacklist-nouveau.conf
    2. 最終行に以下を追記。
      blacklist nouveau options nouveau modeset=0
    3. 下記コマンドを実行。
      update-initramfs -u
    4. 下記コマンドを実行(再起動)。
      reboot
  2. gccのインストール
    ※runファイルの実行時に必要だったのでインストール
    1. 下記コマンドの実行。
      sudo apt install build-essential
    2. 下記コマンドの実行(gccの動作確認)。
      gcc --version
  3. ドライバのインストール
    1. 下記コマンドの実行。
      sudo ~/Downloads/NVIDIA-Linux-x86_64-430.14.run
    2. 途中度々選択肢が出るが、基本OK連打になる。
      参考[1]: Deep Learning 用 Workstation 構築記録 その3(OS / ドライバ / CUDA&cuDNN インストール) – Qiita
      参考[2]: Ubuntu 16.04にNVIDIAドライバをインストールする方法 : 回れ右の内輪差
    3. インストールが完了し、黒いターミナルの画面に戻ったら、以下のコマンドを実行(再起動)して終了。
      sudo reboot
  4. 下記のコマンドを実行し、接続が正常に認識されているか確認する。
    nvidia-smi

以上。疲れた。

java.lang.OutOfMemoryError: Failed to allocate a 840012 byte allocation with 555120 free bytes and 538KB until OOM

マイナーな話にはなっちゃうんですが。
AndroidのMapboxでマーカーを追加していて、タブレットで200個ぐらいマーカーを生成する画面でOOMが起こってクラッシュしてしまう、という不具合に遭遇しました。

ググると大きなBitmapをいっぱい追加するとこれが起きやすいという話です。

https://stackoverflow.com/questions/477572/strange-out-of-memory-issue-while-loading-an-image-to-a-bitmap-object

Android Developersの公式でも紹介されていますね。

https://developer.android.com/topic/performance/graphics

皆さん、大体ファイルを読み込んでアプリに表示する系でこれが発生しているようですね。

私はBitmapの生成を、Mapboxのマーカーをタップした時に出るウィンドウのために作ってまして、下記のような感じになります。

public static Bitmap generate(@NonNull View view) {
int measureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
view.measure(measureSpec, measureSpec);

int measuredWidth = view.getMeasuredWidth();
int measuredHeight = view.getMeasuredHeight();

view.layout(0, 0, measuredWidth, measuredHeight);
/Bitmap bitmap = Bitmap.createBitmap(measuredWidth, measuredHeight, Bitmap.Config.ARGB_8888);

//bitmap.eraseColor(Color.TRANSPARENT);
Canvas canvas = new Canvas(bitmap);
view.draw(canvas);
return bitmap;
}

https://docs.mapbox.com/android/maps/examples/symbol-layer-info-window/

コード自体はMapboxの公式サンプルを利用しているだけです。

なので、上述のAndroid DevelopersやStackOverflowにあるような

BitmapFactory.Options

を使ったやり方がどうにもできませんでした…。

なので、

Bitmap bitmap = Bitmap.createBitmap(measuredWidth, measuredHeight, Bitmap.Config.ARGB_8888);

Bitmap bitmap = Bitmap.createBitmap(measuredWidth, measuredHeight, Bitmap.Config.RGB_565);

に変更しました。

ARGB_8888 

にすると、1ピクセルにつき、4バイト使うらしいです。


RGB_565

にすると、1ピクセルにつき、2バイト使います。

透明部分とかが表現できませんが、しょうがない…。

ちなみに、手っ取り早くマニフェストファイルに

<application android:largeHeap=”true” > </appplication>

ってして回避することもできるようですが、これは機種によってできなかったりするらしく、また敗北感あるのでやめました…。

AWS S3 フォルダの作成……?

弊社サービスでは、ユーザーのアップロードしたファイル群を Amazon S3 に保管しています。

元々は自社サーバに保存していたのですが、とある仕事でAWSに縁があり、なんやかんやあってS3使おうぜ!ということになりました。

ある日の開発者は思います。

「ファイルの保存先フォルダをユーザーごとに分けたいなぁ」

「そのためには動的にフォルダを生成する必要があるなぁ」

「あれ?いちいちS3にフォルダの存在確認したりフォルダ生成したりする必要があるんじゃ……? 」

うっわこれめんどいやつっぽいぞ

……と、既存の実装からイメージして勝手にうわぁと思っていたのですが、調べてみると、どうやらそうでもなさそうなんですよね。

S3 バケット内でフォルダを使用する方法 – Amazon Simple Storage Service

なるほどね。

つまるところ、実務上の要点は以下のようです。

  • S3はフラットな構造であり、内部的に階層はない。(=いわゆるディレクトリは実在しない)
  • 利便性のためにフォルダという概念をサポートしており、UI上ではフォルダ構造があるように見せている
  • ファイルをアップロードする際、ファイル名に区切り文字/を含ませれば、自動的に階層構造として処理される……?

3つ目。怪しいですね。確認しましょう。

例えば、アップロードする際のファイル名を、以下のように記述したとします。

'file_name' => 'user_image/' . $user_id . '/' . $file_name

このとき、file_nameuser_image/0123/hogehoge.pngのようになります。

さて、アップロードを実行してみましょう……

やったぜ

問題なくアップロードされましたね。
フォルダの階層構造も意図したとおりに表現されています。

この結果から、S3にファイルをアップロードする際、フォルダを作ってファイルを整理したい~といった場合には、特にフォルダの作成とかについて考える必要はないことがわかりました。楽ちん。

おさらい

  • S3はフラットな構造であり、内部的に階層はない。(=いわゆるディレクトリは実在しない)
  • 利便性のためにフォルダという概念をサポートしており、UI上ではフォルダ構造があるように見せている
  • ファイルをアップロードする際、ファイル名に区切り文字/を含ませれば、自動的に階層構造として処理される

参考

便利ツール紹介のコーナー #2

プライバシーポリシーとか利用規約が気になるという話は尤も。

PlayCode – Code Sandbox. Online Code Editor.

https://playcode.io/

「ブラウザ上で使えるJavaScriptの開発環境」の有名所。

ページを開いたらすぐにコードが書け、 出力結果がリアルタイムで出てくるため、ちょっとしたプログラムの動作確認などにもサクサク使える。

書いたコードは特に登録等せずとも保存が可能で、 アカウント登録をすれば、 ページを公開するといったことも可能になっている。
今の所はプログラムのちょっとした動作確認程度にしか使えていない。


PHP Sandbox, test PHP online, PHP tester

http://sandbox.onlinephpfunctions.com/

ブラウザ上でちょろっとPHPの動作確認ができる。内容を見るに、PHPの学習サイトっぽい。

PHPのバージョンが選択できるのは嬉しいポイント。
セキュアじゃないのが気になるところではある。 たまに使うことがある。


Regexper

https://regexper.com/

正規表現パターンをグラフ化してくれるサイト。
パターンを入力してワンクリックで綺麗に図示される。大変便利。
正規表現解読による頭痛とおさらばできる。彼女もできる。

図は保存ボタンが用意されているし、アドレスで共有することもできる。

すまんやっぱ彼女はできない。でも便利。正規表現と戦う機会があったら是非。


Trello

https://trello.com/ja

タスク管理に求められる機能、見やすいUI、外部ツールとの連携、快適な操作性を備えた人気のカンバン(ボード)方式タスク管理ツール。
基本的な機能はすべて無料で利用でき、個人利用なら十分なレベル。

利用例や活用方法、便利なChrome拡張機能などの情報がネット上に多数転がっており、 使用方法で困ることは少ないだろう。

外部ツールとの連携を行うことで、Slackに通知を飛ばしたり、受信したメールから即座にタスクを生成するといったことも可能になる。

強力なコラボレーション支援機能を有し、個人でのタスク管理やTo Do Listレベルの利用にとどまらず、チームのプロジェクト管理まで行えるパワーのあるツールとなっている。


Asana

https://app.asana.com/

基本無料で利用できるタスク管理ツールとして、非常に評価の高いツール。
基本的な機能は無料で利用可能。個人利用なら必要十分。

Trelloのようなカンバン(ボード)方式、To Do Listのようなタスクリスト方式の2種類の表示方法でタスクを一覧できる。
機能が豊富なだけでなく、美麗で親しみやすいUIは、こういったツール等に馴染みのない層にも使いやすい。

Trello同様、数多くの外部ツールと連携が可能であり、業務効率改善に繋がる。

元々プロジェクト管理ツールとして構築されているため、チームで利用する機能も当然作り込まれている。
個人からチームまで利用可能な、非常にパワフルなツールといえよう。


今回はここまで。