July 04, 2024

曜日を求める(8bit範囲で)

マイコンを使って年月日から曜日を求めたいケースがありました。普通の環境ならC言語を前提とすれば<time.h>にあるmktime関数とlocaltime関数を使うことで実現できます。

裏では曜日を求めるアルゴリズム(色々あります)のどれかを使って求めていると思います。


今回は対象がマイコンということもあり、機能を限定することでコンパクトなアルゴリズムに改変してみました。

sakamoto's methodを元にしました。日時範囲はGPS時刻を前提とすることで1980年以降とし、また2099年まで使えればよい割り切りをしています。すると、うるう年の計算が100で割り切れて400で割り切れない年を考慮する必要がなくなり、簡略化されました。また型を最小のunsigned charで統一してみました。


検証はRubyのRspecでやってみています。

上記CコードとRubyでのDate#wdayとの一致を見ています。なおテストの実装にあたっては、RubyInlineを使ってRubyの中でC言語コードを直接扱ってみました。

11:40 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/961

July 24, 2024

HDL-AAX2 シャットダウンスクリプト

自宅NASのIO-DATA HDL-AAX2ですが、リモートでシャットダウンする必要があり、方法を検討しました。少し古い機種のHDL2-Aのシャットダウンスクリプトが見つかったのですが、それをそのまま適用することはできなかったので、少し改造して使うことにしました。

出来上がったのが以下のRubyスクリプトです。

mechanizeというwebの自動巡回を可能とするgem(クローラ)を使うことで実現しています。少し古いRuby(< 2.6.0)でも簡潔に書けるよう、Kernel#thenがない場合に備えて自己定義しています(古いRubyに最新の機能を入れ込むbackports gemKernel#yield_selfのコードを参考にしました)。

00:12 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/962