見出し画像

TWSNMP FC:レポート、ログ受信、通知処理の移植

毎朝、3時間ぐらいの作業で開発しようと思っていましたが、昨日は高校サッカーの準決勝を観ながらレポート、ログ受信、通知処理の移植を行いました。もちろん猫も一緒に観てました。二試合あったので、ずいぶん進みました。作業内容は、

です。この移植作業でdatastoreパッケージの内のデータを外部に直接公開しないように変更しました。関数を通してアクセスする方法です。mapなどの複数あるデータを全て処理するようなループ処理でちょっと悩みましたが、

を参考にしてコールバック関数を使うことで解決しました。
ノードに関して、

func (ds *DataStore) ForEachNodes(f func(*NodeEnt) bool) {
	ds.nodes.Range(func(_, p interface{}) bool {
		return f(p.(*NodeEnt))
	})
}

のような関数をdatastoreパッケージで公開すれば、他のパッケージから

	b.ds.ForEachNodes(func(n *datastore.NodeEnt) bool {
		b.updateNodeState(n)
		return true
	})

のように利用して全ノードに関する処理を柔軟に作れます。これまで、

func getPollings() []pollingEnt {
	ret := []pollingEnt{}
	pollings.Range(func(_, p interface{}) bool {
		ret = append(ret, *p.(*pollingEnt))
		return true
	})
	return ret
}

のようにリストを返すような関数を作っていましたが、コールバックのほうがGO言語の良さを引き出す画期的な方法なので全て見直すことにしました。
そのため今朝は4時に猫に起こされて前に移植した部分も再修正しました。

今日は、高校女子サッカーの決勝があるので、また猫のTV観戦しながら移植作業の続きをやろうと思います。

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