TWSNMP開発日誌:Flutterのp5、統計計算、機械学習パッケージを試す
今朝は5時から開発開始です。昨日に続いてモバイル版TWSMPのためにFlutterのパッケージを試しています。
p5パッケージ
TWSNMP FCのマップの表示やパネル表示に使用しているp5.jsのdart版
を見つけたので試してみました。サンプルのコードそのままコピペしただけだと、
のように大量にエラーがでます。dartのバージョンが上がって仕様が変わったためのようです。ネット上のFlutterのサンプルは、かなりの割合で同じようにエラーだらけになります。一つずつエラーの意味を考えて修正していくのも新しい言語の学習になります。悪戦苦闘の末、動くにように修正したサンプルコードが
import 'package:flutter/material.dart';
import "package:p5/p5.dart";
void main() => runApp(const MyApp());
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, this.title}) : super(key: key);
final String? title;
@override
State<MyHomePage> createState() {
return _MyHomePageState();
}
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'P5 Demo',
theme: ThemeData(
// This is the theme of your application.
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'P5 Demo Home Page'),
);
}
}
class _MyHomePageState extends State<MyHomePage>
with SingleTickerProviderStateMixin {
MySketch? sketch;
PAnimator? animator;
@override
void initState() {
super.initState();
sketch = MySketch();
// Need an animator to call the draw() method in the sketch continuously,
// otherwise it will be called only when touch events are detected.
animator = PAnimator(this);
animator?.addListener(() {
setState(() {
sketch?.redraw();
});
});
animator?.run();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("P5 Draw!")),
backgroundColor: const Color.fromRGBO(200, 200, 200, 1.0),
body: Center(
child: PWidget(sketch),
),
);
}
}
class MySketch extends PPainter {
List<List<PVector>> strokes = [];
@override
void setup() {
fullScreen();
}
@override
void draw() {
background(color(255, 255, 255));
noFill();
strokeWeight(10);
stroke(color(10, 40, 200, 60));
for (var stroke in strokes) {
beginShape();
for (var p in stroke) {
vertex(p.x, p.y);
}
endShape();
}
}
@override
void mousePressed() {
strokes.add([PVector(mouseX, mouseY)]);
}
@override
void mouseDragged() {
var stroke = strokes.last;
stroke.add(PVector(mouseX, mouseY));
}
}
class PVector {
PVector(this.x, this.y, {this.z = 0.0});
double x = 0.0;
double y = 0.0;
double z = 0.0;
}
です。2022年の5月18日時点では動作しています。
統計情報の計算パッケージ
PINGの応答時間やSNMPで取得した数値データの統計情報を計算するパッケージを探して試してみました。最初にヒストグラムを計算する関数がある
を試してみたのですが、ビルド時にエラーが大量にでてうまくいきませんでした。パッケージの中身をかなり修正する必要がありそうなので諦めました。次に
を試しました。うまく動きました。
PINGの応答時間の統計情報を計算してみました。
var statistics = _rtts.statistics;
print('Statistics.max: ${statistics.max}');
print('Statistics.min: ${statistics.min}');
print('Statistics.mean: ${statistics.mean}');
print(
'Statistics.standardDeviation: ${statistics.standardDeviation}');
print('Statistics.sum: ${statistics.sum}');
print('Statistics.center: ${statistics.center}');
print(
'Statistics.median: ${statistics.median} -> ${statistics.medianLow} , ${statistics.medianHigh}');
print('Statistics.squaresSum: ${statistics.squaresSum}');
print('Statistics: $statistics');
結果は、
lutter: Statistics.max: 0.000571
flutter: Statistics.min: 0.000339
flutter: Statistics.mean: 0.00049125
flutter: Statistics.standardDeviation: 0.0004994043952549878
flutter: Statistics.sum: 0.001965
flutter: Statistics.center: 0.000536
flutter: Statistics.median: 0.0005275 -> 0.000519 , 0.000536
flutter: Statistics.squaresSum: 9.97619e-7
flutter: Statistics: {~0.0004 +-0.0004 [0.0003..(0.0005)..0.0005] #4}
機械学習のパッケージ
回帰分析とかするために
も試してみました。これもうまく組み込めました。
使えるパッケージを選ぶ小技
いくつかパッケージを試してみてエラーで使えないものと問題ないものを見分ける小技を発見しました。
エラーでビルドできなかったsample_statisticsは
ですが、GitHUBでは
のように2年間コミットがない状態です。
ml_alogoは
最近(5月18日時点で昨日)のコミットがあります。
「パッケージの評価ポイントだけでは判断できないGitHubの最新コミットの時期をみろ」と助手の猫が天から言っているような気がします。
明日に続く
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。