Wordpressでオリジナルのブロックを作成する公式サイトのチュートリアル

公式サイト

日本語版

チュートリアルは有志の方がほぼ完全に翻訳してくださっています。

ただし個別のコンポーネントのページなどは、翻訳が追い付いていないために欠けています。
その辺は基本シンプルな内容しか書かれていないので翻訳はそもそも不要ですが、ページへのリンク自体がないことには注意が必要です。

ja.wordpress.org

英語版

developer.wordpress.org

GitHubWordpress Coreブロックのソースコード

標準で使えるCoreブロックのソースコードです。
いろいろと参考になります。

ただ、alignなどのよく使う機能は サポート で用意されていることも多いです。

github.com

ひとつのプラグインで複数のブロックを定義する

npx @wordpress/create-block gutenprideを使うと、一つのプラグインで一つのブロックしか定義できません。
しかし下記方法を使うと一つのプラグインに複数のブロックを定義できます。

dev.to

save.jsの更新が反映されないときは

作成中にsave.jsの更新内容が反映されずかなり悩みました。

キャッシュが残っているのは分かっていましたが、仮想環境のリスタートやブラウザキャッシュのクリアをしても反映されず。

結局原因は手を抜いていたことで、block.jsonのバージョン情報を上げ、いったんWordpressの編集ページから抜けることで解決されました。

3分間ネットワーキングを読んでみた

3分間ネットワーキングというサイトを読んでみました。

かなり昔のサイトなのでいろいろ古い部分はあるものの、丁寧で分かりやすい。

1つ1つの回が短いのも読みやすくていいですね。

回を追うにつれてどんどん扱いがひどくなる助手君かわいそう。

www5e.biglobe.ne.jp

論理的思考パラドックス「天国への道」で天国へ行くためのプログラム

Youtubeでおもしろい論理的思考パラドックス(論理的思考パズル)を紹介している動画があったので、プログラムにしてみました。

確実に天国に行く方法を考えるというものです。
ジョジョプッチ神父みたいですね。

問題はこんな感じです。

あなたは死にました。

そして天国と地獄への道の分岐点にいます。
問題はどちらが天国への道かわからないということです。
一度進めば引き返せません。

二つの道にはそれぞれ天使がいます。
片方は正直天使、常に正直に答えます。
片方は嘘つき天使、常に嘘を答えます。
この天使たちもどちらが正直天使かはわかりません。

あなたは片方の天使にだけ一度のみ質問をすることができます。
質問は「はい」か「いいえ」で答えられるものでなければなりません。

この条件であなたは確実に天国への道を見つけられるでしょうか?

動画でも解説してくれています。

噓つき天使を悪魔とするパターンもあるようですが、動画では天使です。
理由は悪魔なら気まぐれに嘘をつくから。
なるほど。

youtu.be

答えを書いてしまうと、







「この道は天国への道ですか?」と聞かれたら「はい」と答えますか?

この質問をすれば天使が正直だろうが嘘つきだろうが、天国への道がわかります。

なぜそうなるかをプログラムにしてみました。
いや正直に言うとプログラムにして初めて理屈が理解できました。

Python 3.9~

from abc import abstractmethod

class Angel:
    @abstractmethod
    def answer(self, question: bool) -> bool:
        pass
    
class HonestyAngel(Angel):
    ''' 正直天使は常に正直 '''
    def answer(self, question: bool) -> bool:
        return question

class LierAngel(Angel):
    ''' 嘘つき天使は常に嘘つき '''
    def answer(self, question: bool) -> bool:
        return not question

def ask_the_question(angel: Angel, question: bool) -> bool:
    ''' 「この道は天国への道ですか?」と聞かれたら「はい」と答えますか? '''\
    first_answer = is_this_the_road_to_heaven(angel, question)
    return would_you_say_yes(angel, first_answer)

def is_this_the_road_to_heaven(angel: Angel, question: bool) -> bool:
    ''' 「この道は天国への道ですか?」 '''
    return angel.answer(question)

def would_you_say_yes(angel: Angel, question: bool) -> bool:
    ''' と聞かれたら「はい」と答えますか? '''
    return angel.answer(question)

def yes():
    print('はい')

def no():
    print('いいえ')
    

on_the_heaven_side = True # 天国
on_the_hell_side = False # 地獄

honesty_angel = HonestyAngel() # 正直天使
lier_angel = LierAngel() # 嘘つき天使

