工作と競馬2

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

ホームシアターの構築(15) --- スピーカースタンド、サランネットの製作 ---

概要

フロントスピーカー、サラウンドスピーカーのスピーカースタンド、イネーブルドスピーカーのサランネットを製作した。



背景と目的

前回、フロントスピーカーのエンクロージャー外装仕上げと仮音出しを行い完成させた。今回は、フロントスピーカー、サラウンドスピーカーのスピーカースタンドおよびイネーブルドスピーカーのサランネットを製作する。



詳細

1. フロントスピーカーのスタンド

dekuo-03.hatenablog.jp

以前、フロントスピーカーのスタンドの組み立てを行っておいた。今回はカッティングシートを貼りつけて仕上げる。カッティングシートは、

https://www.amazon.co.jp/gp/product/B08XQ378MT/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1

ヘアラインブラックのシート。結構硬めで伸縮性はないので平面に貼る分には問題がないが前後の斜めカットの折れ曲がり部分注意して貼らないと浮き上がってきてしまう。

完成したものが以下。脚をつけた状態の写真を撮り忘れた。。。


2. サラウンドスピーカーのスタンド

2.1 設計

サラウンドスピーカーのスタンドは、新規作成せずもともとサラウンドスピーカーの元となったスピーカーが載っていた自作スタンドを改造することで賄う。およそ60cmの高さのものである。

60cmだと、ソファの後ろに設置を想定した場合に高さが少し足らない。検討した結果82cm程度の高さが必要と分かったので、脚の長さを変更することにする。

2.2 製作

写真を撮り忘れたのでいきなり完成図。外装のカッティングシートは、上記のフロントスピーカーと同じもの。スピーカー搭載面にはサラウンドスピーカーの底面に設けた鬼目ナットに合う位置で穴が開いているため、この穴からネジを締め、スタンドにスピーカーを固定して落下防止する。

また、台座の前面切り欠きは、転倒防止措置をするために予備的な仕掛け。切り欠きを通して台座裏側から前方に棒状のものを出してソファと床の間に入れる。ソファが非常に重いので、棒がソファで受け止められることで、簡単な転倒防止にできる。


3. センタースピーカーのスタンド

3.1 設計

センタースピーカーは、TVボードに収まる想定。通常のスタンドのように脚を持つ構造だと、スピーカーの下の空間が使えなくなってしまうので、TVボード中央の空間に橋渡しするような設計とする。これなら、狭いが一応PS4やレコーダが置ける空間が稼げる。

3.2 製作

まず、MDF12mm板を切り出し所定の位置に穴を開け、角を丸める。写真だと見えにくいが、脚もついている。穴は、情報に傾けて設置されるスピーカーがずり落ちないように、ねじ止めするためのもの。センタースピーカー底面に設けた鬼目ナットの位置と合うようにしてある。

次に、カッティングシートを貼る。これも、フロントスピーカーと同じもの。

試しに、センタースピーカー側のナットとの位置が合うことを確認したが、装着先のTVボードは、現在使用中のため試し取り付けできないので、とりあえずここまで。


4. イネーブルドスピーカーのスタンド

4.1 設計

イネーブルドスピーカー設計段階での構想として、以下のような形状のものを想定した。

実際には、フロントスピーカーとリアスピーカーの上に載るので落下防止できる工夫をしたい。そこで、イネーブルドスピーカーの底面とフロントスピーカー天面とリアスピーカー天面にそれぞれ鬼目ナットを設け、スタンドを介してネジで締結できる仕組みとした。スタンドは、ネジの穴を設けた。

トップフロント

トップリア

4.2 製作

材料を切り出す。

カッティングシートを貼る。これは、イネーブルドスピーカーの外装と同じ。

組み立てる。

リアスピーカーの天面に搭載し、ネジで固定した様子。(写真を撮ったが奥過ぎて見えなかった)


5. イネーブルドスピーカーのサランネット

5.1 構想

私の場合、今まで自作スピーカーではサランネットはつけないことがほとんどだった。付けないほうが音がいいし、付けていなくても特段実使用上の問題がなかったため。 しかし、イネーブルドスピーカーは、上方を向けて設置するため、ホコリが振動板に降り積もりやすいので今回はつけることにした。合計4本あるため、簡単に作れる方法はないか?と検討したところ、100均の灰汁取りアミがちょうど大きさがよく使えることに気づいた。試しに1つ買ってつけてみたところちょうどぴったりだったので使うことにした。

