Anker PowerConf H700

去年、このヘッドセットを購入して、半年程使用しました。

Bluetooth接続できて、かつ、マイクが口元にあり、マイクにもノイズ除去機能があるものを探して、これに辿り着いた次第でした。

ところが、騒がしいところでも、周囲の音を拾わないことを期待したわけでしたが、近くでの声や音は拾ってしまうということが、MT相手の反応からわかりました。

いや、求めていたレベルが大きすぎただけで、悪い製品ではないんですがね。

やはり、静かなところでやるに、限りますね。

Enumの名称は単数形か複数系か

learn.microsoft.com

ほとんどの Enum 型には単数名を使用しますが、ビット フィールドのEnum 型には複数名を使用するのがよいそうです。

Javaは、Enumで、ビットフィールドを表現できない(かわりにEnumSetを用いる)ので、単数が当たり前で、 他の言語を使用すると、複数形のEnumが出てきて、長年の疑問でしたが、なるほど、腑に落ちました。

Django(DRF)のレスポンスにcodeを含める

DRFのレスポンスは、通常は、メッセージが表示されるだけ。

{
   "param1": [
     "この項目は必須です。"
   ] 
}

APIの例外クラスを見ると、エラーコード(code)が指定されることがわかります。 このcodeをレスポンスに含めたい場合、どうするか。

class APIException(Exception):
    """
    Base class for REST framework exceptions.
    Subclasses should provide `.status_code` and `.default_detail` properties.
    """
    status_code = status.HTTP_500_INTERNAL_SERVER_ERROR
    default_detail = _('A server error occurred.')
    default_code = 'error'

    def __init__(self, detail=None, code=None):
        if detail is None:
            detail = self.default_detail
        if code is None:
            code = self.default_code

以下のように、EXCEPTION_HANDLERをカスタマイズし、exc.get_full_details()の結果をレスポンスにセットする。

/PATH/TO/xxx/utils.py

from rest_framework.exceptions import APIException
from rest_framework.response import Response
from rest_framework.views import exception_handler


def custom_exception_handler(exc, context):
    response = exception_handler(exc, context)
    if response is not None:
        if isinstance(exc, APIException):
            data = exc.get_full_details()
            response = Response(data, status=exc.status_code, headers=response.headers)
    return response

/PATH/TO/settings/base.py

REST_FRAMEWORK = {
     "EXCEPTION_HANDLER": "xxx.utils.custom_exception_handler",
 }

そうすると、こういうレスポンスが返ります。

{
   "param1": [
     {"message": "この項目は必須です。", "code": "required"}
   ] 
}

ステータスコードだけだと、多様なエラーのハンドリングが難しい場合に、試してみたいです。