print('「この道は天国への道ですか?」と聞かれたら「はい」と答えますか?', end='\n\n')

print('天国側にいる正直天使に質問')
if ask_the_question(honesty_angel, on_the_heaven_side):
    yes()
else:
    no()

print('天国側にいる噓つき天使に質問')
if ask_the_question(lier_angel, on_the_heaven_side):
    yes()
else:
    no()

print('地獄側にいる正直天使に質問')
if ask_the_question(honesty_angel, on_the_hell_side):
    yes()
else:
    no()

print('地獄側にいる噓つき天使に質問')
if ask_the_question(lier_angel, on_the_hell_side):
    yes()
else:
    no()

「この道は天国への道ですか?」と聞かれたら「はい」と答えますか?
は実質的には2つの質問が合わさったものであり、嘘つき天使に2重の否定が入るのがポイントです。

正直天使の答えはずっと正直なので、何度質問されようと影響を受けません。

実行結果は

「この道は天国への道ですか?」と聞かれたら「はい」と答えますか? 

天国側にいる正直天使に質問
はい
天国側にいる噓つき天使に質問
はい
地獄側にいる正直天使に質問
いいえ
地獄側にいる噓つき天使に質問
いいえ

これで死後は確実に天国へ行けます!
プッチ神父くらいには確実に...

Arduinoでモーターへの出力をいくつかのパターンにしてテンキーパッドで切り替える

前回Arduinoでモーターの制御は出来るようになりました。

web-memo-s.hatenablog.com

そこでArduinoとモータードライバー(Mini L298N)でDCモーターを動作させつつ、テンキーパッドで好きなタイミングでDCモーターへの出力パターンを切り替えるられるようにしたいと思います。

どうせなので出力パターンを三角波、のこぎり波、矩形波、sin波、cos波と用意してテンキーパッドのボタンで随時切り替えられるようにします。

用意するもの

前の記事でモータを制御するために用意した一揃いを用意します。

ArduinoとMini L298Nモータードライバーでモーターを制御する - メモとか

加えてKeyPadも用意します。

スターターキットとかによく入っているやつですね。

4*3 Membrane Switch Keypad

s.click.aliexpress.com

ブレッドボード図

それぞれのパーツをつなげます。

f:id:isinsin:20210223134519p:plain
キーパッドとモーター

プログラム

キーパッド用のライブラリがあるので使わせてもらいました。

使い方などは下記ページを参考にしました。

novicengineering.com

www.circuitbasics.com

今回モーターへの出力をいくつかパターンにして随時テンキーパッドの入力で切り替えたいので、単純にforを使って波形を作るわけにはいきません。
forループの間テンキーパッドの監視ができないためです。

Arduinoはシングルスレッドなので、別スレッドを立てて監視するわけにもいきません。

そこで毎loop()ごとに起動してから現在までの時間を返すmillis()を使って波形を計算してモーターへの出力を決めるようにします。

// switch-motor-operation-with-arduino-and-keypad.ino

#include <Key.h>
#include <Keypad.h>

#include "Waves.h"

const byte in1 = 10;  // Mini L298N の'IN1'に出力するピン
const byte in2 = 9;   // Mini L298N の'IN2'に出力するピン

// キーパッドの設定いろいろ
const byte ROWS = 4;
const byte COLS = 3;

char hexaKeys[ROWS][COLS] = {
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};

byte rowPins[ROWS] = {8, 7, 6, 5};  // キーパッドの入力に使うピン
byte colPins[COLS] = {4, 3, 2};     // キーパッドの入力に使うピン


/**
 * @brief 繰り返しの波形のなかの横軸xとした場合のx位置
 * @param waveLength: 波長(ミリ秒)
 * @return 繰り返しの波形のなかの横軸xとした場合のx位置
 */
long current(long waveLength) {
  return millis() % waveLength;
}

/**
 * モーターへの出力のパターンいろいろ
 */

long wave0() {
  return 0;
}

long wave1() {
  return triangleWave(0, 255, 3000, current(3000));
}

long wave2() {
  return sawtoothWave(0, 255, 1500, current(1500));
}

long wave3() {
  return negativeSawtoothWave(0, 255, 1500, current(1500));
}

long wave4() {
  return squareWave(0, 255, 2000, current(2000));
}

long wave5() {
  return sineWave(0, 255, 5000, current(5000));
}

long wave6() {
  return cosineWave(0, 255, 5000, current(5000));
}


void setup() {
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
}