アク取り105mm | 【公式】DAISO(ダイソー)ネットストア

4.2 製作

まず、網部分を取り外す。

次に、黒く色を塗る。この灰汁取りアミは光沢のあるシルバーで、PE-101Aの黒塗りフレームに対して目立ちすぎるため。はじめスプレーで塗ろうと考えたが普通の油性マジックで塗りつぶすだけで十分だったのでスプレーはやめた。ただし、外周部はどうしても光沢感が残ってしまうため、つや消し黒のアセテートテープを貼ったところいい感じに光沢感を消すことができた。

装着した感じは以下。



まとめと今後の課題

スピーカースタンド、サランネットの製作が作製できた。次回は、ここまでのまとめを行う。


リモート水位センサシステム ver4(6) --- 2023年シーズン前メンテナンス&設置 ---

概要

リモート水位センサシステムの2023年シーズン前メンテナンスを行い設置した。



背景と目的

今年も、田植えの時期となり、リモート水位センサシステムの出番がやってきた。稼働にあたり、メンテナンスを行う。



詳細

1. 構想

2022年版での反省点として、

  • 水温センサの動作不良

がある。しかし、今年は諸事情でメンテナンスの時間をあまりとれないことと、水温センサ装着の効果があまりないことから、早急に修理する必要はないと考え、接続しないことにする。

一方で、水位センサ部分は、毎年のことながら泥水に浸かっているせいか汚れがひどいので、メンテナンスが必要である。ということで、水位センサ部分のみ手を入れることとした。

2. 水位センサ部のメンテナンス

昨年は、ポリプロピレンのケースと金網でセンサを格納する筐体を作った。

dekuo-03.hatenablog.jp

以下のように、2022年シーズン終了後見てみると機能に問題はないもののかなり汚れいていることと、金網の加工・取り付けが非常に面倒だった。

https://cdn-ak.f.st-hatena.com/images/fotolife/d/dekuo-03/20220904/20220904122855.jpg

そこで、今年もっと良い方法はないか?と思案した結果、同じようにダイソーで売っている一回り大きいポリプロピレンケースをかぶせる方法を思いついた。

ということで、材料を購入して加工。低水位側数cmの範囲に穴を開け、内側に洗濯ネットと鉢底網を貼り付けた。これで、水の出入りをさせつつごみの侵入を防ぐ。(そもそも、今までセンサ部筐体前面すべてを水の出入りができるように洗濯ネットをつけていたが一部分だけで十分だと5シーズン目にしてやっと気づいた。)

写真を撮り忘れてしまったが、以下のようにセンサ格納筐体に、新しく作ったカバーをかぶせる。

https://cdn-ak.f.st-hatena.com/images/fotolife/d/dekuo-03/20220306/20220306233509.jpg


3. 動作確認&設置

約2週間、自宅で稼働を確認し問題ないため設置した。設置後1週間ほど経過したが、うまく動いていそうだ。というわけで、問題なさそう。今年もしっかり動いてくれるとよい。



まとめと今後の課題

2023年も稼働が始まった。無事に役割を果たしてくれることを祈る。


ホームシアターの構築(14) --- フロントスピーカーの製作(3) ---

概要

フロントスピーカーのエンクロージャー外装仕上げと仮音出しを行い完成させた。



背景と目的

前回、スタンドの組み立てとフロントスピーカーのクロスオーバーネットワーク製作を行った。今回は、エンクロージャー外装仕上げと仮音出しを行い、完成させる。



詳細

1. カッティングシート選定

カッティングシートは、サラウンドスピーカーと共通

サンゲツ REATEC TC-5069 (明るめのウォールナット 柾目)

とする。

dekuo-03.hatenablog.jp


2. 貼り付け前の調整

前回組み立てが終わった時点で、側面に貼った側板を固定するためのネジ穴周辺が少し凹凸になっていたので、貼り付け前にカンナ、サンドペーパーで均し、穴はボンドで埋めた。


3. 貼り付け

3.1 エンクロージャー全体

いきなりだが、全体に貼り終えた様子。曲面は含むが単純なのでしわが寄る可能性はあまりないのだが、やはり面積が大きいと少しずつ歪みが効いてきて簡単ではなかった。どうしてもしわが取り切れない部分ができてしまいそこは残念だが、ユニットを取り付けるとあまり目立たないので良しとした。


3.2 裏板、ターミナル

