brewとGolang版数

Golangは2023/2に1.20になっていますが、brewで配布されるのは1.19.5が最新版になっています。

brewの場合には多少の遅延があるということだろうと思いますが、とりあえず実害はありませんが。

 

admin

 

M5Stackでバッテリ容量が読み取れない

パルスオキシセンサーでバッテリー容量の表示をしようと思ってコードを追加しましたが、センサーの初期化処理が干渉しているようで値(初期化処理後は-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);
pox.setIRLedCurrent(MAX30100_LED_CURR_4_4MA); 行を追加して、IR ledの電流値を調整しています。画面左上のHeart Pulseマークを見ながら指を当てて測定するのですが、測定値の安定には数秒かかります。
P.S. (2023/2/9)
ライブラリのURL追記
admin

Golangのtesting

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

UTMでUbuntuデスクトップArm版をM1 Macbookに、

昨年夏はイマイチ動きがおかしくてデスクトップのインストールもできなかったのですが、そろそろと機は熟したようなのでインストールしてみた。

この前に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