void loop() {
  static Keypad keypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
  static long (* waveFunc[])() = {wave0, wave1, wave2, wave3, wave4, wave5, wave6};
  static int wave = 0;

  // キーパッドへの入力で波形切り替え
  char key = keypad.getKey();
  switch (key) 
  {
    case '0':
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
      wave = key - '0';
      break;
  }

  // モーターへ出力
  analogWrite(in1, (* waveFunc[wave])());
}

出力パターンは長いので分けてみました。

map()関数があるので、どれも簡単に実装できます。

www.arduino.cc

// Waves.h

#ifndef _WAVES_h
#define _WAVES_h

#include <Arduino.h>
#include <math.h>  // for M_PI

long triangleWave(long, long, long, long);
long sawtoothWave(long, long, long, long);
long negativeSawtoothWave(long, long, long, long);
long squareWave(long, long, long, long);
long sineWave(long, long, long, long);
long cosineWave(long, long, long, long);

#endif
// Waves.cpp

#include "Waves.h"

/**
 * @brief 三角波
 * @param min_: 最小出力
 * @param max_: 最大出力
 * @param waveLength: 波長
 * @param current: 波長の中の現在位置
 * @return 現在位置に対応する出力
 * @note 波形は下記の感じになります。
 *     +        +     
 *    +++      +++   
 *   +++++    +++++  
 *  +++++++  +++++++ 
 * ++++++++++++++++++
 */
long triangleWave(long min_, long max_, long waveLength, long current) {
  if (current < waveLength / 2) {
    return map(current, 0, waveLength / 2, min_, max_);
  } else {
    return map(current, waveLength / 2, waveLength, max_, min_);
  }
}

/**
 * @brief のこぎり波
 * @param min_: 最小出力
 * @param max_: 最大出力
 * @param waveLength: 波長
 * @param current: 波長の中の現在位置
 * @return 現在位置に対応する出力
 * @note 波形は下記の感じになります。
 *     +    +     
 *    ++   ++   
 *   +++  +++  
 *  ++++ ++++ 
 * ++++++++++
 */
long sawtoothWave(long min_, long max_, long waveLength, long current) {
  return map(current, 0, waveLength, min_, max_);
}

/**
 * @brief 逆のこぎり波
 * @param min_: 最小出力
 * @param max_: 最大出力
 * @param waveLength: 波長
 * @param current: 波長の中の現在位置
 * @return 現在位置に対応する出力
 * @note 波形は下記の感じになります。
 * +    +     
 * ++   ++   
 * +++  +++  
 * ++++ ++++ 
 * ++++++++++
 */
long negativeSawtoothWave(long min_, long max_, long waveLength, long current) {
  return map(current, 0, waveLength, max_, min_);
}

/**
 * @brief 矩形波
 * @param min_: 最小出力
 * @param max_: 最大出力
 * @param waveLength: 波長
 * @param current: 波長の中の現在位置
 * @return 現在位置に対応する出力
 * @note 波形は下記の感じになります。
 * +++++     +++++           
 * +++++     +++++      
 * +++++     +++++     
 * +++++     +++++     
 * ++++++++++++++++++++
 */
long squareWave(long min_, long max_, long waveLength, long current) {
  if (current < waveLength / 2) {
    return max_;
  } else {
    return min_;
  }
}

/**
 * @brief 正弦波
 * @param min_: 最小出力
 * @param max_: 最大出力
 * @param waveLength: 波長
 * @param current: 波長の中の現在位置
 * @return 現在位置に対応する出力
 * @note 波形は下記の感じになります。
 *           ++++                    ++++          
 *        ++++++++++              ++++++++++       
 *      ++++++++++++++          ++++++++++++++     
 *    ++++++++++++++++++      ++++++++++++++++++   
 * ++++++++++++++++++++++++++++++++++++++++++++++++
 */
long sineWave(long min_, long max_, long waveLength, long current) {
  const long accuracy = max_ - min_;
  const double wave = sin(2 * M_PI / waveLength * current);
  return map(wave * accuracy, -accuracy, accuracy, min_, max_);
}

/**
 * @brief 余弦波
 * @param min_: 最小出力
 * @param max_: 最大出力
 * @param waveLength: 波長
 * @param current: 波長の中の現在位置
 * @return 現在位置に対応する出力
 * @note 波形は下記の感じになります。
 * ++                    ++++                    ++
 * +++++              ++++++++++              +++++
 * +++++++          ++++++++++++++          +++++++
 * +++++++++      ++++++++++++++++++      +++++++++
 * ++++++++++++++++++++++++++++++++++++++++++++++++
 */