裏板はターミナル取り付け口とねじ穴が開いている。

裏板は、アルミ調のシートとしてエンクロージャー後面で敢えて存在感を出す。市販の高級スピーカーでもクロスオーバーネットワークの放熱を意図して金属板となっているのでそれのイメージ。しかし、これはMDFにシートを貼っただけなので放熱効果はない似非である。 ちなみに、使ったアルミシートがかなり薄いものだったせいか、MDF側がそれなりに平滑に見えても多少の凹凸があってそれを拾ってしまう。 写真のような光の当たり方によっては強調されて見えるが少し離れればほとんど目立たないので良しとする。

クロスオーバーネットワークとターミナルを取り付ける。2ch分揃えたものを撮り損ねたので1chだけ。


4. ユニット取付、配線、裏板取り付け

ユニットを取り付ける。

裏板を取り付ける。

これで、全体の形が出来上がった。


5. 仮音出し

仮音出しをしてみた。 最終的なクロスオーバーネットワークの調整や吸音材貼り付けは今後行うとして、ひとまず鳴らした印象としては、

  • 低域から高域まで十分な周波数レンジ感がある
  • 低域は、1/3オクターブバンドノイズを鳴らしてみると設計通り40Hzまで十分フラットな量感があると感じられる
  • 中高域の質感もなかなか悪くない。小音量でもなかなか音の粒立ちがよく、ピーキーな印象もない。DCU-F081Aの素性の良さを感じた。
  • 中高域のレベルをあと2dB程度上げれば、全体としてレンジ感が広く生き生きとした音になってくれるのではないかと思える

といったところだ。箸にも棒にもかからないような出来だったらどうしようかと少し不安だったが十分に払拭されたといえる。



まとめと今後の課題

フロントスピーカーのエンクロージャーを組み上げ、仮音出しでまずまずの出来であることが確認できた。今後クロスオーバーネットワークと吸音材の微調整はあるものの、いったんここまでで完成とする。


OpenSearchで、Vega-Liteを使ってPrecision、Recall、F1スコアを算出して表示する

概要

OpenSearchで、Vega-Liteを使ってPrecision、Recall、F1スコアを算出して表示できた。



背景と目的

先日、Vega-LiteでPrecision、Recall、F1スコアを算出して表示ができたので、OpenSearchのVegaタイプのVisualizeで同様に表示をしてみる。



詳細

0. 環境


1. サンプルデータでコーディング

ひとまず、以前Vega-LiteでコーディングしたものをそのままOpenSearchに書いてみる。データもその時と同じものをべた書き。

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "data": {
    "values": [
      {"predicted": "1", "actual": "1"}, 
      {"predicted": "1", "actual": "0"}, 
      {"predicted": "0", "actual": "1"},
      {"predicted": "1", "actual": "1"}, 
      {"predicted": "1", "actual": "1"}, 
      {"predicted": "0", "actual": "1"},
      {"predicted": "1", "actual": "1"}, 
      {"predicted": "1", "actual": "1"},
      {"predicted": "0", "actual": "1"}, 
      {"predicted": "1", "actual": "0"},
      {"predicted": "0", "actual": "0"}
    ]
  },
  transform: [
    {
      "joinaggregate": [
        {
          "op": "count",
          "as": "actual-count"
        }
      ],
      "groupby": ["actual"]
    },
        {
      "joinaggregate": [
        {
          "op": "count",
          "as": "predicted-count"
        }
      ],
      "groupby": ["predicted"]
    },
    {
      "joinaggregate": [
        {
          "op": "count",
          "as": "confusion-matrix"
        }
      ],
      "groupby": ["predicted", "actual"]
    },
    {
      "calculate": "datum['confusion-matrix'] / datum['actual-count']",
      "as": "recall"
    },
    {
      "calculate": "datum['confusion-matrix'] / datum['predicted-count']",
      "as": "precision"
    },
    {
      "calculate": "2 / (1 / datum.recall + 1 / datum.precision)",
      "as": "F1-score"
    },
    {
      "filter": "datum.predicted == datum.actual"
    }
  ],
  "repeat": {"layer": ["recall", "precision", "F1-score"]},
  "spec": {
    "mark": "rect",
    "encoding": {
      "x": {
        "field": "predicted",
        "type": "nominal"
      },
      "y": {
        "field": {"repeat": "layer"},
        "type": "quantitative",
        "title": "score"
      },
      "color": {"datum": {"repeat": "layer"}, "title": "性能指標"},
      "xOffset": {"datum": {"repeat": "layer"}}
    }
  },
  "config": {
    "mark": {"invalid": null}
  }
}

