windows10で再起動後にDockerがうまく動かない時の対処法

最近、IMEの表示が変わっているにも関わらず、急に日本語が入力できなくなり再起動をせざるを得ないシーンが多々ありました💦
そして、再起動後にDockerがうまく動いてくれない……

そんなときの対処法です

①タスクマネージャーを開いてDockerDesktopを「 タスク終了 」

②下のほうにあるDockerServiceも消しておく

③スタートウィンドからDockerDesktopを開く

APIGatewayでマッピングテンプレートを使いたい

こんな感じでサーバレスなアプリケーションを作成したい時ありませんか?
そして、運が悪いことに①からPOSTされるContent-Typeが「
application/x-www-form-urlencoded 」だった~なんてことありますよね….
( application/jsonになっていれば、うまいことLambdaのハンドラに渡してくれるっぽい )

そんな時は、APIGatewayでマッピングテンプレートを使ってうまいことLambdaに渡してあげましょう!

①対象リソースのメソッドを選択後、

メソッドリクエスト → 統合リクエスト → Lambda
メソッドレスポンス ← 統合レスポンス ← Lambda

と表示されている「統合リクエスト」のリンクをクリックする。

②画面下部に「マッピングテンプレート」が表示されるので、「マッピングテンプレートの追加」を選択し、「application/x-www-form-urlencoded」を入力する。

完成形

③追加したContent-Typeをクリックすると謎の自由入力欄が表示されるので、下記の内容を入力する


完成形
{
    #foreach( $token in $input.path('$').split('&') )
        #set( $keyVal = $token.split('=') )
        #set( $keyValSize = $keyVal.size() )
        #if( $keyValSize >= 1 )
            #set( $key = $util.urlDecode($keyVal[0]) )
            #if( $keyValSize >= 2 )
                #set( $val = $keyVal[1] )
            #else
                #set( $val = '' )
            #end
            "$key": "$val"#if($foreach.hasNext),#end
        #end
    #end
}

※ここでは、keyのみをurlデコードしてvalueは日本語や改行が含まれている場合、うまく処理できないのでLambdaに渡してからそこでデコードする形にしました。
pythonであれば、下記のようにすればうまく動くはずです。

import json
import requests
import urllib.parse

def lambda_handler(event, context):

    parse_test = urllib.parse.unquote(event['test'])

    return {
        'statusCode': 200,
        'body': json.dumps(parse_test)
    }
    

こんな感じで動くのでは?ないでしょうか….

まとめ
   Content-Typeは、「application/json」で送ってほしいナ💦

Android wakelockがちゃんと動作しているかADBを使って調べる

AndroidでCPUを動作させ続けるために、wakelockというものが使えます。

https://developer.android.com/training/scheduling/wakelock?hl=ja

次のように起動します。

        PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
        PowerManager.WakeLock mWl = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                "MyApp::MyWakelockTag");
        mWl.acquire();

//後でこれを呼び出さないとだめ
       
        if (mWl != null && mWl.isHeld()) {
              mWl.release();
        }

しかし、仕込んだところで、これがちゃんと動作しているのか…?

調べたい時がありますよね。

そんな時は、ADB

adb shell dumpsys power

とやります。

ちょっとですね、出てくる情報が多すぎなんですが

Wake Locksという部分がありまして、ここにしかけられているWaleLockが出てきます。

wakelockがrelease されていると、ここに出てきません。

ちなみに、

adb shell dumpsys power

でwakelock関連で使えるところがもう一個ありまして、Wake Lock Log という、Wakelockを使ったおそらくログなのだろう… というのを見ることができます。

出力が多すぎて萎えますが、上述の

        PowerManager.WakeLock mWl = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                "MyApp::MyWakelockTag");

としました、この ”MyApp::MyWakelockTag” という引数が役に立ちます!

ありますね~ ちゃんと17:49:06 に動作していたということがわかります(泣)

Android バックグラウンドで位置情報が取れない場合に、バッテリーセーブの状態を調べる 

Androidで位置情報アプリを開発しておりますと、位置情報が取れないということにしばしば遭遇します。

ここでは、

・基本的なパーミッションの設定
・サービスで動作させる場合は、ForegroundServiceを使う

などの基本的なことはやっているのに、位置情報が取れないよ~ ぴえん という場合に、バッテリーセーブのことを調べると、役に立つ場合があるというのをご紹介します。

PowerManagerに

 getLocationPowerSaveMode()

という関数があります。
https://developer.android.com/reference/android/os/PowerManager#getLocationPowerSaveMode()

次のように利用します。

        PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            int power_save_mode = powerManager.getLocationPowerSaveMode();
            Log.d("sample", "Power Save Mode:" + power_save_mode);
        }

すると、

2

とか

0

とかの数字が戻ってきます。

私の私物スマホはバッテリーセーブを基本的にONにしていると、2になっていて、2の意味は

LOCATION_MODE_ALL_DISABLED_WHEN_SCREEN_OFF

All location providers should be disabled when battery saver is on and
 the device is non-interactive.

Constant Value: 2 (0x00000002)

です。位置情報のプロバイダは、バッテリーセーバーがONの場合とデバイスがインタラクティブではないときにオフられるようです。

0は

LOCATION_MODE_NO_CHANGE

Either the location providers shouldn't be affected by battery saver,
 or battery saver is off.

Constant Value: 0 (0x00000000)

だそうです。この場合は、バッテリーセーバーがONでもOFFでも位置情報プロバイダがオフられないようです。


詳しくは、下記のPowerManagerの定数一覧を見てみてください。

https://developer.android.com/reference/android/os/PowerManager#LOCATION_MODE_NO_CHANGE


Android QUICK_DOZE_DELAY とは

前回

で紹介しました、Android のDozeモードを調べる過程で、

C:\as_component\platform-tools>adb shell dumpsys deviceidle force-idle
Unable to go deep idle; stopped at QUICK_DOZE_DELAY

となることがありました。

どうやら、アラームが設定されていると、こうなるみたいですね。普通のアラームではなく、

AlarmManager.setAlarmClock()

などで設定されているアラームです。

で、これも特にリファレンスがなく、ググってヒットするのは、Androidのソースコードだけですね…。(泣)

DeviceIdleController.java ということで、前にも紹介したこのサイトに出てきました、アイドル状態をコントロールするクラスです。

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/android10-c2f2-release/services/core/java/com/android/server/DeviceIdleController.java

ささっと見たところ、次のようなコメントがついてましたね。

 
/**

* Device is inactive and should go straight into idle (foregoing motion and location

* monitoring), but allow some time for current work to complete first.

*/

@VisibleForTesting

static final int STATE_QUICK_DOZE_DELAY = 7;

やらなければいけない仕事もあるけれのでIDLEにならないけれども、IDLEの一歩手前の状態ということでしょうか。