Golangは2023/2に1.20になっていますが、brewで配布されるのは1.19.5が最新版になっています。
brewの場合には多少の遅延があるということだろうと思いますが、とりあえず実害はありませんが。
admin

la vie libre
パルスオキシセンサーでバッテリー容量の表示をしようと思ってコードを追加しましたが、センサーの初期化処理が干渉しているようで値(初期化処理後は-1が帰る)が読み取れません。
void setup()
{
M5.begin();
M5.Power.begin();
Wire.begin(); // Wire init, adding the I2C bus.
Serial.begin(115200); // to PC via USB
M5.Lcd.clear(BLACK);
M5.Lcd.setTextSize(4);
// Initialize sensor
if (!pox.begin()) {
M5.Lcd.println("FAILED");
for(;;);
} else {
M5.Lcd.println("SUCCESS");
}
int bat_level = M5.Power.getBatteryLevel();
Serial.println(bat_level);loop()処理で読み取れないのでsetup()処理中に読み出しを埋め込むと// Initialize sensorの直後の(
pox.begin())から後ろでは-1が帰るようです。
なんだろう?
admin
心拍センサーというのが市販されていて、それを使うとパルスオキシメーターが作れるので使ってみました。
https://qiita.com/ghibi/items/aa9ae016dbbe9138a505
にやりたいイメージ通りの例があるので、ほぼそのままを使っています。ただしVScodeで使おうとすると関数を先に定義しないと呼び出せないので、入れ替えはしてあります。関数宣言でもいいですが、これはArduino IDEとVScodeの差分です。
また、デフォルトの設定ではうまく測定値が返ってこないので、
pox.setIRLedCurrent(MAX30100_LED_CURR_4_4MA);
//Register a callback for the beat detection
pox.setOnBeatDetectedCallback(onBeatDetected);Go言語にはテスト環境も整備されていますが、ここではベンチマークの例です。testingモジュールのベンチマーク機能を使うことで、わざわざソースコードに性能測定のためのコードの埋め込みが不要になります。ここでは素数計算のコードをターゲットとしてみました。
package adder
import (
"fmt"
"runtime"
"time"
)
func oddCalc() {
runtime.GOMAXPROCS(8)
c := 2
odd := []int{}
tStart := time.Now()
for i := 2; i <= 10000*1000; i++ {
func() {
flag := true // if odd number, stay "true"
for j := 2; j*j <= c; j++ {
if c%j == 0 {
flag = false
break
}
}
if flag {
odd = append(odd, c)
}
c++
}()
}
tStop := time.Now()
fmt.Println(len(odd))
el := tStop.Sub(tStart)
fmt.Println(el)
}
同じディレクトリにベンチマーク用の以下のソースコードファイルを用意しておきます。ターゲットと同じファイル中でも構わないと思いますが、ベンチマークを簡単に実行の趣旨からすると外れてます。
package adder
import (
"testing"
)
func BenchmarkOddCalc(b *testing.B) {
oddCalc()
} 実行結果は以下のとおりです。終了コードの判定もエラーコードも返していないのでpass~~が出力されています。
% go test -bench=. -v
goos: darwin
goarch: arm64
pkg: test
BenchmarkOddCal
664579
1.241648416s
BenchmarkOddCal-8 1 1241672042 ns/op
PASS
ok test 1.485sソースコードに埋め込んだ時間測定とは微妙に値が異なりますが、精度から見れば誤差範囲です。
と言うわけでGoではわざわざ性能測定のためにターゲットのコード中にコードの埋め込みは要らないよという話でした。
admin
昨年夏はイマイチ動きがおかしくてデスクトップのインストールもできなかったのですが、そろそろと機は熟したようなのでインストールしてみた。
この前にVMwareでのインストールも試みたが、BIOSのメニューから進まないから現時点では諦め。
https://dev.to/andrewbaisden/how-to-install-ubuntu-linux-on-apple-silicon-macbooks-1nia
このリンクの通りにやってみただけですが、ちゃんとデスクトップ画面は立ち上がりました。なぜかChromeは依存関係解決できないと言われて、インストールできないのですが。
P.S. (2023/2/3)
VScodeもインストールできず、いまいちな完成度、UTMのせいなのかArm版Ubuntuだからなのか。
P.S. (2023/2/10)
Ubuntuのアップデート後に再度トライしてみたらVScodeインストールできた、ブラウザはChromium、どこまでChromeと互換あるのか?
admin
円周率の計算はベンチマークで割と使われますが、公開されているプログラムでどの程度の時間で計算できるのか見てみた。
検索してWindowsとLinux版しかリストになかったのでLinuxで動作するTachusPIという円周率計算プログラムで、一千万桁まで計算させてみる、2019年度Intel i7 Macbookでの時間測定、
https://bellard.org/pi/pi2700e9/tpi.html
VMwareでLinux立ち上げてtpi-0.9-linux.tar.gzをダウンロードして、展開すると実行ファイルtpiがあるのでreadmeを参考に実行させてみる、スレッドは4個指定です。
$ ./tpi -T 4 -o pi.txt 10M
Total time (base 10 result) = 3.050 s
Writing result to ‘pi.txt’
https://bellard.org/pi/pi2700e9/tpi.htmlを見てみると、求める円周率の桁が一桁増えると所要時間はおよそ15倍かかっているから、確かにベンチマーク用として良さそうです。
admin
Goでのチャネルは使い方を誤ればpanicになりますが、これはGoの潔いところと思えばいいですが、チャネルの使い方で読み出しだけれども変数には代入しないというのがあります。
具体的には値を使わないのだから、単にダミーのリードですが実際の使い方としては終了待ちとして使うことになるんだろうと思います。
非常にシンプルな空読みの確認用のコードですが、チャネルでバッファーを2個用意して、最初の値は空読みすることで、2個目の値が変数xに代入されていることがわかります。
package main
import "fmt"
func main() {
ch := make(chan int, 2)
defer close(ch)
go func() {
ch <- 100
ch <- 200
}()
<- ch // dummy read
x := <- ch
fmt.Println(x)
}
<実行結果>
200
admin
Goでは何でも型に定義できるかと思いますが(例外があるかどうかは定かではない)、例えば関数もそのまま型として使用できます。
例えば以下のように、
ここでは”func(float64) float64“を型名として使用して、二つの関数をスライスに格納して、それぞれの関数を無名関数の引数(あえて無名関数でなくても良いですが)としてfor rangeループで実行させています。
package main
import (
"fmt"
"math"
)
func main() {
f1 := func(a float64) float64{
return a*a
}
f2 := func(a float64) float64{
return math.Pow(a, 3)
}
fs := []func(float64) float64{f1, f2} // "[]func(float64) float64" is a type
for _, fss := range fs{
func(f func(float64) float64){
fmt.Println(f(3))
}(fss)
}
}他の言語からすると奇妙な記述方法ではありますが、Goではこのような記法も成立するのだと。
admin