実績のあるコードなので、当然ちゃんと表示される。


2. OpenSearch上のデータを使って表示させる

2.1 使うデータ

以下のような疑似的な予測、正解のラベルがセットになった30アイテムが"iris-result"というindexに挿入されているものとする。

      {"predicted": "setosa", "actual": "setosa"},
      {"predicted": "setosa", "actual": "setosa"},
      {"predicted": "setosa", "actual": "setosa"},
      {"predicted": "virsicolor", "actual": "setosa"},
      {"predicted": "setosa", "actual": "setosa"},
      {"predicted": "setosa", "actual": "setosa"},
      {"predicted": "virsinica", "actual": "setosa"},
      {"predicted": "virsinica", "actual": "setosa"},
      {"predicted": "setosa", "actual": "setosa"},
      {"predicted": "setosa", "actual": "setosa"},
      {"predicted": "virsicolor", "actual": "virsicolor"},
      {"predicted": "virsicolor", "actual": "virsicolor"},
      {"predicted": "virsicolor", "actual": "virsicolor"},
      {"predicted": "virsicolor", "actual": "virsicolor"},
      {"predicted": "setosa", "actual": "virsicolor"},
      {"predicted": "virsicolor", "actual": "virsicolor"},
      {"predicted": "virsicolor", "actual": "virsicolor"},
      {"predicted": "virsicolor", "actual": "virsicolor"},
      {"predicted": "virsicolor", "actual": "virsicolor"},
      {"predicted": "virsicolor", "actual": "virsicolor"},
      {"predicted": "virsinica", "actual": "virsinica"},
      {"predicted": "virsinica", "actual": "virsinica"},
      {"predicted": "setosa", "actual": "virsinica"},
      {"predicted": "setosa", "actual": "virsinica"},
      {"predicted": "virsinica", "actual": "virsinica"},
      {"predicted": "virsinica", "actual": "virsinica"},
      {"predicted": "virsicolor", "actual": "virsinica"},
      {"predicted": "virsicolor", "actual": "virsinica"},
      {"predicted": "virsicolor", "actual": "virsinica"},
      {"predicted": "virsinica", "actual": "virsinica"}

混同行列は、

predicted
setosasetosasetosa
actualsetosa71210
virsicolor19010
virsinica23510
1013730

となるので、Precision、Recall、F1スコアの正解は、

setosa virsicolor virginica
precision 0.7 0.692307692307692 0.714285714285714
recall 0.7 0.9 0.5
F1 0.7 0.782608695652174 0.588235294117647

である。

2.2 データ参照部分を少し変更

上記データを取り出すために変更したものが以下。data.format.propertyはクエリで何も集計しない場合hits.hitsから取り出す必要がある。また、encoding.xやyのfield参照先は、_source.フィールド名とする必要がある。

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json"
  "title": "混同行列",
  "data": {
    "url": {
      "index": "iris-result",
      "body": {
        "size": 30
      }
    },
    "format": {"property": "hits.hits"}
  },
  "encoding": {
    "y": {
      "field": "_source.actual",
      "type": "ordinal",
      "title": "実データ"
    },
    "x": {
      "field": "_source.predicted",
      "type": "ordinal",
      "title": "予測"
    }
  },
  "layer": [
    {
      "mark": "rect",
      "encoding": {
        "color": {
          "aggregate": "count",
          "type": "quantitative",
          "legend": false,
          "scheme": "rainbow"
        }
      }
    },
    {
      "mark": "text",
      "encoding": {
        "text": {
          "aggregate": "count",
          "type": "quantitative"
        },
        "color": {
          "value": "black"
        }
      }
    }
  ],
  "config": {
    "axis": {"grid": true, "tickBand": "extent"}
  }
}

表示させた結果は以下。正しく表示できている。



まとめと今後の課題

OpenSearchで、Vega-Liteを使ってPrecision、Recall、F1スコアを算出して表示することができた。Vega-Liteの扱いに徐々に慣れてきたので、積極的に使用していきたい。


ノートPC Dell Inspiron5490のRAMを増設する

概要

ノートPC Dell Inspiron5490のRAMを増設し、動作することを確認した。



背景と目的