long cosineWave(long min_, long max_, long waveLength, long current) {
  const long accuracy = max_ - min_;
  const double wave = cos(2 * M_PI / waveLength * current);
  return map(wave * accuracy, -accuracy, accuracy, min_, max_);
}

(2021/3/9)バグ修正

GitHubにコードを上げてみました。

https://github.com/singo-i/switch-motor-operation-with-arduino-and-keypad

ArduinoとMini L298Nモータードライバーでモーターを制御する

Arduinoでモーターの制御がしたく、Mini L298NというDCモータードライバーを使ってみました。

トランジスタやら使う方法もあるようなのですが、パーツを組み合わせるだけで使えることと、何より速度制御が行えるということでMiniL298Nを使ってみました。

用意するもの

ものはすべてAliexpressで揃えました。
到着が遅かったりしますが、めちゃくちゃ安いですからね。

Aliexpressの商品は品質トラブルが多いのですが、電子部品はあまり問題ないようです。
買う人が厳しくチェックするので、すぐ淘汰されるんでしょうね。

スターターキット

私は初めから目的が決まっていたので部品をバラで買いましたが、これからArduino始める人はAmazonあたりでスターターキットを買うのがいいと思います。

Arduino スターターキット」で検索すればいくつか出てきます。
その中でモーターが含まれているやつを買えばいいはずです。

スターターキットもAliexpressのほうが安いのですが、届くの長いとやる気が失せてしまいますからね。

Arduino Uno

s.click.aliexpress.com

Arduinoにもいろいろ種類があるようなのですが、一番標準的なのがこのUnoです。
スターターキットとかについてくるのもこれですね。

Unoを買っておけば間違いないと思います。

Arduino公式サイトのUnoのページ

Windowsで互換品のArduinoを認識できないときは

Aliexpressで買うと安いのですが、私が買ったやつは互換品だったせいか、Windowsで使うにはUSBドライバをインストールする必要がありました。

もしWindowsArduinoが動かなくて、デバイスマネージャーでUSB2.0のエラーがあったら、下記サイトよりUSBドライバーをダウンロードしてインストールしてください。
一応VirusTotalで調べてみましたが、何年も前からあるドライバーで問題もなさそうでした。

公式のUSBドライバーダウンロードページ(中国語)

バージョンはCH341serというので大丈夫でした。
ほかのバージョンでも大丈夫かもしれません。

Mini L298N

s.click.aliexpress.com

DCモータードライバー(DCモーターコントローラー)です。
モーターをコントロールしてくれるやつです(あいまい)。

これ1つで2つのモーターを別々に制御できます。
回転方向と速度の調整が可能です。

2相4線のステッピングモーター1つの制御もできると書かれています。

L298N(こちらでも可能)

ja.aliexpress.com

L298NというMiniがついていないドライバーです。
Mini L298Nはこの製品の低価格版という位置づけのようです。

許容できる電圧や電流が大きく、なによりはんだ付けが不要です。
ICチップに放熱板がついていて、見た目にも高そうです。

つなぎ方が少し違うのですが、L298Nの記事はたくさんあるのでそちらを参照してください。
↓例えばこちら

DCモータコントローラを使って複数のモータを制御する | 物を作る者

MB102 または電池

s.click.aliexpress.com

ブレッドボード用電源モジュール(MB102)も用意します。

ArduinoのI/O pinの出力は5V 20mAなのでモーターの電力をI/O pinから取ると過電流でArduinoが壊れてしまいます。
そこで電源モジュールから電力を取ります。

電池数本でも代替可能です。

この電源モジュールは700mAの出力を持つので、モーターも動かせます。

といっても無理は禁物で、私はこれで一度にたくさんモーターを動かそうとして壊してしまいました。

煙を吐いてお亡くなりに… 燃えなくてよかった。

正しいかわかりませんがモーターが5Vの電圧に対応していたので、そのあと電源は5V 2.4AのUSB電源アダプターから直接取ってしまいました。

モーター

電源モジュールを使うなら、3Vか5Vに対応するDCモーターならなんでもいいです。

適当な何かで。

Aliexpressでも探せますし、ミニ四駆のモーターは3Vなのでそれでもいけます。

ケーブルとブレッドボード

s.click.aliexpress.com

s.click.aliexpress.com

