Skip to content

Instantly share code, notes, and snippets.

View mj-hd's full-sized avatar
💯
Flutter Engineer

Yusuke Otsuka mj-hd

💯
Flutter Engineer
View GitHub Profile
@mj-hd
mj-hd / enum_widget.dart
Last active June 15, 2022 07:38
enum_widget.dart
import 'package:flutter/material.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
static const String _title = 'Flutter Code Sample';
@override
@mj-hd
mj-hd / Flutter 3のパフォーマンス改善まとめ.md
Last active June 8, 2022 02:27
Flutter 3のパフォーマンス改善まとめ
@mj-hd
mj-hd / dart_switch_loop.dart
Created June 1, 2022 06:38
dart_switch_loop.dart
void main() {
int a = 0;
// equivalent to while
first:
switch (a) {
second:
default:
a++;
switch (a) {
@mj-hd
mj-hd / null_safe_controller.dart
Created March 31, 2022 11:05
null safe controller
class FooController {
_State? _state;
bool get hasState => _state != null;
void _attach(_State state) {
_state = state;
}
void hello() {
@mj-hd
mj-hd / tdt.dart
Created November 26, 2021 04:38
tdt.dart
int function(int input) {
if (input == 0) {
return 0;
}
if (input % 2 == 0) {
return 2;
} else {
return 1;
}
@mj-hd
mj-hd / dart_future_error.dart
Created November 5, 2021 02:20
dart_future_error.dart
void main() async {
final error = Future<void>.error(Error());
// この行を入れると、Uncaught Errorが2つでる
// await Future.delayed(Duration.zero);
await error;
}
@mj-hd
mj-hd / backoff_stream.dart
Created October 1, 2021 15:04
backoff_stream.dart
import 'dart:math';
Stream<int> linearBackoff({
required int limit,
required num delay,
}) async* {
for (var i = 0; i < limit; i++) {
await Future.delayed(Duration(milliseconds: delay.floor()));
yield i;
}
@mj-hd
mj-hd / 20210408_エラーを捨てるなんてもったいない!.md
Last active April 8, 2021 15:15
20210408_エラーを捨てるなんてもったいない!

エラーを捨てるなんてもったいない!

先日新しく作ったプロジェクトが、要件的にもエラーハンドリングをしっかりしていく方針だった。

しっかりしたエラーハンドリングってなんだろってところだけど:

  1. 下の層で起こりうるエラーをすべてハンドリングしていること
  2. プログラム内で対処できるエラーを区別できること(リトライ、UIを通してユーザにレポート、エラーレポーティング)
  3. 正確なスタックトレース、エラー情報ができるだけ失われないこと
@mj-hd
mj-hd / 20210326_observable-hooks_ネットワーク帯域推定.md
Created March 26, 2021 13:52
20210326_observable-hooks_ネットワーク帯域推定

observable-hooks

以前の記事でRxJSに入門したとき、一緒に使ってみたライブラリ observable-hooks の使い心地に感銘を受けた。
RxJSのObservableによる世界とReactとの境界をhooksとして取り持つライブラリなのだが、これがConcurrent Mode Safeと謳っている。
実際、Observable Resourceというオブジェクトを経由してストリームの状態、例えば値が流れていない初期状態はPromiseをthrowで表現したり、エラー時は流れてきたerrorをthrowしたり、内部で流れてきた値をキャッシュしてrender時に値を提供することでObervableからReact Concurrent Modeの世界へ状態を変換してくれる。
使い心地としてはReact側からもデータフロー側からもConcurrent Modeのアレやコレをライブラリが全て隠蔽しており、ハハーンこれが来るべき未来なのかーと感心した。

ネットワーク帯域推定

とある事情によりネットワークの帯域を大まかに推定する必要に迫られたのだが、似たようなことをしているライブラリを参考に、指数平滑移動平均(EWMA)という方法を使うと良さそうなことを学んだ。
定期的にネットワーク帯域をサンプルしたとして、全体の平均をとってしまえば分母がどんどん大きくなり、急激な変化に反応できなくなる。そこで時系列順に指数関数的な重み付けを与え、新しいデータほど平均値に与える割合を多くしたものが指数平滑移動平均らしい。外れ値の影響を省きつつ機敏にネットワーク状況に追従できるので、[hls.js](https://github.com/video-dev/hls.js/blob/master/src/

@mj-hd
mj-hd / 20210323_PageRankと競輪選手.md
Last active March 23, 2021 04:43
20210323_PageRankと競輪選手

20210323_PageRankと競輪選手

PageRankと競輪選手

仕事柄、競輪関連のデータ分析などに興味があり、データマイニングをチョット学んだので応用編として、PageRankというアルゴリズムを競輪選手に応用した。
PageRankによる対戦ネットワークの分析 | 株式会社AlphaImpact
内容としては競馬の分析↑の競輪版。PageRankを使うことで、競輪選手同士の強さをランクづけすることができる。
PageRankとはそもそもなんだっけと言うところだが、むかーしGoogleがクロールしたWebページの順位づけに使っていたというアルゴリズム。 Googleの検索は、一覧で並べるので上から何番目、という位置関係がとても重要になってくる。この位置関係はページの価値や関連度などなどで決まるのだが、ページの価値「良いページとはなんだっけ」「機械的にページの価値を判断して、順位づけするためには何をしたらいいんだっけ」という問題に答えるのがPageRank。
仕組みとしては、Webページのリンク/被リンク関係を、有向グラフ(矢印付きのグラフです)として表現する。そして、被リンク・矢印が沢山繋がっているページほど「良い」とし、さらに「良い」とされるページからリンクされているページも「良い」と定義する(論文なども同じで、被引用が多いほど価値が高い)。あとは有向グラフ上でこの「良さ」を計算すれば良い。
計算方法は、ランダムサーファーという方式で説明をすると、今開いているページのリンクの中からランダムにリンクをポチポチ開いていくサーファーという登場人物を考える。初期状態ではこのサーファー達沢山用意し、適当なページに配置、その後ターンを進めていく。サーファー達は毎ターンランダムなリンクを踏むので、有向グラフ上を矢印に従いどんどん移動していく。
これを繰り返すと、確率的に被リンクの多いページには自然とサーファーが集まり、被リンクが多いページからリンクを受けているページにも、沢山のサーファーが集まる。先ほど定義した「良い」ページが、ページにとどまるサーファーの数として表せるわけだ。
有向グラフの話に戻ると、矢印を沢山受けているノードは数値が高く、矢印を沢山受けるノードから矢印を受けるノー