VSCodeの Reload Windowで解決した。。。ようです。。。60分返して...
Pythonで小数点の計算をする時、strでキャストすべし...
まじかよ...
decimalモジュールに記載がある通り、float型ではなくstr型にすることで回避できます。 ですので、実装時にはstr型にキャストしたほうが良いと思います。
>>> from decimal import Decimal, ROUND_HALF_UP >>> (Decimal(1750) * Decimal(0.43)).quantize(Decimal("0"), rounding=ROUND_HALF_UP) Decimal(752)
四捨五入出来てない・・・
>>> from decimal import Decimal, ROUND_HALF_UP >>> (Decimal(1750) * Decimal(str(0.43))).quantize(Decimal("0"), rounding=ROUND_HALF_UP) Decimal(753)
YES YES YES!
Dartも同じようなことがあった気がする。Python以外にもfloat to Decimalじゃなくて、str to Decimalにしろってやつ。752.4999999999999999 とかになっちゃうんだよね、前者だと。
WordPressの検索機能のカスタマイズ
post_type
を追加したいという要件だった。これで瞬殺。
<?php function custom_search_query($query) { if (!is_admin() && $query->is_search) { $query->set('s', $query->get('s')); $query->set('post_type', ["post", "page", "YOUR_POST_TYPE"]); } } add_filter('pre_get_posts', 'custom_search_query');
WP_Queryで指定できるものは何でも指定できるようなので、meta_dataやカスタムフィールドなんかも全然行けそー
FlutterのFirebase MessaingにおけるonTokenRefreshがよくわからない
このAPIすげー微妙な気がする。使い所がわからない。毎回 getToken
でデバイストークンをぶん投げてええんちゃうって思う。
端末が変わる、アプリの再インストールでは自動的に新しいデバイストークンが採択されるから、onTokenRefreshが呼び出されることがない。このメソッド Stream
を購読するものだから、Firebase側からのPUSHがないと動かない。
考えられるユースケースは、デバイストークンをアプリの操作で削除した場合。deleteToken
したら Stream
で新しいトークンが渡されて、それをサービスに投げるまでがワンセットみたいな仕様以外に、使い所が全然ないと思う。
起動時にgetToken
した値をバックエンドにぶん投げて、ユーザーと紐づけているトークンリストに該当していないならappendするべき。で、デバイストークンでPUSH通知を送ると失敗したトークンのリストがもらえるのでDELETEして、生きてるトークンだけ保持すれば良い。
これでいいのだ。
FlaskのBluePrintで404を指定することは出来ない
Flaskの仕様で、404のエラーハンドラーを blueprint
毎に定義することが出来ず、ちょっとハマった。
以下の公式にあるように、Flaskのアプリケーションそのものが、404になるURLがリクエストされた時にどのblueprintのエラーハンドラーを呼び出していいかわからんって書いてある。つまり、404と405はグローバルに定義しろってことらしい。
This is because the blueprint does not “own” a certain URL space, so the application instance has no way of knowing which blueprint error handler it should run if given an invalid URL.
Modular Applications with Blueprints — Flask Documentation (2.3.x)
@app.errorhandler(404) @app.errorhandler(405) def _handle_api_error(ex): if request.path.startswith('/api/'): return jsonify(error=str(ex)), ex.code else: return ex
初めてFlask触ったのが、2013年とかで、当時のバージョンは0.10だった。今は2.3か。それでも全然コアのアーキテクチャは変わらない。Flaskに学ぶことは多かった。
Flutterだけやってるのが怖くなってきた話
2年半ぐらいFlutterをやっているし、今後もやっていくのですけれど、初学の頃に比べると刺激がなくなってきた。 「やらなければできない」ことが減っていることが怖い。
UIの実装ができれば、悩みどころは状態管理・Widgetの初期化と後処理・デザインシステムの3つ。RiverpodとHooksの使い方が固まってきたので、悩むこともなくなった。デザインシステムはThemeExtensionを使うのが簡単で良さそうだ。
Flutter SDKの開発者体験のスタンダードなレベルが高すぎるので、Dartが3になってFlutterも4や5になるんでしょうけど、革新的なコードベースの変化というか、今までの書き味がガラッと変わるような変化が想像できない。1.0の頃とWidgetの設計は全然変わってない。更に簡便な書き味が扱いやすいAPIやWidgetがリリースされる可能性はあるけど、Vue2 -> 3ほどの変化はないと思う。
コードの書き方についても、Lintで潰せる部分を除けば、Widgetの分割と初期化方法ぐらいじゃないですかね。RiverpodとHooks使っていたら、必然的にパターンが決まる。Riverpod前提だと、Hooksを使うケースってuseEffect / useStateぐらい。9割がuseEffectかな。ローカルなデータとグローバルなデータを共存して、Widgetをまたいでデータが管理できるRiverpodに抱かれるのが楽。
Widget単体のテストを通せるようにクラスを分けて(ヘルパーメソッドをなるべく使わない)、RiverpodでデータとUIが分離できていれば、捨てやすくなる。捨てやすいコードがきれいなコード。自分の書いたコードを捨てて再構築する過程を見て、ますますそう感じた。
Flutterを第一言語にするのは今年まで、来年以降はTypeScriptを第一言語にして、React/Vue3 を使ったフロントエンドの経験値を上げていくぞ。