最近、IMEの表示が変わっているにも関わらず、急に日本語が入力できなくなり再起動をせざるを得ないシーンが多々ありました💦
そして、再起動後にDockerがうまく動いてくれない……
そんなときの対処法です
①タスクマネージャーを開いてDockerDesktopを「 タスク終了 」
②下のほうにあるDockerServiceも消しておく
③スタートウィンドからDockerDesktopを開く
最近、IMEの表示が変わっているにも関わらず、急に日本語が入力できなくなり再起動をせざるを得ないシーンが多々ありました💦
そして、再起動後にDockerがうまく動いてくれない……
そんなときの対処法です
①タスクマネージャーを開いてDockerDesktopを「 タスク終了 」
②下のほうにあるDockerServiceも消しておく
③スタートウィンドからDockerDesktopを開く
こんな感じでサーバレスなアプリケーションを作成したい時ありませんか?
そして、運が悪いことに①から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で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で位置情報アプリを開発しておりますと、位置情報が取れないということにしばしば遭遇します。
ここでは、
・基本的なパーミッションの設定
・サービスで動作させる場合は、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の意味は
All location providers should be disabled when battery saver is on and the device is non-interactive.
Constant Value: 2 (0x00000002)
です。位置情報のプロバイダは、バッテリーセーバーがONの場合とデバイスがインタラクティブではないときにオフられるようです。
0は
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 の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 ということで、前にも紹介したこのサイトに出てきました、アイドル状態をコントロールするクラスです。
ささっと見たところ、次のようなコメントがついてましたね。
/**
* 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の一歩手前の状態ということでしょうか。