パーツをつなぐのに必要です。

ブレッドボード図

下図のような感じで接続していきます。

Mini L298Nをブレッドボードに乗せるには、ピンをはんだ付けする必要があります。

モーターの適正電圧に合わせて、電源モジュールの3Vと5Vのジャンパーピンを差し換えてください。

f:id:isinsin:20210223134600p:plain
モーター1個の配線例

f:id:isinsin:20210223133520p:plain
モーター2個の配線例

私は電源モジュール壊したり、Mini L298Nを直接ケーブルとはんだ付けしたりしたのでブレッドボード使っていません。
下のモーター2個のが電池式なのは、電源モジュールだと壊れるかもしれないからです。

プログラム

ArduinoC++言語でプログラムできます。

クラスとかも普通に使えるみたいです。

公式リファレンス

最大出力で使う

単にモーターをON/OFFできればよいのであればdigitalWrite()を使います。

回転、停止、逆回転、停止を1秒ずつ行い繰り返すサンプルです。

const int out1 = 11;  // 11番のI/O pin
const int out2 = 10;  // 10番のI/O pin


void setup() {
  pinMode(out1, OUTPUT);
  pinMode(out2, OUTPUT);
}

void loop() {
  // モーターを回転させます
  digitalWrite(out1, HIGH);
  delay(1000);  // 1秒そのまま
  
  // モーターを停止させます
  digitalWrite(out1, LOW);
  delay(1000);
  
  // モーターを先ほどとは逆方向に回転させます
  digitalWrite(out2, HIGH);
  delay(1000);  

  // モーターを停止させます
  digitalWrite(out2, LOW);
  delay(1000);
}

速度調整して使う

速度を調整したいのであればanalogWrite()を使います。
出力電圧を256段階で調整できます。
例えばUnoなら0~5Vを0~255の範囲で調整できます。
モーターの電源の電圧が違えば、その範囲での調整となります。 (例えば9Vの電池を使うなら0~9Vの範囲で調整されます)

アナログ出力(PWM)に対応したPIN(3,5,6,9,10,11番)を使う必要があります。
analogWrite()の解説ページには「PIN5,6はちょっと電圧高く出るかもよ」みたいなことが書かれています。

出力半分、最大、停止を1秒ずつ行い繰り返すサンプルです。

const int out1 = 11;  // 11番のI/O pin
const int out2 = 10;  // 10番のI/O pin


void setup() {
  pinMode(out1, OUTPUT);
  pinMode(out2, OUTPUT);
}

void loop() {
  // モーターを半分で回転させます
  analogWrite(out1, 127);
  delay(1000);  // 1秒そのまま
  
  // モーターを最大で回転させます
  analogWrite(out1, 255);
  delay(1000);
  
  // モーターを停止させます
  analogWrite(out1, 0);
  delay(1000);
}

2個同時に使う

モーター2個をバラバラに制御できます。

const int out1 = 11;  // 11番のI/O pin。モーターA
const int out2 = 10;  // 10番のI/O pin。モーターA
const int out3 = 9;   // 9番のI/O pin。モーターB
const int out4 = 8;   // 8番のI/O pin。モーターB


void setup() {
  pinMode(out1, OUTPUT);
  pinMode(out2, OUTPUT);
  pinMode(out3, OUTPUT);
  pinMode(out4, OUTPUT);
}

void loop() {
  // モーターAとモーターBをどちらもフル回転させます。
  digitalWrite(out1, HIGH);
  digitalWrite(out2, LOW);
  digitalWrite(out3, HIGH);
  digitalWrite(out4, LOW);
  delay(1000);

  // モーターBはそのままで、モーターAのみ逆回転させます。
  digitalWrite(out1, LOW);
  digitalWrite(out2, HIGH);
  delay(1000);

  // モーターAの出力を約3分の2にします。モーターBは約3分の1にします。
  analogWrite(out2, 170);
  analogWrite(out3, 85);
  delay(1000);
}

終わりに

電子工作はさっぱりなのですが、なんとかできてしまいました。
Arduinoすごい

Mini L298Nの使い方を書いた記事が検索してもなかったので書きましたが、知識が浅いので間違っている箇所があるかもしれません。
その場合はご指摘いただけると幸いです。

Pythonのlogging.config.fileConfig()でメールを送る例