最近、Docker Desktop for Windowsでコンテナを動かしていると、結構RAMがきついということがあった。例えば、コンテナ側でWebアプリを動かして、ホスト側のWebブラウザでアクセスしたりすると、(Chromeでほかのページも開いてるせいかもしれないが)ときどき画面が固まってしまい、作業に支障が出ることがある。タスクマネージャーでRAM使用量を確認すると確かに90%近くまで行っていたりする。Docker(というかWSL側)のRAM使用量を制限したり、スワップ?を使う手もあるが根本的に物理RAM容量が大きくなるわけではないのでできることが増えるわけではない。そこで、増設するのが適当と判断した。



詳細

0. 環境

  • Dell Inspiron 5490 (14インチノートPC、2020年製)
  • 現行RAM容量 8GB


1. メモリ情報確認

まず、

  • 最大搭載可能容量
  • スロット構成

などを調べる。Dell公式サイトで当該機種の情報を調べると、

メモリの情報

オーダー式のためRAM構成が複数あり、自分のPCがどういう構成かわからない。そこで、以下のサイト

win10labo.info

を参考に、最大搭載可能容量と現在の使用状況を調べる。

その結果、

最大搭載可能容量は32GB
8 GB(4 GBオンボード+1 x 4 GB(SODIMMスロット))の構成で使用中

とわかった。オンボードの4GBはいじれないので、SODIMMスロットの4GBメモリを交換することにする。


2. 品種の選定

価格.comを見て、適合するメモリ規格の中でCrusialというメーカーの16GB品 CT16G4SFRA266 が最も安そうだったので、Inspiron 5490に適合するか念のためCrusialのWebサイトで調べたところ適合するようだったので、購入を決断。

Amazon | Crucial ノートPC用増設メモリ 16GB(16GBx1枚) DDR4 2666MT/s(PC4-21300) CL19 SODIMM 260pin CT16G4SFRA266 | Crucial(クルーシャル) | メモリ 通販


3. 交換作業

miller-morikuma.work

上記がほぼそのものなので詳細はそちらに譲るが、1点だけカバーが外しづらいことについて、気づいたことを記す。

以下の写真で、ピンクで囲った部分の突起が、カバー側と嵌合する構造になっているらしい。

なので、カバー側では、以下の写真の黒四角で囲ったあたりに引っ掛かりがあり、矢印のようにヒンジ側に少し引くと取れやすいと思われる。

※上記リンク先写真を拝借し、追記

メモリを交換して装着した様子。写真が完全にブレてしまった。


4. 動作確認

立ち上げると、メモリ容量が変わった旨のアラートが出るが、Continueを押して起動を待ち、

スタートメニュー > 設定 > システム情報から、RAMの容量を見ると確かに20GBに増えている。

ということで、増設を無事完了した。



まとめと今後の課題


Vega-Liteで、Precision、Recall、F1スコアを算出して表示する

概要

Vega-Liteで、Precision、Recall、F1スコアを算出して表示するためのコードを作成し、動作を確認した。



背景と目的

最近たまたまVega、Vega-Liteを使った環境において機械学習モデルの性能指標を表示する機会があったが、Vega、Vega-Liteを使ったことがなく苦労したので、メモしておく。



詳細

0. 環境

Vega-Lite Example Editor上で、サンプルを改造しながら作成することにした。

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  :
}


1. データ

対象データは、モデル出力predictedと正解値actualがセットとなっている以下のようなデータをサンプルとして用いることにする。 2値分類を想定したラベル名 "1" と "0" になっているが、多値分類の場合でも動作する想定とする。

  "data": {
    "values": [
      {"predicted": "1", "actual": "1"}, 
      {"predicted": "1", "actual": "0"}, 
      {"predicted": "0", "actual": "1"},
      {"predicted": "1", "actual": "1"}, 
      {"predicted": "1", "actual": "1"}, 
      {"predicted": "0", "actual": "1"},
      {"predicted": "1", "actual": "1"}, 
      {"predicted": "1", "actual": "1"},
      {"predicted": "0", "actual": "1"}, 
      {"predicted": "1", "actual": "0"},
      {"predicted": "0", "actual": "0"}
    ]
  }

混同行列を書いておくと以下。

actual
10
predicted1527
0314
8311


2. 材料になるデータを算出

まず、view-levelにtransformを追加して、各数値を算出するのに必要な材料データを追加していく。

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "data": {
    上記
  },
  "transform": [
    ここに追加していく
  ]

