micro:bitのLED表示時間が異常に長い件について

直前のブログでLED表示時間が異様に長い件、micro:bitのドキュメントにその理由と思われる記載がありました。

https://lancaster-university.github.io/microbit-docs/ubit/display/?fbclid=IwAR0ZlyEd0pQnAIEmQUUK_gUnD-jalUa-hzdmIHjCRyauOcIJwdLBerLbFyI

overviewの最後にある通り、

“In it’s normal mode, the display will update every 18ms (55 Hz). If the display is in light saving mode the period is changed to 15ms (66 Hz).”

18ms毎にupdateされるようなので、この時間がLED表示データ書き込み時間として見えて来ているようです。マルチタスク動作ではないだろうmicrobitのファームウェアでは。

 

admin

Node.jsフレームワーク(Express-Generator)でのページ遷移

ラズパイにはExpress-Generatorをインストールしていましたが、MacBookにもインストールして久しぶりに触っています。Express-Generatorはwebアプリ雛形作成のためのツールの一つです。webアプリ作成のためには理解すべき点がいくつかありますが、動的なページを作成するためのデータの与え方はその一つです。

以下は関連するディレクトリを表示していますが、index.jsでviews配下のindex.pugのコンテンツを作るようになっています。

index.jsソースの一部(dbName())は記載していませんが、データベースからの読み出しを行なっています。本タイトルと直接の関係はないので省略。

var express = require('express');
var router = express.Router();

var nameList = "";

/* GET home page. */
router.get('/', function(req, res, next) {
  var response = Math.floor(Math.random() * (100 - 1)) + 1;
  
  dbName();

  const wait = () => {
  res.render('index', { title: 'Express', data: response, db: nameList});
  }
  setTimeout(wait, 3);
});

res.render()の第二引数以下がindex.pugに渡されてhtmlのコンテンツを構成しています。雛形ではtitle一個しかありませんが、カンマ区切りで任意の個数を追加できます。ここでは1~100までの範囲の乱数をdataとして、データベースから読み出したデータを変数名dbでindex.pugに渡しています。

index.pug

extends layout

block content
  h1= title
  p Welcome to #{title}

  p #{data} 

  p #{db}

SQLite3のデータベースアクセスも非同期で実行されるので、ページ作成が先行して実行されてdbデータの供給が間に合わないので、仮に時間待ち3msを入れていますが、あくまでデバッグ専用でいずれ修正の予定。

 

admin

 

 

ioutilもdeprecated(Golang)

タイトルの通りですが、1.20以降ではそうなります。実は1.16でそういう風に宣言されていたらしい。以下のリンクを参照、

bytes, err := ioutil.ReadFile("sample.json")

bytes, err := os.ReadFile("sample.json")

おそらくファイル全体を読み込むのは、メモリ効率が良くないし、Goの美学とも相入れないのでos.ReadFileを使えということなんだろうと思います。

https://future-architect.github.io/articles/20210210/

 

admin

MacBook Airのゴミ箱がワンクリックで消せない

まあMacOSではありがちな現象ではありますが、ゴミ箱がワンクリックで消せなくて、わざわざゴミ箱の中に入ってファイルを全選択して消去。

週一のリフレッシュブートで回復しているから、何らかのOS問題。回避が簡単な問題なら最近気にならなくなった。

 

admin

依存性注入(Golang)

依存性注入(DI : Dependency Injection)は他の言語でもありますが、Goの場合にはより構造が単純化されると思います。

以下のコードは、

https://qiita.com/lostfind/items/cae2bca46d903bea167c

からですが、DIを使わないと電球の種類が変わる都度、部屋の工事が必要になるのですが、DI使って部屋にはソケットだけ用意して電球の種類はmain()ルーチンで簡単に変えられるようにしています。DIのメリットは変更発生時の変更範囲が分離されることと、テストが容易(関連するモジュールがなくてもできる)あたりがメリットになるでしょう。プログラムのライフサイクルで保守が大きな比重を占める訳なので、変更に強いコードと言えます。反面コードはその分冗長になります。

package main

import (
	"fmt"
)

func main() {
    lightOne := new(Incandescent) 	// only change these lines if new lighting is introduced
    lightTwo := new(LedLight)		//

    myRoom := NewRoom(lightOne, lightTwo) // DI or object Injection

    myRoom.SwitchOnOne()
    myRoom.SwitchOnTwo()
}

type LightSocket interface {
    LightUp() string
}

// room has two sokets
type Room struct {
    LightOne LightSocket		// prepare only socket, not bulb
    LightTwo LightSocket
}

// define switch on method of the two sockets
func (r *Room) SwitchOnOne() {
    fmt.Println("1番照明:", r.LightOne.LightUp())
}
func (r *Room) SwitchOnTwo() {
    fmt.Println("2番照明:", r.LightTwo.LightUp())
}

// Constructor Injection
func NewRoom(lightOne, lightTwo LightSocket) *Room {
    room := &Room{
        LightOne: lightOne,
        LightTwo: lightTwo,
    }
    return room
}

// Led light
type LedLight struct{}

func (*LedLight) LightUp() string {
    return "LEDが光るよ!"
}

// Filament bulb
type Incandescent struct{}

func (*Incandescent) LightUp() string {
    return "フィラメントが光るよ!"
}

DIはデザインパターンそのものです。

 

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

 

 

DuckDuckGo

Safariの検索エンジンで選択可能となってます。

Googleと違って個人情報の収集をしない、つまり不要な広告が少なくなるだろうと予測、と言っているからしばらく使ってみようかと思う。

おそらく検索エンジンそのものは枯れた技術になってきているんだろうと思う。

 

admin

safariのユーザーエージェントを書き換える

毎年恒例の確定(還付)申告、大概環境問題発生するので早めに環境確認。予想通りなんかあって、safariの版数が15.1じゃないとダメと言われる。

解決方法はwebにあって、safariの開発-ユーザーエージェント-その他で一時的に版数を偽装(15.2 -> 15.1)すればなんとかなりそう。ブラウザ閉じるとリセットされますが。

公のシステムは対応が遅いのは常、確定申告サイトは相対的にまだマシですが。

 

admin

MSアカウントブロック

 

こんなメールが来て、MicroSoftのセキュリティアラームでアカウントロックしたと。同時刻にqnapがクラウドと同期できなくなったの通知、当然ですが。

で再認証して、パスワードを強力タイプに再設定。おそらくパスワードが甘かっただろうと思う。

 

admin

Protonmail

GAFAや政府の権限が及ばない個人情報が完全に保護されたメールシステムだそうです。

拠点をスイスに置いているから可能になっているんでしょう。

ということでアカウントを取得してみた。

標準ではimapはサポートせず、既存メールソフトとブリッジするためにはアプリインストールが必要らしい。

 

admin