Pythonのloggingでエラー時にメールを送る設定をしたく、ファイルから設定を読み出すようにしました。
fileConfig()で設定したのですが公式サイトにも完全な例がなく、なかなか苦労したのでメモ。
dictConfig()ならいくつか見かけたので、素直にそちらを使えばよかったかも。

Pythonのバージョンは3.9.1。

サンプル

コード

example.py

from logging import getLogger
from logging.config import fileConfig

fileConfig('./logging.conf')
logger = getLogger(__name__)

logger.info('Output only to the console.')
logger.error('Will also be sent to email.')

設定ファイルはlogging.confとしました。
fileConfig()についての公式リファレンスは以下のリンクより。
fileConfigの公式リファレンス


レベルDEBUG以上をコンソールに表示して、ERROR以上をメールで送る場合の設定です。

logging.conf

[loggers]
keys=root

[handlers]
keys=consoleHandler,emailHandler

[formatters]
keys=consoleFormatter,emailFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler,emailHandler

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=consoleFormatter
args=(sys.stdout,)

[handler_emailHandler]
class=handlers.SMTPHandler
level=ERROR
formatter=emailFormatter
args=(('example.server.com', 465), 'from@example.com', ['to@example.com', ], 'ERROR!', ('username', 'password'), ())

[formatter_emailFormatter]
format=%(asctime)s:%(levelname)s:%(name)s:%(message)s

[formatter_consoleFormatter]
format=%(levelname)s:%(name)s:%(message)s

今回レベルERROR以上でメール送信としたのでloggerがrootだけですが、ログの系統をコンソールとメールで完全に分けたいならloggerも追加で定義してください。

[handler_emailHandler]について

handlerを定義する必要があります。

[handler_emailHandler]
class=handlers.SMTPHandler
level=ERROR
formatter=emailFormatter
args=(('example.server.com', 465), 'from@example.com', ['to@example.com', ], 'ERROR!', ('username', 'password'), ())

となっていますが、argsには

args=((<メールサーバー>, <ポート番号>), <メール送信元>, [<メール宛先1>, <メール宛先2> ... ], <メール件名>, (<ユーザー名>, <パスワード>), (<空のタプルか認証情報>))

を設定します。
最後の空のタプルも必要です。
さらに追加でタイムアウトも設定可能です。

▼ handlers.SMTPHandler
SMTPHandlerの公式リファレンス

[formatter_emailFormatter]について

[formatter_emailFormatter]
format=%(asctime)s:%(levelname)s:%(name)s:%(message)s

カスタムしたログテキストを作成可能です。

よく使いそうなものとしては、

属性名 フォーマット                          説明
asctime %(asctime)s LogRecord が生成された時刻を人間が読める書式で表したもの。デフォルトでは "2003-07-08 16:49:45,896" 形式 (コンマ以降の数字は時刻のミリ秒部分) です。
funcName %(funcName)s ロギングの呼び出しを含む関数の名前。
levelname %(levelname)s メッセージのための文字のロギングレベル ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')。
message %(message)s msg % args として求められた、ログメッセージ。 Formatter.format() が呼び出されたときに設定されます。
name %(name)s ロギングに使われたロガーの名前。

他の属性はこちらの公式リファレンスから。

▼ LogRecord 属性
LogRecord 属性の公式リファレンス

出力

コンソール

INFO:__main__:Output only to the console.
ERROR:__main__:Will also be sent to email.

メール文面:

2021-02-12 23:24:38,484:ERROR:__main__:Will also be sent to email.

GitHubにコードおいてみました。

GitHub - singo-i/example-to-send-an-email-with-fileConfig-of-Python-logging

NoxPlayerからBlueStacksに乗り換え

AndroidエミュレーターをNoxPlayerからBlueStacksに乗り換えました。

NoxPlayerでオクトパストラベラーがプレイできなくなりましたからね、しょうがないですね。

以前調べたときにはBlueStacksはNoxPlayerに比べて機能に不足があったのですが、今はほぼ変わらないかなといった感じです。

気づいた中では、以下のようなところでしょうか。

NoxPlayer BlueStacks
中国 香港 アメリカ シリコンバレー
root化 できる できない
複数のエミュレーター 対応 対応
キーボードで操作 対応 対応
広告 あり あり

細かい違いはいろいろあります。

例えば

  • 同じアプリを入れたエミュレーターでも、BlueStacksの方が若干ディスク上のサイズが大きくなるようです。
  • キーボードでゲームを操作できるのですが、BlueStacksの方はオクトパストラベラーのキーボードマッピングが初めから入っていました。