2.1 actualの集計

joinaggregateは、集計を行い、その結果を新たな列として元データに追加すること。actualが値 "1" or "0"毎にいくつあるかを集計するので、opにcount、groupbyにactualを設定。

    {
      "joinaggregate": [
        {
          "field": "actual",
          "op": "count",
          "as": "actual-count"
        }
      ],
      "groupby": ["actual"]
    },

2.2 predictedの集計

actualと同様。

    {
      "joinaggregate": [
        {
          "field": "predicted",
          "op": "count",
          "as": "predicted-count"
        }
      ],
      "groupby": ["predicted"]
    },

2.3 混同行列

groupbyの条件を工夫すると、混同行列の各セルの値が算出できる。この場合、fieldは要らない。

    {
      "joinaggregate": [
        {
          "op": "count",
          "as": "confusion-matrix"
        }
      ],
      "groupby": ["predicted", "actual"]
    },


3. 性能指標を算出

transformの中に、さらに追加していく。 calculateを用いて、2で追加した値を使って算出する。

3.1 Recall

    {
      "calculate": "datum['confusion-matrix'] / datum['actual-count']",
      "as": "recall"
    },

3.2 Precision

    {
      "calculate": "datum['confusion-matrix'] / datum['predicted-count']",
      "as": "precision"
    },

3.3 F1スコア

    {
      "calculate": "2 / (1 / datum.recall + 1 / datum.precision)",
      "as": "F1-score"
    },

ここまでで、追加された列を含めたテーブルを確認すると以下のようになる。 Vega EditorのDATA VIEWERを使って確認したところ以下のようになった。各値が正しく算出されている。

3.4 無意味な値を削除

上記で算出した値のうち、

predictedとactualの値が異なるレコード

に対してはRecallとPrecisionは無意味である。そこで、それらを除外しておくため、transformに以下のfilterを追加。

    {
      "filter": "datum.predicted == datum.actual"
    }

算出結果として、以下のテーブルが得られる。


4. 可視化

4.1 スコアをバーチャートで表示

以下をview-levelに追加。yでaggregateをaverageとすることで、3.4のテーブルが集計されるが、predictedとactualの値が同じものはすべて同じなのでそのaverageをとっても同じ、という仕組みでほしい値を表示する。

  "repeat": {"layer": ["recall", "precision", "F1-score"]},
  "spec": {
    "mark": "rect",
    "encoding": {
      "x": {
        "field": "predicted",
        "type": "nominal"
      },
      "y": {
        "field": {"repeat": "layer"},
        "type": "quantitative",
        "title": "score"
      },
      "color": {"datum": {"repeat": "layer"}, "title": "性能指標"},
      "xOffset": {"datum": {"repeat": "layer"}}
    }
  },
  "config": {
    "mark": {"invalid": null}
  }

表示結果は以下。 2値分類の場合、"0"すなわち陰性に対してはRecallやprecisionという値は算出しないが、多値分類のときにその分類に対しての値を表示できるようにするため、敢えて表示したままにしている。"0"を削除したければ、transformにfilterを追加すればよい。



参考


まとめと今後の課題

Vega-Liteで、Precision、Recall、F1スコアを算出して表示するためのコードを作成できた。今後さらにいろいろ活用したい。


Pythonの時刻周りの処理 システム時刻の変更による影響のメモ

概要

Pythonで、時刻周りの処理を行っている最中に、システム時刻の変更があるとどんな挙動になるのか気になったので調べてメモしておく。


0. 環境

  • Linux搭載組み込み機器
  • Python3.5(事情により古いがまあ、どれも変わらないだろう)


時刻同期

time.sleep

影響を受けない。

sleep中に時刻を変更しても、指定した長さ分sleepされることを確認した。

time.time

影響を受ける。

変更後、即座に値が変わるので、time.timeの差分を取って時間計測等をすると、明らかにおかしくなる。


threading.Timer

影響を受ける。

時刻を未来側に変更した時は、変更分だけ待ち時間が縮まる。変更後の時刻が発動予定時刻を超過していれば、待ち状態が即座に終わって発動する。 時刻を過去側に変更した時は、その逆。


time.monotonic

影響を受けない。

時刻変更をしても、一定の速度で値が増加することを確認した。ドキュメントにもそう書いてあるので間違いない。


datetime.timedelta

影響を受けない。 時刻そのものではないので当然だが。