見出し画像

TWSNMP開発日誌:Flutterのp5、統計計算、機械学習パッケージを試す

今朝は5時から開発開始です。昨日に続いてモバイル版TWSMPのためにFlutterのパッケージを試しています。

p5パッケージ

TWSNMP FCのマップの表示やパネル表示に使用しているp5.jsのdart版

を見つけたので試してみました。サンプルのコードそのままコピペしただけだと、

p5のサンプルのエラー

のように大量にエラーがでます。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日時点では動作しています。

p5のサンプル

統計情報の計算パッケージ

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は

  sample_statisticsの評価ポイント

ですが、GitHUBでは

のように2年間コミットがない状態です。
ml_alogoは

ml_alogの評価ポイント

最近(5月18日時点で昨日)のコミットがあります。
「パッケージの評価ポイントだけでは判断できないGitHubの最新コミットの時期をみろ」と助手の猫が天から言っているような気がします。

明日に続く

開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。